From 909a0e97f9813f25226975fd7f497e912418a0b6 Mon Sep 17 00:00:00 2001 From: NoM0Re Date: Fri, 24 Oct 2025 09:20:00 +0200 Subject: [PATCH] (fix/Prototypes) Add inRange trigger properly to Prototypes too (cherry picked from commit ade6cb124a76fbb5ebd1a91936f1cb188d70789f) --- WeakAuras/GenericTrigger.lua | 37 +++++++++++++++++++++++++++++++++++- WeakAuras/Prototypes.lua | 15 ++++++++++++--- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/WeakAuras/GenericTrigger.lua b/WeakAuras/GenericTrigger.lua index 3d9658f..804b64e 100644 --- a/WeakAuras/GenericTrigger.lua +++ b/WeakAuras/GenericTrigger.lua @@ -73,7 +73,7 @@ local loaded_auras = {}; -- id to bool map local LoadEvent, HandleEvent, HandleUnitEvent, TestForTriState, TestForToggle, TestForLongString, TestForMultiSelect local ConstructTest, ConstructFunction - +local inRangeUnits = {} local nameplateExists = {} function WeakAuras.UnitExistsFixed(unit, smart) @@ -1241,6 +1241,7 @@ function GenericTrigger.UnloadAll() wipe(loaded_auras); wipe(loaded_events); wipe(loaded_unit_events); + wipe(inRangeUnits); Private.CancelAllDelayedTriggers(); Private.UnregisterAllEveryFrameUpdate(); end @@ -1260,6 +1261,9 @@ function GenericTrigger.UnloadDisplays(toUnload) for unit, events in pairs(loaded_unit_events) do for eventname, auras in pairs(events) do auras[id] = nil; + if eventname == "UNIT_IN_RANGE_UPDATE" and not next(auras) then + inRangeUnits[unit] = nil + end end end @@ -1424,6 +1428,9 @@ function LoadEvent(id, triggernum, data) loaded_unit_events[u][event] = loaded_unit_events[u][event] or {}; loaded_unit_events[u][event][id] = loaded_unit_events[u][event][id] or {} loaded_unit_events[u][event][id][triggernum] = data; + if event == "UNIT_IN_RANGE_UPDATE" then + inRangeUnits[u] = true + end end, unit, includePets ) end @@ -3831,6 +3838,34 @@ do end end +-- Player In Range +do + local inRangeFrame = nil + + local function PlayerInRangeUpdate(self, elapsed) + Private.StartProfileSystem("generictrigger player in range"); + self.elapsed = self.elapsed + elapsed + if self.elapsed >= 1.0 then + self.elapsed = 0 + for unit in next, inRangeUnits do + if UnitExists(unit) then + WeakAuras.ScanUnitEvents("UNIT_IN_RANGE_UPDATE", unit) + end + end + end + Private.StopProfileSystem("generictrigger player in range"); + end + + function WeakAuras.WatchForPlayerInRange() + if not inRangeFrame then + inRangeFrame = CreateFrame("Frame") + inRangeFrame.elapsed = 0 + Private.frames["Player In Range Frame"] = inRangeFrame + end + inRangeFrame:SetScript("OnUpdate", PlayerInRangeUpdate) + end +end + -- Nameplates do local watchNameplates diff --git a/WeakAuras/Prototypes.lua b/WeakAuras/Prototypes.lua index 02e454a..bdd7b0a 100644 --- a/WeakAuras/Prototypes.lua +++ b/WeakAuras/Prototypes.lua @@ -1640,6 +1640,9 @@ Private.event_prototypes = { end, loadFunc = function(trigger) AddWatchedUnits(trigger.unit, nil, trigger.use_unitisunit and trigger.unitisunit or nil) + if trigger.use_inRange then + WeakAuras.WatchForPlayerInRange() + end end, force_events = unitHelperFunctions.UnitChangedForceEvents, name = L["Unit Characteristics"], @@ -1861,7 +1864,7 @@ Private.event_prototypes = { enable = function(trigger) return trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party" end, - init = "UnitInRange(unit)" + init = "Private.ExecEnv.UnitInRangeFixed(unit)" }, { name = "hostility", @@ -2301,6 +2304,9 @@ Private.event_prototypes = { loadFunc = function(trigger) local includePets = trigger.use_includePets == true and trigger.includePets or nil AddWatchedUnits(trigger.unit, includePets) + if trigger.use_inRange then + WeakAuras.WatchForPlayerInRange() + end end, force_events = unitHelperFunctions.UnitChangedForceEventsWithPets, name = L["Health"], @@ -2607,7 +2613,7 @@ Private.event_prototypes = { enable = function(trigger) return trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party" end, - init = "UnitInRange(unit)" + init = "Private.ExecEnv.UnitInRangeFixed(unit)" }, { name = "nameplateType", @@ -2727,6 +2733,9 @@ Private.event_prototypes = { end local includePets = trigger.use_includePets == true and trigger.includePets or nil AddWatchedUnits(trigger.unit, includePets) + if trigger.use_inRange then + WeakAuras.WatchForPlayerInRange() + end end, force_events = unitHelperFunctions.UnitChangedForceEventsWithPets, name = L["Power"], @@ -3109,7 +3118,7 @@ Private.event_prototypes = { enable = function(trigger) return trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party" end, - init = "UnitInRange(unit)" + init = "Private.ExecEnv.UnitInRangeFixed(unit)" }, { name = "nameplateType",