悬赏捕杀把玩家之间的恩怨变成可托付的系统行为:仇家难以亲自复仇时,花费金条发布悬赏,全服玩家接单击杀目标后领取赏金。玩法的关键在两条链路:发布链路要防刷,防止用小号给自己刷赏金;结算链路要防误伤,击杀判定必须对准悬赏目标本人。本文从策划规则与接口实现两侧展开。
发布入口对目标等级、发布间隔、赏金档位做限制:目标与发布者等级差过小不予受理,同一目标同一时间只允许一条生效悬赏,防止多家叠加导致目标被围剿。示例代码如下:
-- 发布悬赏:校验通过后托管赏金
local player = class(actor)
local targetLv = tonumber(getbaseinfo(target, 1) or 0)
local myLv = tonumber(getbaseinfo(player, 1) or 0)
if math.abs(targetLv - myLv) < 10 then
sendmsg(player, 1, 0, "双方等级过于接近,不予受理悬赏。")
return
end
if not checkitemw(player, "金条", 1) then
sendmsg(player, 1, 0, "发布悬赏需要一枚金条作为赏金。")
return
end
takeitem(player, "金条", 1)
setplayvar(target, "HUMAN", "BountyOn", player, true)
sendmsg(player, 1, 0, "悬赏已发布,赏金进入系统托管。")
接单玩家击杀带悬赏标记的目标后,系统在击杀触发点核对标记并发放赏金;发放完成后立即清除标记,防止重复领取。示例代码如下:
-- QF触发: killmon 结算悬赏,触发体可取到被击目标
local player = class(actor)
local victim = arg2
local bountyFrom = getplayvar(victim, "HUMAN", "BountyOn")
if bountyFrom == nil or bountyFrom == "" then
return
end
giveitem(player, "金条", 1)
setplayvar(victim, "HUMAN", "BountyOn", "", true)
sendmsg(player, 1, 0, "悬赏完成,赏金已发放。")
sendmail("#" .. bountyFrom, 0, "悬赏结果通知", "悬赏目标已被击杀,赏金已交付接单者。", "")
测试覆盖四条分支:无标记目标被击杀不发放;带标记目标被击杀发放并清标记;同一目标被两人先后击杀只结算一次;发布者本人击杀悬赏目标应判定无效,防止自导自演。上线后监控每日悬赏发布量与结算量的比值,比值长期接近一时说明存在互相刷单的团伙,及时收紧等级差门槛。
防自刷规则最初只查发布者与目标的关系,没查接单者,结果出现发布者用小号接单领赏的循环,金条在两个号之间空转,托管池被套走近百枚。补上接单者与发布者的关联校验后,套利链路才断掉。另一处是标记清理时机:奖励发放与标记清除写成两步,中间报错会留下已结算但未清标记的目标,被人二次领取,改为发放成功后立即清除,并在日志里成对记录两个动作。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 装备回收商 NPC 每天按评分收购玩家的装备,裁决之杖、骨玉权杖按攻击、持久加权打分,榜上只要前五名。数…
实战应用:用在哪里 沙巴克攻城是全服行会战的最高舞台:攻方砸开城门、抢占皇宫,守方依托城墙与复活点反打。规则设计的关键是节奏…
实战应用:用在哪里 影分身玩法给法师职业补上生存短板:危急时刻召唤四个影分身分担仇恨,敌人需要在六格范围内分辨真身,猜错就浪…
实战应用:用在哪里 组队邀请、行会宣战这类关键信令丢了没有兜底,玩家只能反复手点,高峰期体验很差。重试机制给信令加确认回执:…
实战应用:用在哪里 新资料片上线首日预约量常是日常十倍,一口气全开会让数据库与登录网关同时过载。滚动开区把开区动作排成队列:…
实战应用:用在哪里 百人同屏的沙巴克外围战场,每个玩家每秒跑动会触发数次位置更新,全部即时下发时广播量随人数平方增长,网关先…