课时 27 · 沙巴克捐献与会员签到

课时 27 · 沙巴克捐献与会员签到(功能开发实战):实现数据累积型功能。示例跑在 996 新三端引擎里,接口按本地官方文档逐个核对。

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

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

本课目标

  • 实现数据累积型功能。

知识讲解

需求一:沙巴克捐献榜——行会成员向沙巴克捐献资源,累计进度并排行。需求二:每日签到——玩家每天签到一次领奖,防重复。两类功能都属于「数据累积型」:数据长期累积、按日重置、防重复操作。

捐献实现:NPC 点击触发 → 检测/扣除捐献物(checkitems/takeitem)→ 行会捐献变量累加(本地文档 接口 目录中「行会-组队」类接口)→ 进度提示。签到实现:用日期变量记录上次签到日期,与当前日期比较,同日拒签。

示例:每日签到(核心)

local SIGN_REWARD = '签到礼包'

function clicknpc(actor, npcId, script)
    if npcId ~= 4001 then return false end   -- 签到使者

    local today = os.date('%Y%m%d')
    -- 日期是文本,用 Str 变量(接口/变量相关/获取对象str型变量)
    local last = GetStr(0, actor, 'sign_last') or '0'
    if last == today then
        sendmsg(actor, 1, '{"Msg":"今天已经签到过了","Type":1}')
        return true
    end

    -- 首次签到奖励 + 累计签到计数
    giveitem(actor, SIGN_REWARD, 1)
    SetStr(0, actor, 'sign_last', today)
    local days = (GetInt(0, actor, 'sign_days') or 0) + 1
    SetInt(0, actor, 'sign_days', days)
    sendmsg(actor, 1, '{"Msg":"签到成功!累计签到 ' .. days .. ' 天","Type":1}')
    return true
end

说明:变量按类型分开存取——文本用 SetStr/GetStr,数字用 SetInt/GetInt(接口/变量相关);捐献榜的排行请查「行会-组队」接口与沙巴克攻城触发(触发/系统 目录:占领沙巴克等)。

练习任务

  • 完成沙巴克捐献榜 + 签到完整版:① 捐献累计进度并显示当前总额;② 排行榜(按捐献额排序前 10);③ 签到满 7 天额外大奖;④ 跨天重置判断(0 点后第一天签到正常)。

参考:验收要点

  • 捐献后进度实时刷新,重复捐献可累加;
  • 排行榜数据一致、排序正确;
  • 同一天重复签到被拦截;
  • 连续 7 天签到触发大奖且只发一次。
本篇依据
  • 《996 新三端 Lua 开发教学技术手册》课时 27

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