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

蚀蓝纹咒:抽干它的法力,咒念憋在喉咙里

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

【游戏功能】

前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它的施法判定根本没接蓝量,法力值在它自己身上躺着,火球该喷照喷。补的办法不是砍伤害,是给整条施法线接上蓝量的闸——蓝尽则咒哑。蚀蓝纹就是这套闸门的玩家侧版本:你亲手把它的蓝抽干,亲眼看它的咒憋在喉咙里。这一篇把整套模块拆开:配置表、蓝量侦测、蚀蓝结算、施法封锁、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:抽干它的蓝,咒就哑了

演示场怪的血条下面多了一条蓝条——那是它的法力,六十点。它每隔几秒就蓄一发紫咒砸过来,一发十八点,每发耗蓝十二。你的平砍每刀顺手抽它四点蓝。点「蚀纹!」:四秒的蚀蓝贴在它身上,每半秒抽五点——蓝条肉眼可见地瘪下去。蓝条见底的那一拍,它的蓄咒动作当场僵住,头顶浮出"咒哑"两个字,从此只剩六点的挠痒痒爪子。蚀蓝玩的是断粮:不砍它的血,砍它放招的本钱。

demo
 fx-manadrain

二、底层原理:一道蓝量闸加一次施法封锁

模块的机关是一对搭档。蓝量闸:怪的每一次施法都先过蓝——蓝够十二才准念,念完即扣,蓝不够的那一拍施法判定当场打回,这是那次永动机事故补上的核心闸门。施法封锁:蓝量归零后怪的施法线整条锁死——不是"这次念不出"而是"以后都念不出",法力不回复的版本里锁死是永久的,怪从咒师退化成爪子。和沉默类机制的分野在"蚀蓝是抽本钱、沉默是封嗓子":沉默封的是施法动作本身,时间到了照旧念;蚀蓝抽的是施法的本钱,本钱不回来咒永远哑——一个锁动作,一个断粮道。

封锁为什么做成永久的?演示场里法力不回复是刻意的——永久的哑火才有"断粮"的重量,带回复的版本蚀蓝就退化成延迟施法,玩家抽干的蓝几秒后又满,白忙一场。

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

lua
-- @file ManaDrain.lua
-- 蚀蓝纹 —— 抽干它的蓝,咒就哑了

local ManaDrain = {}

local CONST = {
    DRAIN_LIFE    = 4.0,
    DRAIN_GAP     = 0.5,
    DRAIN_TICK    = 5,
    DRAIN_DMG     = 3,
    DRAIN_CD      = 6.0,
    HIT_DRAIN     = 4,

    COLOR_DRAIN   = "#5078c8",
    COLOR_DEEP    = "#1e2f58",
    COLOR_GHOST   = "#b8d0f4",

    ZORDER_DRAIN  = 133,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1082000,
}

local _drainT    = 0
local _drainGap  = 0
local _cdLeft    = 0
local _drainFx   = nil
local _scheduler = nil
local _autoInc   = 0

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

function ManaDrain.IsMute(tid)
    local mp = tid and SL:GetValue("ACTOR_MP", tid) or 0
    return mp <= 0
end

四、核心代码:完整模块(下·蚀蓝结算与施法封锁)

lua
function ManaDrain.Cast()
    if _cdLeft > 0 or _drainT > 0 then return end
    local tid = SL:GetValue("MARK_TARGET_ID")
    if not tid then return end
    if ManaDrain.IsMute(tid) then
        ShowTip("它早就空蓝了")
        return
    end
    _cdLeft = CONST.DRAIN_CD
    _drainT = CONST.DRAIN_LIFE
    _drainGap = 0
    SafeRemove(_drainFx)
    _drainFx = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Drain"), 0, 0, 0, 0, false)
    GUI:setLocalZOrder(_drainFx, CONST.ZORDER_DRAIN)
    SL:PlayDrainUpFx(tid)
    SL:TipAbove(tid, "蚀蓝!")
    ShowTip("蚀纹贴上去了——四秒抽干它的蓝")
end

-- 施法闸:蓝不够的施法判定当场打回
SL:RegisterLUAEvent(LUA_EVENT_CAST_CHECK, "MDN_Gate", function(tid, cost)
    local mp = SL:GetValue("ACTOR_MP", tid) or 0
    if mp < cost then
        SL:TipAbove(tid, "咒哑")
        return false
    end
    SL:SetValue("ACTOR_MP", tid, mp - cost)
    return true
end)

