CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

瞭望:扑了它的灯,警戒圈缩一半

2026-10-01 15:00 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

为什么偷袭总被提前发现?因为它的瞭望灯亮着——二百二十步的警戒圈画在暗处,你一踏进去它就开始上弦。瞭望换个思路:不躲圈,扑灯——把它的灯扑灭五秒,警戒圈缩到八十步——圈外你是空气,圈里它才看得见。这篇把整套模块拆开:配置表、灯芯构件、警戒改写、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:扑了它的灯,警戒圈缩一半

演示场的怪带一盏瞭望灯,淡蓝的警戒圈画满半屏——圈里的你会挨箭,圈外它当你是风。点「扑灯!」:一记手刀隔空掐灭灯芯——警戒圈当场缩成小小的一环,圈外的世界对它关了灯。这时候你的箭一支支白嫖:它站在原地打转,头顶冒问号,就是看不见你。五秒一到灯芯复燃,圈弹回原样——它先看一圈再找你。演示里试两个站位:圈外白嫖五箭,和贴脸硬拼——灯灭的窗口是为圈外的人开的,贴脸的算另一门课。瞭望教的是灯下黑:它的眼睛有多远,你的安全就有多远。

demo
 fx-scoutlamp

二、底层原理:一盏警戒灯加一次圈径改写

模块的机关是一对搭档。警戒灯:怪的索敌半径写在灯上——灯亮,圈径二百二;灯是它眼睛的度量衡,圈内的一切都进它的通报。圈径改写:扑灯的五秒里圈径乘零点四——圈一缩,圈外的玩家从它的世界里除名,箭飞进来它也只当是风声。和隐身那类自身消隐的分野在"改的是它的眼不是你的身":隐身把自己藏起来,扑灯把它的世界改小——你不藏,你只是搬到了它的眼界外。

圈外为什么还能白嫖而不触发仇恨?索敌圈的判定就是仇恨的闸门——圈外的一切不进它的敌我表,箭落在脚边也只当天上掉的,这份迟钝是扑灯五秒的全部价值。

三、核心代码:完整模块(上·骨架)

lua
-- @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

四、核心代码:完整模块(下·定时器与圈径回收)

lua
-- 索敌改写:圈外的一律不进敌我表
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 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

错拍:踩着它的拍子递刀,拍上十六

【游戏功能】 它的拍子一秒六一轮,拍上出刀白给,拍子空当里递刀才是十六点。错拍把"读它的拍"变成递刀的时机学:绿窗一亮,刀递…

2026-10-01 15:31 996 技术组
进阶实战游戏功能

抢拍:两刀压进它一拍,第二刀震它趔趄

【游戏功能】 两刀压进它一拍里——第二刀落定的瞬间它趔趄一秒,趔趄里刀刀翻倍。抢拍把"比它快"做成了机制:它两秒一拍地出手,…

2026-10-01 15:31 996 技术组
进阶实战游戏功能

沉刀:按住蓄劲,松手见真章

【游戏功能】 按住一点五秒再松手——沉刀的全部仪式就这一按一放:按住时劲往刀上沉,松手那一瞬二十二点的重刀见真章;按不满就松…

2026-10-01 15:31 996 技术组
进阶实战游戏功能

双击斩:双击成斩,单击白给

【游戏功能】 起手之后零点三秒里再点一下,两刀并成一记十六点的双击斩;没接上,起手就白给了。双击斩把"两击"这个概念拆进输入…

2026-10-01 15:31 996 技术组
进阶实战游戏功能

挪移换式:看它的招换你的式,对上了双倍

【游戏功能】 它出什么招,你就换什么式——劈克刺、刺克扫、扫克劈,三式相扣的一个圈。挪移换式把猜拳搬进了打架:怪的下一手提前…

2026-10-01 15:31 996 技术组
进阶实战游戏功能

连珠快拳:连按攒拳劲,五拳一轰

【游戏功能】 连珠 = 连珠 + 1 —— 半秒里每按一次涨一格的连珠,五珠攒满就是一记二十五点的重轰。连珠快拳把"手快"直…

2026-10-01 15:31 996 技术组