Advertisement
Guest User

Sneak.lua

a guest
Aug 3rd, 2024
7,449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.63 KB | None | 0 0
  1. local addonName, EchoInternal = ...;
  2.  
  3. -- Mouse Frame
  4.  
  5. local mouseFrame = CreateFrame("Frame", "EchoInternalMouseFrame", UIParent);
  6. mouseFrame:SetWidth(1);
  7. mouseFrame:SetHeight(1);
  8.  
  9. mouseFrame:SetScript("OnUpdate",function ()
  10. local scale = 1 / UIParent:GetEffectiveScale();
  11. local x, y = GetCursorPosition();
  12. mouseFrame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", x * scale, y * scale);
  13. end)
  14.  
  15. -- Sneak
  16.  
  17. local ACE_COMM = LibStub("AceComm-3.0Multi")
  18. local ACE_SERIALIZER = LibStub("AceSerializer-3.0")
  19.  
  20. local PRIVATE_AURA_COMM_PREFIX = "PRIV_AURA_COMM"
  21. local MACRO_PREFIX = "MACRO_COMM"
  22.  
  23. local internal = {};
  24.  
  25. internal.debugMode = true
  26. internal.resetPeriod = 8
  27. internal.currentServerTimeMillis = 0
  28. internal.debounce = {}
  29. internal.processedAuraIds = {}
  30. internal.registeredAuraAnchors = {}
  31.  
  32.  
  33. -- Setup ---------------------------------------------------------------------------------------------------------------
  34.  
  35. function internal:Initialize()
  36. if not self.isInitialized then
  37. self:Log('Initializing...')
  38. self:InitServerTimeUpdater()
  39. self:FindAndHookTooltipFrame()
  40. ACE_COMM:RegisterComm(PRIVATE_AURA_COMM_PREFIX, function(...) self:ProcessCommMessage(...) end, true)
  41. ACE_COMM:RegisterComm(MACRO_PREFIX, function(...) self:ProcessMacroComm(...) end)
  42. self.isInitialized = true
  43. end
  44. end
  45.  
  46. function internal:InitServerTimeUpdater()
  47. local rolloverTimeMillis = 0
  48. local currentServerTime = GetServerTime()
  49. CreateFrame("Frame"):SetScript("OnUpdate", function()
  50. local currentMillis = GetTime() - math.floor(GetTime())
  51. if GetServerTime() ~= currentServerTime then
  52. currentServerTime = GetServerTime()
  53. rolloverTimeMillis = currentMillis
  54. end
  55. if currentMillis >= rolloverTimeMillis then
  56. self.currentServerTimeMillis = GetServerTime() + currentMillis - rolloverTimeMillis
  57. else
  58. self.currentServerTimeMillis = GetServerTime() + currentMillis - rolloverTimeMillis + 1
  59. end
  60. end)
  61. end
  62.  
  63. function internal:FindAndHookTooltipFrame()
  64. self:Log('Initializing frame finder...')
  65. self:InitializeAllPrivateAuraAnchors()
  66. CreateFrame("Frame"):SetScript("OnUpdate", function(tooltipFrameFinderFrame)
  67. if PrivateAurasTooltipTextLeft3 then
  68. tooltipFrameFinderFrame:SetScript("OnUpdate", nil)
  69. tooltipFrameFinderFrame:Hide()
  70. self:HookTooltipFrame()
  71. end
  72. end)
  73. end
  74.  
  75. function internal:HookTooltipFrame()
  76. self:Log('Hooking PrivateAurasTooltip...')
  77. local function processPrivateAuraInfo(PrivateAurasTooltipFrame, PrivateAuraFrame, ...)
  78. self:ProcessPrivateAuraInfo(PrivateAuraFrame)
  79. end
  80. hooksecurefunc(PrivateAurasTooltipTextLeft3:GetParent(), "SetOwner", processPrivateAuraInfo)
  81. self:InitializeAllPrivateAuraAnchors()
  82. end
  83.  
  84. -- Core ---------------------------------------------------------------------------------------------------------------
  85. function internal:ProcessCommMessage(_, serializedPacket, channel, sender)
  86. local status, privateAuraCommPacket = ACE_SERIALIZER:Deserialize(serializedPacket)
  87. if status and privateAuraCommPacket then
  88. self:ScanPrivateAuraCommPacket(privateAuraCommPacket)
  89. end
  90. end
  91.  
  92. function internal:ProcessMacroComm(_, macroNum, channel, sender)
  93. local num = tonumber(macroNum)
  94. local unit = Ambiguate(sender, "none")
  95. if num and unit then
  96. --self:Log("Received Macro Info", num, unit)
  97. WeakAuras.ScanEvents("ECHO_PRIVATE_AURA", num, unit)
  98. end
  99. end
  100.  
  101. function internal:IsAuraProcessed(privateAuraCommPacket)
  102. local auraInfo = privateAuraCommPacket.auraInfo
  103. local key = privateAuraCommPacket.destGUID.."-"..auraInfo.spellId;
  104.  
  105. local lockoutNext = self.processedAuraIds[key];
  106. if(not lockoutNext) then
  107. return false;
  108. end
  109.  
  110. return lockoutNext > GetTime();
  111. end
  112.  
  113. function internal:ScanPrivateAuraCommPacket(privateAuraCommPacket)
  114. if(not internal.spellToMacro[privateAuraCommPacket.auraInfo.spellId]) then
  115. return;
  116. end
  117.  
  118. local auraInfo = privateAuraCommPacket.auraInfo
  119. if not internal:IsAuraProcessed(privateAuraCommPacket) then
  120. auraInfo.unit = UnitTokenFromGUID(privateAuraCommPacket.destGUID)
  121. auraInfo.expirationTime = self:ConvertToLocalTime(privateAuraCommPacket.expirationTimeServer)
  122. self.processedAuraIds[privateAuraCommPacket.destGUID.."-"..auraInfo.spellId] = auraInfo.expirationTime == 0 and (GetTime() + internal.resetPeriod) or (GetTime() + (auraInfo.expirationTime - GetTime()));
  123. local unit = UnitExists(UnitName(auraInfo.unit)) and UnitName(auraInfo.unit) or auraInfo.unit
  124. --WeakAuras.ScanEvents("ECHO_PRIVATE_AURA", auraInfo)
  125. self:Log("Sending ScanEvents for", auraInfo.unit, auraInfo.spellId, unit);
  126. local delay = 0.5 + math.random()
  127. C_Timer.After(delay, function()
  128. WeakAuras.ScanEvents("ECHO_PRIVATE_AURA_AUTO", internal.spellToMacro[auraInfo.spellId] or auraInfo.spellId, unit, auraInfo)
  129. end)
  130.  
  131. --vdt:AddData(auraInfo)
  132. end
  133. end
  134.  
  135. function internal:ProcessPrivateAuraInfo(PrivateAuraFrame)
  136. --self:Log('Detected Aura on unit', PrivateAuraFrame.unit, 'at index', PrivateAuraFrame.anchorInfo.auraIndex)
  137. self:RemovePrivateAuraAnchor(PrivateAuraFrame.anchorInfo.anchorID)
  138. self:SendCommMessage({
  139. auraInfo = PrivateAuraFrame.auraInfo,
  140. destGUID = UnitGUID(PrivateAuraFrame.unit),
  141. expirationTimeServer = self:ConvertToServerTime(PrivateAuraFrame.auraInfo.expirationTime)
  142. })
  143.  
  144. if(self.debouceTimer and not self.debouceTimer:IsCancelled()) then
  145. --self:Log('Cancelling reset timer...')
  146. self.debouceTimer:Cancel()
  147. end
  148. self.debouceTimer = C_Timer.NewTicker(self.resetPeriod, function()
  149. --self:Log('Resetting...');
  150. self.debouceTimer = nil;
  151. table.wipe(internal.processedAuraIds);
  152. self:InitializeAllPrivateAuraAnchors()
  153. end,1);
  154. end
  155.  
  156. function internal:InitializeAllPrivateAuraAnchors()
  157. self:RemoveAllPrivateAuraAnchors()
  158. --self:Log("Adding all raid frame anchors...")
  159. for unitToken in EchoInternal:IterateGroupMembers() do
  160. for auraIndex = 1, 2 do
  161. local anchorId = C_UnitAuras.AddPrivateAuraAnchor({
  162. unitToken = unitToken,
  163. auraIndex = auraIndex,
  164. parent = mouseFrame,
  165. showCountdownFrame = false,
  166. showCountdownNumbers = false,
  167. iconInfo = {
  168. iconAnchor = {
  169. point = "CENTER",
  170. relativeTo = mouseFrame,
  171. relativePoint = "CENTER",
  172. offsetX = 0,
  173. offsetY = 0
  174. },
  175. iconWidth = 1,
  176. iconHeight = 1,
  177. }
  178. })
  179. table.insert(self.registeredAuraAnchors, anchorId);
  180. end
  181. end
  182. end
  183.  
  184. function internal:RemoveAllPrivateAuraAnchors()
  185. --self:Log("Removing all raid frame anchors...")
  186. for _, anchorId in ipairs(self.registeredAuraAnchors) do
  187. C_UnitAuras.RemovePrivateAuraAnchor(anchorId)
  188. end
  189. table.wipe(self.registeredAuraAnchors)
  190. end
  191.  
  192. function internal:RemovePrivateAuraAnchor(anchorId)
  193. --self:Log('Removing anchor', anchorId)
  194. C_UnitAuras.RemovePrivateAuraAnchor(anchorId)
  195. tDeleteItem(self.registeredAuraAnchors, anchorId)
  196. end
  197.  
  198. -- Util ----------------------------------------------------------------------------------------------------------------
  199. function internal:ConvertToServerTime(localTimeMillis)
  200. if(localTimeMillis == 0 or not localTimeMillis) then
  201. return 0;
  202. end
  203.  
  204. local localTimeDiff = localTimeMillis - GetTime()
  205. return self.currentServerTimeMillis + localTimeDiff
  206. end
  207.  
  208. function internal:ConvertToLocalTime(serverTimeMillis)
  209. if(serverTimeMillis == 0 or not serverTimeMillis) then
  210. return 0;
  211. end
  212.  
  213. local serverTimeDiff = serverTimeMillis - self.currentServerTimeMillis
  214. return GetTime() + serverTimeDiff
  215. end
  216.  
  217. function internal:Debounce(key, debounceTime)
  218. if self.debounce[key] and self.debounce[key] > GetTime() then
  219. return false
  220. end
  221. self.debounce[key] = GetTime() + debounceTime
  222. return true
  223. end
  224.  
  225. function internal:SendCommMessage(privateAuraCommPacket)
  226. local channel = IsInRaid() and "RAID" or "GUILD"
  227. local serializedPacket = ACE_SERIALIZER:Serialize(privateAuraCommPacket)
  228. ACE_COMM:SendCommMessage(PRIVATE_AURA_COMM_PREFIX, serializedPacket, channel, nil, "ALERT")
  229. end
  230.  
  231. function internal:SendMacroComm(num)
  232. local channel = IsInRaid() and "RAID" or "GUILD"
  233. ACE_COMM:SendCommMessage(MACRO_PREFIX, tostring(num), channel, nil, "ALERT")
  234. end
  235.  
  236. function internal:Log(...)
  237. if (self.debugMode) then
  238. --print("PRIVATE AURA:", ...)
  239. if (UnitIsGroupLeader("player")) then
  240. EchoInternal:RemoteLog("PRIVATE AURA AUTO", ...);
  241. end
  242. end
  243. end
  244.  
  245. function EchoInternal:InitPrivateAura()
  246. internal:Initialize();
  247. end
  248.  
  249. internal.spellToMacro = {
  250. [426370] = 1, -- Darkflame Cleave - Fyrakk
  251. [428970] = 1, -- Shadow Cage - Fyrakk
  252. [428988] = 2, -- MoltenEruption - Fyrakk
  253. [423601] = 2, -- Seed of Amirdrassil - Fyrakk
  254. [429903] = 1, -- Flamebound - Fyrakk
  255. [429906] = 2, -- Shadowbound - Fyrakk
  256. [426010] = 1, -- fixate - Smolderon
  257. [410317] = 2, -- Test 1
  258. [410326] = 1, -- Test 2
  259. }
  260.  
  261.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement