CK3有一个mod叫做Configurable News Feed,历经三代作者,现在还在更新的是Configurable News Feed - Updated。这个mod能够自定义自己想要收到的通知,近至至亲远达宗族成员、上下级的生老病死都可以自定义接受与否,对于扮演家族长非常有意义。但是问题在于,这个mod在普通模式下会导致成就不能解锁,在铁人模式下会导致设置菜单打不开——configurable这个核心没了,那就麻了;而对于我来说,能够解锁成就是游戏的核心驱动力。所以,昨天晚上我决定下手解决这个问题,并且花了一个钟完全了解了这个症结所在,成功帮助维护者修复了这个bug。
What
最早在2023年5月18日的时候Sunghowl提出这个mod会禁用成就,随后B flat表示铁人模式会让configuration button失效;之后有很多玩家遇到了相同的问题。
Why
Lost Nomad指出了问题所在:gui/newsfeed.gui
中使用了ExecuteConsoleCommand
指令,导致成就被锁定。
How
之前在评论区或者什么地方我看到了一位玩家曾经提出,有一个mod曾经也是这样创建窗口的,因为在以前这是在runtime创建窗口的唯一方式;而现在有了另外的方法,所以那个mod通过先创建窗口然后hide了它,在需要的时候才visible,来解决了问题。这便是思路。
通过查阅ck3 wiki(其实是搜索ExecuteConsoleCommand而出现的)Interface页面,主要是New windows and toggles一节,了解到需要做以下改动:
- 创建
gui/scripted_widgets
路径并创建一个文件newsfeed_setting.txt
来让窗口系统在启动时把窗口创建出来 - 通过
visible
field来控制窗口的可见性,并修改相关的button代码来让用户能够控制可见性
分析完成,那么我们打开问题之源gui/newsfeed.gui
,看到以下段落:
1
2
3
4
5
6
7
8
9
10
11
12
state = {
name = open_settings
trigger_when = "[GetVariableSystem.Exists('newsfeed_settings_shown')]"
on_start = "[ExecuteConsoleCommand('gui.CreateWidget gui/newsfeed_settings.gui newsfeed_settings_window')]"
}
state = {
name = close_settings
trigger_when = "[Not(GetVariableSystem.Exists('newsfeed_settings_shown'))]"
on_start = "[ExecuteConsoleCommand('gui.ClearWidgets newsfeed_settings_window')]"
}
可知两个重要信息:
- window名字是newsfeed_settings_window,其他控件是通过这个名字来访问它的
- newsfeed_settings_window的文件是
gui/newsfeed_settings.gui
那么打开gui/newsfeed_settings.gui
,看到开头第一部分就写明了name = "newsfeed_settings_window"
,那么参照wiki就知道gui/scripted_widgets/newsfeed_setting.txt
的内容是:
1
gui/newsfeed_settings.gui = newsfeed_settings_window
顺手把gui/newsfeed.gui
的两个ExecuteConsoleCommand
整行注释掉之后,启动游戏就会发现新建游戏地图加载出来之后mod的设置界面直接弹出来了关都关不掉,同时不会锁成就了。
接下来就是控制可见性。根据wiki,再对照gui/newsfeed_settings.gui
的内容,可以感悟到1wiki里面写的visible应该放在这一级:
1
2
types NewsFeed {
type newsfeed_settings_menu = window {
打开游戏发现确实开始的时候窗口不见了。
剩下的就是对每一个相关的地方使用新的方法控制visible了,以及替换掉旧的判断窗口是否显示的方法:
- 以前是
Exists('newsfeed_settings_shown')
,现在是Exists('show_newsfeed_settings_window')
- 以前是
Clear('newsfeed_settings_shown')
,现在是Toggle('show_newsfeed_settings_window')
改完就好了。
-
其实我是开了debug模式和gui_editor之后,无意间发现原来的文件对窗口加的两个state跟我点击Add添加的visible是同一级的,才定位到位置。 ↩