⚙️ 一、任务系统Lua实现
1. 任务数据结构
任务状态通过 table
管理,关键字段包括:
local taskData = {
status = 0, -- 0=进行中, 1=已完成, 2=已发奖
okInfo = { -- 完成条件记录
killmon = { ["祖玛教主"] = 2 }, -- 需击杀2只祖玛教主
item = { ["沃玛号角"] = 1 }, -- 需提交1个沃玛号角
var = { ["GuildKillCount"] = 10 } -- 需行会击杀变量≥10
},
endTime = os.time() + 3600 -- 任务过期时间(1小时后)
}
2. 任务API封装
核心函数调用示例:
-- 接取任务ID=1001
local taskResult = mode.task.takeTask(actor, 1001, true)
if taskResult.status == 0 then
SendMsg(actor, "任务【除魔卫道】已开始!")
end
-- 提交任务(服务端验证)
mode.task.submit(actor, 1001, true) -- 参数3=true同步客户端
3. 条件检测脚本
在 QFunction-0.txt
中动态更新任务进度:
[@OnKillMon]
#IF
IsEqual(monName, "祖玛教主") -- 击杀特定怪物
#ACT
UpdateTaskProgress(actor, 1001, "killmon", "祖玛教主", 1) -- 进度+1
📦 二、道具系统Lua实现
1. 批量道具发放函数
使用 LuaFnTryRecieveMultiItem
高效发放:
function GrantVipReward(actor, vipLevel)
local itemId = 20101001 -- 宝物ID
local quality = (vipLevel >= 5) and 5 or 1 -- VIP5以上发高品质
local success = LuaFnTryRecieveMultiItem(
GetSceneID(actor),
GetObjID(actor),
itemId,
quality,
10, -- 发放10个
1 -- 绑定状态
)
return success == 1 -- 返回是否成功
end
参数说明:
- 数量范围:1~255(超量需分批调用)
- 绑定状态:
0
=非绑,1
=绑定,-1
=用物品默认设置
2. 绑定道具处理
合成系统检查绑定材料数量:
function CheckBindMaterial(actor, itemId, needCount)
local bindCount = Actor.getItemCount(actor, itemId, 0, 0, 1) -- 第5参数=1取绑定数量
return math.floor(bindCount / needCount) -- 返回可合成数量
3. 物品位置常量
穿戴位置与数据库 StdMode
映射:
装备类型 |
位置常量 |
StdMode |
武器 |
<$WEAPON> |
5,6 |
衣服(男) |
<$DRESS> |
10 |
勋章 |
<$RIGHTHAND> |
30 |
聚灵珠 |
无固定位置 |
49 |
🎯 三、动态爆率控制Lua实现
1. #CASE命令变量检测
根据角色变量 N$消费等级
切换爆率:
-- MonDrop.txt爆率文件配置
#CASE N$消费等级|0 -- |0不清空变量
0 -- 普通玩家
(
1/100 金疮药
)
1000 -- 土豪玩家
(
1/50 圣战戒指 $STR(N$额外数量) -- 动态数量
1/1 屠龙|@TriggerDragonDrop -- 触发QF脚本
)
2. QF触发脚本动态计算数量
[@TriggerDragonDrop]
#ACT
-- 根据幸运值追加爆出数量
local addCount = math.floor(GetLucky(actor) / 10)
GrantItem(actor, "屠龙", 1 + addCount)
SendMsg(actor, "幸运爆发!获得{color=red x{addCount}屠龙}")
⚡ 四、高级脚本技巧
1. 道具包动态注入(StdMode=200)
-- 配置道具包effectParam字段
30304#<$N$动态数量>#100 -- 爆出N$动态数量值的物品
-- QF脚本中设置变量
MOV N$动态数量 <$HUMAN(VIP等级)> * 10 -- VIP越高数量越多
2. 批量合成优化
避免循环发放,使用聚合函数:
-- 错误做法:循环调用单次发放
for i=1,100 do
GiveItem(actor, "金币", 1) -- 性能低下
end
-- 正确做法:批量发放
LuaFnTryRecieveMultiItem(..., 201, 1, 100, 0) -- 单次发放100金币
3. 聚灵珠经验控制
通过数据库字段动态配置:
-- cfg_item.xls聚灵珠配置
StdMode=49, Shape=10, -- 经验存储倍率10%
DuraMax=50, -- 最大存储50W经验
AniCount=金币ID, -- 提取消耗货币类型
Need=1000, -- 提取需1000金币
💎 避坑指南
- 变量类型匹配
- 爆率数量控制必须用整数型变量(
N
/D
型),字符型变量(S
型)会导致失效
- 任务数据安全
- 修改
task.lua
中的主函数可能导致引擎升级时被覆盖,建议通过扩展脚本实现自定义逻辑
- 性能优化
- 高频触发事件(如击杀怪物)中避免复杂计算,优先使用
#CASE
预分支