-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvirtual.lua
116 lines (102 loc) · 3.91 KB
/
virtual.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
local addon, dark_addon = ...
dark_addon.environment.virtual = {
targets = {},
resolvers = {},
resolved = {},
exclude_tanks = true
}
local function GroupType()
return IsInRaid() and 'raid' or IsInGroup() and 'party' or 'solo'
end
function dark_addon.environment.virtual.validate(virtualID)
if dark_addon.environment.virtual.targets[virtualID] or virtualID == 'group' then
return true
end
return false
end
function dark_addon.environment.virtual.resolve(virtualID)
if virtualID == 'group' then
return 'group', 'group'
else
return dark_addon.environment.virtual.resolved[virtualID], 'unit'
end
end
function dark_addon.environment.virtual.targets.lowest()
local members = GetNumGroupMembers()
local group_type = GroupType()
if dark_addon.environment.virtual.resolvers[group_type] then
return dark_addon.environment.virtual.resolvers[group_type](members)
end
end
function dark_addon.environment.virtual.targets.tank()
return dark_addon.environment.virtual.resolvers.tanks('MAINTANK')
end
function dark_addon.environment.virtual.targets.offtank()
return dark_addon.environment.virtual.resolvers.tanks('MAINASSIST')
end
function dark_addon.environment.virtual.resolvers.unit(unitA, unitB)
local healthA = UnitHealth(unitA) / UnitHealthMax(unitA) * 100
local healthB = UnitHealth(unitB) / UnitHealthMax(unitB) * 100
if healthA < healthB then
return unitA, healthA
else
return unitB, healthB
end
end
function dark_addon.environment.virtual.resolvers.party(members)
local lowest = 'player'
local lowest_health
for i = 1, (members - 1) do
local unit = 'party' .. i
if not UnitCanAttack('player', unit) and UnitInRange(unit) and not UnitIsDeadOrGhost(unit) and (not dark_addon.environment.virtual.exclude_tanks or not dark_addon.environment.virtual.resolvers.tank(unit)) then
if not lowest then
lowest, lowest_health = dark_addon.environment.virtual.resolvers.unit(unit, 'player')
else
lowest, lowest_health = dark_addon.environment.virtual.resolvers.unit(unit, lowest)
end
end
end
return lowest
end
function dark_addon.environment.virtual.resolvers.raid(members)
local lowest = 'player'
local lowest_health
for i = 1, members do
local unit = 'raid' .. i
if not UnitCanAttack('player', unit) and UnitInRange(unit) and not UnitIsDeadOrGhost(unit) and (not dark_addon.environment.virtual.exclude_tanks or not dark_addon.environment.virtual.resolvers.tank(unit)) then
if not lowest then
lowest, lowest_health = unit, UnitHealth(unit)
else
lowest, lowest_health = dark_addon.environment.virtual.resolvers.unit(unit, lowest)
end
end
end
return lowest
end
function dark_addon.environment.virtual.resolvers.tank(unit)
return GetPartyAssignment('MAINTANK', unit) or GetPartyAssignment('MAINASSIST', unit) or UnitGroupRolesAssigned(unit) == 'TANK'
end
function dark_addon.environment.virtual.resolvers.tanks(assignment)
local members = GetNumGroupMembers()
local group_type = GroupType()
if UnitExists('focus') and not UnitCanAttack('player', 'focus') and not UnitIsDeadOrGhost('focus') and assignment == 'MAINTANK' then
return 'focus'
end
if group_type ~= 'solo' then
for i = 1, (members - 1) do
local unit = group_type .. i
if (GetPartyAssignment(assignment, unit) or (assignment == 'MAINTANK' and UnitGroupRolesAssigned(unit) == 'TANK')) and not UnitCanAttack('player', unit) and not UnitIsDeadOrGhost(unit) then return unit end
end
end
return 'player'
end
function dark_addon.environment.virtual.resolvers.solo()
return 'player'
end
dark_addon.on_ready(function()
C_Timer.NewTicker(0.1, function()
for target, callback in pairs(dark_addon.environment.virtual.targets) do
dark_addon.environment.virtual.resolved[target] = callback()
end
end)
end)