update SwingTimer
Offhand is still not working because we don't have the CLEU arg isOffHand, that came with Cata
This commit is contained in:
+112
-88
@@ -1774,7 +1774,7 @@ function GenericTrigger.Add(data, region)
|
|||||||
end
|
end
|
||||||
elseif Private.InternalEventByIDList[trueEvent] then
|
elseif Private.InternalEventByIDList[trueEvent] then
|
||||||
tinsert(trigger_events, trueEvent..":"..i)
|
tinsert(trigger_events, trueEvent..":"..i)
|
||||||
elseif trueEvent:match("^UNIT_") or Private.UnitEventList[trueEvent] then
|
elseif trueEvent:match("^UNIT_") then
|
||||||
isUnitEvent = true
|
isUnitEvent = true
|
||||||
|
|
||||||
if string.lower(strsub(i, #i - 3)) == "pets" then
|
if string.lower(strsub(i, #i - 3)) == "pets" then
|
||||||
@@ -1940,6 +1940,8 @@ do
|
|||||||
local selfGUID;
|
local selfGUID;
|
||||||
local mainSpeed, offSpeed = UnitAttackSpeed("player")
|
local mainSpeed, offSpeed = UnitAttackSpeed("player")
|
||||||
local casting = false
|
local casting = false
|
||||||
|
local skipNextAttack, skipNextAttackCount
|
||||||
|
local isAttacking
|
||||||
|
|
||||||
function WeakAuras.GetSwingTimerInfo(hand)
|
function WeakAuras.GetSwingTimerInfo(hand)
|
||||||
if(hand == "main") then
|
if(hand == "main") then
|
||||||
@@ -1971,6 +1973,10 @@ do
|
|||||||
return 0, math.huge;
|
return 0, math.huge;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function swingTriggerUpdate()
|
||||||
|
Private.ScanEvents("SWING_TIMER_UPDATE")
|
||||||
|
end
|
||||||
|
|
||||||
local function swingEnd(hand)
|
local function swingEnd(hand)
|
||||||
if(hand == "main") then
|
if(hand == "main") then
|
||||||
lastSwingMain, swingDurationMain, mainSwingOffset = nil, nil, nil;
|
lastSwingMain, swingDurationMain, mainSwingOffset = nil, nil, nil;
|
||||||
@@ -1979,65 +1985,84 @@ do
|
|||||||
elseif(hand == "ranged") then
|
elseif(hand == "ranged") then
|
||||||
lastSwingRange, swingDurationRange = nil, nil;
|
lastSwingRange, swingDurationRange = nil, nil;
|
||||||
end
|
end
|
||||||
Private.ScanEvents("SWING_TIMER_END");
|
swingTriggerUpdate()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function swingStart(hand)
|
||||||
|
mainSpeed, offSpeed = UnitAttackSpeed("player")
|
||||||
|
offSpeed = offSpeed or 0
|
||||||
|
local currentTime = GetTime()
|
||||||
|
if hand == "main" then
|
||||||
|
lastSwingMain = currentTime
|
||||||
|
swingDurationMain = mainSpeed
|
||||||
|
mainSwingOffset = 0
|
||||||
|
if mainTimer then
|
||||||
|
timer:CancelTimer(mainTimer)
|
||||||
|
end
|
||||||
|
if mainSpeed and mainSpeed > 0 then
|
||||||
|
mainTimer = timer:ScheduleTimer(swingEnd, mainSpeed, hand)
|
||||||
|
else
|
||||||
|
swingEnd(hand)
|
||||||
|
end
|
||||||
|
elseif hand == "off" then
|
||||||
|
lastSwingOff = currentTime
|
||||||
|
swingDurationOff = offSpeed
|
||||||
|
if offTimer then
|
||||||
|
timer:CancelTimer(offTimer)
|
||||||
|
end
|
||||||
|
if offSpeed and offSpeed > 0 then
|
||||||
|
offTimer = timer:ScheduleTimer(swingEnd, offSpeed, hand)
|
||||||
|
else
|
||||||
|
swingEnd(hand)
|
||||||
|
end
|
||||||
|
elseif hand == "ranged" then
|
||||||
|
local rangeSpeed = UnitRangedDamage("player")
|
||||||
|
lastSwingRange = currentTime
|
||||||
|
swingDurationRange = rangeSpeed
|
||||||
|
if rangeTimer then
|
||||||
|
timer:CancelTimer(rangeTimer)
|
||||||
|
end
|
||||||
|
if rangeSpeed and rangeSpeed > 0 then
|
||||||
|
rangeTimer = timer:ScheduleTimer(swingEnd, rangeSpeed, hand)
|
||||||
|
else
|
||||||
|
swingEnd(hand)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function swingTimerCLEUCheck(ts, event, sourceGUID, _, _, destGUID, _, _, ...)
|
local function swingTimerCLEUCheck(ts, event, sourceGUID, _, _, destGUID, _, _, ...)
|
||||||
Private.StartProfileSystem("generictrigger swing");
|
Private.StartProfileSystem("generictrigger swing");
|
||||||
if(sourceGUID == selfGUID) then
|
if(sourceGUID == selfGUID) then
|
||||||
if(event == "SWING_DAMAGE" or event == "SWING_MISSED") then
|
if event == "SPELL_EXTRA_ATTACKS" then
|
||||||
local isOffHand = select(event == "SWING_DAMAGE" and 10 or 2, ...);
|
skipNextAttack = ts
|
||||||
|
skipNextAttackCount = select(4, ...)
|
||||||
local event;
|
elseif(event == "SWING_DAMAGE" or event == "SWING_MISSED") then
|
||||||
local currentTime = GetTime();
|
if tonumber(skipNextAttack) and (ts - skipNextAttack) < 0.04 and tonumber(skipNextAttackCount) then
|
||||||
mainSpeed, offSpeed = UnitAttackSpeed("player");
|
if skipNextAttackCount > 0 then
|
||||||
offSpeed = offSpeed or 0;
|
skipNextAttackCount = skipNextAttackCount - 1
|
||||||
if not(lastSwingMain) then
|
return
|
||||||
lastSwingMain = currentTime;
|
|
||||||
swingDurationMain = mainSpeed;
|
|
||||||
mainSwingOffset = 0;
|
|
||||||
event = "SWING_TIMER_START";
|
|
||||||
timer:CancelTimer(mainTimer);
|
|
||||||
mainTimer = timer:ScheduleTimer(swingEnd, mainSpeed, "main");
|
|
||||||
elseif(OffhandHasWeapon() and not lastSwingOff) then
|
|
||||||
lastSwingOff = currentTime;
|
|
||||||
swingDurationOff = offSpeed;
|
|
||||||
event = "SWING_TIMER_START";
|
|
||||||
timer:CancelTimer(offTimer);
|
|
||||||
offTimer = timer:ScheduleTimer(swingEnd, offSpeed, "off");
|
|
||||||
else
|
|
||||||
-- A swing occurred while both weapons are supposed to be on cooldown
|
|
||||||
-- Simply refresh the timer of the weapon swing which would have ended sooner
|
|
||||||
local mainRem, offRem = (lastSwingMain or math.huge) + mainSpeed - currentTime, (lastSwingOff or math.huge) + offSpeed - currentTime;
|
|
||||||
if(mainRem < offRem or not OffhandHasWeapon()) then
|
|
||||||
timer:CancelTimer(mainTimer, true);
|
|
||||||
lastSwingMain = currentTime;
|
|
||||||
swingDurationMain = mainSpeed;
|
|
||||||
event = "SWING_TIMER_CHANGE";
|
|
||||||
mainTimer = timer:ScheduleTimer(swingEnd, mainSpeed, "main");
|
|
||||||
else
|
|
||||||
timer:CancelTimer(mainTimer, true);
|
|
||||||
lastSwingOff = currentTime;
|
|
||||||
swingDurationOff = offSpeed;
|
|
||||||
event = "SWING_TIMER_CHANGE";
|
|
||||||
offTimer = timer:ScheduleTimer(swingEnd, offSpeed, "off");
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
Private.ScanEvents(event);
|
local isOffHand = select(event == "SWING_DAMAGE" and 10 or 2, ...);
|
||||||
|
if not isOffHand then
|
||||||
|
swingStart("main")
|
||||||
|
elseif(isOffHand) then
|
||||||
|
swingStart("off")
|
||||||
|
end
|
||||||
|
swingTriggerUpdate()
|
||||||
end
|
end
|
||||||
elseif (destGUID == selfGUID and (select(1, ...) == "PARRY" or select(4, ...) == "PARRY")) then
|
elseif (destGUID == selfGUID and (... == "PARRY" or select(4, ...) == "PARRY")) then
|
||||||
if (lastSwingMain) then
|
if (lastSwingMain) then
|
||||||
local timeLeft = lastSwingMain + swingDurationMain - GetTime();
|
local timeLeft = lastSwingMain + swingDurationMain - GetTime() - (mainSwingOffset or 0);
|
||||||
if (timeLeft > 0.6 * swingDurationMain) then
|
if (timeLeft > 0.2 * swingDurationMain) then
|
||||||
|
local offset = 0.4 * swingDurationMain
|
||||||
|
if (timeLeft - offset < 0.2 * swingDurationMain) then
|
||||||
|
offset = timeLeft - 0.2 * swingDurationMain
|
||||||
|
end
|
||||||
timer:CancelTimer(mainTimer);
|
timer:CancelTimer(mainTimer);
|
||||||
mainTimer = timer:ScheduleTimer(swingEnd, timeLeft - 0.4 * swingDurationMain, "main");
|
mainTimer = timer:ScheduleTimer(swingEnd, timeLeft - offset, "main");
|
||||||
mainSwingOffset = 0.4 * swingDurationMain
|
mainSwingOffset = (mainSwingOffset or 0) + offset
|
||||||
Private.ScanEvents("SWING_TIMER_CHANGE");
|
swingTriggerUpdate()
|
||||||
elseif (timeLeft > 0.2 * swingDurationMain) then
|
|
||||||
timer:CancelTimer(mainTimer);
|
|
||||||
mainTimer = timer:ScheduleTimer(swingEnd, timeLeft - 0.2 * swingDurationMain, "main");
|
|
||||||
mainSwingOffset = 0.2 * swingDurationMain
|
|
||||||
Private.ScanEvents("SWING_TIMER_CHANGE");
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -2045,8 +2070,9 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function swingTimerCheck(event, unit, spell)
|
local function swingTimerCheck(event, unit, spell)
|
||||||
if unit ~= "player" then return end
|
if event ~= "PLAYER_EQUIPMENT_CHANGED" and unit and unit ~= "player" then return end
|
||||||
Private.StartProfileSystem("generictrigger swing");
|
Private.StartProfileSystem("generictrigger swing");
|
||||||
|
local now = GetTime()
|
||||||
if event == "UNIT_ATTACK_SPEED" then
|
if event == "UNIT_ATTACK_SPEED" then
|
||||||
local mainSpeedNew, offSpeedNew = UnitAttackSpeed("player")
|
local mainSpeedNew, offSpeedNew = UnitAttackSpeed("player")
|
||||||
offSpeedNew = offSpeedNew or 0
|
offSpeedNew = offSpeedNew or 0
|
||||||
@@ -2054,64 +2080,60 @@ do
|
|||||||
if mainSpeedNew ~= mainSpeed then
|
if mainSpeedNew ~= mainSpeed then
|
||||||
timer:CancelTimer(mainTimer)
|
timer:CancelTimer(mainTimer)
|
||||||
local multiplier = mainSpeedNew / mainSpeed
|
local multiplier = mainSpeedNew / mainSpeed
|
||||||
local timeLeft = (lastSwingMain + swingDurationMain - GetTime()) * multiplier
|
local timeLeft = (lastSwingMain + swingDurationMain - now) * multiplier
|
||||||
swingDurationMain = mainSpeedNew
|
swingDurationMain = mainSpeedNew
|
||||||
|
mainSwingOffset = (lastSwingMain + swingDurationMain) - (now + timeLeft)
|
||||||
mainTimer = timer:ScheduleTimer(swingEnd, timeLeft, "main")
|
mainTimer = timer:ScheduleTimer(swingEnd, timeLeft, "main")
|
||||||
Private.ScanEvents("SWING_TIMER_CHANGE")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if lastSwingOff then
|
if lastSwingOff then
|
||||||
if offSpeedNew ~= offSpeed then
|
if offSpeedNew ~= offSpeed then
|
||||||
timer:CancelTimer(offTimer)
|
timer:CancelTimer(offTimer)
|
||||||
local multiplier = offSpeedNew / mainSpeed
|
local multiplier = offSpeedNew / mainSpeed
|
||||||
local timeLeft = (lastSwingOff + swingDurationOff - GetTime()) * multiplier
|
local timeLeft = (lastSwingOff + swingDurationOff - now) * multiplier
|
||||||
swingDurationOff = offSpeedNew
|
swingDurationOff = offSpeedNew
|
||||||
offTimer = timer:ScheduleTimer(swingEnd, timeLeft, "off")
|
offTimer = timer:ScheduleTimer(swingEnd, timeLeft, "off")
|
||||||
Private.ScanEvents("SWING_TIMER_CHANGE")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
mainSpeed, offSpeed = mainSpeedNew, offSpeedNew
|
mainSpeed, offSpeed = mainSpeedNew, offSpeedNew
|
||||||
|
swingTriggerUpdate()
|
||||||
elseif casting and (event == "UNIT_SPELLCAST_INTERRUPTED" or event == "UNIT_SPELLCAST_FAILED") then
|
elseif casting and (event == "UNIT_SPELLCAST_INTERRUPTED" or event == "UNIT_SPELLCAST_FAILED") then
|
||||||
casting = false
|
casting = false
|
||||||
|
elseif event == "PLAYER_EQUIPMENT_CHANGED" and isAttacking then
|
||||||
|
swingStart("main")
|
||||||
|
swingStart("off")
|
||||||
|
swingStart("ranged")
|
||||||
|
swingTriggerUpdate()
|
||||||
elseif event == "UNIT_SPELLCAST_SUCCEEDED" then
|
elseif event == "UNIT_SPELLCAST_SUCCEEDED" then
|
||||||
if Private.reset_swing_spells[spell] or casting then
|
if Private.reset_swing_spells[spell] or casting then
|
||||||
if casting then
|
if casting then
|
||||||
casting = false
|
casting = false
|
||||||
end
|
end
|
||||||
local event;
|
-- check next frame
|
||||||
mainSpeed, offSpeed = UnitAttackSpeed("player");
|
swingTimerFrame:SetScript("OnUpdate", function(self)
|
||||||
lastSwingMain = GetTime();
|
if isAttacking then
|
||||||
swingDurationMain = mainSpeed;
|
swingStart("main")
|
||||||
mainSwingOffset = 0;
|
swingTriggerUpdate()
|
||||||
if (lastSwingMain) then
|
end
|
||||||
timer:CancelTimer(mainTimer);
|
self:SetScript("OnUpdate", nil)
|
||||||
event = "SWING_TIMER_CHANGE";
|
end)
|
||||||
else
|
end
|
||||||
event = "SWING_TIMER_START";
|
if Private.reset_ranged_swing_spells[spell] then
|
||||||
end
|
swingStart("ranged")
|
||||||
mainTimer = timer:ScheduleTimer(swingEnd, mainSpeed, "main");
|
swingTriggerUpdate()
|
||||||
Private.ScanEvents(event);
|
|
||||||
elseif Private.reset_ranged_swing_spells[spell] then
|
|
||||||
local event;
|
|
||||||
local currentTime = GetTime();
|
|
||||||
local speed = UnitRangedDamage("player");
|
|
||||||
if(lastSwingRange) then
|
|
||||||
timer:CancelTimer(rangeTimer, true)
|
|
||||||
event = "SWING_TIMER_CHANGE";
|
|
||||||
else
|
|
||||||
event = "SWING_TIMER_START";
|
|
||||||
end
|
|
||||||
lastSwingRange = currentTime;
|
|
||||||
swingDurationRange = speed;
|
|
||||||
rangeTimer = timer:ScheduleTimer(swingEnd, speed, "ranged");
|
|
||||||
Private.ScanEvents(event);
|
|
||||||
end
|
end
|
||||||
elseif event == "UNIT_SPELLCAST_START" then
|
elseif event == "UNIT_SPELLCAST_START" then
|
||||||
-- pause swing timer
|
if not Private.noreset_swing_spells[spell] then
|
||||||
casting = true
|
-- pause swing timer
|
||||||
lastSwingMain, swingDurationMain, mainSwingOffset = nil, nil, nil
|
casting = true
|
||||||
lastSwingOff, swingDurationOff = nil, nil
|
lastSwingMain, swingDurationMain, mainSwingOffset = nil, nil, nil
|
||||||
Private.ScanEvents("SWING_TIMER_END")
|
lastSwingOff, swingDurationOff = nil, nil
|
||||||
|
swingTriggerUpdate()
|
||||||
|
end
|
||||||
|
elseif event == "PLAYER_REGEN_DISABLED" then
|
||||||
|
isAttacking = true
|
||||||
|
elseif event == "PLAYER_REGEN_ENABLED" then
|
||||||
|
isAttacking = nil
|
||||||
end
|
end
|
||||||
Private.StopProfileSystem("generictrigger swing");
|
Private.StopProfileSystem("generictrigger swing");
|
||||||
end
|
end
|
||||||
@@ -2120,7 +2142,9 @@ do
|
|||||||
if not(swingTimerFrame) then
|
if not(swingTimerFrame) then
|
||||||
swingTimerFrame = CreateFrame("Frame");
|
swingTimerFrame = CreateFrame("Frame");
|
||||||
swingTimerFrame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");
|
swingTimerFrame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");
|
||||||
swingTimerFrame:RegisterEvent("PLAYER_ENTER_COMBAT");
|
swingTimerFrame:RegisterEvent("PLAYER_REGEN_DISABLED");
|
||||||
|
swingTimerFrame:RegisterEvent("PLAYER_REGEN_ENABLED");
|
||||||
|
swingTimerFrame:RegisterEvent("PLAYER_EQUIPMENT_CHANGED");
|
||||||
swingTimerFrame:RegisterEvent("UNIT_ATTACK_SPEED");
|
swingTimerFrame:RegisterEvent("UNIT_ATTACK_SPEED");
|
||||||
swingTimerFrame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED");
|
swingTimerFrame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED");
|
||||||
swingTimerFrame:RegisterEvent("UNIT_SPELLCAST_START")
|
swingTimerFrame:RegisterEvent("UNIT_SPELLCAST_START")
|
||||||
|
|||||||
@@ -4434,9 +4434,6 @@ Private.event_prototypes = {
|
|||||||
type = "unit",
|
type = "unit",
|
||||||
events = {},
|
events = {},
|
||||||
internal_events = {
|
internal_events = {
|
||||||
"SWING_TIMER_START",
|
|
||||||
"SWING_TIMER_CHANGE",
|
|
||||||
"SWING_TIMER_END",
|
|
||||||
"SWING_TIMER_UPDATE"
|
"SWING_TIMER_UPDATE"
|
||||||
},
|
},
|
||||||
force_events = "SWING_TIMER_UPDATE",
|
force_events = "SWING_TIMER_UPDATE",
|
||||||
@@ -4532,6 +4529,10 @@ Private.event_prototypes = {
|
|||||||
{
|
{
|
||||||
hidden = true,
|
hidden = true,
|
||||||
test = "(inverse and duration == 0) or (not inverse and duration > 0)"
|
test = "(inverse and duration == 0) or (not inverse and duration > 0)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
hidden = true,
|
||||||
|
test = "remainingCheck"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
automaticrequired = true,
|
automaticrequired = true,
|
||||||
|
|||||||
@@ -3208,7 +3208,10 @@ Private.reset_swing_spells = {
|
|||||||
[GetSpellInfo(20549)] = true, -- War Stomp
|
[GetSpellInfo(20549)] = true, -- War Stomp
|
||||||
[GetSpellInfo(56815)] = true, -- Rune Strike
|
[GetSpellInfo(56815)] = true, -- Rune Strike
|
||||||
[GetSpellInfo(5384)] = true, -- Feign Death
|
[GetSpellInfo(5384)] = true, -- Feign Death
|
||||||
|
[GetSpellInfo(2764)] = true, -- Throw
|
||||||
|
[GetSpellInfo(5019)] = true, -- Shoot
|
||||||
}
|
}
|
||||||
|
|
||||||
Private.reset_ranged_swing_spells = {
|
Private.reset_ranged_swing_spells = {
|
||||||
[GetSpellInfo(2764)] = true, -- Throw
|
[GetSpellInfo(2764)] = true, -- Throw
|
||||||
[GetSpellInfo(5019)] = true, -- Shoot Wands
|
[GetSpellInfo(5019)] = true, -- Shoot Wands
|
||||||
@@ -3216,6 +3219,39 @@ Private.reset_ranged_swing_spells = {
|
|||||||
[GetSpellInfo(5384)] = true, -- Feign Death
|
[GetSpellInfo(5384)] = true, -- Feign Death
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Private.noreset_swing_spells = {
|
||||||
|
[GetSpellInfo(23063)] = true, -- Dense Dynamite
|
||||||
|
[GetSpellInfo(4054)] = true, -- Rough Dynamite
|
||||||
|
[GetSpellInfo(4064)] = true, -- Rough Copper Bomb
|
||||||
|
[GetSpellInfo(4061)] = true, -- Coarse Dynamite
|
||||||
|
[GetSpellInfo(8331)] = true, -- Ez-Thro Dynamite
|
||||||
|
[GetSpellInfo(4065)] = true, -- Large Copper Bomb
|
||||||
|
[GetSpellInfo(4066)] = true, -- Small Bronze Bomb
|
||||||
|
[GetSpellInfo(4062)] = true, -- Heavy Dynamite
|
||||||
|
[GetSpellInfo(4067)] = true, -- Big Bronze Bomb
|
||||||
|
[GetSpellInfo(4068)] = true, -- Iron Grenade
|
||||||
|
[GetSpellInfo(23000)] = true, -- Ez-Thro Dynamite II
|
||||||
|
[GetSpellInfo(12421)] = true, -- Mithril Frag Bomb
|
||||||
|
[GetSpellInfo(4069)] = true, -- Big Iron Bomb
|
||||||
|
[GetSpellInfo(12562)] = true, -- The Big One
|
||||||
|
[GetSpellInfo(12543)] = true, -- Hi-Explosive Bomb
|
||||||
|
[GetSpellInfo(19769)] = true, -- Thorium Grenade
|
||||||
|
[GetSpellInfo(19784)] = true, -- Dark Iron Bomb
|
||||||
|
[GetSpellInfo(30216)] = true, -- Fel Iron Bomb
|
||||||
|
[GetSpellInfo(19821)] = true, -- Arcane Bomb
|
||||||
|
[GetSpellInfo(39965)] = true, -- Frost Grenade
|
||||||
|
[GetSpellInfo(30461)] = true, -- The Bigger One
|
||||||
|
[GetSpellInfo(30217)] = true, -- Adamantite Grenade
|
||||||
|
[GetSpellInfo(35476)] = true, -- Drums of Battle
|
||||||
|
[GetSpellInfo(35475)] = true, -- Drums of War
|
||||||
|
[GetSpellInfo(35477)] = true, -- Drums of Speed
|
||||||
|
[GetSpellInfo(35478)] = true, -- Drums of Restoration
|
||||||
|
[GetSpellInfo(34120)] = true, -- Steady Shot (rank 1)
|
||||||
|
[GetSpellInfo(19434)] = true, -- Aimed Shot (rank 1)
|
||||||
|
[GetSpellInfo(1464)] = true, -- Slam (rank 1)
|
||||||
|
--35474 Drums of Panic DO reset the swing timer, do not add
|
||||||
|
}
|
||||||
|
|
||||||
WeakAuras.StopMotion = WeakAuras.StopMotion or {}
|
WeakAuras.StopMotion = WeakAuras.StopMotion or {}
|
||||||
WeakAuras.StopMotion.texture_types = WeakAuras.StopMotion.texture_types or {}
|
WeakAuras.StopMotion.texture_types = WeakAuras.StopMotion.texture_types or {}
|
||||||
WeakAuras.StopMotion.texture_data = WeakAuras.StopMotion.texture_data or {}
|
WeakAuras.StopMotion.texture_data = WeakAuras.StopMotion.texture_data or {}
|
||||||
|
|||||||
Reference in New Issue
Block a user