- 78
- 3
- 10
Делаю предмет, который ставит блок в мир. При установке сервер проверяет некоторые условия, и если они не соблюдены - может отказать в установке.
Клиент эти же условия проверить не может - данных на клиенте недостаточно (ae2 grid).
Получается, что код сначала отрабатывает на клиенте, и BlockItem#place возвращает ActionResult.SUCCESS. Клиент уменьшает размер пачки предмета. Следом серверная часть отрабатывает, и возвращает ActionResult.FAIL. С сервера прилетает синхронизация чанка, блок пропадает. Однако, пачка предмета на хотбаре по-прежнему меньше на единицу, чем она же на сервере.
Без дополнительных пакетов клиент не сможет узнать, разрешит ли сервер установку блока.
Единственным решеним вижу только принудительную синхронизацию стака по инициативе сервера после того, как он отказал.
Однако, пытаясь найти способ - везде находил какие-то странные костыли...
Подскажите, есть ли адекватный способ засинхронить конкретную пачку предметов в инвентаре?
Псевдокод (полагаю, будет дочтаточно):
Сижу на Fabric, но предположу, что и классическое форджевое решение подойдёт, хотя бы понять принцип. Отправлять пакет инвентаря самостоятельно очень бы не хотелось, оставлю это на крайний вариант.
Клиент эти же условия проверить не может - данных на клиенте недостаточно (ae2 grid).
Получается, что код сначала отрабатывает на клиенте, и BlockItem#place возвращает ActionResult.SUCCESS. Клиент уменьшает размер пачки предмета. Следом серверная часть отрабатывает, и возвращает ActionResult.FAIL. С сервера прилетает синхронизация чанка, блок пропадает. Однако, пачка предмета на хотбаре по-прежнему меньше на единицу, чем она же на сервере.
Без дополнительных пакетов клиент не сможет узнать, разрешит ли сервер установку блока.
Единственным решеним вижу только принудительную синхронизацию стака по инициативе сервера после того, как он отказал.
Однако, пытаясь найти способ - везде находил какие-то странные костыли...
Подскажите, есть ли адекватный способ засинхронить конкретную пачку предметов в инвентаре?
Псевдокод (полагаю, будет дочтаточно):
Java:
class MyBlockItem extends BlockItem{
public ActionResult place(ItemPlacementContext context){
if (something_on_server){
// --> is only server thread touch this
// todo: send message to the player
// todo: sync main hand stack to the player
return ActionResult.FAIL;
}
return super.place(context);
}
}
Сижу на Fabric, но предположу, что и классическое форджевое решение подойдёт, хотя бы понять принцип. Отправлять пакет инвентаря самостоятельно очень бы не хотелось, оставлю это на крайний вариант.