CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

摘珠:它有两颗回血珠,摘一颗赚一颗

2026-10-01 13:57 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

日志里躺着一条没人在意的细节:某只头目的治疗明细里,回血来源写着一颗珠子的名字——两颗珠子轮流替它回血,每两秒一口,一场架下来珠子喂的血比玩家的输出还多。没人打那两颗珠子,因为没人知道珠子能摘。摘珠把这层账摊开:它头顶轮着转的两颗回血珠,摘一颗断一半回血,都摘了它没奶喝。这篇把整套模块拆开:配置表、回血珠表、摘除结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:它有两颗回血珠,摘一颗赚一颗

演示场的怪头顶绕着两颗翠绿的珠子,一颗一颗轮流替它回血——绿的四点一跳,跳得比你的输出还稳。点「摘珠!」:玩家探手把转过来的那颗珠子摘了——珠子碎成绿光,怪的第一颗奶源当场断掉,只剩另一颗隔两秒跳一口。再摘一颗:两颗全空,它彻底断奶——血条掉下去就再没爬起来过。演示里试两笔账:放着珠子不管硬拼,和先摘后打——断奶的头目血条是直线,带着珠子的头目血条是锯齿。摘珠教的是打怪先看它的奶瓶:奶源不在它身上,在它头顶飘着。

demo
 fx-pluckbead

二、底层原理:一张回血珠表加一次摘除断奶

模块的机关是一对搭档。回血珠表:两颗珠各带独立的回血计时,两秒一口四点——珠子认自己的表不认同伴的表,一颗断了另一颗照跳,回血是按颗数叠加的流水。摘除断奶:摘珠按钮摘走转得最近的那颗——碎掉的珠子从表里除名,它的那份回血流水永久停掉;两颗全摘,奶源归零。和驱散增益的分野在"珠子是物件不是状态":驱散抹掉一个标记,摘珠砸碎一件器物——器物碎在明处,碎的每一颗都有碎裂的声画,断奶的因果看得见摸得着。

珠子为什么不重长?重长的版本摘珠变成抢时间窗,断奶变成喘息期;不重长的设定把"摘不摘"变成了开局策略——摘珠的时机越早,整场架的账越干净。

三、核心代码:完整模块(上·骨架)

lua
-- @file PluckBead.lua
-- 摘珠 —— 它有两颗回血珠,摘一颗赚一颗

local PluckBead = {}

local CONST = {
    BEAD_COUNT    = 2,
    HEAL_GAP      = 1.5,
    HEAL_PER_Bead = 4,
    PLUCK_CD      = 3.0,

    COLOR_BEAD    = "#48b890",
    COLOR_DEEP    = "#124438",
    COLOR_GHOST   = "#b0ecd8",

    ZORDER_BEAD   = 134,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1025000,
}

local _beads     = {}
local _cdLeft    = 0
local _spin      = 0
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "PKB",
        CONST.AUTOINC_BASE + _autoInc)
end

local function GetActorPos(id)
    if not id then return nil end
    local x = SL:GetValue("ACTOR_POSITION_X", id)
    local y = SL:GetValue("ACTOR_POSITION_Y", id)
    if not x or not y then return nil end
    return { x = x, y = y }
end

local function SafeRemove(node)
    if node and not GUI:Widget_IsNull(node) then
        GUI:removeFromParent(node)
    end
end

local function ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

local function SetupBeads(tid)
    _beads = {}
    for i = 1, CONST.BEAD_COUNT do
        table.insert(_beads, {
            tid = tid, alive = true,
            ang = i * 3.14,
            healT = CONST.HEAL_GAP })
    end
end

local function AliveCount()
    local n = 0
    for _, b in ipairs(_beads) do
        if b.alive then n = n + 1 end
    end
    return n
end

function PluckBead.Pluck()
    if _cdLeft > 0 then
        ShowTip("手在伸——" .. string.format("%.1f", _cdLeft) .. "秒")
        return
    end
    for i, b in ipairs(_beads) do
        if b.alive then
            _cdLeft = CONST.PLUCK_CD
            b.alive = false
            SL:PlayPluckFx(b.tid, i)
            ShowTip("摘了一颗——它回血断一半,再摘")
            return
        end
    end
    ShowTip("珠子摘完了——它断奶了,随便打")
end

四、核心代码:完整模块(下·定时器与回血流水)

lua
-- 定时器:珠子转圈与回血流水
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        _spin = _spin + dt
        if not _beads or #_beads == 0 then return end
        local tid = _beads[1].tid
        local tp = GetActorPos(tid)
        if not tp or SL:GetValue("ACTOR_DEAD", tid) then return end
        for _, b in ipairs(_beads) do
            if b.alive then
                b.ang = b.ang + dt * 1.5
                b.healT = b.healT - dt
                if b.healT <= 0 then
                    b.healT = CONST.HEAL_GAP
                    SL:RestoreActorHp(tid, CONST.HEAL_PER_Bead)
                    SL:PlayBeadHealFx(tid)
                end
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    local tid = SL:GetValue("MARK_TARGET_ID")
    if tid then SetupBeads(tid) end
    SL:BindDebugButton("摘珠", function()
        PluckBead.Pluck()
    end)
    ShowTip("技能已加载: 摘珠 (调试按钮触发)")
