vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
  ****************************************************************
        Scrolling Combat Text - Damage 2.0

        Author: Grayhoof
        ****************************************************************

        Official Site:
                http://grayhoof.wowinterface.com 
        
        ****************************************************************]]
--embedded libs
local parser = ParserLib:GetInstance("1.1")     

--global name
SCTD = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceConsole-2.0", "AceHook-2.0");

--Add new frame to SCT
SCT.FRAME3 = 3;
local arrAniData3 = {};
tinsert(SCT.ArrayAniData, arrAniData3);

local MSG_Y_OFFSET = 0;
local arrMsgData = {
                ["MSGTEXT1"] = {size=1, xoffset=0, yoffset=0, align="CENTER", height=5, duration=1},
}

local default_config = {
                ["SCTD_VERSION"] = SCTD.Version,
                ["SCTD_ENABLED"] = 1,
                ["SCTD_SHOWMELEE"] = 1,
                ["SCTD_SHOWPERIODIC"] = 1,
                ["SCTD_SHOWSPELL"] = 1,
                ["SCTD_SHOWPET"] = 1,
                ["SCTD_SHOWCOLORCRIT"] = false,
                ["SCTD_FLAGDMG"] = false,
                ["SCTD_SHOWDMGTYPE"] = false,
                ["SCTD_SHOWSPELLNAME"] = 1,
                ["SCTD_SHOWRESIST"] = 1,
                ["SCTD_SHOWTARGETS"] = false,
                ["SCTD_DMGFONT"] = 1,
                ["SCTD_TARGET"] = false,
                ["SCTD_PVPDMG"] = false,
                ["SCTD_USESCT"] = 1,
                ["SCTD_STICKYCRIT"] = 1,
                ["SCTD_SPELLCOLOR"] = false
        };
        
local default_config_colors = {
                ["SCTD_SHOWMELEE"] = {r = 1.0, g = 1.0, b = 1.0},
                ["SCTD_SHOWPERIODIC"] = {r = 1.0, g =1.0, b = 0.0},
                ["SCTD_SHOWSPELL"] = {r = 1.0, g = 1.0, b = 0.0},
                ["SCTD_SHOWPET"] = {r = 0.6, g = 0.6, b = 0.0},
                ["SCTD_SHOWCOLORCRIT"] = {r = 0.2, g = 0.4, b = 0.6}
}

local default_frame_config = {
                ["FONT"] = 1,
                ["FONTSHADOW"] = 2,
                ["ALPHA"] = 100,
                ["ANITYPE"] = 1,
                ["ANISIDETYPE"] = 1,
                ["XOFFSET"] = 0,
                ["YOFFSET"] = 210,
                ["DIRECTION"] = false,
                ["TEXTSIZE"] = 24,
                ["FADE"] = 1.5
}

local arrShadowOutline = {
        [1] = "",
        [2] = "OUTLINE",
        [3] = "THICKOUTLINE"
}

----------------------
--Called on login
function SCTD:OnEnable()
        --check SCT version
        if (not SCT) or (tonumber(SCT.db.profile["VERSION"]) < 5) then
                StaticPopupDialogs["SCTD_VERSION"] = {
                                                                  text = SCTD.LOCALS.Version_Warning,
                                                                  button1 = TEXT(OKAY) ,
                                                                  timeout = 0,
                                                                  whileDead = 1,
                                                                  hideOnEscape = 1,
                                                                  showAlert = 1
                                                                };
                StaticPopup_Show("SCTD_VERSION");
                if (SCTOptionsFrame_Misc103) then
                        SCTOptionsFrame_Misc103:Hide();
                end
                self:OnDisable();
                return;
        end
        self:RegisterSelfEvents();
end

----------------------
-- Disable all events, not using AceDB, but may as well name it right.
function SCTD:OnDisable()
        -- no more events to handle
        parser:UnregisterAllEvents("sctd")
        self:UnregisterAllEvents()
end

