提供: Minecraft Modding Wiki
移動先: 案内検索
2行目: 2行目:
  
 
==Forge式コンフィグファイルの利用==
 
==Forge式コンフィグファイルの利用==
 +
<p>
 
[[無機能アイテムの追加]]と[[無機能ブロックの追加]]ではアイテムIDとブロックIDは変更不可能だった. そこでModLoaderのMLPropよりも柔軟な(ただし複雑な)コンフィグファイルを利用する.
 
[[無機能アイテムの追加]]と[[無機能ブロックの追加]]ではアイテムIDとブロックIDは変更不可能だった. そこでModLoaderのMLPropよりも柔軟な(ただし複雑な)コンフィグファイルを利用する.
 
なお, 上記2つのコードで説明した箇所は説明を省いている.
 
なお, 上記2つのコードで説明した箇所は説明を省いている.
 +
</p>
  
 
===ソースコード===
 
===ソースコード===
103行目: 105行目:
  
 
==解説==
 
==解説==
===package, import===
+
===ConfigSampleCoreクラス===
 
<source lang = "java">
 
<source lang = "java">
 
import java.util.logging.Level;
 
import java.util.logging.Level;
 
</source>
 
</source>
:後述のFMLLogで利用するクラス.
+
<blockquote>
<br/>
+
後述のFMLLogで利用するクラス.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
114行目: 118行目:
 
import net.minecraftforge.common.Property;
 
import net.minecraftforge.common.Property;
 
</source>
 
</source>
:Forge式コンフィグファイルの機能を提供するAPI. コンフィグ自体はConfigurationクラスが行い, Propertyクラスは設定項目のコメントや実体を扱う.
+
<blockquote>
<br/>
+
Forge式コンフィグファイルの機能を提供するAPI. コンフィグ自体はConfigurationクラスが行い, Propertyクラスは設定項目のコメントや実体を扱う.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
 
import cpw.mods.fml.common.FMLLog;
 
import cpw.mods.fml.common.FMLLog;
 
</source>
 
</source>
:FML(ForgeModLoader)が提供するログ表示用API. 開発環境でのプロンプト画面に表示される他, 実行ログにも記録されるようになる.
+
<blockquote>
<br/>
+
FML(ForgeModLoader)が提供するログ表示用API. 開発環境でのプロンプト画面に表示される他, 実行ログにも記録されるようになる.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
 
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
 
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
 
</source>
 
</source>
:ModLoaderにはなかった前処理(pre init)を行うためのイベント. 基本的な使い方はFMLInitializationEventと同じ.
+
<blockquote
<br/>
+
ModLoaderにはなかった前処理(pre init)を行うためのイベント. 基本的な使い方はFMLInitializationEventと同じ.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
133行目: 143行目:
 
import mods.blocksample.BlockSample;
 
import mods.blocksample.BlockSample;
 
</source>
 
</source>
:以前解説したItemSampleクラスとBlockSampleクラスを利用するため, インポートする. 同パッケージ内で作成している場合, このimport文は不要.
+
<blockquote>
<br/>
+
以前解説したItemSampleクラスとBlockSampleクラスを利用するため, インポートする. 同パッケージ内で作成している場合, このimport文は不要.
 +
</blockquote>
 +
 
  
===ConfigSampleCoreクラスのpreInitメソッド===
 
 
<source lang = "java">
 
<source lang = "java">
 
@Mod.PreInit
 
@Mod.PreInit
162行目: 173行目:
 
}
 
}
 
</source>
 
</source>
 +
<blockquote>
 +
@Mod.Initと同様に, @Mod.PreInitアノテーションを付与し, 引数にFMLPreInitializationEventを指定すると前処理専用のメソッドとなる. 基本的にはコンフィグファイルの生成や, コンフィグファイルから値を持ってくる処理を行う.
 +
</blockquote>
  
@Mod.Initと同様に, @Mod.PreInitアノテーションを付与し, 引数にFMLPreInitializationEventを指定すると前処理専用のメソッドとなる. 基本的にはコンフィグファイルの生成や, コンフィグファイルから値を持ってくる処理を行う.
 
<br/>
 
  
 
<source lang = "java">
 
<source lang = "java">
 
Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
 
Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
 
</source>
 
</source>
:Configurationのインスタンスを作成する. 引数のevent.getSuggestedConfigurationFile()は, @Modで指定したmodid.cfg(この場合はConfigSampleCore.cfg)というファイルオブジェクトを返す.
+
<blockquote>
<br/>
+
Configurationのインスタンスを作成する. 引数のevent.getSuggestedConfigurationFile()は, @Modで指定したmodid.cfg(この場合はConfigSampleCore.cfg)というファイルオブジェクトを返す.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
 
cfg.load();
 
cfg.load();
 
</source>
 
</source>
:Configurationの処理を開始させるメソッド. 必ずsave()と対になる.
+
<blockquote>
<br/>
+
Configurationの処理を開始させるメソッド. 必ずsave()と対になる.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
182行目: 198行目:
 
