- Баллы
- 173
- Имя в Minecraft
- fromgate
Сейчас переписываю один плагин наткнулся на процедуру в коде, которую помню выстрадал за несколько дней с помощью знатоков с буккита.
Суть в чем. Если Ваш плагин должен ставить блок и при этом необходимо проверять может ли игрок (по команде которого) ставить эти блоки в данной местности: вдруг территория запривачена, это вообще спавн и т.п.
Очень часто авторы плагинов начинают теребить API Towny, Factions и т.п. плагинов. Я покрайней мере неоднократно такое встречал.
А на самом деле всё достаточно просто. Нужно установку блока выполнять не просто вызовом метода block.setType(....), а иницировать обработку события по установке блока. Т.е. чтобы поставить надо поставить блок, вызывать событие, которое обрабатывается всеми плагинами которые участвуют в процессе и если хоть один из них отменит обработку - состояние блока меняем на исходное.
Для чего это нужно. Допустим Ваш плагин строит башню. Приходит игрок в чужой двор/город/дом и строит там башню -если используется обычный setType без каких-либо проверок на приват. При этом! LogBlock и прочие "следящие" плагины не отлавливают это событие. Т.е. админы даже не смогут грифера отловить.
В общем, процедура тут. Возвращает true/false в зависимости от того удалось ли установить блок или нет.
P.S. первая процедура в списке добавлена для удобства, чтобы не вызывать в коде каждый раз loc.getBlock()
P.P.S. Эту процедуру можно применять и для "разбития" блока - замены на 0. Но я бы рекомендовал всё же тогда сделать аналог под BlockBreakEvent - во первых, мало ли какие плагины могут быть на сервере и правила приватов: обычно если запрещено строить, то запрещено и ломать. Но вдруг где-то реализованы что-то, что мы пока не можем предусмотреть, поэтому лучше сразу инициировать верное событие. Ну и плюс, можно попытаться порулить дропом в этом случае.
Суть в чем. Если Ваш плагин должен ставить блок и при этом необходимо проверять может ли игрок (по команде которого) ставить эти блоки в данной местности: вдруг территория запривачена, это вообще спавн и т.п.
Очень часто авторы плагинов начинают теребить API Towny, Factions и т.п. плагинов. Я покрайней мере неоднократно такое встречал.
А на самом деле всё достаточно просто. Нужно установку блока выполнять не просто вызовом метода block.setType(....), а иницировать обработку события по установке блока. Т.е. чтобы поставить надо поставить блок, вызывать событие, которое обрабатывается всеми плагинами которые участвуют в процессе и если хоть один из них отменит обработку - состояние блока меняем на исходное.
Для чего это нужно. Допустим Ваш плагин строит башню. Приходит игрок в чужой двор/город/дом и строит там башню -если используется обычный setType без каких-либо проверок на приват. При этом! LogBlock и прочие "следящие" плагины не отлавливают это событие. Т.е. админы даже не смогут грифера отловить.
В общем, процедура тут. Возвращает true/false в зависимости от того удалось ли установить блок или нет.
Код:
public boolean PlaceBlock(Location loc, Player p, Material newType, byte newData, boolean phys){
return PlaceBlock (loc.getBlock(),p,newType,newData, phys);
}
public boolean PlaceBlock(Block block, Player p, Material newType, byte newData, boolean phys){
BlockState state = block.getState();
block.setTypeIdAndData(newType.getId(), newData, phys);
BlockPlaceEvent event = new BlockPlaceEvent(state.getBlock(), state, block, p.getItemInHand(), p, true);
this.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) state.update(true);
return event.isCancelled();
}
P.S. первая процедура в списке добавлена для удобства, чтобы не вызывать в коде каждый раз loc.getBlock()
P.P.S. Эту процедуру можно применять и для "разбития" блока - замены на 0. Но я бы рекомендовал всё же тогда сделать аналог под BlockBreakEvent - во первых, мало ли какие плагины могут быть на сервере и правила приватов: обычно если запрещено строить, то запрещено и ломать. Но вдруг где-то реализованы что-то, что мы пока не можем предусмотреть, поэтому лучше сразу инициировать верное событие. Ну и плюс, можно попытаться порулить дропом в этом случае.
). По логике, они должны обеспечивать совместимость с API (метод setType тогда должен поддерживать стандартные типы). Но как оно на практике...