课时 28 · 综合项目:狂暴之力

课时 28 · 综合项目:狂暴之力(功能开发实战):完整实现传奇经典功能,贯通服务端与客户端。示例跑在 996 新三端引擎里,接口按本地官方文档逐个核对。

教程/第四部分 · 功能开发实战更新于 2026-10-074 个小节 教程第 33 / 41 篇 功能实战

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

本课目标

  • 完整实现传奇经典功能,贯通服务端与客户端。

知识讲解

需求:狂暴之力——玩家支付货币购买限时增益,生效期间获得属性加成与特殊称号,到期自动失效并提醒。本案例贯通本章全部技能:触发与按钮双入口、余额检测、定时生效、属性加成、到期提醒。

实现要点:一、入口:NPC 点击触发(clicknpc)+ 客户端按钮事件(GUI/SL 事件,课时 30 展开);二、购买:querymoney 检测余额 → changemoney 扣除 → setontimer 挂生效定时器;三、生效:定时器回调内启用属性加成并提示;四、到期:定时器结束回调清除加成并全服/个人提醒。

示例:狂暴之力(核心)

local KUANGBAO_PRICE = 5000      -- 价格(货币 id=1)
local KUANGBAO_TIME = 3600       -- 持续 1 小时(秒)——setontimer 与 changehumability 都按秒

function clicknpc(actor, npcId, script)
    if npcId ~= 5001 then return false end   -- 狂暴使者

    if GetInt(0, actor, 'kb_active') == 1 then
        sendmsg(actor, 1, '{"Msg":"狂暴之力正在生效中","Type":1}')
        return true
    end

    -- 余额检测
    if querymoney(actor, 1) < KUANGBAO_PRICE then
        sendmsg(actor, 1, '{"Msg":"货币不足","Type":1}')
        return true
    end

    -- 购买并生效
    changemoney(actor, 1, '-', KUANGBAO_PRICE, '购买狂暴之力', true)
    SetInt(0, actor, 'kb_active', 1)
    -- 5=攻击下限 6=攻击上限(接口/人物相关/调整人物属性)
    -- 第 4 个参数是持续秒数,到点由引擎自动撤销,不需要自己写撤销逻辑
    changehumability(actor, 5, 50, KUANGBAO_TIME)
    changehumability(actor, 6, 50, KUANGBAO_TIME)
    setontimer(actor, 9, KUANGBAO_TIME, 1)   -- 只用来通知到期,属性不靠它清
    sendcentermsg(actor, 180, 251, '狂暴之力已生效!', 0, 5)
    return true
end

-- 到期回调
function ontimer9(actor)
    SetInt(0, actor, 'kb_active', 0)
    -- 属性已由 changehumability 的时限撤销,这里只清标记
    sendmsg(actor, 1, '{"Msg":"狂暴之力已到期","Type":1}')
end

说明:属性增减用 changehumability(actor, 属性ID, 数值, 持续秒数)(接口/人物相关),属性 ID 表在文档正文里(5=攻击下限、6=攻击上限、11=MaxHP……);给了持续秒数就由引擎按时撤销,比手写「购买时加、到期时减」更不容易出错。

练习任务

  • 完成狂暴之力完整版:① 购买时校验货币并防重复购买;② 到期自动清除加成且只清除一次;③ 增加到期前 30 秒提醒(第二个定时器);④ 补一个客户端入口(按钮点击,结合课时 30 知识,先写出按钮创建与事件注册骨架)。

参考:验收要点

  • 生效期间重复点击 NPC 提示「正在生效中」;
  • 到期后属性恢复、可再次购买;
  • 到期前 30 秒有倒计时或提示;
  • 客户端按钮与服务端 NPC 入口调用同一套购买逻辑。

知识讲解

本章接口来源:本地 showdoc 服务端 260831 文档;示例里的引擎接口已全部替换为文档中的真实函数名。变量用 SetInt、GetInt、SetStr、GetStr;属性用 changehumability;货币用 querymoney、changemoney;物品用 checkitems、takeitem、giveitem、getbagitemcount;经验用 changeexp。

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

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