vanilla-wow-addons – Blame information for rev 1
?pathlinks?
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 |