- 317
- 10
Всем привет.. В общем то есть свой Handler, Gui, Container, InventoryPlayer, Slot
Сам инвентарь открывается, в обычных слотах из player.inventory все нормально. Но когда перекладываешь вещь с слота player.inventory в мой инвентарь - то что ложишь умножается на 2. Если предмет не стакается он остается 1 в слоте. При перезаходе в мир вещи остаются в слотах. Но когда пытаешься их забрать - они исчезают. В Gui'шнике нет ничего особенного (его думаю скидывать не имеет смысла)
Container:
InventoryPlayer
Slot:
Handler:
NBTUtils (откуда я получаю нбт в которое записываю слоты и получаю их в XInventoryPlayer, этот способ рабочий, т.к я с помощью его записываю все что мне надо в игрока):
Сам инвентарь открывается, в обычных слотах из player.inventory все нормально. Но когда перекладываешь вещь с слота player.inventory в мой инвентарь - то что ложишь умножается на 2. Если предмет не стакается он остается 1 в слоте. При перезаходе в мир вещи остаются в слотах. Но когда пытаешься их забрать - они исчезают. В Gui'шнике нет ничего особенного (его думаю скидывать не имеет смысла)
Container:
Код:
public class ContainerXPlayer extends Container {
public InventoryCrafting craftMatrix = new InventoryCrafting(this, 2, 2);
public IInventory craftResult = new InventoryCraftResult();
private final EntityPlayer thePlayer;
XInventoryPlayer xInv;
public ContainerXPlayer(EntityPlayer player, XInventoryPlayer xInv) {
this.thePlayer = player;
this.xInv = xInv;
this.addSlotToContainer(new SlotCrafting(player, this.craftMatrix, this.craftResult, 0, 120, 134));
int i;
for(i = 0; i < 2; ++i) {
for(int j = 0; j < 2; ++j) {
this.addSlotToContainer(new Slot(this.craftMatrix, j + i * 2, 68 + j * 18, 126 + i * 18));
}
}
for(i = 0; i < 9; ++i) {
this.addSlotToContainer(new Slot(player.inventory, i, 22 + i * 18, 174));
}
this.addSlotToContainer(new XSlotArmor(player, player.inventory, 36, 148, 141, 3));
this.addSlotToContainer(new XSlotArmor(player, player.inventory, 37, 148, 84, 2));
this.addSlotToContainer(new XSlotArmor(player, player.inventory, 38, 148, 27, 1));
this.addSlotToContainer(new XSlotArmor(player, player.inventory, 39, 148, 6, 0));
this.addSlotToContainer(new XSlot(player.inventory, 9, 148+16, 45));
this.addSlotToContainer(new XSlot(player.inventory, 10, 148+16, 63));
this.addSlotToContainer(new XSlot(player.inventory, 11, 152, 45));
this.addSlotToContainer(new XSlot(player.inventory, 12, 152, 63));
this.addSlotToContainer(new Slot(player.inventory, 13, 134, 102));
this.addSlotToContainer(new Slot(player.inventory, 14, 134, 120));
this.addSlotToContainer(new Slot(player.inventory, 15, 152, 102));
this.addSlotToContainer(new Slot(player.inventory, 16, 152, 120));
//vest
this.addSlotToContainer(new Slot(player.inventory, 17, 26, 24));
this.addSlotToContainer(new Slot(player.inventory, 18, 26, 42));
this.addSlotToContainer(new Slot(player.inventory, 19, 8, 24));
this.addSlotToContainer(new Slot(player.inventory, 20, 8, 42));
this.addSlotToContainer(new Slot(player.inventory, 21, -10, 24));
this.addSlotToContainer(new Slot(player.inventory, 22, -10, 42));
//backpack slots
this.addSlotToContainer(new Slot(player.inventory, 23, 26, 81));
this.addSlotToContainer(new Slot(player.inventory, 24, 8, 81));
this.addSlotToContainer(new Slot(player.inventory, 25, -10, 81));
this.addSlotToContainer(new Slot(player.inventory, 26, 26, 99));
this.addSlotToContainer(new Slot(player.inventory, 27, 8, 99));
this.addSlotToContainer(new Slot(player.inventory, 28, -10, 99));
this.addSlotToContainer(new Slot(player.inventory, 29, 26, 117));
this.addSlotToContainer(new Slot(player.inventory, 30, 8, 117));
this.addSlotToContainer(new Slot(player.inventory, 31, -10, 117));
this.addSlotToContainer(new Slot(player.inventory, 32, 4, 135));
this.addSlotToContainer(new Slot(player.inventory, 33, 166, 6));
this.addSlotToContainer(new XSlotVest(player.inventory, 34, 40, 6));
this.addSlotToContainer(new XSlotBackpack(player.inventory, 35, 40, 63));
//Баганные слоты
this.addSlotToContainer(new XSlot(xInv, 0, 67, 6));
this.addSlotToContainer(new XSlot(xInv, 1, 67+18, 6));
this.addSlotToContainer(new XSlot(xInv, 2, 67+18*2, 6));
this.addSlotToContainer(new XSlot(xInv, 3, 67+18*3, 6));
this.onCraftMatrixChanged(this.craftMatrix);
}
public void onCraftMatrixChanged(IInventory par1IInventory) {
this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.craftMatrix, this.thePlayer.worldObj));
}
public void onContainerClosed(EntityPlayer par1EntityPlayer) {
for(int i = 0; i < 4; ++i) {
ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);
if(itemstack != null) {
par1EntityPlayer.dropPlayerItemWithRandomChoice(itemstack, false);
}
}
//this.thePlayer.inventory.closeInventory();
}
public boolean canInteractWith(EntityPlayer player) {
return true;
}
public ItemStack transferStackInSlot(EntityPlayer player, int par2) {
return null;
}
public boolean func_94530_a(ItemStack par1ItemStack, Slot par2Slot) {
return par2Slot.inventory != this.craftResult && super.func_94530_a(par1ItemStack, par2Slot);
}
}
InventoryPlayer
Код:
public class XInventoryPlayer implements IInventory {
public static ItemStack[] is = new ItemStack[4];
EntityPlayer thePlayer;
public XInventoryPlayer(EntityPlayer thePlayer) {
super();
this.thePlayer = thePlayer;
}
public void writeEntityToNBT(NBTTagCompound nbt) {
NBTTagList list = new NBTTagList();
for(int i = 0; i < this.is.length; i++) {
if(this.is[i] != null) {
NBTTagCompound item = new NBTTagCompound();
item.setByte("Item", (byte) i);
this.is[i].writeToNBT(item);
list.appendTag(item);
}
}
nbt.setTag("Slots", list);
}
public void readEntityFromNBT(NBTTagCompound nbt) {
NBTTagList list = nbt.getTagList("Slots", 10);
this.is = new ItemStack[getSizeInventory()];
for(int i = 0; i < list.tagCount(); i++) {
NBTTagCompound item = list.getCompoundTagAt(i);
byte b = item.getByte("Item");
if(b >= 0 && b < this.is.length) {
this.is[b] = ItemStack.loadItemStackFromNBT(item);
}
}
}
@Override
public int getSizeInventory() {
return is.length;
}
@Override
public ItemStack getStackInSlot(int i) {
return this.is[i];
}
@Override
public ItemStack decrStackSize(int i, int j) {
if(this.is[i] != null) {
ItemStack itemstack;
if(this.is[i].stackSize <= j) {
itemstack = this.is[i];
this.is[i] = null;
} else {
itemstack = this.is[i].splitStack(j);
if(this.is[i].stackSize == 0) {
this.is[i] = null;
}
}
return itemstack;
}
return null;
}
@Override
public ItemStack getStackInSlotOnClosing(int i) {
if(this.is[i] != null) {
ItemStack itemstack = this.is[i];
this.is[i] = null;
return itemstack;
}
return null;
}
@Override
public void setInventorySlotContents(int i, ItemStack itemstack) {
this.is[i] = itemstack;
if(itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()) {
itemstack.stackSize = this.getInventoryStackLimit();
}
}
@Override
public String getInventoryName() {
return "dayz.player";
}
@Override
public boolean hasCustomInventoryName() {
return false;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public void markDirty() {}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
return false;
}
@Override
public void openInventory() {
NBTTagCompound nbt = NBTUtils.getPlayerData(thePlayer);
this.readEntityFromNBT(nbt);
}
@Override
public void closeInventory() {
NBTTagCompound nbt = NBTUtils.getPlayerData(thePlayer);
this.writeEntityToNBT(nbt);
}
@Override
public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) {
return false;
}
}
Slot:
Код:
public class XSlot extends Slot{
public XSlot(IInventory p_i1824_1_, int p_i1824_2_, int p_i1824_3_, int p_i1824_4_) {
super(p_i1824_1_, p_i1824_2_, p_i1824_3_, p_i1824_4_);
}
public int getSlotStackLimit() {
return 64;
}
public boolean isItemValid(ItemStack par1ItemStack) {
return true;
}
}
Handler:
Код:
public class Handler implements IGuiHandler {
public XInventoryPlayer xInv;
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
switch(ID) {
case 0:
case 1:
xInv = new XInventoryPlayer(player);
//NBTTagCompound nbt = NBTUtils.getPlayerData(player);
//xInv.readEntityFromNBT(nbt);
return new ContainerXPlayer(player, xInv);
}
return null;
}
@Override
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
switch(ID) {
case 0:
case 1:
xInv = new XInventoryPlayer(player);
//NBTTagCompound nbt = NBTUtils.getPlayerData(player);
//xInv.readEntityFromNBT(nbt);
return new GuiXPlayer(player, xInv);
}
return null;
}
}
NBTUtils (откуда я получаю нбт в которое записываю слоты и получаю их в XInventoryPlayer, этот способ рабочий, т.к я с помощью его записываю все что мне надо в игрока):
Код:
public class NBTUtils {
public static NBTTagCompound getPlayerData(EntityPlayer player){
NBTTagCompound playerData = player.getEntityData();
if(!playerData.hasKey(EntityPlayer.PERSISTED_NBT_TAG)){
playerData.setTag(EntityPlayer.PERSISTED_NBT_TAG, new NBTTagCompound());
}
return playerData.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG);
}
}
Всем большое спасибо заранее