• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu ItemRenderer Event

    1.7.x
    1.7.10
    3
    12
    2050
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Deleted
      Deleted dernière édition par

      Salut tout le monde
      Je reviens à vous car je viens de tomber sur cette magnifique API en 1.6.2 http://forum.ironcraft.fr/index.php/topic/4412-162-forge-itemrenderer-api/
      Je pensais  qu’elle marcherait en 1.7.10 malheureusement ce n’est pas le cas voici mes class

      classe du nouvel event

      
      package saomodders.saoserver.saomod.api.client.itemRendererApi;
      
      import cpw.mods.fml.common.eventhandler.Event;
      import net.minecraft.client.Minecraft;
      import net.minecraft.client.renderer.ItemRenderer;
      import net.minecraft.item.ItemStack;
      
      public class ItemRendererEvent extends Event
      {
      
      public float partialTick;
      public Minecraft mc;
      public ItemRenderer renderer;
      public ItemStack itemToRender;
      
      public static class RenderInFirstPerson extends ItemRendererEvent
      {
      public RenderInFirstPerson(float partialTick, Minecraft mc, ItemRenderer renderer, ItemStack itemToRender){
      super();
      this.partialTick = partialTick;
      this.mc = mc;
      this.renderer = renderer;
      this.itemToRender = itemToRender;
      }
      }
      
      }
      
      

      class de mon event handler

      
      package saomodders.saoserver.saomod.common;
      
      import saomodders.saoserver.saomod.api.client.itemRendererApi.ItemRendererEvent;
      import saomodders.saoserver.saomod.handlers.ItemHandler;
      import net.minecraft.client.model.ModelBiped;
      import net.minecraft.item.ItemStack;
      import net.minecraftforge.client.event.RenderHandEvent;
      import cpw.mods.fml.common.eventhandler.EventPriority;
      import cpw.mods.fml.common.eventhandler.SubscribeEvent;
      import cpw.mods.fml.common.gameevent.TickEvent;
      import cpw.mods.fml.relauncher.Side;
      import cpw.mods.fml.relauncher.SideOnly;
      
      public class EventHandlerCommon
      {
      
      @SubscribeEvent
      @SideOnly(Side.CLIENT)
      public void onFirstViewOfPlayer(ItemRendererEvent event)
      {
      ModelBiped biped = new ModelBiped();
      
      if (event.itemToRender != null)
      {
      ItemStack itemTest = new ItemStack(ItemHandler.itemLeftClick);
      if (event.itemToRender == itemTest)
      {
      System.out.println("un itemTest a bien été rendu en 1ère personne grâce à l'évent");
      }
      }
      }
      }
      
      

      Et voilà je ne comprends pas très bien cette API je pense que je dois me servir de cette méthode mais où dois-je la mettre ? dans ma méthode de mon event handler ?

      
      package saomodders.saoserver.saomod.api.client.itemRendererApi;
      
      import net.minecraft.client.Minecraft;
      import net.minecraft.client.renderer.ItemRenderer;
      import net.minecraft.item.ItemStack;
      import net.minecraftforge.common.MinecraftForge;
      
      public class SaoUtils {
      
      public static void registerItemRendererEventFirst(float frame, Minecraft mc, ItemRenderer itemRenderer, ItemStack itemToRender2)
      {
      if(MinecraftForge.EVENT_BUS.post(new ItemRendererEvent.RenderInFirstPerson(frame, mc, itemRenderer, itemToRender2))){return;}
      }
      
      }
      
      

      Au pire si je ne comprends toujours pas je me servirais soit de l’event RenderHandEvent soit RenderPlayerEvent, mais je ne sais pas si l’un deux gère l’affichage d’un item déjà existant en 1ère vue ?

      1 réponse Dernière réponse Répondre Citer 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

        ça ne fonctionne pas car son mod patch normalement une classe de mc (bha oui, il ne suffit pas de mettre la classe de l’event et op ça fonctionne par magie, il faut aussi lancer l’event).
        Regarde la partie ASM de son api. Ou alors demande-lui directement de mettre à jour son api.

        Concernant la possibilité avec RenderPlayerEvent, aucune idée.

        1 réponse Dernière réponse Répondre Citer 0
        • robin4002
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

          ça ne fonctionne pas car son mod patch normalement une classe de mc (bha oui, il ne suffit pas de mettre la classe de l’event et op ça fonctionne par magie, il faut aussi lancer l’event).
          Regarde la partie ASM de son api. Ou alors demande-lui directement de mettre à jour son api.

          Concernant la possibilité avec RenderPlayerEvent, aucune idée.

          1 réponse Dernière réponse Répondre Citer 0
          • Deleted
            Deleted dernière édition par

            @‘robin4002’:

            ça ne fonctionne pas car son mod patch normalement une classe de mc (bha oui, il ne suffit pas de mettre la classe de l’event et op ça fonctionne par magie, il faut aussi lancer l’event).
            Regarde la partie ASM de son api. Ou alors demande-lui directement de mettre à jour son api.

            Concernant la possibilité avec RenderPlayerEvent, aucune idée.

            OUi j’ai oublié de t’envoyer aussi ces class là autant pour moi

            
            package saomodders.saoserver.saomod.api.client.itemRendererApi;
            
            import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
            import static org.objectweb.asm.Opcodes.ALOAD;
            import static org.objectweb.asm.Opcodes.ASM4;
            import static org.objectweb.asm.Opcodes.FLOAD;
            import static org.objectweb.asm.Opcodes.GETFIELD;
            import static org.objectweb.asm.Opcodes.INVOKESTATIC;
            import static org.objectweb.asm.Opcodes.RETURN;
            
            import java.util.Iterator;
            
            import net.minecraft.launchwrapper.IClassTransformer;
            
            import org.objectweb.asm.ClassReader;
            import org.objectweb.asm.ClassWriter;
            import org.objectweb.asm.tree.AbstractInsnNode;
            import org.objectweb.asm.tree.ClassNode;
            import org.objectweb.asm.tree.FieldInsnNode;
            import org.objectweb.asm.tree.FieldNode;
            import org.objectweb.asm.tree.InsnList;
            import org.objectweb.asm.tree.MethodInsnNode;
            import org.objectweb.asm.tree.MethodNode;
            import org.objectweb.asm.tree.VarInsnNode;
            
            public class ItemRendererTransformer implements IClassTransformer {
            
               private String itemStackClass;
               private String itemRendererClass;
               private String minecraftClass;
            
               private String itemRendererMinecraftField;
            
               private String renderItem1stPersonMethodName;
               private String renderItem1stPersonMethodDesc;
            
               @Override
               public byte[] transform(String name, String transformedName, byte[] bytes) {
            
                   if (transformedName.equals("net.minecraft.client.renderer.ItemRenderer")) {
                       System.out.println("ItemRendererAPI - Patching Class ItemRenderer (" + name + ")");
            
                       itemStackClass = /*SaoTranslator.getMapedClassName("ItemStack")*/ "net/minecraft/item/ItemStack";
                       itemRendererClass = /*SaoTranslator.getMapedClassName("ItemRenderer")*/ "net/minecraft/client/renderer/ItemRenderer";
                       minecraftClass = /*SaoTranslator.getMapedClassName("Minecraft")*/ "net/minecraft/client/Minecraft";
                       System.out.println(itemStackClass + " " + itemRendererClass + " " + minecraftClass);
            
                       itemRendererMinecraftField = SaoTranslator.getMapedFieldName("ItemRenderer", "field_78455_a");
            
                       renderItem1stPersonMethodName = SaoTranslator.getMapedMethodName("ItemRenderer", "func_78440_a");
                       renderItem1stPersonMethodDesc = SaoTranslator.getMapedMethodDesc("ItemRenderer", "func_78440_a");
            
                       ClassReader cr = new ClassReader(bytes);
                       ClassNode cn = new ClassNode(ASM4);
            
                       cr.accept(cn, 0);
            
                       processFields(cn);
            
                       for (Object mnObj : cn.methods) {
                           MethodNode mn = (MethodNode)mnObj;
                           if (mn.name.equals("renderItemInFirstPerson") &&
                                   mn.desc.equals(renderItem1stPersonMethodDesc)) {
                               processRenderItemMethod(mn);
                           }
                       }
            
                       ClassWriter cw = new ClassWriter(0);
                       cn.accept(cw);
            
                       System.out.println("ItemRendererAPI - Patching Class ItemRenderer done");
            
                       return cw.toByteArray();
            
                   } else {
                       return bytes;
                   }
               }
            
               private void processRenderItemMethod(MethodNode mn) {
            
                   System.out.println("\tPatching method renderItemInFirstPerson in ItemRenderer");
                   InsnList newList = new InsnList();
            
                   Iterator <abstractinsnnode>it = mn.instructions.iterator();
                   while (it.hasNext()) {
                       AbstractInsnNode insn = it.next();
            
                       if (insn.getOpcode() == RETURN) {
                           newList.add(new VarInsnNode(FLOAD, 1));
                           newList.add(new VarInsnNode(ALOAD, 0));
                           newList.add(new FieldInsnNode(GETFIELD, itemRendererClass, "mc", "L" + minecraftClass + ";"));
                           newList.add(new VarInsnNode(ALOAD, 0));
                           newList.add(new VarInsnNode(ALOAD, 0));
                           newList.add(new FieldInsnNode(GETFIELD, itemRendererClass, "offHandItemToRender", "L" + itemStackClass + ";"));
                           newList.add(new MethodInsnNode(INVOKESTATIC, "saomodders/saoserver/saomod/api/client/itemRendererApi/SaoUtils", "registerItemRendererEventFirst"
                                   , "(FL" + minecraftClass + ";L" + itemRendererClass + ";L" + itemStackClass + ";)V"));
                       }
            
                       newList.add(insn);
                   }
            
                   mn.instructions = newList;
               }
            
               private void processFields(ClassNode cn) {
                   System.out.println("\tAdding new fields to ItemRenderer");
                   cn.fields.add(0, new FieldNode(ACC_PUBLIC, "offHandItemToRender", "L" + itemStackClass + ";", null, null));
                   cn.fields.add(1, new FieldNode(ACC_PUBLIC, "equippedItemOffhandSlot", "I", null, 0));
                   cn.fields.add(2, new FieldNode(ACC_PUBLIC, "equippedOffHandProgress", "F", null, 0F));
                   cn.fields.add(3, new FieldNode(ACC_PUBLIC, "prevEquippedOffHandProgress", "F", null, 0F));
               }
            }
            
            
            
            package saomodders.saoserver.saomod.api.client.itemRendererApi;
            
            import java.util.Arrays;
            
            import com.google.common.eventbus.EventBus;
            import com.google.common.eventbus.Subscribe;
            
            import cpw.mods.fml.common.DummyModContainer;
            import cpw.mods.fml.common.LoadController;
            import cpw.mods.fml.common.ModMetadata;
            import cpw.mods.fml.common.event.FMLConstructionEvent;
            import cpw.mods.fml.common.event.FMLInitializationEvent;
            import cpw.mods.fml.common.event.FMLPostInitializationEvent;
            import cpw.mods.fml.common.event.FMLPreInitializationEvent;
            
            public class SaoDummyContainer extends DummyModContainer
            {
            
            public SaoDummyContainer() {
            
            super(new ModMetadata());
            ModMetadata meta = getMetadata();
            meta.modId = "itemrenderer";
            meta.name = "ItemRendererApi";
            meta.version = "1.6.2"; //String.format("%d.%d.%d.%d", majorVersion, minorVersion, revisionVersion, buildVersion);
            meta.authorList = Arrays.asList("sao");
            meta.description = "";
            meta.updateUrl = "";
            meta.screenshots = new String[0];
            meta.logoFile = "";
            
            }
            
            @Override
            public boolean registerBus(EventBus bus, LoadController controller) {
            bus.register(this);
            return true;
            }
            
            @Subscribe
            public void modConstruction(FMLConstructionEvent evt){
            
            }
            
            @Subscribe
            public void init(FMLInitializationEvent evt) {
            
            }
            
            @Subscribe
            public void preInit(FMLPreInitializationEvent evt) {
            
            }
            
            @Subscribe
            public void postInit(FMLPostInitializationEvent evt) {
            
            }
            
            }
            
            
            
            package saomodders.saoserver.saomod.api.client.itemRendererApi;
            
            import java.io.File;
            import java.util.Map;
            
            import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
            
            @MCVersion(value = "1.5.2")
            public class SaoFMLLoadingPlugin implements cpw.mods.fml.relauncher.IFMLLoadingPlugin {
            
            @Override
            public String[] getASMTransformerClass() {[/font]
            return new String[]{ItemRendererTransformer.class.getName()};[/font]
            }
            
            @Override
            public String getModContainerClass() {
            return SaoDummyContainer.class.getName();
            }
            
            @Override
            public String getSetupClass() {
            // TODO Auto-generated method stub
            return "saomodders.saoserver.saomod.api.client.itemRendererApi.SaoTranslator";
            }
            
            @Override
            public void injectData(Map <string, object="">data) {
            
            }
            
            @Override
            public String getAccessTransformerClass() {
            // TODO Auto-generated method stub
            return null;
            }
            
            }
            
            
            
            package saomodders.saoserver.saomod.api.client.itemRendererApi;
            
            import java.io.BufferedReader;
            import java.io.File;
            import java.io.FileReader;
            import java.io.InputStreamReader;
            import java.util.HashMap;
            import java.util.List;
            import java.util.Map;
            
            import com.google.common.base.Charsets;
            import com.google.common.io.CharStreams;
            import com.google.common.io.InputSupplier;
            
            import cpw.mods.fml.common.asm.transformers.deobf.LZMAInputSupplier;
            import cpw.mods.fml.relauncher.FMLInjectionData;
            import cpw.mods.fml.relauncher.IFMLCallHook;
            
            public class SaoTranslator implements IFMLCallHook {
            
               private String deobFile;
               private String mcLocation;
            
               private static HashMap <string, string="">classNameMap = new HashMap<string, string="">();
               private static HashMap <string, string="">fieldNameMap = new HashMap<string, string="">();
               private static HashMap <string, string="">methodNameMap = new HashMap<string, string="">();
               private static HashMap <string, string="">methodDescMap = new HashMap<string, string="">();
            
               public static String getMapedFieldName(String className, String fieldName) {
                   return fieldNameMap.get(className + "." + fieldName);
               }
            
               public static String getMapedClassName(String className) {
                   return classNameMap.get(className);
               }
            
               public static String getMapedMethodName(String className, String methodName) {
                   return methodNameMap.get(className + "." + methodName);
               }
            
               public static String getMapedMethodDesc(String className, String methodName) {
                   return methodDescMap.get(className + "." + methodName);
               }
            
               public static void setup(String deobFileName){
                   try{
                       LZMAInputSupplier zis = new LZMAInputSupplier(FMLInjectionData.class.getResourceAsStream(deobFileName));
                       InputSupplier <inputstreamreader>srgSupplier = CharStreams.newReaderSupplier(zis, Charsets.UTF_8);
                       List <string>srgList = CharStreams.readLines(srgSupplier);
            
                       for (String line : srgList) {
            
                           line.replaceAll(" #C", "");
                           line.replaceAll(" #S", "");
            
                           if (line.startsWith("CL")) {
                               parseClass(line);
                           } else if (line.startsWith("FD")) {
                               parseField(line);
                           } else if (line.startsWith("MD")) {
                               parseMethod(line);
                           }
            
                       }
            
                   }catch(Exception e){
                       e.printStackTrace();
                   }
               }
            
               @Override
               public Void call() throws Exception {
                   setup(deobFile);        
                   return null;
               }
            
                   private static void parseMethod(String line) {
                   String[] splitLine = line.split(" ");[/font]
            
                   String[] splitObName = splitLine[1].split("/");
                   String[] splitTranslatedName = splitLine[3].split("/");
            
                   String key = splitTranslatedName[splitTranslatedName.length - 2] + "." + splitTranslatedName[splitTranslatedName.length - 1];
            
                   methodNameMap.put(key, splitObName[splitObName.length - 1]);
            
                   methodDescMap.put(key, splitLine[2]);
               }
            
               private static void parseField(String line) {
                   String[] splitLine = line.split(" ");[/font]
            
                   String[] splitObName = splitLine[1].split("/");
                   String[] splitTranslatedName = splitLine[2].split("/");
            
                   String key = splitTranslatedName[splitTranslatedName.length - 2] + "." + splitTranslatedName[splitTranslatedName.length - 1];
            
                   fieldNameMap.put(key, splitObName[splitObName.length - 1]);
               }
            
               private static void parseClass(String line) {
                   String[] splitLine = line.split(" ");[/font]
            
                   String[] splitClassPath = splitLine[2].split("/");
            
                   classNameMap.put(splitClassPath[splitClassPath.length - 1], splitLine[1]);
               }
            
               @Override
               public void injectData(Map <string, object="">data) {
                   deobFile = data.get("deobfuscationFileName").toString();
                   mcLocation = data.get("mcLocation").toString();
               }
            
            }
            
            ```</string,></string></inputstreamreader></string,></string,></string,></string,></string,></string,></string,></string,></string,></abstractinsnnode>
            1 réponse Dernière réponse Répondre Citer 0
            • robin4002
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

              Il faut surement refaire le ItemRendererTransformer, entre les différentes versions de mc le code change et donc n’est plus valable.

              1 réponse Dernière réponse Répondre Citer 0
              • Deleted
                Deleted dernière édition par

                Bon vu que je ne m’y connais pas trop en ASM (voire pas du tout) avec le binaire ….TU me proposes quoi ? de demander à zak de mettre à jour son api ? Mais si il répond pas event ? plus précisément lequel ? ^^

                1 réponse Dernière réponse Répondre Citer 0
                • robin4002
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                  Oui. dans le cas où tu n’as pas de réponse positif, je ne vois quel event utilisé, je n’ai encore jamais fait de truc comme ça.

                  1 réponse Dernière réponse Répondre Citer 0
                  • Deleted
                    Deleted dernière édition par

                    Tout compte fait je change complétement de plan b je vais passer par l’item renderer c’est possible aussi

                    1 réponse Dernière réponse Répondre Citer 0
                    • Gugu
                      Gugu dernière édition par

                      Les balises java.

                      "If you have a comprehensive explanation for everything then it decreases uncertainty and anxiety and reduces your cognitive load. And if you can use that simplifying algorithm to put yourself on the side of moral virtue then you’re constantly a good person with a minimum of effort."
                      ― Jordan B. Peterson

                      1 réponse Dernière réponse Répondre Citer 0
                      • Deleted
                        Deleted dernière édition par

                        @‘Gugu42’:

                        Les balises java.

                        Tu rigoles ? A quel message je les ai pas mises ?

                        1 réponse Dernière réponse Répondre Citer 0
                        • Deleted
                          Deleted dernière édition par

                          Désolé à tout le monde depuis 2 semaines je pensais suite à la mise à jour de l’éditeur de message, que le bouton java, comme il avait disparu était l’équivalent du bouton code.
                          Vraiment désolé pour tout le monde dorénavant je ferais manuellement sans les boutons….

                          1 réponse Dernière réponse Répondre Citer 0
                          • robin4002
                            robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                            ça sera corriger, en attendant mettre la balise code est toujours mieux que rien. Mais oui mettre la balise java à la main reste le top.

                            1 réponse Dernière réponse Répondre Citer 0
                            • 1 / 1
                            • Premier message
                              Dernier message
                            Design by Woryk
                            Contact / Mentions Légales

                            MINECRAFT FORGE FRANCE © 2018

                            Powered by NodeBB