【游戏功能】
上一版留了条最亏的隐蔽报错:换契的一拍把玩家身上的回血祝福也换了出去——怪头顶浮起玩家的青色回血纹,玩家的血条当场断了奶。机制按"全部加持对调"写的,没漏一个字,错在没分"该换的"和"命根子"——回血这种保命的东西进了交换栏,换契变成了送契。修完立了交换白名单,命根子的加持不进契。这篇把整改后的整套模块拆开:配置表、契约扫描、白名单、对调结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:它的怒换我的甲,十秒一换
演示场怪天生挂着一层红纹——那是它的怒,刀重十九。点「换契!」:一道粉光在两边一闪,两枚纹当场对调——它头顶的红纹飞到你身上化作金色的"借怒":你的刀从十二重到十八;你脚下的甲纹飞到它身上:它的刀从十九软回十四。十秒契期一到,纹自动换回,各归各位,再按再换。演示里试两笔账:换契期的双方输出对比和没换时的对比——它的怒给你添了六点刀,它的刀又被你的甲削了五点,一来一去差出一半。换契纹教的是置换:最狠的加持不在自家,在对家的身上换过来。
fx-contractswap
二、底层原理:一次契约扫描加一次对调结算
模块的机关是一对搭档。契约扫描:换契那一拍把两边的加持栏各扫一遍——该换的进交换栏,白名单里的命根子按住不动,扫描是交换的前置关卡。对调结算:交换栏里的加持两两对调——它的怒到你身上叫借怒,你的甲到它身上叫顶甲,十秒契期一满自动换回,一契一还。和偷取类机制的分野在"换契是双项对流不是单项抽取":夺纹剥了它的你就赚了,换契是两边各掏各的——它的怒过来,你的甲过去,有得有失的对调才叫契。
白名单为什么必须存在?没有白名单的版本换契是裸的的全栏对调——回血、免死这类保命加持一旦换到怪身上,玩家的命门就攥在了机制手里,那场断奶报错换来的就是这条铁律:命根子不进契。
三、核心代码:完整模块(上·骨架)
-- @file ContractSwap.lua
-- 换契互纹 —— 它的怒换我的甲,十秒一换
local ContractSwap = {}
local CONST = {
SWAP_LIFE = 10.0,
SWAP_CD = 3.0,
RAGE_AMP = 6,
BASE_HIT = 12,
COLOR_SWAP = "#b07888",
COLOR_DEEP = "#483030",
COLOR_GHOST = "#f0c8d8",
ZORDER_SWAP = 133,
ZORDER_FX = 135,
AUTOINC_BASE = 1121000,
}
local _swapT = 0
local _cdLeft = 0
local _myRage = 0
local _swapFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "CTS",
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 PROTECTED = {
REGEN_MARK = true,
DEATHWARD = true,
}
function ContractSwap.CanSwap(buffID)
return not PROTECTED[buffID]
end
四、核心代码:完整模块(下·契约对调与到期回换)
function ContractSwap.Swap()
if _cdLeft > 0 or _swapT > 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
local myID = SL:GetValue("USER_ID")
if not tid or not myID then return end
_cdLeft = CONST.SWAP_CD
_swapT = CONST.SWAP_LIFE
local moved = 0
for _, buffID in ipairs(SL:EnumBuff(tid)) do
if ContractSwap.CanSwap(buffID) then
SL:RemoveBuff(tid, buffID)
SL:AddBuff(myID, buffID, CONST.SWAP_LIFE)
moved = moved + 1
end
end
for _, buffID in ipairs(SL:EnumBuff(myID)) do
if ContractSwap.CanSwap(buffID) then
SL:RemoveBuff(myID, buffID)
SL:AddBuff(tid, buffID, CONST.SWAP_LIFE)
moved = moved + 1
end
end
if moved > 0 then
_myRage = CONST.RAGE_AMP
SL:TipAboveMe("借怒!")
ShowTip("契换了——它的怒归你,你的甲归它")
else
ShowTip("两边都没可换的加持——白契一张")
end
end
-- 定时器:契期倒计时与到期回换
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _swapT > 0 then
_swapT = _swapT - dt
if _swapT <= 0 then
_myRage = 0
ShowTip("契换回来了——它的怒回了它身上")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("换契", function()
ContractSwap.Swap()
end)
ShowTip("技能已加载: 换契纹 (调试按钮触发)")
end, 1.0)
function ContractSwap.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SafeRemove(_swapFx)
_swapT = 0
_myRage = 0
end
return ContractSwap
五、机制问答
问:换契能把它的狂暴换过来吗?
答:能——狂暴不在白名单里,换过来的狂暴照常给你加攻,这是换契最有嚼头的一手。
问:两边都没加持换契会怎样?
答:白契一张——扫描两手空空就不动账,冷却照走不退,按之前先看清两边头上有什么。
问:契期内它又给自己挂了新的怒呢?
答:新怒归它——换契只对调按下那一拍在册的加持,契期内新挂的各归各主,不追不补。
问:我的借怒到期和它的怒回笼同拍吗?
答:同拍——契期一到两边一起归位,账面干干净净,不存在半契状态。
问:换契能换它的回血吗?
答:能——怪的回血加持不在白名单,换过来就是你的移动血泉,打法系玩家的心头好。
六、调参指南与商业服怎么用
第四笔是白名单的口径:命根子不进契是那场断奶报错换来的铁律——白名单太长换契无物可换,太短保命加持裸奔,回血和免死两项是底线。第三笔是契期的长度:十秒的契期是"借来的东西用得起劲"的期限——契期太短刚热身就还回去,太长变成单向剥夺,十秒刚好是"借怒打一轮"的份额。第二笔是双项的对价:它的怒过来、你的甲过去是有来有回的对调——只进不出的版本叫抢不叫换,有失有得对调才立得住"契"字。第一笔是飞纹的演出:两枚纹交叉飞换的轨迹要看得见——玩家得看见"它的东西到了我身上、我的到了它身上",看不见轨迹的换契和黑箱没差别。常见坑三个:白名单漏配回血导致的断奶报错;契期内新挂加持的归属判定含糊;到期回换时玩家死亡引发的半契残留。
商业服里换契纹是"换帖门"的规矩:别人的加持是抢的,他的加持是换的——商城里飞纹的样式做成品级,红帖、粉帖、金兰帖,那两道交叉飞换的纹光就是换帖门的拜帖。运营落地还有两笔:一段是验契教学——教一句"按之前看看两边头上有什么,白契不亏但白按",流派第一课是识货;一段是换契榜——按借来的加持总值排名,契换得最漂亮的人有碑。变体做成三契轮:两边的加持三换一循环——从两契到三契,换帖门的帖子越递越远。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做置换系的同学:换契纹卖的是"最好的加持在对家身上"——那两道交叉飞换的纹光和十秒一还的契约,是把加持栏当成可交换资产的第一纸契书。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…