Coremod crash NoSuchFieldError



  • Bonjour !

    Pour les besoin de l'api d'animation de CraftStudio j'ai besoin que les entités que je souhaite animer, implémentent une classe et sa fonction

    La classe en question:

    :::

    package lib.craftstudio.common;
    
    import lib.craftstudio.common.animation.AnimationHandler;
    
    public abstract interface IEntityAnimated
    {
        public abstract AnimationHandler getAnimationHandler();
    }
    

    :::

    Seulement quand j'essaie d'ajouter ces lignes de codes dans la classe:

    :::

    
        protected AnimationHandler animHandler = new AnimationHandlerPlayer(this);
    
        // ….
    
        @Override
        public AnimationHandler getAnimationHandler()
        {
            return this.animHandler;
        }
    
    

    :::

    Mon jeu crash quand j'essaie de voir le rendu de mon joueur animé

    Voiçi les logs: https://gist.githubusercontent.com/ZeAmateis/c983c1a543a48648f2579181d5a7f54c/raw/21d190fd9bed95f3f865569935a1c49463367097/eclipse.logs

    Classes pour le patch:

    :::

    package lib.craftstudio.asm;
    
    import java.util.Map;
    
    import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
    
    @IFMLLoadingPlugin.MCVersion("1.10.2")
    public class CraftStudioLoadingPlugin implements IFMLLoadingPlugin
    {
        @Override
        public String[] getASMTransformerClass()
        {
            return new String[] { CraftStudioClassTransformer.class.getName() };
        }
    
        @Override
        public String getModContainerClass()
        {
            return null;
        }
    
        @Override
        public String getSetupClass()
        {
            return null;
        }
    
        @Override
        public String getAccessTransformerClass()
        {
            return null;
        }
    
        @Override
        public void injectData(Map <string, object="">data)
        {}
    }
    

    :::

    :::

    package lib.craftstudio.asm;
    
    import org.objectweb.asm.ClassReader;
    import org.objectweb.asm.ClassWriter;
    import org.objectweb.asm.MethodVisitor;
    import org.objectweb.asm.Opcodes;
    import org.objectweb.asm.tree.ClassNode;
    
    import lib.craftstudio.CraftStudioApi;
    import net.minecraft.launchwrapper.IClassTransformer;
    
    public class CraftStudioClassTransformer implements IClassTransformer
    {
        @Override
        public byte[] transform(String name, String transformedName, byte[] basicClass)
        {
            if (name.equals("zs") || name.equals("net.minecraft.entity.player.EntityPlayer"))
            {
                CraftStudioApi.LOGGER.info("About to patch : " + name);
                return patchEntityPlayer(name, basicClass, name.equals("zs"));
            }
            return basicClass;
        }
    
        private byte[] patchEntityPlayer(String name, byte[] basicClass, boolean obf)
        {
            ClassNode cnode = new ClassNode();
            ClassReader cr = new ClassReader(basicClass);
            cr.accept(cnode, ClassReader.EXPAND_FRAMES);
    
            cnode.interfaces.add("lib/craftstudio/common/IEntityAnimated");
    
            ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
            cnode.accept(cw);
    
            try
            {
                MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "getAnimationHandler",
                        "()Llib/craftstudio/common/animation/AnimationHandler;", null, null);
                mv.visitCode();
                mv.visitVarInsn(Opcodes.ALOAD, 0);
                mv.visitTypeInsn(Opcodes.NEW, "fr/zeamateis/tesm/anim/common/animations/AnimationHandlerTest");
                mv.visitInsn(Opcodes.DUP);
                mv.visitVarInsn(Opcodes.ALOAD, 0);
                mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "fr/zeamateis/tesm/anim/common/animations/AnimationHandlerTest",
                        "<init>", "(Llib/craftstudio/common/IEntityAnimated;)V", false);
                mv.visitFieldInsn(Opcodes.PUTFIELD, "net/minecraft/entity/player/EntityPlayer", "animHandler",
                        "Llib/craftstudio/common/animation/AnimationHandler;");
                mv.visitVarInsn(Opcodes.ALOAD, 0);
                mv.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/entity/player/EntityPlayer", "animHandler",
                        "Llib/craftstudio/common/animation/AnimationHandler;");
                mv.visitInsn(Opcodes.ARETURN);
                mv.visitEnd();
            } catch (Exception e)
            {
                e.printStackTrace();
            }
    
            return cw.toByteArray();
        }
    }
    

    :::

    En espérant que Scarex passe par là 😉

    Merci de votre aide !</init></string,>


  • Administrateurs

    Le patch ne s'est visiblement pas fait.
    Il n'y a pas une version spécifique pour l'utilisation sur un environnement de dev ?



  • Ah ouais mais phoque, j'ai oublié la classe qui patch je les ai add –'



  • Sans le code ça va être un peu dur



  • je l'ai ajouté 😉



  • Tu n'as pas ajouter le field dans la classe



  • Résolu grâce à SCAREX ♥