開発者向け 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_PlusgetLines()- 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)- ボスが倒されたときにリージョン保護を解除します