PalCaptureBosses - 服务端可捕获BOSS

PalCaptureBosses - 服务端可捕获BOSS

塔楼、捕食者和副本首领变得可捕捉——指的是游戏直接拒绝的那些,不仅仅是几率极低的那些。此模组在投掷期间解除限制,并自行决定几率,因此永远不会流于形式。服务器端:PC、Xbox和PlayStation玩家无需安装任何东西即可获得此功能。

[size=5][b]抓住那些游戏坚决不让抓的Boss——而不只是走个过场[/b][/size]

向塔主Boss扔帕鲁球在原版游戏中永远不会成功。这不是概率低的问题,而是系统性的拒绝:服务器二进制文件中为此专门设有一个失败原因,[b]EPalLogType::CaptureFailed_TowerBoss[/b]。

本模组在投掷期间解除该限制,并在投掷后恢复。但仅解除限制会让捕获变得[b]必定成功[/b],因为游戏自身的计算一旦解锁,几乎对所有情况都会给出肯定的结果。因此,模组也[b]自行决定概率[/b],使用自己的公式。

涵盖塔主Boss、捕食者和袭击Boss。野外Alpha Boss不在处理范围内——游戏本身就允许捕获它们,且会计算真实概率。

[size=4][b]纯服务端。客户端无需安装任何文件。[/b][/size]

纯Lua编写,由专用服务器上的UE4SS加载。PC、Xbox和PlayStation玩家无需改动任何文件即可获得相同体验。

