= 创作分享 =
你问我答
怎么修改其他模组配置文件参数的默认值 ...
付邦坤

怎么修改其他模组配置文件参数的默认值

付邦坤 于 2024-1-24 22:17 ( 3月前 ) [复制链接] [只看楼主] [打印]
437 6
10RF
我正在制作一个1.12.2的模组,正在尝试修改另外两个模组之间的兼容问题。其中有一个问题一个模组已经给出了解决方法,但是它默认在配置文件里是关闭的,我想让其他人安装了我这个模组之后不用去修改配置文件,我的模组自动把这个配置文件改成开启。我现在尝试了三种方法,但都没有完全成功,请问有没有大佬帮忙看一下,或者给个其他方法。还有,这个配置文件用的是net.minecraftforge.common.config.Configuration,不是@Config注解(不知道这样描述对不对)。
我尝试的第一种方法:直接修改变量
我在自己的模组里直接把那个配置文件的参数改成true,之后测试发现,只有变量本身变成了true,用到这个变量的地方都还是false,配置文件里也还是false(我自己都知道这样肯定改不了文件)。不知道是不是用到这个变量的代码已经执行了,我才修改这个变量,但明明我已经在预加载的时候就已经修改了。
第二种:用Mixin修改默认参数
我用Mixin把这个配置文件默认的参数改成了true,但效果跟上一种一样,而且配置文件里还还是false。
第三种:直接改文件
我尝试把生成的配置文件里的参数用代码替换true,结果还是改不了(路径是对的),这次连变量本身都改不了了。

发表于 2024-1-24 22:17:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

回复 | 举报

该帖共收到 6 条回复!
道家深湖
1,你的模组不应该去修改其他模组配置文件的【默认值】,而应该去修改它的【实际值】
2,1.12.2里配置文件和游戏内选项各自运作,修改任一方都不会自动同步到另一侧。如果你想把游戏内的选项(内存变量)同步到配置文件,调用
ConfigManager.sync(配置文件的模组ID, Config.Type.INSTANCE);
至于调用的时机你自己试试就差不多了,基本上就是postInit或者ConfigChangedEvent.OnConfigChangedEvent里。
你应该在上述时机进行对应选项值的修改,然后调用上述接口写入配置文件,避免修改未保存。

顺便,配置文件里的变量有不同的使用方式,有的是需要重启MC才会生效,这种在制作的时候一般会打上@Config.RequiresMcRestart注解,但也不排除作者水平臭而没打的可能。这种需要重启的配置项,最常见的是怪物的生成权重和注册项的id,但别的也有可能需要。如果是这种的,你要么抢在他调用之前(preInit)等时机调用,要么就要求用户重启一次游戏。
发表于 2024-1-26 10:19:22 | 只看该作者

回复 | 举报

付邦坤
QQ酱22956 发表于 2024-1-26 10:19
1,你的模组不应该去修改其他模组配置文件的【默认值】,而应该去修改它的【实际值】
2,1.12.2里配置文件 ...

请问怎么修改它们的实际值,是直接给它赋值吗,这样就和我用的第一种方法一样了。我忘记说了,第一种改过之后游戏里还是原来的,配置文件里也还是原来的,但是我让它输出却是改过的。
发表于 2024-1-26 13:28:22 | 只看该作者

回复 | 举报

道家深湖
付邦坤 发表于 2024-1-26 13:28
请问怎么修改它们的实际值,是直接给它赋值吗,这样就和我用的第一种方法一样了。我忘记说了,第一种改过 ...

赋值后调用我说的那个sync
发表于 2024-1-26 13:51:57 | 只看该作者

回复 | 举报

付邦坤
本帖最后由 付邦坤 于 2024-1-26 15:03 编辑
QQ酱22956 发表于 2024-1-26 13:51
赋值后调用我说的那个sync

我在PreInit阶段给它赋值了,然后在PreInit阶段和PostInit阶段各调用了一次sync,两次调用后游戏里还是原来的,配置文件里也还是原来的,输出它的值却是改过的。即使删掉配置文件重启游戏,再次重启游戏也都一样
@EventHandler
public static void PreInit(FMLPreInitializationEvent event) {
    com.mjr.extraplanets.Config.GALAXY_SPACE_COMPATIBILITY = true; //赋值
    ConfigManager.sync(Constants.modID, net.minecraftforge.common.config.Config.Type.INSTANCE); //调用sync
    event.getModLog().info(Config.GALAXY_SPACE_COMPATIBILITY); //输出
}
@EventHandler
public static void PostInit(FMLPostInitializationEvent event) {
    ConfigManager.sync(Constants.modID, net.minecraftforge.common.config.Config.Type.INSTANCE); //调用sync
    FMLLog.log.info(Config.GALAXY_SPACE_COMPATIBILITY); //输出
}

发表于 2024-1-26 14:59:52 | 只看该作者

回复 | 举报

道家深湖
你modid是对方的modid吗
发表于 2024-1-26 16:15:34 | 只看该作者

回复 | 举报

付邦坤
QQ酱22956 发表于 2024-1-26 16:15
你modid是对方的modid吗

不是啊,这里的Constants.modID就是对方的模组ID,直接用字符串也不行
发表于 2024-1-26 16:18:59 | 只看该作者

回复 | 举报

百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表