Skip to content

防作弊

Anti-cheat

所有金钱和库存决策均在服务器端完成。客户端仅负责渲染加油机并报告所发生的操作;它绝不决定任何物品的价格或注入了多少油量。

服务器强制执行的机制

  • 加油会话。 打开加油机时会向服务器请求会话令牌。付款需要该令牌,且计费升数会根据会话在配置的流速下实际打开的时长进行限制。客户端声称超过加油机物理极限的油量会被裁剪至时钟允许的范围内。
  • 会话过期。 令牌为一次性使用,绑定至打开它的玩家,并在 PumpSessionTimeout 后失效。过期的会话不会产生任何账单。
  • 距离检查。 购买、加油、充电、更换电池、灌装油桶、订购库存以及每一个仪表盘操作都会在服务器端重新检查玩家是否确实在该加油站,并允许 DistanceSlack 米的余量以应对角色位置延迟。
  • 速率限制。 每个事件和回调都会消耗来自玩家专属令牌桶中的一个令牌,该令牌桶按 PerSecond 速率恢复,且容量上限永远不超过 Burst。卡住的按键依然有效;而刷屏循环则会几乎瞬间触壁拦截。
  • 数值范围限制。 价格、工资、订单、取款和存款都在服务器端进行了边界检查和类型检查。任何超过 MaxAmount 的数值都不会被接受,且价格均严格保持在 Config.Refuel.PriceLimits 范围内。
  • 每项操作的权限检查。 管理员权限会在服务器端针对每个请求重新验证,绝不轻信来自 UI 的数据。雇佣、解雇以及编辑任何拥有 employees 权限的人员仅限所有者(owner)操作,因此员工无法提升自己的权限。转让和回购也仅限所有者操作,并需要手动重新输入加油站名称进行确认。
  • 库存与银行属于服务器状态。 只有在加油站确实有足够的升数且客户确实有足够的资金时,交易才会发生;双方的变动都在同一个服务器端步骤中完成。
config.lua
Config.AntiCheat = {
    RateLimit = { Burst = 14, PerSecond = 6 },
    MaxLitresPerPay = 200.0,
    LitreGrace = 3.0,
    PumpSessionTimeout = 900,
    DistanceSlack = 15.0,
    MaxAmount = 100000000,
    MaxWage = 25000,
    JerryPourTimeout = 600,
}
Setting Purpose
RateLimit 每个玩家事件令牌桶的突发大小与恢复速率
MaxLitresPerPay 单次加油或充电会话的硬性上限,无论计时结果如何
LitreGrace 计时检查的余量,以升为单位。用于覆盖高延迟 tick
PumpSessionTimeout 会话保持有效的时间(秒)
DistanceSlack 在加油站半径之外额外允许的米数
MaxAmount 从客户端接受的任何金钱数值的上限
MaxWage 所有者可以为员工设置的最高工资
JerryPourTimeout 未完成的倾倒在剩余油量无法再被索回之前被记住的时间(秒)

调整

默认设置适合普通服务器。其中有两个值得调整:

  • LitreGrace — 如果网络不佳的玩家在加油时遇到油量不足的情况,可以将其调高一到两升。请保持较小幅度;这相当于免费燃油。
  • RateLimit.Burst — 如果一个确实繁忙的加油区开始拒绝操作,请调高此项。如果你想收紧限制,请将其调低。

大幅放宽 MaxLitresPerPayDistanceSlack 会失去这些检查旨在提供的保护上限。只有在正常玩家明显受阻时才修改它们。