Minecraft Modを作る拡張機能の紹介 - Minecraft Mod Developer Pack


# 前書き
枠が空いていたので、エントリしました！
昨年、minecraftがMicrosoftのものになって、**~~minecraftsweeperができるのかと思っｔ~~**
Microsoft Azure上に公式のデプロイイメージができたり、
VisualStudioの拡張機能にMod開発パックが作られたりと。

そんなところで、拡張機能でデバ・・・までを紹介します。
環境は、VisualStudio2015Pro Update1です。

紹介といっても、奮闘に近いものがありますので、温かく応援しながら読んでください。

# 拡張機能のインストール

検索でminecraftと入力
**Minecraft Mod Developer Pack**
を入れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/da4de8b1-48a2-b235-aadd-3cdcb00ce9a1.png)

サイズはそれなりに大きいので時間かかります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/250a8506-ceb3-e1e1-193c-b20c6c177f7c.png)


インストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/c7b4e75e-916e-f448-0271-ea5d78a89c92.png)

# プロジェクトの新規作成（プロジェクトテンプレート）

Javaが追加され、その中にMinecraftForge Mod のテンプレートが追加されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/6e433e05-b0bf-0faf-f513-61865d8a8ca0.png)

何やらメッセージが・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/7319eb61-16cb-9df9-214d-25984a423917.png)

プロジェクトを新規作成したあと、必要なリソースを裏でダウンロードしているようです。
これを待たないと、何もできません。（結構かかる）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/9f3b77f5-6e52-d9eb-6261-be8bd8309d43.png)

# ビルド！！失敗
落ち着いたら、ビルドします。

```shell-session:出力ウィンドウ
C:\Source\MinecraftMod1\MinecraftMod1\packages\com.microsoft.minecraftmod.0.5.4.0\build\com.microsoft.minecraftmod.targets(10,5): error MSB3073: コマンド "gradlew setupDecompWorkspace --refresh-dependencies" はコード 1 で終了しました。
プロジェクト "MinecraftMod1.javaproj" のビルドが終了しました -- 失敗。

========== ビルド: 正常終了または最新の状態 0、失敗 1、スキップ 0 ==========
File not found: .classpath. A provisioning build needs to complete successfully first
```

なんか失敗してます。
setupDecompWorkspace --refresh-dependencies
でエラーということで、依存するものを解決（ダウンロードか何か）できなかったんじゃないかーと。
こんなときはもう一度ビルド。

・・・**うん、だめだ。**

## 原因 はJDKが入っていないこと！
公開ページを確認
[Minecraft Mod Developer Pack](https://visualstudiogallery.msdn.microsoft.com/043ab247-8771-4bb1-92af-d76e542724ad?SRC=VSIDE)
あ、OS入れ替えてから**JDK入れてなかった！**
それは動かないだろうということで、[インストール](http://www.oracle.com/technetwork/java/javase/downloads/index.html)。
Minecraft Mod Developer Packは、x64のみサポートということで、x64のものを入れた。

## 再ビルド
再度、ビルド

```shell-session:出力
------ ビルド開始: プロジェクト:MinecraftMod1, 構成:DebugClient Any CPU ------
	Setting up MinecraftForge workspace... (this may take a while but it's a one-time build)
	Note: This extension will download and build third party packages. Each third party package is licensed to you by its owner. Microsoft is not responsible for, nor does it grant any licenses to, third-party packages. 
	============================================================
	gradlew setupDecompWorkspace --refresh-dependencies
	****************************
	 Powered By MCP:             
	 http://modcoderpack.com/    
	 Searge, ProfMobius, Fesh0r, 
	 R4wk, ZeuX, IngisKahn, bspkrs
	 MCP Data version : snapshot_20141130
	****************************
	:extractMcpData UP-TO-DATE
	:getVersionJson
	:extractUserDev UP-TO-DATE
	:genSrgs SKIPPED
	:extractNatives UP-TO-DATE
	:getAssetsIndex
	:getAssets
	:makeStart
	[ant:javac] �x��: [options] �u�[�g�X�g���b�v�E�N���X�p�X��-source 1.6�ƈꏏ�ɐݒ肳��Ă��܂���
	[ant:javac] �x��1��
	:downloadMcpTools
	:downloadClient
	:downloadServer
	:mergeJars
	:deobfuscateJar
	Applying SpecialSource...
	Applying Exceptor...
```

よしよし、いい感じ。
*文字とか化けてるけど気にしない。*
**ところが・・・**

```shell-session:出力
	Importing references:
	Importing references:
	C:/Users/[user]/.gradle/caches/minecraft/net/minecraftforge/forge/1.8-11.14.1.1357/snapshot/20141130/forgeSrc-1.8-11.14.1.1357.jar;C:/Users/[user]/.gradle/caches/modules-2/files-2.1/net.minecraft/launchwrapper/1.11/9c0592c6e1e9ea296a70948081bd4cc84dda1289/launchwrapper-1.11.jar;
(中略)
プロジェクト "MinecraftMod1.javaproj" のビルドが終了しました -- 失敗。

ビルドに失敗しました。
========== ビルド: 正常終了または最新の状態 0、失敗 1、スキップ 0 ==========
```


***ビルドに失敗しました。***
また、失敗。
ただ、今度は自分のプロジェクト内のものでエラーが出てるようす。
勢いあまって、ここを書き換えてしまったのが問題
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/ce5931df-92d2-3b52-7002-fd8a5c274763.png)


今度はこんなエラー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/d7049eb2-9606-ab7a-8c7b-4984eea1a60a.png)

