Go to most recent revision | Details | Compare with Previous | View Log
Line No. | Rev | Author | Line |
---|---|---|---|
1 | 2 | Blooblahguy-207965 | local bUI, F, C = select(2, ...):unpack() |
2 | Blooblahguy-207965 | local media = bUI.media |
|
3 | Blooblahguy-207965 | ||
4 | Blooblahguy-207965 | local parent, ns = ... |
|
5 | Blooblahguy-207965 | local oUF = ns.oUF or oUF |
|
6 | Blooblahguy-207965 | ||
7 | Blooblahguy-207965 | local update = 0.1 |
|
8 | Blooblahguy-207965 | local healrange = 10 |
|
9 | Blooblahguy-207965 | local units = {} |
|
10 | Blooblahguy-207965 | ||
11 | Blooblahguy-207965 | local timer = 0 |
|
12 | Blooblahguy-207965 | function round(num, idp) |
|
13 | Blooblahguy-207965 | if idp and idp>0 then |
|
14 | Blooblahguy-207965 | local mult = 10^idp |
|
15 | Blooblahguy-207965 | return math.floor(num * mult + 0.5) / mult |
|
16 | Blooblahguy-207965 | end |
|
17 | Blooblahguy-207965 | return math.floor(num + 0.5) |
|
18 | Blooblahguy-207965 | end |
|
19 | Blooblahguy-207965 | local validUnit = function(unit) |
|
20 | Blooblahguy-207965 | return UnitExists(unit) and not UnitIsDeadOrGhost(unit) and UnitIsConnected(unit) and not (UnitIsCharmed(unit) and not UnitIsEnemy("player", unit)) |
|
21 | Blooblahguy-207965 | end |
|
22 | Blooblahguy-207965 | local function getDistance(x1, y1, x2, y2) |
|
23 | Blooblahguy-207965 | local xx = (x2 - x1) |
|
24 | Blooblahguy-207965 | local yy = (y2 - y1) |
|
25 | Blooblahguy-207965 | ||
26 | Blooblahguy-207965 | return (xx*xx + yy*yy)^0.5 |
|
27 | Blooblahguy-207965 | end |
|
28 | Blooblahguy-207965 | ||
29 | Blooblahguy-207965 | local clearDataid = function(id, id2) |
|
30 | Blooblahguy-207965 | if units[id][id2] then |
|
31 | Blooblahguy-207965 | units[id][id2] = nil |
|
32 | Blooblahguy-207965 | units[id].numInRange = units[id].numInRange-1 |
|
33 | Blooblahguy-207965 | end |
|
34 | Blooblahguy-207965 | if units[id2][id] then |
|
35 | Blooblahguy-207965 | units[id2][id] = nil |
|
36 | Blooblahguy-207965 | units[id2].numInRange = units[id2].numInRange-1 |
|
37 | Blooblahguy-207965 | end |
|
38 | Blooblahguy-207965 | end |
|
39 | Blooblahguy-207965 | ||
40 | Blooblahguy-207965 | local updatePos = function(self, elapsed) |
|
41 | Blooblahguy-207965 | timer = timer + elapsed |
|
42 | Blooblahguy-207965 | ||
43 | Blooblahguy-207965 | if(timer >= update) then |
|
44 | Blooblahguy-207965 | for id, _ in next, units do |
|
45 | Blooblahguy-207965 | local x, y = GetPlayerMapPosition(id) |
|
46 | Blooblahguy-207965 | x = x*550 |
|
47 | Blooblahguy-207965 | y = y*550 |
|
48 | Blooblahguy-207965 | -- no idea why 550 is the magic number |
|
49 | Blooblahguy-207965 | ||
50 | Blooblahguy-207965 | units[id].pos = ""..x.."\\"..y.."" |
|
51 | Blooblahguy-207965 | end |
|
52 | Blooblahguy-207965 | ||
53 | Blooblahguy-207965 | for id, _ in next, units do |
|
54 | Blooblahguy-207965 | local pos = units[id].pos |
|
55 | Blooblahguy-207965 | ||
56 | Blooblahguy-207965 | for id2, _ in next, units do |
|
57 | Blooblahguy-207965 | if validUnit(id2) and (id ~= id2) then |
|
58 | Blooblahguy-207965 | local pos2 = units[id2].pos |
|
59 | Blooblahguy-207965 | ||
60 | Blooblahguy-207965 | local x1, y1 = strsplit("\\", pos) |
|
61 | Blooblahguy-207965 | local x2, y2 = strsplit("\\", pos2) |
|
62 | Blooblahguy-207965 | local xxyy = x1 + x2 + y1 + y2 |
|
63 | Blooblahguy-207965 | ||
64 | Blooblahguy-207965 | local dist = getDistance(x1, y1, x2, y2) |
|
65 | Blooblahguy-207965 | if dist < healrange and xxyy > 0 then |
|
66 | Blooblahguy-207965 | if not units[id][id2] then |
|
67 | Blooblahguy-207965 | units[id][id2] = true |
|
68 | Blooblahguy-207965 | units[id].numInRange = units[id].numInRange+1 |
|
69 | Blooblahguy-207965 | end |
|
70 | Blooblahguy-207965 | if not units[id2][id] then |
|
71 | Blooblahguy-207965 | units[id2][id] = true |
|
72 | Blooblahguy-207965 | units[id2].numInRange = units[id2].numInRange+1 |
|
73 | Blooblahguy-207965 | end |
|
74 | Blooblahguy-207965 | else |
|
75 | Blooblahguy-207965 | clearDataid(id, id2) |
|
76 | Blooblahguy-207965 | end |
|
77 | Blooblahguy-207965 | else |
|
78 | Blooblahguy-207965 | clearDataid(id, id2) |
|
79 | Blooblahguy-207965 | end |
|
80 | Blooblahguy-207965 | end |
|
81 | Blooblahguy-207965 | end |
|
82 | Blooblahguy-207965 | ||
83 | Blooblahguy-207965 | timer = 0 |
|
84 | Blooblahguy-207965 | end |
|
85 | Blooblahguy-207965 | end |
|
86 | Blooblahguy-207965 | ||
87 | Blooblahguy-207965 | oUF.Tags.Methods['freebgrid:cluster'] = function(u) |
|
88 | Blooblahguy-207965 | if units[u] then |
|
89 | Blooblahguy-207965 | local num = units[u].numInRange |
|
90 | Blooblahguy-207965 | --print(u..": "..num) |
|
91 | Blooblahguy-207965 | if num > 2 then |
|
92 | Blooblahguy-207965 | if num > 6 then |
|
93 | Blooblahguy-207965 | num = "6" |
|
94 | Blooblahguy-207965 | end |
|
95 | Blooblahguy-207965 | ||
96 | Blooblahguy-207965 | return num |
|
97 | Blooblahguy-207965 | end |
|
98 | Blooblahguy-207965 | end |
|
99 | Blooblahguy-207965 | end |
|
100 | Blooblahguy-207965 | ||
101 | Blooblahguy-207965 | local fillroster = function(unit) |
|
102 | Blooblahguy-207965 | if (validUnit(unit)) then |
|
103 | Blooblahguy-207965 | units[unit] = {} |
|
104 | Blooblahguy-207965 | units[unit].pos = "" |
|
105 | Blooblahguy-207965 | units[unit].numInRange = 1 |
|
106 | Blooblahguy-207965 | else |
|
107 | Blooblahguy-207965 | units[unit] = nil |
|
108 | Blooblahguy-207965 | end |
|
109 | Blooblahguy-207965 | --["pos"] = "", ["numInRange"] = 1 |
|
110 | Blooblahguy-207965 | end |
|
111 | Blooblahguy-207965 | ||
112 | Blooblahguy-207965 | local updateRoster = function() |
|
113 | Blooblahguy-207965 | units = {} |
|
114 | Blooblahguy-207965 | local numRaid = GetNumGroupMembers() |
|
115 | Blooblahguy-207965 | if numRaid > 1 then |
|
116 | Blooblahguy-207965 | for i=1, numRaid do |
|
117 | Blooblahguy-207965 | local name = GetRaidRosterInfo(i) |
|
118 | Blooblahguy-207965 | if name then |
|
119 | Blooblahguy-207965 | local unit = "raid"..i |
|
120 | Blooblahguy-207965 | fillroster(unit) |
|
121 | Blooblahguy-207965 | end |
|
122 | Blooblahguy-207965 | end |
|
123 | Blooblahguy-207965 | else |
|
124 | Blooblahguy-207965 | fillroster("player") |
|
125 | Blooblahguy-207965 | ||
126 | Blooblahguy-207965 | local numParty = GetNumSubgroupMembers() |
|
127 | Blooblahguy-207965 | for i=1, numParty do |
|
128 | Blooblahguy-207965 | local unit = "party"..i |
|
129 | Blooblahguy-207965 | fillroster(unit) |
|
130 | Blooblahguy-207965 | end |
|
131 | Blooblahguy-207965 | end |
|
132 | Blooblahguy-207965 | end |
|
133 | Blooblahguy-207965 | ||
134 | Blooblahguy-207965 | local frame = CreateFrame"Frame" |
|
135 | Blooblahguy-207965 | frame:SetScript("OnEvent", function(self, event) |
|
136 | Blooblahguy-207965 | updateRoster() |
|
137 | Blooblahguy-207965 | end) |
|
138 | Blooblahguy-207965 | ||
139 | Blooblahguy-207965 | ||
140 | Blooblahguy-207965 | local Enable = function(self) |
|
141 | Blooblahguy-207965 | if self.clusterEnabled then |
|
142 | Blooblahguy-207965 | ||
143 | Blooblahguy-207965 | self.freebCluster = self.Health:CreateFontString(nil, "OVERLAY") |
|
144 | Blooblahguy-207965 | self.freebCluster:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 0, 0) |
|
145 | Blooblahguy-207965 | self.freebCluster:SetJustifyH("LEFT") |
|
146 | Blooblahguy-207965 | self.freebCluster:SetFont(media.font, 12, "OUTLINE") |
|
147 | Blooblahguy-207965 | self.freebCluster:SetTextColor(1,1,1) |
|
148 | Blooblahguy-207965 | self.freebCluster:SetWidth(20) |
|
149 | Blooblahguy-207965 | self.freebCluster.frequentUpdates = update |
|
150 | Blooblahguy-207965 | self:Tag(self.freebCluster, "[freebgrid:cluster]") |
|
151 | Blooblahguy-207965 | self.freebCluster:Show() |
|
152 | Blooblahguy-207965 | ||
153 | Blooblahguy-207965 | self:HookScript("OnUpdate", function(self, elapsed) |
|
154 | Blooblahguy-207965 | local text = tonumber(self.freebCluster:GetText()); |
|
155 | Blooblahguy-207965 | if (text) then |
|
156 | Blooblahguy-207965 | if (text < 4) then |
|
157 | Blooblahguy-207965 | self.freebCluster:SetTextColor(.6,.6,.6) |
|
158 | Blooblahguy-207965 | elseif (text == 5) then |
|
159 | Blooblahguy-207965 | self.freebCluster:SetTextColor(.9,1,.9) |
|
160 | Blooblahguy-207965 | elseif (text > 5) then |
|
161 | Blooblahguy-207965 | self.freebCluster:SetTextColor(.6,1,.7) |
|
162 | Blooblahguy-207965 | end |
|
163 | Blooblahguy-207965 | end |
|
164 | Blooblahguy-207965 | end) |
|
165 | Blooblahguy-207965 | ||
166 | Blooblahguy-207965 | frame:RegisterEvent("GROUP_ROSTER_UPDATE") |
|
167 | Blooblahguy-207965 | frame:RegisterEvent("PLAYER_ENTERING_WORLD") |
|
168 | Blooblahguy-207965 | frame:RegisterEvent("ZONE_CHANGED_NEW_AREA") |
|
169 | Blooblahguy-207965 | frame:SetScript("OnUpdate", updatePos) |
|
170 | Blooblahguy-207965 | updateRoster() |
|
171 | Blooblahguy-207965 | ||
172 | Blooblahguy-207965 | return true |
|
173 | Blooblahguy-207965 | end |
|
174 | Blooblahguy-207965 | ||
175 | Blooblahguy-207965 | end |
|
176 | Blooblahguy-207965 | ||
177 | Blooblahguy-207965 | ||
178 | Blooblahguy-207965 | ||
179 | Blooblahguy-207965 | local Disable = function(self) |
|
180 | Blooblahguy-207965 | if self.freebCluster then |
|
181 | Blooblahguy-207965 | self.freebCluster.frequentUpdates = false |
|
182 | Blooblahguy-207965 | self.freebCluster:Hide() |
|
183 | Blooblahguy-207965 | end |
|
184 | Blooblahguy-207965 | ||
185 | Blooblahguy-207965 | frame:UnregisterEvent("GROUP_ROSTER_UPDATE") |
|
186 | Blooblahguy-207965 | frame:UnregisterEvent("PLAYER_ENTERING_WORLD") |
|
187 | Blooblahguy-207965 | frame:UnregisterEvent("ZONE_CHANGED_NEW_AREA") |
|
188 | Blooblahguy-207965 | frame:SetScript("OnUpdate", nil) |
|
189 | Blooblahguy-207965 | units = {} |
|
190 | Blooblahguy-207965 | end |
|
191 | Blooblahguy-207965 | ||
192 | Blooblahguy-207965 | oUF:AddElement('freebCluster', nil, Enable, Disable) |