移植LunaChat的故事(上篇)

LunaChat是一个用于Minecraft(Spigot服务器)的插件,主要用于罗马字汉字转换。由于需要将私人服务器迁移到Fabric上,我们收到了移植此插件的请求,因此我们进行了移植工作。

LunaChat 的目标和规格

MinecraftのJava版は、CJK対応が不安定で、チャット入力は多くの場合ローマ字で行われます。ローマ字で送信されたチャットメッセージを漢字に自動で変換するのが、LunaChatの主な機能です。LunaChatは、かな漢字変換以外にもチャンネルチャットなど様々な機能を有していますが、全部の機能を実装するのは大変で、ローマ字漢字変換以外は不要なので、これだけ実装することにしました。

LunaChat的罗马字汉字转换主要由以下部分组成:

    • 変換不要な場合(漢字やひらがなが含まれている場合)か確認する

 

    • ローマ字からカナに変換

 

    かな漢字変換

在日文漢字轉換方面,有著多種方法可供選擇(如:使用MeCab,依賴操作系統的輸入法等)。然而,在LunaChat的情況下,我們採用了一種名為「使用Google翻譯」的秘技方法。

织物的基础知识

Fabric是Minecraft的一种Mod类型,在与Forge并列的同时广泛使用。主要针对Java版1.14及以上版本,并且几乎可在所有快照版本中使用。

Fabricは、主に「Modローダー」と「API」の2つによって構成されていますが、Fabric APIは多くのMod開発には不要で、多くの場合Modは代わりに「Mixin」という技術を使って、元のソースコードをモンキーパッチするような感覚で開発されています。また、Fabric APIの中身もブロックの追加など簡単なもので、これ以上のことはMod開発者に放り投げています。こうしたことから、ForgeやSpigotと比べFabricの更新は非常に早く(多くの場合でリリースから数時間以内)、スナップショット版での開発には適しています。

此外,与支持插件的Spigot相比,Fabric可以在客户端上使用,并且不包含任何最低限度所需的修补程序(例如修复物品繁殖错误)的特点。

移植 – (transplant)

环境的规划和建设

以下是在Windows机器上工作。在Linux系统上可能存在Java安装和Gradle操作等方面的差异。

Gitをインストールします。また、Java 16(1.17.1用の開発に必要な最低バージョン)かJava 17の64ビット版を、OpenJDKのビルドの一種Eclipse Temurinの配布サイトからダウンロード・インストールします。PATH環境変数とJAVA_HOME環境変数を設定します。また、デコンパイル過程で使うためJava 8も同ウェブサイトからインストールしますが、こちらは環境変数の設定をしません。デコンパイラーとして、Java Decompilerのjarファイルをダウンロードし、Java 8で開くようショートカットを作ります。

"C:\(Java 8のインストール先)\bin\javaw.exe" -jar "C:\Users\user\Downloads\jd-gui-1.6.6-min.jar"

最後に、MinecraftのModを開発するために便利なランチャーを設定します。Java版のランチャーには、公式のもののほかに、サードパーティーのものが複数あります。今回は、メモリ使用量が公式のものに比べて特段に低く、Modサポートが良いことから、MultiMCランチャーを使います。

公式ウェブサイトからダウンロードし、解凍して実行すると、画面が現れます。「Settings」(設定)をクリックして「Language」タブを表示し、日本語を選択します。その後「アカウント」タブで、アカウントを追加できます。Microsoftアカウントを使用してログインする場合は「Add Microsoft」を押し、リンクをクリックしてMultiMCの画面上に現れたコードを入力し、指示に従います。Microsoftアカウントに移行していない場合は、「Add Mojang」をクリックして、メールアドレスとパスワードでログインします。

关闭设置,点击”添加实例”。在”名称”中输入适当的值,比如”Mod开发”,选择版本1.17.1并点击”确定”。添加了图标后,右键点击并选择”编辑实例”。屏幕右侧会出现”安装Fabric”按钮,点击并再次点击”确定”。至此,MultiMC的设置已完成。

请随个人喜好选择IDE(如nano或Sakura Editor等文本编辑器均可)。如果使用IntelliJ IDEA,请推荐安装Minecraft Development插件。

可以重复使用的代码

「确认是否包含汉字和平假名」和「从罗马字转换为假名」的代码可以重复使用LunaChat的同样代码。

阅读代码

现在,Fabric中没有与聊天相关的API。因此,需要使用Mixin来编写转换聊天内容的部分。最简单的方法是对Minecraft进行反编译并阅读源代码。然而,所分发的Minecraft jar文件已经经过了混淆处理,因此需要解码它。为此,Fabric通过CC0提供了解码所需的文件,首先在Git上下载它们。

