1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Bars, 21 фев 2015.

  1. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Код:
        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);
                            }
                        }
                    }
                }
            });
        }
    Вот это что написал. Естественно, не без ошибок.
    Как их удалить? Желательно с отгрузкой затронутых чанков после удаления.
     
  2. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Хихих, как раз занимаюсь этим же.
    Люто плюсую, скажите как?

    Зачем тебе вордедит тогда?
     
  3. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Уверен, что в с его помощью будет куда эффективнее, тем более что он уже используется в плагине (для построения чертежей (schematic))
     
  4. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Если ты будешь перебирать по одному блоку - не будет.
    Надо задавать границы региона и сетать сразу регион, a WE уже пусть перебирает.
    Если перебирать самому, то имеет смысл просто setType(Material.AIR)
     
  5. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Ещё и асинхронно блоки строишь, самый лучший способ убить сервер.
     
  6. Автор темы
    Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Что на данный момент в SkyWars-plugin:
    Код:
        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());
                        }
                    });
        }
    Никто не жалуется, и я делаю опираясь на то, как сделано уже
    Я конечно не проверял, но сделал так:
    Код:
        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) {
                            }
                        }
                    });
        }
     

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