--[[------------------------------ Development stuff start ---------------------- You schould NOT mess with this stuff you can totally kill the mod here if you don't know what your doing, and there is NOTHING to be gained ]]-- --I do a lot (most) of development outside of WOW so here is a switch SW_DEV_INWOW = true; -- a util to create junk msgs to test against SW_DEV_CREATE_JUNK_STRINGS = true; -- just handy to have if SW_DEV_INWOW then SW_DEV_CREATE_JUNK_STRINGS = false; end -- amount of junk do produce per regex SW_DEV_ITEMS_PER_REGEX = 1; -- dummy event all registered regEx will be here SW_DEV_EVENTDUMMY = "EVENTDUMMY"; SW_DECURSEDUMMY = "DECURSEDUMMY"; --SW_DECEV = {}; SW_SpellIDLookUp = {}; -- if outside of wow add stuff here to be loaded if not SW_DEV_INWOW then function GetLocale() return "deDE"; end dofile("GlobToUseDs.lua"); -- this is not distributet with the mod (its a stripped down GlobalStrings.lua from bliz) --dofile("GlobalStrings-CH-xx.lua"); -- just a chinese version (core seems to work but not 100% sure) dofile("SW_DefaultMap.lua"); SW_Map = SW_DefaultMap; dofile("console.lua"); dofile("neutral.lua"); --dofile("localization.DE.lua"); dofile("init.lua"); SW_DEV_FINDMATCH = {}; SW_DEV_FINDCOLL = {}; if SW_DEV_CREATE_JUNK_STRINGS then math.randomseed(os.time()); SW_DEV_JUNK_STRINGS ={}; end arg1=""; end --added 1.4 --used to skip code while in "dev mode" this should always be true in a release SW_LIVE_MODE = true; -------------------------------- Development stuff END ---------------------- -- table to look up localized class names (lookup built automtically) SW_ClassNames = { ["DRUID"] = "", ["HUNTER"] = "", ["MAGE"] = "", ["PALADIN"] = "", ["PRIEST"] = "", ["ROGUE"] = "", ["SHAMAN"] = "", ["WARLOCK"] = "", ["WARRIOR"] = "", }; -- the lookup table with regex generated from Blizzards global vars -- for adding vars add them in init.lua SW_CreateRegexFromGlobals() SW_RegEx_Lookup = {}; -- this maps events to regular expressions -- to chage this mapping see init.lua SW_CreateEventRegexMap() SW_EventRegexMap ={}; -- similar to SW_EventRegexMap but only with VSENVIRONMENTALDAMAGE_XXX -- this is only checked if nothing "fit" SW_EventRegexMap SW_EventRegexMapEnviro = {}; -- info with stuff that happened at startup -- if in the end all was ok it will be nil -- else it has some info to track down problems SW_StartupLog = {}; -- this tracks events we lsten to but dont have a regex for SW_NA_Msgs = {}; -- this is used to block the Fallback feature -- if no regex was found for an event, the event is blocked from updating itself -- else it would always go through all events in the event dummy SW_Fallback_Block = {}; -- resist stuff disabled SW_CheckForAbsorbs = true; -- does etra check for ending (123 resisted) or (234 absorbed)etc SW_OnlyResists = false; --if previeous is true it only does this check for resist (most interesting) --v 0.95 added SW_S_* to saved vars -- table with infos SW_S_Details = {}; -- table with heal map (who/who) info SW_S_Healed = {}; --1.3.0 Table with spell and mana info this person casted SW_S_SpellInfo = {}; --1.3.0 Table with mana info dmg, heal and total mana used SW_S_ManaUsage = {}; -- "Friends" Table either self, group or raid -- used to sperate any recorded info from people "in group" SW_Friends = {}; -- pet to owner lookup --SW_Pets = {}; removed 1.5 old pet mech -- 1.5 extended pet info SW_PetInfo = {}; SW_PetInfo["OWNER_PET"] = {}; SW_PetInfo["PET_OWNER"] = {}; --1.3.1 holds time info for DPS --1.3.2 had to change this again time and DPS dmg are not saved anymore across sessions SW_CombatTime = 0; SW_CombatTimeInfo = {}; SW_DPS_Dmg =0; SW_CombatTimeCounter =0; --settings Table SW_Settings = {}; -- its the player name we would look it up a LOT SW_SELF_STRING= ""; -- the "Event Channel" - we need it a LOT SW_Event_Channel =nil; SW_EI_ALLOFF = false; -- 1.5.3 used for colors of the title bars and buttons in them SW_Registerd_BF_Titles = {}; SW_Registered_BF_TitleButtons = {}; SW_DummyColor = {1,1,1,1}; function SW_CreateSpellIDLookup() --SW_SpellIDLookUp = {}; for i,v in ipairs(SW_Spellnames) do SW_SpellIDLookUp[v] = i; end end --------------------- START section GETINFO --------------------------- local function SW_g1(doMe, withInfo) _,_,v1 = string.find(doMe, withInfo["r"]) if v1 == nil then return nil; end return {v1}; end local function SW_g2(doMe, withInfo) _,_,v1, v2 = string.find(doMe, withInfo["r"]) if v2 == nil then return nil; end return {v1, v2}; end local function SW_g3(doMe, withInfo) _,_,v1, v2, v3 = string.find(doMe, withInfo["r"]) if v3 == nil then return nil; end return {v1, v2, v3}; end local function SW_g4(doMe, withInfo) _,_,v1, v2, v3, v4 = string.find(doMe, withInfo["r"]) if v4 == nil then return nil; end return {v1, v2, v3, v4}; end local function SW_g5(doMe, withInfo) _,_,v1, v2, v3, v4, v5 = string.find(doMe, withInfo["r"]) if v5 == nil then return nil; end return {v1, v2, v3, v4, v5}; end local function SW_g6(doMe, withInfo) _,_,v1, v2, v3, v4, v5, v6 = string.find(doMe, withInfo["r"]) if v6 == nil then return nil; end return {v1, v2, v3, v4, v5, v6}; end local function SW_g7(doMe, withInfo) _,_,v1, v2, v3, v4, v5, v6, v7 = string.find(doMe, withInfo["r"]) if v7 == nil then return nil; end return {v1, v2, v3, v4, v5, v6, v7}; end function SW_g8(doMe, withInfo) _,_,v1, v2, v3, v4, v5, v6, v7, v8 = string.find(doMe, withInfo["r"]) if v8 == nil then return nil; end return {v1, v2, v3, v4, v5, v6, v7, v8}; end local function SW_g9(doMe, withInfo) _,_,v1, v2, v3, v4, v5, v6, v7, v8, v9 = string.find(doMe, withInfo["r"]) if v9 == nil then return nil; end return {v1, v2, v3, v4, v5, v6, v7, v8, v9}; end -- here we resort the values via the mapping that was created during the init local function SW_sortVals(vals, withInfo) if vals == nil then return nil; end local ret = {}; for k,v in pairs(withInfo["p"]) do ret[v] = vals[k]; end return ret; end local SW_MAX_ARGS = 9; -- a functionLookup mapping # returned arguments to a specific function local SW_Func_Lookup = {SW_g1,SW_g2,SW_g3,SW_g4,SW_g5,SW_g6,SW_g7,SW_g8,SW_g9}; -- this actually performs the search on a string function SW_getInfo(doMe, withInfo ) -- if we don't have a function or # of captures is invlid return nil if withInfo["r"] == nil or withInfo["i"] > SW_MAX_ARGS or withInfo["i"] < 1 then return nil; end -- resort if we have to if withInfo["p"] == nil then return SW_Func_Lookup[withInfo["i"]](doMe, withInfo); --return SW_Func_Lookup[withInfo["i"]](doMe, withInfo); else return SW_sortVals(SW_Func_Lookup[withInfo["i"]](doMe, withInfo), withInfo); end end -- at the end of dmg messages there can be blocked absobed etc messages --this returns the globalVarName, the value absorbed -- TODO this isnt correct.. there can be multiple endings function getEndingInfo(strIn) --even do the check ? --if not SW_CheckForAbsorbs then return nil; end --add this on a outer level -- assumption here, abosrbs etc end with a ")" (seems to be true) if string.sub(strIn,-1)~=")" then return nil; end s,e = string.find(strIn, SW_RegEx_Lookup["RESIST_TRAILER"]["r"]) if s ~= nil then return "RESIST_TRAILER", SW_getInfo(strIn, SW_RegEx_Lookup["RESIST_TRAILER"])[1]; end if SW_OnlyResists then return nil; end s,e = string.find(strIn, SW_RegEx_Lookup["ABSORB_TRAILER"]["r"]) if s ~= nil then return "ABSORB_TRAILER", SW_getInfo(strIn, SW_RegEx_Lookup["ABSORB_TRAILER"])[1]; end s,e = string.find(strIn, SW_RegEx_Lookup["BLOCK_TRAILER"]["r"]) if s ~= nil then return "BLOCK_TRAILER", SW_getInfo(strIn, SW_RegEx_Lookup["BLOCK_TRAILER"])[1]; end s,e = string.find(strIn, SW_RegEx_Lookup["VULNERABLE_TRAILER"]["r"]) if s ~= nil then return "VULNERABLE_TRAILER", SW_getInfo(strIn, SW_RegEx_Lookup["VULNERABLE_TRAILER"])[1]; end return nil; end --------------------- END section GETINFO --------------------------- function SW_Stats_OnLoad() SW_SL_Add(SW_SL["START"]); SlashCmdList["SW_STATS"] = function(msg) SW_SlashCommand(msg); end SLASH_SW_STATS1 = SW_RootSlashes[1]; SLASH_SW_STATS2 = SW_RootSlashes[2]; SW_CreateRegexFromGlobals(); SW_RegisterEvents(); end local function SW_handleMatch(event, regExName, caps) local re = SW_RegEx_Lookup[regExName]; local reBI= re["basicInfo"]; local from = reBI[1]; local to = reBI[2]; local what = reBI[5]; local school = reBI[6]; local tmp; local pFrom, pFromTotal, pFromWhat, pFromSchool; local pTo, pToWhat, pToSchool, pToRec; local isCrit = (re["isCrit"] ~= nil); local scrapDmg = false; --[[ START SETUP setup all vars from to etc make sure the vars are initialized --]] if from == nil then from = SW_PRINT_ITEM_WORLD; else if from == -1 then from = SW_SELF_STRING; else from = caps[from]; end if from == nil then from = "??"; end end if to == nil then to = SW_PRINT_ITEM_WORLD; else if to == -1 then to = SW_SELF_STRING; else to = caps[to] end if to == nil then to = "??"; end end -- 1.1.0 dont count dmg from self to self if reBI[3] then if from == to then scrapDmg = true; end --1.3.1 start dps timer if SW_CombatTimeInfo.awaitingStart and from == SW_SELF_STRING then SW_CombatTimeInfo.awaitingStart = false; SW_CombatTimeInfo.awaitingEnd = true; end end if what == nil then what = SW_PRINT_ITEM_NORMAL; else what = caps[ reBI[5] ]; if what == nil then what = "??"; end end --[[ usefull for finding wrong captures if string.find (what, "'s") then SW_printStr("--START--"); SW_printStr(what); SW_printStr(arg1); SW_printStr(regExName); SW_printStr(re[r]); SW_DumpTable(caps); SW_printStr("--END--"); end --]] if school == nil then school = SW_PRINT_ITEM_NON_SCHOOL; else school = caps[school]; if school == nil then school = "??"; end end pFrom = SW_S_Details[from]; if pFrom == nil then SW_S_Details[from] ={}; pFrom = SW_S_Details[from]; pFrom[SW_PRINT_ITEM_TOTAL_DONE] = {0,0}; --first = dmg; sec = heal pFrom[SW_PRINT_ITEM_RECIEVED] = {0,0}; --first = dmg; sec = heal pFrom[SW_PRINT_ITEM_TYPE] = {}; -- school info end pFromTotal = pFrom[SW_PRINT_ITEM_TOTAL_DONE]; pTo= SW_S_Details[to]; if pTo == nil then SW_S_Details[to] = {}; pTo = SW_S_Details[to]; pTo[SW_PRINT_ITEM_TOTAL_DONE] = {0,0}; --first = dmg; sec = heal pTo[SW_PRINT_ITEM_RECIEVED] = {0,0}; --first = dmg; sec = heal pTo[SW_PRINT_ITEM_TYPE] = {}; -- school info end pToRec = pTo[SW_PRINT_ITEM_RECIEVED]; pFromWhat = pFrom[what]; if pFromWhat == nil then pFrom[what] ={0,0,0,0,0,0,0}; --dmg, heal, maxDmg, usedcount (or tick count with dots) - 1.4.1beta2 added ,maxHeal, critcountDmg, critcountHeal pFromWhat = pFrom[what]; end -- this can happen now because of the sync channel if pFrom[SW_PRINT_ITEM_TYPE] == nil then pFrom[SW_PRINT_ITEM_TYPE] = {}; end pFromSchool = pFrom[SW_PRINT_ITEM_TYPE][school]; if pFromSchool == nil then pFrom[SW_PRINT_ITEM_TYPE][school] ={0,0,0,0,0,0}; --dmgDone, Donemax, usedCount, dmgRecieved, recivedMax, recievedCount pFromSchool = pFrom[SW_PRINT_ITEM_TYPE][school]; end -- this can happen now because of the sync channel if pTo[SW_PRINT_ITEM_TYPE] == nil then pTo[SW_PRINT_ITEM_TYPE] = {}; end pToSchool = pTo[SW_PRINT_ITEM_TYPE][school]; if pToSchool == nil then pTo[SW_PRINT_ITEM_TYPE][school] ={0,0,0,0,0,0}; --dmgDone, Donemax, usedCount, dmgRecieved, recivedMax, recievedCount pToSchool = pTo[SW_PRINT_ITEM_TYPE][school]; end -- END SETUP -- count usage up by 1 pFromWhat[4] = pFromWhat[4] + 1; -- dmg or heal ? if reBI[3] then local dmg = tonumber(caps[ reBI[3] ]); if not scrapDmg and (SW_Friends[from] ~= nil or SW_PetInfo["PET_OWNER"][from] ~= nil) then SW_RPS:validEvent(); end if not scrapDmg then -- added 1.5 is this a pet? if SW_PetInfo["PET_OWNER"][from] ~= nil then SW_HandlePetEvent(from, true, dmg, 0); end --1.3.2 added extra counter for dps dmg if from == SW_SELF_STRING then SW_DPS_Dmg = SW_DPS_Dmg + dmg; end pFromTotal[1] = pFromTotal[1] + dmg; pFromWhat[1] = pFromWhat[1] + dmg; if dmg > pFromWhat[3] then pFromWhat[3] = dmg; end --1.4.1 beta 2 added if isCrit then pFromWhat[6] = pFromWhat[6] + 1; end end -- added 1.5 is this a pet? if SW_PetInfo["PET_OWNER"][to] ~= nil then SW_HandlePetEvent(to, false, dmg, 0); end pToRec[1] = pToRec[1] + dmg; if not scrapDmg then pFromSchool[1] = pFromSchool[1] +dmg; if dmg > pFromSchool[2] then pFromSchool[2] = dmg; end pFromSchool[3] = pFromSchool[3] + 1; end pToSchool[4] = pToSchool[4] + dmg; if dmg > pToSchool[5] then pToSchool[5] = dmg; end pToSchool[6] = pToSchool[6] + 1; elseif reBI[4] then local heal = tonumber(caps[ reBI[4] ]); -- added 1.5 is this a pet? if SW_PetInfo["PET_OWNER"][from] ~= nil then SW_HandlePetEvent(from, true, 0, heal); end if SW_PetInfo["PET_OWNER"][to] ~= nil then SW_HandlePetEvent(to, false, 0, heal); end if SW_Friends[to] ~= nil then --1.4.1 added nil check is this the cause of the rare error ? -- TODO (low prio) noticed while working on 1.5 no OH count from pets as target local info = SW_Friends[to]["UnitID"]; if info == nil then SW_RebuildFriendList(); if SW_Friends[to] == nil or SW_Friends[to]["UnitID"] == nil then SW_printStr("UnitHealthMax(nil) - SW FriendList rebuilt-- didn't help"); return; end SW_printStr("UnitHealthMax(nil) - SW FriendList rebuilt - OK"); end info = SW_Friends[to]["UnitID"]; local num = UnitHealthMax(info) - UnitHealth(info) - heal; if num < 0 then num = num * (-1); if SW_S_Healed[from] == nil then SW_S_Healed[from] = {}; end if SW_S_Healed[from][SW_OVERHEAL] == nil then SW_S_Healed[from][SW_OVERHEAL] = 0; end SW_S_Healed[from][SW_OVERHEAL] = SW_S_Healed[from][SW_OVERHEAL] + num; --SW_printStr("Over Heal in cast from "..from.." to "..to.." "..num); end end pFromTotal[2] = pFromTotal[2] + heal; pFromWhat[2] = pFromWhat[2] + heal; if heal > pFromWhat[5] then pFromWhat[5] = heal; end --1.4.1 beta 2 added if isCrit then pFromWhat[7] = pFromWhat[7] + 1; end pToRec[2] = pToRec[2] + heal; -- heal map if SW_S_Healed[from] == nil then SW_S_Healed[from] = {}; SW_S_Healed[from][to] = 0; else if SW_S_Healed[from][to] == nil then SW_S_Healed[from][to] = 0; end end SW_S_Healed[from][to] = SW_S_Healed[from][to] + heal; end if SW_EI_ALLOFF then return; end --[[ --]] if SW_Settings["EI_ShowEvent"] then SW_Event_Channel:AddMessage(GREEN_FONT_COLOR_CODE..event.."->"..regExName); end if SW_Settings["EI_ShowRegEx"] then SW_Event_Channel:AddMessage(LIGHTYELLOW_FONT_COLOR_CODE..SW_RegEx_Lookup[regExName]["r"]); end if SW_Settings["EI_ShowOrigStr"] then SW_Event_Channel:AddMessage(arg1); end if SW_Settings["EI_ShowMatch"] then if from == nil then from = "?"; end if to == nil then to="?"; end local sOut = string.format(SW_PRINT_INFO_FROMTO, from, to); if reBI[3] then if caps[ reBI[3] ] == nil then caps[ reBI[3] ] = "??"; end if scrapDmg then sOut = sOut..string.format(SW_PRINT_ITEM, SW_PRINT_ITEM_DMG, caps[ reBI[3] ]).." ("..SW_PRINT_ITEM_IGNORED..")"; else sOut = sOut..string.format(SW_PRINT_ITEM, SW_PRINT_ITEM_DMG, caps[ reBI[3] ]); end end if reBI[4] then if caps[ reBI[4] ] == nil then caps[ reBI[4] ] = "??"; end sOut = sOut..string.format(SW_PRINT_ITEM, SW_PRINT_ITEM_HEAL, caps[ reBI[4] ]); end if reBI[5] then if caps[ reBI[5] ] == nil then caps[ reBI[5] ] = "??"; end sOut = sOut..string.format(SW_PRINT_ITEM, SW_PRINT_ITEM_THROUGH, caps[ reBI[5] ]); end if reBI[6] then if caps[ reBI[6] ] == nil then caps[ reBI[6] ] = "??"; end sOut = sOut..string.format(SW_PRINT_ITEM, SW_PRINT_ITEM_TYPE, caps[ reBI[6] ]); end if isCrit then sOut = sOut..SW_PRINT_ITEM_CRIT; end SW_Event_Channel:AddMessage(sOut); end end --1.5.1 Decurse Counting local function SW_CheckDecurse(event) local re; local reBI; local from; local to; local what; local spellID; local r; for _,v in ipairs(SW_EventRegexMap[SW_DECURSEDUMMY]) do r = SW_getInfo(arg1, SW_RegEx_Lookup[v]); if r~=nil then re = SW_RegEx_Lookup[v]; reBI= re["basicInfo"]; from = reBI[1]; to = reBI[2]; what = reBI[5]; if what == nil then what = SW_PRINT_ITEM_NORMAL; else what = r[what]; if what == nil then what = "??"; end end -- this isn't perfect "what" can still be a number of false captures -- the lookup makes it safe though spellID = SW_SpellIDLookUp[what]; if spellID ~= nil then if from == nil then from = SW_PRINT_ITEM_WORLD; else if from == -1 then from = SW_SELF_STRING; else from = r[from]; end if from == nil then from = "??"; end end if to == nil then to = SW_PRINT_ITEM_WORLD; else if to == -1 then to = SW_SELF_STRING; else to = r[to] end if to == nil then to = "??"; end end if SW_S_SpellInfo[from] == nil then SW_S_SpellInfo[from] = {}; end if SW_S_SpellInfo[from][SW_DECURSEDUMMY] == nil then SW_S_SpellInfo[from][SW_DECURSEDUMMY] = {}; end if SW_S_SpellInfo[from][SW_DECURSEDUMMY]["total"] == nil then SW_S_SpellInfo[from][SW_DECURSEDUMMY]["total"] = 1; else SW_S_SpellInfo[from][SW_DECURSEDUMMY]["total"] = SW_S_SpellInfo[from][SW_DECURSEDUMMY]["total"] + 1; end if SW_S_SpellInfo[from][SW_DECURSEDUMMY][what] == nil then SW_S_SpellInfo[from][SW_DECURSEDUMMY][what] = 1; else SW_S_SpellInfo[from][SW_DECURSEDUMMY][what] = SW_S_SpellInfo[from][SW_DECURSEDUMMY][what] + 1; end --[[ if SW_DECEV[event] == nil then SW_DECEV[event] = {}; end table.insert(SW_DECEV[event], {from .. "; to '" .. to .. "'; " .. what, SW_RegEx_Lookup[v][r], arg1} ); --]] return true; end end end return false; end local function findEventMatch(event) -- only interested in stuff with numbers -- V0.92 Changed this regex --V 1.1.0 Added () -- fix for french crit vals -- 1.4.2 made regex a var to be localized see neutral.lua if not string.find (arg1, SW_PRE_REGEX) then SW_CheckDecurse(event); return false, "NUMBER"; end --[[SW_TmpMap if you change this change SW_CreateEventRegexMap Its a map of regex to check first, point is if we find the default map had erros we put these here first to enable transition to a new default map, why here?.. becaue here we add messages that would be handeld by other regexp if SW_TmpMap ~= nil then for _,v in ipairs(SW_TmpMap) do r = SW_getInfo(arg1, SW_RegEx_Lookup[v]); if r~=nil then SW_lateAdd(event, v, SW_EventRegexMap, SW_Map, true); end end end --]] local r; if SW_EventRegexMap[event] ~= nil then for _,v in ipairs(SW_EventRegexMap[event]) do r = SW_getInfo(arg1, SW_RegEx_Lookup[v]); if r~=nil then SW_handleMatch(event, v, r); return true; end end else SW_printStr(RED_FONT_COLOR_CODE..SW_EMPTY_EVENT..event, 1); end local r; -- if we get here see if it was env dmg if SW_EventRegexMapEnviro[event] ~= nil then for _,v in ipairs(SW_EventRegexMapEnviro[event]) do r = SW_getInfo(arg1, SW_RegEx_Lookup[v]); if r~=nil then SW_handleMatch(event, v, r); return true; end end end return false, "NF"; end local function doFallback(event) -- we didn't find a regex that fits -- the SW_DEV_EVENTDUMMY has all defined that we are "listening" to local r; for _,v in ipairs(SW_EventRegexMap[SW_DEV_EVENTDUMMY]) do r = SW_getInfo(arg1, SW_RegEx_Lookup[v]); if r~=nil then if string.sub(v,1,string.len("VSENVIRONMENTALDAMAGE"))=="VSENVIRONMENTALDAMAGE" then SW_lateAdd(event, v, SW_EventRegexMapEnviro, SW_EnviroMap); else SW_lateAdd(event, v, SW_EventRegexMap, SW_Map); end SW_handleMatch(event, v, r); return true; end end return false; end function SW_DoEvent(event) if arg1 == nil then SW_printStr("arg1 NIL For:"..event); return; end local isOk, reason = findEventMatch(event); if not isOk and reason == "NF" then SW_printStr(RED_FONT_COLOR_CODE..event, 2); SW_printStr(RED_FONT_COLOR_CODE.." "..arg1, 2); if SW_Fallback_Block[event] == nil then if doFallback(event) then SW_printStr(GREEN_FONT_COLOR_CODE.." "..SW_CONSOLE_FALLBACK, 2); else SW_printStr(RED_FONT_COLOR_CODE.." "..SW_CONSOLE_NOREGEX, 2); SW_Fallback_Block[event] = arg1; end else SW_printStr(RED_FONT_COLOR_CODE.." "..SW_FALLBACK_BLOCK_INFO, 2); SW_printStr(RED_FONT_COLOR_CODE.." "..SW_CONSOLE_NOREGEX, 2); SW_printStr(RED_FONT_COLOR_CODE.." "..SW_Fallback_Block[event], 2); end end end function SW_Test(subMap) if subMap == nil then for k,v in pairs(SW_EventRegexMap) do SW_printStr (k); for _,x in ipairs(v) do SW_printStr(" "..x.." ---- "..SW_RegEx_Lookup[x]["r"]); end end else SW_printStr (subMap); for _,x in ipairs(SW_EventRegexMap[subMap]) do SW_printStr(" "..x.." ---- "..SW_RegEx_Lookup[x]["r"]); end end end -- 1.5 new pet mechanics function SW_PetHasOwner(petName) local petInfo = SW_PetInfo["PET_OWNER"][petName]; if petInfo ~= nil and petInfo["currentOwners"] ~= nil then for k, v in pairs(petInfo["currentOwners"]) do return true; end end return false; end -- resets current petownership to nothing function SW_PetsResetOwners() for k, v in pairs(SW_PetInfo["OWNER_PET"]) do v["currentPet"] = nil; end for k, v in pairs(SW_PetInfo["PET_OWNER"]) do v["currentOwners"] = {}; end end function SW_HandlePetEvent(petName, petsAction, dmg, heal) local petInfo = SW_PetInfo["PET_OWNER"][petName]; local tmpInfo = nil; local oneOwner = nil; local hadOwner = false; if petInfo == nil then return; end if petInfo["currentOwners"] == nil then return; end for k, v in pairs(petInfo["currentOwners"]) do hadOwner = true; oneOwner = SW_PetInfo["OWNER_PET"][k]; if oneOwner ~= nil then if oneOwner["currentPet"] == petName then -- through setup should always be true if petsAction then tmpInfo = oneOwner["pets"][petName][SW_PRINT_ITEM_TOTAL_DONE]; else tmpInfo = oneOwner["pets"][petName][SW_PRINT_ITEM_RECIEVED]; end tmpInfo[1] = tmpInfo[1] + dmg; tmpInfo[2] = tmpInfo[2] + heal; if petsAction then tmpInfo = oneOwner[SW_PRINT_ITEM_TOTAL_DONE]; else tmpInfo = oneOwner[SW_PRINT_ITEM_RECIEVED]; end tmpInfo[1] = tmpInfo[1] + dmg; tmpInfo[2] = tmpInfo[2] + heal; end end end if hadOwner then if petsAction then tmpInfo = petInfo[SW_PRINT_ITEM_TOTAL_DONE]; else tmpInfo = petInfo[SW_PRINT_ITEM_RECIEVED]; end tmpInfo[1] = tmpInfo[1] + dmg; tmpInfo[2] = tmpInfo[2] + heal; end end function SW_UpdatePet(ownerID) local ownerName = UnitName(ownerID); local unitPetName = nil; local unitPetID = nil; local localizedClass, englishClass; if ownerName == nil then return; end -- translate target to raid/ group id -- cant seem to get the pet of a "target" id if ownerID == "target" then if SW_Friends[ownerName] ~= nil then -- should always be true just an extra check if UnitIsUnit(SW_Friends[ownerName]["UnitID"], "target") then ownerID = SW_Friends[ownerName]["UnitID"]; else ownerID = nil; end else ownerID = nil; end end if (ownerID == nil) then return; end -- here we have an id we can really use if ownerID == "player" then unitPetID = "pet"; elseif string.find(ownerID, "party") then unitPetID = string.gsub(ownerID, "party", "partypet"); elseif string.find(ownerID, "raid") then unitPetID = string.gsub(ownerID, "raid", "raidpet"); else SW_printStr("SW_UpdatePet error ownerID is:"..ownerID); return; end unitPetName = UnitName(unitPetID); -- this tends to happen when logging in -- once inside the game zoning and reloadui shouldn't trigger this if unitPetName == UNKNOWNOBJECT then --SW_printStr("Started UNKNOWNOBJECT timer"); SW_Timed_Calls.retryUnknownObject = true; return; end -- no pet if unitPetName == nil then -- remove the owner for k,v in pairs(SW_PetInfo["PET_OWNER"]) do if v["currentOwners"] ~= nil then v["currentOwners"][ownerName] = nil; end end if SW_PetInfo["OWNER_PET"][ownerName] ~= nil then SW_PetInfo["OWNER_PET"][ownerName]["currentPet"] = nil; end end if unitPetName ~= nil and unitPetName ~= UNKNOWNOBJECT then -- setup pet owner if SW_PetInfo["PET_OWNER"][unitPetName] == nil then SW_PetInfo["PET_OWNER"][unitPetName] = {}; SW_PetInfo["PET_OWNER"][unitPetName][SW_PRINT_ITEM_TOTAL_DONE] = {0,0}; SW_PetInfo["PET_OWNER"][unitPetName][SW_PRINT_ITEM_RECIEVED] = {0,0}; SW_PetInfo["PET_OWNER"][unitPetName]["currentOwners"] = {}; SW_PetInfo["PET_OWNER"][unitPetName]["currentOwners"][ownerName] = true; localizedClass, englishClass = UnitClass(unitPetID); if englishClass ~= nil and localizedClass ~= nil then SW_ClassNames[englishClass] = localizedClass; end -- englishClass might be nill but thats fine SW_PetInfo["PET_OWNER"][unitPetName]["CLASSE"] = englishClass; else -- need this check because of sync channel if SW_PetInfo["PET_OWNER"][unitPetName]["currentOwners"] == nil then SW_PetInfo["PET_OWNER"][unitPetName]["currentOwners"] = {}; end SW_PetInfo["PET_OWNER"][unitPetName]["currentOwners"][ownerName] = true; -- sometimes class info doesn't carry over (pet is to far away) -- so recheck it if SW_PetInfo["PET_OWNER"][unitPetName]["CLASSE"] == nil then localizedClass, englishClass = UnitClass(unitPetID); if englishClass ~= nil and localizedClass ~= nil then SW_ClassNames[englishClass] = localizedClass; end SW_PetInfo["PET_OWNER"][unitPetName]["CLASSE"] = englishClass; end end -- setup owner pet if SW_PetInfo["OWNER_PET"][ownerName] == nil then SW_PetInfo["OWNER_PET"][ownerName] = {}; SW_PetInfo["OWNER_PET"][ownerName]["pets"] = {}; SW_PetInfo["OWNER_PET"][ownerName][SW_PRINT_ITEM_TOTAL_DONE] = {0,0}; SW_PetInfo["OWNER_PET"][ownerName][SW_PRINT_ITEM_RECIEVED] = {0,0}; end -- very odd had a report so added this, why would this be needed? -- ah ok if its inited through the sync channel this is needed. if SW_PetInfo["OWNER_PET"][ownerName]["pets"] == nil then SW_PetInfo["OWNER_PET"][ownerName]["pets"] = {}; end if SW_PetInfo["OWNER_PET"][ownerName]["pets"][unitPetName] == nil then SW_PetInfo["OWNER_PET"][ownerName]["pets"][unitPetName] = {}; SW_PetInfo["OWNER_PET"][ownerName]["pets"][unitPetName][SW_PRINT_ITEM_TOTAL_DONE] = {0,0}; SW_PetInfo["OWNER_PET"][ownerName]["pets"][unitPetName][SW_PRINT_ITEM_RECIEVED] = {0,0}; end SW_PetInfo["OWNER_PET"][ownerName]["currentPet"] = unitPetName; --SW_Pets[unitPetName] = ownerName; if SW_Friends[ownerName] == nil then SW_Friends[ownerName] = {}; SW_Friends[ownerName]["PETS"] = {}; elseif SW_Friends[ownerName]["PETS"] == nil then SW_Friends[ownerName]["PETS"] = {}; end SW_Friends[ownerName]["PETS"][unitPetName] = 1; end end -- creats the "friends" list -- self, group members, or raid members function SW_Make_Friends(gType) local name, rank,sg,lev; local namePet; local playerClass, englishClass = UnitClass("player"); SW_ClassNames[englishClass] = playerClass; SW_Friends = {[SW_SELF_STRING]= {["CLASS"] = playerClass, ["CLASSE"] = englishClass, ["UnitID"]="player", ["L"] = UnitLevel("player")}, }; --1.4.2 add rank info when we are alone will be overwritten if in raid/group SW_Friends[SW_SELF_STRING]["Rank"] = 0; --update pet info SW_PetsResetOwners(); SW_UpdatePet("player"); --[[ 1.4.2 Changed to GetRaidRosterInfo need rank info now probably could use class and fileName instead of UnitClass(...) --]] if gType == "RAID" then for i=1, GetNumRaidMembers() do --name =UnitName("raid"..i); --name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(i) name, rank,sg,lev = GetRaidRosterInfo(i); if name ~= nil then playerClass, englishClass = UnitClass("raid"..i); if englishClass ~= nil and playerClass ~= nil then SW_ClassNames[englishClass] = playerClass; SW_Friends[name] = {["CLASS"] = playerClass, ["CLASSE"] = englishClass, ["UnitID"]="raid"..i, ["Rank"]=rank, ["L"] = lev }; end SW_UpdatePet("raid"..i); end end return; end if gType == "GROUP" then for i=1, GetNumPartyMembers() do name =UnitName("party"..i); if name ~= nil then playerClass, englishClass = UnitClass("party"..i); if UnitIsPartyLeader("party"..i) then rank = 2; else rank = 0; end if englishClass ~= nil and playerClass ~= nil then SW_ClassNames[englishClass] = playerClass; SW_Friends[name] = {["CLASS"] = playerClass, ["CLASSE"] = englishClass, ["UnitID"]="party"..i, ["Rank"]=rank, ["L"] = UnitLevel("party"..i)}; end SW_UpdatePet("party"..i); end end --1.4.2 check self as party leader if IsPartyLeader() then SW_Friends[SW_SELF_STRING]["Rank"] = 2; end return; end end --[[ SW_TestState = { _memberVar, Test = function (self, test) self._memberVar = test; x=0; for i=1, 1000000 do x=x+1; end if self._memberVar == test then SW_printStr(test.." OK"); else SW_printStr(test.." FAILED"); end end, } --]] SW_Timed_Calls = { deltaPending = 0.5, -- 1.4 beta 5 increased + 0.1 passedPendig =0, pendingActive = false, deltaResize = 0.5, passedResize = 0, deltaSySend = 1.1, -- + 0.1 in 1.2.4 a few more checks going on passedSySend = 0, deltaSyDo = 5, passedSyDo = 0, deltaSyLI = 100, -- lowerd to 100 passedSyLI = 0, retryUnknownObject = false, -- added in 1.5 pet mechanics using SyDo timer pendingJoin = false, -- added in 1.5 for sync joining, using SySend timer checkJoin = false, -- added in 1.5 for checking if we REALLY are in the chan, using SySend timer OnUpdate = function (self, elapsed) self.passedResize = self.passedResize + elapsed; self.passedSySend = self.passedSySend + elapsed; self.passedSyDo = self.passedSyDo + elapsed; self.passedSyLI = self.passedSyLI + elapsed; if (SW_CombatTimeInfo.awaitingEnd) then SW_CombatTime = SW_CombatTime + elapsed; end if self.pendingActive then self.passedPendig = self.passedPendig + elapsed; if self.passedPendig > self.deltaPending then self.pendingActive = false; self.passedPendig = 0; SW_AcceptPendingCast(); end end if self.passedResize > self.deltaResize then if SW_SomethingResizing then SW_BarLayoutRegisterdOnResize(); end self.passedResize = 0; end if self.passedSySend > self.deltaSySend then -- added 1.5.3 for raid per second info SW_RPS:updateInfo(); -- added in 1.5 joining a chan is now on a short timer -- to allow exit of old sync chan first if self.checkJoin then self.checkJoin = false; SW_SyncJoinedCheck(); end if self.pendingJoin then self.pendingJoin = false; SW_SyncJoinPending(); end SW_SyncSend(); -- added 1.5.beta.1 for voting system SW_UpdateVoteTimers(self.deltaSySend); if not SW_SomethingResizing then SW_UpdateBars(); end self.passedSySend = 0; end if self.passedSyDo > self.deltaSyDo then -- added in 1.5 this should only happen when logging in if self.retryUnknownObject then self.retryUnknownObject = false; --SW_printStr("UNKNOWNOBJECT timer fired"); SW_RebuildFriendList(); end SW_SyncDo(); self.passedSyDo = 0; end if self.passedSyLI > self.deltaSyLI then SW_SyncCheckAlive(); self.passedSyLI = 0; end end, StopPending = function (self) self.pendingActive = false; self.passedPendig = 0; end, StartPending = function (self) self.pendingActive = true; end, StartJoinChanPending = function (self) self.passedSySend = 0; self.pendingJoin = true; end, StopJoinChanPending = function (self) self.pendingJoin = false; end, StartCheckChan = function (self) self.passedSySend = 0; self.checkJoin = true; end, StopCheckChan = function (self) self.checkJoin = false; end, }; -- this doesnt work like intended, eg talking to nef starts this oO --[[ function SW_RaidInfightUpdate() local indi = getglobal("SW_BarFrame1_Title_InFight"); for k,v in pairs(SW_Friends) do if v["UnitID"] ~= nil then if UnitAffectingCombat(v["UnitID"]) then indi.NormalT:SetVertexColor(0,1,0,1); return; end end end indi.NormalT:SetVertexColor(1,0,0,1); end --]] function SW_AddDeath(name) if name == nil then return; end if SW_S_Details[name] == nil then SW_S_Details[name] = {}; SW_S_Details[name][SW_PRINT_ITEM_TOTAL_DONE] = {0,0}; SW_S_Details[name][SW_PRINT_ITEM_RECIEVED] = {0,0}; SW_S_Details[name][SW_PRINT_ITEM_TYPE] = {}; end if SW_S_Details[name][SW_PRINT_ITEM_DEATHS] == nil then SW_S_Details[name][SW_PRINT_ITEM_DEATHS] = 1; else SW_S_Details[name][SW_PRINT_ITEM_DEATHS] = SW_S_Details[name][SW_PRINT_ITEM_DEATHS] + 1; end end function SW_HandleDeath(msg) if msg == nil then return; end if msg == UNITDIESSELF then SW_AddDeath(SW_SELF_STRING); else local _,_, deadGuy = string.find(msg, SW_DeathRegEx); SW_AddDeath(deadGuy); end end --[[ Note to self, add HPS aswell --]] SW_C_RPS ={ filters = {["SF"] = "SW_Filter_EverGroup", ["PF"] = "SW_PF_VPR"}, new = function (self, o) local doResetInit = true; if o then doResetInit = false; else o = {}; end setmetatable(o, self); self.__index = self; o.baseTimer = SW_C_Timer:new(o.baseTimer); o.startTimer = SW_C_Timer:new(o.startTimer); if doResetInit then o:resetDPS(); end return o; end, resetDPS = function(self) self.isRunning = false; self.allowLastFightUpdate = false; self.currentSecs = 0; self.totalSecs = 0; self.lastFightSecs = 0; self.startDmg = 0; self.maxDPS = 0; self.lastFightDmg = 0; self.uglyTruthStarted = false; self.resetPoint = self:getDmg(); SW_BarFrame1_Title_SyncIcon:UpdateColor(SW_Settings["Colors"]["Heal"]); end, validEvent = function (self) self.lastEvent = self.baseTimer:now(); -- even with the ugly truth time be so nice to wait for first dmg if not self.uglyTruthStarted then self.uglyTruthStarted = true; self.baseTimer:setToNow(); end if not self.isRunning then self.startTimer:setToNow(); self.allowLastFightUpdate = false; self.startDmg = self:getDmg(); self.isRunning = true; SW_BarFrame1_Title_SyncIcon:UpdateColor(SW_Settings["Colors"]["Damage"]); end end, updateInfo = function (self) if not self.isRunning then return; end local deltaT = self.startTimer:now() - self.lastEvent; if deltaT > 6 then -- a buffer to keep you "in fight" 1.5.3.beta.1 changed from 5 to 6 (late sync msgs) self.isRunning = false; self.currentSecs = 0; deltaT = self.lastEvent - self.startTimer; if deltaT < 1 then deltaT = 1; end -- 1 sec minimum fight time self.totalSecs = self.totalSecs + deltaT; self.lastFightSecs = deltaT; self.allowLastFightUpdate = true; SW_BarFrame1_Title_SyncIcon:UpdateColor(SW_Settings["Colors"]["Heal"]); else self.currentSecs = self.startTimer:elapsed(); SW_BarFrame1_Title_SyncIcon:UpdateColor(SW_Settings["Colors"]["Damage"]); end end, getDmg = function(self) local snap = SW_GetDmgInfo("SW_Filter_EverGroup", nil, "SW_PF_VPR", self.filters); local total = 0; for i,v in ipairs(snap) do total = total + v[2]; end return total; end, getVals = function (self) local ret = {}; local currDmg = self:getDmg(); local currDelta = currDmg - self.startDmg; if self.currentSecs == 0 then ret[1] = 0; else if self.currentSecs < 1 then ret[1] = math.floor(currDelta *100 + 0.5)/100; else ret[1] = math.floor((currDelta / self.currentSecs) *100 + 0.5)/100; end end if self.totalSecs == 0 and self.currentSecs == 0 then ret[2] = 0; else --SW_printStr((currDmg - self.resetPoint)..".."..(self.totalSecs + self.currentSecs)); ret[2] = math.floor(((currDmg - self.resetPoint) / (self.totalSecs + self.currentSecs)) *100 + 0.5)/100; end if self.lastFightSecs == 0 then ret[3] = 0; else if self.allowLastFightUpdate then -- only point of this is to accept late sync messages -- in testing this made (almost) no difference self.lastFightDmg = currDelta; end ret[3] = math.floor((self.lastFightDmg / self.lastFightSecs) *100 + 0.5)/100; end if self.uglyTruthStarted then ret[4] = math.floor(((currDmg - self.resetPoint) / self.baseTimer:elapsed()) *100 + 0.5)/100; end if not self.isRunning or self.currentSecs > 5 then for i,v in ipairs(ret) do if v > self.maxDPS then self.maxDPS = v; end end end return ret; end, dump = function (self) SW_DumpTable(self); end, } function SW_Stats_OnEvent() if (event == "VARIABLES_LOADED") then -- init code will go here considering saved vars -- 1.5 Current pet ownership reset, will be updated through other events on login SW_PetsResetOwners(); -- 1.5.1 decurseing, could be used for more SW_CreateSpellIDLookup(); -- 1.5 added pausing, default to running for old versions and new installs if SW_Settings["IsRunning"] == nil then SW_Settings["IsRunning"] = true; end if SW_Settings["IsRunning"] then SW_UnpauseEvents(); end if SW_Map == nil then SW_Map = SW_DefaultMap; else if SW_Settings["LAST_V_RUN"] == nil then SW_Map = SW_DefaultMap; SW_Fallback_Block = {}; else if SW_Settings["LAST_V_RUN"] ~= SW_VERSION then SW_Map = SW_DefaultMap; SW_Fallback_Block = {}; SW_ResetInfo(); end end end SW_DefaultMap = nil; if SW_EnviroMap == nil then SW_EnviroMap ={}; end SW_CreateEventRegexMap(); SW_SL_Finalize(); SW_SELF_STRING = UnitName("player"); if SW_Settings["SyncBCTarget"] == nil then SW_Settings["SyncBCTarget"] = "SW_BarSyncFrame_OptRaid"; end -- sets the checkboxes to saved values SW_SetChkStates(); SW_Event_Channel = getglobal("SW_FrameConsole_Text2_MsgFrame"); SW_EI_ALLOFF = not (SW_Settings["EI_ShowRegEx"] or SW_Settings["EI_ShowMatch"] or SW_Settings["EI_ShowEvent"] or SW_Settings["EI_ShowOrigStr"]); SW_Settings["LAST_V_RUN"] = SW_VERSION; if SW_Settings["QuickOptCount"] == nil then SW_Settings["QuickOptCount"] = 5; end SW_UpdateOptVis(); -- wow what a headache, an addon called sweep overwrites this with a number oO -- causing all sorts of problems -- it's not great just to skip it but we can get along without seeding the generator if type(math.randomseed) == "function" then math.randomseed( time() ); else SW_printStr("math.randomseed is not a funtion... it should be"); end -- localize gui for k,v in pairs(SW_GUI) do --if its not a table the key is a direct map to the string if type(v) ~= "table" then getglobal(k):SetText(v); else --[[v["f"] is the function k is the identifier for the function v["s"] is the string ]]-- v["f"](k,v["s"]); end end -- done localizing gui.. drop table SW_GUI = nil; -- do layout of items SW_DoLayout(); SW_SyncInit(); if SW_Settings["ReportAmount"] == nil then SW_Settings["ReportAmount"] = 5; end if SW_Settings["Colors"] == nil then SW_Settings["Colors"] = {}; end for k,v in pairs(SW_Default_Colors) do if SW_Settings["Colors"][k] == nil then SW_Settings["Colors"][k] = v; end end if ButtonHole then ButtonHole.application.RegisterMod({id="SW_STATS_BH_HOOK", name="SW Stats", tooltip="SW Stats", buttonFrame="SW_IconFrame", updateFunction="SW_UpdateIconPos"}); else SW_UpdateIconPos(); end --1.5.3 default color mechaniks changed if SW_Settings["Colors"]["TitleBars"] == nil then SW_Settings["Colors"]["TitleBars"] = {1,0,0,1}; end SW_UpdateTitleColor(SW_Settings["Colors"]["TitleBars"]); if SW_Settings["Colors"]["TitleBarsFont"] == nil then SW_Settings["Colors"]["TitleBarsFont"] = {1,1,1,1}; end SW_UpdateTitleTextColor(SW_Settings["Colors"]["TitleBarsFont"]); if SW_Settings["Colors"]["Backdrops"] == nil then SW_Settings["Colors"]["Backdrops"] = {SW_COLOR_ACT["r"],SW_COLOR_ACT["g"],SW_COLOR_ACT["b"],1}; end SW_UpdateFrameBackdrops(SW_Settings["Colors"]["Backdrops"]); if SW_Settings["Colors"]["MainWinBack"] == nil then SW_Settings["Colors"]["MainWinBack"] = {0,0,0,0.6}; end SW_UpdateMainWinBack(SW_Settings["Colors"]["MainWinBack"]) -- 1.5.3 Sync Icon if SW_Settings["SYNCLastChan"] ~= nil then SW_BarFrame1_Title_SyncIcon:Show(); SW_BarFrame1_Title_SyncIcon:UpdateColor(SW_Settings["Colors"]["Heal"]); end --1.5.3 retaining vis of the main window if SW_Settings["SHOWMAIN"] then SW_BarFrame1:Show(); end -- 1.5.3.beta.1 locking frames SW_LockFrames(SW_Settings["BFLocked"]); -- 1.5.3 Raid dps info SW_RPS = SW_C_RPS:new(SW_RPS); --SW_ToggleConsole(); elseif (event == "PLAYER_TARGET_CHANGED") then local unitName = UnitName("target"); if unitName == nil then return; end local localizedClass, englishClass = UnitClass("target"); --1.0.2 added this, could happen with far away pets if localizedClass == nil or englishClass == nil then return; end SW_ClassNames[englishClass] = localizedClass; -- ignore if we dont have info if SW_S_Details[unitName] == nil then return; end SW_S_Details[unitName]["CLASSE"] = englishClass; --1.5 added GPC and GPET if UnitPlayerControlled("target") then if SW_Friends[unitName] ~= nil then SW_S_Details[unitName]["UTYPE"] = "GPC"; elseif SW_PetInfo["PET_OWNER"][from] ~= nil then -- don't mark MC'd mobs as gpet if SW_S_Details[unitName]["UTYPE"] ~= "NPC" then SW_S_Details[unitName]["UTYPE"] = "GPET"; end else SW_S_Details[unitName]["UTYPE"] = "PC"; end else SW_S_Details[unitName]["UTYPE"] = "NPC"; end --[[ if UnitIsEnemy("player", "target") then SW_printStr("ENEMY"); else SW_printStr("Friend"); end --]] elseif (event == "SPELLS_CHANGED") then -- update if we learn new spells if arg1 == nil then SW_UpdateCastByNameLookup(); end elseif (event == "SPELLCAST_CHANNEL_START") then --SW_printStr("-CHANNELSTART-"); SW_AcceptSelectedCast(); --[[elseif (event == "SPELLCAST_START") then SW_printStr("-START-"); ]]-- elseif (event == "SPELLCAST_STOP") then --SW_printStr("-SPELLCAST_STOP- :"); --SW_printStr(SW_SelectedSpell[1]); if SW_SelectedSpell[1] ~= nil then --SW_printStr("-SPELLCAST_STOP:"..SW_SelectedSpell[1]); -- is this an instant ? if SW_SelectedSpell[3] then SW_AcceptSelectedCast(); else SW_PendingCast[1] = SW_SelectedSpell[1]; SW_PendingCast[2] = SW_SelectedSpell[2]; SW_SelectedSpell = {}; --SW_printStr("-STOP NP-"..SW_PendingCast[1]); SW_Timed_Calls:StartPending(); end end elseif event == "SPELLCAST_FAILED" or event == "SPELLCAST_INTERRUPTED" then --SW_printStr("-SPELLCAST_FAIL-"); SW_Timed_Calls:StopPending(); SW_SelectedSpell = {}; SW_PendingCast = {}; elseif (event == "CHAT_MSG_GUILD") then SW_SyncCheckMsgForChan(arg1,arg2); elseif (event == "CHAT_MSG_OFFICER") then SW_SyncCheckMsgForChan(arg1,arg2); elseif (event == "CHAT_MSG_PARTY") then SW_SyncCheckMsgForChan(arg1,arg2); elseif (event == "CHAT_MSG_RAID") then SW_SyncCheckMsgForChan(arg1,arg2); elseif (event == "CHAT_MSG_RAID_LEADER") then SW_SyncCheckMsgForChan(arg1,arg2); elseif (event == "CHAT_MSG_CHANNEL") then if arg8 == SW_SyncChanID then SW_SyncHandleMsg(arg1, arg2); end --elseif (event == "CHAT_MSG_SAY") then -- SW_SyncCheckMsgForChan(arg1,arg2); elseif (event == "PLAYER_ENTERING_WORLD") then --bar layout needs to go here, only then the "saved (layout-cache.txt)" layout is loaded already SW_BarLayoutRegisterd(); if GetNumRaidMembers() > 0 then SW_Make_Friends("RAID"); elseif GetNumPartyMembers() > 0 then SW_Make_Friends("GROUP"); else SW_Make_Friends(); end SW_UpdateCastByNameLookup(); elseif (event == "UNIT_PET") then --SW_printStr("UNIT_PET "..arg1); SW_UpdatePet(arg1); elseif (event == "PARTY_MEMBERS_CHANGED") or (event == "PARTY_LEADER_CHANGED") then --SW_printStr("PARTY_MEMBERS_CHANGED "); if UnitInRaid("player") then return; end SW_Make_Friends("GROUP"); elseif (event == "RAID_ROSTER_UPDATE") then SW_Make_Friends("RAID"); local sf = getglobal("SW_BarSyncFrame"); if sf:IsVisible() then sf:UpdateARPVis(); end elseif (event == "CHAT_MSG_COMBAT_FRIENDLY_DEATH") then SW_HandleDeath(arg1); elseif (event == "CHAT_MSG_COMBAT_HOSTILE_DEATH") then SW_HandleDeath(arg1); elseif (event == "PLAYER_REGEN_DISABLED") then SW_CombatTimeInfo.awaitingStart = true; elseif (event == "PLAYER_REGEN_ENABLED") then SW_CombatTimeInfo.awaitingStart = false; SW_CombatTimeInfo.awaitingEnd = false; else SW_DoEvent(event); end end if not SW_DEV_INWOW then SW_SL_Add(SW_SL["START"]); SW_CreateRegexFromGlobals(); SW_CreateEventRegexMap(); SW_SL_Finalize(); SW_Test(); end