【游戏功能】
日志里躺着一条没人在意的细节:某只头目的治疗明细里,回血来源写着一颗珠子的名字——两颗珠子轮流替它回血,每两秒一口,一场架下来珠子喂的血比玩家的输出还多。没人打那两颗珠子,因为没人知道珠子能摘。摘珠把这层账摊开:它头顶轮着转的两颗回血珠,摘一颗断一半回血,都摘了它没奶喝。这篇把整套模块拆开:配置表、回血珠表、摘除结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:它有两颗回血珠,摘一颗赚一颗
演示场的怪头顶绕着两颗翠绿的珠子,一颗一颗轮流替它回血——绿的四点一跳,跳得比你的输出还稳。点「摘珠!」:玩家探手把转过来的那颗珠子摘了——珠子碎成绿光,怪的第一颗奶源当场断掉,只剩另一颗隔两秒跳一口。再摘一颗:两颗全空,它彻底断奶——血条掉下去就再没爬起来过。演示里试两笔账:放着珠子不管硬拼,和先摘后打——断奶的头目血条是直线,带着珠子的头目血条是锯齿。摘珠教的是打怪先看它的奶瓶:奶源不在它身上,在它头顶飘着。
fx-pluckbead
二、底层原理:一张回血珠表加一次摘除断奶
模块的机关是一对搭档。回血珠表:两颗珠各带独立的回血计时,两秒一口四点——珠子认自己的表不认同伴的表,一颗断了另一颗照跳,回血是按颗数叠加的流水。摘除断奶:摘珠按钮摘走转得最近的那颗——碎掉的珠子从表里除名,它的那份回血流水永久停掉;两颗全摘,奶源归零。和驱散增益的分野在"珠子是物件不是状态":驱散抹掉一个标记,摘珠砸碎一件器物——器物碎在明处,碎的每一颗都有碎裂的声画,断奶的因果看得见摸得着。
珠子为什么不重长?重长的版本摘珠变成抢时间窗,断奶变成喘息期;不重长的设定把"摘不摘"变成了开局策略——摘珠的时机越早,整场架的账越干净。
三、核心代码:完整模块(上·骨架)
-- @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
四、核心代码:完整模块(下·定时器与回血流水)
-- 定时器:珠子转圈与回血流水
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 新刷出来的怪身上为什么有金印?胎记给的答案是:每一只新生的怪都带着一枚三秒的金印胎记——三秒里打它,刀刀二十;…
【游戏功能】 prayT = 2.0 —— 念经的两秒,就是超度的全部门槛:对着一具尸体念满两秒,灰烬升起,血回二十,下一刀…
【游戏功能】 认领 = true —— 就这一行,把"打谁"变成了"认谁":第一刀落在谁身上,一封朱印就贴在谁的头顶——认过…
【游戏功能】 怪倒下的地方为什么值得多站一会儿?遗泽给了个温柔的说法:它倒下的那一片地会留下十二秒的泽环——站在环里满三秒,…
【游戏功能】 打死它为什么它又站起来了?截魂揭开底牌:这怪死后魂不散——一缕魂从尸体里飘出来,两秒半飞回右侧的石像,魂到石像…
【游戏功能】 新刷出来的怪为什么头三刀不掉血?蜕壳给了答案:它出生时带着三页硬壳,壳页一页页替它挨刀——三刀破壳,壳破的那一…