两个管理员脚本帮我在 QBCore 中节省了数小时的服务器管理

发布: (2026年3月19日 GMT+8 01:25)
5 分钟阅读
原文: Dev.to

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 构建自定义自动售货机系统。

0 浏览
Back to Blog

相关文章

阅读更多 »

第2天:为什么仅仅更努力不足

当我还是个孩子的时候,我卖 Scout‑O‑Rama 票。数学很简单:敲更多的门,获得更多的销售,赢得更大的奖品。卖软件并不那么不同……

Razorpay 支付拆分路由

什么是 Razorpay Route?Razorpay Route 是 Razorpay 提供的功能,能够将收到的资金在不同的卖家、供应商、第三方之间进行分配。