周末 double 经验、节日 double、VIP 加成、组队加成同时生效时,倍率乘出 16 倍的天文数字(历史事故复盘里真实发生过的四层叠乘)。倍率仲裁器:多来源加成统一登记,仲裁器按“加法合成、乘法封顶”输出最终倍率——来源可以多,总闸必须有一个。
倍率登记与仲裁:各来源报加成值,仲裁器加法合成后对上限封顶。示例代码如下:
local boosters = {}
local CAP = 300
local function registerBoost(name, rate)
boosters[name] = rate
end
local function unregisterBoost(name)
boosters[name] = nil
end
local function arbitrate()
local total = 100
for _, rate in pairs(boosters) do
total = total + rate
end
if total > CAP then
total = CAP
end
return total
end
经验结算接入:以仲裁结果为准发放,倍率来源写入明细。示例代码如下:
local function grantExp(actor, baseExp)
actor = getplayerbyname(actor)
local rate = arbitrate()
local finalExp = math.floor(baseExp * rate / 100)
giveitem(actor, "经验丹", math.max(1, math.floor(finalExp / 1000)))
sendmsg(actor, 1, "获得经验 " .. finalExp .. "(倍率 " .. rate .. "%)。")
end
registerBoost(name, rate)/unregisterBoost(name):加成来源的动态登记与注销,活动开关同时增删。arbitrate() 加法合成全部来源(周末 +50、节日 +50、VIP +30 即 230%),对 CAP=300 封顶——加法合成杜绝乘法叠乘的指数爆炸,封顶杜绝无上限膨胀。giveitem 第四参 bind 传 1,经验类产物绑定。
倍率仲裁踩过三个坑:一是四个系统各自为政直接乘,双倍卡(×2)叠双倍活动(×2)叠 VIP(×1.5)叠组队(×1.3)乘出 7.8 倍,经济一周通胀告警;二是封顶值写成了 3000(少个百分号),上线当天没人发现,周报里经验产出翻十倍才暴露,封顶值必须进配置并每周对账;三是活动下线漏调 unregister,下线的活动加成阴魂不散,登记与注销必须成对出现且在活动结束钩子里强制注销。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 生存向属性的堆法单一:全堆血防就能站桩——挨打没有反馈,进攻方也没有取舍。反伤与荆棘设计:引入"被打反伤"机制并配…
设计初衷 活动做过就下架:老玩家念着当年的中秋灯会,新玩家永远错过——内容资产利用率极低,新玩法的开发压力却全压在增量上。活…
底层原理 一条业务请求(聊天、交易、入队)前面总挂着同样的横切逻辑:鉴权、限频、日志——每个入口各写一遍必然重复。中间件模式…
底层原理 求区间和(第 3 到 17 名的战力总和):前缀和预处理后查询 O(1),但单点更新要 O(n) 重算整张前缀表;…
设计初衷 玩家的江湖故事散落在各系统的角落:成就页有里程碑、战绩页有击杀、名人堂有荣誉——拼不出一个完整的"人"。玩家传记设…
业务场景 玩家跑商只能身上背货:负重有限、路线自己跑、货物分站下不去。马车货运封装:驿站雇马车按固定线路多点卸货,载重按马车…