- Баллы
- 31
- Имя в Minecraft
- Wap
Я пытаюсь сделать плагин, чтоб нельзя была ставить Ендер сундук, если в радиусе есть другой Ендер сундук. Пока дела идут плохи. Даже близко рабочего кода нет.
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
А можно кодом пожалуйста? И примерно описанное делать пытался, но цикл выполняется несколько раз и радиус не определяется т.е. работает на любом расстоянии от блокаОпределяешь границы кубоида с заданным радиусом вокруг блока.
Перебираешь все блоки в кубоиде и проверяешь тип каждого блока. Как только найдешь нужный - прерываешь все три цикла и выполняешь необходимые действия.
Если кубоид большой, то необходимо перенести перебор в асинхрон с чанк снапшотом или перебирать в синхроне, но разбить задачу на разные тики
Показывай код.примерно описанное делать пытался, но цикл выполняется несколько раз
Что значит радиус не определяется? Ты самостоятельно его задаёшь константойрадиус не определяется т.е. работает на любом расстоянии от блока
@EventHandler
public boolean Block(BlockPlaceEvent e) {
int radius = 1;
Player p = e.getPlayer();
Block middle = e.getBlockPlaced();
for (int x = -(radius); x <= radius; x++) {
for (int y = -(radius); y <= radius; y++) {
for (int z = -(radius); z <= radius; z++) {
if (middle.getRelative(x, y, z).getType() == Material.ENDER_CHEST) {
p.sendMessage("Yes");
}
}
}
}
return false;
}
Показывай код.
Почему у тебя обработчик имеет тип boolean? Все слушатели void должны быть.Код:@EventHandler public boolean Block(BlockPlaceEvent e) { int radius = 1; Player p = e.getPlayer(); Block middle = e.getBlockPlaced(); for (int x = -(radius); x <= radius; x++) { for (int y = -(radius); y <= radius; y++) { for (int z = -(radius); z <= radius; z++) { if (middle.getRelative(x, y, z).getType() == Material.ENDER_CHEST) { p.sendMessage("Yes"); } } } } return false; }
Он работает, но криво. Например: когда я ставлю ендер сундук в радиусе, мне пишет "Yes" 3 раза, а когда вне радиуса, то 1 раз. Если я добавлю e.setCancelled(true), то что в радиусе, что вне радиуса эвент будет отменяться и блок не поставитсяПочему у тебя обработчик имеет тип boolean? Все слушатели void должны быть.
В остальном у меня твой код работает.
Если у тебя всё ещё не выполняется - возможно установку отменяют другие плагины. В этом случае поменяй приоритет события:
@EventHandler(priority = EventPriority.LOWEST)
P.S. Возможно, есть смысл прерывать все циклы после обнаружения эндер-сундука, но тут уже тебе виднее
При установке эндер-сундука тебе пишет Yes всегда, потому что устанавливаемый блок тоже учитывается при переборе блоков. Чтобы этого избежать - игнорируй центральный блок при переборе (со смещением 0;0;0)Он работает, но криво. Например: когда я ставлю ендер сундук в радиусе, мне пишет "Yes" 3 раза, а когда вне радиуса, то 1 раз. Если я добавлю e.setCancelled(true), то что в радиусе, что вне радиуса эвент будет отменяться и блок не поставится
Привет, у меня что-то получилось, вкратце, оно теперь работает не от поставленного блока(middle), а от игрока и вот я не знаю как это исправить, возможно знаю, но пока не понимаю. Технически код работает полностью как мне нужно, но от игрока, а не от блокаПри установке эндер-сундука тебе пишет Yes всегда, потому что устанавливаемый блок тоже учитывается при переборе блоков. Чтобы этого избежать - игнорируй центральный блок при переборе (со смещением 0;0;0)
((( public static List<Block> getNearbyBlocks(Location location, int radius) {
List<Block> blocks = new ArrayList<Block>();
for(int x = location.getBlockX() - radius; x <= location.getBlockX() + radius; x++) {
for(int y = location.getBlockY() - radius; y <= location.getBlockY() + radius; y++) {
for(int z = location.getBlockZ() - radius; z <= location.getBlockZ() + radius; z++) {
blocks.add(Objects.requireNonNull(location.getWorld()).getBlockAt(x, y, z));
}
}
}
return blocks;
}
@EventHandler
public static void onSetBlock(BlockPlaceEvent e) {
Player p = e.getPlayer();
Block block = e.getBlockPlaced();
for(Block b : getNearbyBlocks(p.getLocation(), 1)) {
if (b.getType() == Material.ENDER_CHEST) {
p.sendMessage("Yes");
e.setCancelled(true); break;
}
}
}
Так ты в цикле берёшь локацию игрока, а не блока -_-Привет, у меня что-то получилось, вкратце, оно теперь работает не от поставленного блока(middle), а от игрока и вот я не знаю как это исправить, возможно знаю, но пока не понимаю. Технически код работает полностью как мне нужно, но от игрока, а не от блока(((
Код:@EventHandler public static void onSetBlock(BlockPlaceEvent e) { Player p = e.getPlayer(); Block block = e.getBlockPlaced(); for(Block b : getNearbyBlocks(p.getLocation(), 1)) { if (b.getType() == Material.ENDER_CHEST) { p.sendMessage("Yes"); e.setCancelled(true); break; } } }