Compare with Previous | Blame | View Log
--
htHealerHelper = {}
htHealerHelper.name = "HyperToxicsHealerHelper"
htHealerHelper.version = 0.1
htHealerHelper.unitTags = {}
htHealerHelper.inCombat = false
htHealerHelper.playerName = ""
htHealerHelper.LOW_HEALTH = 0.60
-- Initialize our addon
function htHealerHelper.OnAddOnLoaded(eventCode, addOnName)
if (addOnName == htHealerHelper.name) then
htHealerHelper:Initialize()
end
end
--integer eventCode, string unitTag, integer powerIndex, integer powerType, integer powerValue, integer powerMax, integer powerEffectiveMax
function htHealerHelper.OnPowerUpdate(eventCode, unitTag, powerIndex, powerType, powerValue, powerMax, powerEffectiveMax)
htHealerHelper.UpdateVolatileUnitInfo(unitTag)
end
function htHealerHelper:Initialize()
self.inCombat = IsUnitInCombat("player")
self.playerName = GetUnitName("player")
EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_COMBAT_STATE, self.OnPlayerCombatState);
EVENT_MANAGER:RegisterForEvent(self.name, EVENT_POWER_UPDATE, htHealerHelper.OnPowerUpdate);
--self.savedVariables = ZO_SavedVars:New("HyperToxicHealerHelperSavedVariables", 1, nil, {})
self.savedVariables = ZO_SavedVars:NewAccountWide("HyperToxicHealerHelperSavedVariables", 1, nil, {})
self:RestorePosition()
htHealerHelperIndicatorBG:SetAlpha(0)
htHealerHelperIndicator:SetWidth( 600 )
htHealerHelperIndicator:SetHeight( 50 )
htHealerHelperIndicatorT:ClearAnchors();
htHealerHelperIndicatorT:SetAnchor(CENTER, htHealerHelperIndicator, CENTER, 0, 0)
htHealerHelperIndicatorT:SetWidth( 600 )
htHealerHelperIndicatorT:SetHeight( 50 )
htHealerHelperIndicatorT:SetHorizontalAlignment(1)
EVENT_MANAGER:RegisterForEvent(self.name, EVENT_GAME_CAMERA_UI_MODE_CHANGED, htHealerHelper.UIModeChanged)
EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_ACTIVATED, htHealerHelper.LateInitialize);
EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_ADD_ON_LOADED);
EVENT_MANAGER:RegisterForEvent(self.name, EVENT_ACTION_LAYER_POPPED , htHealerHelper.ShowInterface)
EVENT_MANAGER:RegisterForEvent(self.name, EVENT_ACTION_LAYER_PUSHED , htHealerHelper.HideInterface)
end
-- Fancy loaded message
function htHealerHelper.LateInitialize(eventCode, addOnName)
d("HyperToxic's Healer Helper loaded...")
EVENT_MANAGER:UnregisterForEvent(htHealerHelper.name, EVENT_PLAYER_ACTIVATED);
end
function htHealerHelper.OnPlayerCombatState(event, inCombat)
-- The ~= operator is "not equal to" in Lua.
if inCombat ~= htHealerHelper.inCombat then
-- The player's state has changed. Update the stored state...
htHealerHelper.inCombat = inCombat
if inCombat then
-- entering combat - clear unitTags
htHealerHelper.unitTags = {}
else
-- exiting combat - clear indicator
htHealerHelperIndicatorT:SetColor(255, 255, 255, 255)
htHealerHelperIndicatorT:SetText("")
end
end
end
function htHealerHelper.UpdateIndicator()
--unit.Name = GetUnitName(unitTag)
--unit.Dead = IsUnitDead(unitTag)
--unit.Online = IsUnitOnline(unitTag)
--unit.HealthPercent = currentHp / maxHp
--unit.LowHealth = unit.HealthPercent <= htHealerHelper.LOW_HEALTH
--unit.InSupportRange = IsUnitInGroupSupportRange(unitTag)
--unit.UnitTag = unitTag
local priorityUnit = nil;
if htHealerHelper.inCombat then
--do we have a low health ally nearby
for i, unit in pairs(htHealerHelper.unitTags) do
if unit.Online and (not unit.Dead) and unit.InSupportRange and unit.LowHealth then
if not priorityUnit then
priorityUnit = unit
else
if unit.HealthPercent < priorityUnit.HealthPercent then
priorityUnit = unit
end
end
end
end
--if we dont have a low health ally nearby select a low health out of range ally.
if not priorityUnit then
for i, unit in pairs(htHealerHelper.unitTags) do
if unit.Online and (not unit.Dead) and (not unit.InSupportRange) and unit.LowHealth then
if not priorityUnit then
priorityUnit = unit
else
if unit.HealthPercent < priorityUnit.HealthPercent then
priorityUnit = unit
end
end
end
end
end
if priorityUnit then
if priorityUnit.InSupportRange then
htHealerHelperIndicatorT:SetColor(255, 0, 0, 255)
if htHealerHelper.playerName == priorityUnit.Name then
htHealerHelperIndicatorT:SetText("Heal yourself!")
else
htHealerHelperIndicatorT:SetText("Heal " .. priorityUnit.Name .. ".")
end
else
htHealerHelperIndicatorT:SetColor(255, 255, 0, 255)
htHealerHelperIndicatorT:SetText(priorityUnit.Name .. " is out of range.")
end
else
htHealerHelperIndicatorT:SetText("")
end
end
end
function htHealerHelper.UpdateVolatileUnitInfo(unitTag)
if not unitTag then
return
end
local currentHp, maxHp, effectiveMaxHp
local unit = {}
if htHealerHelper.inCombat and (string.sub(unitTag,1,string.len("group"))=="group" or string.sub(unitTag,1,string.len("player"))=="player") then
currentHp, maxHp, effectiveMaxHp = GetUnitPower(unitTag, POWERTYPE_HEALTH)
unit.Name = GetUnitName(unitTag)
unit.Dead = IsUnitDead(unitTag)
unit.Online = IsUnitOnline(unitTag)
unit.HealthPercent = currentHp / maxHp
unit.LowHealth = unit.HealthPercent <= htHealerHelper.LOW_HEALTH
unit.InSupportRange = IsUnitInGroupSupportRange(unitTag)
unit.UnitTag = unitTag
htHealerHelper.unitTags[unitTag] = unit
htHealerHelper.UpdateIndicator()
end
end
function htHealerHelper.OnIndicatorMoveStop()
htHealerHelper.savedVariables.left = htHealerHelperIndicator:GetLeft()
htHealerHelper.savedVariables.top = htHealerHelperIndicator:GetTop()
end
function htHealerHelper:RestorePosition()
local left = self.savedVariables.left
local top = self.savedVariables.top
htHealerHelperIndicator:ClearAnchors()
htHealerHelperIndicator:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, left, top)
end
function htHealerHelper.UIModeChanged()
-- zo_callLater(function () d(IsMenuVisisble()) end, 1000)
if (IsReticleHidden()) then
htHealerHelperIndicatorBG:SetAlpha(100)
htHealerHelperIndicatorT:SetText("Healer Helper")
else
htHealerHelperIndicatorBG:SetAlpha(0)
htHealerHelperIndicatorT:SetText("")
end
end
-- Hide or show the add-on when other panels are open, like inventory.
-- There's probably a better way to hook this into the scene manager.
function htHealerHelper.HideInterface(eventCode,layerIndex,activeLayerIndex)
--d(layerIndex .. ":" .. activeLayerIndex)
-- We don't want to hide the interface if this is the user pressing the "." key, only if there's an interface displayed
if (activeLayerIndex == 3) then
htHealerHelperIndicator:SetHidden(true)
end
end
function htHealerHelper.ShowInterface(...)
htHealerHelperIndicator:SetHidden(false)
end
EVENT_MANAGER:RegisterForEvent(htHealerHelper.name, EVENT_ADD_ON_LOADED, htHealerHelper.OnAddOnLoaded);