from retail
This commit is contained in:
+20
-5
@@ -156,11 +156,11 @@ Private.ExecEnv.BossMods.DBM = {
|
|||||||
|
|
||||||
EventCallback = function(self, event, ...)
|
EventCallback = function(self, event, ...)
|
||||||
if event == "DBM_Announce" then
|
if event == "DBM_Announce" then
|
||||||
local spellId = select(4, ...)
|
local message, icon, _, spellId, _, count = ...
|
||||||
WeakAuras.ScanEvents("DBM_Announce", spellId, ...)
|
WeakAuras.ScanEvents("DBM_Announce", spellId, message, icon)
|
||||||
if self.isGeneric then
|
if self.isGeneric then
|
||||||
local message, icon = ...
|
count = count and tostring(count) or "0"
|
||||||
WeakAuras.ScanEvents("BossMod_Announce", spellId, message, icon)
|
WeakAuras.ScanEvents("BossMod_Announce", spellId, message, icon, count)
|
||||||
end
|
end
|
||||||
elseif event == "DBM_TimerStart" then
|
elseif event == "DBM_TimerStart" then
|
||||||
local timerId, msg, duration, icon, timerType, spellId, dbmType, _, _, _, _, _, timerCount = ...
|
local timerId, msg, duration, icon, timerType, spellId, dbmType, _, _, _, _, _, timerCount = ...
|
||||||
@@ -812,7 +812,8 @@ Private.ExecEnv.BossMods.BigWigs = {
|
|||||||
WeakAuras.ScanEvents("BigWigs_Message", ...)
|
WeakAuras.ScanEvents("BigWigs_Message", ...)
|
||||||
if self.isGeneric then
|
if self.isGeneric then
|
||||||
local _, spellId, text, _, icon = ...
|
local _, spellId, text, _, icon = ...
|
||||||
WeakAuras.ScanEvents("BossMod_Announce", spellId, text, icon)
|
local count = text and text:match("%((%d+)%)") or text:match("((%d+))") or "0"
|
||||||
|
WeakAuras.ScanEvents("BossMod_Announce", spellId, text, icon, count)
|
||||||
end
|
end
|
||||||
elseif event == "BigWigs_StartBar" then
|
elseif event == "BigWigs_StartBar" then
|
||||||
local addon, spellId, text, duration, icon, isCD = ...
|
local addon, spellId, text, duration, icon, isCD = ...
|
||||||
@@ -1434,6 +1435,20 @@ Private.event_prototypes["Boss Mod Announce"] = {
|
|||||||
hidden = true,
|
hidden = true,
|
||||||
test = "true"
|
test = "true"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name = "count",
|
||||||
|
init = "arg",
|
||||||
|
display = L["Count"],
|
||||||
|
desc = L["Occurrence of the event\nCan be a range of values\nCan have multiple values separated by a comma or a space\n\nExamples:\n2nd 5th and 6th events: 2, 5, 6\n2nd to 6th: 2-6\nevery 2 events: /2\nevery 3 events starting from 2nd: 2/3\nevery 3 events starting from 2nd and ending at 11th: 2-11/3\n\nWorks only if Boss Mod addon show counter"],
|
||||||
|
type = "string",
|
||||||
|
preamble = "local counter = Private.ExecEnv.CreateTriggerCounter(%q)",
|
||||||
|
test = "counter:SetCount(tonumber(count) or 0) == nil and counter:Match()",
|
||||||
|
conditionTest = function(state, needle, op, preamble)
|
||||||
|
return preamble:Check(state.count)
|
||||||
|
end,
|
||||||
|
store = true,
|
||||||
|
conditionType = "string",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name = "cloneId",
|
name = "cloneId",
|
||||||
display = L["Clone per Event"],
|
display = L["Clone per Event"],
|
||||||
|
|||||||
@@ -712,17 +712,6 @@ local function RunTriggerFunc(allStates, data, id, triggernum, event, arg1, arg2
|
|||||||
untriggerCheck = true;
|
untriggerCheck = true;
|
||||||
end
|
end
|
||||||
elseif (data.statesParameter == "unit") then
|
elseif (data.statesParameter == "unit") then
|
||||||
if optionsEvent then
|
|
||||||
if Private.multiUnitUnits[data.trigger.unit] then
|
|
||||||
arg1 = next(Private.multiUnitUnits[data.trigger.unit])
|
|
||||||
elseif data.trigger.unit == "nameplate" then
|
|
||||||
arg1 = next(C_NamePlate.GetNamePlates())
|
|
||||||
else
|
|
||||||
arg1 = data.trigger.unit
|
|
||||||
end
|
|
||||||
elseif event == "FRAME_UPDATE" and (not Private.multiUnitUnits[data.trigger.unit] or data.trigger.unit ~= "nameplate") then
|
|
||||||
arg1 = data.trigger.unit
|
|
||||||
end
|
|
||||||
if arg1 then
|
if arg1 then
|
||||||
if Private.multiUnitUnits[data.trigger.unit] or data.trigger.unit == "nameplate" then
|
if Private.multiUnitUnits[data.trigger.unit] or data.trigger.unit == "nameplate" then
|
||||||
unitForUnitTrigger = arg1
|
unitForUnitTrigger = arg1
|
||||||
@@ -1014,7 +1003,12 @@ function Private.ScanEventsWatchedTrigger(id, watchedTriggernums)
|
|||||||
Private.ActivateAuraEnvironment(nil)
|
Private.ActivateAuraEnvironment(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function AddFakeTime(state)
|
local function AddFakeInformation(state, eventData)
|
||||||
|
state.autoHide = false
|
||||||
|
local canHaveDuration = eventData.prototype and eventData.prototype.canHaveDuration == "timed"
|
||||||
|
if canHaveDuration and state.expirationTime == nil then
|
||||||
|
state.progressType = "timed"
|
||||||
|
end
|
||||||
if state.progressType == "timed" then
|
if state.progressType == "timed" then
|
||||||
if state.expirationTime and state.expirationTime ~= math.huge and state.expirationTime > GetTime() then
|
if state.expirationTime and state.expirationTime ~= math.huge and state.expirationTime > GetTime() then
|
||||||
return
|
return
|
||||||
@@ -1023,38 +1017,50 @@ local function AddFakeTime(state)
|
|||||||
state.expirationTime = GetTime() + 7
|
state.expirationTime = GetTime() + 7
|
||||||
state.duration = 7
|
state.duration = 7
|
||||||
end
|
end
|
||||||
|
if eventData.prototype and eventData.prototype.GetNameAndIcon then
|
||||||
|
local name, icon = Private.event_prototypes[eventData.event].GetNameAndIcon(eventData.trigger)
|
||||||
|
if state.name == nil then
|
||||||
|
state.name = name
|
||||||
|
end
|
||||||
|
if state.icon == nil then
|
||||||
|
state.icon = icon
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function GenericTrigger.CreateFakeStates(id, triggernum)
|
function GenericTrigger.CreateFakeStates(id, triggernum)
|
||||||
local data = WeakAuras.GetData(id)
|
local data = WeakAuras.GetData(id)
|
||||||
|
local eventData = events[id][triggernum]
|
||||||
|
|
||||||
Private.ActivateAuraEnvironment(id);
|
Private.ActivateAuraEnvironment(id);
|
||||||
local allStates = WeakAuras.GetTriggerStateForTrigger(id, triggernum);
|
local allStates = WeakAuras.GetTriggerStateForTrigger(id, triggernum);
|
||||||
RunTriggerFunc(allStates, events[id][triggernum], id, triggernum, "OPTIONS")
|
|
||||||
|
|
||||||
local canHaveDuration = events[id][triggernum].prototype and events[id][triggernum].prototype.canHaveDuration == "timed"
|
local arg1
|
||||||
|
if eventData.statesParameter == "unit" then
|
||||||
|
local unit = eventData.trigger.unit
|
||||||
|
if Private.multiUnitUnits[unit] then
|
||||||
|
arg1 = next(Private.multiUnitUnits[unit])
|
||||||
|
else
|
||||||
|
arg1 = unit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RunTriggerFunc(allStates, eventData, id, triggernum, "OPTIONS", arg1)
|
||||||
|
|
||||||
local shown = 0
|
local shown = 0
|
||||||
for id, state in pairs(allStates) do
|
for id, state in pairs(allStates) do
|
||||||
if state.show then
|
if state.show then
|
||||||
shown = shown + 1
|
shown = shown + 1
|
||||||
end
|
end
|
||||||
state.autoHide = false
|
|
||||||
if canHaveDuration and state.expirationTime == nil then
|
AddFakeInformation(state, eventData)
|
||||||
state.progressType = "timed"
|
|
||||||
end
|
|
||||||
AddFakeTime(state)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if shown == 0 then
|
if shown == 0 then
|
||||||
local state = {}
|
local state = {}
|
||||||
GenericTrigger.CreateFallbackState(data, triggernum, state)
|
GenericTrigger.CreateFallbackState(data, triggernum, state)
|
||||||
allStates[""] = state
|
allStates[""] = state
|
||||||
state.autoHide = false
|
|
||||||
if canHaveDuration and state.expirationTime == nil then
|
AddFakeInformation(state, eventData)
|
||||||
state.progressType = "timed"
|
|
||||||
end
|
|
||||||
AddFakeTime(state)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
Private.ActivateAuraEnvironment(nil);
|
Private.ActivateAuraEnvironment(nil);
|
||||||
@@ -3558,7 +3564,7 @@ end
|
|||||||
function GenericTrigger.GetDelay(data)
|
function GenericTrigger.GetDelay(data)
|
||||||
if data.event then
|
if data.event then
|
||||||
local prototype = Private.event_prototypes[data.event]
|
local prototype = Private.event_prototypes[data.event]
|
||||||
if prototype and prototype.delayEvents then
|
if prototype and prototype.type == data.type and prototype.delayEvents then
|
||||||
local trigger = data.trigger
|
local trigger = data.trigger
|
||||||
if trigger.use_delay and type(trigger.delay) == "number" and trigger.delay > 0 then
|
if trigger.use_delay and type(trigger.delay) == "number" and trigger.delay > 0 then
|
||||||
return trigger.delay
|
return trigger.delay
|
||||||
@@ -3649,11 +3655,15 @@ function GenericTrigger.GetNameAndIcon(data, triggernum)
|
|||||||
local icon, name
|
local icon, name
|
||||||
if (Private.category_event_prototype[trigger.type]) then
|
if (Private.category_event_prototype[trigger.type]) then
|
||||||
if(trigger.event and Private.event_prototypes[trigger.event]) then
|
if(trigger.event and Private.event_prototypes[trigger.event]) then
|
||||||
if(Private.event_prototypes[trigger.event].iconFunc) then
|
if (Private.event_prototypes[trigger.event].GetNameAndIcon) then
|
||||||
icon = Private.event_prototypes[trigger.event].iconFunc(trigger);
|
return Private.event_prototypes[trigger.event].GetNameAndIcon(trigger)
|
||||||
end
|
else
|
||||||
if(Private.event_prototypes[trigger.event].nameFunc) then
|
if(Private.event_prototypes[trigger.event].iconFunc) then
|
||||||
name = Private.event_prototypes[trigger.event].nameFunc(trigger);
|
icon = Private.event_prototypes[trigger.event].iconFunc(trigger);
|
||||||
|
end
|
||||||
|
if(Private.event_prototypes[trigger.event].nameFunc) then
|
||||||
|
name = Private.event_prototypes[trigger.event].nameFunc(trigger);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -3983,22 +3993,28 @@ function GenericTrigger.CreateFallbackState(data, triggernum, state)
|
|||||||
|
|
||||||
Private.ActivateAuraEnvironment(data.id, "", state);
|
Private.ActivateAuraEnvironment(data.id, "", state);
|
||||||
local trigger = data.triggers[triggernum].trigger
|
local trigger = data.triggers[triggernum].trigger
|
||||||
if (event.nameFunc) then
|
|
||||||
local ok, name = pcall(event.nameFunc, trigger);
|
if event.GetNameAndIcon then
|
||||||
|
local ok, name, icon = pcall(event.GetNameAndIcon, trigger);
|
||||||
|
state.name = ok and name or nil;
|
||||||
|
state.icon = ok and icon or nil;
|
||||||
if not ok then
|
if not ok then
|
||||||
Private.GetErrorHandlerUid(data.uid, L["Name Function (fallback state)"])
|
Private.GetErrorHandlerUid(data.uid, L["GetNameAndIcon Function (fallback state)"])
|
||||||
state.name = nil
|
|
||||||
else
|
|
||||||
state.name = name or nil
|
|
||||||
end
|
end
|
||||||
end
|
else
|
||||||
if (event.iconFunc) then
|
if (event.nameFunc) then
|
||||||
local ok, icon = pcall(event.iconFunc, trigger);
|
local ok, name = pcall(event.nameFunc, trigger);
|
||||||
if not ok then
|
state.name = ok and name or nil;
|
||||||
Private.GetErrorHandlerUid(data.uid, L["Icon Function (fallback state)"])
|
if not ok then
|
||||||
state.icon = nil
|
Private.GetErrorHandlerUid(data.uid, L["Name Function (fallback state)"])
|
||||||
else
|
end
|
||||||
state.icon = icon or nil
|
end
|
||||||
|
if (event.iconFunc) then
|
||||||
|
local ok, icon = pcall(event.iconFunc, trigger);
|
||||||
|
state.icon = ok and icon or nil;
|
||||||
|
if not ok then
|
||||||
|
Private.GetErrorHandlerUid(data.uid, L["Icon Function (fallback state)"])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1453,5 +1453,16 @@ function Private.Modernize(data)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if data.internalVersion < 68 then
|
||||||
|
if data.parent then
|
||||||
|
local parentData = WeakAuras.GetData(data.parent)
|
||||||
|
if parentData and parentData.regionType == "dynamicgroup" then
|
||||||
|
if data.anchorFrameParent == nil then
|
||||||
|
data.anchorFrameParent = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
data.internalVersion = max(data.internalVersion or 0, WeakAuras.InternalVersion())
|
data.internalVersion = max(data.internalVersion or 0, WeakAuras.InternalVersion())
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5980,6 +5980,36 @@ Private.event_prototypes = {
|
|||||||
end
|
end
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
GetNameAndIcon = function(trigger)
|
||||||
|
local name, icon, spellId, _
|
||||||
|
if trigger.use_spellNames and type(trigger.spellNames) == "table" then
|
||||||
|
for _, spellName in ipairs(trigger.spellNames) do
|
||||||
|
spellId = WeakAuras.SafeToNumber(spellName)
|
||||||
|
if spellId then
|
||||||
|
name, _, icon = GetSpellInfo(spellName)
|
||||||
|
if name and icon then
|
||||||
|
return name, icon
|
||||||
|
end
|
||||||
|
elseif not tonumber(spellName) then
|
||||||
|
name, _, icon = GetSpellInfo(spellName)
|
||||||
|
if name and icon then
|
||||||
|
return name, icon
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if trigger.use_spellIds and type(trigger.spellIds) == "table" then
|
||||||
|
for _, spellIdString in ipairs(trigger.spellIds) do
|
||||||
|
spellId = WeakAuras.SafeToNumber(spellIdString)
|
||||||
|
if spellId then
|
||||||
|
name, _, icon = GetSpellInfo(spellIdString)
|
||||||
|
if name and icon then
|
||||||
|
return name, icon
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
automaticrequired = true,
|
automaticrequired = true,
|
||||||
},
|
},
|
||||||
["Character Stats"] = {
|
["Character Stats"] = {
|
||||||
|
|||||||
@@ -1365,7 +1365,12 @@ local function modify(parent, region, data)
|
|||||||
end
|
end
|
||||||
controlPoint:SetWidth(regionData.dimensions.width)
|
controlPoint:SetWidth(regionData.dimensions.width)
|
||||||
controlPoint:SetHeight(regionData.dimensions.height)
|
controlPoint:SetHeight(regionData.dimensions.height)
|
||||||
if data.anchorFrameParent then
|
if (data.anchorFrameParent
|
||||||
|
or data.anchorFrameParent == nil)
|
||||||
|
and not (data.anchorFrameType == "SCREEN"
|
||||||
|
or data.anchorFrameType == "UIPARENT"
|
||||||
|
or data.anchorFrameType == "MOUSE")
|
||||||
|
and not data.useAnchorPerUnit then
|
||||||
controlPoint:SetParent(frame == "" and self.relativeTo or frame)
|
controlPoint:SetParent(frame == "" and self.relativeTo or frame)
|
||||||
else
|
else
|
||||||
controlPoint:SetParent(self)
|
controlPoint:SetParent(self)
|
||||||
|
|||||||
@@ -485,6 +485,20 @@ function WeakAuras.Import(inData, target, callbackFunc)
|
|||||||
return nil, "Invalid import data."
|
return nil, "Invalid import data."
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
local highestVersion = data.internalVersion or 0
|
||||||
|
if children then
|
||||||
|
for _, child in ipairs(children) do
|
||||||
|
highestVersion = max(highestVersion, child.internalVersion or 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if highestVersion > WeakAuras.InternalVersion() then
|
||||||
|
-- Do not run PreAdd but still show Import Window
|
||||||
|
tooltipLoading = nil;
|
||||||
|
return ImportNow(data, children, target, nil, callbackFunc)
|
||||||
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
if version < 2000 then
|
if version < 2000 then
|
||||||
if children then
|
if children then
|
||||||
data.controlledChildren = {}
|
data.controlledChildren = {}
|
||||||
@@ -495,7 +509,6 @@ function WeakAuras.Import(inData, target, callbackFunc)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local status, msg = true, ""
|
|
||||||
if type(target) ~= 'nil' then
|
if type(target) ~= 'nil' then
|
||||||
local uid = type(target) == 'table' and target.uid or target
|
local uid = type(target) == 'table' and target.uid or target
|
||||||
local targetData = Private.GetDataByUID(uid)
|
local targetData = Private.GetDataByUID(uid)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
local AddonName, Private = ...
|
local AddonName, Private = ...
|
||||||
|
|
||||||
local internalVersion = 67
|
local internalVersion = 68
|
||||||
|
|
||||||
-- Lua APIs
|
-- Lua APIs
|
||||||
local insert = table.insert
|
local insert = table.insert
|
||||||
@@ -1998,7 +1998,7 @@ StaticPopupDialogs["WEAKAURAS_CONFIRM_REPAIR"] = {
|
|||||||
RepairDatabase()
|
RepairDatabase()
|
||||||
end,
|
end,
|
||||||
OnShow = function(self)
|
OnShow = function(self)
|
||||||
local AutomaticRepairText = L["WeakAuras has detected that it has been downgraded.\nYour saved auras may no longer work properly.\nWould you like to run the |cffff0000EXPERIMENTAL|r repair tool? This will overwrite any changes you have made since the last database upgrade.\nLast upgrade: %s"]
|
local AutomaticRepairText = L["WeakAuras has detected that it has been downgraded.\nYour saved auras may no longer work properly.\nWould you like to run the |cffff0000EXPERIMENTAL|r repair tool? This will overwrite any changes you have made since the last database upgrade.\nLast upgrade: %s\n\n|cffff0000You should BACKUP your WTF folder BEFORE pressing this button.|r"]
|
||||||
local ManualRepairText = L["Are you sure you want to run the |cffff0000EXPERIMENTAL|r repair tool?\nThis will overwrite any changes you have made since the last database upgrade.\nLast upgrade: %s"]
|
local ManualRepairText = L["Are you sure you want to run the |cffff0000EXPERIMENTAL|r repair tool?\nThis will overwrite any changes you have made since the last database upgrade.\nLast upgrade: %s"]
|
||||||
|
|
||||||
if self.data.reason == "user" then
|
if self.data.reason == "user" then
|
||||||
|
|||||||
@@ -350,6 +350,7 @@ local Actions = {
|
|||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
local function GetAction(target, area)
|
local function GetAction(target, area)
|
||||||
if target and area then
|
if target and area then
|
||||||
if area == "GROUP" then
|
if area == "GROUP" then
|
||||||
|
|||||||
@@ -1306,6 +1306,32 @@ local methods = {
|
|||||||
self:ReleaseChildren()
|
self:ReleaseChildren()
|
||||||
self:AddBasicInformationWidgets(data, sender)
|
self:AddBasicInformationWidgets(data, sender)
|
||||||
|
|
||||||
|
--[[
|
||||||
|
do
|
||||||
|
local highestVersion = data.internalVersion or 0
|
||||||
|
if children then
|
||||||
|
for _, child in ipairs(children) do
|
||||||
|
highestVersion = max(highestVersion, child.internalVersion or 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if (highestVersion > WeakAuras.InternalVersion()) then
|
||||||
|
local highestVersionWarning = AceGUI:Create("Label")
|
||||||
|
highestVersionWarning:SetFontObject(GameFontHighlight)
|
||||||
|
highestVersionWarning:SetFullWidth(true)
|
||||||
|
highestVersionWarning:SetText(L["This aura was created with a newer version of WeakAuras.\nUpgrade your version of WeakAuras or wait for next release before installing this aura."])
|
||||||
|
highestVersionWarning:SetColor(1, 0, 0)
|
||||||
|
self:AddChild(highestVersionWarning)
|
||||||
|
self.importButton:Hide()
|
||||||
|
self.viewCodeButton:Hide()
|
||||||
|
self:DoLayout()
|
||||||
|
return
|
||||||
|
else
|
||||||
|
self.importButton:Show()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
local matchInfoResult = AceGUI:Create("Label")
|
local matchInfoResult = AceGUI:Create("Label")
|
||||||
matchInfoResult:SetFontObject(GameFontHighlight)
|
matchInfoResult:SetFontObject(GameFontHighlight)
|
||||||
matchInfoResult:SetFullWidth(true)
|
matchInfoResult:SetFullWidth(true)
|
||||||
@@ -1420,6 +1446,7 @@ local methods = {
|
|||||||
self:AddChild(scamCheckText)
|
self:AddChild(scamCheckText)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Let people install auras that are newer than their version of WeakAuras
|
||||||
local highestVersion = data.internalVersion or 0
|
local highestVersion = data.internalVersion or 0
|
||||||
if children then
|
if children then
|
||||||
for _, child in ipairs(children) do
|
for _, child in ipairs(children) do
|
||||||
|
|||||||
@@ -1555,6 +1555,7 @@ function OptionsPrivate.Drop(mainAura, target, action, area)
|
|||||||
frame:SetLoadProgressVisible(false)
|
frame:SetLoadProgressVisible(false)
|
||||||
OptionsPrivate.SortDisplayButtons()
|
OptionsPrivate.SortDisplayButtons()
|
||||||
OptionsPrivate.UpdateButtonsScroll()
|
OptionsPrivate.UpdateButtonsScroll()
|
||||||
|
WeakAuras.FillOptions()
|
||||||
end
|
end
|
||||||
|
|
||||||
local co1 = coroutine.create(func1)
|
local co1 = coroutine.create(func1)
|
||||||
|
|||||||
Reference in New Issue
Block a user