end, 1.0)

function PluckBead.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    _beads = {}
end

return PluckBead

五、机制问答

问:摘珠对玩家的回血有效吗?
答:无效——珠子长在怪身上,认的是怪的奶源,玩家身上的血条不归它管,说明栏写明"仅对回血珠生效"。

问:摘珠的间隙怪会加速回血吗?
答:不会——剩下的珠子按自己的表跳,不替同伴加班,一颗的流水就是一颗的量,账不掺假。

问:摘珠算输出吗?
答:算软输出——断掉的每一口回血都是省下来的对拼,战绩页单开一列"断奶量",这笔账值得记。

问:珠子会被范围技误摘吗?
答:不会——珠子只认摘珠的手,范围技擦着珠子飞过去也不掉,一物一摘是它的体面。

问:两颗珠回血的总量顶多少输出?
答:每分钟一百六——不摘珠的版本等于白送它一个奶妈,这笔账算明白了没人放着珠子不摘。

六、调参指南与商业服怎么用

第四笔是回血的流水:四点每两秒每颗是每分钟一百六的奶量——奶量对千一血的头目占一成半,太薄断奶没感觉,太厚不摘打不动。第三笔是珠数的容量:两颗是"摘一次见效、摘两次断根"的节奏——一颗的版本一摘就完没有层次,三颗的版本摘珠独占半天输出。第二笔是摘除的冷却:三秒对两秒一口的回血是"一次冷却换一段奶源"的汇率——冷却太短摘珠变成清场按钮,太长第二颗珠白转。第一笔是珠的可视:珠子绕头目转圈、线牵着主身——转圈的珠子才有"可摘"的暗示,藏进模型里的珠子玩家一辈子不知道能摘。常见坑三个:珠子的回血在怪满血时照跳,白跳的账没进日志;摘珠的手被控打断,珠子半摘不掉;两只带珠的怪站一起,摘珠摘串了门。

商业服里摘珠是"采生流派"的独门手艺:别人打怪砍血条,他摘怪摘的是奶瓶——商城里珠子的样式做成品级,翠珠、血珠、星珠,头目头顶那两颗转圈的翠色就是采生师的猎物标。运营落地还有两笔:一段是带珠怪图鉴——哪种怪珠多奶厚写进页脚,采生师按图下钩子;一段是断奶榜——按摘珠切断的回血总量排名,最会断奶的人有碑。变体做成珠链:两颗珠之间牵一条珠链,先摘的珠子顺着链子崩到另一颗——一摘摘一双,链式断奶的爽感翻倍。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做打击系的同学:摘珠卖的是"先断它的奶"——那两颗绕着头顶转的翠珠,是把战斗从拼血条改写成拼后勤的第一颗子。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

胎记:出生带金印三秒,三秒里刀刀二十

【游戏功能】 新刷出来的怪身上为什么有金印?胎记给的答案是:每一只新生的怪都带着一枚三秒的金印胎记——三秒里打它,刀刀二十;…

2026-10-01 14:27 996 技术组
进阶实战游戏功能

超度:尸体上念两秒,回二十下一刀双倍

【游戏功能】 prayT = 2.0 —— 念经的两秒,就是超度的全部门槛:对着一具尸体念满两秒,灰烬升起,血回二十,下一刀…

2026-10-01 14:27 996 技术组
进阶实战游戏功能

认领:第一刀认领,认过的怪挨你的刀加一成五

【游戏功能】 认领 = true —— 就这一行,把"打谁"变成了"认谁":第一刀落在谁身上,一封朱印就贴在谁的头顶——认过…

2026-10-01 14:27 996 技术组
进阶实战游戏功能

遗泽:倒下的怪留一圈遗泽,站进去三秒加两成五

【游戏功能】 怪倒下的地方为什么值得多站一会儿?遗泽给了个温柔的说法:它倒下的那一片地会留下十二秒的泽环——站在环里满三秒,…

2026-10-01 14:27 996 技术组
进阶实战游戏功能

截魂:它死后魂要飞回石像,半路截下就断重生

【游戏功能】 打死它为什么它又站起来了?截魂揭开底牌:这怪死后魂不散——一缕魂从尸体里飘出来,两秒半飞回右侧的石像,魂到石像…

2026-10-01 14:27 996 技术组
进阶实战游戏功能

蜕壳:怪出生带三页硬壳,壳破四秒虚

【游戏功能】 新刷出来的怪为什么头三刀不掉血?蜕壳给了答案:它出生时带着三页硬壳,壳页一页页替它挨刀——三刀破壳,壳破的那一…

2026-10-01 14:27 996 技术组