两个管理员脚本帮我在 QBCore 中节省了数小时的服务器管理
I’m happy to translate the article for you, but I need the full text of the post in order to do so. Could you please paste the article’s content (excluding the source link you’ve already provided) here? Once I have the text, I’ll translate it into Simplified Chinese while preserving the original formatting, markdown, and technical terms.
管理实时 RP 服务器的问题
运行 QBCore RP 服务器意味着要应对两个反复出现的难题:
- 玩家卡在错误的职业,或者你需要在会话中快速分配角色——通过数据库或现有管理员菜单操作速度慢。
- 不活跃的玩家在数据库中累计数月,留下带有车辆、角色和永不再用的数据的“幽灵”。
我编写了两个脚本来解决这两个问题:lokat_adminjob 用于实时职业管理,lokat_cleanup 用于数据库清理。
lokat_adminjob — 从 UI 面板分配工作
权限系统
脚本在两层检查权限——首先是 txAdmin ACE,然后是 QBCore 原生的 admin/god 标记。这在使用 txAdmin 管理的服务器以及原生 QBCore 环境中都能正常工作。
local function hasAdmin(src)
if IsPlayerAceAllowed(src, Config.AceName) then
return true
end
if QBCore.Functions.HasPermission(src, 'admin')
or QBCore.Functions.HasPermission(src, 'god') then
return true
end
return false
end
权限检查始终在服务器端执行;客户端仅发送请求。未授权的调用服务器事件的尝试会被阻止。
ps‑multijob 集成
如果玩家拥有的工作与 ps‑multijob 中的副业相同,并且你将其设为主业,就会产生冲突。脚本会自动处理——在设置新主业之前,会移除任何匹配的副业条目。
-- Remove conflicting side job before assigning main job
PMJ_RemoveJobByName(target, jobName)
target.Functions.SetJob(jobName, grade)
当完全移除工作(设为失业)时,也会同时清除所有副业——一次性干净的操作。
面板显示内容
管理员打开面板时,服务器会发送实时快照:
- 所有可用工作及其等级。
- 所有当前在线玩家及其当前工作。
管理员选择玩家、选择工作和等级后提交。更改会立即生效,且通知会同时发送给管理员和目标玩家。
Source:
lokat_cleanup — 非活跃玩家清理工具
工作原理
通过指令打开 UI,设置非活跃阈值(默认:60 天),脚本会查询数据库中 所有 角色的 last_updated 时间戳均早于该阈值的账户。
结果按许可证分组(每个账户一行),显示:
- 与账户关联的角色名称(带链接)
- 最近活跃日期
- 拥有的车辆数量
- 角色总数
-- 按许可证分组,获取所有角色中最近的活动时间
SELECT license FROM players
GROUP BY license
HAVING MAX(last_updated) <= (NOW() - INTERVAL ? DAY)
安全检查
在删除任何账户之前,服务器会检查该许可证下是否有角色当前在线。如果有,删除操作将被阻止。
for _, row in ipairs(rows) do
local p = QBCore.Functions.GetPlayerByCitizenId(row.citizenid)
if p then
cb({ ok = false, error = 'player_online' })
return
end
end
你还可以选择是否一并删除关联的车辆——此选项在每次删除时可切换。
搜索与分页
针对大型玩家数据库,UI 支持角色名称搜索、分页以及排序(最旧优先或最新优先)。
配置概览
两个脚本都使用一个简单的配置文件。
lokat_adminjob
Config.AceName = 'your_ace_permission_name'
Config.OpenCommand = 'your_command_name'
Config.MultiJob = { Enable = true }
lokat_cleanup
Config.MinDaysInactiveDefault = 60 -- adjust to your needs
Config.PageSize = 50
Config.UseAcePermission = true
Config.AceName = 'your_ace_permission_name'
为什么会有这些
大多数 QBCore 的管理员任务要么需要直接访问数据库,要么需要在并非为快速操作设计的菜单中导航。这两个脚本专门为我反复执行的特定操作而构建,消除了日常服务器管理中的大量摩擦。
接下来:第5卷 — 为 QBCore 构建自定义自动售货机系统。