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

移祸:它的刀改追你的狗

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

【游戏功能】

仇恨转移不稀奇——稀奇的是转给谁:移祸不把怪引开、不把怪定住,它把怪的仇恨整个改写到你身边那条犬身上,八秒里它的刀只追犬,犬的两百血就是你的墙。这篇的核心代码照引擎技能脚本的全规格写:配置表、代祸构件、仇恨改写状态机、定时器、调试按钮。

一、效果演示:八秒祸契,一条犬的墙

演示场点「移祸!」:一道青白的虚线从怪身上拉到你脚边的犬身上——怪的仇恨当场易主,掉头去追犬,一刀四十全拍在犬的两百血上。你站在圈外照常输出,十三点的灰字一刀一刀稳稳落账。犬血见底当场趴窝,虚线崩断——仇恨零延迟回头找你,第一刀就是二十八的实价。八秒祸契到期也是同样的回头。演示里试两条路:犬趴了不及时走位,两刀带走你;犬趴了立刻拉开距离,回头刀落空——祸契的最后一秒是这门机制的门铃。祸契的最后一秒是这门机制的门铃——门铃一响就得走位,走位走得好,回头刀落空;听得懂门铃的玩家,这条犬就是八秒的自由。

demo
 fx-aggroshift

二、底层原理:一次仇恨改写加一条回退链

模块的机关是一对搭档。仇恨改写:移祸把怪的仇恨目标字段整段改写到犬身上——改写的是"追谁"这一个字段,怪的伤害、出手节奏原封不动,犬承受的是原价的刀。改写的是"追谁"这一个字段,怪的伤害、出手节奏原封不动,犬承受的是原价的刀。犬的走位也有讲究——代祸期间犬贴着怪的侧身绕,怪回身的速度就赶不上犬的跑速,两百血能扛出三百血的效果。回退链:改写不是永久的——犬趴窝、祸契到期两条路都会触发仇恨回退,回退把目标字段改回玩家、零延迟生效。改写与回退共用一个状态字段是全模块的骨架:shiftT 大于零就是犬代主受祸,归零就是主自担——中间态不存在,半张仇恨表的版本会有怪一半刀追犬一半刀追你的精神分裂。犬的趴窝是回退的硬保险:两百血被四十的刀五刀拍穿,五刀之后祸自动回头,机制替玩家兜住"犬死犹斗"的最坏情况。

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

lua
--------------------------------------------------------------------------------
-- @file        AggroShift.lua
-- @brief       移祸 —— 它的刀改追你的狗
--              客户端表现模块:配置表 / 代祸构件 / 仇恨改写状态机 / 定时器
--------------------------------------------------------------------------------

local AggroShift = {}

--------------------------------------------------------------------------------
-- 配置与常量
--------------------------------------------------------------------------------
local CONST = {
    SHIFT_LIFE    = 8.0,        -- 祸契八秒
    SHIFT_CD      = 10.0,      -- 移祸冷却
    DOG_HP        = 200,       -- 犬血两百
    DOG_DOWN      = 8.0,       -- 犬趴八秒
    HOUND_SPEED   = 50,        -- 犬的跑速

    -- 颜色
    COLOR_SHIFT   = "#8ab8c8",  -- 祸青
    COLOR_DEEP    = "#2a4a5e",  -- 深青
    COLOR_GHOST   = "#d8ecf0",  -- 祸白

    ZORDER_GROUND = 118,
    ZORDER_LINK   = 128,
    ZORDER_EFFECT = 135,

    AUTOINC_BASE  = 953000,
}

--------------------------------------------------------------------------------
-- 模块内部状态
--------------------------------------------------------------------------------
local _shiftT     = 0              -- 祸契余时
local _dogHp      = 0
local _dogDown    = 0              -- 犬趴余时
local _cdLeft     = 0
local _scheduler  = nil
local _autoInc    = 0

local m_cos = math.cos
local m_sin = math.sin

--------------------------------------------------------------------------------
-- 辅助函数
--------------------------------------------------------------------------------
local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "AGS", CONST.AUTOINC_BASE + _autoInc)
end

local function GetActorPos(actorID)
    if not actorID then return nil end
    local x = SL:GetValue("ACTOR_POSITION_X", actorID)
    local y = SL:GetValue("ACTOR_POSITION_Y", actorID)
    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 CreateLinkNode(fromX, toX)
    local node = GUI:Layout_Create(GUI:Attach_SceneF(), GenID("Link"),
        math.min(fromX, toX), 0, 0, 0, false)
    GUI:setLocalZOrder(node, CONST.ZORDER_LINK)
    GUI:DrawLine_Create(node, "tie", 0, 0, 2,
        0, 60, math.abs(toX - fromX), 60,
        CONST.COLOR_SHIFT, 180)
    return node
end

骨架的三处立规。犬血是独立资产不是玩家的分身血——两百就是两百,玩家掉血不牵连犬、犬挨刀不牵连玩家,两本血账分立才有"墙"的价值。祸契虚线的构件挂在两坐标的中点——线随两头跑,每帧重设端点,静止的祸契线是假的。HOUND_SPEED 五十步比玩家快——犬追得上怪的仇恨,代祸的墙才砌得到怪的刀下。

四、核心代码:完整模块(下·定时器与仇恨改写)

