Initial Code Copied From WoW

master
shnee 2 years ago
commit cd19de19be

@ -0,0 +1,440 @@
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
Loading…
Cancel
Save