HookLib with anchors

hohserg1

Золотая лига
Сообщения
2,994
Лучшие ответы
71
Симпатии
185
#1
Всем привет!
Это форк всем известной хуклибы. Содержит мои авторские улучшения
Использование такое же([Гайд][Легко][1.6+] Модификация чужого кода при запуске (трансфомеры))
Изменения и дополнения:
  • Добавлены якоря, позволяющие вставлять хуки в середину метода без костылей, вроде номера строки
  • Больше нельзя вставлять возвратные хуки в начало конструктора(return до инициализации final-полей)
Пока не густо, но первая фича мощная. По мере возникновения своих потребностей или предложений юзеров буду добавлять еще че-нить.

Исходный код: hohserg1/HookLib

Пример использования якорей:
В тайле воронки есть баг интерграции с некоторыми инвентарями из модов:
Java:
private boolean isInventoryFull(IInventory inventoryIn, EnumFacing side)
    {
        if (inventoryIn instanceof ISidedInventory)
        {
            ISidedInventory isidedinventory = (ISidedInventory)inventoryIn;
            int[] aint = isidedinventory.getSlotsForFace(side);//may be null

            for (int k : aint)
            {
                ItemStack itemstack1 = isidedinventory.getStackInSlot(k);

                if (itemstack1.isEmpty() || itemstack1.getCount() != itemstack1.getMaxStackSize())
                {
                    return false;
                }
            }
        }
Раньше через хуки это можно было пофиксить заменив полностью метод и вставив в середину проверку !=null, либо продублировать первую половину кода до aint и юзать ReturnCondition.ON_TRUE, чтобы выходить из метода в начале, если aint==null
С якорями можно вставить проверку сразу в середину, избежав копипасты кода
Java:
Hook(at = @At(point = InjectionPoint.METHOD_CALL, target = "getSlotsForFace"), returnCondition = ReturnCondition.ON_TRUE, booleanReturnConstant = true)
public static boolean isInventoryFull(TileEntityHopper tile, IInventory inventoryIn, EnumFacing side)
{
    return ((ISidedInventory)inventoryIn).getSlotsForFace(side)==null;
}
Еще пример:
Scala:
//В рендере слотов теперь будет показан индекс слота(для разработки контейнеров)
@Hook(at = new At(point = InjectionPoint.RETURN))
def drawSlot (gui:GuiContainer, slotIn: Slot):Unit = {
    val i = slotIn.xPos
    val j = slotIn.yPos
    Minecraft.getMinecraft.fontRenderer.drawString(slotIn.getSlotIndex.toString,i,j,0xff00ff)
}
В общем, штука полезная и удобная.

@GloomyFolken, примешь pull request?)
 
Последнее редактирование:

hohserg1

Золотая лига
Сообщения
2,994
Лучшие ответы
71
Симпатии
185
#3

hohserg1

Золотая лига
Сообщения
2,994
Лучшие ответы
71
Симпатии
185
#5
Есть ordinal в аннотации, не реализована поддержка еще
 
Последнее редактирование:

hohserg1

Золотая лига
Сообщения
2,994
Лучшие ответы
71
Симпатии
185
#7
  • Исправлен краш
HTML:
[00:15:58] [main/INFO]: [HOOKLIB]  Obfuscated: true
[00:15:58] [main/ERROR]: Unable to launch
java.lang.RuntimeException: An error occurred trying to configure the Minecraft home at D:\Games\Minecraft\Profiles\MyMod for Forge Mod Loader
    at net.minecraftforge.fml.relauncher.FMLLaunchHandler.setupHome(FMLLaunchHandler.java:111) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.relauncher.FMLLaunchHandler.setupClient(FMLLaunchHandler.java:81) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.relauncher.FMLLaunchHandler.configureForClientLaunch(FMLLaunchHandler.java:42) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.common.launcher.FMLTweaker.injectIntoClassLoader(FMLTweaker.java:139) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:115) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
Caused by: java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method) ~[?:1.8.0_51]
    at java.lang.Class.forName(Class.java:348) ~[?:1.8.0_51]
    at net.minecraftforge.fml.relauncher.CoreModManager.loadCoreMod(CoreModManager.java:526) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.relauncher.CoreModManager.discoverCoreMods(CoreModManager.java:450) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.relauncher.CoreModManager.handleLaunch(CoreModManager.java:264) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.relauncher.FMLLaunchHandler.setupHome(FMLLaunchHandler.java:107) ~[forge-1.12.2-14.23.5.2768.jar:?]
    ... 5 more
Caused by: java.lang.NullPointerException
    at net.minecraftforge.fml.common.asm.transformers.DeobfuscationTransformer.<init>(DeobfuscationTransformer.java:61) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at author.hooklib.minecraft.HookLoader.<clinit>(HookLoader.java:24) ~[HookLoader.class:?]
    at java.lang.Class.forName0(Native Method) ~[?:1.8.0_51]
    at java.lang.Class.forName(Class.java:348) ~[?:1.8.0_51]
    at net.minecraftforge.fml.relauncher.CoreModManager.loadCoreMod(CoreModManager.java:526) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.relauncher.CoreModManager.discoverCoreMods(CoreModManager.java:450) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.relauncher.CoreModManager.handleLaunch(CoreModManager.java:264) ~[forge-1.12.2-14.23.5.2768.jar:?]
    at net.minecraftforge.fml.relauncher.FMLLaunchHandler.setupHome(FMLLaunchHandler.java:107) ~[forge-1.12.2-14.23.5.2768.jar:?]
    ... 5 more
[00:15:58] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]: net.minecraftforge.fml.relauncher.FMLSecurityManager$ExitTrappedException
[00:15:58] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at net.minecraftforge.fml.relauncher.FMLSecurityManager.checkPermission(FMLSecurityManager.java:49)
[00:15:58] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at java.lang.SecurityManager.checkExit(SecurityManager.java:761)
[00:15:58] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at java.lang.Runtime.exit(Runtime.java:107)
[00:15:58] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at java.lang.System.exit(System.java:971)
[00:15:58] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at net.minecraft.launchwrapper.Launch.launch(Launch.java:138)
[00:15:58] [main/INFO]: [java.lang.ThreadGroup:uncaughtException:1052]:     at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
  • Удалено использование deprecated api
 

Agravaine

Золотая лига
Сообщения
3,489
Лучшие ответы
94
Симпатии
253
#8
Shift не работает, да?
 
Сверху