Закрытие инвентаря или невозможность его открытия

Версия Minecraft
1.12.2
10
0
Мне нужно сделать так, что бы если игрок открыл инвентарь, он закрывался или его вообще нельзя было открыть, если игрок не имеет на это право.
"Право" записано у меня в Capability игрока, и я не нашёл эвента, который был бы со стороны сервера.
Я пробовал GuiOpenEvent, но вылетает всё при попытке открыть инвентарь.
Java:
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void DontOpenInventroryWhileHandcuffedEvent(GuiOpenEvent event) {
    if (event.getGui() != null) {
        if (event.getGui() instanceof GuiInventory) {
            if (event.getGui().mc.player.getCapability(GearProvider.GEAR_CAP, null).havePermission()) { //здесь крашится игра.
                    if (Minecraft.getMinecraft().playerController.isInCreativeMode()) {
                        event.setCanceled(false);
                    } else {
                        event.setCanceled(true);
                    }
                }
            }
        }
    }
Я пробовал и с PlayerContainerEvent.Open, но это только отменяло открытие сундуков-вагонеток и пр.
Java:
@SubscribeEvent
public void DontOpenContainerWhileHandcuffedEvent(Open event) {
    if (event.getEntityPlayer() != null) {
        if (event.getEntityPlayer().getCapability(GearProvider.GEAR_CAP, null).havePermission()) {
            event.setCanceled(true);
        }
    }
}
Спасибо всем тем, кто откликнулся!
 
161
12
90
Нет, синхронизация не так работает.
Если значение изменяется нечасто, то можно синхронизировать с клиентом при каждом изменении.
Если же значение изменяется чуть ли не каждый тик, то при открытии гуи слать пустой пакет-запрос на сервер, в свою очередь сервер отправляет данные для отображения клиенту.
Сам на данный момент копаюсь в этой теме. Тоже нужно много чего запрещать на клиенте и использовать CAPу с сервера.
 
10
0
Хуканул и закрывает!Не ожидал, никогда прежде не использовал хуки.
Работающий код с хуком:
@Hook(injectOnExit = true, returnCondition = ReturnCondition.ALWAYS)
@SideOnly(Side.CLIENT)
public static boolean canInteractWith(ContainerPlayer container, EntityPlayer player, @ReturnValue boolean returnValue) {
    return !(player.getCapability(GearProvider.GEAR_CAP, null).havePermission());
}
 
3,005
192
592
return !(player.getCapability(GearProvider.GEAR_CAP, null).havePermission());
Мне кажется, или тут типо закрытие когда ЕСТЬ пермишенс?
"Может ли игрок юзать контйнер?"
"если НЕ (player. ... .havePermission())"
Типо "есть пермишнс, его в не, если нет пермишенса, то можно юзать".

И кстати, да, учитывай возвращения оригинала.
Потому что в оригинале пишется, например, что блок можно открыть только если у тебя игрок <= 8 блоков от контейтенра.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
И кстати, да, учитывай возвращения оригинала.
Потому что в оригинале пишется, например, что блок можно открыть только если у тебя игрок <= 8 блоков от конейтенра.
В ContainerPlayer возвращается обычный true и все.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Тогда уж вот чистый хук. Сайдонли зачем вообще? Не надо оно там.
Java:
@Hook(returnCondition = ReturnCondition.ALWAYS)
public static boolean canInteractWith(ContainerPlayer container, EntityPlayer player){
    return player.getCapability(GearProvider.GEAR_CAP, null).havePermission();
}
 
7,099
324
1,510
Сверху