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

烫手:这一拳烫手,谁接谁挨炸

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

【游戏功能】

为什么有些架越打血越亏?明明一刀没少吃,血条就是留不住——翻账才发现,那是一场"烫手炭"的对局:一颗炭在两边头顶轮着换,炭在谁头上谁掉血,每换一次主还涨四点。你打它一下,炭飞到你头上;它拍你一掌,炭又飞回去——越勤快的那个,烧得越狠。这篇把整套模块拆开:配置表、炭火构件、易主结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:这一拳烫手,谁接谁挨炸

演示场点「点火!」:一颗炭稳稳落在怪的头顶,一秒半一跳,"烫八"的橙字从它头上蹦出来——炭烧的是持炭的人。你一拳打过去:十点伤害照算,炭却"啪"地飞到你头顶——"接炭十二"四个字格外扎眼,下一跳烧的就是你十二。它再拍你一掌,炭又飞回去,涨到十六——来回几趟,一颗炭烧出了大刀的伤害。演示里看门道:炭的账不是攻击的账,是"谁持有谁挨烧"的独立账——打的每一拳都在送炭,挨的每一掌都在收炭。烫手玩的是热土豆:这颗炭没有安全的手,只有烧得起的头。

demo
 fx-hotcoal

二、底层原理:一颗易主的炭加一份递增的火价

模块的机关是一对搭档。易主炭:炭挂在持有者的头顶按一秒半一跳掉血——任何一次被命中都把炭打给命中方,炭易主的同时火价涨四点。递增火价:每跳一次的烧血量等于当前火价——火价只涨不跌,传得越勤烧得越疼,后半场的炭比开场烫一倍不止。和中毒跳血那类固定额度扣分野在"跳的额度长在易主上":中毒是掉一口记一口,烫手是传一次涨一次——传炭的每一次交接都在给这颗炭加码,打架的节奏直接写进伤害的数值里。

火价为什么只涨不回落?回落的版本玩家可以靠对磨把炭磨回白菜价,烫手变成慢悠悠的乒乓球;只涨的火价让后半场每一跳都心惊——忍到火价高位再让它烧,才是这门机制里真正的算术。

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

lua
-- @file HotCoal.lua
-- 烫手 —— 这一拳烫手,谁接谁挨炸

local HotCoal = {}

local CONST = {
    BASE_PRICE    = 8,
    PRICE_STEP    = 4,
    BURN_GAP      = 1.5,
    LIGHT_CD      = 6.0,

    COLOR_COAL    = "#e87830",
    COLOR_DEEP    = "#5e2810",
    COLOR_GHOST   = "#f8c890",

    ZORDER_COAL   = 134,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1019000,
}

local _holder    = 0
local _price     = 0
local _burnT     = 0
local _cdLeft    = 0
local _coalFx    = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "HTC",
        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 MoveCoal(toID)
    _holder = toID
    _price = _price + CONST.PRICE_STEP
    _burnT = CONST.BURN_GAP
    local tp = GetActorPos(toID)
    if _coalFx and tp then
        GUI:setPosition(_coalFx, tp.x, tp.y - 124)
    end
    SL:TipAbove(toID, "接炭+" .. _price)
end

function HotCoal.Light()
    if _cdLeft > 0 then
        ShowTip("火在划——" .. string.format("%.1f", _cdLeft) .. "秒")
        return
    end
    if _holder ~= 0 then
        ShowTip("炭已经烧着——在" .. (_holder == 0 and "" or "") .. "它头上")
        return
    end
    _cdLeft = CONST.LIGHT_CD
    local tid = SL:GetValue("MARK_TARGET_ID")
    local tp = GetActorPos(tid)
    if not tid or not tp then return end
    _holder = tid
    _price = CONST.BASE_PRICE
    _burnT = CONST.BURN_GAP
    SafeRemove(_coalFx)
    _coalFx = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Coal"), tp.x, tp.y - 124, 0, 0, false)
    GUI:setLocalZOrder(_coalFx, CONST.ZORDER_COAL)
    SL:PlayLightCoalFx(tid)
    SL:TipAbove(tid, "点炭!")
    ShowTip("炭点它头上了——八点一跳,谁接谁挨")
end

四、核心代码:完整模块(下·定时器与易主结算)

