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

917
22
332
Прочитай раздел, в шапке темы:
Я научился вставлять хуки, но нужный мне метод/поле - private или protected. Что делать?
Возможно, это то, что тебе нужно...
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Почему-то вот эти два хука крашат сервер, мол обращаюсь к клиентским классам EntityClientPlayerMP и WorldClient. Но блин, в каком месте-то?
Java:
    @Hook(at = @At(point = InjectionPoint.RETURN))
    public static void getCollidingBoundingBoxes(World world, Entity entity, AxisAlignedBB box){
        if(entity instanceof EntityPlayer){
            List<AxisAlignedBB> collisions = world.collidingBoundingBoxes;
            AxisAlignedBB mapArea = GAME.getCurrentMap().getArea().expand(10, 20, 10);
          
            if(box.intersectsWith(mapArea)){
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.minY, mapArea.minZ, mapArea.maxX, mapArea.maxY, mapArea.minZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.minY, mapArea.maxZ, mapArea.maxX, mapArea.maxY, mapArea.maxZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.minY, mapArea.minZ, mapArea.minX, mapArea.maxY, mapArea.maxZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.maxX, mapArea.minY, mapArea.minZ, mapArea.maxX, mapArea.maxY, mapArea.maxZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.minY, mapArea.minZ, mapArea.maxX, mapArea.minY, mapArea.maxZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.maxY, mapArea.minZ, mapArea.maxX, mapArea.maxY, mapArea.maxZ));
            }
        }
    }
Java:
    @Hook(returnCondition = ReturnCondition.ON_TRUE)
    public static boolean moveEntity(Entity entity, double x, double y, double z){
        if(entity instanceof EntityPlayer && entity.noClip){
            AxisAlignedBB mapArea = GAME.getCurrentMap().getArea().expand(10, 20, 10);
          
            if(entity.boundingBox.addCoord(x, y, z).intersectsWith(mapArea)){
                List<AxisAlignedBB> collisions = Lists.newArrayListWithCapacity(6);
              
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.minY, mapArea.minZ, mapArea.maxX, mapArea.maxY, mapArea.minZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.minY, mapArea.maxZ, mapArea.maxX, mapArea.maxY, mapArea.maxZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.minY, mapArea.minZ, mapArea.minX, mapArea.maxY, mapArea.maxZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.maxX, mapArea.minY, mapArea.minZ, mapArea.maxX, mapArea.maxY, mapArea.maxZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.minY, mapArea.minZ, mapArea.maxX, mapArea.minY, mapArea.maxZ));
                collisions.add(AxisAlignedBB.getBoundingBox(mapArea.minX, mapArea.maxY, mapArea.minZ, mapArea.maxX, mapArea.maxY, mapArea.maxZ));
              
                for(int i = 0; i < collisions.size(); i++){
                    y = collisions.get(i).calculateYOffset(entity.boundingBox, y);
                }
                entity.boundingBox.offset(0.0D, y, 0.0D);
  
                for(int i = 0; i < collisions.size(); i++){
                    x = collisions.get(i).calculateXOffset(entity.boundingBox, x);
                }
                entity.boundingBox.offset(x, 0.0D, 0.0D);
  
                for(int i = 0; i < collisions.size(); i++){
                    z = collisions.get(i).calculateZOffset(entity.boundingBox, z);
                }
                entity.boundingBox.offset(0.0D, 0.0D, z);
  
                entity.posX = (entity.boundingBox.minX + entity.boundingBox.maxX) / 2.0D;
                entity.posY = entity.boundingBox.minY + entity.yOffset - entity.ySize;
                entity.posZ = (entity.boundingBox.minZ + entity.boundingBox.maxZ) / 2.0D;
                entity.onGround = false;
              
                return true;
            }
        }
      
        return false;
    }
Код:
Caused by: java.lang.RuntimeException: Attempted to load class net/minecraft/client/entity/EntityClientPlayerMP for invalid side SERVER
    at cpw.mods.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:50) ~[forgeSrc-1.7.10-10.13.4.1614-1.7.10.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_192]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_192]
    at net.minecraft.entity.Entity.moveEntity(Entity.java) ~[Entity.class:?]
    at net.minecraft.entity.EntityLivingBase.moveEntityWithHeading(EntityLivingBase.java:1680) ~[EntityLivingBase.class:?]
    at net.minecraft.entity.EntityLivingBase.onLivingUpdate(EntityLivingBase.java:2023) ~[EntityLivingBase.class:?]
    at net.minecraft.entity.EntityLiving.onLivingUpdate(EntityLiving.java:431) ~[EntityLiving.class:?]
    at net.minecraft.entity.EntityAgeable.onLivingUpdate(EntityAgeable.java:138) ~[EntityAgeable.class:?]
    at net.minecraft.entity.passive.EntityAnimal.onLivingUpdate(EntityAnimal.java:56) ~[EntityAnimal.class:?]
    at net.minecraft.entity.passive.EntitySheep.onLivingUpdate(EntitySheep.java:98) ~[EntitySheep.class:?]
    at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1816) ~[EntityLivingBase.class:?]
    at net.minecraft.entity.EntityLiving.onUpdate(EntityLiving.java:250) ~[EntityLiving.class:?]
    at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2298) ~[World.class:?]
    at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:684) ~[WorldServer.class:?]
    at net.minecraft.world.World.updateEntity(World.java:2258) ~[World.class:?]
    at net.minecraft.world.World.updateEntities(World.java:2108) ~[World.class:?]
    at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:515) ~[WorldServer.class:?]
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703) ~[MinecraftServer.class:?]
    ... 4 more
 
