
AutoLootNearbyItems - Linux 专用服务器补丁
六个修复让YellowChickDresseurNomade的AutoLootNearbyItems v1.3.9在原生Linux专用服务器上真正生效,在那里它能加载、宣布武装扫描,却从不拾取任何东西。失效的调度器、Lua 5.4编译错误、一名玩家收到所有物品,以及仅限Windows的配置路径。经作者许可发布。
查看大图[size=5][b]AutoLootNearbyItems Linux 服务器补丁[/b][/size]
[b]这不是一个新模组。[/b]它是针对
[url=https://www.nexusmods.com/palworld/mods/3430][b]AutoLootNearbyItems v1.3.9
作者:YellowChickDresseurNomade[/b][/url] 在[b]原生 Linux 专用服务器[/b]上的兼容性构建。
共六项修复,未添加或移除任何功能。该模组所有安全保障均来自原作者,且未被改动。
[size=4][b]问题症状[/b][/size]
模组加载,在日志中宣布扫描已就绪——但从未拾取任何物品。
[code]
AutoLootNearbyItems v1.3.9 chargement...
Boucle de scan armee, intervalle=5000ms
Init armee - scan en attente du monde (WorldInitialized=false)[/code]
看似正常,实则不然。
[size=4][b]服务端专用。客户端无需安装任何内容。[/b][/size]
纯 Lua,由专用服务器上的 UE4SS 加载。
[b]已在生产环境的原生 Linux 专用服务器上测试[/b],使用
[url=https://www.nexusmods.com/palworld/mods/5393]我们的 GLIBC 2.28 UE4SS 构建[/url]——该页面是
让这一切在 Linux 上运行的关键,并在此列为依赖项。在 Windows 上,请使用原版;此处内容在 Windows 上均不需要。
实测于 Palworld [b]v1.0.2.101103[/b]、UE4SS 3.0.1、原生 Linux
(BisectHosting)。
[line]
[size=4][b]六项修复[/b][/size]
[b]1. 扫描从未运行。[/b]模组通过 LoopAsync 调度其循环,但
[b]该机制在此 UE4SS 构建上不会触发[/b]——调度请求被接受,
调用返回成功,但回调从未执行。已替换为
ExecuteInGameThreadWithDelay,每次扫描后重新调度自身。
即使扫描抛出异常也会重新调度,否则一个有问题物品会导致模组在本次会话剩余时间内停止工作。
[b]2. 脚本在 Lua 5.4 下无法编译。[/b]两处对[i]for[/i]循环控制变量进行了重新赋值:
[code]
for line in fh:lines() do
line = line:gsub("%s+", "") -- 在 5.4 中报错[/code]
在 Lua 5.4 中该变量是常量,导致[b]整个[/b]脚本无法加载。
在 LuaJIT/5.1(模组编写时的目标环境)中这是合法的。已通过单独的
local 变量修复,兼容两者。这个问题比看起来更重要:在 5.4 构建上
模组根本无法到达调度器问题那一步——它压根没有加载。
[b]3. 一名玩家收到所有物品。[/b]模组通过 FindFirstOf 解析[i]一个[/i]控制器。
在客户端这是正确的——只有一个本地玩家。
在专用服务器上,它返回引擎首先移交的任意一个,导致一名玩家获得所有物品,
拾取半径也围绕错误的人计算。已通过轮换修复:每次扫描归属一名玩家。
[b]4. 轮换本身有误。[/b]它在每次 GetPlayerController() 调用时推进,
而模组每次扫描调用四次——导致物品按与一名玩家的距离选择,
却交付给另一名玩家。
[b]5. 按值传递 FTransform 导致服务器崩溃。[/b]m:GetTransform() 按值返回
FTransform,要求 16 字节对齐;UE4SS 在 Lua 栈上构建缓冲区时
不保证对齐,服务器因“未对齐的内存访问(SIMD 向量?)”而崩溃。
已替换为 Transform 属性。
[b]6. 仅限 Windows 的路径。[/b]config.txt 和防崩溃日志仅存在于
Windows 路径格式中,因此[b]配置在此服务器上从未被读取[/b]——只应用了
main.lua 中的默认值。日志的问题更糟:在 Linux 上
io.open("Mods\\...\\pending.txt") 不会失败,它会在工作目录中创建一个文件名含反斜杠的文件。
[line]
[size=4][b]安装[/b][/size]
[code]
ue4ss/Mods/AutoLootNearbyItems/
|- enabled.txt
|- config.txt
|- info.json
|- Scripts/main.lua[/code]
首先从你的 ~mods 文件夹中[b]删除 AutoLooterOutsideBases_P.pak[/b]。该 pak
替换了掉落物蓝图(BP_MapObject_CommonDropItem3D),并与此模组争夺同一掉落物。
值得了解该 pak 为何无法在专用服务器上工作,因为这并非它的缺陷:
该蓝图调用 RequestPickup() 时无参数,会解析为[i]本地玩家[/i]。
服务器上没有本地玩家。此模组使用接受接收者的原生变体:
[code]
void RequestPickup_ServerInternal(int32 RequestPlayerId);[/code]
启动时,在 UE4SS.log 中确认:
[code]
Scheduler: ExecuteInGameThreadWithDelay (LoopAsync is dead on this build)
Monde pret - scan actif. master=ON | radius=100.0m[/code]
第一行是修复 1 的实际效果。第二行在有人加入时出现——模组
通过 ServerAcknowledgePossession 钩子等待世界,该钩子在此环境中正常工作。
[size=4][b]配置[/b][/size]
在 config.txt 中。注释以 ; 或 # 开头。压缩包中附带的值是在我们服务器上运行的值,
并非模组的原始默认值:
[code]
Enabled 1 开启模组
PickupRadiusCm 8000 拾取半径(80 米)
ScanIntervalMs 3000 扫描间隔
MaxPickupsPerScan 10 每次扫描最大物品数
EnableDrops 1 地面物品
EnablePickupItems 0 蛋、石头、帕鲁球(约 1500 个对象)
EnableFruitTrees 1 果树
SkipWhenInventoryFull 1 背包满时不拾取
SkipInsideBaseCamp 1 基地内不拾取
SkipUnreadableDrops 1 跳过无法读取数据的物品
InitDelayMs 10000 首次扫描前等待时间
VerboseLogging 0 详细日志
ChatFeedback 1 拾取时发送聊天消息
KeyToggle / KeyDiagnostic F2 / F3 - 在服务器上无效[/code]
[b]EnablePickupItems 特意保持关闭[/b]——它会扫描约 1500 个对象,
原作者标记为仍需验证。请在确认服务器稳定后单独开启它。
[b]请勿将 ScanIntervalMs 调至 3000 以下。[/b]原作者记录表明 1000ms
会导致 Palworld 1.0 崩溃,代码因此强制执行该最小值。
[b]SkipInsideBaseCamp 默认开启。[/b]在基地内,帕鲁们会自行收集掉落物,
并且生产环境中的工作台会在原地累积产出——在其上方拾取会逐渐清空基地。
按键在专用服务器上无效:RegisterKeyBind 需要本地输入。
没有游戏内开关——请使用 Enabled 并重启。
[size=4][b]原版模组自带的安全保护[/b][/size]
以下内容并非我所写,却是模组最有价值的部分。作者付出了惨痛代价才获得这些经验:
[list]
[*][b]防崩溃日志。[/b]某些地面物品在拾取时会[b]导致服务器挂起[/b]:RequestPickup_ServerInternal 在 C++ 内同步中断,pcall 无法防护。模组在尝试前记录物品位置;若服务器崩溃,该物品将在下次启动时被永久列入黑名单[/*]
[*][b]playerId 严格为 int32。[/b]如果属性返回浮点数或 userdata,原生调用会中断。模组进行转换,无法转换则放弃[/*]
[*][b]异常数量防护。[/b]数量超过 9999 的槽位——典型于无限堆叠模组——在拾取堆叠时会冻结游戏。模组先读取计数并跳过[/*]
[*][b]权限防护。[/b]仅当角色拥有权限时才调用服务器路径;否则调用会导致原生段错误[/*]
[/list]
如果遇到拾取崩溃,日志会说明该位置的掉落物已被永久禁用。
[size=4][b]已知限制[/b][/size]
[b]每次扫描仅一名玩家。[/b]多名玩家在线时,每位玩家被服务的频率降低:
四人以 5 秒间隔意味着每人每 20 秒才收集一次。将间隔调至 3000 有帮助,但不能更低。
[b]无游戏内控制。[/b]F2/F3 在服务器上无效。
[b]每次扫描最多 3 件物品。[/b]作者为防止冻结而故意设置的限制。
大堆物品需要多个周期才能收集完。
[b]注释和消息已翻译。[/b]原版为法语;注释和控制台消息已改为葡萄牙语且不含重音——服务器控制台无法可靠渲染 UTF-8,重音会显示为“?”。这导致与作者原版的差异被放大,
但这是一个刻意的取舍:日志在生产环境中会被阅读。
[size=4][b]如果你在为 Linux 服务器编写模组,请阅读以下内容[/b][/size]
[code]
RegisterHook 可用
ExecuteInGameThread 可用
ExecuteInGameThreadWithDelay 可用,且准时
NotifyOnNewObject 可用,但服务器端不存在 PalHUDService
ExecuteWithDelay 永不触发
LoopAsync 永不触发
RegisterKeyBind 可加载,但无效果(无本地输入)[/code]
详情和解决办法见
[url=https://www.nexusmods.com/palworld/mods/5393]UE4SS Linux 构建页面[/url]。
[size=4][b]致谢[/b][/size]
原版模组:
[url=https://www.nexusmods.com/palworld/mods/3430][b]ChickNomad - AutoLootNearbyItems
v1.3.9[/b][/url] 作者 [b]YellowChickDresseurNomade[/b]。权限
防护由他们致谢 [b]dioxen[/b](AutoLootHighlight,Nexus 4173)。
已获作者许可在此发布。本页面所有更改均为 Linux 兼容性工作;未添加或移除任何功能。
[size=4][b]源代码[/b][/size]
补丁源代码及完整技术文档:
[url=https://github.com/prado1506/palworld-AutoLootNearbyItems]github.com/prado1506/palworld-AutoLootNearbyItems[/url]
属于在原生 Linux 专用服务器上验证过的服务端 Palworld 模组合集的一部分。
它们共同依赖的加载器见[url=https://www.nexusmods.com/palworld/mods/5393]此处[/url]。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。