isItemValid
Как я понял это будет работать на клиентской стороне. А что на счет серверной? Как там можно запретить класти предметы в сундук? И как можно отследить открытие контейнера и понять какому из сундуков он пренадлежит (обычному или эндеру)? Я пробовал через GuiOpenEvent, но там никак тип узнать не получается.При открытии контейнера заменить все слоты на свои, у которых нужным образом реализован методisItemValid
Нет, контейнер и его слоты существуют на обеих сторонах, а вотэто будет работать на клиентской стороне
GuiOpenEvent
как раз только на клиенте, тебе нужен PlayerContainerEvent.Open
(если он так называется в 1.7.10 и вообще там есть)В 1.7.10 естьтебе нуженPlayerContainerEvent.Open
(если он так называется в 1.7.10 и вообще там есть)
PlayerOpenContainerEvent
, но он почему-то срабатывает на каждый тик игрока даже когда я не пытаюсь что-то открыть. Как этот ивент можно применить в даной ситуации?Получилось следующеепроверять что произошёл переход вида 'левый контейнер -> тот что надо контейнер'
@SubscribeEvent
public void onContainerOpen(PlayerOpenContainerEvent event) {
EntityPlayer player = event.entityPlayer;
if (!(player.openContainer instanceof ContainerChest)) {
return;
}
ContainerChest container = (ContainerChest) player.openContainer;
if (!Objects.equals(container.lowerChestInventory.getInventoryName(), "container.enderchest")) {
return;
}
player.openContainer = new ContainerTakeOnlyChest(player.inventory, player.getInventoryEnderChest());
}
isItemValid
как понять в каком инвентаре находится ItemStack
? А то на даный момент я не могу класть ничего в свой инвентарь.Скорее всего это связано с контейнером инвентаря игрока, который как бы открыт всегда, если не открыт другой контейнер. Чекай, что за контейнер в ивенте и работай с нужнымно он почему-то срабатывает на каждый тик игрока даже когда я не пытаюсь что-то открыть.
Лучше хукнуться
А так проблема миксинов как раз в том что они слишком простые, часто вещи которые можно сделать без них делают ими.
В общем тот вариант, что я писал выше оказался не до конца рабочим и я решил попробовать заюзать хуки. Раньше я этой либой не пользовался, потому сразу юзать и не хотел. В общем, получились следующие 2 хука чтобы запретить ложить предметы в эндер сундук (1 вызывается при клике на слот, другой при перемещении предмета с помощью shift):Лучше хукнуться в Slot или Container#slotClick
@Hook(returnCondition = ReturnCondition.ALWAYS)
public static boolean isItemValid(Slot slot, ItemStack itemStack) {
return slot.inventory instanceof InventoryPlayer;
}
@Hook(returnCondition = ReturnCondition.ON_NULL)
public static ItemStack transferStackInSlot(ContainerChest container, EntityPlayer player, int index) {
Slot slot = (Slot) container.inventorySlots.get(index);
return Objects.equals(slot.inventory.getInventoryName(), "container.enderchest") ? slot.getStack() : null;
}
@Hook(returnCondition = ReturnCondition.ON_TRUE, booleanReturnConstant = false)
public static boolean isItemValid(Slot slot, ItemStack itemStack) {
return slot.inventory instanceof InventoryEnderChest;
}
@Hook(returnCondition = ReturnCondition.ON_TRUE, booleanReturnConstant = false)
public static boolean canTakeStack(Slot slot, EntityPlayer player) {
return slot.inventory instanceof InventoryEnderChest;
}
Да, увидел, что слоты везде перестали нормально работатьТеперь попробуй положить любой предмет в слот брони и офигей
slot.inventory
типа IInventory
). Вот новый вариант, вроде как не сломанный:@Hook(returnCondition = ReturnCondition.ON_TRUE, booleanReturnConstant = false)
public static boolean isItemValid(Slot slot, ItemStack itemStack) {
return Objects.equals(slot.inventory.getInventoryName(), "container.enderchest");
}
@Hook(returnCondition = ReturnCondition.ON_TRUE, returnNull = true)
public static boolean transferStackInSlot(ContainerChest container, EntityPlayer player, int index) {
Slot slot = (Slot) container.inventorySlots.get(index);
return Objects.equals(slot.inventory.getInventoryName(), "container.inventory")
&& Objects.equals(container.getLowerChestInventory().getInventoryName(), "container.enderchest");
}