【游戏功能】
docile = docile + 1 —— 就这一行,管住了一只千血大怪:喂它三口,它就温驯了。投喂把驯兽这事儿做成了数学:扔三口素的,每口一记"吃一口",第三口落肚的瞬间它温驯五秒——刀砍半价、走位发软、出手拖沓,喂饱的肚子不抗打也不抗揍。这篇把整套模块拆开:配置表、投喂构件、温驯结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:喂它三口素的,它就温驯了
演示场的怪呲牙咧嘴地贴过来。点「投喂!」:一口粮划着抛物线飞过去,它停下来张嘴接住——头顶第一枚绿点亮起。再喂两口,第三枚亮起的瞬间:它周身泛起草绿的光,头顶"温驯 五秒",走路一步三晃,出刀软绵绵只掉你七点。你的刀趁温驯砍它,五点五点地蹭——温驯里的它不还嘴也不恼,活像换了一只怪。五秒一过它翻脸,绿点清零,重新喂。演示里试两种喂法:贴脸连喂三口抢温驯,和远远吊着喂——贴脸的喂法吃两刀但抢到五秒半价,账各算各的。投喂教的是相处:它凶,是因为它饿。
fx-tamefeed
二、底层原理:一张喂食表加一份温驯状态
模块的机关是一对搭档。喂食表:每口粮落肚记一格,封顶三格——落肚才算数,扔偏了落在地上的那口是浪费,粮食的账按它嘴里的算。温驯状态:第三格亮起挂五秒温驯——输出减半、移速减半、出手周期拉长一倍,三刀变六刀,五秒里它从猛兽降级成摆设;温驯一过三格清零,从头再喂。和魅惑那类夺心控制的分野在"温驯不倒戈":魅惑让它掉头打自己人,温驯只是让它没了脾气——它照旧朝你来、照旧出刀,只是每一下都像打招呼。
为什么温驯不减防御只减输出?温驯的价值是"安全窗口"不是"输出窗口"——减输出的五秒里玩家随便走位随便喝药,减防御的版本温驯变成处刑倒计时,喂食从驯兽变成了下药。
三、核心代码:完整模块(上·骨架)
-- @file TameFeed.lua
-- 投喂 —— 喂它三口素的,它就温驯了
local TameFeed = {}
local CONST = {
FEED_CAP = 3,
FEED_CD = 2.5,
DOCILE_LIFE = 5.0,
CALM_MULT = 0.5,
COLOR_FEED = "#9ab86a",
COLOR_DEEP = "#3e4a18",
COLOR_GHOST = "#e0f0c0",
ZORDER_PIPS = 132,
ZORDER_FX = 135,
AUTOINC_BASE = 1016000,
}
local _fed = 0
local _docileT = 0
local _cdLeft = 0
local _pipsFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "TFD",
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 ThrowFood()
local myID = SL:GetValue("USER_ID")
SL:PlayTossArc(myID, SL:GetValue("MARK_TARGET_ID"),
function()
_fed = _fed + 1
SL:PlayEatFx(SL:GetValue("MARK_TARGET_ID"))
if _fed >= CONST.FEED_CAP then EnterDocile() end
end)
end
function TameFeed.Feed()
if _cdLeft > 0 then
ShowTip("手上没粮——" .. string.format("%.1f", _cdLeft) .. "秒")
return
end
if _docileT > 0 then
ShowTip("它温驯着——还剩" .. string.format("%.1f", _docileT) .. "秒")
return
end
if _fed >= CONST.FEED_CAP then return end
_cdLeft = CONST.FEED_CD
ThrowFood()
ShowTip("扔出去一口——看它接不接")
end
四、核心代码:完整模块(下·定时器与温驯出口)
-- 温驯入口
function EnterDocile()
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
_docileT = CONST.DOCILE_LIFE
SL:SetActorRate(tid, "move", CONST.CALM_MULT)
SL:SetActorRate(tid, "atk", CONST.CALM_MULT)
SL:PlayDocileFx(tid)
SL:TipAbove(tid, "温驯!")
ShowTip("三口喂饱——它温驯了,五秒里刀砍半价")
end
-- 温驯出口:它的刀砍半价
SL:RegisterLUAEvent(LUA_EVENT_MONSTER_STRIKE, "TFD_Calm", function(tid, dmg)
if _docileT > 0 and tid == SL:GetValue("MARK_TARGET_ID") then
return math.floor(dmg * CONST.CALM_MULT)
end
return dmg
end)
-- 定时器:温驯倒计时与绿点跟脚
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _docileT > 0 then
_docileT = _docileT - dt
local tid = SL:GetValue("MARK_TARGET_ID")
if _docileT <= 0 or not tid
or SL:GetValue("ACTOR_DEAD", tid) then
_docileT = 0
_fed = 0
SL:SetActorRate(SL:GetValue("MARK_TARGET_ID"),
"move", 1.0)
ShowTip("温驯过了——它翻脸了,重新喂")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("投喂", function()
TameFeed.Feed()
end)
ShowTip("技能已加载: 投喂 (调试按钮触发)")
end, 1.0)
function TameFeed.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MONSTER_STRIKE, "TFD_Calm")
SafeRemove(_pipsFx)
end
return TameFeed
五、机制问答
问:玩家的刀会打断进食吗?
答:会——出刀那一下它先躲粮再吃刀,喂食和攻击是两条互斥的手,想喂就别砍,贪刀的粮喂不进嘴。
问:温驯里的怪挨打会翻脸吗?
答:不会——温驯认时间不认刀数,五秒里随便砍,它连恼都懒得恼,这也是温驯比其他控制好用的地方。
问:粮能囤着吗?
答:不能——每次出手只带一口,吃完再掏,喂食的节奏天然是两秒半一口,急不来。
问:温驯和冻结叠吗?
答:叠——温驯改数值不改状态,冻住的温驯怪照样挨半价刀,控制系和驯服系互不挡道。
问:换目标后格清吗?
答:清——喂食表认目标,换一只怪从零喂起,一嘴粮喂不出两只温驯的怪。
六、调参指南与商业服怎么用
第四笔是温驯的深度:输出减半加移速减半是"它还在但没了脾气"的档——输出清零的版本温驯成了硬控,减输出的八成版本又喂了个寂寞,五成的档刚好是"它抬手你都敢打哈欠"。第三笔是格数的门槛:三口对两点五秒的冷却要七秒半喂满——喂太快驯兽成了连点器,太慢温驯还没喂出来架打完了。第二笔是温驯的时长:五秒对两点二秒的出手周期是"两拍半的安全窗"——窗里能走位能喝药能砍六七刀,价值够撑起喂食的全部动作。第一笔是绿点的位置:三枚绿点亮在怪头顶而不是玩家面板——喂食的账记在它身上,玩家抬头看它就知道还差几口,账记在谁的头上谁的心理压力最大。常见坑三个:粮被别的弹道挡下也算落肚,喂食成了穿透;温驯里怪换目标,减伤跟错人;温驯结束没还原速率,温顺怪永久发软。
商业服里投喂是"驯兽师流派"的开山粮:不比谁的刀快,比谁懂它的饿——商城里粮的样式做成品级,干粮、肉脯、灵果,扔出去那一道弧线就是驯兽师的招牌。运营落地还有两笔:一段是贪食怪图鉴——哪种怪吃得快写进页脚,驯兽师按图带粮;一段是温驯榜——按累计温驯时长排名,最会喂的人有碑。变体做成投喂双份:一次扔两口双倍冷却——从一口一口喂到成把成把地喂,驯兽师的效率主义。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
喂食的手要稳,砍刀的心要冷,两样占全了才算入了驯兽师这一行。
驯兽师的手册第一页也只有一行字:它饿了。
写完留一句给做驯服系的同学:投喂卖的是"它凶是因为它饿"——那三枚一格格亮起的绿点,是把猛兽的肚子和你的节奏拴在一根绳上的缰绳。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…