----------------------
--Called when addon loaded
function SCTD:OnInitialize()
        
        --slash commands
        local main = {
                type="group",
                args = {
                        menu = {
                                name = "Menu", type = 'execute',
                    desc = "Display SCT Option Menu",
                    func = function()
                        self:ShowSCTDMenu();
                end
                        },
                }
        }
        local menu = {
                type = 'execute',
    desc = "Display SCTD Option Menu",
    func = function()
        self:ShowSCTDMenu();
    end
        }
        
        self:RegisterChatCommand({"/sctd"}, main);
        self:RegisterChatCommand({"/sctdmenu"}, menu);
        
        --register with other mods
        self:RegisterOtherMods();
        
        --Hook SCT show menu
        self:Hook(SCT, "ShowMenu")
                                                        
        --update old values
        self:UpdateValues();
        
        --setup msgs
        self:MsgInit();

end

----------------------
-- Show the Option Menu
function SCTD:ShowSCTDMenu()
        local loaded, message = LoadAddOn("sct_options");
        if (loaded) then
                --if options page exsists (not disabled)
                if (SCTDOptions) then
                        PlaySound("igMainMenuOpen");
                        --Hook SCT ShowExample
                        if (not SCTD:IsHooked(SCT, "ShowExample")) then
                                SCTD:Hook(SCT, "ShowExample");
                        end
                        --show options
                        SCTDOptions:Show();
                        --update animation options
                        SCTD:UpdateAnimationOptions()
                else
                        PlaySound("TellMessage");
                        SCTD:Print(SCTD.LOCALS.Load_Error);
                end
        else
                PlaySound("TellMessage");
                SCTD:Print(SCT.LOCALS.Load_Error.." "..message);
        end;
end

----------------------
--Reset everything to default for SCTD
function SCTD:ShowMenu()
        SCTD:UpdateValues();
        --open sct menu
        self.hooks[SCT].ShowMenu.orig();
        --Hook SCT ShowExample
        if (not self:IsHooked(SCT, "ShowExample") and SCT.ShowExample) then
                self:Hook(SCT, "ShowExample");
        end
        --if window is showing, reload it
        if (SCTDOptions) and (SCTDOptions:IsVisible()) then
                SCTDOptions:Hide();
                SCTDOptions:Show();
        end
end

----------------------
-- display ddl or chxbox based on type
function SCTD:UpdateAnimationOptions()
        --get scroll down checkbox
        local chkbox = getglobal("SCTOptionsFrame_CheckButton113");
        --get anime type dropdown
        local ddl1 = getglobal("SCTOptionsFrame_Selection103");
        --get animside type dropdown
        local ddl2 = getglobal("SCTOptionsFrame_Selection104");
        --get item
        local id = UIDropDownMenu_GetSelectedID(ddl1)
        if (id == 1 or id == 6) then
                chkbox:Show();
                ddl2:Hide();
        else
                chkbox:Hide();
                ddl2:Show();
        end
end

----------------------
--Hide the Option Menu
function SCTD:HideMenu()
        PlaySound("igMainMenuClose");
        SCTDOptions:Hide();
        SCTD_EXAMPLEMSG:Hide();
end

---------------------
--Show SCT Example
function SCTD:ShowExample()
        self.hooks[SCT].ShowExample.orig();
        self:MsgInit()
        self:SetDamageFlags();
        
        --animated example for options that may need it
        local option = this.SCTVar or "SCTD_SHOWMELEE";
        if (string.find(option,"SCTD_SHOW")) then
                self:DisplayText(option, self.LOCALS.EXAMPLE);
        end
        
        --show msg frame
        SCTD_EXAMPLEMSG:Show();

        --show example FRAME3
        --get object
        example = getglobal("SCTDMsgExample1");
        --set text size
        SCT:SetFontSize(example,
                                                                        SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["FONT"],
                                                                        SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["TEXTSIZE"],
                                                                        SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["FONTSHADOW"]);
        --set the color
        example:SetTextColor(1, 1, 1);
        --set alpha
        example:SetAlpha(SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["ALPHA"]/100);
        --Position
        example:SetPoint("CENTER", "UIParent", "CENTER", 
                                                                         SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["XOFFSET"], 
                                                                         SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["YOFFSET"]);
        --Set the text to display
        example:SetText(self.LOCALS.EXAMPLE);
        
        --update animation options
        self:UpdateAnimationOptions()
end

