Der Thread ist von 2014, 2 Jahre alt...
Das Plugin kenn ich, kostet 10$ und ist nicht mit unserer WorldEdit Version Kompatibel..
Beiträge von KleinCrafter im Thema „WorldEdit unlimeded blocks setzen?“
-
-
Ömm input = minimaler und maximaler punkt, ich dfange mit dem minimum an und höre beim maximum auf.
Keine probleme mit sand / gravel da dieser von unten nach oben schicht für schicht gesetzt wird.Ich habe dafür aktuell neue commands erstellt, bin aber noch nicht zufrieden mit der arbeitsweise..
Werde es morgen überarbeiten damit der server es in einer akzeptablen zeit hinbekommt.
Imoment siet es so aus:Code/** * Sets all the blocks inside a region to a certain block type. * * @param region * @param pattern * @return number of blocks affected * @throws MaxChangedBlocksException */ public int setBlocks(Region region, Pattern pattern, LocalSession session, LocalPlayer player, EditSession editSession) throws MaxChangedBlocksException { BlockScheduler bs = new BlockScheduler(region, pattern, session, player, editSession); int tmp = Bukkit.getScheduler().scheduleSyncRepeatingTask(Bukkit.getPluginManager().getPlugin("WorldEdit"), bs, 0, 5); bs.setID(tmp); return tmp; } private class BlockList { public int x, y, z; public BlockList(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } } private class BlockScheduler implements Runnable { private int id = 0; private Region region; private Pattern pattern; private LocalSession session; private LocalPlayer player; private EditSession editSession; private long count = 0; private ArrayList<BlockList> bl = new ArrayList<BlockList>(); public BlockScheduler(Region region, Pattern pattern, LocalSession session, LocalPlayer player, EditSession editSession) throws MaxChangedBlocksException { this.region = region; this.pattern = pattern; this.session = session; this.player = player; this.editSession = editSession; Vector min = region.getMinimumPoint(); Vector max = region.getMaximumPoint(); int minX = min.getBlockX(); int minY = min.getBlockY(); int minZ = min.getBlockZ(); int maxX = max.getBlockX(); int maxY = max.getBlockY(); int maxZ = max.getBlockZ(); for (int x = minX; x <= maxX; ++x) { for (int y = minY; y <= maxY; ++y) { for (int z = minZ; z <= maxZ; ++z) { bl.add(new BlockList(x, y, z)); } } } } public void setID(int id) { this.id = id; } @Override public void run() { for(int tick = 0; tick <= 1000; tick++) { if (bl.size() <= 0) { finish(); return; } BlockList bl = this.bl.get(0); Vector pt = new Vector(bl.x, bl.y, bl.z); world.checkLoadedChunk(pt); if (region.getWorld().setBlock(pt, pattern.next(pt), true)) { ++count; } this.bl.remove(0); } if (this.bl.size() <= 0) { finish(); return; } } public void finish() { player.printDebug("Es wurden " + count + " Bl\u00F6cke ge\u00E4ndert."); Bukkit.getScheduler().cancelTask(id); } }
Code
Alles anzeigen@Command( aliases = { "/settime" }, usage = "<block>", desc = "Set all the blocks inside the selection to a block", min = 1, max = 1 ) @CommandPermissions("worldedit.region.settime") @Logging(REGION) public void settime(CommandContext args, LocalSession session, LocalPlayer player, EditSession editSession) throws WorldEditException { Pattern pattern = we.getBlockPattern(player, args.getString(0)); int affected; affected = editSession.setBlocks(session.getSelection(player.getWorld()), pattern, session, player, editSession); player.print(affected + " was the Thread ID."); } @Command( aliases = { "/cancel" }, usage = "<id>", desc = "Cancel a Task", min = 1, max = 1 ) @CommandPermissions("worldedit.region.cancel") @Logging(REGION) public void cancel(CommandContext args, LocalSession session, LocalPlayer player, EditSession editSession) throws WorldEditException { int id = args.getInteger(0); Bukkit.getScheduler().cancelTask(id); player.print(id + " was canceled."); }
//TODO:
selbstgeschriebene Liste die mit einem long arbeitet
Eine statische liste die alle SetTime befehler hinereinander abarbeitet.
Einen befehl hinzufügen, der denn stand der prozedur abfragt
Einen befehl hinzufügen, der anzeigt wieviele prozesseKleiner
-
Achso, ja habe ich .. leider passiert nüx -.- er füht denn scheduller zwar aus aber er ändert keine blöcke .. ich denke mal das WE mit einer session arbeitet die zu früh beendet wird..
um mich darein zu lesen und das so zu ändern das es läuft dauert mir zu lange und ich arbeiter erstmal die restlichen sachen ab.. müssen sie die läute ebend mit WE zügelnAber ich kann ja mal einen eigenen befehl einfügen oO
Hmm, ja das mache ich doch gleich mal, selber setzen und nicht die funktion von WE nehmen, mal sehen was daraus wird...//edit
xD Habe es geschaft es zeit versetzt zu setzen, leider ohne undo / redo funktion xD code werde ich am wochenende posten, bis dahin werde ich noch gucken ob es besser ist oder nicht.. (was passiert wohl wenn ich ausversehen mal 10K x 10K makiere? xD ich werde es morgen testen xDKleiner
-
Nur so als info, das was ich oben reingestelt habe ist der originale code von WorldEdit, ohne änderungen.
Ich habe nur diesen teiel hochgeladen, weiel er CuboidRegionen setzt, poly und cyl regionen werden noch umständlicher gehandhabt...
Zeile 1135Kleiner
-
Hallo Leute
WorldEdit ist ein Programm um die Welten durch befehle zu bearbeiten.
Der einfachste Befehl ist dort der "//set [Block]:[Data]" Befehl
Diesen nutzen wir auf dem server sehr oft... wenn eine zu große Region makiert wurde hat der server nicht genug speicher um diese setzen zu können..Auf grund dessen möchte ich diesen befehl nun so ändern dass man damit unentlich viele blöcke setzen kann..
Der Basis Befehl siet so aus:Code
Alles anzeigen/** * Sets all the blocks inside a region to a certain block type. * * @param region * @param block * @return number of blocks affected * @throws MaxChangedBlocksException */ public int setBlocks(Region region, BaseBlock block) throws MaxChangedBlocksException { int affected = 0; if (region instanceof CuboidRegion) { // Doing this for speed Vector min = region.getMinimumPoint(); Vector max = region.getMaximumPoint(); int minX = min.getBlockX(); int minY = min.getBlockY(); int minZ = min.getBlockZ(); int maxX = max.getBlockX(); int maxY = max.getBlockY(); int maxZ = max.getBlockZ(); for (int x = minX; x <= maxX; ++x) { for (int y = minY; y <= maxY; ++y) { for (int z = minZ; z <= maxZ; ++z) { Vector pt = new Vector(x, y, z); if (setBlock(pt, block)) { ++affected; } } } } } else { for (Vector pt : region) { if (setBlock(pt, block)) { ++affected; } } } return affected; }
Nun ja, die Programmierer unter euch sehen schon warum es zu crashs kommt oder? xD
Warum ich es hier öffentlich hin schreibe? Ich möchte einfach mal zeigen was ich denn so mache.
Und damit ihr mir helfen könnt xD ich habe bisher nur alles theoretisch geplant, wie es denn so läuft weiß ich nicht...Nun meine Grund Idee um dieses Problem zu lösen:
Alle Blöcke die darin enthalten sind in einer liste speichern und block für block diese abarbeiten mit einem Bukkit Scheduler der jeden Tick "100" Blöcke setzt.
Theoretisch kann man nun beim aufbauen der zu setzenden blöcke zugucken und durch einen weiteren befehl diesen aufbau abbrechen...Also einen Neuen Befehl hinzufügen um das setzen abbrechen zu können.
Mal sehen was WE damit in der Wirklichkeit raus macht xDOder hat jemand eine Idee die noch einfacher geht?
Performanter?
Schneller muss es nicht mal gehen, hierbei geht es darum das der Server nicht crashen kann durch WE arbeiten.Kleiner