【游戏功能】
技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀纯亏。这篇的核心代码照引擎技能脚本的全规格写:配置表、血刃构件、双钩子、定时器、调试按钮。
一、效果演示:每刀扣二回三,空刀纯亏
演示场点「血刃!」:周身亮起一圈红色的血刃光环——头顶挂"血刃 八秒"。每一刀命中:怪的身上蹦"-14"的金字、你身上蹦"+3"的绿字——扣二回三净赚一。但如果你血量不足以扣二——血刃当场断掉,刀变回白板。演示里故意让血量降到极低再看血刃的表现——血条不够扣的时候血刃自动关闭,这个"自动关"就是保命的底线。
fx-bloodblade
二、底层原理:一个命中双钩子加一份开关旗标
模块的机关是一对搭档。开关侧:血刃是一个八秒的限时加持——开着的时候每次普攻结算时先扣自二再打十四。钩子侧:命中钩子和受击钩子各查一次开关旗标——命中且开着就回三、受击且开着就多扣不另算。和吸血的分野:吸血是被动触发概率性的、血刃是主动开启持续性的——吸血看脸、血刃看管理。开关旗标是全模块的核心:旗标开着才能扣能回、关了两边都断。
三、核心代码:完整模块(上·骨架)
-- @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
四、核心代码:完整模块(下·定时器与双钩子)
-- 开关
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 排查一个报错走到深夜:玩家申诉"人物瞬移",录像里人也确实是凭空跳了半张地图——坐标链上多出来一次没有来由的写…
【游戏功能】 后山出过一单笑话:一个远程怪卡在断桥那头射了全队十分钟,走不过去、勾不着、弹道够不到——最后是位玩钩子的老哥一…
【游戏功能】 M.at = M.at 2 —— 就这一行,让一只盯了三天的速攻怪从"碰不得"变成"随便打"。怪的可怕从来不在…
【游戏功能】 为什么连着打同一个怪,一刀会比一刀疼?叠劲的答案是:劲是攒出来的——起手八点,每接一刀加四点,叠到六层刀刀二十…
【游戏功能】 群里报过一个怪现象:同一位玩家打同一个怪,有时一刀十三有时一刀十,面板攻击力没变过——排查了半天才发现,十三的…
【游戏功能】 线上出过一单事故:同战力两个人对砍,先手的那位反而输了——事后翻账才发现,赢家的每一刀都比面板数值高出一截,高…