Инвентарь

Версия Minecraft
1.7.10
372
0
Делаю что то типа рюкзака. 

Есть свой кастумный инвентарь с дополнительным слотом под рюкзак. Хочу сделать что бы в зависимости от уровня рюкзака игрок имел от 9 слотов (голый) до 36 (3 уровень). 

Как такое можно сделать? Как будет лучше и удобней?

Копаться в контейнере? Или может заполнять ненужные слоты мусором и перемещать их на оверкоординат? Или есть еще и другой способ?
 
3,005
192
592
RaDiC написал(а):
Далеко не то что мне нужно, да и я уже сделал. Осталось только как обновить гуй с контейнером автоматом при смене рюкзака.

В смысле не то? Рюкзаки? Да. С уровнями? Да. Имеет сменные гуи? Да. Вот только на счет подбора хз, ибо не юзал.
 
372
0
Doc написал(а):
RaDiC написал(а):
Далеко не то что мне нужно, да и я уже сделал. Осталось только как обновить гуй с контейнером автоматом при смене рюкзака.

В смысле не то? Рюкзаки? Да. С уровнями? Да. Имеет сменные гуи? Да. Вот только на счет подбора хз, ибо не юзал.

Сейчас мне нужно контейнер обновить при его изменениях. 
Вот он открыт, он изменяется, но что бы изменения вступили в силу я должен закрыть и заново открыть гуй. 
Как мне это автоматом обновить то?
 
2,505
81
397
Я не знаю как вы пилите контейнеры. У меня контейнер сам все обновляет нормально. Дефолтный инвентарь игрока, например, тоже обновляет именно контейнер, просто Container.
Заюзай в конструкторе detectAndSendChanges (отправляет все изменившееся на клиент)
 
2,505
81
397
Ну вот. Все же слишком очевидно.
Код:
public class TileRepairBlock extends TileEntity
{
    public InventoryBasic inv = new InventoryBasic("", false, 1);

    @Override
    public void readFromNBT(NBTTagCompound nbt)
    {
        super.readFromNBT(nbt);
        MHelper.readInvFromNBT(inv, nbt);
    }

    @Override
    public void writeToNBT(NBTTagCompound nbt)
    {
        super.writeToNBT(nbt);
        MHelper.writeInvToNBT(inv, nbt);
    }

    public boolean isUseableByPlayer(EntityPlayer player)
    {
        if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) {
            return false;
        }
        return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64.0D;
    }
}

public class ContainerRepairTable extends Container
{
    public static int invX        = 80;
    public static int invY        = 30;
    public static int invPlayer1X = 8;
    public static int invPlayer1Y = 74;
    public static int invPlayer2X = 8;
    public static int invPlayer2Y = 132;

    TileRepairBlock tile;

    public ContainerRepareTable(EntityPlayer player, World world, int x, int y, int z)
    {
        tile = (TileRepairBlock) world.getTileEntity(x, y, z);

        addSlotToContainer(new Slot(tile.inv, 0, invX, invY));

        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 9; ++j) {
                addSlotToContainer(new Slot(player.inventory, j + i * 9 + 9, invPlayer1X + j * 18,
                    invPlayer1Y + i * 18));
            }
        }

        for (int i = 0; i < 9; ++i) {
            addSlotToContainer(new Slot(player.inventory, i, invPlayer2X + i * 18, invPlayer2Y));
        }

        detectAndSendChanges();
    }

    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int index)
    {
        ItemStack stack = null;
        Slot slot = (Slot) inventorySlots.get(index);

        if (slot != null && slot.getHasStack()) {
            ItemStack stack1 = slot.getStack();
            stack = stack1.copy();

            boolean flag = stack.isItemDamaged();

            if (index >= 0 && index < 1) {
                if (!mergeItemStack(stack1, 1, 37, false)) {
                    return null;
                }
            }
            else if (index >= 1 && index < 28) {
                if (!mergeItemStack(stack1, 28, 37, false)) {
                    return null;
                }
            }
            else if (index >= 28 && index < 37) {
                if (!mergeItemStack(stack1, 1, 28, false)) {
                    return null;
                }
            }
            else {
                return null;
            }

            if (stack1.stackSize == 0) {
                slot.putStack((ItemStack) null);
            }
            else {
                slot.onSlotChanged();
            }

            if (stack1.stackSize == stack.stackSize) {
                return null;
            }

            slot.onPickupFromSlot(player, stack1);
        }

        return stack;
    }

    @Override
    public boolean canInteractWith(EntityPlayer player)
    {
        return tile.isUseableByPlayer(player);
    }
}
 
