WoWInterface SVN bdGrid

[/] [trunk/] [lib/] [cluster.lua] - Blame information for rev 2

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)