lua
-- 易主判定:持有者被命中,炭打给命中方
SL:RegisterLUAEvent(LUA_EVENT_BEFORE_HURT, "HTC_Move", function(tid, dmg)
    if _holder == 0 then return dmg end
    if dmg > 0 and (tid == _holder or true) then
        if tid ~= _holder then
            MoveCoal(tid)
        end
    end
    return dmg
end)

-- 定时器:炭火跳血与跟脚
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _holder == 0 then return end
        _burnT = _burnT - dt
        if _burnT > 0 then
            local hp = GetActorPos(_holder)
            if _coalFx and hp then
                GUI:setPosition(_coalFx, hp.x, hp.y - 124)
            end
            return
        end
        _burnT = CONST.BURN_GAP
        SL:ActorHurt(_holder, _price)
        SL:TipAbove(_holder, "烫-" .. _price)
        SL:PlayCoalBurnFx(_holder)
        if SL:GetValue("ACTOR_DEAD", _holder) then
            SafeRemove(_coalFx)
            _holder = 0
            _price = 0
            ShowTip("炭火熄了——持炭的人倒下了")
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("点火", function()
        HotCoal.Light()
    end)
    ShowTip("技能已加载: 烫手 (调试按钮触发)")
end, 1.0)

function HotCoal.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SafeRemove(_coalFx)
    _holder = 0
    _price = 0
end

return HotCoal

五、机制问答

问:炭的跳血能暴击吗?
答:不能——火价是明码标价,一跳一价不掷骰,烫手的账要能让两边都算得清。

问:持有者死了炭去哪?
答:就地熄灭——炭不认继承人,尸体的头顶不留火种,想再烧重新点火。

问:互相不出手能耗灭火价吗?
答:耗不灭——火价只涨不跌,对峙的每一秒烧的还是原来的价,僵局里没有赢家只有慢输的。

问:盾能挡炭的跳血吗?
答:能——跳血走正常结算,护体先吃,烫手不越权,盾厚的人接炭接得起。

问:两个人都不打它,炭就一直烧它?
答:对——持有者不掉炭除非挨打,弓着不打让它自己烧干净是可行的懒账,前提是你顶得住它的爪子。

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

第四笔是火价的步进:每次易主涨四点对基础八点是"三易主后翻倍"的曲线——步进太陡后半场的炭成了处刑,太平炭烧完两轮就没牌面。第三笔是烧跳的间隔:一点五秒一跳对一场四十秒的架是二十多跳的总账——跳太勤数字刷屏,太疏炭火没有存在感。第二笔是易主的规则:任何命中都传炭——普攻传、技能传、反伤也传,传递的口子越宽,战术的花样越多。第一笔是炭的可见性:炭在谁头上,谁的头顶冒火星——火星是全场最显眼的告示,谁烧谁一目了然,烫手的博弈全建立在"看得见谁烫"上。常见坑三个:持有者切场景炭不清,把火种带进下一场;易主判定的"命中"漏了持续伤害,毒跳一下传一下传成连连看;火价超了持有者血量上限,一跳秒杀显得荒唐。

商业服里烫手是"火工流派"的独门炭:不比谁的拳硬,比谁敢把炭留在自己头上——商城里炭的样式做成品级,炭火、熔岩、业火,头顶那颗越烧越旺的炭球就是火工玩家的胆量证明。运营落地还有两笔:一段是传炭教学——教一句"打得越勤传得越快",流派的第一课是管住手;一段是耐烧榜——按累计持炭时长排名,头顶炭球烧得最久的人有碑。变体做成双炭:场上同时烧两颗,一颗在它头上一颗在你头上——两颗炭的传递织成一张火网,数炭的人才能活到终局。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

炭的规矩再念一遍:打得勤传得快,手慢的人才留得住火。

写完留一句给做共享系的同学:烫手卖的是"这颗炭谁接谁疼"——那颗在两边头顶飞来飞去的炭球,是把攻击行为本身改写成伤害来源的一次倒戈。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

走一格为什么是半秒?拆开996引擎走路状态机

接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…

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

特效总挂在脚后跟上?挂点表选对一行顶十行

【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

刀刀都判命中,玩家为什么喊挥空?命中表现差的那一拍

【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

怪的皮一会儿绿一会儿红?状态染色的色号表就三列

【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

996引擎Buff系统解剖:中毒变绿、冰冻发白是怎么挂上去的

前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…

2026-10-03 05:25 996 技术组
进阶实战游戏功能

编钟纹:五口钟排着敲,一口更比一口疼

【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…

2026-10-03 05:01 996 技术组