----------------------
--Update old values for new versions
function SCTD:UpdateValues()
        local i, var;
        --set defaults
        for i in default_config do
                if(SCT.db.profile[i] == nil) then
                        SCT.db.profile[i] = default_config[i];
                end
        end
        --set colors
        for i in default_config_colors do
                var = SCT.db.profile[SCT.COLORS_TABLE][i] or default_config_colors[i];
                SCT.db.profile[SCT.COLORS_TABLE][i] = var;
        end
        --set frame data
        if (not SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]) then
                SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3] = {};
        end
        for i in default_frame_config do
                if (SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3][i] == nil) then
                        SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3][i] = default_frame_config[i];
                end
        end
end

----------------------
-- Event Handler
function SCTD:OnEvent()         
        --Player PvP status changed
        SCTD:SetDamageFlags();
end

----------------------
--Determine if its a "melee" ranged evet
function SCTD:IsMeleeRanged(skill)
        if (skill == ParserLib_MELEE or
                        skill == self.LOCALS.AUTO_SHOT or
                        --skill == self.LOCALS.SHOOT or
                        skill == self.LOCALS.SHOOT_BOW or
                        skill == self.LOCALS.SHOOT_CROSSBOW or
                        skill == self.LOCALS.SHOOT_GUN) then
                return true;
        else
                return false;
        end
end

----------------------
-- Parses all combat events using paserlib
function SCTD:ParseCombat(info)
        --self doesn't work here because of the call from ParserLib
        local self = SCTD;
        
        --exit if not enabled
        if (not SCT.db.profile["SCTD_ENABLED"]) then
                return;
        end
        
        --Hits (melee, spell, etc..)
        if (info.type == "hit") then
                if (info.source == ParserLib_SELF) then
                        if (self:IsMeleeRanged(info.skill)) then
                                self:DisplayText("SCTD_SHOWMELEE", info.amount, info.isCrit, nil, nil, info.victim);
                        else
                                if (info.isDOT) then
                                        self:DisplayText("SCTD_SHOWPERIODIC", info.amount, nil, info.element, info.amountResist, info.victim, info.skill);
                                else
                                        self:DisplayText("SCTD_SHOWSPELL", info.amount, info.isCrit, info.element, info.amountResist, info.victim, info.skill);
                                end
                        end
                elseif (SCT:GetTargetUnit(info.source) == "pet") then
                        if (info.skill == ParserLib_MELEE) then
                                self:DisplayText("SCTD_SHOWPET", info.amount, info.isCrit, info.element, info.amountResist, info.victim, PET);
                        else
                                self:DisplayText("SCTD_SHOWPET", info.amount, info.isCrit, info.element, info.amountResist, info.victim, info.skill);
                        end
                end     
        
        --Miss Events
        elseif (info.type == "miss") then
                local source;
                --if its self, player, else see if its pet
                if (info.source == ParserLib_SELF) then
                        source = "player";
                else
                        source = SCT:GetTargetUnit(info.source);
                end;
                --remove skill if melee or ranged non-skill
                if (self:IsMeleeRanged(info.skill)) then
                        info.skill = nil;
                end
                --if pet or player
                if (source == "player") or (source == "pet")then
                        local type = "SCTD_SHOWMELEE";
                        if (info.skill) then
                                type="SCTD_SHOWSPELL";
                        end
                        if (source == "pet") then
                                type="SCTD_SHOWPET";
                        end
                        if (info.missType == "miss") then
                                self:DisplayText(type, MISS, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "dodge") then
                                self:DisplayText(type, DODGE, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "block") then
                                self:DisplayText(type, BLOCK, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "deflect") then
                                self:DisplayText(type, DEFLECT, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "immune") then
                                self:DisplayText(type, IMMUNE, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "evade") then
                                self:DisplayText(type, EVADE, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "parry") then
                                self:DisplayText(type, PARRY, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "resist") then
                                self:DisplayText(type, RESIST, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "reflect") then
                                self:DisplayText(type, REFLECT, nil, nil, nil, info.victim, info.skill);
                        elseif (info.missType == "absorb") then
                                self:DisplayText(type, ABSORB, nil, nil, nil, info.victim, info.skill);
                        end
                end
        end
end


