【Spigot】Bukkitプラグインの作り方講座 - CraftBukkitの利用と複数のバージョンに対応させる方法
CraftBukkitの利用と複数のバージョンに対応させる方法
ここらへんは少し難しい話になります。
Bukkit、Spigotではクラスではなくインターフェースが多用されていますが、
インターフェースということはそれを実装するクラスがあるということです。
実はそれらのクラスはBukkitの基本的機能であるCraftBukkitにあります。
CraftBukkitを利用することでより細かいことが出来るようになります。
Bukkitの「Entity」はCraftBukkitでは「CraftEntity」、「Arrow」は「CraftArrow」のように、
"Craft+xxx"と言った名前になっているので、開発環境で検索をかけてみると良いと思います。
また、それらのクラスはバージョンごとに違うパッケージの中にあります。
例えばCraftBukkitのバージョン名は「v1_12_R1」のようになります。
CraftBukkit1.12のCraftEntityは「org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity」のようになっています。
CraftBukkitはMinecraftサーバーを扱いやすくしたもので、
Minecraftサーバーの機能を継承しています。
Minecraftサーバーの機能に触れる事もできますが、弄るのがかなり難しいのでおすすめしません。
また、CraftBukkitのバージョン名はMinecraftサーバーと同じです。
こちらはCraftArrowはEntityArrow、CraftChestはTileEntityのように、
「Entity+xxx」や「TileEntity+xxx」と言った名前になっています。
例えばMinecraftサーバーのEntityは「net.minecraft.server.v1_12_R1.Entity」です。
また、CraftBukkitでの「CraftChest」がMinecraftサーバーでは「TileEntityChest」になるように、
MinecraftサーバーとCraftBukkitでは構造が変わってくるので注意が必要です。
自分の作ったプラグインを、複数のバージョンに対応させる必要がある場合が少なからずあります。
その為には、CraftBukkitのバージョンごとにプラグインを分けるか、
一つのプラグインで複数のバージョンに対応させる方法があります。
私が作ったプラグインにMinecraftサーバーの機能を利用して、
かまどでのアイテムの燃焼時間を取得するものがありますので参考にしてみて下さい。
これの78行目あたりにあるJavaのgetClass()などを利用して、メソッドを実行するメソッドを利用するなどします。
これを応用して複数のバージョンに対応させることが出来ます。
CraftBukkitやMinecraftの機能を利用するにはバージョン名を取得する必要があります。
バージョン名の部分はこの方法で簡単に取得できます。
getServer().getClass().getName().split("\\.")[3]
また、getServer()はサーバーを取得するメソッドで、プラグインのメインクラスで継承しているJavaPluginクラスで使用できます。
他にもBukkit.getServer()でもServerを取得できます。
ちなみにServerもCraftBukkitではCraftServerとなります。