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

蚀心:毒从死尸溅开,一只烂了旁边跟着烂

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

【游戏功能】

毒系伤害的终极形态是什么?单体毒只是一道口子,蚀心偏要让口子开花——中毒的怪死了毒溅给旁边的小怪,小怪也烂、烂了再溅——连锁腐烂直到场上一只不剩。连锁腐烂直到场上一只不剩——一只传一只、一代传一代,连锁的尽头是满场紫雾。连锁腐烂直到场上一只不剩。蚀心和灼羽的溅燃也可以做交叉——灼羽的火星先点燃小怪、蚀心的毒从大怪尸体溅给小怪,双系叠加的怪身上既有火又有毒。这篇的核心代码照引擎技能脚本的全规格写:配置表、蚀心构件、死亡溅毒钩子、定时器、调试按钮。

一、效果演示:一毒烂两,连锁清场

演示场点「蚀心!」:大怪身上挂出六秒紫雾——一秒六地烂。大怪烂死的瞬间——一团紫毒从尸体上炸开溅向旁边的小怪,小怪头顶蹦"溅毒",也开始一秒四地烂。演示里看小怪烂完的瞬间——它也是毒死的但小怪的毒不再溅第三层——溅毒只传一代。两具尸体、一道紫毒、一条连锁——蚀心的全部账目就这三笔。蚀心的全部账目就这三笔账。蚀心的全部账目就这三笔——大怪的燃烧、小怪的溅燃、玩家自己的输出,三笔账各有各的出口。两具尸体、一道紫毒、一条连锁——蚀心的全部账目就这三笔。小怪的毒也可以再溅——如果场上有第三只怪的话,但"只传一代"的上限堵住了无限连锁的路。

demo
 fx-heartrot

二、底层原理:一份中毒表加一次死亡溅毒钩子

模块的机关是一对搭档。中毒表:大怪身上挂六秒的跳秒计时——一秒一跳六点,跳完自然消。死亡溅毒钩子:中毒的怪死亡时查旁边有没有可感染的小怪——有就给它挂一代短毒——溅毒只传一代不再传第二代。和灼羽的分野:灼羽的溅燃是"活着的怪往旁边溅",蚀心的溅毒是"死了的怪往旁边溅"——一个从活体传、一个从尸体传,触发条件完全不同。一个从活体传、一个从尸体传,触发条件完全不同。蚀心和灼羽的分野:灼羽的溅燃从活体传、蚀心的溅毒从尸体传——活传考的是引怪的走位、死传考的是击杀的顺序,两个溅燃机制教的是两种走位课。

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

lua
-- @file HeartRot.lua
-- 蚀心 —— 毒从死尸溅开,一只烂了旁边跟着烂

local HeartRot = {}

local CONST = {
    POISON_LIFE   = 6.0,
    POISON_CD     = 4.0,
    POISON_DMG    = 6,
    SPLASH_LIFE   = 4.0,
    SPLASH_DMG    = 4,
    SPLASH_RANGE  = 80,

    COLOR_ROT     = "#a371f7",
    COLOR_DEEP    = "#3a1a5e",
    COLOR_GHOST   = "#e8d8fa",

    ZORDER_ROT    = 129,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 973000,
}

local _mainRot  = { t = 0, tick = 0 }
local _minionRot = { t = 0, tick = 0 }
local _cdLeft   = 0
local _scheduler = nil
local _autoInc  = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "HRT",
        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

四、核心代码:完整模块(下·定时器与死亡溅毒)

lua
-- 蚀心入口
function HeartRot.Cast()
    if _cdLeft > 0 then return end
    if _mainRot.t > 0 then return end
    _cdLeft = CONST.POISON_CD
    _mainRot.t = CONST.POISON_LIFE
    _mainRot.tick = 0
    ShowTip("蚀心上了——六秒一秒六,死了溅给旁边")
end

-- 死亡溅毒钩子
SL:RegisterLUAEvent(LUA_EVENT_MONSTER_DEAD, "HRT_Dead", function(data)
    if data and data.poisoned and _mainRot.t > 0 then
        local dp = GetActorPos(SL:GetValue("MINION_ID"))
        local mp = GetActorPos(SL:GetValue("MARK_TARGET_ID"))
        if dp and mp then
            local dist = math.abs(dp.x - mp.x)
            if dist <= CONST.SPLASH_RANGE then
                _minionRot.t = CONST.SPLASH_LIFE
                _minionRot.tick = 0
                SL:TipAbove(SL:GetValue("MINION_ID"), "溅毒!")
            end
        end
    end
end)

