Résolu 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,>
-
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