野外精英的首杀权改为竞拍制:BOSS刷新前开放六十秒竞拍窗口,价高者的队伍获得首杀挑战权,出价冻结后未中标即时退款。窗口由定时触发驱动,竞拍的节奏感与公平性都在窗口里。
竞拍入口校验窗口期与出价高于当前标王,写入标王记录。actor是字符串,转对象后冻结押金。
local auction = { open = false, top = 0, topName = "" }
function openAuction()
auction.open = true
auction.top = 0
setontimerex(116, 60)
sendcentermsg("首杀竞拍开启,窗口60秒!")
end
function bidFirstKill(actor, price)
local player = class(actor)
if not auction.open then
sendmsg(actor, 0, "竞拍窗口未开启")
return
end
if price <= auction.top then
sendmsg(actor, 0, "出价需高于当前标王" .. auction.top)
return
end
if player:checkitemw("金币", price) == false then
sendmsg(actor, 0, "金币不足,无法出价")
return
end
player:takeitem("金币", price)
if auction.topName ~= "" then
giveitem(auction.topName, "金币", auction.top)
end
auction.top = price
auction.topName = player:GetName()
end
六十秒到点关闭窗口,标王队伍获得首杀挑战权,未中标者的冻结押金已实时退回。
function onAuctionEnd(actor)
if auction.topName == "" then
sendcentermsg("首杀流拍,BOSS转为自由争夺!")
return
end
sendcentermsg(auction.topName .. " 拍下首杀挑战权!")
auction.open = false
end
出价高于标王、低于拒绝、窗口外拒绝三路径验证;实时退款的金额与冻结一致。上线后看竞拍成交价曲线,首杀权价格走高说明BOSS产出物超值,产出与竞拍价联动平衡。
实时退款的giveitem按名字发放,标王改名的边缘场景要按唯一ID冻结,改名窗口期的押金会打水漂。auction表是进程内存,竞拍中途重启整场作废,开拍前公告竞拍的全局有效性以服务端结算为准。出价的price来自客户端要服务端复核区间,负数与超大数出价都是攻击面。sendcentermsg的竞拍播报只播开拍与成交两个节点,逐笔出价播报会刷屏。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 离线挂机收益不设折损时出现荒诞对比:挂机一周的收益超过手玩三天,勤奋上线变成劣势行为,日常玩法的参与率被自己的离线…
设计初衷 连续登录奖励的断签规则是留存系统的双刃剑:零容忍时,一次出差就清零 29 天连击,玩家的愤怒远超奖励本身的价值;无…
设计初衷 面板战力 50000 的玩家在竞技场打不过 38000 的对手——面板公式与实战表现的偏差超过两成时,玩家的信任崩…
底层原理 全量深拷贝保证整个隔离,但代价随数据规模线性放大:一张 500 键、三层嵌套的配置表,全深拷贝 2.1ms——热路…
底层原理 直接删除(表置 nil、清变量)是不可逆操作:删错一个玩家的邮件配置,找回只能靠备份。软删除把删除拆成两步:先打删…
底层原理 所有异常一股脑 pcall 加严重告警,结果告警系统被“材料不足”这类正常业务拒绝淹没——真正的系统故障反而被噪音…