7,099
324
1,510
Когда крашит из-за хуков - всегда в краше фигурируют классы хук-контейнеров, поэтому с первого взгляда могу сказать ,что не из-за хуков крашит.
Если убрать их - все нормально?
~~~
Будто бы хуки применяются ко всем наследникам классов World и Entity
~~~
Немного ошибся на счет стактрейса ошибки из-за хука: благодаря сайд-эффектам хук может и не присутствовать в логе
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,455
598
2,892
Если убрать их - все нормально?
Да, именно. Меня это смутило... Я ведь напрямую не обращаюсь ни к каким клиентским классам.
Java:
    @Hook(returnCondition = ReturnCondition.ON_TRUE)
    public static boolean moveEntityWithHeading(EntityPlayer player, float strafe, float forward){
        if(!player.capabilities.isCreativeMode && !СustomPlayer.forPlayer(player).isNoClip()){
            boolean isFreezeTime = GAME.getFreezeTimer() > 0;
            if(isFreezeTime){
                if(player.isSprinting()){
                    player.setSprinting(false);
                }
                return true;
            }
        }
        
        return false;
    }
Вот такой хук спокойно работает, хотя тоже встраивается в игрока...
 
7,099
324
1,510
Можешь сделать минимальный тестовый пример в котором ошибка появляется?
 
7,099
324
1,510
methods.bin для нужной версии закинул?
 
7,099
324
1,510
Скачай mcp, возьми оттуда. Для 1.8, разумеется, не подойдет
~~~
А вообще, кажется, у мя в репе закинута сгенеренная таблица, ща чекну
 
7,099
324
1,510
Для 1.12.2 же нужны mappings = "snapshot_20171003", верно? Т.е. нужно качать не самую последнюю версию mcp для 1.12?
 
4,045
63
645
Всё добавил, всё работает, но иногда почему-то перестаёт грузить все текстуры/модели и т.д.
Приём то грузит, то нет...
С чем это может быть связано?
Нашёл в консоли следующие строчки:
Java:
[17:40:16] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation
[17:40:16] [main/INFO] [FML]: Ignoring missing certificate for coremod FMLCorePlugin (net.minecraftforge.fml.relauncher.FMLCorePlugin), we are in deobf and it's a forge core plugin
[17:40:16] [main/INFO] [FML]: Ignoring missing certificate for coremod FMLForgePlugin (net.minecraftforge.classloading.FMLForgePlugin), we are in deobf and it's a forge core plugin
[17:40:16] [main/INFO] [FML]: Found a command line coremod : ru.liahim.mist.hooks.MistHookLoader
[17:40:16] [main/INFO] [FML]: [HOOKLIB]  Obfuscated: false
[17:40:16] [main/WARN] [FML]: The coremod ru.liahim.mist.hooks.MistHookLoader does not have a MCVersion annotation, it may cause issues with this version of Minecraft
[17:40:16] [main/INFO] [FML]: Ignoring missing certificate for coremod MistHookLoader (ru.liahim.mist.hooks.MistHookLoader), as this is probably a dev workspace
[17:40:16] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.CoremodTweaker
[17:40:16] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.fml.relauncher.FMLCorePlugin
[17:40:16] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.classloading.FMLForgePlugin
[17:40:16] [main/INFO] [GradleStart]: Injecting location in coremod ru.liahim.mist.hooks.MistHookLoader
[17:40:16] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[17:40:16] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
[17:40:16] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
[17:40:16] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[17:40:16] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[17:40:16] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
[17:40:18] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing
[17:40:18] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
[17:40:18] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper

Возможно, это как раз с порядком загрузки связано, но как его указать?
 
7,099
324
1,510
Возможно, это как раз с порядком загрузки связано, но как его указать?
Пользовтелю либы никак не нужно

Текстуры пропадают только когда хуки есть? Покажи их
 
4,045
63
645
Ну, до этого не пропадали...
Причём то пропадают, то всё ок.
Пока только один:
Java:
public class AnnotationHooks {

    @Hook(returnCondition = ReturnCondition.ON_TRUE)
    public static boolean addRainParticles(EntityRenderer er) {
        if (Minecraft.getMinecraft().world.provider.getDimension() == Mist.dimensionID) {
            ClientProxy.RainParticleRenderer.render(0, Minecraft.getMinecraft().world, Minecraft.getMinecraft());
            return true;
        }
        return false;
    }
}
 
7,099
324
1,510
А можно скрины где пропадает?
~~~
Да, правильно, закинул прямо в src, ток потом пакет переименуй
 
7,099
324
1,510
4,045
63
645
Ну, текст из консоли, что всё потеряно... Игра-то грузится без проблем. И без текстур XD

А что означают эти строчки?
[17:40:16] [main/WARN] [FML]: The coremod ru.liahim.mist.hooks.MistHookLoader does not have a MCVersion annotation, it may cause issues with this version of Minecraft
[17:40:18] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing
 
7,099
324
1,510
Сверху