找回密码
马上加入

QQ登录

只需一步,快速开始

搜索
发新帖

0

收听

1

听众

134

主题

通过变量动态控制道具爆出数量

IP属地:浙江省杭州市
发表于 2025-7-15 13:09:06 | 查看: 18| 回复: 0

⚙️ 一、任务系统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金币

💎 避坑指南

  1. 变量类型匹配
    • 爆率数量控制必须用整数型变量N/D型),字符型变量(S型)会导致失效
  2. 任务数据安全
    • 修改 task.lua中的主函数可能导致引擎升级时被覆盖,建议通过扩展脚本实现自定义逻辑
  3. 性能优化
    • 高频触发事件(如击杀怪物)中避免复杂计算,优先使用 #CASE预分支
您需要登录后才可以回帖 登录 | 马上加入

QQ|Archiver|手机版|小黑屋|alg阿灵戈社区 ( 苏ICP备2023026137号-1|苏ICP备2023026137号-1 )

GMT+8, 2025-7-26 21:57 , Processed in 0.522594 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表