正直、英語はよく読めない。
クラス名の指定を、プロジェクトのプロパティのデバッグタブでやってね。
みたいなことを言われている気がする。

ここに`ExampleMod`を入れてみるが、当然動かない。
そもそも、Modのエントリポイントであって、デバッグのエントリポイントではないだろう。

## 手詰まりか？
さて・・・テンプレートを私が壊してしまった可能性があるので、もう一度プロジェクトを作ってみようと思う。
というのも、JDKが入らない状態で、正しくプロジェクトが作られていない可能性を疑ってみた。

これが、最初から作っていたプロジェクトで、リファレンスが一切出ていない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/627ace23-df3c-e157-14ca-a86e513d9e30.png)

改めて作ったプロジェクトでは、ちゃんとリファレンスが出ている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/75987254-0e1e-05de-10fe-2e35942629f2.png)

# ビルド成功！！
というわけで、改めてリビルド！

```shell-session:出力
------ すべてのリビルド開始: プロジェクト:MinecraftMod2, 構成:DebugClient Any CPU ------
	Importing references:
（中略）
	C:\Program Files\Java\jdk1.8.0_66\bin\jar.exe cf obj/DebugClient/MinecraftMod2.jar -C src/main/resources/ mcmod.info
	MinecraftMod2 -> C:\Source\MinecraftMod1\MinecraftMod1\MinecraftMod2\bin\mods\MinecraftMod2.jar
========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========
```

今度はこれをデバッグ実行してみようと思う。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/c0560436-5a2e-b17b-5eff-60aaee617b2a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/271d0971-baf0-a9c8-b27f-ab1eed1d33a8.png)

無事に動いた！！

# デバッグ・・・読み込まれず
これは、Javaのコード。Modのエントリポイントのようなものだ。
コードを１行加えて、ブレークポイントを張ってみた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/f9ced740-197d-cb40-c324-8d4903fb8eab.png)

デバッグ開始！しかしながら、、、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/0f7911f0-d962-8c49-8a78-4ae81336be3c.png)

となり、クラスが読み込まれていない。

ここに関して
偉大なる先人がいらっしゃった。
[Visual Studio の拡張機能 Minecraft Mod Developer Pack について ](http://miso-soup3.hateblo.jp/entry/2015/07/21/150308)

どうやら、そこではデバッグ開始時にModが読み込まれてないという内容。


改めて、自分のデバッグしているものが出力しているものを見てみた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/d191e346-548b-b1ae-6ce2-d0c286edd4ba.png)

ここに、MinecraftMod2.jarを読み込んだが、modファイルとして認識できないぞーという内容と思われるものが出ている。


## VisualStudioじゃない開発方法をのぞいてみる

