Я люблю ваши вопросы, так что давайте ответим на него! 🥰
В больших проектах с большим количеством разных модулей, а в нашем случае модов, нам нужен способ передавать информацию о различных событиях между всеми нашими частями. И тут в бой входит шина событий.
Шина - список методов которые принимают то или иное событие, порой с дополнительными плюшками в виде приоритетов или отмены события.
Давайте представим что Рома нажал ПКМ по двери чтобы открыть её и войти в комнату Брендона. Тут в дело вступает
PlayerInteractEvent.RightClickBlock. Когда сервер получает пакет от клиента игрока о том что тот делает клик, в шину событий улетает этот ивент:public static PlayerInteractEvent.RightClickBlock onRightClickBlock(Player player, InteractionHand hand, BlockPos pos, BlockHitResult hitVec) {
PlayerInteractEvent.RightClickBlock evt = new PlayerInteractEvent.RightClickBlock(player, hand, pos, hitVec);
NeoForge.EVENT_BUS.post(evt);
return evt;
}Ивент в шине, тут он будет проходить по всем местам где есть на него подписка (пример):
@SubscribeEvent
public void onRightClick(PlayerInteractEvent.RightClickBlock event) {
event.getEntity().sendSystemMessage(Component.literal("КАК ТЫ СМЕЛ ТЫКНУТЬ ПО БЛОКУ?"));
}
Но как мы определяем какая подписка должна выполнится первее, для этого у нас есть приоритеты:
public enum EventPriority
{
HIGHEST, //First to execute
HIGH,
NORMAL,
LOW,
LOWEST; //Last to execute
}
Возвращаясь к Брендону. Сначала наше событие приходит в HIGH подписку где мы проверяем, если Рома сильно ранен или у него нет рук, то событие отменяется, и идёт дальше, выглядит это примерно так:
@SubscribeEvent
public void onRightClick(PlayerInteractEvent.RightClickBlock event) {
if(event.getEntity().isWithoutHands()) {
event.setCanceled(true);
}
}
Если Рома не прыгал со скалы, то ивент пройдёт дальше, и словится другим слушателем, который уже даст команду Брендону начать быковать на Рому, вот как-то так :3
#st #devblogGodGame