提供: Minecraft Modding Wiki
2012年10月21日 (日) 23:41時点におけるReginn666 (トーク | 投稿記録)による版 (ページの作成:「{{前提MOD|reqmod="Minecraft Forge4.3x"}} ==Forge式コンフィグファイルの利用== 無機能アイテムの追加無機能ブロックの追加で...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"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
				});
	}
}

解説

package, import

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;
</soruce>
:以前解説したItemSampleクラスとBlockSampleクラスを利用するため, インポートする. 同パッケージ内で作成している場合, このimport文は不要.
<br/>

===ConfigSampleCoreクラスのpreInitメソッド===
<source lang = "java">
@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というファイルオブジェクトを返す.


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というファイルが生成されている.