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

顺劈余纹:杀过头的刀,落到下一只头上

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

【游戏功能】

var over=d-before——先拆这一行。刀额减去落刀前的血,多出来的那一截就是杀过头的余劲。顺劈纹的全部机关就这一行:刀劲不散,飞向下一只。怪剩三点血你砍了二十,那十七点的多余刀劲不浪费,原样砸到它同伴头上。这篇把整套模块拆开:配置表、开锋窗口、冒刀侦测、余劲转移、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:杀过头的刀,落到下一只头上

演示场两只怪一左一右。点「开锋!」:一圈黄铜色的纹亮起——十二秒的开锋期。第一只怪血薄,你的十二点一刀砍下去,它只剩八点——冒了四点。刀劲没散:一道黄光从尸体上飞出去,四点余劲落在第二只怪头上,"余-4"的字蹦出来。下一刀砍冒得多,飞的余劲更猛。两只怪的血条此消彼长,你打一只,另一只陪挨。演示里试两笔账:开锋期清两只和不开锋清两只——同样的刀数,开锋的余劲替你白打了好几刀。顺劈纹教的是不浪费:杀过头的每一分力都要有去处。

demo
 fx-overcarry

二、底层原理:一次冒刀侦测加一次余劲转移

模块的机关是一对搭档。冒刀侦测:每一刀落账前先记下它挨之前的血——刀额减去这份血,正数就是杀过头的余劲,零和负数刀劲全部收在它身上,账目一分不差。余劲转移:正数的余劲当场起飞,落到搜索圈里最近的活怪身上——转移的值就是冒出来的值,不打折不衰减,杀过头多少就传多少。和溅射类机制的分野在"顺劈的余劲来自杀冒的那一刀":溅射是每一刀都带边料,顺劈只在杀死的那一刀结算——平时一刀不多,收割的那一刀加倍有声有息。

余劲为什么选最近的怪而不是随机的?最近的怪是玩家眼里的"下一只"——玩家会下意识把薄血怪往目标旁边引,让余劲飞得准;随机的版本余劲飞到天边去,白给的伤害玩家感知不到,机制等于白做。

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

lua
-- @file OverCarry.lua
-- 顺劈纹 —— 杀过头的刀,落到下一只头上

local OverCarry = {}

local CONST = {
    CREST_LIFE    = 12.0,
    CREST_CD      = 4.0,
    SEARCH_RANGE  = 300,

    COLOR_CARRY   = "#a88048",
    COLOR_DEEP    = "#483418",
    COLOR_GHOST   = "#e8d8b0",

    ZORDER_CARRY  = 133,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1093000,
}

local _crestT    = 0
local _cdLeft    = 0
local _crestFx   = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "OVC",
        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 OverCarry.FindNext(tid)
    if not tid then return nil end
    return SL:FindNearMonster(tid, CONST.SEARCH_RANGE)
end

四、核心代码:完整模块(下·冒刀侦测与余劲转移)

lua
-- 冒刀侦测:刀额减去落刀前的血,正数是余劲
SL:RegisterLUAEvent(LUA_EVENT_OVERKILL, "OVC_Carry",
function(deadID, over)
    if _crestT <= 0 or over <= 0 then return end
    local next = OverCarry.FindNext(deadID)
    if not next then
        ShowTip("旁边没有下一只——刀劲散了")
        return
    end
    SL:ActorHurt(next, over)
    SL:TipAbove(next, "余-" .. over)
    SL:PlayCarryFlyFx(deadID, next)
    ShowTip("刀劲飞过去了——余劲" .. over .. "点")
end)

function OverCarry.Cast()
    if _cdLeft > 0 or _crestT > 0 then return end
    local myID = SL:GetValue("USER_ID")
    _cdLeft = CONST.CREST_CD
    _crestT = CONST.CREST_LIFE
    SafeRemove(_crestFx)
    _crestFx = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Crest"), 0, 0, 0, 0, false)
    GUI:setLocalZOrder(_crestFx, CONST.ZORDER_CARRY)
    SL:PlaySharpenFx(myID)
    ShowTip("刀开锋了——杀过头的刀劲会飞向同伴")
end

-- 定时器:开锋倒计时与纹环跟脚
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _crestT > 0 then
            _crestT = _crestT - dt
            local myID = SL:GetValue("USER_ID")
            local mp = GetActorPos(myID)
            if _crestFx and mp then
                GUI:setPosition(_crestFx, mp.x, mp.y - 62)
            end
            if _crestT <= 0 then
                SafeRemove(_crestFx)
                ShowTip("锋钝了——杀过头也不飞了")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("开锋", function()
        OverCarry.Cast()
    end)
    ShowTip("技能已加载: 顺劈纹 (调试按钮触发)")
end, 1.0)

function OverCarry.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_OVERKILL, "OVC_Carry")
    SafeRemove(_crestFx)
    _crestT = 0
end

return OverCarry

五、机制问答

问:余劲能触发第二只怪的死亡掉落吗?
答:能——余劲走的是正常伤害通道,余劲杀死的怪照常倒地照常掉落,连杀两只有两份账。

问:余劲能不能再冒再飞?
答:不能——转移只有一程,余劲把第二只砍冒的部分就地散掉,不递归不套娃,这条铁律防住了连锁崩账。

问:旁边站着头目余劲会飞给它吗?
答:会——搜索圈认最近的活怪不认体重,余劲飞头目是白捡的便宜,站位好的玩家专门蹭这份。

问:开锋期一刀没杀死任何怪呢?
答:纹照常空转——余劲只认死亡结算,不冒刀就没有飞的材料,开锋期的平砍一分不多一分不少。

问:两刀同帧杀死两只怪怎么飞?
答:各飞各的——每只怪的冒刀各自侦测各自转移,同帧双杀互不干扰,账本一怪一页。

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

第四笔是转移的保真:余劲全额转移是这套纹的信誉——打折转移的版本杀冒成了亏本买卖,玩家会刻意留刀控血线,全额才配叫"不浪费"。第三笔是搜索圈的半径:三百步是"下一只就在身边"的口径——圈太小余劲常常无处可飞,圈太大飞到看不见的地方演出白做。第二笔是侦测的基数:落刀前的血是唯一的正确底数——基数取错余劲就成虚假的数字,这一行写错整套纹的账全是错的。第一笔是飞的演出:黄光从尸体飞向新目标要有一段可见的航程——余劲的爽一半在"飞"字上,瞬移结算的版本玩家以为是自己砍的。常见坑三个:余劲触发第二只怪的死亡时没走冒刀侦测导致递归飞刀;余劲结算的仇恨算在了玩家头上引来围殴;两只怪同帧死亡的双份余劲飞向了同一具尸体。

商业服里顺劈纹是"屠户庄"的剔骨刀:别人一刀是一刀,他的刀劲连本带利——商城里纹环的样式做成品级,麻布纹、黄铜纹、剔骨银纹,那圈黄铜色的纹环就是屠户庄的围裙。运营落地还有两笔:一段是引怪教学——教一句"薄血的引到肥的旁边,刀劲飞得准",流派第一课是站位;一段是剔骨榜——按余劲转移的总伤排名,杀得最"冒"的人有碑。变体做成双飞余劲:冒出来的刀劲一分为二飞向两只怪——从单程到分单,屠户庄的案板越摊越大。这一篇的演示和整套模块照抄能跑,改的就是 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 技术组