坐骑喂养给马匹加移动速度与负重:每次喂养加零点五点成长,上限一百点封顶,两百次喂满。线性成长配硬上限是最不容易出数值事故的曲线,实现的重点在封顶判定与喂养材料扣减的原子性。
喂养入口校验材料与上限,成长值按零点五累进,触顶后提示转换成外观饲料。actor是字符串,转对象后读写成长变量。
local function feedOnce(actor)
local player = class(actor)
local growth = tonumber(getplayvar(actor, 2, "MOUNT_GROW") or "0")
if growth >= 100 then
sendmsg(actor, 0, "坐骑已喂养至满级,可改喂外观饲料")
return false
end
if player:checkitemw("精饲料", 1) == false then
sendmsg(actor, 0, "精饲料不足,马厩有售5000金币一袋")
return false
end
player:takeitem("精饲料", 1)
local next = math.min(100, growth + 0.5)
setplayvar(actor, "HUMAN", "MOUNT_GROW", next, 1)
sendmsg(actor, 0, "喂养成功,成长" .. next .. "/100")
return true
end
每二十点一个阶段,达成时邮件发放阶段坐骑外观,成长与外观解耦便于后续加皮肤。
local function checkStage(actor, growth)
local stage = math.floor(growth / 20)
local got = tonumber(getplayvar(actor, 2, "MOUNT_STAGE") or "0")
if stage > got then
setplayvar(actor, "HUMAN", "MOUNT_STAGE", stage, 1)
sendmail(actor, 0, "坐骑阶段奖励", "成长达到" .. stage * 20 .. "点", "坐骑外观箱|1")
end
end
连喂两百次验证精确触顶与材料扣减一致;阶段邮件五封逐封核对。上线后统计满级坐骑占比,比例超过三成说明封顶太低,开第二成长线而不是单纯抬上限。
成长值用零点五步进,浮点累加两百次后出现49.9999这类毛刺,改用整数存千分位,展示时再除十。next在个别旧分支是保留字风格命名,换stepName规避兼容性风险。checkitemw与takeitem之间插了上限判断,三步必须连续,中间yield会让材料与成长对不上账。阶段邮件用MOUNT_STAGE差值判定,连续跨两个阶段也只发一次,漏发比重发难处理,发送前比对已发集合。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 悬赏捕杀把玩家之间的恩怨变成可托付的系统行为:仇家难以亲自复仇时,花费金条发布悬赏,全服玩家接单击杀目标…
实战应用:用在哪里 策划改表是日常动作,漏填字段、引用了不存在的编号、数值越界这三类问题占了配表故障的绝大多数。等玩家报错再…
实战应用:用在哪里 行会擂台给中小行会提供了固定的对抗出口:挑战方击败守擂方后接管擂台,连胜次数决定每日结算奖励档位。接口层…
实战应用:用在哪里 世界首领战里玩家最关心的是伤害前十名:榜单要求随时插入、随时能按序取出,每来一条伤害记录都重新排序一次太…
实战应用:用在哪里 百人同屏的攻城战里,把每条移动、施法消息广播给全地图是最常见的性能失误。九宫格视野的做法是把地图切成等大…
实战应用:用在哪里 留言板、行会招募语、邮件标题这类字段会被玩家自由填写,并写入角色变量或转发给持久层。拼接式的写法一旦遇到…