
练习课程:闭包模拟对象强化 (上)
模块化设计和事件分发框架的核心思路
LOADING
【课程功能规划】
本节课我们将实现一个完整的「每日任务系统」,包含以下核心功能:
✓ 任务物品创建:1339号物品(每日任务券)的配置与双击逻辑
✓ 任务配置表设计:小怪/BOSS双类型任务数据结构(含新手专属任务)
✓ 任务状态管理:防重复接取、进度实时追踪、跨天数据持久化
✓ 奖励发放机制:绑定元宝计算(小怪1元宝/只,BOSS 100元宝/只)
✓ 特殊场景处理:新手任务优先级、GM测试通道、前端动态刷新
要掌握本课程内容,您需要具备:
set_day_var/get_day_var
)json_to_table
转换错误等常见问题⚠️ 注:未掌握上述基础建议先学习《Lua脚本入门:从变量到表操作》课程
-- 任务配置表 (每日任务配置.lua)
local config = {
monster = {
{ name = "爆烈蜘蛛", boss = "魔力神教" }, -- 普通玩家任务
{ name = "独眼蜘蛛", boss = "符文道王" }, -- 新手专属任务
}
}
monster
存储小怪,boss
存储BOSS,通过索引区分player.new_player
判断是否为新人任务接取防重机制
function main(self)
if get_day_var("J33") ~= "" then
send_msg(self, "任务已领取,今日无法重复接取")
return
end
-- 生成随机任务并存储
local task = config.monster[math.random(1,2)]
set_day_var("J33", json.encode(task))
end
击杀进度动态追踪
function on_kill_monster(self, monster_name)
local task = json.decode(get_day_var("J33"))
if monster_name:find(task.name) then
task.current_count = (task.current_count or 0) + 1
set_day_var("J33", json.encode(task))
update_task_ui(self) -- 前端刷新
end
end
110
任务窗口ID绑定进度条 -- 错误示范 ❌
add_button(110, "击杀%s: %d/%d", task.name, current, total)
-- 正确写法 ✅
add_button(110, "击杀"..task.name..": "..current.."/"..total)
update_task_ui
重绘界面问题类型 | 解决方案 | 严重等级 |
---|---|---|
前端ID错位 | 确认110是否为任务主窗口ID(通过F11检查) | ⚠️⚠️⚠️ |
JSON转换异常 | 检查表中是否存在nil 值(table_to_json 会失败) | ⚠️⚠️⚠️ |
跨天数据清零 | 使用set_day_var 而非临时变量(自动每日重置) | ⚠️⚠️ |
新手任务冲突 | 首先检查player.new_player 状态再分配任务 | ⚠️ |
💡 经验提示:当遇到前端不刷新时,优先检查字符串格式化特殊字符(如
%
需转义为%%
)
函数 | 用途 | 关键参数 |
---|---|---|
callscriptex | 执行脚本命令 | player, "SENDMSG", ... |
get_day_var | 获取玩家变量 | "J33" (任务数据存储) |
set_day_var | 设置玩家变量 | "Z33", json_str |
graph LR
A[接任务] --> B[JSON序列化任务数据]
B --> C[set_day_var 存储]
C --> D[击杀怪物触发]
D --> E[json.decode读取]
E --> F[进度更新]
F --> G[table_to_json回写]
if player.new_player then
task = config.monster[2] -- 强制分配新手任务
else
task = config.monster[1] -- 普通任务
end
add_button(110, "进度:%d/%d", cur, total)
%
占位符"进度:"..cur.."/"..total
z33
等变量时,需确认是否被其他系统占用J33/J34
前缀player.new
(与引擎关键字冲突)player.new_player
set_day_var("TASK_CD", os.time())
)json_to_table
失败的具体报错案例(如空表处理)J33
改为TASK_DATA
更易维护)本课程内容充实且紧贴开发实战,通过完整任务系统案例串联Lua核心技能,评分:
⭐⭐⭐⭐⭐ 92/100
学员反馈:”终于搞懂任务进度存储逻辑,原来JSON转换是关键!” —— 996引擎实战班学员