【游戏功能】
放风筝的怪有多气人?它永远比你快半步:你追它退,你退它射,血条磨了十分钟愣是没近过身。禁足给的就是那句解气的话:一钉钉住它的脚——四秒里它照样张弓放箭,就是哪儿也去不了。这篇把整套模块拆开:配置表、钉足构件、位移封锁、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:一钉落地,风筝断了线
演示场的怪是个标准的风筝手:离你远了就放箭,你一靠近它就退。点「禁足!」:一根木钉砸在它脚边,脚下亮起一圈绿色的锁环——四秒里它的腿彻底废了,人钉在原地,箭还在射。你走上前贴脸输出,它连退半步都做不到。钉环消失的瞬间它第一反应是后跳——晚了,血条已经见底。演示里对比:不钉直接追,追十秒近不了身;钉住再打,四秒够砍四箭。风筝流的命门就是脚,脚一废,整套路就塌了。
fx-noground
二、底层原理:一条位移封锁加一套原地输出
模块的机关是一对搭档。位移封锁:钉足挂四秒的移动锁——锁的是腿不是手,怪的攻击循环照转、弓照拉箭照射,只是所有移动指令一律驳回。原地输出:被钉的怪失了距离感,风筝逻辑里"保持射程"的那条腿没了,玩家贴脸它也只能站着对射。和定身的分野在"还能还手":定身是连手带脚全封,禁足只封脚——还手权留给它,命门交给你,控制里留一口气的分寸就是禁足的平衡点。
为什么封四秒而不是八秒?八秒的版本风筝怪被钉成木桩站撸必死,禁足成了天敌秒杀器;四秒是"钉住一波输出"的窗口,钉完它还能跑,下次见面还得算计着用。
三、核心代码:完整模块(上·骨架)
-- @file NoGround.lua
-- 禁足 —— 一钉钉住它的脚,四秒里哪儿也去不了
local NoGround = {}
local CONST = {
ROOT_LIFE = 4.0,
ROOT_CD = 6.0,
COLOR_NAIL = "#8a9a5a",
COLOR_DEEP = "#3a4418",
COLOR_GHOST = "#d8e8b0",
ZORDER_NAIL = 130,
ZORDER_FX = 135,
AUTOINC_BASE = 994000,
}
local _rootT = 0
local _rootID = 0
local _cdLeft = 0
local _nailFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "NGD",
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 CreateNailFx(id)
local tp = GetActorPos(id)
if not tp then return nil end
local node = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Nail"), tp.x, tp.y, 0, 0, false)
GUI:setLocalZOrder(node, CONST.ZORDER_NAIL)
GUI:DrawRect_Create(node, "stake", -4, -8, 8, 16,
CONST.COLOR_DEEP, 240)
GUI:DrawCircle_Create(node, "lock", 0, -4, 22,
CONST.COLOR_NAIL, 2, 220)
return node
end
function NoGround.Cast()
if _cdLeft > 0 or _rootT > 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
_cdLeft = CONST.ROOT_CD
_rootT = CONST.ROOT_LIFE
_rootID = tid
SL:FreezeActorMove(tid, CONST.ROOT_LIFE)
SafeRemove(_nailFx)
_nailFx = CreateNailFx(tid)
SL:PlayNailFx(tid)
SL:TipAbove(tid, "钉!")
ShowTip("钉住了——四秒里它只能站在原地放箭")
end
四、核心代码:完整模块(下·定时器与锁足回收)
-- 定时器:锁足倒计时与钉子跟脚
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _rootT > 0 then
_rootT = _rootT - dt
local tp = GetActorPos(_rootID)
if _nailFx and tp then
GUI:setPosition(_nailFx, tp.x, tp.y)
end
if _rootT <= 0 or not tp
or SL:GetValue("ACTOR_DEAD", _rootID) then
_rootT = 0
SafeRemove(_nailFx)
ShowTip("钉子松了——它又要开始放风筝了")
end
end
end, 0.02)
end
-- 位移驳回:锁足期一切移动指令无效
SL:RegisterLUAEvent(LUA_EVENT_MOVE_REQUEST, "NGD_Lock", function(tid)
if _rootT > 0 and tid == _rootID then
return false
end
return true
end)
SL:ScheduleOnce(function()
SL:BindDebugButton("禁足", function()
NoGround.Cast()
end)
ShowTip("技能已加载: 禁足 (调试按钮触发)")
end, 1.0)
function NoGround.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MOVE_REQUEST, "NGD_Lock")
SafeRemove(_nailFx)
end
return NoGround
五、机制问答
问:钉得住会冲锋的怪吗?
答:冲锋冲到一半被钉,冲势就地刹住——已起的位移照走完,未起的位移全驳回,锁的是下一步不是惯性,这是位移封锁的行规。
问:怪被钉住会转向打别人吗?
答:会——禁足不锁仇恨,它站原地照样切换目标,组队时钉住的怪还可能射你的队友,站位要替队友想一步。
问:钉子和眩晕能叠加吗?
答:能但没必要——眩晕封手封脚,禁足只封脚,晕住的四秒里禁足白挂,同一目标留一手比全叠上划算。
问:怪挣脱了钉子算多久?
答:四秒整——锁足没有概率挣脱,概率挣脱是控制链的事,禁足的账是死的,死的账玩家才敢围着做打法。
问:钉子能钉住会钻地的怪吗?
答:钻进去的半截钉不住——锁足认脚下的实体,土里那一段它自己留着,说明栏里要写入土免钉。
六、调参指南与商业服怎么用
第四笔是封脚不封手的分寸:被钉的怪照常输出是这机制的魂——玩家贴脸时要真挨箭,赢的代价是真实的,零代价的钉足就是处刑。第三笔是钉环的读法:环的亮度跟着剩余时间走——环暗下去玩家知道要撒手了,比头顶倒计时多一层余光可读。第二笔是冷却的账:六秒冷却对四秒锁足是两秒真空——真空期它跑了别追,等下一枚钉子,追不上是常态不是失误。第一笔是钉子的落点感:钉子要砸在脚边弹一下再立住——从天而降直挺挺插住的是封印,砸一下带尘土的才是禁足,一钉一尘之间手感差一档。常见坑三个:锁足没拦住跳跃,被钉的怪原地跳绳;怪死亡钉子留场上,下一只怪路过踩到隐形钉;位移驳回写进速度而非指令,被钉的怪慢速滑行照样滑出半场。
商业服里禁足是"猎手流派"的看家绳:风筝流横行的赛季它就是销量答案——商城里钉子的样式做成品级,木钉、铁蒺藜、龙牙桩,钉子落地的尘土就是猎手的签名。运营落地还有两笔:一段是风筝怪图鉴的对策栏——每种风筝怪页脚写一句"禁足可解",攻略长在游戏里;一段是锁足输出统计——钉住期间打出的伤害单列,猎手玩家看着"钉伤占比"就有练的头。变体做成连钉:钉住的目标被击杀,钉子弹给八步内另一个远程怪——连环钉的猎场从单只怪长成一片。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
还有一句给追风党的:钉住之后别绕背,它的箭认脸不认人,正面贴脸的输出窗口比绕背稳得多。
钉字诀的后手也留一句:钉完这一轮,下一枚钉子永远在冷却里备着。
写完留一句给做封锁系的同学:禁足卖的是"你哪儿也去不了"——那根砸进土里的钉子和脚下一圈锁环,就是对风筝流的最后通牒。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 接住对手的刀是什么概念?不是挡开,是含着——刀锋停在齿间,力道全数收进嘴里,然后连本带利地吐回去。吞刀把这份狂…
【游戏功能】 开荒团里流传一条铁律:满血的那个人先出手。不是他攻击高,是他手里那把没出过鞘的刀——满血的第一刀三倍狠,刀一沾…
【游戏功能】 M.hp = M.hp - (hit + echo) —— 结算行里多出来的那个回响项,就是这道题的全部答案:…
【游戏功能】 被推来推去是一种什么体验?怪的每一掌都把你拍退半步,走位全乱、节奏全散,打一场架等于被人牵着挪了半张地图。定风…
【游戏功能】 为什么贴脸怪一黏上来你就没辙了?它贴着你的脸输出,你的刀比它的短,退又退不干净——距离的主动权全在它手里。铁掌…
【游戏功能】 后台追过一条隐蔽报错:清怪关卡的通关时间偶尔会出现零点五秒的离谱极值——最快的记录快得像开了加速。翻了三天的录…