Files
coa-details/plugins/Details_CalcLeech/Details_CalcLeech.lua
T
2016-07-20 13:03:54 -03:00

197 lines
6.4 KiB
Lua

do
local Details = Details
if (not Details) then
print ("Calc Leech cannot be installed: Details! not found.")
return
end
local _
--> minimal details version required to run this plugin
local MINIMAL_DETAILS_VERSION_REQUIRED = 81
local CLEECH_VERSION = "v1.2"
--> create a plugin object
local calcLeech = Details:NewPluginObject ("Details_CalcLeech", DETAILSPLUGIN_ALWAYSENABLED)
--> just localizing here the plugin's main frame
local frame = calcLeech.Frame
--> set the description
calcLeech:SetPluginDescription ("Calculates the healing done by the trinket leech.")
--> get the framework object
local framework = calcLeech:GetFramework()
local CUSTOM_DISPLAY_VERSION = 3
local CUSTOM_DISPLAY_NAME = "CalcLeech"
local create_custom_object = function()
local new_object = {
name = CUSTOM_DISPLAY_NAME,
icon = [[Interface\ICONS\spell_shadow_lifedrain02]],
attribute = false,
spellid = false,
author = "Details!",
desc = "Calculates healing done from leech trinket.",
source = false,
target = false,
script_version = CUSTOM_DISPLAY_VERSION,
script = [[
--get the parameters passed
local Combat, CustomContainer, Instance = ...
--declade the values to return
local total, top, amount = 0, 0, 0
if (Combat.PlayerLeechTrinket) then
for playerName, amount in pairs (Combat.PlayerLeechTrinket) do
local healActor = Combat:GetActor (2, playerName)
if (healActor) then
CustomContainer:AddValue (healActor, amount)
end
end
end
--if not managed inside the loop, get the values of total, top and amount
total, top = CustomContainer:GetTotalAndHighestValue()
amount = CustomContainer:GetNumActors()
--return the values
return total, top, amount
]],
tooltip = [[
]],
}
calcLeech:InstallCustomObject (new_object)
end
local rosterLeechAmount = {}
local f = CreateFrame ("frame")
f:SetScript ("OnEvent", function (self, event, time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, spellid, spellname, spelltype, amount, overhealing, absorbed, critical, multistrike, is_shield)
if (token == "SPELL_HEAL" and spellid == 143924) then --http://www.wowhead.com/spell=143924/leech
--> The next few lines of code is based on an aura for WeakAuras 2, I couldn't find who is the original author since this same code is used on many different versions of the aura.
--> If you are the original author, please contact-me on curseforge so I can add the credits here.
local healed = amount - overhealing
if (healed > 0) then
wipe (rosterLeechAmount)
local total_leech = 0
for i = 1, 40 do
local name, _, _, _, _, _, _, source, _, _, id, _, _, _, _, _, leech = UnitAura (target_name, i)
if (type (leech) == "number") then
if (name and id == 184671 and source) then
rosterLeechAmount [UnitName (source)] = leech
total_leech = total_leech + leech
end
end
end
if (total_leech > 0) then
for from, leech_amount in pairs (rosterLeechAmount) do
if (not calcLeech.combat.PlayerLeechTrinket [from]) then
calcLeech.combat.PlayerLeechTrinket [from] = 0
end
calcLeech.combat.PlayerLeechTrinket [from] = calcLeech.combat.PlayerLeechTrinket [from] + (healed * (leech_amount / total_leech))
end
end
end
-------------
--elseif (token == "SPELL_AURA_APPLIED") then
--elseif (token == "SPELL_AURA_REMOVED") then
--elseif (token == "SPELL_AURA_REFRESH") then
end
end)
--> when receiving an event from details, handle it here
local player_has_trinket = function (combat)
calcLeech.combat = combat
--> check if exists a custom display to show the trinket leech
local customObject = calcLeech:GetCustomObject (CUSTOM_DISPLAY_NAME)
if (customObject) then
if (customObject.script_version < CUSTOM_DISPLAY_VERSION) then
calcLeech:RemoveCustomObject (CUSTOM_DISPLAY_NAME)
create_custom_object()
end
else
create_custom_object()
end
calcLeech.combat.PlayerLeechTrinket = {}
f:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
end
local handle_details_event = function (event, ...)
if (event == "COMBAT_PLAYER_ENTER") then
if (true) then
player_has_trinket (...)
else
local role = UnitGroupRolesAssigned ("player")
if (role == "HEALER") then
local trinket1 = GetInventoryItemLink ("player", 13)
if (trinket1 and trinket1:find ("124234")) then
player_has_trinket (...)
end
local trinket2 = GetInventoryItemLink ("player", 14)
if (trinket2 and trinket2:find ("124234")) then
player_has_trinket (...)
end
end
end
elseif (event == "COMBAT_PLAYER_LEAVE") then
--> details finished a segment
f:UnregisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
elseif (event == "PLUGIN_DISABLED") then
--> plugin has been disabled at the details options panel
elseif (event == "PLUGIN_ENABLED") then
--> plugin has been enabled at the details options panel
end
end
function calcLeech:OnEvent (_, event, ...)
if (event == "ADDON_LOADED") then
local AddonName = select (1, ...)
if (AddonName == "Details_CalcLeech") then
--> every plugin must have a OnDetailsEvent function
function calcLeech:OnDetailsEvent (event, ...)
return handle_details_event (event, ...)
end
--> Install: install -> if successful installed; saveddata -> a table saved inside details db, used to save small amount of data like configs
local install, saveddata = Details:InstallPlugin ("TOOLBAR", "Leech Trinket", "Interface\\Icons\\spell_shadow_lifedrain02", calcLeech, "DETAILS_PLUGIN_LEECH_TRINKET", MINIMAL_DETAILS_VERSION_REQUIRED, "Details! Team", CLEECH_VERSION)
if (type (install) == "table" and install.error) then
print (install.error)
end
--> registering details events we need
Details:RegisterEvent (calcLeech, "COMBAT_PLAYER_ENTER") --when details creates a new segment, not necessary the player entering in combat.
Details:RegisterEvent (calcLeech, "COMBAT_PLAYER_LEAVE") --when details finishs a segment, not necessary the player leaving the combat.
end
end
end
end