Property itemProp  = cfg.getItem("ConfigSampleItem", 4001);
 
Property itemProp  = cfg.getItem("ConfigSampleItem", 4001);
 
</source>
 
</source>
:コンフィグファイルに項目とデフォルト値を設定し, その要素をPropetryインスタンスに返す処理.
+
<blockquote>
:この時, このModよりも前に読み込まれたModのブロック, アイテムIDと重複していた場合, '''自動でIDの末尾からIDの再割り当てを行う.'''
+
コンフィグファイルに項目とデフォルト値を設定し, その要素をPropetryインスタンスに返す処理.
<br/>
+
この時, このModよりも前に読み込まれたModのブロック, アイテムIDと重複していた場合, '''自動でIDの末尾からIDの再割り当てを行う.'''
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
190行目: 208行目:
 
itemProp.comment  = "This comment is Item Property";
 
itemProp.comment  = "This comment is Item Property";
 
</source>
 
</source>
:コンフィグファイルでの項目に対するコメント.
+
<blockquote>
<br/>
+
コンフィグファイルでの項目に対するコメント.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
197行目: 217行目:
 
itemIdSample  = itemProp.getInt();
 
itemIdSample  = itemProp.getInt();
 
</source>
 
</source>
:コンフィグファイルで設定した値をint型にして取得するメソッド.
+
<blockquote>
:アイテムIDに関しては自動で-256してくれるようになった. これは4.1.4.281からの機能.
+
コンフィグファイルで設定した値をint型にして取得するメソッド.
 +
アイテムIDに関しては自動で-256してくれるようになった. これは4.1.4.281からの機能.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
206行目: 229行目:
 
}
 
}
 
</source>
 
</source>
:ファイルへの書き込み, 読み込みが失敗したときに呼ばれる, 例外. ログファイルにエラーメッセージを出力し, ゲームを強制終了させる.
+
<blockquote>
<br/>
+
ファイルへの書き込み, 読み込みが失敗したときに呼ばれる, 例外. ログファイルにエラーメッセージを出力し, ゲームを強制終了させる.
 +
</blockquote>
 +
 
  
 
<source lang = "java">
 
<source lang = "java">
215行目: 240行目:
 
}
 
}
 
</source>
 
</source>
:tryで例外が発生しない場合呼ばれる. コンフィグファイルを保存する.
+
<blockquote>
 +
tryで例外が発生しない場合呼ばれる. コンフィグファイルを保存する.
 +
</blockquote>
  
 
==実際の挙動==
 
==実際の挙動==
 +
<p>
 
実際の挙動自体は[[無機能アイテムの追加]], [[無機能ブロックの追加]]とほぼ同じである. ただしconfigフォルダに'''ConfigSampleCore.cfg'''というファイルが生成されている.
 
実際の挙動自体は[[無機能アイテムの追加]], [[無機能ブロックの追加]]とほぼ同じである. ただしconfigフォルダに'''ConfigSampleCore.cfg'''というファイルが生成されている.
 +
</p>

2012年10月24日 (水) 17:38時点における版

この記事は"Minecraft Forge4.3x"を前提MODとしています。

Forge式コンフィグファイルの利用

無機能アイテムの追加無機能ブロックの追加ではアイテムIDとブロックIDは変更不可能だった. そこでModLoaderのMLPropよりも柔軟な(ただし複雑な)コンフィグファイルを利用する. なお, 上記2つのコードで説明した箇所は説明を省いている.

ソースコード

  • ConfigSampleCore.java
package mods.configsample;

import java.util.logging.Level;

import net.minecraft.src.*;

import net.minecraftforge.common.Configuration;
import net.minecraftforge.common.Property;

import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.network.NetworkMod;

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;

import mods.itemsample.ItemSample;
import mods.blocksample.BlockSample;

@Mod(
	modid = "ConfigSampleMod",
	name  = "Config Sample Mod",
	version = "1.0.0"
)
@NetworkMod(
	clientSideRequired = true,
	serverSideRequired = false
)
public class ConfigSampleCore
{
	public static Block blockSample;
	public static Item  itemSample;
	
	public int blockIdSample;
	public int itemIdSample;
	
	@Mod.PreInit
	public void preInit(FMLPreInitializationEvent event)
	{
		Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
		try
		{
			cfg.load();
			Property blockProp = cfg.getBlock("ConfigSampleBlock", 1301);
			Property itemProp  = cfg.getItem("ConfigSampleItem", 4001);
			blockProp.comment  = "This comment is Block Property";
			itemProp.comment   = "This comment is Item Property";
			blockIdSample = blockProp.getInt();
			itemIdSample  = itemProp.getInt();
		}
		catch (Exception e)
		{
			FMLLog.log(Level.SEVERE, e, "Error Message");
		}
		finally
		{
			cfg.save();
		}
	}
	
