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

荆棘缠:荆棘缠身持续掉血,且阻止治疗

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

【游戏功能】

荆棘缠住了怪的身子——持续掉血还禁疗,这不是毒不是火,是一根活的荆棘藤。荆棘缠把"控制"和"伤害"合在了一根藤上:缠上的五秒里怪每零点五秒掉四点,而且任何治疗都无效。这篇把整套模块拆开:配置表、荆棘构件、缠身结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:荆棘缠身持续掉血,且阻止治疗

演示场点「缠身!」:一根青绿色的藤蔓缠上怪的身子——藤上的刺扎进皮肉,每零点五秒蹦一个"缠-四"的绿字。五秒里怪的血条被藤蔓一格格磨掉。更狠的是:缠身期间任何治疗都被藤蔓挡住,奶妈的恢复术打过来直接弹开。演示里试两笔账:缠身五秒总共掉二十点,加上你在这五秒里的平砍输出,总伤害比不缠多出一截。荆棘缠教的是持续压力:不是一刀解决,是让它一直疼。

demo
 fx-thornwrap

二、底层原理:一条荆棘构件加一次禁疗判定

模块的机关是一对搭档。荆棘构件:缠身的那一帧藤蔓挂上怪的身——藤认活口不认距离,缠上的五秒里藤跟着怪走到哪缠到哪。禁疗判定:缠身期间怪的受治疗量被强制归零——奶妈的恢复术、药瓶的回复、队友的圣光全被藤蔓的刺挡住。和沉默那些全封控制的分野在"缠身只封治疗不封攻击":怪照常出招照常走位,只是挨的伤不会好——这份"能打但好不了"的微妙就是荆棘缠的定位。藤认活口不认坐标也是一处巧思——坐标会飘,活口不会,五秒里怪走到哪藤跟到哪,缠蔓始终贴在怪的皮肉上不会脱锚。藤上蹦出的绿字也统一走缠字头——缠字头的账目一眼可辨,不会被误认成毒或火那两家的跳伤。

禁疗为什么和持续掉血绑在一起?单独禁疗的版本怪没有立刻的威胁感,玩家不会主动用它;加了持续掉血,缠身从纯控制变成了"消耗+封锁"的复合技——两份收益才值得一个技能栏位。

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

lua
-- @file ThornWrap.lua
-- 荆棘缠 —— 荆棘缠身持续掉血,且阻止治疗

local ThornWrap = {}

local CONST = {
    WRAP_LIFE     = 5.0,
    WRAP_TICK     = 0.5,
    WRAP_DMG      = 4,
    WRAP_CD       = 5.0,

    COLOR_WRAP    = "#7aa860",
    COLOR_DEEP    = "#2a4a18",
    COLOR_GHOST   = "#c8e8b0",

    ZORDER_WRAP   = 130,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1072000,
}

local _wrapT     = 0
local _wrapID    = 0
local _tickT     = 0
local _cdLeft    = 0
local _wrapFx    = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "TPW",
        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 WrapTick(tid)
    SL:ActorHurt(tid, CONST.WRAP_DMG)
    SL:TipAbove(tid, "缠-4")
    SL:PlayWrapTickFx(tid)
end

function ThornWrap.Cast()
    if _cdLeft > 0 or _wrapT > 0 then return end
    local tid = SL:GetValue("MARK_TARGET_ID")
    if not tid then return end
    _cdLeft = CONST.WRAP_CD
    _wrapT = CONST.WRAP_LIFE
    _wrapID = tid
    SafeRemove(_wrapFx)
    _wrapFx = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Wrap"), 0, 0, 0, 0, false)
    GUI:setLocalZOrder(_wrapFx, CONST.ZORDER_WRAP)
    SL:PlayWrapUpFx(tid)
    SL:TipAbove(tid, "缠身!")
    ShowTip("荆棘缠上了——五秒持续掉血且禁疗")
end

四、核心代码:完整模块(下·定时器与禁疗结算)

