Mercurial > wow > pvpscan
diff PVPScan.lua @ 0:ce416064d8a1
first commit
| author | tercio |
|---|---|
| date | Sat, 17 May 2014 02:17:10 -0300 |
| parents | |
| children | 726745261b87 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PVPScan.lua Sat May 17 02:17:10 2014 -0300 @@ -0,0 +1,375 @@ + +PVPScan = LibStub ("AceAddon-3.0"):NewAddon ("PVPScan", "AceConsole-3.0", "AceEvent-3.0") + +local LDB = LibStub ("LibDataBroker-1.1", true) +local LDBIcon = LDB and LibStub ("LibDBIcon-1.0", true) +local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0") + +local _bit_band = bit.band + +local REACTION_HOSTILE = 0x00000040 +local OBJECT_TYPE_PLAYER = 0x00000400 + +PVPScan.SpotBars = {} +PVPScan.NeedClass = {} +PVPScan.NextSpotBar = 1 +PVPScan.CurrentShownIndex = {} +PVPScan.CurrentShownHash = {} +PVPScan.CurrentShownTime = {} + +local default_db = { + profile = { + SpotBarHeight = 20, + SpotBarAmount = 5, + SpotBarWidth = 150, + Locked = false, + SoundPlay = false, + SoundFile = "", + Minimap = {hide = false, radius = 160, minimapPos = 220}, + }, +} + +function PVPScan:OnEnable() +end + +function PVPScan:OnDisable() +end + +local OptionsTable = { + name = "PVPScan", + type = "group", + args = { + SpotBarHeight = { + type = "range", + name = "Bar Height", + desc = "Change the height of spot bars.", + min = 10, + max = 40, + step = 1, + get = function() return PVPScan.db.profile.SpotBarHeight end, + set = function (self, val) PVPScan.db.profile.SpotBarHeight = val; PVPScan:RefreshSpotBars() end, + order = 1, + }, + SpotBarWidth = { + type = "range", + name = "Bar Width", + desc = "Change the width of spot bars.", + min = 50, + max = 250, + step = 1, + get = function() return PVPScan.db.profile.SpotBarWidth end, + set = function (self, val) PVPScan.db.profile.SpotBarWidth = val; PVPScan:RefreshSpotBars() end, + order = 2, + }, + SpotBarAmount = { + type = "range", + name = "Bar Amount", + desc = "Change the amount of spot bars.", + min = 1, + max = 40, + step = 1, + get = function() return PVPScan.db.profile.SpotBarAmount end, + set = function (self, val) PVPScan.db.profile.SpotBarAmount = val; PVPScan:RefreshSpotBars() end, + order = 3, + }, + Locked = { + type = "toggle", + name = "Lock Frame", + desc = "Lock or unlock the SpotBars Frame.", + order = 4, + get = function() return PVPScan.db.profile.Locked end, + set = function (self, val) PVPScan.db.profile.Locked = not PVPScan.db.profile.Locked end, + }, + SoundPlay = { + type = "toggle", + name = "Play Sound", + desc = "Play a sound when a enemy is found.", + order = 5, + get = function() return PVPScan.db.profile.SoundPlay end, + set = function (self, val) PVPScan.db.profile.SoundPlay = not PVPScan.db.profile.SoundPlay end, + }, + SoundFile = { + type = "select", + name = "Sound File", + desc = "Choose the sound to play when a enemy is found.", + values = function() + local SoundTable = {} + for name, _ in pairs (SharedMedia:HashTable ("sound")) do + SoundTable [name] = name + end + return SoundTable + end, + get = function() return PVPScan.db.profile.SoundFile end, + set = function (self, file) PVPScan.db.profile.SoundFile = file end, + order = 6, + }, + Minimap = { + type = "toggle", + name = "Hide Minimap Icon", + desc = "Show or hide the minimap icon.", + order = 7, + get = function() return PVPScan.db.profile.Minimap.hide end, + set = function (self, val) + PVPScan.db.profile.Minimap.hide = not PVPScan.db.profile.Minimap.hide + LDBIcon:Refresh ("PVPScan", PVPScan.db.profile.Minimap) + if (PVPScan.db.profile.Minimap.hide) then + LDBIcon:Hide ("PVPScan") + else + LDBIcon:Show ("PVPScan") + end + end, + }, + }, +} + +function PVPScan:OnInitialize() + + --declarar primeiro o db usando a global que é declarada no toc. + self.db = LibStub ("AceDB-3.0"):New ("PVPScanDB", default_db, true) + + --declara agora as opções da tab raiz + LibStub("AceConfig-3.0"):RegisterOptionsTable ("PVPScan", OptionsTable) + PVPScan.OptionsFrame1 = LibStub ("AceConfigDialog-3.0"):AddToBlizOptions ("PVPScan", "PVPScan") + --sub tab + LibStub ("AceConfig-3.0"):RegisterOptionsTable ("PVPScan-Profiles", LibStub ("AceDBOptions-3.0"):GetOptionsTable (self.db)) + PVPScan.OptionsFrame2 = LibStub ("AceConfigDialog-3.0"):AddToBlizOptions ("PVPScan-Profiles", "Profiles", "PVPScan") + + if LDB then + local databroker = LDB:NewDataObject ("PVPScan", { + type = "launcher", + icon = [[Interface\PvPRankBadges\PvPRank15]], + --HotCornerIgnore = true, + OnClick = function (self, button) + InterfaceOptionsFrame_OpenToCategory ("PVPScan") + InterfaceOptionsFrame_OpenToCategory ("PVPScan") + end + }) + + if (databroker and not LDBIcon:IsRegistered ("PVPScan")) then + LDBIcon:Register ("PVPScan", databroker, PVPScan.db.profile.Minimap) + end + end + + PVPScan:RefreshSpotBars() + +end + +PVPScan:RegisterChatCommand ("pvpscan", function() + InterfaceOptionsFrame_OpenToCategory ("PVPScan") + InterfaceOptionsFrame_OpenToCategory ("PVPScan") +end) + +------------------------------------------------------------------------------------------------------------------------------------------------------------ +--> parser stuff + + local event_frame = CreateFrame ("frame", "PVPScanCombatLobReader", UIParent) + event_frame:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") + + function PVPScan:OnParserEvent (event, time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, ...) + + if (PVPScan.NeedClass [who_name]) then + local class = PVPScan:GuessClass (...) + if (class) then + PVPScan:UpdateBar (PVPScan.NeedClass [who_name], class, who_name) + PVPScan.NeedClass [who_name] = nil + end + return + end + + if (PVPScan.NeedClass [target_name]) then + local class = PVPScan:GuessClass (...) + if (class) then + PVPScan:UpdateBar (PVPScan.NeedClass [target_name], class, target_name) + PVPScan.NeedClass [target_name] = nil + end + return + end + + if (not PVPScan.CurrentShownHash [target_name] and _bit_band (target_flags, OBJECT_TYPE_PLAYER) ~= 0) then --> is player + if (_bit_band (target_flags, REACTION_HOSTILE ) ~= 0) then --> is hostile + local class = PVPScan:GuessClass (...) + PVPScan:EnemySpoted (target_name, target_serial, target_flags, class) + end + end + + if (not PVPScan.CurrentShownHash [who_name] and _bit_band (who_flags, OBJECT_TYPE_PLAYER) ~= 0) then --> is player + if (_bit_band (who_flags, REACTION_HOSTILE ) ~= 0) then --> is hostile + local class = PVPScan:GuessClass (...) + PVPScan:EnemySpoted (who_name, who_serial, who_flags, class) + end + end + end + + event_frame:SetScript ("OnEvent", PVPScan.OnParserEvent) + + function PVPScan:LeftCombatLockdown() + if (PVPScan.schedule_frame_update) then + PVPScan.schedule_frame_update = false + PVPScan:RefreshSpotBars() + end + end + function PVPScan:GotCombatLockdown() + end + + PVPScan:RegisterEvent ("PLAYER_REGEN_DISABLED", "GotCombatLockdown") + PVPScan:RegisterEvent ("PLAYER_REGEN_ENABLED", "LeftCombatLockdown") + + function PVPScan:EnemySpoted (name, serial, flags, class) + + --> check for overwrite + local current_player_shown = PVPScan.CurrentShownIndex [PVPScan.NextSpotBar] + if (current_player_shown) then + PVPScan.NeedClass [current_player_shown] = nil + end + + local SpotBar = PVPScan.SpotBars [PVPScan.NextSpotBar] + + if (class) then + PVPScan:UpdateBar (PVPScan.NextSpotBar, class, name) + else + PVPScan:UpdateBar (PVPScan.NextSpotBar, nil, name) + PVPScan.NeedClass [name] = PVPScan.NextSpotBar + end + + PVPScan.CurrentShownIndex [PVPScan.NextSpotBar] = name + PVPScan.CurrentShownHash [name] = PVPScan.NextSpotBar + PVPScan.CurrentShownTime [name] = GetTime() + + if (not UnitAffectingCombat ("player") and not InCombatLockdown()) then + SpotBar:SetAttribute("macrotext", "/cleartarget\n/targetexact " .. name) + end + + SpotBar:Show() + + PVPScan.NextSpotBar = PVPScan.NextSpotBar + 1 + if (PVPScan.NextSpotBar > PVPScan.db.profile.SpotBarAmount) then + PVPScan.NextSpotBar = 1 + end + + end + + + +------------------------------------------------------------------------------------------------------------------------------------------------------------ +--> frames + + function PVPScanOnFrameMouseDown (self) + if (not self.IsMoving) then + self:StartMoving() + self.IsMoving = true + end + end + + function PVPScanOnFrameMouseUp (self) + if (self.IsMoving) then + self:StopMovingOrSizing() + self.IsMoving = false + end + end + + function PVPScan:UpdateBar (index, class, name) + + local SpotBar = PVPScan.SpotBars [index] + + if (class) then + local color = RAID_CLASS_COLORS [class] + SpotBar.classtexture:SetVertexColor (color.r, color.g, color.b) + + local texcoord = CLASS_ICON_TCOORDS [class] + SpotBar.classicon:SetTexture ([[Interface\Glues\CHARACTERCREATE\UI-CHARACTERCREATE-CLASSES]]) + SpotBar.classicon:SetTexCoord (unpack (texcoord)) + else + SpotBar.classtexture:SetVertexColor (.7, .7, .7) + SpotBar.classicon:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) + SpotBar.classicon:SetTexCoord (0, 1, 0, 1) + end + + SpotBar.name:SetText (name) + + end + + function PVPScan:RefreshSpotBars() + + if (UnitAffectingCombat ("player") or InCombatLockdown()) then + PVPScan.schedule_frame_update = true + PVPScan:Print ("When the combat finishes, the frame will be updated.") + return + end + + local amount_bars = PVPScan.db.profile.SpotBarAmount + PVPScanFrame:SetSize (PVPScan.db.profile.SpotBarWidth, PVPScan.db.profile.SpotBarHeight) + + --> we need extra bars? + if (amount_bars > #PVPScan.SpotBars) then + for i = #PVPScan.SpotBars+1, amount_bars do + + local new_bar = CreateFrame ("Button", "PVPScanSpotBar" .. i, PVPScanFrame, "PVPScanSpotBarTemplate") + + local y = (i-1) * PVPScan.db.profile.SpotBarHeight * -1 + + new_bar:SetPoint ("topleft", PVPScanFrame, "topleft", 0, y) + new_bar:SetSize (PVPScan.db.profile.SpotBarWidth, PVPScan.db.profile.SpotBarHeight) + + tinsert (PVPScan.SpotBars, new_bar) + end + end + + if (#PVPScan.SpotBars > amount_bars) then + for i = #PVPScan.SpotBars, amount_bars+1, -1 do + PVPScan.SpotBars [i]:Hide() + local name = PVPScan.CurrentShownIndex [i] + if (name) then + tremove (PVPScan.CurrentShownIndex, i) + PVPScan.CurrentShownHash [name] = nil + PVPScan.CurrentShownTime [name] = nil + PVPScan.NeedClass [name] = nil + end + end + end + + --> refresh existing + for index, bar in ipairs (PVPScan.SpotBars) do + local y = (index-1) * PVPScan.db.profile.SpotBarHeight * -1 + bar:SetPoint ("topleft", PVPScanFrame, "topleft", 0, y) + bar:SetSize (PVPScan.db.profile.SpotBarWidth, PVPScan.db.profile.SpotBarHeight) + end + + end + + + + + +------------------------------------------------------------------------------------------------------------------------------------------------------------ +--> misc + + function PVPScan:GuessClass (...) + local arg1, arg2, arg3, arg4 = select (1, ...) + + if (type (arg1) == "number") then + if (PVPScan.ClassSpellList [arg1]) then + return PVPScan.ClassSpellList [arg1] + end + end + + if (type (arg3) == "number") then + if (PVPScan.ClassSpellList [arg3]) then + return PVPScan.ClassSpellList [arg3] + end + end + + if (type (arg2) == "number") then + if (PVPScan.ClassSpellList [arg3]) then + return PVPScan.ClassSpellList [arg3] + end + end + + if (type (arg4) == "number") then + if (PVPScan.ClassSpellList [arg4]) then + return PVPScan.ClassSpellList [arg4] + end + end + + return nil + end +
