提供: Minecraft Modding Wiki
移動先: 案内検索
(finallyが間違ってたのを修正)
(マークアップの最適化)
 
1行目: 1行目:
{{前提MOD|reqmod="Minecraft Forge4.3x"}}
+
{{前提MOD|reqmod="Minecraft Forge4.3.x"}}
  
 
==Forge式コンフィグファイルの利用==
 
==Forge式コンフィグファイルの利用==
7行目: 7行目:
 
</p>
 
</p>
  
===ソースコード===
+
==ソースコード==
*ConfigSampleCore.java
+
;ConfigSampleCore.java
 
<source lang = "java">
 
<source lang = "java">
 
package mods.configsample;
 
package mods.configsample;
105行目: 105行目:
  
 
==解説==
 
==解説==
===ConfigSampleCoreクラス===
+
;ConfigSampleCoreクラス
 
<source lang = "java">
 
<source lang = "java">
 
import java.util.logging.Level;
 
import java.util.logging.Level;
 
</source>
 
</source>
<blockquote>
+
:後述のFMLLogで利用するクラス.
後述のFMLLogで利用するクラス.
 
</blockquote>
 
  
  
118行目: 116行目:
 
import net.minecraftforge.common.Property;
 
import net.minecraftforge.common.Property;
 
</source>
 
</source>
<blockquote>
+
:Forge式コンフィグファイルの機能を提供するAPI. コンフィグ自体はConfigurationクラスが行い, Propertyクラスは設定項目のコメントや実体を扱う.
Forge式コンフィグファイルの機能を提供するAPI. コンフィグ自体はConfigurationクラスが行い, Propertyクラスは設定項目のコメントや実体を扱う.
 
</blockquote>
 
  
  
126行目: 122行目:
 
import cpw.mods.fml.common.FMLLog;
 
import cpw.mods.fml.common.FMLLog;
 
</source>
 
</source>
<blockquote>
+
:FML(ForgeModLoader)が提供するログ表示用API. 開発環境でのプロンプト画面に表示される他, 実行ログにも記録されるようになる.
FML(ForgeModLoader)が提供するログ表示用API. 開発環境でのプロンプト画面に表示される他, 実行ログにも記録されるようになる.
 
</blockquote>
 
  
  
134行目: 128行目:
 
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
 
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
 
</source>
 
</source>
<blockquote
+
:ModLoaderにはなかった前処理(pre init)を行うためのイベント. 基本的な使い方はFMLInitializationEventと同じ.
ModLoaderにはなかった前処理(pre init)を行うためのイベント. 基本的な使い方はFMLInitializationEventと同じ.
 
</blockquote>
 
  
  
143行目: 135行目:
 
import mods.blocksample.BlockSample;
 
import mods.blocksample.BlockSample;
 
</source>
 
</source>
<blockquote>
+
:以前解説したItemSampleクラスとBlockSampleクラスを利用するため, インポートする. 同パッケージ内で作成している場合, このimport文は不要.
以前解説したItemSampleクラスとBlockSampleクラスを利用するため, インポートする. 同パッケージ内で作成している場合, このimport文は不要.
 
</blockquote>
 
  
  
173行目: 163行目:
 
}
 
}
 
</source>
 
</source>
<blockquote>
+
:@Mod.Initと同様に, @Mod.PreInitアノテーションを付与し, 引数にFMLPreInitializationEventを指定すると前処理専用のメソッドとなる. 基本的にはコンフィグファイルの生成や, コンフィグファイルから値を持ってくる処理を行う.
@Mod.Initと同様に, @Mod.PreInitアノテーションを付与し, 引数にFMLPreInitializationEventを指定すると前処理専用のメソッドとなる. 基本的にはコンフィグファイルの生成や, コンフィグファイルから値を持ってくる処理を行う.
 
</blockquote>
 
  
  
181行目: 169行目:
 
Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
 
Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
 
</source>
 
</source>
<blockquote>
+
:Configurationのインスタンスを作成する. 引数のevent.getSuggestedConfigurationFile()は, @Modで指定したmodid.cfg(この場合はConfigSampleCore.cfg)というファイルオブジェクトを返す.
Configurationのインスタンスを作成する. 引数のevent.getSuggestedConfigurationFile()は, @Modで指定したmodid.cfg(この場合はConfigSampleCore.cfg)というファイルオブジェクトを返す.
 
</blockquote>
 
  
  
189行目: 175行目:
 
cfg.load();
 
cfg.load();
 
</source>
 
</source>
<blockquote>
+
:Configurationの処理を開始させるメソッド. 必ずsave()と対になる.
Configurationの処理を開始させるメソッド. 必ずsave()と対になる.
 
</blockquote>
 
  
  
198行目: 182行目:
 
Property itemProp  = cfg.getItem("ConfigSampleItem", 4001);
 
Property itemProp  = cfg.getItem("ConfigSampleItem", 4001);
 
</source>
 
</source>
<blockquote>
+
:コンフィグファイルに項目とデフォルト値を設定し, その要素をPropetryインスタンスに返す処理.
コンフィグファイルに項目とデフォルト値を設定し, その要素をPropetryインスタンスに返す処理.
+
:この時, このModよりも前に読み込まれたModのブロック, アイテムIDと重複していた場合, '''自動でIDの末尾からIDの再割り当てを行う.'''
この時, このModよりも前に読み込まれたModのブロック, アイテムIDと重複していた場合, '''自動でIDの末尾からIDの再割り当てを行う.'''
 
</blockquote>
 
  
  
208行目: 190行目:
 
itemProp.comment  = "This comment is Item Property";
 
itemProp.comment  = "This comment is Item Property";
 
</source>
 
</source>
<blockquote>
+
:コンフィグファイルでの項目に対するコメント.
コンフィグファイルでの項目に対するコメント.
 
</blockquote>
 
  
  
217行目: 197行目:
 
itemIdSample  = itemProp.getInt();
 
itemIdSample  = itemProp.getInt();
 
</source>
 
</source>
<blockquote>
+
:コンフィグファイルで設定した値をint型にして取得するメソッド.
コンフィグファイルで設定した値をint型にして取得するメソッド.
+
:アイテムIDに関しては自動で-256してくれるようになった. これは4.1.4.281からの機能.
アイテムIDに関しては自動で-256してくれるようになった. これは4.1.4.281からの機能.
 
</blockquote>
 
  
  
229行目: 207行目:
 
}
 
}
 
</source>
 
</source>
<blockquote>
+
:ファイルへの書き込み, 読み込みが失敗したときに呼ばれる, 例外. ログファイルにエラーメッセージを出力し, ゲームを強制終了させる.
ファイルへの書き込み, 読み込みが失敗したときに呼ばれる, 例外. ログファイルにエラーメッセージを出力し, ゲームを強制終了させる.
 
</blockquote>
 
  
  
240行目: 216行目:
 
}
 
}
 
</source>
 
</source>
<blockquote>
+
:tryブロックの後で必ず呼ばれる. コンフィグファイルを保存する.
tryブロックの後で必ず呼ばれる. コンフィグファイルを保存する.
 
</blockquote>
 
  
 
==実際の挙動==
 
==実際の挙動==

2012年11月3日 (土) 08:01時点における最新版

この記事は"Minecraft Forge4.3.x"を前提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;
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というファイルが生成されている.