Comment utiliser les capabilities sur mon inventaire custom ?



  • Bonjour,

    Donc après avoir fait mon inventaire custom, je bloque à problème, stockées les slots que j'ai ajoutée. J'ai essayer de comprendre la doc, j'ai compris la moitié des trucs (Je sais qu'il me faut une interface, une class storage et une factory) j'ai regarder un post dans le support, (Sa ma pas aider plus que ça).

    Je tiens à préciser que mon inventaire marche, seul soucis il ne stock que les items liées à l'inventaire de minecraft (Et pas les miens).

    Voici toutes mes classes actuels (Sans les capabilities):

    #ArkofusContainerPlayer(ArkofusContainerPlayer)
    :::

    public class ArkofusContainerPlayer extends Container{
    
       private final EntityPlayer thePlayer;
    
       public ArkofusContainerPlayer(EntityPlayer player, InventoryPlayer inventoryPlayer, ArkofusInventoryPlayer arkofusInventoryPlayer) {
           this.thePlayer = player;
           this.bindArkofusInventory(arkofusInventoryPlayer);
           this.bindPlayerInventory(inventoryPlayer);
           this.bindArmorInventory(inventoryPlayer, arkofusInventoryPlayer);
       }
    
       private void bindPlayerInventory(InventoryPlayer inventoryPlayer) {
           //Inventaire
           for(int y = 0; y < 3; y++){
               for(int x = 0; x < 9; x++){
                   this.addSlotToContainer(new Slot(inventoryPlayer, x + (y * 9) + 9, (96 + (x * 36)) / 2, (310 + (y * 36)) / 2));
               }
           }
    
           //Item Armor Corps à Corps, Slot hot bar, index 0
           this.addSlotToContainer(new SlotArme(inventoryPlayer, 0, 64 / 2, 188 / 2));
    
           //HotBar Slot
           for(int x = 1; x < 9; x++){
               this.addSlotToContainer(new Slot(inventoryPlayer, x, (114 + ((x-1) * 36)) / 2, 440 / 2));
           }
       }
    
       private void bindArkofusInventory(ArkofusInventoryPlayer arkofusInventoryPlayer) {
           for(int y = 0; y < 6; ++y) {
               for(int x = 0; x < 5; ++x) {
                   this.addSlotToContainer(new SlotCustom(arkofusInventoryPlayer, x + (y * 10) + 10, (298 + (36 * x)) / 2, (62 + (36 * y)) / 2));
               }
           }
       }
    
       private void bindArmorInventory(InventoryPlayer inventoryPlayer, ArkofusInventoryPlayer arkofusInventoryPlayer) {
           //Bouclier
           this.addSlotToContainer(new SlotArmor(this.thePlayer, inventoryPlayer, inventoryPlayer.getSizeInventory() - 1, 22 / 2, 188 / 2, 0));
    
           //Casque
           this.addSlotToContainer(new SlotArmor(this.thePlayer, inventoryPlayer, inventoryPlayer.getSizeInventory() - 2, 232 / 2, 62 / 2, 5));
           //Plastron
           this.addSlotToContainer(new SlotArmor(this.thePlayer, inventoryPlayer, inventoryPlayer.getSizeInventory() - 3, 232 / 2, 104 / 2, 4));
           //Pantalon
           this.addSlotToContainer(new SlotArmor(this.thePlayer, inventoryPlayer, inventoryPlayer.getSizeInventory() - 4, 232 / 2, 146 / 2, 3));
           //Boots
           this.addSlotToContainer(new SlotArmor(this.thePlayer, inventoryPlayer, inventoryPlayer.getSizeInventory() - 5, 232 / 2, 188 / 2, 2));
    
           //Amu
           this.addSlotToContainer(new SlotAmulette(arkofusInventoryPlayer, 0, 22/2, 62/2));
    
           //Anneau
           this.addSlotToContainer(new SlotAnneau(arkofusInventoryPlayer, 1, 22/2, 104/2));
           this.addSlotToContainer(new SlotAnneau(arkofusInventoryPlayer, 2, 22/2, 146/2));
    
           //Dofus
           for(int x = 0; x < 6; ++x){
               this.addSlotToContainer(new SlotArkofus(arkofusInventoryPlayer, 3 + x, (22 +(x * 42)) /2, 230/2));
           }
       }
    
       @Override
       public boolean canInteractWith(EntityPlayer playerIn) {
           return true;
       }
    
    }
    

    :::

    #GuiInventoryPlayer(GuiInventoryPlayer)
    :::

    public class GuiInventoryPlayer extends GuiContainer {
    
       EntityPlayer player;
       int oldMouseY;
       int oldMouseX;
    
       public GuiInventoryPlayer(EntityPlayer player, InventoryPlayer inventoryPlayer, ArkofusInventoryPlayer inventoryCustom) {
           super(new ArkofusContainerPlayer(player, inventoryPlayer, inventoryCustom));
           this.player = player;
           this.xSize = 512 / 2;
           this.ySize = 512 / 2;
       }
    
       @Override
       public boolean doesGuiPauseGame() {
           return false;
       }
    
       @Override
       public void drawScreen(int mouseX, int mouseY, float partialTicks) {
           super.drawScreen(mouseX, mouseY, partialTicks);
           this.oldMouseX = mouseX;
           this.oldMouseY = mouseY;
       }
    
       @Override
       protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
           this.fontRenderer.drawString(I18n.format("container.arkofus_inventory"), 216/2, 13/2, 0xfde43a); //On dessine le "titre" du gui, le I18n.format va traduire le texte donné, n'oubliez pas de l'ajouter dans votre fichier de langues !
       }
    
       @Override
       protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
           GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
           this.mc.getTextureManager().bindTexture(new ResourceLocation(ArkofusUtils.MODID, "textures/gui/container/inventory_player.png"));
           this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0,0, this.xSize, this.ySize);
    
           this.drawEntityOnScreen(this.guiLeft + 75, this.guiTop + 98, 30, (float)(this.guiLeft + 51) - oldMouseX , (float)(this.guiTop+ 75 - 50) - this.oldMouseY, this.mc.player);
       }
    
       private void drawEntityOnScreen(int posX, int posY, int scale, float mouseX, float mouseY, EntityLivingBase ent) {
           GlStateManager.enableColorMaterial();
           GlStateManager.pushMatrix();
           GlStateManager.translate((float)posX, (float)posY, 50.0F);
           GlStateManager.scale((float)(-scale), (float)scale, (float)scale);
           GlStateManager.rotate(180.0F, 0.0F, 0.0F, 1.0F);
           float f = ent.renderYawOffset;
           float f1 = ent.rotationYaw;
           float f2 = ent.rotationPitch;
           float f3 = ent.prevRotationYawHead;
           float f4 = ent.rotationYawHead;
           GlStateManager.rotate(135.0F, 0.0F, 1.0F, 0.0F);
           RenderHelper.enableStandardItemLighting();
           GlStateManager.rotate(-135.0F, 0.0F, 1.0F, 0.0F);
           GlStateManager.rotate(-((float)Math.atan((double)(mouseY / 40.0F))) * 20.0F, 1.0F, 0.0F, 0.0F);
           ent.renderYawOffset = (float)Math.atan((double)(mouseX / 40.0F)) * 20.0F;
           ent.rotationYaw = (float)Math.atan((double)(mouseX / 40.0F)) * 40.0F;
           ent.rotationPitch = -((float)Math.atan((double)(mouseY / 40.0F))) * 20.0F;
           ent.rotationYawHead = ent.rotationYaw;
           ent.prevRotationYawHead = ent.rotationYaw;
           GlStateManager.translate(0.0F, 0.0F, 0.0F);
           RenderManager rendermanager = Minecraft.getMinecraft().getRenderManager();
           rendermanager.setPlayerViewY(180.0F);
           rendermanager.setRenderShadow(false);
           rendermanager.doRenderEntity(ent, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F, false);
           rendermanager.setRenderShadow(true);
           ent.renderYawOffset = f;
           ent.rotationYaw = f1;
           ent.rotationPitch = f2;
           ent.prevRotationYawHead = f3;
           ent.rotationYawHead = f4;
           GlStateManager.popMatrix();
           RenderHelper.disableStandardItemLighting();
           GlStateManager.disableRescaleNormal();
           GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit);
           GlStateManager.disableTexture2D();
           GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
       }
    
    }
    

    :::

    #ArkofusInventoryPlayer(ArkofusInventoryPlayer)
    :::

    public class ArkofusInventoryPlayer implements IInventory {
    
       private final String name = "Arkofus Inventory";
       private final String tagName = "ArkofusInvTag";
       public static final int INV_SIZE = 72;
       private NonNullList <itemstack>inventory = NonNullList.<itemstack>withSize(INV_SIZE, ItemStack.EMPTY);
    
       private EntityPlayer player;
    
       private ItemStackHandler stackHandler = new ItemStackHandler(INV_SIZE);
    
       private List <iinventorychangedlistener>changeListeners;
    
       public ArkofusInventoryPlayer(){}
    
       public ArkofusInventoryPlayer(EntityPlayer player) {
           this.player = player;
       }
    
       @Override
       public int getSizeInventory() {
           return INV_SIZE;
       }
    
       @Override
       public boolean isEmpty() {
           return inventory.isEmpty();
       }
    
       @Override
       public ItemStack getStackInSlot(int index) {
           return index >= 0 && index <= inventory.size() ? this.inventory.get(index) : ItemStack.EMPTY;
       }
    
       @Override
       public ItemStack decrStackSize(int index, int count) {
    
           ItemStack itemStack = getStackInSlot(index);
    
           if(!itemStack.isEmpty()){
               if(itemStack.getCount() <= count) {
                   setInventorySlotContents(index, ItemStack.EMPTY);
                   this.markDirty();
                   return itemStack;
               } else {
                   itemStack = getStackInSlot(index).splitStack(count);
                   if(getStackInSlot(index).getCount() <= 0) setInventorySlotContents(index, ItemStack.EMPTY);
                   else setInventorySlotContents(index, getStackInSlot(index));
                   markDirty();
                   return itemStack;
               }
           }
    
           return ItemStack.EMPTY;
       }
    
       @Override
       public ItemStack removeStackFromSlot(int index) {
           ItemStack itemstack = getStackInSlot(index);
           setInventorySlotContents(index, ItemStack.EMPTY);
           return itemstack;
       }
    
       @Override
       public void setInventorySlotContents(int index, ItemStack stack) {
           if(index < 0 ||index >= inventory.size()) return;
           if(stack != ItemStack.EMPTY && stack.getCount() > this.getInventoryStackLimit()) stack.setCount(getInventoryStackLimit());
           if(stack != ItemStack.EMPTY && stack.getCount() == 0) stack = ItemStack.EMPTY;
           inventory.set(index, stack);
           this.markDirty();
       }
    
       @Override
       public int getInventoryStackLimit() {
           return 999;
       }
    
       @Override
       public void markDirty() {
           if (this.changeListeners != null) {
               for (int i = 0; i < this.changeListeners.size(); ++i) {
                   ((IInventoryChangedListener)this.changeListeners.get(i)).onInventoryChanged(this);
               }
           }
       }
    
       @Override
       public boolean isUsableByPlayer(EntityPlayer player) {
           return true;
       }
    
       @Override
       public void openInventory(EntityPlayer player) {
    
       }
    
       @Override
       public void closeInventory(EntityPlayer player) {}
    
       @Override
       public boolean isItemValidForSlot(int index, ItemStack stack) {
           //if(index == SLOT_Custom && item.getItem() instanceof ItemCustom) return true;
           return true;
       }
    
       @Override
       public int getField(int id) {
           return 0;
       }
    
       @Override
       public void setField(int id, int value) {}
    
       @Override
       public int getFieldCount() {
           return 0;
       }
    
       @Override
       public void clear() {
           for(int s = 0; s < inventory.size(); s++){
               setInventorySlotContents(s, ItemStack.EMPTY);
           }
       }
    
       @Override
       public String getName() {
           return name;
       }
    
       @Override
       public boolean hasCustomName() {
           return name.length() > 0;
       }
    
       @Override
       public ITextComponent getDisplayName() {
           return new TextComponentString(name);
       }
    
    }
    

    :::

    #SlotCustom(SlotCustom)
    :::

    public class SlotCustom extends Slot {
    
       public SlotCustom(IInventory inventoryIn, int index, int xPosition, int yPosition) {
           super(inventoryIn, index, xPosition, yPosition);
       }
    
       @Override
       public int getItemStackLimit(ItemStack stack) {
           return 999;
       }
    
       @Override
       public boolean isItemValid(ItemStack itemstack) {
           return true;
       }
    }
    

    :::</iinventorychangedlistener></itemstack></itemstack>



  • Yo je crois que cela devrait d'aider https://www.minecraftforgefrance.fr/showthread.php?tid=905



  • Déjà vue sauf que j'ai pas réussi à le convertir vers le Capability 😞



  • Il existe une class qui permet de wrapper un IInventory en IItemHandler.



  • @'LeBossMax2':

    Il existe une class qui permet de wrapper un IInventory en IItemHandler.

    Tu pourrais m'en dire plus s'il te plait ? Car j'ai trouver plusieurs class, comme le InvWrapper, SidedInvWrapper etc…





  • @'SpyMan':

    Je pense que ça pourrait d'aider https://github.com/coolAlias/Forge_Tutorials/blob/master/CustomPlayerInventory.java

    C'est grâce à lui que j'ai pu avoir mon inventaire, sauf que je n'arrive pas à le convertir vers les capabilities.

    Edit : Je n'y arrive toujours pas xD


Log in to reply