lua
-- 禁疗结算:缠身期间治疗归零
SL:RegisterLUAEvent(LUA_EVENT_HEAL_RECEIVED, "TPW_Block", function(tid, heal)
    if _wrapT > 0 and tid == _wrapID then
        SL:TipAbove(tid, "禁疗")
        return 0
    end
    return heal
end)

-- 定时器:持续跳伤与缠蔓跟脚
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _wrapT > 0 then
            _wrapT = _wrapT - dt
            _tickT = _tickT + dt
            local tp = GetActorPos(_wrapID)
            if _wrapFx and tp then
                GUI:setPosition(_wrapFx, tp.x, tp.y)
            end
            if _tickT >= CONST.WRAP_TICK then
                _tickT = 0
                WrapTick(_wrapID)
            end
            if _wrapT <= 0 or not tp
                or SL:GetValue("ACTOR_DEAD", _wrapID) then
                _wrapT = 0
                SafeRemove(_wrapFx)
                ShowTip("荆棘散了——它又能治疗了")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("缠身", function()
        ThornWrap.Cast()
    end)
    ShowTip("技能已加载: 荆棘缠 (调试按钮触发)")
end, 1.0)

function ThornWrap.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_HEAL_RECEIVED, "TPW_Block")
    SafeRemove(_wrapFx)
    _wrapT = 0
end

return ThornWrap

五、机制问答

问:缠身期的怪攻击力有变化吗?
答:没有——缠身只加持续伤害和禁疗,怪的攻击力攻击频率全不变,这也是缠身区别于减速的地方:不削弱攻击只增加消耗。

问:荆棘缠能和沉默叠加吗?
答:能——缠身封治疗,沉默封技能,两套封印各管各的通道,叠加后怪既打不出技能也回不了血。

问:缠身能被驱散吗?
答:能——净化类的驱散清缠身,驱散后持续掉血和禁疗一起消失,这也是缠身需要队友保护的另一个理由。

问:缠身对免疫治疗的怪有效吗?
答:有双重效果——原本免疫治疗的怪本来就回不了血,缠身的禁疗等于白费了一个通道,选目标要避开天生免疫治疗的怪。

问:缠身的持续伤害能暴击吗?
答:不能——持续跳是固定值不掷骰,每一跳四点一跳不落,和毒的跳伤一个规矩。

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

第四笔是持续跳的斤两:四点对零点五秒间隔是八点每秒的持续压力——跳伤太低缠身成了纯禁疗工具,太高缠身变成了主要输出手段。第三笔是禁疗的覆盖面:封一切治疗是全套覆盖——只封直接治疗不管生命恢复的版本留了口子,全套封才配叫禁疗。第二笔是缠身的时长:五秒对零点五秒一跳是十跳的持续消耗——缠身太短消耗不够看,太长变成永久挂机。第一笔是缠蔓的可见:藤蔓要缠在怪的身上而不是脚底下——缠在哪看得见,玩家才知道禁疗的窗口还有多久。常见坑三个:缠身的禁疗没有覆盖生命恢复类道具,药瓶回复绕过了封锁;缠身对免疫治疗的怪也能挂上但禁疗无效,两边显示矛盾;缠蔓的跟脚在怪传送后飘到了半空。

商业服里荆棘缠是"药翁流派"的看家藤:别人比伤害他比消耗——商城里缠蔓的样式做成品级,青藤、毒藤、龙筋藤,那圈缠在怪身上的青绿藤蔓就是药翁的束身衣。运营落地还有两笔:一段是禁疗教学——教一句"先缠再打,治疗全废",流派第一课是选对目标;一段是缠身榜——按缠身期造成的总伤排名,缠得最久的药翁有碑。变体做成毒缠:缠身的持续伤害附带中毒效果——从纯掉血到掉血加中毒,药翁的藤越来越毒。这一篇的演示和整套模块照抄能跑,改的就是 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 技术组