课时 22 · 综合项目:回收使者 NPC

课时 22 · 综合项目:回收使者 NPC(996 新三端引擎入门):独立完成一个完整 NPC 功能。示例跑在 996 新三端引擎里,接口按本地官方文档逐个核对。

教程/第三部分 · 996 新三端引擎入门更新于 2026-10-074 个小节 教程第 26 / 41 篇 新三端触发接口

本课的代码跑在 996 引擎里,用到的是服务端接口(changeexp、 SetInt 这类),在线运行器里没有这些函数。 每个函数的签名都能在 文档检索 里按名字查到原文。

本课目标

  • 独立完成一个完整 NPC 功能。

知识讲解

项目:制作「回收使者」NPC——玩家点击 NPC 后检测背包中的指定材料,按设定价格回收并发放货币。这是第一个贯通「触发 → 检测 → 扣除 → 发放 → 提示」全流程的功能,是第四部分所有实战项目的最小原型。

开发步骤:一、需求拆解:回收哪些物品、单价多少、货币发哪种;二、定触发:NPC 点击触发 clicknpc;三、写逻辑:checkitems 检测 → takeitem 扣除 → changemoney 发放;四、验证:进游戏点 NPC,分别测试背包足够与不足两种结果。

示例:回收使者完整版

-- 回收配置:材料名 -> 单价(货币 id=1)
local RECYCLE_PRICE = {
    ['铁矿'] = 10,
    ['铜矿'] = 20,
    ['银矿'] = 50,
}

function clicknpc(actor, npcId, script)
    -- 只在回收使者(npcId 按实际配置)处生效
    if npcId ~= 2001 then return false end

    local total = 0
    local hasAny = false
    for itemName, price in pairs(RECYCLE_PRICE) do
        -- 检测背包中的数量(名称#数量,数量写大值按全部回收)
        local ok = checkitems(actor, itemName .. '#99999', 0, 0)
        if ok then
            hasAny = true
            -- 按名称查背包里有多少(接口/物品操作/获取背包数量)
            local cnt = getbagitemcount(actor, itemName, 0)
            takeitem(actor, itemName, cnt, 0, '回收')
            total = total + price * cnt
        end
    end

    if not hasAny then
        sendmsg(actor, 1, '{"Msg":"背包里没有可回收的材料","Type":1}')
        return true
    end

    changemoney(actor, 1, '+', total, '回收材料', true)
    sendmsg(actor, 1, '{"Msg":"回收成功,获得金币 ' .. total .. '","Type":1}')
    return true
end

说明:背包数量用 getbagitemcount(actor, itemName, 0) 查,返回值就是件数(接口/物品操作/获取背包物品数量);单价与 NPC ID 按自己服务器配置调整。

练习任务

  • 完善回收使者:① 用真实接口查询各材料背包数量并折算;② 增加「无材料可回收」与「部分材料不足」两种分支提示;③ 写一份功能测试清单,逐项在游戏中验证。

参考:测试清单

  • 背包有铁矿 5 个 → 回收后金币 +50,铁矿清零;
  • 背包无材料 → 提示「背包里没有可回收的材料」;
  • 回收过程中货币到账且客户端界面刷新(send=true);
  • 重复点击不重复发放(每次独立检测,逻辑自洽);
  • 非回收使者 NPC 点击不触发本逻辑。

知识讲解

本章接口来源:本地 showdoc 服务端 260831 文档(触发与接口目录),示例逐条对文档核对。

本篇依据
  • 《996 新三端 Lua 开发教学技术手册》课时 22

参数与取值以你本机版本的官方帮助文档为准,不同版本之间有过调整。