为什么需要一份配置文件
很明显,一个Mod做得再好,也会有玩家不满意。这时候的一种常见的解决方案就是,开放Mod的部分参数选项,使其从配置文件中读取,这样玩家就可以通过修改Mod的配置文件来对Mod做出一些个性化设置了。
一个好的配置文件,不仅应该全面,更应该条理分明、层次紧密、简明易懂,让玩家不需要帮助甚至注释就可以理解并顺利地修改配置文件内容,而不会出现困惑的现象。
幸运的是,Forge本身就提供了配置文件的接口,Mod开发者们可以轻而易举地完成配置文件的创建、读取、以及写入等操作。
本部分通过对钻石作为燃料的烧炼秒数的配置,一步一步地完成配置文件的相关操作。
实际操作
首先,我们创建一个配置文件管理类,在包com.github.ustc_zzzz.fmltutor.common
下创建文件ConfigLoader.java
:
src/main/java/com/github/ustc_zzzz/fmltutor/common/ConfigLoader.java:
package com.github.ustc_zzzz.fmltutor.common;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import org.apache.logging.log4j.Logger;
public class ConfigLoader
{
private static Configuration config;
private static Logger logger;
public static int diamondBurnTime;
public ConfigLoader(FMLPreInitializationEvent event)
{
logger = event.getModLog();
config = new Configuration(event.getSuggestedConfigurationFile());
config.load();
load();
}
public static void load()
{
logger.info("Started loading config. ");
String comment;
comment = "How many seconds can a diamond burn in a furnace. ";
diamondBurnTime = config.get(Configuration.CATEGORY_GENERAL, "diamondBurnTime", 640, comment).getInt();
config.save();
logger.info("Finished loading config. ");
}
public static Logger logger()
{
return logger;
}
}
首先,我们实例化了一个Configuration
类:
src/main/java/com/github/ustc_zzzz/fmltutor/common/ConfigLoader.java(部分):
config = new Configuration(event.getSuggestedConfigurationFile());
这里的event.getSuggestedConfigurationFile()
,就是Forge推荐的配置文件位置。这个位置在游戏根目录的config文件夹下,名为“<Mod id>.cfg
”,这里就是“fmltutor.cfg
”。
然后我们读入配置:
src/main/java/com/github/ustc_zzzz/fmltutor/common/ConfigLoader.java(部分):
config.load();
接下来是加载配置:
src/main/java/com/github/ustc_zzzz/fmltutor/common/ConfigLoader.java(部分):
comment = "How many seconds can a diamond burn in a furnace. ";
diamondBurnTime = config.get(Configuration.CATEGORY_GENERAL, "diamondBurnTime", 640, comment).getInt();
在一个正常的Forge Mod配置文件里,会有多个类别,Forge提供了一种类别“general
”(Configuration.CATEGORY_GENERAL
),get
方法的第一个参数就是表示“general
”类别。
get
方法的第三个参数,是该键的默认值(这里是640),当对应的键不存在时,就会返回该默认值。
get
方法的第四个参数,是该键的注释,用于描述该项配置的。
那么很明显,get
方法的作用,就是获取diamondBurnTime
键对应的值。
getInt
方法的作用,就是取整数(因为配置文件里的值一定是字符串)。
src/main/java/com/github/ustc_zzzz/fmltutor/common/ConfigLoader.java(部分):
config.save();
最后我们保存配置。
这里要说一下,为什么要保存配置呢?这是因为当配置缺失(最常见的原因就是配置文件没有创建,这常常发生在你第一次使用Mod的时候)的时候,这一句会将默认的配置保存下来。
这里我们还顺路设置了一个logger
,并在加载配置的时候使用到了它作日志记录。
在CommonProxy
中注册:
src/main/java/com/github/ustc_zzzz/fmltutor/common/CommonProxy.java(部分):
public void preInit(FMLPreInitializationEvent event)
{
new ConfigLoader(event);
new CreativeTabsLoader(event);
new ItemLoader(event);
new BlockLoader(event);
}
最后修改一下CraftingLoader
文件:
src/main/java/com/github/ustc_zzzz/fmltutor/crafting/CraftingLoader.java(部分):
private static void registerFuel()
{
GameRegistry.registerFuelHandler(new IFuelHandler()
{
@Override
public int getBurnTime(ItemStack fuel)
{
return Items.diamond != fuel.getItem() ? 0 : Math.max(0, ConfigLoader.diamondBurnTime) * 20;
}
});
}
运行游戏,我们会发现,在config
文件夹下,生成了一个名为fmltutor.cfg
的文件。下面是在作者的电脑下生成的这个文件的内容:
# Configuration file
general {
# How many seconds can a diamond burn in a furnace.
I:diamondBurnTime=640
}