You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
441 lines
12 KiB
Lua
441 lines
12 KiB
Lua
|
|
aura_env.gather_data = function()
|
|
|
|
aura_env.log(aura_env.LOG.TRACE, "Entering gather_data()")
|
|
|
|
local data = {}
|
|
|
|
-- Get a sorted list of friends that need help.
|
|
if aura_env.config.fake then
|
|
data = aura_env.iterate_party_fake()
|
|
else
|
|
data = aura_env.iterate_party()
|
|
print("after iterate_party")
|
|
end
|
|
|
|
print("type(data.party_members): " .. type(data.party_members))
|
|
aura_env.log(aura_env.LOG.DEBUG, "DEBUG - Got " .. #data.party_members .. " friends that can be helped.")
|
|
|
|
aura_env.print_data(data)
|
|
members = WA_IterateGroupMembers()()
|
|
print("type(WA_IterateGroupMembers()): " .. type(members))
|
|
print("members: " .. members)
|
|
for i in WA_IterateGroupMembers() do
|
|
print("type(i): " .. type(i))
|
|
end
|
|
for i in aura_env.group_members() do
|
|
print("type(i): " .. type(i))
|
|
print(i)
|
|
end
|
|
|
|
return data
|
|
end
|
|
|
|
|
|
aura_env.interval_has_passed = function()
|
|
if GetTime() > aura_env.nextupdate then
|
|
aura_env.nextupdate = GetTime() + (aura_env.config.update_interval_ms / 1000)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
|
|
aura_env.unit_in_range_and_can_help = function(unit)
|
|
|
|
in_range = false
|
|
|
|
-- 'player' is always in range and API actually returns false when UnitInRange is called on
|
|
-- 'player'
|
|
if unit == 'player' then
|
|
in_range = true
|
|
else
|
|
in_range, _ = UnitInRange(unit)
|
|
end
|
|
|
|
if UnitExists(unit) and not UnitIsDead(unit) and UnitIsVisible(unit) and UnitIsFriend('player', unit) then
|
|
|
|
-- UnitInRange only works on party members. Therefore if the unit is the target or focus
|
|
-- then we need to check the range another way.
|
|
if unit == 'target' or unit == 'focus' then
|
|
-- TODO make 'Rejeventaion' be a config option. IsSpellInRange requires that the
|
|
-- player knows the spell.
|
|
if IsSpellInRange('Rejuvenation', unit) == 1 then
|
|
return true
|
|
end
|
|
else -- unit should be in the party/raid
|
|
if in_range then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
|
|
-- lowest is an object { unit, percent }
|
|
-- aura_env.check_for_lowest = function(unit, lowest)
|
|
-- local health = UnitHealth(unit)
|
|
-- local max = UnitHealthMax(unit)
|
|
-- local percent = 1
|
|
--
|
|
-- if max > 0 then
|
|
-- percent = health / max
|
|
-- end
|
|
--
|
|
-- if percent < lowest[2] then
|
|
-- lowest = {unit, percent}
|
|
-- end
|
|
--
|
|
-- return lowest
|
|
-- end
|
|
|
|
|
|
-- Returns { current: int, max: int, perc: float, adj_perc: float }
|
|
aura_env.get_health = function(friend)
|
|
|
|
-- Get the current and max health for our friend.
|
|
local current = UnitHealth(friend)
|
|
local max = UnitHealthMax(friend)
|
|
|
|
-- Calculate the percent of health.
|
|
-- - We must check for 0 becaue UnitHealMax will return 0 if the unit does not
|
|
-- exist.
|
|
-- - We default perc to 1 becuase the idea is that if it's full health then it
|
|
-- won't bother the algo.
|
|
local perc = 1
|
|
if max > 0 then
|
|
perc = current / max
|
|
end
|
|
|
|
local health = { current = current, max = max, perc = perc, adj_perc = aura_env.get_adjusted_health(friend, perc) }
|
|
return health
|
|
end
|
|
|
|
|
|
-- Returns a float that is the users health percentage updated by a weighting system.
|
|
-- Input: { current: int, max: int, perc: float }
|
|
-- Returns: float
|
|
aura_env.get_adjusted_health = function(friend, perc)
|
|
return perc
|
|
end
|
|
|
|
|
|
aura_env.get_mana = function(friend)
|
|
|
|
-- Get the current and max mana for our friend.
|
|
local current = UnitPower(friend)
|
|
local max = UnitPowerMax(friend)
|
|
|
|
-- Calculate the percent of mana.
|
|
-- - We must check for 0 becaue UnitPowerMax will return 0 if the unit does
|
|
-- not exist. _NOTE_ This is not actually verified, just assuming because
|
|
-- I found examples for health that stated this.
|
|
-- - We default perc to 1 becuase the idea is that if it's full mana then
|
|
-- it won't bother the algo.
|
|
local perc = 1
|
|
if max > 0 then
|
|
perc = current / max
|
|
end
|
|
|
|
local mana = { current = current, max = max, perc = perc }
|
|
return mana
|
|
end
|
|
|
|
|
|
aura_env.insert_health_sorted = function(friends, friend)
|
|
|
|
-- If their health is 100% then jsut append to the end.
|
|
if friend.health.adj_perc >= 1 then
|
|
table.insert(friends, friend)
|
|
return friends
|
|
end
|
|
|
|
local index = 1
|
|
while index <= #friends and
|
|
friend.health.adj_perc > friends[index].health.adj_perc
|
|
do
|
|
index = index + 1
|
|
end
|
|
|
|
table.insert(friends, index, friend)
|
|
|
|
end
|
|
|
|
-- Iterate over the party and grab useful data.
|
|
--
|
|
-- This function will return a table with the following format.
|
|
-- {
|
|
-- player: Player
|
|
-- party_health: Resource
|
|
-- party_members: {
|
|
-- Player,
|
|
-- Player,
|
|
-- ...
|
|
-- }
|
|
--
|
|
-- Player: {
|
|
-- name: string
|
|
-- health: Resource
|
|
-- [mana: Resource]
|
|
-- }
|
|
--
|
|
-- Resource: {
|
|
-- current: int
|
|
-- max: int
|
|
-- perc: float
|
|
-- [adj_perc: float]
|
|
-- }
|
|
aura_env.iterate_party = function()
|
|
|
|
aura_env.log(aura_env.LOG.TRACE, "Entering iterate_party()")
|
|
|
|
local data = {
|
|
party_health = { current = 0, max = 0, perc = 1 },
|
|
party_members = {}
|
|
}
|
|
|
|
-- Iterate over party.
|
|
for friend in WA_IterateGroupMembers() do
|
|
if aura_env.unit_in_range_and_can_help(friend) then
|
|
|
|
-- Get our friends health percentage.
|
|
local health = aura_env.get_health(friend)
|
|
|
|
--local player = { name = friend, health = aura_env.get_health(friend) }
|
|
local player = { name = friend, health = health }
|
|
|
|
-- Do some special stuff if friend is us.
|
|
if friend == "player" then
|
|
player.mana = aura_env.get_mana("player")
|
|
data.player = player
|
|
end
|
|
|
|
-- Update the party total health stats
|
|
--
|
|
-- perc will be calculated at the end.
|
|
data.party_health.current = data.party_health.current + player.health.current
|
|
data.party_health.max = data.party_health.max + player.health.max
|
|
|
|
-- Insert player into friends based on their adjusted health percentage.
|
|
aura_env.insert_health_sorted(data.party_members, player)
|
|
|
|
end
|
|
end
|
|
|
|
print("before party health perc calc")
|
|
-- Calculate the party's total health perc.
|
|
if data.party_health.max ~= 0 then
|
|
data.party_health.perc = data.party_health.current / data.party_health.max
|
|
end
|
|
|
|
return data
|
|
|
|
end
|
|
|
|
|
|
aura_env.iterate_party_fake = function()
|
|
|
|
aura_env.log(aura_env.LOG.TRACE, "Entering iterate_party_fake()")
|
|
|
|
local player = { name = "player", health = { current = 1, max = 1, perc = 1, adj_perc = 1 }}
|
|
local unsorted_friends = {
|
|
{ name = "player",
|
|
health = {
|
|
current = 1, max = 1, perc = 1, adj_perc = 1 }},
|
|
{ name = "party1",
|
|
health = {
|
|
current = 1, max = 1, perc = 1, adj_perc = 0.9 }},
|
|
{ name = "party2",
|
|
health = {
|
|
current = 1, max = 1, perc = 1, adj_perc = 0.8 }}
|
|
}
|
|
local data = {
|
|
player = player,
|
|
party_health = { current = 3, max = 3, perc = 1 },
|
|
party_members = {}
|
|
}
|
|
|
|
|
|
for _, friend in ipairs(unsorted_friends) do
|
|
aura_env.insert_health_sorted(data.party_members, friend)
|
|
end
|
|
|
|
return data
|
|
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Start common code
|
|
--
|
|
-- Everything below this point is code that is likely to be shared among
|
|
-- serveral auras.
|
|
--------------------------------------------------------------------------------
|
|
|
|
aura_env.nextupdate = 0
|
|
|
|
aura_env.LOG = {
|
|
NONE = 1,
|
|
ERROR = 2,
|
|
INFO = 3,
|
|
DEBUG = 4,
|
|
TRACE = 5
|
|
}
|
|
aura_env.log_level = aura_env.LOG.INFO
|
|
-- aura_env.log_level = aura_env.LOG.TRACE
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Types
|
|
--------------------------------------------------------------------------------
|
|
|
|
-- Data Types
|
|
-- data: {
|
|
-- player: Player
|
|
-- party_health: Resource
|
|
-- party_members: {
|
|
-- Player,
|
|
-- Player,
|
|
-- ...
|
|
-- }
|
|
--
|
|
-- Player: {
|
|
-- name: string
|
|
-- health: Resource
|
|
-- [mana: Resource]
|
|
-- }
|
|
--
|
|
-- Resource: {
|
|
-- current: int
|
|
-- max: int
|
|
-- perc: float
|
|
-- [adj_perc: float]
|
|
-- }
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Printing and string formatting
|
|
--------------------------------------------------------------------------------
|
|
|
|
aura_env.print_data = function(data)
|
|
|
|
aura_env.log(aura_env.LOG.TRACE, "Entering print_data()")
|
|
|
|
-- print("data: " .. data)
|
|
print("#data: " .. #data.party_members)
|
|
-- print("data[1].health: " .. data[1].health.current)
|
|
|
|
print("{\n player: " .. aura_env.player_to_str(data.player) .. ",")
|
|
print(" party_health: " .. aura_env.resource_to_str(data.party_health) .. ",")
|
|
print(" party_members: [")
|
|
|
|
for _, player in ipairs(data.party_members) do
|
|
print(" " .. aura_env.player_to_str(player) .. ",")
|
|
end
|
|
print(" ] }")
|
|
|
|
end
|
|
|
|
|
|
aura_env.player_to_str = function(player, pretty_print, num_spaces)
|
|
|
|
aura_env.log(aura_env.LOG.TRACE, "Entering resource_to_str()")
|
|
|
|
-- Set defaults and initial values
|
|
local player_str = "PLAYER_ERROR"
|
|
local num_spaces = num_spaces or 0
|
|
local spaces = string.rep(" ", num_spaces)
|
|
if pretty_print == nil then
|
|
pretty_print = false
|
|
end
|
|
local nl_spaces = pretty_print and "\n" .. spaces or ""
|
|
|
|
-- Print an error if player is not a table.
|
|
if type(player) ~= "table" then
|
|
aura_env.log(aura_env.LOG.ERROR, "ERROR - player_to_str() got a player that was not a table.")
|
|
else
|
|
|
|
-- Add name and health to player string.
|
|
player_str = spaces .. "{" .. nl_spaces .. " name: " .. player.name ..
|
|
"," .. nl_spaces .. " health: " .. aura_env.resource_to_str(player.health)
|
|
|
|
-- Add mana if it exists in player.
|
|
if player.mana ~= nil then
|
|
player_str = player_str .. "," .. nl_spaces .. " mana: " .. aura_env.resource_to_str(player.mana)
|
|
end
|
|
|
|
-- Finsh object string.
|
|
player_str = player_str .. nl_spaces .. "}"
|
|
|
|
end
|
|
|
|
return player_str
|
|
|
|
end
|
|
|
|
|
|
aura_env.resource_to_str = function(resource)
|
|
|
|
aura_env.log(aura_env.LOG.TRACE, "Entering resource_to_str()")
|
|
|
|
local resource_str = "RESOURCE_ERROR"
|
|
|
|
if not (type(resource) == "table") then
|
|
aura_env.log(aura_env.LOG.ERROR, "ERROR - resource_to_str() got a resource that was not a table.")
|
|
else
|
|
|
|
resource_str = "{ current: " .. resource.current .. ", max: " ..
|
|
resource.max .. ", perc: " .. resource.perc
|
|
|
|
-- Add adj_perc, if it exists
|
|
if resource.adj_perc ~= nil then
|
|
resource_str = resource_str .. ", adj_perc: " .. resource.adj_perc
|
|
end
|
|
|
|
resource_str = resource_str .. " }"
|
|
end
|
|
|
|
return resource_str
|
|
|
|
end
|
|
|
|
|
|
aura_env.log = function(log_level, msg)
|
|
if log_level <= aura_env.log_level then
|
|
print(msg)
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Fake Data
|
|
--------------------------------------------------------------------------------
|
|
|
|
aura_env.fake_group = {
|
|
player = "yo",
|
|
party1 = "yo",
|
|
party2 = "yo"
|
|
}
|
|
|
|
aura_env.group_members = function()
|
|
|
|
if aura_env.config.fake then
|
|
local i = 0
|
|
local num_members = 3
|
|
local group_type = "party"
|
|
|
|
return function()
|
|
local ret
|
|
if i == 0 then
|
|
ret = "player"
|
|
elseif i >= 0 and i < num_members then
|
|
ret = group_type .. i
|
|
end
|
|
i = i + 1
|
|
return ret
|
|
end
|
|
|
|
else
|
|
return WA_IterateGroupMembers()
|
|
end
|
|
|
|
end
|
|
|