Zum Hauptinhalt springen

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 Beispiel Zombie_Plus
  • getLines() – Die Zeilen 2-4 einzeln, getrimmt, wobei leere Zeilen leere Strings sind
  • getLocation() – Die Position des Schilds in der Welt
  • getFitAnything() – Die einzufügende Struktur, wie bei BuildPlaceEvent

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 Struktur
  • getLowestCorner() und getHighestCorner() – Die Blockecken des eingefügten Schematics in Weltkoordinaten, beide inklusive
  • getBoundingBox() – Der von diesen Blöcken abgedeckte Raum
  • getContainerLocations() – 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ück
  • getSchematicClipboard() – Gibt das WorldEdit-Clipboard-Objekt zurück
  • getSchematicOffset() – Gibt den Vector-Offset für die Platzierung zurück
  • getLocation() – 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ück
  • getWorldFolder() – Gibt den File-Ordner der Welt zurück
  • getCenter() – Gibt den Startpunkt des Dungeons zurück, von dem aus die Schwierigkeitsbereiche gemessen werden
  • getHorizontalSize() – Gibt die Breite des Dungeons in Blöcken zurück, (2 × radius − 1) × moduleSizeXZ
  • getDifficultyId(Location) – Gibt die EliteMobs-Instanz-Schwierigkeits-ID für eine Position zurück: 2 innerhalb eines Sechstels der Breite vom Zentrum (gemessen als der größere der X- und Z-Versätze), 1 innerhalb eines Drittels, sonst 0
  • getSpawnLocations() – 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, dass ExitLocation ein 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, gibt List<Block> zurück
  • spawnBarrels() – Spawnt Fässer an markierten Standorten, gibt List<Block> zurück
  • spawnInaccessibleExitLocations() – Spawnt obere Aufzug-Schematics, gibt List<Location> zurück
  • spawnAccessibleExitLocations() – Spawnt untere Aufzug-Schematics, gibt List<Location> zurück
  • spawnOtherEntities() – Verarbeitet im nächsten Tick alle Spawn-Pool-Schilder, die das Einfügen noch nicht behandelt hat, und löst danach WorldGenerationFinishEvent erneut aus. Normalerweise behandelt das Einfügen jedes Pool-Schild selbst. Ein Aufruf aus einem WorldGenerationFinishEvent-Listener führt dazu, dass es sich jeden Tick wiederholt.
  • spawnInstancedEntities() – Spawnt die wartenden instanzierten Spawn-Pool-Bosse mit dem maxLevel ihres Pools, jeweils mit der Schwierigkeits-ID aus getDifficultyId, und gibt List<InstancedBossEntity> zurück. Jeder Boss trägt den Dateinamen des Spawn-Pools als benutzerdefinierte Daten unter dem Schlüssel betterstructures: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 Regionen
  • Unprotect(CustomBossEntity) – Entfernt den Regionenschutz, wenn ein Boss getötet wird