« Minecraft MOD開発 5 | トップページ | Minecraft MOD開発 7 »

2014年3月14日 (金)

Minecraft MOD開発 6

新しいブロックを登録するMODを目指す。

まずはペイントでブロックのテクスチャを作る。目立つようにピンクにした。

ドメイン名はnishinaとする。(javaではファイルを区別しやすくするために、パッケージ名を制作者のドメイン名とすることが多い。私はnishinaドメインを所有しているわけではないが、MinecraftのMODを作る限りにおいてはユーザー名を使っておけば他の人と重複しないだろうと考えられるので、nishinaとした)

このpngファイルをC:\forge-1.6.4-9.11.1.965-src\forge\mcp\src\minecraft\assets\nishina\textures\blocksへおく。

次にjavaファイルを作る。先ほどドメイン名をnishinaとしたので、C:\forge-1.6.4-9.11.1.965-src\forge\mcp\src\minecraft\nishinaにpink_block.javaをつくる。Minecraft Modding Wikiのチュートリアルからとりあえずの動作に不要な部分を削った。

pink_block.java

package nishina.pink_block;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
 
public class BlockSample extends Block
{
 
 public BlockSample(int par1, Material par2Material)
 {
  super(par1, par2Material);
  this.setCreativeTab(CreativeTabs.tabBlock); //クリエイティブタブの選択
  this.setUnlocalizedName("pink_block"); //システム名の設定
  this.setTextureName("nishina:pink_block"); //ブロックのテクスチャの指定
 }
}

リコンパイルしたらコメント部分に対してエラーが出た。ソースのエンコードがShift-JISではダメなようだ。

C:\forge-1.6.4-9.11.1.965-src\forge\mcp>recompile
== MCP 8.09 (data: 8.11, client: 1.6.4, server: 1.6.4) ==
"scalac" is not found on the PATH.  Scala files will not be
recompiled
# found ff, ff patches, srgs, name csvs, doc csvs, param csv
s, astyle, astyle config, rg, ss
== Recompiling client ==
> Cleaning bin
> Recompiling
'"C:\Program Files\Java\jdk1.7.0_51\bin\javac" -encoding UTF
-8 -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -
classpath "jars\versions\1.6.4\1.6.4.jar;lib;lib\*;jars\libr
aries\net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar;jars\lib
raries\org\lwjgl\lwjgl\lwjgl-platform\2.9.0\lwjgl-platform-2
.9.0-natives-windows.jar;jars\libraries\org\apache\commons\c
ommons-lang3\3.1\commons-lang3-3.1.jar;jars\libraries\com\pa
ulscode\libraryjavasound\20101123\libraryjavasound-20101123.
jar;jars\libraries\net\sf\jopt-simple\jopt-simple\4.5\jopt-s
imple-4.5.jar;jars\libraries\com\google\guava\guava\14.0\gua
va-14.0.jar;jars\libraries\lzma\lzma\0.0.1\lzma-0.0.1.jar;ja
rs\libraries\com\paulscode\codecjorbis\20101023\codecjorbis-
20101023.jar;jars\libraries\org\bouncycastle\bcprov-jdk15on\
1.47\bcprov-jdk15on-1.47.jar;jars\libraries\com\paulscode\so
undsystem\20120107\soundsystem-20120107.jar;jars\libraries\c
om\paulscode\librarylwjglopenal\20100824\librarylwjglopenal-
20100824.jar;jars\libraries\org\scala-lang\scala-library\2.1
0.2\scala-library-2.10.2.jar;jars\libraries\org\lwjgl\lwjgl\
lwjgl_util\2.9.0\lwjgl_util-2.9.0.jar;jars\libraries\org\sca
la-lang\scala-compiler\2.10.2\scala-compiler-2.10.2.jar;jars
\libraries\net\java\jutils\jutils\1.0.0\jutils-1.0.0.jar;jar
s\libraries\org\ow2\asm\asm-debug-all\4.1\asm-debug-all-4.1.
jar;jars\libraries\org\lwjgl\lwjgl\lwjgl\2.9.0\lwjgl-2.9.0.j
ar;jars\libraries\commons-io\commons-io\2.4\commons-io-2.4.j
ar;jars\libraries\net\sourceforge\argo\argo\2.25\argo-2.25.j
ar;jars\libraries\com\google\code\gson\gson\2.2.2\gson-2.2.2
.jar;jars\libraries\com\paulscode\codecwav\20101023\codecwav
-20101023.jar;jars\libraries\net\java\jinput\jinput-platform
\2.0.5\jinput-platform-2.0.5-natives-windows.jar;jars\librar
ies\net\minecraft\launchwrapper\1.8\launchwrapper-1.8.jar" -
sourcepath src\minecraft -d bin\minecraft @"c:\users\tomcat\
appdata\local\temp\java_src_path_dxqrqg.txt"' failed : 1

== ERRORS FOUND in JAVA CODE ==

C:\forge-1.6.4-9.11.1.965-src\forge\mcp\src\minecraft\nishin
a\pink_block.java:13: エラー: この文字は、エンコーディングUT
F-8にマップできません
this.setCreativeTab(CreativeTabs.tabBlock);
//?N???G?C?e?B?u?^?u??I??


^

あー、また同じミスをした。

C:\forge-1.6.4-9.11.1.965-src\forge\mcp\src\minecraft\nishina\pink_block.java:7: エラー: クラスBlockSampleはpublicであり、ファイルBlockSample.javaで宣言する必要があります
public class BlockSample extends Block
       ^

