【Minecraft】MOD入りサーバー向け自作ランチャー作成方法

## 目的
MOD入りサーバーを運営する上で、「クライアントにMODを導入してもらう」という手順がネックになる。
上記の手順を含む、MOD入りサーバー向けのランチャーを自作する。

## 方法
HeliosLauncherというランチャーをforkする形で実装する。
https://github.com/dscalzi/HeliosLauncher

ビルド時のパラメータ、サーバーのリソースを配置するだけで独自のランチャーが作れる。
以下のような機能を搭載している。
- ランチャーからサーバーへの接続時に、クライアントのMODの過不足をチェックし、適宜ダウンロードする
- 接続先サーバーの切り替え
- 起動時のパラメータ（メモリ等）設定
- サーバーのステータスのチェック、サーバーに接続しているユーザーの数もチェック可能
- クライアントサイドMODのon/offを任意で切り替える

### 0.準備
以下が必要となる。
- リソースの配布場所(S3等)
- ランチャー(インストーラ)の配布場所(サイト等)
- 固定IPのMinecraftサーバー

### 1.リソースの作成
クライアントにインストールするMODの一覧をリソースとして用意する。
MODのjarファイルを直接アップロードするのでなく、MODのインストール先を列挙したjsonファイル(以下`distribution.json`)をS3等にアップロードする。
以下のような形で、サーバーのIPや必要なモジュール(forge等)、MODをURL付きで列挙する。
```json
{
  "version": "1.0.0",
  "rss": "https://helios-files.geekcorner.eu.org/rss.xml",
  "discord": {
    "clientId": "1086936373057040395",
    "smallImageText": "Change me through Nebula",
    "smallImageKey": "big"
  },
  "servers": [
    {
      "id": "Demo-1.19.4",
      "name": "Demo (Minecraft 1.19.4)",
      "description": "Demo Running Minecraft 1.19.4 (Forge v45.0.9)",
      "icon": "https://helios-files.geekcorner.eu.org/servers/Demo-1.19.4/Demo-1.19.4.png",
      "version": "1.0.0",
      "address": "localhost:25565",
      "minecraftVersion": "1.19.4",
      "discord": {
        "shortId": "1.19.4 Demo",
        "largeImageKey": "https://raw.githubusercontent.com/dscalzi/HeliosLauncher/master/build/icon.png",
        "largeImageText": "forge-vanilla"
      },
      "mainServer": false,
      "autoconnect": false,
      "modules": [
        {
          "id": "net.minecraftforge:lowcodelanguage:1.19.4-45.0.9",
          "name": "Minecraft Forge (lowcodelanguage)",
          "type": "ForgeHosted",
          "classpath": true,
          "artifact": {
            "size": 7378,
            "MD5": "567726c42a1312962ffd96af646f227d",
            "url": "https://helios-files.geekcorner.eu.org/repo/lib/net/minecraftforge/lowcodelanguage/1.19.4-45.0.9/lowcodelanguage-1.19.4-45.0.9.jar"
          },
          "subModules": [
            {
              "id": "1.19.4-45.0.9",
              "name": "Minecraft Forge (version.json)",
              "type": "VersionManifest",
              "artifact": {
                "size": 15497,
                "MD5": "97924bf1d3bf6f2bc4acc5662a7fecc0",
                "url": "https://helios-files.geekcorner.eu.org/repo/versions/1.19.4-forge-45.0.9/1.19.4-forge-45.0.9.json"
              }
            },
```
手動で作成することもできるが、HeliosLauncherの作者がdistribution.jsonの作成ツールも作ってくれているので活用する。
Nebulaは、ローカルにあるMODファイルを参照してdistribution.jsonを作成してくれるツール。

以下をcloneし、`npm i`
https://github.com/dscalzi/Nebula

jdkを任意のフォルダにダウンロードし、以下の通りに`.env`ファイルを編集する。
`JAVA_EXECUTABLE`に記述、`ROOT`にはMODのjarファイル等をおくための作業フォルダを指定する。下2つはそのままでもOK。
```
JAVA_EXECUTABLE=C:\Program Files\Eclipse Adoptium\jdk-17.0.12.7-hotspot\bin\java.exe
ROOT=D:\TestRoot2
BASE_URL=http://localhost:8080/
HELIOS_DATA_FOLDER=C:\Users\user\AppData\Roaming\Helios Launcher
```

Nebulaのルートで以下を実行。ROOTに作業環境が作成される。
※powershell や vscode だとバグでMODバージョンが認識されないためcmd推奨
```
npm start -- init root
npm start -- generate server [server name] [Minecraft Version eg 1.12.2] --forge [forge version eg 14.23.5.2859]
```

作成された、`作業環境\servers\{server name}`下によしなにMODファイル等を配置する。
※ファイル名に「+」が入っていると、リソース取得時のURLで「%2B」に変換されてしまうので、あらかじめほかの文字に変更すること推奨
Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace "\+", "-" }
（fabric は ROOT\repo\lib\net\fabricmc\sponge-mixin\0.15.4+mixin.0.8.7 が生成されるので手動でｓ）
配置が完了したら、以下を実行。distribution.json が作成される。
```
npm start -- generate distro
```

作業環境ごとリソースの配布先にアップロードし、準備は完了。

### 2.ランチャーの作成
同じく以下をcloneし、`npm i`
https://github.com/dscalzi/HeliosLauncher

`/app/assets/js/distromanager.js`の`exports.REMOTE_DISTRO_URL =`にリソースのdistribution.jsonのURLを指定。

アイコンや起動時の細かい設定等をお好みで編集。

HeliosLaunherのルートで`npm run dist`を実行し、ビルド。
インストーラを作成し、配布する。

## 参考
正直こちらの動画の方がわかりやすいです。
手順いくつか飛ばしているので、時間ある時に直します。

Helios Launcher Tutorial
https://www.youtube.com/watch?v=YgB9Itp3gzY