解决WoW插件中AUTOFOLLOW_END与AUTOFOLLOW_BEGIN重复触发问题
解决重复跟随同一目标导致的频繁“跟随断开”提示问题
核心思路
- 避免重复触发跟随指令:执行
FollowUnit前检查当前是否已跟随目标角色,跳过重复调用 - 延迟验证跟随断开状态:给
AUTOFOLLOW_END事件添加短延迟,确认真的停止跟随再发送断开消息,过滤掉重复跟随导致的短暂断开事件
修改后的关键代码(Team.lua)
1. 添加延迟相关变量
在原有变量定义中加入:
local currentlyFollowing = nil local followEndTimer = nil -- 用于延迟验证跟随断开的计时器 local FOLLOW_END_DELAY = 0.2 -- 验证延迟,单位秒,可根据实际情况调整
2. 修改FollowMe指令处理逻辑
在HandleMessage方法的FollowMe分支中,增加重复跟随判断:
elseif command == "FollowMe" then if Team:IsInTeam(sender) then -- 仅当未跟随目标角色时,才执行跟随指令 if currentlyFollowing ~= sender then FollowUnit(sender) end end end
3. 优化AUTOFOLLOW_END事件处理
将原有的断开事件处理改为延迟验证:
function Team:AUTOFOLLOW_END() if currentlyFollowing then -- 清除之前未完成的计时器 if followEndTimer then self:CancelTimer(followEndTimer) followEndTimer = nil end -- 启动延迟计时器,确认是否真的停止跟随 followEndTimer = self:ScheduleTimer(function() -- 通过UnitIsUnit验证是否仍在跟随目标 if not UnitIsUnit("player", "followtarget") then Communication:SendMessage("FollowStop:" .. UnitName("player"), "WHISPER", currentlyFollowing) currentlyFollowing = nil end followEndTimer = nil end, FOLLOW_END_DELAY) end end
4. 优化AUTOFOLLOW_BEGIN事件处理
在开始跟随事件中,取消未完成的断开计时器:
function Team:AUTOFOLLOW_BEGIN(event, name) if self:IsInTeam(name) then -- 取消未完成的断开验证计时器 if followEndTimer then self:CancelTimer(followEndTimer) followEndTimer = nil end currentlyFollowing = name Communication:SendMessage("FollowStart", "WHISPER", name) end end
原理说明
- 重复调用
FollowUnit同一目标时,直接跳过指令,避免触发游戏内置的“断开-重新跟随”循环 - 利用短延迟等待
AUTOFOLLOW_BEGIN事件触发,如果是重复跟随的情况,BEGIN会在延迟前触发并取消断开计时器,从而避免发送错误的断开通知 - 通过
UnitIsUnit("player", "followtarget")验证实际跟随状态,确保仅在真的停止跟随才发送断开消息
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

