师徒传功是师徒关系的每日仪式:徒弟向师父传功,师父把毕生功力灌顶而来,双方各得巨额经验。传功的实现要点是每日一次的次数控制、师徒在场与关系的校验,以及经验的分档发放。
---传功:关系校验与每日一次
function ChuanGong.start(actor, masterName)
local player = class(actor)
if not player then return false end
-- 关系校验:传功对象必须是自己的师父
if getplayvar(actor, 2, "MasterName") ~= masterName then
sendmsg(actor, 1, "只能向自己的师父传功")
return false
end
-- 每日一次:日期键幂等
local dayKey = "CG_" .. os.date("%Y%m%d")
if (getplayvar(actor, 2, dayKey) or "") ~= "" then
sendmsg(actor, 1, "今日已传功,明日再来")
return false
end
setplayvar(actor, "HUMAN", dayKey, os.time(), 0)
ChuanGong.grant(actor, masterName)
return true
end
传功的三重校验:师徒关系的匹配(只能对师父发起)、每日一次的日期键幂等、双方在线的确认。传功的方向约定俗成:徒弟献功力,师父灌经验——徒弟获得当天经验的 50%,师父获得传功奖励的礼包。日期键按天生成,跨天自动失效,签到的幂等逻辑与传功共用同一套模板。
---传功奖励:双向的经验与道具
function ChuanGong.grant(actor, masterName)
local lv = actor:GetLevel()
-- 徒弟经验:当前等级升级需求的 30%
local exp = math.floor(UP_TABLE[lv] * 0.3)
sendmsg(actor, 1, "获得 " .. exp .. " 点修为")
-- 师父的传功礼:邮件发放
sendmail(masterName, 8015, "徒弟的敬奉",
actor .. " 完成了传功", "传功礼盒|1")
-- 双方的亲密度加成
local it = tonumber(getplayvar(actor, 2, "CG_Intimacy")) or 0
setplayvar(actor, "HUMAN", "CG_Intimacy", it + 5, 1)
end
传功的经验按当前等级升级需求的 30% 折算——徒弟的升级速度被师父的陪伴加速,师徒的绑定由此变实。师父的奖励走 sendmail 邮箱投递,离线也能收到。传功的场地要求:双方在同一地图且相距 5 格内,隔空传功的BUG在距离校验处被拦。传功的动画与音效由客户端渲染,服务端只负责校验与数据的结算,表现与逻辑各司其职。
传功的每日参与率统计,参与率与师徒数的比值反映功能渗透;经验的发放流水与升级曲线的对照,数值的偏差进配表校验。
日期键的时区曾经按 UTC 计算,晚八点就跨了天,东八区的基准统一后修复。传功的距离曾经不校验,两个师父徒弟号在不同地图也能传,5 格的距离判定补上。奖励的邮件曾经发给错误的收件人,名字传参颠倒师徒,参数的顺序单测锁死。
传功的经验比例与每日次数进配置表,版本调参不改代码。传功的交互动效与进度条由客户端播放,服务端只管账。师徒的传功与行会任务、日常任务共享每日清单的展示位,一键看清今日未完成的事项。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 版本更新上线后突然下架了某件热销商品,但更新公告里没有提到这件事。玩家发现后截图传播,两小时内贴吧帖子超…
实战应用:用在哪里 技能升级后缺少视觉与听觉反馈,玩家不确定升级是否成功。技能升级反馈在升级成功的瞬间展示金色光效、播放升级…
实战应用:用在哪里 点击其他玩家的角色时默认弹出查看面板,但在战斗中玩家希望点击即攻击。双击检测在单击查看的基础上增加双击攻…
实战应用:用在哪里 灵宠在战斗中作用有限,玩家养了宠物但缺少日常互动。灵宠派遣让宠物成为玩家的探索伙伴:派遣灵宠外出探索获取…
实战应用:用在哪里 宠物养成线只有喂食和升级,缺少宠物之间的对抗玩法。宠物竞技让两只宠物在专属竞技场进行自动对战,玩家通过调…
实战应用:用在哪里 测试环境直接复制生产库会把真实玩家数据暴露给开发和测试人员,存在隐私泄露风险。脱敏测试库的搭建分三步:从…