Контейнер

Версия Minecraft
1.6.4
49
3
3
Я решил сделать что-то на подобии личного склада вызываемого при нажатии кнопки в игровом меню. И теперь встал вопрос, как сделать склад индивидуальным и чтобы предметы сохранялись там?
Надеюсь на понимание и помощь :)
Java:
public class ContainerPersonal extends Container {
   public final IInventory inventory;
   public EntityPlayer player;

   public ContainerPersonal(EntityPlayer player, InventoryPlayer inventoryPlayer, IInventory inventory) {
          this.inventory = inventory;
          this.player = player;
          int j;
          int k;
          for (j = 0; j < 3; ++j)
            {
                for (k = 0; k < 9; ++k)
                {
                    this.addSlotToContainer(new Slot(inventory, k + j * 9, 8 + k * 18, 18 + j * 18));
                }
            }
          this.bindPlayerInventory(inventoryPlayer);
       }

   protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) {
      int i;
      for(i = 0; i < 3; ++i) {
         for(int j = 0; j < 9; ++j) {
            this.addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
         }
      }

      for(i = 0; i < 9; ++i) {
         this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142));
      }

   }

   public boolean canInteractWith(EntityPlayer var1) {
      return true;
   }
}
Java:
public class GuiPersonal extends GuiContainer {
   public EntityPlayer player;
   private static IInventory inventory;
   public ContainerPersonal container;
   public GuiPersonal(InventoryPlayer inv) {
      super(new ContainerPersonal(inv.player, inv, new InventoryPesronal(inv.player.getHeldItem())));
      this.container = (ContainerPersonal)super.inventorySlots;
      this.inventory = this.container.inventory;
   }
 
   protected void drawGuiContainerForegroundLayer(int param1, int param2) {
      super.fontRenderer.drawString("Личный склад", 61, 71, 42107);

   }

   protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) {
      GL11.glPushMatrix();
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("flame", "textures/personal.png"));
      this.drawTexturedModalRect(super.guiLeft - 1, super.guiTop + 0, 0, 0, super.xSize + 21, super.ySize);
      GL11.glPopMatrix();

   }

}
Java:
public class InventoryPesronal implements IInventory {

   private String name = "Inventory Item Personal";
   private final ItemStack stack;
   public static final int INV_SIZE = 1;
   ItemStack[] inventory = new ItemStack[32];


   public InventoryPesronal(ItemStack var1) {
      this.stack = var1;
      if(!this.stack.hasTagCompound()) {
         this.stack.setTagCompound(new NBTTagCompound());
      }

      this.readFromNBT(this.stack.getTagCompound());
   }

   public int getSizeInventory() {
      return this.inventory.length;
   }

   public ItemStack getStackInSlot(int var1) {
      return this.inventory[var1];
   }

   public ItemStack decrStackSize(int var1, int var2) {
      ItemStack var3 = this.getStackInSlot(var1);
      if(var3 != null) {
         if(var3.stackSize > var2) {
            var3 = var3.splitStack(var2);
            this.onInventoryChanged();
         } else {
            this.setInventorySlotContents(var1, (ItemStack)null);
         }
      }

      return var3;
   }

   public ItemStack getStackInSlotOnClosing(int var1) {
      ItemStack var2 = this.getStackInSlot(var1);
      this.setInventorySlotContents(var1, (ItemStack)null);
      return var2;
   }

   public void setInventorySlotContents(int var1, ItemStack var2) {
      this.inventory[var1] = var2;
      if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) {
         var2.stackSize = this.getInventoryStackLimit();
      }

      this.onInventoryChanged();
   }

   public String getInvName() {
      return this.name;
   }

   public boolean isInvNameLocalized() {
      return this.name.length() > 0;
   }

   public int getInventoryStackLimit() {
      return 64;
   }

   public void onInventoryChanged() {
      for(int var1 = 0; var1 < this.getSizeInventory(); ++var1) {
         if(this.getStackInSlot(var1) != null && this.getStackInSlot(var1).stackSize == 0) {
            this.setInventorySlotContents(var1, (ItemStack)null);
         }
      }

      this.writeToNBT(this.stack.getTagCompound());
   }

   public boolean isUseableByPlayer(EntityPlayer var1) {
      return true;
   }

   public void openChest() {}

   public void closeChest() {}

   public void readFromNBT(NBTTagCompound var1) {
      NBTTagList var2 = var1.getTagList("ItemInventory");

      for(int var3 = 0; var3 < var2.tagCount(); ++var3) {
         NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
         int var5 = var4.getInteger("Slot");
         if(var5 >= 0 && var5 < this.getSizeInventory()) {
            this.setInventorySlotContents(var5, ItemStack.loadItemStackFromNBT(var4));
         }
      }

   }

   public void writeToNBT(NBTTagCompound var1) {
      NBTTagList var2 = new NBTTagList();

      for(int var3 = 0; var3 < this.getSizeInventory(); ++var3) {
         if(this.getStackInSlot(var3) != null) {
            NBTTagCompound var4 = new NBTTagCompound();
            var4.setInteger("Slot", var3);
            this.getStackInSlot(var3).writeToNBT(var4);
            var2.appendTag(var4);
         }
      }

      var1.setTag("ItemInventory", var2);
   }

   public boolean isItemValidForSlot(int i, ItemStack itemstack) {
      return !(itemstack.getItem() instanceof ItemCoal);
   }
}
 
