ItemRenderer Event



  • 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 ?


  • Administrateurs

    ç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.


  • Administrateurs

    ç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.



  • @'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>

  • Administrateurs

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



  • 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 ? ^^


  • Administrateurs

    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.



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



  • Les balises java.



  • @'Gugu42':

    Les balises java.

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



  • 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….


  • Administrateurs

    ç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.