vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 local SavedRoster = nil
2 local XswapCount = 0
3 local XmoveCount = 0
4 local XPendingRosters = 0
5 local WaitingForRoster
6  
7 -- AdminCommands
8 local function AdminCommands(msg)
9 local args = {}
10 for value in string.gfind(msg, "[^ ]+") do
11 tinsert(args, string.lower(value))
12 end
13  
14 if (not args[1]) then
15 XPerl_AdminFrame:Show()
16 else
17 if (not XPerl_AdminCommands[args[1]] or not XPerl_AdminCommands[args[1]](args[2], args[3], args[4])) then
18 XPerl_AdminCommands.help()
19 end
20 end
21 end
22  
23 -- DefaultVar
24 local function DefaultVar(name, value)
25 if (XPerl_Admin[name] == nil or (type(value) ~= type(XPerl_Admin[name]))) then
26 XPerl_Admin[name] = value
27 end
28 end
29  
30 -- Defaults
31 local function Defaults()
32  
33 if (not XPerl_Admin) then
34 XPerl_Admin = {}
35 end
36  
37 DefaultVar("AutoHideShow", 1)
38 DefaultVar("SavedRosters", {})
39  
40 DefaultVar("Transparency", 0.8)
41 DefaultVar("Scale_ItemCheck", 1)
42 DefaultVar("Scale_Admin", 1)
43 end
44  
45 -- XPerl_AdminOnLoad
46 function XPerl_AdminOnLoad()
47  
48 XPerl_Admin = {}
49  
50 SlashCmdList["XPERLRAIDADMIN"] = AdminCommands
51 SLASH_XPERLRAIDADMIN1 = "/rad"
52 SLASH_XPERLRAIDADMIN2 = "/xpadmin"
53 SLASH_XPERLRAIDADMIN3 = "/xpad"
54  
55 this:RegisterEvent("VARIABLES_LOADED")
56 this:RegisterEvent("RAID_ROSTER_UPDATE")
57 end
58  
59 -- XPerl_AdminStartup
60 local function XPerl_AdminStartup()
61  
62 Defaults()
63 XPerl_AdminFrame_TitleBar_Pin:SetButtonTex()
64  
65 XPerl_Check_Setup()
66 XPerl_AdminSetupFrames()
67  
68 end
69  
70 -- XPerl_SetupFrameSimple
71 function XPerl_SetupFrameSimple(argFrame, alpha)
72 argFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, alpha or 1)
73 argFrame:SetBackdropColor(0, 0, 0, alpha or 1)
74 end
75  
76 -- XPerl_AdminSetupFrames()
77 function XPerl_AdminSetupFrames()
78 XPerl_SetupFrameSimple(XPerl_Check)
79 XPerl_SetupFrameSimple(XPerl_CheckListItems)
80 XPerl_SetupFrameSimple(XPerl_CheckListPlayers)
81  
82 XPerl_SetupFrameSimple(XPerl_AdminFrame)
83  
84 XPerl_Check:SetAlpha(XPerl_Admin.Transparency)
85 XPerl_AdminFrame:SetAlpha(XPerl_Admin.Transparency)
86  
87 XPerl_Check:SetScale(XPerl_Admin.Scale_ItemCheck)
88 XPerl_AdminFrame:SetScale(XPerl_Admin.Scale_Admin)
89 end
90  
91 -- XPerl_Help
92 local function XPerl_Help()
93 XPerl_Message("/rad [save | load name] [auto]")
94 end
95  
96 -- CheckMyRank
97 local function CheckMyRank()
98 if (XPerl_Admin.AutoHideShow == 1) then
99 if (GetNumRaidMembers() > 0) then
100 local me = UnitName("player")
101 for i = 1,GetNumRaidMembers() do
102 local name, rank = GetRaidRosterInfo(i)
103 if (name == me) then
104 if (rank > 0) then
105 XPerl_AdminFrame:Show()
106 else
107 XPerl_AdminFrame:Hide()
108 end
109 break
110 end
111 end
112 else
113 XPerl_AdminFrame:Hide()
114 end
115 end
116 end
117  
118 -- XPerl_ToggleAuto
119 local function XPerl_ToggleAuto()
120 if (XPerl_Admin.AutoHideShow == 1) then
121 XPerl_Admin.AutoHideShow = 0
122 else
123 XPerl_Admin.AutoHideShow = 1
124 end
125 CheckMyRank()
126 end
127  
128 -- XPerl_SaveRoster
129 function XPerl_SaveRoster(saveName)
130  
131 if (not saveName or saveName == "") then
132 local hours, mins = GetGameTime()
133 saveName = hours..":"..mins
134 end
135  
136 local Roster = {}
137  
138 for i = 1,GetNumRaidMembers() do
139 local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(i)
140 Roster[name] = {group = subgroup, class = fileName}
141 end
142  
143 if (not XPerl_Admin.SavedRosters) then
144 XPerl_Admin.SavedRosters = {}
145 end
146 XPerl_Admin.SavedRosters[saveName] = Roster
147  
148 XPerl_Message(string.format(XPERL_SAVED_ROSTER, saveName))
149  
150 return true
151 end
152  
153 local function LoadRoster()
154  
155 --ChatFrame7:AddMessage("Arranging...")
156 local swapCount = 0
157 local moveCount = 0
158 local CurrentRoster = {}
159 local CurrentGroups = {}
160 local FreeFloating = {}
161  
162 -- Store the current raid roster, and a list of players in the raid, but not in the saved roster
163 for i = 1,GetNumRaidMembers() do
164 local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(i)
165 CurrentRoster[name] = {index = i, group = subgroup, class = fileName}
166  
167 if (not SavedRoster[name]) then
168 -- Not in the saved roster, so doesn't matter where
169 FreeFloating[name] = {group = subgroup, class = fileName}
170 end
171 end
172  
173 local function Swap(a, b)
174 --ChatFrame7:AddMessage("Swapping: "..a.." (Grp"..CurrentRoster[a].group..") with "..b.." (Grp"..CurrentRoster[b].group..")")
175 SwapRaidSubgroup(CurrentRoster[a].index, CurrentRoster[b].index)
176 local save = CurrentRoster[b].group
177 CurrentRoster[b].group = CurrentRoster[a].group
178 CurrentRoster[b].moved = true
179 CurrentRoster[a].group = save
180 CurrentRoster[a].moved = true
181  
182 if (FreeFloating[a]) then
183 FreeFloating[a].group = CurrentRoster[a].group
184 end
185 if (FreeFloating[b]) then
186 FreeFloating[b].group = CurrentRoster[b].group
187 end
188  
189 swapCount = swapCount + 1
190 end
191  
192 local function Move(name, target)
193 --ChatFrame7:AddMessage("Moving: "..name.." (Grp"..CurrentRoster[name].group..") to group "..target)
194 SetRaidSubgroup(CurrentRoster[name].index, target)
195 CurrentRoster[name].group = target
196 CurrentRoster[name].moved = true
197 if (FreeFloating[name]) then
198 FreeFloating[name].group = target
199 end
200  
201 moveCount = moveCount + 1
202 end
203  
204 local function GroupCount(grp)
205 local count = 0
206 for name,entry in pairs(CurrentRoster) do
207 if (entry.group == grp) then
208 count = count + 1
209 end
210 end
211 return count
212 end
213  
214 for nameSaved, saved in SavedRoster do
215 local name = nameSaved
216 local group = saved.group
217  
218 if (not CurrentRoster[name]) then
219 -- Saved player not in raid, so find someone of the same class in the free floater list
220 for floaterName,floater in pairs(FreeFloating) do
221 if (floater.class == saved.class) then
222 name = floaterName
223 FreeFloating[name] = nil
224 break
225 end
226 end
227 end
228  
229 if (CurrentRoster[name] and not CurrentRoster[name].moved) then
230 if (CurrentRoster[name].group == group) then
231 CurrentRoster[name].moved = true; -- They're in right group already
232 elseif (not FreeFloating[name]) then
233 -- First see if we can directly swap any 2 players
234 local swapName
235 for name2, saved2 in SavedRoster do
236 if (name ~= name2) then
237 if (CurrentRoster[name] and CurrentRoster[name].group == saved2.group) then
238 if (CurrentRoster[name2] and CurrentRoster[name2].group == group) then
239 swapName = name2
240 break
241 end
242 end
243  
244 end
245 end
246  
247 if (swapName) then
248 Swap(name, swapName)
249 --break
250 else
251 local done
252 -- Nothing suitable found to swap, see if target group has space
253 if (GroupCount(group) < 5) then
254 Move(name, group)
255 done = true
256 --break
257 end
258  
259 -- No space in target group, put them anywhere
260 if (not done) then
261 for i = 1,8 do
262 if (CurrentRoster[name].group ~= i and GroupCount(i) < 5) then
263 Move(name, i)
264 done = true
265 break
266 end
267 end
268 end
269  
270 if (not done) then
271 -- Nothing done yet, see if we can swap a free floater
272 local free
273 for name, group in pairs(FreeFloating) do
274 if (group ~= CurrentRoster[name].group) then
275 free = name
276 break
277 end
278 end
279 if (free) then
280 Swap(CurrentRoster[name].index, CurrentRoster[free].index)
281 --break
282 else
283 -- Couldn't put them anywhere, add them to floater list
284 FreeFloating[name] = group
285 end
286 --else
287 -- break
288 end
289 end
290 end
291 end
292  
293 --if (moveCount > 0) then -- or swapCount > 0) then
294 -- break
295 --end
296 end
297  
298 if (moveCount == 0 and swapCount == 0) then
299 --ChatFrame7:AddMessage("Finished!")
300 XPerl_StopLoad()
301 else
302 WaitingForRoster = GetTime()
303 XswapCount = XswapCount + swapCount
304 XmoveCount = XmoveCount + moveCount
305 XPendingRosters = XPendingRosters + swapCount
306 XPendingRosters = XPendingRosters + moveCount
307 end
308 --ChatFrame7:AddMessage("Done arranging (swaps: "..swapCount..") (moves: "..moveCount..")")
309 end
310  
311 -- XPerl_AdminOnEvent
312 function XPerl_AdminOnEvent()
313 CheckMyRank()
314  
315 if (event == "RAID_ROSTER_UPDATE") then
316 XPerl_AdminFrame_Controls:Details()
317  
318 if (WaitingForRoster) then
319 if (not XFinishedLoad) then
320 XPendingRosters = XPendingRosters - 1
321 if (XPendingRosters < 1) then
322 LoadRoster()
323 end
324 end
325 end
326  
327 elseif (event == "VARIABLES_LOADED") then
328 this:UnregisterEvent(event)
329 XPerl_AdminStartup()
330 end
331 end
332  
333 -- XPerl_Admin_OnUpdate
334 function XPerl_Admin_OnUpdate(elapsed)
335 if (WaitingForRoster) then
336 if (GetTime() > WaitingForRoster + 5000) then
337 XPerl_StopLoad()
338 end
339 end
340 end
341  
342 -- XPerl_LoadRoster
343 function XPerl_LoadRoster(loadName)
344  
345 if (not XPerl_Admin.SavedRosters) then
346 return
347 end
348  
349 SavedRoster = XPerl_Admin.SavedRosters[loadName]
350 if (SavedRoster) then
351 XPerl_AdminFrame_Controls_StopLoad:Show()
352 XPerl_AdminFrame_Controls_LoadRoster:Hide()
353  
354 XFinishedLoad = false
355 WaitingForRoster = nil
356 XPendingRosters = 0
357 LoadRoster()
358 else
359 if (not loadName) then
360 XPerl_Message(XPERL_NO_ROSTER_NAME_GIVEN)
361 else
362 XPerl_Message(string.format(XPERL_NO_ROSTER_CALLED, loadName))
363 end
364 end
365  
366 return true
367 end
368  
369 -- XPerl_StopLoad
370 function XPerl_StopLoad()
371 XPerl_AdminFrame_Controls_StopLoad:Hide()
372 XPerl_AdminFrame_Controls_LoadRoster:Show()
373  
374 XFinishedLoad = true
375 WaitingForRoster = nil
376 SavedRoster = nil
377 XPendingRosters = 0
378  
379 XPerl_AdminFrame_Controls:Details()
380 end
381  
382 function XPerl_Message(msg)
383 DEFAULT_CHAT_FRAME:AddMessage(XPERL_MSG_PREFIX.."- "..msg)
384 end
385  
386 XPerl_AdminCommands = {
387 save = XPerl_SaveRoster,
388 load = XPerl_LoadRoster,
389 auto = XPerl_ToggleAuto,
390 help = XPerl_Help
391 }
392  
393 -- XPerl_Admin_CountDifferences
394 function XPerl_Admin_CountDifferences(rosterName)
395 if (not XPerl_Admin.SavedRosters) then
396 return
397 end
398  
399 local count = 0
400  
401 SavedRoster = XPerl_Admin.SavedRosters[rosterName]
402 if (SavedRoster) then
403 for i = 1,GetNumRaidMembers() do
404 local name, rank, subgroup = GetRaidRosterInfo(i)
405  
406 if (SavedRoster[name]) then
407 if (SavedRoster[name].group ~= subgroup) then
408 count = count + 1
409 end
410 else
411 count = count + 1
412 end
413 end
414  
415 return count
416 end
417 end
418  
419 function XPerl_Admin_ControlsOnLoad()
420  
421 this.Details = function()
422 local name = XPerl_AdminFrame_Controls_Edit:GetText()
423 local diff
424 if (name) then
425 diff = XPerl_Admin_CountDifferences(name)
426 end
427  
428 if (diff) then
429 XPerl_AdminFrame_Controls_DetailsText:SetText(string.format(XPERL_ADMIN_DIFFERENCES, diff))
430 XPerl_AdminFrame_Controls_Details:Show()
431 else
432 XPerl_AdminFrame_Controls_Details:Hide()
433 end
434 end
435  
436 this.MakeList = function()
437 local index = 1;
438 local find = XPerl_AdminFrame_Controls_Edit:GetText()
439  
440 local Offset = XPerl_AdminFrame_Controls_RosterScrollBarScrollBar:GetValue()
441 for name,roster in pairs(XPerl_Admin.SavedRosters) do
442 if (index - 1 >= Offset) then
443 local f = getglobal("XPerl_AdminFrame_Controls_Roster"..index)
444 if (f) then
445 if (name == find) then
446 f:LockHighlight()
447 else
448 f:UnlockHighlight()
449 end
450 f:SetText(name)
451 f:Show()
452 end
453 end
454 index = index + 1
455 end
456 for i = index,5 do
457 local f = getglobal("XPerl_AdminFrame_Controls_Roster"..i)
458 if (f) then
459 f:SetText("")
460 f:UnlockHighlight()
461 f:Hide()
462 end
463 end
464  
465 local offset = XPerl_AdminFrame_Controls_RosterScrollBarScrollBar:GetValue()
466 if (FauxScrollFrame_Update(XPerl_AdminFrame_Controls_RosterScrollBar, index - 1, 5, 1)) then
467 XPerl_AdminFrame_Controls_RosterScrollBar:Show()
468 else
469 XPerl_AdminFrame_Controls_RosterScrollBar:Hide()
470 end
471  
472 XPerl_AdminFrame_Controls:Details()
473 end
474  
475 this.Validate = function()
476 XPerl_AdminFrame.Valid = false
477 XPerl_AdminFrame_Controls_LoadRoster:Disable()
478 XPerl_AdminFrame_Controls_DeleteRoster:Disable()
479  
480 local index = 1
481 local find = XPerl_AdminFrame_Controls_Edit:GetText()
482 local Offset = XPerl_AdminFrame_Controls_RosterScrollBarScrollBar:GetValue()
483 for name,roster in pairs(XPerl_Admin.SavedRosters) do
484 if (index - 1 >= Offset) then
485 local f = getglobal("XPerl_AdminFrame_Controls_Roster"..index)
486 if (not f) then
487 break
488 end
489 if (name == find) then
490 f:LockHighlight()
491 XPerl_AdminFrame.Valid = true
492 if (IsRaidLeader()) then
493 XPerl_AdminFrame_Controls_LoadRoster:Enable()
494 end
495 XPerl_AdminFrame_Controls_DeleteRoster:Enable()
496 else
497 f:UnlockHighlight()
498 end
499 end
500 index = index + 1
501 end
502 end
503 end