ここまでくるとVisualStudioがどうしたというよりもMinecraftForgeとかそういう話になってくるので、
[MinecraftForge導入手順](http://minecraftjp.info/modding/index.php/MinecraftForge%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86)
を参考にさせていただきました。

というわけで、シェルから起動した。

```ps1:Shell
call gradlew runClient
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/f053f1c6-1903-e682-cbb7-f5803f25f6ce.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/17d9da87-57e4-fb35-0e95-f2d04bfe505a.png)


コマンドラインでやると、認識できているという。

どうやら、出来上がった**.jarの中にClassファイルがいないようだ。**

VisualStudioのもの
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/73e9dcbc-f43a-6f93-cbbb-f753a65edb9f.png)
shellのもの
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/1b7b8b22-1bae-1c0f-7b16-f643bc2d0f90.png)


試しに、shellから起動したときに出来上がった
modid-1.0.jarを、
bin\mods\modid-1.0.jarに配置してみたところ、読み込むことができた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/b7e10c77-bed7-5419-3a1c-1f2e15ec984a.png)


## Java Language support？
・・・・そうなると、、、、。
**Minecraft Mod Developer Pack**の依存している
**[Java Language support](https://visualstudiogallery.msdn.microsoft.com/bc561769-36ff-4a40-9504-e266e8706f93/)**ではないか？ということで。
単純なコンソールアプリケーションを作ってみた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/4206de81-f734-657e-2ff8-6e85bde4603e.png)
テンプレートのままでもエラーとなる。
どうやら、Minecraft Mod Developer Packが原因ではなさそう。
というのも、Minecraft Mod Developer Packのビルドで問題だったのは、Classファイルがなかったこと。
この依存している**Java Language support**そもそもうまくいっていないと考えた。

msbuild単体で見た時には、CoreCompile、CoreCreatePackageという二つが省略となっている。
エラーでは、objにJARがなくてbinにコピーできないと。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/f01ab073-1897-f029-9a27-b6a2ee870d9c.png)

さて・・・・どうしたもんだろうか
色々調べてみたものの、プロジェクト設定からビルドの中で、jarファイルを生成させるための手法を見つけられず。
このソースがあるGitHubリポジトリを覗いてみた。

https://github.com/tunnelvisionlabs/JavaForVS/issues/36
というところで、既にこんなissuesもあった。

ここにあるように、CoreCompileをターゲットとした場合、
JARは作られるが、ビルドタスクのごく一部のみとなるので
ちゃんとした流れにならない。

現在、更新は行われていない様子。


ここまでくると、*.targetsファイルを直すとかそういう方法になってきそうな気がしています。
`CoreCompile`を動かすだけなら・・・

```xml:Tvl.Jvm.Common.targets
  <Target Name="_ComputeNonExistentFileProperty" Condition="('$(BuildingInsideVisualStudio)' == 'true') and (('$(BuildingProject)' == 'false') or ('$(UseHostCompilerIfAvailable)' == 'true'))">
  <Target Name="_ComputeNonExistentFileProperty" Condition="true">
```

おそらく、この後にJARを生成する部分は、`CoreCreatePackage`と思われる。
今も試行錯誤中...

# 最後
Minecraft Modを作る拡張機能の紹介・・・デバッグしたかった話でしたOTL
*要するに間に合わなかった*
動かし方は、今後も調べてみようと思っています。
また、何かご存知の方教えてください。
わかり次第、この記事に追記します。

最後まで読んでいただきましてありがとうございます。


# 2015-12-09 追記

手っ取り早い方法を発見。
既定の言語を英語にしてしまう。
これだと、先日したようなパッチは不要です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/c1e125d5-fcbf-9023-08ad-b786a6578fdb.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/b67674c7-b81a-ec39-71ab-46947b096a7c.png)

デバッグもできたよー！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/38844000-7588-f8a8-e939-56ad8d08c51c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58908/ad71ab29-619a-9976-2064-d9914af29732.png)


なんでかは、javac.exeのコマンドライン出力の前提に影響していると思われる。
ただ、納得いかないので日本語でもできるようにしたいなぁと思う。
ハックっぽくなるけど、やっぱり、継続中…