	@Mod.Init
	public void init(FMLInitializationEvent event)
	{
		blockSample = (new BlockSample(blockIdSample, 4)).setBlockName("configsampleblock").setCreativeTab(CreativeTabs.tabBlock);
		itemSample  = (new ItemSample(itemIdSample)).setIconCoord(10, 0).setItemName("configsampleitem").setCreativeTab(CreativeTabs.tabMaterials);
		
		GameRegistry.registerBlock(blockSample);
		
		LanguageRegistry.addName(blockSample, "Config Sample Block");
		LanguageRegistry.instance().addNameForObject(blockSample, "ja_JP", "コンフィグサンプルブロック");
		
		LanguageRegistry.addName(itemSample, "Config Sample Item");
		LanguageRegistry.instance().addNameForObject(itemSample, "ja_JP", "コンフィグサンプルアイテム");
		
		GameRegistry.addShapelessRecipe(
			new ItemStack(itemSample, 1),
				new Object[]
				{
					Block.dirt, Block.dirt, Block.dirt
				});
				
		GameRegistry.addShapelessRecipe(
			new ItemStack(blockSample, 1),
				new Object[]
				{
					Block.dirt, Block.dirt, Block.dirt, Block.dirt
				});
	}
}

解説

ConfigSampleCoreクラス

import java.util.logging.Level;

後述のFMLLogで利用するクラス.


import net.minecraftforge.common.Configuration;
import net.minecraftforge.common.Property;

Forge式コンフィグファイルの機能を提供するAPI. コンフィグ自体はConfigurationクラスが行い, Propertyクラスは設定項目のコメントや実体を扱う.


import cpw.mods.fml.common.FMLLog;

FML(ForgeModLoader)が提供するログ表示用API. 開発環境でのプロンプト画面に表示される他, 実行ログにも記録されるようになる.


import cpw.mods.fml.common.event.FMLPreInitializationEvent;

<blockquote ModLoaderにはなかった前処理(pre init)を行うためのイベント. 基本的な使い方はFMLInitializationEventと同じ.


import mods.itemsample.ItemSample;
import mods.blocksample.BlockSample;

以前解説したItemSampleクラスとBlockSampleクラスを利用するため, インポートする. 同パッケージ内で作成している場合, このimport文は不要.


@Mod.PreInit
public void preInit(FMLPreInitializationEvent event)
{
	Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
	try
	{
		cfg.load();
		Property blockProp = cfg.getBlock("ConfigSampleBlock", 1301);
		Property itemProp  = cfg.getItem("ConfigSampleItem", 4001);
		blockProp.comment  = "This comment is Block Property";
		itemProp.comment   = "This comment is Item Property";
		blockIdSample = blockProp.getInt();
		itemIdSample  = itemProp.getInt();
	}
	catch (Exception e)
	{
		FMLLog.log(Level.SEVERE, e, "Error Message");
	}
	finally
	{
		cfg.save();
	}
}

@Mod.Initと同様に, @Mod.PreInitアノテーションを付与し, 引数にFMLPreInitializationEventを指定すると前処理専用のメソッドとなる. 基本的にはコンフィグファイルの生成や, コンフィグファイルから値を持ってくる処理を行う.


Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());

Configurationのインスタンスを作成する. 引数のevent.getSuggestedConfigurationFile()は, @Modで指定したmodid.cfg(この場合はConfigSampleCore.cfg)というファイルオブジェクトを返す.


cfg.load();

Configurationの処理を開始させるメソッド. 必ずsave()と対になる.


Property blockProp = cfg.getBlock("ConfigSampleBlock", 1301);
Property itemProp  = cfg.getItem("ConfigSampleItem", 4001);

コンフィグファイルに項目とデフォルト値を設定し, その要素をPropetryインスタンスに返す処理. この時, このModよりも前に読み込まれたModのブロック, アイテムIDと重複していた場合, 自動でIDの末尾からIDの再割り当てを行う.


blockProp.comment  = "This comment is Block Property";
itemProp.comment   = "This comment is Item Property";

コンフィグファイルでの項目に対するコメント.


blockIdSample = blockProp.getInt();
itemIdSample  = itemProp.getInt();

コンフィグファイルで設定した値をint型にして取得するメソッド. アイテムIDに関しては自動で-256してくれるようになった. これは4.1.4.281からの機能.


catch (Exception e)
{
	FMLLog.log(Level.SEVERE, e, "Error Message");
}

ファイルへの書き込み, 読み込みが失敗したときに呼ばれる, 例外. ログファイルにエラーメッセージを出力し, ゲームを強制終了させる.


finally
{
	cfg.save();
}

tryで例外が発生しない場合呼ばれる. コンフィグファイルを保存する.

実際の挙動

実際の挙動自体は無機能アイテムの追加, 無機能ブロックの追加とほぼ同じである. ただしconfigフォルダにConfigSampleCore.cfgというファイルが生成されている.