vanilla-wow-addons – Rev 1
?pathlinks?
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