クラス名とトコンストラクタを修正する。

pink_block.java

package nishina.pink_block;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
 
public class pink_block extends Block
{
 
 public pink_block(int par1, Material par2Material)
 {
  super(par1, par2Material);
  this.setCreativeTab(CreativeTabs.tabBlock); //クリエイティブタブの選択
  this.setUnlocalizedName("pink_block"); //システム名の設定
  this.setTextureName("nishina:pink_block"); //ブロックのテクスチャの指定
 }
}

こんなエラーメッセージが出た。パッケージ名にpink_blockを含めちゃダメだ。

C:\forge-1.6.4-9.11.1.965-src\forge\mcp\src\minecraft\nishina\pink_block.java:1: エラー: パッケージnishina.pink_blockは同名のクラスと競合しています
package nishina.pink_block;
^

これでpink_block.javaの方のコンパイルは通るようになった。

pink_block.java

package nishina;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
 
public class pink_block extends Block
{
 public pink_block(int par1, Material par2Material)
 {
  super(par1, par2Material);
  this.setCreativeTab(CreativeTabs.tabBlock); //クリエイティブタブの選択
  this.setUnlocalizedName("pink_block"); //システム名の設定
  this.setTextureName("nishina:pink_block"); //ブロックのテクスチャの指定
 }
}

pink_block_core.javaもチュートリアルを元に作る。

pink_block_core.java

package nishina;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
 
@Mod(modid="PinkBlockMod", name="PinkBlockMod", version="1.0")
public class pink_block_core
{
 public static Block blockPink;
 public static int blockPinkID = 4200;
 
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  //表示名の登録
  LanguageRegistry.addName(blockPink, "Pink Block");
  LanguageRegistry.instance().addNameForObject(blockPink, "ja_JP", "ピンク ブロック");
 }
 
 @EventHandler
 public void preInit(FMLPreInitializationEvent event)
 {
  //ブロックの登録
  blockPink = new pink_block(blockPinkID, Material.rock);
  GameRegistry.registerBlock(blockPink, "blockPink");
 }
}

startclientをしたら以下のエラーが出て落ちた。pink_blockのコンストラクタで落ちてる。テクスチャのパスを間違っている気もするけど、ArrayIndexOutOfBoundsException: 4200が出ているからBlockのIDが大きすぎたかな?

[22:17:41] 2014-03-14 22:17:41 [重大] [ForgeModLoader] Fatal errors were detected during the transition from PREINITIALIZATION to INITIALIZATION. Loading cannot continue
[22:17:41] 2014-03-14 22:17:41 [重大] [ForgeModLoader]
[22:17:41]      mcp{8.09} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized
[22:17:41]      FML{6.4.49.965} [Forge Mod Loader] (minecraft) Unloaded->Constructed->Pre-initialized
[22:17:41]      Forge{9.11.1.965} [Minecraft Forge] (minecraft) Unloaded->Constructed->Pre-initialized
[22:17:41]      AlchemySampleMod{1.0} [AlchemySampleMod] (minecraft) Unloaded->Constructed->Pre-initialized
[22:17:41]      PinkBlockMod{1.0} [PinkBlockMod] (minecraft) Unloaded->Constructed->Errored
[22:17:41] 2014-03-14 22:17:41 [重大] [ForgeModLoader] The following problems were captured during this phase
[22:17:41] 2014-03-14 22:17:41 [重大] [ForgeModLoader] Caught exception from PinkBlockMod
[22:17:41] java.lang.ArrayIndexOutOfBoundsException: 4200
[22:17:41]      at net.minecraft.block.Block.(Block.java:347)
[22:17:41]      at nishina.pink_block.(pink_block.java:12)
[22:17:41]      at nishina.pink_block_core.preInit(pink_block_core.java:30)

ブロックIDを3500にしてみる。

package nishina;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
 
@Mod(modid="PinkBlockMod", name="PinkBlockMod", version="1.0")
public class pink_block_core
{
 public static Block blockPink;
 public static int blockPinkID = 3500;
 
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  //表示名の登録
  LanguageRegistry.addName(blockPink, "Pink Block");
  LanguageRegistry.instance().addNameForObject(blockPink, "ja_JP", "ピンク ブロック");
 }
 
 @EventHandler
 public void preInit(FMLPreInitializationEvent event)
 {
  //ブロックの登録
  blockPink = new pink_block(blockPinkID, Material.rock);
  GameRegistry.registerBlock(blockPink, "blockPink");
 }
}

Minecraftは起動してクリエイティブモードからブロックを設置できたものの、テクスチャが正しく表示されない。

Yahoo!知恵袋によると、テクスチャの読み込みに失敗したときはデフォルトのピンクと黒のテクスチャで表示されるようだ。pink_block.pngをC:\forge-1.6.4-9.11.1.965-src\forge\mcp\jars\assets\nishina\textures\blocksへコピーしてもだめ。C:\forge-1.6.4-9.11.1.965-src\forge\mcp\bin\minecraft\assets\nishina\textures\blocksに置いたら、表示されるようになった。(参考)


« Minecraft MOD開発 5 | トップページ | Minecraft MOD開発 7 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1499066/55372135

この記事へのトラックバック一覧です: Minecraft MOD開発 6:

« Minecraft MOD開発 5 | トップページ | Minecraft MOD開発 7 »