996引擎 - 【任务系统】和【cfg_newtask.xls】

73 篇文章 ¥399.90 ¥499.90

总结

  1. 996这个任务系统仅用于控制主界面左上角的【任务列表】,不包含具体任务的业务逻辑。
  2. 任务列表有多个任务时支持上下滑动,可以调用接口将指定任务【置顶】
  3. 任务列表中,每个任务一行,分标题和(当前状态对应的)内容两部分,点击能触发 clicknewtask 事件
  4. 具体的任务系统业务逻辑,需要自己写代码实现。(配合996提供的任务接口和触发,实现更新任务列表)

测试NPC界面

对应【任务系统】的 5 个接口,每行对应一个任务。
在这里插入图片描述

local npc = {}

npc.title = "任务系统";

npc.paramsAndFuncs = {};

for i = 1, 18 do
    table.insert(npc.paramsAndFuncs, {"领取任务" .. i,
        function(player)
            newpicktask(player, i, "领取参数A");
        end
    });
    table.insert(npc.paramsAndFuncs, {"刷新任务" .. i,
        function(player)
            newchangetask(player, i,"刷新参数A","刷新参数B");
        end
    });
    table.insert(npc.paramsAndFuncs, {"完成任务" .. i,
        function(player)
            newcompletetask(player, i);
        end
    });
    table.insert(npc.paramsAndFuncs, {"删除任务" .. i,
        function(player)
            newdeletetask(player, i);
        end
    });
    table.insert(npc.paramsAndFuncs, {"任务置顶" .. i,
        function(player)
            tasktopshow(player, i);
        end
    });
end

return npc;

cfg_newtask.xls 表

为了测试简单填了下。

  1. 支持富文本。支持<u><br>
  2. 支持给(接取任务前、任务进行中、完成任务时)分别置不同的特效。
  3. 支持设置排序字段
    在这里插入图片描述

坑1:【新建任务接口】 对应 【接取任务触发】

也不知什么脑回路能想出这种命名风格。
调用 新建任务接口newpicktask,服务端触发接取任务触发 picktask ,任务列表中当前内容显示newtask表的接取任务前内容。

其他的接口和触发都还好见名知意。
在这里插入图片描述

坑2:增加系统任务计时 dsfuncall 除了角色对象,不支持任何其他参数

 --QFunction-0.lua
function dingshicf_1(actor)
end

dsfuncall(actor,"dingshicf_1",10 * 1000 ,1 ,1)

直接放弃,996所有的定时、延迟类的接口,都坑的一B。

抢救一下

如果一定想用 系统任务计时 要又不想声明 dingshicf_1,dingshicf_2,dingshicf_3… 一堆回调
可以考虑封装一下 dsfuncall 搞个支持直接传回调函数的版本。

 --QFunction-0.lua
--- 系统任务计时扩展版 (支持匿名函数)
--- @param actor object 玩家对象
--- @param func function 回调函数 (匿名函数或局部函数)
--- @param time number 倒计时时间 (毫秒) 默认1000
--- @param model number|nil 0=上线需重新开启, 1=上线直接执行 (默认0)
--- @param isClear number|nil 0=开启新的, 1=上线刷新当前时间 (默认0)
function dsfuncallEx(actor, func, time, model, isClear)
    if type(func) ~= "function" then
        release_print("[Error] dsfuncallEx: func must be a function!")
        return
    end
	time = time or 1000

    -- 生成唯一的全局调度函数名
    -- 使用 os.clock() 配合随机数,防止在同一毫秒内生成重复 Key
    local dispatcherName = string.format("dingshicf_EX_%d_%d", gettcount64(), math.random(1000, 9999))
    
    -- 注册到全局 _G
    _G[dispatcherName] = function()
        -- 使用 pcall 保护,确保即使业务代码报错,也能清理掉全局变量
        local ok, err = pcall(func, actor)
        if not ok then
            release_print("[Timer Error] " .. tostring(err))
        end
        
        -- 执行完毕后立即销毁,释放内存
        _G[dispatcherName] = nil
    end

    -- 调用 64_23.10.24 引擎原生接口
    dsfuncall(actor, dispatcherName, time, model or 0, isClear or 0)
end

可以直接传匿名方法,匿名方法中可以访问闭包上下文的变量。坑爹的限制解除啦

local a = 1;
local b = 2;
-- 比如玩家触发某个机关,3秒后检查状态
dsfuncallEx(actor, function(p)
	release_print("系统任务计时完成,访问闭包变量: a = " .. a .. " b = " .. b )
end, 3000)

参考资料

996引擎 - 任务系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑虾

多情黯叹痴情癫。情癫苦笑多情难

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值