[Гайд][Легко][1.6+] Модификация чужого кода при запуске (трансфомеры)

476
9
39
7,099
324
1,510
1,015
9
102
А можно ли хуки вставлять в плагины? У меня при инжекте вылетает эксепшен
Снимок.PNG
 
1,111
47
420
Это случаем не в том месте где он пытается найти обфусцированое имя?
 
1,111
47
420
Единственное что тут может сломаться это масиив нульный. Ну в принципе оно и логично) Хук либа сидит на форджевском загрузчике а баккит как бэ сбоку))
P.S. Если палгин который тебе нужно поменять у тебя на руках и на твоем сервере можешь просто пройтись асмом по классам которые на диске. Не могешь / не хочешь сам юзай HookLib/DiskHookLib.java at master · GloomyFolken/HookLib · GitHub ))
 
2,505
81
397
Что значит "как бэ сбоку"? Это же полностью от ядра зависит. Все ядра, поддерживающие форж, основаны на форж ядре.
 
2,505
81
397
Ты прям уверен в этом? Или просто с головы взял?
 
476
9
39
Не парьтесь и юзайте уже наконец sponge.
Такой функционал! Хм, а чего я разглагольствую вот первым и начну. Я только из-за него мод 6 месяцев портировал.
 
1,015
9
102
Почему-то вот этот хук крашит сервер после сборки. В среде и в одиночке норм. Да и краш странный

Java:
    @Hook
    public static boolean enchantItem(ContainerEnchantment obj, EntityPlayer p_75140_1_, int p_75140_2_) {
        ItemStack itemstack = obj.tableInventory.getStackInSlot(0);

        if (obj.enchantLevels[p_75140_2_] > 0 && itemstack != null && (p_75140_1_.experienceLevel >= obj.enchantLevels[p_75140_2_] || p_75140_1_.capabilities.isCreativeMode)) {
            if (!p_75140_1_.worldObj.isRemote) {
                List list = EnchantmentHelper.buildEnchantmentList(rand, itemstack, obj.enchantLevels[p_75140_2_]);
                if (list == null)
                    return false;
                list.removeIf(o -> ModConfigs.enchantmentIds.contains(((EnchantmentData)o).enchantmentobj.effectId));
                if (list.size() == 0)
                    return false;
                boolean flag = itemstack.getItem() == Items.book;

                if (list != null) {
                    p_75140_1_.addExperienceLevel(-obj.enchantLevels[p_75140_2_]);

                    if (flag) {
                        itemstack.func_150996_a(Items.enchanted_book);
                    }

                    int j = flag && list.size() > 1 ? rand.nextInt(list.size()) : -1;

                    for (int k = 0; k < list.size(); ++k) {
                        EnchantmentData enchantmentdata = (EnchantmentData) list.get(k);

                        if (!flag || k != j) {
                            if (flag) {
                                Items.enchanted_book.addEnchantment(itemstack, enchantmentdata);
                            } else {
                                itemstack.addEnchantment(enchantmentdata.enchantmentobj, enchantmentdata.enchantmentLevel);
                            }
                        }
                    }

                    obj.onCraftMatrixChanged(obj.tableInventory);
                }
            }

            return true;
        } else {
            return false;
        }
    }

А вот сам краш