if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _mainRot.t > 0 then
            _mainRot.t = _mainRot.t - dt
            _mainRot.tick = _mainRot.tick + dt
            if _mainRot.tick >= 1.0 then
                _mainRot.tick = _mainRot.tick - 1.0
                SL:ActorHurt(SL:GetValue("MARK_TARGET_ID"),
                    CONST.POISON_DMG)
            end
        end
        if _minionRot.t > 0 then
            _minionRot.t = _minionRot.t - dt
            _minionRot.tick = _minionRot.tick + dt
            if _minionRot.tick >= 1.0 then
                _minionRot.tick = _minionRot.tick - 1.0
                SL:ActorHurt(SL:GetValue("MINION_ID"),
                    CONST.SPLASH_DMG)
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    ShowTip("技能已加载: 蚀心 (调试按钮触发)")
end, 1.0)

return HeartRot

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

调参三笔账。毒伤六对六秒是三十六的 跳表总产值——总产值要压在玩家同期输出的一半以内,毒系是磨不是砍。溅毒只传一代是连锁的天花板——不设天花板的版本毒会无限传染全场。溅毒范围八十步对怪的巡逻密度——范围太宽溅不到人,太窄连锁断了。常见坑三个:死亡钩子没查死因,被普攻打死的也算中毒死溅了毒;小怪的毒到期后没有清视觉,无毒之雾满地飘;蚀心的冷却从挂毒起算而不是从毒散起算,毒散后还要等冷却才能上第二道。

商业服里蚀心是"毒系流派"的核心课:连锁腐烂的教学写在第一场小怪关——会溅的玩家两只一起清,不会的玩家一只一只磨,教学的价值写在通关时间上。教学的价值写在通关时间上。蚀心和血契链的交叉也值得一提——血契链把两只怪的伤害连在一起,蚀心把两只怪的中毒连在一起,连伤加连毒就是双倍的连锁体验。商城里蚀心的颜色做成品级——紫毒、绿毒、血毒,连锁腐烂的每一层毒都有专属色。连锁腐烂的每一层毒都有专属色。蚀心的死亡溅毒也要有音效——尸体炸开的一声闷响配毒溅的嘶声,声画同步玩家才信毒真的会传染。连锁腐烂的每一层毒都有专属色。蚀心的跳秒也要和灼羽区分——灼羽一秒十二的痛、蚀心一秒六的烂,痛是火烧的急、烂是毒泡的慢,两种跳秒两种性格。变体做成蚀心风暴:场上有三只中毒的怪时毒的跳秒翻倍——数量驱动的伤害加成把连锁的概念推到了极致。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做毒系的同学:蚀心卖的是"死也伤人"——毒从尸体上溅开的那一瞬,死亡不再是终结而是下一段痛苦的起点。死亡不再是终结而是下一段痛苦的起点,蚀心的每一条命都是下一段痛苦的种子。毒从尸体上溅开的那一瞬,死亡不再是终结而是下一段痛苦的起点。蚀心的连锁上限也要在演示里体现——只传一代的规矩让玩家知道连锁有尽头,连锁有尽头的机制才有策略的深度。连锁有尽头的机制才有策略的深度——无限连锁的版本毒自己就会清场,玩家的操作沦为看戏。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

影炮:蓄一秒,暗影弹道贯穿全屏

【游戏功能】 蓄力技为什么总是单发?影炮偏要贯穿全屏:蓄一秒射一道暗影弹道穿全屏——线上所有目标各挨五十五,弹道从你脚下贯穿…

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

灼心:点燃它的心,出招即自损

【游戏功能】 灼烧为什么总烧在皮肤上?灼心偏要烧进心里:心被灼了六秒——六秒里怪每出一招就自损八,出得越多损得越多。这篇的核…

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

魂蜂:杀敌化蜂,至多三盏自动蜇击

【游戏功能】 魂卫为什么只有三盏就不能多了?魂蜂偏要做成可以积累的:杀掉小怪化一盏魂蜂跟着你走,至多三盏——三盏魂蜂各自两秒…

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

霜镜:架起霜镜,弹道冻着原路画回

【游戏功能】 镜墙为什么只能反弹不能冰冻?霜镜偏要双管齐下:弹道撞上霜镜原路画回去——回程的弹道还带着冰冻效果,扎中怪怪也冻…

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

穿心刺:一箭穿心,最大血量百分之六的穿透

【游戏功能】 单体射击为什么打不动厚血怪?穿心刺给的答案是:箭伤八加穿心伤,穿心伤等于最大血量百分之六——血越厚的怪越疼。这…

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

影刺:化影绕后,背刺一刀双倍

【游戏功能】 影刺的全机制就一句话:化影绕到它身后,从背刺出的那一刀双倍二十四——正面十二、背后二十四,它一转身就变白板。这…

2026-10-01 10:47 996 技术组