372
0
Dahaka написал(а):
Ну вот. Все же слишком очевидно.
Код:
public class TileRepairBlock extends TileEntity
{
    public InventoryBasic inv = new InventoryBasic("", false, 1);

    @Override
    public void readFromNBT(NBTTagCompound nbt)
    {
        super.readFromNBT(nbt);
        MHelper.readInvFromNBT(inv, nbt);
    }

    @Override
    public void writeToNBT(NBTTagCompound nbt)
    {
        super.writeToNBT(nbt);
        MHelper.writeInvToNBT(inv, nbt);
    }

    public boolean isUseableByPlayer(EntityPlayer player)
    {
        if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) {
            return false;
        }
        return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64.0D;
    }
}

public class ContainerRepairTable extends Container
{
    public static int invX        = 80;
    public static int invY        = 30;
    public static int invPlayer1X = 8;
    public static int invPlayer1Y = 74;
    public static int invPlayer2X = 8;
    public static int invPlayer2Y = 132;

    TileRepairBlock tile;

    public ContainerRepareTable(EntityPlayer player, World world, int x, int y, int z)
    {
        tile = (TileRepairBlock) world.getTileEntity(x, y, z);

        addSlotToContainer(new Slot(tile.inv, 0, invX, invY));

        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 9; ++j) {
                addSlotToContainer(new Slot(player.inventory, j + i * 9 + 9, invPlayer1X + j * 18,
                    invPlayer1Y + i * 18));
            }
        }

        for (int i = 0; i < 9; ++i) {
            addSlotToContainer(new Slot(player.inventory, i, invPlayer2X + i * 18, invPlayer2Y));
        }

        detectAndSendChanges();
    }

    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int index)
    {
        ItemStack stack = null;
        Slot slot = (Slot) inventorySlots.get(index);

        if (slot != null && slot.getHasStack()) {
            ItemStack stack1 = slot.getStack();
            stack = stack1.copy();

            boolean flag = stack.isItemDamaged();

            if (index >= 0 && index < 1) {
                if (!mergeItemStack(stack1, 1, 37, false)) {
                    return null;
                }
            }
            else if (index >= 1 && index < 28) {
                if (!mergeItemStack(stack1, 28, 37, false)) {
                    return null;
                }
            }
            else if (index >= 28 && index < 37) {
                if (!mergeItemStack(stack1, 1, 28, false)) {
                    return null;
                }
            }
            else {
                return null;
            }

            if (stack1.stackSize == 0) {
                slot.putStack((ItemStack) null);
            }
            else {
                slot.onSlotChanged();
            }

            if (stack1.stackSize == stack.stackSize) {
                return null;
            }

            slot.onPickupFromSlot(player, stack1);
        }

        return stack;
    }

    @Override
    public boolean canInteractWith(EntityPlayer player)
    {
        return tile.isUseableByPlayer(player);
    }
}

я хз, но это у меня не работает.. кстати у меня нет тайла
 
372
0
Код:
public class ContainerCustomPlayer extends Container {
    private final EntityPlayer player;
    
 private static final int ARMOR_START = InventoryCustomPlayer.INV_SIZE, ARMOR_END = ARMOR_START+3,
 INV_START = ARMOR_END+0/* 1 */, INV_END = INV_START+0/* 26 */, HOTBAR_START = INV_END+1, HOTBAR_END = HOTBAR_START+8;
 
