見出し画像

【マインクラフト(Java版)】Spigotサーバーのプラグイン自作するための準備


はじめに

今回はSpigotサーバを構築して,マインクラフトのサーバープラグインを作成する環境構築を行います.環境はMacBook air m2です.
使用するツール類は以下の通りです.IntelliJ IDEA以外は導入方法を説明します.
- JDK Development Kit(執筆当時はversion 21)
- intelliJ IDEA(統合開発環境)
- SpigotMC(サーバー構築)

説明すること

  1. Java環境の構築

  2. Spigotサーバーの構築

  3. IntelliJ IDEAでプロジェクトを作成する

  4. NMSを用いたプラグイン実装ができるようにする

説明しないこと

  1. ポート開放

  2. intelliJ IDEAのインストール

  3. Javaによるプラグイン実装

  4. その他色々


1. JDKのインストール

プラグインを自作する場合はJavaを使用します.

こちらのoracle公式サイトから目的のバージョンのJDKをダウンロードします.
おすすめはLTS(Long Term Support)と表示されてるバージョンです.
今回はMacOSのm2チップ(intel製じゃない)ですので"ARM64 DMG Installer"をダウンロードして,インストールウィザードに従ってセットアップを完了してください.

そしたら以下のコマンドでパスを通します.バージョン(21の部分)は各自で修正してください.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH

無事にインストールできたかどうかは以下のコマンドで確認できます.

java --version

2. Spigotサーバーの構築

まずこちらのリンクをクリックしてBuildTools.jarをダウンロードします.
次にサーバー管理用のディレクトリを任意の名前で任意の場所に作成します.
著者はdesktop/serverという感じで作成してます.

作成したディレクトリにBuildTools.jarを配置して,以下のコマンドを実行します

java -jar BuildTools.jar --rev 1.21.1

実行完了したら,以下のパスにspigotmcが存在することを確認してください.存在しない場合は何か失敗してます.ただし.m2が隠しディレクトリであることに注意してください.
/Users/ユーザー名/.m2/repository/org/spigotmc

次に以下のコードを実行すると色々必要なファイルが生成されます.

java -jar spigot-1.21.1.jar

次に生成されたeula.txtのeula=falseをeula=trueに変更し,ライセンス条項に同意します.
そしてもう一度上記のコードを実行すれば,サーバーがとりあえず起動します.
起動したサーバーは以下のコマンドで終了させましょう.

stop

3. IntelliJ IDEAでプロジェクト作成

まずSpigotサーバーのプラグイン実装に関わるDevelopentプラグイン(MineCraft Development)をMarketplaceからインストールしましょう.

Minecraft Developmentのインストール

次に,新規プロジェクトを画像の通りに作成します.
具体的にはGroupsは"Plugin"で,Templatesは"Spigot",Build Systemは"Maven"を指定してください.名前は任意です.
因みにMavenではなく Gradleでも特に問題ありませんが,諸々の依存関係の管理がMavenの方が楽だと思います.

新規プロジェクトの作成

サーバの起動

次にバックグラウンドでスクリプトを実行するためにscreenを以下のコマンドでインストールします

sudo apt-get install screen

その次にMakefileを作成して以下のように記述して保存してください.この時拡張子は存在しないことに注意してください

start:
	screen -d -m -S "spigot" java -Xms1G -Xmx2G -XX:+UseG1GC -jar spigot-1.21.1.jar

次にspigot.ymlのrestart-script:項目を以下のように変更します

restart-script: make start

これによって以下のコマンドでサーバーが起動できるようになります.
実際に実行してみましょう

make start

起動したサーバーに接続してみる

起動したサーバーに接続します.
この時ポート開放は各自で調べてもらうとして,
Macであれば以下のコードでローカルIPアドレスが確認でき,これをマルチプレイのサーバーアドレスとして入力することで接続できます.

プラグインをビルドして追加する

軽く自作プラグインのビルド方法(実際にゲームに追加)を説明します.
intelliJ IDEAでプラグインのプロジェクトファイルを開き,<プロジェクト名>.javaに以下のようなコードを実装しましょう.これがメイン関数で,サーバーを起動したらonEnable関数が実行され,終了時にonDisable関数が実行されます.

package com.exmaple.fireEscape;

import org.bukkit.plugin.java.JavaPlugin;
import net.minecraft.server.v1_16_R3.EntityPlayer;


public final class FireEscape extends JavaPlugin {

    @Override
    public void onEnable() {
        // Plugin startup logic
        getLogger().info("プラグインが起動しました.");
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }
}

その次に,ターミナルでカレントディレクトリをプロジェクトのルードディレクトリに移動した上で,以下のコマンドを実行します

mvn clean package

これによって実装したプラグインがビルドされます.
おそらくプロジェクトのディレクトリ構造は以下のような形式になっていると思います.

project-root/
├── src/
│   ├── main/
│   │   ├── java/           # プラグインの Java コード
│   │   ├── resources/      # plugin.yml などのリソースファイル
│   │       ├── plugin.yml
│ 
├── target
│   ├── jarファイル
│   ├── ...
│ 
├── pom.xml                 # Maven のプロジェクトファイル

次にtargetディレクトリ内に作成された2つのjarファイルのうち,名前にoriginalとついてない方のjarファイルを,サーバーのルートディレクトリに存在するpluginsディレクトリ直下に移動させます.

最後にmake startでサーバーを起動して,ログに"プラグインが起動しました"という文字が表示されたら成功です!

外伝:NMS (Net Minecraft Server) クラスを使う

NMSクラスはMinecraftサーバーの内部コードを直接操作するものです,
spigotサーバー単体ではMobの細かい挙動などを実装するのは骨が折れますが,NMSを使うことで結構簡単に実装することができます.
上記の説明で既に前準備は整ってますので,どうせなら最後まで環境を用意しましょう.
プロジェクトディレクトリに存在するpom.xmlの依存関係の部分を以下のように書き換えます.

<dependencies>
  <!-- Spigot API -->
  <dependency>
    <groupId>org.spigotmc</groupId>
    <artifactId>spigot</artifactId>
    <version>1.21.1-R0.1-SNAPSHOT</version>
    <scope>provided</scope>
  </dependency>

  <!-- CraftBukkit -->
  <dependency>
    <groupId>org.bukkit</groupId>
    <artifactId>craftbukkit</artifactId>
    <version>1.21.1-R0.1-SNAPSHOT</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

そしたらintelliJの右のメニューらからMavenを開いてリロードボタンを押しましょう.
ファイル -> プロジェクト構造 -> モジュール -> 依存関係にcraftbukkitなどが無事に追加できていれば成功です!

最後に

ここまできて気づきましたが,初期プロジェクトの時点でディレクトリ名にスペルミスがありますね.exampleがexmapleになってます.
もしかしたら意図的かもしれませんがどうなんでしょう?
あとNMSの多くのメソッドがリバースエンジニアリング対策として,クソみたいに短縮されたメソッド名(a(), N()のような)で実装されてるので,使いづらいことこの上ないですね.
とにかくお疲れ様でした.
質問があればお答えします.

参考


いいなと思ったら応援しよう!