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

内讧蛊纹:它打我一爪,同伴陪疼四成

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

【游戏功能】

上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",一只爪十四点的怪给同伴挂了四十点的陪葬账,两只小怪三爪互咬直接双双倒地。四成和四十点,一字之差就是一条命。修完把这个教训写进了内讧纹的骨头里:百分比永远换算完再入账,入账前先和它自己的血量上限打一遍照面。这篇把整改后的整套模块拆开:配置表、下蛊结算、陪疼换算、连坐判定、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:它打我一爪,同伴陪疼四成

演示场两只怪一左一右。点「内讧!」:一道暗红的蛊线在两只怪之间连起来——十二秒蛊期。这一拍起,它们的爪照旧往你身上招呼,可每一爪落下,出手者的同伴身上同时蹦出"内-6"的暗红字——四成的陪疼账当场划走。左边的爪重十四,右边的陪六;右边的爪十二,左边的陪五。两只怪越打你的帮手越少——它们自己的爪在替你清场。演示里试两笔账:蛊期的两只掉血速度和蛊散后只挨单只的掉血速度——蛊线连着的那段时间,你的每一份挨打都翻成一又四成。内讧纹教的是下蛊:不挡它们的刀,让它们的刀互相记账。

demo
 fx-infight

二、底层原理:一道蛊线构件加一次陪疼换算

模块的机关是一对搭档。蛊线构件:开纹那一拍一道暗红的线连起两只怪——蛊线认的是"这一对",线在的每一拍,谁动手谁的同伴陪账。陪疼换算:每一爪落你身上的伤害按四成换算成同伴的陪疼——换算是这道纹的命根,四成是比率不是定值,爪重陪得重,爪轻陪得轻。和溅射类机制的分野在"内讧的账长在出手者的同伴身上":溅射是你一刀带边料,内讧是它们自己人互相记账——你一分力没多出,它们的每一次进攻都在给同伴挖坑。

陪疼为什么四成不是对半?对半的版本两只怪互咬一轮就接近同归于尽,蛊成了秒杀器的钥匙;四成刚好是"陪得疼但陪不死"的份例——清场的活还是你的刀来干,蛊线只负责让它们的爪子发抖。

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

lua
-- @file Infight.lua
-- 内讧蛊纹 —— 它打我一爪,同伴陪疼四成

local Infight = {}

local CONST = {
    CREST_LIFE    = 12.0,
    CREST_CD      = 4.0,
    SHARE_RATE    = 0.4,

    COLOR_INFIGHT = "#a85848",
    COLOR_DEEP    = "#481818",
    COLOR_GHOST   = "#f0c0b0",

    ZORDER_INFIGHT = 92,
    ZORDER_FX      = 135,
    AUTOINC_BASE   = 1125000,
}

local _crestT    = 0
local _cdLeft    = 0
local _linkA     = 0
local _linkB     = 0
local _crestFx   = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "INF",
        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 Infight.Share(tid, dmg)
    local share = math.floor(dmg * CONST.SHARE_RATE)
    local hpM = SL:GetValue("ACTOR_HP_MAX", tid) or 0
    return math.min(share, math.floor(hpM * 0.1))
end

四、核心代码:完整模块(下·蛊线判定与陪疼入账)

lua
-- 蛊线判定:谁对玩家出爪,谁的同伴陪疼
SL:RegisterLUAEvent(LUA_EVENT_AFTER_HURT, "INF_Share", function(tid, dmg)
    if _crestT <= 0 or not tid then return end
    local other = Infight.PartnerOf(tid)
    if not other then return end
    local share = Infight.Share(other, dmg)
    if share <= 0 then return end
    SL:ActorHurt(other, share)
    SL:TipAbove(other, "内-" .. share)
end)

function Infight.PartnerOf(tid)
    if tid == _linkA then return _linkB end
    if tid == _linkB then return _linkA end
    return nil
end

