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

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

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

【游戏功能】

技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀纯亏。这篇的核心代码照引擎技能脚本的全规格写:配置表、血刃构件、双钩子、定时器、调试按钮。

一、效果演示:每刀扣二回三,空刀纯亏

演示场点「血刃!」:周身亮起一圈红色的血刃光环——头顶挂"血刃 八秒"。每一刀命中:怪的身上蹦"-14"的金字、你身上蹦"+3"的绿字——扣二回三净赚一。但如果你血量不足以扣二——血刃当场断掉,刀变回白板。演示里故意让血量降到极低再看血刃的表现——血条不够扣的时候血刃自动关闭,这个"自动关"就是保命的底线。

demo
 fx-bloodblade

二、底层原理:一个命中双钩子加一份开关旗标

模块的机关是一对搭档。开关侧:血刃是一个八秒的限时加持——开着的时候每次普攻结算时先扣自二再打十四。钩子侧:命中钩子和受击钩子各查一次开关旗标——命中且开着就回三、受击且开着就多扣不另算。和吸血的分野:吸血是被动触发概率性的、血刃是主动开启持续性的——吸血看脸、血刃看管理。开关旗标是全模块的核心:旗标开着才能扣能回、关了两边都断。

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

lua
-- @file BloodBlade.lua
-- 血刃 —— 每刀扣二回三,空刀纯亏

local BloodBlade = {}

local CONST = {
    BLADE_LIFE    = 8.0,
    BLADE_CD      = 8.0,
    SELF_COST     = 2,
    HIT_HEAL      = 3,
    BASE_DMG      = 14,

    COLOR_BLADE   = "#d44a5a",
    COLOR_DEEP    = "#6b1a2a",
    COLOR_GHOST   = "#ffd0d0",

    ZORDER_BLADE  = 128,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 977000,
}

local _bladeT    = 0
local _cdLeft    = 0
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "BBL",
        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 CreateBladeFx()
    local mp = GetActorPos(SL:GetValue("USER_ID"))
    if not mp then return end
    local node = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Blade"), mp.x, mp.y - 46, 0, 0, false)
    GUI:setLocalZOrder(node, CONST.ZORDER_BLADE)
    for i = 1, 22 do
        local a1 = (i - 1) / 22 * 6.28
        local a2 = i / 22 * 6.28
        GUI:DrawLine_Create(node, string.format("b_%d", i), 0, 0, 2,
            m_cos(a1) * 26, m_sin(a1) * 50,
            m_cos(a2) * 26, m_sin(a2) * 50,
            CONST.COLOR_BLADE, 180)
    end
    return node
end

四、核心代码:完整模块(下·定时器与双钩子)

lua
-- 开关
function BloodBlade.Cast()
    if _cdLeft > 0 or _bladeT > 0 then return end
    _bladeT = CONST.BLADE_LIFE
    CreateBladeFx()
    ShowTip("血刃开了——八秒里每刀扣二回三
血刃开了——八秒里每刀扣二回三。血刃的红环也要跟走——红环跟着玩家移动,不是固定在开刃的位置。红环的透明度也随剩余时长衰减——最后两秒环变淡,淡了玩家就知道该续了。")
end

-- 命中钩子
SL:RegisterLUAEvent(LUA_EVENT_LOCAL_HIT, "BBL_Hit", function()
    if _bladeT <= 0 then return end
    local myID = SL:GetValue("USER_ID")
    local hp = SL:GetValue("ACTOR_HP", myID)
    if hp and hp > CONST.SELF_COST then
        SL:SetActorHP(myID, hp - CONST.SELF_COST)
        SL:HealMe(CONST.HIT_HEAL)
        SL:TipAboveMe("+" .. CONST.HIT_HEAL)
    end
end)

-- 定时器
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _bladeT <= 0 then return end
        _bladeT = _bladeT - dt
        if _bladeT <= 0 then
            ShowTip("血刃到期——再开一次")
        end
    end, 0.02)
end

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

return BloodBlade

下半场的命中钩子是全模块的核心:每次命中先查血够不够扣——不够就不扣也不回,血刃自动关了。血量扣除和治疗回血在同一个钩子里先后执行——先扣后回的顺序不能反,反了就是先加后减、净效果不同。

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

