MOD製作チュートリアル > Configの追加

概要

Forgeのシステムを利用してConfig(設定用ファイル)の生成を行う。
ConfigGuiを利用し、Minecraftを起動したままの変更を可能にする。
「Mods」ボタンからMODを選択し、左下の「Config」ボタンを押すことで画面を開くことができる。


ソースコード

  • AluminiumMod.java
package tutorial.aluminiummod.common;
 
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.ModMetadata;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import tutorial.aluminiummod.common.core.AluminiumModConfigCore;
import tutorial.aluminiummod.common.core.AluminiumModInfoCore;
import tutorial.aluminiummod.common.handler.AluminiumModEventHandler;
 
@Mod(modid = AluminiumMod.MOD_ID, name = AluminiumMod.MOD_NAME, version = AluminiumMod.MOD_VERSION, guiFactory = "tutorial.aluminiummod.client.gui.AluminiumModGuiFactory")
public class AluminiumMod {
	public static final String MOD_ID = "AluminiumMod";
	public static final String MOD_NAME = "Aluminium Mod";
	public static final String MOD_VERSION = "1.0.0";
	@Mod.Metadata(MOD_ID)
	public static ModMetadata meta;
 
	@EventHandler
	public void perInit(FMLPreInitializationEvent event) {
		// MODの情報を登録する。
		AluminiumModInfoCore.registerInfo(meta);
		// Configを読み込む。
		AluminiumModConfigCore.loadConfig(event);
	}
 
	@EventHandler
	public void init(FMLInitializationEvent event) {
		// EventHandlerを登録する。
		FMLCommonHandler.instance().bus().register(new AluminiumModEventHandler());
	}
}
 

  • AluminiumModGuiFactory.java
package tutorial.aluminiummod.client.gui;
 
import cpw.mods.fml.client.IModGuiFactory;
import cpw.mods.fml.client.config.GuiConfig;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraftforge.common.config.ConfigElement;
import tutorial.aluminiummod.common.AluminiumMod;
import tutorial.aluminiummod.common.core.AluminiumModConfigCore;
 
import java.util.Set;
 
public class AluminiumModGuiFactory implements IModGuiFactory {
	@Override
	public void initialize(Minecraft minecraftInstance) {
	}
 
	@Override
	public Class<? extends GuiScreen> mainConfigGuiClass() {
		return AluminiumModConfigGui.class;
	}
 
	@Override
	public Set<RuntimeOptionCategoryElement> runtimeGuiCategories() {
		return null;
	}
 
	@Override
	public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) {
		return null;
	}
 
	public static class AluminiumModConfigGui extends GuiConfig {
		public AluminiumModConfigGui(GuiScreen parent) {
			super(parent, (new ConfigElement(AluminiumModConfigCore.cfg.getCategory(AluminiumModConfigCore.GENERAL))).getChildElements(), AluminiumMod.MOD_ID, false, false, AluminiumMod.MOD_NAME);
		}
	}
}
 

  • AluminiumModInfoCore.java
package tutorial.aluminiummod.common.core;
 
import cpw.mods.fml.common.ModMetadata;
import tutorial.aluminiummod.common.AluminiumMod;
 
public class AluminiumModInfoCore {
	public static void registerInfo(ModMetadata meta) {
		meta.modId = AluminiumMod.MOD_ID;
		meta.name = AluminiumMod.MOD_NAME;
		meta.description = "This mod adds Aluminium.";
		meta.version = AluminiumMod.MOD_VERSION;
		meta.url = "http://www63.atwiki.jp/akasatanahama/pages/17.html";
		meta.authorList.add("Akasata Nahama");
		meta.authorList.add("Tom Kate");
		meta.credits = "";
		meta.logoFile = "assets/aluminiummod/logo.png";
		meta.autogenerated = false;
	}
}
 

  • AluminiumModConfigCore.java
package tutorial.aluminiummod.common.core;
 
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.common.config.Configuration;
 
public class AluminiumModConfigCore {
	public static Configuration cfg;
	public static boolean isGeneratorEnabled;
	public static byte smeltingAmount;
	public static final String GENERAL = "General";
	private static final String DIFFICULTY = GENERAL + ".Difficulty";
 
	public static void loadConfig(FMLPreInitializationEvent event) {
		// net.minecraftforge.common.config.Configurationのインスタンスを生成する。
		cfg = new Configuration(event.getSuggestedConfigurationFile(), "[1.7.10]1.0.0", true);
		// Configファイルを読み込む。
		cfg.load();
		// Configファイルの内容を変数と同期させる。
		syncConfig();
	}
 
