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:
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.
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.