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

霜棘:冰棘绕身,碰你的都冻一步

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

【游戏功能】

冰系控制为什么总在怪的身上?霜棘偏要长在玩家的身上——冰棘绕你八秒,它近身攻击就冻零点八加六点冻伤,但冰棘不认人:你近身它也冻。这篇的核心代码照引擎技能脚本的全规格写:配置表、冰棘构件、互冻状态机、定时器、调试按钮。

一、效果演示:一圈冰棘,两根晕条

演示场点「霜棘!」:八根冰棘从玩家脚下长出绕成一圈。大怪冲上来抡爪——爪子碰到冰棘的瞬间它自己冻了零点八秒、额外扣六点冻伤。但你抡刀碰它也会触发你自己的冰棘——你也会冻零点八秒。冰棘不认人,两个方向的近身都算"碰"。冰棘不认人,两个方向的近身攻击都算碰了冰棘的棘刺尖。两个方向的近身都算"碰"。冰棘和冰壁垒的交叉也值得做——壁垒挡住怪的路线、冰棘冻住怪的近身,防御系的两件工具一起开就是一面会冻人的墙。演示里先让它来撞你——它冻你看戏;再主动贴脸打它——你冻它看戏。冰棘的公平写在两个晕条的长短差里。

demo
 fx-frostthorn

二、底层原理:一圈冰棘加一对互冻判定

模块的机关是一对镜像。冰棘在身上挂八秒——挂的期间双方的近身攻击都触发冻。互冻的判定写在双方的攻击结算出口:玩家攻击命中时查怪的近身距离,怪攻击命中时查玩家的近身距离——距离在冰棘范围内就触发冻。和反伤的分野:反伤是"你打我你也疼",冻是"你打我你停下来"——疼和停是两种完全不同的惩罚。疼和停是两种完全不同的惩罚。冰棘的公平还有一层深意——它的存在逼着怪的行动做选择:近身攻击会冻、远程攻击打不着,怪的走位怎么选就是怪的智力测试。冰棘的公平写在"不认人"三个字上,这三个字也是冰棘的门槛。冰棘的公平写在"不认人"三个字上,这三个字也是冰棘的门槛。冻的有效也要有视觉——被冻的单位周身亮一层淡青的霜壳,霜壳在冻在、霜壳散了解冻——视觉的冰霜就是冻的倒计时。

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

lua
-- @file FrostThorn.lua
-- 霜棘 —— 冰棘绕身,碰你的都冻一步

local FrostThorn = {}

local CONST = {
    THORN_LIFE   = 8.0,
    THORN_CD     = 9.0,
    STUN_DUR     = 0.8,
    THORN_DMG    = 6,
    THORN_RANGE  = 30,

    COLOR_THORN  = "#8ec8e8",
    COLOR_DEEP   = "#1a4a6e",
    COLOR_GHOST  = "#d8f0fa",

    ZORDER_THORN = 128,
    ZORDER_FX    = 135,
    AUTOINC_BASE = 971000,
}

local _thornT   = 0
local _cdLeft   = 0
local _myStun   = 0
local _foeStun  = 0
local _scheduler = nil
local _autoInc  = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "FTN",
        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 FrostThorn.Cast()
    if _cdLeft > 0 or _thornT > 0 then return end
    _cdLeft = CONST.THORN_CD
    _thornT = CONST.THORN_LIFE
    ShowTip("冰棘绕了——八秒,它近身就冻")
end

-- 双方攻击出口:冰棘距离判定
local function CheckThorn(attacker, target)
    if _thornT <= 0 then return end
    local ap = GetActorPos(attacker)
    local tpp = GetActorPos(target)
    if not ap or not tpp then return end
    if math.abs(ap.x - tpp.x) <= CONST.THORN_RANGE then
        if attacker == SL:GetValue("USER_ID") then
            _myStun = CONST.STUN_DUR
            SL:ActorHurt(target, CONST.THORN_DMG)
        else
            _foeStun = CONST.STUN_DUR
            SL:ActorHurt(attacker, CONST.THORN_DMG)
        end
    end
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
                ShowTip("棘化了——下一圈跟上")
            end
        end
        if _myStun > 0 then
            _myStun = math.max(0, _myStun - dt)
        end
        if _foeStun > 0 then
            _foeStun = math.max(0, _foeStun - dt)
        end
    end, 0.02)