	/** Configを同期する。 */
	public static void syncConfig() {
		// General
		isGeneratorEnabled = cfg.getBoolean("enabledGenerator", GENERAL, true, "Aluminium Ore will be generated when this setting is true.", "aluminium.config.enabledGenerator");
		// Difficulty
		cfg.addCustomCategoryComment(DIFFICULTY, "This category has settings related to difficulty.");
		smeltingAmount = (byte) cfg.getInt("amountDrop", DIFFICULTY, 1, 1, Byte.MAX_VALUE, "Smelting amount of Aluminium Ingot from Aluminium Ore.", "aluminium.config.amountDrop");
		cfg.save();
	}
}
 

  • AluminiumModEventHandler.java
package tutorial.aluminiummod.common.handler;
 
import cpw.mods.fml.client.event.ConfigChangedEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import tutorial.aluminiummod.common.AluminiumMod;
import tutorial.aluminiummod.common.core.AluminiumModConfigCore;
 
public class AluminiumModEventHandler {
	@SubscribeEvent
	public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) {
		// Configが変更された時に呼ばれる。
		if (event.modID.equals(AluminiumMod.MOD_ID))
			AluminiumModConfigCore.syncConfig();
	}
}
 

解説

AluminiumModConfigCore

void syncConfig()

Configを同期するメソッド。
AluminiumModの変数を更新し、cfgファイルを保存する。

AluminiumModEventHandler

指定したイベントが発生したとき、そのイベントを引数としたメソッドが呼び出される。
今回は、FMLのシステムにのみ登録しているが、Forge本体にも多くのイベントが用意されている。
「Eventの利用」を今後作成する予定。

void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event)

ConfigGuiで項目が変更されたとき、Eventを受け取って呼び出される。
このMODのConfigGuiが更新されたなら、Configを同期する。
ConfigGuiのメイン画面で「Done」ボタンが押されたとき、変更があれば呼び出されている。

Mod

String guiFactory

MODのGuiFactoryを登録する。
IModGuiFactoryを継承したクラスのパスを渡す。

FMLPreInitializationEvent

preInitの引数で渡されているクラス。

File getSuggestedConfigurationFile()

推奨されるConfigファイルのFile。
"(プロフィールフォルダ)/config/(modid).cfg"を返す。

Configuration

Forgeが提供するAPI。
cfgファイルから読み込んだデータを保持し、操作を受け付ける。

コンストラクタ(File file, String configVersion, boolean caseSensitiveCustomCategories)

fileはcfgファイルの位置。(必須)
configVersionは読み込み時cfgファイルの冒頭に記載される文字列。(任意)
caseSensitiveCustomCategoriesをtrueにするとカテゴリ名に小文字が使える。falseだとすべて大文字になる。(任意、デフォルトfalse)

void load()

cfgファイルからデータを読み込み、変数に保持する。
カテゴリや項目のコメントは読み込まれない。

void save()

cfgファイルを保存する。

void addCustomCategoryComment(String category, String comment)

categoryのカテゴリーコメントを指定する。
保存時に上書きされる。

boolean getBoolean(String name, String category, boolean defaultValue, String comment, String langKey)

カテゴリー「category」内の項目名「name」で設定された値を取得する。
値が読み込まれていなかった場合(新規生成時など)はdefaultValueが返ってきて、保存時に新しくその値で生成される。
コメントは、保存時にcommentで上書きされる。
langファイルで「langKey」の翻訳を指定しておくことで、ConfigGuiで翻訳されて表示される。

int getInt(String name, String category, int defaultValue, int minValue, int maxValue, String comment, String langKey)

getBooleanのint版。
minValue以上maxValue以下で返ってくるが、cfgファイルでの設定値は上書きされない。
boolean, intの他にfloat, String, String[]も用意されている。

GuiConfig

ConfigGuiのためのベースクラス。

コンストラクタ(GuiScreen parentScreen, List<IConfigElement> configElements, String modID, boolean allRequireWorldRestart, boolean allRequireMcRestart, String title)

「allRequireWorldRestart」、「allRequireMcRestart」はtrueにするとToolTipにメッセージが追加される。

使用例

オファレンMOD-[1.7.10]2.0.0の開発中のコード。
リリース時のコードと違う可能性があります。
+ オファレンMOD

コメント

この項目に関する質問などをどうぞ。
  • コンパイル時に、"ブートストラップ・クラスパスが-source 1.6と一緒に設定されていません"と出るのですがどうしたら良いのでしょうか? - mod初心者 2017-04-21 15:03:12
    • ちなみに上のはgradleの[compileJava, compileTestJava].eachのit.options.compilerArgs += ['-source', '1.7', '-target', '1.7']で直りましたけど、 - mod初心者 2017-04-21 15:26:51
    • 「入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。」が残ってます。上のは間違えました、['-source', '1.8', '-target', '1.8']です。 - mod初心者 2017-04-21 15:51:17
名前: