Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.66 KB | None | 0 0
  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.  
  7. local major, minor = "NickTag-1.0", 11
  8. local NickTag, oldminor = LibStub:NewLibrary (major, minor)
  9.  
  10. if (not NickTag) then
  11. return
  12. end
  13.  
  14. --> fix for old nicktag version
  15. if (_G.NickTag) then
  16. if (_G.NickTag.OnEvent) then
  17. _G.NickTag:UnregisterComm ("NickTag")
  18. _G.NickTag.OnEvent = nil
  19. end
  20. end
  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
  743. do
  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()
  1010. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement