背景
forge-1.12.2-14.23.5.2768の上でModdingをしていたけど、いつの間にかめっちゃ古くなっていることが分かったので、forge-1.12.2-14.23.5.2855に切り替えることにしました。
これはその時の備忘録です。
環境
- Windows 10
- Eclipse
- Java 8
- Minecraft 1.12.2
- Minecraft Forge 1.12.2-14.23.5.2855
環境の配置
MDKのダウンロード
ここから14.23.5.2855 Mdkを得ます。
https://files.minecraftforge.net/net/minecraftforge/forge/index_1.12.2.html
余談:Forgeの公式サイトがいつの間にかHTTPSに移行しており、古いインストーラーは動作しなくなった模様。
展開
README.txt
にはModdingの上でいろいろと技術的に重要なことが書いてあります。
環境のセットアップ
Eclipseプロジェクトの作成手順
以下はREADME.txt
にある記述を抜粋し、意訳したものです。
1. "gradlew genEclipseRuns"を実行する
2. "gradlew eclipse"でEclipseプロジェクトを作成する
3. runClientとrunServerのMOD_CLASSESをto show [modid]%%[Path]; 2 times rather then the generated 4.のように書き換える(よくわからない)
もしIDEでライブラリが見つからないとか出た場合は、
"gradlew --refresh-dependencies"
でローカルキャッシュを更新してみてください。
"gradlew clean"はソースコード以外のすべてを初期化します。
gradlewの実行に使うJavaの指定
gradlew
コマンドを実行するにはJavaがインストールされている(javaコマンドが通るかJAVA_HOME環境変数が設定されている場合?)必要があります。
次のようにgradlew.bat
の先頭にJavaホームへのローカルパスを指定すると、そのファイル以外の場所に変更を加えずに無理やりjavaを認識させることができます。
set JAVA_HOME=D:\eclipse\pleiades-2020-12-java-win-64bit-jre_20201222\pleiades\java\8
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
≪以下略≫
この改変されたgradlew.bat
をgitに取り込みたくない場合、次のようにするとgitがこのファイルを認知しなくなります。
https://riotz.works/articles/lulzneko/2019/07/14/temporarily-ignore-change-tracking-for-files-managed-by-git/
$ git update-index --skip-worktree gradlew.bat
$ git update-index --no-skip-worktree gradlew.bat
Windowsでgitを扱う場合、改行コードを自動的に変換するautocrlf
オプションの設定に気を付けてください。
特にシェルスクリプトとバッチファイルが共存するgradlew
は相性が悪いです。
GitHub Desktopの場合、それ用のgitの設定ファイルを参照していることがあります(よくわからないけど、リポジトリ固有の設定が効かない場合がある?)。
それは次の場所にあります。
C:\Users\【Windowsユーザー名】\AppData\Local\GitHubDesktop\app-~~\resources\app\git\etc\gitconfig
Eclipseで読み込み
Eclipseプロジェクトの作成
ここは特に何も問題は起きませんでした。
> gradlew genEclipseRuns
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradlDaemon will be stopped at the end of the build stopping after processing
> Configure project :
New Dep: net.minecraftforge:forge:1.12.2-14.23.5.2855_mapped_snapshot_20171003-1.12
> Task :extractNatives
Downloading: https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.4-nightly-20150209/lwjgl-platform-2.9.4-nightly-20150209-natives-windows.jar
Downloading: https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.2-nightly-20140822/lwjgl-platform-2.9.2-nightly-20140822-natives-windows.jar
Downloading: https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar
Downloading: https://libraries.minecraft.net/com/mojang/text2speech/1.10.3/text2speech-1.10.3-natives-windows.jar
Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/4.9/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 39s
8 actionable tasks: 8 executed
> gradlew eclipse
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/4.9/userguide/gradle_daemon.html.
Daemon will be stopped at the end of the build stopping after processing
> Configure project :
New Dep: net.minecraftforge:forge:1.12.2-14.23.5.2855_mapped_snapshot_20171003-1.12
Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/4.9/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 9s
10 actionable tasks: 6 executed, 4 up-to-date
Eclipseでインポート
ここでは特に何も弄っていないPleiades Eclipseを使います。
https://mergedoc.osdn.jp/
プロジェクトを右クリックして、象のアイコンのGradleプラグイン(buildship)を有効化します。この手順は実は要らないかもしれません。
Eclipseからの起動
MC_VERSIONの設定
runClient.launch
をEclipse上で右クリックして実行しようとすると、次のように怒られます。
これはrunClient.launch
を次のように手作業で書き換えるとうまくいくようです。
これはrunServer.launch
でも同様です。
- <mapEntry key="MC_VERSION" value="${MC_VERSION}"/>
+ <mapEntry key="MC_VERSION" value="1.12.2"/>
いかにもオプションで自動的に出力されそうな見た目ですが、検索したところなんかみんな手動で書き換えてるっぽいです。
I just needed to change the variable value of MC_VERSION in my runClient launch file
クライアントの起動
ここまでくるとクライアントを起動できるようになります。
サーバーの起動
サーバーサイドを起動するには、eula.txt
のeula
がtrue
である必要があります。
サーバーを一度起動しようとするとeula.txt
が生成されます。
これはここに記述されている指示に従ってください。
# By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
# Fri Jun 04 22:50:25 GMT+09:00 2021
eula=false
eulaが解決されていればサーバーは起動できます。
Eclipseからの編集内容をリアルタイムで反映させられるようにする
Javaプログラムが動いているときにEclipseがJavaコードをコンパイルすると実行中にプログラムが書き換えられる奴を有効にします。
それには、「ソース・フォルダーごとに出力フォルダーの指定を可能にする」をオフにすると、なぜかうまくいきました。
なお、これでも一部のコードはリアルタイムで反映されません(SideOnlyがあるクラスは同期できない?EventBusに登録したクラスは同期できない?)。
Moddingに便利なMinecraft上の操作
サーバーのプロパティを変える
テスト用のサーバーではコマンドブロックを有効、オンラインモードを無効にしたりするのがよいでしょう。
- online-mode=true
+ online-mode=false
- enable-command-block=false
+ enable-command-block=true
オンラインモードが有効なままだと、Minecraftアカウントを複数持っていなければオンラインで複数のプレイヤーが関わる機能のテストができません。
オンラインモードを無効にすると認証していないユーザーがログインできるので、一人でデバッグができます。
コマンドブロックはここで設定しなければ使いたいときに「動かないぞ!」ってなります。
ローカルホスト上に建っているサーバーに入る
サーバーを起動するとデフォルトでlocalhost:25565
というアドレスに出現します。
サーバーのポートはserver.properties
で変更できます。
- server-port=25565
+ server-port=12345
アカウントにログインする
runClientで起動するMinecraftクライアントでMinecraftアカウントにログインしたい場合、次のように実行の構成を書き換えます。
これはrunClient.launch
を直接書き換えてもよいです。
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="net.minecraftforge.legacydev.MainClient"/>
+ <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--username メールアドレス等 --password パスワード"/>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.buildship.core.classpathprovider"/>
なお、--password
を指定しなければ認証しない状態でユーザー名だけを固定化できます(間違ったパスワードを指定した場合はエラーになる)。
その他、--uuid
でUUIDも設定可能であることがnet.minecraftforge.fml.common.launcher.Yggdrasil
に書かれています。
≪前略≫
public class Yggdrasil {
public static void login(Map<String, String> args) {
≪中略≫
args.put("--username", auth.getSelectedProfile().getName());
args.put("--uuid", auth.getSelectedProfile().getId().toString().replace("-", ""));
args.put("--accessToken", auth.getAuthenticatedToken());
args.put("--userProperties", auth.getUserProperties().toString());
}
}
OP化とかワールド設定とか
これらはModdingに便利なMinecraftコマンドのメモです。
次のコマンドでユーザーにop権限を与えます。
前述の方法で名前を固定化しない場合、起動ごとにプロファイルが変わってopを与え直す必要が生まれたり毎回インベントリが消えるなど、テスト用サーバー内での行動が色々面倒になります。
/op メールアドレス等
これは死亡時にアイテムや経験値をロストしない設定です。
/gamerule keepInventory true
これらは太陽の位置や天候が変わらなくなります。
/gamerule doDaylightCycle false
/gamerule doWeatherCycle false
これは太陽を真上にします。
/time set 6000
これは実行したプレイヤーの足の下に広大な石の足場を出現させます。
/fill ~-50 ~-1 ~-50 ~50 ~-1 ~50 minecraft:stone
ビルド
ビルドコマンド
ビルドもコマンドプロンプトで行います。
> gradlew build
D:\forge-1.12.2-14.23.5.2855-mdk>set JAVA_HOME=D:\eclipse\pleiades-2020-12-java-win-64bit-jre_20201222\pleiades\java\8
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/4.9/userguide/gradle_daemon.html.
Daemon will be stopped at the end of the build stopping after processing
> Configure project :
New Dep: net.minecraftforge:forge:1.12.2-14.23.5.2855_mapped_snapshot_20171003-1.12
Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/4.9/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 9s
7 actionable tasks: 6 executed, 1 up-to-date
GitHub Actionsでの自動化
高頻度で成果物をリリースしたければ、GitHub Actionsなどで自動化するのが良いです。
これはこの記事を書いたときに作った自動化です(参考)。
https://github.com/MirrgieRiana/MirageFairy2019/blob/master/.github/workflows/release.yml