- Баллы
- 76
- Имя в Minecraft
- ItsWay
А не разве что я сейчас это сделал?Это то. После третьего цикла перед заменой вставить
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
А не разве что я сейчас это сделал?Это то. После третьего цикла перед заменой вставить
for (int x = min.getBlockX(); x < max.getBlockX(); x++) {
for (int y = min.getBlockY(); y < max.getBlockY(); y++) {
for (int z = min.getBlockZ(); z < max.getBlockZ(); z++) {
if(block.getType == Material.AIR) return;
if(block.getType == Material.Sponge) {
min.getWorld().getBlockAt(x, y, z).setType(Material.DIAMOND_BLOCK);
}}
}
}
Ну, почти. Дело в том, что в Minecraft Material.AIR — не единственный тип воздуха.if(block.getType != Material.AIR) {
//а тут уже твой код который остальной.
}
private static final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);
Block b = min.getWorld().getBlockAt(x, y, z);
if (PROHIBITED_MATERIALS.contains(b.getType())) return;
b.setType(Material.DIAMOND_BLOCK);
Вот так, сбор тут всех умников форума кроме меня)Ну, почти. Дело в том, что в Minecraft Material.AIR — не единственный тип воздуха.
Учитывая, что, скорее всего, понадобится еще какой-то список исключений для замены блоков (например, бедрок), то я бы сделал так:
В полях класса:
Код:private static final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);
В теле последнего вложенного цикла:
Код:Block b = min.getWorld().getBlockAt(x, y, z); if (PROHIBITED_MATERIALS.contains(b.getType())) return; b.setType(Material.DIAMOND_BLOCK);
Круто придумал конечно, но мне кажется, что у меня оно работать не будет. Посмотри скриншот (который я скинул). Типа того должно получиться?Ну, почти. Дело в том, что в Minecraft Material.AIR — не единственный тип воздуха.
Учитывая, что, скорее всего, понадобится еще какой-то список исключений для замены блоков (например, бедрок), то я бы сделал так:
В полях класса:
Код:private static final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);
В теле последнего вложенного цикла:
Код:Block b = min.getWorld().getBlockAt(x, y, z); if (PROHIBITED_MATERIALS.contains(b.getType())) return; b.setType(Material.DIAMOND_BLOCK);
У тебя блок заменяется, если он губка.Круто придумал конечно, но мне кажется, что у меня оно работать не будет. Посмотри скриншот (который я скинул). Типа того должно получиться?
Все мы чего-то не знаем/не знали, это нормально. На то он и форум.Вот так, сбор тут всех умников форума кроме меня)
Ну да, но есть и умники которые отвечают: просто бери и делай...Все мы чего-то не знаем/не знали, это нормально. На то он и форум.
Странно, вроде когда тестил - ничего не менялось. Позже посмотрю еще раз и напишуУ тебя блок заменяется, если он губка.
Этот код вообще с этим листом здесь не взаимодействует. Где вторая часть кода то?Сделал типа того:
Посмотреть вложение 62978
Но ничего не происходит... Ничего не заменяется...
Prohibited materials вот:
final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);
Block b = min.getWorld().getBlockAt(x, y, z);
if (PROHIBITED_MATERIALS.contains(b.getType())) return;
b.setType(Material.DIAMOND_BLOCK);
public void replaceBlocks(Location location, Material material, int radius) {
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++) {
Block block = location.getWorld().getBlockAt(x, y, z);
if (block.getType() == Material.AIR) continue;
block.setType(material);
}
}
}
}
Получится на блок больше, чем radiusPHP:public void replaceBlocks(Location location, Material material, int radius) { 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++) { Block block = location.getWorld().getBlockAt(x, y, z); if (block.getType() == Material.AIR) continue; block.setType(material); } } } }

Как раз-таки нет. Всё работает как надо.Получится на блок больше, чем radius![]()
Хотя да, верно. Крошу печенье)Как раз-таки нет. Всё работает как надо.
Не понимаю, что не так. Помоги, пожалуйста... Ошибка: "is not abstract and does not override abstract method run() in java.lang.Runnable"...PHP:public void replaceBlocks(Location location, Material material, int radius) { 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++) { Block block = location.getWorld().getBlockAt(x, y, z); if (block.getType() == Material.AIR) continue; block.setType(material); } } } }
Замени названия метода replaceBlocks на run внутри тела анонимного класса и добавь над ним аннотацию @OverrideНе понимаю, что не так. Помоги, пожалуйста... Ошибка: "is not abstract and does not override abstract method run() in java.lang.Runnable"...
Может я вообще все напутал? Можешь прямо целиком весь код дать?
Если что, кроме того, что я заскринил, я изменений не делал
UPD: "material" - заменил
Посмотреть вложение 62979
Если я правильно понял задачу в шапке темы, то вот примерно как оно должно работать.Ничего не поменялось. Только @Override тоже стал красным. У тебя, как я понял, твой код работает?
Просто если да, то где-то я накосячил... Даже не знаю... Могу кинуть в лс абсолютно весь код... Хотя это вряд-ли поможет
//Блоки которые не нужно заменять при замене
private static final List<Material> PROHIBITED_MATERIALS = Arrays.asList(Material.AIR, Material.CAVE_AIR,
Material.VOID_AIR, Material.STRUCTURE_VOID, Material.SPONGE, Material.BEDROCK);
//Обработчик ивента при размещении блоков
@EventHandler
public void onBlockPlaceEvent(BlockPlaceEvent e) {
if (e.isCancelled()) {
return;
}
Location loc = e.getBlockPlaced().getLocation();
//Запуск настраиваемого шедулера, который будет запускать задачу каждые 20 тиков или 1 секунду
new BlockHandler(loc).runTaskTimer(plugin, 0L, 20L);
}
//Размещаем блоки относительно нужной локацией и с нужным радиусов с нужным типом блоков
private static void placeBlocks(Location originalLoc, int radius, Material type) {
Location min = originalLoc.clone().subtract(radius, radius, radius);
Location max = originalLoc.clone().add(radius, radius, radius);
World world = originalLoc.getWorld();
for (int x = min.getBlockX(); x <= max.getBlockX(); x++) {
for (int y = min.getBlockY(); y <= max.getBlockY(); y++) {
for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) {
Block b = world.getBlockAt(x, y, z);
if (PROHIBITED_MATERIALS.contains(b.getType())) {
continue;
}
b.setType(type);
}
}
}
}
//Простой класс, который реализует метод run для выполнения расширения блоков
private static class BlockHandler extends BukkitRunnable {
private int count = 1;
private final Location location;
public BlockHandler(Location location) {
this.location = location;
}
@Override
public void run() {
//Каждый раз радиус будет больше
placeBlocks(this.location, this.count, Material.DIAMOND_BLOCK);
this.count++;
//TODO Здесь можно отменить задачу если например радиус будет больше 10
if (this.count >= 10) {
cancel();
}
}
}