Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите WorldEdit: как удалить все блоки между двумя точками (Vector)?

Bars

Старожил
Девелопер
Пользователь
Баллы
173
Java:
    public static void resetGame(final Vector min, final Vector max) {
        Bukkit.getScheduler().runTaskAsynchronously(BedWars.get(), new Runnable() {
            @Override
            public void run() {
                EditSession editSession = new EditSession(new BukkitWorld(origin.getWorld()), Integer.MAX_VALUE);
                editSession.setFastMode(true);
                for (int yy = min.getBlockY(); yy < max.getBlockY(); yy++) {
                    for (int xx = min.getBlockY(); xx < max.getBlockY(); xx++) {
                        for (int zz = min.getBlockY(); zz < max.getBlockY(); zz++) {
                            Vector currentPoint = new Vector(xx, yy, zz);
                            editSession.setBlock(currentPoint, 0);
                        }
                    }
                }
            }
        });
    }
Вот это что написал. Естественно, не без ошибок.
Как их удалить? Желательно с отгрузкой затронутых чанков после удаления.
 
Хихих, как раз занимаюсь этим же.
Люто плюсую, скажите как?

Java:
                for (int yy = min.getBlockY(); yy < max.getBlockY(); yy++) {
                    for (int xx = min.getBlockY(); xx < max.getBlockY(); xx++) {
                        for (int zz = min.getBlockY(); zz < max.getBlockY(); zz++) {
    }
Зачем тебе вордедит тогда?
 
Хихих, как раз занимаюсь этим же.
Люто плюсую, скажите как?

Зачем тебе вордедит тогда?
Уверен, что в с его помощью будет куда эффективнее, тем более что он уже используется в плагине (для построения чертежей (schematic))
 
Уверен, что в с его помощью будет куда эффективнее, тем более что он уже используется в плагине для построения чертежей (schematic)
Если ты будешь перебирать по одному блоку - не будет.
Надо задавать границы региона и сетать сразу регион, a WE уже пусть перебирает.
Если перебирать самому, то имеет смысл просто setType(Material.AIR)
 
Ещё и асинхронно блоки строишь, самый лучший способ убить сервер.
 
Что на данный момент в SkyWars-plugin:
Java:
    public static void buildSchematic(final Game game, final Location origin,
            final CuboidClipboard schematic) {
        Bukkit.getScheduler().runTaskAsynchronously(OnlyBedWars.get(),
                new Runnable() {
                    @SuppressWarnings("deprecation")
                    @Override
                    public void run() {
                        Vector pasteLocation = new Vector(origin.getBlockX(),
                                origin.getBlockY(), origin.getBlockZ());

                        Vector currentPoint;
                        BaseBlock currentBlock;
                        List<BlockBuilderEntry> blockQueue = Lists
                                .newLinkedList();
                        List<BlockBuilderEntry> delayedQueue = Lists
                                .newLinkedList();

                        for (int xxx = 0; xxx < schematic.getSize().getBlockX(); ++xxx) {
                            for (int yyy = 0; yyy < schematic.getSize()
                                    .getBlockY(); ++yyy) {
                                for (int zzz = 0; zzz < schematic.getSize()
                                        .getBlockZ(); ++zzz) {
                                    currentPoint = new Vector(xxx, yyy, zzz);
                                    currentBlock = schematic
                                            .getPoint(currentPoint);

                                    if (currentBlock.isAir()) {
                                        continue;
                                    }

                                    currentPoint = currentPoint.add(
                                            pasteLocation).add(
                                            schematic.getOffset());

                                    switch (currentBlock.getType()) {
                                    // Add blocks with (possible) tile entities
                                    // on the end, might decrease client-side
                                    // lag.
                                    case 8: // Water
                                    case 9: // Stationary Water
                                    case 10: // Lava
                                    case 11: // Stationary Lava
                                    case 63: // Sign post
                                    case 68: // Wall sign
                                    case 54: // Chest
                                    case 23: // Dispenser
                                    case 61: // Furnace
                                    case 117: // Brewing stance
                                    case 154: // Hopper
                                    case 158: // Dropper
                                    case 138: // Beacon
                                    case 52: // Mob spawner
                                    case 25: // Note block
                                    case 84: // Jukebox
                                    case 116: // Enchantment Table
                                    case 119: // End portal
                                    case 120: // End portal frame
                                    case 114: // Mob head
                                    case 137: // Command block
                                        delayedQueue.add(new BlockBuilderEntry(
                                                currentPoint, currentBlock));
                                        break;

                                    default:
                                        blockQueue.add(new BlockBuilderEntry(
                                                currentPoint, currentBlock));
                                    }
                                }
                            }
                        }

                        Collections.sort(blockQueue,
                                new Comparator<BlockBuilderEntry>() {
                                    @Override
                                    public int compare(BlockBuilderEntry o1,
                                            BlockBuilderEntry o2) {
                                        return Integer.compare(o1.getLocation()
                                                .getBlockY(), o2.getLocation()
                                                .getBlockY());
                                    }
                                });

                        int blockCount = blockQueue.size()
                                + delayedQueue.size();
                        int ticksRequired = blockCount
                                / PluginConfig.blocksPerTick();
                        int time = (int) (ticksRequired * (PluginConfig
                                .buildInterval() * 50L));
                        game.setTimer((int) (time / 1000L));

                        EditSession editSession = new EditSession(
                                new BukkitWorld(origin.getWorld()),
                                Integer.MAX_VALUE);
                        editSession.setFastMode(true);

                        BlockBuilder blockBuilder = new BlockBuilder(
                                editSession, blockQueue, delayedQueue,
                                PluginConfig.blocksPerTick(),
                                new BlockBuilder.BuildFinishedHandler() {
                                    @Override
                                    public void onBuildFinish() {
                                        game.setBuilt(true);

                                        if (game.isFull()) {
                                            game.onGameStart();
                                        } else {
                                            game.setTimer(1);
                                        }
                                    }
                                });
                        blockBuilder.start(40L, PluginConfig.buildInterval());
                    }
                });
    }
Никто не жалуется, и я делаю опираясь на то, как сделано уже
Я конечно не проверял, но сделал так:
Java:
    public static void resetGame(final Location c1, final Location c2) {
        Bukkit.getScheduler().runTaskAsynchronously(OnlyBedWars.get(),
                new Runnable() {
                    @Override
                    public void run() {
                        Selection selection = new CuboidSelection(c1.getWorld(), c1, c2);
                        try {
                            Region region = selection.getRegionSelector().getRegion();
                            region.getWorld().regenerate(region, WorldEdit.getInstance().getEditSessionFactory().getEditSession(region.getWorld(), -1));
                            } catch (IncompleteRegionException e) {
                        }
                    }
                });
    }
 

Поделиться этой страницей

Назад
Верх