• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Spigot WorldGuard Region aus Worldedit Schematic

ScheuraaYT

Minecrafter
Registriert
6 März 2016
Beiträge
14
Alter
25
Diamanten
259
Hey ich habe folgendes Problem:
Ich möchte mit der WorldGuardAPI eine Region aus einer mit der WorldeditAPI gepasteten Schematic erstellen.
Bisher bin ich so vorgegangen:
Java:
private void pasteSchem(String name, Location loc) {
        File file = new File(Main.getPlugin().getDataFolder().getParent() + "/WorldEdit/schematics/" + name + ".schem");
        ClipboardFormat format = ClipboardFormats.findByFile(file);
        Clipboard clipboard = null;
        try (ClipboardReader reader = format.getReader(new FileInputStream(file))) {
            try {
                clipboard = reader.read();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        com.sk89q.worldedit.world.World w = BukkitAdapter.adapt(loc.getWorld());
        try (EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1)) {
            Operation operation = new ClipboardHolder(clipboard).createPaste(editSession)
                    .to(BlockVector3.at(loc.getX(), loc.getY(), loc.getZ())).ignoreAirBlocks(false).build();
            try {
                Operations.complete(operation);
            } catch (WorldEditException ex) {
                ex.printStackTrace();
            }
            BlockVector3 min = BlockVector3.at(loc.getX(), loc.getY(), loc.getZ()).subtract(clipboard.getMinimumPoint());
            BlockVector3 max = BlockVector3.at(loc.getX(), loc.getY(), loc.getZ()).add(clipboard.getMaximumPoint());
            ProtectedRegion region = new ProtectedCuboidRegion(name + "-" + id, min, max);
            Map<Flag<?>, Object> flags = new HashMap<Flag<?>, Object>();
            flags.put(Flags.BUILD, StateFlag.State.DENY);
            flags.put(Flags.BLOCK_BREAK, StateFlag.State.DENY);
            flags.put(Flags.BLOCK_PLACE, StateFlag.State.DENY);
            flags.put(Flags.CREEPER_EXPLOSION, StateFlag.State.DENY);
            region.setFlags(flags);
            RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
            RegionManager regionman = container.get(w);
            regionman.addRegion(region);
            regions.add(region);
            id++;
        }
        System.out.println("Pasted Schem at " + loc.toString());

    }

Das Problem ist momentan noch, dass die Region nicht im Bereich der Schematic ist, die die Vektoren min und max noch nicht stimmen, was daran liegt dass da jeweils das falsche addiere bzw. subtrahiere.
Habe im Internet dazu aus älterer Zeit folgendes gefunden:
Java:
cc.getOffset()
und
Java:
cc.getSize()
wobei cc ein Objekt der Klasse CuboidClipboard ist, die gibt es allerdings nicht mehr in der neueren Version von WorldEdit. Wie komme ich nun in der Version auf den Offset und auf die Size meiner Schematic bzw. geht das ganze überhaupt noch so ?
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Mein Tipp: Schau dir den Souce Code vom //paste-Befehl von WorldEdit an. Dieser hat die Flag "-s", um die Region nach dem Kopieren zu selektieren.

Wenn du dann die CuboidRegion hast, solltest du einfach die ProtectedRegion erstellen können.
 

ScheuraaYT

Minecrafter
Registriert
6 März 2016
Beiträge
14
Alter
25
Diamanten
259
Mein Tipp: Schau dir den Souce Code vom //paste-Befehl von WorldEdit an. Dieser hat die Flag "-s", um die Region nach dem Kopieren zu selektieren.
Danke hat mir weiter geholfen und hab es nun hinbekommen, bin nicht drauf gekommen dass das ganze beim //paste Befehl auch so gemacht wird.
Für alle die wissen wollen wie hier ist der Code wie ich es gemacht habe, ist fast identisch zu dem aus dem //paste Command wie von JOO200 erwähnt:
Java:
private void pasteSchem(String name, Location loc) {
        File file = new File(Main.getPlugin().getDataFolder().getParent() + "/WorldEdit/schematics/" + name + ".schem");
        ClipboardFormat format = ClipboardFormats.findByFile(file);
        Clipboard clipboard = null;
        try (ClipboardReader reader = format.getReader(new FileInputStream(file))) {
            try {
                clipboard = reader.read();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        com.sk89q.worldedit.world.World w = BukkitAdapter.adapt(loc.getWorld());
        try (EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1)) {
            ClipboardHolder holder = new ClipboardHolder(clipboard);
            Operation operation = holder.createPaste(editSession)
                    .to(BlockVector3.at(loc.getX(), loc.getY(), loc.getZ())).ignoreAirBlocks(false).build();
            try {
                Operations.complete(operation);
            } catch (WorldEditException ex) {
                ex.printStackTrace();
            }
            Region weregion = clipboard.getRegion();
            BlockVector3 clipBoardOffset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
            Vector3 realTo = Vector3.at(loc.getX(), loc.getY(), loc.getZ()).add(holder.getTransform().apply(clipBoardOffset.toVector3()));
            Vector3 max = realTo.add(holder.getTransform().apply(weregion.getMaximumPoint().subtract(weregion.getMinimumPoint()).toVector3()));
            ProtectedRegion region = new ProtectedCuboidRegion(name + "-" + id, realTo.toBlockPoint(), max.toBlockPoint());
            Map<Flag<?>, Object> flags = new HashMap<Flag<?>, Object>();
            flags.put(Flags.BUILD, StateFlag.State.DENY);
            flags.put(Flags.BLOCK_BREAK, StateFlag.State.DENY);
            flags.put(Flags.BLOCK_PLACE, StateFlag.State.DENY);
            flags.put(Flags.CREEPER_EXPLOSION, StateFlag.State.DENY);
            region.setFlags(flags);
            RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
            RegionManager regionman = container.get(w);
            regionman.addRegion(region);
            regions.add(region);
            id++;
        }
        System.out.println("Pasted Schem at " + loc.toString());

    }
 
Oben