--[[ Titan Combat Info v1.52c by Aegean of Proudmoore...err...Muradin ;) ]]-- TITAN_COMBATINFO_TOGGLE_TABLE = { "ShowBlock","ShowCrit","ShowDodge","ShowParry","ShowStatLabel", } function TitanPanelCombatInfoButton_OnLoad() -- Register the addon with Titan Panel this.registry={ id = TITAN_COMBATINFO_ID, menuText = TITAN_COMBATINFO_MENU_TEXT, buttonTextFunction = "TitanPanelCombatInfoButton_GetButtonText", tooltipTitle = TITAN_COMBATINFO_TOOLTIP, tooltipTextFunction = "TitanPanelCombatInfoButton_GetTooltipText", icon = TITAN_COMBATINFO_BUTTON_ICON, iconWidth = 16, savedVariables = { ShowBlock = TITAN_NIL, ShowCrit = TITAN_NIL, ShowDodge = TITAN_NIL, ShowParry = TITAN_NIL, ShowStatLabel = TITAN_NIL, ShowIcon = 1, ShowLabelText = 1, } }; -- Register events this:RegisterEvent("UNIT_INVENTORY_CHANGED"); this:RegisterEvent("UNIT_AURA"); this:RegisterEvent("UNIT_AURASTATE"); end function TitanPanelCombatInfoButton_GetButtonText(id) -- monitored stat to display on bar local button, id = TitanUtils_GetButton(id, true); local buttonText = ""; local displayText = ""; if (TitanGetVar(TITAN_COMBATINFO_ID,"ShowLabelText")) then buttonText = TITAN_COMBATINFO_BUTTON_LABEL; end if (TitanGetVar(TITAN_COMBATINFO_ID,"ShowBlock")) then local blockChance = format(TITAN_COMBATINFO_BLOCK,GetBlockChance()); displayText = format(TITAN_COMBATINFO_BUTTON_TEXT,blockChance); if (TitanGetVar(TITAN_COMBATINFO_ID,"ShowStatLabel")) then buttonText = TITAN_COMBATINFO_BLOCK_TEXT; end button.registry.icon = TITAN_COMBATINFO_BLOCK_ICON; elseif (TitanGetVar(TITAN_COMBATINFO_ID,"ShowCrit")) then local critChance = format(TITAN_COMBATINFO_CRIT,GetCritChance()); displayText = format(TITAN_COMBATINFO_BUTTON_TEXT,critChance); if (TitanGetVar(TITAN_COMBATINFO_ID,"ShowStatLabel")) then buttonText = TITAN_COMBATINFO_CRIT_TEXT; end button.registry.icon = TITAN_COMBATINFO_CRIT_ICON; elseif (TitanGetVar(TITAN_COMBATINFO_ID,"ShowDodge")) then local dodgeChance = format(TITAN_COMBATINFO_DODGE,GetDodgeChance()); displayText = format(TITAN_COMBATINFO_BUTTON_TEXT,dodgeChance); if (TitanGetVar(TITAN_COMBATINFO_ID,"ShowStatLabel")) then buttonText = TITAN_COMBATINFO_DODGE_TEXT; end button.registry.icon = TITAN_COMBATINFO_DODGE_ICON; elseif (TitanGetVar(TITAN_COMBATINFO_ID,"ShowParry")) then local parryChance = format(TITAN_COMBATINFO_PARRY,GetParryChance()); displayText = format(TITAN_COMBATINFO_BUTTON_TEXT,parryChance); if (TitanGetVar(TITAN_COMBATINFO_ID,"ShowStatLabel")) then buttonText = TITAN_COMBATINFO_PARRY_TEXT; end button.registry.icon = TITAN_COMBATINFO_PARRY_ICON; else button.registry.icon = TITAN_COMBATINFO_BUTTON_ICON; end return buttonText.." "..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_BUTTON_TEXT,displayText)); end function TitanPanelCombatInfoButton_GetTooltipText() -- local critChance = GetCritChance(); -- N/A at this time from Bliz API local critChance = GetCritChance(); local blockChance = GetBlockChance(); local dodgeChance = GetDodgeChance(); local parryChance = GetParryChance(); -- melee local meleeBase, meleePosBuff, meleeNegBuff = UnitAttackPower("player"); local meleeMainSpeed, meleeOffSpeed = UnitAttackSpeed("player"); local meleeOffHasWeapon = OffhandHasWeapon(); local meleeMainLowDmg, meleeMainHiDmg, meleeOffLowDmg, meleeOffHiDmg, meleePosDmg, meleeNegDmg, percent = UnitDamage("player"); local meleeMainAvgDmg = 0.0; local meleeOffAvgDmg = 0.0; local meleeOffhandText = ""; -- melee dps average meleeMainAvgDmg = ((meleeMainHiDmg + meleeMainLowDmg)*.5) / meleeMainSpeed; meleeMainHiDmg = ceil(meleeMainHiDmg); meleeMainLowDmg = floor(meleeMainLowDmg); -- offhand check if ( meleeOffSpeed == nil or meleeOffSpeed == 0 and not meleeOffHasWeapon) then meleeOffSpeed = 0.0; meleeOffLowDmg = 0; meleeOffHiDmg = 0; else meleeOffAvgDmg = ((meleeOffHiDmg + meleeOffLowDmg)*.5) / meleeOffSpeed; meleeOffHiDmg = ceil(meleeOffHiDmg); meleeOffLowDmg = floor(meleeOffLowDmg); meleeOffhandText = "\n".. TITAN_COMBATINFO_MELEE_OFFHANDSPEED_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_MELEE_OFFHANDSPEED,meleeOffSpeed)).."\n".. TITAN_COMBATINFO_MELEE_OFFHANDDMG_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_MELEE_OFFHANDDMG,meleeOffLowDmg,meleeOffHiDmg)).."\n".. TITAN_COMBATINFO_MELEE_OFFAVGDMG_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_MELEE_OFFAVGDMG,meleeOffAvgDmg)).."\n" end -- ranged local rangedAtkBase, rangedPosBuff, rangedNegBuff = UnitRangedAttackPower("player"); local rangedBase, rangedModifier = UnitRangedAttack("player"); local rangedSpeed, rangedLowDmg, rangedHiDmg = UnitRangedDamage("player"); local baseDamage = (rangedLowDmg + rangedHiDmg) * 0.5; local fullDamage = (baseDamage + meleePosDmg + meleeNegDmg) * percent; local rangedAvgDmg = (max(fullDamage,1) / rangedSpeed); local rangedBonus = (fullDamage - baseDamage); rangedLowDmg = max(floor(rangedLowDmg + rangedBonus),1); rangedHiDmg = max(ceil(rangedHiDmg + rangedBonus),1); -- ranged local rangedText = ""; --local rangedAvgDmg = ((rangedHiDmg + rangedLowDmg)/2) / rangedSpeed; if (rangedSpeed > 0) then rangedText = "".. "\n"..TitanUtils_GetHighlightText(TITAN_COMBATINFO_RANGE_TEXT).." "..TitanUtils_GetHighlightText(format("(+%.1f dps)",(rangedAtkBase/TITAN_COMBATINFO_ATKPWR_MAGIC))).."\n".. TITAN_COMBATINFO_RANGEPWR_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_RANGEPWR,(rangedAtkBase + rangedPosBuff - rangedNegBuff),rangedAtkBase)).."\n".. TITAN_COMBATINFO_RANGEATTACKSPEED.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_RANGESPEED,rangedSpeed)).."\n".. TITAN_COMBATINFO_RANGEDMG_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_RANGEDMG,rangedLowDmg,rangedHiDmg)).."\n".. TITAN_COMBATINFO_RANGEAVGDMG_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_RANGEAVGDMG,rangedAvgDmg)).."\n" else rangedText = ""; end -- armor local armorBase, armorEffective, armorList, armorPosBuff, armorNegBuff = UnitArmor("player"); local armorReduction = armorEffective/((85 * UnitLevel("player")) + 400); armorReduction = 100 * (armorReduction/(armorReduction + 1)); local armorText = "".. "\n"..TitanUtils_GetHighlightText("Armor").."\n".. TITAN_COMBATINFO_ARMOR_TEXT.."\t"..TitanUtils_GetHighlightText(armorEffective.." ("..armorBase.." base)").."\n".. "(Dmg vs. lvl "..UnitLevel("player").." attacker reduced "..format("%.1f%%",armorReduction)..")\n" return "".. TITAN_COMBATINFO_BLOCK_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_BLOCK,blockChance)).."\n".. TITAN_COMBATINFO_CRIT_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_CRIT,critChance)).."\n".. TITAN_COMBATINFO_DODGE_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_DODGE,dodgeChance)).."\n".. TITAN_COMBATINFO_PARRY_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_PARRY,parryChance)).."\n\n".. TitanUtils_GetHighlightText(TITAN_COMBATINFO_MELEE_TEXT).." "..TitanUtils_GetHighlightText(format("(+%.1f dps)",(max((meleeBase + meleePosBuff + meleeNegBuff),0)/TITAN_COMBATINFO_ATKPWR_MAGIC))).."\n".. TITAN_COMBATINFO_MELEE_POWER_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_MELEE_POWER,max(meleeBase + meleePosBuff + meleeNegBuff),meleeBase)).."\n".. TITAN_COMBATINFO_MELEE_MAINSPEED_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_MELEE_MAINSPEED,meleeMainSpeed)).."\n".. TITAN_COMBATINFO_MELEE_MAINDMG_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_MELEE_MAINDMG,meleeMainLowDmg,meleeMainHiDmg)).."\n".. TITAN_COMBATINFO_MELEE_MAINAVGDMG_TEXT.."\t"..TitanUtils_GetHighlightText(format(TITAN_COMBATINFO_MELEE_MAINAVGDMG,meleeMainAvgDmg)).."\n".. meleeOffhandText.. rangedText.. armorText.."\n"; end function TitanPanelCombatInfoButton_OnUpdate() end function TitanPanelCombatInfoButton_ToggleDisplayBlock() TitanToggleVar(TITAN_COMBATINFO_ID,"ShowBlock"); TitanSetVar(TITAN_COMBATINFO_ID,"ShowCrit",TITAN_NIL); TitanSetVar(TITAN_COMBATINFO_ID,"ShowDodge",TITAN_NIL); TitanSetVar(TITAN_COMBATINFO_ID,"ShowParry",TITAN_NIL); TitanPanelButton_UpdateButton(TITAN_COMBATINFO_ID); end function TitanPanelCombatInfoButton_ToggleDisplayCrit() TitanToggleVar(TITAN_COMBATINFO_ID,"ShowCrit"); TitanSetVar(TITAN_COMBATINFO_ID,"ShowBlock",TITAN_NIL); TitanSetVar(TITAN_COMBATINFO_ID,"ShowDodge",TITAN_NIL); TitanSetVar(TITAN_COMBATINFO_ID,"ShowParry",TITAN_NIL); TitanPanelButton_UpdateButton(TITAN_COMBATINFO_ID); end function TitanPanelCombatInfoButton_ToggleDisplayDodge() TitanToggleVar(TITAN_COMBATINFO_ID,"ShowDodge"); TitanSetVar(TITAN_COMBATINFO_ID,"ShowCrit",TITAN_NIL); TitanSetVar(TITAN_COMBATINFO_ID,"ShowBlock",TITAN_NIL); TitanSetVar(TITAN_COMBATINFO_ID,"ShowParry",TITAN_NIL); TitanPanelButton_UpdateButton(TITAN_COMBATINFO_ID); end function TitanPanelCombatInfoButton_ToggleDisplayParry() TitanToggleVar(TITAN_COMBATINFO_ID,"ShowParry"); TitanSetVar(TITAN_COMBATINFO_ID,"ShowCrit",TITAN_NIL); TitanSetVar(TITAN_COMBATINFO_ID,"ShowBlock",TITAN_NIL); TitanSetVar(TITAN_COMBATINFO_ID,"ShowDodge",TITAN_NIL); TitanPanelButton_UpdateButton(TITAN_COMBATINFO_ID); end function TitanPanelCombatInfoButton_ToggleDisplayStatLabel() TitanToggleVar(TITAN_COMBATINFO_ID,"ShowStatLabel"); TitanPanelButton_UpdateButton(TITAN_COMBATINFO_ID); end function TitanPanelRightClickMenu_PrepareCombatInfoMenu() TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_COMBATINFO_ID].menuText); TitanPanelRightClickMenu_AddCommand(TITAN_COMBATINFO_OPTIONS_SHOWBLOCK_TEXT,TITAN_COMBATINFO_ID,"TitanPanelCombatInfoButton_ToggleDisplayBlock"); TitanPanelRightClickMenu_AddCommand(TITAN_COMBATINFO_OPTIONS_SHOWCRIT_TEXT,TITAN_COMBATINFO_ID,"TitanPanelCombatInfoButton_ToggleDisplayCrit"); TitanPanelRightClickMenu_AddCommand(TITAN_COMBATINFO_OPTIONS_SHOWDODGE_TEXT,TITAN_COMBATINFO_ID,"TitanPanelCombatInfoButton_ToggleDisplayDodge"); TitanPanelRightClickMenu_AddCommand(TITAN_COMBATINFO_OPTIONS_SHOWPARRY_TEXT,TITAN_COMBATINFO_ID,"TitanPanelCombatInfoButton_ToggleDisplayParry"); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddToggleVar(TITAN_COMBATINFO_OPTIONS_SHOWSTATLABEL_TEXT,TITAN_COMBATINFO_ID,"ShowStatLabel"); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddToggleIcon(TITAN_COMBATINFO_ID); TitanPanelRightClickMenu_AddToggleLabelText(TITAN_COMBATINFO_ID); TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_COMBATINFO_ID, TITAN_PANEL_MENU_FUNC_HIDE); end function GetCritChance() local critChance = 0; local id = 1; local attackSpell = GetSpellName(id,BOOKTYPE_SPELL); -- find the attack spell button if not in slot 1 if ( attackSpell ~= TITAN_COMBATINFO_CRIT_ATTACKTEXT ) then name, texture, offset, numSpells = GetSpellTabInfo(1); for i=1, numSpells do if ( GetSpellName(i,BOOKTYPE_SPELL) == TITAN_COMBATINFO_CRIT_ATTACKTEXT ) then id = i; end end end -- populate tooltip for parsing TitanCombatInfo_Tooltip:SetOwner(UIParent, "ANCHOR_NONE"); TitanCombatInfo_Tooltip:SetSpell(id, BOOKTYPE_SPELL); local attackInfo = TitanCombatInfo_TooltipTextLeft2:GetText(); -- parse crit line local iCritInfo = string.find(attackInfo, "%s"); critChance = string.sub(attackInfo,0,(iCritInfo -2)); return critChance; end function TitanPanelCombatInfoButton_OnEvent() --DEFAULT_CHAT_FRAME:AddMessage("event triggered: ".. event); if (event == "UNIT_INVENTORY_CHANGED") or (event == "UNIT_AURA") or (event == "UNIT_AURASTATE") then TitanPanelButton_UpdateButton(TITAN_COMBATINFO_ID); end end