
儿童金 - 经验追赶加成
落后于其他玩家的玩家将获得额外经验值,直到他们追赶上来。落后20级时经验值翻倍,随着差距缩小,加成会自动减弱,因此没有人会超过目标。任何人都不会被减速。仅限服务器端,玩家无需安装任何内容,跨平台游玩可用。这是Hartz 4的对应机制。
查看大图功能简介
落后于服务器其他玩家的玩家将获得额外经验值,直到他们追上来为止。随着差距缩小,加成会自动逐渐消失,因此不会有人超过目标。
落后20级 -> 双倍经验
落后10级 -> +33%
落后5级 -> 无加成
没有人会被减速。 Kindergeld 只会增加经验,绝无任何惩罚机制。
这个模组是为你那位晚三周加入服务器、发现其他人都40级、第一个晚上就放弃的朋友准备的。他可以在一两个游戏时段内追上来,一旦追上,加成便会自动消失——你无需记得手动关闭任何东西。
仅限服务端。 你的玩家无需安装任何东西,跨平台联机也不受影响。
追赶目标
差距是相对于一个参考等级来衡量的,你可以选择参考等级的定义:
- 最高 - 服务器上的最高等级玩家。这是“追赶”最直观的理解,也更容易向玩家解释。(默认)
- 平均 - 已知玩家的平均等级。更温和:它可以防止一位高等级老玩家把整个服务器变成加成区。
离线玩家也会被计入,因此你的最高等级玩家晚上下线时,参考等级不会瞬间崩塌。任何停止登录的玩家会在 ForgetAfterDays(默认14天)后被移除——否则,一位数月前退坑的老玩家会让参考等级永久保持在高位,导致每个新玩家都永远享受加成。
日志会在参考等级变化时告知你:
[Kindergeld] 参考等级 12 -> 10 (N)
游戏内消息
一条聊天消息,只有该玩家能看到。 在加入时,以及加成开始或结束时显示:
[Kindergeld] +70% XP -- 落后7级。等级3,落后N 7级。
[Kindergeld] 已追平,恢复普通经验值。
屏幕中央的红色大横幅。 服务器全服广播,因此消息总会提及涉及的玩家。可设为关闭、仅在变化时显示,或每次加入时显示——由你决定。
默认为英文。 config.Text 可以覆盖任何单行文本,其余部分保持英文默认,因此你可以按需翻译任意多或任意少。完整的德文翻译块已注释在 config.lua 中,可直接取消注释使用。
安装
- 在服务器上为 Palworld 安装 UE4SS。
- 将 Kindergeld 文件夹复制到 Pal/Binaries/Win64/ue4ss/Mods/
- 编辑 Kindergeld/Scripts/config.lua
- 重启服务器。
检查 Pal/Binaries/Win64/ue4ss/UE4SS.log:
[Kindergeld] v1.0.0 加载中
[Kindergeld] 每15秒轮询,参考 = 最高
当一位落后的玩家实际获得经验时:
[Kindergeld] XP写入器已解析:IndividualParameter.SaveParameter.Exp (214 -> 219)
[Kindergeld] Pinkberg 获得 7 经验值,+5 加成 (落后7级 -> x1.70)
第一行是关键。 如果它从未出现,则说明没有任何东西在添加经验。
配置
加成
GapStart 5 差距小于或等于此值时无加成
GapFull 20 从该差距起获得全部加成
MaxXpBonus 1.00 1.00 = 最高+100%,即双倍经验
在 GapStart 和 GapFull 之间,加成呈直线递增。
参考
Reference "highest" 最高等级玩家 (默认)
"average" 已知玩家的平均等级
UsesRemembered true 是否计入离线玩家
ForgetAfterDays 14 超过此天数未出现的玩家将被移除
0 = 永不遗忘任何人
豁免玩家
ExemptPlayers {} 无加成,且不计入参考等级
适用于管理员、工作人员和测试角色,否则他们会拖动参考等级。可使用名称或 PlayerUId(不区分大小写)——UId 更安全,因为它不受改名影响。你可以在 Kindergeld_state.lua 中找到 UId。
config.ExemptPlayers = { "SomeAdmin", "2BE6A413000000000000000000000000" }
消息
Notify true 下方所有内容的總开关
ChatMessages true 一条聊天消息,仅该玩家可见
ChatCategory 0 聊天频道字节
RedNotice "changes" "off" / "changes" / "all"
Text 文本内容,默认为英文
其他
PollSeconds 15 采样间隔
Verbose true 日志中的每次轮询细节
StateFile "Kindergeld_state.lua"
常见问题
有人会损失经验值吗? 不会。Kindergeld 只会增加经验。
有人能刷加成吗? 不可能持续刷。加成取决于差距,每次轮询时都会重新计算。玩家每升一级,加成就会缩小。当他们与参考等级的差距进入 GapStart 范围内时,加成即为零。
新人加入又离开——服务器会保持加成状态吗? 参考等级是最高玩家,因此新人永远不会改变它。新人只有在 Reference = "average" 时才会影响参考等级。
我们最高等级玩家退坑了。所有人都会永久享受加成吗? ForgetAfterDays 在14天后会将其移除(默认),且参考等级每次轮询都会重新计算,不会永久保留。
如何让管理员不参与其中? 使用 ExemptPlayers。他们不会获得加成,也不会计入参考等级,因此不会扭曲其他玩家的差距。
如何重置? 删除服务器可执行文件旁的 Kindergeld_state.lua。它是纯 Lua 文件,你也可以手动打开编辑。
我想让所有人永久获得双倍经验。 你找错模组了。Kindergeld 是刻意设计为相对性的——玩家一旦追上,它便什么也不做。
请勿与 Hartz 4 同时运行
Hartz 4 会减速领先的玩家。Kindergeld 会加速落后的玩家。两者都会在每次轮询时写入同一个经验字段,如果三名玩家等级分别为1、25和50,中间的玩家会同时比最低者高24级(惩罚)且比最高者低25级(加成)。
请二选一。它们是对同一问题的两种答案,而非一套组合。
你无需相信我的话——这两个模组自身也会强制这一点。每次轮询时,它们都会在服务器可执行文件旁写入一个时间戳(Kindergeld_running.tmp、Hartz4_running.tmp)并检查对方的时间戳。新鲜的时间戳意味着对方正在运行,于是:
- 所有人的经验获取为0%,包括豁免玩家。每获得的一点经验都会在下一次轮询时被直接扣除。
- 红色横幅每20秒出现一次:冲突:Kindergeld + Hartz 4 -- 无经验!请移除其中一个。
- 日志也会以醒目方式提示同样信息。
此警告会刻意忽略 Notify 和 RedNotice 设置。你无法通过配置关闭此警告,因为静默版本比没有更糟。
移除任一模组后,45秒内冲突会自动消除——无需重启,无需手动重置:
[Kindergeld] Hartz 4 已消失,冲突已解决。恢复正常。
之前运行遗留的 .tmp 文件永远不会触发此警告:任何在服务器启动前标记时间戳的文件都会被忽略。
这要求另一侧使用 Hartz 4 1.11.0 或更高版本。如果遇到旧版 Hartz 4,Kindergeld 仍会冻结经验并显示横幅——只是它独自完成这项工作。
1.0 版本中经验值的实际存储位置
如果你在编写自己的模组,值得一读。已在v1.0.1.100619构建版本上通过运行时枚举真实类链验证,而非SDK转储。
现已不存在可调用的经验写入UFunction:
PalIndividualCharacterParameter GetExp / GetRankUpExp 仅有,加上委托
PalCharacterParameterComponent 无任何经验函数
PalPlayerState 无任何经验函数
PalPlayerController Debug_AddPlayerExp_ToServer
Debug_AddPartyExp_ToServer
Debug_AddExpForAllPlayer_ToServer
这三个 Debug_ RPC 运行时不会报错但也什么都不做——它们已在发布版构建中被移除。如果你调用其中一个但没有事后读回数值,你会误以为它生效了。
经验是一个普通的结构体字段,可直接写入:
IndividualParameter.SaveParameter.Exp
Kindergeld 会解析一次,通过读回验证,并记录结果。如果读回无变化,它会明确说明,而不是默默无闻地什么都不做。
1.0 版本中向玩家发送文本
PalPlayerController::EnterChat_Receive(消息:StrProperty, 类别:ByteProperty)
这是每玩家频道,类别0。对于全服红色横幅:
PalGameStateInGame::BroadcastServerNotice(公告消息:StrProperty)
这与 RCON Broadcast 命令背后的函数相同。
没有面向单人的红色横幅。 SendAlertDialog_ToClient 接受 NameProperty 本地化键而非自由文本,唯一的其他候选是被移除的 Debug_ RPC。SendLog_ToClient 在此构建版本上会直接抛出异常。
给其他模组作者的提示
在构建此模组过程中,我曾两次导致线上服务器崩溃,得出以下两条规则:
- 切勿调用仅凭名称匹配到的 UFunction。 请枚举类链,读取签名,然后再调用。对“notif”的名称搜索可能会返回某些需要你并不拥有的结构体的函数。
- 切勿批量读取任意属性值。 遍历每个属性并调用 tostring 会触发不可捕获的原生崩溃。pcall 也无法救你。请列出名称和类型,仅读取标量类型的值。
已知限制
- 仅限经验值。1.0 版本没有可用的战利品或采矿钩子。
- 加成会在经验获得后的下一次轮询时到达,因此最多延迟 PollSeconds 秒。不会有东西丢失,只是成批到达而非每次击杀即时发放。
要求
服务器上安装 UE4SS。客户端无需任何东西。
许可证
MIT。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。