メインコンテンツまでスキップ

開発者向け API

生成されたJavaリファレンスではクラス、メソッド、シグネチャを検索でき、各モジュールのソースバージョンとコミットも確認できます。

必要条件​

BetterStructures には以下が必要です:

  • Java 21 以上
  • Spigot/Paper サーバー
  • WorldEdit プラグイン(必須依存関係)

オプションの依存関係:

  • WorldGuard - リージョン保護機能用(完全な統合には EliteMobs もインストールされている必要があります)
  • EliteMobs - エリートモブのスポーン統合用
  • MythicMobs - MythicMobs 統合用
  • Terralith, Iris, Terra, TerraformGenerator - カスタムバイオーム互換用

公開リポジトリ

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>

利用可能なバージョンはMavenリポジトリで確認してください。例では公開済みの2.7.7を使用していますが、現在のソースは2.7.7です。インストール済みのプラグインとバージョンを合わせてください。

Gradle

repositories {
maven {
name = "magmaguyRepoReleases"
url = uri("https://repo.magmaguy.com/releases")
}
}

dependencies {
compileOnly("com.magmaguy:BetterStructures:2.7.7")
}

利用可能なバージョンはMavenリポジトリで確認してください。例では公開済みの2.7.7を使用していますが、現在のソースは2.7.7です。インストール済みのプラグインとバージョンを合わせてください。

イベント

注: イベントは com.magmaguy.betterstructures.api パッケージに含まれています

パッケージのインポート​

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​

ビルドが配置されようとしているときに呼び出されます。FitAnything オブジェクトを通じて、どのビルドがどこに配置されるかなど、配置に関する情報を公開します。

配置されるビルド自体を変更しようとしないでください! 細かい変更は可能ですが、ビルド全体を変更すると、フィッティングの悪い結果になる可能性が高いです。

このイベントはキャンセル可能です。

ChestFillEvent​

チェストが補充されるときに呼び出されます。コンテナのスナップショットインベントリを使用し、適用予定のデータを安全に保持します。

getContainer().getSnapshotInventory() で取得したコンテナのスナップショットインベントリに対して、Inventory の addItem() または removeItem() メソッドを使用することで、ルートを変更できます。

また、getTreasureConfigFilename() を呼び出すことで、このチェストの補充に使用されたルートテーブル設定を特定できます。

このイベントはキャンセル可能です。

BuildCustomMarkerEvent​

構造物のブロック、戦利品、モブ、エンティティが貼り付けられた後、[custom] 看板ごとに1回呼び出されます。BetterStructures は先に看板を削除するため、getLocation() のブロックは空気になっており、そこに何でも配置できます。

  • getId() - 看板の2〜4行目を区切りなしで結合したもの。例: Zombie_Plus
  • getLines() - 2〜4行目を個別に、前後の空白を除去して返します。空行は空文字列になります
  • getLocation() - 看板のワールド上の位置
  • getFitAnything() - 貼り付け中の構造物。BuildPlaceEvent と同じです

このイベントはキャンセル不可です。

BuildPasteCompleteEvent​

通常の構造物の貼り付けが完全に終わったとき、その構造物に対するすべての BuildCustomMarkerEvent の後に1回呼び出されます。貼り付けは複数ティックに分散して行われるため、配置済みの構造物を扱うにはここが確実なタイミングです。BuildPlaceEvent はこれらの処理がすべて始まる前に発行されます。看板のボスがスポーンできないなど、仕上げの手順が失敗した場合は貼り付けが停止し、このイベントは発行されません。

  • getFitAnything() - 貼り付けられた構造物
  • getLowestCorner() と getHighestCorner() - 貼り付けたスキマティックのブロックの角のワールド座標。どちらも範囲に含まれます
  • getBoundingBox() - それらのブロックが占める空間
  • getContainerLocations() - スキマティック内のすべてのチェスト、トラップチェスト、シュルカーボックス、樽。BetterStructures が戦利品を入れたかどうかは問いません

このイベントはキャンセル不可です。

WorldGenerationFinishEvent​

専用ワールド内に生成されたモジュラーダンジョン(isWorldGeneration: true)の貼り付けが完了したときに呼び出されます。既存のワールドに貼り付けたダンジョンでは発行されません。スポーンポイント、チェストの位置、出口ポイントなど、生成されたワールドに関するすべてのデータを含む ModularWorld オブジェクトへのアクセスを提供します。

このイベントはキャンセル不可です。

getModularWorld() メソッドを通じてワールドデータにアクセスできます。利用可能なすべてのメソッドについては、以下の ModularWorld セクションを参照してください。

イベントリスナーの例

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();
}
}

主要クラス

FitAnything​

FitAnything クラスは、ビルドがペーストされるときにインスタンス化されるクラスで、チェストの補充やモブのスポーンを含む、ペースト処理のあらゆる側面を扱います。

利用可能な getter メソッド:

  • getSchematicContainer() - スキマティックコンテナを返します
  • getSchematicClipboard() - WorldEdit の Clipboard オブジェクトを返します
  • getSchematicOffset() - 配置用の Vector オフセットを返します
  • getLocation() - 配置先の Location を返します

これらのメソッドは、カスタムリージョン保護を作成したり、ビルド配置を解析したりする際に便利です。

ModularWorld​

ModularWorld クラスは、生成されたモジュラー型ワールドを表すクラスで、WorldGenerationFinishEvent を通じて提供されます。生成されたワールド内でエンティティやコンテナをスポーンさせるためのすべての位置データとメソッドを含みます。

主要メソッド:

  • getWorld() - Bukkit の World インスタンスを返します
  • getWorldFolder() - ワールドの File フォルダを返します
  • getCenter() - ダンジョンの開始地点を返します。難易度の範囲はここから測られます
  • getHorizontalSize() - ダンジョンの幅をブロック単位で返します。(2 × radius − 1) × moduleSizeXZ です
  • getDifficultyId(Location) - ある位置に対する EliteMobs のインスタンス難易度IDを返します。中心から幅の6分の1以内(X方向とZ方向のオフセットのうち大きいほうで測定)なら 2、3分の1以内なら 1、それ以外は 0 です
  • getSpawnLocations() - マークされたすべてのスポーン位置を返します(List<Location>)
  • getChestLocations() - すべてのチェストスポーン位置を返します(List<Location>)
  • getBarrelLocations() - すべての樽スポーン位置を返します(List<Location>)
  • getExitLocations() - すべての出口ポイント位置を返します。なお ExitLocation はprivateなネストされたrecordであるため、プラグインの外部からはワイルドカードのリストとしてしか保持できません。現時点でその要素に対応する公開型はありません。
  • spawnChests() - マークされた位置にチェストをスポーンさせ、List<Block> を返します
  • spawnBarrels() - マークされた位置に樽をスポーンさせ、List<Block> を返します
  • spawnInaccessibleExitLocations() - 上部エレベーターのスキマティックをスポーンさせ、List<Location> を返します
  • spawnAccessibleExitLocations() - 下部エレベーターのスキマティックをスポーンさせ、List<Location> を返します
  • spawnOtherEntities() - 次のティックで、貼り付け処理がまだ処理していないスポーンプールの看板を処理し、その後 WorldGenerationFinishEvent を再度発行します。通常は貼り付け処理がすべてのプール看板を自ら処理します。WorldGenerationFinishEvent のリスナーから呼び出すと、毎ティック繰り返されます。
  • spawnInstancedEntities() - 待機中のスポーンプールのインスタンスボスを、プールの maxLevel で、それぞれ getDifficultyId の難易度IDを付けてスポーンさせ、List<InstancedBossEntity> を返します。各ボスは、キー betterstructures:spawnpool のカスタムデータとしてスポーンプールのファイル名を保持します。

WorldGuard​

WorldGuard クラスは WorldGuard のリージョン保護を処理します。ユーティリティメソッド public static ProtectedRegion generateProtectedRegion(FitAnything fitAnything, String regionName) が提供されており、開発者は BetterStructures の上にカスタムリージョン保護スキームを簡単にフックできます。

その他の便利なメソッド:

  • checkArea(Location, Player) - ある位置が BetterStructures によって保護されたリージョン内にあるかを確認します(保護されていれば true を返し、プレイヤーに警告メッセージを送信します)
  • Protect(...) - プログラム的に保護リージョンを作成します
  • Unprotect(CustomBossEntity) - ボスが倒されたときにリージョン保護を解除します