annotate Hansgar_And_Franzok_Assist.lua @ 3:4a3ffc2ee399

ToC Update.
author Tercio
date Tue, 24 Feb 2015 14:53:29 -0300
parents 23e19ba2b62c
children 1c3534391efb
rev   line source
Tercio@0 1 local floor = floor
Tercio@0 2 local min = min
Tercio@0 3 local UnitExists = UnitExists
Tercio@0 4 local GetPlayerMapPosition = GetPlayerMapPosition
Tercio@0 5 local UnitHealth = UnitHealth
Tercio@0 6
Tercio@0 7 local f = CreateFrame ("frame", "Hansgar_And_Franzok_Assist", UIParent)
Tercio@0 8 f:SetFrameStrata ("DIALOG")
Tercio@0 9
Tercio@0 10 f:SetSize (155, 156)
Tercio@0 11 f:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, insets = {left = -1, right = -1, top = -1, bottom = -1},
Tercio@0 12 edgeFile = "Interface\\AddOns\\Hansgar_And_Franzok_Assist\\border_2", edgeSize = 8})
Tercio@0 13 f:SetPoint ("center", UIParent, "center")
Tercio@0 14 f:SetBackdropColor (0, 0, 0, 0)
Tercio@0 15 f:SetBackdropBorderColor (0, 0, 0, 1)
Tercio@0 16 f:SetMovable (true)
Tercio@0 17 f:EnableMouse (true)
Tercio@0 18 f:Hide()
Tercio@0 19
Tercio@0 20 local title = f:CreateFontString (nil, "overlay", "GameFontNormal")
Tercio@0 21 title:SetText ("Hansgar & Franzok Assist")
Tercio@0 22 title:SetPoint ("center", f, "center")
Tercio@0 23 title:SetPoint ("bottom", f, "top", 0, 2)
Tercio@0 24
Tercio@0 25 --
Tercio@0 26 local frame_event = CreateFrame ("frame", "Hansgar_And_Franzok_AssistEvents", f)
Tercio@0 27 frame_event:RegisterEvent ("ENCOUNTER_START")
Tercio@0 28 frame_event:RegisterEvent ("ENCOUNTER_END")
Tercio@0 29 frame_event:RegisterEvent ("ADDON_LOADED")
Tercio@0 30
Tercio@0 31 --
Tercio@0 32 local player_bar = CreateFrame ("statusbar", "Hansgar_And_Franzok_AssistPlayerBar", f)
Tercio@0 33 player_bar:SetPoint ("topleft", f, "bottomleft", 0, -3)
Tercio@0 34 player_bar:SetPoint ("topright", f, "bottomright", 0, -3)
Tercio@0 35 player_bar:SetHeight (14)
Tercio@0 36 player_bar:SetStatusBarColor (0, 0, 0, 0)
Tercio@0 37 player_bar:SetMinMaxValues (0, 100)
Tercio@0 38 player_bar:SetValue (0)
Tercio@0 39 f.player_bar = player_bar
Tercio@0 40
Tercio@0 41 player_bar.texture = player_bar:CreateTexture (nil, "overlay")
Tercio@0 42 player_bar.texture:SetTexture ("Interface\\AddOns\\Hansgar_And_Franzok_Assist\\bar_skyline")
Tercio@0 43 player_bar:SetStatusBarTexture (player_bar.texture)
Tercio@0 44
Tercio@0 45 --
Tercio@0 46
Tercio@0 47 local db
Tercio@0 48
Tercio@0 49 frame_event:SetFrameStrata ("FULLSCREEN")
Tercio@0 50
Tercio@0 51 frame_event:SetScript ("OnEvent", function (self, event, ...)
Tercio@0 52
Tercio@0 53 if (event == "ADDON_LOADED" and select (1, ...) == "Hansgar_And_Franzok_Assist") then
Tercio@0 54
Tercio@0 55 db = Hansgar_And_Franzok_DB
Tercio@0 56 if (not db) then
Tercio@0 57 db = {}
Tercio@0 58 Hansgar_And_Franzok_DB = db
Tercio@0 59 end
Tercio@0 60 db.STAMPERS_DELAY = db.STAMPERS_DELAY or 5
Tercio@0 61
Tercio@0 62 SLASH_Hansgar_And_Franzok_Assist1, SLASH_Hansgar_And_Franzok_Assist2 = "/hansgar", "/franzok"
Tercio@0 63 function SlashCmdList.Hansgar_And_Franzok_Assist (msg, editbox)
Tercio@0 64
Tercio@0 65 local command, rest = msg:match ("^(%S*)%s*(.-)$")
Tercio@0 66
Tercio@0 67 if (command == "delay") then
Tercio@0 68 local t = tonumber (rest)
Tercio@0 69 if (t) then
Tercio@0 70 db.STAMPERS_DELAY = t
Tercio@0 71 print ("|cFFFFAA00Hansgar and Franzok Assist|r delay set to: ", t)
Tercio@0 72 else
Tercio@0 73 print ("|cFFFFAA00Hansgar and Franzok Assist|r invalid time.", t)
Tercio@0 74 end
Tercio@0 75
Tercio@0 76 elseif (command == "test" or command == "show") then
Tercio@0 77 if (f.StampersPhase) then
Tercio@0 78 return f:StopTracking()
Tercio@0 79 end
Tercio@0 80 f:StartTracking()
Tercio@0 81
Tercio@0 82 elseif (command == "hide") then
Tercio@0 83 if (f.StampersPhase) then
Tercio@0 84 return f:StopTracking()
Tercio@0 85 end
Tercio@0 86
Tercio@0 87 else
Tercio@2 88 print ("|cFFFFAA00Hansgar and Franzok Assist|r |cFF00FF00v0.4|r Commands:")
Tercio@0 89 print ("|cFFFFFF00/hansgar delay <time>|r: time in seconds until the percentage goes from 0 to 100.")
Tercio@0 90 print ("|cFFFFFF00/hansgar test|r: active the addon on test mode.")
Tercio@0 91 print ("|cFFFFFF00/hansgar show|r: show the window and start test mode.")
Tercio@0 92 print ("|cFFFFFF00/hansgar hide|r: hide the window.")
Tercio@0 93 end
Tercio@0 94 end
Tercio@0 95
Tercio@0 96 elseif (event == "ENCOUNTER_START" or event == "ENCOUNTER_END") then
Tercio@0 97
Tercio@0 98 local encounterID, encounterName, difficultyID, raidSize = select (1, ...)
Tercio@0 99 if (encounterID == 1693 and difficultyID == 16) then
Tercio@0 100
Tercio@0 101 if (event == "ENCOUNTER_START") then
Tercio@0 102
Tercio@0 103 print ("|cFFFFAA00Hansgar and Franzok Assist|r: addon enabled, good look!")
Tercio@0 104
Tercio@0 105 if (f.StampersPhase) then
Tercio@0 106 f:StopTracking()
Tercio@0 107 end
Tercio@0 108 f:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
Tercio@0 109
Tercio@0 110 elseif (event == "ENCOUNTER_END") then
Tercio@0 111 f:UnregisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
Tercio@0 112
Tercio@0 113 if (f.StampersPhase) then
Tercio@0 114 f:StopTracking()
Tercio@0 115 end
Tercio@0 116 end
Tercio@0 117 end
Tercio@0 118 end
Tercio@0 119
Tercio@0 120 end)
Tercio@0 121
Tercio@0 122 --
Tercio@2 123 --f:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
Tercio@0 124
Tercio@0 125 f:SetScript ("OnEvent", function (self, event, time, token, _, who_serial, who_name, who_flags, _, target_serial, target_name, target_flags, _, spellid, spellname, spellschool, buff_type, ...)
Tercio@0 126
Tercio@2 127 if (token == "SPELL_AURA_APPLIED" and spellid == 162124 and not f.StampersPhase) then
Tercio@0 128 f:StartTracking()
Tercio@0 129
Tercio@2 130 elseif (token == "SPELL_AURA_REMOVED" and spellid == 162124 and f.StampersPhase) then
Tercio@0 131 f:StopTracking()
Tercio@0 132
Tercio@0 133 end
Tercio@0 134
Tercio@0 135 end)
Tercio@0 136
Tercio@0 137 local frame_tracker = CreateFrame ("frame", "Hansgar_And_Franzok_AssistTracker", UIParent)
Tercio@0 138 local on_update_tracker = function (self, elapsed)
Tercio@0 139
Tercio@0 140 for i = 1, GetNumGroupMembers() do
Tercio@0 141 local x, y = GetPlayerMapPosition ("raid"..i)
Tercio@0 142 if (UnitExists ("raid"..i) and UnitHealth ("raid"..i) > 1 and x and y) then
Tercio@0 143 local block = f:WhichBlock (x, y)
Tercio@0 144 if (block) then
Tercio@0 145 if (not f.block_tracker [block]) then --> was a clear block
Tercio@0 146 f.block_tracker [block] = GetTime()
Tercio@0 147 f:Paint (f.all_blocks [block])
Tercio@0 148 end
Tercio@0 149 end
Tercio@0 150 end
Tercio@0 151 end
Tercio@0 152
Tercio@0 153 local px, py = GetPlayerMapPosition ("player")
Tercio@0 154 local player_block = f:WhichBlock (px, py)
Tercio@0 155 if (player_block) then
Tercio@0 156
Tercio@0 157 local time_limit_at = f.block_tracker [player_block] + db.STAMPERS_DELAY
Tercio@0 158 local time_now = GetTime()
Tercio@0 159
Tercio@0 160 f.player_bar:SetValue ((time_limit_at - time_now) / db.STAMPERS_DELAY * 100)
Tercio@0 161 f.player_bar:Show()
Tercio@0 162
Tercio@0 163 local block_frame = f.all_blocks [player_block]
Tercio@0 164 f.player_loc_box:SetPoint ("center", block_frame, "center")
Tercio@0 165 f.player_loc_box:Show()
Tercio@0 166 player_bar:Show()
Tercio@0 167 else
Tercio@0 168 f.player_loc_box:Hide()
Tercio@0 169 f.player_bar:Hide()
Tercio@0 170 end
Tercio@0 171 end
Tercio@0 172
Tercio@0 173 function f:StartTracking()
Tercio@0 174
Tercio@0 175 print ("|cFFFFAA00Hansgar and Franzok Assist|r: Smart Stampers phase started.")
Tercio@0 176
Tercio@0 177 f.StampersPhase = true
Tercio@0 178
Tercio@0 179 if (not f.frames_built) then
Tercio@0 180 f:CreateWindow()
Tercio@0 181 end
Tercio@0 182
Tercio@0 183 f:ResetBlocks()
Tercio@0 184 f.player_loc_box:Hide()
Tercio@0 185
Tercio@0 186 f.block_tracker = f.block_tracker or {}
Tercio@0 187 table.wipe (f.block_tracker)
Tercio@0 188
Tercio@0 189 SetMapToCurrentZone()
Tercio@0 190
Tercio@0 191 frame_tracker:SetScript ("OnUpdate", on_update_tracker)
Tercio@0 192 f:Show()
Tercio@0 193 end
Tercio@0 194
Tercio@0 195 function f:StopTracking()
Tercio@0 196
Tercio@0 197 print ("|cFFFFAA00Hansgar and Franzok Assist|r: Smart Stampers phase ended.")
Tercio@0 198
Tercio@0 199 f.StampersPhase = false
Tercio@0 200 frame_tracker:SetScript ("OnUpdate", nil)
Tercio@0 201 table.wipe (f.block_tracker)
Tercio@0 202 f.player_loc_box:Hide()
Tercio@0 203 f:Hide()
Tercio@0 204 end
Tercio@0 205
Tercio@0 206 local on_mouse_down = function (self)
Tercio@0 207 if (not self.isMoving) then
Tercio@0 208 self.isMoving = true
Tercio@0 209 f:StartMoving()
Tercio@0 210 end
Tercio@0 211 end
Tercio@0 212 local on_mouse_up = function (self)
Tercio@0 213 if (self.isMoving) then
Tercio@0 214 self.isMoving = nil
Tercio@0 215 f:StopMovingOrSizing()
Tercio@0 216 end
Tercio@0 217 end
Tercio@0 218
Tercio@0 219 local painting = function (self, elapsed)
Tercio@0 220 self.step = self.step + elapsed
Tercio@0 221 self.total_time = self.total_time + elapsed
Tercio@0 222
Tercio@0 223 if (self.step > 0.2) then
Tercio@0 224 self.step = 0
Tercio@0 225 local percent = self.total_time / db.STAMPERS_DELAY * 100
Tercio@0 226
Tercio@0 227 percent = min (percent, 100)
Tercio@0 228
Tercio@0 229 local r, g, b = f:percent_color (percent, true)
Tercio@0 230 self:SetBackdropColor (r, g, b, 0.5)
Tercio@0 231
Tercio@0 232 self.number:SetText (floor (percent) .. "%")
Tercio@0 233 self.number:SetTextColor (1, 1, 1, 1)
Tercio@0 234
Tercio@0 235 if (percent == 100) then
Tercio@0 236 self:SetScript ("OnUpdate", nil)
Tercio@0 237 self.stamper_icon:Show()
Tercio@0 238 self.number:Hide()
Tercio@0 239 end
Tercio@0 240 end
Tercio@0 241 end
Tercio@0 242 function f:Paint (block)
Tercio@0 243 block.step = 0
Tercio@0 244 block.total_time = 0
Tercio@0 245 block:SetScript ("OnUpdate", painting)
Tercio@0 246 end
Tercio@0 247
Tercio@0 248 function f:ResetBlocks()
Tercio@0 249 for _, block in ipairs (f.all_blocks) do
Tercio@0 250 block:SetScript ("OnUpdate", nil)
Tercio@0 251 block:SetBackdropColor (.8, .8, .8, 0.5)
Tercio@0 252 block.number:SetText (block.id)
Tercio@0 253 block.number:SetTextColor (1, 1, 1, 0.5)
Tercio@0 254 block.number:Show()
Tercio@0 255 block.stamper_icon:Hide()
Tercio@0 256 end
Tercio@0 257 end
Tercio@0 258
Tercio@0 259 function f:CreateWindow()
Tercio@0 260 local x = 0
Tercio@0 261 local y = 0
Tercio@0 262
Tercio@0 263 f.player_loc_box = frame_event:CreateTexture (nil, "overlay")
Tercio@0 264 f.player_loc_box:SetSize (32, 40)
Tercio@0 265 f.player_loc_box:SetTexture ([[Interface\ContainerFrame\UI-Icon-QuestBorder]])
Tercio@0 266 f.player_loc_box:Hide()
Tercio@0 267
Tercio@0 268 f.all_blocks = {}
Tercio@0 269
Tercio@0 270 for i = 1, 20 do
Tercio@0 271
Tercio@0 272 local block = CreateFrame ("frame", "Hansgar_And_Franzok_Assist_Block" .. i, f)
Tercio@0 273 block:SetSize (30, 38)
Tercio@0 274 block:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0},
Tercio@0 275 })
Tercio@0 276 block:SetBackdropBorderColor (0, 0, 0, 1)
Tercio@0 277 block:SetBackdropColor (.8, .8, .8, 0.5)
Tercio@0 278 block:SetPoint ("TopLeft", f, "TopLeft", x, y)
Tercio@0 279
Tercio@0 280 block:SetScript ("OnMouseDown", on_mouse_down)
Tercio@0 281 block:SetScript ("OnMouseUp", on_mouse_up)
Tercio@0 282
Tercio@0 283 block.id = i
Tercio@0 284
Tercio@0 285 local number = block:CreateFontString (nil, "artwork", "GameFontHighlight")
Tercio@0 286 number:SetPoint ("center", block, "center")
Tercio@0 287 number:SetText (i)
Tercio@0 288 number:SetTextColor (1, 1, 1, 0.5)
Tercio@0 289 block.number = number
Tercio@0 290
Tercio@0 291 local stamper_icon = block:CreateTexture (nil, "overlay")
Tercio@0 292 stamper_icon:SetTexture ([[Interface\ICONS\Warrior_talent_icon_LambsToTheSlaughter]])
Tercio@0 293 stamper_icon:SetTexCoord (4/64, 60/64, 4/64, 60/64)
Tercio@0 294 stamper_icon:SetSize (24, 24)
Tercio@0 295 stamper_icon:SetPoint ("center", block, "center")
Tercio@0 296 stamper_icon:Hide()
Tercio@0 297 block.stamper_icon = stamper_icon
Tercio@0 298
Tercio@0 299 x = x + 31
Tercio@0 300 if (x >= 155) then
Tercio@0 301 x = 0
Tercio@0 302 y = y - 40
Tercio@0 303 end
Tercio@0 304
Tercio@0 305 tinsert (f.all_blocks, block)
Tercio@0 306
Tercio@0 307 end
Tercio@0 308
Tercio@0 309 f.frames_built = true
Tercio@0 310
Tercio@0 311 end
Tercio@0 312
Tercio@0 313 local locs = {
Tercio@0 314 --block 1:
Tercio@1 315 {x1 = 0.51103663444519, y1 = 0.79726493358612, x2 = 0.50061076879501, y2 = 0.8241291642189},
Tercio@0 316 --block 2:
Tercio@1 317 {x1 = 0.49670505523682, y1 = 0.79692482948303, x2 = 0.48469054698944, y2 = 0.82489335536957},
Tercio@0 318 --block 3:
Tercio@1 319 {x1 = 0.48130965232849, y1 = 0.79742962121964, x2 = 0.46962946653366, y2 = 0.82453238964081},
Tercio@0 320 --block 4:
Tercio@1 321 {x1 = 0.46575212478638, y1 = 0.79766929149628, x2 = 0.45400339365005, y2 = 0.82176661491394},
Tercio@0 322 --block 5:
Tercio@1 323 {x1 = 0.45073217153549, y1 = 0.79751670360565, x2 = 0.43945103883743, y2 = 0.82504689693451},
Tercio@0 324
Tercio@0 325 --block 6
Tercio@1 326 {x1 = 0.51104211807251, y1 = 0.76532691717148, x2 = 0.50021582841873, y2 = 0.79546189308167},
Tercio@1 327 --block 7
Tercio@1 328 {x1 = 0.4964514374733, y1 = 0.76603573560715, x2 = 0.48449218273163, y2 = 0.79527854919434},
Tercio@1 329 --block 8
Tercio@1 330 {x1 = 0.48101079463959, y1 = 0.76503103971481, x2 = 0.46944016218185, y2 = 0.79543298482895},
Tercio@1 331 --block 9
Tercio@1 332 {x1 = 0.46541726589203, y1 = 0.7654857635498, x2 = 0.45369201898575, y2 = 0.79529416561127},
Tercio@1 333 --block 10
Tercio@1 334 {x1 = 0.45051556825638, y1 = 0.76583826541901, x2 = 0.43931984901428, y2 = 0.79570162296295},
Tercio@1 335
Tercio@1 336
Tercio@1 337 --block 11
Tercio@0 338 {x1 = 0.51104187965393, y1 = 0.73422884941101, x2 = 0.49990028142929, y2 = 0.76343530416489},
Tercio@1 339 --block 12
Tercio@0 340 {x1 = 0.49673527479172, y1 = 0.73338270187378, x2 = 0.48483556509018, y2 = 0.76356953382492},
Tercio@1 341 --block 13
Tercio@0 342 {x1 = 0.48133307695389, y1 = 0.73373115062714, x2 = 0.46920585632324, y2 = 0.76366758346558},
Tercio@1 343 --block 14
Tercio@0 344 {x1 = 0.46568286418915, y1 = 0.73440700769424, x2 = 0.45381307601929, y2 = 0.76358675956726},
Tercio@1 345 --block 15
Tercio@0 346 {x1 = 0.45046973228455, y1 = 0.73361301422119, x2 = 0.43929302692413, y2 = 0.76388084888458},
Tercio@0 347
Tercio@0 348 --block 16
Tercio@1 349 {x1 = 0.51104891300201, y1 = 0.70877063274384, x2 = 0.50024521350861, y2 = 0.73220580816269},
Tercio@0 350 --block 17
Tercio@1 351 {x1 = 0.49676024913788, y1 = 0.70914703607559, x2 = 0.48485481739044, y2 = 0.73210543394089},
Tercio@0 352 --block 18
Tercio@1 353 {x1 = 0.48142266273499, y1 = 0.70876735448837, x2 = 0.46925610303879, y2 = 0.73205661773682},
Tercio@0 354 --block 19
Tercio@1 355 {x1 = 0.46603119373322, y1 = 0.70929777622223, x2 = 0.45397216081619, y2 = 0.73167610168457},
Tercio@0 356 --block 20
Tercio@1 357 {x1 = 0.45079308748245, y1 = 0.70926278829575, x2 = 0.43927478790283, y2 = 0.73225915431976},
Tercio@0 358 }
Tercio@0 359
Tercio@0 360 function f:WhichBlock (x, y)
Tercio@0 361 for i = 1, #locs do
Tercio@0 362 local loc = locs [i]
Tercio@0 363 if (x >= loc.x2 and x <= loc.x1 and y >= loc.y1 and y <= loc.y2) then
Tercio@0 364 return i
Tercio@0 365 end
Tercio@0 366 end
Tercio@0 367 end
Tercio@0 368
Tercio@0 369 function f:percent_color (value, inverted)
Tercio@0 370 local r, g
Tercio@0 371 if (value < 50) then
Tercio@0 372 r = 255
Tercio@0 373 else
Tercio@0 374 r = floor ( 255 - (value * 2 - 100) * 255 / 100)
Tercio@0 375 end
Tercio@0 376
Tercio@0 377 if (value > 50) then
Tercio@0 378 g = 255
Tercio@0 379 else
Tercio@0 380 g = floor ( (value * 2) * 255 / 100)
Tercio@0 381 end
Tercio@0 382
Tercio@0 383 if (inverted) then
Tercio@0 384 return g/255, r/255, 0
Tercio@0 385 else
Tercio@0 386 return r/255, g/255, 0
Tercio@0 387 end
Tercio@0 388 end