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 11:23 996 技术组
进阶实战游戏功能

蛮牛劲:一勾锁它拖下马,硬生生拽到跟前

【游戏功能】 后山出过一单笑话:一个远程怪卡在断桥那头射了全队十分钟,走不过去、勾不着、弹道够不到——最后是位玩钩子的老哥一…

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

迟滞咒:咒它出手慢一倍,节奏全乱招招落空

【游戏功能】 M.at = M.at 2 —— 就这一行,让一只盯了三天的速攻怪从"碰不得"变成"随便打"。怪的可怕从来不在…

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

叠劲:连打同门一刀重一刀,断了就得从头数

【游戏功能】 为什么连着打同一个怪,一刀会比一刀疼?叠劲的答案是:劲是攒出来的——起手八点,每接一刀加四点,叠到六层刀刀二十…

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

破势令:一处破绽挂六秒,谁打它都更疼

【游戏功能】 群里报过一个怪现象:同一位玩家打同一个怪,有时一刀十三有时一刀十,面板攻击力没变过——排查了半天才发现,十三的…

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

血债簿:五笔血账一次清算,欠下的刀刀要还

【游戏功能】 线上出过一单事故:同战力两个人对砍,先手的那位反而输了——事后翻账才发现,赢家的每一刀都比面板数值高出一截,高…

2026-10-01 11:22 996 技术组