Решение
Ох, не обратил внимания на последнее предложение.

Ну тогда из конструктора InventoryPersonal убираешь всё, потом в твоём классе с EEP прописываешь то что я кидал ранее (сообщение #4), а в GuiHandler там где требуется твой инвентарь передаешь его получая свои EEP и обращаясь к полю inventory.
Так, вот русский тутор по созданию EEP, подходит для 1.6.4. Если хорошо с английским, то рекомендую оригинал.

Что бы хранить инвентарь в EEP тебе нужно там создать его экземпляр:
Java:
public final YourInventory inventory = new YourInventory();

Ну и сохранять/грузить из NBT:
Java:
    @Override
    public void saveNBTData(NBTTagCompound compound) {
        
        NBTTagCompound properties = new NBTTagCompound();
        
        this.inventory.writeToNBT(properties);

        compound.setTag(EEP_NAME, properties);
    }

    @Override
    public void loadNBTData(NBTTagCompound compound) {
        
        NBTTagCompound properties = (NBTTagCompound) compound.getTag(EEP_NAME);
        
        this.inventory.readFromNBT(properties);
    }
 
Так, вот русский тутор по созданию EEP, подходит для 1.6.4. Если хорошо с английским, то рекомендую оригинал.

Что бы хранить инвентарь в EEP тебе нужно там создать его экземпляр:
Java:
public final YourInventory inventory = new YourInventory();

Ну и сохранять/грузить из NBT:
Java:
    @Override
    public void saveNBTData(NBTTagCompound compound) {
       
        NBTTagCompound properties = new NBTTagCompound();
       
        this.inventory.writeToNBT(properties);

        compound.setTag(EEP_NAME, properties);
    }

    @Override
    public void loadNBTData(NBTTagCompound compound) {
       
        NBTTagCompound properties = (NBTTagCompound) compound.getTag(EEP_NAME);
       
        this.inventory.readFromNBT(properties);
    }
Еще вопросик. У меня в GuiPesronal есть вот это:
Java:
      super(new ContainerPersonal(inv.player, inv, new InventoryPesronal(inv.player.getHeldItem())));
Вот это new InventoryPesronal(inv.player.getHeldItem() , это типо выходит так, это гуи и контейнер являются индивидуальным для предмета который я беру в руки. То есть беру в руки предмет открываю гуи ложу туда что-то и оно там остается именню для этого предмета, а если возьму другой предмет, то у него будет свой контейнер со своим содержимым. Вопрос, как сделать чтобы контейнер был личный для игрока, а не для предмета. Что туда вписать и как ? :)
 
Так тебе нужен инвентарь в предмете? Тогда можно обойтись без EEP.
В GuiHandlere в serverGuiElement возвращаешь твой контейнер, ему передаешь игрока, его инвентарь и третьим параметром новый экземпляр твоего InventoryPersonal (а ему предмет в руке), clientGuiElement возвращаешь гуи контейнер (передавая ему инвентарь игрока).
Ну а дальше для открытия переопределяешь onItemRightClick в предмете, ну или создаешь кейбинд для кнопки и там открываешь инвентарь player#openGui().
Вот гайд на эту тему.
 
Так тебе нужен инвентарь в предмете? Тогда можно обойтись без EEP.
В GuiHandlere в serverGuiElement возвращаешь твой контейнер, ему передаешь игрока, его инвентарь и третьим параметром новый экземпляр твоего InventoryPersonal (а ему предмет в руке), clientGuiElement возвращаешь гуи контейнер (передавая ему инвентарь игрока).
Ну а дальше для открытия переопределяешь onItemRightClick в предмете, ну или создаешь кейбинд для кнопки и там открываешь инвентарь player#openGui().
Вот гайд на эту тему.
Неет, мне нужно наоборот. Чтобы контейнер открывался хоть когда, но был личным у игрока, а не у предмета.
 
Тогда причём здесь предмет? Зачем ты пишешь в него инвентарь?

Вобщем если нужен личный инвентарь для игрока в одном экземпляре, то храни его в EEP. Если хочешь его открывать только при наличии опред. предмета в руке, просто проверяй его перед открытием.

Если нужен персональный инвентарь для каждого предмета (типо рюкзака), то пиши инвентарь в NBT предмета (это ты и пытаешься делать судя по твоим классам).
 
Последнее редактирование:
Так тебе нужен инвентарь в предмете?
Тогда причём здесь предмет? Зачем ты пишешь в него инвентарь?
Вопрос, как сделать чтобы контейнер был личный для игрока, а не для предмета.
AustereTony, он писал про пример с предметом, а потом спросил как сделать это же, но не для предмета, а для игрока.
 
Ох, не обратил внимания на последнее предложение.

Ну тогда из конструктора InventoryPersonal убираешь всё, потом в твоём классе с EEP прописываешь то что я кидал ранее (сообщение #4), а в GuiHandler там где требуется твой инвентарь передаешь его получая свои EEP и обращаясь к полю inventory.
 
Назад
Сверху