Синхронизация ванильного инвентаря

Версия Minecraft
1.7.10
API
Forge
48
2
9
В общем ситуация следующая - мне на сервере каждый тик нужно проверять у каждого игрока инвентарь на наличие конкретного предмета и если этот предмет находиться в инвентаре, то нужно взять его в руку и не позволять отпускать пока предмет не уберется из инвентаря. На клиенте я пробовал делать следующим образом (предмет уже находится в хотбаре):
Java:
@SubscribeEvent
public void onClientTick(TickEvent.ClientTickEvent event) {
    for (int i = 0; i < event.player.inventory.mainInventory.length; i += 1) {
        ItemStack itemStack = event.player.inventory.mainInventory[i];
        if (itemStack == null || !(itemStack.getItem() instanceof CustomItem)) {
            continue;
        }
        event.player.inventory.currentItem = i;
        break;
    }
}
И это работало. Но я бы не хотел, чтобы эта логика лежала на клиенте, мне она нужна на сервере. Поэтому я переместил код на тик сервера:
Java:
    @SubscribeEvent
    public void onServerTick(TickEvent.ServerTickEvent event) {
        for (EntityPlayerMP player : (List<EntityPlayerMP>)MinecraftServer.getServer().getConfigurationManager().playerEntityList) {
             for (int i = 0; i < player.inventory.mainInventory.length; i += 1) {
                ItemStack itemStack = player.inventory.mainInventory[i];
                if (itemStack == null || !(itemStack.getItem() instanceof CustomItem)) {
                    continue;
                }
                event.player.inventory.currentItem = i;
                break;
            }
        }
    }
Проблема теперь в том, что предмет вообще не берется в руку. Такая же история была когда я пытался удалять предметы из инвентаря. Синхронизации с клиентом не было, его можно было использовать, хотя выкидывать на Q все же не позволяло (только если мышкой из инвентаря).
Что я делаю не так? Данные манипуляции вообще можно делать на сервере, или только на клиенте? Почему инвентарь на сервере не синхронизируется с клиентским?
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,456
598
2,892
Как у тебя вообще это заработало? inventory.currentItem должен быть от 0 до 9 (по размеру хотбара) :rolleyes:

Прикол конечно.

Посмотри в инвентаре как происходит синхронизация. Там пакет нужно слать.
И да, ты делаешь чушь. Зачем тебе ServerTickEvent и перебирать всех игроков, если есть специально для этого PlayerTickEvent? И про фазу не забудь, у тебя код отрабатывает два раза за тик.
 
48
2
9
inventory.currentItem должен быть от 0 до 9 (по размеру хотбара)
Я просто вырезал дополнительную логику из цыкла, которая не касалась вопроса, ну а вообще, как я писал выше, предмет уже находится в хотбаре (в слоте 0-9)
Прикол конечно.
:sneaky:
Зачем тебе ServerTickEvent и перебирать всех игроков, если есть специально для этого PlayerTickEvent? И про фазу не забудь, у тебя код отрабатывает два раза за тик.
Спасибо, я и не знал про PlayerTickEvent, а про фазы так вообще забыл :unsure:
Посмотри в инвентаре как происходит синхронизация. Там пакет нужно слать.
Порылся я в PlayerInventory и EntityPlayer, и к сожалению не смог найти где синхронизируется инвентарь. В EntityPlayer нашел только отсылку пакета при уничтожении текущего предмета в инвентаре, но это не то, что мне надо.
Не мог бы ты написать название класса, либо метода в классе, либо пакета где я бы мог увидеть как оно работает? Или ты имел ввиду, что мне свой пакет надо создать для синхронизации текущего предмета?
 
Последнее редактирование:
Сверху