· 6 years ago · Oct 21, 2019, 01:46 AM
1--> Library NickTag is a small library for share individual nicknames and avatars.
2
3--> Basic Functions:
4-- NickTag:SetNickname (name) -> set the player nick name, after set nicktag will broadcast the nick over addon guild channel.
5--
6
7local major, minor = "NickTag-1.0", 11
8local NickTag, oldminor = LibStub:NewLibrary (major, minor)
9
10if (not NickTag) then
11 return
12end
13
14--> fix for old nicktag version
15if (_G.NickTag) then
16 if (_G.NickTag.OnEvent) then
17 _G.NickTag:UnregisterComm ("NickTag")
18 _G.NickTag.OnEvent = nil
19 end
20end
21
22------------------------------------------------------------------------------------------------------------------------------------------------------
23--> constants
24
25 local CONST_INDEX_NICKNAME = 1
26 local CONST_INDEX_AVATAR_PATH = 2
27 local CONST_INDEX_AVATAR_TEXCOORD = 3
28 local CONST_INDEX_BACKGROUND_PATH = 4
29 local CONST_INDEX_BACKGROUND_TEXCOORD = 5
30 local CONST_INDEX_BACKGROUND_COLOR = 6
31 local CONST_INDEX_REVISION = 7
32
33 local CONST_COMM_FULLPERSONA = 1
34
35 --[[global]] NICKTAG_DEFAULT_AVATAR = [[Interface\EncounterJournal\UI-EJ-BOSS-Default]]
36 --[[global]] NICKTAG_DEFAULT_BACKGROUND = [[Interface\PetBattles\Weather-ArcaneStorm]]
37 --[[global]] NICKTAG_DEFAULT_BACKGROUND_CORDS = {0.129609375, 1, 1, 0}
38
39------------------------------------------------------------------------------------------------------------------------------------------------------
40--> library stuff
41
42 _G.NickTag = NickTag --> nicktag object over global container
43
44 local pool = {default = true} --> pointer to the cache pool and the default pool if no cache
45 local siblingsPools = {} --> pools registered by other addons
46 --when this instance was the first to load
47 local isMaster = false
48
49 NickTag.debug = false
50
51 LibStub:GetLibrary ("AceComm-3.0"):Embed (NickTag)
52 LibStub:GetLibrary ("AceSerializer-3.0"):Embed (NickTag)
53 LibStub:GetLibrary ("AceTimer-3.0"):Embed (NickTag)
54 local CallbackHandler = LibStub:GetLibrary ("CallbackHandler-1.0")
55 NickTag.callbacks = NickTag.callbacks or CallbackHandler:New (NickTag)
56
57 NickTag.embeds = NickTag.embeds or {}
58 local embed_functions = {
59 "SetNickname",
60 "SetNicknameAvatar",
61 "SetNicknameBackground",
62 "GetNickname",
63 "GetNicknameAvatar",
64 "GetNicknameBackground",
65 "GetNicknameTable",
66 "NickTagSetCache",
67 "ResetPlayerPersona"
68 }
69 function NickTag:Embed (target)
70 for k, v in pairs (embed_functions) do
71 target[v] = self[v]
72 end
73 self.embeds [target] = true
74 return target
75 end
76
77 function NickTag:Msg (...)
78 if (NickTag.debug) then
79 print ("|cFFFFFF00NickTag:|r", ...)
80 end
81 end
82
83 local enUS = LibStub("AceLocale-3.0"):NewLocale ("NickTag-1.0", "enUS", true)
84 if (enUS) then
85 enUS ["STRING_ERROR_1"] = "Your nickname is too long, max of 12 characters is allowed."
86 enUS ["STRING_ERROR_2"] = "Only letters and two spaces are allowed."
87 enUS ["STRING_ERROR_3"] = "You can't use the same letter three times consecutively, two spaces consecutively or more then two spaces."
88 enUS ["STRING_ERROR_4"] = "Name isn't a valid string."
89 enUS ["STRING_INVALID_NAME"] = "Invalid Name"
90 end
91
92 local ptBR = LibStub("AceLocale-3.0"):NewLocale ("NickTag-1.0", "ptBR")
93 if (ptBR) then
94 ptBR ["STRING_ERROR_1"] = "Seu apelido esta muito longo, o maximo permitido sao 12 caracteres."
95 ptBR ["STRING_ERROR_2"] = "Apenas letras, numeros e espacos sao permitidos no apelido."
96 ptBR ["STRING_ERROR_3"] = "Voce nao pode usar a mesma letra mais de 2 vezes consecutivas, dois espacos consecutivos ou mais de 2 espacos."
97 ptBR ["STRING_ERROR_4"] = "Nome nao eh uma string valida."
98 ptBR ["STRING_INVALID_NAME"] = "Nome Invalido"
99 end
100
101 NickTag.background_pool = {
102 {[[Interface\PetBattles\Weather-ArcaneStorm]], "Arcane Storm", {0.129609375, 1, 1, 0}},
103 {[[Interface\PetBattles\Weather-Blizzard]], "Blizzard", {0.068704154, 1, 1, 0}},
104 {[[Interface\PetBattles\Weather-BurntEarth]], "Burnt Earth", {0.087890625, 0.916015625, 1, 0}},
105 {[[Interface\PetBattles\Weather-Darkness]], "Darkness", {0.080078125, 0.931640625, 1, 0}},
106 {[[Interface\PetBattles\Weather-Moonlight]], "Moonlight", {0.02765625, 0.94359375, 1, 0}},
107 {[[Interface\PetBattles\Weather-Moonlight]], "Moonlight (reverse)", {0.94359375, 0.02765625, 1, 0}},
108 {[[Interface\PetBattles\Weather-Mud]], "Mud", {0.068359375, 0.94359375, 1, 0}},
109 {[[Interface\PetBattles\Weather-Rain]], "Rain", {0.078125, 0.970703125, 1, 0}},
110 {[[Interface\PetBattles\Weather-Sandstorm]], "Sand Storm", {0.048828125, 0.947265625, 1, 0}},
111 {[[Interface\PetBattles\Weather-StaticField]], "Static Field", {0.1171875, 0.953125, 1, 0}},
112 {[[Interface\PetBattles\Weather-Sunlight]], "Sun Light", {0.1772721, 0.953125, 1, 0}},
113 {[[Interface\PetBattles\Weather-Windy]], "Windy", {0.9453125, 0.07421875, 0.8203125, 0}}
114 }
115
116 NickTag.avatar_pool = {
117 {[[Interface\EncounterJournal\UI-EJ-BOSS-Arcanist Doan]], "Arcanist Doan"},
118 {[[Interface\EncounterJournal\UI-EJ-BOSS-Archbishop Benedictus]], "Archbishop Benedictus"},
119 {[[Interface\EncounterJournal\UI-EJ-BOSS-Argent Confessor Paletress]], "Argent Confessor Paletress"},
120 {[[Interface\EncounterJournal\UI-EJ-BOSS-Armsmaster Harlan]], "Armsmaster Harlan"},
121 {[[Interface\EncounterJournal\UI-EJ-BOSS-Asira Dawnslayer]], "Asira Dawnslayer"},
122 {[[Interface\EncounterJournal\UI-EJ-BOSS-Baelog]], "Baelog"},
123 {[[Interface\EncounterJournal\UI-EJ-BOSS-Baron Ashbury]], "Baron Ashbury"},
124 {[[Interface\EncounterJournal\UI-EJ-BOSS-Baron Silverlaine]], "Baron Silverlaine"},
125 {[[Interface\EncounterJournal\UI-EJ-BOSS-Blood Guard Porung]], "Blood Guard Porung"},
126 {[[Interface\EncounterJournal\UI-EJ-BOSS-Bronjahm]], "Bronjahm"},
127 {[[Interface\EncounterJournal\UI-EJ-BOSS-Brother Korloff]], "Brother Korloff"},
128 {[[Interface\EncounterJournal\UI-EJ-BOSS-Captain Skarloc]], "Captain Skarloc"},
129 {[[Interface\EncounterJournal\UI-EJ-BOSS-Chief Ukorz Sandscalp]], "Chief Ukorz Sandscalp"},
130 {[[Interface\EncounterJournal\UI-EJ-BOSS-Commander Kolurg]], "Commander Kolurg"},
131 {[[Interface\EncounterJournal\UI-EJ-BOSS-Commander Malor]], "Commander Malor"},
132 {[[Interface\EncounterJournal\UI-EJ-BOSS-Commander Sarannis]], "Commander Sarannis"},
133 {[[Interface\EncounterJournal\UI-EJ-BOSS-Commander Springvale]], "Commander Springvale"},
134 {[[Interface\EncounterJournal\UI-EJ-BOSS-Commander Stoutbeard]], "Commander Stoutbeard"},
135 {[[Interface\EncounterJournal\UI-EJ-BOSS-Corla, Herald of Twilight]], "Corla, Herald of Twilight"},
136 {[[Interface\EncounterJournal\UI-EJ-BOSS-Cyanigosa]], "Cyanigosa"},
137 {[[Interface\EncounterJournal\UI-EJ-BOSS-Darkmaster Gandling]], "Darkmaster Gandling"},
138 {[[Interface\EncounterJournal\UI-EJ-BOSS-Doctor Theolen Krastinov]], "Doctor Theolen Krastinov"},
139 {[[Interface\EncounterJournal\UI-EJ-BOSS-DoomRel]], "DoomRel"},
140 {[[Interface\EncounterJournal\UI-EJ-BOSS-Eadric the Pure]], "Eadric the Pure"},
141 {[[Interface\EncounterJournal\UI-EJ-BOSS-Emperor Thaurissan]], "Emperor Thaurissan"},
142 {[[Interface\EncounterJournal\UI-EJ-BOSS-Empyreal Queens]], "Lu'lin"},
143 {[[Interface\EncounterJournal\UI-EJ-BOSS-Exarch Maladaar]], "Exarch Maladaar"},
144 {[[Interface\EncounterJournal\UI-EJ-BOSS-Fineous Darkvire]], "Fineous Darkvire"},
145 {[[Interface\EncounterJournal\UI-EJ-BOSS-Galdarah]], "Galdarah"},
146 {[[Interface\EncounterJournal\UI-EJ-BOSS-Garajal the Spiritbinder]], "Garajal the Spiritbinder"},
147 {[[Interface\EncounterJournal\UI-EJ-BOSS-Garrosh Hellscream]], "Garrosh Hellscream"},
148 {[[Interface\EncounterJournal\UI-EJ-BOSS-General Nazgrim]], "General Nazgrim"},
149 {[[Interface\EncounterJournal\UI-EJ-BOSS-Grand Champions-Alliance]], "Grand Champions-Alliance"},
150 {[[Interface\EncounterJournal\UI-EJ-BOSS-Grand Champions-Horde]], "Grand Champions-Horde"},
151 {[[Interface\EncounterJournal\UI-EJ-BOSS-Grand Magus Telestra]], "Grand Magus Telestra"},
152 {[[Interface\EncounterJournal\UI-EJ-BOSS-HateRel]], "HateRel"},
153 {[[Interface\EncounterJournal\UI-EJ-BOSS-Hazzarah]], "Hazzarah"},
154 {[[Interface\EncounterJournal\UI-EJ-BOSS-Hearthsinger Forresten]], "Hearthsinger Forresten"},
155 {[[Interface\EncounterJournal\UI-EJ-BOSS-Helix Gearbreaker]], "Helix Gearbreaker"},
156 {[[Interface\EncounterJournal\UI-EJ-BOSS-High Botanist Freywinn]], "High Botanist Freywinn"},
157 {[[Interface\EncounterJournal\UI-EJ-BOSS-High Inquisitor Whitemane]], "High Inquisitor Whitemane"},
158 {[[Interface\EncounterJournal\UI-EJ-BOSS-High Interrogator Gerstahn]], "High Interrogator Gerstahn"},
159 {[[Interface\EncounterJournal\UI-EJ-BOSS-High Justice Grimstone]], "High Justice Grimstone"},
160 {[[Interface\EncounterJournal\UI-EJ-BOSS-Houndmaster Braun]], "Houndmaster Braun"},
161 {[[Interface\EncounterJournal\UI-EJ-BOSS-Houndmaster Loksey]], "Houndmaster Loksey"},
162 {[[Interface\EncounterJournal\UI-EJ-BOSS-Hydromancer Velratha]], "Hydromancer Velratha"},
163 {[[Interface\EncounterJournal\UI-EJ-BOSS-Illyanna Ravenoak]], "Illyanna Ravenoak"},
164 {[[Interface\EncounterJournal\UI-EJ-BOSS-Ingvar the Plunderer]], "Ingvar the Plunderer"},
165 {[[Interface\EncounterJournal\UI-EJ-BOSS-Instructor Galford]], "Instructor Galford"},
166 {[[Interface\EncounterJournal\UI-EJ-BOSS-Instructor Malicia]], "Instructor Malicia"},
167 {[[Interface\EncounterJournal\UI-EJ-BOSS-Interrogator Vishas]], "Interrogator Vishas"},
168 {[[Interface\EncounterJournal\UI-EJ-BOSS-Isiset]], "Isiset"},
169 {[[Interface\EncounterJournal\UI-EJ-BOSS-JainaProudmoore]], "Jaina Proudmoore"},
170 {[[Interface\EncounterJournal\UI-EJ-BOSS-Jandice Barov]], "Jandice Barov"},
171 {[[Interface\EncounterJournal\UI-EJ-BOSS-Kaelthas Sunstrider]], "Kaelthas Sunstrider"},
172 {[[Interface\EncounterJournal\UI-EJ-BOSS-Kelidan the Breaker]], "Kelidan the Breaker"},
173 {[[Interface\EncounterJournal\UI-EJ-BOSS-Krick]], "Krick"},
174 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lady Anacondra]], "Lady Anacondra"},
175 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lady Illucia Barov]], "Lady Illucia Barov"},
176 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lethtendris]], "Lethtendris"},
177 {[[Interface\EncounterJournal\UI-EJ-BOSS-Loken]], "Loken"},
178 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lord Alexei Barov]], "Lord Alexei Barov"},
179 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lord Aurius Rivendare]], "Lord Aurius Rivendare"},
180 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lord Cobrahn]], "Lord Cobrahn"},
181 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lord Pythas]], "Lord Pythas"},
182 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lord Serpentis]], "Lord Serpentis"},
183 {[[Interface\EncounterJournal\UI-EJ-BOSS-Lorgus Jett]], "Lorgus Jett"},
184 {[[Interface\EncounterJournal\UI-EJ-BOSS-Mage Lord Urom]], "Mage Lord Urom"},
185 {[[Interface\EncounterJournal\UI-EJ-BOSS-Magister Kalendris]], "Magister Kalendris"},
186 {[[Interface\EncounterJournal\UI-EJ-BOSS-Magistrate Barthilas]], "Magistrate Barthilas"},
187 {[[Interface\EncounterJournal\UI-EJ-BOSS-Maiden of Grief]], "Maiden of Grief"},
188 {[[Interface\EncounterJournal\UI-EJ-BOSS-Maleki the Pallid]], "Maleki the Pallid"},
189 {[[Interface\EncounterJournal\UI-EJ-BOSS-Nethermancer Sepethrea]], "Nethermancer Sepethrea"},
190 {[[Interface\EncounterJournal\UI-EJ-BOSS-Olaf]], "Olaf"},
191 {[[Interface\EncounterJournal\UI-EJ-BOSS-Pathaleon the Calculator]], "Pathaleon the Calculator"},
192 {[[Interface\EncounterJournal\UI-EJ-BOSS-Prince Tortheldrin]], "Prince Tortheldrin"},
193 {[[Interface\EncounterJournal\UI-EJ-BOSS-Princess Moira Bronzebeard]], "Princess Moira Bronzebeard"},
194 {[[Interface\EncounterJournal\UI-EJ-BOSS-QueenAzshara]], "Queen Azshara"},
195 {[[Interface\EncounterJournal\UI-EJ-BOSS-Randolph Moloch]], "Randolph Moloch"},
196 {[[Interface\EncounterJournal\UI-EJ-BOSS-Renataki]], "Renataki"},
197 {[[Interface\EncounterJournal\UI-EJ-BOSS-Ribbly Screwspigot]], "Ribbly Screwspigot"},
198 {[[Interface\EncounterJournal\UI-EJ-BOSS-Scarlet Commander Mograine]], "Scarlet Commander Mograine"},
199 {[[Interface\EncounterJournal\UI-EJ-BOSS-Selin Fireheart]], "Selin Fireheart"},
200 {[[Interface\EncounterJournal\UI-EJ-BOSS-Siegecrafter Blackfuse]], "Siegecrafter Blackfuse"},
201 {[[Interface\EncounterJournal\UI-EJ-BOSS-Skarvald the Constructor]], "Skarvald the Constructor"},
202 {[[Interface\EncounterJournal\UI-EJ-BOSS-Tribunal of the Ages]], "Tribunal of the Ages"},
203 {[[Interface\EncounterJournal\UI-EJ-BOSS-TyrandeWhisperwind]], "Tyrande Whisperwind"},
204 {[[Interface\EncounterJournal\UI-EJ-BOSS-Twilight Lord Kelris]], "Twilight Lord Kelris"},
205 {[[Interface\EncounterJournal\UI-EJ-BOSS-Vanessa VanCleef]], "Vanessa VanCleef"},
206 {[[Interface\EncounterJournal\UI-EJ-BOSS-Vazruden]], "Vazruden"},
207 {[[Interface\EncounterJournal\UI-EJ-BOSS-Warchief Rend Blackhand]], "Warchief Rend Blackhand"},
208 {[[Interface\EncounterJournal\UI-EJ-BOSS-Willey Hopebreaker]], "Willey Hopebreaker"},
209 {[[Interface\EncounterJournal\UI-EJ-BOSS-Witch Doctor Zumrah]], "Witch Doctor Zumrah"},
210 }
211------------------------------------------------------------------------------------------------------------------------------------------------------
212--> send and receive functions
213
214 function NickTag:OnReceiveComm (prefix, data, channel, source)
215
216 if (not source) then
217 return
218 end
219
220 local _type, serial, arg3, name, realm, version = select (2, NickTag:Deserialize (data))
221
222 --> 0x1: received a full persona
223 if (_type == CONST_COMM_FULLPERSONA) then
224 local receivedPersona = arg3
225 version = name
226
227 if (not receivedPersona or type (receivedPersona) ~= "table") then
228 NickTag:Msg ("FULLPERSONA received but it's invalid ", source)
229 return
230 end
231
232 if (source ~= UnitName ("player") and (version and version == minor) and receivedPersona) then
233
234 local storedPersona = NickTag:GetNicknameTable (source)
235 if (not storedPersona) then
236 storedPersona = NickTag:Create (source)
237 end
238
239 storedPersona [CONST_INDEX_REVISION] = receivedPersona [CONST_INDEX_REVISION]
240
241 --> we need to check if the received nickname fit in our rules.
242 local allowNickName = NickTag:CheckName (receivedPersona [CONST_INDEX_NICKNAME])
243 if (allowNickName) then
244 storedPersona [CONST_INDEX_NICKNAME] = receivedPersona [CONST_INDEX_NICKNAME]
245 else
246 storedPersona [CONST_INDEX_NICKNAME] = LibStub ("AceLocale-3.0"):GetLocale ("NickTag-1.0")["STRING_INVALID_NAME"]
247 end
248
249 storedPersona [CONST_INDEX_NICKNAME] = receivedPersona [CONST_INDEX_NICKNAME]
250
251 --> update the rest
252 --avatar path
253 storedPersona [CONST_INDEX_AVATAR_PATH] = type (receivedPersona [CONST_INDEX_AVATAR_PATH]) == "string" and receivedPersona [CONST_INDEX_AVATAR_PATH] or ""
254
255 --avatar texcoord
256 if (type (receivedPersona [CONST_INDEX_AVATAR_TEXCOORD]) == "boolean") then
257 storedPersona [CONST_INDEX_AVATAR_TEXCOORD] = {0, 1, 0, 1}
258
259 elseif (type (receivedPersona [CONST_INDEX_AVATAR_TEXCOORD]) == "table") then
260 storedPersona [CONST_INDEX_AVATAR_TEXCOORD] = storedPersona [CONST_INDEX_AVATAR_TEXCOORD] or {}
261 storedPersona [CONST_INDEX_AVATAR_TEXCOORD][1] = type (receivedPersona [CONST_INDEX_AVATAR_TEXCOORD][1]) == "number" and receivedPersona [CONST_INDEX_AVATAR_TEXCOORD][1] or 0
262 storedPersona [CONST_INDEX_AVATAR_TEXCOORD][2] = type (receivedPersona [CONST_INDEX_AVATAR_TEXCOORD][2]) == "number" and receivedPersona [CONST_INDEX_AVATAR_TEXCOORD][2] or 1
263 storedPersona [CONST_INDEX_AVATAR_TEXCOORD][3] = type (receivedPersona [CONST_INDEX_AVATAR_TEXCOORD][3]) == "number" and receivedPersona [CONST_INDEX_AVATAR_TEXCOORD][3] or 0
264 storedPersona [CONST_INDEX_AVATAR_TEXCOORD][4] = type (receivedPersona [CONST_INDEX_AVATAR_TEXCOORD][4]) == "number" and receivedPersona [CONST_INDEX_AVATAR_TEXCOORD][4] or 1
265 else
266 storedPersona [CONST_INDEX_AVATAR_TEXCOORD] = {0, 1, 0, 1}
267 end
268
269 --background texcoord
270 if (type (receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD]) == "boolean") then
271 storedPersona [CONST_INDEX_BACKGROUND_TEXCOORD] = {0, 1, 0, 1}
272
273 elseif (type (receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD]) == "table") then
274 storedPersona [CONST_INDEX_BACKGROUND_TEXCOORD] = storedPersona [CONST_INDEX_BACKGROUND_TEXCOORD] or {}
275 storedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][1] = type (receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][1]) == "number" and receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][1] or 0
276 storedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][2] = type (receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][2]) == "number" and receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][2] or 1
277 storedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][3] = type (receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][3]) == "number" and receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][3] or 0
278 storedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][4] = type (receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][4]) == "number" and receivedPersona [CONST_INDEX_BACKGROUND_TEXCOORD][4] or 1
279 else
280 storedPersona [CONST_INDEX_BACKGROUND_TEXCOORD] = {0, 1, 0, 1}
281 end
282
283 --background path
284 storedPersona [CONST_INDEX_BACKGROUND_PATH] = type (receivedPersona [CONST_INDEX_BACKGROUND_PATH]) == "string" and receivedPersona [CONST_INDEX_BACKGROUND_PATH] or ""
285
286 --background color
287 if (type (receivedPersona [CONST_INDEX_BACKGROUND_COLOR]) == "table") then
288 storedPersona [CONST_INDEX_BACKGROUND_COLOR] = storedPersona [CONST_INDEX_BACKGROUND_COLOR] or {}
289 storedPersona [CONST_INDEX_BACKGROUND_COLOR][1] = type (receivedPersona [CONST_INDEX_BACKGROUND_COLOR][1]) == "number" and receivedPersona [CONST_INDEX_BACKGROUND_COLOR][1] or 1
290 storedPersona [CONST_INDEX_BACKGROUND_COLOR][2] = type (receivedPersona [CONST_INDEX_BACKGROUND_COLOR][2]) == "number" and receivedPersona [CONST_INDEX_BACKGROUND_COLOR][2] or 1
291 storedPersona [CONST_INDEX_BACKGROUND_COLOR][3] = type (receivedPersona [CONST_INDEX_BACKGROUND_COLOR][3]) == "number" and receivedPersona [CONST_INDEX_BACKGROUND_COLOR][3] or 1
292 else
293 storedPersona [CONST_INDEX_BACKGROUND_COLOR] = {1, 1, 1}
294 end
295
296 NickTag:SyncSiblings()
297 NickTag:Msg ("FULLPERSONA received and updated for character: ", source, "new nickname: ", receivedPersona [CONST_INDEX_NICKNAME])
298 end
299
300 end
301
302 end
303
304 NickTag:RegisterComm ("NickTag", "OnReceiveComm")
305
306 --frame for listening to event
307 NickTag.EventFrame = NickTag.EventFrame or CreateFrame ("frame")
308 NickTag.EventFrame.InfoSendCooldown = 0
309
310 function NickTag.OnEvent (self, event, ...)
311 if (NickTag.EventFrame.InfoSendCooldown > time()) then
312 if (not NickTag.EventFrame.ScheduledSend or NickTag.EventFrame.ScheduledSend._cancelled) then
313 NickTag.EventFrame.ScheduledSend = C_Timer.NewTimer (30, NickTag.SendPersona)
314 end
315 else
316 NickTag:SendPersona()
317 end
318 end
319
320 --when the roster changes or the player enters the game, send the persona to guild mates
321 --send on roster update can only happen every 30 seconds, if is on cooldown, it'll schedule an update
322 NickTag.EventFrame:RegisterEvent ("GROUP_ROSTER_UPDATE")
323 NickTag.EventFrame:RegisterEvent ("PLAYER_LOGIN")
324
325 NickTag.EventFrame:SetScript ("OnEvent", NickTag.OnEvent)
326
327 --send the persona in the guild comm chanel
328 function NickTag:SendPersona()
329
330 --check if the player has a persona
331 local nickTable = NickTag:GetNicknameTable (UnitName ("player"), true)
332 if (not nickTable) then
333 return
334 end
335 NickTag:Msg ("SendPersona() -> broadcast")
336
337 if (NickTag.EventFrame.ScheduledSend and not NickTag.EventFrame.ScheduledSend._cancelled) then
338 NickTag.EventFrame.ScheduledSend:Cancel()
339 end
340 NickTag.EventFrame.ScheduledSend = nil
341 NickTag.EventFrame.InfoSendCooldown = time() + 29
342
343 --> updating my own persona
344 NickTag.send_scheduled = false
345
346 --> auto change nickname if we have an invalid nickname
347 if (NickTag:GetNickname (UnitName ("player")) == LibStub ("AceLocale-3.0"):GetLocale ("NickTag-1.0")["STRING_INVALID_NAME"]) then
348 nickTable [CONST_INDEX_NICKNAME] = UnitName ("player")
349 end
350
351 --> broadcast over guild channel
352 if (IsInGuild()) then
353 if (isMaster) then
354 NickTag:SyncSiblings()
355 end
356 NickTag:SendCommMessage ("NickTag", NickTag:Serialize (CONST_COMM_FULLPERSONA, 0, NickTag:GetNicknameTable (UnitName ("player")), minor), "GUILD")
357 end
358
359 end
360
361------------------------------------------------------------------------------------------------------------------------------------------------------
362--> cache stuff
363
364 --> this will clear the information about the player within nicktag cache
365 function NickTag:ResetPlayerPersona()
366 local playerName = UnitName ("player")
367
368 if (playerName) then
369 local playerPersona = NickTag:GetNicknameTable (playerName)
370 if (playerPersona) then
371 playerPersona [CONST_INDEX_NICKNAME] = playerName
372 playerPersona [CONST_INDEX_AVATAR_PATH] = false
373 playerPersona [CONST_INDEX_AVATAR_TEXCOORD] = false
374 playerPersona [CONST_INDEX_BACKGROUND_PATH] = false
375 playerPersona [CONST_INDEX_BACKGROUND_TEXCOORD] = false
376 playerPersona [CONST_INDEX_BACKGROUND_COLOR] = false
377 playerPersona [CONST_INDEX_REVISION] = playerPersona [CONST_INDEX_REVISION] + 1
378
379 C_Timer.After (1, NickTag.SendPersona)
380 end
381 end
382 end
383
384 --> reset cache
385 function NickTag:ResetCache()
386
387 local playerName = UnitName ("player")
388
389 if (playerName) then
390 local player = NickTag:GetNicknameTable (playerName)
391 if (player and pool.last_version == minor) then
392 for thisPlayerName, _ in pairs (pool) do
393 if (thisPlayerName ~= playerName) then
394 pool [thisPlayerName] = nil
395 end
396 end
397 --vardump (pool)
398 else
399 table.wipe (pool)
400 end
401
402 pool.nextreset = time() + (60*60*24*15) --> 15 days or 1296000 seconds
403 pool.last_version = minor
404 else
405 --> sometimes player guid isn't available right after logon, so, just schedule until it become available.
406 NickTag:ScheduleTimer ("ResetCache", 0.3)
407 end
408 end
409
410 --register a table where data can be saved
411 function NickTag:NickTagSetCache (_table)
412 if (not pool.default) then
413 --already have a place to save
414 --save the new table as sibling
415 --so all addons using nicktag can have the data synchronized
416 siblingsPools [#siblingsPools + 1] = _table
417
418 --copy all players into the sibling table
419 for key, value in pairs (pool) do
420 _table [key] = value
421 end
422
423 return
424 end
425
426 pool = _table
427 isMaster = true --> this instance of nicktag will save data
428
429 if (not pool.nextreset) then
430 pool.nextreset = time() + (60*60*24*15)
431 end
432 if (not pool.last_version) then
433 pool.last_version = minor
434 end
435 if (pool.last_version < minor) then
436 pool.nextreset = 1
437 end
438 if (time() > pool.nextreset) then
439 NickTag:ResetCache()
440 end
441 end
442
443 function NickTag:SyncSiblings()
444 --copy all data into siblings table
445 for _, syblingTable in ipairs (siblingsPools) do
446 for key, value in pairs (pool) do
447 syblingTable [key] = value
448 end
449 end
450 end
451
452------------------------------------------------------------------------------------------------------------------------------------------------------
453--> basic functions
454
455 --> trim from from http://lua-users.org/wiki/StringTrim
456 function trim (s)
457 local from = s:match"^%s*()"
458 return from > #s and "" or s:match(".*%S", from)
459 end
460 --
461 local titlecase = function (first, rest)
462 return first:upper()..rest:lower()
463 end
464 --
465 local have_repeated = false
466 local count_spaces = 0
467 local check_repeated = function (char)
468 if (char == " ") then
469 have_repeated = true
470 elseif (string.len (char) > 2) then
471 have_repeated = true
472 elseif (char == " ") then
473 count_spaces = count_spaces + 1
474 end
475 end
476
477
478 --> we need to keep game smooth checking and formating nicknames.
479 --> SetNickname and names comming from other player need to be check.
480 function NickTag:CheckName (name)
481
482 return true
483 end
484
485 --> set the "player" nickname and schedule for send updated persona
486 function NickTag:SetNickname (name)
487
488 --> check data before
489 assert (type (name) == "string", "NickTag 'SetNickname' expects a string on #1 argument.")
490
491 --> check if the nickname is okey to allowed to use.
492 local okey, errortype = NickTag:CheckName (name)
493 if (not okey) then
494 NickTag:Msg ("SetNickname() invalid name ", name)
495 return false, errortype
496 end
497
498 --> here we format the text to match titles, e.g converts name like "JASON NICKSHOW" into "Jason Nickshow".
499 name = name:gsub ("(%a)([%w_']*)", titlecase)
500
501 local playerName = UnitName ("player")
502
503 --> get the full nick table.
504 local nickTable = NickTag:GetNicknameTable (playerName)
505 if (not nickTable) then
506 nickTable = NickTag:Create (playerName, true)
507 end
508
509 --> change the nickname for the player nick table.
510 if (nickTable [CONST_INDEX_NICKNAME] ~= name) then
511 nickTable [CONST_INDEX_NICKNAME] = name
512
513 --increase the table revision
514 NickTag:IncRevision()
515
516 --> send the update for script which need it.
517 NickTag.callbacks:Fire ("NickTag_Update", CONST_INDEX_NICKNAME)
518
519 --> schedule a update for revision and broadcast full persona.
520 --> this is a kind of protection for scripts which call SetNickname, SetColor and SetAvatar one after other, so scheduling here avoid three revisions upgrades and 3 broadcasts to the guild.
521 if (not NickTag.send_scheduled) then
522 NickTag.send_scheduled = true
523 NickTag:ScheduleTimer ("SendPersona", 1)
524 end
525
526 else
527 NickTag:Msg ("SetNickname() name is the same on the pool ", name, nickTable [CONST_INDEX_NICKNAME])
528 end
529
530 return true
531 end
532
533 function NickTag:SetNicknameAvatar (texture, l, r, t, b)
534
535 if (l == nil) then
536 l, r, t, b = 0, 1, 0, 1
537 elseif (type (l) == "table") then
538 l, r, t, b = unpack (l)
539 end
540
541 --> check data before
542 assert (texture and l and r and t and b, "NickTag 'SetNicknameAvatar' bad format. Usage NickTag:SetAvatar (texturepath [, L, R, T, B] or texturepath [, {L, R, T, B}])")
543
544 local playerName = UnitName ("player")
545
546 local nickTable = NickTag:GetNicknameTable (playerName)
547 if (not nickTable) then
548 nickTable = NickTag:Create (playerName, true)
549 end
550
551 if (nickTable [CONST_INDEX_AVATAR_PATH] ~= texture) then
552 nickTable [CONST_INDEX_AVATAR_PATH] = texture
553
554 --increase the table revision
555 NickTag:IncRevision()
556
557 --> by default, CONST_INDEX_AVATAR_TEXCOORD comes as boolean false
558 if (type (nickTable [CONST_INDEX_AVATAR_TEXCOORD]) == "boolean") then
559 nickTable [CONST_INDEX_AVATAR_TEXCOORD] = {}
560 end
561
562 nickTable [CONST_INDEX_AVATAR_TEXCOORD][1] = l
563 nickTable [CONST_INDEX_AVATAR_TEXCOORD][2] = r
564 nickTable [CONST_INDEX_AVATAR_TEXCOORD][3] = t
565 nickTable [CONST_INDEX_AVATAR_TEXCOORD][4] = b
566
567 NickTag.callbacks:Fire ("NickTag_Update", CONST_INDEX_AVATAR_PATH)
568
569 if (not NickTag.send_scheduled) then
570 NickTag.send_scheduled = true
571 NickTag:ScheduleTimer ("SendPersona", 1)
572 end
573 end
574
575 return true
576 end
577
578 --> set the background
579 function NickTag:SetNicknameBackground (path, texcoord, color, silent)
580
581 if (not silent) then
582 assert (type (path) == "string", "NickTag 'SetNicknameBackground' expects a string on #1 argument.")
583 else
584 if (type (path) ~= "string") then
585 return
586 end
587 end
588
589 if (not texcoord) then
590 texcoord = {0, 1, 0, 1}
591 end
592
593 if (not color) then
594 color = {1, 1, 1}
595 end
596
597 local playerName = UnitName ("player")
598
599 local nickTable = NickTag:GetNicknameTable (playerName)
600 if (not nickTable) then
601 nickTable = NickTag:Create (playerName, true)
602 end
603
604 local need_sync = false
605 if (nickTable [CONST_INDEX_BACKGROUND_PATH] ~= path) then
606 nickTable [CONST_INDEX_BACKGROUND_PATH] = path
607 need_sync = true
608 end
609
610 if (nickTable [CONST_INDEX_BACKGROUND_TEXCOORD] ~= texcoord) then
611 nickTable [CONST_INDEX_BACKGROUND_TEXCOORD] = texcoord
612 need_sync = true
613 end
614
615 if (nickTable [CONST_INDEX_BACKGROUND_COLOR] ~= color) then
616 nickTable [CONST_INDEX_BACKGROUND_COLOR] = color
617 need_sync = true
618 end
619
620 if (need_sync) then
621
622 --increase the table revision
623 NickTag:IncRevision()
624
625 NickTag.callbacks:Fire ("NickTag_Update", CONST_INDEX_BACKGROUND_PATH)
626
627 if (not NickTag.send_scheduled) then
628 NickTag.send_scheduled = true
629 NickTag:ScheduleTimer ("SendPersona", 1)
630 end
631 end
632
633 return true
634 end
635
636 function NickTag:GetNickname (playerName, default, silent)
637 if (not silent) then
638 assert (type (playerName) == "string", "NickTag 'GetNickname' expects a string or string on #1 argument.")
639 end
640
641 local _table = pool [playerName]
642 if (not _table) then
643 return default or nil
644 end
645 return _table [CONST_INDEX_NICKNAME] or default or nil
646 end
647
648 --> return the avatar and the texcoord.
649 function NickTag:GetNicknameAvatar (playerName, default, silent)
650 if (not silent) then
651 assert (type (playerName) == "string", "NickTag 'GetNicknameAvatar' expects a string or string on #1 argument.")
652 end
653
654 local _table = pool [playerName]
655
656 if (not _table and default) then
657 return default, {0, 1, 0, 1}
658 elseif (not _table) then
659 return "", {0, 1, 0, 1}
660 end
661 return _table [CONST_INDEX_AVATAR_PATH] or default or "", _table [CONST_INDEX_AVATAR_TEXCOORD] or {0, 1, 0, 1}
662 end
663
664 function NickTag:GetNicknameBackground (playerName, default_path, default_texcoord, default_color, silent)
665 if (not silent) then
666 assert (type (playerName) == "string", "NickTag 'GetNicknameBackground' expects a string or string on #1 argument.")
667 end
668
669 local _table = pool [playerName]
670 if (not _table) then
671 return default_path, default_texcoord, default_color
672 end
673 return _table [CONST_INDEX_BACKGROUND_PATH] or default_path, _table [CONST_INDEX_BACKGROUND_TEXCOORD] or default_texcoord, _table [CONST_INDEX_BACKGROUND_COLOR] or default_color
674 end
675
676 --> get the full nicktag table
677 function NickTag:GetNicknameTable (playerName, silent)
678 --> check data before
679 if (not silent) then
680 assert (type (playerName) == "string", "NickTag 'GetNicknameTable' expects a string on #1 argument.")
681 else
682 if (not playerName or type (playerName) ~= "string") then
683 return
684 end
685 end
686
687 return pool [playerName]
688 end
689
690------------------------------------------------------------------------------------------------------------------------------------------------------
691--> internal functions
692
693 --> create a empty nick table for the player
694 function NickTag:Create (playerName, isSelf)
695 --> check data before
696 assert (type (playerName) == "string", "NickTag 'Create' expects a string on #1 argument.")
697
698 --> check if alredy exists
699 local alredyHave = pool [playerName]
700 if (alredyHave) then
701 return alredyHave
702 end
703
704 --> create the table:
705 local newTable = {
706 UnitName ("player"), --[1] player nickname
707 false, --[2] avatar texture path
708 false, --[3] avatar texture coord
709 false, --[4] background texture path
710 false, --[5] background texcoord
711 false, --[6] background color
712 1 --[7] revision
713 }
714
715 --> if not my persona, set revision to 0, this make always get update after creation
716 if (not isSelf) then
717 newTable [CONST_INDEX_REVISION] = 0
718 end
719
720 pool [playerName] = newTable
721 return newTable
722 end
723
724 --> inc the revision of the player persona after update nick or avatar
725 function NickTag:IncRevision()
726 local playerName = UnitName ("player")
727 local nickTable = NickTag:GetNicknameTable (playerName)
728 if (not nickTable) then
729 nickTable = NickTag:Create (playerName, true)
730 end
731
732 nickTable [CONST_INDEX_REVISION] = nickTable [CONST_INDEX_REVISION] + 1
733
734 return true
735 end
736
737 --> convert GUID into serial number (deprecated, it uses player name - realm name)
738 function NickTag:GetSerial (serial, silent)
739 return 0
740 end
741
742 --> choose avatar window
743do
744 local avatar_pick_frame = CreateFrame ("frame", "AvatarPickFrame", UIParent)
745 avatar_pick_frame:SetFrameStrata ("DIALOG")
746 avatar_pick_frame:SetBackdrop ({bgFile = [[Interface\FrameGeneral\UI-Background-Marble]], edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]], tile = true, tileSize = 256, edgeSize = 32, insets = {left = 11, right = 12, top = 12, bottom = 11}})
747 avatar_pick_frame:SetBackdropColor (.3, .3, .3, .9)
748 avatar_pick_frame:SetWidth (460)
749 avatar_pick_frame:SetHeight (240)
750
751 avatar_pick_frame.selected_avatar = 1
752 avatar_pick_frame.selected_background = 1
753 avatar_pick_frame.selected_color = {1, 1, 1}
754 avatar_pick_frame.selected_texcoord = {0, 1, 0, 1}
755
756 avatar_pick_frame:SetPoint ("center", UIParent, "center", 200, 0)
757 ---
758 local avatar_texture = avatar_pick_frame:CreateTexture ("AvatarPickFrameAvatarPreview", "overlay")
759 avatar_texture:SetPoint ("topleft", avatar_pick_frame, "topleft", 167, -10)
760 avatar_texture:SetTexture ([[Interface\EncounterJournal\UI-EJ-BOSS-Default]])
761 --
762 local background_texture = avatar_pick_frame:CreateTexture ("AvatarPickFrameBackgroundPreview", "artwork")
763 background_texture:SetPoint ("topleft", avatar_pick_frame, "topleft", 167, 2)
764 background_texture:SetWidth (290)
765 background_texture:SetHeight (75)
766 background_texture:SetTexture (NickTag.background_pool[1][1])
767 background_texture:SetTexCoord (unpack (NickTag.background_pool[1][3]))
768 --
769 local name = avatar_pick_frame:CreateFontString ("AvatarPickFrameName", "overlay", "GameFontHighlightHuge")
770 name:SetPoint ("left", avatar_texture, "right", -11, -17)
771 name:SetText (UnitName ("player"))
772 ---
773
774 local OnClickFunction = function (button)
775 if (button.isAvatar) then
776 local avatar = NickTag.avatar_pool [button.IconID]
777 _G.AvatarPickFrameAvatarPreview:SetTexture ( avatar [1] )
778 avatar_pick_frame.selected_avatar = avatar [1]
779 elseif (button.isBackground) then
780 local background = NickTag.background_pool [button.IconID]
781 _G.AvatarPickFrameBackgroundPreview:SetTexture ( background [1] )
782 _G.AvatarPickFrameBackgroundPreview:SetTexCoord (unpack (background [3]))
783 avatar_pick_frame.selected_background = background [1]
784 avatar_pick_frame.selected_texcoord = background [3]
785 end
786 end
787
788 local selectedColor = function()
789 local r, g, b = ColorPickerFrame:GetColorRGB()
790 background_texture:SetVertexColor (r, g, b)
791 avatar_pick_frame.selected_color[1] = r
792 avatar_pick_frame.selected_color[2] = g
793 avatar_pick_frame.selected_color[3] = b
794 end
795
796 local okey = CreateFrame ("button", "AvatarPickFrameAccept", avatar_pick_frame, "OptionsButtonTemplate")
797 okey:SetPoint ("bottomright", avatar_pick_frame, "bottomright", -37, 12)
798 okey:SetText ("Accept")
799 okey:SetFrameLevel (avatar_pick_frame:GetFrameLevel()+2)
800 okey:SetScript ("OnClick", function (self)
801 avatar_pick_frame:Hide()
802 if (avatar_pick_frame.callback) then
803 avatar_pick_frame.callback (avatar_pick_frame.selected_avatar, {0, 1, 0, 1}, avatar_pick_frame.selected_background, avatar_pick_frame.selected_texcoord, avatar_pick_frame.selected_color)
804 end
805 end)
806 local change_color = CreateFrame ("button", "AvatarPickFrameColor", avatar_pick_frame, "OptionsButtonTemplate")
807 change_color:SetPoint ("bottomright", avatar_pick_frame, "bottomright", -205, 12)
808 change_color:SetText ("Color")
809 change_color:SetFrameLevel (avatar_pick_frame:GetFrameLevel()+2)
810
811 change_color:SetScript ("OnClick", function (self)
812 ColorPickerFrame.func = selectedColor
813 ColorPickerFrame.hasOpacity = false
814 ColorPickerFrame:SetParent (avatar_pick_frame)
815 ColorPickerFrame:SetColorRGB (_G.AvatarPickFrameBackgroundPreview:GetVertexColor())
816 ColorPickerFrame:ClearAllPoints()
817 ColorPickerFrame:SetPoint ("left", avatar_pick_frame, "right", 0, -10)
818 ColorPickerFrame:Show()
819 end)
820
821 local buttons = {}
822 for i = 0, 2 do
823 local newbutton = CreateFrame ("button", "AvatarPickFrameAvatarScrollButton"..i+1, avatar_pick_frame)
824 newbutton:SetScript ("OnClick", OnClickFunction)
825 newbutton:SetWidth (128)
826 newbutton:SetHeight (64)
827 newbutton:SetPoint ("topleft", avatar_pick_frame, "topleft", 15, (i*70*-1) - 20)
828 newbutton:SetID (i+1)
829 newbutton.isAvatar = true
830 buttons [#buttons+1] = newbutton
831 end
832
833 local buttonsbg = {}
834 for i = 0, 2 do
835 local newbutton = CreateFrame ("button", "AvatarPickFrameBackgroundScrollButton"..i+1, avatar_pick_frame)
836 newbutton:SetScript ("OnClick", OnClickFunction)
837 newbutton:SetWidth (275)
838 newbutton:SetHeight (60)
839 newbutton:SetPoint ("topleft", avatar_pick_frame, "topleft", 157, (i*50*-1) - 80)
840 newbutton:SetID (i+1)
841 newbutton.isBackground = true
842 buttonsbg [#buttonsbg+1] = newbutton
843 end
844
845 local avatar_list = CreateFrame ("ScrollFrame", "AvatarPickFrameAvatarScroll", avatar_pick_frame, "ListScrollFrameTemplate")
846 avatar_list:SetPoint ("topleft", avatar_pick_frame, "topleft", 10, -10)
847 local background_list = CreateFrame ("ScrollFrame", "AvatarPickFrameBackgroundScroll", avatar_pick_frame, "ListScrollFrameTemplate")
848 background_list:SetPoint ("topleft", avatar_pick_frame, "topleft", 147, -85)
849
850 avatar_list:SetWidth (128)
851 avatar_list:SetHeight (220)
852 background_list:SetWidth (275)
853 background_list:SetHeight (140)
854
855 local avatar_scroll_update = function (self)
856 local numMacroIcons = #NickTag.avatar_pool
857 local macroPopupIcon, macroPopupButton, index, texture
858 local macroPopupOffset = FauxScrollFrame_GetOffset (avatar_list)
859
860 for i = 1, 3 do
861 macroPopupIcon = _G ["AvatarPickFrameAvatarScrollButton"..i]
862 macroPopupButton = _G ["AvatarPickFrameAvatarScrollButton"..i]
863 index = (macroPopupOffset * 1) + i
864
865 texture = NickTag.avatar_pool [index][1]
866 if ( index <= numMacroIcons and texture ) then
867 macroPopupButton:SetNormalTexture (texture)
868 macroPopupButton:SetPushedTexture (texture)
869 macroPopupButton:SetDisabledTexture (texture)
870 macroPopupButton:SetHighlightTexture (texture, "ADD")
871 macroPopupButton.IconID = index
872 macroPopupButton:Show()
873 else
874 macroPopupButton:Hide()
875 end
876 end
877 FauxScrollFrame_Update (avatar_list, numMacroIcons , 3, 64)
878 end
879 local background_scroll_update = function (self)
880 local numMacroIcons = #NickTag.background_pool
881 local macroPopupIcon, macroPopupButton, index, texture
882 local macroPopupOffset = FauxScrollFrame_GetOffset (background_list)
883
884 for i = 1, 3 do
885 macroPopupIcon = _G ["AvatarPickFrameBackgroundScrollButton"..i]
886 macroPopupButton = _G ["AvatarPickFrameBackgroundScrollButton"..i]
887 index = (macroPopupOffset * 1) + i
888
889 texture = NickTag.background_pool [index][1]
890 if ( index <= numMacroIcons and texture ) then
891 macroPopupButton:SetNormalTexture (texture)
892 macroPopupButton:SetPushedTexture (texture)
893 macroPopupButton:SetDisabledTexture (texture)
894 macroPopupButton:SetHighlightTexture (texture, "ADD")
895 macroPopupButton.IconID = index
896 macroPopupButton:Show()
897 else
898 macroPopupButton:Hide()
899 end
900 end
901 FauxScrollFrame_Update (background_list, numMacroIcons , 3, 40)
902 end
903
904 avatar_list:SetScript ("OnVerticalScroll", function (self, offset)
905 FauxScrollFrame_OnVerticalScroll (avatar_list, offset, 64, avatar_scroll_update)
906 end)
907 background_list:SetScript ("OnVerticalScroll", function (self, offset)
908 FauxScrollFrame_OnVerticalScroll (background_list, offset, 40, background_scroll_update)
909 end)
910
911 avatar_scroll_update (avatar_list)
912 background_scroll_update (background_list)
913
914 function avatar_pick_frame:SetAvatar (n)
915 if (type (n) ~= "number") then
916 n = 1
917 end
918 if (n > #NickTag.avatar_pool) then
919 n = 1
920 end
921 local avatar = NickTag.avatar_pool [n]
922 _G.AvatarPickFrameAvatarPreview:SetTexture ( avatar [1] )
923 avatar_pick_frame.selected_avatar = avatar [1]
924 end
925 function avatar_pick_frame:SetBackground (n)
926 if (type (n) ~= "number") then
927 n = 1
928 end
929 if (n > #NickTag.background_pool) then
930 n = 1
931 end
932 local background = NickTag.background_pool [n]
933 _G.AvatarPickFrameBackgroundPreview:SetTexture ( background [1] )
934 _G.AvatarPickFrameBackgroundPreview:SetTexCoord (unpack (background [3]))
935 _G.AvatarPickFrameBackgroundPreview:SetVertexColor (unpack (avatar_pick_frame.selected_color))
936 avatar_pick_frame.selected_background = background [1]
937 end
938 function avatar_pick_frame:SetColor (r, g, b)
939 if (type (r) ~= "number" or r > 1) then
940 r = 1
941 end
942 if (type (g) ~= "number" or g > 1) then
943 g = 1
944 end
945 if (type (b) ~= "number" or b > 1) then
946 b = 1
947 end
948 _G.AvatarPickFrameBackgroundPreview:SetVertexColor (r, g, b)
949 avatar_pick_frame.selected_color[1] = r
950 avatar_pick_frame.selected_color[2] = g
951 avatar_pick_frame.selected_color[3] = b
952 end
953
954 local CONST_INDEX_NICKNAME = 1
955 local CONST_INDEX_AVATAR_PATH = 2
956 local CONST_INDEX_AVATAR_TEXCOORD = 3
957 local CONST_INDEX_BACKGROUND_PATH = 4
958 local CONST_INDEX_BACKGROUND_TEXCOORD = 5
959 local CONST_INDEX_BACKGROUND_COLOR = 6
960
961 avatar_pick_frame:SetScript ("OnShow", function()
962 --get player avatar
963 local avatar = NickTag:GetNicknameTable (UnitGUID ("player"))
964 if (avatar) then
965 _G.AvatarPickFrameName:SetText ( avatar [1] or UnitName ("player"))
966
967 _G.AvatarPickFrameAvatarPreview:SetTexture ( avatar [CONST_INDEX_AVATAR_PATH] or [[Interface\EncounterJournal\UI-EJ-BOSS-Default]] )
968 avatar_pick_frame.selected_avatar = avatar [CONST_INDEX_AVATAR_PATH] or [[Interface\EncounterJournal\UI-EJ-BOSS-Default]]
969
970 _G.AvatarPickFrameAvatarPreview:SetTexCoord ( 0, 1, 0, 1 ) --> always
971
972 _G.AvatarPickFrameBackgroundPreview:SetTexture ( avatar [CONST_INDEX_BACKGROUND_PATH] or [[Interface\PetBattles\Weather-ArcaneStorm]] )
973 avatar_pick_frame.selected_background = avatar [CONST_INDEX_BACKGROUND_PATH] or [[Interface\PetBattles\Weather-ArcaneStorm]]
974
975 if (avatar [CONST_INDEX_BACKGROUND_TEXCOORD]) then
976 _G.AvatarPickFrameBackgroundPreview:SetTexCoord ( unpack (avatar [CONST_INDEX_BACKGROUND_TEXCOORD]) )
977 avatar_pick_frame.selected_texcoord = avatar [CONST_INDEX_BACKGROUND_TEXCOORD]
978 else
979 _G.AvatarPickFrameBackgroundPreview:SetTexCoord ( 0.129609375, 1, 1, 0 )
980 avatar_pick_frame.selected_texcoord = {0.129609375, 1, 1, 0}
981 end
982
983 if (avatar [CONST_INDEX_BACKGROUND_COLOR]) then
984 _G.AvatarPickFrameBackgroundPreview:SetVertexColor ( unpack (avatar [CONST_INDEX_BACKGROUND_COLOR]) )
985 avatar_pick_frame.selected_color = avatar [CONST_INDEX_BACKGROUND_COLOR]
986 else
987 _G.AvatarPickFrameBackgroundPreview:SetVertexColor ( 1, 1, 1 )
988 avatar_pick_frame.selected_color = {1, 1, 1}
989 end
990 else
991 --> if none
992 _G.AvatarPickFrameAvatarPreview:SetTexture ( [[Interface\EncounterJournal\UI-EJ-BOSS-Default]] )
993 avatar_pick_frame.selected_avatar = [[Interface\EncounterJournal\UI-EJ-BOSS-Default]]
994
995 local background = NickTag.background_pool [1]
996
997 if (background) then
998 _G.AvatarPickFrameBackgroundPreview:SetTexture ( background [1] )
999 avatar_pick_frame.selected_background = background [1]
1000 _G.AvatarPickFrameBackgroundPreview:SetTexCoord (unpack (background [3]))
1001 avatar_pick_frame.selected_texcoord = background [3]
1002 _G.AvatarPickFrameBackgroundPreview:SetVertexColor (unpack (avatar_pick_frame.selected_color))
1003 avatar_pick_frame.selected_color = avatar_pick_frame.selected_color
1004 end
1005
1006 end
1007 end)
1008
1009 avatar_pick_frame:Hide()
1010end