调参三笔账。扣二回三是净赚一的汇率——汇率过一玩家血越打越多变成永动,过零血刃变成纯扣血没人开。八秒对冷却八秒是"无缝循环"的配置——冷却比持续短就能常开血刃,机制变成被动光环。血量不足自动关是保命线——不自动关的版本血量被扣成零玩家就死了。常见坑三个:命中钩子对空刀也触发了回血,空刀回血血刃变成无敌;血刃和治疗术叠加回血翻倍;八秒到期后冷却没进,血刃变成无冷却循环。

商业服里血刃是"莽夫流派"的第二条命:血刃的品级做在汇率上——下品扣二回二、上品扣二回五,血刃玩家的汇率就是装备的身价。副本里它是近战生存的核心:血刃开着的时候近战血线稳如老狗,关了就回材料。变体做成血刃连锁:回血的同时给怪挂一层流血——打人回血还让人流血,一刀三用的机制深度从汇率长到了效果链。一刀三用的机制深度从汇率长到了效果链条上。变体做成血刃连锁:回血的同时给怪挂一层流血——打人回血还让人流血,一刀三用的机制深度从汇率长到了效果链。血刃的品级还可以做在持续时长上——下品八秒、上品十二秒,持续时间长的血刃才配叫好刀。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

血刃的红环透明度也要随剩余时长衰减——最后两秒环从实变虚——虚了玩家就知道该续了。血刃的空刀惩罚也别忘了演——空刀那一拍不回血也不扣血,刀白挥了一下,玩家看到空刀就知道亏了。血刃和治疗术的叠加也要写清——血刃的回血和治疗术的回血是两条独立的回血线,叠加不冲突——但血刃扣血和治疗术回血如果在同一帧发生,先扣后加的顺序不能反,反了血条会闪。

写完留一句给做血刃系的同学:血刃卖的是"以血养刀"——扣的二是代价、回的三是回报,玩家的每一刀都在做一道除法题。

血刃的空刀惩罚也别忘了演——空刀那一拍不回血也不扣血,刀白挥了一下,玩家看到空刀就知道亏了。血刃的红环也要跟走——红环跟着玩家移动,不是固定在开刃的位置——跟着走的红环才是长在身上的血刃。血刃和治疗术的叠加也要写清——血刃的回血和治疗术的回血是两条独立的回血线,叠加不冲突——但血刃扣血和治疗术回血如果在同一帧发生,先扣后加的顺序不能反,反了血条会闪。血刃的空刀惩罚也别忘了演——空刀那一拍不回血也不扣血,刀白挥了一下,玩家看到空刀就知道亏了。血刃的红环也要跟走——红环跟着玩家移动,不是固定在开刃的位置——跟着走的红环才是长在身上的血刃。血刃和治疗术的叠加也要写清——血刃的回血和治疗术的回血是两条独立的回血线,叠加不冲突——但血刃扣血和治疗术回血如果在同一帧发生,先扣后加的顺序不能反,反了血条会闪。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

影炮:蓄一秒,暗影弹道贯穿全屏

【游戏功能】 蓄力技为什么总是单发?影炮偏要贯穿全屏:蓄一秒射一道暗影弹道穿全屏——线上所有目标各挨五十五,弹道从你脚下贯穿…

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

灼心:点燃它的心,出招即自损

【游戏功能】 灼烧为什么总烧在皮肤上?灼心偏要烧进心里:心被灼了六秒——六秒里怪每出一招就自损八,出得越多损得越多。这篇的核…

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

魂蜂:杀敌化蜂,至多三盏自动蜇击

【游戏功能】 魂卫为什么只有三盏就不能多了?魂蜂偏要做成可以积累的:杀掉小怪化一盏魂蜂跟着你走,至多三盏——三盏魂蜂各自两秒…

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

霜镜:架起霜镜,弹道冻着原路画回

【游戏功能】 镜墙为什么只能反弹不能冰冻?霜镜偏要双管齐下:弹道撞上霜镜原路画回去——回程的弹道还带着冰冻效果,扎中怪怪也冻…

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

穿心刺:一箭穿心,最大血量百分之六的穿透

【游戏功能】 单体射击为什么打不动厚血怪?穿心刺给的答案是:箭伤八加穿心伤,穿心伤等于最大血量百分之六——血越厚的怪越疼。这…

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

影刺:化影绕后,背刺一刀双倍

【游戏功能】 影刺的全机制就一句话:化影绕到它身后,从背刺出的那一刀双倍二十四——正面十二、背后二十四,它一转身就变白板。这…

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