1.12.2 Inventaire Custom



  • Salut tout le monde,
    Je viens aujourd'hui vous demander de l'aide pour mon inventaire custom, je m'explique : j'essaye de passer par un capability pour stocker 4 slots, j'ai suivi ce tuto : ici pour créer ma capability mais je ne sais pas si je j'utilise bien ou meme si je l'ai bien créée 😐
    Ma classe principale
    Mon Capability Provider
    Mon Inventory Container
    Mon Packet Inventory
    Mon Schedule Packet Task
    Je ne sais pas aussi si j'ajoute bien mes slots a l'inventaire 🤔

    Merci à tous ce qui m'aideront 😄



  • Vraiment personne pour m'aider ? 😕


  • Moddeurs confirmés Rédacteurs Administrateurs

    Bonjour,
    Serait-il possible de détailler le problème ?



  • Enfait j'aimerais rajouter 4 slot a l'inventaire vanilla mais je ne sais pas si il faut prendre l'inventaire vanilla et rajouter 4 slot OU totalement recréer un inventaire custom... 🤔
    Ici j'ai créé ma capability pour 4 slot mais je ne sais pas si je l'ai bien fait car le tuto datait de la 1.8... 😕
    Merci pour vos réponses 😄


  • Moddeurs confirmés Rédacteurs Administrateurs

    Il faut rajouter uniquement 4 slots.
    Ta capability me semble correcte.



  • j'ai toujours une oob avec ça :

    @SubscribeEvent
    	public static void onPlayerJoin(PlayerLoggedInEvent event)
    	{
    		if(!event.player.world.isRemote)
    		{
    			EntityPlayer player = event.player;
    			Container playerContainer = event.player.inventoryContainer;
    			InventoryPlayer inv = new InventoryPlayer(player);
    			for(int i = 0; i < 4; i++)
    			{
    				playerContainer.inventorySlots.add(new Slot(inv, playerContainer.inventorySlots.size() + i, 10, 10 + 10 * 20));
    				playerContainer.inventoryItemStacks.add(new ItemStack(Items.DIAMOND, 1));
    			}
    		}
    	}
    

    ma classe InventoryPlayer

    Le crash :

    Description: Ticking player
    
    java.lang.ArrayIndexOutOfBoundsException: 4
    	at java.util.Arrays$ArrayList.get(Unknown Source)
    	at net.minecraft.util.NonNullList.get(NonNullList.java:51)
    	at fr.eno.pyrion.container.InventoryPlayer.getStackInSlot(InventoryPlayer.java:85)
    	at net.minecraft.inventory.Slot.getStack(Slot.java:81)
    	at net.minecraft.inventory.Container.detectAndSendChanges(Container.java:97)
    	at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:365)
    	at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2174)
    	at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:871)
    	at net.minecraft.world.World.updateEntity(World.java:2133)
    	at net.minecraft.world.WorldServer.tickPlayers(WorldServer.java:672)
    	at net.minecraft.world.World.updateEntities(World.java:1909)
    	at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:643)
    	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:842)
    	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743)
    	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192)
    	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592)
    	at java.lang.Thread.run(Unknown Source)
    


  • Bon alors j'ai un peu changé de direction mais maintenant j'essaye d'ajouter un appel a une de mes méthode dans le constructeur de EntityPlayer, j'ai essayé de faire mais ça ne marche pas :

    @Override
    	public byte[] transform(String name, String transformedName, byte[] basicClass)
    	{
    		if(name.equals("aeb") || name.equals("EntityPlayer")) {
    	        // Par exemple ici pour l'explosion : <nom obfusqué>=agw et <nom normal>=net.minecraft.world.Explosion
    	        //Pyrion.LOGGER.info("About to patch : " + name);
    	        return patchEntityPlayer(name, basicClass, name.equals("aeb"));
    	    }
    	    return basicClass;
    	}
    
    private byte[] patchEntityPlayer(String name, byte[] basicClass, boolean obf)
    	{
    		String targetMethodName = obf ? "<init>" : "<init>"; // On veut modifier la méthode explosionB
    		 
    	    ClassNode classNode = new ClassNode();
    	    ClassReader classReader = new ClassReader(basicClass);
    	    ClassWriter cw = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS);
    	    classReader.accept(classNode, ClassReader.EXPAND_FRAMES);
    	    MethodNode mnode = ASMHelper.findMethod(classNode, targetMethodName, "(Lnet/minecraft/world/World;Lcom/mojang/authlib/GameProfile;)V"); // On récupère le contenu de la méthode
    	 
    
            MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Lnet/minecraft/world/World;Lcom/mojang/authlib/GameProfile;)V", null, null);
            mv.visitCode();
            mv.visitVarInsn(Opcodes.ALOAD, 0);
            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "EntityPlayer", "<init>", "(Lnet/minecraft/world/World;Lcom/mojang/authlib/GameProfile;)V", false);
    
            // Generate INVOKEDYNAMIC instead of NEW+INVOKESPECIAL.
            // This will instantiate the target class by calling its private constructor.
            // Bootstrap method is called just once to link this call site.
            mv.visitInvokeDynamicInsn("invoke", "()Lfr/eno/pyrion/Pyrion;",
                    new Handle(Opcodes.H_INVOKESTATIC, "Pyrion", "patchInventory", "(Lnet/minecraft/entity/EntityPlayer;)V", false));
            // Here we have newly constructed instance of InvokeGenerator.Target
            mv.visitInsn(Opcodes.POP);
    
            mv.visitInsn(Opcodes.RETURN);
            mv.visitMaxs(0, 0);
            mv.visitEnd();
    
            cw.visitEnd();
            byte[] classData = cw.toByteArray();
            
    	    classNode.accept(cw);
    	    return cw.toByteArray();
    	}
    


  • Vraiment personne ne peut m'aider ?


Log in to reply