【游戏功能】
var over=d-before——先拆这一行。刀额减去落刀前的血,多出来的那一截就是杀过头的余劲。顺劈纹的全部机关就这一行:刀劲不散,飞向下一只。怪剩三点血你砍了二十,那十七点的多余刀劲不浪费,原样砸到它同伴头上。这篇把整套模块拆开:配置表、开锋窗口、冒刀侦测、余劲转移、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:杀过头的刀,落到下一只头上
演示场两只怪一左一右。点「开锋!」:一圈黄铜色的纹亮起——十二秒的开锋期。第一只怪血薄,你的十二点一刀砍下去,它只剩八点——冒了四点。刀劲没散:一道黄光从尸体上飞出去,四点余劲落在第二只怪头上,"余-4"的字蹦出来。下一刀砍冒得多,飞的余劲更猛。两只怪的血条此消彼长,你打一只,另一只陪挨。演示里试两笔账:开锋期清两只和不开锋清两只——同样的刀数,开锋的余劲替你白打了好几刀。顺劈纹教的是不浪费:杀过头的每一分力都要有去处。
fx-overcarry
二、底层原理:一次冒刀侦测加一次余劲转移
模块的机关是一对搭档。冒刀侦测:每一刀落账前先记下它挨之前的血——刀额减去这份血,正数就是杀过头的余劲,零和负数刀劲全部收在它身上,账目一分不差。余劲转移:正数的余劲当场起飞,落到搜索圈里最近的活怪身上——转移的值就是冒出来的值,不打折不衰减,杀过头多少就传多少。和溅射类机制的分野在"顺劈的余劲来自杀冒的那一刀":溅射是每一刀都带边料,顺劈只在杀死的那一刀结算——平时一刀不多,收割的那一刀加倍有声有息。
余劲为什么选最近的怪而不是随机的?最近的怪是玩家眼里的"下一只"——玩家会下意识把薄血怪往目标旁边引,让余劲飞得准;随机的版本余劲飞到天边去,白给的伤害玩家感知不到,机制等于白做。
三、核心代码:完整模块(上·骨架)
-- @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
四、核心代码:完整模块(下·冒刀侦测与余劲转移)
-- 冒刀侦测:刀额减去落刀前的血,正数是余劲
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…