Non résolu 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’inventaireMerci à tous ce qui m’aideront
-
Vraiment personne pour m’aider ?
-
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 -
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 ?