function Infight.Cast()
    if _cdLeft > 0 or _crestT > 0 then return end
    local tid = SL:GetValue("MARK_TARGET_ID")
    if not tid then return end
    local other = SL:FindNearMonster(tid, 300)
    if not other then
        ShowTip("就一只怪——蛊下给谁")
        return
    end
    _cdLeft = CONST.CREST_CD
    _crestT = CONST.CREST_LIFE
    _linkA = tid
    _linkB = other
    SafeRemove(_crestFx)
    _crestFx = GUI:Layout_Create(GUI:Attach_Scene(),
        GenID("Line"), 0, 0, 0, 0, false)
    GUI:setLocalZOrder(_crestFx, CONST.ZORDER_INFIGHT)
    SL:PlayCurseUpFx(tid, other)
    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 a = GetActorPos(_linkA)
            local b = GetActorPos(_linkB)
            if _crestFx and a and b then
                GUI:setPosition(_crestFx,
                    (a.x + b.x) / 2, (a.y + b.y) / 2 - 140)
            end
            if _crestT <= 0 then
                SafeRemove(_crestFx)
                ShowTip("蛊散了——各打各的了")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("内讧", function()
        Infight.Cast()
    end)
    ShowTip("技能已加载: 内讧纹 (调试按钮触发)")
end, 1.0)

function Infight.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_AFTER_HURT, "INF_Share")
    SafeRemove(_crestFx)
    _crestT = 0
    _linkA = 0
    _linkB = 0
end

return Infight

五、机制问答

问:同伴被陪疼死了算谁的击杀?
答:算你的——蛊是你下的,陪疼的账记在你名下,掉落和经验一分不少。

问:它打空了也陪疼吗?
答:不陪——账认落你身上的实伤,劈空的那一爪没有基数,陪疼无从换算。

问:陪疼能把它自己陪死吗?
答:能——换算有血量上限的照面,可陪疼是真实扣血,同伴血薄照样被自家爪子拖死。

问:蛊期内第三只怪进场怎么办?
答:进不了蛊——线只连打桩那一刻的两只,编外的怪打你不安租,想全下蛊得重下一次。

问:陪疼的账吃你的增伤吗?
答:不吃——四成认的是它爪的实伤,你的攻击力和这个比率不相干,蛊账走它自己的通道。

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

第四笔是换算的口径:四成是比率不是定值——那场"四十点"的事故就是口径写死闹的,换算完入账、入账前和血量上限照面,两道工序一道不能省。第三笔是陪疼的份例:四成对两爪互咬是"陪得疼陪不死"的份例——份例太高蛊成了互杀的钥匙,太低两只怪毫发无伤,四成刚好让它们的爪子开始发抖。第二笔是蛊线的口径:只连开蛊那刻的两只——编外的怪不进蛊,口径松了全场互咬变成清场技,紧了蛊线成了摆设,两只的口径刚刚好。第一笔是蛊线的戏:暗红的虚线要全程绷着——线在蛊在,玩家看线就知道这笔"四成"还有几秒,线断了账就散。常见坑三个:比率误写成定值的事故原型;单怪死亡后蛊线还连着尸体结算;陪疼的飘字盖过了主伤害的飘字。

商业服里内讧纹是"蛊降门"的阴手:别人挡刀他挑事——商城里蛊线的样式做成品级,红线、血蛊线、万蛊母线,那道连在两只怪之间的暗红蛊线就是蛊降门的引子。运营落地还有两笔:一段是下蛊教学——教一句"两只一起打你才下蛊,让它们的爪自己打架",流派第一课是挑事;一段是蛊降榜——按陪疼转移的总伤排名,蛊下得最损的人有碑。变体做成蛊火燎原:陪疼死一只,蛊线自动跳向下一只——从两只互咬到一窝互咬,蛊降门的引子越下越远。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做挑拨系的同学:内讧纹卖的是"它们的刀互相记账"——那道绷在两只怪之间的暗红蛊线和一爪一个的"内"字,是把敌方的攻势折成内耗的第一道蛊符。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

Lua自动炮台:架一个自动索敌开火

【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua元素转换:火伤转冰伤附带减速

【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua连锁引燃:一个着火引燃下一个

【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua弹射地垫:踩上去弹飞到空中

【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua时间减缓:流速减半的局部时差

【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua引力球:丢出去把怪吸过来

【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…

2026-10-02 04:50 996 技术组