 public ContainerCustomPlayer(EntityPlayer player, InventoryPlayer inventoryPlayer, InventoryCustomPlayer inventoryCustom) {
 this.player = player;
        int i;
        int j;
        
        int x = 50000;
        int y = 50000;
        int z = 50000;

 addSlotToContainer(new SlotHead(inventoryCustom, 0, 116, 8));
 addSlotToContainer(new SlotBackpack(inventoryCustom, 1, 116, 26));

 for (i = 0; i < 4; ++i) {
 addSlotToContainer(new SlotArmor(player, inventoryPlayer, inventoryPlayer.getSizeInventory() - 1 - i, 44, 8 + i * 18, i));
 }
 
 Slot slot = (Slot) this.inventorySlots.get(1);
 if (slot != null && slot.getHasStack()) {
 Item equip = slot.getStack().getItem();
 
 if (equip == Items.schoolRucksack) {
 x = 1; y = 50000; z = 50000;
 } else if (equip == Items.mediumRucksack) {
 x = 1; y = 1; z = 50000;
 } else if (equip == Items.militaryRucksack) {
 x = 1; y = 1; z = 1;
 }
 } else {
 x = 50000; y = 50000; z = 50000;
 }
 
 for (j = 0; j < 9; ++j) {
 addSlotToContainer(new Slot(inventoryPlayer, j + 9, 8 + j * 18, 84*x));
 }
 
 for (j = 0; j < 9; ++j) {
 addSlotToContainer(new Slot(inventoryPlayer, j + 18, 8 + j * 18, 102*y));
 }
 
 for (j = 0; j < 9; ++j) {
 addSlotToContainer(new Slot(inventoryPlayer, j + 27, 8 + j * 18, 120*z));
 }
 
 for (i = 0; i < 9; ++i) {
 addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142));
 }
 
 super.detectAndSendChanges();
 }

 @Override
 public boolean canInteractWith(EntityPlayer player) {
 return true;
 }

 public ItemStack transferStackInSlot(EntityPlayer player, int par2) {
 ItemStack itemstack = null;
 Slot slot = (Slot) this.inventorySlots.get(par2);

 if (slot != null && slot.getHasStack()) {
 ItemStack itemstack1 = slot.getStack();
 itemstack = itemstack1.copy();

 if (itemstack1.stackSize == 0) {
 slot.putStack((ItemStack) null);
 } else {
 slot.onSlotChanged();
 }

 if (itemstack1.stackSize == itemstack.stackSize) {
 return null;
 }

 slot.onPickupFromSlot(player, itemstack1);
 }

 return itemstack;
 }
 
 public void onContainerClosed(EntityPlayer player) {
        super.onContainerClosed(player);
        
        Slot slot = (Slot) this.inventorySlots.get(1);
 if (slot != null && slot.getHasStack()) {
 Item equip = slot.getStack().getItem();
 
 if (equip == Items.schoolRucksack) {
 for (int i = 18; i < 36; ++i) {
            ItemStack itemstack = player.inventory.getStackInSlotOnClosing(i);

            if (itemstack != null) {
                player.dropPlayerItemWithRandomChoice(itemstack, false);
            }
        }
 } else if (equip == Items.mediumRucksack) {
 for (int i = 27; i < 36; ++i) {
            ItemStack itemstack = player.inventory.getStackInSlotOnClosing(i);

            if (itemstack != null) {
                player.dropPlayerItemWithRandomChoice(itemstack, false);
            }
        }
 }
 } else {
 for (int i = 9; i < 36; ++i) {
            ItemStack itemstack = player.inventory.getStackInSlotOnClosing(i);

            if (itemstack != null) {
                player.dropPlayerItemWithRandomChoice(itemstack, false);
            }
        }
 }
}
 
Сверху