Go to most recent revision | Compare with Previous | Blame | View Log
--[[ Addon: Taos Group Ultimate Author: TProg Taonnor Created by @Taonnor ]]-- --[[ Global variables ]]-- local LOG_ACTIVE = false local REFRESHRATE = 2000 -- ms; RegisterForUpdate is in miliseconds local ACTION_BAR_ULTIMATE_SLOT_INDEX = ACTION_BAR_ULTIMATE_SLOT_INDEX + 1 -- 8, the constant is 7, but its wrong local ABILITY_COEFFICIENT = 100 local ULTIMATE_COEFFICIENT = 1000 --[[ Class MapPingHandler ]]-- MapPingHandler = {} MapPingHandler.__index = MapPingHandler --[[ Class Members ]]-- MapPingHandler.Name = "TGU-MapPingHandler" MapPingHandler.IsMocked = false --[[ Called on map ping ]]-- function MapPingHandler.OnMapPing(eventCode, pingEventType, pingType, pingTag, offsetX, offsetY, isLocalPlayerOwner) if (LOG_ACTIVE) then logTrace("MapPingHandler.OnMapPing") logDebug("pingType: " .. tostring(pingType), "pingTag: " .. tostring(pingTag), "offsetX: " .. tostring(offsetX), "offsetY: " .. tostring(offsetY)) end if (pingType == MAP_PIN_TYPE_PING and MapPingHandler.IsPossiblePing(offsetX, offsetY)) then local abilityPing = MapPingHandler.GetAbilityPing(offsetX) local ultimateGroup = UltimateGroupHandler.GetUltimateGroupByAbilityPing(abilityPing) local relativeUltimate = MapPingHandler.GetRelativeUltimate(offsetY) if (ultimateGroup ~= nil and relativeUltimate ~= -1) then local player = {} local playerName = "" local isPlayerDead = false if (MapPingHandler.IsMocked == false) then playerName = GetUnitName(pingTag) isPlayerDead = IsUnitDead(pingTag) else playerName = pingTag isPlayerDead = math.random() > 0.8 end player.PingTag = pingTag player.GroupNumber = string.sub(pingTag, string.len("group") + 1) player.PlayerName = playerName player.IsPlayerDead = isPlayerDead player.UltimateGroup = ultimateGroup player.UltimateName = GetAbilityName(ultimateGroup.GroupAbilityId) player.UltimateIcon = GetAbilityIcon(ultimateGroup.GroupAbilityId) player.RelativeUltimate = relativeUltimate if (LOG_ACTIVE) then logDebug("player.PingTag: " .. tostring(player.PingTag), "player.GroupNumber: " .. tostring(player.GroupNumber), "player.PlayerName: " .. tostring(player.PlayerName), "player.IsPlayerDead: " .. tostring(player.IsPlayerDead), "player.UltimateGroup.GroupName: " .. tostring(player.UltimateGroup.GroupName), "player.UltimateName: " .. tostring(player.UltimateName), "player.UltimateIcon: " .. tostring(player.UltimateIcon), "player.RelativeUltimate: " .. tostring(player.RelativeUltimate)) end CALLBACK_MANAGER:FireCallbacks("TGU-MapPingChanged", player) else logError("MapPingHandler.OnMapPing, Ping invalid ultimateGroup: " .. tostring(ultimateGroup) .. "; relativeUltimate: " .. tostring(relativeUltimate)) end end end --[[ Called on refresh of timer ]]-- function MapPingHandler.OnTimedUpdate(eventCode) if (LOG_ACTIVE) then logTrace("MapPingHandler.OnTimedUpdate") end if (IsUnitGrouped("player") == false and MapPingHandler.IsMocked == false) then return end -- only if player is in group and system is not mocked local current, max, effective_max = GetUnitPower("player", POWERTYPE_ULTIMATE) local abilityGroup = UltimateGroupHandler.GetUltimateGroupByAbilityId(SettingsHandler.SavedVariables.StaticUltimateID) if (abilityGroup ~= nil) then local abilityCost = math.max(1, GetAbilityCost(abilityGroup.GroupAbilityId)) local relativeUltimate = math.floor((current / abilityCost) * 100) if (relativeUltimate > 100) then relativeUltimate = 100 end local abilityPing = abilityGroup.GroupAbilityPing / ABILITY_COEFFICIENT local ultimatePing = 0.0001 -- Zero, if you send "0", the map ping will be invalid if (relativeUltimate > 0) then ultimatePing = relativeUltimate / ULTIMATE_COEFFICIENT end if (LOG_ACTIVE) then logDebug("abilityGroup.GroupName: " .. tostring(abilityGroup.GroupName), "relativeUltimate: " .. tostring(relativeUltimate), "abilityPing: " .. tostring(abilityPing), "ultimatePing: " .. tostring(ultimatePing)) end if (MapPingHandler.IsMocked) then MapPingHandler.SendFakePings() else PingMap(MAP_PIN_TYPE_PING, MAP_TYPE_LOCATION_CENTERED, abilityPing, ultimatePing) end else logError("MapPingHandler.OnTimedUpdate, abilityGroup is nil, change ultimate. StaticID: " .. tostring(SettingsHandler.SavedVariables.StaticUltimateID)) end end --[[ Check if map ping is in possible range ]]-- function MapPingHandler.IsPossiblePing(offsetX, offsetY) if (LOG_ACTIVE) then logTrace("MapPingHandler.IsPossiblePing") logDebug("offsetX: " .. tostring(offsetX), "offsetY: " .. tostring(offsetY)) end local isValidPing = (offsetX ~= 0 or offsetY ~= 0) local isCorrectOffsetX = (offsetX >= 0.009 and offsetX <= 0.30) local isCorrectOffsetY = (offsetY >= 0.000 and offsetY <= 0.11) if (LOG_ACTIVE) then logDebug("isValidPing: " .. tostring(isValidPing), "isCorrectOffsetX: " .. tostring(isCorrectOffsetX), "isCorrectOffsetY: " .. tostring(isCorrectOffsetY)) end return isValidPing and (isCorrectOffsetX and isCorrectOffsetY) end --[[ Gets ability ID ]]-- function MapPingHandler.GetAbilityPing(offset) if (LOG_ACTIVE) then logTrace("MapPingHandler.GetAbilityPing") logDebug("offset: " .. tostring(offset)) end if (offset > 0) then local abilityPing = math.floor((offset * ABILITY_COEFFICIENT) + 0.5) if (abilityPing >= 1 and abilityPing <= 29) then return abilityPing else logError("offset is incorrect: " .. tostring(abilityPing) .. "; offset: " .. tostring(offset)) return -1 end else logError("offset is incorrect: " .. tostring(offset)) return -1 end end --[[ Gets relative ultimate ]]-- function MapPingHandler.GetRelativeUltimate(offset) if (LOG_ACTIVE) then logTrace("MapPingHandler.GetRelativeUltimate") logDebug("offset: " .. tostring(offset)) end if (offset >= 0) then local relativeUltimate = math.floor((offset * ULTIMATE_COEFFICIENT) + 0.5) if (relativeUltimate >= 0 and relativeUltimate <= 100) then return relativeUltimate else logError("relativeUltimate is incorrect: " .. tostring(relativeUltimate) .. "; offset: " .. tostring(offset)) return -1 end else logError("offset is incorrect: " .. tostring(offset)) return -1 end end --[[ Sends fake pings for all group members ]]-- function MapPingHandler.SendFakePings() if (LOG_ACTIVE) then logTrace("MapPingHandler.SendFakePings") end for i=1, 24, 1 do local eventCode = i local pingEventType = i local pingType = MAP_PIN_TYPE_PING local pingTag = "group" .. i local isLocalPlayerOwner = i == 1 local ultimateGroups = UltimateGroupHandler.GetUltimateGroups() local randomUltimateGroup = ultimateGroups[math.random(1, 29)] local offsetX = randomUltimateGroup.GroupAbilityPing / ABILITY_COEFFICIENT local offsetY = math.random(100) / ULTIMATE_COEFFICIENT MapPingHandler.OnMapPing(eventCode, pingEventType, pingType, pingTag, offsetX, offsetY, isLocalPlayerOwner) end end --[[ Initialize initializes MapPingHandler ]]-- function MapPingHandler.Initialize(isMocked) if (LOG_ACTIVE) then logTrace("MapPingHandler.Initialize") logDebug("isMocked: " .. tostring(isMocked)) end MapPingHandler.IsMocked = isMocked -- Register events EVENT_MANAGER:RegisterForEvent(MapPingHandler.Name, EVENT_MAP_PING, MapPingHandler.OnMapPing) -- Start timer EVENT_MANAGER:RegisterForUpdate(MapPingHandler.Name, REFRESHRATE, MapPingHandler.OnTimedUpdate) end