vanilla-wow-addons – Rev 1
?pathlinks?
--[[
Natur EnemyCastBar
Revision History:
-----------------
.
. Deleted the original History to achive some less scrolling! Sorry Limited ;-)
. This mod was mainly coded by "Limited" - I (Naturfreund) added all codes after Limited's version Carnical Enemy Cast Bar 1.5c
.
=================================
Read Changelog.txt for more info!
=================================
]]--
CECB_status_version_txt = "4.4.0";
menuesizex = 500;
mshrinksizex = 260;
menuesizey = 480;
mshrinksizey = 140;
carniactive = true;
mobname = "Mob";
mob = "Mob";
spell = "Cast Bar";
function CEnemyCastBar_DefaultVars()
CEnemyCastBar = { };
CEnemyCastBar.bStatus = true;
CEnemyCastBar.bPvP = true;
CEnemyCastBar.bPvE = true;
CEnemyCastBar.bLocked = true;
CEnemyCastBar.bTimer = true;
CEnemyCastBar.bScale = 1;
CEnemyCastBar.bAlpha = 1;
CEnemyCastBar.bShowafflict = true;
CEnemyCastBar.bTargetM = true;
CEnemyCastBar.bCDown = false;
CEnemyCastBar.bAfflictuni = false;
CEnemyCastBar.bNumBars = 15;
-- new variables for new versions (check onload variables!)
CEnemyCastBar.bParseC = true;
CEnemyCastBar.bGains = true;
CEnemyCastBar.bFlipB = false;
CEnemyCastBar.bSmallTSize = false;
CEnemyCastBar.bFlashit = true;
CEnemyCastBar.bGlobalFrag = true;
CEnemyCastBar.bCDownShort = false;
CEnemyCastBar.bCT_RA_chan = CECB_menue_CTRAnoBC;
CEnemyCastBar.bBCaster = false;
CEnemyCastBar.bSoloD = false;
CEnemyCastBar.bSpace = 20;
CEnemyCastBar.bDRTimer = false;
CEnemyCastBar.bMageC = false;
CEnemyCastBar.bMiniMap = 356;
CEnemyCastBar.bClassDR = false;
CEnemyCastBar.bShowIcon = true;
CEnemyCastBar.bSDoTs = false;
CEnemyCastBar.tDisabledSpells = { };
end
function CEnemyCastBar_RegisterEvents(unregister)
local eventpacket = { "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE", "CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF", "CHAT_MSG_SPELL_FRIENDLYPLAYER_DAMAGE",
"CHAT_MSG_SPELL_FRIENDLYPLAYER_BUFF", "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS", "CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS",
"CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE", "CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_DAMAGE", "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE",
"CHAT_MSG_SPELL_PARTY_DAMAGE", "CHAT_MSG_SPELL_PARTY_BUFF", "CHAT_MSG_SPELL_PERIODIC_PARTY_DAMAGE",
"CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS", "CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE", "CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS",
"CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE", "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF",
"CHAT_MSG_SPELL_BREAK_AURA", "CHAT_MSG_SPELL_AURA_GONE_OTHER", "CHAT_MSG_SPELL_AURA_GONE_SELF",
"CHAT_MSG_MONSTER_YELL", "CHAT_MSG_MONSTER_EMOTE",
"CHAT_MSG_RAID", "CHAT_MSG_PARTY", "CHAT_MSG_CHANNEL", "CHAT_MSG_CHANNEL_NOTICE",
"CHAT_MSG_COMBAT_HOSTILE_DEATH", "CHAT_MSG_COMBAT_FRIENDLY_DEATH", "CHAT_MSG_COMBAT_XP_GAIN",
"PLAYER_REGEN_DISABLED", "CHAT_MSG_SPELL_SELF_DAMAGE", "PLAYER_COMBO_POINTS"};
-- "CHAT_MSG_SPELL_SELF_BUFF", "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS", "CHAT_MSG_COMBAT_SELF_HITS" -- for testing only
local i = 1;
while (eventpacket[i]) do
if (unregister) then
this:UnregisterEvent(eventpacket[i]);
else
this:RegisterEvent(eventpacket[i]);
end
i = i + 1;
end
if (CEnemyCastBar.bStatus and CEnemyCastBar.bDebug) then
i = i - 1;
if (unregister) then
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Debug, |cffff0000"..i.." GameEvents UNRegistered!");
else
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Debug, |cff00ff00"..i.." GameEvents Registered!");
end
end
-- unregister ComboPoint detection for all but rogues
local _, playersclass = UnitClass("player");
if (playersclass ~= "ROGUE") then
this:UnregisterEvent("PLAYER_COMBO_POINTS");
end
end
function CEnemyCastBar_OnLoad()
this:RegisterEvent("PLAYER_LEAVING_WORLD");
this:RegisterEvent("PLAYER_ENTERING_WORLD");
this:RegisterEvent("VARIABLES_LOADED");
SLASH_CARNIVALENEMYCASTBAR1 = "/necb";
SlashCmdList["CARNIVALENEMYCASTBAR"] = function(msg)
CEnemyCastBar_Handler(msg);
end
for i=1, 20 do
local button = getglobal("Carni_ECB_"..i);
local fauxbutton = getglobal("FauxTargetBtn"..i);
button:Hide();
fauxbutton:Hide();
end
if ( not CEnemyCastBar ) then
CEnemyCastBar_DefaultVars();
for i=1, 20 do
local frame = getglobal("Carni_ECB_"..i);
frame:StopMovingOrSizing();
frame:EnableMouse(0);
end
end
end
function CEnemyCastBar_OnEvent(event) --onevent
if (event == "PLAYER_COMBO_POINTS") then
if(CECBownCPsLast and GetComboPoints() < CECBownCPsLast) then
CECBownCPsHit = CECBownCPsLast;
CECBownCPsHitTime = GetTime();
-- check if there was a finishing move right before you lost all CPs (the server might create a difference up to 500ms between those two events!)
--CECBownCPsHitBuffer = {mob, spell, GetTime(), DRTimer }; -- just to understand what 1,2,3,4 stands for; defined in 'control' function (affliction)^
if (CECBownCPsHitBuffer and (CECBownCPsHitTime - CECBownCPsHitBuffer[3]) < 1) then
local CPSpell = CECBownCPsHitBuffer[2];
castime = CEnemyCastBar_Afflictions[CPSpell].t - (CEnemyCastBar_Afflictions[CPSpell].cpinterval * (5 - CECBownCPsHit));
local CPDRTimer = CECBownCPsHitBuffer[4];
if (CPDRTimer == 4 or CPDRTimer == 6) then
castime = castime / (CPDRTimer - 2);
end
CEnemyCastBar_UniqueCheck(CPSpell, castime - (CECBownCPsHitTime - CECBownCPsHitBuffer[3]), CECBownCPsHitBuffer[1], "trueupdate"); --update bar duration
CECBownCPsHitTime = nil; -- spell already updated no need to wait 3 secs for new afflictions
end
end
CECBownCPsLast = GetComboPoints();
CECBownCPsHitBuffer = nil;
elseif (event == "CHAT_MSG_MONSTER_YELL") then
CEnemyCastBar_Yells(arg1, arg2);
elseif (event == "CHAT_MSG_MONSTER_EMOTE") then
CEnemyCastBar_Emotes(arg1, arg2);
elseif (event == "PLAYER_LEAVING_WORLD" and CEnemyCastBar.bStatus) then
CEnemyCastBar_RegisterEvents("unregister");
elseif (event == "PLAYER_ENTERING_WORLD" and CEnemyCastBar.bStatus) then
CEnemyCastBar_RegisterEvents();
if ( not necbdisabledyell and CEnemyCastBar.tDisabledSpells and table.getn(CEnemyCastBar.tDisabledSpells) > 0 ) then
CEnemyCastBar_Handler("disabled");
necbdisabledyell = true;
end
elseif (event == "PLAYER_REGEN_DISABLED") then
CEnemyCastBar_Player_Enter_Combat();
elseif (event == "CHAT_MSG_RAID") then
CEnemyCastBar_Parse_RaidChat(arg1, arg2, "Raid");
elseif (event == "CHAT_MSG_PARTY") then
CEnemyCastBar_Parse_RaidChat(arg1, arg2, "Party");
elseif (event == "CHAT_MSG_CHANNEL") then --channelparser
--CEnemyCastBar_Gfind(arg1); --!
if (arg9 == CEnemyCastBar.bCT_RA_chan and type(arg1) == "string") then
-- converter for 'drunken protection'
local msg = string.gsub(arg1, "%$", "s");
msg = string.gsub(msg, "§", "S");
if ( strsub(msg, strlen(msg)-7) == " ...hic!") then
msg = strsub(msg, 1, strlen(msg)-8);
end
-- converter finished
-- cecb network infos + calls the parse function: CEnemyCastBar_Parse_RaidChat(arg1, arg2, "CT_RA");
if (CEnemyCastBar_Parse_RaidChat(msg, arg2, "CT_RA")) then
if ( ParserCollect[100] ) then
table.remove (ParserCollect, 1);
end
local startpos;
if (string.sub (msg, 1, 11) == ".cecbspell ") then
startpos = 12;
if (numspellcast == 99) then
numspellcast = 0;
numsender = " (|cffffffffS|cffffaaaa):";
elseif (wrongclient) then
numsender = " (|cffccccccC|cffffaaaa):";
elseif (numspellcast > 0 and arg2 ~= UnitName("player")) then
numsender = " (|cffffff00"..numspellcast.."|cffffaaaa):";
else
numsender = ":";
end
elseif (string.sub (msg, 1, 7) == "<CECB> ") then
startpos = 8;
numsender = ":";
else
startpos = 1;
numsender = ":";
end
-- reduce length of line
local i, cropped = 0, "";
CECBParserFauxText:SetText("|cffffaaaa"..arg2..numsender.." |cffcccccc"..string.sub (msg, startpos, string.len (msg)));
while (CECBParserFauxText:GetStringWidth() > 410) do
i = i + 1;
CECBParserFauxText:SetText("|cffffaaaa"..arg2..numsender.." |cffcccccc"..string.sub (msg, startpos, string.len (msg) -i));
end
if (i ~= 0) then
cropped = "|cffffaaaa...";
else
cropped = "";
end
table.insert (ParserCollect, "|cffffaaaa"..arg2..numsender.." |cffcccccc"..string.sub (msg, startpos, string.len (msg) -i)..cropped);
if (CECBParser) then
if (parserline == 0) then
CEnemyCastBar_ParserOnClick();
else
CECBCTRAParserFrameBOTTOMArrowFlash:Show();
CEnemyCastBar_ParserOnClick("up");
end
end
end
end
elseif (event == "CHAT_MSG_CHANNEL_NOTICE") then
if (arg1 == "YOU_LEFT" and arg9 == CEnemyCastBar.bCT_RA_chan) then
CEnemyCastBar.bCT_RA_chan = CECB_menue_CTRAnoBC;
if (CECBOptionsFrame:IsVisible()) then
CECB_ReloadOptionsUI();
end
end
elseif ( event == "VARIABLES_LOADED" ) then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00Natur EnemyCastBar |cffcccc00("..CECB_status_version_txt..")|cffffff00:|cffffffff AddOn loaded. Use |cff00ff00/necb|cffffffff to configure.");
if ( not MobTargetName ) then
MobTargetName = { };
end
if ( not VersionDB ) then
VersionDB = { };
VersionNames = { };
end
if ( not ParserCollect ) then
ParserCollect = { };
end
DisabledSpells = { };
-- new variables for new versions
if (CEnemyCastBar.bParseC == nil) then
CEnemyCastBar.bParseC = true;
end
if (CEnemyCastBar.bGains == nil) then
CEnemyCastBar.bGains = true;
end
if (CEnemyCastBar.bFlashit == nil) then
CEnemyCastBar.bFlashit = true;
end
if (CEnemyCastBar.bGlobalFrag == nil) then
CEnemyCastBar.bGlobalFrag = true;
end
if (CEnemyCastBar.bCT_RA_chan == nil) then
CEnemyCastBar.bCT_RA_chan = CECB_menue_CTRAnoBC;
end
if (CEnemyCastBar.bSpace == nil) then
CEnemyCastBar.bSpace = 20;
end
if (CEnemyCastBar.bMiniMap == nil) then
CEnemyCastBar.bMiniMap = 360;
end
if (CEnemyCastBar.bShowIcon == nil) then
CEnemyCastBar.bShowIcon = true;
end
if ( CEnemyCastBar.tDisabledSpells and table.getn(CEnemyCastBar.tDisabledSpells) > 0 ) then
CEnemyCastBar_LoadDisabledSpells("mute");
else
CEnemyCastBar.tDisabledSpells = { };
end
CECBOptionsFrame:SetHeight(menuesizey); -- set optionframe size, not needed atm
CECBOptionsFrame:SetWidth(menuesizex);
CEnemyCastBar.bLocked = true; -- remove if lock-option is inserted again
CEnemyCastBar.bDebug = false; -- same here
CEnemyCastBar_FlipBars();
CEnemyCastBar_SetTextSize();
CECBownCPsHit = 5; -- Set Combopoints to max for all classes, RogueClass will fire an event to change this dynamically
-- setpos of Minimap button
if (CEnemyCastBar.bMiniMap == 0) then
CECBMiniMapButton:Hide();
else
CECBMiniMapButton:SetPoint("TOPLEFT", "Minimap", "TOPLEFT", 52 - (80 * cos(CEnemyCastBar.bMiniMap)), (80 * sin(CEnemyCastBar.bMiniMap)) - 52);
CECBMiniMapButton:Show();
end
-- variables for the ctra channel parser
numspellcast = 0; parserline = 0;
for i=1, 86 do
table.insert (ParserCollect, "|cffcccccc- |cff666666"..i.."|cffcccccc -");
end
table.insert (ParserCollect, " ");
table.insert (ParserCollect, "|r==================================");
table.insert (ParserCollect, "|cffffff00Welcome to the NECB CTRA Channel Parser!");
table.insert (ParserCollect, "This parser displays all NECB commands/broadcasts received by your client.");
table.insert (ParserCollect, " ");
table.insert (ParserCollect, "It follows this pattern:");
table.insert (ParserCollect, "|cffffaaaaBroadcaster: |cffccccccDetected CTRA Message [, ClientLanguage, Latency]|cffffff00");
table.insert (ParserCollect, "|cffffaaaa(|cffffffffS|cffffaaaa)|cffffff00 = Sender who triggered a castbar for you. |cffffaaaa(|cffccccccC|cffffaaaa)|cffffff00 = Wrong client!");
table.insert (ParserCollect, "|cffffaaaa(|cffffff00n|cffffaaaa)|cffffff00 = n useless broadcasts of this spell event.|cffffff00");
table.insert (ParserCollect, " ");
table.insert (ParserCollect, "100 lines are buffered. Use up/down at topright to scroll the lines.");
table.insert (ParserCollect, "I tried to make it work like the default chatframe :D");
table.insert (ParserCollect, "|r==================================");
table.insert (ParserCollect, " ");
-- ctra parser finished
-- set frames to be hidden if addon disabled
OptionFrameNames = { CECBOptionsFrameCECB_pvp_check, CECBOptionsFrameCECB_cdown_check, CECBOptionsFrameCECB_cdownshort_check,
CECBOptionsFrameCECB_gains_check, CECBOptionsFrameCECB_pve_check, CECBOptionsFrameCECB_afflict_check,
CECBOptionsFrameCECB_globalfrag_check, CECBOptionsFrameCECB_magecold_check, CECBOptionsFrameCECB_solod_check,
CECBOptionsFrameCECB_drtimer_check, CECBOptionsFrameCECB_classdr_check, CECBOptionsFrameCECB_sdots_check,
CECBOptionsFrameCECB_affuni_check,
CECBOptionsFrameCECB_timer_check, CECBOptionsFrameCECB_targetM_check, CECBOptionsFrameCECB_parseC_check,
CECBOptionsFrameCECB_broadcast_check, CECBOptionsFrameBGFrameNet, CECBOptionsFrameCTRAChan,
CECBOptionsFrameCECB_flipb_check, CECBOptionsFrameCECB_tsize_check, CECBOptionsFrameCECB_flashit_check,
CECBOptionsFrameCECB_showicon_check,
CECBOptionsFrameCECB_scale_Slider, CECBOptionsFrameCECB_alpha_Slider, CECBOptionsFrameCECB_numbars_Slider,
CECBOptionsFrameCECB_space_Slider, CECBOptionsFrameCECB_MiniMap_Slider,
CECBOptionsFrameBGFrame2, CECBOptionsFrameBGFrame3,
CECBOptionsFrameMoveBar, CECBOptionsFrameBGFrameFPSBar, CECBOptionsFrameBGFrameFPSBar_check };
else
CEnemyCastBar_Gfind(arg1, event);
end
end
function CEnemyCastBar_ParserOnClick(msg)
if (msg) then
if ((msg == "down" or msg == -1) and parserline < 0) then
parserline = parserline + 1;
elseif ((msg == "up" or msg == 1) and parserline > -80) then
parserline = parserline - 1;
elseif (msg == 0) then
parserline = 0;
CECBCTRAParserFrameUPArrow:Enable();
end
if (parserline == -80) then
CECBCTRAParserFrameUPArrow:Disable();
elseif (parserline == 0) then
CECBCTRAParserFrameDOWNArrow:Disable();
CECBCTRAParserFrameBOTTOMArrow:Disable();
CECBCTRAParserFrameBOTTOMArrowFlash:Hide();
else
CECBCTRAParserFrameUPArrow:Enable();
CECBCTRAParserFrameDOWNArrow:Enable();
CECBCTRAParserFrameBOTTOMArrow:Enable();
end
end
CECBCTRAParserFrameLineText:SetText(parserline);
local parserstring = table.concat (ParserCollect, "\n", 81 + parserline, 100 + parserline);
CECBCTRAParserFrameBGText:SetText(parserstring);
end
function CEnemyCastBar_ParserButton_OnUpdate(elapsed)
if (this:GetButtonState() == "PUSHED") then
this.clickDelay = this.clickDelay - elapsed;
if ( this.clickDelay < 0 ) then
local name = this:GetName();
if ( name == this:GetParent():GetName().."DOWNArrow" ) then
CEnemyCastBar_ParserOnClick("down");
elseif ( name == this:GetParent():GetName().."UPArrow" ) then
CEnemyCastBar_ParserOnClick("up");
end
this.clickDelay = MESSAGE_SCROLLBUTTON_SCROLL_DELAY;
end
end
end
function CEnemyCastBar_TargetPlayer(txt)
if (CEnemyCastBar.bTargetM == true) then
TargetByName(MobTargetName[tonumber(txt)]);
--DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Targetting \""..MobTargetName[tonumber(txt)].."\"");
end
end
function CEnemyCastBar_HideBar(num, shiftright) --hide
local button = getglobal("Carni_ECB_"..num);
local fauxbutton = getglobal("FauxTargetBtn"..num);
if (shiftright) then
local spell = button.spell;
local disabled = false;
if (spell ~= "Stun DR" and not string.find(spell, "DR:") ) then
if (CEnemyCastBar_Raids[spell]) then
CEnemyCastBar_Raids[spell].disabled = true;
disabled = true;
end
if (CEnemyCastBar_Spells[spell]) then
CEnemyCastBar_Spells[spell].disabled = true;
disabled = true;
end
if (CEnemyCastBar_Afflictions[spell]) then
CEnemyCastBar_Afflictions[spell].disabled = true;
disabled = true;
end
end
if (disabled) then
table.insert (DisabledSpells, spell);
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Disabled \"|cffffff00"..spell.."|r\" (|cffffff00"..table.getn (DisabledSpells).."|r total) for this session.");
else
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|cffffaaaa Spell not found! |rMaybe it was a CD/DR of some spell?");
end
end
fauxbutton:Hide();
button:Hide();
--DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Deleted \""..button.label.."\"");
button.spell = nil;
button.label = nil;
MobTargetName[num] = "";
mobname = "";
end
function CEnemyCastBar_LockPos() --lockpos
CEnemyCastBar.bLocked = not CEnemyCastBar.bLocked;
if (CEnemyCastBar.bLocked) then
for i=1, 20 do
local frame = getglobal("Carni_ECB_"..i);
local fauxframe = getglobal("FauxTargetBtn"..i);
frame:StopMovingOrSizing();
frame:EnableMouse(0);
fauxframe:EnableMouse(1);
end
else
for i=1, 20 do
local frame = getglobal("Carni_ECB_"..i);
local fauxframe = getglobal("FauxTargetBtn"..i);
frame:EnableMouse(1);
fauxframe:EnableMouse(0);
end
end
end
function CEnemyCastBar_ResetPos() --resetpos
local frame = getglobal("Carni_ECB_1");
local fauxframe = getglobal("FauxTargetBtn1");
frame:Hide();
fauxframe:Hide();
frame:ClearAllPoints();
frame:SetPoint("TOPLEFT", "UIParent", 50, -500);
CEnemyCastBar_FlipBars();
end
function CEnemyCastBar_FlipBars() --flipbars; sets the SPACE and ICONSIZE, too!
for i=2, 21 do
local o = i - 1;
if (i <= 20) then
local frame = getglobal("Carni_ECB_"..i);
local fauxframe = getglobal("FauxTargetBtn"..i);
if (CEnemyCastBar.bFlipB) then
frame:SetPoint("TOPLEFT", "Carni_ECB_"..o, "TOPLEFT", 0, -CEnemyCastBar.bSpace);
else
frame:SetPoint("TOPLEFT", "Carni_ECB_"..o, "TOPLEFT", 0, CEnemyCastBar.bSpace);
end
end
local buttonicon = getglobal("Carni_ECB_"..o.."_Icon");
buttonicon:SetHeight(CEnemyCastBar.bSpace);
buttonicon:SetWidth(CEnemyCastBar.bSpace);
buttonicon:SetPoint("LEFT", "Carni_ECB_"..o, "LEFT", -CEnemyCastBar.bSpace + 4, 5);
end
end
function CEnemyCastBar_SetTextSize() --settextsize and ICONSIZE
for i=1, 20 do
local buttontext = getglobal("Carni_ECB_"..i.."_Text");
local buttonttext = getglobal("Carni_ECB_"..i.."_CastTimeText");
if (CEnemyCastBar.bSmallTSize) then
buttontext:SetFontObject(GameFontHighlightSmall);
buttonttext:SetFontObject(GameFontHighlightSmall);
else
buttontext:SetFontObject(GameFontHighlight);
buttonttext:SetFontObject(GameFontHighlight);
end
end
end
function CEnemyCastBar_Boolean(var)
if (var) then
return "on";
else
return "off";
end
end
function CEnemyCastBar_Handler(msg) --Handler
if (msg == "help") then
DEFAULT_CHAT_FRAME:AddMessage(" ")
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00Natur EnemyCastBar |cffcccc00("..CECB_status_version_txt..")|cffffff00:|cffff0000 /necb help")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb |cffffffff- Toggles the options window.")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb clear |cffffffff- Removes all castbars from screen")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb gcinfo |cffffffffDisplay memory usage of all addons")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb countsec sss label |cffffffff- Starts a countdown of sss seconds")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb countmin mmm label |cffffffff- Starts a countdown of mmm minutes")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb repeat sss label |cffffffff- Repeated countdown of sss seconds")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb stopcount label |cffffffff- Stops all grey CastBars which inherit 'label'")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cffffffffYou may also try |cff00ff00.countsec|cffffffff (s. Options -> Raid/PartyChat!)")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb versions |cffffffff- Displays RaidUsers NECB versions.")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb parser |cffffffff- Opens the NECB - CTRA Channel parser.")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00SHIFT + LeftClick |cffffffffdeletes the bar, |cff00ff00ALT + click |cffffffffdeletes all bars")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00SHIFT + RightClick |cffffffffdisables the spell for the rest of your session!")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb disabled |cfffffffflists disabled spells, |cff00ff00/necb restore |cffffffffrestores spells!")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb load |cffffffffloads disabled spells, |cff00ff00/necb save |cffffffffsaves disabled spells!")
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |cff00ff00/necb remove xyz |cffffffff removes xyz from the list of disabled spells!")
elseif (msg == "" or msg == nil) then
if (CECBOptionsFrame:IsVisible()) then
fademenue = 1;
else
fademenue = 2;
CECBOptionsFrame:SetAlpha(0);
CECB_ShowHideOptionsUI();
end
elseif (msg == "gcinfo") then
if (CECBGCFrame:IsVisible()) then
CECBGCFrame:Hide();
cecbgc_last = nil;
else
CECBGCFrame:Show();
end
elseif (msg == "versions") then
DEFAULT_CHAT_FRAME:AddMessage(" ")
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00Natur EnemyCastBar |cffcccc00("..CECB_status_version_txt..")|cffffff00:|cffff0000 /necb versions")
local VersionDBTemp = { };
if (VersionDB and VersionDB[1]) then
for i=1, table.getn (VersionDB) do
VersionDB[i] = string.gsub (VersionDB[i], "Natur ", "");
table.insert (VersionDBTemp, "|cffaaaaaaNECB: |rVersion |cff00ff00"..VersionDB[i].."|r is used by |cffcccc00"..VersionNames[i].."|r.");
end
table.sort (VersionDBTemp);
local vcounter = 1;
for i=1, table.getn (VersionDBTemp) do
local o = i + 1;
if (VersionDBTemp[o]) then
local _,_,nextversion = string.find (VersionDBTemp[o], "Version (.+) is used")
local _,_,thisversion = string.find (VersionDBTemp[i], "Version (.+) is used")
if (nextversion and thisversion and nextversion == thisversion) then
local _,_,nextname = string.find (VersionDBTemp[o], "is used by (.+).")
table.remove (VersionDBTemp, o);
VersionDBTemp[i] = string.sub (VersionDBTemp[i], 1, string.len( VersionDBTemp[i] ) - 1 ) .. ", " ..nextname ..".";
i = i - 1;
vcounter = vcounter + 1;
else
if (vcounter > 1) then
VersionDBTemp[i] = VersionDBTemp[i] .. " (|cff00ff00" ..vcounter.. "|r Users)";
end
vcounter = 1;
end
else
if (vcounter > 1 and VersionDBTemp[i]) then
VersionDBTemp[i] = VersionDBTemp[i] .. " (|cff00ff00" ..vcounter.. "|r Users)";
end
end
end
for i=table.getn (VersionDBTemp), 1, -1 do
DEFAULT_CHAT_FRAME:AddMessage(VersionDBTemp[i]);
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB: |rIt seems there was |cffff0000no CT_RA Broadcast|r, yet!\n|cffaaaaaaNECB: |rChannelparsing has to be enabled to detect versions.")
end
elseif (msg == "parser") then
if (CECBParser) then
CECBParser = false;
CECBCTRAParserFrame:Hide();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Broadcast Parser |cffff9999disabled")
else
CECBParser = true;
CEnemyCastBar_ParserOnClick(0);
CECBCTRAParserFrame:Show();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Broadcast Parser |cff99ff99temporary enabled")
end
elseif (msg == "clear") then
lockshow = 0;
if (not CEnemyCastBar.bLocked) then
CEnemyCastBar_LockPos();
end
for i=1, 20 do
CEnemyCastBar_HideBar(i);
end
elseif (msg == "restore") then
local i = 1;
while (i <= table.getn (DisabledSpells)) do
local spell = DisabledSpells[i];
if (CEnemyCastBar_Raids[spell]) then
CEnemyCastBar_Raids[spell].disabled = nil;
end
if (CEnemyCastBar_Spells[spell]) then
CEnemyCastBar_Spells[spell].disabled = nil;
end
if (CEnemyCastBar_Afflictions[spell]) then
CEnemyCastBar_Afflictions[spell].disabled = nil;
end
i = i + 1;
end
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Restored (|cffffff00"..table.getn (DisabledSpells).."|r) spells which were disabled by Shift + RightClick");
DisabledSpells = { };
elseif (msg == "disabled") then
local DSpells = table.concat (DisabledSpells, "|cffff0000 | |r");
if (table.getn (DisabledSpells) == 0) then
DSpells = " -.-";
end
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|cffffffff Disabled Spells: |r"..DSpells, 1, 1, 0);
elseif (msg == "save") then
CEnemyCastBar.tDisabledSpells = { };
local i = 1;
while (DisabledSpells[i]) do
table.insert (CEnemyCastBar.tDisabledSpells, DisabledSpells[i]);
i = i + 1;
end
if (table.getn (DisabledSpells) == 0) then
DSpells = "Nothing disabled! |rEmpty table saved.";
else
i = i - 1;
DSpells = i.." |rDisabled Spells saved.";
end
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|cffffff00 "..DSpells);
elseif (msg == "load") then
CEnemyCastBar_LoadDisabledSpells();
elseif (string.sub (msg, 1, 7) == "remove " and CEnemyCastBar.bStatus) then
local msg1 = string.sub (msg, 8, string.len(msg) );
local spellfound = false;
local i = 1;
while (DisabledSpells[i]) do
if (string.lower(DisabledSpells[i]) == string.lower(msg1)) then
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|cffffffff Restored Spell: |r".. table.concat (DisabledSpells, "", i, i), 1, 1, 0);
local spell = DisabledSpells[i];
if (CEnemyCastBar_Raids[spell]) then
CEnemyCastBar_Raids[spell].disabled = nil;
end
if (CEnemyCastBar_Spells[spell]) then
CEnemyCastBar_Spells[spell].disabled = nil;
end
if (CEnemyCastBar_Afflictions[spell]) then
CEnemyCastBar_Afflictions[spell].disabled = nil;
end
table.remove (DisabledSpells, i);
spellfound = true;
break;
end
i = i + 1;
end
if (not spellfound) then
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|cffffaaaa Spell not found!");
end
elseif (string.sub (msg, 1, 9) == "countsec " and CEnemyCastBar.bStatus) then
local msg1 = tonumber (string.sub (msg, 10, 12));
local textlen = string.len (msg);
local textinput = string.sub (msg, 10, textlen);
local firstspace = string.find (textinput, " ");
local msg2;
if (firstspace and textlen >= (firstspace + 10)) then
msg2 = string.sub (msg, firstspace + 10, textlen);
if ((firstspace +8) <= 12) then
msg1 = tonumber (string.sub (msg, 10, firstspace + 8));
end
end
if (msg1) then
if (msg1 < 0) then
DEFAULT_CHAT_FRAME:AddMessage("NECB: |cffff9999Invalid value to start the countdown!")
else
if (msg2 == nil) then msg2 = "Countdown";
end
if ( CEnemyCastBar_UniqueCheck(msg2, msg1, "("..msg1.." Seconds)") == 0 ) then
CEnemyCastBar_Show("("..msg1.." Seconds)", msg2, msg1, "grey", nil, "INV_Misc_Bomb_03.blp");
end
end
end
elseif (string.sub (msg, 1, 9) == "countmin " and CEnemyCastBar.bStatus) then
local msg1 = tonumber (string.sub (msg, 10, 12));
local textlen = string.len (msg);
local textinput = string.sub (msg, 10, textlen);
local firstspace = string.find (textinput, " ");
local msg2;
if (firstspace and textlen >= (firstspace + 10)) then
msg2 = string.sub (msg, firstspace + 10, textlen);
if ((firstspace +8) <= 12) then
msg1 = tonumber (string.sub (msg, 10, firstspace + 8));
end
end
if (msg1) then
if (msg1 * 60 < 0) then
DEFAULT_CHAT_FRAME:AddMessage("NECB: |cffff9999Invalid value to start the countdown!")
else
if (msg2 == nil) then msg2 = "Countdown";
end
if ( CEnemyCastBar_UniqueCheck(msg2, msg1 * 60, "("..msg1.." Minutes)") == 0 ) then
CEnemyCastBar_Show("("..msg1.." Minutes)", msg2, msg1 * 60, "grey", nil, "INV_Misc_Bomb_03.blp");
end
end
end
elseif (string.sub (msg, 1, 7) == "repeat " and CEnemyCastBar.bStatus) then
local msg1 = tonumber (string.sub (msg, 8, 10));
local textlen = string.len (msg);
local textinput = string.sub (msg, 8, textlen);
local firstspace = string.find (textinput, " ");
local msg2;
if (firstspace and textlen >= (firstspace + 8)) then
msg2 = string.sub (msg, firstspace + 8, textlen);
if ((firstspace +6) <= 10) then
msg1 = tonumber (string.sub (msg, 8, firstspace + 6));
end
end
if (msg1) then
if (msg1 < 0) then
DEFAULT_CHAT_FRAME:AddMessage("NECB: |cffff9999Invalid value to start the repeater!")
else
if (msg2 == nil) then msg2 = "Repeater";
else msg2 = "Repeater: "..msg2;
end
if ( CEnemyCastBar_UniqueCheck(msg2, msg1, "("..msg1.." Seconds)") == 0 ) then
CEnemyCastBar_Show("("..msg1.." Seconds)", msg2, msg1, "grey", nil, "INV_Misc_Bomb_04.blp");
end
end
end
elseif (string.sub (msg, 1, 10) == "stopcount " and CEnemyCastBar.bStatus) then
local msg1;
local textlen = string.len (msg);
if (textlen >= 11) then
msg1 = string.sub (msg, 11, textlen);
end
if (msg1) then
if (msg1 == "all") then msg1 = " ";
end
for i=1, CEnemyCastBar.bNumBars do
local label = getglobal("Carni_ECB_"..i).label;
local r,g,b = getglobal("Carni_ECB_"..i.."_StatusBar"):GetStatusBarColor();
if (label) then
if (string.find (label, msg1) and ceil(b*10) == 8) then
CEnemyCastBar_HideBar(i);
end
end
end
end
elseif (msg == "debug") then
if (CEnemyCastBar.bDebug) then
CEnemyCastBar.bDebug = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r DebugMode |cffffff99disabled")
else
CEnemyCastBar.bDebug = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r DebugMode |cffffff99enabled")
end
end
end
-- Options Handler -----------------------
function CEnemyCastBar_Options(msg) --Options
if (msg == "enable") then
CEnemyCastBar.bStatus = true;
CEnemyCastBar_RegisterEvents();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r AddOn |cff99ff99enabled|cffffffff. (Events |cff99ff99registered|cffffffff.)")
elseif (msg == "disable") then
CEnemyCastBar_Handler("clear");
CEnemyCastBar.bStatus = false;
CEnemyCastBar_RegisterEvents("unregister");
TempFPSBar = false; CECB_FPSBarFree:Hide(); CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r AddOn |cffff9999disabled|cffffffff. (Events |cffff9999unregistered|cffffffff.)")
elseif (msg == "lock") then
CEnemyCastBar_LockPos()
elseif (msg == "show") then
CEnemyCastBar_Handler("clear");
if (CEnemyCastBar.bLocked) then
CEnemyCastBar_LockPos();
end
CEnemyCastBar_Show("(unlocked)", "Move this bar!", 15.0, "friendly");
lockshow = 1;
elseif (msg == "reset") then
CEnemyCastBar_Handler("clear");
local lockcheck = CEnemyCastBar.bLocked; -- check if there is a difference after restoring (because of unlocking through "show")
CEnemyCastBar_DefaultVars();
CEnemyCastBar_ResetPos();
CEnemyCastBar_SetTextSize();
CECBOptionsFrameCECB_scale_Slider:SetValue(CEnemyCastBar.bScale); -- set sliders to default
CECBOptionsFrameCECB_alpha_Slider:SetValue(CEnemyCastBar.bAlpha);
if (not lockcheck == CEnemyCastBar.bLocked) then
CEnemyCastBar.bLocked = lockcheck;
CEnemyCastBar_LockPos();
end
if (TempFPSBar) then CEnemyCastBar_Handler("fpsbar");
end
CECB_ReloadOptionsUI();
CECB_FPSBarFree:SetPoint("TOPLEFT", "UIParent", 50, -550);
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r AddOn is now |cff99ff99restored")
elseif (msg == "pvp") then
if (CEnemyCastBar.bPvP) then
CEnemyCastBar.bPvP = false;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CastBars for PvP spells |cffff9999completely disabled")
else
CEnemyCastBar.bPvP = true;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CastBars for PvP spells |cff99ff99enabled")
end
elseif (msg == "cdown") then
if (CEnemyCastBar.bCDown) then
CEnemyCastBar.bCDown = false;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show some CoolDowns |cffff9999disabled")
else
CEnemyCastBar.bCDown = true;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show some CoolDowns |cff99ff99enabled")
end
elseif (msg == "cdownshort") then
if (CEnemyCastBar.bCDownShort) then
CEnemyCastBar.bCDownShort = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Only show short cooldowns |cffff9999disabled")
else
CEnemyCastBar.bCDownShort = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Only show short cooldowns |cff99ff99enabled")
end
elseif (msg == "gains") then
if (CEnemyCastBar.bGains) then
CEnemyCastBar.bGains = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show 'gains' (and their cooldown) |cffff9999disabled")
else
CEnemyCastBar.bGains = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show 'gain type spells' |cff99ff99enabled")
end
elseif (msg == "pve") then
if (CEnemyCastBar.bPvE) then
CEnemyCastBar.bPvE = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CastBars for PvE spells |cffff9999disabled")
else
CEnemyCastBar.bPvE = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CastBars for PvE spells |cff99ff99enabled")
end
elseif (msg == "afflict") then
if (CEnemyCastBar.bShowafflict) then
CEnemyCastBar.bShowafflict = false;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show Debuffs |cffff9999completely disabled")
else
CEnemyCastBar.bShowafflict = true;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show Debuffs |cff99ff99enabled")
end
elseif (msg == "globalfrag") then
if (CEnemyCastBar.bGlobalFrag) then
CEnemyCastBar.bGlobalFrag = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show 'Mob Outs' even w/o target |cffff9999disabled")
else
CEnemyCastBar.bGlobalFrag = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show 'Mob Outs' even w/o target |cff99ff99enabled")
end
elseif (msg == "solod") then
if (CEnemyCastBar.bSoloD) then
CEnemyCastBar.bSoloD = false;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show 'Solo Debuffs' (e.g. most stuns) |cffff9999disabled")
else
CEnemyCastBar.bSoloD = true;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show 'Solo Debuffs' (e.g. most stuns) |cff99ff99enabled")
end
elseif (msg == "magecold") then
if (CEnemyCastBar.bMageC) then
CEnemyCastBar.bMageC = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show 'Mages Cold Effects' (DeBuffs) |cffff9999disabled")
else
CEnemyCastBar.bMageC = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Show 'Mages Cold Effects' (DeBuffs) |cff99ff99enabled")
end
elseif (msg == "drtimer") then
if (CEnemyCastBar.bDRTimer) then
CEnemyCastBar.bDRTimer = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Consider 'Diminishing Return' for biggest stun-family |cffff9999disabled")
else
CEnemyCastBar.bDRTimer = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Consider 'Diminishing Return' for biggest stun-family |cff99ff99enabled")
end
elseif (msg == "classdr") then
if (CEnemyCastBar.bClassDR) then
CEnemyCastBar.bClassDR = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Consider Class specific 'Diminishing Return' |cffff9999disabled")
else
CEnemyCastBar.bClassDR = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Consider Class specific 'Diminishing Return' |cff99ff99enabled")
end
elseif (msg == "sdots") then
if (CEnemyCastBar.bSDoTs) then
CEnemyCastBar.bSDoTs = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CastBars to watch your DoT duration |cffff9999disabled")
else
CEnemyCastBar.bSDoTs = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CastBars to watch your DoT duration |cff99ff99enabled")
end
elseif (msg == "affuni") then
if (CEnemyCastBar.bAfflictuni) then
CEnemyCastBar.bAfflictuni = false;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Only show RaidDebuffs |cffff9999disabled")
else
CEnemyCastBar.bAfflictuni = true;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Only show RaidDebuffs |cff99ff99enabled")
end
elseif (msg == "parsec") then
if (CEnemyCastBar.bParseC) then
CEnemyCastBar.bParseC = false;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Parse Raid/PartyChannel for commands |cffff9999disabled")
else
CEnemyCastBar.bParseC = true;
CECB_ReloadOptionsUI();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Parse Raid/PartyChannel for commands |cff99ff99enabled")
end
elseif (msg == "broadcast") then
if (CEnemyCastBar.bBCaster) then
CEnemyCastBar.bBCaster = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Broadcast Spells through CT_RA channel |cffff9999disabled")
else
CEnemyCastBar.bBCaster = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Broadcast Spells through CT_RA channel |cff99ff99enabled")
end
elseif (msg == "fpsbar") then
if (TempFPSBar) then
TempFPSBar = false;
CECB_FPSBarFree:Hide();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Standalone FPS-Bar |cffff9999disabled")
else
TempFPSBar = true;
CECB_FPSBarFree:Show();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Standalone FPS-Bar |cff99ff99enabled")
end
elseif (msg == "timer") then
if (CEnemyCastBar.bTimer) then
for i=1, 20 do
getglobal("Carni_ECB_"..i.."_CastTimeText"):SetText( );
end
CEnemyCastBar.bTimer = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CastBar time display |cffff9999disabled")
else
CEnemyCastBar.bTimer = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CastBar time display |cff99ff99enabled")
end
elseif (msg == "targetm") then
if (CEnemyCastBar.bTargetM) then
CEnemyCastBar.bTargetM = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Target on BarLeftClick |cffff9999disabled")
else
CEnemyCastBar.bTargetM = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Target on BarLeftClick |cff99ff99enabled")
end
elseif (msg == "tsize") then
if (CEnemyCastBar.bSmallTSize) then
CEnemyCastBar.bSmallTSize = false;
CEnemyCastBar_SetTextSize();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Small textsize of CastBars |cffff9999disabled")
else
CEnemyCastBar.bSmallTSize = true;
CEnemyCastBar_SetTextSize();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Small textsize of CastBars |cff99ff99enabled")
end
elseif (msg == "flipb") then
if (CEnemyCastBar.bFlipB) then
CEnemyCastBar.bFlipB = false;
CEnemyCastBar_FlipBars();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Bars now appear from first bar upwards. 'FlipOver' |cffff9999disabled")
else
CEnemyCastBar.bFlipB = true;
CEnemyCastBar_FlipBars();
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Bars now appear from first bar downwards. 'FlipOver' |cff99ff99enabled")
end
elseif (msg == "flashit") then
if (CEnemyCastBar.bFlashit) then
CEnemyCastBar.bFlashit = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r 'Flash' CastBars at their end |cffff9999disabled")
else
CEnemyCastBar.bFlashit = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r 'Flash' CastBars at their end |cff99ff99enabled")
end
elseif (msg == "showicon") then
if (CEnemyCastBar.bShowIcon) then
CEnemyCastBar.bShowIcon = false;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Display a Spell Icon next to the CastBar |cffff9999disabled")
else
CEnemyCastBar.bShowIcon = true;
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Display a Spell Icon next to the CastBar |cff99ff99enabled")
end
end
end
function CEnemyCastBar_Show(mob, spell, castime, ctype, turnlabel, icontexture) --Show
if (lockshow ~= 1) then
local showing = false;
local i = 1;
local o = CEnemyCastBar.bNumBars;
while (i <= o) do
local button = getglobal("Carni_ECB_"..i);
local fauxbutton = getglobal("FauxTargetBtn"..i);
if (not button:IsVisible()) then
if (showing == false) then
if (ctype == "hostile") then
red = 1.0;
green = 0.0;
blue = 0.0;
elseif (ctype == "friendly") then
red = 0.0;
green = 1.0;
blue = 0.0;
elseif (ctype == "cooldown") then
red = 0.0;
green = 0.0;
blue = 1.0;
elseif (ctype == "gains") then
red = 1.0;
green = 0.0;
blue = 1.0;
elseif (ctype == "grey") then
-- be carefull, those values are checked later to remove those bars - search for "GetStatusBarColor"
red = 0.8;
green = 0.8;
blue = 0.8;
elseif (ctype == "afflict") then
red = 0.8;
green = 0.8;
blue = 0.0;
elseif (ctype == "cursetype") then
red = 0.0;
green = 0.8;
blue = 0.8;
end
getglobal("Carni_ECB_"..i).startTime = GetTime();
if (turnlabel) then
getglobal("Carni_ECB_"..i).label = mob .." - ".. spell;
else
getglobal("Carni_ECB_"..i).label = spell .." - ".. mob;
end
if (mob == UnitName("player")) then
getglobal("Carni_ECB_"..i.."_Text"):SetShadowColor(1,0,0);
else
getglobal("Carni_ECB_"..i.."_Text"):SetShadowColor(0,0,0);
end
if (CEnemyCastBar.bShowIcon and icontexture) then
getglobal("Carni_ECB_"..i.."_Icon"):SetTexture("Interface\\Icons\\"..icontexture);
getglobal("Carni_ECB_"..i.."_Icon"):Show();
else
getglobal("Carni_ECB_"..i.."_Icon"):Hide();
end
getglobal("Carni_ECB_"..i).spell = spell;
getglobal("Carni_ECB_"..i).endTime = getglobal("Carni_ECB_"..i).startTime + castime;
getglobal("Carni_ECB_"..i.."_StatusBar"):SetMinMaxValues(button.startTime,button.endTime);
getglobal("Carni_ECB_"..i.."_StatusBar"):SetValue(button.startTime);
getglobal("Carni_ECB_"..i.."_StatusBar"):SetStatusBarColor(red, green, blue);
fauxbutton:SetScale(CEnemyCastBar.bScale);
fauxbutton:Show();
button:SetAlpha(0);
button:SetScale(CEnemyCastBar.bScale);
button:Show();
MobTargetName[i] = mob;
showing = true;
end
end
i = i + 1;
end
showing = false;
end
end
function CEnemyCastBar_Gfind(arg1, event) --Gfind
if (CEnemyCastBar.bStatus) then
if (arg1) then
for mob, spell in string.gfind(arg1, CEnemyCastBar_SPELL_CAST) do
CEnemyCastBar_Control(mob, spell, "casts", nil, event);
return;
end
for mob, spell in string.gfind(arg1, CEnemyCastBar_SPELL_PERFORM) do
CEnemyCastBar_Control(mob, spell, "performs");
return;
end
for mob in string.gfind(arg1, CEnemyCastBar_MOB_DIES) do
if (mob == CEnemyCastBar_CTHUN_NAME1) then
--CEnemyCastBar_UniqueCheck("Dark Glare (Repeater)", 0, "clears castbar");
CEnemyCastBar_UniqueCheck("Eye Tentacle (Repeater)", 0, "clears castbar");
CEnemyCastBar_Control("C'Thun", "Phase2 Eye Tentacle", "pve");
end
CEnemyCastBar_Control(mob, mob, "died");
return;
end
for mob, spell in string.gfind(arg1, CEnemyCastBar_SPELL_GAINS) do
CEnemyCastBar_Control(mob, spell, "gains", nil, event);
return;
end
-- return if Spell damage from other players/mobs is detected -> german client problem (without it DoTs from everyone will be displayed, see next clause)
if (string.find(arg1, CEnemyCastBar_SPELL_DAMAGE) ) then
return;
end
if ( GetLocale() == "frFR" ) then
for spell, damage, mob in string.gfind(arg1, CEnemyCastBar_SPELL_DAMAGE_SELFOTHER) do
CEnemyCastBar_Control(mob, spell, "periodicdmg");
return;
end
else
-- periodic debuff damage routine for enUS and deDE pattern, No.1
for mob, damage, spell in string.gfind(arg1, CEnemyCastBar_SPELL_DAMAGE_SELFOTHER) do
CEnemyCastBar_Control(mob, spell, "periodicdmg");
return;
end
end
-- periodic debuff damage routine for frFR, enUS and deDE pattern, No.2 - crit! has to be checked first!
for spell, mob, damage in string.gfind(arg1, CEnemyCastBar_SPELL_CRITS_SELFOTHER) do
CEnemyCastBar_Control(mob, spell, "periodichitdmg");
return;
end
-- periodic debuff damage routine for frFR, enUS and deDE pattern, No.3 - noncrit! has to be checked after crit!
for spell, mob, damage in string.gfind(arg1, CEnemyCastBar_SPELL_HITS_SELFOTHER) do
CEnemyCastBar_Control(mob, spell, "periodichitdmg");
return;
end
if ( GetLocale() == "deDE" ) then
for mob, spell in string.gfind(arg1, CEnemyCastBar_SPELL_AFFLICTED) do
CEnemyCastBar_Control(mob, spell, "afflicted", nil, event);
return;
end
for mob, spell in string.gfind(arg1, CEnemyCastBar_SPELL_AFFLICTED2) do
CEnemyCastBar_Control(mob, spell, "afflicted", nil, event);
return;
end
for spell, mob in string.gfind(arg1, CEnemyCastBar_SPELL_REMOVED) do
CEnemyCastBar_Control(mob, spell, "fades");
return;
end
else
for mob, crap, spell in string.gfind(arg1, CEnemyCastBar_SPELL_AFFLICTED) do
CEnemyCastBar_Control(mob, spell, "afflicted", nil, event);
return;
end
for mob, spell in string.gfind(arg1, CEnemyCastBar_SPELL_REMOVED) do
CEnemyCastBar_Control(mob, spell, "fades");
return;
end
end
for spell, mob in string.gfind(arg1, CEnemyCastBar_SPELL_FADE) do
CEnemyCastBar_Control(mob, spell, "fades");
return;
end
for mob, spell in string.gfind(arg1, CEnemyCastBar_SPELL_CASTS) do
CEnemyCastBar_Control(mob, spell, "instcast", nil, event);
return;
end
end
end
end
function CEnemyCastBar_UniqueCheck(spellname, castime, mob, gspell, DRText) --Unique
local ashowing, drstate, labeladd = 0;
if (gspell == "true") then
for i=1, CEnemyCastBar.bNumBars do
local spell = getglobal("Carni_ECB_"..i).spell;
if (spell == spellname and mob == MobTargetName[i]) then
ashowing = 1;
local button = getglobal("Carni_ECB_"..i); --START unique updater
if (mob == UnitName("player")) then
getglobal("Carni_ECB_"..i.."_Text"):SetShadowColor(1,0,0);
else
getglobal("Carni_ECB_"..i.."_Text"):SetShadowColor(0,0,0);
end
break; -- there can be only one :D
end
end
elseif (gspell == "trueupdate") then
for i=1, CEnemyCastBar.bNumBars do
local spell = getglobal("Carni_ECB_"..i).spell;
if (spell == spellname and mob == MobTargetName[i]) then
ashowing = 1;
local button = getglobal("Carni_ECB_"..i); --START unique updater
if (mob == UnitName("player")) then
getglobal("Carni_ECB_"..i.."_Text"):SetShadowColor(1,0,0);
else
getglobal("Carni_ECB_"..i.."_Text"):SetShadowColor(0,0,0);
end
getglobal("Carni_ECB_"..i).startTime = GetTime();
getglobal("Carni_ECB_"..i).endTime = getglobal("Carni_ECB_"..i).startTime + castime;
getglobal("Carni_ECB_"..i.."_StatusBar"):SetMinMaxValues(button.startTime,button.endTime);
getglobal("Carni_ECB_"..i.."_StatusBar"):SetValue(button.startTime);
break; -- there can be only one :D
end
end
else
for i=1, CEnemyCastBar.bNumBars do
local spell = getglobal("Carni_ECB_"..i).spell;
if (spell == spellname) then
ashowing = 1;
local button = getglobal("Carni_ECB_"..i); --START unique updater
if (mob == UnitName("player")) then
getglobal("Carni_ECB_"..i.."_Text"):SetShadowColor(1,0,0);
else
getglobal("Carni_ECB_"..i.."_Text"):SetShadowColor(0,0,0);
end
if (DRText) then
if (string.find(button.label, "1/2")) then
drstate = 4; DRText = "(|cffff00001/4|r)"; castime = castime/2 + 15;
elseif (string.find(button.label, "1/4")) then
drstate = 6; DRText = "(|cffff0000immune|r)"; castime = castime/4 + 15;
elseif (string.find(button.label, "immune")) then
drstate = 2; DRText = "(|cffff00001/2|r)"; castime = castime + 15;
end
getglobal("Carni_ECB_"..i).label = spell .." "..DRText.." - "..mob;
else
getglobal("Carni_ECB_"..i).label = spell .." - ".. mob;
end
getglobal("Carni_ECB_"..i).startTime = GetTime();
getglobal("Carni_ECB_"..i).endTime = getglobal("Carni_ECB_"..i).startTime + castime;
getglobal("Carni_ECB_"..i.."_StatusBar"):SetMinMaxValues(button.startTime,button.endTime);
getglobal("Carni_ECB_"..i.."_StatusBar"):SetValue(button.startTime);
MobTargetName[i] = mob; --END unique updater
break; -- there can be only one :D
end
end
end
return ashowing, drstate;
end
function CEnemyCastBar_BCast_Control(bcasted, channum) --BCast Control
local down, up, latency = GetNetStats();
if (not bcasted and channum ~= 0 and latency < 500 and CEnemyCastBar.bBCaster and CEnemyCastBar.bParseC and GetNumRaidMembers() ~= 0) then
if (LastSentBCPacket) then
if (BCPacket[1] == LastSentBCPacket[1] and BCPacket[2] == LastSentBCPacket[2] and BCPacket[3] == LastSentBCPacket[3] and (GetTime() - LastSentBCPacket[4]) < 5) then
return false, latency;
end
end
return true, latency;
end
return false, latency;
end
function CEnemyCastBar_Control(mob, spell, special, bcasted, event) --Control
if (CEnemyCastBar.bStatus and CEnemyCastBar.bDebug) then
if (event) then
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Debug, Con: "..mob.." (event: "..event..")");
end
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Debug, Con: "..mob.." ("..spell.." "..special..")");
end
-- Convert "You" into Playername, important for broadcasts
if (mob == CECB_SELF1 or mob == CECB_SELF2) then
mob = UnitName("player");
end
local spelllength = string.len (spell);
-- crop the german aposthrophes from some spells (')
local spell_de = string.sub(spell, 2, spelllength - 1);
if (CEnemyCastBar_Raids[spell_de]) then spell = spell_de;
end
-- Network BC TempBCaster
local channum = GetChannelName(CEnemyCastBar.bCT_RA_chan);
local clientlang = GetLocale();
if (special ~= "fades" and CEnemyCastBar_Raids[spell]) then
if (CEnemyCastBar.bPvE) then
-- stop Boss CDs from beeing updated by fault when player enters combat
if (special == "engage") then
if (engagecd and (GetTime() - engagecd) < 180) then
engagecd = GetTime();
return;
end
engagerunning = true;
engagecd = GetTime();
else
if (engagerunning and (GetTime() - engagecd) < 180) then
engagecd = GetTime();
elseif (engagerunning or engagecd) then
engagerunning, engagecd = nil;
end
end
-- only allow instant casts with a flag pass to avoid spell mirroring
if (special == "instcast" and not CEnemyCastBar_Raids[spell].icasted) then
return;
end
-- check if previously disabled with shift + leftclick; +more
if (
(CEnemyCastBar_Raids[spell].disabled)
or (CEnemyCastBar_Raids[spell].checktarget and UnitName("target") ~= mob)
or (CEnemyCastBar_Raids[spell].aZone and GetRealZoneText() ~= CEnemyCastBar_Raids[spell].aZone)
or (CEnemyCastBar_Raids[spell].checkevent and (not event or not string.find(CEnemyCastBar_Raids[spell].checkevent, event) ) )
) then
return;
end
local icontex = CEnemyCastBar_Raids[spell].icontex; -- > get icon texture
local globalspell = CEnemyCastBar_Raids[spell].global; -- > This castbar won't be updated if already active!
castime = CEnemyCastBar_Raids[spell].t;
ctype = CEnemyCastBar_Raids[spell].c;
-- Spell might have the same name but a different cast time on another mob, ie. Onyxia/Nefarian on Bellowing Roar
if (CEnemyCastBar_Raids[spell].r) then
if (mob == CEnemyCastBar_Raids[spell].r) then
castime = CEnemyCastBar_Raids[spell].a;
end
end
if (CEnemyCastBar_Raids[spell].m) then
mobbuffer = mob;
mob = CEnemyCastBar_Raids[spell].m;
end
-- stop mirroring spells! only this mob produces castbars
if (CEnemyCastBar_Raids[spell].mcheck) then
mobcheck = CEnemyCastBar_Raids[spell].mcheck;
else
mobcheck = nil;
end
-- stop mirroring spells! only active casts are allowed
if (CEnemyCastBar_Raids[spell].active and special ~= "casts") then
mobcheck = "xyzdontshowspell";
end
if (mobcheck == nil or mobcheck == mob) then
alreadyshowing = CEnemyCastBar_UniqueCheck(spell,castime,mob,globalspell);
else
alreadyshowing = 1;
end
if (alreadyshowing == 0) then
CEnemyCastBar_Show(mob, spell, castime, ctype, nil, icontex);
end
if (CEnemyCastBar_Raids[spell].i) then
castime = CEnemyCastBar_Raids[spell].i;
--
if (mobcheck == nil or mobcheck == mob) then
alreadyshowing = CEnemyCastBar_UniqueCheck(spell.." (D)",castime,mob,globalspell);
else
alreadyshowing = 1;
end
--
if (alreadyshowing == 0) then
CEnemyCastBar_Show(mob, spell.." (D)", castime, "hostile", nil, icontex);
end
end
-- Network BCasting
if (mobcheck == nil or mobcheck == mob) then
if (special == "afflicted" and mob ~= mobcheck) then
mob = "CECBName"; -- so no channel spam appears after the raid got feared etc.
end
BCPacket = {mob, spell, special};
local freetosend, latency = CEnemyCastBar_BCast_Control(bcasted, channum);
if ( freetosend ) then
CEnemyCastBar_SendMessage(".cecbspell "..mob..", "..spell..", "..special..", "..clientlang..", "..latency);
LastSentBCPacket = {mob, spell, special, GetTime()};
LastGotBCPacket = {mob, spell, special, GetTime()};
numspellcast = 0;
end
end
-- recall control function for mobs dying (Obsidian Destroyer) to clear all bars
if (special == "died") then
if (mobbuffer) then
CEnemyCastBar_Control(mobbuffer, "dummy_xyz", "died");
mobbuffer = nil;
else
CEnemyCastBar_Control(mob, "dummy_xyz", "died");
end
end
end
else
if (CEnemyCastBar.bPvP) then
if (UnitName("target") == mob) then
if (special == "casts" or special == "gains" or special == "performs") then
-- crop the german aposthrophes from some spells (')
local spell_de = string.sub(spell, 2, spelllength - 1);
if (CEnemyCastBar_Spells[spell_de]) then spell = spell_de;
end
if (CEnemyCastBar_Spells[spell]) then
-- check if previously disabled with shift + leftclick
if (CEnemyCastBar_Spells[spell].disabled) then
return;
end
local icontex = CEnemyCastBar_Spells[spell].icontex; -- > get icon texture
if (UnitIsEnemy("player", "target")) then
ctype = "hostile";
else
ctype = "friendly";
end
if (CEnemyCastBar_Spells[spell].i) then
castime = CEnemyCastBar_Spells[spell].i;
CEnemyCastBar_Show(mob, spell, castime, ctype, nil, icontex);
end
if (CEnemyCastBar_Spells[spell].d and CEnemyCastBar.bCDown) then
if (not (special == "gains" and not CEnemyCastBar.bGains)) then
castime = CEnemyCastBar_Spells[spell].d;
if (not (castime > 60 and CEnemyCastBar.bCDownShort) ) then
if (CEnemyCastBar_UniqueCheck(spell.." (CD)", castime, mob, "trueupdate") == 0) then
CEnemyCastBar_Show(mob, spell.." (CD)", castime, "cooldown", nil, icontex);
end
end
end
end
castime = CEnemyCastBar_Spells[spell].t; -- but if only "d=" is applied then "t=nil", so check at end of this block
-- Spell might have the same name but a different cast time on another mob, ie. Death Talon Hatchers/Players on Bellowing Roar
if (CEnemyCastBar_Spells[spell].r) then
if (mob == CEnemyCastBar_Spells[spell].r) then
castime = CEnemyCastBar_Spells[spell].a;
end
end
if (special == "gains") then
if (CEnemyCastBar.bGains) then
ctype = "gains";
if (CEnemyCastBar_Spells[spell].g) then
castime = CEnemyCastBar_Spells[spell].g;
end
else
castime = nil;
end
end
if (CEnemyCastBar_Spells[spell].c) then
ctype = CEnemyCastBar_Spells[spell].c;
end
if (castime) then
CEnemyCastBar_Show(mob, spell, castime, ctype, nil, icontex);
end
end
end
end
end
-- new block
-- other than PvE, independent of PvP
-- now check everytime, since some gains shall be removed, too (see REMOVALS in afflictions section of localization.lua)
if (special == "fades") then -- spells fading earlier than bar, not very important since most spells can't end earlier and aren't listed in c-log after recast and still afflicted
-- crop the german aposthrophes from some spells (')
local spell_de = string.sub(spell, 2, spelllength - 1);
if (CEnemyCastBar_Afflictions[spell_de]) then spell = spell_de;
end
if (CEnemyCastBar_Afflictions[spell]) then
if (CEnemyCastBar_Afflictions[spell].periodicdmg) then
return; -- don't hide dmg debuffs, can be other player's fade!
end
-- correct DR if a DR Spell fades earlier
if (CEnemyCastBar.bClassDR and CEnemyCastBar_Afflictions[spell].spellDR) then
local drshare = CEnemyCastBar_Afflictions[spell].drshare;
if (drshare) then
CEnemyCastBar_UniqueCheck("DR: "..drshare, 15, mob, "trueupdate", "");
else
CEnemyCastBar_UniqueCheck("DR: "..spell, 15, mob, "trueupdate", "");
end
end
for i=1, CEnemyCastBar.bNumBars do
local spellrunning = getglobal("Carni_ECB_"..i).spell;
if (spellrunning) then
local mobrunning = MobTargetName[i];
if (mob == mobrunning and spell == spellrunning and not CEnemyCastBar_Afflictions[spell].multi) then
CEnemyCastBar_HideBar(i);
if (CEnemyCastBar_Afflictions[spell].global or CEnemyCastBar_Afflictions[spell].fragile) then
-- Network BCasting
BCPacket = {mob, spell, special};
local freetosend, latency = CEnemyCastBar_BCast_Control(bcasted, channum);
if ( freetosend ) then
CEnemyCastBar_SendMessage(".cecbspell "..mob..", "..spell..", "..special..", "..clientlang..", "..latency);
LastSentBCPacket = {mob, spell, special, GetTime()};
LastGotBCPacket = {mob, spell, special, GetTime()};
numspellcast = 0;
end
end
break; -- there can be only one :D
end
end
end
end
-- clear on mob died; to save some CPU time breackit it out
elseif (special == "died") then
for i=1, CEnemyCastBar.bNumBars do
local spellrunning = getglobal("Carni_ECB_"..i).spell;
if (spellrunning) then
-- remove DR Timers upon death
if (string.find(spellrunning, "DR:")) then
spellrunning = "Stun DR";
end
local mobrunning = MobTargetName[i];
if (CEnemyCastBar_Afflictions[spellrunning]) then
-- "if" mob can't die without removing the debuff, so this wasn't the 'afflicted' mob
-- "death" negates the above
local fragile = CEnemyCastBar_Afflictions[spellrunning].fragile;
local death = CEnemyCastBar_Afflictions[spellrunning].death;
if (mob == mobrunning and (not fragile or death)) then
CEnemyCastBar_HideBar(i);
if (CEnemyCastBar_Afflictions[spellrunning].global or CEnemyCastBar_Afflictions[spellrunning].fragile) then
-- Network BCasting
BCPacket = {mob, spell, special};
local freetosend, latency = CEnemyCastBar_BCast_Control(bcasted, channum);
if ( freetosend ) then
CEnemyCastBar_SendMessage(".cecbspell "..mob..", "..spell..", "..special..", "..clientlang..", "..latency);
LastSentBCPacket = {mob, spell, special, GetTime()};
LastGotBCPacket = {mob, spell, special, GetTime()};
numspellcast = 0;
end
end
end
-- to clear all but CD bars if mob dies
elseif (CEnemyCastBar_Spells[spellrunning]) then
if (mob == mobrunning and (CEnemyCastBar.bCDownShort or not string.find(getglobal("Carni_ECB_"..i).label, "(CD)") ) ) then
CEnemyCastBar_HideBar(i);
end --
end
end
end
-- other than faded/died
elseif (CEnemyCastBar.bShowafflict) then
-- only 'afflicted', DoTs allowed!
if (special == "afflicted" or (CEnemyCastBar.bSDoTs and (special == "periodicdmg" or special == "periodichitdmg") ) ) then
-- crop the german aposthrophes from some spells (')
local spell_de = string.sub(spell, 2, spelllength - 1);
if (CEnemyCastBar_Afflictions[spell_de]) then spell = spell_de;
end
-- check if spell stacks
local fbracket,_,spellstacks = string.find(spell, "(%(%d+%))" );
if (fbracket) then
spell = string.sub(spell, 1, fbracket - 2);
else
spellstacks = false;
end
-- database check
if (CEnemyCastBar_Afflictions[spell]) then
if (
-- check if previously disabled with shift + leftclick
(CEnemyCastBar_Afflictions[spell].disabled)
-- break if 'mage cold debuff' but disabled
or (CEnemyCastBar_Afflictions[spell].magecold and not CEnemyCastBar.bMageC)
-- periodic dmg spells shall only be triggered if they do damage, otherwise the affliction might be from another player!
or ( (special == "afflicted" and CEnemyCastBar_Afflictions[spell].periodicdmg) or ((special == "periodicdmg" or special == "periodichitdmg") and not CEnemyCastBar_Afflictions[spell].periodicdmg) )
) then
return;
end
alreadyshowing = 0;
local icontex = CEnemyCastBar_Afflictions[spell].icontex; -- > get icon texture
local globalspell = CEnemyCastBar_Afflictions[spell].global; -- > castbars without a target check (Raidencounter)!
local fragile = CEnemyCastBar_Afflictions[spell].fragile; -- > for option to show "fragiles" without a target!
if (UnitName("target") == mob or globalspell or (fragile and CEnemyCastBar.bGlobalFrag) or special == "periodicdmg" or special == "periodichitdmg") then
castime = CEnemyCastBar_Afflictions[spell].t;
-- Consider Combo points for duration; wait 3 secs for 'Rupture's first DoT damage!
if (CEnemyCastBar_Afflictions[spell].cpinterval and CECBownCPsHitTime and (GetTime() - CECBownCPsHitTime) < 3) then
castime = castime - (CEnemyCastBar_Afflictions[spell].cpinterval * (5 - CECBownCPsHit));
--DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Debug, castime="..castime.." -CECBownCPsHit="..CECBownCPsHit.." -cpinterval="..CEnemyCastBar_Afflictions[spell].cpinterval.." -timediff="..GetTime() - CECBownCPsHitTime) --!
end
if (special == "periodicdmg" or special == "periodichitdmg") then
ctype = "cursetype";
else
ctype = "afflict";
end
-- DR START
local DRTimer = 0;
-- subfunction for DR Timer; CASTIME will be modified in Uni function (if DRText transmitted to funcion = last flag and label found -> after ELSE)
local function CEnemyCastBar_DRBar(msg)
if (CEnemyCastBar_UniqueCheck(msg, castime, mob, "true") == 0) then
if (CEnemyCastBar_UniqueCheck(msg, castime, mob) == 0) then
if (msg == "Stun DR") then
CEnemyCastBar_Show(mob, msg, castime, "cooldown", nil, "Spell_Frost_Stun");
else
CEnemyCastBar_Show(mob, msg, castime, "cooldown", nil, icontex);
end
end
CEnemyCastBar_UniqueCheck(msg, 15 + castime, mob, nil, "(|cffff00001/2|r)");
else
_, DRTimer = CEnemyCastBar_UniqueCheck(msg, castime, mob, nil, "trigger label check in uni function");
end
end
-- stun diminishing returns bar
if (not CEnemyCastBar.bAfflictuni and CEnemyCastBar.bDRTimer and mob ~= UnitName("player") and CEnemyCastBar_Afflictions[spell].stun) then
CEnemyCastBar_DRBar("Stun DR");
end
-- pvp diminishing returns bar, CEnemyCastBar.bPvPDR
local _, playersclass = UnitClass("player");
if (CEnemyCastBar.bClassDR and not CEnemyCastBar.bAfflictuni and CEnemyCastBar_Afflictions[spell].spellDR and playersclass == CEnemyCastBar_Afflictions[spell].sclass and (UnitIsPlayer("target") or CEnemyCastBar_Afflictions[spell].affmob) and mob ~= UnitName("player")) then
local drshare = CEnemyCastBar_Afflictions[spell].drshare;
if (drshare) then
CEnemyCastBar_DRBar("DR: "..drshare);
else
CEnemyCastBar_DRBar("DR: "..spell);
end
end
if (DRTimer == 4 or DRTimer == 6) then
castime = castime / (DRTimer - 2);
end
-- DR END
-- break if 'solo spell' but disabled
if (CEnemyCastBar_Afflictions[spell].solo and not CEnemyCastBar.bSoloD) then
return;
end
if (CEnemyCastBar_Afflictions[spell].m) then
mob = CEnemyCastBar_Afflictions[spell].m
end
-- unique check; Raidspells (globalspell) won't be updated; Fragiles will be updated and multiple bars allowed
if (fragile) then
alreadyshowing = CEnemyCastBar_UniqueCheck(spell,castime,mob,"trueupdate");
elseif (spellstacks) then
alreadyshowing = CEnemyCastBar_UniqueCheck(spell,castime,mob,nil,spellstacks);
elseif (special == "periodicdmg" or special == "periodichitdmg") then
if (special == "periodichitdmg" and CEnemyCastBar_Afflictions[spell].directhit) then
alreadyshowing = CEnemyCastBar_UniqueCheck(spell,castime,mob);
castime = castime + 1.0;
else
castime = castime - 1.5;
alreadyshowing = CEnemyCastBar_UniqueCheck(spell,castime,mob,"true");
end
else
alreadyshowing = CEnemyCastBar_UniqueCheck(spell,castime,mob,globalspell);
end
-- to detect if CPs are cleared AFTER a skill has been used, to update with correct duration afterwards if event "PLAYER_COMBO_POINTS" is fired
if (playersclass == "ROGUE" and CEnemyCastBar_Afflictions[spell].cpinterval and not CEnemyCastBar_Afflictions[spell].periodicdmg) then
CECBownCPsHitBuffer = {mob, spell, GetTime(), DRTimer };
end
if (globalspell or fragile) then
-- Network BCasting
BCPacket = {mob, spell, special};
local freetosend, latency = CEnemyCastBar_BCast_Control(bcasted, channum);
if ( freetosend ) then
CEnemyCastBar_SendMessage(".cecbspell "..mob..", "..spell..", "..special..", "..clientlang..", "..latency);
LastSentBCPacket = {mob, spell, special, GetTime()};
LastGotBCPacket = {mob, spell, special, GetTime()};
numspellcast = 0;
end
end
if (alreadyshowing == 0) then
-- Check for non-Raiddebuff and if they are switched off
-- turnaroundlabel through "globalspell" (turnlabel), because the name is more important then
if (not (globalspell ~= "true" and CEnemyCastBar.bAfflictuni) ) then
CEnemyCastBar_Show(mob, spell, castime, ctype, globalspell, icontex);
if (spellstacks) then
CEnemyCastBar_UniqueCheck(spell,castime,mob,nil,spellstacks);
end
end
end
end
end -- is spell in database?
end -- check for afflicted/ DoTs option + periodicdmg
end -- clear on mob fades/dies, elseif check option, afflictions set on?
------ block end (afflictions+)
end -- finishes pve 'else' pvp, died if afflictions/fades
end
function CEnemyCastBar_Yells(arg1, arg2) --Yell
if (CEnemyCastBar.bStatus and CEnemyCastBar.bDebug) then
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Debug, YELL: "..arg1.."\nMOB="..arg2)
end
if (CEnemyCastBar.bStatus) then
if (arg2 == "Nefarian") then
if (string.find(arg1, CEnemyCastBar_NEFARIAN_SHAMAN_CALL)) then
CEnemyCastBar_Control("Shamans", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_DRUID_CALL)) then
CEnemyCastBar_Control("Druids", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_WARLOCK_CALL)) then
CEnemyCastBar_Control("Warlocks", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_PRIEST_CALL)) then
CEnemyCastBar_Control("Priests", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_HUNTER_CALL)) then
CEnemyCastBar_Control("Hunters", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_WARRIOR_CALL)) then
CEnemyCastBar_Control("Warriors", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_ROGUE_CALL)) then
CEnemyCastBar_Control("Rogues", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_PALADIN_CALL)) then
CEnemyCastBar_Control("Paladins", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_MAGE_CALL)) then
CEnemyCastBar_Control("Mages", "Nefarian calls", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_NEFARIAN_LAND)) then
CEnemyCastBar_Control("Nefarian", "Landing", "pve");
return;
end
elseif (arg2 == "Lord Victor Nefarius") then
if (string.find(arg1, CEnemyCastBar_NEFARIAN_STARTING)) then
CEnemyCastBar_Control("Nefarian", "Mob Spawn", "pve");
return;
end
elseif (arg2 == "Ragnaros") then
if (string.find(arg1, CEnemyCastBar_RAGNAROS_STARTING)) then
CEnemyCastBar_Control("Ragnaros", "Submerge", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_RAGNAROS_KICKER)) then
CEnemyCastBar_Control("Ragnaros", "Knockback", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_RAGNAROS_SONS)) then
CEnemyCastBar_Control("Ragnaros", "Sons of Flame", "pve");
return;
end
elseif (arg2 == CEnemyCastBar_RAZORGORE_CALLER) then
if (string.find(arg1, CEnemyCastBar_RAZORGORE_CALL)) then
CEnemyCastBar_Control("Razorgore", "Mob Spawn (45sec)", "pve");
return;
end
elseif (arg2 == CEnemyCastBar_SARTURA_NAME) then
if (string.find(arg1, CEnemyCastBar_SARTURA_CALL)) then
CEnemyCastBar_Control("Sartura", "Enraged mode", "pve");
return;
end
elseif (arg2 == "Hakkar") then
if (string.find(arg1, CEnemyCastBar_HAKKAR_YELL)) then
CEnemyCastBar_Control("Hakkar", "LIFE DRAIN", "pve");
return;
end
end
end
end
function CEnemyCastBar_Emotes(arg1, arg2) --Emote
if (CEnemyCastBar.bStatus) then
if (CEnemyCastBar.bStatus and CEnemyCastBar.bDebug) then
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r Debug, EMOTE: "..arg1.."\nMOB="..arg2)
end
if (arg2 == CEnemyCastBar_FLAMEGOR_NAME) then
if (string.find(arg1, CEnemyCastBar_FLAMEGOR_FRENZY)) then
CEnemyCastBar_Control("Flamegor", "Frenzy (CD)", "pve");
return;
end
elseif (arg2 == "Chromaggus") then
if (string.find(arg1, CEnemyCastBar_CHROMAGGUS_FRENZY)) then
CEnemyCastBar_Control("Chromaggus", "Killing Frenzy", "pve");
return;
end
elseif (arg2 == "Moam") then
if (string.find(arg1, CEnemyCastBar_MOAM_STARTING)) then
CEnemyCastBar_Control("Moam", "Until Stoneform", "pve");
return;
end
elseif (arg2 == CEnemyCastBar_SARTURA_NAME) then
if (string.find(arg1, CEnemyCastBar_SARTURA_CRAZY)) then
CEnemyCastBar_Control("Sartura", "Enraged mode", "fades");
CEnemyCastBar_Control("Sartura", "Enters Enraged mode", "pve");
return;
end
elseif (arg2 == CEnemyCastBar_HUHURAN_NAME) then
if (string.find(arg1, CEnemyCastBar_HUHURAN_FRENZY)) then
CEnemyCastBar_Control("Huhuran", "Frenzy (CD)", "pve");
return;
elseif (string.find(arg1, CEnemyCastBar_HUHURAN_CRAZY)) then
CEnemyCastBar_Control("Huhuran", "Berserk mode", "fades");
CEnemyCastBar_Control("Huhuran", "Enters Berserk mode", "pve");
return;
end
elseif (string.find(CEnemyCastBar_CTHUN_NAME1, arg2) ) then
if (string.find(arg1, CEnemyCastBar_CTHUN_WEAKENED)) then
CEnemyCastBar_UniqueCheck("Eye Tentacle (Repeater)", 0, "clears castbar");
CEnemyCastBar_Control("C'Thun", "Weakened!!!", "pve", "true");
CEnemyCastBar_Control("C'Thun", "Next Eye Tentacle", "pve", "true");
return;
end
end
end
end
function CEnemyCastBar_Player_Enter_Combat() --enter combat (Aggro etc., not only melee autoattack -> "regen. disabled" event)
if (CEnemyCastBar.bStatus) then
if (UnitName("target") == CEnemyCastBar_FIREMAW_NAME or UnitName("target") == CEnemyCastBar_FLAMEGOR_NAME or UnitName("target") == CEnemyCastBar_EBONROC_NAME) then
CEnemyCastBar_Control("Presumed", "First Wingbuffet", "pve");
return;
elseif (UnitName("target") and (string.find (UnitName("target"), "Vek'lor") or string.find (UnitName("target"), "Vek'nilash"))) then
CEnemyCastBar_Control("Twins", "Enraged mode", "engage");
return;
elseif (UnitName("target") and string.find (UnitName("target"), "Huhuran") ) then
CEnemyCastBar_Control("Huhuran", "Berserk mode", "engage");
return;
elseif (UnitName("target") and string.find (UnitName("target"), CEnemyCastBar_CTHUN_NAME1) ) then
CEnemyCastBar_Control("C'Thun", "Eye Tentacle (Repeater)", "engage");
CEnemyCastBar_Control("C'Thun", "First Dark Glare", "engage");
return;
end
end
end
function CEnemyCastBar_Parse_RaidChat(msg, author, origin) --parse Raid/PartyChat for commands
if (CEnemyCastBar.bParseC) then
if (string.sub (msg, 1, 10) == ".countsec " or string.sub (msg, 1, 10) == ".countmin " or string.sub (msg, 1, 8) == ".repeat " or string.sub (msg, 1, 11) == ".stopcount " or string.sub (msg, 1, 11) == ".cecbspell " or string.sub (msg, 1, 30) == "<CECB> CT_RA Channel detected.") then
local detectedCECBcommand = true;
if (origin == "CT_RA") then
-- check if author is in your raidgroup
local name, rank, inraid;
for i = 1, GetNumRaidMembers() do
name, rank = GetRaidRosterInfo(i);
if ( name == author ) then
inraid = true;
break;
end
end
if (not inraid) then return detectedCECBcommand; --!
end --!
end
--Network BC
if (string.sub (msg, 1, 11) == ".cecbspell ") then
wrongclient = false;
if (UnitName("player") == author) then return detectedCECBcommand; --!
end --!
for bcmob, bcspell, bcspecial, bcclientlang, bclatency in string.gfind (msg, ".cecbspell (.+), (.+), (.+), (.+), (.+)") do
if (bcclientlang ~= GetLocale()) then
wrongclient = true;
return detectedCECBcommand;
end
-- Check if last receive was the same packet within 5 seconds -> then break!
if (LastGotBCPacket) then
if (bcmob == LastGotBCPacket[1] and bcspell == LastGotBCPacket[2] and bcspecial == LastGotBCPacket[3] and (GetTime() - LastGotBCPacket[4]) < 5) then
numspellcast = numspellcast + 1;
return detectedCECBcommand;
end
end
--DEFAULT_CHAT_FRAME:AddMessage("m:"..bcmob.." s:"..bcspell.." t:"..bcspecial) --!
numspellcast = 99;
LastGotBCPacket = {bcmob, bcspell, bcspecial, GetTime()};
CEnemyCastBar_Control(bcmob, bcspell, bcspecial, "true");
return detectedCECBcommand; --unnecessary but gives a good feeling :D
end
else
-- version harvester
for version in string.gfind(msg, "<CECB> CT_RA Channel detected. (.+)") do
version = string.sub(version, 2, string.len (version) - 1); -- remove brackets
table.insert (VersionDB, version);
table.insert (VersionNames, author);
end
local msg1 = string.sub (msg, 2, string.len(msg));
CEnemyCastBar_Handler(msg1);
return detectedCECBcommand; --unnecessary but gives a good feeling :D
end
return detectedCECBcommand;
-- check for CT_RaidAssist broadcast
elseif (origin == "Raid") then
for chan in string.gfind(msg, "<CTMod> This is an automatic message sent by CT_RaidAssist. Channel changed to: (.+)") do
CEnemyCastBar.bCT_RA_chan = chan;
if (CECBOptionsFrame:IsVisible()) then
CECB_ReloadOptionsUI();
end
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|r CT_RA Broadcast detected. Channel adopted!", 1, 0.5, 0);
VersionDB = { };
CEnemyCastBar_SendMessage("<CECB> CT_RA Channel detected. ("..CECB_status_version_txt..", "..GetLocale()..")");
end
end
end
end
function CEnemyCastBar_SendMessage(msgs) --send
-- converter for 'drunken protection'
msgs = string.gsub(msgs, "s", "$");
msgs = string.gsub(msgs, "S", "§");
SendChatMessage(msgs, "CHANNEL", nil, GetChannelName(CEnemyCastBar.bCT_RA_chan));
end
function CEnemyCastBar_OnUpdate() --Update
local CECname=this:GetName();
local CECno=this:GetID();
local fauxbtn=getglobal("FauxTargetBtn"..CECno);
if (not carniactive) then
-- Fade the bar out
local alpha = this:GetAlpha() - 0.05;
if (alpha > 0) then
this:SetAlpha(alpha);
end
CEnemyCastBar_HideBar(CECno);
else
if (this.endTime) then
local label = mobname;
local now = GetTime();
-- Update the spark, status bar and label
local remains = this.endTime - now;
--label = label .. CEnemyCastBar_NiceTime(remains);
local sparkPos = ((now - this.startTime) / (this.endTime - this.startTime)) * 195;
getglobal(this:GetName() .. "_StatusBar"):SetValue(now);
getglobal(this:GetName() .. "_Text"):SetText( this.label );
getglobal(this:GetName() .. "_StatusBar_Spark"):SetPoint("CENTER", getglobal(this:GetName() .. "_StatusBar"), "LEFT", sparkPos, 0);
if (CEnemyCastBar.bTimer) then
getglobal(this:GetName() .. "_CastTimeText"):SetText( CEnemyCastBar_NiceTime(remains) );
end
-- fantastic fading routine + flashing, fps independent :D
local framerate = GetFramerate();
local stepping = 2/framerate;
if (stepping > 0.4 ) then stepping = 0.4; -- security for very low fps (< 5fps)
end
local baralpha = this:GetAlpha();
local totalTime = this.endTime - this.startTime;
if (CEnemyCastBar.bFlashit and (remains/totalTime) < 0.20 and remains < 10 and totalTime >= 20) then
stepping2 = stepping/1.2 -- manipulate flashing-speed
if ((baralpha - stepping2) >= 0.1) then
baralpha = baralpha - stepping2;
this:SetAlpha(baralpha);
else
this:SetAlpha(1);
end
else
if (baralpha + stepping <= CEnemyCastBar.bAlpha) then
baralpha = baralpha + stepping;
this:SetAlpha(baralpha);
else
if (baralpha ~= CEnemyCastBar.bAlpha) then
this:SetAlpha(CEnemyCastBar.bAlpha);
end
end
end
-- fading routine finished
if (remains < 0) then
if (string.find (getglobal(this:GetName()).label, "Repeater") ) then
local castime = getglobal(this:GetName()).endTime - getglobal(this:GetName()).startTime;
getglobal(this:GetName()).startTime = GetTime();
getglobal(this:GetName()).endTime = getglobal(this:GetName()).startTime + castime;
getglobal(this:GetName().."_StatusBar"):SetMinMaxValues(getglobal(this:GetName()).startTime,getglobal(this:GetName()).endTime);
getglobal(this:GetName().."_StatusBar"):SetValue(getglobal(this:GetName()).startTime);
if (castime == 0) then
getglobal(this:GetName()).label = "delete me!";
end
else
if (getglobal(this:GetName()).spell == "Move this bar!" and lockshow == 1) then
lockshow = 0;
if (CEnemyCastBar.bLocked == false) then
CEnemyCastBar_LockPos();
end
-- damn C'Thun crazy timers
-- elseif (string.find (getglobal(this:GetName()).label, "First Dark Glare") ) then
-- CEnemyCastBar_Control("C'Thun", "Dark Glare (Repeater)", "pve", "true");
elseif (string.find (getglobal(this:GetName()).label, "Next Eye Tentacle") or string.find (getglobal(this:GetName()).label, "Phase2 Eye Tentacle") ) then
CEnemyCastBar_Control("C'Thun", "Eye Tentacle (Repeater)", "pve", "true");
CEnemyCastBar_UniqueCheck("Eye Tentacle (Repeater)", 30, "C'Thun");
end
CEnemyCastBar_HideBar(CECno);
end
elseif (remains >= 5 ) then
-- pull the bars together
local CECpre = CECno - 1;
local cecbuttonpre = getglobal("Carni_ECB_"..CECpre);
if (CECpre > 0 and not cecbuttonpre:IsShown()) then
cecbuttonpre.startTime = this.startTime
cecbuttonpre.label = this.label;
local r,g,b = getglobal("Carni_ECB_"..CECno.."_Text"):GetShadowColor();
getglobal("Carni_ECB_"..CECpre.."_Text"):SetShadowColor(r,g,b);
if (getglobal("Carni_ECB_"..CECno.."_Icon"):IsShown()) then
getglobal("Carni_ECB_"..CECpre.."_Icon"):SetTexture(getglobal("Carni_ECB_"..CECno.."_Icon"):GetTexture());
getglobal("Carni_ECB_"..CECpre.."_Icon"):Show();
end
cecbuttonpre.spell = this.spell;
cecbuttonpre.endTime = this.endTime;
getglobal("Carni_ECB_"..CECpre.."_StatusBar"):SetMinMaxValues(getglobal("Carni_ECB_"..CECno.."_StatusBar"):GetMinMaxValues());
getglobal("Carni_ECB_"..CECpre.."_StatusBar"):SetValue(getglobal("Carni_ECB_"..CECno.."_StatusBar"):GetValue());
getglobal("Carni_ECB_"..CECpre.."_StatusBar"):SetStatusBarColor(getglobal("Carni_ECB_"..CECno.."_StatusBar"):GetStatusBarColor());
getglobal("FauxTargetBtn"..CECpre):Show();
MobTargetName[CECpre] = MobTargetName[CECno];
cecbuttonpre:SetAlpha(CEnemyCastBar.bAlpha);
cecbuttonpre:Show();
CEnemyCastBar_HideBar(CECno);
end
end
end
end
end
-- Movable window
function CEnemyCastBar_OnDragStart()
CarniEnemyCastBarFrame:StartMoving();
end
function CEnemyCastBar_OnDragStop()
CarniEnemyCastBarFrame:StopMovingOrSizing();
end
-- Format seconds into m:ss
function CEnemyCastBar_NiceTime(secs)
if (secs > 60) then
return string.format("%d:%02d", secs / 60, math.mod(secs, 60));
else
return string.format("%.1f", secs);
end
end
-- Show/hide Options
function CECB_ShowHideOptionsUI()
if (CECBOptionsFrame:IsVisible()) then
CECBOptionsFrame:Hide();
else
CECBOptionsFrame:Show();
if (CEnemyCastBar.bPvP) then
CECB_Checkbox_toggle("cdown", "enable");
CECB_Checkbox_toggle("gains", "enable");
if (CEnemyCastBar.bCDown) then
CECB_Checkbox_toggle("cdownshort", "enable");
else
CECB_Checkbox_toggle("cdownshort", "disable");
end
else
CECB_Checkbox_toggle("cdown", "disable");
CECB_Checkbox_toggle("gains", "disable");
CECB_Checkbox_toggle("cdownshort", "disable");
end
if (CEnemyCastBar.bShowafflict) then
-- + 'solo debuffs' + all DR Checkboxes under 'globalfrag'
CECB_Checkbox_toggle("affuni", "enable");
if (CEnemyCastBar.bAfflictuni) then
CECB_Checkbox_toggle("globalfrag", "disable");
else
CECB_Checkbox_toggle("globalfrag", "enable");
end
else
CECB_Checkbox_toggle("affuni", "disable");
CECB_Checkbox_toggle("globalfrag", "disable");
end
if (CEnemyCastBar.bParseC) then
if (GetChannelName(CEnemyCastBar.bCT_RA_chan) == 0) then
CECB_Checkbox_toggle("broadcast", "disable");
CECBOptionsFrameCTRAChanText:SetText("|cffffcc00"..CECB_menue_CTRAChan.."|cffaaaaaa"..CECB_menue_CTRAnoBC);
else
CECB_Checkbox_toggle("broadcast", "enable");
CECBOptionsFrameCTRAChanText:SetText("|cffffcc00"..CECB_menue_CTRAChan.."|cffffaa00/"..GetChannelName(CEnemyCastBar.bCT_RA_chan).." "..CEnemyCastBar.bCT_RA_chan);
end
else
CECB_Checkbox_toggle("broadcast", "disable");
if (GetChannelName(CEnemyCastBar.bCT_RA_chan) == 0) then
CECBOptionsFrameCTRAChanText:SetText("|cffaaaaaa"..CECB_menue_CTRAChan..CECB_menue_CTRAnoBC);
else
CECBOptionsFrameCTRAChanText:SetText("|cffaaaaaa"..CECB_menue_CTRAChan.."/"..GetChannelName(CEnemyCastBar.bCT_RA_chan).." "..CEnemyCastBar.bCT_RA_chan);
end
end
end
end
function CECB_ReloadOptionsUI()
CECB_ShowHideOptionsUI();
CECB_ShowHideOptionsUI();
end
function CECB_Checkbox_toggle(which, todo) --toggle
if (which == "status") then
if (todo == "enable") then
CECBOptionsFrameCECB_status_check:Enable();
CECBOptionsFrameCECB_status_checkText:SetText(CECB_status_txt);
elseif (CECBOptionsFrameCECB_status_check:IsEnabled() ) then
CECBOptionsFrameCECB_status_check:Disable();
CECBOptionsFrameCECB_status_checkText:SetText("|cffaaaaaa"..CECB_status_txt);
end
elseif (which == "cdown") then
if (todo == "enable") then
CECBOptionsFrameCECB_cdown_check:Enable();
CECBOptionsFrameCECB_cdown_checkText:SetText(CECB_cdown_txt);
else
CECBOptionsFrameCECB_cdown_check:Disable();
CECBOptionsFrameCECB_cdown_checkText:SetText("|cffaaaaaa"..CECB_cdown_txt);
end
elseif (which == "gains") then
if (todo == "enable") then
CECBOptionsFrameCECB_gains_check:Enable();
CECBOptionsFrameCECB_gains_checkText:SetText(CECB_gains_txt);
else
CECBOptionsFrameCECB_gains_check:Disable();
CECBOptionsFrameCECB_gains_checkText:SetText("|cffaaaaaa"..CECB_gains_txt);
end
elseif (which == "affuni") then
if (todo == "enable") then
CECBOptionsFrameCECB_affuni_check:Enable();
CECBOptionsFrameCECB_affuni_checkText:SetText(CECB_affuni_txt);
else
CECBOptionsFrameCECB_affuni_check:Disable();
CECBOptionsFrameCECB_affuni_checkText:SetText("|cffaaaaaa"..CECB_affuni_txt);
end
-- plus 'solo debuffs', plus 'mages cold effects'
elseif (which == "globalfrag") then
if (todo == "enable") then
CECBOptionsFrameCECB_magecold_check:Enable();
CECBOptionsFrameCECB_magecold_checkText:SetText(CECB_magecold_txt);
CECBOptionsFrameCECB_solod_check:Enable();
CECBOptionsFrameCECB_solod_checkText:SetText(CECB_solod_txt);
CECBOptionsFrameCECB_globalfrag_check:Enable();
CECBOptionsFrameCECB_globalfrag_checkText:SetText(CECB_globalfrag_txt);
CECBOptionsFrameCECB_drtimer_check:Enable();
CECBOptionsFrameCECB_drtimer_checkText:SetText(CECB_drtimer_txt);
CECBOptionsFrameCECB_classdr_check:Enable();
CECBOptionsFrameCECB_classdr_checkText:SetText(CECB_classdr_txt);
CECBOptionsFrameCECB_sdots_check:Enable();
CECBOptionsFrameCECB_sdots_checkText:SetText(CECB_sdots_txt);
else
CECBOptionsFrameCECB_magecold_check:Disable();
CECBOptionsFrameCECB_magecold_checkText:SetText("|cffaaaaaa"..CECB_magecold_txt);
CECBOptionsFrameCECB_solod_check:Disable();
CECBOptionsFrameCECB_solod_checkText:SetText("|cffaaaaaa"..CECB_solod_txt);
CECBOptionsFrameCECB_globalfrag_check:Disable();
CECBOptionsFrameCECB_globalfrag_checkText:SetText("|cffaaaaaa"..CECB_globalfrag_txt);
CECBOptionsFrameCECB_drtimer_check:Disable();
CECBOptionsFrameCECB_drtimer_checkText:SetText("|cffaaaaaa"..CECB_drtimer_txt);
CECBOptionsFrameCECB_classdr_check:Disable();
CECBOptionsFrameCECB_classdr_checkText:SetText("|cffaaaaaa"..CECB_classdr_txt);
CECBOptionsFrameCECB_sdots_check:Disable();
CECBOptionsFrameCECB_sdots_checkText:SetText("|cffaaaaaa"..CECB_sdots_txt);
end
elseif (which == "cdownshort") then
if (todo == "enable") then
CECBOptionsFrameCECB_cdownshort_check:Enable();
CECBOptionsFrameCECB_cdownshort_checkText:SetText(CECB_cdownshort_txt);
else
CECBOptionsFrameCECB_cdownshort_check:Disable();
CECBOptionsFrameCECB_cdownshort_checkText:SetText("|cffaaaaaa"..CECB_cdownshort_txt);
end
elseif (which == "broadcast") then
if (todo == "enable") then
CECBOptionsFrameCECB_broadcast_check:Enable();
CECBOptionsFrameCECB_broadcast_checkText:SetText(CECB_broadcast_txt);
else
CECBOptionsFrameCECB_broadcast_check:Disable();
CECBOptionsFrameCECB_broadcast_checkText:SetText("|cffaaaaaa"..CECB_broadcast_txt);
end
end
end
-- Show/hide ApplyReset
function CECB_ApplyResetFrame()
if (CECBApplyResetFrame:IsVisible()) then
CECBApplyResetFrame:Hide();
else
CECBApplyResetFrame:Show();
end
end
function CECB_Options_Sub(todo, value) --options sub
local i = 1;
while (OptionFrameNames[i]) do
if (todo == "alpha") then OptionFrameNames[i]:SetAlpha(value);
elseif (todo == "hide") then OptionFrameNames[i]:Hide();
elseif (todo == "show") then OptionFrameNames[i]:Show();
end
i = i + 1;
end
end
function CEnemyCastBar_Options_OnUpdate() --Menue on update
if (not cecbmaxsize and CECBOptionsFrame:GetHeight() > (menuesizey - 1)) then
bgalpha = 1; CECB_Options_Sub("show");
cecbmaxsize = true; cecbminsize = false;
CECB_Checkbox_toggle("status", "enable");
elseif (not cecbminsize and CECBOptionsFrame:GetHeight() < (mshrinksizey + 1)) then
bgalpha = 0; CECB_Options_Sub("hide");
cecbminsize = true; cecbmaxsize = false;
CECB_Checkbox_toggle("status", "enable");
end
local framerate = GetFramerate();
local stepping = 2/framerate;
if (stepping > 0.4 ) then stepping = 0.4; -- security for very low fps (< 5fps)
end
-- add fps-meter
local g = framerate/30;
local r = 30/framerate;
if (g > 1) then g = 1; end
if (r > 1) then r = 1; end
if (framerate > 100) then frameratesafe = 100;
else frameratesafe = framerate;
end
CECBOptionsFrameBGFrameFPSBar_StatusBar:SetMinMaxValues(1,100);
CECBOptionsFrameBGFrameFPSBar_StatusBar:SetValue(frameratesafe);
CECBOptionsFrameBGFrameFPSBar_StatusBar_Spark:SetPoint("CENTER", "CECBOptionsFrameBGFrameFPSBar_StatusBar", "LEFT", frameratesafe*1.95, 0);
CECBOptionsFrameBGFrameFPSBar_Text:SetText("|cffffffaaFPS: |cffffcc00"..ceil(framerate));
CECBOptionsFrameBGFrameFPSBar_StatusBar:SetStatusBarColor(r,g,0);
-- fps-meter finished
-- now we start
if (fademenue == 1) then
local malpha = CECBOptionsFrame:GetAlpha() - stepping*2;
if (malpha > 0) then
CECBOptionsFrame:SetAlpha(malpha);
else
CECBOptionsFrame:Hide();
fademenue = false;
end
elseif (fademenue == 2) then
local malpha = CECBOptionsFrame:GetAlpha() + stepping*2;
if (malpha < 1) then
CECBOptionsFrame:SetAlpha(malpha);
else
CECBOptionsFrame:SetAlpha(1);
fademenue = false;
end
end
if (not CEnemyCastBar.bStatus) then
if (not cecbminsize) then
local optionsheight = CECBOptionsFrame:GetHeight();
local optionswidth = CECBOptionsFrame:GetWidth();
if ((optionsheight - stepping*150) > (mshrinksizey +1)) then
CECB_Checkbox_toggle("status", "disable");
optionsheight = optionsheight - stepping*150;
CECBOptionsFrame:SetHeight(optionsheight);
if ((optionswidth - stepping*200) > (mshrinksizex +1)) then
optionswidth = optionswidth - stepping*200;
CECBOptionsFrame:SetWidth(optionswidth);
else
CECBOptionsFrame:SetWidth(mshrinksizex);
end
if ((bgalpha - stepping) >= 0) then bgalpha = bgalpha - stepping;
CECB_Options_Sub("alpha", bgalpha);
CECBOptionsFrameBGFrame1:SetBackdropBorderColor(1 - bgalpha, 0, 0);
else
CECB_Options_Sub("alpha", 0);
end
else
CECB_Options_Sub("hide");
CECBOptionsFrame:SetHeight(mshrinksizey);
end
end
elseif (not cecbmaxsize) then
local optionsheight = CECBOptionsFrame:GetHeight();
local optionswidth = CECBOptionsFrame:GetWidth();
CECBOptionsFrameBGFrame1:SetBackdropBorderColor(0.4, 0.4, 0.4);
CECB_Options_Sub("show");
if ((optionsheight + stepping*150) < (menuesizey -1)) then
CECB_Checkbox_toggle("status", "disable");
optionsheight = optionsheight + stepping*150;
CECBOptionsFrame:SetHeight(optionsheight);
if ((optionswidth + stepping*200) < (menuesizex -1)) then
optionswidth = optionswidth + stepping*200;
CECBOptionsFrame:SetWidth(optionswidth);
else
CECBOptionsFrame:SetWidth(menuesizex);
end
if ((bgalpha + stepping) <= 1) then bgalpha = bgalpha + stepping;
CECB_Options_Sub("alpha", bgalpha);
else
CECB_Options_Sub("alpha", 1);
end
else
CECBOptionsFrame:SetHeight(menuesizey);
CECB_Options_Sub("alpha", 1);
end
end
end
function CEnemyCastBar_FPSBar_OnUpdate() --FPSBar
local framerate = GetFramerate();
local g = framerate/30;
local r = 30/framerate;
if (g > 1) then g = 1; end
if (r > 1) then r = 1; end
if (framerate > 100) then frameratesafe = 100;
else frameratesafe = framerate;
end
CECB_FPSBarFree_StatusBar:SetMinMaxValues(1,100);
CECB_FPSBarFree_StatusBar:SetValue(frameratesafe);
CECB_FPSBarFree_StatusBar_Spark:SetPoint("CENTER", "CECB_FPSBarFree_StatusBar", "LEFT", frameratesafe*1.95, 0);
CECB_FPSBarFree_Text:SetText("|cffffffaaFPS: |cffffcc00"..ceil(framerate));
CECB_FPSBarFree_StatusBar:SetStatusBarColor(r,g,0);
end
function CECB_MiniMap_Slider_OnShow()
getglobal(this:GetName().."High"):SetText("360\194\176");
getglobal(this:GetName().."Low"):SetText(CECB_minimapoff_txt);
if (CEnemyCastBar.bMiniMap == 0) then
getglobal(this:GetName() .. "Text"):SetText(CECB_minimap_txt .. CECB_minimapoff_txt);
else
getglobal(this:GetName() .. "Text"):SetText(CECB_minimap_txt .. CEnemyCastBar.bMiniMap .."\194\176");
end
this:SetMinMaxValues(0, 360);
this:SetValueStep(2);
this:SetValue(CEnemyCastBar.bMiniMap);
end
function CECB_MiniMap_Slider_OnValueChanged()
CEnemyCastBar.bMiniMap = this:GetValue();
if (CEnemyCastBar.bMiniMap == 0) then
CECBMiniMapButton:Hide();
getglobal(this:GetName() .. "Text"):SetText(CECB_minimap_txt .. CECB_minimapoff_txt);
else
CECBMiniMapButton:SetPoint("TOPLEFT", "Minimap", "TOPLEFT", 52 - (80 * cos(this:GetValue())), (80 * sin(this:GetValue())) - 52);
CECBMiniMapButton:Show();
getglobal(this:GetName() .. "Text"):SetText(CECB_minimap_txt .. CEnemyCastBar.bMiniMap .."\194\176");
end
end
function CECB_scale_Slider_OnShow()
getglobal(this:GetName().."High"):SetText("130%");
getglobal(this:GetName().."Low"):SetText("30%");
getglobal(this:GetName() .. "Text"):SetText(CECB_scale_txt .. CEnemyCastBar.bScale * 100 .. "%");
this:SetMinMaxValues(0.3, 1.3);
this:SetValueStep(0.1);
this:SetValue(CEnemyCastBar.bScale);
end
function CECB_scale_Slider_OnValueChanged()
local delta = abs(CEnemyCastBar.bScale - this:GetValue()) * 100;
local BarScaleOld = CEnemyCastBar.bScale;
-- DEFAULT_CHAT_FRAME:AddMessage("old: " .. CEnemyCastBar.bScale .. " | new: " .. this:GetValue() .." | delta "..delta)
CEnemyCastBar.bScale = this:GetValue() * 10;
if (CEnemyCastBar.bScale < 0) then
CEnemyCastBar.bScale = ceil(CEnemyCastBar.bScale - 0.5)
else
CEnemyCastBar.bScale = floor(CEnemyCastBar.bScale + 0.5)
end
CEnemyCastBar.bScale = CEnemyCastBar.bScale / 10;
getglobal(this:GetName() .. "Text"):SetText(CECB_scale_txt .. CEnemyCastBar.bScale * 100 .. "%");
if (delta >= 1) then
CEnemyCastBar_Handler("clear");
local BarScaleFactor = BarScaleOld / CEnemyCastBar.bScale;
local frame = getglobal("Carni_ECB_1");
local p, rf, rp, x, y = frame:GetPoint();
--DEFAULT_CHAT_FRAME:AddMessage("p="..p..", rp="..rp..", x="..x..", y="..y);
x = (x + 102.5 - 102.5 * 1/BarScaleFactor)* BarScaleFactor;
y = (y - 10 + 10 * 1/BarScaleFactor) * BarScaleFactor;
frame:SetPoint("TOPLEFT", "UIParent", x, y);
CEnemyCastBar_Show("Info", "New CastBarStyle!", 10.0, "friendly");
end
end
function CECB_alpha_Slider_OnShow()
getglobal(this:GetName().."High"):SetText("1");
getglobal(this:GetName().."Low"):SetText("0.1");
getglobal(this:GetName() .. "Text"):SetText(CECB_alpha_txt .. CEnemyCastBar.bAlpha);
this:SetMinMaxValues(0.1, 1.0);
this:SetValueStep(0.1);
this:SetValue(CEnemyCastBar.bAlpha);
end
function CECB_alpha_Slider_OnValueChanged()
local delta = abs(CEnemyCastBar.bAlpha - this:GetValue()) * 100;
CEnemyCastBar.bAlpha = this:GetValue() * 10;
if (CEnemyCastBar.bAlpha < 0) then
CEnemyCastBar.bAlpha = ceil(CEnemyCastBar.bAlpha - 0.5)
else
CEnemyCastBar.bAlpha = floor(CEnemyCastBar.bAlpha + 0.5)
end
CEnemyCastBar.bAlpha = CEnemyCastBar.bAlpha / 10;
getglobal(this:GetName() .. "Text"):SetText(CECB_alpha_txt .. CEnemyCastBar.bAlpha);
CECB_PrintBar_OnMove(delta);
end
function CECB_numbars_Slider_OnShow()
getglobal(this:GetName().."High"):SetText("20");
getglobal(this:GetName().."Low"):SetText("5");
getglobal(this:GetName() .. "Text"):SetText(CECB_numbars_txt .. CEnemyCastBar.bNumBars);
this:SetMinMaxValues(5, 20);
this:SetValueStep(1);
this:SetValue(CEnemyCastBar.bNumBars);
end
function CECB_numbars_Slider_OnValueChanged()
local delta = abs(CEnemyCastBar.bNumBars - this:GetValue()) * 10;
--DEFAULT_CHAT_FRAME:AddMessage("old: " .. CEnemyCastBar.bNumBars .. " | new: " .. this:GetValue() .." | delta "..delta)
if (delta >= 1) then
CEnemyCastBar_Handler("clear");
CEnemyCastBar.bNumBars = this:GetValue();
getglobal(this:GetName() .. "Text"):SetText(CECB_numbars_txt .. CEnemyCastBar.bNumBars);
for i=1, CEnemyCastBar.bNumBars do
CEnemyCastBar_Show("Info", "CastBarNumbers", 5.0, "friendly");
end
end
end
function CECB_space_Slider_OnShow()
getglobal(this:GetName().."High"):SetText("50");
getglobal(this:GetName().."Low"):SetText("10");
getglobal(this:GetName() .. "Text"):SetText(CECB_space_txt .. CEnemyCastBar.bSpace);
this:SetMinMaxValues(10, 50);
this:SetValueStep(1);
this:SetValue(CEnemyCastBar.bSpace);
end
function CECB_space_Slider_OnValueChanged()
local delta = abs(CEnemyCastBar.bSpace - this:GetValue()) * 10;
if (delta >= 1) then
CEnemyCastBar_Handler("clear");
CEnemyCastBar.bSpace = this:GetValue();
getglobal(this:GetName() .. "Text"):SetText(CECB_space_txt .. CEnemyCastBar.bSpace);
CEnemyCastBar_FlipBars(); -- sets the space, too!
for i=1, CEnemyCastBar.bNumBars do
CEnemyCastBar_Show("Info", "Space between CastBars!", 5.0, "friendly", nil, "Spell_Holy_Renew");
end
end
end
function CECB_PrintBar_OnMove(delta)
if (delta >= 1) then
CEnemyCastBar_Handler("clear");
CEnemyCastBar_Show("Info", "New CastBarStyle!", 10.0, "friendly");
end
end
function CECB_GCInfo_OnUpdate()
local GCTime = GetTime();
if (not lastgcupdate or GCTime - lastgcupdate > 0.5) then
lastgcupdate = GCTime;
local cecbgc_now, cecbgc_max = gcinfo();
if (not cecbgc_last or cecbgc_last > cecbgc_now) then
cecbgc_last = cecbgc_now;
cecbgc_min = cecbgc_now;
cecbgc_minupdate = GCTime;
lastgcdiffupdate = nil;
cecbgc_purge30 = 0;
end
if (not lastgcdiffupdate or GCTime - lastgcdiffupdate > 5) then
lastgcdiffupdate = GCTime;
cecbgcdiff = (cecbgc_now - cecbgc_last) / 5;
cecbgc_last = cecbgc_now;
local GCPurgeCalcLength = 30;
if ((GCTime - cecbgc_minupdate) > GCPurgeCalcLength) then
if (cecbgc_min == cecbgc_now) then
cecbgc_purge30 = 0;
else
cecbgc_purge30 = (cecbgc_max - cecbgc_now) * (GCTime - cecbgc_minupdate) / (cecbgc_now - cecbgc_min);
end
cecbgc_min = cecbgc_now;
cecbgc_minupdate = GCTime;
end
if (cecbgc_min == cecbgc_now and cecbgc_purge30 == 0) then
cecbgcpurge = "waiting...";
else
if (cecbgc_min == cecbgc_now) then
cecbgcpurge = cecbgc_purge30;
else
if (GCTime - cecbgc_minupdate > GCPurgeCalcLength or cecbgc_purge30 == 0) then
cecbgcpurge = (cecbgc_max - cecbgc_now) * (GCTime - cecbgc_minupdate) / (cecbgc_now - cecbgc_min);
else
cecbgcpurge = (cecbgc_purge30 * (GCPurgeCalcLength - (GCTime - cecbgc_minupdate)) / GCPurgeCalcLength) + (cecbgc_max - cecbgc_now) * (GCTime - cecbgc_minupdate) / (cecbgc_now - cecbgc_min) * (GCTime - cecbgc_minupdate) / GCPurgeCalcLength;
end
end
if (cecbgcpurge >= 3600) then
cecbgcpurge = string.format("%d:%02d (|cffffccccHour|r:|cffccffccMin|r)", cecbgcpurge / 3600, math.mod(cecbgcpurge / 60, 60));
elseif (cecbgcpurge >= 60) then
cecbgcpurge = string.format("%d:%02d (|cffccffccMin|r:|cffccccffSec|r)", cecbgcpurge / 60, math.mod(cecbgcpurge, 60));
else
cecbgcpurge = string.format("%d (|cffccccffSeconds|r)", cecbgcpurge);
end
end
end
local gctext1 = "|cffffff00This is a simple tool to observe the memory usage of all your addons!\n\n";
local gctext2 = "|cffcccc00Estimated time until purge: |r"..cecbgcpurge.."\n\n";
local gctext3 = "|cffccccffUsed Memory |r- |cffffccccGainRate |r- |cffccffccMaximum\n";
local gctext4 = "|cff9999ff"..cecbgc_now.."|rkb - |cffff9999"..cecbgcdiff.."|rkb/s - |cff99ff99"..cecbgc_max.."|rkb";
CECBGCFrameBGText:SetText(gctext1..gctext2..gctext3..gctext4, 0.8, 0.8, 0.8);
end
end
function CEnemyCastBar_Validchar(msg) --validchar
value = true;
for i = 1, string.len(msg) do
local ctable = string.byte(string.sub(msg,i,i));
if ( not ( (ctable >= 48 and ctable <= 57) or (ctable >= 65 and ctable <= 90) or (ctable >= 97 and ctable <= 122) ) ) then
value = false;
end
end
return value;
end
function CEnemyCastBar_LoadDisabledSpells(msg) --loaddisabled
DisabledSpells = { };
local i = 1;
while (CEnemyCastBar.tDisabledSpells[i]) do
local spell = CEnemyCastBar.tDisabledSpells[i];
if (CEnemyCastBar_Raids[spell]) then
CEnemyCastBar_Raids[spell].disabled = true;
end
if (CEnemyCastBar_Spells[spell]) then
CEnemyCastBar_Spells[spell].disabled = true;
end
if (CEnemyCastBar_Afflictions[spell]) then
CEnemyCastBar_Afflictions[spell].disabled = true;
end
table.insert (DisabledSpells, CEnemyCastBar.tDisabledSpells[i]);
i = i + 1;
end
if (not msg) then
if (table.getn (DisabledSpells) == 0) then
DSpells = "Nothing disabled found! |rEmpty table loaded.";
else
i = i - 1;
DSpells = i.." |rDisabled Spells loaded. (see |cff00ff00/necb disabled|r)";
end
DEFAULT_CHAT_FRAME:AddMessage("|cffaaaaaaNECB:|cffffff00 "..DSpells);
end
end
Generated by GNU Enscript 1.6.5.90.