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 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

走一格为什么是半秒?拆开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 技术组