end

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

return FrostThorn

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

调参三笔账。互冻零点八对攻击周期一点二是"冻比打短"的节奏——冻比打长冰棘就变成双停摆,太短冻了跟没冻一样。冰棘八秒对冷却九秒留一秒真空——真空里裸挨,真空越短冰棘越像常驻。冻伤六对冰棘不认人——玩家也冻自己也被扣六,公平的代价写在双方账上。常见坑三个:冰棘只判了怪打玩家漏了玩家打怪;冻的判定没用距离用了碰撞盒,碰撞盒比冰棘大一圈;双方同时冻的帧结算重复扣了冻伤。

商业服里霜棘是"近战反制"的教具:近战职业带棘进组,怪的每一爪都在帮它数拍子——反制的价值从被动长到了主动。攻城战里它是城门守卫的标配——棘绕城墙一圈,冲车的每一次碰撞都在帮守军拖时间。变体做成棘阵升级:冰棘加火棘,冰火交叠的区间既冻又烧——双棘的化学反应从元素长到了地形。变体做成棘阵升级:冰棘加火棘,冰火交叠的区间既冻又烧——双棘的化学反应从元素长到了地形。冰棘的视觉也可以做季节变化——冬天的棘是冰晶、夏天的棘是霜露,视觉的季节感是商业服的加分项。视觉的季节感是商业服的加分项。冰棘和金身的交叉也值得一提——金身开着的时候碰冰棘只冻不扣,金身挡了伤害挡不了冻——防御和控制的互克写在两个技能的交叉判定里。双棘的化学反应从元素长到了地形。冰棘和石肤的交叉也值得一提——石肤开着的时候碰冰棘不冻只扣血,防御系和反制系的交叉就是"有壳不怕冻"的战斗常识。防御系和反制系的交叉就是有壳不怕冻的战斗常识。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做反制系的同学:霜棘卖的是"冰棘不认人"——公平的冰刺比偏袒的盾更能教玩家尊重距离。公平的冰刺比偏袒的盾更能教玩家尊重距离。冰棘的冻还有一层深意——冻不是控制是反制,冻的目的是让怪"近身的成本变高",高到它自己选择远程输出,控场的终极就是让怪自己改打法。公平的冰刺比偏袒的盾更能教玩家尊重距离。冰棘的碰撞判定也要精确——距离三十步以内就算碰、三十步以外就算没碰,判定的精度就是冰棘的公信力。
补一个演示彩蛋位:冰棘消散的那一帧,最后一根冰棘会先化成一滴水再落进地面——水滴的一瞬是冰棘寿终的最后确认,确认一过,脚下就只剩干净的地面。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

影锁:影锁绑你绑它,锁期拼刀

【游戏功能】 控制技能的镜像问题是:锁住了怪,自己是不是也闲着?影锁把这道两难摆上台面:影锁四秒,它动不了、你也动不了——它…

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

震魂:震魂入体叠加出招自损

【游戏功能】 打断为什么只有"清读条"一种?震魂偏要反过来——不清招、不断势,打在它读条半途的那一劲顺着招震进腑——中劲十秒…

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

蜂王:喂小怪蜂王进化,三阶蜂王蜇翻全场

【游戏功能】 蜂群为什么总是一只一只出?蜂王偏要让它们进化:放一只蜂王出来,杀掉小怪喂它——喂三只升一阶,三阶蜂王的毒刺一秒…

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

血刃:每刀扣血换吸血,血刀双刃

【游戏功能】 技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀…

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

破军旗:旗立三秒圈内加攻,旗倒攻散

【游戏功能】 bn.t = bn.t - dt ——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,…

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

淬毒刃:淬毒三刀叠一层,一层毒过一秒六

【游戏功能】 淬毒为什么要一毒到底?淬毒刃偏要一层一层叠:一刀淬一层毒、毒层一秒六地烂,六层封顶之后一刀下去毒伤三十六——叠…

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