Код:
java.lang.VerifyError: Inconsistent stackmap frames at branch target 491
Exception Details:
  Location:
    net/minecraft/inventory/ContainerEnchantment.func_75140_a(Lnet/minecraft/entity/player/EntityPlayer;I)Z @23: ifle
  Reason:
    Current frame's stack size doesn't match stackmap.
  Current Frame:
    bci: @23
    flags: { }
    locals: { 'net/minecraft/inventory/ContainerEnchantment', 'net/minecraft/entity/player/EntityPlayer', integer, 'net/minecraft/item/ItemStack' }
    stack: { integer, integer }
  Stackmap Frame:
    bci: @491
    flags: { }
    locals: { 'net/minecraft/inventory/ContainerEnchantment', 'net/minecraft/entity/player/EntityPlayer', integer, 'net/minecraft/item/ItemStack' }
    stack: { }
  Bytecode:
    0x0000000: 2a2b 1cb8 00fb 2ab4 0034 03b9 0095 0200
    0x0000010: 4e2a b400 3b1c 2e9e 01d4 2dc6 01d0 2bb4
    0x0000020: 00fe 2ab4 003b 1c2e a200 0d2b b401 02b4
    0x0000030: 0107 9901 b92a b400 3fb4 009f 9a01 ad2a
    0x0000040: b400 392d 2ab4 003b 1c2e b801 0b3a 042d
    0x0000050: b601 0fb2 0115 a600 0704 a700 0403 3605
    0x0000060: 1904 c601 87bb 0117 59b7 0118 3a06 1904
    0x0000070: b901 1c01 003a 0719 07b9 0121 0100 9900
    0x0000080: 3119 07b9 0125 0100 3a08 1908 c001 273a
    0x0000090: 0919 0619 09b4 012b b401 30b8 0136 1909
    0x00000a0: b401 39b8 013f b901 4303 0057 a7ff cb2d
    0x00000b0: b800 b73a 07bb 0145 592b b600 5fc0 0061
    0x00000c0: 2ab6 00bd 2ab4 003f b600 c12a b400 412a
    0x00000d0: b400 432a b400 45b6 00c7 1907 2ab4 003b
    0x00000e0: 1c2e 1906 1cb7 0148 3a08 2ab6 00bd c600
    0x00000f0: 142a b400 3fb6 00d6 b600 dc19 08b9 00e2
    0x0000100: 0200 1908 b601 4b36 0919 08b6 014c 9a00
    0x0000110: 2015 092b b400 fea4 000d 2bb4 0102 b401
    0x0000120: 0799 000d 1906 b901 4f01 0099 0005 03ac
    0x0000130: 1505 9a00 0704 a700 0403 360a 1908 b601
    0x0000140: 53b9 0157 0100 b901 5a01 003a 0b19 0bb9
    0x0000150: 0121 0100 9900 8119 0bb9 0125 0100 c000
    0x0000160: 093a 0c15 0599 004c 190c b901 5d01 00c0
    0x0000170: 0132 b601 6036 0db2 0164 150d 32c7 0006
    0x0000180: a7ff cdbb 0127 5915 0d19 0cb9 0167 0100
    0x0000190: c001 3bb6 016a b701 6d3a 0eb2 0171 2d19
    0x00001a0: 0eb6 0177 0436 0a2d b201 71b6 017b a700
    0x00001b0: 2719 0719 0cb9 015d 0100 c001 3219 0cb9
    0x00001c0: 0167 0100 c001 3bb6 016a b601 7fa7 0005
    0x00001d0: 3a0d a7ff 7b15 0a99 000a 2b15 0974 b601
    0x00001e0: 832a 2ab4 0034 b601 8504 ac03 ac       
  Exception Handler Table:
    bci [355, 384] => handler: 464
    bci [387, 430] => handler: 464
    bci [433, 461] => handler: 464
  Stackmap Table:
    append_frame(@53,Object[#161])
    append_frame(@93,Object[#131])
    same_locals_1_stack_item_frame(@94,Integer)
    append_frame(@119,Integer,Object[#11],Object[#286])
    chop_frame(@175,1)
    append_frame(@258,Object[#179],Object[#325])
    append_frame(@292,Integer)
    same_frame(@302)
    same_frame(@304)
    same_frame(@313)
    same_locals_1_stack_item_frame(@314,Integer)
    append_frame(@333,Integer,Object[#286])
    append_frame(@387,Object[#9],Integer)
    chop_frame(@433,1)
    same_locals_1_stack_item_frame(@464,Object[#245])
    chop_frame(@466,1)
    chop_frame(@469,1)
    same_frame(@481)
    full_frame(@489,{Object[#2],Object[#91],Integer,Object[#161]},{})
    same_frame(@491)

    at net.minecraft.entity.player.EntityPlayerMP.func_71002_c(EntityPlayerMP.java:840)
    at net.minecraft.block.BlockEnchantmentTable.func_149727_a(SourceFile:80)
    at net.minecraft.server.management.ItemInWorldManager.func_73078_a(ItemInWorldManager.java:465)
    at net.minecraft.network.NetHandlerPlayServer.func_147346_a(NetHandlerPlayServer.java:861)
    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.func_148833_a(SourceFile:60)
    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.func_148833_a(SourceFile:9)
    at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:245)
    at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:181)
    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:1023)
    at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:432)
    at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:841)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:693)
    at java.lang.Thread.run(Unknown Source)
 
808
3
124
Краш стремный потому что я забыл какие-то проверки на корректность возвращаемого типа хук-метода. Ты возвращаешь из хук-метода boolean, но не указываешь, что с ним делать. Надо, например, поставить returnCondition = ALWAYS, тогда boolean которое возвращает хук-метод будет возвращаемым значением целевого метода (и ты по сути просто заменяешь целевой метод хук-методом). Ну или returnCondition = ON_TRUE (и booleanReturnConstant / returnAnotherMethod) если в некоторых случаях выполнение целевого метода прерывать не надо.
 
Можно как-нибудь с помощью этой библиотеки вызвать супер метод хукнотого метода?
 
476
9
39
Можно как-нибудь с помощью этой библиотеки вызвать супер метод хукнотого метода?
Можешь хукнуть и его и сохранить в переменной, а потом вызвать в дочернем. (epic-костыль, конечно)
 
Сверху