vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 UIPanelWindows["CT_RaidTrackerFrame"] = { area = "left", pushable = 1 };
2 CT_RAIDTRACKER_RAIDS = "Raids: %d";
3 CT_RaidTracker_Online = { };
4  
5 CT_RaidTracker_Version = "v1.2";
6 CT_RaidTracker_Events = { };
7  
8 CT_RaidTracker_LastPage = { };
9  
10 CT_RaidTracker_SortOptions = {
11 ["method"] = "name",
12 ["way"] = "asc",
13 ["itemmethod"] = "looted",
14 ["itemway"] = "asc",
15 ["itemfilter"] = 1,
16 ["playerraidway"] = "desc",
17 ["playeritemfilter"] = 1,
18 ["playeritemmethod"] = "name",
19 ["playeritemway"] = "asc",
20 ["itemhistorymethod"] = "name",
21 ["itemhistoryway"] = "asc"
22 };
23  
24 CT_RaidTracker_ItemTextures = {
25 ["Head"] = "INV_Helmet_22",
26 ["Neck"] = "INV_Jewelry_Necklace_11",
27 ["Shoulder"] = "INV_Shoulder_23",
28 ["Back"] = "INV_Misc_Cape_16",
29 ["Chest"] = "INV_Chest_Chain_05",
30 ["Shirt"] = "INV_Shirt_Black_01",
31 ["Shield"] = "INV_Shield_05",
32 ["Tabard"] = "INV_Misc_TabardPVP_04",
33 ["Wrist"] = "INV_Bracer_07",
34 ["Two-Hand-Other"] = "INV_Sword_39",
35 ["Two-Hand-Sword"] = "INV_Sword_39",
36 ["Two-Hand-Staff"] = "INV_Staff_30",
37 ["Two-Hand-Polearm"] = "INV_Spear_06",
38 ["Two-Hand-Axe"] = "INV_Axe_09",
39 ["Two-Hand-Mace"] = "INV_Hammer_04",
40 ["Back"] = "INV_Misc_Cape_16",
41 ["Off Hand"] = "INV_Misc_Book_06",
42 ["Held In Off-hand"] = "INV_Misc_Book_06",
43 ["Off Hand-Other"] = "INV_Misc_Wrench_01",
44 ["Gun"] = "INV_Weapon_Rifle_01",
45 ["Bow"] = "INV_Weapon_Bow_01",
46 ["Wand"] = "INV_Wand_02",
47 ["Projectile"] = "INV_Ammo_Arrow_01",
48 ["Thrown"] = "INV_Spear_07",
49 ["Hands"] = "INV_Gauntlets_16",
50 ["Waist"] = "INV_Belt_02",
51 ["Legs"] = "INV_Pants_11",
52 ["Feet"] = "INV_Boots_05",
53 ["Finger"] = "INV_Jewelry_Ring_30",
54 ["Trinket"] = "INV_Jewelry_Talisman_10",
55 ["Other"] = "INV_Misc_Gear_08",
56 ["Special-Sword"] = "INV_Sword_18",
57 ["Special-Dagger"] = "INV_Weapon_ShortBlade_11",
58 ["Special-Mace"] = "INV_Hammer_17",
59 ["Special-Axe"] = "INV_Axe_09",
60 ["Special-Fist Weapon"] = "INV_Misc_MonsterClaw_04",
61 ["Special-Shield"] = "INV_Shield_05",
62 };
63  
64 CT_RaidTracker_RarityTable = {
65 ["ff9d9d9d"] = -1,
66 ["ffffffff"] = 0,
67 ["ff1eff00"] = 1,
68 ["ff0070dd"] = 2,
69 ["ffa335ee"] = 3,
70 ["ffff8000"] = 4
71 };
72  
73  
74 function CT_RaidTracker_GetTime(dDate)
75 if ( not dDate ) then
76 return nil;
77 end
78 local _, _, mon, day, year, hr, min, sec = string.find(dDate, "(%d+)/(%d+)/(%d+) (%d+):(%d+):(%d+)");
79 local table = date("*t");
80 table["month"] = tonumber(mon);
81 table["year"] = tonumber("20" .. year);
82 table["day"] = tonumber(day);
83 table["hour"] = tonumber(hr);
84 table["min"] = tonumber(min);
85 table["sec"] = tonumber(sec);
86 return time(table);
87 end
88  
89 function CT_RaidTracker_SortRaidTable()
90 table.sort(
91 CT_RaidTracker_RaidLog,
92 function(a1, a2)
93 if ( a1 and a2 ) then
94 return CT_RaidTracker_GetTime(a1.key) > CT_RaidTracker_GetTime(a2.key);
95 end
96 end
97 );
98 end
99  
100 function CT_RaidTracker_GetRaidTitle(id, hideid)
101 if ( CT_RaidTracker_RaidLog[id] and CT_RaidTracker_RaidLog[id].key ) then
102 local _, _, mon, day, year, hr, min, sec = string.find(CT_RaidTracker_RaidLog[id].key, "(%d+)/(%d+)/(%d+) (%d+):(%d+):(%d+)");
103 if ( mon ) then
104 local months = {
105 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
106 };
107 if ( hideid ) then
108 return months[tonumber(mon)] .. " " .. day .. " '" .. year .. ", " .. hr .. ":" .. min;
109 else
110 return "[" .. (getn(CT_RaidTracker_RaidLog)-id+1) .. "] " .. months[tonumber(mon)] .. " " .. day .. " '" .. year .. ", " .. hr .. ":" .. min;
111 end
112 else
113 return "";
114 end
115 end
116 return "";
117 end
118  
119 function CT_RaidTracker_SaveNote(id)
120 local text = CT_RaidTrackerEditNoteFrameNoteEB:GetText();
121 if ( strlen(text) == 0 ) then
122 text = nil;
123 end
124 if ( CT_RaidTrackerEditNoteFrame.type == "item" ) then
125 CT_RaidTracker_RaidLog[id]["Loot"][CT_RaidTrackerEditNoteFrame.itemid]["note"] = text;
126  
127 elseif ( CT_RaidTrackerEditNoteFrame.type == "raid" ) then
128 CT_RaidTracker_RaidLog[id]["note"] = text;
129  
130 else
131 CT_RaidTracker_RaidLog[id]["Notes"][CT_RaidTrackerEditNoteFrame.playerid] = text;
132  
133 end
134 CT_RaidTracker_Update();
135 CT_RaidTracker_UpdateView();
136 end
137  
138 function CT_RaidTracker_EditNote_OnShow()
139 local text;
140 if ( this.type == "raid" ) then
141 text = CT_RaidTracker_RaidLog[this.id]["note"];
142 elseif ( this.type == "item" ) then
143 text = CT_RaidTracker_RaidLog[this.id]["Loot"][this.itemid]["note"];
144 else
145 text = CT_RaidTracker_RaidLog[this.id]["Notes"][this.playerid];
146 end
147 if ( text ) then
148 getglobal(this:GetName() .. "NoteEB"):SetText(text);
149 getglobal(this:GetName() .. "NoteEB"):HighlightText();
150 else
151 getglobal(this:GetName() .. "NoteEB"):SetText("");
152 end
153  
154 getglobal(this:GetName() .. "Editing"):SetText("Editing note for " .. this.type .. " \"|c" .. this.color .. "" .. this.text .. "|r\"");
155 end
156  
157 function CT_RaidTracker_Update()
158 if ( getn(CT_RaidTracker_LastPage) > 0 ) then
159 CT_RaidTrackerFrameBackButton:Enable();
160 else
161 CT_RaidTrackerFrameBackButton:Disable();
162 end
163 if ( getn(CT_RaidTracker_RaidLog) > 0 ) then
164 if ( CT_RaidTrackerFrame.selected ) then
165 local selected;
166 if ( not CT_RaidTracker_RaidLog[CT_RaidTrackerFrame.selected] ) then
167 while ( not selected ) do
168 if ( CT_RaidTrackerFrame.selected < 1 ) then
169 selected = 1;
170 CT_RaidTrackerFrame.selected = nil;
171 else
172 CT_RaidTrackerFrame.selected = CT_RaidTrackerFrame.selected - 1;
173 if ( CT_RaidTracker_RaidLog[CT_RaidTrackerFrame.selected] ) then
174 selected = 2;
175 end
176 end
177 end
178 end
179 if ( not selected or selected == 2 ) then
180 if ( not CT_RaidTracker_RaidLog[CT_RaidTrackerFrame.selected] or getn(CT_RaidTracker_RaidLog[CT_RaidTrackerFrame.selected]["Loot"]) == 0 ) then
181 CT_RaidTrackerFrame.type = "raids";
182 CT_RaidTrackerFrameViewButton:Disable();
183 else
184 CT_RaidTrackerFrameViewButton:Enable();
185 end
186 end
187 end
188  
189 CT_EmptyRaidTrackerFrame:Hide();
190 CT_RaidTrackerFrameNoteButton:Enable();
191 CT_RaidTrackerFrameDeleteButton:Enable();
192  
193 local hasItem;
194 for k, v in CT_RaidTracker_RaidLog do
195 for key, val in v["Loot"] do
196 if ( val["player"] == CT_RaidTrackerFrame.player ) then
197 hasItem = 1;
198 break;
199 end
200 end
201 if ( hasItem ) then
202 break;
203 end
204 end
205  
206 if ( CT_RaidTrackerFrame.type == "raids" or not CT_RaidTrackerFrame.type ) then
207 CT_RaidTrackerFrameViewButton:SetText("View Items");
208 elseif ( CT_RaidTrackerFrame.type == "items" ) then
209 CT_RaidTrackerFrameViewButton:SetText("View Players");
210 elseif ( CT_RaidTrackerFrame.type == "player" ) then
211 if ( not hasItem ) then
212 CT_RaidTrackerFrameViewButton:Disable();
213 else
214 CT_RaidTrackerFrameViewButton:Enable();
215 end
216 CT_RaidTrackerFrameViewButton:SetText("View Loot");
217 CT_RaidTrackerFrameNoteButton:Disable();
218 CT_RaidTrackerFrameDeleteButton:Disable();
219 elseif ( CT_RaidTrackerFrame.type == "playeritems" ) then
220 CT_RaidTrackerFrameViewButton:SetText("View Raids");
221 CT_RaidTrackerFrameNoteButton:Disable();
222 CT_RaidTrackerFrameDeleteButton:Disable();
223 if ( not hasItem ) then
224 CT_RaidTrackerFrame.type = "player";
225 CT_RaidTracker_Update();
226 CT_RaidTracker_UpdateView();
227 end
228 elseif ( CT_RaidTrackerFrame.type == "itemhistory" ) then
229 CT_RaidTrackerFrameNoteButton:Disable();
230 CT_RaidTrackerFrameDeleteButton:Disable();
231 CT_RaidTrackerFrameViewButton:Disable();
232 end
233 else
234 CT_EmptyRaidTrackerFrame:Show();
235 CT_RaidTrackerDetailScrollFramePlayers:Hide();
236 CT_RaidTrackerDetailScrollFrameItems:Hide();
237 CT_RaidTrackerDetailScrollFramePlayer:Hide();
238 CT_RaidTrackerFrameNoteButton:Disable();
239 CT_RaidTrackerFrameDeleteButton:Disable();
240 CT_RaidTrackerFrameViewButton:Disable();
241 end
242  
243 local numRaids = getn(CT_RaidTracker_RaidLog);
244 local numEntries = numRaids;
245  
246 -- Update Quest Count
247 CT_RaidTrackerQuestCount:SetText(format(CT_RAIDTRACKER_RAIDS, numRaids));
248  
249 -- ScrollFrame update
250 FauxScrollFrame_Update(CT_RaidTrackerListScrollFrame, numEntries, 6, 16, nil, nil, nil, CT_RaidTrackerHighlightFrame, 293, 316 );
251  
252 -- Update the quest listing
253 CT_RaidTrackerHighlightFrame:Hide();
254 for i=1, 6, 1 do
255 local title = getglobal("CT_RaidTrackerTitle" .. i);
256 local normaltext = getglobal("CT_RaidTrackerTitle" .. i .. "NormalText");
257 local highlighttext = getglobal("CT_RaidTrackerTitle" .. i .. "HighlightText");
258 local disabledtext = getglobal("CT_RaidTrackerTitle" .. i .. "DisabledText");
259 local highlight = getglobal("CT_RaidTrackerTitle" .. i .. "Highlight");
260  
261 local index = i + FauxScrollFrame_GetOffset(CT_RaidTrackerListScrollFrame);
262 if ( index <= numEntries ) then
263 local raidTitle = CT_RaidTracker_GetRaidTitle(index);
264 local raidTag = CT_RaidTracker_RaidLog[index]["note"];
265 if ( not raidTag ) then
266 raidTag = "";
267 else
268 raidTag = " (" .. raidTag .. ")";
269 end
270 if ( raidTitle ) then
271 title:SetText(raidTitle .. raidTag);
272 else
273 title:SetText("");
274 end
275 title:Show();
276 -- Place the highlight and lock the highlight state
277 if ( CT_RaidTrackerFrame.selected and CT_RaidTrackerFrame.selected == index ) then
278 CT_RaidTrackerSkillHighlight:SetVertexColor(1, 1, 0);
279 CT_RaidTrackerHighlightFrame:SetPoint("TOPLEFT", "CT_RaidTrackerTitle"..i, "TOPLEFT", 0, 0);
280 CT_RaidTrackerHighlightFrame:Show();
281 title:LockHighlight();
282 else
283 title:UnlockHighlight();
284 end
285  
286 else
287 title:Hide();
288 end
289  
290 end
291 end
292  
293 function CT_RaidTracker_SelectRaid(id)
294 local raidid = id + FauxScrollFrame_GetOffset(CT_RaidTrackerListScrollFrame);
295 CT_RaidTracker_GetPage();
296 CT_RaidTrackerFrame.selected = raidid;
297 if ( getn(CT_RaidTracker_RaidLog[raidid]["Loot"]) == 0 or ( CT_RaidTrackerFrame.type and CT_RaidTrackerFrame.type ~= "items" ) ) then
298 CT_RaidTrackerFrame.type = "raids";
299 end
300  
301 CT_RaidTracker_UpdateView();
302 CT_RaidTracker_Update();
303 end
304  
305 function CT_RaidTracker_ShowInfo(player)
306 CT_RaidTracker_GetPage();
307  
308 CT_RaidTrackerFrame.type = "player";
309 CT_RaidTrackerFrame.player = player;
310 CT_RaidTrackerFrame.selected = nil;
311  
312 CT_RaidTracker_Update();
313 CT_RaidTracker_UpdateView();
314 end
315  
316 function CT_RaidTracker_GetItemType(link)
317 local types = {
318 ["Head"] = 1,
319 ["Neck"] = 1,
320 ["Shoulder"] = 1,
321 ["Back"] = 1,
322 ["Chest"] = 1,
323 ["Shirt"] = 1,
324 ["Tabard"] = 1,
325 ["Wrist"] = 1,
326 ["Two-Hand"] = 1,
327 ["One-Hand"] = 1,
328 ["Main Hand"] = 1,
329  
330 ["Off Hand"] = 1,
331 ["Held In Off-hand"] = 1,
332 ["Gun"] = 1,
333 ["Bow"] = 1,
334 ["Wand"] = 1,
335 ["Projectile"] = 1,
336 ["Thrown"] = 1,
337 ["Hands"] = 1,
338 ["Waist"] = 1,
339 ["Legs"] = 1,
340 ["Feet"] = 1,
341 ["Finger"] = 1,
342 ["Trinket"] = 1
343 };
344  
345 local special = {
346 ["Fist Weapon"] = 1,
347 ["Dagger"] = 1,
348 ["Shield"] = 1,
349 ["Sword"] = 1,
350 ["Axe"] = 1,
351 ["Polearm"] = 1,
352 ["Mace"] = 1,
353 ["Staff"] = 1
354 };
355 for i = 1, 30, 1 do
356 getglobal("CT_RTTooltipTextLeft" .. i):SetText("");
357 getglobal("CT_RTTooltipTextLeft" .. i):Hide();
358 getglobal("CT_RTTooltipTextRight" .. i):SetText("");
359 getglobal("CT_RTTooltipTextRight" .. i):Hide();
360 end
361 CT_RTTooltip:SetHyperlink(link);
362 for i = 2, min(CT_RTTooltip:NumLines(), 5), 1 do
363 local textleft = getglobal("CT_RTTooltipTextLeft" .. i);
364 local textright = getglobal("CT_RTTooltipTextRight" .. i);
365 if ( textleft and types[textleft:GetText()] ) then
366 if ( ( textleft:GetText() == "Off Hand" or textleft:GetText() == "Main Hand" or textleft:GetText() == "One-Hand" or textleft:GetText() == "Two-Hand" ) and strlen(textright:GetText()) > 0 ) then
367 if ( special[textright:GetText()] ) then
368 if ( textleft:GetText() == "Two-Hand" ) then
369 return "Two-Hand-" .. textright:GetText();
370 else
371 return "Special-" .. textright:GetText();
372 end
373 else
374 return textleft:GetText().."-Other";
375 end
376 else
377 return textleft:GetText();
378 end
379 elseif ( textright and types[textright:GetText()] ) then
380 return textright:GetText();
381 end
382 end
383 return "Other";
384 end
385  
386 function CT_RaidTracker_Delete(id, type, typeid)
387 if ( type == "raid" ) then
388 table.remove(CT_RaidTracker_RaidLog, id);
389 if ( id == CT_RaidTracker_GetCurrentRaid ) then
390 CT_RaidTracker_GetCurrentRaid = nil;
391 end
392 if ( CT_RaidTrackerFrame.selected == id ) then
393 CT_RaidTrackerFrame.selected = CT_RaidTrackerFrame.selected - 1;
394 if ( CT_RaidTrackerFrame.selected < 1 ) then
395 CT_RaidTrackerFrame.selected = 1;
396 end
397 CT_RaidTrackerFrame.type = "raids";
398 end
399 elseif ( type == "item" ) then
400 table.remove(CT_RaidTracker_RaidLog[id]["Loot"], typeid);
401 elseif ( type == "player" ) then
402 for key, val in CT_RaidTracker_RaidLog[id]["Join"] do
403 if ( val["player"] == typeid ) then
404 CT_RaidTracker_RaidLog[id]["Join"][key] = nil;
405 end
406 end
407 for key, val in CT_RaidTracker_RaidLog[id]["Leave"] do
408 if ( val["player"] == typeid ) then
409 CT_RaidTracker_RaidLog[id]["Leave"][key] = nil;
410 end
411 end
412 end
413 CT_RaidTracker_Update();
414 CT_RaidTracker_UpdateView();
415 end
416  
417 function CT_RaidTracker_Sort(tbl, method, way)
418 if ( way == "asc" ) then
419 table.sort(
420 tbl,
421 function(a1, a2)
422 return a1[method] < a2[method];
423 end
424 );
425 else
426 table.sort(
427 tbl,
428 function(a1, a2)
429 return a1[method] > a2[method];
430 end
431 );
432 end
433 return tbl;
434 end
435  
436 function CT_RaidTracker_SortPlayerRaids(id)
437 if ( CT_RaidTrackerFrame.type == "itemhistory" ) then
438 local table = { "name", "looter" };
439  
440 if ( CT_RaidTracker_SortOptions["itemhistorymethod"] == table[id] ) then
441 if ( CT_RaidTracker_SortOptions["itemhistoryway"] == "asc" ) then
442 CT_RaidTracker_SortOptions["itemhistoryway"] = "desc";
443 else
444 CT_RaidTracker_SortOptions["itemhistoryway"] = "asc";
445 end
446 else
447 CT_RaidTracker_SortOptions["itemhistoryway"] = "asc";
448 CT_RaidTracker_SortOptions["itemhistorymethod"] = table[id];
449 end
450 else
451 if ( CT_RaidTracker_SortOptions["playerraidway"] == "asc" ) then
452 CT_RaidTracker_SortOptions["playerraidway"] = "desc";
453 else
454 CT_RaidTracker_SortOptions["playerraidway"] = "asc";
455 end
456 end
457 CT_RaidTracker_UpdateView();
458 end
459  
460 function CT_RaidTracker_CompareItems(a1, a2)
461 -- This function could probably be better, but I can't think of any better way while still maintaining functionality
462  
463 local filter, method, way = CT_RaidTracker_SortOptions["itemfilter"], CT_RaidTracker_SortOptions["itemmethod"], CT_RaidTracker_SortOptions["itemway"];
464 if ( CT_RaidTrackerFrame.type == "playeritems" ) then
465 filter, method, way = CT_RaidTracker_SortOptions["playeritemfilter"], CT_RaidTracker_SortOptions["playeritemmethod"], CT_RaidTracker_SortOptions["playeritemway"];
466 end
467  
468 -- Check to see if it matches the rarity requirements
469 if ( not CT_RaidTracker_RarityTable[a1["item"]["c"]] or CT_RaidTracker_RarityTable[a1["item"]["c"]] < filter ) then
470 return false;
471 elseif ( CT_RaidTracker_RarityTable[a2["item"]["c"]] < filter ) then
472 return true;
473 end
474  
475 if ( method == "name" ) then
476 local c1, c2 = a1["item"]["name"], a2["item"]["name"];
477 if ( c1 == c2 ) then
478 c1, c2 = a1["player"], a2["player"];
479 end
480 if ( way == "asc" ) then
481 return c1 < c2;
482 else
483 return c1 > c2;
484 end
485 elseif ( method == "looter" ) then
486 local c1, c2 = a1["player"], a2["player"];
487 if ( c1 == c2 ) then
488 c1, c2 = CT_RaidTracker_RarityTable[a2["item"]["c"]], CT_RaidTracker_RarityTable[a1["item"]["c"]];
489 if ( c1 == c2 ) then
490 c1, c2 = a1["item"]["name"], a2["item"]["name"];
491 end
492 end
493 if ( way == "asc" ) then
494 return c1 < c2;
495 else
496 return c1 > c2;
497 end
498 elseif ( method == "looted" ) then
499 if ( way == "asc" ) then
500 return CT_RaidTracker_GetTime(a1["time"]) < CT_RaidTracker_GetTime(a2["time"]);
501 else
502 return CT_RaidTracker_GetTime(a1["time"]) > CT_RaidTracker_GetTime(a2["time"]);
503 end
504 else
505 local c1, c2 = CT_RaidTracker_RarityTable[a1["item"]["c"]], CT_RaidTracker_RarityTable[a2["item"]["c"]];
506 if ( c1 == c2 ) then
507 c1, c2 = a1["item"]["name"], a2["item"]["name"];
508 if ( c1 == c2 ) then
509 c1, c2 = a1["player"], a2["player"];
510 else
511 return c1 < c2;
512 end
513 end
514 if ( way == "asc" ) then
515 return c1 < c2;
516 else
517 return c1 > c2;
518 end
519 end
520 end
521  
522 function CT_RaidTracker_SortItem(tbl, method, way)
523  
524 table.sort(
525 tbl,
526 CT_RaidTracker_CompareItems
527 );
528  
529 return tbl;
530 end
531  
532 function CT_RaidTracker_SortItemBy(id)
533 local table = { "name", "looted", "looter", "rarity" };
534 local prefix = "";
535 if ( CT_RaidTrackerFrame.type == "playeritems" ) then
536 prefix = "player";
537 end
538 if ( CT_RaidTracker_SortOptions[prefix.."itemmethod"] == table[id] ) then
539 if ( CT_RaidTracker_SortOptions[prefix.."itemway"] == "asc" ) then
540 CT_RaidTracker_SortOptions[prefix.."itemway"] = "desc";
541 else
542 CT_RaidTracker_SortOptions[prefix.."itemway"] = "asc";
543 end
544 else
545 CT_RaidTracker_SortOptions[prefix.."itemmethod"] = table[id];
546 CT_RaidTracker_SortOptions[prefix.."itemway"] = "asc";
547 end
548 CT_RaidTracker_UpdateView();
549 end
550  
551 function CT_RaidTracker_SortBy(id)
552 local table = { "name", "join", "leave" };
553 if ( CT_RaidTracker_SortOptions["method"] == table[id] ) then
554 if ( CT_RaidTracker_SortOptions["way"] == "asc" ) then
555 CT_RaidTracker_SortOptions["way"] = "desc";
556 else
557 CT_RaidTracker_SortOptions["way"] = "asc";
558 end
559 else
560 CT_RaidTracker_SortOptions["method"] = table[id];
561 if ( table[id] ~= "leave" ) then
562 CT_RaidTracker_SortOptions["way"] = "asc";
563 else
564 CT_RaidTracker_SortOptions["way"] = "desc";
565 end
566 end
567 CT_RaidTracker_UpdateView();
568 end
569  
570 function CT_RaidTracker_UpdateView()
571 if ( CT_EmptyRaidTrackerFrame:IsVisible() ) then
572 return;
573 end
574 local raidid = CT_RaidTrackerFrame.selected;
575 local num = 1;
576 while ( getglobal("CT_RaidTrackerItem" .. num) ) do
577 getglobal("CT_RaidTrackerItem" .. num):Hide();
578 num = num + 1;
579 end
580 if ( CT_RaidTrackerFrame.type == "raids" or not CT_RaidTrackerFrame.type ) then
581 CT_RaidTrackerDetailScrollFramePlayers:Show();
582 CT_RaidTrackerDetailScrollFramePlayer:Hide();
583 CT_RaidTrackerDetailScrollFrameItems:Hide();
584 local players, str, num = { }, "", 0;
585 if ( CT_RaidTracker_RaidLog[raidid] ) then
586  
587 local playerIndexes = { };
588 for key, val in CT_RaidTracker_RaidLog[raidid]["Join"] do
589 if ( val["player"] ) then
590 local id = playerIndexes[val["player"]];
591 local time = CT_RaidTracker_GetTime(val["time"]);
592 if ( not id or time < players[id]["join"] ) then
593  
594 if ( playerIndexes[val["player"]] ) then
595 players[id] = {
596 ["join"] = time,
597 ["name"] = val["player"]
598 };
599 else
600 tinsert(players, {
601 ["join"] = time,
602 ["name"] = val["player"]
603 });
604 playerIndexes[val["player"]] = getn(players);
605 end
606 end
607 id = playerIndexes[val["player"]];
608 if ( not players[id]["lastjoin"] or players[id]["lastjoin"] < time ) then
609 players[id]["lastjoin"] = time;
610 end
611 end
612 end
613 for key, val in CT_RaidTracker_RaidLog[raidid]["Leave"] do
614 local id = playerIndexes[val["player"]];
615 local time = CT_RaidTracker_GetTime(val["time"]);
616 if ( id ) then
617 if ( ( not players[id]["leave"] or time > players[id]["leave"] ) and time >= players[id]["lastjoin"] ) then
618 players[id]["leave"] = time;
619 end
620 end
621 end
622 for k, v in players do
623 if ( not v["leave"] ) then
624 -- Very ugly hack, I know :(
625 players[k]["leave"] = 99999999999;
626 end
627 end
628 players = CT_RaidTracker_Sort(players, CT_RaidTracker_SortOptions["method"], CT_RaidTracker_SortOptions["way"]);
629 num = 0;
630 for key, val in players do
631 num = num + 1;
632 local name = getglobal("CT_RaidTrackerPlayerLine" .. num .. "Name");
633 local number = getglobal("CT_RaidTrackerPlayerLine" .. num .. "Number");
634 local join = getglobal("CT_RaidTrackerPlayerLine" .. num .. "Join");
635 local leave = getglobal("CT_RaidTrackerPlayerLine" .. num .. "Leave");
636 if ( name ) then
637 getglobal("CT_RaidTrackerPlayerLine" .. num):Show();
638 name:SetText(val["name"]);
639 local iNumber = num;
640 if ( iNumber < 10 ) then
641 iNumber = " " .. iNumber;
642 end
643 number:SetText(iNumber);
644 join:SetText(date("%I:%M%p", val["join"]));
645 if ( val["leave"] == 99999999999 ) then
646 leave:SetText("");
647 else
648 leave:SetText(date("%I:%M%p", val["leave"]));
649 end
650 end
651  
652 end
653 for i = num+1, 100, 1 do
654 getglobal("CT_RaidTrackerPlayerLine" .. i):Hide();
655 end
656 end
657 CT_RaidTrackerRaidText:SetText(str);
658 CT_RaidTrackerParticipantsText:SetText("Participants (" .. num .. "):");
659 CT_RaidTrackerDetailScrollFramePlayers:UpdateScrollChildRect();
660 elseif ( CT_RaidTrackerFrame.type == "items" ) then
661 CT_RaidTrackerDetailScrollFramePlayers:Hide();
662 CT_RaidTrackerDetailScrollFramePlayer:Hide();
663 CT_RaidTrackerDetailScrollFrameItems:Show();
664 local numItems, numHidden = 0, 0;
665 if ( CT_RaidTracker_RaidLog[raidid] ) then
666 local loot = CT_RaidTracker_SortItem(CT_RaidTracker_RaidLog[raidid]["Loot"], CT_RaidTracker_SortOptions["itemmethod"], CT_RaidTracker_SortOptions["itemway"]);
667 for key, val in loot do
668 local _, _, lootTime = string.find(val["time"], " (%d+:%d+:%d+)$");
669 if ( lootTime ) then
670 local found;
671 local i = 1;
672 if ( not found ) then
673 if ( CT_RaidTracker_RarityTable[val["item"]["c"]] >= CT_RaidTracker_SortOptions["itemfilter"] ) then
674 numItems = numItems + 1;
675 if ( getglobal("CT_RaidTrackerItem" .. numItems) ) then
676 getglobal("CT_RaidTrackerItem" .. numItems).raidid = CT_RaidTrackerFrame.selected;
677 getglobal("CT_RaidTrackerItem" .. numItems).itemid = numItems;
678 getglobal("CT_RaidTrackerItem" .. numItems).itemname = val["item"]["name"];
679 getglobal("CT_RaidTrackerItem" .. numItems):Show();
680 if ( val["item"]["count"] and val["item"]["count"] > 1 ) then
681 getglobal("CT_RaidTrackerItem" .. numItems .. "Count"):Show();
682 getglobal("CT_RaidTrackerItem" .. numItems .. "Count"):SetText(val["item"]["count"]);
683 else
684 getglobal("CT_RaidTrackerItem" .. numItems .. "Count"):Hide();
685 end
686 if ( val["item"]["type"] and CT_RaidTracker_ItemTextures[val["item"]["type"]] ) then
687 getglobal("CT_RaidTrackerItem" .. numItems .. "IconTexture"):SetTexture("Interface\\Icons\\" .. CT_RaidTracker_ItemTextures[val["item"]["type"]]);
688 else
689 getglobal("CT_RaidTrackerItem" .. numItems .. "IconTexture"):SetTexture("Interface\\Icons\\" .. CT_RaidTracker_ItemTextures["Other"]);
690 end
691 local color = val["item"]["c"];
692 if ( color == "ff1eff00" ) then
693 color = "11009900";
694 end
695 getglobal("CT_RaidTrackerItem" .. numItems .. "Description"):SetText("|c" .. color .. val["item"]["name"] .. "|r\nLooted by: " .. val["player"]);
696  
697 if ( val["note"] ) then
698 getglobal("CT_RaidTrackerItem" .. numItems .. "NoteNormalTexture"):SetVertexColor(1, 1, 1);
699 else
700 getglobal("CT_RaidTrackerItem" .. numItems .. "NoteNormalTexture"):SetVertexColor(0.5, 0.5, 0.5);
701 end
702 end
703 else
704 numHidden = numHidden + 1;
705 end
706 end
707 end
708 end
709 end
710 for i = numItems+1, 255, 1 do
711 getglobal("CT_RaidTrackerItem" .. i):Hide();
712 end
713 if ( numHidden == 0 ) then
714 CT_RaidTrackerItemsText:SetText("Items (" .. numItems .. "):");
715 else
716 CT_RaidTrackerItemsText:SetText("Items (" .. numItems .. "/" .. numHidden + numItems .. ")");
717 end
718 UIDropDownMenu_SetSelectedID(CT_RaidTrackerRarityDropDown, CT_RaidTracker_SortOptions["itemfilter"]);
719 local colors = {
720 "|c001eff00Uncommon|r",
721 "|c000070ddRare|r",
722 "|c00a335eeEpic|r",
723 "|c00ff8000Legendary"
724 };
725  
726 CT_RaidTrackerRarityDropDownText:SetText(colors[CT_RaidTracker_SortOptions["itemfilter"]]);
727 CT_RaidTrackerDetailScrollFrameItems:UpdateScrollChildRect();
728 elseif ( CT_RaidTrackerFrame.type == "player" ) then
729 CT_RaidTrackerDetailScrollFramePlayers:Hide();
730 CT_RaidTrackerDetailScrollFramePlayer:Show();
731 CT_RaidTrackerDetailScrollFrameItems:Hide();
732 CT_RaidTrackerPlayerRaidTabLooter:Hide();
733 CT_RaidTrackerPlayerRaidTab1:SetWidth(300);
734 CT_RaidTrackerPlayerRaidTab1Middle:SetWidth(290);
735 local name = CT_RaidTrackerFrame.player;
736  
737 local raids = { };
738 for k, v in CT_RaidTracker_RaidLog do
739 local isInRaid;
740 for key, val in v["Join"] do
741 if ( val["player"] == name ) then
742 tinsert(raids, { k, v });
743 break;
744 end
745 end
746 end
747  
748 table.sort(
749 raids,
750 function(a1, a2)
751 if ( CT_RaidTracker_SortOptions["playerraidway"] == "asc" ) then
752 return CT_RaidTracker_GetTime(a1[2]["key"]) < CT_RaidTracker_GetTime(a2[2]["key"]);
753 else
754 return CT_RaidTracker_GetTime(a1[2]["key"]) > CT_RaidTracker_GetTime(a2[2]["key"]);
755 end
756 end
757 );
758  
759 for k, v in raids do
760 local raid = getglobal("CT_RaidTrackerPlayerRaid" .. k);
761 raid.raidid = v[1];
762 raid.playername = name;
763 raid.raidtitle = CT_RaidTracker_GetRaidTitle(v[1], 1);
764  
765 local iNumber = getn(CT_RaidTracker_RaidLog)-v[1]+1;
766 if ( iNumber < 10 ) then
767 iNumber = " " .. iNumber;
768 end
769  
770 getglobal(raid:GetName() .. "MouseOverLeft"):Hide();
771 getglobal(raid:GetName() .. "MouseOverRight"):Hide();
772  
773 getglobal(raid:GetName() .. "HitAreaLeft"):Hide();
774 getglobal(raid:GetName() .. "HitAreaRight"):Hide();
775 getglobal(raid:GetName() .. "HitArea"):Show();
776 getglobal(raid:GetName() .. "Note"):Hide();
777 getglobal(raid:GetName() .. "NoteButton"):Show();
778 getglobal(raid:GetName() .. "DeleteButton"):Show();
779 getglobal(raid:GetName() .. "DeleteText"):Show();
780  
781 getglobal(raid:GetName() .. "Number"):SetText(iNumber);
782 getglobal(raid:GetName() .. "Name"):SetWidth(200);
783 getglobal(raid:GetName() .. "Name"):SetText(CT_RaidTracker_GetRaidTitle(v[1], 1));
784  
785 if ( v[2]["Notes"][name] ) then
786 getglobal(raid:GetName() .. "NoteButtonNormalTexture"):SetVertexColor(1, 1, 1);
787 else
788 getglobal(raid:GetName() .. "NoteButtonNormalTexture"):SetVertexColor(0.5, 0.5, 0.5);
789 end
790 raid:Show();
791 end
792 for i = getn(raids)+1, 255, 1 do
793 getglobal("CT_RaidTrackerPlayerRaid" .. i):Hide();
794 end
795 CT_RaidTrackerPlayerText:SetText(name .. "'s Raids (" .. getn(raids) .. "):");
796 CT_RaidTrackerDetailScrollFramePlayer:UpdateScrollChildRect();
797 elseif ( CT_RaidTrackerFrame.type == "itemhistory" ) then
798 CT_RaidTrackerDetailScrollFramePlayers:Hide();
799 CT_RaidTrackerDetailScrollFramePlayer:Show();
800 CT_RaidTrackerDetailScrollFrameItems:Hide();
801 CT_RaidTrackerPlayerRaidTabLooter:Show();
802 CT_RaidTrackerPlayerRaidTab1:SetWidth(163);
803 CT_RaidTrackerPlayerRaidTab1Middle:SetWidth(155);
804  
805 local name, totalItems = CT_RaidTrackerFrame.itemname, 0;
806  
807 local items = { };
808 for k, v in CT_RaidTracker_RaidLog do
809 for key, val in v["Loot"] do
810 if ( val["item"]["name"] == name ) then
811 tinsert(items, { k, v, val });
812 if ( val["item"]["count"] ) then
813 totalItems = totalItems + val["item"]["count"];
814 else
815 totalItems = totalItems + 1;
816 end
817 end
818 end
819 end
820  
821 table.sort(
822 items,
823 function(a1, a2)
824 if ( CT_RaidTracker_SortOptions["itemhistorymethod"] == "looter" ) then
825 if ( CT_RaidTracker_SortOptions["itemhistoryway"] == "asc" ) then
826 return a1[3]["player"] < a2[3]["player"];
827 else
828 return a1[3]["player"] > a2[3]["player"];
829 end
830 else
831 if ( CT_RaidTracker_SortOptions["itemhistoryway"] == "asc" ) then
832 return CT_RaidTracker_GetTime(a1[2]["key"]) < CT_RaidTracker_GetTime(a2[2]["key"]);
833 else
834 return CT_RaidTracker_GetTime(a1[2]["key"]) > CT_RaidTracker_GetTime(a2[2]["key"]);
835 end
836 end
837 end
838 );
839  
840 for k, v in items do
841 local raid = getglobal("CT_RaidTrackerPlayerRaid" .. k);
842 raid.raidid = v[1];
843  
844 local iNumber = getn(CT_RaidTracker_RaidLog)-v[1]+1;
845 if ( iNumber < 10 ) then
846 iNumber = " " .. iNumber;
847 end
848 getglobal(raid:GetName() .. "MouseOver"):Hide();
849  
850 getglobal(raid:GetName() .. "HitAreaLeft"):Show();
851 getglobal(raid:GetName() .. "HitAreaRight"):Show();
852 getglobal(raid:GetName() .. "HitArea"):Hide();
853  
854 getglobal(raid:GetName() .. "NoteButton"):Hide();
855 getglobal(raid:GetName() .. "Note"):Show();
856 getglobal(raid:GetName() .. "DeleteButton"):Hide();
857 getglobal(raid:GetName() .. "DeleteText"):Hide();
858  
859 getglobal(raid:GetName() .. "Number"):SetText(iNumber);
860 getglobal(raid:GetName() .. "Name"):SetWidth(130);
861 getglobal(raid:GetName() .. "Name"):SetText(CT_RaidTracker_GetRaidTitle(v[1], 1));
862 getglobal(raid:GetName() .. "Note"):SetText(v[3]["player"]);
863 raid:Show();
864 end
865 for i = getn(items)+1, 255, 1 do
866 getglobal("CT_RaidTrackerPlayerRaid" .. i):Hide();
867 end
868 CT_RaidTrackerPlayerText:SetText(name .. " (" .. getn(items) .. "/" .. totalItems .. "):");
869 CT_RaidTrackerDetailScrollFramePlayer:UpdateScrollChildRect();
870  
871 elseif ( CT_RaidTrackerFrame.type == "playeritems" ) then
872 CT_RaidTrackerDetailScrollFramePlayers:Hide();
873 CT_RaidTrackerDetailScrollFramePlayer:Hide();
874 CT_RaidTrackerDetailScrollFrameItems:Show();
875 local name = CT_RaidTrackerFrame.player;
876  
877 local loot = { };
878 for k, v in CT_RaidTracker_RaidLog do
879 for key, val in v["Loot"] do
880 if ( val["player"] == name ) then
881 tinsert(
882 loot,
883 {
884 ["note"] = val["note"],
885 ["player"] = val["player"],
886 ["time"] = val["time"],
887 ["item"] = val["item"],
888 ["ids"] = { k, key }
889 }
890 );
891 end
892 end
893 end
894  
895 local numItems, numHidden = 0, 0;
896 loot = CT_RaidTracker_SortItem(loot, CT_RaidTracker_SortOptions["playeritemmethod"], CT_RaidTracker_SortOptions["playeritemway"]);
897 for key, val in loot do
898 local _, _, lootTime = string.find(val["time"], " (%d+:%d+:%d+)$");
899 if ( lootTime ) then
900 local found;
901 local i = 1;
902 if ( not found ) then
903 if ( CT_RaidTracker_RarityTable[val["item"]["c"]] >= CT_RaidTracker_SortOptions["playeritemfilter"] ) then
904 numItems = numItems + 1;
905 if ( getglobal("CT_RaidTrackerItem" .. numItems) ) then
906 getglobal("CT_RaidTrackerItem" .. numItems).raidid = val["ids"][1];
907 getglobal("CT_RaidTrackerItem" .. numItems).itemid = val["ids"][2];
908 getglobal("CT_RaidTrackerItem" .. numItems).itemname = val["item"]["name"];
909  
910 getglobal("CT_RaidTrackerItem" .. numItems):Show();
911 if ( val["item"]["count"] and val["item"]["count"] > 1 ) then
912 getglobal("CT_RaidTrackerItem" .. numItems .. "Count"):Show();
913 getglobal("CT_RaidTrackerItem" .. numItems .. "Count"):SetText(val["item"]["count"]);
914 else
915 getglobal("CT_RaidTrackerItem" .. numItems .. "Count"):Hide();
916 end
917 if ( val["item"]["type"] and CT_RaidTracker_ItemTextures[val["item"]["type"]] ) then
918 getglobal("CT_RaidTrackerItem" .. numItems .. "IconTexture"):SetTexture("Interface\\Icons\\" .. CT_RaidTracker_ItemTextures[val["item"]["type"]]);
919 else
920 getglobal("CT_RaidTrackerItem" .. numItems .. "IconTexture"):SetTexture("Interface\\Icons\\" .. CT_RaidTracker_ItemTextures["Other"]);
921 end
922 local color = val["item"]["c"];
923 if ( color == "ff1eff00" ) then
924 color = "11009900";
925 end
926 getglobal("CT_RaidTrackerItem" .. numItems .. "Description"):SetText("|c" .. color .. val["item"]["name"] .. "|r\nLooted " .. CT_RaidTracker_GetRaidTitle(val["ids"][1], 1));
927  
928 if ( val["note"] ) then
929 getglobal("CT_RaidTrackerItem" .. numItems .. "NoteNormalTexture"):SetVertexColor(1, 1, 1);
930 else
931 getglobal("CT_RaidTrackerItem" .. numItems .. "NoteNormalTexture"):SetVertexColor(0.5, 0.5, 0.5);
932 end
933 end
934 else
935 numHidden = numHidden + 1;
936 end
937 end
938 end
939 end
940 for i = numItems+1, 255, 1 do
941 getglobal("CT_RaidTrackerItem" .. i):Hide();
942 end
943 if ( numHidden == 0 ) then
944 CT_RaidTrackerItemsText:SetText(name .. "'s Loot (" .. numItems .. "):");
945 else
946 CT_RaidTrackerItemsText:SetText(name .. "'s Loot (" .. numItems .. "/" .. numHidden + numItems .. "):");
947 end
948  
949 UIDropDownMenu_SetSelectedID(CT_RaidTrackerRarityDropDown, CT_RaidTracker_SortOptions["playeritemfilter"]);
950 local colors = {
951 "|c001eff00Uncommon|r",
952 "|c000070ddRare|r",
953 "|c00a335eeEpic|r",
954 "|c00ff8000Legendary"
955 };
956  
957 CT_RaidTrackerRarityDropDownText:SetText(colors[CT_RaidTracker_SortOptions["playeritemfilter"]]);
958 CT_RaidTrackerDetailScrollFrameItems:UpdateScrollChildRect();
959 end
960 end
961  
962 function CT_RaidTracker_ColorToRGB(str)
963 str = strlower(strsub(str, 3));
964 local tbl = { };
965 tbl[1], tbl[2], tbl[3], tbl[4], tbl[5], tbl[6] = strsub(str, 1, 1), strsub(str, 2, 2), strsub(str, 3, 3), strsub(str, 4, 4), strsub(str, 5, 5), strsub(str, 6, 6);
966  
967 local highvals = { ["a"] = 10, ["b"] = 11, ["c"] = 12, ["d"] = 13, ["e"] = 14, ["f"] = 15 };
968 for k, v in tbl do
969 if ( highvals[v] ) then
970 tbl[k] = highvals[v];
971 elseif ( tonumber(v) ) then
972 tbl[k] = tonumber(v);
973 end
974 end
975 local r, g, b = (tbl[1]*16+tbl[2])/255, (tbl[3]*16+tbl[4])/255, (tbl[5]*16+tbl[6])/255;
976 if ( not r or r > 1 or r < 0 ) then
977 r = 1;
978 end
979 if ( not g or g > 1 or g < 0 ) then
980 g = 1;
981 end
982 if ( not b or b > 1 or b < 0 ) then
983 b = 1;
984 end
985 return r, g, b;
986 end
987  
988 function CT_RaidTracker_GetColorString(str)
989 if ( not str ) then
990 return 1, 1, 1;
991 end
992 local playerClass = UnitClass("player");
993 local playerLevel = UnitLevel("player");
994 local classArmor = {
995 ["Warrior"] = { ["Cloth"] = 1, ["Leather"] = 1, ["Mail"] = 1, ["Plate"] = 40 },
996 ["Paladin"] = { ["Cloth"] = 1, ["Leather"] = 1, ["Mail"] = 1, ["Plate"] = 40 },
997 ["Shaman"] = { ["Cloth"] = 1, ["Leather"] = 1, ["Mail"] = 40, ["Plate"] = 61 },
998 ["Hunter"] = { ["Cloth"] = 1, ["Leather"] = 1, ["Mail"] = 40, ["Plate"] = 61 },
999 ["Rogue"] = { ["Cloth"] = 1, ["Leather"] = 1, ["Mail"] = 61, ["Plate"] = 61 },
1000 ["Druid"] = { ["Cloth"] = 1, ["Leather"] = 1, ["Mail"] = 61, ["Plate"] = 61 },
1001 ["Warlock"] = { ["Cloth"] = 1, ["Leather"] = 61, ["Mail"] = 61, ["Plate"] = 61 },
1002 ["Mage"] = { ["Cloth"] = 1, ["Leather"] = 61, ["Mail"] = 61, ["Plate"] = 61 },
1003 ["Priest"] = { ["Cloth"] = 1, ["Leather"] = 61, ["Mail"] = 61, ["Plate"] = 61 },
1004 ["Warlock"] = { ["Cloth"] = 1, ["Leather"] = 61, ["Mail"] = 61, ["Plate"] = 61 }
1005 };
1006  
1007  
1008 -- Equip:
1009 if ( string.find(str, "^Equip: ") ) then
1010 return 0, 1, 0;
1011  
1012 -- Use:
1013 elseif ( string.find(str, "^Use: ") ) then
1014 return 0, 1, 0;
1015  
1016 -- Chance on hit:
1017 elseif ( string.find(str, "^Chance on hit:") ) then
1018 return 0, 1, 0;
1019  
1020 -- Sets
1021 elseif ( string.find(str, "^.+ %(%d+/%d+%)$") ) then
1022 return 1, 0.82, 0, 1;
1023  
1024 -- Durability 0/X
1025 elseif ( string.find(str, "^Durability 0 / %d+$") ) then
1026 return 1, 0.15, 0.15;
1027  
1028 -- Wrong class
1029 elseif ( string.find(str, "^Classes: ") and not string.find(str, "^Classes: .*" .. playerClass) ) then
1030 return 1, 0.15, 0.15;
1031  
1032 -- Made by
1033 elseif ( string.find(str, "^<Made by .+>$") ) then
1034 return 0, 1, 0;
1035 end
1036  
1037 -- Armor type
1038 if ( classArmor[playerClass][str] and classArmor[playerClass][str] > playerLevel ) then
1039 return 1, 0.15, 0.15;
1040 end
1041  
1042 -- Low level
1043 local iStart, iEnd, level = string.find(str, "^Requires Level (%d+)$");
1044 if ( level and tonumber(level) > playerLevel ) then
1045 return 1, 0.15, 0.15;
1046 end
1047 return 1, 1, 1;
1048 end
1049  
1050 function CT_RaidTrackerItem_SetHyperlink()
1051 local raidid = this.raidid;
1052 local lootid = this.itemid;
1053 if ( CT_RaidTracker_RaidLog[raidid] and CT_RaidTracker_RaidLog[raidid]["Loot"][lootid] ) then
1054 local item = CT_RaidTracker_RaidLog[raidid]["Loot"][lootid]["item"];
1055 for i = 1, 30, 1 do
1056 getglobal("CT_RTTooltipTextLeft" .. i):SetText("");
1057 getglobal("CT_RTTooltipTextLeft" .. i):Hide();
1058 getglobal("CT_RTTooltipTextRight" .. i):SetText("");
1059 getglobal("CT_RTTooltipTextRight" .. i):Hide();
1060 end
1061 if ( not item["tooltip"] ) then
1062 local tTooltip = { };
1063 CT_RTTooltip:SetHyperlink("item:" .. item["id"]);
1064 for i = 1, CT_RTTooltip:NumLines(), 1 do
1065 local tl, tr;
1066 if ( getglobal("CT_RTTooltipTextLeft" .. i):IsVisible() ) then
1067 tl = getglobal("CT_RTTooltipTextLeft" .. i):GetText();
1068 end
1069 if ( getglobal("CT_RTTooltipTextRight" .. i):IsVisible() ) then
1070 tr = getglobal("CT_RTTooltipTextRight" .. i):GetText();
1071 end
1072 tinsert(tTooltip, { ["left"] = tl, ["right"] = tr });
1073 end
1074 CT_RaidTracker_RaidLog[raidid]["Loot"][lootid]["item"]["tooltip"] = tTooltip;
1075 item["tooltip"] = tTooltip;
1076 end
1077 for i = 1, 30, 1 do
1078 getglobal("CT_RTTooltipTextLeft" .. i):SetText("");
1079 getglobal("CT_RTTooltipTextLeft" .. i):Hide();
1080 getglobal("CT_RTTooltipTextRight" .. i):SetText("");
1081 getglobal("CT_RTTooltipTextRight" .. i):Hide();
1082 end
1083 CT_RTTooltip:SetOwner(this, "ANCHOR_RIGHT");
1084  
1085 local hasShownSet;
1086 for k, v in item["tooltip"] do
1087 local rl, gl, bl, rr, gr, br;
1088 if ( k == 1 ) then
1089 rl, gl, bl = CT_RaidTracker_ColorToRGB(item["c"]);
1090 end
1091 if ( v["right"] ) then
1092 rl, gl, bl, hasShownSet = CT_RaidTracker_GetColorString(v["left"]);
1093 rr, gr, br = CT_RaidTracker_GetColorString(v["right"]);
1094 CT_RTTooltip:AddDoubleLine(v["left"], v["right"], rl, gl, bl, rr, gr, br);
1095 else
1096 if ( hasShownSet ) then
1097 CT_RTTooltip:AddLine(v["left"], 0.5, 0.5, 0.5);
1098 else
1099 if ( not rl and not gl and not bl ) then
1100 rl, gl, bl, hasShownSet = CT_RaidTracker_GetColorString(v["left"]);
1101 end
1102 CT_RTTooltip:AddLine(v["left"], rl, gl, bl);
1103 end
1104 end
1105 end
1106 CT_RTTooltip:Show();
1107 return;
1108 end
1109 end
1110  
1111 function CT_RaidTrackerItem_GetChatHyperlink()
1112 local raidid = this.raidid;
1113 local lootid = this.itemid;
1114 if ( IsShiftKeyDown() and ChatFrameEditBox:IsVisible() and CT_RaidTracker_RaidLog[raidid] and CT_RaidTracker_RaidLog[raidid]["Loot"][lootid] ) then
1115 local item = CT_RaidTracker_RaidLog[raidid]["Loot"][lootid]["item"];
1116 ChatFrameEditBox:Insert("|c" .. item.c .. "|Hitem:" .. item.id .. "|h[" .. item.name .. "]|h|r");
1117 end
1118 end
1119  
1120 CT_RaidTracker_RaidLog = { };
1121 CT_RaidTracker_GetCurrentRaid = nil;
1122  
1123 -- Debug flag
1124  
1125 CT_RaidTracker_DebugFlag = nil;
1126  
1127 -- Debug function(s)
1128  
1129 function CT_RaidTracker_Debug(...)
1130 if ( CT_RaidTracker_DebugFlag ) then
1131 local sDebug = "#";
1132 for i = 1, arg.n, 1 do
1133 if ( arg[i] ) then
1134 sDebug = sDebug .. arg[i] .. "#";
1135 end
1136 end
1137 DEFAULT_CHAT_FRAME:AddMessage(sDebug, 1, 0.5, 0);
1138 end
1139 end
1140  
1141  
1142 -- OnFoo functions
1143  
1144 function CT_RaidTracker_OnLoad()
1145 CT_RaidTrackerTitleText:SetText("CT_RaidTracker " .. CT_RaidTracker_Version);
1146 -- Register events
1147 this:RegisterEvent("CHAT_MSG_LOOT");
1148 this:RegisterEvent("CHAT_MSG_SYSTEM");
1149 this:RegisterEvent("RAID_ROSTER_UPDATE");
1150 this:RegisterEvent("PLAYER_ENTERING_WORLD");
1151 this:RegisterEvent("VARIABLES_LOADED");
1152 end
1153  
1154 function CT_RaidTracker_OnEvent(event)
1155 if ( CT_RaidTracker_UpdateFrame.time and CT_RaidTracker_UpdateFrame.time <= 2 ) then
1156 tinsert(CT_RaidTracker_Events, event);
1157 return;
1158 end
1159 if ( event == "RAID_ROSTER_UPDATE" or event == "PLAYER_ENTERING_WORLD" ) then
1160 if ( GetNumRaidMembers() == 0 and event == "RAID_ROSTER_UPDATE" ) then
1161 if ( CT_RaidTracker_GetCurrentRaid ) then
1162 CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["raidEnd"] = CT_RaidTracker_Date();
1163 end
1164 CT_RaidTracker_GetCurrentRaid = nil;
1165 CT_RaidTracker_Debug("Left raid.");
1166 CT_RaidTracker_Offline = { };
1167 elseif ( not CT_RaidTracker_GetCurrentRaid and GetNumRaidMembers() > 0 and event == "RAID_ROSTER_UPDATE" ) then
1168 local sDate = CT_RaidTracker_Date();
1169 tinsert(CT_RaidTracker_RaidLog, 1, {
1170 ["Loot"] = { },
1171 ["Join"] = { },
1172 ["Leave"] = { },
1173 ["Notes"] = { },
1174 ["key"] = sDate
1175 });
1176 CT_RaidTracker_SortRaidTable();
1177 CT_RaidTracker_GetCurrentRaid = 1;
1178 for i = 1, GetNumRaidMembers(), 1 do
1179 tinsert(CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Join"],
1180 {
1181 ["player"] = UnitName("raid" .. i),
1182 ["time"] = sDate
1183 }
1184 );
1185 local name, rank, subgroup, level, class, fileName, zone, online = GetRaidRosterInfo(i);
1186 if ( not online ) then
1187 tinsert(CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Leave"],
1188 {
1189 ["player"] = UnitName("raid" .. i),
1190 ["time"] = sDate
1191 }
1192 );
1193 end
1194 end
1195 CT_RaidTracker_Debug("Joined new raid at " .. sDate);
1196 CT_RaidTracker_Update();
1197 CT_RaidTracker_UpdateView();
1198 end
1199 if ( not CT_RaidTracker_GetCurrentRaid ) then
1200 return;
1201 end
1202 local updated;
1203 for i = 1, GetNumRaidMembers(), 1 do
1204 local name, online = UnitName("raid" .. i), UnitIsConnected("raid" .. i);
1205 if ( name ) then
1206 if ( online ~= CT_RaidTracker_Online[name] ) then
1207 -- Status isn't updated
1208 if ( not CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid] ) then
1209 CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid] = {
1210 ["Loot"] = { },
1211 ["Join"] = { },
1212 ["Leave"] = { },
1213 ["Notes"] = { }
1214 };
1215 end
1216 if ( not online ) then
1217 tinsert(CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Leave"],
1218 {
1219 ["player"] = name,
1220 ["time"] = CT_RaidTracker_Date()
1221 }
1222 );
1223 CT_RaidTracker_Debug("OFFLINE", name);
1224 else
1225 tinsert(CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Join"],
1226 {
1227 ["player"] = name,
1228 ["time"] = CT_RaidTracker_Date()
1229 }
1230 );
1231 CT_RaidTracker_Debug("ONLINE", name);
1232 end
1233 updated = 1;
1234 end
1235 CT_RaidTracker_Online[name] = online;
1236 end
1237 end
1238 if ( updated ) then
1239 CT_RaidTracker_Update();
1240 CT_RaidTracker_UpdateView();
1241 end
1242 elseif ( event == "CHAT_MSG_LOOT" and CT_RaidTracker_GetCurrentRaid ) then
1243 local sPlayer, sLink;
1244 local iStart, iEnd, sPlayerName, sItem = string.find(arg1, "([^%s]+) receives loot: (.+)%.");
1245 if ( sPlayerName ) then
1246 sPlayer = sPlayerName;
1247 sLink = sItem;
1248 else
1249 local iStart, iEnd, sItem = string.find(arg1, "You receive loot: (.+)%.");
1250 if ( sItem ) then
1251 sPlayer = UnitName("player");
1252 sLink = sItem;
1253 end
1254 end
1255  
1256 -- Make sure there is a link
1257 if ( sLink and sPlayer ) then
1258 local sColor, sItem, sName, tTooltip = CT_RaidTracker_GetItemInfo(sLink);
1259 if ( sColor and sItem and sName and tTooltip and CT_RaidTracker_RarityTable[sColor] ) then
1260 -- Insert into table
1261 if ( not CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid] ) then
1262 CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid] = {
1263 ["Loot"] = { },
1264 ["Join"] = { },
1265 ["Leave"] = { },
1266 ["Notes"] = { }
1267 };
1268 end
1269 local found;
1270 for k, v in CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Loot"] do
1271 if ( v["item"]["name"] == sName and v["player"] == sPlayer ) then
1272 if ( v["item"]["count"] ) then
1273 CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Loot"][k]["item"]["count"] = v["item"]["count"]+1;
1274 else
1275 CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Loot"][k]["item"]["count"] = 1;
1276 end
1277 found = 1;
1278 break;
1279 end
1280 end
1281 if ( not found ) then
1282 tinsert(CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Loot"],
1283 {
1284 ["player"] = sPlayer,
1285 ["item"] = {
1286 ["c"] = sColor,
1287 ["id"] = sItem,
1288 ["tooltip"] = tTooltip,
1289 ["name"] = sName,
1290 ["count"] = 1,
1291 ["type"] = CT_RaidTracker_GetItemType("item:"..sItem)
1292 },
1293 ["time"] = CT_RaidTracker_Date()
1294 }
1295 );
1296 end
1297 CT_RaidTracker_Debug(sPlayer, sColor, sItem, sName);
1298 CT_RaidTracker_Update();
1299 CT_RaidTracker_UpdateView();
1300 end
1301 end
1302 elseif ( event == "CHAT_MSG_SYSTEM" and UnitName("player") and UnitName("player") ~= "Unknown Being" and CT_RaidTracker_GetCurrentRaid ) then
1303 local sDate = CT_RaidTracker_Date();
1304 local iStart, iEnd, sPlayer = string.find(arg1, "([^%s]+) has left the raid group");
1305 if ( sPlayer and sPlayer ~= UnitName("player") and UnitName("player") and UnitName("player") ~= "Unknown Entity" ) then
1306 tinsert(CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Leave"],
1307 {
1308 ["player"] = sPlayer,
1309 ["time"] = sDate
1310 }
1311 );
1312 CT_RaidTracker_Debug(sPlayer, "LEFT");
1313 end
1314 local iStart, iEnd, sPlayer = string.find(arg1, "([^%s]+) has joined the raid group");
1315 if ( sPlayer and sPlayer ~= UnitName("player") ) then
1316 tinsert(CT_RaidTracker_RaidLog[CT_RaidTracker_GetCurrentRaid]["Join"],
1317 {
1318 ["player"] = sPlayer,
1319 ["time"] = sDate
1320 }
1321 );
1322 CT_RaidTracker_Debug(sPlayer, "JOIN");
1323 end
1324 CT_RaidTracker_UpdateView();
1325 CT_RaidTracker_Update();
1326 elseif ( event == "VARIABLES_LOADED" ) then
1327 CT_RaidTracker_ConvertFormat();
1328 end
1329 end
1330  
1331 -- Item functions
1332  
1333 function CT_RaidTracker_GetItemInfo(sItem)
1334 -- Thanks to Telo for the following regular expression
1335 local iStart, iEnd, sColor, sItemName, sName = string.find(sItem, "|c(%x+)|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r");
1336 if ( sColor and sItemName and sName ) then
1337 local tTooltip = { };
1338 for i = 1, 30, 1 do
1339 getglobal("CT_RTTooltipTextLeft" .. i):SetText("");
1340 getglobal("CT_RTTooltipTextLeft" .. i):Hide();
1341 getglobal("CT_RTTooltipTextRight" .. i):SetText("");
1342 getglobal("CT_RTTooltipTextRight" .. i):Hide();
1343 end
1344 CT_RTTooltip:SetHyperlink("item:" .. sItemName);
1345 for i = 1, CT_RTTooltip:NumLines(), 1 do
1346 local tl, tr;
1347 if ( getglobal("CT_RTTooltipTextLeft" .. i):IsVisible() ) then
1348 tl = getglobal("CT_RTTooltipTextLeft" .. i):GetText();
1349 end
1350 if ( getglobal("CT_RTTooltipTextRight" .. i):IsVisible() ) then
1351 tr = getglobal("CT_RTTooltipTextRight" .. i):GetText();
1352 end
1353 tinsert(tTooltip, { ["left"] = tl, ["right"] = tr });
1354 end
1355 return sColor, sItemName, sName, tTooltip;
1356 end
1357 end
1358  
1359 SlashCmdList["RAIDTRACKER"] = function(msg)
1360 ShowUIPanel(CT_RaidTrackerFrame);
1361 end
1362  
1363 SLASH_RAIDTRACKER1 = "/raidtracker";
1364 SLASH_RAIDTRACKER2 = "/rt";
1365  
1366 function CT_RaidTracker_Print(msg, r, g, b)
1367 if ( CT_Print ) then
1368 CT_Print(msg, r, g, b);
1369 else
1370 DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b);
1371 end
1372 end
1373  
1374 function CT_RaidTracker_RarityDropDown_OnLoad()
1375 UIDropDownMenu_Initialize(this, CT_RaidTracker_RarityDropDown_Initialize);
1376 --UIDropDownMenu_SetWidth(130);
1377 UIDropDownMenu_SetSelectedID(CT_RaidTrackerRarityDropDown, 1);
1378 end
1379  
1380 -- Green = 1eff00
1381 -- Blue = 0070dd
1382 -- Purple = a335ee
1383 -- Orange = ff8000
1384  
1385 function CT_RaidTracker_RarityDropDown_Initialize()
1386 local info = {};
1387 info.text = "|c001eff00Uncommon|r";
1388 info.func = CT_RaidTracker_RarityDropDown_OnClick;
1389 UIDropDownMenu_AddButton(info);
1390  
1391 info = {};
1392 info.text = "|c000070ddRare|r";
1393 info.func = CT_RaidTracker_RarityDropDown_OnClick;
1394 UIDropDownMenu_AddButton(info);
1395  
1396 info = {};
1397 info.text = "|c00a335eeEpic|r";
1398 info.func = CT_RaidTracker_RarityDropDown_OnClick;
1399 UIDropDownMenu_AddButton(info);
1400  
1401 info = {};
1402 info.text = "|c00ff8000Legendary|r";
1403 info.func = CT_RaidTracker_RarityDropDown_OnClick;
1404 UIDropDownMenu_AddButton(info);
1405 end
1406  
1407  
1408 function CT_RaidTracker_RarityDropDown_OnClick()
1409 UIDropDownMenu_SetSelectedID(CT_RaidTrackerRarityDropDown, this:GetID());
1410 if ( CT_RaidTrackerFrame.type == "items" ) then
1411 CT_RaidTracker_SortOptions["itemfilter"] = this:GetID();
1412 else
1413 CT_RaidTracker_SortOptions["playeritemfilter"] = this:GetID();
1414 end
1415 CT_RaidTracker_UpdateView();
1416 end
1417  
1418 function CT_RaidTracker_SelectItem(name)
1419 CT_RaidTracker_GetPage();
1420 CT_RaidTrackerFrame.type = "itemhistory";
1421 CT_RaidTrackerFrame.itemname = name;
1422 CT_RaidTrackerFrame.selected = nil;
1423 CT_RaidTracker_Update();
1424 CT_RaidTracker_UpdateView();
1425 end
1426  
1427 function CT_RaidTracker_GetPage()
1428 if ( CT_RaidTrackerFrame.type or CT_RaidTrackerFrame.itemname or CT_RaidTrackerFrame.selected or CT_RaidTrackerFrame.player ) then
1429  
1430 tinsert(CT_RaidTracker_LastPage,
1431 {
1432 ["type"] = CT_RaidTrackerFrame.type,
1433 ["itemname"] = CT_RaidTrackerFrame.itemname,
1434 ["selected"] = CT_RaidTrackerFrame.selected,
1435 ["player"] = CT_RaidTrackerFrame.player
1436 }
1437 );
1438 end
1439  
1440 if ( getn(CT_RaidTracker_LastPage) > 0 ) then
1441 CT_RaidTrackerFrameBackButton:Enable();
1442 else
1443 CT_RaidTrackerFrameBackButton:Disable();
1444 end
1445 end
1446  
1447 function CT_RaidTracker_GoBack()
1448 local t = table.remove(CT_RaidTracker_LastPage);
1449  
1450 if ( t ) then
1451 CT_RaidTrackerFrame.type = t["type"];
1452 CT_RaidTrackerFrame.itemname = t["itemname"];
1453 CT_RaidTrackerFrame.selected = t["selected"];
1454 CT_RaidTrackerFrame.player = t["player"];
1455 CT_RaidTracker_Update();
1456 CT_RaidTracker_UpdateView();
1457 end
1458 if ( getn(CT_RaidTracker_LastPage) > 0 ) then
1459 CT_RaidTrackerFrameBackButton:Enable();
1460 else
1461 CT_RaidTrackerFrameBackButton:Disable();
1462 end
1463 end
1464  
1465 function CT_RaidTracker_ConvertFormat()
1466 -- Called because of old format used during development
1467  
1468 for k, v in CT_RaidTracker_RaidLog do
1469 if ( not v["Notes"] ) then
1470 CT_RaidTracker_RaidLog[k]["Notes"] = { };
1471 end
1472 end
1473 end
1474  
1475 if ( CT_RegisterMod ) then
1476 CT_RaidTracker_DisplayWindow = function()
1477 ShowUIPanel(CT_RaidTrackerFrame);
1478 end
1479 CT_RegisterMod("Raid Tracker", "Display window", 5, "Interface\\Icons\\INV_Chest_Chain_05", "Displays the Raid Tracker window, which tracks raid loot & attendance.", "switch", "", CT_RaidTracker_DisplayWindow);
1480 else
1481 CT_RaidTracker_Print("<CTMod> CT_RaidTracker loaded. Type /rt to show the RaidTracker window.", 1, 1, 0);
1482 end
1483  
1484 function CT_RaidTracker_FixZero(num)
1485 if ( num < 10 ) then
1486 return "0" .. num;
1487 else
1488 return num;
1489 end
1490 end
1491  
1492 function CT_RaidTracker_Date()
1493 local t = date("*t");
1494  
1495 return CT_RaidTracker_FixZero(t.month) .. "/" .. CT_RaidTracker_FixZero(t.day) .. "/" .. strsub(t.year, 3) .. " " .. CT_RaidTracker_FixZero(t.hour) .. ":" .. CT_RaidTracker_FixZero(t.min) .. ":" .. CT_RaidTracker_FixZero(t.sec);
1496 end
1497  
1498 function CT_RaidTrackerUpdateFrame_OnUpdate(elapsed)
1499 if ( this.time ) then
1500 this.time = this.time + elapsed;
1501 if ( this.time > 2 ) then
1502 this.time = nil;
1503 for k, v in CT_RaidTracker_Events do
1504 CT_RaidTracker_OnEvent(v);
1505 end
1506 end
1507 end
1508 end
1509  
1510 function CT_RaidTracker_SelectRaidUpdate()
1511 local numEntries = getn(CT_RaidTracker_RaidLog);
1512  
1513 FauxScrollFrame_Update(CT_RaidTracker_SelectRaidFrameScrollFrame, numEntries, 20, 20);
1514  
1515 for i = 1, 20, 1 do
1516 local button = getglobal("CT_RaidTracker_SelectRaidFrameRaid" .. i);
1517 local index = i + FauxScrollFrame_GetOffset(CT_RaidTracker_SelectRaidFrameScrollFrame);
1518 if ( index <= numEntries ) then
1519 if ( numEntries <= 20 ) then
1520 button:SetWidth(260);
1521 else
1522 button:SetWidth(245);
1523 end
1524 button:Show();
1525 getglobal(button:GetName() .. "Name"):SetText(CT_RaidTracker_RaidLog[index].key);
1526 --getglobal(button:GetName() .. "Info"):SetText(CT_RADurability_Shown[index][2]);
1527 else
1528 button:Hide();
1529 end
1530 end
1531  
1532 end