• 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 WorldEdit API

Magnus020

Minecrafter
Registriert
16 Juli 2020
Beiträge
2
Alter
41
Diamanten
300
Guten Tag alle beisammen,

Eckdaten:
Spigot 1.15.2
WorldEdit 7.1.0

Kurze Vorgeschichte:
Seit einiger Zeit entwickle ich für meinen Privaten kleinen Server, ein Plugin welches verschiedene Funktionen bietet. Unter anderem hilft es dabei Spieler in WorldGuard-Regionen als Member einzutragen / auszutragen und und und. Es läuft Wunderbar.

Ziel der neuen Funktion:
Das ganze soll nun um eine Limitierung erweitert werden. Also das in den Regionen nur 200 Kisten, 100 Schilder, 20 Kühe, usw. gesetzt werden dürfen.

Das Problem:
Ich habe schon einiges Versucht, wie z.B. die Region durch eine for laufen zu lassen (besser gesagt 3 for schleifen für x y und z)
Das Ergebnis? Es fing an zu laggen und der Server ist abgestürzt. Auch das ganze in einen neue Thread laufen zu lassen, funktioniert nicht da Bukkit nicht Thread-Sicher ist. Somit kann ich nicht auf die entsprechenden Methoden zurückgreifen.

Da kam mir die Idee die WorldEdit API zu nutzen, in Gedanken hatte ich den Befehl //distr der ja Blitzschnell alle Blöcke auflistet etc.
Einfacher gesagt als getan.

zum Testen hatte ich mir dies mal in einen TestCommand reingesetzt:
Java:
        Player player = (Player) cs;
        BukkitPlayer bp = BukkitAdapter.adapt(player);
           
        try (EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(bp.getWorld(), -1)) {
            ProtectedRegion wgRegion = WorldGuardUtils.getARegion(player);
           
            ProtectedPolygonalRegion ppr = null;
           
            if (wgRegion instanceof ProtectedPolygonalRegion) {
                ppr = (ProtectedPolygonalRegion) wgRegion;
               
                Polygonal2DRegion weRegion =
                        new Polygonal2DRegion(bp.getWorld(),
                                ppr.getPoints(),
                                ppr.getMinimumPoint().getBlockY(),
                                ppr.getMaximumPoint().getBlockY());

                List<? extends Entity> tt = editSession.getEntities(weRegion);
            // ########################## bis hier her, alles Tuti ##########################
               
                BlockType bt = BlockTypes.CHEST;
                BlockState bs = bt.getDefaultState();
                Set<BaseBlock> b = null;
                b.add(bs.getBlockType().getDefaultState().toBaseBlock()); // Erzeugt beim Ausführen eine
                                                                          // NullPointerExeption Ohne weitere Angaben!
               
                int f = editSession.countBlocks(weRegion, b);
               
               
                Entity e = tt.get(1);
                player.sendMessage(e.getState().getType().getName()+" gefundene Kisten: "+f);
               
            } else {
               
                CuboidRegion cr = new CuboidRegion(bp.getWorld(), wgRegion.getMaximumPoint(), wgRegion.getMinimumPoint());
                List<? extends Entity> tt = editSession.getEntities(cr);
               
                Entity e = tt.get(1);
                player.sendMessage(e.getState().getType().getName());
               
            }
           
           
        }

Im Code Teil habe ich die Stelle kommentiert, an der ich einen Fehler erhalte.
die editSession.countBlocks(... , ...) Erwartet eine Region, kein Ding is erledigt! Zusätzlich muss man eine (Mask searchMask) angeben.

Ich habe kein Plan wie das mit der Mask searchMask funktioniert und wie ich die Gesuchten Blöcke da rein bekommen soll.
Auch über Google konnte ich jetzt nichts Hilfreiches finden,

Die Frage:
Kann mir wer ein Funktionierendes Bespiel geben? Sitz schon einige Zeit daran. Für jede Hilfe wäre ich sehr Dankbar.
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Dir wurde schon auf dem EngineHub-Discord gesagt, dass du dir die Basics von Java anschauen sollst. Du legst eine Variable vom Typ Set an, aber initialisierst sie mit null. Das ist in etwa so, wie wenn du dir in deinem Zimmer Platz für ein Regal schaffst, aber kein Regal hinstellst sondern direkt versuchst, Sachen in das Regal zu räumen.
 

Magnus020

Minecrafter
Registriert
16 Juli 2020
Beiträge
2
Alter
41
Diamanten
300
Ich selbst kann im EngineHub-Discord nicht sein. Besitze nicht mal Discord. Bin da noch was Altmodisch und nutze TS³ kann mir aber vorstellen wen du meinst. Schön das er mir mal ne Info darüber gibt.

@SirYwell Danke für den Hinweis ich hab Zeile 23 gar nicht ganz für voll genommen. Jetzt wo man mir das auf die Nase Haut sehe ich auch das die Initialisierung fehlt. Initialisiert und Zack ich bekomme die Kisten Anzahl. Aber den Kollegen, muss ich mir noch mal vornehmen. Hätte er mir ruhig mal sagen können, dass er im Discord schon Nachgefragt hat.

Thema kann geschlossen werden (scheinbar kann man das hier nicht selbst :-( )
 
Zuletzt bearbeitet:
Oben