Skip to content

群鸟绘卷的自用修改

群鸟绘卷主体是春夏秋冬四个模块, 本篇修改的是群鸟绘卷春

  • 3161117403 - 群鸟绘卷春
  • 3161119380 - 群鸟绘卷夏
  • 3161120380 - 群鸟绘卷秋
  • 3382938080 - 群鸟绘卷冬

当前修改版本: v10.403

当前修改模组: 3161117403 - 群鸟绘卷春

1. WeGame无法用

目前可能有很多问题, 主要表现为进档就崩, 无报错, 无弹窗, 无日志, 无法询问豆包

以下列出暂时能找到的作者故意埋得雷, 贴出的代码块都需要去源文件里删掉或注释

随着群鸟更新, 以后可能会有更多的陷阱, 如果找得到就改了更新, 找不到就暂时不更新群鸟绘卷

1.1 进档闪退!

1.1.1 闪退原因一 modtable/end.lua 125行附近(需删掉)

lua
if not m_util:IsMilker() and 
    not modname:find("shop") then
    if Mod_ShroomMilk.Func.SnakeLoop then
        Mod_ShroomMilk.Func.SnakeLoop()
    end
end

这个是进档闪退的原因之一

他检测: 如果不是呼吸本人并且模组文件夹不含"shop", 那么定时执行递归, 递归方法定义在34.lua, 这里是调用. 会在极短时间内使玩家内存爆掉, 删掉此段或注释

34.lua里的递归定义 108行附近(可删)
lua
local function SnakeLoop()
	local timesnake = math.random(1, 600)/10
	i_util:DoTaskInTime(timesnake, SnakeLoop)
	i_util:DoTaskInTime(timesnake, SnakeLoop)
end

每次调用自己, 会再调用两次自己, 指数级增长无限递归, 直到内存泄露程序中断

1786797139414

1.1.2 闪退原因二 scripts/components/hx_pusher.lua 132行附近(需删掉,最新版在114行附近)

lua
if _G[pc.hurl]:sub(-1) == "L" then
	player.entity:SetParent(player.entity)
end

这段会检测"_G[pc.hurl]"结尾带"L"的, 作者隐藏的很深, 其实就是检测平台是否是RAIL平台, RAIL是WeGame版本的饥荒联机版

接着会让玩家实体产生循环父子引用, 导致引擎在渲染/物理层疯狂递归计算,瞬间耗尽内存

_G[pc.hurl] 在WeGame饥荒游戏中打印出来是: WIN32_RAIL, 符合条件

需要删掉此段

1786797674263

1.1.3 闪退原因三 modmain.lua 结尾(需删掉)

如果前两个问题已经修复, 此项就会生效

lua
 i_util:AddSessionLoadFunc(function()
     if PLATFORM == "WIN32_RAIL" or IsRail() then
         local function fn_quit()
             TheSim:Quit()
         end
         h_util:CreatePopupWithClose("提示", "本mod不再支持辣鸡WeGame平台,版本号都不会写就别搬运了。", {
             {text = h_util.yes,
             cb = fn_quit}
         })
         i_util:DoTaskInTime(10, fn_quit)
     end
 end)

此段会进行平台甄别, 弹窗后10秒退出游戏, 删掉或注释掉

1786797870972

1.2 运行异常!

如果闪退问题解决了, 你以为终于可以使用群鸟了, 那你就错了, 还有其他埋雷需要排查, 否则游戏无法正常游玩

1.2.1 运行异常一(v10.97以上版本, 极其严重!) modtable/44.lua 44行附近

lua
    local stat_img = e_util:ClonePrefab("rock_fire").image
    if stat_img then
        local stat_IMG = stat_img:gsub("_", ""):upper()
        if not _G[c_util:Caesar(stat_IMG, 3)]:find("AM") then
            m_util:ResetTime(0, "重置计时器")
        end
    end

此段代码是在v10.97版本加上的, 隐藏的极深

简单解释下:

  • 定义一个stat_img, 给其赋值为"rock_fire"实体的image属性值
  • 在scripts/data/redirectdata.lua文件中, "rock_fire"被定义为"sod_wir_up"(139行附近), 所以这里的stat_img = "sod_wir_up", 暂时没问题
  • 对stat_img进行字符处理(去掉下划线_, 并且进行字母大写upper), 得到:stat_IMG = SODWIRUP, 这也看不出什么
  • 重点来了, 对stat_IMG进行Caesar位移处理(字母向前位移3个单位), 即s变为p, o变为l, 最终SODWIRUP变成了PLATFORM, platform就是平台的意思. 简单来讲就是检测平台, 如果平台名字不包含"AM", 则执行可怕的事情! 当然Steam平台是包含"AM"的, 这颗炸弹藏得很深, 作者通过“贴图映射”将检测逻辑伪装成普通的资源处理代码,使其难以被发现
  • 重置计时器干了什么? scripts/util/modutil.lua中(991行附近), 作者对它进行了定义. 它将GetTime这个饥荒引擎的核心全局函数设置为了0, 游戏中所有的计时器都依赖这个返回值. 比方说刚刚那个检测函数, 会随时间消失, 但计时器被重置, 它就会再次检测, 一直时间回溯, 无限循环, 游戏卡死, 根本无法正确执行下去

1786829159028

1.2.2 运行异常二 modtable/44.lua 196行附近(需删掉,新版在203行附近)

此段会检测: 如果不是呼吸并且模组文件夹名不带("op"), 那么会发生后边的事, 具体什么事没试, 不过肯定没好事.

豆姐说会导致玩家按键失灵, 干扰聊天输入

steam创意工坊的模组在游戏中会自动加上workshop-的前缀(所以会包含op二字), 这个检测用来防WeGame私下使用的, 删掉或注释掉

lua
local path =  Mod_ShroomMilk.Mod['春'].path
if not m_util:IsHuxi() and not path:find("op") then m_util.IsTyping = function() return math.random() < .5 end end

1786798115514

1.3 用户数据清除

1.3.1 modtable/92.lua 103行附近(可删)

检测: 如果模组文件名不带"111"或者"spring", 那么就清空用户设置

删掉或注释

不删也影响不大, 因为我们是从322330的工坊文件夹复制的3161117403文件夹, 是带"111"的, 除非你自己将文件夹名字改了, 若要改就改个带"spring"的

lua
if not (modname:find("111") or modname:find("spring")) then t_util:Clear(s_mana.data) fn_save()end

1786798199087

2. 其他问题(不影响游玩)

场景描述:

在开启萌新的扫描地图后, 群鸟的虫洞标记失效

解决方法:

scripts/data/modtable.lua文件中, 318行附近, 删掉"扫描地图"和一个逗号

lua
{"地图图标+", "地图图标", "MapIcon", "扫描地图", "地形预览", "扫描地形"},

1786798445192

3. 无法使用官方的建筑对齐(不影响游玩)

场景描述:

打开游戏设置里边的建筑对齐, 却无法生效.

解决办法:

这个得修改群鸟秋 3161120380, modtable/5.lua文件中最后一行, 删掉即可

lua
GLOBAL.HAS_AXISALIGNED_MOD_ENABLED = true

上次更新于: