Добавление слота в инвентарь

Версия Minecraft
1.7.10
API
Forge
32
1
1
Хочу сделать, чтобы при соблюдении определенного условия в инвентаре появлялся или пропадал слот. Получилось сделать, но инвентарь обновляется только после закрытия и повторного открытия. Как можно обновлять инвентарь в моменте когда он открыт? То есть допустим если я кладу предмет в определенный слот, то в инвентаре сразу же появляется другой.
 
Решение
Список слотов лучше не трогать во избежание нарушения синхронизации с клиентом, поскольку слоты синхронизируются по индексу в списке. Вместо этого блокируйте и визуально скрывайте недоступный слот.
Тут ситуация подобна с кнопками в Gui.
Без повторного вызова у тебя не обновятся слоты.

В майновском контейнере есть отличный метод net.minecraft.inventory.Container#detectAndSendChanges
1731229805987.png

Если говорить простым языком, ищем изменения в инвентаре и отправляем их.

Пример кода для обновления, логику далее можешь дописывать как тебе угодно.

Java:
public class CustomContainer extends Container {
    private final IInventory inventory;
    private final List<Slot> dynamicSlots; // Лист(список) для динамических слотов

    public CustomContainer(IInventory playerInventory, IInventory customInventory) {
        this.inventory = customInventory;
        this.dynamicSlots = new ArrayList<>();

        // Стат слот
        for (int i = 0; i < customInventory.getSizeInventory(); i++) {
            this.addSlotToContainer(new Slot(customInventory, i, 8 + i * 18, 18));
        }

        // Стат слот
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 9; j++) {
                this.addSlotToContainer(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
            }
        }

        // Добавляем динамические слоты
        this.updateDynamicSlots();
    }

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

    @Override
    public void detectAndSendChanges() {
        super.detectAndSendChanges();
        // логика для обновления
    }

    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int index) {
        return ItemStack.EMPTY;
    }

    // Метод для обновления динамических слотов
    public void updateDynamicSlots() {
        // Чистим динамические слоты(подобно как и с кнопками)
        for (Slot slot : this.dynamicSlots) {
            this.inventorySlots.remove(slot);
        }
        this.dynamicSlots.clear();

        // Метка для обновления
        // аналогично и с использованием IEEP
        boolean conditionMet = false;
        for (int i = 0; i < this.inventory.getSizeInventory(); i++) {
            ItemStack stack = this.inventory.getStackInSlot(i);
            if (!stack.isEmpty() && stack.getItem() == Items.GOLDEN_APPLE) {
                conditionMet = true;
                break;
            }
        }

        // Если метка true, то добавляем слот
        if (conditionMet) {
            Slot newSlot = new Slot(this.inventory, this.inventory.getSizeInventory(), 8, 36);
            this.addSlotToContainer(newSlot);
            this.dynamicSlots.add(newSlot);
        }

        // Вызываем detectAndSendChanges, чтобы обновить GUI
        this.detectAndSendChanges();
    }
}

Говоря простым языком, мы добавляем слот, если в инвентаре у игрока есть золотое яблоко.
 
Список слотов лучше не трогать во избежание нарушения синхронизации с клиентом, поскольку слоты синхронизируются по индексу в списке. Вместо этого блокируйте и визуально скрывайте недоступный слот.
 
А как еще можно скрыть слот? И где лучше его скрывать? В самом контейнере или в ивенте?
И ещё при смене координат результат отображается только после перезахода в инвентарь
 
Последнее редактирование:
Может потому что слоты регаються напрямую в конструкторе контейнера?

Изначально так работает добавление слотов в контейнер, т.к нету обычно нужды добавлять или не добавлять слот.

Для чего его вообще убирать с глаз игрока?
Что мешает поверх него накладывать картинку полувидимую(типа белую), чтоб создать видимость "запрета" использования.
Подобное уже можно реализовать, а добавлять и убирать слот без перезахода - костыль который неизвестно как по итогу будет работать.
Мб только если с координатами, но опять же, бред чистой воды.
 
Назад
Сверху