----------------------
--Display for mainly combat events
--Mainly used for short messages
function SCTD:DisplayText(option, msg1, crit, damagetype, resisted, target, spell)
        local rbgcolor, showcrit, showmsg, adat;
        --if option is on
        if (SCT.db.profile[option]) then
                --if show only target
                if (SCT.db.profile["SCTD_TARGET"]) then
                        if (target ~= UnitName("target")) then
                                return;
                        end
                end
                --get options
                rbgcolor = SCT.db.profile[SCT.COLORS_TABLE][option];
                --if damage type
                if ((damagetype) and (SCT.db.profile["SCTD_SHOWDMGTYPE"])) then
                        msg1 = msg1.." "..damagetype.."";
                end
                --if spell color
                if ((damagetype) and (SCT.db.profile["SCTD_SPELLCOLOR"])) then
                        rbgcolor = SCT.SpellColors[damagetype] or rbgcolor;
                end
                --if resisted
                if ((resisted) and (SCT.db.profile["SCTD_SHOWRESIST"])) then
                        msg1 = msg1.." {"..resisted.."}";
                end
                --if target label
                if ((target) and (SCT.db.profile["SCTD_SHOWTARGETS"])) then
                        msg1 = target..": "..msg1;
                end
                --if spell 
                if ((spell) and (SCT.db.profile["SCTD_SHOWSPELLNAME"])) then
                        msg1 = msg1.." ("..spell..")";
                end
                --if flag
                if (SCT.db.profile["SCTD_FLAGDMG"]) then
                        msg1 = self.LOCALS.SelfFlag..msg1..self.LOCALS.SelfFlag;
                end
                --if crit
                if (crit) then
                        if (SCT.db.profile["SCTD_SHOWCOLORCRIT"]) then
                                rbgcolor = SCT.db.profile[SCT.COLORS_TABLE]["SCTD_SHOWCOLORCRIT"];
                        end
                        self:Display_Crit_Damage( msg1, rbgcolor );
                else
                        self:Display_Damage( msg1, rbgcolor );
                end

        end
end


----------------------
--Displays a message at the top of the screen
function SCTD:Display_Damage(msg, color)
        if (SCT.db.profile["SCTD_USESCT"]) then
                        SCT:DisplayText(msg, color, nil, "damage", SCT.FRAME3);
        else
                SCTD_MSGTEXT1:SetPoint("CENTER", "UIParent", "CENTER",
                                                                                                         SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["XOFFSET"],
                                                                                                         SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["YOFFSET"] + MSG_Y_OFFSET);
                SCTD_MSGTEXT1:SetTimeVisible(SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["FADE"]);
                SCTD_MSGTEXT1:AddMessage(msg, color.r, color.g, color.b, 1);
        end
end

----------------------
--Displays a message at the top of the screen
function SCTD:Display_Crit_Damage(msg, color)
        if (SCT.db.profile["SCTD_STICKYCRIT"]) then
                SCT:DisplayText(msg, color, 1, "damage", SCT.FRAME3);
        elseif (SCT.db.profile["SCTD_USESCT"]) then
                SCT:DisplayText("+"..msg.."+", color, nil, "damage", SCT.FRAME3);
        else
                SCTD_MSGTEXT1:SetPoint("CENTER", "UIParent", "CENTER",
                                                                                                         SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["XOFFSET"],
                                                                                                         SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["YOFFSET"] + MSG_Y_OFFSET);
                SCTD_MSGTEXT1:SetTimeVisible(SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["FADE"] or 1.5);
                SCTD_MSGTEXT1:AddMessage("+"..msg.."+", color.r, color.g, color.b, 1);
        end
end

------------------------
--Setup msg arrays
function SCTD:MsgInit()
        for key, value in arrMsgData do
                value.FObject = getglobal("SCTD_"..key);
                self:SetMsgFont(value.FObject);
        end
        self:SetDamageFlags()
end

------------------------
--Setup Damage Flags based on Options
function SCTD:SetDamageFlags()
        --set WoW Damage Flags
        if (SCT.db.profile["SCTD_DMGFONT"]) then
                SetCVar("CombatDamage", 0);
                self:SetPvPDamageFlags();
        else
                SetCVar("CombatDamage", 1);
        end
end