lua
--------------------------------------------------------------------------------
-- 移祸入口
--------------------------------------------------------------------------------
function AggroShift.Cast()
    if _cdLeft > 0 or _shiftT > 0 then return end
    if _dogDown > 0 then
        ShowTip("犬趴着——接不了祸")
        return
    end
    _cdLeft = CONST.SHIFT_CD
    _shiftT = CONST.SHIFT_LIFE
    _dogHp = CONST.DOG_HP
    SL:ShiftHateToHound()
    ShowTip("祸移到犬身上了——八秒,犬的血就是你的墙")
end

--------------------------------------------------------------------------------
-- 仇恨改写的读法
--------------------------------------------------------------------------------
local function DogTanking()
    return _shiftT > 0 and _dogDown <= 0
end

--------------------------------------------------------------------------------
-- 定时器:祸契、犬的代刀与回退
--------------------------------------------------------------------------------
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _dogDown > 0 then
            _dogDown = _dogDown - dt
            if _dogDown <= 0 then
                _dogHp = CONST.DOG_HP
                ShowTip("犬归队了——还能再移一次祸")
            end
            return
        end
        if _shiftT > 0 then
            _shiftT = _shiftT - dt
            if _shiftT <= 0 then
                ShowTip("祸契到期——它的刀回头找你了")
            end
        end
    end, 0.02)
end

SL:RegisterLUAEvent(LUA_EVENT_MONSTER_SWING, "AGS_Swing", function(data)
    if data and data.raw then
        if DogTanking() then
            _dogHp = _dogHp - data.raw
            SL:TipAboveHound("-" .. data.raw)
            if _dogHp <= 0 then
                _dogDown = CONST.DOG_DOWN
                _shiftT = 0
                ShowTip("犬趴了——祸回到你头上,走位!")
            end
        else
            SL:PlayerHurt(data.raw)
        end
    end
end)

SL:ScheduleOnce(function()
    ShowTip("技能已加载: 移祸 (调试按钮触发)")
end, 1.0)

return AggroShift

下半场的分流写在挨刀事件的入口:DogTanking 为真,刀走犬的血条;为假,刀落玩家——一条分流管住怪的每一刀,玩家不会被"漏过来的半刀"打懵。回退链的两条触发路(祸契到期、犬趴)都把 _shiftT 清零——清零是唯一的回退开关,仇恨的改写和回退都读同一个字段,账本永远只有一版真相。

五、调参指南与商业服怎么用

调参三笔账。犬血两百对怪一刀四十是五刀的墙——墙的厚度要刚好挡过怪的两组连击,五刀是"够打一轮输出"的尺寸;两百变三百,移祸从保命技变成站桩挂机技。祸契八秒对犬趴八秒是对称设计——犬替你扛八秒、自己趴八秒,功过相抵的回合制让玩家必须掐节奏,掐不准的玩家会在犬趴的第一秒挨上回头的那记重刀。移祸冷却十秒对犬趴八秒留两秒真空——真空期是走位的考题。常见坑三个:犬趴的瞬间怪已经出手,那一刀的归属判定含糊;移祸后怪的走向突变卡进地形;玩家死亡时祸契没清,犬还在替死人挨刀。

商业服里移祸是"宠物流"的战术深度:犬的品级决定墙的厚度——肉犬四百血当墙、敏犬一百血当铃铛,宠物的消费线从攻击力挪到了血量。攻城战里它是指挥官的救场技:祸移给攻城兽,八秒的城门攻坚窗口就是行会付费的点。变体做成连环移祸:甲的犬趴了乙立刻再移——团队移祸链把仇恨玩成接力棒。变体做成连环移祸:甲的犬趴了乙立刻再移——团队移祸链把仇恨玩成接力棒。祸契的交接也要有仪式:两犬同框的一瞬祸契虚线从旧犬滑向新犬,交接的三帧画清楚,接力棒才传得稳。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做仇恨系的同学:移祸卖的是"替身的价值"——改写的只是一个字段,玩家的生死却从此有了代打。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

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

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

LATEST ARTICLES

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

进阶实战游戏功能

影炮:蓄一秒,暗影弹道贯穿全屏

【游戏功能】 蓄力技为什么总是单发?影炮偏要贯穿全屏:蓄一秒射一道暗影弹道穿全屏——线上所有目标各挨五十五,弹道从你脚下贯穿…

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

灼心:点燃它的心,出招即自损

【游戏功能】 灼烧为什么总烧在皮肤上?灼心偏要烧进心里:心被灼了六秒——六秒里怪每出一招就自损八,出得越多损得越多。这篇的核…

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

魂蜂:杀敌化蜂,至多三盏自动蜇击

【游戏功能】 魂卫为什么只有三盏就不能多了?魂蜂偏要做成可以积累的:杀掉小怪化一盏魂蜂跟着你走,至多三盏——三盏魂蜂各自两秒…

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

霜镜:架起霜镜,弹道冻着原路画回

【游戏功能】 镜墙为什么只能反弹不能冰冻?霜镜偏要双管齐下:弹道撞上霜镜原路画回去——回程的弹道还带着冰冻效果,扎中怪怪也冻…

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

穿心刺:一箭穿心,最大血量百分之六的穿透

【游戏功能】 单体射击为什么打不动厚血怪?穿心刺给的答案是:箭伤八加穿心伤,穿心伤等于最大血量百分之六——血越厚的怪越疼。这…

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

影刺:化影绕后,背刺一刀双倍

【游戏功能】 影刺的全机制就一句话:化影绕到它身后,从背刺出的那一刀双倍二十四——正面十二、背后二十四,它一转身就变白板。这…

2026-10-01 10:47 996 技术组