miso_soup3 Blog

主に ASP.NET 関連について書いています。

Visual Studio の拡張機能 Minecraft Mod Developer Pack について

拡張機能、Visual Studio Minecraft Mod Developer Pack を触ったので作業を記録します。

現段階では、Visual Studio で Minecraft Mod 開発するにはバグ&躓く点が多く、私ではデバッグ実行からの Minecraft 起動(ただし作成した Mod は読み込めない)までしか行うことができませんでした(バグなのかやり方がまずいのかわからない)。不完全ですが手順を後述します。

I LOVE Visual Studio and Minecraft.

f:id:miso_soup3:20150722075645p:plain

f:id:miso_soup3:20150721210816j:plain

従来の方法、Eclipse における開発にて

まず、Visual Studio で行う前に Eclipse でやってみました、とても簡単にHello, World を行うことができましたし、Mod 開発を少し味わうことができました。参照したページは以下の通りです。特に躓くことなく30分ほどで最初の Mod を作成することができると思われます。

Visual Studio での開発について

Visual Studio で開発するには、次の 2 つの拡張機能が関わってくる(インストールが必要なのは Minecraft の方だけ)のですが、結構いろんな Issues に引っかかりました。

特にあれなのは、Minecraft Mod Developer Pack の Issues の対応が 5 月頭で止まっているところ。また、今は Java Language Support の方は Visual Studio 2015 でインテリセンスが動きません。

Visual Studio で Minecraft Mod 開発にトライ

ということで、不完全ですが手順を記載します。

環境
  • Windows 8.1 x64
  • Visual Studio 2015 RTM
  • Java SE Development Kit (JDK) for Windows x64 をインストール
    • (Minecraft Mod Developer Pack の必要環境。x64指定らしい。)

と、PCのユーザー名にスペースが入らないこと…。(Issue #21

JDK をインストール後、拡張機能のMinecraft Mod Developer Pack をインストールします。

f:id:miso_soup3:20150721145742p:plain

以下は必ず必要かはわかりませんが設定しました。

  • 環境変数のPath に「C:\Program Files\Java\jdk1.8.0_51\bin;」を追加。
  • 環境変数「JAVA_HOME」に「C:\Program Files\Java\jdk1.8.0_51」を追加。

プロジェクトの用意

Visual Studio 2015 のファイル>新規作成>プロジェクトから、以下のようにテンプレートを選択します。

f:id:miso_soup3:20150721145800p:plain

(ちなみに一番下のテンプレートはおそらく工業化Modのテンプレート)

作成後、出力ウィンドウに「gradlew setupDecompWorkspace --refresh-dependencies」と出ますのでしばらく待ちます。
ネットでいろいろ取得するので、環境によって5-20分はかかるよ、と Hello.txtに書いてあります。
準備完了後は、出力ウィンドウの最後に

C:/Users/hogehoge/.gradle/caches/minecraft/net/minecraftforge/forge/1.8-11.14.1.1357/start/

と出ます。

また、ここでエラー「javac.exe はコード2を伴って終了しました。」と出る場合は、ユーザー名にスペースが入ると起こるバグによるものだと思われます。
準備完了後、ファイルは以下のようになっています。

f:id:miso_soup3:20150721145834p:plain

Visual Studio にて ExampleMod.java を開き、

f:id:miso_soup3:20150721145922p:plain

次のようにレシピ追加のコードを書きます。(これは 1.7のレシピ追加より)

package com.example.examplemod;

import net.minecraft.init.Blocks;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;

@Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION)
public class ExampleMod
{
    public static final String MODID = "samplemod";
    public static final String VERSION = "1.0";
    
    @EventHandler
    public void init(FMLInitializationEvent event)
    {
		// some example code
        System.out.println("DIRT BLOCK >> "+Blocks.dirt.getUnlocalizedName());
		
		GameRegistry.addRecipe(new ItemStack(Items.diamond),
                "#",
                "#",
                "#",
                '#', Blocks.dirt
        );
 
        GameRegistry.addRecipe(new ItemStack(Items.diamond),
                "###",
                '#',Blocks.dirt
        );
 
        GameRegistry.addRecipe(new ItemStack(Items.diamond),
                "# #",
                '#',Blocks.dirt
        );
 
        GameRegistry.addRecipe(new ItemStack(Items.ender_pearl),
                "FWF",
                "W W",
                "FWF",
                'F',Items.feather,
                'W',Blocks.end_stone
        );
 
        GameRegistry.addRecipe(new ItemStack(Blocks.wool,5),
                "LWL",
                'L',Blocks.leaves,
                'W',Blocks.web
        );
 
        GameRegistry.addRecipe(new ItemStack(Blocks.wool,5,10),
                "LLL",
                "LWL",
                "LLL",
                'L',Blocks.leaves,
                'W',Blocks.web
        );
 
        GameRegistry.addRecipe(new ItemStack(Items.diamond_pickaxe),
                "HD",
                'H',new ItemStack(Items.diamond_hoe,1, OreDictionary.WILDCARD_VALUE),
                'D',Items.diamond
        );
 
        GameRegistry.addShapelessRecipe(new ItemStack(Items.diamond),
                new ItemStack(Blocks.wool,1,5),
                Items.feather,
                Blocks.web
        );
    }
}

起動

F5 より起動します。が、このF5から起動すると、下の様に Mod が 3つしか読み込まれず、先ほど書いた Mod は読み込まれていません。

f:id:miso_soup3:20150721145934p:plain

この時の出力をGist / Failure Output に記載しておきました。

[14:32:01] [Client thread/INFO] [FML]: FML has found a non-mod file MinecraftMod
1.jar in your mods directory. It will now be injected into your classpath. This
could severe stability issues, it should be removed if possible.

このあたりが怪しいのですがわからず。

仕方ないので、次のように書いた「RunClient.bat」を作成し、「gradlew」ファイルと同じ場所に配置して実行します。

call gradlew runClient
pause

これだと Mod が 4 つ読み込まれ、先ほど書いたコードの通り、土ブロックからダイアモンドを作成できます。
この時の出力をGist / runClinetに記載しておきました。

以上、現段階では Visual Studio での Mod 開発は厳しい模様。