------------------------
--Setup Damage Flags based on Options and PvP status
function SCTD:SetPvPDamageFlags()
        --set WoW Damage Flags
        if (SCT.db.profile["SCTD_PVPDMG"]) then
                if (UnitIsPVP("player")) then
                        SetCVar("CombatDamage", 1);
                        SCT.db.profile["SCTD_ENABLED"] = false;
                else
                        SetCVar("CombatDamage", 0);
                        SCT.db.profile["SCTD_ENABLED"] = 1;
                end
        end
end

-------------------------
--Set the font of an object using msg vars
function SCTD:SetMsgFont(object)
        --set font
        object:SetFont(SCT.LOCALS.FONTS[SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["FONT"]].path,
                                                                 SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["TEXTSIZE"], 
                                                                 arrShadowOutline[SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["FONTSHADOW"]]);
        --reset size of allow 5 messages
        object:SetHeight(SCT.db.profile[SCT.FRAMES_DATA_TABLE][SCT.FRAME3]["TEXTSIZE"] * 6)
        --Set Fade Duration
        object:SetFadeDuration(1);
        --set offset to center
        MSG_Y_OFFSET = object:GetHeight()/2;
end

----------------------
--Register All Events
function SCTD:RegisterSelfEvents()
        --core events   
        self:RegisterEvent("UNIT_FACTION", "OnEvent");
        self:RegisterEvent("PLAYER_ENTERING_WORLD", "OnEvent");
        
        --core chat events for Parserlib
        parser:RegisterEvent("sctd", "CHAT_MSG_COMBAT_SELF_HITS", SCTD.ParseCombat) ;
        parser:RegisterEvent("sctd", "CHAT_MSG_COMBAT_SELF_MISSES", SCTD.ParseCombat) ;
        parser:RegisterEvent("sctd", "CHAT_MSG_SPELL_SELF_DAMAGE", SCTD.ParseCombat) ;
        parser:RegisterEvent("sctd", "CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE", SCTD.ParseCombat) ;
        parser:RegisterEvent("sctd", "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE", SCTD.ParseCombat) ;
        parser:RegisterEvent("sctd", "CHAT_MSG_COMBAT_PET_HITS", SCTD.ParseCombat) ;
        parser:RegisterEvent("sctd", "CHAT_MSG_COMBAT_PET_MISSES", SCTD.ParseCombat) ;
        parser:RegisterEvent("sctd", "CHAT_MSG_SPELL_PET_DAMAGE", SCTD.ParseCombat) ;
end

-------------------------
--Regsiter SCTD with other mods
function SCTD:RegisterOtherMods()
        -- myAddOns support
        if(myAddOnsFrame_Register) then
                local SCTDDetails = {
                        name = "sctd",
                        version = SCTD.Version,
                        optionsframe = "SCTDOptions",
                        category = MYADDONS_CATEGORY_COMBAT
                };
                myAddOnsFrame_Register(SCTDDetails);
        end
        
        --Cosmos support
        if ( EarthFeature_AddButton ) then
                EarthFeature_AddButton(
                   {
                      id="SCT";
                      name=self.LOCALS.CB_NAME;
                      text=self.LOCALS.CB_NAME;
                      subtext=self.LOCALS.CB_SHORT_DESC;
                      helptext=self.LOCALS.CB_LONG_DESC;
                      icon=self.LOCALS.CB_ICON;
                      callback=SCTD.ShowSCTDMenu;
                   }
                );
        elseif (Cosmos_RegisterButton) then
                Cosmos_RegisterButton (
                   self.LOCALS.CB_NAME,
                   self.LOCALS.CB_SHORT_DESC,
                   self.LOCALS.CB_LONG_DESC,
                   self.LOCALS.CB_ICON,
                   SCTD.ShowSCTDMenu,
                   function()
                      return true;
                   end
                );
                default_config.ENABLED = 0;
        end
        
        -- Add to CTMod Control panel if available
        if ( CT_RegisterMod ) then
                CT_RegisterMod(self.LOCALS.CB_NAME, nil, 5, self.LOCALS.CB_ICON, self.LOCALS.CB_LONG_DESC, "switch", nil, SCTD.ShowSCTDMenu);
        end
end

Generated by GNU Enscript 1.6.5.90.