[b]已在原生Linux专用服务器上经过生产环境测试[/b],使用[url=https://www.nexusmods.com/palworld/mods/5393]我们的GLIBC 2.28 UE4SS构建版[/url]——该页面是让这一切在Linux上运行的关键,并在此列为依赖项。在Windows专用服务器上则使用官方UE4SS。

在Palworld [b]v1.0.2.101103[/b]、UE4SS 3.0.1、原生Linux(BisectHosting)环境下实测。

[line]

[size=4][b]概率如何构建[/b][/size]

[code] 上限 = 等级上限 + 生命值 + 潜行 + 异常状态 + 暴击 概率% = 最小( 上限 , 上限 x 帕鲁球 x 玩家等级 + 坚持次数 x 帕鲁球 x 玩家等级 ) x 系数[/code] [b]上限[/b]是该Boss的极限,各种加成在此基础上累加。[b]系数[/b]封顶为1.00,因此在最终[i]系数[/i]之前不会超过上限。最终[i]系数[/i]是重新缩放整个概率表的单一数值。

[b]每次投掷都会进行判定。[/b]没有门控机制。

[b]等级上限[/b]——一把两端锚定在塔楼等级梯上的标尺,因此未来补丁新增塔楼时曲线会自动重新适配:

[code] 佐伊&格里兹博特 等级 10 14.01% 莉莉&莉琳 等级 20 12.30% 中等级Boss 等级 40 8.87% 莎雅&瑟琳 等级 55 6.30% 泽娜拉&阿斯特拉利姆 等级 80 2.01%[/code] [b]添加到上限的加成[/b]:

[code] Boss生命值1%时 +9.00 (等级10) ... +1.29 (等级80) 随等级缩放 潜行(背后攻击) +2.00 固定 目标身上的异常状态 +1.00 固定 暴击 +2.00 固定[/code] 生命值加成随等级缩放,因为1个百分点在2%的上限面前远比在14%的上限面前更有价值。满血无加成;随着Boss受到伤害,加成逐渐增长。潜行和暴击故意设为固定值——在高等级Boss身上达成这些条件在游戏内本身就更难,因此难度会自行缩放。这就是为什么暴击的相对权重从第一个塔楼的1.4一直增长到最后一个塔楼的10.0。

被计入的异常状态:燃烧、冰冻、中毒、潮湿、电击、暗黑、泥泞、藤蔓缠绕。即使同时有多个异常状态,也只计算一次。

[b]帕鲁球系数[/b],在服务器端实测而非从维基复制:

[code] 普通 7 分 0.100 高级 14 分 0.211 超级 20 分 0.305 终极 27 分 0.416 传说 38 分 0.589 古代I 58 分 0.905 古代II 64 分 1.000[/code] [b]玩家等级系数[/b]——达到或高于Boss等级时为1.00。低于Boss等级时,在[b]低20级时直接归零[/b]。归零是彻底的关闭:无论是暴击、古代II还是坚持次数都无法打开。

[b]坚持次数[/b]——对同一Boss每次失败投掷增加0.04,受上限封顶,按[i]物种[/i]计数(重新进入塔楼会生成新Actor,计数器不得因此重置)。当[b]Boss处于满血状态时重置[/b]:未受伤害的Boss是全新实例,没有可累积的进度。对其生命值造成1%的伤害后,累积又会正常运作——这正是需要被奖励的行为。

[size=4][b]这实际上需要付出什么代价[/b][/size]

平均捕获投掷次数,暴击约12%概率命中,坚持次数持续累积:

[code] 佐伊&格里兹博特 (等级 10) 满血 1%生命值 1%生命值 + 潜行 + 异常 普通 250 188 172 超级 103 71 64 传说 58 38 34 古代II 39 24 21

中等级Boss (等级 40) 普通 305 246 222 超级 135 100 87 传说 81 56 48 古代II 61 38 31

泽娜拉&阿斯特拉利姆 (等级 80) 普通 439 392 340 超级 291 216 160 传说 255 169 103 古代II 247 157 85[/code] [b]平均值不代表必然。[/b]在0.4%的概率下,半数玩家需要约170次投掷才能完成,二十分之一的玩家会超过750次。这是同样的骰子,不是运气差。

[size=4][b]玩家看到真实数字[/b][/size]

每次对Boss投掷会在聊天栏显示一行:

[code] [capture] LilyQueen 4.09% - 失败 [capture] LilyQueen 4.09% - 捕获成功 [capture] Zenara - 你的等级过低,已关闭[/code] 这是[i]那一次投掷[/i]的真实概率,背后没有任何隐藏。早期版本以暴击为门槛,打印的数字还需要乘以无人知晓的每Boss暴击率——宣布2%而实际值只有0.24%。你现在看到的数字就是实际判定的数字。

日志记录完整的推导过程,因此拒绝可以被审计:

[code] 判定 BP_LilyQueen_GYM_C: 上限 24.43% (等级 20, 潜行 +2.0 通过rpc, 生命值 7.31% 通过 GetHPRate -> +8.42 / 9.00, 异常状态 燃烧/潮湿 +1.00, 暴击 +2.00) x 帕鲁球 0.90 (BP_PalSphere_Body_Ancient1_C 58) x 玩家 1.00 (玩家 80 对比 20) = 21.987% + 坚持次数 0.76% (21次投掷) -> 22.747% x 系数 0.18 -> 4.094%, 判定值 13.94, 已拒绝[/code] [line]

[size=4][b]安装[/b][/size]

[code] ue4ss/Mods/PalCaptureBosses/ |- enabled.txt <- 空文件,但必需 |- Scripts/ |- main.lua |- config.lua[/code] 在服务器停止状态下复制进去。启动后,在UE4SS.log中确认:

[code] Loaded; hook=/Script/Pal.PalPlayerController:SetupInternalForSphere_ToServer, ...[/code] 如果缺少该行,说明模组未加载,其他一切免谈。

[size=4][b]配置[/b][/size]

所有内容都在 Scripts/config.lua 中。日常需要调整的关键参数:

[code] chanceFactor 0.18 塔主/袭击Boss的全局重缩放系数 predatorChanceFactor 0.90 同上,针对捕食者(单独校准) chanceAtMinLevel 14.01 等级10 Boss的上限 chanceAtMaxLevel 2.01 等级80 Boss的上限 playerGapDeadzone 20 低于Boss多少级后关闭 pityPerAttempt 0.04 每次失败投掷的坚持次数 criticalCeilingBonus 2.0 暴击加成 sneakCeilingBonus 2.0 潜行加成 statusCeilingBonus 1.0 异常状态加成 restoreDelaySeconds 12 Boss保持解锁的时间 chatFeedback true 每次投掷在聊天栏显示一行 applyCaptureFix true false = 仅报告,不改变任何内容[/code] [list] [][b]太难或太容易[/b] - 调整 chanceFactor。这是唯一能在保持帕鲁球、生命值、等级和加成之间比例的同时重新缩放整个概率表的参数[/] [][b]长尾分布让你不爽[/b] - 提高 pityPerAttempt;它在概率最差的地方起作用[/] [][b]帕鲁球选择感觉无关紧要[/b] - 降低 sphereMinFactor[/] [][b]恢复原版行为[/b] - 设置 applyCaptureFix = false[/] [/list] [b]捕食者有自己的系数。[/b]0.18是针对塔主Boss校准的。高等级捕食者的上限低,有效帕鲁球系数也弱,因此同一个0.18把它降到了每次投掷0.67%——有玩家为了一次捕获机会向一只76级的LazyDragon扔了167个帕鲁球。在实测的167次投掷中,0.90将中位数降到20次,绝大多数情况下在50次内捕获,同时仍保留了首投捕获的可能。

[line]

[size=4][b]已知限制[/b][/size]

[b]瞄准准星仍显示0%,这一点已实测确认。[/b]百分比是在客户端根据其本地数据库副本计算的;服务器不会发送该数字。一次探针测试将58个Boss的标记改为false并维持240秒不投掷——IsBoss_Database true->false, CaptureSuccessRate 1.0->0.8——准星仍保持0%。_Database后缀本身已经说明了问题:该值来自DataTable,而每一边都加载自己的副本。

有一个修复显示的客户端模组,[url=https://www.nexusmods.com/palworld/mods/5216]TrueCaptureRate[/url],它印证了诊断而非反驳——它挂钩的是WBP_CaptureReticle_C,一个在专用服务器上永远不会被构造的Widget蓝图。主机玩家完全无法使用它。其中有用的信息:准星应用了呈现曲线,显示值 = 真实值^(1/2.4),因此真实3%会显示为约18%。

[b]捕食者的封锁机制可能尚未完全摸清。[/b]一只LazyDragon有三个标记被写入并确认为false,但帕鲁球仍然弹开。又增加了三个候选控制开关(bIsUncapturable、bIsForceCapturable、IsPredator);它们是候选而非实测。

[b]捕获的帕鲁保留真实等级。[/b]早期版本会写入Boss等级以提高难度,导致逃脱消息和帕鲁箱中出现该等级。当前模组只读取等级,从不写入。

[b]潜行从未在实战中触发过。[/b]挂钩已生效且代码经过测试,但在所有记录的投掷中该标记都返回false——从背后命中Boss的难度足以让这种情况尚未发生过。

[size=4][b]如果你正在为Linux服务器编写模组,请阅读以下内容[/b][/size]

并非所有UE4SS调度机制都能在Linux构建版上触发:

[code] RegisterHook 可用 ExecuteInGameThread 可用 ExecuteInGameThreadWithDelay 可用,且准时 ExecuteWithDelay 从不触发 LoopAsync 从不触发[/code] 后两者共用一个每模组的异步线程,该线程在Linux上被有意禁用。失败是静默的:调度被接受,调用返回成功,回调却从不执行。本模组曾受影响——它从未恢复Boss的控制开关,这在游戏中不可见,因为重新进入塔楼会生成一个带原始标记的新Actor。

如果某些功能不起作用而日志一片空白,[b]先怀疑调度器,再怀疑自己的逻辑[/b]。详细信息和解决方法见[url=https://www.nexusmods.com/palworld/mods/5393]UE4SS Linux构建版页面[/url]。

[size=4][b]致谢[/b][/size]

思路的服务端重实现,源自yakuzadeso的[url=https://www.nexusmods.com/palworld/mods/132]CaptureBosses[/url],那是一个Windows DLL,无法在Linux服务器上加载。此处没有任何代码是从该模组移植的——该行为是在服务器二进制文件中重新发现的。

[size=4][b]源码[/b][/size]

完整源码、技术文档和问题追踪: [url=https://github.com/prado1506/palworld-PalCaptureBosses]github.com/prado1506/palworld-PalCaptureBosses[/url]

属于在原生Linux专用服务器上验证过的服务端Palworld模组集合之一。它们全部依赖的加载器在[url=https://www.nexusmods.com/palworld/mods/5393]这里[/url]。