$ git clone --depth 1 --branch 1.17.1 https://github.com/FabricMC/yarn.git

随后,将解除混淆处理。由于需要大量的内存(至少2GB),请注意。由于Gradle守护进程在未来一段时间内将不再需要,将其关闭。

$ cd yarn
$ gradlew --no-daemon mapNamedJar

会生成一些文件,但我只想要反编译1.17.1-named.jar文件。打开Java反编译器,并将此文件拖放进去。

1.17.1-named.jar内のファイル構造

这个文件结构与Forge或Spigot所使用的解码文件许可证有所不同,但由于本次无关紧要,我们可以忽略它。

Minecraftは数千個のクラスファイルから構成されていますが、解読されたときにパッケージが割り当てられたため、ある程度分かりやすくなっています。net.minecraft以下では、block、entity、itemといった自明なものから(CandleBlockやCompassItemを探してみましょう)、NBTを定義するnbtパッケージ、パケットやその暗号化と圧縮を扱うnetworkパッケージ、サーバー側でのチェストの画面などを管理するscreenパッケージといったものまでさまざまあります。また、クライアント側にのみ存在するレンダリングなどのコードはclientパッケージに、サーバー側に関係するコードはserverパッケージにまとめられています。

チャットの処理はサーバー側がパケットを受信したときに行いたいので、serverパッケージを見てみましょう。その中のnetworkパッケージには、ServerPlayNetworkHandlerというクラスがあります。このクラスは、(その名の通り)サーバーでパケットが受信されたときのハンドラーを定義しています。chatで検索すると、onGameMessageというイベントハンドラーと、その中で呼び出されているhandleMessageメソッドが見つかりました。handleMessageの中にはコマンドを実行するコードや、チャットメッセージをプレイヤーに送信するコードがあります。注目したいのは、1211行目のPlayerManager#broadcastメソッドの呼び出しです。ここを乗っ取ってみましょう。

开始开发Mod。

といっても、まず実際のModの開発を始めなければ何もできません。「fabric-example-mod」というテンプレートが提供されているので、これを使ってみます。GitHub上の「Use this template」ボタンを押して自分のアカウントにコピーします。

$ git clone https://github.com/apple502j/kanaify.git
$ cd kanaify

接下来,我们将更新一些文件。

gradle.propertiesでは、maven_groupを適当な値(私はGitHub PagesのURL、io.github.apple502jを使用)に設定し、archives_base_nameにMod ID(以下参照。ここではkanaifyとしました)を設定します。

LICENSEファイルは削除するか、好みのライセンスを選んで置き換えます。LGPLか、Apache 2.0ライセンスを使用するのが無難です。

README.mdは、後で更新しても、いま更新しても大丈夫です。

src/main/java以下のフォルダーとファイルは(後で書きなおすので)削除します。

src/main/resources/modid.mod.jsonのファイル名中、modidを自分のMod IDに変更します。また、ファイル中net.fabricmc.example.mixinを(maven_groupの値).(Mod ID).mixinに変更します。

fabric.mod.jsonは大事なファイルなので、次の一章を割いて解説します。

assets/modid/icon.pngは、フォルダーを改名して、必要に応じてアイコンを置き換えます。サイズは縦横128px。

根据本地化需求简述以下内容:fabric.mod.json

这个文件是用来写关于Mod的信息。

idは、Mod IDです。半角英小文字で始まり、その後は半角英小文字、数字、ハイフン、アンダースコアを利用できます。最大で64文字です。

nameは、ユーザーが多くの場合に目にする、Modの名前です。

descriptionは、Modの簡単な説明です。

authorsは、Modの制作者名の配列です。個人開発の場合は[“ユーザー名”]などで大丈夫です。

contactでは、sourcesにGitHubリポジトリのURLを、homepageにMod配布ページや作成者のウェブサイトなどへのリンクを書くことができますが、任意なので、”contact”キーごと消して大丈夫です。

licenseは、ライセンスの識別子、たとえばLGPL-3.0やApache-2.0です。

iconには、さっき作ったアイコンのfabric.mod.jsonからの相対パスを指定します。多くの場合はassets/(Mod ID)/icon.pngです。

dependsでは、依存関係を指定します。”fabric”とはFabric APIのことで、今回は使わないため消しておきます。その他は変更する必要はありません。

suggestsは不要なので消しておきます。
残りは後で埋めます。

明天会在下一篇内容中继续阐述!

广告
将在 10 秒后关闭
bannerAds