MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    ItemRenderer Event

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    12 Messages 3 Publieurs 2.3k Vues 1 Watching
    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.
    • robin4002R Hors-ligne
      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
      • robin4002R Hors-ligne
        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
        • DeletedD Hors-ligne
          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
          • robin4002R Hors-ligne
            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
            • DeletedD Hors-ligne
              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
              • robin4002R Hors-ligne
                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
                • DeletedD Hors-ligne
                  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
                  • GuguG Hors-ligne
                    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
                    • DeletedD Hors-ligne
                      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
                      • DeletedD Hors-ligne
                        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
                        • robin4002R Hors-ligne
                          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
                          ContactMentions Légales

                          MINECRAFT FORGE FRANCE © 2024

                          Powered by NodeBB