【游戏功能】
技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀纯亏。这篇的核心代码照引擎技能脚本的全规格写:配置表、血刃构件、双钩子、定时器、调试按钮。
一、效果演示:每刀扣二回三,空刀纯亏
演示场点「血刃!」:周身亮起一圈红色的血刃光环——头顶挂"血刃 八秒"。每一刀命中:怪的身上蹦"-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 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 蓄力技为什么总是单发?影炮偏要贯穿全屏:蓄一秒射一道暗影弹道穿全屏——线上所有目标各挨五十五,弹道从你脚下贯穿…
【游戏功能】 灼烧为什么总烧在皮肤上?灼心偏要烧进心里:心被灼了六秒——六秒里怪每出一招就自损八,出得越多损得越多。这篇的核…
【游戏功能】 魂卫为什么只有三盏就不能多了?魂蜂偏要做成可以积累的:杀掉小怪化一盏魂蜂跟着你走,至多三盏——三盏魂蜂各自两秒…
【游戏功能】 镜墙为什么只能反弹不能冰冻?霜镜偏要双管齐下:弹道撞上霜镜原路画回去——回程的弹道还带着冰冻效果,扎中怪怪也冻…
【游戏功能】 单体射击为什么打不动厚血怪?穿心刺给的答案是:箭伤八加穿心伤,穿心伤等于最大血量百分之六——血越厚的怪越疼。这…
【游戏功能】 影刺的全机制就一句话:化影绕到它身后,从背刺出的那一刀双倍二十四——正面十二、背后二十四,它一转身就变白板。这…