Entwickler-API
Die generierte Java-Referenz enthält durchsuchbare Klassen, Methoden und Signaturen. Für jedes Modul sind die Quellversion und der Commit vermerkt.
Voraussetzungen
BetterStructures benötigt:
- Java 21 oder höher
- Spigot-/Paper-Server
- WorldEdit-Plugin (harte Abhängigkeit)
Optionale Abhängigkeiten:
- WorldGuard – Für Regionenschutz-Funktionen (erfordert zusätzlich EliteMobs für die vollständige Integration)
- EliteMobs – Für die Integration des Spawnens von Elite-Mobs
- MythicMobs – Für die MythicMobs-Integration
- Terralith, Iris, Terra, TerraformGenerator – Für die Kompatibilität mit benutzerdefinierten Biomen
Öffentliches Repository
Maven
<repositories>
<repository>
<id>magmaguy-repo-releases</id>
<name>MagmaGuy's Repository</name>
<url>https://repo.magmaguy.com/releases</url>
</repository>
</repositories>
<dependency>
<groupId>com.magmaguy</groupId>
<artifactId>BetterStructures</artifactId>
<version>2.7.7</version>
<scope>provided</scope>
</dependency>
Verfügbare Versionen findest du im Maven-Repository. Das Beispiel verwendet die veröffentlichte Version 2.7.7; der aktuelle Quellcode hat die Version 2.7.7. Wähle die Version passend zum installierten Plugin.
Gradle
repositories {
maven {
name = "magmaguyRepoReleases"
url = uri("https://repo.magmaguy.com/releases")
}
}
dependencies {
compileOnly("com.magmaguy:BetterStructures:2.7.7")
}
Verfügbare Versionen findest du im Maven-Repository. Das Beispiel verwendet die veröffentlichte Version 2.7.7; der aktuelle Quellcode hat die Version 2.7.7. Wähle die Version passend zum installierten Plugin.
Events
Hinweis: Events befinden sich in com.magmaguy.betterstructures.api
Paket-Importe
import com.magmaguy.betterstructures.api.BuildCustomMarkerEvent;
import com.magmaguy.betterstructures.api.BuildPasteCompleteEvent;
import com.magmaguy.betterstructures.api.BuildPlaceEvent;
import com.magmaguy.betterstructures.api.ChestFillEvent;
import com.magmaguy.betterstructures.api.WorldGenerationFinishEvent;
import com.magmaguy.betterstructures.buildingfitter.FitAnything;
import com.magmaguy.betterstructures.modules.ModularWorld;
import com.magmaguy.betterstructures.thirdparty.WorldGuard;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Container;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.List;
BuildPlaceEvent
Wird aufgerufen, wenn ein Build platziert werden soll. Stellt unter anderem über das FitAnything-Objekt Daten darüber bereit, welcher Build wo platziert wird.
Versuche nicht, den zu platzierenden Build zu verändern! Du kannst kleinere Anpassungen vornehmen, aber das Ändern des gesamten Builds führt vermutlich zu einem Build mit schlechter Passung.
Dieses Event ist abbrechbar.
ChestFillEvent
Wird aufgerufen, wenn eine Truhe befüllt wird. Verwendet das Snapshot-Inventar des Containers, um die anzuwendenden Daten sicher zu speichern.
Du kannst die Beute über die Inventory-Methoden addItem() oder removeItem() am Snapshot-Inventar des Containers verändern, das über getContainer().getSnapshotInventory() verfügbar ist.
Du kannst außerdem getTreasureConfigFilename() aufrufen, um zu ermitteln, welche Loot-Table-Konfiguration zum Befüllen dieser Truhe verwendet wurde.
Dieses Event ist abbrechbar.
BuildCustomMarkerEvent
Wird einmal für jedes [custom]-Schild aufgerufen, nachdem Blöcke, Beute, Mobs und Entities der Struktur eingefügt wurden. BetterStructures entfernt das Schild zuerst, daher ist der Block an getLocation() Luft und du kannst dort beliebig etwas platzieren.
getId()– Die Zeilen 2-4 des Schilds ohne Trennzeichen verbunden, zum BeispielZombie_PlusgetLines()– Die Zeilen 2-4 einzeln, getrimmt, wobei leere Zeilen leere Strings sindgetLocation()– Die Position des Schilds in der WeltgetFitAnything()– Die einzufügende Struktur, wie beiBuildPlaceEvent
Dieses Event ist NICHT abbrechbar.
BuildPasteCompleteEvent
Wird aufgerufen, sobald eine reguläre Struktur vollständig eingefügt ist, nach jedem zugehörigen BuildCustomMarkerEvent. Das Einfügen verteilt sich über mehrere Ticks, daher ist dies der verlässliche Zeitpunkt, um mit der platzierten Struktur zu arbeiten. BuildPlaceEvent wird ausgelöst, bevor irgendetwas davon geschieht. Schlägt ein Fertigstellungsschritt fehl, etwa ein Schild-Boss, der nicht spawnen kann, stoppt das Einfügen und dieses Event wird nicht ausgelöst.
getFitAnything()– Die eingefügte StrukturgetLowestCorner()undgetHighestCorner()– Die Blockecken des eingefügten Schematics in Weltkoordinaten, beide inklusivegetBoundingBox()– Der von diesen Blöcken abgedeckte RaumgetContainerLocations()– Jede Truhe, Redstone-Truhe, Shulker-Box und jedes Fass aus dem Schematic, unabhängig davon, ob BetterStructures sie mit Beute befüllt hat
Dieses Event ist NICHT abbrechbar.
WorldGenerationFinishEvent
Wird aufgerufen, wenn ein modularer Dungeon, der in einer eigenen Welt generiert wird (isWorldGeneration: true), fertig eingefügt ist. Dungeons, die in bestehende Welten eingefügt werden, lösen es nicht aus. Bietet Zugriff auf das ModularWorld-Objekt, das alle Daten über die generierte Welt enthält, einschließlich Spawnpunkten, Truhenstandorten und Ausgangspunkten.
Dieses Event ist NICHT abbrechbar.
Du kannst über die Methode getModularWorld() auf die Weltdaten zugreifen. Siehe den Abschnitt ModularWorld unten für alle verfügbaren Methoden.
Beispiel-Event-Listener
public class MyBetterStructuresListener implements Listener {
@EventHandler
public void onBuildPlace(BuildPlaceEvent event) {
FitAnything build = event.getFitAnything();
Location location = build.getLocation();
// Custom logic here
// event.setCancelled(true); // To prevent placement
}
@EventHandler
public void onChestFill(ChestFillEvent event) {
Container container = event.getContainer();
Inventory inv = container.getSnapshotInventory();
// Modify inventory here
inv.addItem(new ItemStack(Material.DIAMOND, 1));
}
@EventHandler
public void onCustomMarker(BuildCustomMarkerEvent event) {
if (!event.getId().equals("Zombie_Plus")) return;
// Spawn your own mob at the marker
event.getLocation().getWorld().spawnEntity(event.getLocation().add(0.5, 0, 0.5), EntityType.ZOMBIE);
}
@EventHandler
public void onPasteComplete(BuildPasteCompleteEvent event) {
for (Location containerLocation : event.getContainerLocations()) {
if (!(containerLocation.getBlock().getState() instanceof Container container)) continue;
// Replace the contents with your own loot
container.getInventory().clear();
container.getInventory().addItem(new ItemStack(Material.EMERALD, 3));
}
}
@EventHandler
public void onWorldGenFinish(WorldGenerationFinishEvent event) {
ModularWorld world = event.getModularWorld();
// Access generated world data
List<Location> spawns = world.getSpawnLocations();
}
}
Wichtige Klassen
FitAnything
Die FitAnything-Klasse ist die Klasse, die instanziiert wird, wenn ein Build eingefügt wird, und sie verwaltet alle Aspekte des Einfügens, einschließlich des Befüllens von Truhen und des Spawnens von Mobs.
Verfügbare Getter-Methoden:
getSchematicContainer()– Gibt den Schematic-Container zurückgetSchematicClipboard()– Gibt das WorldEdit-Clipboard-Objekt zurückgetSchematicOffset()– Gibt den Vector-Offset für die Platzierung zurückgetLocation()– Gibt die Platzierungs-Location zurück
Diese Methoden sind nützlich, um benutzerdefinierte Regionenschutze zu erstellen oder Build-Platzierungen zu analysieren.
ModularWorld
Die ModularWorld-Klasse repräsentiert eine generierte modulare Welt und wird über das WorldGenerationFinishEvent bereitgestellt. Sie enthält alle Standortdaten sowie Methoden zum Spawnen von Entitäten und Containern in der generierten Welt.
Wichtige Methoden:
getWorld()– Gibt die Bukkit-World-Instanz zurückgetWorldFolder()– Gibt den File-Ordner der Welt zurückgetCenter()– Gibt den Startpunkt des Dungeons zurück, von dem aus die Schwierigkeitsbereiche gemessen werdengetHorizontalSize()– Gibt die Breite des Dungeons in Blöcken zurück,(2 × radius − 1) × moduleSizeXZgetDifficultyId(Location)– Gibt die EliteMobs-Instanz-Schwierigkeits-ID für eine Position zurück:2innerhalb eines Sechstels der Breite vom Zentrum (gemessen als der größere der X- und Z-Versätze),1innerhalb eines Drittels, sonst0getSpawnLocations()– Gibt alle markierten Spawn-Locations zurück (List<Location>)getChestLocations()– Gibt alle Spawn-Locations für Truhen zurück (List<Location>)getBarrelLocations()– Gibt alle Spawn-Locations für Fässer zurück (List<Location>)getExitLocations()– Gibt alle Ausgangspunkt-Locations zurück. Beachte, dassExitLocationein privates verschachteltes Record ist, sodass du das Ergebnis von außerhalb des Plugins nur als Wildcard-Liste halten kannst; es gibt derzeit keinen öffentlichen Typ für seine Elemente.spawnChests()– Spawnt Truhen an markierten Standorten, gibtList<Block>zurückspawnBarrels()– Spawnt Fässer an markierten Standorten, gibtList<Block>zurückspawnInaccessibleExitLocations()– Spawnt obere Aufzug-Schematics, gibtList<Location>zurückspawnAccessibleExitLocations()– Spawnt untere Aufzug-Schematics, gibtList<Location>zurückspawnOtherEntities()– Verarbeitet im nächsten Tick alle Spawn-Pool-Schilder, die das Einfügen noch nicht behandelt hat, und löst danachWorldGenerationFinishEventerneut aus. Normalerweise behandelt das Einfügen jedes Pool-Schild selbst. Ein Aufruf aus einemWorldGenerationFinishEvent-Listener führt dazu, dass es sich jeden Tick wiederholt.spawnInstancedEntities()– Spawnt die wartenden instanzierten Spawn-Pool-Bosse mit demmaxLevelihres Pools, jeweils mit der Schwierigkeits-ID ausgetDifficultyId, und gibtList<InstancedBossEntity>zurück. Jeder Boss trägt den Dateinamen des Spawn-Pools als benutzerdefinierte Daten unter dem Schlüsselbetterstructures:spawnpool.
WorldGuard
Die WorldGuard-Klasse verwaltet die WorldGuard-Regionenschutze. Die Hilfsmethode public static ProtectedRegion generateProtectedRegion(FitAnything fitAnything, String regionName) wird Entwicklern zur Verfügung gestellt, um auf einfache Weise ein benutzerdefiniertes Regionenschutzschema zusätzlich zu BetterStructures einzuhängen.
Weitere nützliche Methoden:
checkArea(Location, Player)– Prüft, ob sich ein Standort in einer von BetterStructures geschützten Region befindet (gibt true zurück, wenn geschützt, und sendet dem Spieler eine Warnmeldung)Protect(...)– Erstellt programmatisch geschützte RegionenUnprotect(CustomBossEntity)– Entfernt den Regionenschutz, wenn ein Boss getötet wird