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

荆棘甲:荆棘甲反伤

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

【游戏功能】

荆棘甲穿在身上,怪打你自找的——它的刀拍在你身上三十点的刺甲就弹三十点回去,它打得越狠弹得越疼。荆棘甲的哲学就一句话:你的攻击是你自己的选择,也是你自己的代价。这篇把整套模块拆开:配置表、荆棘甲构件、反伤结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:荆棘甲反伤,怪打你自找的

演示场点「荆棘甲!」:一圈暗红色的刺甲穿在身上——八根刺从肩到腰依次竖起,头顶"刺甲 六秒"。怪的刀拍过来:"刺-三十"的暗红大字从它自己头上蹦出来——它拍你十四点,自己反吃三十点,比它出手的力道还重。六秒一到刺甲碎裂,恢复血肉之躯。演示里试两笔账:荆棘甲期它出手三次自己吃九十点,和它不出手你追着打的六十点——它打你反而掉得更多,这就是荆棘甲的全部价值。荆棘甲教的是因果:打人者恒被打。

demo
 fx-thornarmor

二、底层原理:一面荆棘甲加一次反伤结算

模块的机关是一对搭档。荆棘甲:激活的六秒里怪的每次攻击命中你后,攻击者按三十点反伤——反伤认"被命中"不认"被攻击",劈空的刀不触发反伤,只有真正命中了你的攻击才弹刺。反伤结算:反伤走独立结算不吃减免——反伤的三十点就是三十点,怪的护甲减不了、反伤减免也减不了,这就是荆棘甲的公信力。和反甲那些被动反伤的分野在"荆棘甲是主动穿上的":被动反伤永远在,荆棘甲只穿六秒——六秒的窗口里你可以选择站桩让它打或不打,主动权在你手里。

反伤为什么是固定三十点而不是按伤害比例?固定值让反伤的账算得清,比例反伤在高攻怪面前变成完美反杀,荆棘甲的定位是"让怪不敢打你"而不是"让怪打你打死它自己"。

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

lua
-- @file ThornArmor.lua
-- 荆棘甲 —— 荆棘甲反伤,怪打你自找的

local ThornArmor = {}

local CONST = {
    THORN_LIFE    = 6.0,
    THORN_CD      = 5.0,
    THORN_DMG     = 30,

    COLOR_THORN   = "#c87878",
    COLOR_DEEP    = "#5e1a1a",
    COLOR_GHOST   = "#f4c0c0",

    ZORDER_THORN  = 132,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1071000,
}

local _thornT    = 0
local _cdLeft    = 0
local _thornFx   = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "TRA",
        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 ThornArmor.Cast()
    if _cdLeft > 0 or _thornT > 0 then return end
    local myID = SL:GetValue("USER_ID")
    if not myID then return end
    _cdLeft = CONST.THORN_CD
    _thornT = CONST.THORN_LIFE
    SafeRemove(_thornFx)
    _thornFx = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Thorn"), 0, 0, 0, 0, false)
    GUI:setLocalZOrder(_thornFx, CONST.ZORDER_THORN)
    SL:PlayThornUpFx(myID)
    SL:TipAboveMe("荆棘甲!")
    ShowTip("荆棘甲穿上了——六秒反弹三十")
end

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

lua
-- 反伤结算:荆棘甲期怪的攻击弹三十
SL:RegisterLUAEvent(LUA_EVENT_BEFORE_HURT, "TRA_Refl", function(tid, dmg)
    if _thornT > 0 and tid == SL:GetValue("USER_ID") and dmg > 0 then
        local attacker = SL:GetValue("ATTACKER_ID")
        if attacker and attacker ~= 0 then
            SL:ActorHurt(attacker, CONST.THORN_DMG)
            SL:TipAbove(attacker, "刺-30")
            SL:PlayThornReflectFx(attacker)
        end
    end
    return dmg
end)

-- 定时器:刺甲倒计时与刺甲动画
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _thornT > 0 then
            _thornT = _thornT - dt
            if _thornT <= 0 then
                SafeRemove(_thornFx)
                ShowTip("荆棘甲碎了——恢复血肉之躯")
            end
        end
    end, 0.02)
end

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

function ThornArmor.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_BEFORE_HURT, "TRA_Refl")
    SafeRemove(_thornFx)
    _thornT = 0
end

return ThornArmor

五、机制问答

问:荆棘甲反伤能暴击吗?
答:不能——反伤是固定值不是掷骰伤害,三十点就是三十点,不暴击不减伤不浮动。

问:荆棘甲期怪物远程攻击也弹吗?
答:弹——远程命中了你同样触发反伤,弹的距离比弓箭的射程短,远程怪被弹到的概率低但不是零。

问:荆棘甲和石肤叠加吗?
答:叠加效果太强——减伤五成加反伤三十等于"挨的少还弹得多",两套叠加的版本没人愿意打你,所以互斥是设计不是限制。

问:荆棘甲对毒跳有效吗?
答:无效——荆棘甲只反弹直接攻击,持续伤害绕过反伤链,毒和灼烧不触发弹刺。

问:荆棘甲碎了还能再穿吗?
答:能——冷却五秒一到就能重新穿,荆棘甲是可循环的战斗姿态不是一次性消耗品。

问:荆棘甲的刺和反甲的刺有分别吗?

答:有——荆棘甲是主动穿上的有时效,反甲是被动常驻的没时效,主动的是技巧被动的是属性。

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

第四笔是反伤的定价:三十点对怪的十四点攻击是"弹的比挨的重一倍"——反伤太轻怪不怕打你,太重怪变成自残机器,三十点刚好是"打一掌还一刺"的因果线。第三笔是持续的时间:六秒对怪两点四秒的攻击周期是"两到三刀的反弹窗口"——窗口太短弹不了几刀,太长变成永久反甲。第二笔是弹触的门槛:只弹直接攻击不弹持续伤害——门槛太宽毒跳也弹反伤变成万能反甲,太窄近战弹了远程不弹有失公平。第一笔是刺甲动画的方向:刺从身上往外指不往内收——往外指的刺是"你敢碰就扎你"的告示,往内收的刺看起来像是在防御。常见坑三个:反伤的结算漏了减免前的基础伤害,高防怪的刺反弹得太低;荆棘甲的动画和玩家自己的攻击动画重叠,看不出谁在弹谁;反伤的目标写死为最后一个攻击者,多怪围攻时弹错了人。

商业服里荆棘甲是"刺猬流派"的铠甲:别人怕挨打,他等挨打——商城里刺甲的样式做成品级,铁刺、骨刺、龙刺,那八根从肩到腰竖起的暗红刺就是刺猬流派的宣言。运营落地还有两笔:一段是弹刺教学——教一句"穿上甲站它面前让它打",流派第一课是站对位置;一段是弹刺榜——按荆棘甲反弹的总伤排名,刺最多的刺猬有碑。变体做成毒刺:反弹的刺附带中毒效果——从弹疼到弹毒,刺猬的背越来越毒。这一篇的演示和整套模块照抄能跑,改的就是 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 技术组