为什么需要一份配置文件

很明显,一个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
}

results matching ""

    No results matching ""