【游戏功能】
为什么偷袭总被提前发现?因为它的瞭望灯亮着——二百二十步的警戒圈画在暗处,你一踏进去它就开始上弦。瞭望换个思路:不躲圈,扑灯——把它的灯扑灭五秒,警戒圈缩到八十步——圈外你是空气,圈里它才看得见。这篇把整套模块拆开:配置表、灯芯构件、警戒改写、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:扑了它的灯,警戒圈缩一半
演示场的怪带一盏瞭望灯,淡蓝的警戒圈画满半屏——圈里的你会挨箭,圈外它当你是风。点「扑灯!」:一记手刀隔空掐灭灯芯——警戒圈当场缩成小小的一环,圈外的世界对它关了灯。这时候你的箭一支支白嫖:它站在原地打转,头顶冒问号,就是看不见你。五秒一到灯芯复燃,圈弹回原样——它先看一圈再找你。演示里试两个站位:圈外白嫖五箭,和贴脸硬拼——灯灭的窗口是为圈外的人开的,贴脸的算另一门课。瞭望教的是灯下黑:它的眼睛有多远,你的安全就有多远。
fx-scoutlamp
二、底层原理:一盏警戒灯加一次圈径改写
模块的机关是一对搭档。警戒灯:怪的索敌半径写在灯上——灯亮,圈径二百二;灯是它眼睛的度量衡,圈内的一切都进它的通报。圈径改写:扑灯的五秒里圈径乘零点四——圈一缩,圈外的玩家从它的世界里除名,箭飞进来它也只当是风声。和隐身那类自身消隐的分野在"改的是它的眼不是你的身":隐身把自己藏起来,扑灯把它的世界改小——你不藏,你只是搬到了它的眼界外。
圈外为什么还能白嫖而不触发仇恨?索敌圈的判定就是仇恨的闸门——圈外的一切不进它的敌我表,箭落在脚边也只当天上掉的,这份迟钝是扑灯五秒的全部价值。
三、核心代码:完整模块(上·骨架)
-- @file ScoutLamp.lua
-- 瞭望 —— 扑了它的灯,警戒圈缩一半
local ScoutLamp = {}
local CONST = {
LAMP_LIFE = 5.0,
LAMP_CD = 6.0,
RANGE_BASE = 220,
RANGE_MULT = 0.4,
COLOR_LAMP = "#8898b8",
COLOR_DEEP = "#26304a",
COLOR_GHOST = "#d0dcec",
ZORDER_LAMP = 128,
ZORDER_FX = 135,
AUTOINC_BASE = 1037000,
}
local _lampT = 0
local _lampID = 0
local _cdLeft = 0
local _lampFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "SCL",
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 ApplyRange(tid)
SL:SetActorSight(tid, math.floor(
CONST.RANGE_BASE * CONST.RANGE_MULT))
end
local function RestoreRange(tid)
SL:SetActorSight(tid, CONST.RANGE_BASE)
end
function ScoutLamp.Douse()
if _cdLeft > 0 or _lampT > 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
_cdLeft = CONST.LAMP_CD
_lampT = CONST.LAMP_LIFE
_lampID = tid
ApplyRange(tid)
SafeRemove(_lampFx)
_lampFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Lamp"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_lampFx, CONST.ZORDER_LAMP)
SL:PlayDouseFx(tid)
SL:TipAbove(tid, "灯灭!")
ShowTip("灯扑了——五秒里它的眼只剩一半,圈外白嫖")
end
四、核心代码:完整模块(下·定时器与圈径回收)
-- 索敌改写:圈外的一律不进敌我表
SL:RegisterLUAEvent(LUA_EVENT_SIGHT_CHECK, "SCL_Out", function(tid, dist)
if _lampT > 0 and tid == _lampID then
local rng = math.floor(CONST.RANGE_BASE * CONST.RANGE_MULT)
if dist > rng then return false end
end
return true
end)
-- 定时器:灯芯复燃与圈径回收
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _lampT > 0 then
_lampT = _lampT - dt
local tp = GetActorPos(_lampID)
if _lampFx and tp then
GUI:setPosition(_lampFx, tp.x, tp.y - 110)
end
if _lampT <= 0 or not tp
or SL:GetValue("ACTOR_DEAD", _lampID) then
_lampT = 0
RestoreRange(_lampID)
SafeRemove(_lampFx)
ShowTip("灯又亮了——它重新看见你,圈外的不算")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("扑灯", function()
ScoutLamp.Douse()
end)
ShowTip("技能已加载: 瞭望 (调试按钮触发)")
end, 1.0)
function ScoutLamp.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
if _lampT > 0 then RestoreRange(_lampID) end
SL:UnregisterLUAEvent(LUA_EVENT_SIGHT_CHECK, "SCL_Out")
SafeRemove(_lampFx)
_lampT = 0
end
return ScoutLamp
五、机制问答
问:扑灯的瞬间它正盯着我怎么办?
答:圈缩了它就得重新找——灯灭的那一刻索敌表清空重录,盯视的视线跟着圈一起缩,五秒的窗口从灭灯那一帧起算。
问:圈外的箭会暴露我吗?
答:不会——箭不记名,圈外的箭在它的账本里是天气,扑灯期的白嫖连账都不留。
问:它的队友看得见吗?
答:看得见队友的圈看不到你——索敌改写只作用在被扑灯的这一只,队友的灯还亮着,绕后前先数数几盏灯。
问:灯能被重复扑吗?
答:五秒内不能——灯芯复燃前扑不进去,复燃后冷却也快好了,扑灯的节奏是六秒一扑。
问:它移动灯跟着动吗?
答:动——灯是它的装备不是地上的火盆,圈心跟着它的脚走,扑灯圈缩圈不缩心。
问:扑灯和禁足能叠吗?
答:能——扑灯缩它的眼,禁足钉它的脚,看不见又跑不掉的怪,是远程职业的活靶。
问:灯灭期它的攻击也停吗?
答:只有你进圈它才打——看不见就不进入战斗,圈外的攻击在它的世界里不存在。
六、调参指南与商业服怎么用
第四笔是缩圈的比例:乘零点四是"从半屏缩到一环"的观感落差——缩到零的版本它成了瞎子,白嫖变成处刑;缩到七成的版本圈内外没差别,扑灯白扑。第三笔是灯期的长度:五秒对一点二秒的箭速是四箭的白嫖窗——灯期太短白嫖不够本,太长远程职业躺着通关。第二笔是圈径的基数:二百二十步是"半屏警戒"的傲慢——基数大的怪才配扑灯,基数小的怪圈缩了也罩着你。第一笔是圈的明画:警戒圈用虚线画在地上——玩家看圈站位,圈就是这门机制的全部地图,不画圈的扑灯等于白扑。常见坑三个:圈径回收漏了索敌表的残眼,灯亮了它还瞎两秒;扑灯对多灯怪只扑一盏,剩的灯照通报;圈缩的动画和判定不同帧,看着缩了判定没缩。
商业服里瞭望是"夜行流派"的灭灯手:别人拼刀,他先掐灯——商城里扑灯的手势做成品级,拂袖、掐指、灭烛手,灯芯暗下去的那半秒就是夜行人的入场券。运营落地还有两笔:一段是灯怪图鉴——哪种怪的灯亮圈大写进页脚,夜行人按图扑灯;一段是灯下黑榜——按扑灯期打出的总伤排名,圈外站得最稳的人有碑。变体做成群灯灭:扑一盏灯带灭半径内所有的灯——一次灭灯灭一窝,夜行人的手笔越铺越大。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
夜行人的口诀补一句:灯灭五秒,走三停二,最后一段留给箭。
写完留一句给做视野系的同学:瞭望卖的是"它的眼有多远你就有多安全"——那圈一缩再缩的虚线,是把它的眼睛拧小到刚好漏掉你的调试手法。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 它的拍子一秒六一轮,拍上出刀白给,拍子空当里递刀才是十六点。错拍把"读它的拍"变成递刀的时机学:绿窗一亮,刀递…
【游戏功能】 两刀压进它一拍里——第二刀落定的瞬间它趔趄一秒,趔趄里刀刀翻倍。抢拍把"比它快"做成了机制:它两秒一拍地出手,…
【游戏功能】 按住一点五秒再松手——沉刀的全部仪式就这一按一放:按住时劲往刀上沉,松手那一瞬二十二点的重刀见真章;按不满就松…
【游戏功能】 起手之后零点三秒里再点一下,两刀并成一记十六点的双击斩;没接上,起手就白给了。双击斩把"两击"这个概念拆进输入…
【游戏功能】 它出什么招,你就换什么式——劈克刺、刺克扫、扫克劈,三式相扣的一个圈。挪移换式把猜拳搬进了打架:怪的下一手提前…
【游戏功能】 连珠 = 连珠 + 1 —— 半秒里每按一次涨一格的连珠,五珠攒满就是一记二十五点的重轰。连珠快拳把"手快"直…