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

Прочитай раздел, в шапке темы:
Я научился вставлять хуки, но нужный мне метод/поле - private или protected. Что делать?
Возможно, это то, что тебе нужно...
 
Почему-то вот эти два хука крашат сервер, мол обращаюсь к клиентским классам 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
 
Когда крашит из-за хуков - всегда в краше фигурируют классы хук-контейнеров, поэтому с первого взгляда могу сказать ,что не из-за хуков крашит.
Если убрать их - все нормально?
~~~
Будто бы хуки применяются ко всем наследникам классов World и Entity
~~~
Немного ошибся на счет стактрейса ошибки из-за хука: благодаря сайд-эффектам хук может и не присутствовать в логе
 
Последнее редактирование:
Если убрать их - все нормально?
Да, именно. Меня это смутило... Я ведь напрямую не обращаюсь ни к каким клиентским классам.
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;
    }
Вот такой хук спокойно работает, хотя тоже встраивается в игрока...
 
Можешь сделать минимальный тестовый пример в котором ошибка появляется?
 
methods.bin для нужной версии закинул?
 
Скачай mcp, возьми оттуда. Для 1.8, разумеется, не подойдет
~~~
А вообще, кажется, у мя в репе закинута сгенеренная таблица, ща чекну
 
Для 1.12.2 же нужны mappings = "snapshot_20171003", верно? Т.е. нужно качать не самую последнюю версию mcp для 1.12?
 
Всё добавил, всё работает, но иногда почему-то перестаёт грузить все текстуры/модели и т.д.
Приём то грузит, то нет...
С чем это может быть связано?
Нашёл в консоли следующие строчки:
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

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

Текстуры пропадают только когда хуки есть? Покажи их
 
Ну, до этого не пропадали...
Причём то пропадают, то всё ок.
Пока только один:
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;
    }
}
 
А можно скрины где пропадает?
~~~
Да, правильно, закинул прямо в src, ток потом пакет переименуй
 
Ну, текст из консоли, что всё потеряно... Игра-то грузится без проблем. И без текстур 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
 
Назад
Сверху