Minecraft Forge 1.12.2-14.23.5.2855を導入したときのログ

# 背景

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
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/3566dbee-7bb5-e5d1-bc73-cc6b71e5fc7d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/6cfff85f-6137-ac91-e9dd-f479fd803795.png)

余談：Forgeの公式サイトがいつの間にかHTTPSに移行しており、古いインストーラーは動作しなくなった模様。

## 展開

展開すると色々入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/94fe4ac8-48b9-dbb5-dcbb-8965cb30ed01.png)

`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/

```bash:gradlew.batへの変更を無視するようにするbashコマンド（WSL）
$ git update-index --skip-worktree gradlew.bat
```

```bash:gradlew.batへの変更を無視する状態を元に戻すbashコマンド（WSL）
$ 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/

Eclipseでインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/debd6b0a-27a5-98fb-4b26-e0b6467f2437.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/af16cb4f-522b-1131-c3a7-45137b3f7e21.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/cde27157-365c-362f-dbfd-1db17ba0b7ba.png)

プロジェクトを右クリックして、象のアイコンのGradleプラグイン（buildship）を有効化します。この手順は実は要らないかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/43e58bb4-af44-3931-7882-a6aa195acd9b.png)

# Eclipseからの起動

## MC_VERSIONの設定

`runClient.launch`をEclipse上で右クリックして実行しようとすると、次のように怒られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/6a1989a0-5065-3499-eb27-e062050a628e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/fb4656ec-745c-6848-32db-4803c10761c3.png)

----

これは`runClient.launch`を次のように手作業で書き換えるとうまくいくようです。
これは`runServer.launch`でも同様です。

```diff
- <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

https://stackoverflow.com/questions/62507304/how-to-solve-error-given-by-eclipse-on-running-runclient

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12229915712

## クライアントの起動

ここまでくるとクライアントを起動できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/09467724-1b19-1df1-201a-7ac1ecd3f7ab.png)

## サーバーの起動

サーバーサイドを起動するには、`eula.txt`の`eula`が`true`である必要があります。

----

サーバーを一度起動しようとすると`eula.txt`が生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/0050a149-7c4d-69e1-8d5e-dd946a6f837a.png)

これはここに記述されている指示に従ってください。

```
#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
```

https://account.mojang.com/documents/minecraft_eula

----

eulaが解決されていればサーバーは起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/8ced3357-9274-926a-11cb-e8ca7dd52059.png)

## Eclipseからの編集内容をリアルタイムで反映させられるようにする

Javaプログラムが動いているときにEclipseがJavaコードをコンパイルすると実行中にプログラムが書き換えられる奴を有効にします。

それには、「ソース・フォルダーごとに出力フォルダーの指定を可能にする」をオフにすると、なぜかうまくいきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/35926341-ea19-06d8-8e7f-5c6e725a496b.png)

なお、これでも一部のコードはリアルタイムで反映されません（SideOnlyがあるクラスは同期できない？EventBusに登録したクラスは同期できない？）。

# Moddingに便利なMinecraft上の操作

## サーバーのプロパティを変える

テスト用のサーバーではコマンドブロックを有効、オンラインモードを無効にしたりするのがよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/6869b290-bd3f-8436-650a-7afb25aa6da8.png)

```diff
- online-mode=true
+ online-mode=false
- enable-command-block=false
+ enable-command-block=true
```

オンラインモードが有効なままだと、Minecraftアカウントを複数持っていなければオンラインで複数のプレイヤーが関わる機能のテストができません。
オンラインモードを無効にすると認証していないユーザーがログインできるので、一人でデバッグができます。

コマンドブロックはここで設定しなければ使いたいときに「動かないぞ！」ってなります。

## ローカルホスト上に建っているサーバーに入る

サーバーを起動するとデフォルトで`localhost:25565`というアドレスに出現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/5ec0238d-dbda-3f60-b5dc-a000647d850b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/d4de7e2c-ce06-ca7f-342b-d3b30f2fd160.png)

----

サーバーのポートは`server.properties`で変更できます。

```diff
- server-port=25565
+ server-port=12345
```

## アカウントにログインする

runClientで起動するMinecraftクライアントでMinecraftアカウントにログインしたい場合、次のように実行の構成を書き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/073e51df-35bf-6bb3-fb9d-e743b4116eb9.png)

これは`runClient.launch`を直接書き換えてもよいです。

```diff
      <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`を指定しなければ認証しない状態でユーザー名だけを固定化できます（間違ったパスワードを指定した場合はエラーになる）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/569c3b6e-dc99-ceb9-9af5-76a64e7d86a0.png)

----

その他、`--uuid`でUUIDも設定可能であることが`net.minecraftforge.fml.common.launcher.Yggdrasil`に書かれています。

```java
≪前略≫
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
```

----

成果物は`build\libs`内に出現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/5ce4db08-9f61-9bef-7824-ca2d74e7bd1d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/c87e4cb3-c166-7028-9441-faf68bcb12db.png)

## GitHub Actionsでの自動化

高頻度で成果物をリリースしたければ、GitHub Actionsなどで自動化するのが良いです。

----

これはこの記事を書いたときに作った自動化です（参考）。
https://github.com/MirrgieRiana/MirageFairy2019/blob/master/.github/workflows/release.yml