Доброго времени суток. Захотел поиграться с тайлами и контейнерами для них. Проблема в том, что после того, как я положил в слот предмет, забрать я его больше не могу, только через shift-клик(для шифта понятное дело, я забацал метод transferStackInSlot), а как забрать предмет через обычный клик, где я что-то упустил?
И еще один вопрос, как можно реализовать примерно такую вещь: кладу в слот предмет, он помещается, но при этом из курсора он не пропадает, ПКМ увеличивает кол-во предметов, ЛКМ уменьшает.
TraderContainer:
public class TraderContainer extends Container {
private TileTrader tileTrader;
public TraderContainer(EntityPlayer player, TileTrader tileTrader) {
this.tileTrader = tileTrader;
addSlotToContainer(new Slot(tileTrader, 0, 111, 25));
addSlotToContainer(new Slot(tileTrader, 1, 111, 50));
addSlotToContainer(new Slot(tileTrader, 2, 151, 25));
addSlotToContainer(new Slot(tileTrader, 3, 151, 50));
//inventory
for(int i = 0 ; i< 3; i++) {
for(int j = 0; j < 9; j++) {
addSlotToContainer(new Slot(player.inventory, j + i * 9 + 9, 8 + j * 18, 101 + i * 18));
}
}
//hotbar
for(int i = 0; i < 9; i++) {
addSlotToContainer(new Slot(player.inventory, i, 8 + i * 18, 159));
}
}
@Override
public boolean canInteractWith(EntityPlayer player) {
return true;
}
@Override
public void onContainerClosed(EntityPlayer p_75134_1_) {
this.tileTrader.closeInventory();
super.onContainerClosed(p_75134_1_);
}
@Override
public ItemStack transferStackInSlot(EntityPlayer player, int i) {
ItemStack itemstack = null;
Slot slot = (Slot)this.inventorySlots.get(i);
if (slot != null && slot.getHasStack()) {
ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy();
if (i <= 3) {
if (!this.mergeItemStack(itemstack1, 4, 40, true)) {
return null;
}
slot.onSlotChange(itemstack1, itemstack);
}
else if (i >= 4 && i < 31) {
if (!this.mergeItemStack(itemstack1, 31, 40, false)) {
return null;
}
}
else if (i >= 31 && i < 40) {
if (!this.mergeItemStack(itemstack1, 4, 31, false)) {
return null;
}
}
else if (!this.mergeItemStack(itemstack1, 4, 40, false)) {
return null;
}
if (itemstack1.stackSize == 0) {
slot.putStack(null);
}
else {
slot.onSlotChanged();
}
if (itemstack1.stackSize == itemstack.stackSize) {
return null;
}
slot.onPickupFromSlot(player, itemstack1);
}
return itemstack;
}
}
TilETrader:
public class TileTrader extends TileEntity implements ISidedInventory {
private ItemStack[] slots = new ItemStack[4];
private GameProfile owner;
private EntityPlayer entityPlayer;
public TileTrader() {
}
@Override
public boolean canUpdate() {
return false;
}
@Override
public void writeToNBT(NBTTagCompound nbtTag) {
super.writeToNBT(nbtTag);
if(owner != null) {
NBTTagCompound ownerNbt = new NBTTagCompound();
NBTUtil.func_152460_a(ownerNbt, owner);
nbtTag.setTag("owner", ownerNbt);
}
NBTTagList list = new NBTTagList();
for(int i = 0; i < slots.length; i++) {
if(slots[i] != null) {
NBTTagCompound item = new NBTTagCompound();
item.setByte("index", (byte) i);
slots[i].writeToNBT(item);
list.appendTag(item);
}
}
nbtTag.setTag("slots", list);
}
@Override
public void readFromNBT(NBTTagCompound nbtTag) {
super.readFromNBT(nbtTag);
this.owner = NBTUtil.func_152459_a(nbtTag.getCompoundTag("owner"));
NBTTagList list = nbtTag.getTagList("slots", 10);
for(int i = 0; i < list.tagCount(); i++) {
NBTTagCompound tag = list.getCompoundTagAt(i);
byte index = tag.getByte("index");
if(index >= 0 && index < this.slots.length) {
slots[index] = ItemStack.loadItemStackFromNBT(tag);
}
}
}
public void setOpeners(GameProfile gameProfile, EntityPlayer player) {
if(owner == null) {
this.owner = gameProfile;
markDirty();
}
this.entityPlayer = player;
}
public GameProfile getOwner() {
return owner;
}
public boolean isOwner(EntityPlayer player) {
return player.getGameProfile().getId() == getOwner().getId();
}
public EntityPlayer getEntityPlayer() {
return entityPlayer;
}
@Override
public int[] getAccessibleSlotsFromSide(int i) {
return new int[] {0, 1, 2, 3};
}
@Override
public boolean canInsertItem(int i, ItemStack itemStack, int j) {
return false;
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
return true;
}
@Override
public int getSizeInventory() {
return slots.length;
}
@Override
public ItemStack getStackInSlot(int i) {
return this.slots[i];
}
@Override
public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) {
return null;
}
@Override
public ItemStack getStackInSlotOnClosing(int p_70304_1_) {
return null;
}
@Override
public void setInventorySlotContents(int i, ItemStack itemstack) {
this.slots[i] = itemstack;
if ((itemstack != null) && (itemstack.stackSize > getInventoryStackLimit())) {
itemstack.stackSize = getInventoryStackLimit();
}
}
@Override
public String getInventoryName() {
return "Торговый аппарат";
}
@Override
public boolean hasCustomInventoryName() {
return true;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
return player.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) == this && player.getDistanceSq(this.xCoord, this.yCoord, this.zCoord) <= 64;
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
entityPlayer = null;
markDirty();
}
@Override
public boolean isItemValidForSlot(int i, ItemStack stack) {
System.out.println(i + " valid");
return true;
}
}