-- 定时器:蚀蓝跳抽与蓝条跟脚
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _drainT > 0 then
            _drainT = _drainT - dt
            _drainGap = _drainGap + dt
            local tid = SL:GetValue("MARK_TARGET_ID")
            if _drainGap >= CONST.DRAIN_GAP then
                _drainGap = 0
                if tid then
                    SL:DrainMana(tid, CONST.DRAIN_TICK)
                    SL:ActorHurt(tid, CONST.DRAIN_DMG)
                    SL:TipAbove(tid, "蓝-" .. CONST.DRAIN_TICK)
                end
            end
            local tp = tid and GetActorPos(tid)
            if _drainFx and tp then
                GUI:setPosition(_drainFx, tp.x, tp.y - 70)
            end
            if _drainT <= 0 then
                SafeRemove(_drainFx)
                ShowTip("蚀纹收了——看它还念不念得动")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("蚀纹", function()
        ManaDrain.Cast()
    end)
    ShowTip("技能已加载: 蚀蓝纹 (调试按钮触发)")
end, 1.0)

function ManaDrain.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_CAST_CHECK, "MDN_Gate")
    SafeRemove(_drainFx)
    _drainT = 0
end

return ManaDrain

五、机制问答

问:被抽干的蓝会自己回吗?
答:不回——蚀蓝纹的世界里法力没有回复通道,抽干就是永久,这条铁律是蚀蓝和缓速回蓝类机制的完全分界。

问:平砍的抽蓝和蚀纹的抽蓝能叠加吗?
答:能——两路抽蓝各走各的账,蚀纹的四秒里一秒能抽十四点,断粮的速度比单靠平砍快了三倍不止。

问:蓝量对纯近战的怪有意义吗?
答:意义在公平——近战怪不吃蓝闸照旧挥爪,蚀蓝对它们是白贴的纹,所以贴纹前先看清它是咒师还是爪子。

问:蚀蓝的每半秒一抽吃暴击吗?
答:不吃——跳抽是固定值不掷骰,五点就是五点,稳定压倒一切是持续结算的老规矩。

问:它蓄到一半的咒会被抽断吗?
答:不会——闸口设在蓄咒的起点不在中途,咒念起来就不回头,要断它下一发,断的是"还没出口的"。

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

第四笔是抽蓝的配速:半秒五点对四秒窗口是四十点的蚀蓝深度——配速太慢四秒抽不干六十点蓝,封锁断在半路;太深一口抽干又少了蓝条瘪下去的过程感。第三笔是闸口的口径:闸设在施法起点是标准——闸在半途的版本会制造念了一半哑火零伤害的"白动作",怪看起来在发癫。第二笔是蓝条的可见:蓝条必须挂在血条正上方——玩家得先看见本钱,才谈得上断它本钱,藏起来的蓝条等于没有闸。第一笔是哑火的演出:蓄咒僵住、头顶浮字、爪子变软三段要一起出——玩家要一眼看懂"它废了",哑了没演出的闸门等于没闸。常见坑三个:蓝量闸只接了技能没接蓄力条导致蓄力白打;空蓝怪的移动速度没有调低显得像在梦游;蚀纹的跟脚在怪被击退后留在了原地。

商业服里蚀蓝纹是"断粮道"流派的本钱生意:别人拆血条他拆法力池——商城里蚀纹的样式做成品级,蓝缕、玄冰缕、锁灵金缕,那道贴在怪身上的蓝纹就是断粮道的封条。运营落地还有两笔:一段是认怪教学——教一句"咒师贴纹爪子绕道",流派第一课是分清谁怕蚀蓝;一段是断粮榜——按抽干法力的怪的头目数量排名,断粮断得最狠的人有碑。变体做成蚀蓝反哺:抽来的蓝转进自己的法力池——断人道成自渡人,断粮道的袖口越描越宽。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做资源系的同学:蚀蓝卖的是"本钱我来收"——那条肉眼可见瘪下去的蓝条和头顶的"咒哑"二字,是把法力从回复池改判成一次性本钱的一纸封条。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

走一格为什么是半秒?拆开996引擎走路状态机

接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…

2026-10-03 05:31 996 技术组
进阶实战游戏功能

特效总挂在脚后跟上?挂点表选对一行顶十行

【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

刀刀都判命中,玩家为什么喊挥空?命中表现差的那一拍

【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

怪的皮一会儿绿一会儿红?状态染色的色号表就三列

【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

996引擎Buff系统解剖:中毒变绿、冰冻发白是怎么挂上去的

前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…

2026-10-03 05:25 996 技术组
进阶实战游戏功能

编钟纹:五口钟排着敲,一口更比一口疼

【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…

2026-10-03 05:01 996 技术组