SpellAlertSCTVersion = "v11100-1"; SpellAlertDEBUG = false; --[[ SpellAlertSCT Author: BarryJ (Eugorym of Perenolde) based on code from Awen Version: 11100-1 Description : This is a modified version of SpellAlert that instead of putting the notification up in it's own frame will send a message to ScrollingCombatText. There are several command line options to set how the text is displayed. /sasct crit [on/off] -- Whether or not the message should be a crit; does nothing if style is set to Message. [Default is Off] /sasct status -- Displays the current configuration options. /sasct style [message/vertical/rainbow/horizontal/angled down] -- Animation Style to use. [Default is Vertical] /sasct targetonly [on/off] -- Whether or not to display messages from the selected target only. [Default is Off] /sasct test -- Send a test message to see how it looks. (Also done automatically after a settings change) /sasct emotes [on/off] -- Whether or not to display emotes along with spells. [Default is On] /sasct targetindicator [string] -- Text to be put before and after the message, if the spell is being cast by your target. [Default is ' *** '] /sasct retarget [on/off] -- Retarget after feign death like old SpellAlert. [Default is On] /sasct bosswarnings [on/off] -- Deep Breath and Living Bomb Warning like old SpellAlert. [Default is On] /sasct toggle [on/off] -- Toggles alerting of spell casting on and off. [Default is On] /sasct color [default/target/warn/emote] [red/green/blue] [0.0 - 1.0] -- Sets the color component of the specified color. /sasct compact [on/off] -- Toggles compacting of messages. [Default is Off] /sasct repeat [number] -- How long in seconds to refrain from repeating the same message [Default is 2] Changes : 11100-1: French compatibilty /sasct repeat command added Default message repeat delay time is now 2 seconds 11000-11: Bug Fix: Correctly displays the status of the BossWarnings Option 11000-10: Added emote color options Added compact option Will no longer print the same message more than once every second 11000-9: Now three different colors, one for regular (default), one for your target (target), and one for boss warnings (warn) Added toggle option Code fixes/optimizations 11000-8: Clean up. Added color to usage/help Added /sasct retarget [on/off] Added /sasct bosswarnings [on/off] 11000-7: Incorporated changes by gygabyte 11000-6: Default style is now Vertical, default Crit state is now Off Added TargetIndicator option Code cleanup (Yippie!) Possible German support Possible Korean support (Note: on curse-gaming there is a Korean Only version of 11000-5.2, more of that translation to come in 11000-7) Less possible, but still possible French support 11000-5.2: Back to one slash command 11000-5.1: Fixed a bug with the /sasct reset from version 11000-5 11000-5: Added the default settings to the help Added a reset configuration command /sasct reset Added emote toggle 11000-4: Message Color is now changeable Added TargetOnly option 11000-3: Cleaned up code some more. Added /sasct command and options for display. Made file a .zip per request. 11000-2: Cleaned up code a bit. 11000-1: Initial Release ]] sasct_color = {r = 1.0, g = 1.00, b = 1.00}; sasct_targetcolor = {r = 1.0, g = 1.00, b = 1.00}; sasct_warncolor = {r = 1.0, g = 0.00, b = 1.00}; sasct_emotecolor = {r = 0.70, g = 0.70, b = 1.00}; -- variables option --[[sasct_heals = 1; sasct_cc = 1; sasct_dispelable = 1; sasct_damage = 1;]] -- Local variables local playerName = nil; local sa_targetName = nil; local sa_targetClass = nil; local sa_targetHostile = nil; local sa_gains = {}; local partyNum = 0; local raidNum = 0; local raidList = {}; local listMessages = {}; function SpellAlertSCT_ShowUsage() local yellow = "|cffffff00"; local white = "|cffffffff"; SpellAlertSCT_print(SASCT_USAGE_HEADER_1..yellow..SpellAlertSCTVersion..white..SASCT_USAGE_HEADER_2); SpellAlertSCT_print(yellow.."/sasct crit [on/off]"..white.." -- "..SASCT_USAGE_CRIT); SpellAlertSCT_print(yellow.."/sasct status"..white.." -- "..SASCT_USAGE_STATUS); SpellAlertSCT_print(yellow.."/sasct style [message/vertical/rainbow/horizontal/angled down]"..white.." -- "..SASCT_USAGE_STYLE); SpellAlertSCT_print(yellow.."/sasct targetonly [on/off]"..white.." -- "..SASCT_USAGE_TARGETONLY); SpellAlertSCT_print(yellow.."/sasct test"..white.." -- "..SASCT_USAGE_TEST); -- SpellAlertSCT_print(yellow.."/sasct red [0.0 - 1.0]"..white.." -- "..SASCT_USAGE_RED); -- SpellAlertSCT_print(yellow.."/sasct green [0.0 - 1.0]"..white.." -- "..SASCT_USAGE_GREEN); -- SpellAlertSCT_print(yellow.."/sasct blue [0.0 - 1.0]"..white.." -- "..SASCT_USAGE_BLUE); SpellAlertSCT_print(yellow.."/sasct emotes [on/off]"..white.." -- "..SASCT_USAGE_EMOTES); SpellAlertSCT_print(yellow.."/sasct color [default/target/warn/emote] [red/green/blue] [0.0 - 1.0] "..white.." -- "..SASCT_USAGE_COLOR); SpellAlertSCT_print(yellow.."/sasct targetindicator [string]"..white.." -- "..SASCT_USAGE_TARGETINDICATOR); SpellAlertSCT_print(yellow.."/sasct retarget [on/off]"..white.." -- "..SASCT_USAGE_RETARGET); SpellAlertSCT_print(yellow.."/sasct bosswarnings [on/off]"..white.." -- "..SASCT_USAGE_BOSSWARNINGS); SpellAlertSCT_print(yellow.."/sasct toggle [on/off]"..white.." -- "..SASCT_USAGE_TOGGLE); SpellAlertSCT_print(yellow.."/sasct compact [on/off]"..white.." -- "..SASCT_USAGE_COMPACT); SpellAlertSCT_print(yellow.."/sasct repeat [number]"..white.." -- "..SASCT_USAGE_REPEAT); end function SpellAlertSCT_alert(mob, spell, msg, msgtype) if (SA_SPELLS_IGNORE[spell]) then return; end msgtodisplay = strsub(msg, 0, strlen(msg) - 1); if (SpellAlertDEBUG and msgtype == "?") then local yellow = "|cffffff00"; local white = "|cffffffff"; SpellAlertSCT_print("Type: "..msgtype.." - Should print '"..yellow..msgtodisplay..white.."'"); end if (SpellAlertSCTDB[playerName].Compact) then if (msgtype == "cast") then msgtodisplay = mob.." > "..spell; elseif (msgtype == "gain") then msgtodisplay = mob.." + "..spell; end end local targetname = UnitName("target"); if (mob == targetname) then SpellAlertSCT_SCTDisplay(msgtodisplay, true, msgtype); else if (not SpellAlertSCTDB[playerName].TargetOnly) then SpellAlertSCT_SCTDisplay(msgtodisplay, false, msgtype); end end end function SpellAlertSCT_SCTDisplay(msg, target, msgtype) if (SpellAlertSCTDB[playerName].Toggle == false) then return; end if (not listMessages[msg]) then listMessages[msg] = GetTime(); SpellAlertSCT_debug("Message: '"..msg.."' was printed for the first time at '"..listMessages[msg].."'"); elseif (GetTime() - listMessages[msg] < SpellAlertSCTDB[playerName].MessageRepeatTime) then SpellAlertSCT_debug("Blocking message '"..msg.."' from repeating. Time difference = "..GetTime() - listMessages[msg]); return; else listMessages[msg] = GetTime(); end local color = sasct_color; if (target) then msg = SpellAlertSCTDB[playerName].TargetIndicator..msg..SpellAlertSCTDB[playerName].TargetIndicator; color = sasct_targetcolor; end if (msgtype == "emote") then color = sasct_emotecolor; end if (SpellAlertSCTDB[playerName].Style == "message") then SCT_Display_Message(msg, color); elseif (SpellAlertSCTDB[playerName].Style == "vertical") then SCT_Display(msg, color, SpellAlertSCTDB[playerName].Crit, "event", 1 ) elseif (SpellAlertSCTDB[playerName].Style == "rainbow") then SCT_Display(msg, color, SpellAlertSCTDB[playerName].Crit, "event", 2 ) elseif (SpellAlertSCTDB[playerName].Style == "horizontal") then SCT_Display(msg, color, SpellAlertSCTDB[playerName].Crit, "event", 3 ) elseif (SpellAlertSCTDB[playerName].Style == "angled down") then SCT_Display(msg, color, SpellAlertSCTDB[playerName].Crit, "event", 4 ) else SCT_Display_Message(msg, color); SpellAlertSCT_print(SASCT_ERRNOSTYLE); end end function SpellAlertSCT_ShowStatus() if ( SpellAlertSCTDB[playerName].Crit ) then SpellAlertSCT_print(SASCT_STATUS_CRIT..SpellAlertSCTDB[playerName].Style..SASCT_STATUS_CRIT_2); else SpellAlertSCT_print(SASCT_STATUS_NONCRIT..SpellAlertSCTDB[playerName].Style..SASCT_STATUS_CRIT_2); end if ( SpellAlertSCTDB[playerName].TargetOnly ) then SpellAlertSCT_print(SASCT_STATUS_TARGETONLY_ON); else SpellAlertSCT_print(SASCT_STATUS_TARGETONLY_OFF); end if ( SpellAlertSCTDB[playerName].Emotes ) then SpellAlertSCT_print(SASCT_STATUS_EMOTES_ON); else SpellAlertSCT_print(SASCT_STATUS_EMOTES_OFF); end if ( SpellAlertSCTDB[playerName].BossWarnings ) then SpellAlertSCT_print(SASCT_STATUS_BOSSWARN_ON); else SpellAlertSCT_print(SASCT_STATUS_BOSSWARN_OFF); end if ( SpellAlertSCTDB[playerName].Compact ) then SpellAlertSCT_print(SASCT_STATUS_COMPACT_ON); else SpellAlertSCT_print(SASCT_STATUS_COMPACT_OFF); end SpellAlertSCT_print(SASCT_STATUS_COLOR..SpellAlertSCTDB[playerName].defaultcolor.red.."/"..SpellAlertSCTDB[playerName].defaultcolor.green.."/"..SpellAlertSCTDB[playerName].defaultcolor.blue..SASCT_STATUS_COLOR_DEFAULT); SpellAlertSCT_print(SASCT_STATUS_COLOR..SpellAlertSCTDB[playerName].targetcolor.red.."/"..SpellAlertSCTDB[playerName].targetcolor.green.."/"..SpellAlertSCTDB[playerName].targetcolor.blue..SASCT_STATUS_COLOR_TARGET); SpellAlertSCT_print(SASCT_STATUS_COLOR..SpellAlertSCTDB[playerName].warncolor.red.."/"..SpellAlertSCTDB[playerName].warncolor.green.."/"..SpellAlertSCTDB[playerName].warncolor.blue..SASCT_STATUS_COLOR_WARN); SpellAlertSCT_print(SASCT_STATUS_COLOR..SpellAlertSCTDB[playerName].emotecolor.red.."/"..SpellAlertSCTDB[playerName].emotecolor.green.."/"..SpellAlertSCTDB[playerName].emotecolor.blue..SASCT_STATUS_COLOR_EMOTE); SpellAlertSCT_print(SASCT_STATUS_REPEAT..SpellAlertSCTDB[playerName].MessageRepeatTime); local ti = SpellAlertSCTDB[playerName].TargetIndicator; if (ti == "") then ti = "(blank)"; end SpellAlertSCT_print(SASCT_STATUS_TARGETINDICATOR..ti); if ( SpellAlertSCTDB[playerName].Toggle ) then SpellAlertSCT_print(SASCT_STATUS_TOGGLE_ON); else SpellAlertSCT_print(SASCT_STATUS_TOGGLE_OFF); end end function SpellAlertSCT_SlashHandler(msg) if ( not msg or strlen(msg) <= 0 ) then SpellAlertSCT_ShowUsage(); return; end local command, params = SpellAlertSCT_NextParameter(string.lower(msg)); if ( command == "crit" ) then if ( not params ) then if (SpellAlertSCTDB[playerName].Crit == true) then SpellAlertSCTDB[playerName].Crit = false; SpellAlertSCT_print(SASCT_OPT_CRIT_OFF); else SpellAlertSCTDB[playerName].Crit = true; SpellAlertSCT_print(SASCT_OPT_CRIT_ON); end else if (params == "on") then SpellAlertSCTDB[playerName].Crit = true; SpellAlertSCT_print(SASCT_OPT_CRIT_ON); else SpellAlertSCTDB[playerName].Crit = false; SpellAlertSCT_print(SASCT_OPT_CRIT_OFF); end end SpellAlertSCT_test(); elseif ( command == "style" ) then if ( not params ) then SpellAlertSCT_print(SASCT_OPT_STYLE_NOSTYLE); else if (params == "message") then SpellAlertSCTDB[playerName].Style = "message"; SpellAlertSCT_print(SASCT_OPT_STYLE_MESSAGE); elseif (params == "vertical") then SpellAlertSCTDB[playerName].Style = "vertical"; SpellAlertSCT_print(SASCT_OPT_STYLE_VERTICAL); elseif (params == "rainbow") then SpellAlertSCTDB[playerName].Style = "rainbow"; SpellAlertSCT_print(SASCT_OPT_STYLE_RAINBOW); elseif (params == "horizontal") then SpellAlertSCTDB[playerName].Style = "horizontal"; SpellAlertSCT_print(SASCT_OPT_STYLE_HORIZONTAL); elseif (params == "angled down") then SpellAlertSCTDB[playerName].Style = "angled down"; SpellAlertSCT_print(SASCT_OPT_STYLE_ANGLEDDOWN); else SpellAlertSCT_print(SASCT_OPT_STYLE_CHOICES); end SpellAlertSCT_test(); end elseif ( command == "targetonly" ) then if ( not params ) then if (SpellAlertSCTDB[playerName].TargetOnly == true) then SpellAlertSCTDB[playerName].TargetOnly = false; SpellAlertSCT_print(SASCT_OPT_TARGETONLY_OFF); else SpellAlertSCTDB[playerName].TargetOnly = true; SpellAlertSCT_print(SASCT_OPT_TARGETONLY_ON); end else if (params == "on") then SpellAlertSCTDB[playerName].TargetOnly = true; SpellAlertSCT_print(SASCT_OPT_TARGETONLY_ON); else SpellAlertSCTDB[playerName].TargetOnly = false; SpellAlertSCT_print(SASCT_OPT_TARGETONLY_OFF); end end elseif ( command == "emotes" ) then if ( not params ) then if (SpellAlertSCTDB[playerName].Emotes == true) then SpellAlertSCTDB[playerName].Emotes = false; SpellAlertSCT_print(SASCT_OPT_EMOTES_OFF); else SpellAlertSCTDB[playerName].Emotes = true; SpellAlertSCT_print(SASCT_OPT_EMOTES_ON); end else if (params == "on") then SpellAlertSCTDB[playerName].Emotes = true; SpellAlertSCT_print(SASCT_OPT_EMOTES_ON); else SpellAlertSCTDB[playerName].Emotes = false; SpellAlertSCT_print(SASCT_OPT_EMOTES_OFF); end end --[[ elseif ( command == "red" ) then if ( not params ) then SpellAlertSCT_print(SASCT_OPT_COLOR_COICES); else if ( tonumber(params) and tonumber(params) <= 1 and tonumber(params) >= 0) then SpellAlertSCTDB[playerName].red = tonumber(params); sasct_color.r = SpellAlertSCTDB[playerName].red; SpellAlertSCT_print(SASCT_OPT_RED_SET..SpellAlertSCTDB[playerName].red..SASCT_OPT_RED_END); SpellAlertSCT_test() else SpellAlertSCT_print(SASCT_OPT_COLOR_COICES); end end elseif ( command == "green" ) then if ( not params ) then SpellAlertSCT_print(SASCT_OPT_COLOR_COICES); else if ( tonumber(params) and tonumber(params) <= 1 and tonumber(params) >= 0) then SpellAlertSCTDB[playerName].green = tonumber(params); sasct_color.g = SpellAlertSCTDB[playerName].green; SpellAlertSCT_print(SASCT_OPT_GREEN_SET..SpellAlertSCTDB[playerName].green..SASCT_OPT_GREEN_END); SpellAlertSCT_test() else SpellAlertSCT_print(SASCT_OPT_COLOR_COICES); end end elseif ( command == "blue" ) then if ( not params ) then SpellAlertSCT_print(SASCT_OPT_COLOR_COICES); else if ( tonumber(params) and tonumber(params) <= 1 and tonumber(params) >= 0) then SpellAlertSCTDB[playerName].blue = tonumber(params); sasct_color.b = SpellAlertSCTDB[playerName].blue; SpellAlertSCT_print(SASCT_OPT_BLUE_SET..SpellAlertSCTDB[playerName].blue..SASCT_OPT_BLUE_END); SpellAlertSCT_test() else SpellAlertSCT_print(SASCT_OPT_COLOR_COICES); end end ]] elseif ( command == "targetindicator" ) then if ( not params ) then SpellAlertSCTDB[playerName].TargetIndicator = ""; SpellAlertSCT_print(SASCT_OPT_TARGETINDICATOR_BLANK); else SpellAlertSCTDB[playerName].TargetIndicator = params; SpellAlertSCT_print(SASCT_OPT_TARGETINDICATOR_SET..SpellAlertSCTDB[playerName].TargetIndicator); end elseif ( command == "retarget" ) then if ( not params ) then if (SpellAlertSCTDB[playerName].Retarget == true) then SpellAlertSCTDB[playerName].Retarget = false; SpellAlertSCT_print(SASCT_OPT_RETARGET_OFF); else SpellAlertSCTDB[playerName].Retarget = true; SpellAlertSCT_print(SASCT_OPT_RETARGET_ON); end else if (params == "on") then SpellAlertSCTDB[playerName].Retarget = true; SpellAlertSCT_print(SASCT_OPT_RETARGET_ON); else SpellAlertSCTDB[playerName].Retarget = false; SpellAlertSCT_print(SASCT_OPT_RETARGET_OFF); end end elseif ( command == "bosswarnings" ) then if ( not params ) then if (SpellAlertSCTDB[playerName].BossWarnings == true) then SpellAlertSCTDB[playerName].BossWarnings = false; SpellAlertSCT_print(SASCT_OPT_BOSSWARNINGS_OFF); else SpellAlertSCTDB[playerName].BossWarnings = true; SpellAlertSCT_print(SASCT_OPT_BOSSWARNINGS_ON); end else if (params == "on") then SpellAlertSCTDB[playerName].BossWarnings = true; SpellAlertSCT_print(SASCT_OPT_BOSSWARNINGS_ON); else SpellAlertSCTDB[playerName].BossWarnings = false; SpellAlertSCT_print(SASCT_OPT_BOSSWARNINGS_OFF); end end elseif ( command == "toggle" ) then if ( not params ) then if (SpellAlertSCTDB[playerName].Toggle == true) then SpellAlertSCTDB[playerName].Toggle = false; SpellAlertSCT_print(SASCT_OPT_TOGGLE_OFF); else SpellAlertSCTDB[playerName].Toggle = true; SpellAlertSCT_print(SASCT_OPT_TOGGLE_ON); end else if (params == "on") then SpellAlertSCTDB[playerName].Toggle = true; SpellAlertSCT_print(SASCT_OPT_TOGGLE_ON); else SpellAlertSCTDB[playerName].Toggle = false; SpellAlertSCT_print(SASCT_OPT_TOGGLE_OFF); end end elseif ( command == "color" ) then if ( not params ) then SpellAlertSCT_print(SASCT_OPT_COLOR_TYPES); else local whichtype; whichtype, params = SpellAlertSCT_NextParameter(params); if (not (whichtype == "default" or whichtype == "target" or whichtype == "warn" or whichtype == "emote")) then SpellAlertSCT_print(SASCT_OPT_COLOR_TYPES); SpellAlertSCT_print("You put: "..whichtype); return; end if ( not params ) then SpellAlertSCT_print(SASCT_OPT_COLOR_COLORS); else local whichcolor; whichcolor, params = SpellAlertSCT_NextParameter(params); if ( tonumber(params) and tonumber(params) <= 1 and tonumber(params) >= 0) then if (not (whichcolor == "red" or whichcolor == "green" or whichcolor == "blue")) then SpellAlertSCT_print(SASCT_OPT_COLOR_COLORS); return; end SpellAlertSCTDB[playerName][whichtype.."color"][whichcolor] = tonumber(params); SpellAlertSCT_print(whichtype.." "..whichcolor.." = "..SpellAlertSCTDB[playerName][whichtype.."color"][whichcolor]); SpellAlertSCT_UpdateColors(); else SpellAlertSCT_print(SASCT_OPT_COLOR_COICES); end end end elseif ( command == "compact" ) then if ( not params ) then if (SpellAlertSCTDB[playerName].Compact == true) then SpellAlertSCTDB[playerName].Compact = false; SpellAlertSCT_print(SASCT_OPT_COMPACT_OFF); else SpellAlertSCTDB[playerName].Compact = true; SpellAlertSCT_print(SASCT_OPT_COMPACT_ON); end else if (params == "on") then SpellAlertSCTDB[playerName].Compact = true; SpellAlertSCT_print(SASCT_OPT_COMPACT_ON); else SpellAlertSCTDB[playerName].Compact = false; SpellAlertSCT_print(SASCT_OPT_COMPACT_OFF); end end elseif ( command == "repeat" ) then if ( not params ) then SpellAlertSCT_print(SASCT_OPT_REPEAT_ERROR); else if ( tonumber(params)) then SpellAlertSCTDB[playerName].MessageRepeatTime = tonumber(params); SpellAlertSCT_print(SASCT_OPT_REPEAT_SET..SpellAlertSCTDB[playerName].MessageRepeatTime); else SpellAlertSCT_print(SASCT_OPT_REPEAT_ERROR); end end elseif ( command == "status" ) then SpellAlertSCT_ShowStatus(); elseif ( command == "reset" ) then SpellAlertSCT_ResetOptions(); SpellAlertSCT_print(SASCT_OPT_RESET); SpellAlertSCT_test(); elseif ( command == "test" ) then SpellAlertSCT_test(); elseif ( command == "resetmessagelist" ) then listMessages = {}; elseif (command == "rl") then ReloadUI(); else SpellAlertSCT_ShowUsage(); end end function SpellAlertSCT_ResetOptions() SpellAlertSCTDB[playerName] = { ["Crit"] = false, ["Style"] = "vertical", ["TargetOnly"] = false, ["TargetIndicator"] = " *** ", -- ["red"] = 1.0, -- ["green"] = 1.0, -- ["blue"] = 1.0, ["Emotes"] = true, ["Retarget"] = true, ["BossWarnings"] = true, ["Toggle"] = true, ["Compact"] = false, ["MessageRepeatTime"] = 2, ["defaultcolor"] = { ["red"] = 1.0, ["green"] = 1.0, ["blue"] = 1.0, }, ["targetcolor"] = { ["red"] = 1.0, ["green"] = 1.0, ["blue"] = 1.0, }, ["warncolor"] = { ["red"] = 1.0, ["green"] = 0.0, ["blue"] = 1.0, }, ["emotecolor"] = { ["red"] = 1.0, ["green"] = 0.0, ["blue"] = 1.0, }, }; SpellAlertSCT_UpdateColors() end function SpellAlertSCT_OnEvent() local mob, spell; if ( event == "VARIABLES_LOADED" ) then this:RegisterEvent("RAID_ROSTER_UPDATE"); this:RegisterEvent("PARTY_MEMBERS_CHANGED"); this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS"); this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF"); this:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF"); this:RegisterEvent("CHAT_MSG_MONSTER_EMOTE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS"); this:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_OTHER"); this:RegisterEvent("PLAYER_LEAVE_COMBAT"); if ( not SpellAlertSCTDB ) then SpellAlertSCTDB = {}; SpellAlertSCT_print("first use!") end if (GetLocale()=="koKR") then playerName = GetCVar("realmName").." 서버의 "..UnitName("player"); else playerName = UnitName("player").." of "..GetCVar("realmName"); end if ( not SpellAlertSCTDB[playerName] ) then SpellAlertSCT_ResetOptions(); if (GetLocale()=="koKR") then SpellAlertSCT_print(playerName.."님의 프로필이 생성되었습니다"); else SpellAlertSCT_print("profile "..playerName.." created!"); end else if ( SpellAlertSCTDB[playerName].Style == nil ) then SpellAlertSCTDB[playerName].Style = "vertical"; end if ( SpellAlertSCTDB[playerName].Crit == nil ) then SpellAlertSCTDB[playerName].Crit = false; end if ( SpellAlertSCTDB[playerName].TargetOnly == nil ) then SpellAlertSCTDB[playerName].TargetOnly = false; end if ( SpellAlertSCTDB[playerName].Emotes == nil ) then SpellAlertSCTDB[playerName].Emotes = true; end if ( SpellAlertSCTDB[playerName].Retarget == nil ) then SpellAlertSCTDB[playerName].Retarget = true; end if ( SpellAlertSCTDB[playerName].BossWarnings == nil ) then SpellAlertSCTDB[playerName].BossWarnings = true; end if ( SpellAlertSCTDB[playerName].TargetIndicator == nil ) then SpellAlertSCTDB[playerName].TargetIndicator = " *** "; end if ( SpellAlertSCTDB[playerName].Toggle == nil ) then SpellAlertSCTDB[playerName].Toggle = true; end if ( SpellAlertSCTDB[playerName].Compact == nil ) then SpellAlertSCTDB[playerName].Compact = false; end if ( SpellAlertSCTDB[playerName].MessageRepeatTime == nil ) then SpellAlertSCTDB[playerName].MessageRepeatTime = 2; end if ( not SpellAlertSCTDB[playerName].defaultcolor) then SpellAlertSCTDB[playerName].defaultcolor = { ["red"] = 1.0, ["green"] = 1.0, ["blue"] = 1.0, }; end if ( not SpellAlertSCTDB[playerName].targetcolor) then SpellAlertSCTDB[playerName].targetcolor = { ["red"] = 1.0, ["green"] = 1.0, ["blue"] = 1.0, }; end if ( not SpellAlertSCTDB[playerName].warncolor) then SpellAlertSCTDB[playerName].warncolor ={ ["red"] = 1.0, ["green"] = 0.0, ["blue"] = 1.0, }; end if ( not SpellAlertSCTDB[playerName].emotecolor) then SpellAlertSCTDB[playerName].emotecolor ={ ["red"] = 0.70, ["green"] = 0.70, ["blue"] = 0.0, }; end SpellAlertSCT_print(playerName..SASCT_PROFILELOADED); end if ( SpellAlertSCTDB[playerName].red) then SpellAlertSCTDB[playerName].defaultcolor.red = SpellAlertSCTDB[playerName].red; SpellAlertSCTDB[playerName].red = nil; end if ( SpellAlertSCTDB[playerName].green) then SpellAlertSCTDB[playerName].defaultcolor.green = SpellAlertSCTDB[playerName].green; SpellAlertSCTDB[playerName].green = nil; end if ( SpellAlertSCTDB[playerName].blue) then SpellAlertSCTDB[playerName].defaultcolor.blue = SpellAlertSCTDB[playerName].blue; SpellAlertSCTDB[playerName].blue = nil; end SpellAlertSCT_UpdateColors(); local yellow = "|cffffff00" local white = "|cffffffff" SpellAlertSCT_print("SpellAlert SCT "..yellow..SpellAlertSCTVersion..white..SASCT_LOADPRINT); elseif (event == "PARTY_MEMBERS_CHANGED") then local num = GetNumPartyMembers(); if ((num ~= partyNum) and (GetNumRaidMembers() == 0)) then partyNum = num; SpellAlertSCT_BuildRaidList(false); end elseif (event == "RAID_ROSTER_UPDATE") then local num = GetNumRaidMembers(); if (num ~= raidNum) then raidNum = num; SpellAlertSCT_BuildRaidList(true); end elseif (event == "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE") then for mob, spell in string.gfind(arg1, SA_PTN_SPELL_BEGIN_CAST) do if (not SpellAlertSCT_isParty(mob)) then SpellAlertSCT_alert(mob, spell, arg1, "cast"); end return; end -- "(.+) begins to perform (.+)." for mob, spell in string.gfind(arg1, SA_PTN_SPELL_BEGIN_PERFORM) do if (not SpellAlertSCT_isParty(mob)) then SpellAlertSCT_alert(mob, spell, arg1, "cast"); end return; end elseif (event == "CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF") then for mob, spell, k in string.gfind(arg1, SA_PTN_SPELL_GAINS_X) do return; end for mob, spell in string.gfind(arg1, SA_PTN_SPELL_BEGIN_CAST) do if (not SpellAlertSCT_isParty(mob)) then SpellAlertSCT_alert(mob, spell, arg1, "cast"); end return; end for mob, spell in string.gfind(arg1, SA_PTN_SPELL_TOTEM) do if (not SpellAlertSCT_isParty(mob)) then SpellAlertSCT_alert(mob, spell, arg1, "cast"); end return; end for mob, spell in string.gfind(arg1, SA_PTN_SPELL_GAINS) do SpellAlertSCT_alert(mob, spell, arg1, "cast"); return; end elseif (event == "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF") then for mob, spell in string.gfind(arg1, SA_PTN_SPELL_BEGIN_CAST) do SpellAlertSCT_alert(mob, spell, arg1, "cast"); return; end elseif (event == "CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS") then for mob, spell, k in string.gfind(arg1, SA_PTN_SPELL_GAINS_X) do return; end for mob, spell in string.gfind(arg1, SA_PTN_SPELL_GAINS) do SpellAlertSCT_alert(mob, spell, arg1, "gain"); return; end elseif (event == "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE") then for mob, spell in string.gfind(arg1, SA_PTN_SPELL_BEGIN_CAST) do SpellAlertSCT_alert(mob, spell, arg1, "cast"); return; end -- "(.+) begins to perform (.+)." for mob, spell in string.gfind(arg1, SA_PTN_SPELL_BEGIN_PERFORM) do SpellAlertSCT_alert(mob, spell, arg1, "cast"); return; end elseif (event == "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS") then for mob, spell, temp in string.gfind(arg1, SA_PTN_SPELL_GAINS_X) do return; end for mob, spell in string.gfind(arg1, SA_PTN_SPELL_GAINS) do if ( (spell == SA_WOTF) or (spell == SA_BERSERKER_RAGE) ) then sa_gains[mob] = {}; sa_gains[mob].spell = spell; sa_gains[mob].time = GetTime(); end SpellAlertSCT_alert(mob, spell, arg1, "gain"); return; end elseif (event == "CHAT_MSG_SPELL_AURA_GONE_OTHER") then for spell, mob in string.gfind(arg1, SA_PTN_SPELL_FADE) do if ( (spell == SA_WOTF) or (spell == SA_BERSERKER_RAGE) ) then local tt = sa_gains[mob]; if (tt) then if (tt.spell == spell) then if (GetTime() - tt.time <= 30) then SpellAlertSCT_alert(mob, spell, arg1, "?"); end end tt[mob] = nil; return; end end end elseif (event == "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE") then if ((arg1 == SA_AFFLICT_LIVINGBOMB) and (SpellAlertSCTDB[playerName].BossWarnings)) then SpellAlertSCT_warn(arg1); end elseif (event == "CHAT_MSG_EMOTE") then if (arg1) then if (SpellAlertSCTDB[playerName].Emotes) then SpellAlertSCT_alert("", "", arg1, "emote"); end end elseif (event == "CHAT_MSG_MONSTER_EMOTE") then local name = arg2; if (not name) then name = "nil"; end if (arg1) then -- Onyxia Deep Breath and emotes if (SpellAlertSCTDB[playerName].BossWarnings and (name == SASCT_ONY) and (arg1 == SA_EMOTE_DEEPBREATH) ) then SpellAlertSCT_warn(name .. SASCT_EMOTESPACE .. arg1); elseif (SpellAlertSCTDB[playerName].Emotes) then SpellAlertSCT_alert(name, arg1, name .. SASCT_EMOTESPACE .. arg1, "emote"); end end elseif (event == "PLAYER_LEAVE_COMBAT") then --listMessages = {}; end end function SpellAlertSCT_OnLoad() if ( not SCT_OnLoad ) then SpellAlertSCT_print(SASCT_NOSCT); return; end this:RegisterEvent("VARIABLES_LOADED"); SlashCmdList["SpellAlertSCTCOMMAND"] = SpellAlertSCT_SlashHandler; SLASH_SpellAlertSCTCOMMAND1 = "/sasct"; SLASH_SpellAlertSCTCOMMAND2 = "/ss"; end function SpellAlertSCT_print(msg) if (DEFAULT_CHAT_FRAME) then DEFAULT_CHAT_FRAME:AddMessage("|cff68ccefSpellAlertSCT:|cffffffff "..msg); end end function SpellAlertSCT_debug(msg) if (SpellAlertDEBUG) then SpellAlertSCT_print(msg); end end function SpellAlertSCT_warn(msg) -- Trying to rely only on SCT -- WarningFrame:AddMessage(msg, sasct_color.r, sasct_color.g, sasct_color.b, 1, 5); if (SpellAlertSCTDB[playerName].Toggle == false) then return; end msg = SpellAlertSCTDB[playerName].TargetIndicator..msg..SpellAlertSCTDB[playerName].TargetIndicator; SCT_Display_Message(msg, sasct_warncolor); end function SpellAlertSCT_isParty(name) --[[ for i = 1, 4, 1 do local partyname = UnitName("party" .. i); if (name == partyname) then return 1; end end return nil;]] return raidList[name]; end function SpellAlertSCT_retarget(spell) if (SpellAlertSCTDB[playerName].Retarget == false) then return; end if (not UnitName("target")) then if (sa_targetName) then if (sa_targetHostile) then SpellAlertSCT_print(SASCT_RETARGET_1..spell..SASCT_RETARGET_2..sa_targetName); TargetLastEnemy(); else SpellAlertSCT_print(SASCT_RETARGET_1..spell..SASCT_RETARGET_2..sa_targetName); TargetByName(sa_targetName); end end end end function SpellAlertSCT_OnUpdate() local targetName = UnitName("target"); if (targetName) then sa_targetClass = UnitClass("target"); sa_targetHostile = UnitIsEnemy("player", "target"); else if (SpellAlertSCTDB[playerName].Retarget == true and sa_targetName and (sa_targetClass == SASCT_HUNTER) and sa_targetHostile ) then TargetLastTarget(); if( UnitHealth("target") == 0 and UnitCanAttack("player", "target") ) then ClearTarget(); SpellAlertSCT_retarget(SASCT_FEIGNDEATH); else ClearTarget(); end end end sa_targetName = targetName; end function SpellAlertSCT_NextParameter(msg) local params = nil; local command = nil; local index = strfind(msg, " "); if ( index ) then command = strsub(msg, 1, index - 1); params = strsub(msg, index + 1); else command = msg; end return command, params; end function SpellAlertSCT_UpdateColors() sasct_color.r = SpellAlertSCTDB[playerName].defaultcolor.red; sasct_color.g = SpellAlertSCTDB[playerName].defaultcolor.green; sasct_color.b = SpellAlertSCTDB[playerName].defaultcolor.blue; sasct_targetcolor.r = SpellAlertSCTDB[playerName].targetcolor.red; sasct_targetcolor.g = SpellAlertSCTDB[playerName].targetcolor.green; sasct_targetcolor.b = SpellAlertSCTDB[playerName].targetcolor.blue; sasct_warncolor.r = SpellAlertSCTDB[playerName].warncolor.red; sasct_warncolor.g = SpellAlertSCTDB[playerName].warncolor.green; sasct_warncolor.b = SpellAlertSCTDB[playerName].warncolor.blue; sasct_emotecolor.r = SpellAlertSCTDB[playerName].emotecolor.red; sasct_emotecolor.g = SpellAlertSCTDB[playerName].emotecolor.green; sasct_emotecolor.b = SpellAlertSCTDB[playerName].emotecolor.blue; end function SpellAlertSCT_BuildRaidList(isRaid) raidList = { }; local max, g, name; if (isRaid) then max = 40; g = "raid"; else max = 4; g = "party"; end for i = 1, max do name = UnitName(g..i); if (name) then raidList[name] = true; end name = UnitName(g.."pet"..i); if (name) then raidList[name] = true; end end end function SpellAlertSCT_test() SpellAlertSCT_alert("Player", "test", playerName..SASCT_ADDONTEST); end