Repository: Shestak/ShestakUI Branch: master Commit: e364dad2932c Files: 414 Total size: 3.0 MB Directory structure: gitextract_25g93c_e/ ├── ShestakUI/ │ ├── Bindings.xml │ ├── Config/ │ │ ├── DataText.lua │ │ ├── Filters/ │ │ │ ├── Announcements.lua │ │ │ ├── ArenaControl.lua │ │ │ ├── AutoButton.lua │ │ │ ├── BadBuffs.lua │ │ │ ├── ChannelingTicks.lua │ │ │ ├── ChatSpam.lua │ │ │ ├── CombatText.lua │ │ │ ├── Cooldowns.lua │ │ │ ├── Diminishing.lua │ │ │ ├── Errors.lua │ │ │ ├── FilgerSpells.lua │ │ │ ├── Nameplates.lua │ │ │ ├── OpenItems.lua │ │ │ ├── RaidAuraWatch.lua │ │ │ └── Reminders.lua │ │ ├── Fonts.lua │ │ ├── Positions.lua │ │ ├── Profiles.lua │ │ └── Settings.lua │ ├── Core/ │ │ ├── API.lua │ │ ├── CheckVersion.lua │ │ ├── Commands.lua │ │ ├── Constants.lua │ │ ├── Disable.lua │ │ ├── Functions.lua │ │ ├── GUI.lua │ │ ├── Init.lua │ │ ├── Kill.lua │ │ ├── Launch.lua │ │ ├── Movers.lua │ │ ├── Panels.lua │ │ ├── PixelPerfect.lua │ │ ├── Temp.lua │ │ └── WTF.lua │ ├── Libs/ │ │ ├── LitePanels/ │ │ │ ├── Layout.lua │ │ │ └── LitePanels.lua │ │ ├── LiteStats/ │ │ │ └── LiteStats.lua │ │ ├── oGlow/ │ │ │ ├── Displays/ │ │ │ │ └── Border.lua │ │ │ ├── Filters/ │ │ │ │ └── Quality.lua │ │ │ ├── Pipes/ │ │ │ │ ├── Bags.lua │ │ │ │ ├── Bank.lua │ │ │ │ ├── Char.lua │ │ │ │ ├── CharFlyout.lua │ │ │ │ ├── GBank.lua │ │ │ │ ├── Inspect.lua │ │ │ │ ├── Loot.lua │ │ │ │ ├── Mail.lua │ │ │ │ ├── Merchant.lua │ │ │ │ ├── Trade.lua │ │ │ │ ├── TradeSkill.lua │ │ │ │ └── VoidStorage.lua │ │ │ ├── oGlow.lua │ │ │ └── oGlow.xml │ │ └── oUF/ │ │ ├── Blizzard.lua │ │ ├── Colors.lua │ │ ├── CombatEvents.lua │ │ ├── Elements/ │ │ │ ├── AlternativePower.lua │ │ │ ├── AssistantIndicator.lua │ │ │ ├── Auras.lua │ │ │ ├── CastBar.lua │ │ │ ├── CombatIndicator.lua │ │ │ ├── GroupRoleIndicator.lua │ │ │ ├── HealPrediction.lua │ │ │ ├── Health.lua │ │ │ ├── LeaderIndicator.lua │ │ │ ├── PhaseIndicator.lua │ │ │ ├── Portraits.lua │ │ │ ├── Power.lua │ │ │ ├── PowerPrediction.lua │ │ │ ├── QuestIndicator.lua │ │ │ ├── RaidTargetIndicator.lua │ │ │ ├── Range.lua │ │ │ ├── ReadyCheckIndicator.lua │ │ │ ├── RestingIndicator.lua │ │ │ ├── ResurrectIndicator.lua │ │ │ ├── Runes.lua │ │ │ ├── Stagger.lua │ │ │ ├── SummonIndicator.lua │ │ │ ├── Tags.lua │ │ │ └── ThreatIndicator.lua │ │ ├── Events.lua │ │ ├── Factory.lua │ │ ├── Finalize.lua │ │ ├── Init.lua │ │ ├── Modules/ │ │ │ ├── ArcaneCharge.lua │ │ │ ├── AuraTracker.lua │ │ │ ├── AuraWatch.lua │ │ │ ├── AutoResurrect.lua │ │ │ ├── CombatFeedback.lua │ │ │ ├── ComboPoints.lua │ │ │ ├── CounterBar.lua │ │ │ ├── DebuffHighlight.lua │ │ │ ├── EnemySpec.lua │ │ │ ├── Essence.lua │ │ │ ├── Experience.lua │ │ │ ├── FactionIcon.lua │ │ │ ├── Fader.lua │ │ │ ├── GCD.lua │ │ │ ├── HarmonyOrbs.lua │ │ │ ├── HolyPower.lua │ │ │ ├── QuestIcon.lua │ │ │ ├── RaidDebuffs.lua │ │ │ ├── Reputation.lua │ │ │ ├── Smooth.lua │ │ │ ├── SoulShards.lua │ │ │ ├── Swing.lua │ │ │ ├── TotemBar.lua │ │ │ └── Trinkets.lua │ │ ├── Private.lua │ │ ├── Units.lua │ │ ├── oUF.lua │ │ └── oUF.xml │ ├── Licenses/ │ │ ├── ElvUI │ │ ├── ShestakUI │ │ ├── TukUI │ │ └── oUF │ ├── Locales/ │ │ ├── Chinese.lua │ │ ├── English.lua │ │ ├── French.lua │ │ ├── German.lua │ │ ├── Italian.lua │ │ ├── Russian.lua │ │ ├── Spanish.lua │ │ └── Taiwan.lua │ ├── Media/ │ │ ├── Sounds/ │ │ │ ├── Proc.ogg │ │ │ ├── Warning.ogg │ │ │ └── Whisper.ogg │ │ └── Textures/ │ │ ├── Blank.tga │ │ ├── Cross.tga │ │ ├── Damager.tga │ │ ├── Glow.tga │ │ ├── Healer.tga │ │ ├── Highlight.tga │ │ ├── Invisible.tga │ │ ├── Mail.tga │ │ ├── Tank.tga │ │ ├── Texture.tga │ │ └── White.tga │ ├── Modules/ │ │ ├── ActionBars/ │ │ │ ├── Bar1.lua │ │ │ ├── Bar2.lua │ │ │ ├── Bar3.lua │ │ │ ├── Bar4.lua │ │ │ ├── Bar5.lua │ │ │ ├── Bar6.lua │ │ │ ├── Bar7.lua │ │ │ ├── Bar8.lua │ │ │ ├── BarPet.lua │ │ │ ├── BarStance.lua │ │ │ ├── Bindings.lua │ │ │ ├── Cooldowns.lua │ │ │ ├── Core.lua │ │ │ ├── ExtraBar.lua │ │ │ ├── MicroMenu.lua │ │ │ ├── Range.lua │ │ │ ├── Style.lua │ │ │ ├── Toggle.lua │ │ │ └── VehicleExit.lua │ │ ├── Announcements/ │ │ │ ├── BadGear.lua │ │ │ ├── Drinking.lua │ │ │ ├── FeastsAndPortals.lua │ │ │ ├── FlaskAndFood.lua │ │ │ ├── Interrupts.lua │ │ │ ├── PullCountdown.lua │ │ │ ├── SafariHat.lua │ │ │ └── Spells.lua │ │ ├── Auras/ │ │ │ ├── AuraSource.lua │ │ │ ├── BuffFrame.lua │ │ │ ├── Filger.lua │ │ │ ├── RaidBuffsReminder.lua │ │ │ └── SelfBuffsReminder.lua │ │ ├── Automation/ │ │ │ ├── AutoInvite.lua │ │ │ ├── AutoOpens.lua │ │ │ ├── AutoRelease.lua │ │ │ ├── BuffOnScroll.lua │ │ │ ├── CancelBadBuffs.lua │ │ │ ├── DeclineDuel.lua │ │ │ ├── LoggingCombat.lua │ │ │ ├── Resurrection.lua │ │ │ ├── Screenshots.lua │ │ │ ├── SetRole.lua │ │ │ ├── SkipCinematic.lua │ │ │ ├── SolveArtifact.lua │ │ │ ├── Summon.lua │ │ │ └── TabBinder.lua │ │ ├── Blizzard/ │ │ │ ├── AlertFrames.lua │ │ │ ├── AltPowerBar.lua │ │ │ ├── Bags.lua │ │ │ ├── ClassColorNames.lua │ │ │ ├── ColorPicker.lua │ │ │ ├── CombatText.lua │ │ │ ├── Durability.lua │ │ │ ├── Errors.lua │ │ │ ├── Fixes.lua │ │ │ ├── Fonts.lua │ │ │ ├── LibShowUIPanel.lua │ │ │ ├── Mail.lua │ │ │ ├── MirrorBars.lua │ │ │ ├── MoveBlizzFrames.lua │ │ │ ├── PetBattle.lua │ │ │ ├── TaintLess.xml │ │ │ ├── TalkingHead.lua │ │ │ ├── TimerTracker.lua │ │ │ ├── UIWidget.lua │ │ │ └── Vehicle.lua │ │ ├── Chat/ │ │ │ ├── ChatBars.lua │ │ │ ├── ChatBind.lua │ │ │ ├── ChatFrames.lua │ │ │ ├── ChatTabs.lua │ │ │ ├── CopyChat.lua │ │ │ ├── CopyUrl.lua │ │ │ ├── FadeCombat.lua │ │ │ ├── Filters.lua │ │ │ ├── History.lua │ │ │ ├── Invite.lua │ │ │ ├── MouseScroll.lua │ │ │ ├── RealLinks.lua │ │ │ ├── Sounds.lua │ │ │ ├── SpamageMeters.lua │ │ │ └── TellTarget.lua │ │ ├── Cooldowns/ │ │ │ ├── DiminishingCD.lua │ │ │ ├── EnemyCD.lua │ │ │ ├── PulseCD.lua │ │ │ └── RaidCD.lua │ │ ├── Loot/ │ │ │ ├── AutoConfirm.lua │ │ │ ├── AutoGreed.lua │ │ │ ├── FasterLoot.lua │ │ │ ├── GroupLoot.lua │ │ │ ├── Loot.lua │ │ │ └── MasterLoot.lua │ │ ├── Maps/ │ │ │ ├── BattlefieldMap.lua │ │ │ ├── ButtonCollect.lua │ │ │ ├── FogOfWar.lua │ │ │ ├── MiniMap.lua │ │ │ ├── MiniMapButtons.lua │ │ │ ├── ToggleMenu.lua │ │ │ └── WorldMap.lua │ │ ├── Misc/ │ │ │ ├── BattlefieldScore.lua │ │ │ ├── CharsCurrency.lua │ │ │ ├── ClickCast.lua │ │ │ ├── LFGQueueTimer.lua │ │ │ ├── MagePortals.lua │ │ │ ├── Marking.lua │ │ │ ├── Misc.lua │ │ │ ├── Mounts.lua │ │ │ ├── PvPQueueTimer.lua │ │ │ ├── RaidUtility.lua │ │ │ ├── SlotItemLevel.lua │ │ │ └── Threat.lua │ │ ├── Quests/ │ │ │ ├── AutoAccept.lua │ │ │ ├── AutoButton.lua │ │ │ ├── ObjectiveTracker.lua │ │ │ └── WowheadLink.lua │ │ ├── Skins/ │ │ │ ├── Ace3.lua │ │ │ ├── AtlasLoot.lua │ │ │ ├── Aurora.lua │ │ │ ├── BigWigs.lua │ │ │ ├── Blizzard/ │ │ │ │ ├── Achievement.lua │ │ │ │ ├── AddonList.lua │ │ │ │ ├── AdventureMap.lua │ │ │ │ ├── AlertFrames.lua │ │ │ │ ├── AlliedRaces.lua │ │ │ │ ├── AnimaDiversion.lua │ │ │ │ ├── Archeology.lua │ │ │ │ ├── Artifact.lua │ │ │ │ ├── Auction.lua │ │ │ │ ├── Azerite.lua │ │ │ │ ├── AzeriteEssence.lua │ │ │ │ ├── AzeriteRespec.lua │ │ │ │ ├── BarberShop.lua │ │ │ │ ├── Binding.lua │ │ │ │ ├── BlackMarket.lua │ │ │ │ ├── BonusRoll.lua │ │ │ │ ├── Bubbles.lua │ │ │ │ ├── Calendar.lua │ │ │ │ ├── Channels.lua │ │ │ │ ├── Character.lua │ │ │ │ ├── ChatConfig.lua │ │ │ │ ├── ChromieTime.lua │ │ │ │ ├── Collections.lua │ │ │ │ ├── Communities.lua │ │ │ │ ├── Container.lua │ │ │ │ ├── Contribution.lua │ │ │ │ ├── CovenantPreview.lua │ │ │ │ ├── CovenantRenown.lua │ │ │ │ ├── CovenantSanctum.lua │ │ │ │ ├── DeathRecap.lua │ │ │ │ ├── DebugTools.lua │ │ │ │ ├── DressUp.lua │ │ │ │ ├── EditorManager.lua │ │ │ │ ├── EncounterJournal.lua │ │ │ │ ├── EventTrace.lua │ │ │ │ ├── ExpansionLandingPage.lua │ │ │ │ ├── FlightMap.lua │ │ │ │ ├── Friends.lua │ │ │ │ ├── Garrison.lua │ │ │ │ ├── GenericTrait.lua │ │ │ │ ├── Gossip.lua │ │ │ │ ├── Guide.lua │ │ │ │ ├── GuildBank.lua │ │ │ │ ├── GuildControl.lua │ │ │ │ ├── GuildRegistrar.lua │ │ │ │ ├── Help.lua │ │ │ │ ├── Inspect.lua │ │ │ │ ├── Islands.lua │ │ │ │ ├── ItemInteraction.lua │ │ │ │ ├── ItemSocketing.lua │ │ │ │ ├── ItemText.lua │ │ │ │ ├── ItemUpgrade.lua │ │ │ │ ├── LoadFrames.xml │ │ │ │ ├── Loot.lua │ │ │ │ ├── LossOfControl.lua │ │ │ │ ├── Macro.lua │ │ │ │ ├── Mail.lua │ │ │ │ ├── MajorFaction.lua │ │ │ │ ├── Merchant.lua │ │ │ │ ├── Options.lua │ │ │ │ ├── OrderHall.lua │ │ │ │ ├── Others.lua │ │ │ │ ├── PartyPoseUI.lua │ │ │ │ ├── PetStable.lua │ │ │ │ ├── Petition.lua │ │ │ │ ├── PlayerChoice.lua │ │ │ │ ├── Professions.lua │ │ │ │ ├── ProfessionsOrders.lua │ │ │ │ ├── PvE.lua │ │ │ │ ├── PvP.lua │ │ │ │ ├── PvPMatch.lua │ │ │ │ ├── Quest.lua │ │ │ │ ├── QuickKeybind.lua │ │ │ │ ├── Raid.lua │ │ │ │ ├── RaidInfo.lua │ │ │ │ ├── Runeforge.lua │ │ │ │ ├── Scrapping.lua │ │ │ │ ├── Soulbinds.lua │ │ │ │ ├── SpellBook.lua │ │ │ │ ├── Subscription.lua │ │ │ │ ├── Tabard.lua │ │ │ │ ├── Talent.lua │ │ │ │ ├── TalkingHead.lua │ │ │ │ ├── Taxi.lua │ │ │ │ ├── TimeManager.lua │ │ │ │ ├── TorghastLevelPicker.lua │ │ │ │ ├── Trade.lua │ │ │ │ ├── Trainer.lua │ │ │ │ ├── Tutorial.lua │ │ │ │ ├── VoidStorage.lua │ │ │ │ ├── WeeklyRewards.lua │ │ │ │ └── WorldMap.lua │ │ │ ├── BloodShieldTracker.lua │ │ │ ├── Capping.lua │ │ │ ├── Clique.lua │ │ │ ├── CoolLine.lua │ │ │ ├── DBM.lua │ │ │ ├── Details.lua │ │ │ ├── Dominos.lua │ │ │ ├── FlyoutButtonCustom.lua │ │ │ ├── MageNuggets.lua │ │ │ ├── MyRolePlay.lua │ │ │ ├── NPCScan.lua │ │ │ ├── NugRunning.lua │ │ │ ├── OPie.lua │ │ │ ├── Omen.lua │ │ │ ├── Ovale.lua │ │ │ ├── Postal.lua │ │ │ ├── Recount.lua │ │ │ ├── Rematch.lua │ │ │ ├── Skada.lua │ │ │ ├── TinyDPS.lua │ │ │ ├── VanasKoS.lua │ │ │ ├── WeakAuras.lua │ │ │ └── lsToasts.lua │ │ ├── Tooltip/ │ │ │ ├── Achievement.lua │ │ │ ├── HyperLink.lua │ │ │ ├── InstanceLockCompare.lua │ │ │ ├── ItemCount.lua │ │ │ ├── ItemIcons.lua │ │ │ ├── ItemLevel.lua │ │ │ ├── MountSource.lua │ │ │ ├── MultiItemRef.lua │ │ │ ├── RuFix.lua │ │ │ ├── SpellID.lua │ │ │ ├── Talents.lua │ │ │ ├── Tooltip.lua │ │ │ └── UnitRole.lua │ │ ├── Trade/ │ │ │ ├── AlreadyKnown.lua │ │ │ ├── Archaeology.lua │ │ │ ├── Merchant.lua │ │ │ ├── OneClickDisenchanting.lua │ │ │ ├── OneClickEnchantScroll.lua │ │ │ ├── ProfessionTabs.lua │ │ │ ├── SumAucBuyouts.lua │ │ │ └── TrainAll.lua │ │ └── UnitFrames/ │ │ ├── Colors.lua │ │ ├── Functions.lua │ │ ├── Layout.lua │ │ ├── Nameplates.lua │ │ ├── RaidDPS.lua │ │ ├── RaidHeal.lua │ │ └── Tags.lua │ ├── ShestakUI.toc │ └── ShestakUI.xml └── ShestakUI_Config/ ├── Core.lua ├── Locales/ │ ├── Chinese.lua │ ├── English.lua │ ├── French.lua │ ├── German.lua │ ├── Italian.lua │ ├── Russian.lua │ ├── Spanish.lua │ └── Taiwan.lua ├── Options.lua └── ShestakUI_Config.toc ================================================ FILE CONTENTS ================================================ ================================================ FILE: ShestakUI/Bindings.xml ================================================  ChatKey_Chat("/rw") ChatKey_Chat("/ra") ChatKey_Chat("/g") ChatKey_Chat("/p") ChatKey_Chat("/i") ChatKey_Chat("/tt ") ChatKey_Chat("/s") if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 1) else SetRaidTargetIcon("target", 1) end if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 2) else SetRaidTargetIcon("target", 2) end if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 3) else SetRaidTargetIcon("target", 3) end if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 4) else SetRaidTargetIcon("target", 4) end if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 5) else SetRaidTargetIcon("target", 5) end if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 6) else SetRaidTargetIcon("target", 6) end if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 7) else SetRaidTargetIcon("target", 7) end if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 8) else SetRaidTargetIcon("target", 8) end if UnitExists("mouseover") then SetRaidTargetIcon("mouseover", 0) else SetRaidTargetIcon("target", 0) end ================================================ FILE: ShestakUI/Config/DataText.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- LiteStats configuration file -- BACKUP THIS FILE BEFORE UPDATING! ---------------------------------------------------------------------------------------- local cBN = IsAddOnLoaded("cargBags_Nivaya") local function class(string) return format("|cff%02x%02x%02x%s|r", C.media.classborder_color[1] * 255, C.media.classborder_color[2] * 255, C.media.classborder_color[3] * 255, string or "") end LPSTAT_FONT = { font = C.font.stats_font, -- Path to your font color = {1, 1, 1}, -- {red, green, blue} or "CLASS" size = C.font.stats_font_size, -- Point font size alpha = 1, -- Alpha transparency outline = 3, -- Thin outline. 0 = no outline. shadow = {alpha = C.font.stats_font_shadow and 1 or 0, x = 1, y = -1}, -- Font shadow = 1 } LTIPICONSIZE = 14 -- Icon sizes in info tips LPSTAT_CONFIG = { -- Bottomleft block Clock = { enabled = C.stats.clock, -- Local time and the 24 hour clock can be enabled in-game via time manager (right-click) AM = class"A", PM = class"P", colon = class":", -- These values apply to the displayed clock anchor_frame = "UIParent", anchor_to = "left", anchor_from = "bottomleft", x_off = 20, y_off = 11, tip_frame = "UIParent", tip_anchor = "BOTTOMLEFT", tip_x = 21, tip_y = 20 }, Latency = { enabled = C.stats.latency, fmt = "[color]%d|r"..class"ms", -- "77ms", [color] inserts latency color code anchor_frame = "Clock", anchor_to = "left", anchor_from = "right", x_off = C.stats.clock and 3 or 0, y_off = 0, tip_frame = "UIParent", tip_anchor = "BOTTOMLEFT", tip_x = 21, tip_y = 20 }, FPS = { enabled = C.stats.fps, fmt = "%d"..class"fps", -- "42fps" max_addons = nil, -- Holding Alt reveals hidden addons anchor_frame = C.stats.latency and "Latency" or "Clock", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, tip_frame = "UIParent", tip_anchor = "BOTTOMLEFT", tip_x = 21, tip_y = 20 }, Friends = { enabled = C.stats.friend, fmt = "%d/%d"..class"f", -- "3/40F" maxfriends = nil, -- Set max friends listed, nil means no limit anchor_frame = C.stats.fps and "FPS" or C.stats.latency and "Latency" or "Clock", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, tip_frame = "UIParent", tip_anchor = "BOTTOMLEFT", tip_x = 21, tip_y = 20 }, Guild = { enabled = C.stats.guild, fmt = "%d/%d"..class"g", -- "5/114G" maxguild = nil, -- Set max members listed, nil means no limit. Alt-key reveals hidden members threshold = 1, -- Minimum level displayed (1-90) show_xp = true, -- Show guild experience sorting = "class", -- Default roster sorting: name, level, class, zone, rank, note anchor_frame = C.stats.friend and "Friends" or C.stats.fps and "FPS" or C.stats.latency and "Latency" or "Clock", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, tip_frame = "UIParent", tip_anchor = "BOTTOMLEFT", tip_x = 21, tip_y = 20 }, Durability = { enabled = C.stats.durability, fmt = "[color]%d|r%%"..class"d", -- "54%D", [color] inserts durability color code man = true, -- Hide bliz durability man ignore_inventory = false, -- Ignore inventory gear when auto-repairing gear_icons = false, -- Show your gear icons in the tooltip anchor_frame = C.stats.guild and "Guild" or C.stats.friend and "Friends" or C.stats.fps and "FPS" or C.stats.latency and "Latency" or "Clock", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, tip_frame = "UIParent", tip_anchor = "BOTTOMLEFT", tip_x = 21, tip_y = 20 }, Experience = { enabled = C.stats.experience, -- Experience & Played tags: -- Player Level [level] -- Current XP [curxp] Max XP [totalxp] Current/Max% [cur%] -- Remaining XP [remainingxp] Remaining% [remaining%] -- Session Gained [sessiongained] Session Rate [sessionrate] Session Time To Level [sessionttl] -- Level Rate [levelrate] Level Time To Level [levelttl] -- Rested XP [rest] Rested/Level% [rest%] -- Quests To Level [questsleft] Kills To Level [killsleft] -- Total Played [playedtotal] Level Played [playedlevel] Session Played [playedsession] xp_normal_fmt = "[curxp]([cur%]%)"..class"XP", -- XP string used when not rested xp_rested_fmt = "[curxp]([cur%]%)"..class"XP ".." [restxp]([rest%]%)"..class"R", -- XP string used when rested played_fmt = class"Online: ".."|r".."[playedsession]", -- Played time format short = true, thousand = "k", million = "m", billion = "b", -- Short numbers ("4.5m" "355.3k") -- Faction tags: -- Faction name [repname] -- Standing Color Code [repcolor] Standing Name [standing] -- Current Rep [currep] Current Rep Percent [rep%] -- Rep Left [repleft] Max. Rep [maxrep] faction_fmt = "[repname]: [repcolor][currep]/[maxrep]|r", faction_subs = { -- ["An Very Long Rep Name"] = "Shortened", ["The Wyrmrest Accord"] = "Wyrmrest", ["Knights of the Ebon Blade"] = "Ebon Blade", ["Клан Громового Молота"] = "Громовой Молот", ["Защитники Тол Барада"] = "Тол Барад", ["Гидраксианские Повелители Вод"] = "Повелители Вод", }, anchor_frame = C.stats.durability and "Durability" or C.stats.guild and "Guild" or C.stats.friend and "Friends" or C.stats.fps and "FPS" or C.stats.latency and "Latency" or "Clock", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, tip_frame = "UIParent", tip_anchor = "BOTTOMLEFT", tip_x = 21, tip_y = 20 }, Talents = { enabled = C.stats.talents, anchor_frame = C.stats.experience and "Experience" or C.stats.durability and "Durability" or C.stats.guild and "Guild" or C.stats.friend and "Friends" or C.stats.fps and "FPS" or C.stats.latency and "Latency" or "Clock", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, tip_frame = "UIParent", tip_anchor = "BOTTOMLEFT", tip_x = 21, tip_y = 20 }, -- Bottomright block Coords = { enabled = C.stats.coords, fmt = "%.0f,%.0f", anchor_frame = "UIParent", anchor_to = "right", anchor_from = "bottomright", x_off = -17, y_off = 11 }, Location = { enabled = C.stats.location, subzone = true, -- Set to false to display the main zone's name instead of the subzone truncate = 0, -- Max number of letters for location text, set to 0 to disable coord_fmt = "%.0f,%.0f", anchor_frame = "Coords", anchor_to = "right", anchor_from = "left", x_off = C.stats.coords and -3 or 0, y_off = 0, tip_frame = "UIParent", tip_anchor = "BOTTOMRIGHT", tip_x = -21, tip_y = 20 }, Damage = { enabled = C.stats.damage, fmt = class"%s: ".."%d", alt_fmt = class"%s: ".."%s", anchor_frame = C.bag.enable and "Location" or "Gold", anchor_to = "right", anchor_from = "left", x_off = C.stats.coords and -3 or 0, y_off = 0 }, -- MiniMap block Ping = { enabled = true, fmt = "|cffff5555*|r %s |cffff5555*|r", -- "* PlayerName *" hide_self = true, -- Hide player's ping anchor_frame = "Minimap", anchor_to = "bottom", anchor_from = "bottom", x_off = 0, y_off = 25, }, -- Bags block Gold = { enabled = true, style = 1, -- Display styles: [1] 55g 21s 11c [2] 8829.4g [3] 823.55.94 [4] with texture anchor_frame = cBN and "NivayacBniv_Bag" or C.bag.enable and "StuffingFrameBags" or "Location", anchor_to = "right", anchor_from = cBN and "bottom" or C.bag.enable and "topright" or "left", x_off = cBN and 15 or C.bag.enable and -25 or -3, y_off = cBN and 8 or C.bag.enable and -13 or 0, tip_frame = cBN and "NivayacBniv_Bag" or C.bag.enable and "StuffingFrameBags" or "UIParent", tip_anchor = cBN and "TOPRIGHT" or C.bag.enable and "TOPRIGHT" or "BOTTOMRIGHT", tip_x = cBN and 0 or C.bag.enable and -50 or -21, tip_y = cBN and 85 or C.bag.enable and 0 or 20, strata = cBN and "DIALOG" or "MEDIUM" }, -- Top block Stats = { enabled = C.toppanel.enable, -- Available stat tags: -- Power [power] MP5 [manaregen] -- Haste [haste]% Crit [crit]% Mastery [mastery]% Versatility [versatility]% -- Armor [armor] Dodge [dodge]% Parry [parry]% Block [block]% -- Avoidance [avoidance]% Leech [leech]% Resilience [resilience]% fmt = class"Crit: ".."[crit]%"..class" Haste: ".."[haste]%"..class" Mastery: ".."[mastery]%"..class" Vers: ".."[versatility]%", anchor_frame = "TopPanel", anchor_to = "center", anchor_from = "center", x_off = 0, y_off = 6, }, Stat = { enabled = C.toppanel.enable, spec1fmt = class"Power: ".."[power]", -- Spec #1 string spec2fmt = class"Power: ".."[power]", -- Spec #2 string spec3fmt = class"Power: ".."[power]", -- Spec #3 string spec4fmt = class"Power: ".."[power]", -- Spec #4 string spec5fmt = class"Power: ".."[power]", -- Spec #5 string anchor_frame = "Stats", anchor_to = "topleft", anchor_from = "bottomleft", x_off = 30, y_off = -5, }, Bags = { enabled = C.toppanel.enable, fmt = class"B: ".."%d/%d", anchor_frame = "Stat", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, }, Loot = { enabled = C.toppanel.enable, fmt = class"L: ".."%s", anchor_frame = "Bags", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, }, Nameplates = { enabled = C.toppanel.enable, fmt = class"N: ".."%s", anchor_frame = "Loot", anchor_to = "left", anchor_from = "right", x_off = 3, y_off = 0, }, } -- Show armor for tanks instead of power local Armor = class"Armor: ".."[armor]" LPSTAT_PROFILES = { DEATHKNIGHT = { Stat = {spec1fmt = Armor} -- Blood }, DEMONHUNTER = { Stat = {spec2fmt = Armor} -- Vengeance }, DRUID = { Stat = {spec3fmt = Armor} -- Guardian }, MONK = { Stat = {spec1fmt = Armor} -- Brewmaster }, PALADIN = { Stat = {spec2fmt = Armor} -- Protection }, WARRIOR = { Stat = {spec3fmt = Armor} -- Protection }, } ================================================ FILE: ShestakUI/Config/Filters/Announcements.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Misdirection -> http://www.wowhead.com/spell=34477 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- if C.announcements.spells == true then T.announce_spells = { 61999, -- Raise Ally 20484, -- Rebirth 391054, -- Intercession 20707, -- Soulstone 345130, -- Disposable Spectrophasic Reanimator 31821, -- Aura Mastery 633, -- Lay on Hands 34477, -- Misdirection 57934, -- Tricks of the Trade 19801, -- Tranquilizing Shot 2908, -- Soothe } if #C.announcements.spells_list > 0 then T.announce_spells = C.announcements.spells_list else if C.options.announcements and C.options.announcements.spells_list then C.options.announcements.spells_list = nil end end T.AnnounceSpells = {} for _, spell in pairs(T.announce_spells) do T.AnnounceSpells[spell] = true end end if C.announcements.toys == true then T.AnnounceToys = { [61031] = true, -- Toy Train Set [49844] = true, -- Direbrew's Remote } end if C.announcements.feasts == true then T.AnnounceFeast = { [382427] = true, -- Grand Banquet of the Kalu'a [371521] = true, -- Potion Cauldron of Power [371611] = true, -- Prepare Potion Cauldron of Ultimate Power } T.AnnounceBots = { [22700] = true, -- Field Repair Bot 74A [44389] = true, -- Field Repair Bot 110G [54711] = true, -- Scrapbot [67826] = true, -- Jeeves [126459] = true, -- Blingtron 4000 [161414] = true, -- Blingtron 5000 [298926] = true, -- Blingtron 7000 [199109] = true, -- Auto-Hammer [324029] = true, -- Codex of the Still Mind } end if C.announcements.portals == true then T.AnnouncePortals = { -- Alliance [10059] = true, -- Stormwind [11416] = true, -- Ironforge [11419] = true, -- Darnassus [32266] = true, -- Exodar [49360] = true, -- Theramore [33691] = true, -- Shattrath [88345] = true, -- Tol Barad [132620] = true, -- Vale of Eternal Blossoms [176246] = true, -- Stormshield [281400] = true, -- Boralus -- Horde [11417] = true, -- Orgrimmar [11420] = true, -- Thunder Bluff [11418] = true, -- Undercity [32267] = true, -- Silvermoon [49361] = true, -- Stonard [35717] = true, -- Shattrath [88346] = true, -- Tol Barad [132626] = true, -- Vale of Eternal Blossoms [176244] = true, -- Warspear [281402] = true, -- Dazar'alor -- Alliance/Horde [53142] = true, -- Dalaran [120146] = true, -- Ancient Dalaran [224871] = true, -- Dalaran, Broken Isles [344597] = true, -- Oribos [395289] = true, -- Valdrakken } end if C.announcements.bad_gear == true then local badRings = { [40585] = true, -- Signet of the Kirin Tor [40586] = true, -- Band of the Kirin Tor [44934] = true, -- Loop of the Kirin Tor [44935] = true, -- Ring of the Kirin Tor [45688] = true, -- Inscribed Band of the Kirin Tor [45689] = true, -- Inscribed Loop of the Kirin Tor [45690] = true, -- Inscribed Ring of the Kirin Tor [45691] = true, -- Inscribed Signet of the Kirin Tor [48954] = true, -- Etched Band of the Kirin Tor [48955] = true, -- Etched Loop of the Kirin Tor [48956] = true, -- Etched Ring of the Kirin Tor [48957] = true, -- Etched Signet of the Kirin Tor [51557] = true, -- Runed Signet of the Kirin Tor [51558] = true, -- Runed Loop of the Kirin Tor [51559] = true, -- Runed Ring of the Kirin Tor [51560] = true, -- Runed Band of the Kirin Tor [95050] = true, -- Brassiest Knuckle (Horde) [95051] = true, -- Brassiest Knuckle (Alliance) [118907] = true, -- Pit Fighter's Punching Ring (Alliance) [118908] = true, -- Pit Fighter's Punching Ring (Horde) [139599] = true, -- Empowered Ring of the Kirin Tor (new Dalaran) [142469] = true, -- Violet Seal of the Grand Magus [144391] = true, -- Pugilist's Powerful Punching Ring (Alliance) [144392] = true, -- Pugilist's Powerful Punching Ring (Horde) [166559] = true, -- Commander's Signet of Battle [166560] = true, -- Captain's Signet of Command } T.AnnounceBadGear = { -- Head [1] = { [88710] = true, -- Nat's Hat [33820] = true, -- Weather-Beaten Fishing Hat [19972] = true, -- Lucky Fishing Hat }, -- Neck [2] = { [32757] = true, -- Blessed Medallion of Karabor }, -- Feet [8] = { [50287] = true, -- Boots of the Bay [19969] = true, -- Nat Pagle's Extreme Anglin' Boots }, -- Rings [11] = badRings, [12] = badRings, -- Back [15] = { [65360] = true, -- Cloak of Coordination (Alliance) [65274] = true, -- Cloak of Coordination (Horde) }, -- Main-Hand [16] = { [180136] = true, -- The Brokers Angle'r [133755] = true, -- Underlight Angler [44050] = true, -- Mastercraft Kalu'ak Fishing Pole [19970] = true, -- Arcanite Fishing Pole [84660] = true, -- Pandaren Fishing Pole [84661] = true, -- Dragon Fishing Pole [45992] = true, -- Jeweled Fishing Pole [45991] = true, -- Bone Fishing Pole [116826] = true, -- Draenic Fishing Pole [116825] = true, -- Savage Fishing Pole [86559] = true, -- Frying Pan }, -- Off-hand [17] = { [86558] = true, -- Rolling Pin }, } end ================================================ FILE: ShestakUI/Config/Filters/ArenaControl.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.unitframe.enable ~= true or C.unitframe.show_arena ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Cyclone -> http://www.wowhead.com/spell=33786 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- local function SpellName(id) local name = GetSpellInfo(id) if name then return name else print("|cffff0000WARNING: spell ID ["..tostring(id).."] no longer exists! Report this to Shestak.|r") return "Empty" end end T.ArenaControl = { -- Crowd Controls -- Death Knight [SpellName(91800)] = 5, -- Gnaw (Ghoul) [SpellName(91797)] = 5, -- Monstrous Blow (Mutated Ghoul) [SpellName(108194)] = 5, -- Asphyxiate -- Demon Hunter [SpellName(217832)] = 5, -- Imprison [SpellName(211881)] = 5, -- Fel Eruption [SpellName(179057)] = 5, -- Chaos Nova [SpellName(205630)] = 5, -- Illidan's Grasp [SpellName(207685)] = 5, -- Sigil of Misery -- Druid [SpellName(33786)] = 5, -- Cyclone [SpellName(5211)] = 5, -- Mighty Bash [SpellName(22570)] = 5, -- Maim [SpellName(99)] = 5, -- Incapacitating Roar -- Evoker [SpellName(360806)] = 5, -- Sleep Walk -- Hunter [SpellName(3355)] = 5, -- Freezing Trap [SpellName(24394)] = 5, -- Intimidation [SpellName(213691)] = 5, -- Scatter Shot -- Mage [SpellName(118)] = 5, -- Polymorph [SpellName(82691)] = 5, -- Ring of Frost [SpellName(31661)] = 5, -- Dragon's Breath -- Monk [SpellName(115078)] = 5, -- Paralysis [SpellName(119381)] = 5, -- Leg Sweep [SpellName(120086)] = 5, -- Fists of Fury [SpellName(198909)] = 5, -- Song of Chi-Ji -- Paladin [SpellName(853)] = 5, -- Hammer of Justice [SpellName(20066)] = 5, -- Repentance [SpellName(105421)] = 5, -- Blinding Light -- Priest [SpellName(605)] = 5, -- Dominate Mind [SpellName(8122)] = 5, -- Psychic Scream [SpellName(64044)] = 5, -- Psychic Horror [SpellName(205369)] = 5, -- Mind Bomb [SpellName(200196)] = 5, -- Holy Word: Chastise [SpellName(87204)] = 5, -- Sin and Punishment -- Rogue [SpellName(6770)] = 5, -- Sap [SpellName(2094)] = 5, -- Blind [SpellName(408)] = 5, -- Kidney Shot [SpellName(1833)] = 5, -- Cheap Shot [SpellName(1776)] = 5, -- Gouge -- Shaman [SpellName(51514)] = 5, -- Hex [SpellName(118905)] = 5, -- Static Charge [SpellName(118345)] = 5, -- Pulverize (Earth Elemental) [SpellName(305485)] = 5, -- Lightning Lasso -- Warlock [SpellName(118699)] = 5, -- Fear [SpellName(30283)] = 5, -- Shadowfury [SpellName(89766)] = 5, -- Axe Toss (Felguard) [SpellName(5484)] = 5, -- Howl of Terror [SpellName(6789)] = 5, -- Mortal Coil [SpellName(6358)] = 5, -- Seduction (Succubus) [SpellName(115268)] = 5, -- Mesmerize (Shivarra) [SpellName(171156)] = 5, -- Meteor Strike (Abyssal) -- Warrior [SpellName(132169)] = 5, -- Storm Bolt [SpellName(132168)] = 5, -- Shockwave [SpellName(5246)] = 5, -- Intimidating Shout [SpellName(199085)] = 5, -- Warpath -- Racial [SpellName(107079)] = 5, -- Quaking Palm (Pandaren) [SpellName(20549)] = 5, -- War Stomp (Tauren) [SpellName(287712)] = 5, -- Haymaker (Kul Tiran) -- Silences [SpellName(47476)] = 4, -- Strangulate [SpellName(204490)] = 4, -- Sigil of Silence [SpellName(81261)] = 4, -- Solar Beam [SpellName(31935)] = 4, -- Avenger's Shield [SpellName(15487)] = 4, -- Silence [SpellName(1330)] = 4, -- Garrote - Silence -- Roots [SpellName(96294)] = 3, -- Chains of Ice [SpellName(339)] = 3, -- Entangling Roots [SpellName(102359)] = 3, -- Mass Entanglement [SpellName(45334)] = 3, -- Immobilized [SpellName(117526)] = 3, -- Binding Shot [SpellName(212638)] = 3, -- Tracker's Net [SpellName(190925)] = 3, -- Harpoon [SpellName(122)] = 3, -- Frost Nova [SpellName(198121)] = 3, -- Frostbite [SpellName(33395)] = 3, -- Freeze (Water Elemental) [SpellName(116706)] = 3, -- Disable [SpellName(64695)] = 3, -- Earthgrab [SpellName(233582)] = 3, -- Entrenched in Flame -- Immunities [SpellName(186265)] = 2, -- Aspect of the Turtle [SpellName(45438)] = 2, -- Ice Block [SpellName(642)] = 2, -- Divine Shield [SpellName(46924)] = 2, -- Bladestorm -- Buffs [SpellName(1022)] = 1, -- Blessing of Protection [SpellName(204018)] = 1, -- Blessing of Spellwarding [SpellName(6940)] = 1, -- Blessing of Sacrifice [SpellName(1044)] = 1, -- Blessing of Freedom [SpellName(31821)] = 1, -- Aura Mastery [SpellName(33206)] = 1, -- Pain Suppression [SpellName(8178)] = 1, -- Grounding Totem -- Defense abilities [SpellName(48707)] = 1, -- Anti-Magic Shell [SpellName(48792)] = 1, -- Icebound Fortitude [SpellName(31224)] = 1, -- Cloak of Shadows [SpellName(871)] = 1, -- Shield Wall [SpellName(118038)] = 1, -- Die by the Sword } ================================================ FILE: ShestakUI/Config/Filters/AutoButton.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.misc.quest_auto_button ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete item is to go at www.wowhead.com, search for a item. -- Example: Seaforium Bombs -> http://www.wowhead.com/item=46847 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- T.ABItems = { -- Daily Quests [32971] = true, -- Water Bucket [38689] = true, -- Chicken Net [52507] = true, -- Stardust No.2 [62829] = true, -- Magnetized Scrap Collector [63351] = true, -- Tahret Dynasty Mallet [69235] = true, -- Fang of the Wolf [69240] = true, -- Enchanted Salve [69981] = true, -- Ironforge Rations [71978] = true, -- Darkmoon Bandage [77475] = true, -- Stack of Mantras [78947] = true, -- Silken Rope [79885] = true, -- Barrel of Fireworks [80127] = true, -- Shadelight Truffle Spores [80403] = true, -- Angler's Fishing Spear [80599] = true, -- Goblin Fishing Bomb [82346] = true, -- Pot of Fire [82381] = true, -- Yak's Milk Flask [82807] = true, -- Shado-Pan Dragon Gun [83134] = true, -- Bronze Claws [84762] = true, -- Highly Explosive Yaungol Oil [85884] = true, -- Sonic Emitter [86532] = true, -- Bag of Shado-Pan Gas Bombs [87394] = true, -- Sonic Disruption Fork [87841] = true, -- Korven's Experimental Grenades [92019] = true, -- The Bilgewater Molotov [93180] = true, -- Re-Configured Remote [93668] = true, -- Saur Fetish [93751] = true, -- Blessed Torch [93761] = true, -- Arcane Emancipator [93806] = true, -- Resonance Siphon -- Seaforium [46847] = true, -- Seaforium Bombs [47030] = true, -- Huge Seaforium Bombs -- Other [45072] = true, -- Brightly Colored Egg (Noblegarden) -- Legion [118330] = true, -- Pile of Weapons [122100] = true, -- Soul Gem [127030] = true, -- Granny's Flare Grenades [127295] = true, -- Blazing Torch [128651] = true, -- Critter Hand Cannon [128772] = true, -- Branch of the Runewood [129161] = true, -- Stormforged Horn [129725] = true, -- Smoldering Torch [131931] = true, -- Khadgar's Wand [133756] = true, -- Fresh Mound of Flesh [133882] = true, -- Trap Rune [133897] = true, -- Telemancy Beacon [133925] = true, -- Fel Lash [133999] = true, -- Inert Crystal [136605] = true, -- Solendra's Compassion [137299] = true, -- Nightborne Spellblad [138146] = true, -- Rediant Ley Crystal [138965] = true, -- Wand of Siphoning [140916] = true, -- Satchel of Locklimb Powder [142509] = true, -- Withered Targeting Orb [128329] = true, -- Depleted Leyflame Burner [130260] = true, -- Thaedris' Elixir [140257] = true, -- Advanced Telemancy Beacon [142401] = true, -- Telemancy Orbs -- BfA [166905] = true, -- Hunting Knife [168183] = true, -- Rare Metal Collector [168253] = true, -- Fathom Hook [168482] = true, -- Plug the Geysers -- Shadowlands [177836] = true, -- Wingpierce Javelin [180280] = true, -- Soulforged Core [183045] = true, -- Korinna's Allaying Crook [180170] = true, -- Pulsing Animacone [180876] = true, -- Aqueous Material Accumulator [188697] = true, -- Kinematic Micro-Life Recalibrator } T.ABItemsIgnore = { -- [itemID] = true, -- Item name to ignore } ================================================ FILE: ShestakUI/Config/Filters/BadBuffs.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.automation.cancel_bad_buffs ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Mohawked! -> http://www.wowhead.com/spell=58493 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- local function SpellName(id) local name = GetSpellInfo(id) if name then return name else print("|cffff0000WARNING: spell ID ["..tostring(id).."] no longer exists! Report this to Shestak.|r") return "Empty" end end T.BadBuffs = { [SpellName(58493)] = true, -- Mohawked! [SpellName(44212)] = true, -- Jack-o'-Lanterned! [SpellName(61716)] = true, -- Rabbit Costume [SpellName(172010)] = true, -- Abomination Costume [SpellName(24732)] = true, -- Bat Costume [SpellName(172015)] = true, -- Geist Costume [SpellName(24735)] = true, -- Ghost Costume [SpellName(172008)] = true, -- Ghoul Costume [SpellName(24712)] = true, -- Leper Gnome Costume [SpellName(24710)] = true, -- Ninja Costume [SpellName(24709)] = true, -- Pirate Costume [SpellName(24723)] = true, -- Skeleton Costume [SpellName(172003)] = true, -- Slime Costume [SpellName(172020)] = true, -- Spider Costume [SpellName(24740)] = true, -- Wisp Costume [SpellName(61781)] = true, -- Turkey Feathers [SpellName(61734)] = true, -- Noblegarden Bunny } ================================================ FILE: ShestakUI/Config/Filters/ChannelingTicks.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.unitframe.enable ~= true or C.unitframe.castbar_ticks ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Tranquility -> http://www.wowhead.com/spell=740 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- local function SpellName(id) local name = GetSpellInfo(id) if name then return name else print("|cffff0000WARNING: spell ID ["..tostring(id).."] no longer exists! Report this to Shestak.|r") return "Empty" end end T.CastBarTicks = { -- Druid [SpellName(740)] = 4, -- Tranquility -- Evoker [SpellName(356995)] = 3, -- Disintegrate -- Mage [SpellName(5143)] = 5, -- Arcane Missiles [SpellName(12051)] = 6, -- Evocation [SpellName(205021)] = 5, -- Ray of Frost -- Monk [SpellName(115175)] = 8, -- Soothing Mist [SpellName(117952)] = 4, -- Crackling Jade Lightning -- Priest [SpellName(15407)] = 6, -- Mind Flay [SpellName(48045)] = 6, -- Mind Sear [SpellName(47540)] = 3, -- Penance [SpellName(64843)] = 4, -- Divine Hymn [SpellName(64902)] = 5, -- Symbol of Hope (Mana Hymn) -- Warlock [SpellName(755)] = 5, -- Health Funnel [SpellName(198590)] = 5, -- Drain Soul [SpellName(234153)] = 5, -- Drain Life -- Racials [SpellName(291944)] = 6, -- Regeneratin (Zandalari) } local f = CreateFrame("Frame") f:RegisterEvent("PLAYER_ENTERING_WORLD") f:RegisterEvent("PLAYER_TALENT_UPDATE") f:SetScript("OnEvent", function() if T.class ~= "PRIEST" then f:UnregisterAllEvents() return end -- Penance local penanceTicks = IsPlayerSpell(193134) and 4 or 3 T.CastBarTicks[SpellName(47540)] = penanceTicks end) ================================================ FILE: ShestakUI/Config/Filters/ChatSpam.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true or C.chat.spam ~= true then return end T.ChatSpamList = { "золото", "з0л0т0", "з0л0то", "золота", "голд", "г0лд", "золотишко", "золатишко", "блестяшки", "блестяшkи", "блестяхи", "монетки", "м0нетки", "монеты", "visа", "mastercard", "webmoney", "вебмани", "qiwi", "qiwі", "яндекс", "skype", "skуpe", "skуpе", "скайп", "скаип", "sкайп", "портал", "анус", "анальное" } for word in gmatch(C.chat.spam_list, "%S+") do tinsert(T.ChatSpamList, word) end ================================================ FILE: ShestakUI/Config/Filters/CombatText.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.combattext.enable ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Blizzard -> http://www.wowhead.com/spell=42208 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- -- General filter outgoing healing if C.combattext.healing then T.healfilter = {} T.healfilter[143924] = true -- Leech T.healfilter[127802] = true -- Touch of the Grave [Undead] end -- General merge outgoing damage if C.combattext.merge_aoe_spam then T.merge = {} T.aoespam = {} T.aoespam[6603] = 3 -- Auto Attack T.aoespam[195222] = 4 -- Stormlash [Shaman] T.aoespam[259756] = 6 -- Entropic Embrace (Void Elves) T.aoespam[321519] = 5 -- Paralytic Poison (Covenant Night Fae) T.aoespam[344155] = 1 -- Gluttonous Spike (Trinket) T.aoespam[356320] = 10 -- Siphon Essence (Unholy Shard) T.aoespam[345466] = 3 -- Liquefying Ooze (Trinket) T.aoespam[355759] = 3 -- Frozen Heart (Trinket) T.aoespam[333526] = 3 -- Spiked Burrs (Night Fae Soulbind) T.aoespam[355735] = 3 -- Winds of Winter (Frost Shard) T.aoespam[355804] = 3 -- Blood Link (Blood Shard) T.aoespam[355768] = 3 -- Blood Link (Blood Shard) T.aoespam[355769] = 3 -- Blood Link (Blood Shard) T.aoespam[355829] = 3 -- Chaos Bane (Unholy Shard) T.aoespam[355605] = 3 -- Fusion Amplification (Trinket) T.aoespam[351687] = 3 -- Mnemonic Equipment (Maldraxxus) T.aoespam[353248] = 3 -- Effusive Anima Accelerator T.aoespam[368651] = 3 -- Vicious Wound T.aoespam[336463] = 5 -- Shadowcore Oil Blast T.aoespam[353466] = 4 -- Sadistic Glee T.aoespam[321937] = 4 -- Phantom Fire -- GUI list for _, spell in pairs(C.combattext.spells_list) do T.aoespam[spell[1]] = spell[2] end end -- Class config if T.class == "DEATHKNIGHT" then if C.combattext.merge_aoe_spam then T.aoespam[91778] = 0 -- Sweeping Claws T.aoespam[207311] = 0 -- Clawing Shadows T.aoespam[115994] = 4 -- Unholy Blight T.aoespam[206931] = 2.5 -- Blooddrinker T.aoespam[279303] = 1 -- Frost Breath T.aoespam[195975] = 1 -- Glacial Advance T.aoespam[195750] = 3 -- Frozen Pulse T.aoespam[207150] = 0.5 -- Avalanche T.aoespam[207230] = 0.5 -- Frostscythe T.aoespam[194311] = 0.5 -- Festering Wound T.aoespam[199373] = 4 -- Claw (Addition Ghouls) T.aoespam[207267] = 0.5 -- Bursting Sores T.aoespam[215969] = 0.5 -- Epidemic T.merge[212739] = 215969 -- Epidemic T.aoespam[196545] = 3 -- Bonestorm Heal T.aoespam[196528] = 3 -- Bonestorm T.aoespam[219711] = 0 -- Blood Feast T.aoespam[196771] = 3 -- Remorseless Winter T.aoespam[205164] = 0 -- Crystalline Swords T.merge[205165] = 205164 -- Crystalline Swords Off-Hand T.merge[237680] = 49184 -- Howling Blast T.aoespam[205224] = 0.5 -- Consumption Heal T.aoespam[205223] = 0.5 -- Consumption T.aoespam[191587] = 4 -- Virulent Plague T.aoespam[191685] = 4 -- Virulent Eruption T.aoespam[206930] = 0.5 -- Heart Strike T.aoespam[55095] = 3.5 -- Frost Fever T.aoespam[55078] = 3 -- Blood Plague T.aoespam[50842] = 0 -- Blood Boil T.aoespam[49184] = 0.5 -- Howling Blast T.aoespam[52212] = 3 -- Death and Decay T.aoespam[50401] = 4 -- Razorice T.aoespam[91776] = 3 -- Claw (Ghoul) T.aoespam[222024] = 0 -- Obliterate T.aoespam[222026] = 0 -- Frost Strike T.aoespam[49998] = 0.5 -- Death Strike T.aoespam[156000] = 3 -- Defile T.aoespam[155166] = 3 -- Mark of Sindragosa T.aoespam[55090] = 0 -- Scourge Strike T.aoespam[319236] = 5 -- Unholy Pact T.aoespam[212423] = 6 -- Skulker Shot T.aoespam[311730] = 4 -- Swarming Mist (Covenant Venthyr) T.aoespam[323798] = 6 -- Abomination Limb (Covenant Necrolord) T.merge[66198] = 222024 -- Obliterate Off-Hand T.merge[66196] = 222026 -- Frost Strike Off-Hand T.merge[66188] = 49998 -- Death Strike Off-Hand T.merge[70890] = 55090 -- Scourge Strike (Shadow damage) end if C.combattext.healing then T.healfilter[206931] = true -- Blooddrinker T.healfilter[55078] = true -- Blood Plague T.healfilter[53365] = true -- Unholy Strength T.healfilter[119980] = true -- Conversion end elseif T.class == "DEMONHUNTER" then if C.combattext.merge_aoe_spam then T.aoespam[258926] = 3.5 -- Fel Barrage T.aoespam[258921] = 0.5 -- Immolation Aura T.aoespam[258922] = 4 -- Immolation Aura Tick T.aoespam[258883] = 4 -- Trail of Ruin T.aoespam[247455] = 1 -- Spirit Bomb T.aoespam[243160] = 0 -- Erupting Souls T.aoespam[189112] = 0 -- Infernal Strike T.aoespam[228478] = 0 -- Soul Cleave T.aoespam[204598] = 7 -- Sigil of Flame T.aoespam[207771] = 7 -- Fiery Brand T.aoespam[207407] = 4 -- Soul Carver T.aoespam[204157] = 1 -- Throw Glaive Vengeance T.aoespam[218677] = 1 -- Spirit Bomb (Damage) T.aoespam[227255] = 4 -- Spirit Bomb (Heal) T.aoespam[212105] = 3 -- Fel Devastation (Damage) T.aoespam[212106] = 3 -- Fel Devastation (Heal) T.aoespam[213011] = 4 -- Charred Warblades (Heal) T.aoespam[225919] = 1 -- Fracture T.merge[225921] = 225919 -- Fracture Off-Hand T.aoespam[207693] = 6 -- Feast of Souls T.aoespam[217070] = 0.5 -- Rage of the Illidari T.aoespam[202388] = 1 -- Inner Demons T.aoespam[222031] = 1.5 -- Chaos Strike T.merge[199547] = 222031 -- Chaos Strike Off-Hand T.aoespam[199552] = 2 -- Blade Dance (AOE, Multi) T.merge[200685] = 199552 -- Blade Dance T.aoespam[201789] = 4 -- Fury of the Illidari T.merge[201628] = 201789 -- Fury of the Illidari Off-Hand T.aoespam[203796] = 4 -- Demon Blades T.aoespam[192611] = 1 -- Fel Rush T.aoespam[198030] = 3 -- Eye Beam T.aoespam[198813] = 0 -- Vengeful Retreat T.aoespam[200166] = 0 -- Metamorphosis T.aoespam[179057] = 0 -- Chaos Nova T.aoespam[185123] = 1 -- Throw Glaive Havoc T.aoespam[207690] = 10 -- Bloodlet T.aoespam[202446] = 1 -- Anguish T.aoespam[211796] = 4 -- Chaos Blades T.merge[211797] = 211796 -- Chaos Blades Off-Hand T.aoespam[227518] = 1.5 -- Annihilation T.merge[201428] = 227518 -- Annihilation Off-Hand T.aoespam[210153] = 2 -- Death Sweep T.merge[210155] = 210153 -- Death Sweep Off-Hand T.aoespam[236237] = 2 -- Chaos Cleave T.aoespam[203794] = 2 -- Consume Soul T.aoespam[307046] = 0 -- Elysian Decree (Covenant Kyrian) T.aoespam[345335] = 3 -- The Hunt (DoT) T.aoespam[345423] = 6 -- The Hunt (Heal) T.aoespam[342857] = 3 -- Glaive Tempest T.aoespam[346278] = 3 -- Burning Wound (Legendary) T.aoespam[346503] = 3 -- Fel Devastation T.aoespam[317009] = 3 -- Sinful Brand (Venthyr) end elseif T.class == "DRUID" then if C.combattext.merge_aoe_spam then -- Healing spells T.aoespam[207386] = 4 -- Spring Blossoms T.aoespam[102352] = 4 -- Cenarion Ward T.aoespam[200389] = 4 -- Cultivation T.aoespam[227034] = 4 -- Lunar Beam Heal T.aoespam[22842] = 3.5 -- Frenzied Regeneration T.aoespam[774] = 4 -- Rejuvenation T.aoespam[48438] = 7 -- Wild Growth T.aoespam[8936] = 4 -- Regrowth T.aoespam[33763] = 4 -- Lifebloom T.aoespam[157982] = 3 -- Tranquility T.aoespam[81269] = 4 -- Wild Mushroom T.aoespam[124988] = 3 -- Nature's Vigil T.aoespam[155777] = 4 -- Rejuvenation (Germination) -- Damaging spells T.aoespam[274838] = 2 -- Feral Frenzy T.aoespam[202028] = 0 -- Brutal Slash T.aoespam[211545] = 4 -- Fury of Elune T.merge[279729] = 190984 -- Solar Wrath T.aoespam[190984] = 0 -- Solar Wrath T.aoespam[194153] = 0 -- Lunar Strike T.aoespam[274283] = 0 -- Full Moon T.aoespam[204069] = 4 -- Lunar Beam T.aoespam[213709] = 5 -- Brambles T.aoespam[213771] = 0 -- Swipe T.aoespam[192090] = 3 -- Thrash DoT T.aoespam[164812] = 3 -- Moonfire T.aoespam[164815] = 3 -- Sunfire T.aoespam[191037] = 3 -- Starfall T.aoespam[61391] = 0 -- Typhoon T.aoespam[155722] = 3 -- Rake T.aoespam[33917] = 0 -- Mangle T.aoespam[106785] = 0 -- Swipe T.aoespam[77758] = 1 -- Thrash (Bear Form) T.aoespam[106830] = 3 -- Thrash (Cat Form) T.aoespam[1079] = 3 -- Rip T.aoespam[124991] = 3 -- Nature's Vigil T.aoespam[202347] = 3 -- Stellar Flare T.aoespam[155625] = 3 -- Moonfire (Cat Form) T.aoespam[365640] = 4 -- Fury of Elune end if C.combattext.healing then T.healfilter[145109] = true -- Ysera's Gift (Self) T.healfilter[145110] = true -- Ysera's Gift T.healfilter[202636] = true -- Leader of the Pack end elseif T.class == "HUNTER" then if C.combattext.merge_aoe_spam then T.aoespam[217200] = 4 -- Barbed Shot T.aoespam[270329] = 0.5 -- Pheromone Bomb T.aoespam[270332] = 2 -- Pheromone Bomb Tick T.aoespam[260231] = 0.5 -- Violent Reaction (Pheromone Bomb Effect) T.aoespam[271048] = 0.5 -- Volatile Bomb T.aoespam[271049] = 2 -- Volatile Bomb Tick T.aoespam[270338] = 0.5 -- Shrapnel Bomb T.aoespam[270339] = 2 -- Shrapnel Bomb Tick T.aoespam[270343] = 4 -- Internal Bleeding (Shrapnel Bomb Effect) T.aoespam[259396] = 2 -- Chakrams T.merge[259398] = 259396 -- Flanking Strike T.merge[267666] = 259396 -- Flanking Strike T.aoespam[259516] = 0.5 -- Flanking Strike T.merge[269752] = 259516 -- Flanking Strike T.aoespam[265157] = 0.5 -- Wildfire Bomb T.aoespam[269747] = 6 -- Wildfire Bomb Tick T.aoespam[271788] = 3 -- Serpent Sting (Marksmanship Talent) T.aoespam[186387] = 0 -- Bursting Shot T.aoespam[257045] = 3.5 -- Rapid Fire T.aoespam[257620] = 0 -- Multi-Shot (Marksmanship) T.aoespam[2643] = 0 -- Multi-Shot (Beast Mastery) T.aoespam[259491] = 3 -- Serpent Sting (Survival) T.aoespam[13812] = 3 -- Explosive Trap T.aoespam[212680] = 1 -- Explosive Shot T.aoespam[118459] = 3 -- Beast Cleave T.aoespam[120361] = 3 -- Barrage T.aoespam[131900] = 3 -- A Murder of Crows T.aoespam[194599] = 3 -- Black Arrow T.aoespam[162543] = 3 -- Poisoned Ammo T.aoespam[162541] = 3 -- Incendiary Ammo T.aoespam[34655] = 3 -- Deadly Poison (Trap) T.aoespam[93433] = 3 -- Burrow Attack (Worm) T.aoespam[92380] = 3 -- Froststorm Breath (Chimaera) T.aoespam[212436] = 0.5 -- Butchery T.aoespam[194859] = 9 -- Dragonsfire Conflagration T.aoespam[194858] = 9 -- Dragonsfire Grenade T.aoespam[162487] = 6 -- Steel Trap T.aoespam[200167] = 1.5 -- Throwing Axes T.aoespam[187708] = 0.5 -- Carve T.aoespam[203413] = 5 -- Fury of the Eagle T.aoespam[203525] = 2 -- Talon Strike T.aoespam[17253] = 6 -- Bite T.aoespam[185855] = 6 -- Lacerate T.aoespam[194279] = 6 -- Caltrops T.aoespam[19434] = 1 -- Trick Shot (Aimed Shot) T.aoespam[191070] = 1 -- Call of the Hunter (Marked Shot) T.aoespam[191043] = 1 -- Legacy of the Windrunners (Aimed Shot) T.aoespam[198670] = 1 -- Piercing Shot T.aoespam[201594] = 4 -- Stampede T.aoespam[260247] = 1 -- Volley T.aoespam[214581] = 2 -- Sidewinders T.aoespam[191413] = 6 -- Bestial Ferocity T.aoespam[16827] = 6 -- Claw T.aoespam[201754] = 1 -- Stomp T.aoespam[63900] = 1 -- Thunderstomp T.aoespam[197465] = 1 -- Surge of the Stormgod T.aoespam[207097] = 4 -- Titan's Thunder T.aoespam[269576] = 6 -- Master Marksman T.aoespam[328837] = 0.5 -- Wild Spirits (Covenant Night Fae) T.aoespam[328757] = 6 -- Wild Spirits (Covenant Night Fae) -- Healing spells T.aoespam[199483] = 9 -- Camouflage T.aoespam[136] = 9 -- Mend Pet T.merge[214303] = 136 -- Mend Pet (Hati) T.aoespam[197161] = 8 -- Mimiron's Shell Heal T.aoespam[339400] = 4 -- Rejuvenating Wind (Conduit) end if C.combattext.healing then T.healfilter[197205] = true -- Spirit Bond end elseif T.class == "MAGE" then if C.combattext.merge_aoe_spam then T.aoespam[217694] = 3.5 -- Living Bomb T.aoespam[244813] = 3.5 -- Living Bomb T.aoespam[44461] = 3.5 -- Living Bomb (AoE) T.aoespam[2120] = 0 -- Flamestrike T.aoespam[194432] = 0 -- Aftershocks T.aoespam[12654] = 3 -- Ignite T.aoespam[31661] = 0 -- Dragon's Breath T.aoespam[190357] = 3 -- Blizzard T.aoespam[122] = 0 -- Frost Nova T.aoespam[1449] = 0 -- Arcane Explosion T.aoespam[240689] = 0 -- Time and Space T.aoespam[120] = 0 -- Cone of Cold T.aoespam[114923] = 3 -- Nether Tempest T.aoespam[114954] = 3 -- Nether Tempest (AoE) T.aoespam[7268] = 1.6 -- Arcane Missiles T.aoespam[84721] = 3 -- Frozen Orb T.aoespam[228354] = 1.5 -- Flurry T.aoespam[242851] = 1.5 -- Glacial Eruption T.aoespam[228600] = 1 -- Glacial Spike T.aoespam[257538] = 1 -- Ebonbolt T.aoespam[205021] = 2 -- Ray of Frost T.aoespam[148022] = 3 -- Icicle (Mastery) T.aoespam[31707] = 3 -- Waterbolt (Pet) T.aoespam[228598] = 0.5 -- Ice Lance T.aoespam[157981] = 0 -- Blast Wave T.aoespam[157997] = 1 -- Ice Nova T.aoespam[157980] = 1 -- Supernova T.aoespam[153596] = 3 -- Comet Storm T.aoespam[153640] = 3 -- Arcane Orb T.aoespam[157977] = 0 -- Unstable Magic (Fire) T.aoespam[157978] = 0 -- Unstable Magic (Frost) T.aoespam[157979] = 0 -- Unstable Magic (Arcane) T.aoespam[153564] = 0 -- Meteor T.aoespam[155158] = 4 -- Meteor Burn T.aoespam[257542] = 0.6 -- Phoenix's Flames T.aoespam[205345] = 4 -- Conflagration Flare Up T.aoespam[226757] = 4 -- Conflagration T.aoespam[198928] = 1.2 -- Cinderstorm T.aoespam[194522] = 3 -- Blast Furnace T.aoespam[194316] = 3 -- Cauterizing Blink T.aoespam[235314] = 3 -- Blazing Barrier T.aoespam[205472] = 4 -- Flame Patch T.aoespam[88084] = 3 -- Arcane Blast (Mirror Image) T.aoespam[59638] = 3 -- Frostbolt (Mirror Image) T.aoespam[88082] = 3 -- Fireball (Mirror Image) T.merge[211088] = 211076 -- Mark of Aluneth T.aoespam[211076] = 3 -- Mark of Aluneth T.merge[210817] = 44425 -- Arcane Rebound T.aoespam[44425] = 1.2 -- Arcane Barrage T.aoespam[277703] = 3 -- Trailing Embers T.aoespam[325130] = 1.9 -- Shifting Power (Covenant Night Fae) end elseif T.class == "MONK" then if C.combattext.merge_aoe_spam then -- Healing spells T.aoespam[119611] = 3 -- Renewing Mist T.aoespam[124682] = 3 -- Enveloping Mist T.aoespam[115175] = 3 -- Soothing Mist T.aoespam[107270] = 3 -- Spinning Crane Kick T.aoespam[132463] = 3 -- Chi Wave T.aoespam[130654] = 3 -- Chi Burst T.aoespam[124081] = 3 -- Zen Pulse T.aoespam[116670] = 0 -- Uplift T.aoespam[178173] = 3 -- Gift of the Ox T.aoespam[191840] = 3 -- Essence Font T.aoespam[162530] = 3 -- Refreshing Jade Wind -- Damaging spells T.aoespam[228649] = 1 -- Blackout Kick (x3) T.aoespam[148187] = 4 -- Rushing Jade Wind T.aoespam[123996] = 4 -- Crackling Tiger Lightning T.aoespam[124280] = 4 -- Touch of Karma T.aoespam[196608] = 4 -- Eye of the Tiger T.aoespam[117952] = 3 -- Crackling Jade Lightning T.aoespam[117418] = 3.5 -- Fists of Fury T.aoespam[121253] = 0 -- Keg Smash T.aoespam[115181] = 0 -- Breath of Fire T.aoespam[123725] = 3 -- Breath of Fire (DoT) T.aoespam[107270] = 3 -- Spinning Crane Kick T.aoespam[123586] = 3 -- Flying Serpent Kick T.aoespam[132467] = 3 -- Chi Wave T.aoespam[148135] = 3 -- Chi Burst T.aoespam[158221] = 1 -- Hurricane Strike end if C.combattext.healing then T.healfilter[196608] = true -- Eye of the Tiger T.healfilter[216521] = true -- Celestial Fortune end elseif T.class == "PALADIN" then if C.combattext.merge_aoe_spam then -- Healing spells T.aoespam[216371] = 4 -- Avenging Crusader T.aoespam[209540] = 8 -- Light of the Titans T.aoespam[53652] = 3 -- Beacon of Light T.aoespam[85222] = 1 -- Light of Dawn T.aoespam[114852] = 0 -- Holy Prism T.aoespam[119952] = 3 -- Arcing Light T.aoespam[183811] = 6 -- Judgment of Light T.aoespam[225311] = 1 -- Light of Dawn T.aoespam[377129] = 3 -- Golden Path -- Damaging spells T.aoespam[53600] = 0.5 -- Shield of the Righteous T.aoespam[184689] = 1 -- Shield of Vengeance T.aoespam[205202] = 1 -- Eye for an Eye T.aoespam[255937] = 1 -- Wake of Ashes T.aoespam[198137] = 5 -- Divine Hammer T.aoespam[81297] = 3 -- Consecration T.aoespam[53385] = 0 -- Divine Storm T.aoespam[88263] = 1 -- Hammer of the Righteous T.merge[53595] = 88263 -- Hammer of the Righteous T.aoespam[31935] = .5 -- Avenger's Shield T.aoespam[114871] = 0 -- Holy Prism T.aoespam[114919] = 3 -- Arcing Light T.aoespam[86704] = 0 -- Ancient Fury T.aoespam[157122] = 3 -- Holy Shield T.aoespam[378286] = 1 -- Tyr's Enforcer T.aoespam[387174] = 1 -- Eye of Tyr T.aoespam[105421] = 1 -- Blinding Light T.aoespam[204301] = 8 -- Blessed Hammer T.aoespam[224239] = 1 -- Divine Storm T.aoespam[20271] = 1 -- Judgment T.aoespam[217020] = 1 -- Zeal T.aoespam[286232] = 1 -- Light's Decree end elseif T.class == "PRIEST" then if C.combattext.merge_aoe_spam then -- Healing spells T.aoespam[314867] = 0 -- Shadow Covenant T.aoespam[270501] = 2.5 -- Contrition T.merge[281469] = 270501 -- Contrition T.aoespam[194509] = 0.5 -- Power Word: Radiance T.aoespam[204883] = 1 -- Circle of Healing T.aoespam[15290] = 4 -- Vampiric Embrace T.aoespam[47750] = 2.5 -- Penance T.aoespam[281265] = 0 -- Holy Nova T.aoespam[139] = 3 -- Renew T.aoespam[596] = 0 -- Prayer of Healing T.aoespam[64844] = 3 -- Divine Hymn T.aoespam[77489] = 3 -- Echo of Light T.aoespam[33110] = 3 -- Prayer of Mending T.aoespam[34861] = 3 -- Holy Word: Sanctify T.aoespam[81751] = 3 -- Atonement T.aoespam[120692] = 3 -- Halo T.aoespam[110745] = 3 -- Divine Star T.merge[94472] = 81751 -- Atonement -- Damaging spells T.aoespam[204213] = 4 -- Purge the Wicked T.aoespam[205386] = 0.5 -- Shadow Crash T.aoespam[49821] = 3 -- Mind Sear T.aoespam[263165] = 5 -- Void Torrent T.aoespam[228361] = 1 -- Void Eruption T.merge[228360] = 228361 -- Void Eruption T.aoespam[193473] = 3 -- Mind Flay (Call to the Void) T.aoespam[186723] = 2.5 -- Penance T.merge[47666] = 186723 -- Penance T.aoespam[132157] = 0 -- Holy Nova T.aoespam[589] = 4 -- Shadow Word: Pain T.aoespam[34914] = 4 -- Vampiric Touch T.aoespam[15407] = 3 -- Mind Flay T.aoespam[14914] = 3 -- Holy Fire T.aoespam[120696] = 3 -- Halo T.aoespam[122128] = 3 -- Divine Star T.aoespam[148859] = 3 -- Shadowy Apparition end if C.combattext.healing then T.healfilter[34914] = true -- Vampiric Touch end elseif T.class == "ROGUE" then if C.combattext.merge_aoe_spam then T.aoespam[121411] = 2.5 -- Crimson Tempest T.aoespam[271881] = 0.5 -- Blade Rush T.aoespam[280720] = 2 -- Secret Technique T.merge[282449] = 280720 -- Secret Technique T.aoespam[51723] = 1 -- Fan of Knives T.aoespam[2818] = 5 -- Deadly Poison T.aoespam[185311] = 3 -- Crimson Vial T.aoespam[192380] = 1 -- Poison Knives T.aoespam[192434] = 5 -- From the Shadows T.aoespam[255546] = 3.5 -- Poison Bomb T.aoespam[121473] = 4 -- Shadow Blade T.merge[121474] = 121473 -- Shadow Blade Off-Hand T.aoespam[197800] = 1 -- Shadow Nova T.aoespam[197611] = 1 -- Second Shuriken T.aoespam[197835] = 1 -- Shuriken Storm T.aoespam[195452] = 3 -- Nightblade T.aoespam[209783] = 0.5 -- Goremaw's Bite T.merge[209784] = 209783 -- Goremaw's Bite Off-Hand T.aoespam[192760] = 0.5 -- Kingsbane T.merge[222062] = 192760 -- Kingsbane Off-Hand T.aoespam[192759] = 5 -- Kingsbane DoT T.aoespam[703] = 5 -- Garrote T.aoespam[8680] = 3 -- Wound Poison T.aoespam[22482] = 3 -- Blade Flurry T.aoespam[16511] = 3 -- Hemorrhage T.aoespam[5374] = 0 -- Mutilate T.aoespam[86392] = 3 -- Main Gauche T.aoespam[57841] = 3 -- Killing Spree T.aoespam[1943] = 5 -- Rupture T.aoespam[152150] = 3 -- Death from Above T.aoespam[114014] = 3 -- Shuriken Toss T.aoespam[319175] = 3 -- Black Powder T.aoespam[279043] = 3 -- Shadow Blades T.aoespam[315585] = 3 -- Instant Poison T.aoespam[358126] = 3 -- Banshee's Blight [Edge of Night, Dagger] T.merge[27576] = 5374 -- Mutilate Off-Hand T.merge[113780] = 2818 -- Deadly Poison T.merge[57842] = 57841 -- Killing Spree Off-Hand T.aoespam[324073] = 3 -- Serrated Bone Spike (Necrolord) T.merge[328547] = 324073 -- Serrated Bone Spike (Necrolord) T.merge[341277] = 324073 -- Serrated Bone Spike (Necrolord) end elseif T.class == "SHAMAN" then if C.combattext.merge_aoe_spam then -- Healing spells T.aoespam[197997] = 1 -- Wellspring T.aoespam[73921] = 5 -- Healing Rain T.aoespam[52042] = 5 -- Healing Stream Totem T.aoespam[1064] = 3 -- Chain Heal T.aoespam[61295] = 6 -- Riptide T.aoespam[98021] = 3 -- Spirit Link T.aoespam[114911] = 3 -- Ancestral Guidance T.aoespam[114942] = 3 -- Healing Tide T.aoespam[114083] = 3 -- Restorative Mists T.aoespam[157503] = 1 -- Cloudburst T.aoespam[209069] = 6 -- Tidal Totem T.aoespam[208899] = 6 -- Queen's Decree T.aoespam[207778] = 1 -- Gift of the Queen -- Damaging spells T.aoespam[273324] = 5 -- Lightning Shield T.aoespam[197214] = 1 -- Sundering T.aoespam[268429] = 4.5 -- Searing Assault T.aoespam[191726] = 4 -- Lightning Blast T.aoespam[205533] = 7 -- Volcanic Inferno T.aoespam[198485] = 3 -- Thunder Bite T.aoespam[198483] = 1 -- Snowstorm T.aoespam[224125] = 4 -- Fiery Jaws T.aoespam[198480] = 1 -- Fire Nova T.aoespam[199116] = 4 -- Doom Vortex T.aoespam[188443] = 1 -- Chain Lightning T.merge[45297] = 188443 -- Chain Lightning Overload T.aoespam[77478] = 3 -- Earhquake T.aoespam[51490] = 0 -- Thunderstorm T.aoespam[8187] = 3 -- Magma Totem T.aoespam[188389] = 4 -- Flame Shock T.aoespam[25504] = 3 -- Windfury Attack T.aoespam[10444] = 3 -- Flametongue Attack T.aoespam[3606] = 3 -- Searing Bolt T.aoespam[170379] = 3 -- Molten Earth T.aoespam[114074] = 1 -- Lava Beam T.aoespam[32175] = 0 -- Stormstrike T.merge[32176] = 32175 -- Stormstrike Off-Hand T.aoespam[114089] = 3 -- Windlash T.merge[114093] = 114089 -- Windlash Off-Hand T.aoespam[115357] = 0 -- Windstrike T.merge[115360] = 115357 -- Windstrike Off-Hand T.aoespam[192231] = 3 -- Liquid Magma T.aoespam[157331] = 3 -- Wind Gust T.aoespam[187874] = 1 -- Crash Lightning T.aoespam[195592] = 1 -- Crash Lightning end elseif T.class == "WARLOCK" then if C.combattext.merge_aoe_spam then T.aoespam[278350] = 4 -- Vile Taint T.aoespam[196278] = 1 -- Implosion T.aoespam[265931] = 5 -- Conflagrate DoT T.aoespam[234153] = 5 -- Drain Life T.aoespam[196657] = 5 -- Shadow Bolt (Dimensional Rift) T.aoespam[187394] = 5 -- Chaos Barrage (Dimensional Rift) T.aoespam[243050] = 5 -- Searing Bolt (Dimensional Rift) T.aoespam[196100] = 1 -- Demonic Power T.aoespam[196448] = 3 -- Channel Demonfire T.aoespam[199581] = 1 -- Soul Flame T.aoespam[29722] = 1 -- Incinirate (Fire and Brimstone) T.aoespam[27243] = 3 -- Seed of Corruption T.aoespam[27285] = 3 -- Seed of Corruption (AoE) T.aoespam[146739] = 3 -- Corruption T.aoespam[316099] = 3 -- Unstable Affliction T.aoespam[348] = 4 -- Immolate T.aoespam[980] = 3 -- Agony T.aoespam[63106] = 3 -- Siphon Life T.aoespam[205246] = 3 -- Phantom Singularity T.merge[205179] = 205246 -- Phantom Singularity T.aoespam[80240] = 3 -- Havoc T.aoespam[42223] = 3 -- Rain of Fire T.aoespam[198590] = 3 -- Drain Soul T.aoespam[86040] = 3 -- Hand of Gul'dan T.aoespam[205181] = 3 -- Shadowflame T.aoespam[30213] = 3 -- Legion Strike (Felguard) T.aoespam[89753] = 3 -- Felstorm (Felguard) T.aoespam[20153] = 3 -- Immolation (Infrenal) T.aoespam[22703] = 0 -- Infernal Awakening T.aoespam[171017] = 0 -- Meteor Strike (Infrenal) T.aoespam[104318] = 3 -- Fel Firebolt T.aoespam[3110] = 3 -- Firebolt (Imp) T.aoespam[152108] = 1 -- Cataclysm T.aoespam[171018] = 1 -- Meteor Strike T.aoespam[85692] = 3 -- Doom Bolt (Doomguard) T.aoespam[54049] = 3 -- Shadow Bite (Felhunter) T.aoespam[6262] = 3 -- Healthstone T.aoespam[3716] = 3 -- Torment (Voidwalker) T.merge[157736] = 348 -- Immolate (DoT) T.aoespam[312321] = 4 -- Scouring Tithe (Covenant Kyrian) T.aoespam[325640] = 3 -- Soul Rot (Covenant Night Fae) T.aoespam[327059] = 0.5 -- Decimating Bolt (Covenant Necrolord) T.aoespam[322167] = 2 -- Impending Catastrophe (Covenant Venthyr) T.aoespam[322170] = 3 -- Impending Catastrophe DoT (Covenant Venthyr) end if C.combattext.healing then T.healfilter[198590] = true -- Drain Soul T.healfilter[205246] = true -- Phantom Singularity T.healfilter[205179] = true -- Phantom Singularity T.healfilter[63106] = true -- Siphon Life T.healfilter[108359] = true -- Dark Regeneration end elseif T.class == "WARRIOR" then if C.combattext.merge_aoe_spam then T.aoespam[845] = 0.5 -- Cleave (Arms) T.aoespam[202147] = 5 -- Second Wind (Arms Talent Heal) T.aoespam[260643] = 0.5 -- Skullsplitter (Sweeping Strikes) T.aoespam[167105] = 0.5 -- Colossus Smash (Sweeping Strikes) T.aoespam[260798] = 0.5 -- Execute Arms (Sweeping Strikes) T.aoespam[7384] = 0.5 -- Overpower (Sweeping Strikes) T.aoespam[315961] = 0.5 -- Dreadnaught (Arms Talent) T.aoespam[1464] = 0.5 -- Slam (Sweeping Strikes) T.aoespam[12294] = 0.5 -- Mortal Strike (Sweeping Strikes) T.aoespam[262115] = 3 -- Deep Wounds (Arms Mastery DoT) T.aoespam[262161] = 1 -- Warbreaker (Arms Talent) T.aoespam[199658] = 1.5 -- Whirlwind (Arms) T.merge[199850] = 199658 -- Whirlwind (Arms) T.aoespam[280772] = 1 -- Siegebreaker (Fury Talent) T.aoespam[218617] = 2 -- Rampage T.merge[184707] = 218617 -- Rampage 2nd T.merge[184709] = 218617 -- Rampage 3rd T.merge[201364] = 218617 -- Rampage 4th T.merge[201363] = 218617 -- Rampage 5th T.aoespam[199667] = 1.5 -- Whirlwind (Fury) T.merge[44949] = 199667 -- Whirlwind Off-Hand (Fury) T.merge[199851] = 199667 -- Whirlwind Off-Hand (Fury) T.merge[199852] = 199667 -- Whirlwind Off-Hand (Fury) T.aoespam[46968] = 0 -- Shockwave T.aoespam[6343] = 0 -- Thunder Clap T.aoespam[115767] = 3 -- Deep Wounds T.aoespam[50622] = 3 -- Bladestorm T.aoespam[52174] = 0 -- Heroic Leap T.aoespam[118000] = 0 -- Dragon Roar T.aoespam[96103] = 0.5 -- Raging Blow T.aoespam[6572] = 0 -- Revenge T.aoespam[280849] = 0.25 -- Execute T.aoespam[772] = 3 -- Rend T.aoespam[156287] = 3 -- Ravager T.aoespam[23881] = 0 -- Bloodthirst T.merge[85384] = 96103 -- Raging Blow Off-Hand T.merge[95738] = 50622 -- Bladestorm Off-Hand T.merge[163558] = 280849 -- Execute Off-Hand T.aoespam[317488] = 0.5 -- Condemn (Covenant Venthyr) T.merge[317489] = 317488 -- Condemn Off-Hand (Fury) (Covenant Venthyr) T.aoespam[307871] = 2 -- Spear of Bastion (Covenant Kyrian) T.aoespam[325886] = 0 -- Ancient Aftershock (Covenant Night Fae) T.aoespam[326062] = 0 -- Ancient Aftershock Second (Covenant Night Fae) end if C.combattext.healing then T.healfilter[117313] = true -- Bloodthirst Heal end end ================================================ FILE: ShestakUI/Config/Filters/Cooldowns.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Rebirth -> http://www.wowhead.com/spell=20484 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- if C.raidcooldown.enable == true then T.raid_spells = { -- Battle resurrection {20484, 600}, -- Rebirth {61999, 600}, -- Raise Ally {20707, 600}, -- Soulstone {391054, 600}, -- Intercession {345130, 600}, -- Disposable Spectrophasic Reanimator -- Heroism {32182, 300}, -- Heroism {2825, 300}, -- Bloodlust {80353, 300}, -- Time Warp {390386, 300}, -- Fury of the Aspects {264667, 300}, -- Primal Rage {Hunter's pet] -- Healing {633, 600}, -- Lay on Hands {740, 180}, -- Tranquility {115310, 180}, -- Revival {64843, 180}, -- Divine Hymn {108280, 180}, -- Healing Tide Totem {15286, 120}, -- Vampiric Embrace {108281, 120}, -- Ancestral Guidance -- Defense {207399, 300}, -- Ancestral Protection Totem {62618, 180}, -- Power Word: Barrier {33206, 180}, -- Pain Suppression {47788, 180}, -- Guardian Spirit {31821, 180}, -- Aura Mastery {98008, 180}, -- Spirit Link Totem {97462, 180}, -- Rallying Cry {196718, 180}, -- Darkness {51052, 120}, -- Anti-Magic Zone {116849, 120}, -- Life Cocoon {6940, 120}, -- Blessing of Sacrifice {102342, 90}, -- Ironbark -- Other {106898, 120}, -- Stampeding Roar {192077, 120}, -- Wind Rush Totem } if #C.raidcooldown.spells_list > 0 then -- Sync spell list with new changes if not C.options.raidcooldown.spells_list_ver or C.options.raidcooldown.spells_list_ver < 3 then tinsert(C.raidcooldown.spells_list, {390386, 300}) tinsert(C.raidcooldown.spells_list, {391054, 600}) C.options.raidcooldown.spells_list_ver = 3 end T.raid_spells = C.raidcooldown.spells_list else if C.options.raidcooldown and C.options.raidcooldown.spells_list then C.options.raidcooldown.spells_list = nil end end T.RaidSpells = {} for _, spell in pairs(T.raid_spells) do T.RaidSpells[spell[1]] = spell[2] end end if C.enemycooldown.enable == true then T.enemy_spells = { -- Interrupts and Silences {57994, 12}, -- Wind Shear {47528, 15}, -- Mind Freeze {183752, 15}, -- Disrupt {106839, 15}, -- Skull Bash {187707, 15}, -- Muzzle {116705, 15}, -- Spear Hand Strike {96231, 15}, -- Rebuke {1766, 15}, -- Kick {6552, 15}, -- Pummel {147362, 24}, -- Counter Shot {2139, 24}, -- Counterspell {19647, 24}, -- Spell Lock {115781, 24}, -- Optical Blast {351338, 40}, -- Quell {15487, 45}, -- Silence {47476, 60}, -- Strangulate {78675, 60}, -- Solar Beam -- Crowd Controls {20066, 15}, -- Repentance {51514, 20}, -- Hex {187650, 25}, -- Freezing Trap {115078, 30}, -- Paralysis {8122, 30}, -- Psychic Scream {107570, 30}, -- Storm Bolt {5484, 40}, -- Howl of Terror {30283, 45}, -- Shadowfury {108194, 45}, -- Asphyxiate {113724, 45}, -- Ring of Frost {64044, 45}, -- Psychic Horror {6789, 45}, -- Mortal Coil {119381, 50}, -- Leg Sweep {853, 60}, -- Hammer of Justice -- Defense abilities {48707, 60}, -- Anti-Magic Shell {46924, 60}, -- Bladestorm {49039, 120}, -- Lichborne {31224, 120}, -- Cloak of Shadows {47585, 120}, -- Dispersion {1856, 120}, -- Vanish {7744, 120}, -- Will of the Forsaken (Racial) {186265, 180}, -- Aspect of the Turtle {33206, 180}, -- Pain Suppression } if #C.enemycooldown.spells_list > 0 then -- Sync spell list with new changes if not C.options.enemycooldown.spells_list_ver or C.options.enemycooldown.spells_list_ver < 2 then --BETA for i, spell in pairs(C.enemycooldown.spells_list) do -- if spell[1] == 51514 then -- spell[2] = 20 -- elseif spell[1] == 187650 then -- spell[2] = 25 -- elseif spell[1] == 115078 then -- spell[2] = 30 -- elseif spell[1] == 49039 then -- spell[2] = 120 -- elseif spell[1] == 31224 then -- spell[2] = 120 -- elseif spell[1] == 213664 or spell[1] == 19386 then -- tremove(C.enemycooldown.spells_list, i) -- end -- end -- tinsert(C.enemycooldown.spells_list, {351338, 40}) C.options.enemycooldown.spells_list_ver = 2 end T.enemy_spells = C.enemycooldown.spells_list else if C.options.enemycooldown and C.options.enemycooldown.spells_list then C.options.enemycooldown.spells_list = nil end end T.EnemySpells = {} for _, spell in pairs(T.enemy_spells) do T.EnemySpells[spell[1]] = spell[2] end end if C.pulsecooldown.enable == true then T.pulse_ignored_spells = { --GetSpellInfo(spellID), -- Spell name } end ================================================ FILE: ShestakUI/Config/Filters/Diminishing.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.unitframe.enable ~= true or C.unitframe.show_arena ~= true or C.unitframe.plugins_diminishing ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Sap -> http://www.wowhead.com/spell=6770 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- T.DiminishingSpells = { -- Stuns [210141] = {"stun"}, -- Zombie Explosion [334693] = {"stun"}, -- Absolute Zero (Breath of Sindragosa) [108194] = {"stun"}, -- Asphyxiate (Unholy) [221562] = {"stun"}, -- Asphyxiate (Blood) [91800] = {"stun"}, -- Gnaw (Ghoul) [91797] = {"stun"}, -- Monstrous Blow (Mutated Ghoul) [287254] = {"stun"}, -- Dead of Winter [179057] = {"stun"}, -- Chaos Nova [205630] = {"stun"}, -- Illidan's Grasp (Primary effect) [208618] = {"stun"}, -- Illidan's Grasp (Secondary effect) [211881] = {"stun"}, -- Fel Eruption [22570] = {"stun"}, -- Maim [163505] = {"stun"}, -- Rake (Prowl) [5211] = {"stun"}, -- Mighty Bash [202244] = {"stun"}, -- Overrun [325321] = {"stun"}, -- Wild Hunt's Charge [24394] = {"stun"}, -- Intimidation [119381] = {"stun"}, -- Leg Sweep [202346] = {"stun"}, -- Double Barrel [853] = {"stun"}, -- Hammer of Justice [255941] = {"stun"}, -- Wake of Ashes [64044] = {"stun"}, -- Psychic Horror [200200] = {"stun"}, -- Holy Word: Chastise Censure [1833] = {"stun"}, -- Cheap Shot [408] = {"stun"}, -- Kidney Shot [118905] = {"stun"}, -- Static Charge (Capacitor Totem) [118345] = {"stun"}, -- Pulverize (Primal Earth Elemental) [305485] = {"stun"}, -- Lightning Lasso [30283] = {"stun"}, -- Shadowfury [89766] = {"stun"}, -- Axe Toss (Felguard) [171017] = {"stun"}, -- Meteor Strike (Infernal) [171018] = {"stun"}, -- Meteor Strike (Abyssal) [46968] = {"stun"}, -- Shockwave [132168] = {"stun"}, -- Shockwave (Protection) [132169] = {"stun"}, -- Storm Bolt [199085] = {"stun"}, -- Warpath [20549] = {"stun"}, -- War Stomp (Tauren) [255723] = {"stun"}, -- Bull Rush (Highmountain Tauren) [287712] = {"stun"}, -- Haymaker (Kul Tiran) [332423] = {"stun"}, -- Sparkling Driftglobe Core -- Roots [204085] = {"root"}, -- Deathchill (Chains of Ice) [233395] = {"root"}, -- Deathchill (Remorseless Winter) [339] = {"root"}, -- Entangling Roots [170855] = {"root"}, -- Entangling Roots (Nature's Grasp) [102359] = {"root"}, -- Mass Entanglement [117526] = {"root"}, -- Binding Shot [162480] = {"root"}, -- Steel Trap [212638] = {"root"}, -- Tracker's Net [201158] = {"root"}, -- Super Sticky Tar [122] = {"root"}, -- Frost Nova [33395] = {"root"}, -- Freeze [198121] = {"root"}, -- Frostbite [233582] = {"root"}, -- Entrenched in Flame [116706] = {"root"}, -- Disable [324382] = {"root"}, -- Clash [64695] = {"root"}, -- Earthgrab (Totem effect) [285515] = {"root"}, -- Surge of Power -- Incapacitates [217832] = {"incapacitate"}, -- Imprison [221527] = {"incapacitate"}, -- Imprison (Honor talent) [2637] = {"incapacitate"}, -- Hibernate [99] = {"incapacitate"}, -- Incapacitating Roar [3355] = {"incapacitate"}, -- Freezing Trap [203337] = {"incapacitate"}, -- Freezing Trap (Honor talent) [209790] = {"incapacitate"}, -- Freezing Arrow [213691] = {"incapacitate"}, -- Scatter Shot [118] = {"incapacitate"}, -- Polymorph [28271] = {"incapacitate"}, -- Polymorph (Turtle) [28272] = {"incapacitate"}, -- Polymorph (Pig) [61025] = {"incapacitate"}, -- Polymorph (Snake) [61305] = {"incapacitate"}, -- Polymorph (Black Cat) [61721] = {"incapacitate"}, -- Polymorph (Rabbit) [61780] = {"incapacitate"}, -- Polymorph (Turkey) [126819] = {"incapacitate"}, -- Polymorph (Porcupine) [161353] = {"incapacitate"}, -- Polymorph (Polar Bear Cub) [161354] = {"incapacitate"}, -- Polymorph (Monkey) [161355] = {"incapacitate"}, -- Polymorph (Penguin) [161372] = {"incapacitate"}, -- Polymorph (Peacock) [277787] = {"incapacitate"}, -- Polymorph (Baby Direhorn) [277792] = {"incapacitate"}, -- Polymorph (Bumblebee) [82691] = {"incapacitate"}, -- Ring of Frost [115078] = {"incapacitate"}, -- Paralysis [20066] = {"incapacitate"}, -- Repentance [9484] = {"incapacitate"}, -- Shackle Undead [200196] = {"incapacitate"}, -- Holy Word: Chastise [1776] = {"incapacitate"}, -- Gouge [6770] = {"incapacitate"}, -- Sap [199743] = {"incapacitate"}, -- Parley [51514] = {"incapacitate"}, -- Hex [196942] = {"incapacitate"}, -- Hex (Voodoo Totem) [210873] = {"incapacitate"}, -- Hex (Raptor) [211004] = {"incapacitate"}, -- Hex (Spider) [211010] = {"incapacitate"}, -- Hex (Snake) [211015] = {"incapacitate"}, -- Hex (Cockroach) [269352] = {"incapacitate"}, -- Hex (Skeletal Hatchling) [309328] = {"incapacitate"}, -- Hex (Living Honey) [277778] = {"incapacitate"}, -- Hex (Zandalari Tendonripper) [277784] = {"incapacitate"}, -- Hex (Wicker Mongrel) [197214] = {"incapacitate"}, -- Sundering [6789] = {"incapacitate"}, -- Mortal Coil [107079] = {"incapacitate"}, -- Quaking Palm (Pandaren) -- Disorients [207167] = {"disorient"}, -- Blinding Sleet [207685] = {"disorient"}, -- Sigil of Misery [33786] = {"disorient"}, -- Cyclone [1513] = "disorient", -- Scare Beast [31661] = {"disorient"}, -- Dragon's Breath [198909] = {"disorient"}, -- Song of Chi-ji [202274] = {"disorient"}, -- Incendiary Brew [105421] = {"disorient"}, -- Blinding Light [10326] = {"disorient"}, -- Turn Evil (For Lichborne?) [605] = {"disorient"}, -- Mind Control [8122] = {"disorient"}, -- Psychic Scream [226943] = {"disorient"}, -- Mind Bomb [2094] = {"disorient"}, -- Blind [118699] = {"disorient"}, -- Fear [5484] = {"disorient"}, -- Howl of Terror [6358] = {"disorient"}, -- Seduction (Succubus) [261589] = {"disorient"}, -- Seduction (Grimoire of Sacrifice) [5246] = {"disorient"}, -- Intimidating Shout [331866] = {"disorient"}, -- Agent of Chaos (Venthyr Covenant) -- Silences [47476] = {"silence"}, -- Strangulate [204490] = {"silence"}, -- Sigil of Silence [202933] = {"silence"}, -- Spider Sting [217824] = {"silence"}, -- Shield of Virtue [199683] = {"silence"}, -- Last Word [15487] = {"silence"}, -- Silence [1330] = {"silence"}, -- Garrote [196364] = {"silence"}, -- Unstable Affliction Silence Effect } local function GetIcon(id) local _, _, icon = GetSpellInfo(id) return icon end T.DiminishingIcons = { ["stun"] = GetIcon(408), ["root"] = GetIcon(122), ["incapacitate"] = GetIcon(118), ["disorient"] = GetIcon(8122), ["silence"] = GetIcon(15487), } ================================================ FILE: ShestakUI/Config/Filters/Errors.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.general.error_filter ~= "WHITELIST" and C.general.error_filter ~= "BLACKLIST" then return end ---------------------------------------------------------------------------------------- -- All errors on http://wowwiki.wikia.com/wiki/WoW_Constants/Errors ---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- -- White list errors, that will not be hidden ---------------------------------------------------------------------------------------- T.white_list = { [ERR_INV_FULL] = true, [ERR_QUEST_LOG_FULL] = true, [ERR_ITEM_MAX_COUNT] = true, [ERR_NOT_ENOUGH_MONEY] = true, [SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED] = true, [ERR_LOOT_MASTER_INV_FULL] = true, [ERR_LOOT_MASTER_OTHER] = true, [ERR_LOOT_MASTER_UNIQUE_ITEM] = true, } ---------------------------------------------------------------------------------------- -- Black list errors, that will be hidden ---------------------------------------------------------------------------------------- T.black_list = { [SPELL_FAILED_NO_COMBO_POINTS] = true, [SPELL_FAILED_TARGETS_DEAD] = true, [SPELL_FAILED_SPELL_IN_PROGRESS] = true, [SPELL_FAILED_TARGET_AURASTATE] = true, [SPELL_FAILED_CASTER_AURASTATE] = true, [SPELL_FAILED_NO_ENDURANCE] = true, [SPELL_FAILED_BAD_TARGETS] = true, [SPELL_FAILED_NOT_MOUNTED] = true, [SPELL_FAILED_NOT_ON_TAXI] = true, [SPELL_FAILED_NOT_INFRONT] = true, [SPELL_FAILED_NOT_IN_CONTROL] = true, [SPELL_FAILED_MOVING] = true, [SPELL_FAILED_AURA_BOUNCED] = true, [SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW] = true, [SPELL_FAILED_AFFECTING_COMBAT] = true, [ERR_ATTACK_FLEEING] = true, [ERR_ITEM_COOLDOWN] = true, [ERR_GENERIC_NO_TARGET] = true, [ERR_ABILITY_COOLDOWN] = true, [ERR_NO_ATTACK_TARGET] = true, [ERR_SPELL_COOLDOWN] = true, [ERR_OUT_OF_ARCANE_CHARGES] = true, [ERR_OUT_OF_BALANCE_NEGATIVE] = true, [ERR_OUT_OF_BALANCE_POSITIVE] = true, [ERR_OUT_OF_BURNING_EMBERS] = true, [ERR_OUT_OF_CHI] = true, [ERR_OUT_OF_DARK_FORCE] = true, [ERR_OUT_OF_DEMONIC_FURY] = true, [ERR_OUT_OF_FURY] = true, [ERR_OUT_OF_PAIN] = true, [ERR_OUT_OF_SOUL_SHARDS] = true, [ERR_OUT_OF_LIGHT_FORCE] = true, [ERR_OUT_OF_SHADOW_ORBS] = true, [ERR_OUT_OF_HOLY_POWER] = true, [ERR_OUT_OF_ENERGY] = true, [ERR_OUT_OF_RAGE] = true, [ERR_OUT_OF_FOCUS] = true, [ERR_OUT_OF_RUNES] = true, [ERR_OUT_OF_RUNIC_POWER] = true, [ERR_OUT_OF_MANA] = true, [ERR_OUT_OF_POWER_DISPLAY] = true, [ERR_OUT_OF_RANGE] = true, [ERR_BADATTACKPOS] = true, [ERR_INVALID_ATTACK_TARGET] = true, [ERR_NOEMOTEWHILERUNNING] = true, [ERR_NOT_EQUIPPABLE] = true, [ERR_NOT_IN_COMBAT] = true, [ERR_MAIL_DATABASE_ERROR] = true, [OUT_OF_POWER_DISPLAY] = true, [OUT_OF_ENERGY] = true, [OUT_OF_FOCUS] = true, [OUT_OF_MANA] = true, [OUT_OF_POWER_DISPLAY] = true, [OUT_OF_RAGE] = true, [ERR_SPELL_OUT_OF_RANGE] = true, [ERR_TOO_FAR_TO_INTERACT] = true, } ================================================ FILE: ShestakUI/Config/Filters/FilgerSpells.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.unitframe.enable ~= true or C.filger.enable ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Renew -> http://www.wowhead.com/spell=139 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- P_BUFF_ICON_Anchor = CreateFrame("Frame", "P_BUFF_ICON_Anchor", UIParent) P_PROC_ICON_Anchor = CreateFrame("Frame", "P_PROC_ICON_Anchor", UIParent) SPECIAL_P_BUFF_ICON_Anchor = CreateFrame("Frame", "SPECIAL_P_BUFF_ICON_Anchor", UIParent) T_DEBUFF_ICON_Anchor = CreateFrame("Frame", "T_DEBUFF_ICON_Anchor", UIParent) T_BUFF_Anchor = CreateFrame("Frame", "T_BUFF_Anchor", UIParent) PVE_PVP_DEBUFF_Anchor = CreateFrame("Frame", "PVE_PVP_DEBUFF_Anchor", UIParent) PVE_PVP_CC_Anchor = CreateFrame("Frame", "PVE_PVP_CC_Anchor", UIParent) COOLDOWN_Anchor = CreateFrame("Frame", "COOLDOWN_Anchor", UIParent) T_DE_BUFF_BAR_Anchor = CreateFrame("Frame", "T_DE_BUFF_BAR_Anchor", UIParent) C["filger_spells"] = { ["DEATHKNIGHT"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Empower Rune Weapon {spellID = 47568, unitID = "player", caster = "player", filter = "BUFF"}, -- Death's Advance {spellID = 48265, unitID = "player", caster = "player", filter = "BUFF"}, -- Remorseless Winter {spellID = 196770, unitID = "player", caster = "player", filter = "BUFF"}, -- Hungering Rune Weapon {spellID = 207127, unitID = "player", caster = "player", filter = "BUFF"}, -- Bone Shield {spellID = 195181, unitID = "player", caster = "player", filter = "BUFF"}, -- Vampiric Blood {spellID = 55233, unitID = "player", caster = "player", filter = "BUFF"}, -- Icebound Fortitude {spellID = 48792, unitID = "player", caster = "player", filter = "BUFF"}, -- Anti-Magic Shell {spellID = 48707, unitID = "player", caster = "player", filter = "BUFF"}, -- Dancing Rune Weapon {spellID = 81256, unitID = "player", caster = "player", filter = "BUFF"}, -- Lichborne {spellID = 287081, unitID = "player", caster = "player", filter = "BUFF"}, -- Rune Tap {spellID = 194679, unitID = "player", caster = "player", filter = "BUFF"}, -- Pillar of Frost {spellID = 51271, unitID = "player", caster = "player", filter = "BUFF"}, -- Desecrated Ground {spellID = 115018, unitID = "player", caster = "player", filter = "BUFF"}, -- Unholy Blight {spellID = 115989, unitID = "player", caster = "player", filter = "BUFF"}, -- Summon Gargoyle {spellID = 49206, filter = "ICD", trigger = "NONE", duration = 30}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Icy Talons {spellID = 194879, unitID = "player", caster = "player", filter = "BUFF"}, -- Crimson Scourge {spellID = 81141, unitID = "player", caster = "player", filter = "BUFF"}, -- Freezing Fog {spellID = 59052, unitID = "player", caster = "player", filter = "BUFF"}, -- Killing Machine {spellID = 51124, unitID = "player", caster = "player", filter = "BUFF"}, -- Sudden Doom {spellID = 81340, unitID = "player", caster = "player", filter = "BUFF"}, -- Unholy Strength {spellID = 53365, unitID = "player", caster = "player", filter = "BUFF"}, -- Dark Transformation {spellID = 63560, unitID = "pet", caster = "player", filter = "BUFF"}, }, -- { -- Name = "T_DEBUFF_ICON", -- Direction = "RIGHT", -- Mode = "ICON", -- Interval = C.filger.buffs_space, -- Alpha = 1, -- IconSize = C.filger.buffs_size, -- Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- }, { Name = "T_DE/BUFF_BAR", Direction = "UP", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 186, Position = {"LEFT", T_DE_BUFF_BAR_Anchor}, -- Festering Wound {spellID = 194310, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Virulent Plague {spellID = 191587, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Blood Plague {spellID = 55078, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Frost Fever {spellID = 55095, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Apocalypse {spellID = 220143, filter = "CD"}, -- Sindragosa's Fury {spellID = 190778, filter = "CD"}, -- Consumption {spellID = 205223, filter = "CD"}, -- Bonestorm {spellID = 194844, filter = "CD"}, -- Asphyxiate {spellID = 221562, filter = "CD"}, -- Blinding Sleet {spellID = 207167, filter = "CD"}, -- Hungering Rune Weapon {spellID = 207127, filter = "CD"}, -- Mind Freeze {spellID = 47528, filter = "CD"}, -- Strangulate {spellID = 47476, filter = "CD"}, -- Gnaw (Ghoul) {spellID = 47481, filter = "CD"}, -- Remorseless Winter {spellID = 196770, filter = "CD"}, -- Dark Simulacrum {spellID = 77606, filter = "CD"}, -- Death Grip {spellID = 49576, filter = "CD"}, -- Plague Leech {spellID = 123693, filter = "CD"}, -- Death and Decay {spellID = 43265, filter = "CD"}, -- Rune Tap {spellID = 194679, filter = "CD"}, -- Anti-Magic Shell {spellID = 48707, filter = "CD"}, -- Blood Tap {spellID = 221699, filter = "CD"}, -- Vampiric Blood {spellID = 55233, filter = "CD"}, -- Pillar of Frost {spellID = 51271, filter = "CD"}, -- Outbreak {spellID = 77575, filter = "CD"}, -- Gorefiend's Grasp {spellID = 108199, filter = "CD"}, -- Raise Dead {spellID = 46584, filter = "CD"}, -- Dancing Rune Weapon {spellID = 49028, filter = "CD"}, -- Unholy Blight {spellID = 115989, filter = "CD"}, -- Breath of Sindragosa {spellID = 152279, filter = "CD"}, -- Lichborne {spellID = 287081, filter = "CD"}, -- Desecrated Ground {spellID = 108201, filter = "CD"}, -- Death Pact {spellID = 48743, filter = "CD"}, -- Anti-Magic Zone {spellID = 51052, filter = "CD"}, -- Icebound Fortitude {spellID = 48792, filter = "CD"}, -- Summon Gargoyle {spellID = 49206, filter = "CD"}, }, }, ["DEMONHUNTER"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Metamorphosis {spellID = 187827, unitID = "player", caster = "player", filter = "BUFF"}, -- Immolation Aura {spellID = 258920, unitID = "player", caster = "player", filter = "BUFF"}, -- Demon Spikes {spellID = 203720, unitID = "player", caster = "player", filter = "BUFF"}, -- Soul Barrier {spellID = 263648, unitID = "player", caster = "player", filter = "BUFF"}, -- Blur {spellID = 212800, unitID = "player", caster = "player", filter = "BUFF"}, -- Netherwalk {spellID = 196555, unitID = "player", caster = "player", filter = "BUFF"}, -- Nether Bond {spellID = 207810, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Soul Fragments {spellID = 203981, unitID = "player", caster = "player", filter = "BUFF"}, -- Momentum {spellID = 208628, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Dark Slash {spellID = 258860, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Nemesis {spellID = 206491, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Sigil of Flame {spellID = 204598, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Sigil of Silence {spellID = 204490, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Sigil of Misery {spellID = 207685, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Sigil of Grasp {spellID = 204843, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Fiery Brand {spellID = 207744, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Frailty {spellID = 224509, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Bloodlet {spellID = 207690, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "T_DE/BUFF_BAR", Direction = "UP", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 186, Position = {"LEFT", T_DE_BUFF_BAR_Anchor}, -- Darkness {spellID = 209426, unitID = "target", caster = "player", filter = "BUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Imprison {spellID = 217832, unitID = "focus", caster = "all", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Consume Magic {spellID = 183752, filter = "CD"}, -- Fel Rush {spellID = 195072, filter = "CD", absID = true}, -- Infernal Strike {spellID = 189110, filter = "CD"}, -- Torment {spellID = 185245, filter = "CD"}, -- Demon Spikes {spellID = 203720, filter = "CD"}, -- Immolation Aura {spellID = 258920, filter = "CD"}, -- Felblade {spellID = 213241, filter = "CD"}, -- Throw Glaive {spellID = 185123, filter = "CD"}, -- Soul Barrier {spellID = 263648, filter = "CD"}, -- Blade Dance {spellID = 188499, filter = "CD"}, -- Fel Barrage {spellID = 211053, filter = "CD"}, -- Vengeful Retreat {spellID = 198793, filter = "CD", absID = true}, -- Sigil of Silence {spellID = 202137, filter = "CD"}, -- Sigil of Misery {spellID = 207684, filter = "CD"}, -- Spectral Sight {spellID = 188501, filter = "CD"}, -- Fiery Brand {spellID = 204021, filter = "CD"}, -- Eye Beam {spellID = 198013, filter = "CD", absID = true}, -- Chaos Nova {spellID = 179057, filter = "CD", absID = true}, -- Sigil of Chains {spellID = 202138, filter = "CD"}, -- Fel Eruption {spellID = 211881, filter = "CD"}, -- Fel Devastation {spellID = 212084, filter = "CD"}, -- Nether Bond {spellID = 207810, filter = "CD"}, -- Demonic Infusion {spellID = 236189, filter = "CD"}, -- Blur {spellID = 198589, filter = "CD"}, -- Netherwalk {spellID = 196555, filter = "CD"}, -- Nemesis {spellID = 206491, filter = "CD"}, -- Metamorphosis {spellID = 187827, filter = "CD"}, -- Darkness {spellID = 196718, filter = "CD"}, }, }, ["DRUID"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Incarnation: Chosen of Elune {spellID = 102560, unitID = "player", caster = "player", filter = "BUFF"}, -- Incarnation: King of the Jungle {spellID = 102543, unitID = "player", caster = "player", filter = "BUFF"}, -- Incarnation: Son of Ursoc {spellID = 102558, unitID = "player", caster = "player", filter = "BUFF"}, -- Incarnation: Tree of Life {spellID = 117679, unitID = "player", caster = "player", filter = "BUFF"}, -- Survival Instincts {spellID = 61336, unitID = "player", caster = "player", filter = "BUFF"}, -- Barkskin {spellID = 22812, unitID = "player", caster = "player", filter = "BUFF"}, -- Savage Roar {spellID = 52610, unitID = "player", caster = "player", filter = "BUFF"}, -- Berserk {spellID = 106951, unitID = "player", caster = "player", filter = "BUFF", absID = true}, -- Tiger's Fury {spellID = 5217, unitID = "player", caster = "player", filter = "BUFF"}, -- Celestial Alignment {spellID = 194223, unitID = "player", caster = "player", filter = "BUFF"}, -- Nature's Vigil {spellID = 124974, unitID = "player", caster = "player", filter = "BUFF"}, -- Rage of the Sleeper {spellID = 200851, unitID = "player", caster = "player", filter = "BUFF"}, -- Ironfur {spellID = 192081, unitID = "player", caster = "player", filter = "BUFF"}, -- Nature's Grasp {spellID = 170856, unitID = "player", caster = "player", filter = "BUFF"}, -- Dash {spellID = 1850, unitID = "player", caster = "player", filter = "BUFF"}, -- Starfall {spellID = 191034, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Warrior of Elune {spellID = 202425, unitID = "player", caster = "player", filter = "BUFF"}, -- Starlord {spellID = 279709, unitID = "player", caster = "player", filter = "BUFF"}, -- Bloodtalons {spellID = 145152, unitID = "player", caster = "player", filter = "BUFF"}, -- Clearcasting {spellID = 16870, unitID = "player", caster = "player", filter = "BUFF"}, -- Soul of the Forest {spellID = 114108, unitID = "player", caster = "player", filter = "BUFF"}, -- Predatory Swiftness {spellID = 69369, unitID = "player", caster = "player", filter = "BUFF"}, -- Guardian of Elune {spellID = 213680, unitID = "player", caster = "player", filter = "BUFF"}, -- Eclipse (Solar) {spellID = 48517, unitID = "player", caster = "player", filter = "BUFF"}, -- Eclipse (Lunar) {spellID = 48518, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Moonfire {spellID = 164812, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Sunfire {spellID = 164815, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Stellar Flare {spellID = 202347, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Ashmane's Frenzy {spellID = 210722, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Rake {spellID = 155722, unitID = "target", caster = "player", filter = "DEBUFF", absID = true}, -- Rip {spellID = 1079, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Thrash {spellID = 77758, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Immobilized {spellID = 45334, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "T_DE/BUFF_BAR", Direction = "UP", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 186, Position = {"LEFT", T_DE_BUFF_BAR_Anchor}, -- Lifebloom {spellID = 33763, unitID = "target", caster = "player", filter = "BUFF"}, -- Rejuvenation {spellID = 774, unitID = "target", caster = "player", filter = "BUFF"}, -- Rejuvenation (Germination) {spellID = 155777, unitID = "target", caster = "player", filter = "BUFF"}, -- Regrowth {spellID = 8936, unitID = "target", caster = "player", filter = "BUFF"}, -- Wild Growth {spellID = 48438, unitID = "target", caster = "player", filter = "BUFF"}, -- Cenarion Ward {spellID = 102351, unitID = "target", caster = "player", filter = "BUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Cyclone {spellID = 33786, unitID = "focus", caster = "all", filter = "DEBUFF"}, -- Entangling Roots {spellID = 339, unitID = "focus", caster = "all", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Nature's Cure {spellID = 88423, filter = "CD"}, -- Remove Corruption {spellID = 2782, filter = "CD"}, -- Soothe {spellID = 2908, filter = "CD"}, -- Skull Bash {spellID = 106839, filter = "CD"}, -- Mangle {spellID = 33917, filter = "CD"}, -- Wild Growth {spellID = 48438, filter = "CD"}, -- Swiftmend {spellID = 18562, filter = "CD"}, -- Growl {spellID = 6795, filter = "CD"}, -- Maim {spellID = 22570, filter = "CD"}, -- Starsurge {spellID = 78674, filter = "CD"}, -- Wild Charge {spellID = 102401, filter = "CD"}, -- Force of Nature {spellID = 205636, filter = "CD"}, -- Tiger's Fury {spellID = 5217, filter = "CD"}, -- Cenarion Ward {spellID = 102351, filter = "CD"}, -- Frenzied Regeneration {spellID = 22842, filter = "CD"}, -- Incapacitating Roar {spellID = 99, filter = "CD"}, -- Bristling Fur {spellID = 155835, filter = "CD"}, -- Mass Entanglement {spellID = 102359, filter = "CD"}, -- Typhoon {spellID = 132469, filter = "CD"}, -- Mighty Bash {spellID = 5211, filter = "CD"}, -- Solar Beam {spellID = 78675, filter = "CD"}, -- Barkskin {spellID = 22812, filter = "CD"}, -- Ironbark {spellID = 102342, filter = "CD"}, -- Ursol's Vortex {spellID = 102793, filter = "CD"}, -- Nature's Vigil {spellID = 124974, filter = "CD"}, -- Flourish {spellID = 197721, filter = "CD"}, -- Renewal {spellID = 108238, filter = "CD"}, -- Berserk {spellID = 106951, filter = "CD", absID = true}, -- Ashmane's Frenzy {spellID = 210722, filter = "CD"}, -- Incarnation: Chosen of Elune {spellID = 102560, filter = "CD"}, -- Incarnation: King of the Jungle {spellID = 102543, filter = "CD"}, -- Incarnation: Son of Ursoc {spellID = 102558, filter = "CD"}, -- Incarnation: Tree of Life {spellID = 33891, filter = "CD"}, }, }, ["EVOKER"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Tip the scales {spellID = 370553, unitID = "player", caster = "player", filter = "BUFF"}, -- Living Flame Healing {spellID = 361509, unitID = "player", caster = "player", filter = "BUFF"}, -- Obsidian Scales {spellID = 363916, unitID = "player", caster = "player", filter = "BUFF"}, -- Time Spiral {spellID = 375234, unitID = "player", caster = "player", filter = "BUFF"}, -- Renewing Blaze {spellID = 374348, unitID = "player", caster = "player", filter = "BUFF"}, -- Dragonrage {spellID = 375087, unitID = "player", caster = "player", filter = "BUFF"}, -- Hover {spellID = 358267, unitID = "player", caster = "player", filter = "BUFF"}, -- Deep Breath {spellID = 357210, unitID = "player", caster = "player", filter = "BUFF"}, -- Recall {spellID = 371807, unitID = "player", caster = "player", filter = "BUFF"}, -- Time Dilation {spellID = 357170, unitID = "player", caster = "player", filter = "BUFF"}, -- Time Stop (PVP Talent) {spellID = 378441, unitID = "player", caster = "player", filter = "BUFF"}, -- Echo {spellID = 364343, unitID = "player", caster = "player", filter = "BUFF"}, -- Reversion {spellID = 366155, unitID = "player", caster = "player", filter = "BUFF"}, -- Dream Flight {spellID = 363502, unitID = "player", caster = "player", filter = "BUFF"}, -- Dream Breath {spellID = 355941, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Snapfire {spellID = 370818, unitID = "player", caster = "player", filter = "BUFF"}, -- Essence Burst {spellID = 359618, unitID = "player", caster = "player", filter = "BUFF"}, -- Leaping Flames {spellID = 370901, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Living Flame [Damage] {spellID = 361500, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Living Flame [Healing] {spellID = 361509, unitID = "target", caster = "player", filter = "BUFF"}, -- Fire Breath {spellID = 357209, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Disintegrate {spellID = 356995, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Echo {spellID = 364343, unitID = "target", caster = "player", filter = "BUFF"}, -- Reversion {spellID = 366155, unitID = "target", caster = "player", filter = "BUFF"}, -- Dream Flight {spellID = 363502, unitID = "target", caster = "player", filter = "BUFF"}, -- Dream Breath {spellID = 355941, unitID = "target", caster = "player", filter = "BUFF"}, }, { Name = "T_DE/BUFF_BAR", Direction = "UP", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 186, Position = {"LEFT", T_DE_BUFF_BAR_Anchor}, -- Obsidian Scales {spellID = 363916, unitID = "player", caster = "player", filter = "BUFF"}, -- Renewing Blaze {spellID = 374348, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Landslide {spellID = 355689, unitID = "focus", caster = "all", filter = "DEBUFF"}, -- Sleep Walk {spellID = 360806, unitID = "focus", caster = "all", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Quell {spellID = 351338, filter = "CD"}, -- Tip the Scales {spellID = 370553, filter = "CD"}, -- Emerald Blossom {spellID = 355913, filter = "CD"}, -- Deep Breath {spellID = 357210, filter = "CD"}, -- Fire Storm {spellID = 368847, filter = "CD"}, -- Time Spiral {spellID = 374968, filter = "CD"}, -- Landslide {spellID = 358385, filter = "CD"}, -- Oppressing Roar {spellID = 372048, filter = "CD"}, -- Obsidian Scales {spellID = 363916, filter = "CD"}, -- Eternity Surge {spellID = 382411, filter = "CD"}, -- Dragonrage {spellID = 375087, filter = "CD"}, -- Cauterizing Flame {spellID = 374251, filter = "CD"}, -- Fire Breath {spellID = 382266, filter = "CD"}, -- Time Dilation {spellID = 357170, filter = "CD"}, -- Time Stop (PvP Talent) {spellID = 378441, filter = "CD"}, -- Chrono Loop (PvP Talent) {spellID = 383005, filter = "CD"}, -- Emerald Communion {spellID = 370960, filter = "CD"}, -- Dream Breath {spellID = 355941, filter = "CD"}, -- Spiritbloom {spellID = 382731, filter = "CD"}, -- Rewind {spellID = 363534, filter = "CD"}, -- Verdant Embrace {spellID = 360995, filter = "CD"}, }, }, ["HUNTER"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Coordinated Assault {spellID = 266779, unitID = "player", caster = "player", filter = "BUFF"}, -- Aspect of the Turtle {spellID = 186265, unitID = "player", caster = "player", filter = "BUFF"}, -- Bestial Wrath {spellID = 19574, unitID = "player", caster = "player", filter = "BUFF"}, -- Aspect of the Wild {spellID = 193530, unitID = "player", caster = "player", filter = "BUFF"}, -- Aspect of the Eagle {spellID = 186289, unitID = "player", caster = "player", filter = "BUFF"}, -- Aspect of the Cheetah {spellID = 186257, unitID = "player", caster = "player", filter = "BUFF"}, -- Dire Beast {spellID = 120694, unitID = "player", caster = "player", filter = "BUFF"}, -- Camouflage {spellID = 199483, unitID = "player", caster = "player", filter = "BUFF", absID = true}, -- Spirit Mend {spellID = 90361, unitID = "player", caster = "player", filter = "BUFF"}, -- Posthaste {spellID = 118922, unitID = "player", caster = "player", filter = "BUFF"}, -- Volley {spellID = 194386, unitID = "player", caster = "player", filter = "BUFF"}, -- Misdirection {spellID = 35079, unitID = "player", caster = "player", filter = "BUFF"}, -- Survivalist {spellID = 164857, unitID = "player", caster = "player", filter = "BUFF"}, -- Bombardment {spellID = 82921, unitID = "player", caster = "player", filter = "BUFF"}, -- Spitting Cobra {spellID = 194407, unitID = "player", caster = "player", filter = "BUFF"}, -- Trueshot {spellID = 288613, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Viper's Venom {spellID = 268552, unitID = "player", caster = "player", filter = "BUFF"}, -- Trick Shots {spellID = 257622, unitID = "player", caster = "player", filter = "BUFF"}, -- Lethal Shots {spellID = 260395, unitID = "player", caster = "player", filter = "BUFF"}, -- Precise Shots {spellID = 260242, unitID = "player", caster = "player", filter = "BUFF"}, -- Frenzy {spellID = 272790, unitID = "pet", caster = "player", filter = "BUFF"}, -- Steady Focus {spellID = 193533, unitID = "player", caster = "player", filter = "BUFF"}, -- Lock and Load {spellID = 194594, unitID = "player", caster = "player", filter = "BUFF"}, -- Mok'Nathal Tactics {spellID = 201081, unitID = "player", caster = "player", filter = "BUFF"}, -- Mongoose Fury {spellID = 190931, unitID = "player", caster = "player", filter = "BUFF"}, -- Beast Cleave {spellID = 118455, unitID = "pet", caster = "player", filter = "BUFF"}, -- Mend Pet {spellID = 136, unitID = "pet", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Black Arrow {spellID = 194599, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Serpent Sting {spellID = 87935, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Lacerate {spellID = 185855, unitID = "target", caster = "player", filter = "DEBUFF"}, -- A Murder of Crows {spellID = 131894, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Hunter's Mark {spellID = 257284, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Caltrops {spellID = 194279, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Warp Time (Warp Stalker) {spellID = 35346, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Ankle Crack (Crocolisk) {spellID = 50433, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Frost Breath (Chimaera) {spellID = 54644, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Concussive Shot {spellID = 5116, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Tar Trap {spellID = 135299, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Poisoned Ammo {spellID = 162543, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Frozen Ammo {spellID = 162546, unitID = "target", caster = "player", filter = "DEBUFF"}, -- True Aim {spellID = 199803, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Explosive Trap {spellID = 13812, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Steel Trap {spellID = 162487, unitID = "target", caster = "player", filter = "DEBUFF", absID = true}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Freezing Trap {spellID = 3355, unitID = "focus", caster = "player", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Concussive Shot {spellID = 5116, filter = "CD"}, -- Counter Shot {spellID = 147362, filter = "CD"}, -- Kill Command {spellID = 34026, filter = "CD"}, -- Sidewinders {spellID = 214579, filter = "CD"}, -- Explosive Shot {spellID = 212431, filter = "CD"}, -- Chimera Shot {spellID = 53209, filter = "CD"}, -- Barrage {spellID = 120360, filter = "CD"}, -- Disengage {spellID = 781, filter = "CD"}, -- Dire Beast {spellID = 120679, filter = "CD"}, -- Fervor {spellID = 82726, filter = "CD"}, -- Misdirection {spellID = 34477, filter = "CD"}, -- Feign Death {spellID = 5384, filter = "CD"}, -- Explosive Trap {spellID = 13813, filter = "CD"}, -- Ice Trap {spellID = 13809, filter = "CD"}, -- Binding Shot {spellID = 117526, filter = "CD"}, -- Master's Call {spellID = 53271, filter = "CD"}, -- Intimidation {spellID = 19577, filter = "CD"}, -- Bestial Wrath {spellID = 19574, filter = "CD"}, -- A Murder of Crows {spellID = 131894, filter = "CD"}, -- Exhilaration {spellID = 109304, filter = "CD"}, -- Aspect of the Wild {spellID = 193530, filter = "CD"}, -- Aspect of the Turtle {spellID = 186265, filter = "CD"}, -- Aspect of the Cheetah {spellID = 186257, filter = "CD"}, -- Spirit Mend (Pet) {spellID = 90361, filter = "CD"}, }, }, ["MAGE"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Ice Block {spellID = 45438, unitID = "player", caster = "player", filter = "BUFF"}, -- Invisibility {spellID = 66, unitID = "player", caster = "player", filter = "BUFF", absID = true}, -- Invisibility {spellID = 32612, unitID = "player", caster = "player", filter = "BUFF", absID = true}, -- Greater Invisibility {spellID = 110960, unitID = "player", caster = "player", filter = "BUFF", absID = true}, -- Icy Veins {spellID = 12472, unitID = "player", caster = "player", filter = "BUFF"}, -- Arcane Power {spellID = 12042, unitID = "player", caster = "player", filter = "BUFF"}, -- Combustion {spellID = 190319, unitID = "player", caster = "player", filter = "BUFF"}, -- Infernal Cascade {spellID = 336832, unitID = "player", caster = "player", filter = "BUFF"}, -- Blazing Barrier {spellID = 235313, unitID = "player", caster = "player", filter = "BUFF"}, -- Prismatic Barrier {spellID = 235450, unitID = "player", caster = "player", filter = "BUFF"}, -- Ice Barrier {spellID = 11426, unitID = "player", caster = "player", filter = "BUFF"}, -- Ice Floes {spellID = 108839, unitID = "player", caster = "player", filter = "BUFF"}, -- Alter Time {spellID = 108978, unitID = "player", caster = "player", filter = "BUFF"}, -- Temporal Shield {spellID = 198111, unitID = "player", caster = "player", filter = "BUFF"}, -- Rune of Power {spellID = 116011, filter = "ICD", trigger = "NONE", totem = true}, -- Mirror Image {spellID = 55342, filter = "ICD", trigger = "NONE", duration = 40}, -- Icicles {spellID = 205473, unitID = "player", caster = "player", filter = "BUFF", talentID = 21634}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Fingers of Frost {spellID = 44544, unitID = "player", caster = "player", filter = "BUFF"}, -- Brain Freeze {spellID = 190446, unitID = "player", caster = "player", filter = "BUFF"}, -- Glacial Spike! {spellID = 199844, unitID = "player", caster = "player", filter = "BUFF"}, -- Heating Up {spellID = 48107, unitID = "player", caster = "player", filter = "BUFF"}, -- Hot Streak! {spellID = 48108, unitID = "player", caster = "player", filter = "BUFF"}, -- Pyroclasm {spellID = 269651, unitID = "player", caster = "player", filter = "BUFF"}, -- Clearcasting {spellID = 263725, unitID = "player", caster = "player", filter = "BUFF"}, -- Rune of Power {spellID = 116014, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Arcane Charge {spellID = 36032, unitID = "player", caster = "player", filter = "DEBUFF"}, -- Living Bomb {spellID = 44457, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Nether Tempest {spellID = 114923, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Freeze (Pet) {spellID = 33395, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Frostbite {spellID = 198121, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Frost Nova {spellID = 122, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Cone of Cold {spellID = 120, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Winter's Chill {spellID = 228358, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Ice Nova {spellID = 157997, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Slow {spellID = 31589, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Polymorph {spellID = 118, unitID = "focus", caster = "all", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Remove Curse {spellID = 475, filter = "CD"}, -- Counterspell {spellID = 2139, filter = "CD"}, -- Living Bomb {spellID = 44457, filter = "CD"}, -- Blink {spellID = 1953, filter = "CD"}, -- Frost Nova {spellID = 122, filter = "CD"}, -- Ice Nova {spellID = 157997, filter = "CD"}, -- Ring of Frost {spellID = 113724, filter = "CD"}, -- Blazing Barrier {spellID = 235313, filter = "CD"}, -- Prismatic Barrier {spellID = 235450, filter = "CD"}, -- Ice Barrier {spellID = 11426, filter = "CD"}, -- Temporal Shield {spellID = 198111, filter = "CD"}, -- Fire Blast {spellID = 108853, filter = "CD"}, -- Cone of Cold {spellID = 120, filter = "CD"}, -- Comet Storm {spellID = 153595, filter = "CD"}, -- Ice Floes {spellID = 108839, filter = "CD"}, -- Ebonbolt {spellID = 214634, filter = "CD"}, -- Phoenix's Flames {spellID = 194466, filter = "CD"}, -- Mark of Aluneth {spellID = 224968, filter = "CD"}, -- Frozen Orb {spellID = 84714, filter = "CD"}, -- Meteor {spellID = 153561, filter = "CD"}, -- Dragon's Breath {spellID = 31661, filter = "CD"}, -- Arcane Power {spellID = 12042, filter = "CD"}, -- Rune of Power {spellID = 116011, filter = "CD"}, -- Presence of Mind {spellID = 205025, filter = "CD"}, -- Displacement {spellID = 195676, filter = "CD"}, -- Charged Up {spellID = 205032, filter = "CD"}, -- Supernova {spellID = 157980, filter = "CD"}, -- Evocation {spellID = 12051, filter = "CD"}, -- Icy Veins {spellID = 12472, filter = "CD"}, -- Mirror Image {spellID = 55342, filter = "CD"}, -- Combustion {spellID = 190319, filter = "CD"}, -- Cold Snap {spellID = 235219, filter = "CD"}, -- Ice Block {spellID = 45438, filter = "CD"}, -- Invisibility {spellID = 66, filter = "CD"}, }, }, ["MONK"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Fortifying Brew {spellID = 120954, unitID = "player", caster = "player", filter = "BUFF"}, -- Ironskin Brew {spellID = 215479, unitID = "player", caster = "player", filter = "BUFF"}, -- Touch of Karma {spellID = 125174, unitID = "player", caster = "player", filter = "BUFF"}, -- Diffuse Magic {spellID = 122783, unitID = "player", caster = "player", filter = "BUFF"}, -- Dampen Harm {spellID = 122278, unitID = "player", caster = "player", filter = "BUFF"}, -- Nimble Brew {spellID = 213664, unitID = "player", caster = "player", filter = "BUFF"}, -- Serenity {spellID = 152173, unitID = "player", caster = "player", filter = "BUFF"}, -- Storm, Earth, and Fire {spellID = 137639, unitID = "player", caster = "player", filter = "BUFF"}, -- Mana Tea {spellID = 197908, unitID = "player", caster = "player", filter = "BUFF"}, -- Thunder Focus Tea {spellID = 116680, unitID = "player", caster = "player", filter = "BUFF"}, -- Brew-Stache {spellID = 214372, unitID = "player", caster = "player", filter = "BUFF"}, -- Lifecycles (Vivify) {spellID = 197916, unitID = "player", caster = "player", filter = "BUFF"}, -- Lifecycles (Enveloping Mist) {spellID = 197919, unitID = "player", caster = "player", filter = "BUFF"}, -- Fortification {spellID = 213341, unitID = "player", caster = "player", filter = "BUFF"}, -- Chi Torpedo {spellID = 119085, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Rushing Jade Wind {spellID = 116847, unitID = "player", caster = "player", filter = "BUFF"}, -- Blackout Kick! {spellID = 116768, unitID = "player", caster = "player", filter = "BUFF"}, -- The Mists of Sheilun {spellID = 199888, unitID = "player", caster = "player", filter = "BUFF"}, -- Surge of Mists {spellID = 246328, unitID = "player", caster = "player", filter = "BUFF"}, -- Teachings of the Monastery {spellID = 202090, unitID = "player", caster = "player", filter = "BUFF"}, -- Transfer the Power {spellID = 195321, unitID = "player", caster = "player", filter = "BUFF"}, -- Hit Combo {spellID = 196741, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Touch of Death {spellID = 115080, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Heavy Stagger {spellID = 124273, unitID = "player", caster = "player", filter = "DEBUFF"}, -- Keg Smash {spellID = 121253, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Breath of Fire {spellID = 123725, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Exploding Keg {spellID = 214326, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Paralysis {spellID = 115078, unitID = "focus", caster = "player", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Detox {spellID = 115450, filter = "CD"}, -- Spear Hand Strike {spellID = 116705, filter = "CD"}, -- Paralysis {spellID = 115078, filter = "CD"}, -- Expel Harm {spellID = 115072, filter = "CD"}, -- Rising Sun Kick {spellID = 107428, filter = "CD"}, -- Provoke {spellID = 115546, filter = "CD"}, -- Zen Sphere {spellID = 124081, filter = "CD"}, -- Chi Wave {spellID = 115098, filter = "CD"}, -- Fists of Fury {spellID = 113656, filter = "CD"}, -- Chi Burst {spellID = 123986, filter = "CD"}, -- Guard {spellID = 202162, filter = "CD"}, -- Hurricane Strike {spellID = 152175, filter = "CD"}, -- Ring of Peace {spellID = 116844, filter = "CD"}, -- Thunder Focus Tea {spellID = 116680, filter = "CD"}, -- Dampen Harm {spellID = 122278, filter = "CD"}, -- Flying Serpent Kick {spellID = 101545, filter = "CD"}, -- Energizing Elixir {spellID = 115288, filter = "CD"}, -- Diffuse Magic {spellID = 122783, filter = "CD"}, -- Serenity {spellID = 152173, filter = "CD"}, -- Touch of Karma {spellID = 122470, filter = "CD"}, -- Touch of Death {spellID = 115080, filter = "CD"}, -- Nimble Brew {spellID = 213664, filter = "CD"}, -- Life Cocoon {spellID = 116849, filter = "CD"}, -- Invoke Xuen, the White Tiger {spellID = 123904, filter = "CD"}, -- Essence Font {spellID = 191837, filter = "CD"}, -- Refreshing Jade Wind {spellID = 162530, filter = "CD"}, -- Fortifying Brew {spellID = 115203, filter = "CD"}, }, }, ["PALADIN"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Inquisition {spellID = 84963, unitID = "player", caster = "player", filter = "BUFF"}, -- Shield of Vengeance {spellID = 184662, unitID = "player", caster = "player", filter = "BUFF"}, -- Eye for an Eye {spellID = 205191, unitID = "player", caster = "player", filter = "BUFF"}, -- Crusade {spellID = 231895, unitID = "player", caster = "player", filter = "BUFF"}, -- Divine Shield {spellID = 642, unitID = "player", caster = "player", filter = "BUFF"}, -- Guardian of Ancient Kings {spellID = 86659, unitID = "player", caster = "player", filter = "BUFF"}, -- Holy Avenger {spellID = 105809, unitID = "player", caster = "player", filter = "BUFF"}, -- Avenging Wrath {spellID = 31884, unitID = "player", caster = "player", filter = "BUFF"}, -- Seraphim {spellID = 152262, unitID = "player", caster = "player", filter = "BUFF"}, -- Ardent Defender {spellID = 31850, unitID = "player", caster = "player", filter = "BUFF"}, -- Divine Protection {spellID = 498, unitID = "player", caster = "player", filter = "BUFF"}, -- Rule of Law {spellID = 214202, unitID = "player", caster = "player", filter = "BUFF"}, -- Shield of the Righteous {spellID = 132403, unitID = "player", caster = "player", filter = "BUFF"}, -- Speed of Light {spellID = 85499, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Divine Purpose {spellID = 223819, unitID = "player", caster = "player", filter = "BUFF"}, -- Righteous Verdict {spellID = 267611, unitID = "player", caster = "player", filter = "BUFF"}, -- Blade of Wrath {spellID = 281178, unitID = "player", caster = "player", filter = "BUFF"}, -- Infusion of Light {spellID = 54149, unitID = "player", caster = "player", filter = "BUFF"}, -- Grand Crusader {spellID = 85416, unitID = "player", caster = "player", filter = "BUFF"}, -- The Fires of Justice {spellID = 209785, unitID = "player", caster = "player", filter = "BUFF"}, -- Empyrean Power (Azerite Traits) {spellID = 286393, unitID = "player", caster = "player", filter = "BUFF"}, -- Selfless Healer {spellID = 114250, unitID = "player", caster = "player", filter = "BUFF"}, -- Shining Light {spellID = 327510, unitID = "player", caster = "player", filter = "BUFF", absID = true}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Execution Sentence {spellID = 343527, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Eye of Tyr {spellID = 209202, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Judgment {spellID = 197277, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Glimmer of Light {spellID = 287280, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Hand of Hindrance {spellID = 183218, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Forbearance {spellID = 25771, unitID = "player", caster = "all", filter = "DEBUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Repentance {spellID = 20066, unitID = "focus", caster = "player", filter = "DEBUFF"}, -- Turn Evil {spellID = 10326, unitID = "focus", caster = "player", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Eye of Tyr {spellID = 209202, filter = "CD"}, -- Cleanse {spellID = 4987, filter = "CD"}, -- Cleanse Toxins {spellID = 213644, filter = "CD"}, -- Hand of Reckoning {spellID = 62124, filter = "CD"}, -- Rebuke {spellID = 96231, filter = "CD"}, -- Hand of Hindrance {spellID = 183218, filter = "CD"}, -- Repentance {spellID = 20066, filter = "CD"}, -- Hammer of Justice {spellID = 853, filter = "CD"}, -- Judgment {spellID = 20271, filter = "CD"}, -- Blade of Justice {spellID = 184575, filter = "CD"}, -- Hammer of Wrath {spellID = 24275, filter = "CD"}, -- Holy Shock {spellID = 20473, filter = "CD"}, -- Consecration {spellID = 26573, filter = "CD"}, -- Avenger's Shield {spellID = 31935, filter = "CD"}, -- Bestow Faith {spellID = 223306, filter = "CD"}, -- Light of Dawn {spellID = 85222, filter = "CD"}, -- Holy Prism {spellID = 114165, filter = "CD"}, -- Blessing of Freedom {spellID = 1044, filter = "CD"}, -- Rule of Law {spellID = 214202, filter = "CD"}, -- Seraphim {spellID = 152262, filter = "CD"}, -- Wake of Ashes {spellID = 255937, filter = "CD"}, -- Speed of Light {spellID = 85499, filter = "CD"}, -- Divine Protection {spellID = 498, filter = "CD", absID = true}, -- Execution Sentence {spellID = 343527, filter = "CD"}, -- Light's Hammer {spellID = 114158, filter = "CD"}, -- Blinding Light {spellID = 115750, filter = "CD"}, -- Holy Avenger {spellID = 105809, filter = "CD"}, -- Aura Mastery {spellID = 31821, filter = "CD"}, -- Blessing of Sacrifice {spellID = 6940, filter = "CD"}, -- Avenging Wrath {spellID = 31884, filter = "CD"}, -- Shield of Vengeance {spellID = 184662, filter = "CD"}, -- Ardent Defender {spellID = 31850, filter = "CD", absID = true}, -- Guardian of Ancient Kings {spellID = 86659, filter = "CD"}, -- Blessing of Protection {spellID = 1022, filter = "CD"}, -- Divine Shield {spellID = 642, filter = "CD"}, }, }, ["PRIEST"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Atonement {spellID = 194384, unitID = "player", caster = "player", filter = "BUFF"}, -- Rapture {spellID = 47536, unitID = "player", caster = "player", filter = "BUFF"}, -- Desperate Prayer {spellID = 19236, unitID = "player", caster = "player", filter = "BUFF"}, -- Voidform {spellID = 194249, unitID = "player", caster = "player", filter = "BUFF"}, -- Dispersion {spellID = 47585, unitID = "player", caster = "player", filter = "BUFF"}, -- Apotheosis {spellID = 200183, unitID = "player", caster = "player", filter = "BUFF"}, -- Blessing of T'uure {spellID = 196644, unitID = "player", caster = "player", filter = "BUFF"}, -- Spirit of Redemption {spellID = 20711, unitID = "player", caster = "all", filter = "BUFF"}, -- Divinity {spellID = 197030, unitID = "player", caster = "player", filter = "BUFF"}, -- Power of the Naaru {spellID = 196490, unitID = "player", caster = "player", filter = "BUFF"}, -- Archangel {spellID = 197862, unitID = "player", caster = "player", filter = "BUFF"}, -- Vampiric Embrace {spellID = 15286, unitID = "player", caster = "player", filter = "BUFF"}, -- Focused Will {spellID = 45242, unitID = "player", caster = "player", filter = "BUFF"}, -- Spectral Guise {spellID = 112833, unitID = "player", caster = "player", filter = "BUFF"}, -- Fade {spellID = 586, unitID = "player", caster = "player", filter = "BUFF"}, -- Spirit Shell {spellID = 109964, unitID = "player", caster = "player", filter = "BUFF", absID = true}, -- Power Word: Shield {spellID = 17, unitID = "player", caster = "all", filter = "BUFF"}, -- Renew {spellID = 139, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Power of the Dark Side {spellID = 198069, unitID = "player", caster = "player", filter = "BUFF"}, -- Lingering Insanity --BETA {spellID = 197937, unitID = "player", caster = "player", filter = "BUFF"}, -- Shadowy Insight {spellID = 124430, unitID = "player", caster = "player", filter = "BUFF"}, -- Surge of Light {spellID = 114255, unitID = "player", caster = "player", filter = "BUFF"}, -- Surge of Darkness {spellID = 87160, unitID = "player", caster = "player", filter = "BUFF"}, -- Twist of Fate {spellID = 123254, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Schism {spellID = 214621, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Weakened Soul {spellID = 6788, unitID = "player", caster = "player", filter = "DEBUFF"}, }, { Name = "T_DE/BUFF_BAR", Direction = "UP", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 186, Position = {"LEFT", T_DE_BUFF_BAR_Anchor}, -- Renew {spellID = 139, unitID = "target", caster = "player", filter = "BUFF"}, -- Prayer of Mending {spellID = 41635, unitID = "target", caster = "player", filter = "BUFF"}, -- Guardian Spirit {spellID = 47788, unitID = "target", caster = "player", filter = "BUFF"}, -- Pain Suppression {spellID = 33206, unitID = "target", caster = "player", filter = "BUFF"}, -- Vampiric Touch {spellID = 34914, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Shadow Word: Pain {spellID = 589, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Devouring Plague {spellID = 335467, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Purge the Wicked {spellID = 204197, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Light of T'uure {spellID = 208065, unitID = "target", caster = "player", filter = "BUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Shackle Undead {spellID = 9484, unitID = "focus", caster = "player", filter = "DEBUFF"}, -- Psychic Scream {spellID = 8122, unitID = "focus", caster = "player", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Purify {spellID = 527, filter = "CD"}, -- Mass Dispel {spellID = 32375, filter = "CD"}, -- Penance {spellID = 47540, filter = "CD"}, -- Mind Blast {spellID = 8092, filter = "CD"}, -- Power Word: Shield {spellID = 17, filter = "CD"}, -- Shadow Word: Death {spellID = 32379, filter = "CD"}, -- Circle of Healing {spellID = 204883, filter = "CD"}, -- Angelic Feather {spellID = 121536, filter = "CD"}, -- Prayer of Mending {spellID = 33076, filter = "CD"}, -- Divine Star {spellID = 110744, filter = "CD"}, -- Archangel {spellID = 197862, filter = "CD"}, -- Holy Word: Sanctify {spellID = 34861, filter = "CD"}, -- Holy Word: Chastise {spellID = 88625, filter = "CD"}, -- Holy Word: Serenity {spellID = 2050, filter = "CD"}, -- Spectral Guise {spellID = 112833, filter = "CD"}, -- Fade {spellID = 586, filter = "CD"}, -- Halo {spellID = 120517, filter = "CD"}, -- Psychic Scream {spellID = 8122, filter = "CD"}, -- Psychic Horror {spellID = 64044, filter = "CD"}, -- Silence {spellID = 15487, filter = "CD"}, -- Leap of Faith {spellID = 73325, filter = "CD"}, -- Power Infusion {spellID = 10060, filter = "CD"}, -- Dispersion {spellID = 47585, filter = "CD"}, -- Desperate Prayer {spellID = 19236, filter = "CD"}, -- Shining Force {spellID = 204263, filter = "CD"}, -- Pain Suppression {spellID = 33206, filter = "CD"}, -- Guardian Spirit {spellID = 47788, filter = "CD"}, -- Power Word: Barrier {spellID = 62618, filter = "CD"}, -- Divine Hymn {spellID = 64843, filter = "CD"}, -- Symbol of Hope {spellID = 64901, filter = "CD"}, -- Apotheosis {spellID = 200183, filter = "CD"}, -- Shadowfiend {spellID = 34433, filter = "CD"}, -- Void Eruption {spellID = 228260, filter = "CD"}, -- Light of T'uure {spellID = 208065, filter = "CD"}, -- Light's Wrath {spellID = 207946, filter = "CD"}, -- Vampiric Embrace {spellID = 15286, filter = "CD"}, -- Power Word: Solace {spellID = 129250, filter = "CD"}, -- Power Word: Radiance {spellID = 194509, filter = "CD"}, -- Schism {spellID = 214621, filter = "CD"}, -- Rapture {spellID = 47536, filter = "CD"}, -- Shadow Covenant {spellID = 314867, filter = "CD"}, }, }, ["ROGUE"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Slice and Dice {spellID = 5171, unitID = "player", caster = "player", filter = "BUFF"}, -- Adrenaline Rush {spellID = 13750, unitID = "player", caster = "player", filter = "BUFF"}, -- Evasion {spellID = 5277, unitID = "player", caster = "player", filter = "BUFF"}, -- Envenom {spellID = 32645, unitID = "player", caster = "player", filter = "BUFF"}, -- Shadow Dance {spellID = 185313, unitID = "player", caster = "player", filter = "BUFF"}, -- Symbols of Death {spellID = 212283, unitID = "player", caster = "player", filter = "BUFF"}, -- Shadow Blades {spellID = 121471, unitID = "player", caster = "player", filter = "BUFF"}, -- Curse of the Dreadblades {spellID = 208245, unitID = "player", caster = "player", filter = "DEBUFF"}, -- Alacrity {spellID = 193539, unitID = "player", caster = "player", filter = "BUFF"}, -- Master of Subtlety {spellID = 31665, unitID = "player", caster = "player", filter = "BUFF"}, -- Cloak of Shadows {spellID = 31224, unitID = "player", caster = "player", filter = "BUFF"}, -- Vanish {spellID = 1856, unitID = "player", caster = "player", filter = "BUFF"}, -- Combat Readiness {spellID = 74001, unitID = "player", caster = "player", filter = "BUFF"}, -- Combat Insight {spellID = 74002, unitID = "player", caster = "player", filter = "BUFF"}, -- Shadow Reflection {spellID = 152151, unitID = "player", caster = "player", filter = "BUFF"}, -- Cheating Death {spellID = 45182, unitID = "player", caster = "player", filter = "BUFF"}, -- Blade Flurry {spellID = 13877, unitID = "player", caster = "player", filter = "BUFF"}, -- Burst of Speed {spellID = 108212, unitID = "player", caster = "player", filter = "BUFF"}, -- Sprint {spellID = 2983, unitID = "player", caster = "player", filter = "BUFF"}, -- Feint {spellID = 1966, unitID = "player", caster = "player", filter = "BUFF"}, -- Subterfuge {spellID = 115192, unitID = "player", caster = "player", filter = "BUFF"}, -- Dreadblades {spellID = 343142, unitID = "player", caster = "player", filter = "DEBUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Shuriken Combo {spellID = 245640, unitID = "player", caster = "player", filter = "BUFF"}, -- Jolly Roger {spellID = 199603, unitID = "player", caster = "player", filter = "BUFF"}, -- Grand Melee {spellID = 193358, unitID = "player", caster = "player", filter = "BUFF"}, -- True Bearing {spellID = 193359, unitID = "player", caster = "player", filter = "BUFF"}, -- Buried Treasure {spellID = 199600, unitID = "player", caster = "player", filter = "BUFF"}, -- Broadsides {spellID = 193356, unitID = "player", caster = "player", filter = "BUFF"}, -- Shark Infested Waters {spellID = 193357, unitID = "player", caster = "player", filter = "BUFF"}, -- Opportunity {spellID = 195627, unitID = "player", caster = "player", filter = "BUFF"}, -- Audacity {spellID = 386270, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Rupture {spellID = 1943, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Garrote {spellID = 703, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Gouge {spellID = 1776, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Hemorrhage {spellID = 16511, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Find Weakness {spellID = 91021, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Vendetta {spellID = 79140, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Nightblade {spellID = 195452, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Ghostly Strike {spellID = 196937, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Deadly Poison {spellID = 2818, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Crippling Poison {spellID = 3409, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Wound Poison {spellID = 8680, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Crimson Tempest {spellID = 121411, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Blind {spellID = 2094, unitID = "focus", caster = "player", filter = "DEBUFF"}, -- Sap {spellID = 6770, unitID = "focus", caster = "player", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Stealth {spellID = 1784, filter = "CD"}, -- Kick {spellID = 1766, filter = "CD"}, -- Gouge {spellID = 1776, filter = "CD"}, -- Kidney Shot {spellID = 408, filter = "CD"}, -- Death from Above {spellID = 152150, filter = "CD"}, -- Sprint {spellID = 2983, filter = "CD"}, -- Shadow Dance {spellID = 185313, filter = "CD"}, -- Marked for Death {spellID = 137619, filter = "CD"}, -- Killing Spree {spellID = 51690, filter = "CD"}, -- Vendetta {spellID = 79140, filter = "CD"}, -- Shadow Reflection {spellID = 152151, filter = "CD"}, -- Combat Readiness {spellID = 74001, filter = "CD"}, -- Vanish {spellID = 1856, filter = "CD"}, -- Adrenaline Rush {spellID = 13750, filter = "CD"}, -- Between the Eyes {spellID = 315341, filter = "CD"}, -- Riposte {spellID = 199754, filter = "CD"}, -- Cloak of Shadows {spellID = 31224, filter = "CD"}, -- Grappling Hook {spellID = 195457, filter = "CD"}, -- Crimson Vial {spellID = 185311, filter = "CD"}, -- Garrote {spellID = 703, filter = "CD"}, -- Exsanguinate {spellID = 200806, filter = "CD"}, -- Shadowstep {spellID = 36554, filter = "CD"}, -- Evasion {spellID = 5277, filter = "CD"}, }, }, ["SHAMAN"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Elemental Mastery {spellID = 16166, unitID = "player", caster = "player", filter = "BUFF"}, -- Ascendance {spellID = 114049, unitID = "player", caster = "player", filter = "BUFF"}, -- Spiritwalker's Grace {spellID = 79206, unitID = "player", caster = "player", filter = "BUFF"}, -- Unleash Life {spellID = 73685, unitID = "player", caster = "player", filter = "BUFF"}, -- Doom Winds {spellID = 204945, unitID = "player", caster = "player", filter = "BUFF"}, -- Landslide {spellID = 202004, unitID = "player", caster = "player", filter = "BUFF"}, -- Stone Bulwark {spellID = 114893, unitID = "player", caster = "player", filter = "BUFF"}, -- Ancestral Guidance {spellID = 108281, unitID = "player", caster = "player", filter = "BUFF"}, -- Astral Shift {spellID = 108271, unitID = "player", caster = "player", filter = "BUFF"}, -- Fury of Air {spellID = 197211, unitID = "player", caster = "player", filter = "BUFF"}, -- Windsong --BETA {spellID = 201898, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Lava Surge {spellID = 77762, unitID = "player", caster = "player", filter = "BUFF"}, -- Elemental Blast {spellID = 118522, unitID = "player", caster = "player", filter = "BUFF"}, -- Tidal Waves {spellID = 53390, unitID = "player", caster = "player", filter = "BUFF"}, -- Stormlash {spellID = 195222, unitID = "player", caster = "player", filter = "BUFF"}, -- Stormbringer {spellID = 201846, unitID = "player", caster = "player", filter = "BUFF"}, -- Crash Lightning {spellID = 187878, unitID = "player", caster = "player", filter = "BUFF"}, -- Frostbrand --BETA {spellID = 196834, unitID = "player", caster = "player", filter = "BUFF"}, -- Flametongue {spellID = 194084, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Stormstrike {spellID = 17364, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Flame Shock {spellID = 188389, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Frost Shock {spellID = 196840, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Earthgrab {spellID = 64695, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Earthen Spike --BETA {spellID = 188089, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "T_DE/BUFF_BAR", Direction = "UP", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 186, Position = {"LEFT", T_DE_BUFF_BAR_Anchor}, -- Earth Shield {spellID = 204288, unitID = "target", caster = "player", filter = "BUFF"}, -- Riptide {spellID = 61295, unitID = "target", caster = "player", filter = "BUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Hex {spellID = 51514, unitID = "focus", caster = "player", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Cleanse Spirit {spellID = 51886, filter = "CD"}, -- Wind Shear {spellID = 57994, filter = "CD"}, -- Hex {spellID = 51514, filter = "CD"}, -- Riptide {spellID = 61295, filter = "CD"}, -- Healing Rain {spellID = 73920, filter = "CD"}, -- Crash Lightning {spellID = 187874, filter = "CD"}, -- Stormstrike {spellID = 17364, filter = "CD"}, -- Lava Burst {spellID = 51505, filter = "CD"}, -- Elemental Blast {spellID = 117014, filter = "CD"}, -- Flametongue --BETA {spellID = 193796, filter = "CD"}, -- Feral Lunge {spellID = 196884, filter = "CD"}, -- Cloudburst Totem {spellID = 157153, filter = "CD"}, -- Earthbind Totem {spellID = 2484, filter = "CD"}, -- Thunderstorm {spellID = 51490, filter = "CD"}, -- Windsong --BETA {spellID = 201898, filter = "CD"}, -- Stone Bulwark Totem {spellID = 108270, filter = "CD"}, -- Capacitor Totem {spellID = 192058, filter = "CD"}, -- Doom Winds {spellID = 204945, filter = "CD"}, -- Astral Shift {spellID = 108271, filter = "CD"}, -- Ancestral Guidance {spellID = 108281, filter = "CD"}, -- Spiritwalker's Grace {spellID = 79206, filter = "CD"}, -- Feral Spirit {spellID = 51533, filter = "CD"}, -- Ascendance {spellID = 114049, filter = "CD"}, }, }, ["WARLOCK"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- Dark Soul: Misery {spellID = 113860, unitID = "player", caster = "player", filter = "BUFF"}, -- Dark Soul: Instability {spellID = 113858, unitID = "player", caster = "player", filter = "BUFF"}, -- Deadwind Harvester {spellID = 216708, unitID = "player", caster = "player", filter = "BUFF"}, -- Unending Resolve {spellID = 104773, unitID = "player", caster = "player", filter = "BUFF"}, -- Soul Harvest {spellID = 196098, unitID = "player", caster = "player", filter = "BUFF"}, -- Empowered Life Tap {spellID = 235156, unitID = "player", caster = "player", filter = "BUFF"}, -- Soul Swap {spellID = 86211, unitID = "player", caster = "player", filter = "BUFF"}, -- Dark Regeneration {spellID = 108359, unitID = "player", caster = "player", filter = "BUFF"}, -- Burning Rush {spellID = 111400, unitID = "player", caster = "player", filter = "BUFF"}, -- Sacrificial Pact {spellID = 108416, unitID = "player", caster = "player", filter = "BUFF"}, -- Healthstone {spellID = 6262, unitID = "player", caster = "player", filter = "BUFF"}, -- Nether Ward {spellID = 212295, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Buffs -- Backdraft {spellID = 117828, unitID = "player", caster = "player", filter = "BUFF"}, -- Grimore of Synergy {spellID = 171982, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Self -- Enslave Demon {spellID = 1098, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "T_DE/BUFF_BAR", Direction = "UP", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 186, Position = {"LEFT", T_DE_BUFF_BAR_Anchor}, -- Havoc {spellID = 80240, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Doom {spellID = 603, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Agony {spellID = 980, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Corruption {spellID = 146739, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Seed of Corruption {spellID = 27243, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Immolate {spellID = 348, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Unstable Affliction {spellID = 316099, unitID = "target", caster = "player", filter = "DEBUFF", absID = true}, -- Unstable Affliction (PvP Talent) {spellID = 342938, unitID = "target", caster = "player", filter = "DEBUFF", absID = true}, -- Siphon Life {spellID = 63106, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Soul Effigy {spellID = 205178, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Phantom Singularity {spellID = 205179, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Haunt {spellID = 48181, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Shadowflame {spellID = 205181, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Eradication {spellID = 196414, unitID = "target", caster = "player", filter = "DEBUFF"}, }, { Name = "PVE/PVP_CC", Direction = "DOWN", IconSide = "LEFT", Mode = "BAR", Interval = 3, Alpha = 1, IconSize = 25, BarWidth = 189, Position = {"LEFT", PVE_PVP_CC_Anchor}, -- Banish {spellID = 710, unitID = "focus", caster = "player", filter = "DEBUFF"}, -- Fear {spellID = 118699, unitID = "focus", caster = "player", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Devour Magic (Felhunter) {spellID = 19505, filter = "CD"}, -- Spell Lock (Felhunter) {spellID = 19647, filter = "CD"}, -- Shadowfury {spellID = 30283, filter = "CD"}, -- Howl of Terror {spellID = 5484, filter = "CD"}, -- Mortal Coil {spellID = 6789, filter = "CD"}, -- Demonic Circle {spellID = 48018, filter = "CD"}, -- Felstorm {spellID = 89751, filter = "CD"}, -- Cataclysm {spellID = 152108, filter = "CD"}, -- Soul Harvest {spellID = 196098, filter = "CD"}, -- Grimoire of Service {spellID = 108501, filter = "CD"}, -- Shadowflame {spellID = 205181, filter = "CD"}, -- Summon Darkglare {spellID = 205180, filter = "CD"}, -- Deathbolt {spellID = 264106, filter = "CD"}, -- Phantom Singularity {spellID = 205179, filter = "CD"}, -- Unending Resolve {spellID = 104773, filter = "CD"}, -- Dark Pact {spellID = 108416, filter = "CD"}, -- Nether Ward (PvP) {spellID = 212295, filter = "CD"}, }, }, ["WARRIOR"] = { { Name = "P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_BUFF_ICON_Anchor}, -- In For The Kill {spellID = 248622, unitID = "player", caster = "player", filter = "BUFF"}, -- Deadly Calm {spellID = 262228, unitID = "player", caster = "player", filter = "BUFF"}, -- Sweeping Strikes {spellID = 260708, unitID = "player", caster = "player", filter = "BUFF"}, -- Ignore Pain {spellID = 190456, unitID = "player", caster = "player", filter = "BUFF"}, -- Shield Wall {spellID = 871, unitID = "player", caster = "player", filter = "BUFF"}, -- Last Stand {spellID = 12975, unitID = "player", caster = "player", filter = "BUFF"}, -- Enraged Regeneration {spellID = 184364, unitID = "player", caster = "player", filter = "BUFF"}, -- Shield Block {spellID = 2565, unitID = "player", caster = "player", filter = "BUFF"}, -- Spell Reflection {spellID = 23920, unitID = "player", caster = "player", filter = "BUFF"}, -- Ravager {spellID = 152277, unitID = "player", caster = "player", filter = "BUFF", spec = 3}, -- Die by the Sword {spellID = 118038, unitID = "player", caster = "player", filter = "BUFF"}, -- Berserker Rage {spellID = 18499, unitID = "player", caster = "player", filter = "BUFF"}, -- Avatar {spellID = 107574, unitID = "player", caster = "player", filter = "BUFF"}, -- Recklesness {spellID = 1719, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "P_PROC_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", P_PROC_ICON_Anchor}, -- Victorious {spellID = 32216, unitID = "player", caster = "player", filter = "BUFF"}, -- Overpower {spellID = 7384, unitID = "player", caster = "player", filter = "BUFF"}, -- Frothing Berserker {spellID = 215572, unitID = "player", caster = "player", filter = "BUFF"}, -- Furious Slash {spellID = 202539, unitID = "player", caster = "player", filter = "BUFF"}, -- Vengeance: Ignore Pain {spellID = 202574, unitID = "player", caster = "player", filter = "BUFF"}, -- Sudden Death {spellID = 52437, unitID = "player", caster = "player", filter = "BUFF"}, -- Meat Cleaver {spellID = 85739, unitID = "player", caster = "player", filter = "BUFF"}, -- Enrage {spellID = 184362, unitID = "player", caster = "player", filter = "BUFF"}, }, { Name = "T_DEBUFF_ICON", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", T_DEBUFF_ICON_Anchor}, -- Siegebreaker {spellID = 280773, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Rend {spellID = 772, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Colossus Smash {spellID = 167105, unitID = "target", caster = "player", filter = "DEBUFF"}, -- Hamstring {spellID = 1715, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Demoralizing Shout {spellID = 1160, unitID = "target", caster = "all", filter = "DEBUFF"}, }, { Name = "COOLDOWN", Direction = "RIGHT", Mode = "ICON", Interval = C.filger.cooldown_space, Alpha = 1, IconSize = C.filger.cooldown_size, Position = {"TOP", COOLDOWN_Anchor}, -- Self -- Pummel {spellID = 6552, filter = "CD"}, -- Shield Slam {spellID = 23922, filter = "CD"}, -- Shockwave {spellID = 46968, filter = "CD"}, -- Storm Bolt {spellID = 107570, filter = "CD"}, -- Thunder Clap {spellID = 6343, filter = "CD"}, -- Taunt {spellID = 355, filter = "CD"}, -- Colossus Smash {spellID = 167105, filter = "CD"}, -- Charge {spellID = 100, filter = "CD"}, -- Spell Reflection {spellID = 23920, filter = "CD"}, -- Berserker Rage {spellID = 18499, filter = "CD"}, -- Heroic Leap {spellID = 6544, filter = "CD"}, -- Demoralizing Shout {spellID = 1160, filter = "CD"}, -- Enraged Regeneration {spellID = 184364, filter = "CD"}, -- Ravager {spellID = 152277, filter = "CD"}, -- Intimidating Shout {spellID = 5246, filter = "CD"}, -- Last Stand {spellID = 12975, filter = "CD"}, -- Rallying Cry {spellID = 97462, filter = "CD"}, -- Shield Wall {spellID = 871, filter = "CD"}, -- Odyn's Fury {spellID = 205545, filter = "CD"}, -- Battle Cry {spellID = 1719, filter = "CD"}, -- Avatar {spellID = 107574, filter = "CD"}, -- Siegebreaker {spellID = 280772, filter = "CD"}, -- Heroic Throw {spellID = 57755, filter = "CD"}, -- Dragon Roar {spellID = 118000, filter = "CD"}, -- Execute (Fury) {spellID = 5308, filter = "CD"}, }, }, ["ALL"] = { { Name = "SPECIAL_P_BUFF_ICON", Direction = "LEFT", Mode = "ICON", Interval = C.filger.buffs_space, Alpha = 1, IconSize = C.filger.buffs_size, Position = {"TOP", SPECIAL_P_BUFF_ICON_Anchor}, -- Potions: Power -- Elemental Potion of Power {spellID = 371024, unitID = "player", caster = "player", filter = "BUFF"}, -- Elemental Potion of Ultimate Power {spellID = 371028, unitID = "player", caster = "player", filter = "BUFF"}, -- Potions: Miscellaneous -- Invisible [Potion of the Hushed Zephyr] {spellID = 371124, unitID = "player", caster = "player", filter = "BUFF", absID = true}, -- Raid Amplifiers -- Bloodlust {spellID = 2825, unitID = "player", caster = "all", filter = "BUFF"}, -- Heroism {spellID = 32182, unitID = "player", caster = "all", filter = "BUFF"}, -- Primal Rage [Hunter's pet] {spellID = 264667, unitID = "player", caster = "all", filter = "BUFF", absID = true}, -- Time Warp {spellID = 80353, unitID = "player", caster = "all", filter = "BUFF"}, -- Fury of the Aspects {spellID = 390386, unitID = "player", caster = "all", filter = "BUFF"}, -- Feral Hide Drums {spellID = 381301, unitID = "player", caster = "all", filter = "BUFF"}, -- Mallet of Thunderous Skins {spellID = 292686, unitID = "player", caster = "all", filter = "BUFF"}, -- Power Infusion {spellID = 10060, unitID = "player", caster = "all", filter = "BUFF"}, -- Engineering -- Goblin Glider [Goblin Glider Kit] {spellID = 126389, unitID = "player", caster = "all", filter = "BUFF", absID = true}, -- Nitro Boosts {spellID = 54861, unitID = "player", caster = "player", filter = "BUFF"}, -- Parachute {spellID = 55001, unitID = "player", caster = "player", filter = "BUFF"}, -- Shieldtronic Shield {spellID = 173260, unitID = "player", caster = "all", filter = "BUFF", absID = true}, -- Racial -- Berserking (Troll) {spellID = 26297, unitID = "player", caster = "player", filter = "BUFF", absID = true}, -- Blood Fury (Orc) {spellID = 20572, unitID = "player", caster = "player", filter = "BUFF"}, -- Darkflight (Worgen) {spellID = 68992, unitID = "player", caster = "player", filter = "BUFF"}, -- Gift of the Naaru (Draenei) {spellID = 28880, unitID = "player", caster = "all", filter = "BUFF"}, -- Shadowmeld (Night Elf) {spellID = 58984, unitID = "player", caster = "player", filter = "BUFF"}, -- Stoneform (Dwarf) {spellID = 65116, unitID = "player", caster = "player", filter = "BUFF"}, -- Fireblood (Dark Iron Dwarf) {spellID = 265221, unitID = "player", caster = "player", filter = "BUFF"}, -- Zone Buffs -- Inactive (Battlegrounds) {spellID = 43681, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Speed (Battlegrounds) {spellID = 23451, unitID = "player", caster = "all", filter = "BUFF", absID = true}, -- Strange Feeling (Brawler's Guild) {spellID = 134851, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Damage Reduction -- Life Cocoon {spellID = 116849, unitID = "player", caster = "all", filter = "BUFF"}, -- Guardian Spirit {spellID = 47788, unitID = "player", caster = "all", filter = "BUFF"}, -- Pain Suppression {spellID = 33206, unitID = "player", caster = "all", filter = "BUFF"}, -- Ironbark {spellID = 102342, unitID = "player", caster = "all", filter = "BUFF"}, -- Aura Mastery {spellID = 31821, unitID = "player", caster = "all", filter = "BUFF"}, -- Blessing of Protection {spellID = 1022, unitID = "player", caster = "all", filter = "BUFF"}, -- Blessing of Sacrifice {spellID = 6940, unitID = "player", caster = "all", filter = "BUFF"}, -- Blessing of Spellwarding {spellID = 204018, unitID = "player", caster = "all", filter = "BUFF"}, -- Vigilance {spellID = 114030, unitID = "player", caster = "all", filter = "BUFF"}, -- Rallying Cry {spellID = 97463, unitID = "player", caster = "all", filter = "BUFF"}, -- Darkness {spellID = 209426, unitID = "player", caster = "all", filter = "BUFF"}, -- Other -- Symbol of Hope {spellID = 64901, unitID = "player", caster = "all", filter = "BUFF"}, -- Innervate {spellID = 29166, unitID = "player", caster = "all", filter = "BUFF"}, -- Grounding Totem {spellID = 8178, unitID = "player", caster = "all", filter = "BUFF"}, -- Mass Spell Reflection {spellID = 213915, unitID = "player", caster = "all", filter = "BUFF"}, -- Tiger's Lust {spellID = 116841, unitID = "player", caster = "all", filter = "BUFF"}, -- Body and Soul {spellID = 65081, unitID = "player", caster = "all", filter = "BUFF"}, -- Angelic Feather {spellID = 121557, unitID = "player", caster = "all", filter = "BUFF"}, -- Stampeding Roar {spellID = 77764, unitID = "player", caster = "all", filter = "BUFF"}, -- Blessing of Freedom {spellID = 1044, unitID = "player", caster = "all", filter = "BUFF"}, -- Time Spiral {spellID = 375226, unitID = "player", caster = "all", filter = "BUFF"}, -- Tricks of the Trade {spellID = 57934, unitID = "player", caster = "all", filter = "BUFF"}, -- Slow Fall {spellID = 130, unitID = "player", caster = "all", filter = "BUFF"}, -- Levitate {spellID = 1706, unitID = "player", caster = "all", filter = "BUFF"}, }, { Name = "PVE/PVP_DEBUFF", Direction = "UP", Mode = "ICON", Interval = C.filger.pvp_space, Alpha = 1, IconSize = C.filger.pvp_size, Position = {"TOP", PVE_PVP_DEBUFF_Anchor}, -- Crowd Controls -- Death Knight -- Asphyxiate {spellID = 108194, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Monstrous Blow (Mutated Ghoul) {spellID = 91797, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Gnaw (Ghoul) {spellID = 91800, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Dead of Winter {spellID = 287254, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Blinding Sleet {spellID = 207167, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Demon Hunter -- Imprison {spellID = 217832, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Fel Eruption {spellID = 211881, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Chaos Nova {spellID = 179057, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Illidan's Grasp {spellID = 205630, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Sigil of Misery {spellID = 207685, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Druid -- Cyclone {spellID = 33786, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Incapacitating Roar {spellID = 99, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mighty Bash {spellID = 5211, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Maim {spellID = 22570, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Rake {spellID = 163505, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Evoker -- Sleep Walk {spellID = 360806, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Hunter -- Freezing Trap {spellID = 3355, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Intimidation {spellID = 24394, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Scatter Shot {spellID = 213691, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mage -- Polymorph {spellID = 118, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Ring of Frost {spellID = 82691, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Dragon's Breath {spellID = 31661, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Monk -- Paralysis {spellID = 115078, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Leg Sweep {spellID = 119381, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Fists of Fury {spellID = 120086, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Song of Chi-Ji {spellID = 198898, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Paladin -- Repentance {spellID = 20066, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Hammer of Justice {spellID = 853, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Blinding Light {spellID = 105421, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Priest -- Dominate Mind {spellID = 605, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Psychic Horror {spellID = 64044, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Psychic Scream {spellID = 8122, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mind Bomb {spellID = 205369, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Sin and Punishment {spellID = 87204, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Holy Word: Chastise {spellID = 200196, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mindgames {spellID = 323673, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Rogue -- Sap {spellID = 6770, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Blind {spellID = 2094, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Cheap Shot {spellID = 1833, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Kidney Shot {spellID = 408, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Gouge {spellID = 1776, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Shaman -- Hex {spellID = 51514, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Static Charge {spellID = 118905, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Pulverize (Earth Elemental) {spellID = 118345, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Sundering {spellID = 197214, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Lightning Lasso (PvP Talent) {spellID = 204437, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Earthfury (PvP Talent) {spellID = 204399, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Warlock -- Fear {spellID = 118699, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Seduction (Succubus) {spellID = 6358, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mesmerize (Shivarra) {spellID = 115268, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Howl of Terror {spellID = 5484, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Axe Toss (Felguard) {spellID = 89766, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Shadowfury {spellID = 30283, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mortal Coil {spellID = 6789, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Meteor Strike (Abyssal) {spellID = 171156, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Warrior -- Intimidating Shout {spellID = 5246, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Storm Bolt {spellID = 132169, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Shockwave {spellID = 132168, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Warpath (Prot PvP Talent) {spellID = 199085, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Covenant -- Sulfuric Emission (Necrolord - Emeni Trait) {spellID = 324263, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Agent of Chaos (Venthyr - Nadjia Trait) {spellID = 331866, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Sparkling Driftglobe Core (Kyrian - Mikanikos Trait) {spellID = 332423, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Racial -- Quaking Palm (Pandaren) {spellID = 107079, unitID = "player", caster = "all", filter = "DEBUFF"}, -- War Stomp (Tauren) {spellID = 20549, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Bull Rush (Highmountain Tauren) {spellID = 255654, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Haymaker (Kul Tiran) {spellID = 287712, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Silences -- Strangulate {spellID = 47476, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Sigil of Silence {spellID = 204490, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Solar Beam {spellID = 78675, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Spider Sting {spellID = 202933, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Avenger's Shield {spellID = 31935, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Silence {spellID = 15487, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Garrote {spellID = 1330, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Unstable Affliction {spellID = 31117, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Roots -- Landslide {spellID = 355689, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Chains of Ice {spellID = 45524, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Entangling Roots {spellID = 339, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mass Entanglement {spellID = 102359, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Immobilized {spellID = 45334, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Binding Shot {spellID = 117526, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Tracker's Net {spellID = 212638, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Harpoon {spellID = 190925, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Steel Trap {spellID = 162480, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Frostbite {spellID = 198121, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Frost Nova {spellID = 122, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Ice Nova {spellID = 157997, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Freeze (Water Elemental) {spellID = 33395, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Disable {spellID = 116706, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Earthgrab {spellID = 64695, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Entrenched in Flame {spellID = 233582, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Slows -- Infected Wounds {spellID = 58180, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Typhoon {spellID = 61391, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Permeating Chill {spellID = 370898, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Concussive Shot {spellID = 5116, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Frost Breath (Chimaera) {spellID = 54644, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Bursting Shot {spellID = 186387, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Tar Trap {spellID = 135299, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Frozen Ammo {spellID = 162546, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Caltrops {spellID = 194279, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Pistol Shot {spellID = 185763, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Warp Time (Warp Stalker) {spellID = 35346, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Ankle Crack (Crocolisk) {spellID = 50433, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Blast Wave {spellID = 157981, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Cone of Cold {spellID = 120, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Flurry {spellID = 228671, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Slow {spellID = 31589, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Frostbolt {spellID = 116, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Flurry {spellID = 44614, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mind Flay {spellID = 15407, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Hand of Hindrance {spellID = 183218, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Deadly Throw {spellID = 26679, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Crippling Poison {spellID = 3409, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Earthbind {spellID = 3600, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Earthquake {spellID = 77505, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Frost Shock {spellID = 196840, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Thunderstorm {spellID = 51490, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Cripple (Doomguard) {spellID = 170995, unitID = "player", caster = "all", filter = "DEBUFF", absID = true}, -- Conflagrate {spellID = 17962, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Hamstring {spellID = 1715, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Piercing Howl {spellID = 12323, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Debilitate (Terrorguard) {spellID = 170996, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Other -- Dark Simulacrum {spellID = 77606, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Shroud of Purgatory {spellID = 116888, unitID = "player", caster = "player", filter = "DEBUFF"}, -- Cauterize {spellID = 87023, unitID = "player", caster = "player", filter = "DEBUFF"}, -- Nemesis {spellID = 206491, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Touch of Karma {spellID = 125174, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Smoke Bomb {spellID = 76577, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Rocket Fuel Leak {spellID = 94794, unitID = "player", caster = "player", filter = "DEBUFF"}, -- Duel {spellID = 236273, unitID = "player", caster = "all", filter = "DEBUFF"}, -- Mythic+ -- Necrotic Wound {spellID = 209858, unitID = "player", caster = "all", filter = "DEBUFF", count = 16}, }, { Name = "T_BUFF", Direction = "UP", Mode = "ICON", Interval = C.filger.pvp_space, Alpha = 1, IconSize = C.filger.pvp_size, Position = {"TOP", T_BUFF_Anchor}, -- Death Knight -- Anti-Magic Shell {spellID = 48707, unitID = "target", caster = "all", filter = "BUFF"}, -- Desecrated Ground {spellID = 115018, unitID = "target", caster = "all", filter = "BUFF"}, -- Lichborne {spellID = 287081, unitID = "target", caster = "all", filter = "BUFF"}, -- Icebound Fortitude {spellID = 48792, unitID = "target", caster = "all", filter = "BUFF"}, -- Pillar of Frost {spellID = 51271, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Asphyxiate {spellID = 108194, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Gnaw (Ghoul) {spellID = 91800, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Monstrous Blow (Mutated Ghoul) {spellID = 91797, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Strangulate {spellID = 47476, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Demon Hunter -- Metamorphosis {spellID = 162264, unitID = "target", caster = "all", filter = "BUFF", absID = true}, -- Spectral Sight {spellID = 188501, unitID = "target", caster = "all", filter = "BUFF"}, -- Netherwalk {spellID = 196555, unitID = "target", caster = "all", filter = "BUFF"}, -- Nether Bond {spellID = 207810, unitID = "target", caster = "all", filter = "BUFF"}, -- Soul Barrier {spellID = 263648, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Imprison {spellID = 217832, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Fel Eruption {spellID = 211881, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Chaos Nova {spellID = 179057, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Illidan's Grasp {spellID = 205630, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Druid -- Survival Instincts {spellID = 61336, unitID = "target", caster = "all", filter = "BUFF"}, -- Barkskin {spellID = 22812, unitID = "target", caster = "all", filter = "BUFF"}, -- Ironbark {spellID = 102342, unitID = "target", caster = "all", filter = "BUFF"}, -- Nature's Grasp {spellID = 170856, unitID = "target", caster = "all", filter = "BUFF"}, -- Stampeding Roar {spellID = 77764, unitID = "target", caster = "all", filter = "BUFF"}, -- Incarnation: Tree of Life {spellID = 117679, unitID = "target", caster = "all", filter = "BUFF"}, -- Berserk {spellID = 106951, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Cyclone {spellID = 33786, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Mighty Bash {spellID = 5211, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Rake {spellID = 163505, unitID = "target", caster = "all", filter = "DEBUFF", absID = true}, -- Maim {spellID = 22570, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Incapacitating Roar {spellID = 99, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Solar Beam {spellID = 78675, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Entangling Roots {spellID = 339, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Evoker -- Debuffs -- Sleep Walk {spellID = 360806, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Landslide {spellID = 355689, unitID = "target", caster = "all", filter = "DEBUFF", absID = true}, -- Hunter -- Aspect of the Turtle {spellID = 186265, unitID = "target", caster = "all", filter = "BUFF"}, -- Feign Death {spellID = 5384, unitID = "target", caster = "all", filter = "BUFF"}, -- Posthaste {spellID = 118922, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Freezing Trap {spellID = 3355, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Intimidation {spellID = 24394, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Scatter Shot {spellID = 213691, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Binding Shot {spellID = 117526, unitID = "target", caster = "all", filter = "DEBUFF", absID = true}, -- Steel Trap {spellID = 162480, unitID = "target", caster = "all", filter = "DEBUFF", absID = true}, -- Roar of Sacrifice {spellID = 53480, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Mage -- Ice Block {spellID = 45438, unitID = "target", caster = "all", filter = "BUFF"}, -- Invisibility {spellID = 66, unitID = "target", caster = "all", filter = "BUFF"}, -- Greater Invisibility {spellID = 113862, unitID = "target", caster = "all", filter = "BUFF"}, -- Combustion {spellID = 190319, unitID = "target", caster = "all", filter = "BUFF"}, -- Alter Time {spellID = 108978, unitID = "target", caster = "all", filter = "BUFF"}, -- Temporal Shield {spellID = 198111, unitID = "target", caster = "all", filter = "BUFF"}, -- Evocation {spellID = 12051, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Cauterize {spellID = 87023, unitID = "target", caster = "target", filter = "DEBUFF"}, -- Polymorph {spellID = 118, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Ring of Frost {spellID = 82691, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Dragon's Breath {spellID = 31661, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Monk -- Diffuse Magic {spellID = 122783, unitID = "target", caster = "all", filter = "BUFF"}, -- Touch of Karma {spellID = 125174, unitID = "target", caster = "all", filter = "BUFF"}, -- Ring of Peace {spellID = 116844, unitID = "target", caster = "all", filter = "BUFF"}, -- Dampen Harm {spellID = 122278, unitID = "target", caster = "all", filter = "BUFF"}, -- Nimble Brew {spellID = 213664, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Paralysis {spellID = 115078, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Leg Sweep {spellID = 119381, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Fists of Fury {spellID = 120086, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Song of Chi-Ji {spellID = 198898, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Paladin -- Divine Shield {spellID = 642, unitID = "target", caster = "all", filter = "BUFF"}, -- Guardian of Ancient Kings {spellID = 86659, unitID = "target", caster = "all", filter = "BUFF"}, -- Blessing of Protection {spellID = 1022, unitID = "target", caster = "all", filter = "BUFF"}, -- Divine Protection {spellID = 498, unitID = "target", caster = "all", filter = "BUFF"}, -- Ardent Defender {spellID = 31850, unitID = "target", caster = "all", filter = "BUFF"}, -- Avenging Wrath {spellID = 31884, unitID = "target", caster = "all", filter = "BUFF"}, -- Aura Mastery {spellID = 31821, unitID = "target", caster = "all", filter = "BUFF"}, -- Blessing of Spellwarding {spellID = 204018, unitID = "target", caster = "all", filter = "BUFF"}, -- Blessing of Sacrifice {spellID = 6940, unitID = "target", caster = "all", filter = "BUFF"}, -- Blessing of Freedom {spellID = 1044, unitID = "target", caster = "all", filter = "BUFF"}, -- Blessing of Sanctuary {spellID = 210256, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Repentance {spellID = 20066, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Hammer of Justice {spellID = 853, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Blinding Light {spellID = 105421, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Turn Evil {spellID = 10326, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Avenger's Shield {spellID = 31935, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Priest -- Dispersion {spellID = 47585, unitID = "target", caster = "all", filter = "BUFF"}, -- Pain Suppression {spellID = 33206, unitID = "target", caster = "all", filter = "BUFF"}, -- Guardian Spirit {spellID = 47788, unitID = "target", caster = "all", filter = "BUFF"}, -- Spectral Guise {spellID = 119030, unitID = "target", caster = "all", filter = "BUFF"}, -- Phantasm {spellID = 114239, unitID = "target", caster = "all", filter = "BUFF"}, -- Greater Fade --BETA {spellID = 213602, unitID = "target", caster = "all", filter = "BUFF"}, -- Holy Ward {spellID = 213610, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Dominate Mind {spellID = 605, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Psychic Horror {spellID = 64044, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Psychic Scream {spellID = 8122, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Mind Bomb {spellID = 205369, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Silence {spellID = 15487, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Rogue -- Cloak of Shadows {spellID = 31224, unitID = "target", caster = "all", filter = "BUFF"}, -- Cheating Death {spellID = 45182, unitID = "target", caster = "all", filter = "BUFF"}, -- Evasion {spellID = 5277, unitID = "target", caster = "all", filter = "BUFF"}, -- Combat Insight {spellID = 74002, unitID = "target", caster = "all", filter = "BUFF"}, -- Shadow Dance {spellID = 185313, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Sap {spellID = 6770, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Blind {spellID = 2094, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Cheap Shot {spellID = 1833, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Kidney Shot {spellID = 408, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Garrote {spellID = 1330, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Smoke Bomb {spellID = 76577, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Shaman -- Grounding Totem {spellID = 8178, unitID = "target", caster = "all", filter = "BUFF"}, -- Spiritwalker's Grace {spellID = 79206, unitID = "target", caster = "all", filter = "BUFF"}, -- Astral Shift {spellID = 108271, unitID = "target", caster = "all", filter = "BUFF"}, -- Ascendance {spellID = 114052, unitID = "target", caster = "all", filter = "BUFF"}, -- Ethereal Form {spellID = 210918, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Hex {spellID = 51514, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Static Charge {spellID = 118905, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Pulverize (Earth Elemental) {spellID = 118345, unitID = "target", caster = "all", filter = "DEBUFF", absID = true}, -- Sundering {spellID = 197214, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Lightning Lasso (PvP Talent) {spellID = 204437, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Earthfury (PvP Talent) {spellID = 204399, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Warlock -- Soulstone {spellID = 20707, unitID = "target", caster = "all", filter = "BUFF"}, -- Unending Resolve {spellID = 104773, unitID = "target", caster = "all", filter = "BUFF"}, -- Nether Ward {spellID = 212295, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Banish {spellID = 710, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Axe Toss (Felguard) {spellID = 89766, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Fear {spellID = 118699, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Seduction (Succubus) {spellID = 6358, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Mesmerize (Shivarra) {spellID = 115268, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Howl of Terror {spellID = 5484, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Mortal Coil {spellID = 6789, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Shadowfury {spellID = 30283, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Meteor Strike (Abyssal) {spellID = 171156, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Unstable Affliction {spellID = 31117, unitID = "target", caster = "all", filter = "DEBUFF", absID = true}, -- Warrior -- Bladestorm {spellID = 46924, unitID = "target", caster = "all", filter = "BUFF"}, -- Spell Reflection {spellID = 23920, unitID = "target", caster = "all", filter = "BUFF"}, -- Mass Spell Reflection {spellID = 213915, unitID = "target", caster = "all", filter = "BUFF"}, -- Shield Wall {spellID = 871, unitID = "target", caster = "all", filter = "BUFF"}, -- Die by the Sword {spellID = 118038, unitID = "target", caster = "all", filter = "BUFF"}, -- Last Stand {spellID = 12975, unitID = "target", caster = "all", filter = "BUFF"}, -- Berserker Rage {spellID = 18499, unitID = "target", caster = "all", filter = "BUFF"}, -- Enraged Regeneration {spellID = 184364, unitID = "target", caster = "all", filter = "BUFF"}, -- War Banner {spellID = 236321, unitID = "target", caster = "all", filter = "BUFF"}, -- Debuffs -- Intimidating Shout {spellID = 5246, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Storm Bolt {spellID = 132169, unitID = "target", caster = "all", filter = "DEBUFF", absID = true}, -- Shockwave {spellID = 132168, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Racial -- Quaking Palm (Pandaren) {spellID = 107079, unitID = "target", caster = "all", filter = "DEBUFF"}, -- War Stomp (Tauren) {spellID = 20549, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Haymaker (Kul Tiran) {spellID = 287712, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Player vs. Player -- Battlegrounds -- Netherstorm Flag {spellID = 34976, unitID = "target", caster = "all", filter = "BUFF"}, -- Orb of Power {spellID = 121175, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Warsong Flag {spellID = 23333, unitID = "target", caster = "all", filter = "BUFF"}, {spellID = 23335, unitID = "target", caster = "all", filter = "BUFF"}, -- Seaforium Bombs {spellID = 66271, unitID = "target", caster = "all", filter = "DEBUFF"}, -- Drinking in Arena -- Drink {spellID = 80167, unitID = "target", caster = "all", filter = "BUFF"}, -- Refreshment [Mage Food] {spellID = 167152, unitID = "target", caster = "all", filter = "BUFF"}, -- Food & Drink {spellID = 257427, unitID = "target", caster = "all", filter = "BUFF"}, -- Mythic+ -- Sanguine Ichor {spellID = 226510, unitID = "target", caster = "all", filter = "BUFF"}, }, }, } -- Common colldowns for all classes T.CustomFilgerSpell = T.CustomFilgerSpell or {} do -- Racial local _, race = UnitRace("player") if race == "Human" then -- Will to Survive tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 59752, filter = "CD"}}) elseif race == "Orc" then -- Blood Fury tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 20572, filter = "CD"}}) elseif race == "Dwarf" then -- Stoneform tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 20594, filter = "CD"}}) elseif race == "NightElf" then -- Shadowmeld tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 58984, filter = "CD"}}) elseif race == "Scourge" then -- Will of the Forsaken tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 7744, filter = "CD"}}) -- Cannibalize tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 20577, filter = "CD"}}) elseif race == "Tauren" then -- War Stomp tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 20549, filter = "CD"}}) elseif race == "Gnome" then -- Escape Artist tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 20589, filter = "CD"}}) elseif race == "Troll" then -- Berserking tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 26297, filter = "CD", absID = true}}) elseif race == "Goblin" then -- Rocket Jump tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 69070, filter = "CD"}}) elseif race == "BloodElf" then -- Arcane Torrent tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 69179, filter = "CD"}}) elseif race == "Draenei" then -- Gift of the Naaru tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 28880, filter = "CD"}}) elseif race == "Worgen" then -- Darkflight tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 68992, filter = "CD"}}) elseif race == "Pandaren" then -- Quaking Palm tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 107079, filter = "CD"}}) elseif race == "DarkIronDwarf" then -- Fireblood tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 265221, filter = "CD"}}) elseif race == "KulTiran" then -- Haymaker tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 287712, filter = "CD"}}) elseif race == "HighmountainTauren" then -- Bull Rush tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 255654, filter = "CD"}}) elseif race == "Vulpera" then -- Bag of Tricks tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 312411, filter = "CD"}}) elseif race == "LightforgedDraenei" then -- Light's Judgment tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 255647, filter = "CD"}}) elseif race == "ZandalariTroll" then -- Regeneratin' tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 291944, filter = "CD"}}) elseif race == "MagharOrc" then -- Ancestral Call tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 274738, filter = "CD"}}) elseif race == "Dracthyr" then -- Tail Swipe tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 368970, filter = "CD"}}) -- Wing Buffet tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = 357214, filter = "CD"}}) end -- Items -- Back tinsert(T.CustomFilgerSpell, {"COOLDOWN", {slotID = 15, filter = "CD"}}) -- Belt tinsert(T.CustomFilgerSpell, {"COOLDOWN", {slotID = 6, filter = "CD"}}) -- Gloves tinsert(T.CustomFilgerSpell, {"COOLDOWN", {slotID = 10, filter = "CD"}}) -- Neck tinsert(T.CustomFilgerSpell, {"COOLDOWN", {slotID = 2, filter = "CD"}}) -- Rings tinsert(T.CustomFilgerSpell, {"COOLDOWN", {slotID = 11, filter = "CD"}}) tinsert(T.CustomFilgerSpell, {"COOLDOWN", {slotID = 12, filter = "CD"}}) -- Trinkets tinsert(T.CustomFilgerSpell, {"COOLDOWN", {slotID = 13, filter = "CD"}}) tinsert(T.CustomFilgerSpell, {"COOLDOWN", {slotID = 14, filter = "CD"}}) local isTank = {["DEATHKNIGHT"] = true, ["DEMONHUNTER"] = true, ["DRUID"] = true, ["MONK"] = true, ["PALADIN"] = true, ["WARRIOR"] = true} local isHealer = {["DRUID"] = true, ["EVOKER"] = true, ["MONK"] = true, ["PALADIN"] = true, ["PRIEST"] = true, ["SHAMAN"] = true} local strengthClass = {["DEATHKNIGHT"] = true, ["PALADIN"] = true, ["WARRIOR"] = true} local agilityClass = {["DEMONHUNTER"] = true, ["DRUID"] = true, ["HUNTER"] = true, ["MONK"] = true, ["ROGUE"] = true, ["SHAMAN"] = true} local intellectClass = {["DRUID"] = true, ["EVOKER"] = true, ["MAGE"] = true, ["MONK"] = true, ["PALADIN"] = true, ["PRIEST"] = true, ["SHAMAN"] = true, ["WARLOCK"] = true} -- Trinkets if strengthClass[T.class] then -- Bound by Fire and Blaze [Blazebinder's Hoof] tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 383926, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) -- Bonemaw's Big Toe tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 397400, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) end if agilityClass[T.class] then -- Bottle of Spiraling Winds tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 383751, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) -- Windswept Pages tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 126483, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) end if agilityClass[T.class] or strengthClass[T.class] then -- Scent of Blood [Hunger of the Pack] tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 213888, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) -- Algeth'ar Puzzle tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 383781, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) end if intellectClass[T.class] then -- Power Theft tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 382126, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) end if isHealer[T.class] then -- Broodkeeper's Promise tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 377462, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) -- Voidmender's Shadowgem tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 397399, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) end -- Crumbling Power [Irideus Fragment] tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 383941, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) -- Whispering Incarnate Icon tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 377452, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) -- Valarjar's Path [Horn of Valor] tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = 215956, unitID = "player", caster = "all", filter = "BUFF", absID = true}}) end ================================================ FILE: ShestakUI/Config/Filters/Nameplates.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.nameplate.enable ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Polymorph -> http://www.wowhead.com/spell=118 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- local function SpellName(id) local name = GetSpellInfo(id) if name then return name else print("|cffff0000WARNING: spell ID ["..tostring(id).."] no longer exists! Report this to Shestak.|r") return "Empty" end end T.DebuffWhiteList = { -- Death Knight [SpellName(108194)] = true, -- Asphyxiate [SpellName(47476)] = true, -- Strangulate [SpellName(55078)] = true, -- Blood Plague [SpellName(55095)] = true, -- Frost Fever -- Druid [SpellName(33786)] = true, -- Cyclone [SpellName(339)] = true, -- Entangling Roots [SpellName(164812)] = true, -- Moonfire [SpellName(164815)] = true, -- Sunfire [SpellName(58180)] = true, -- Infected Wounds [SpellName(155722)] = true, -- Rake [SpellName(1079)] = true, -- Rip -- Evoker [SpellName(360806)] = true, -- Sleep Walk -- Hunter [SpellName(3355)] = true, -- Freezing Trap [SpellName(194279)] = true, -- Caltrops [SpellName(13812)] = true, -- Explosive Trap [SpellName(217200)] = true, -- Barbed Shot -- Mage [SpellName(118)] = true, -- Polymorph [SpellName(31661)] = true, -- Dragon's Breath [SpellName(122)] = true, -- Frost Nova [SpellName(44457)] = true, -- Living Bomb [SpellName(114923)] = true, -- Nether Tempest [SpellName(120)] = true, -- Cone of Cold -- Monk [SpellName(115078)] = true, -- Paralysis -- Paladin [SpellName(20066)] = true, -- Repentance [SpellName(853)] = true, -- Hammer of Justice [SpellName(183218)] = true, -- Hand of Hindrance -- Priest [SpellName(204213)] = true, -- Purge the Wicked [SpellName(9484)] = true, -- Shackle Undead [SpellName(8122)] = true, -- Psychic Scream [SpellName(64044)] = true, -- Psychic Horror [SpellName(15487)] = true, -- Silence [SpellName(589)] = true, -- Shadow Word: Pain [SpellName(34914)] = true, -- Vampiric Touch -- Rogue [SpellName(6770)] = true, -- Sap [SpellName(2094)] = true, -- Blind [SpellName(1776)] = true, -- Gouge -- Shaman [SpellName(51514)] = true, -- Hex [SpellName(3600)] = true, -- Earthbind [SpellName(196840)] = true, -- Frost Shock [SpellName(188389)] = true, -- Flame Shock [SpellName(197209)] = true, -- Lightning Rod -- Warlock [SpellName(710)] = true, -- Banish [SpellName(6789)] = true, -- Mortal Coil [SpellName(5782)] = true, -- Fear [SpellName(5484)] = true, -- Howl of Terror [SpellName(6358)] = true, -- Seduction [SpellName(30283)] = true, -- Shadowfury [SpellName(603)] = true, -- Doom [SpellName(980)] = true, -- Agony [SpellName(146739)] = true, -- Corruption [SpellName(48181)] = true, -- Haunt [SpellName(348)] = true, -- Immolate [SpellName(30108)] = true, -- Unstable Affliction -- Warrior [SpellName(5246)] = true, -- Intimidating Shout [SpellName(132168)] = true, -- Shockwave [SpellName(115767)] = true, -- Deep Wounds -- Racial [SpellName(20549)] = true, -- War Stomp (Tauren) [SpellName(107079)] = true, -- Quaking Palm (Pandaren) } for _, spell in pairs(C.nameplate.debuffs_list) do T.DebuffWhiteList[SpellName(spell)] = true end T.DebuffBlackList = { -- [SpellName(spellID)] = true, -- Spell Name } T.BuffWhiteList = { [SpellName(226510)] = true, -- Sanguine Ichor } for _, spell in pairs(C.nameplate.buffs_list) do T.BuffWhiteList[SpellName(spell)] = true end T.BuffBlackList = { -- [SpellName(spellID)] = true, -- Spell Name } T.PlateBlacklist = { ["24207"] = true, -- Army of the Dead ["29630"] = true, -- Fanged Pit Viper (Gundrak) ["55659"] = true, -- Wild Imp ["167966"] = true, -- Experimental Sludge (De Other Side) } T.InterruptCast = { -- Yellow border for interruptible cast -- Algeth'ar Academy [396812] = true, -- Mystic Blast [332612] = true, -- Healing Touch [377389] = true, -- Call of the Flock [387843] = true, -- Astral Bomb -- The Azure Vault [370225] = true, -- Shriek -- The Nokhud Offensive [386024] = true, -- Tempest [373395] = true, -- Bloodcurdling Shout -- Halls of Valor [215433] = true, -- Holy Radiance -- Shadowmoon Burial Grounds [152818] = true, -- Shadow Mend -- Temple of the Jade Serpent [395859] = true, -- Haunting Scream } T.ImportantCast = { -- Red border for non-interruptible cast -- The Nokhud Offensive [383823] = true, -- Rally the Clan -- Ruby Life Pools [372743] = true, -- Ice Shield -- Court of Stars [210261] = true, -- Sound Alarm } local color = C.nameplate.mob_color local color_alt = {0, 0.7, 0.6} T.ColorPlate = { -- Algeth'ar Academy ["196548"] = color, -- Ancient Branch -- The Azure Vault ["187159"] = color_alt, -- Shrieking Whelp -- The Nokhud Offensive ["194894"] = color, -- Primalist Stormspeaker -- Temple of the Jade Serpent ["59555"] = color, -- Haunting Sha ["59545"] = color, -- The Golden Beetle -- Court of Stars ["104251"] = color_alt, -- Duskwatch Sentry -- PvP ["5925"] = color, -- Grounding Totem } T.ShortNames = { -- Академия Алгет'ар ["Рассерженная стрекотуха"] = "Cтрекотуха", ["Мерзкий плеточник"] = "Плеточник", ["Алгет'арский охранник"] = "Охранник", ["Алгет'арский рыцарь эха"] = "Рыцарь", ["Алгет'арская заклинательница"] = "Заклинательница", ["Алгет'арский целитель"] = "Целитель", -- Наступление клана Нокхуд ["Мастер копья из клана Нокхуд"] = "Мастер копья", ["Лучница из клана Нокхуд"] = "Лучница", ["Боевое копье клана Нокхуд"] = "Копье", ["Трубач из клана Нокхуд"] = "Трубач", ["Нокхудский копейщик"] = "Копейщик", ["Громовой кулак из клана Нокхуд"] = "Кулак", ["Псарь из клана Нокхуд"] = "Псарь", ["Заступник из клана Нокхуд"] = "Заступник", -- Квартал Звезд ["Караульный из Сумеречной стражи"] = "Караульный", ["Часовой из Сумеречной стражи"] = "Часовой", ["Бдительный инквизитор"] = "Инквизитор", ["Пылающий бес"] = "Бес", ["Порабощенная Скверной карательница"] = "Карательница", } ================================================ FILE: ShestakUI/Config/Filters/OpenItems.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.automation.open_items ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete item is to go at www.wowhead.com, search for a item. -- Example: A Sack of Coins -> http://www.wowhead.com/item=5335 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- T.OpenItems = { [5335] = true, -- A Sack of Coins [6307] = true, -- Message in a Bottle [6351] = true, -- Dented Crate [6352] = true, -- Waterlogged Crate [6353] = true, -- Small Chest [6356] = true, -- Battered Chest [6357] = true, -- Sealed Crate [6643] = true, -- Bloated Smallfish [6645] = true, -- Bloated Mud Snapper [6647] = true, -- Bloated Catfish [8366] = true, -- Bloated Trout [9276] = true, -- Pirate's Footlocker [9363] = true, -- Sparklematic-Wrapped Box [10752] = true, -- Emerald Encrusted Chest [11024] = true, -- Evergreen Herb Casing [11422] = true, -- Goblin Engineer's Renewal Gift [11423] = true, -- Gnome Engineer's Renewal Gift [11568] = true, -- Torwa's Pouch [11617] = true, -- Eridan's Supplies [11912] = true, -- Package of Empty Ooze Containers [11937] = true, -- Fat Sack of Coins [11938] = true, -- Sack of Gems [11955] = true, -- Bag of Empty Ooze Containers [11966] = true, -- Small Sack of Coins [12122] = true, -- Kum'isha's Junk [12339] = true, -- Vaelan's Gift [13874] = true, -- Heavy Crate [13881] = true, -- Bloated Redgill [13891] = true, -- Bloated Salmon [15876] = true, -- Nathanos' Chest [15902] = true, -- A Crazy Grab Bag [17685] = true, -- Smokywood Pastures Sampler [17726] = true, -- Smokywood Pastures Special Gift [17727] = true, -- Smokywood Pastures Gift Pack [17962] = true, -- Blue Sack of Gems [17963] = true, -- Green Sack of Gems [17964] = true, -- Gray Sack of Gems [17965] = true, -- Yellow Sack of Gems [17969] = true, -- Red Sack of Gems [18804] = true, -- Lord Grayson's Satchel [19035] = true, -- Lard's Special Picnic Basket [19150] = true, -- Sentinel Basic Care Package [19151] = true, -- Sentinel Standard Care Package [19152] = true, -- Sentinel Advanced Care Package [19153] = true, -- Outrider Advanced Care Package [19154] = true, -- Outrider Basic Care Package [19155] = true, -- Outrider Standard Care Package [19422] = true, -- Darkmoon Faire Fortune [20228] = true, -- Defiler's Advanced Care Package [20229] = true, -- Defiler's Basic Care Package [20230] = true, -- Defiler's Standard Care Package [20231] = true, -- Arathor Advanced Care Package [20233] = true, -- Arathor Basic Care Package [20236] = true, -- Arathor Standard Care Package [20469] = true, -- Decoded True Believer Clippings [20708] = true, -- Tightly Sealed Trunk [20766] = true, -- Slimy Bag [20767] = true, -- Scum Covered Bag [20768] = true, -- Oozing Bag [21113] = true, -- Watertight Trunk [21150] = true, -- Iron Bound Trunk [21156] = true, -- Scarab Bag [21164] = true, -- Bloated Rockscale Cod [21191] = true, -- Carefully Wrapped Present [21216] = true, -- Smokywood Pastures Extra-Special Gift [21228] = true, -- Mithril Bound Trunk [21270] = true, -- Gently Shaken Gift [21271] = true, -- Gently Shaken Gift [21310] = true, -- Gaily Wrapped Present [21315] = true, -- Smokywood Satchel [21327] = true, -- Ticking Present [21363] = true, -- Festive Gift [21640] = true, -- Lunar Festival Fireworks Pack [21746] = true, -- Lucky Red Envelope [22746] = true, -- Buccaneer's Uniform [23022] = true, -- Curmudgeon's Payoff [23846] = true, -- Nolkai's Box [24336] = true, -- Fireproof Satchel [24402] = true, -- Package of Identified Plants [25419] = true, -- Unmarked Bag of Gems [25422] = true, -- Bulging Sack of Gems [25423] = true, -- Bag of Premium Gems [25424] = true, -- Gem-Stuffed Envelope [27446] = true, -- Mr. Pinchy's Gift [27481] = true, -- Heavy Supply Crate [27511] = true, -- Inscribed Scrollcase [27513] = true, -- Curious Crate [30260] = true, -- Voren'thal's Package [30650] = true, -- Dertrok's Wand Case [31408] = true, -- Offering of the Sha'tar [31522] = true, -- Primal Mooncloth Supplies [31800] = true, -- Outcast's Cache [31955] = true, -- Arelion's Knapsack [32064] = true, -- Protectorate Treasure Cache [32462] = true, -- Morthis' Materials [32624] = true, -- Large Iron Metamorphosis Geode [32625] = true, -- Small Iron Metamorphosis Geode [32626] = true, -- Large Copper Metamorphosis Geode [32627] = true, -- Small Copper Metamorphosis Geode [32628] = true, -- Large Silver Metamorphosis Geode [32629] = true, -- Large Gold Metamorphosis Geode [32630] = true, -- Small Gold Metamorphosis Geode [32631] = true, -- Small Silver Metamorphosis Geode [32724] = true, -- Sludge-Covered Object [32777] = true, -- Kronk's Grab Bag [32835] = true, -- Ogri'la Care Package [33045] = true, -- Renn's Supplies [33844] = true, -- Barrel of Fish [33857] = true, -- Crate of Meat [33926] = true, -- Sealed Scroll Case [33928] = true, -- Hollowed Bone Decanter [34077] = true, -- Crudely Wrapped Gift [34119] = true, -- Black Conrad's Treasure [34583] = true, -- Aldor Supplies Package [34584] = true, -- Scryer Supplies Package [34585] = true, -- Scryer Supplies Package [34587] = true, -- Aldor Supplies Package [34592] = true, -- Aldor Supplies Package [34593] = true, -- Scryer Supplies Package [34594] = true, -- Scryer Supplies Package [34595] = true, -- Aldor Supplies Package [34846] = true, -- Black Sack of Gems [34863] = true, -- Bag of Fishing Treasures [34871] = true, -- Crafty's Sack [35232] = true, -- Shattered Sun Supplies [35286] = true, -- Bloated Giant Sunfish [35313] = true, -- Bloated Barbed Gill Trout [35348] = true, -- Bag of Fishing Treasures [35512] = true, -- Pocket Full of Snow [35792] = true, -- Mage Hunter Personal Effects [35945] = true, -- Brilliant Glass [37168] = true, -- Mysterious Tarot [37586] = true, -- Handful of Treats [39418] = true, -- Ornately Jeweled Box [39883] = true, -- Cracked Egg [41426] = true, -- Magically Wrapped Gift [43346] = true, -- Large Satchel of Spoils [43347] = true, -- Satchel of Spoils [43556] = true, -- Patroller's Pack [44113] = true, -- Small Spice Bag [44142] = true, -- Strange Tarot [44161] = true, -- Arcane Tarot [44163] = true, -- Shadowy Tarot [44475] = true, -- Reinforced Crate [44663] = true, -- Abandoned Adventurer's Satchel [44700] = true, -- Brooding Darkwater Clam [44718] = true, -- Ripe Disgusting Jar [44751] = true, -- Hyldnir Spoils [44943] = true, -- Icy Prism [44951] = true, -- Box of Bombs [45072] = true, -- Brightly Colored Egg [45328] = true, -- Bloated Slippery Eel [45724] = true, -- Champion's Purse [45875] = true, -- Sack of Ulduar Spoils [45878] = true, -- Large Sack of Ulduar Spoils [46007] = true, -- Bag of Fishing Treasures [46809] = true, -- Bountiful Cookbook [46810] = true, -- Bountiful Cookbook [49294] = true, -- Ashen Sack of Gems [49631] = true, -- Standard Apothecary Serving Kit [49909] = true, -- Box of Chocolates [49926] = true, -- Brazie's Black Book of Secrets [50160] = true, -- Lovely Dress Box [50161] = true, -- Dinner Suit Box [50238] = true, -- Cracked Un'Goro Coconut [50301] = true, -- Landro's Pet Box [50409] = true, -- Spark's Fossil Finding Kit [51316] = true, -- Unsealed Chest [51999] = true, -- Satchel of Helpful Goods [52000] = true, -- Satchel of Helpful Goods [52001] = true, -- Satchel of Helpful Goods [52002] = true, -- Satchel of Helpful Goods [52003] = true, -- Satchel of Helpful Goods [52004] = true, -- Satchel of Helpful Goods [52005] = true, -- Satchel of Helpful Goods [52274] = true, -- Earthen Ring Supplies [52304] = true, -- Fire Prism [52344] = true, -- Earthen Ring Supplies [52676] = true, -- Cache of the Ley-Guardian [54516] = true, -- Loot-Filled Pumpkin [54535] = true, -- Keg-Shaped Treasure Chest [54536] = true, -- Satchel of Chilled Goods [54537] = true, -- Heart-Shaped Box [57540] = true, -- Coldridge Mountaineer's Pouch [60681] = true, -- Cannary's Cache [61387] = true, -- Hidden Stash [62062] = true, -- Bulging Sack of Gold [64491] = true, -- Royal Reward [64657] = true, -- Canopic Jar [65513] = true, -- Crate of Tasty Meat [66943] = true, -- Treasures from Grim Batol [67248] = true, -- Satchel of Helpful Goods [67250] = true, -- Satchel of Helpful Goods [67414] = true, -- Bag of Shiny Things [67495] = true, -- Strange Bloated Stomach [67539] = true, -- Tiny Treasure Chest [67597] = true, -- Sealed Crate [68384] = true, -- Moonkin Egg [68598] = true, -- Very Fat Sack of Coins [68689] = true, -- Imported Supplies [68795] = true, -- Stendel's Bane [68813] = true, -- Satchel of Freshly-Picked Herbs [69817] = true, -- Hive Queen's Honeycomb [69818] = true, -- Giant Sack [69822] = true, -- Master Chef's Groceries [69823] = true, -- Gub's Catch [69886] = true, -- Bag of Coins [69903] = true, -- Satchel of Exotic Mysteries [69999] = true, -- Moat Monster Feeding Kit [70719] = true, -- Water-Filled Gills [70931] = true, -- Scrooge's Payoff [71631] = true, -- Zen'Vorka's Cache [72201] = true, -- Plump Intestines [73792] = true, -- Stolen Present [77501] = true, -- Blue Blizzcon Bag [78897] = true, -- Pouch o' Tokens [78898] = true, -- Sack o' Tokens [78899] = true, -- Pouch o' Tokens [78900] = true, -- Pouch o' Tokens [78901] = true, -- Pouch o' Tokens [78902] = true, -- Pouch o' Tokens [78903] = true, -- Pouch o' Tokens [78904] = true, -- Pouch o' Tokens [78905] = true, -- Sack o' Tokens [78906] = true, -- Sack o' Tokens [78907] = true, -- Sack o' Tokens [78908] = true, -- Sack o' Tokens [78909] = true, -- Sack o' Tokens [78910] = true, -- Sack o' Tokens [78930] = true, -- Sealed Crate [85223] = true, -- Enigma Seed Pack [85224] = true, -- Basic Seed Pack [85225] = true, -- Basic Seed Pack [85226] = true, -- Basic Seed Pack [85227] = true, -- Special Seed Pack [85271] = true, -- Secret Stash [85272] = true, -- Tree Seed Pack [85275] = true, -- Chee Chee's Goodie Bag [85276] = true, -- Celebration Gift [85277] = true, -- Nicely Packed Lunch [85497] = true, -- Chirping Package [85498] = true, -- Songbell Seed Pack [86428] = true, -- Old Man Thistle's Treasure [86595] = true, -- Bag of Helpful Things [86623] = true, -- Blingtron 004000 Gift Package [87217] = true, -- Small Bag of Goods [87218] = true, -- Big Bag of Arms [87219] = true, -- Huge Bag of Herbs [87220] = true, -- Big Bag of Mysteries [87221] = true, -- Big Bag of Jewels [87222] = true, -- Big Bag of Linens [87223] = true, -- Big Bag of Skins [87224] = true, -- Big Bag of Wonders [87225] = true, -- Big Bag of Food [87391] = true, -- Plundered Treasure [87533] = true, -- Crate of Dwarven Archaeology Fragments [87534] = true, -- Crate of Draenei Archaeology Fragments [87535] = true, -- Crate of Fossil Archaeology Fragments [87536] = true, -- Crate of Night Elf Archaeology Fragments [87537] = true, -- Crate of Nerubian Archaeology Fragments [87538] = true, -- Crate of Orc Archaeology Fragments [87539] = true, -- Crate of Tol'vir Archaeology Fragments [87540] = true, -- Crate of Troll Archaeology Fragments [87541] = true, -- Crate of Vrykul Archaeology Fragments [87701] = true, -- Sack of Raw Tiger Steaks [87702] = true, -- Sack of Mushan Ribs [87703] = true, -- Sack of Raw Turtle Meat [87704] = true, -- Sack of Raw Crab Meat [87705] = true, -- Sack of Wildfowl Breasts [87706] = true, -- Sack of Green Cabbages [87707] = true, -- Sack of Juicycrunch Carrots [87708] = true, -- Sack of Mogu Pumpkins [87709] = true, -- Sack of Scallions [87710] = true, -- Sack of Red Blossom Leeks [87712] = true, -- Sack of Witchberries [87713] = true, -- Sack of Jade Squash [87714] = true, -- Sack of Striped Melons [87715] = true, -- Sack of Pink Turnips [87716] = true, -- Sack of White Turnips [87721] = true, -- Sack of Jade Lungfish [87722] = true, -- Sack of Giant Mantis Shrimp [87723] = true, -- Sack of Emperor Salmon [87724] = true, -- Sack of Redbelly Mandarin [87725] = true, -- Sack of Tiger Gourami [87726] = true, -- Sack of Jewel Danio [87727] = true, -- Sack of Reef Octopus [87728] = true, -- Sack of Krasarang Paddlefish [87729] = true, -- Sack of Golden Carp [87730] = true, -- Sack of Crocolisk Belly [88496] = true, -- Sealed Crate [89427] = true, -- Ancient Mogu Treasure [89428] = true, -- Ancient Mogu Treasure [89607] = true, -- Crate of Leather [89608] = true, -- Crate of Ore [89609] = true, -- Crate of Dust [89610] = true, -- Pandaria Herbs [89613] = true, -- Cache of Treasures [89810] = true, -- Bounty of a Sundered Land [89991] = true, -- Pandaria Fireworks [90395] = true, -- Facets of Research [90397] = true, -- Facets of Research [90398] = true, -- Facets of Research [90399] = true, -- Facets of Research [90400] = true, -- Facets of Research [90401] = true, -- Facets of Research [90406] = true, -- Facets of Research [90537] = true, -- Winner's Reward [90621] = true, -- Hero's Purse [90622] = true, -- Hero's Purse [90623] = true, -- Hero's Purse [90624] = true, -- Hero's Purse [90626] = true, -- Hero's Purse [90627] = true, -- Hero's Purse [90628] = true, -- Hero's Purse [90629] = true, -- Hero's Purse [90630] = true, -- Hero's Purse [90631] = true, -- Hero's Purse [90632] = true, -- Hero's Purse [90633] = true, -- Hero's Purse [90634] = true, -- Hero's Purse [90635] = true, -- Hero's Purse [90735] = true, -- Goodies from Nomi [90818] = true, -- Misty Satchel of Exotic Mysteries [90839] = true, -- Cache of Sha-Touched Gold [90840] = true, -- Marauder's Gleaming Sack of Gold [91086] = true, -- Darkmoon Pet Supplies [92718] = true, -- Brawler's Purse [92744] = true, -- Heavy Sack of Gold [92788] = true, -- Ride Ticket Book [92789] = true, -- Ride Ticket Book [92790] = true, -- Ride Ticket Book [92791] = true, -- Ride Ticket Book [92792] = true, -- Ride Ticket Book [92793] = true, -- Ride Ticket Book [92794] = true, -- Ride Ticket Book [92813] = true, -- Greater Cache of Treasures [92960] = true, -- Silkworm Cocoon [93198] = true, -- Tome of the Tiger [93199] = true, -- Tome of the Crane [93200] = true, -- Tome of the Serpent [93360] = true, -- Serpent's Cache [93626] = true, -- Stolen Present [93724] = true, -- Darkmoon Game Prize [94158] = true, -- Big Bag of Zandalari Supplies [94159] = true, -- Small Bag of Zandalari Supplies [94219] = true, -- Arcane Trove [94220] = true, -- Sunreaver Bounty [94296] = true, -- Cracked Primal Egg [94553] = true, -- Notes on Lightning Steel [94566] = true, -- Fortuitous Coffer [95343] = true, -- Treasures of the Thunder King [95469] = true, -- Serpent's Heart [95601] = true, -- Shiny Pile of Refuse [95602] = true, -- Stormtouched Cache [95617] = true, -- Dividends of the Everlasting Spring [95618] = true, -- Cache of Mogu Riches [95619] = true, -- Amber Encased Treasure Pouch [97153] = true, -- Spoils of the Thunder King [97565] = true, -- Unclaimed Black Market Container [97948] = true, -- Surplus Supplies [97949] = true, -- Surplus Supplies [97950] = true, -- Surplus Supplies [97951] = true, -- Surplus Supplies [97952] = true, -- Surplus Supplies [97953] = true, -- Surplus Supplies [97954] = true, -- Surplus Supplies [97955] = true, -- Surplus Supplies [97956] = true, -- Surplus Supplies [97957] = true, -- Surplus Supplies [98096] = true, -- Large Sack of Coins [98097] = true, -- Huge Sack of Coins [98098] = true, -- Bulging Sack of Coins [98099] = true, -- Giant Sack of Coins [98100] = true, -- Humongous Sack of Coins [98101] = true, -- Enormous Sack of Coins [98102] = true, -- Overflowing Sack of Coins [98103] = true, -- Gigantic Sack of Coins [98133] = true, -- Greater Cache of Treasures [98560] = true, -- Arcane Trove [98562] = true, -- Sunreaver Bounty [102137] = true, -- Unclaimed Black Market Container [103624] = true, -- Treasures of the Vale [103632] = true, -- Lucky Box of Greatness [104034] = true, -- Purse of Timeless Coins [104035] = true, -- Giant Purse of Timeless Coins [104112] = true, -- Curious Ticking Parcel [104114] = true, -- Curious Ticking Parcel [104198] = true, -- Mantid Artifact Hunter's Kit [104258] = true, -- Glowing Green Ash [104260] = true, -- Satchel of Cosmic Mysteries [104261] = true, -- Glowing Blue Ash [104263] = true, -- Glinting Pile of Stone [104268] = true, -- Pristine Stalker Hide [104271] = true, -- Coalesced Turmoil [104272] = true, -- Celestial Treasure Box [104273] = true, -- Flame-Scarred Cache of Offerings [104275] = true, -- Twisted Treasures of the Vale [104292] = true, -- Partially-Digested Meal [104296] = true, -- Ordon Ceremonial Robes [105713] = true, -- Twisted Treasures of the Vale [105714] = true, -- Coalesced Turmoil [105751] = true, -- Kor'kron Shaman's Treasure [106130] = true, -- Big Bag of Herbs [107077] = true, -- Bag of Transformers [107270] = true, -- Bound Traveler's Scroll [107271] = true, -- Frozen Envelope [108738] = true, -- Giant Draenor Clam [108740] = true, -- Stolen Weapons [110278] = true, -- Engorged Stomach [110592] = true, -- Unclaimed Black Market Container [110678] = true, -- Darkmoon Ticket Fanny Pack [111598] = true, -- Gold Strongbox [111599] = true, -- Silver Strongbox [111600] = true, -- Bronze Strongbox [112108] = true, -- Cracked Egg [112623] = true, -- Pack of Fishing Supplies [113258] = true, -- Blingtron 5000 Gift Package [114028] = true, -- Small Pouch of Coins [114634] = true, -- Icy Satchel of Helpful Goods [114641] = true, -- Icy Satchel of Helpful Goods [114648] = true, -- Scorched Satchel of Helpful Goods [114655] = true, -- Scorched Satchel of Helpful Goods [114662] = true, -- Tranquil Satchel of Helpful Goods [114669] = true, -- Tranquil Satchel of Helpful Goods [114970] = true, -- Small Pouch of Coins [116062] = true, -- Greater Darkmoon Pet Supplies [116111] = true, -- Small Pouch of Coins [116129] = true, -- Dessicated Orc's Coin Pouch [116202] = true, -- Pet Care Package [116376] = true, -- Small Pouch of Coins [116404] = true, -- Pilgrim's Bounty [116761] = true, -- Winter Veil Gift [116762] = true, -- Stolen Present [116764] = true, -- Small Pouch of Coins [116980] = true, -- Invader's Forgotten Treasure [117386] = true, -- Crate of Pandaren Archaeology Fragments [117387] = true, -- Crate of Mogu Archaeology Fragments [117388] = true, -- Crate of Mantid Archaeology Fragments [117392] = true, -- Loot-Filled Pumpkin [117393] = true, -- Keg-Shaped Treasure Chest [117394] = true, -- Satchel of Chilled Goods [117395] = true, -- Stolen Present [117414] = true, -- Stormwind Guard Armor Package [118065] = true, -- Gleaming Ashmaul Strongbox [118066] = true, -- Ashmaul Strongbox [118093] = true, -- Dented Ashmaul Strongbox [118094] = true, -- Dented Ashmaul Strongbox [118529] = true, -- Cache of Highmaul Treasures [118530] = true, -- Cache of Highmaul Treasures [118531] = true, -- Cache of Highmaul Treasures [118706] = true, -- Cracked Goren Egg [118759] = true, -- Alchemy Experiment [118924] = true, -- Cache of Arms [118925] = true, -- Plundered Booty [118926] = true, -- Huge Pile of Skins [118927] = true, -- Maximillian's Laundry [118928] = true, -- Faintly-Sparkling Cache [118929] = true, -- Sack of Mined Ore [118930] = true, -- Bag of Everbloom Herbs [118931] = true, -- Leonid's Bag of Supplies [119032] = true, -- Challenger's Strongbox [119036] = true, -- Box of Storied Treasures [119037] = true, -- Supply of Storied Rarities [119040] = true, -- Cache of Mingled Treasures [119041] = true, -- Strongbox of Mysterious Treasures [119042] = true, -- Crate of Valuable Treasures [119043] = true, -- Trove of Smoldering Treasures [119188] = true, -- Unclaimed Payment [119189] = true, -- Unclaimed Payment [119190] = true, -- Unclaimed Payment [119191] = true, -- Jewelcrafting Payment [119195] = true, -- Jewelcrafting Payment [119196] = true, -- Jewelcrafting Payment [119197] = true, -- Jewelcrafting Payment [119198] = true, -- Jewelcrafting Payment [119199] = true, -- Jewelcrafting Payment [119200] = true, -- Jewelcrafting Payment [119201] = true, -- Jewelcrafting Payment [119330] = true, -- Steel Strongbox [120142] = true, -- Coliseum Champion's Spoils [120146] = true, -- Smuggled Sack of Gold [120147] = true, -- Bloody Gold Purse [120151] = true, -- Gleaming Ashmaul Strongbox [120170] = true, -- Partially-Digested Bag [120184] = true, -- Ashmaul Strongbox [120312] = true, -- Bulging Sack of Coins [120319] = true, -- Invader's Damaged Cache [120320] = true, -- Invader's Abandoned Sack [120322] = true, -- Klinking Stacked Card Deck [120323] = true, -- Bulging Stacked Card Deck [120324] = true, -- Bursting Stacked Card Deck [120325] = true, -- Overflowing Stacked Card Deck [120334] = true, -- Satchel of Cosmic Mysteries [120353] = true, -- Steel Strongbox [120354] = true, -- Gold Strongbox [120355] = true, -- Silver Strongbox [120356] = true, -- Bronze Strongbox [122163] = true, -- Routed Invader's Crate of Spoils [122191] = true, -- Bloody Stack of Invitations [122242] = true, -- Relic Acquisition Compensatory Package [122478] = true, -- Scouting Report: Frostfire Ridge [122479] = true, -- Scouting Report: Shadowmoon Valley [122480] = true, -- Scouting Report: Gorgrond [122481] = true, -- Scouting Report: Talador [122482] = true, -- Scouting Report: Spires of Arak [122483] = true, -- Scouting Report: Nagrand [122484] = true, -- Blackrock Foundry Spoils [122485] = true, -- Blackrock Foundry Spoils [122486] = true, -- Blackrock Foundry Spoils [122607] = true, -- Savage Satchel of Cooperation [122613] = true, -- Stash of Dusty Music Rolls [122718] = true, -- Clinking Present [123857] = true, -- Runic Pouch [123858] = true, -- Follower Retraining Scroll Case [123975] = true, -- Greater Bounty Spoils [127855] = true, -- Iron Fleet Treasure Chest [132892] = true, -- Blingtron 6000 Gift Package [137560] = true, -- Dreamweaver Provisions [137561] = true, -- Highmountain Tribute [137562] = true, -- Valarjar Cache [137563] = true, -- Farondis Lockbox [137564] = true, -- Nightfallen Hoard [137565] = true, -- Warden's Field Kit [139048] = true, -- Small Legion Chest [139049] = true, -- Large Legion Chest [140591] = true, -- Shattered Satchel of Cooperation [140601] = true, -- Sixtrigger Resource Crate [141350] = true, -- Kirin Tor Chest [160054] = true, -- War-Torn Satchel of Cooperation [163611] = true, -- Seafarer's Coin Pouch [163612] = true, -- Wayfinder's Satchel [163613] = true, -- Sack of Plunder [165714] = true, -- Gold Strongbox [165717] = true, -- Steel Strongbox [165851] = true, -- Bag of Anchors [166295] = true, -- Proudmoore Admiralty Supplies [168740] = true, -- Blingtron 7000 Gift Package [173372] = true, -- Cache of the Black Empire [174958] = true, -- Cache of the Fallen Mogu [174959] = true, -- Cache of the Mantid Swarm [174960] = true, -- Cache of the Aqir Swarm [174961] = true, -- Cache of the Amathet [180647] = true, -- Ascended Supplies [181372] = true, -- Tribute of the Ascended [181475] = true, -- Bounty of the Grove Wardens [181476] = true, -- Tribute of the Wild Hunt [181556] = true, -- Tribute of the Court [181557] = true, -- Favor of the Court [181732] = true, -- Tribute of the Ambitious [181733] = true, -- Tribute of the Duty-Bound [181741] = true, -- Tribute of the Paragon [183701] = true, -- Cleansing Rite Materials [184522] = true, -- Veiled Satchel of Cooperation [184630] = true, -- Adventurer's Tailoring Cache [184631] = true, -- Adventurer's Enchanting Cache [184632] = true, -- Champion's Fish Cache [184633] = true, -- Champion's Meat Cache [184634] = true, -- Adventurer's Herbalism Cache [184635] = true, -- Adventurer's Mining Cache [184636] = true, -- Adventurer's Skinning Cache [184637] = true, -- Hero's Meat Cache [184638] = true, -- Hero's Fish Cache [184639] = true, -- Champion's Tailoring Cache [184640] = true, -- Champion's Skinning Cache [184641] = true, -- Champion's Mining Cache [184642] = true, -- Champion's Herbalism Cache [184643] = true, -- Champion's Enchanting Cache [184644] = true, -- Hero's Tailoring Cache [184645] = true, -- Hero's Skinning Cache [184646] = true, -- Hero's Mining Cache [184647] = true, -- Hero's Herbalism Cache [184648] = true, -- Hero's Enchanting Cache [184843] = true, -- Salvaged Supplies [184868] = true, -- Cache of Nathrian Treasures (hc) [184869] = true, -- Cache of Nathrian Treasures [185972] = true, -- Tormentor's Cache [185990] = true, -- Harvester's War Chest [185992] = true, -- War Chest of the Undying Army [185993] = true, -- Ascended War Chest [185990] = true, -- Harvester's War Chest [185993] = true, -- Ascended War Chest [186196] = true, -- Death's Advance War Chest [186531] = true, -- Cache of Sanctum Treasures [186533] = true, -- Cache of SAnctum Treasues (hc) [186650] = true, -- Death's Advance Supplies [187028] = true, -- Supplies of the Archivists' Codex [187354] = true, -- Abandoned Broker Satchel [187520] = true, -- Winter Veil Gift [187543] = true, -- Death's Advance War Chest [187551] = true, -- Small Korthian Supply Chest [187576] = true, -- Korthian Skinning Cache [187577] = true, -- Korthian Meat Cache [187710] = true, -- Anniversary Gift [187561] = true, -- Winter Veil Gift [187781] = true, -- Olea Cache [192093] = true, -- Gently Shaken Gift [192094] = true, -- Winter Veil Gift [190178] = true, -- Pouch of Protogenic Provisions [190610] = true, -- Tribute of the Enlightened Elders [190655] = true, -- Cache of Sepulcher Treasures [190656] = true, -- Cache of Sepulcher Treasures (hc)) [191040] = true, -- Cache of Sepulcher Treasures (252+) [191139] = true, -- Tribute of the Enlightened Elders [191303] = true, -- Overflowing Chest of Riches [191701] = true, -- Bag of Explored Souls [192437] = true, -- Cache of Fated Treasures [192892] = true, -- Timewatcher's Patience [194072] = true, -- Sack of Gold [198868] = true, -- Small Valdrakken Accord Supply Pack [199192] = true, -- Dragon Racer's Purse [200069] = true, -- Obsidian Cache [200070] = true, -- Obsidian Strongbox [200072] = true, -- Dragonbane Keep Strongbox [200073] = true, -- Valdrakken Treasures [200468] = true, -- Grand Hunt Spoils [200513] = true, -- Grand Hunt Spoils [200515] = true, -- Grand Hunt Spoils [201352] = true, -- Bag of Leather Reagents [201353] = true, -- Bag of Mail Armor Reagents [201728] = true, -- Vakril's Strongbox [201754] = true, -- Obsidian Forgemaster's Cache [201817] = true, -- Twilight Cache [202052] = true, -- Timewatcher's Patience [202142] = true, -- Dragonbane Keep Strongbox [202097] = true, -- Bulging Box of Skins and Scales } ================================================ FILE: ShestakUI/Config/Filters/RaidAuraWatch.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.raidframe.plugins_aura_watch ~= true then return end ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Renew -> http://www.wowhead.com/spell=139 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- T.RaidBuffs = { DRUID = { {774, "TOPRIGHT", {0.8, 0.4, 0.8}}, -- Rejuvenation {48438, "BOTTOMRIGHT", {0.8, 0.4, 0}}, -- Wild Growth {8936, "BOTTOMLEFT", {0.2, 0.8, 0.2}}, -- Regrowth {33763, "TOPLEFT", {0.4, 0.8, 0.2}}, -- Lifebloom {391891, "TOP", {0.2, 0.7, 0.2}}, -- Adaptive Swarm {102351, "BOTTOM", {0.2, 0.7, 0.2}}, -- Cenarion Ward {102342, "LEFT", {0.45, 0.3, 0.2}, true}, -- Ironbark {155777, "RIGHT", {0.4, 0.9, 0.4}}, -- Rejuvenation (Germination) }, EVOKER = { {355941, "TOPRIGHT", {0.20, 0.58, 0.50}}, -- Dream Breath {363502, "BOTTOMLEFT", {0.26, 0.73, 0.63}}, -- Dream Flight {366155, "RIGHT", {0.14, 1.00, 0.88}}, -- Reversion {364343, "TOP", {0.13, 0.87, 0.50}}, -- Echo {357170, "BOTTOM", {0.11, 0.57, 0.71}}, -- Time Dilation }, MONK = { {119611, "TOPRIGHT", {0.2, 0.7, 0.7}}, -- Renewing Mist {115175, "BOTTOMRIGHT", {0.7, 0.4, 0}}, -- Soothing Mist {124682, "BOTTOMLEFT", {0.4, 0.8, 0.2}}, -- Enveloping Mist {191840, "TOPLEFT", {0.1, 0.4, 0.9}}, -- Essence Font {116849, "LEFT", {0.81, 0.85, 0.1}, true}, -- Life Cocoon }, PALADIN = { {53563, "TOPRIGHT", {0.7, 0.3, 0.7}}, -- Beacon of Light {156910, "TOPRIGHT", {0.7, 0.3, 0.7}}, -- Beacon of Faith {200025, "TOPRIGHT", {0.7, 0.3, 0.7}}, -- Beacon of Virtue {1022, "BOTTOMRIGHT", {0.2, 0.2, 1}, true}, -- Blessing of Protection {1044, "BOTTOMRIGHT", {0.89, 0.45, 0}, true}, -- Blessing of Freedom {6940, "BOTTOMRIGHT", {0.89, 0.1, 0.1}, true}, -- Blessing of Sacrifice {204018, "BOTTOMRIGHT", {0.4, 0.6, 0.8}, true}, -- Blessing of Spellwarding {287280, "BOTTOMLEFT", {0.9, 0.5, 0.1}}, -- Glimmer of Light {223306, "TOPLEFT", {0.8, 0.8, 0.1}}, -- Bestow Faith }, PRIEST = { {194384, "TOPRIGHT", {0.8, 0.4, 0.2}}, -- Atonement {139, "TOPRIGHT", {0.4, 0.7, 0.2}}, -- Renew {41635, "BOTTOMRIGHT", {0.2, 0.7, 0.2}}, -- Prayer of Mending {6788, "BOTTOMLEFT", {1, 0, 0}}, -- Weakened Soul {17, "TOPLEFT", {0.81, 0.85, 0.1}}, -- Power Word: Shield {33206, "LEFT", {0.89, 0.1, 0.1}, true}, -- Pain Suppression {47788, "LEFT", {0.86, 0.52, 0}, true}, -- Guardian Spirit }, SHAMAN = { {61295, "TOPRIGHT", {0.7, 0.3, 0.7}}, -- Riptide {204288, "BOTTOMRIGHT", {0.2, 0.7, 0.2}}, -- Earth Shield }, HUNTER = { {35079, "TOPRIGHT", {0.2, 0.2, 1}}, -- Misdirection }, ROGUE = { {57934, "TOPRIGHT", {0.89, 0.1, 0.1}}, -- Tricks of the Trade }, WARLOCK = { {20707, "TOPRIGHT", {0.7, 0.32, 0.75}}, -- Soulstone }, ALL = { {23333, "LEFT", {1, 0, 0}, true}, -- Warsong flag, Horde {23335, "LEFT", {0, 0, 1}, true}, -- Warsong flag, Alliance {34976, "LEFT", {1, 0, 0}, true}, -- Netherstorm Flag }, } T.RaidBuffsIgnore = { --[spellID] = true, -- Spell name } local function SpellName(id) local name = GetSpellInfo(id) if name then return name else print("|cffff0000WARNING: spell ID ["..tostring(id).."] no longer exists! Report this to Shestak.|r") return "Empty" end end T.RaidDebuffs = { ----------------------------------------------------------------- -- Vault of the Incarnates ----------------------------------------------------------------- -- Eranog [SpellName(370648)] = 5, -- Primal Flow [SpellName(390715)] = 6, -- Primal Rifts [SpellName(370597)] = 6, -- Kill Order -- Terros [SpellName(382776)] = 5, -- Awakened Earth [SpellName(386352)] = 3, -- Rock Blast [SpellName(382458)] = 6, -- Resonant Aftermath -- The Primal Council [SpellName(371624)] = 5, -- Conductive Mark [SpellName(372027)] = 4, -- Slashing Blaze [SpellName(374039)] = 4, -- Meteor Axe -- Sennarth, the Cold Breath [SpellName(371976)] = 4, -- Chilling Blast [SpellName(372082)] = 5, -- Enveloping Webs [SpellName(374659)] = 4, -- Rush [SpellName(374104)] = 5, -- Wrapped in Webs Slow [SpellName(374503)] = 6, -- Wrapped in Webs Stun [SpellName(373048)] = 3, -- Suffocating Webs -- Dathea, Ascended [SpellName(391686)] = 5, -- Conductive Mark [SpellName(378277)] = 2, -- Elemental Equilbrium [SpellName(388290)] = 4, -- Cyclone -- Kurog Grimtotem [SpellName(377780)] = 5, -- Skeletal Fractures [SpellName(372514)] = 5, -- Frost Bite [SpellName(374554)] = 4, -- Lava Pool [SpellName(374023)] = 6, -- Searing Carnage [SpellName(374427)] = 6, -- Ground Shatter [SpellName(390920)] = 5, -- Shocking Burst [SpellName(372458)] = 6, -- Below Zero -- Broodkeeper Diurna [SpellName(388920)] = 6, -- Frozen Shroud [SpellName(378782)] = 5, -- Mortal Wounds [SpellName(378787)] = 5, -- Crushing Stoneclaws [SpellName(375620)] = 6, -- Ionizing Charge [SpellName(375578)] = 4, -- Flame Sentry -- Raszageth the Storm-Eater -- TODO: DF ----------------------------------------------------------------- -- Dungeons ----------------------------------------------------------------- -- Mythic+ Affixes [SpellName(226512)] = 3, -- Sanguine [SpellName(240559)] = 3, -- Grievous [SpellName(240443)] = 3, -- Bursting -- Dragonflight Season 1 [SpellName(396369)] = 6, -- Mark of Lightning [SpellName(396364)] = 6, -- Mark of Wind ----------------------------------------------------------------- -- Dragonflight (Season 1) ----------------------------------------------------------------- -- Court of Stars [SpellName(207278)] = 3, -- Arcane Lockdown [SpellName(209516)] = 3, -- Mana Fang [SpellName(209512)] = 3, -- Disrupting Energy [SpellName(211473)] = 3, -- Shadow Slash [SpellName(207979)] = 3, -- Shockwave [SpellName(207981)] = 3, -- Disintegration Beam [SpellName(211464)] = 3, -- Fel Detonation [SpellName(208165)] = 3, -- Withering Soul [SpellName(209413)] = 3, -- Suppress [SpellName(209027)] = 3, -- Quelling Strike -- Halls of Valor [SpellName(197964)] = 3, -- Runic Brand [SpellName(193783)] = 3, -- Aegis of Aggramar [SpellName(196838)] = 3, -- Scent of Blood [SpellName(199674)] = 3, -- Wicked Dagger [SpellName(193260)] = 3, -- Static Field [SpellName(199652)] = 3, -- Sever [SpellName(198944)] = 3, -- Breach Armor [SpellName(215429)] = 3, -- Thunderstrike [SpellName(203963)] = 3, -- Eye of the Storm [SpellName(196497)] = 3, -- Ravenous Leap [SpellName(193660)] = 3, -- Felblaze Rush -- Shadowmoon Burial Grounds [SpellName(156776)] = 3, -- Rending Voidlash [SpellName(153692)] = 3, -- Necrotic Pitch [SpellName(153524)] = 3, -- Plague Spit [SpellName(154469)] = 3, -- Ritual of Bones [SpellName(162652)] = 3, -- Lunar Purity [SpellName(164907)] = 3, -- Void Cleave [SpellName(152979)] = 3, -- Soul Shred [SpellName(158061)] = 3, -- Blessed Waters of Purity [SpellName(154442)] = 3, -- Malevolence [SpellName(153501)] = 3, -- Void Blast -- Temple of the Jade Serpent [SpellName(396150)] = 3, -- Feeling of Superiority [SpellName(397878)] = 3, -- Tainted Ripple [SpellName(106113)] = 3, -- Touch of Nothingness [SpellName(397914)] = 3, -- Defiling Mist [SpellName(397904)] = 3, -- Setting Sun Kick [SpellName(397911)] = 3, -- Touch of Ruin [SpellName(395859)] = 3, -- Haunting Scream [SpellName(374037)] = 3, -- Overwhelming Rage [SpellName(396093)] = 3, -- Savage Leap [SpellName(106823)] = 3, -- Serpent Strike [SpellName(396152)] = 3, -- Feeling of Inferiority [SpellName(110125)] = 3, -- Shattered Resolve [SpellName(397797)] = 3, -- Corrupted Vortex -- Ruby Life Pools [SpellName(392406)] = 3, -- Thunderclap [SpellName(372820)] = 3, -- Scorched Earth [SpellName(384823)] = 3, -- Inferno [SpellName(381862)] = 3, -- Infernocore [SpellName(372860)] = 3, -- Searing Wounds [SpellName(373869)] = 3, -- Burning Touch [SpellName(385536)] = 3, -- Flame Dance [SpellName(381518)] = 3, -- Winds of Change [SpellName(372858)] = 3, -- Searing Blows [SpellName(373589)] = 3, -- Primal Chill [SpellName(373693)] = 3, -- Living Bomb [SpellName(392924)] = 3, -- Shock Blast [SpellName(381515)] = 3, -- Stormslam [SpellName(396411)] = 3, -- Primal Overload [SpellName(384773)] = 3, -- Flaming Embers [SpellName(392451)] = 3, -- Flashfire [SpellName(372697)] = 3, -- Jagged Earth [SpellName(372047)] = 3, -- Flurry [SpellName(372963)] = 3, -- Chillstorm -- The Nokhud Offensive [SpellName(382628)] = 3, -- Surge of Power [SpellName(386025)] = 3, -- Tempest [SpellName(381692)] = 3, -- Swift Stab [SpellName(387615)] = 3, -- Grasp of the Dead [SpellName(387629)] = 3, -- Rotting Wind [SpellName(386912)] = 3, -- Stormsurge Cloud [SpellName(395669)] = 3, -- Aftershock [SpellName(384134)] = 3, -- Pierce [SpellName(388451)] = 3, -- Stormcaller's Fury [SpellName(395035)] = 3, -- Shatter Soul [SpellName(376899)] = 3, -- Crackling Cloud [SpellName(384492)] = 3, -- Hunter's Mark [SpellName(376730)] = 3, -- Stormwinds [SpellName(376894)] = 3, -- Crackling Upheaval [SpellName(388801)] = 3, -- Mortal Strike [SpellName(376827)] = 3, -- Conductive Strike [SpellName(376864)] = 3, -- Static Spear [SpellName(375937)] = 3, -- Rending Strike [SpellName(376634)] = 3, -- Iron Spear -- The Azure Vault [SpellName(388777)] = 3, -- Oppressive Miasma [SpellName(386881)] = 3, -- Frost Bomb [SpellName(387150)] = 3, -- Frozen Ground [SpellName(387564)] = 3, -- Mystic Vapors [SpellName(385267)] = 3, -- Crackling Vortex [SpellName(386640)] = 3, -- Tear Flesh [SpellName(374567)] = 3, -- Explosive Brand [SpellName(374523)] = 3, -- Arcane Roots [SpellName(375596)] = 3, -- Erratic Growth Channel [SpellName(375602)] = 3, -- Erratic Growth [SpellName(370764)] = 3, -- Piercing Shards [SpellName(384978)] = 3, -- Dragon Strike [SpellName(375649)] = 3, -- Infused Ground [SpellName(387151)] = 3, -- Icy Devastator [SpellName(377488)] = 3, -- Icy Bindings [SpellName(374789)] = 3, -- Infused Strike [SpellName(371007)] = 3, -- Splintering Shards [SpellName(375591)] = 3, -- Sappy Burst [SpellName(385409)] = 3, -- Ouch, ouch, ouch! [SpellName(386549)] = 3, -- Waking Bane -- Algeth'ar Academy [SpellName(389033)] = 3, -- Lasher Toxin [SpellName(391977)] = 3, -- Oversurge [SpellName(386201)] = 3, -- Corrupted Mana [SpellName(389011)] = 3, -- Overwhelming Power [SpellName(387932)] = 3, -- Astral Whirlwind [SpellName(396716)] = 3, -- Splinterbark [SpellName(388866)] = 3, -- Mana Void [SpellName(386181)] = 3, -- Mana Bomb [SpellName(388912)] = 3, -- Severing Slash [SpellName(377344)] = 3, -- Peck [SpellName(376997)] = 3, -- Savage Peck [SpellName(388984)] = 3, -- Vicious Ambush [SpellName(388544)] = 3, -- Barkbreaker [SpellName(377008)] = 3, -- Deafening Screech ----------------------------------------------------------------- -- Dragonflight (Season 2) ----------------------------------------------------------------- -- Brackenhide Hollow -- Halls of Infusion -- Neltharus -- Uldaman: Legacy of Tyr ----------------------------------------------------------------- -- Other ----------------------------------------------------------------- [SpellName(87023)] = 4, -- Cauterize [SpellName(94794)] = 4, -- Rocket Fuel Leak [SpellName(116888)] = 4, -- Shroud of Purgatory [SpellName(121175)] = 2, -- Orb of Power } ----------------------------------------------------------------- -- PvP ----------------------------------------------------------------- if C.raidframe.plugins_pvp_debuffs == true then local PvPDebuffs = { -- Death Knight [SpellName(108194)] = 4, -- Asphyxiate [SpellName(91797)] = 4, -- Monstrous Blow (Mutated Ghoul) [SpellName(91800)] = 4, -- Gnaw (Ghoul) [SpellName(287254)] = 4, -- Dead of Winter [SpellName(47476)] = 3, -- Strangulate -- Demon Hunter [SpellName(217832)] = 4, -- Imprison [SpellName(211881)] = 4, -- Fel Eruption [SpellName(179057)] = 4, -- Chaos Nova [SpellName(205630)] = 4, -- Illidan's Grasp [SpellName(207685)] = 4, -- Sigil of Misery [SpellName(204490)] = 3, -- Sigil of Silence -- Druid [SpellName(33786)] = 4, -- Cyclone [SpellName(5211)] = 4, -- Mighty Bash [SpellName(22570)] = 4, -- Maim [SpellName(78675)] = 3, -- Solar Beam [SpellName(339)] = 2, -- Entangling Roots -- Evoker [SpellName(360806)] = 4, -- Sleep Walk -- Hunter [SpellName(3355)] = 4, -- Freezing Trap [SpellName(24394)] = 4, -- Intimidation [SpellName(213691)] = 4, -- Scatter Shot [SpellName(117526)] = 2, -- Binding Shot -- Mage [SpellName(61305)] = 4, -- Polymorph [SpellName(82691)] = 4, -- Ring of Frost [SpellName(31661)] = 4, -- Dragon's Breath [SpellName(122)] = 2, -- Frost Nova -- Monk [SpellName(115078)] = 4, -- Paralysis [SpellName(119381)] = 4, -- Leg Sweep [SpellName(120086)] = 4, -- Fists of Fury [SpellName(198898)] = 4, -- Song of Chi-Ji -- Paladin [SpellName(20066)] = 4, -- Repentance [SpellName(853)] = 4, -- Hammer of Justice [SpellName(105421)] = 4, -- Blinding Light -- Priest [SpellName(605)] = 4, -- Dominate Mind [SpellName(8122)] = 4, -- Psychic Scream [SpellName(64044)] = 4, -- Psychic Horror [SpellName(205369)] = 4, -- Mind Bomb [SpellName(87204)] = 4, -- Sin and Punishment [SpellName(200196)] = 4, -- Holy Word: Chastise [SpellName(15487)] = 3, -- Silence -- Rogue [SpellName(6770)] = 4, -- Sap [SpellName(2094)] = 4, -- Blind [SpellName(1833)] = 4, -- Cheap Shot [SpellName(408)] = 4, -- Kidney Shot [SpellName(1776)] = 4, -- Gouge [SpellName(1330)] = 3, -- Garrote - Silence -- Shaman [SpellName(51514)] = 4, -- Hex [SpellName(118905)] = 4, -- Static Charge [SpellName(305485)] = 4, -- Lightning Lasso -- Warlock [SpellName(118699)] = 4, -- Fear [SpellName(6789)] = 4, -- Mortal Coil [SpellName(5484)] = 4, -- Howl of Terror [SpellName(6358)] = 4, -- Seduction (Succubus) [SpellName(115268)] = 4, -- Mesmerize (Shivarra) [SpellName(30283)] = 4, -- Shadowfury -- Warrior [SpellName(46968)] = 4, -- Shockwave [SpellName(132169)] = 4, -- Storm Bolt [SpellName(194958)] = 4, -- Intimidating Shout } tinsert(T.RaidBuffs["ALL"], {284402, "RIGHT", {1, 0, 0}, true}) -- Vampiric Touch (Don't dispel) tinsert(T.RaidBuffs["ALL"], {30108, "RIGHT", {1, 0, 0}, true}) -- Unstable Affliction (Don't dispel) for spell, prio in pairs(PvPDebuffs) do T.RaidDebuffs[spell] = prio end end T.RaidDebuffsReverse = { --[spellID] = true, -- Spell name } T.RaidDebuffsIgnore = { [980] = true, -- Agony [1943] = true, -- Rupture } for _, spell in pairs(C.raidframe.plugins_aura_watch_list) do T.RaidDebuffs[SpellName(spell)] = 3 end ================================================ FILE: ShestakUI/Config/Filters/Reminders.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- The best way to add or delete spell is to go at www.wowhead.com, search for a spell. -- Example: Well Fed -> http://www.wowhead.com/spell=104280 -- Take the number ID at the end of the URL, and add it to the list ---------------------------------------------------------------------------------------- local function SpellName(id) local name, _, icon = GetSpellInfo(id) if name then return {name, icon} else print("|cffff0000WARNING: spell ID ["..tostring(id).."] no longer exists! Report this to Shestak.|r") return {"Empty", ""} end end if C.reminder.raid_buffs_enable == true or C.announcements.flask_food == true then T.ReminderBuffs = { Flask = { SpellName(370652), -- Phial of Static Empowerment SpellName(373257), -- Phial of Glacial Fury SpellName(374000), -- Iced Phial of Corrupting Rage SpellName(371036), -- Phial of Icy Preservation SpellName(371186), -- Charged Phial of Alacrity SpellName(371339), -- Phial of Elemental Chaos SpellName(371204), -- Phial of Still Air SpellName(371354), -- Phial of the Eye in the Storm SpellName(371386), -- Phial of Charged Isolation SpellName(371172), -- Phial of Tepid Versatility }, BattleElixir = { -- SpellName(spellID), -- Spell name }, GuardianElixir = { -- SpellName(spellID), -- Spell name }, Food = { SpellName(104280), -- Well Fed }, Stamina = { SpellName(21562), -- Power Word: Fortitude }, Vers = { SpellName(1126), -- Mark of the Wild }, Reduce = { SpellName(381748), -- Blessing of the Bronze }, Custom = { -- SpellName(spellID), -- Spell name } } -- Caster buffs function T.ReminderCasterBuffs() Spell4Buff = { -- Intellect SpellName(1459), -- Arcane Intellect } end -- Physical buffs function T.ReminderPhysicalBuffs() Spell4Buff = { -- Attack Power SpellName(6673), -- Battle Shout } end end ---------------------------------------------------------------------------------------- --[[------------------------------------------------------------------------------------ Spell Reminder Arguments Type of Check: spells - List of spells in a group, if you have anyone of these spells the icon will hide. Spells only Requirements: reversecheck - only works if you provide a role or a spec, instead of hiding the frame when you have the buff, it shows the frame when you have the buff negate_reversecheck - if reversecheck is set you can set a spec to not follow the reverse check Requirements: role - you must be a certain role for it to display (Tank, Melee, Caster) spec - you must be active in a specific spec for it to display (1, 2, 3) note: spec order can be viewed from top to bottom when you open your talent pane level - the minimum level you must be (most of the time we don't need to use this because it will register the spell learned event if you don't know the spell, but in some cases it may be useful) Additional Checks: (Note we always run a check when gaining/losing an aura) combat - check when entering combat instance - check when entering a party/raid instance pvp - check when entering a bg/arena For every group created a new frame is created, it's a lot easier this way. ]]-------------------------------------------------------------------------------------- if C.reminder.solo_buffs_enable == true then T.ReminderSelfBuffs = { DRUID = { [1] = { -- Mark of the Wild group ["spells"] = { SpellName(1126), -- Mark of the Wild }, ["combat"] = true, ["instance"] = true, ["pvp"] = true, }, }, EVOKER = { [1] = { -- Blessing of the Bronze ["spells"] = { SpellName(381748), -- Blessing of the Bronze }, ["combat"] = true, ["instance"] = true, ["pvp"] = true, }, }, MAGE = { [1] = { -- Intellect group ["spells"] = { SpellName(1459), -- Arcane Intellect }, ["combat"] = true, ["instance"] = true, ["pvp"] = true, }, }, PALADIN = { [1] = { -- Auras group ["spells"] = { SpellName(465), -- Devotion Aura SpellName(183435), -- Retribution Aura SpellName(317920), -- Concentration Aura }, ["instance"] = true }, }, PRIEST = { [1] = { -- Stamina group ["spells"] = { SpellName(21562), -- Power Word: Fortitude }, ["combat"] = true, ["instance"] = true, ["pvp"] = true }, }, ROGUE = { [1] = { -- Lethal Poisons group ["spells"] = { SpellName(2823), -- Deadly Poison SpellName(315584), -- Instant Poison SpellName(8679), -- Wound Poison SpellName(381664), -- Amplifying Poison }, ["combat"] = true, ["instance"] = true, ["pvp"] = true, }, [2] = { -- Non-Lethal Poisons group ["spells"] = { SpellName(3408), -- Crippling Poison SpellName(5761), -- Numbing Poison SpellName(381637), -- Atrophic Poison }, ["combat"] = true, ["instance"] = true, ["pvp"] = true, }, }, SHAMAN = { [1] = { -- Shields group ["spells"] = { SpellName(52127), -- Water Shield SpellName(974), -- Earth Shield SpellName(192106), -- Lightning Shield }, ["combat"] = true, ["instance"] = true, ["pvp"] = true, }, [2] = { -- Windfury Weapon group ["spells"] = { SpellName(33757), -- Windfury Weapon }, ["mainhand"] = true, ["spec"] = 2, ["combat"] = true, ["instance"] = true, ["pvp"] = true, ["level"] = 10, }, [3] = { -- Flametongue Weapon group ["spells"] = { SpellName(318038), -- Flametongue Weapon }, ["offhand"] = true, ["spec"] = 2, ["combat"] = true, ["instance"] = true, ["pvp"] = true, ["level"] = 10, }, }, WARRIOR = { [1] = { -- Battle Shout group ["spells"] = { SpellName(6673), -- Battle Shout }, ["combat"] = true, ["instance"] = true, ["pvp"] = true, }, }, } end ================================================ FILE: ShestakUI/Config/Fonts.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- ShestakUI fonts configuration file -- BACKUP THIS FILE BEFORE UPDATING! ---------------------------------------------------------------------------------------- -- Configuration example: ---------------------------------------------------------------------------------------- -- C["font"] = { -- -- Stats font -- ["stats_font"] = "Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Normal.ttf", -- ["stats_font_size"] = 11, -- ["stats_font_style"] = "", -- ["stats_font_shadow"] = true, -- } ---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- -- Fonts options ---------------------------------------------------------------------------------------- C["font"] = { -- Stats font ["stats_font"] = C.media.pixel_font, ["stats_font_size"] = 8, ["stats_font_style"] = "MONOCHROMEOUTLINE", ["stats_font_shadow"] = false, -- Combat text font ["combat_text_font"] = C.media.pixel_font, ["combat_text_font_size"] = 16, ["combat_text_font_style"] = "MONOCHROMEOUTLINE", ["combat_text_font_shadow"] = false, -- Chat font ["chat_font"] = C.media.normal_font, ["chat_font_style"] = "", ["chat_font_shadow"] = true, -- Chat tabs font ["chat_tabs_font"] = C.media.pixel_font, ["chat_tabs_font_size"] = 8, ["chat_tabs_font_style"] = "MONOCHROMEOUTLINE", ["chat_tabs_font_shadow"] = false, -- Action bars font ["action_bars_font"] = C.media.pixel_font, ["action_bars_font_size"] = 8, ["action_bars_font_style"] = "MONOCHROMEOUTLINE", ["action_bars_font_shadow"] = false, -- Threat meter font ["threat_meter_font"] = C.media.pixel_font, ["threat_meter_font_size"] = 8, ["threat_meter_font_style"] = "MONOCHROMEOUTLINE", ["threat_meter_font_shadow"] = false, -- Raid cooldowns font ["raid_cooldowns_font"] = C.media.pixel_font, ["raid_cooldowns_font_size"] = 8, ["raid_cooldowns_font_style"] = "MONOCHROMEOUTLINE", ["raid_cooldowns_font_shadow"] = false, -- Cooldowns timer font ["cooldown_timers_font"] = C.media.pixel_font, ["cooldown_timers_font_size"] = 16, ["cooldown_timers_font_style"] = "MONOCHROMEOUTLINE", ["cooldown_timers_font_shadow"] = false, -- Loot font ["loot_font"] = C.media.pixel_font, ["loot_font_size"] = 8, ["loot_font_style"] = "MONOCHROMEOUTLINE", ["loot_font_shadow"] = false, -- Nameplates font ["nameplates_font"] = C.media.pixel_font, ["nameplates_font_size"] = 8, ["nameplates_font_style"] = "MONOCHROMEOUTLINE", ["nameplates_font_shadow"] = false, -- Unit frames font ["unit_frames_font"] = C.media.pixel_font, ["unit_frames_font_size"] = 8, ["unit_frames_font_style"] = "MONOCHROMEOUTLINE", ["unit_frames_font_shadow"] = false, -- Auras font ["auras_font"] = C.media.pixel_font, ["auras_font_size"] = 8, ["auras_font_style"] = "MONOCHROMEOUTLINE", ["auras_font_shadow"] = false, -- Filger bar font ["filger_font"] = C.media.pixel_font, ["filger_font_size"] = 8, ["filger_font_style"] = "MONOCHROMEOUTLINE", ["filger_font_shadow"] = false, -- Stylization font ["stylization_font"] = C.media.pixel_font, ["stylization_font_size"] = 8, ["stylization_font_style"] = "MONOCHROMEOUTLINE", ["stylization_font_shadow"] = false, -- Bags font ["bags_font"] = C.media.pixel_font, ["bags_font_size"] = 8, ["bags_font_style"] = "MONOCHROMEOUTLINE", ["bags_font_shadow"] = false, -- Blizzard fonts ["tooltip_header_font_size"] = 13, ["tooltip_font_size"] = 11, ["bubble_font_size"] = 14, } ---------------------------------------------------------------------------------------- -- Pixel font replacement ---------------------------------------------------------------------------------------- local disablePixel if ShestakUIOptionsGlobal then if ShestakUIOptionsGlobal[T.realm] and ShestakUIOptionsGlobal[T.realm][T.name] and ShestakUIOptionsGlobal[T.realm]["Current_Profile"] then local i = tostring(ShestakUIOptionsGlobal[T.realm]["Current_Profile"][T.name]) if ShestakUIOptionsPerChar and ShestakUIOptionsPerChar[i] and ShestakUIOptionsPerChar[i]["font"] and ShestakUIOptionsPerChar[i]["font"]["global_font"] then disablePixel = true end else local i = tostring(ShestakUIOptionsGlobal["Current_Profile"]) if ShestakUIOptions and ShestakUIOptions[i] and ShestakUIOptions[i]["font"] and ShestakUIOptions[i]["font"]["global_font"] then disablePixel = true end end end if disablePixel then C["media"].pixel_font = C.media.normal_font C["media"].pixel_font_size = 11 C["media"].pixel_font_style = "OUTLINE" C["font"].stats_font = C.media.normal_font C["font"].stats_font_size = 12 C["font"].stats_font_style = "OUTLINE" C["font"].stats_font_shadow = false C["font"].combat_text_font = C.media.normal_font C["font"].combat_text_font_size = 20 C["font"].combat_text_font_style = "OUTLINE" C["font"].combat_text_font_shadow = false C["font"].chat_tabs_font = C.media.normal_font C["font"].chat_tabs_font_size = 12 C["font"].chat_tabs_font_style = "OUTLINE" C["font"].chat_tabs_font_shadow = false C["font"].action_bars_font = C.media.normal_font C["font"].action_bars_font_size = 12 C["font"].action_bars_font_style = "OUTLINE" C["font"].action_bars_font_shadow = false C["font"].threat_meter_font = C.media.normal_font C["font"].threat_meter_font_size = 12 C["font"].threat_meter_font_style = "OUTLINE" C["font"].threat_meter_font_shadow = false C["font"].raid_cooldowns_font = C.media.normal_font C["font"].raid_cooldowns_font_size = 12 C["font"].raid_cooldowns_font_style = "OUTLINE" C["font"].raid_cooldowns_font_shadow = false C["font"].cooldown_timers_font = C.media.normal_font C["font"].cooldown_timers_font_size = 16 C["font"].cooldown_timers_font_style = "OUTLINE" C["font"].cooldown_timers_font_shadow = false C["font"].loot_font = C.media.normal_font C["font"].loot_font_size = 12 C["font"].loot_font_style = "OUTLINE" C["font"].loot_font_shadow = false C["font"].nameplates_font = C.media.normal_font C["font"].nameplates_font_size = 13 C["font"].nameplates_font_style = "OUTLINE" C["font"].nameplates_font_shadow = false C["font"].unit_frames_font = C.media.normal_font C["font"].unit_frames_font_size = 13 C["font"].unit_frames_font_style = "OUTLINE" C["font"].unit_frames_font_shadow = false C["font"].auras_font = C.media.normal_font C["font"].auras_font_size = 12 C["font"].auras_font_style = "OUTLINE" C["font"].auras_font_shadow = false C["font"].filger_font = C.media.normal_font C["font"].filger_font_size = 12 C["font"].filger_font_style = "OUTLINE" C["font"].filger_font_shadow = false C["font"].stylization_font = C.media.normal_font C["font"].stylization_font_size = 12 C["font"].stylization_font_style = "" C["font"].stylization_font_shadow = false C["font"].bags_font = C.media.normal_font C["font"].bags_font_size = 12 C["font"].bags_font_style = "OUTLINE" C["font"].bags_font_shadow = false end ---------------------------------------------------------------------------------------- -- Font replacement for zhTW, zhCN, and koKR clients ---------------------------------------------------------------------------------------- local locale_font if T.client == "zhTW" then locale_font = "Fonts\\bLEI00D.ttf" elseif T.client == "zhCN" then locale_font = "Fonts\\ARKai_T.ttf" elseif T.client == "koKR" then locale_font = "Fonts\\2002.ttf" end if locale_font then C["media"].normal_font = locale_font C["media"].pixel_font = locale_font C["media"].pixel_font_style = "OUTLINE" C["media"].pixel_font_size = 11 C["font"].stats_font = locale_font C["font"].stats_font_size = 12 C["font"].stats_font_style = "OUTLINE" C["font"].stats_font_shadow = true C["font"].combat_text_font = locale_font C["font"].combat_text_font_size = 16 C["font"].combat_text_font_style = "OUTLINE" C["font"].combat_text_font_shadow = true C["font"].chat_font = locale_font C["font"].chat_font_style = "OUTLINE" C["font"].chat_font_shadow = true C["font"].chat_tabs_font = locale_font C["font"].chat_tabs_font_size = 12 C["font"].chat_tabs_font_style = "OUTLINE" C["font"].chat_tabs_font_shadow = true C["font"].action_bars_font = locale_font C["font"].action_bars_font_size = 12 C["font"].action_bars_font_style = "OUTLINE" C["font"].action_bars_font_shadow = true C["font"].threat_meter_font = locale_font C["font"].threat_meter_font_size = 12 C["font"].threat_meter_font_style = "OUTLINE" C["font"].threat_meter_font_shadow = true C["font"].raid_cooldowns_font = locale_font C["font"].raid_cooldowns_font_size = 12 C["font"].raid_cooldowns_font_style = "OUTLINE" C["font"].raid_cooldowns_font_shadow = true C["font"].cooldown_timers_font = locale_font C["font"].cooldown_timers_font_size = 13 C["font"].cooldown_timers_font_style = "OUTLINE" C["font"].cooldown_timers_font_shadow = true C["font"].loot_font = locale_font C["font"].loot_font_size = 13 C["font"].loot_font_style = "OUTLINE" C["font"].loot_font_shadow = true C["font"].nameplates_font = locale_font C["font"].nameplates_font_size = 13 C["font"].nameplates_font_style = "OUTLINE" C["font"].nameplates_font_shadow = true C["font"].unit_frames_font = locale_font C["font"].unit_frames_font_size = 12 C["font"].unit_frames_font_style = "OUTLINE" C["font"].unit_frames_font_shadow = true C["font"].auras_font = locale_font C["font"].auras_font_size = 11 C["font"].auras_font_style = "OUTLINE" C["font"].auras_font_shadow = true C["font"].filger_font = locale_font C["font"].filger_font_size = 14 C["font"].filger_font_style = "OUTLINE" C["font"].filger_font_shadow = true C["font"].stylization_font = locale_font C["font"].stylization_font_size = 12 C["font"].stylization_font_style = "" C["font"].stylization_font_shadow = true C["font"].bags_font = locale_font C["font"].bags_font_size = 11 C["font"].bags_font_style = "OUTLINE" C["font"].bags_font_shadow = true C["font"].tooltip_header_font_size = 14 C["font"].tooltip_font_size = 12 C["font"].bubble_font_size = 14 end ================================================ FILE: ShestakUI/Config/Positions.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Position options -- BACKUP THIS FILE BEFORE UPDATING! ---------------------------------------------------------------------------------------- C["position"] = { -- Miscellaneous positions ["minimap_buttons"] = {"TOPRIGHT", Minimap, "TOPLEFT", -3, 2}, -- Minimap buttons ["minimap"] = {"BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -21, 24}, -- Minimap ["map"] = {"BOTTOM", UIParent, "BOTTOM", 0, 320}, -- Map ["chat"] = {"BOTTOMLEFT", UIParent, "BOTTOMLEFT", 24, 23}, -- Chat ["bag"] = {"BOTTOMRIGHT", Minimap, "TOPRIGHT", 2, 5}, -- Bag ["bank"] = {"LEFT", UIParent, "LEFT", 23, 150}, -- Bank ["bn_popup"] = {"BOTTOMLEFT", ChatFrame1, "TOPLEFT", -3, 27}, -- Battle.net popup ["achievement"] = {"TOP", UIParent, "TOP", 0, -21}, -- Achievements frame ["tooltip"] = {"BOTTOMRIGHT", Minimap, "TOPRIGHT", 2, 5}, -- Tooltip ["vehicle"] = {"BOTTOM", Minimap, "TOP", 0, 27}, -- Vehicle frame ["ghost"] = {"BOTTOM", Minimap, "TOP", 0, 5}, -- Ghost frame ["uierror"] = {"TOP", UIParent, "TOP", 0, -30}, -- Errors frame ["quest"] = {"TOPLEFT", UIParent, "TOPLEFT", 21, -2}, -- Quest log ["loot"] = {"TOPLEFT", UIParent, "TOPLEFT", 245, -220}, -- Loot ["group_loot"] = {"BOTTOM", UIParent, "BOTTOM", -238, 500}, -- Group roll loot ["threat_meter"] = {"BOTTOMLEFT", "ActionBarAnchor", "BOTTOMRIGHT", 7, 16}, -- Threat meter ["raid_cooldown"] = {"TOPLEFT", UIParent, "TOPLEFT", 300, -21}, -- Raid cooldowns ["enemy_cooldown"] = {"BOTTOMLEFT", "oUF_Player", "TOPRIGHT", 33, 62}, -- Enemy cooldowns ["pulse_cooldown"] = {"CENTER", UIParent, "CENTER", 0, 0}, -- Pulse cooldowns ["bg_score"] = {"BOTTOMLEFT", ActionButton12, "BOTTOMRIGHT", 10, -2}, -- BG stats ["player_buffs"] = {"TOPRIGHT", UIParent, "TOPRIGHT", -21, -21}, -- Player buffs ["self_buffs"] = {"CENTER", UIParent, "CENTER", 0, 190}, -- Self buff reminder ["raid_buffs"] = {"BOTTOMLEFT", Minimap, "TOPLEFT", -2, 5}, -- Raid buff reminder ["top_panel"] = {"TOP", UIParent, "TOP", 0, -21}, -- Top panel ["raid_utility"] = {"TOP", UIParent, "TOP", -280, 1}, -- Raid utility ["archaeology"] = {"BOTTOMRIGHT", Minimap, "TOPRIGHT", 2, 5}, -- Archaeology frame ["auto_button"] = {"BOTTOMLEFT", Minimap, "TOPLEFT", -2, 27}, -- Auto button ["extra_button"] = {"BOTTOMRIGHT", ActionButton1, "BOTTOMLEFT", -3, 0}, -- Extra action button ["zone_button"] = {"BOTTOMRIGHT", ActionButton1, "BOTTOMLEFT", -3, 0}, -- Zone action button ["alt_power_bar"] = {"TOP", UIWidgetTopCenterContainerFrame, "BOTTOM", 0, -7}, -- Alt power bar ["talking_head"] = {"TOP", UIParent, "TOP", 0, -21}, -- Talking Head ["uiwidget_top"] = {"TOP", UIParent, "TOP", 0, -21}, -- Top Widget ["uiwidget_below"] = {"TOP", UIWidgetTopCenterContainerFrame, "BOTTOM", 0, -15},-- Below Widget -- ActionBar positions ["bottom_bars"] = {"BOTTOM", UIParent, "BOTTOM", 0, 8}, -- Bottom bars ["right_bars"] = {"BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -21, 330}, -- Right bars ["pet_horizontal"] = {"TOPRIGHT", "ActionBarAnchor", "TOPLEFT", -7, 102}, -- Horizontal pet bar ["stance_bar"] = {"TOPRIGHT", "ActionBarAnchor", "TOPLEFT", -7, 102}, -- Stance bar ["vehicle_bar"] = {"BOTTOMRIGHT", ActionButton1, "BOTTOMLEFT", -3, 0}, -- Vehicle button ["micro_menu"] = {"TOPLEFT", UIParent, "TOPLEFT", 2, -2}, -- Micro menu -- UnitFrame positions unitframes = { ["player"] = {"BOTTOMRIGHT", "ActionBarAnchor", "TOPLEFT", -9, 175}, -- Player frame ["target"] = {"BOTTOMLEFT", "ActionBarAnchor", "TOPRIGHT", 9, 175}, -- Target frame ["target_target"] = {"TOPRIGHT", "oUF_Target", "BOTTOMRIGHT", 0, -11}, -- ToT frame ["pet"] = {"TOPLEFT", "oUF_Player", "BOTTOMLEFT", 0, -11}, -- Pet frame ["focus"] = {"TOPRIGHT", "oUF_Player", "BOTTOMRIGHT", 0, -11}, -- Focus frame ["focus_target"] = {"TOPLEFT", "oUF_Target", "BOTTOMLEFT", 0, -11}, -- Focus target frame ["party_heal"] = {"TOPLEFT", "oUF_Player", "BOTTOMRIGHT", 11, -12}, -- Heal layout Party frames ["raid_heal"] = {"TOPLEFT", "oUF_Player", "BOTTOMRIGHT", 11, -12}, -- Heal layout Raid frames ["party_dps"] = {"BOTTOMLEFT", UIParent, "LEFT", 23, -70}, -- DPS layout Party frames ["raid_dps"] = {"TOPLEFT", UIParent, "TOPLEFT", 23, -23}, -- DPS layout Raid frames ["arena"] = {"BOTTOMRIGHT", UIParent, "RIGHT", -60, -70}, -- Arena frames ["boss"] = {"BOTTOMRIGHT", UIParent, "RIGHT", -23, -70}, -- Boss frames ["tank"] = {"BOTTOMLEFT", "ActionBarAnchor", "BOTTOMRIGHT", 10, 18}, -- Tank frames ["player_portrait"] = {"TOPRIGHT", "oUF_Player", "TOPLEFT", -12, 27}, -- Player Portrait ["target_portrait"] = {"TOPLEFT", "oUF_Target", "TOPRIGHT", 12, 27}, -- Target Portrait ["player_castbar"] = {"BOTTOM", "ActionBarAnchor", "TOP", 0, 175}, -- Player Castbar ["target_castbar"] = {"BOTTOM", "oUF_Player_Castbar", "TOP", 0, 7}, -- Target Castbar ["focus_castbar"] = {"CENTER", UIParent, "CENTER", 0, 250}, -- Focus Castbar icon }, -- Filger positions filger = { ["player_buff_icon"] = {"BOTTOMRIGHT", "oUF_Player", "TOPRIGHT", 2, 173}, -- "P_BUFF_ICON" ["player_proc_icon"] = {"BOTTOMLEFT", "oUF_Target", "TOPLEFT", -2, 173}, -- "P_PROC_ICON" ["special_proc_icon"] = {"BOTTOMRIGHT", "oUF_Player", "TOPRIGHT", 2, 213}, -- "SPECIAL_P_BUFF_ICON" ["target_debuff_icon"] = {"BOTTOMLEFT", "oUF_Target", "TOPLEFT", -2, 213}, -- "T_DEBUFF_ICON" ["target_buff_icon"] = {"BOTTOMLEFT", "oUF_Target", "TOPLEFT", -2, 253}, -- "T_BUFF" ["pve_debuff"] = {"BOTTOMRIGHT", "oUF_Player", "TOPRIGHT", 2, 253}, -- "PVE/PVP_DEBUFF" ["pve_cc"] = {"TOPLEFT", "oUF_Player", "BOTTOMLEFT", -2, -44}, -- "PVE/PVP_CC" ["cooldown"] = {"BOTTOMRIGHT", "oUF_Player", "TOPRIGHT", 63, 17}, -- "COOLDOWN" ["target_bar"] = {"BOTTOMLEFT", "oUF_Target", "BOTTOMRIGHT", 9, -41}, -- "T_DE/BUFF_BAR" }, } ================================================ FILE: ShestakUI/Config/Profiles.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- ShestakUI personal configuration file -- BACKUP THIS FILE BEFORE UPDATING! -- ATTENTION: When saving changes to a file encoded file should be in UTF8 ---------------------------------------------------------------------------------------- -- Configuration example: ---------------------------------------------------------------------------------------- -- if T.name == "MegaChar" then -- C["chat"].width = 100500 -- C["tooltip"].cursor = false -- C["unitframe_class_bar"].totem = false -- C["position"].tooltip = {"BOTTOMRIGHT", Minimap, "TOPRIGHT", 2, 5} -- C["position"].bottom_bars = {"BOTTOM", UIParent, "BOTTOM", 2, 8} -- C["position"].unitframes.tank = {"BOTTOMLEFT", UIParent, "BOTTOM", 176, 68} -- T.CustomFilgerSpell = { -- {"T_DEBUFF_ICON", {spellID = 115767, unitID = "target", caster = "player", filter = "DEBUFF"}}, -- } -- end ---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- -- Per Class Config (overwrite general) -- Class need to be UPPERCASE ---------------------------------------------------------------------------------------- if T.class == "DRUID" then end ---------------------------------------------------------------------------------------- -- Per Character Name Config (overwrite general and class) -- Name need to be case sensitive ---------------------------------------------------------------------------------------- if T.name == "CharacterName" then end ---------------------------------------------------------------------------------------- -- Per Max Character Level Config (overwrite general, class and name) ---------------------------------------------------------------------------------------- if T.level ~= MAX_PLAYER_LEVEL then end ---------------------------------------------------------------------------------------- -- Oz@Pozzo dell'Eternità Config ---------------------------------------------------------------------------------------- if T.name == "Oz" and T.realm == "Pozzo dell'Eternità" then C["position"].bank = {"RIGHT", ChatFrame1, "BOTTOM", 349, 371} C["position"].bn_popup = {"BOTTOMRIGHT", Minimap, "TOPRIGHT", 2, 5} C["position"].vehicle = {"BOTTOMLEFT", "ActionBarAnchor", "BOTTOMRIGHT", 109, 100} C["position"].ghost = {"TOPLEFT", "oUF_Player", "TOPLEFT", -2, 65} C["position"].quest = {"TOPRIGHT", UIParent, "TOPRIGHT", -238, -111} C["position"].loot = {"TOPLEFT", UIParent, "TOPLEFT", 21, -532} C["position"].group_loot = {"TOPLEFT", UIParent, "TOPLEFT", 241, -211} C["position"].threat_meter = {"BOTTOM", "oUF_Target", "BOTTOM", -283, 77} C["position"].raid_cooldown = {"TOPRIGHT", UIParent, "TOPRIGHT", -21, -115} C["position"].enemy_cooldown = {"BOTTOMLEFT", "oUF_Target", "BOTTOMRIGHT", 9, -62} C["position"].raid_buffs = {"BOTTOMLEFT", Minimap, "TOPLEFT", -2, 5} C["position"].raid_utility = {"TOPLEFT", UIParent, "TOPLEFT", 241, -21} C["position"].extra_button = {"RIGHT", "oUF_Player", "BOTTOM", -53, -126} C["position"].stance_bar = {"RIGHT", "oUF_Player", "BOTTOM", 82, -85} C["position"].unitframes.player = {"TOPLEFT", "ActionBarAnchor", "BOTTOMRIGHT", -558, 373} C["position"].unitframes.target = {"TOPRIGHT", "ActionBarAnchor", "BOTTOMLEFT", 558, 373} C["position"].unitframes.tank = {"BOTTOMLEFT", "ActionBarAnchor", "BOTTOMRIGHT", 5, 18} C["position"].unitframes.player_castbar = {"CENTER", UIParent, "CENTER", 0, 136} C["position"].unitframes.target_castbar = {"BOTTOM", "oUF_Target", "BOTTOM", -272, -4} C["position"].unitframes.raid_heal = {"TOPLEFT", "ActionBarAnchor", "BOTTOMRIGHT", -331, 335} C["media"].border_color = {0.1, 0.1, 0.1, 1} C["general"].welcome_message = false C["misc"].invite_keyword = "inv" C["misc"].item_level = true C["general"].move_blizzard = true C["announcements"].flask_food = true C["announcements"].pull_countdown = false C["automation"].release = false C["automation"].decline_duel = false C["automation"].solve_artifact = false C["skins"].blizzard_frames = true C["skins"].minimap_buttons = true C["skins"].dbm = true C["skins"].npcscan = true C["skins"].skada = true C["skins"].my_role_play = true C["combattext"].icons = false C["combattext"].scrollable = true C["combattext"].dk_runes = false C["combattext"].killingblow = true C["reminder"].raid_buffs_size = 16.8 C["threat"].width = 125 C["threat"].bar_rows = 2 C["tooltip"].item_icon = true C["tooltip"].talents = true C["tooltip"].achievements = false C["tooltip"].title = true C["tooltip"].spell_id = true C["tooltip"].average_lvl = true C["tooltip"].raid_icon = true C["tooltip"].who_targetting = true C["chat"].background = true C["chat"].filter = false C["chat"].chat_bar = true C["chat"].chat_bar_mouseover = true C["chat"].tabs_mouseover = true C["chat"].damage_meter_spam = true C["minimap"].size = 116 C["minimap"].toggle_menu = false C["loot"].auto_greed = false C["nameplate"].show_castbar_name = true C["nameplate"].class_icons = true C["nameplate"].track_debuffs = true C["nameplate"].healer_icon = true C["actionbar"].hotkey = false C["actionbar"].bottombars = 1 C["aura"].focus_debuffs = true C["aura"].fot_debuffs = true C["aura"].pet_debuffs = true C["aura"].tot_debuffs = true C["aura"].cast_by = true C["filger"].show_tooltip = true C["unitframe"].own_color = true C["unitframe"].uf_color = {0.15, 0.15, 0.15} C["unitframe"].enemy_health_color = false C["unitframe"].color_value = true C["unitframe"].bar_color_value = true C["unitframe"].castbar_icon = true C["unitframe"].icons_pvp = true C["unitframe"].plugins_gcd = true C["unitframe"].plugins_reputation_bar = true C["unitframe"].plugins_experience_bar = true C["unitframe"].plugins_smooth_bar = true C["unitframe"].plugins_enemy_spec = true C["unitframe"].plugins_fader = true C["unitframe"].plugins_diminishing = true C["raidframe"].raid_tanks_tt = true C["raidframe"].raid_groups = 8 C["raidframe"].icons_role = true C["raidframe"].plugins_aura_watch_timer = true C["raidframe"].plugins_auto_resurrection = true C["toppanel"].enable = false C["stats"].battleground = true end ---------------------------------------------------------------------------------------- -- Sw2rT1 Config ---------------------------------------------------------------------------------------- if Sw2rT1 then C["general"].welcome_message = false C["general"].hide_banner = false C["general"].hide_talking_head = true C["misc"].shift_marking = false C["misc"].raid_tools = false C["misc"].hide_raid_button = true C["trade"].disenchanting = true C["announcements"].pull_countdown = false C["automation"].accept_invite = true --C["automation"].accept_quest = true C["automation"].auto_collapse = true C["skins"].blizzard_frames = true C["skins"].minimap_buttons = true C["skins"].dbm = true C["skins"].details = true C["skins"].weak_auras = true C["combattext"].crit_prefix = "" C["combattext"].crit_postfix = "" C["minimap"].size = 165 C["minimap"].fog_of_war = true C["raidcooldown"].enable = false C["threat"].enable = false C["tooltip"].item_icon = true C["tooltip"].title = true C["tooltip"].raid_icon = true C["tooltip"].average_lvl = true C["tooltip"].item_count = true C["tooltip"].instance_lock = true C["chat"].combatlog = false C["chat"].damage_meter_spam = true C["bag"].ilvl = true C["filger"].enable = false C["unitframe"].enemy_health_color = false C["unitframe"].castbar_latency = false C["raidframe"].raid_groups = 6 C["raidframe"].icons_role = true C["toppanel"].enable = false C["position"].quest = {"TOPRIGHT", UIParent, "TOPRIGHT", -52, -73} end ---------------------------------------------------------------------------------------- -- Wetxius Config ---------------------------------------------------------------------------------------- if IsWetxius then C["general"].welcome_message = false C["general"].vehicle_mouseover = true C["skins"].blizzard_frames = true C["skins"].minimap_buttons = true C["skins"].bigwigs = true C["skins"].details = true C["unitframe"].castbar_icon = true C["unitframe"].plugins_enemy_spec = true C["raidframe"].solo_mode = true C["raidframe"].icons_leader = false C["aura"].show_spiral = true C["aura"].cast_by = true C["actionbar"].toggle_mode = false C["actionbar"].bottombars = 3 C["tooltip"].hide_combat = true C["tooltip"].rank = false C["tooltip"].spell_id = true C["tooltip"].unit_role = true C["tooltip"].mount = true C["chat"].background = true C["chat"].spam = true C["chat"].damage_meter_spam = true C["chat"].chat_bar = true C["chat"].chat_bar_mouseover = true C["chat"].combatlog = false C["chat"].loot_icons = true -- C["chat"].history = true C["chat"].role_icons = true C["chat"].custom_time_color = false C["nameplate"].health_value = true C["nameplate"].healer_icon = true C["nameplate"].track_buffs = true C["nameplate"].low_health = true C["nameplate"].quests = true C["nameplate"].cast_color = true C["nameplate"].kick_color = true C["nameplate"].mob_color_enable = true C["nameplate"].extra_color = {1, 0, 0.55} C["combattext"].crit_prefix = "" C["combattext"].blizz_head_numbers = true C["combattext"].dk_runes = false C["bag"].ilvl = true C["bag"].new_items = true C["minimap"].toggle_menu = false C["minimap"].fog_of_war = true C["filger"].show_tooltip = true C["announcements"].bad_gear = true C["automation"].accept_invite = true C["automation"].screenshot = true C["automation"].auto_role = true C["automation"].tab_binder = true C["automation"].open_items = true C["automation"].auto_collapse = "SCENARIO" C["enemycooldown"].show_inparty = true C["enemycooldown"].class_color = true C["pulsecooldown"].enable = true C["pulsecooldown"].threshold = 6 C["threat"].enable = false C["toppanel"].enable = false C["stats"].battleground = true C["stats"].currency_cooking = false C["stats"].currency_professions = false C["stats"].currency_raid = false C["stats"].currency_misc = false C["trade"].disenchanting = true C["trade"].enchantment_scroll = true C["misc"].shift_marking = false C["misc"].quest_auto_button = true C["misc"].click_cast = true C["font"].stats_font = C.media.normal_font C["font"].stats_font_style = "OUTLINE" C["font"].stats_font_size = 12 -- C["position"].raid_cooldown = {"TOPLEFT", UIParent, "TOPLEFT", 300, -14} C["position"].bag = {"BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -21, 20} C["position"].bank = {"BOTTOMLEFT", UIParent, "BOTTOMLEFT", 21, 20} C["position"].auto_button = {"BOTTOMLEFT", "oUF_Player" or ChatFrame1, "TOPRIGHT", 33, 83} C["position"].unitframes.arena = {"BOTTOMRIGHT", UIParent, "RIGHT", -55, -70} C["position"].stance_bar = {"TOPRIGHT", "ActionBarAnchor", "TOPLEFT", -3, 0} local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_LOGIN") frame:SetScript("OnEvent", function() xCT3:SetPoint("CENTER", 0, 305) xCT3:SetWidth(400) C["combattext"].heal_treshold = UnitHealthMax("player")/100 if PTR_IssueReporter then PTR_IssueReporter:SetAlpha(0) PTR_IssueReporter:SetScale(0.001) end SetCVar("lootUnderMouse", 1) end) T.CustomFilgerSpell = { {"P_PROC_ICON", {spellID = 26573, filter = "ICD", trigger = "NONE", totem = true}}, -- Consecration } end ---------------------------------------------------------------------------------------- -- Load external profile https://github.com/Wetxius/ShestakUI_Profile ---------------------------------------------------------------------------------------- if ShestakUICustomProfile then ShestakUICustomProfile() end ================================================ FILE: ShestakUI/Config/Settings.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- ShestakUI main configuration file -- BACKUP THIS FILE BEFORE UPDATING! ---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- -- Media options ---------------------------------------------------------------------------------------- C["media"] = { ["normal_font"] = [[Interface\AddOns\ShestakUI\Media\Fonts\Normal.ttf]], -- Normal font ["blank_font"] = [[Interface\AddOns\ShestakUI\Media\Fonts\Blank.ttf]], -- Blank font ["pixel_font"] = [[Interface\AddOns\ShestakUI\Media\Fonts\Pixel.ttf]], -- Pixel font ["pixel_font_style"] = "MONOCHROMEOUTLINE", -- Pixel font style ("MONOCHROMEOUTLINE" or "OUTLINE") ["pixel_font_size"] = 8, -- Pixel font size for those places where it is not specified ["blank"] = [[Interface\AddOns\ShestakUI\Media\Textures\White.tga]], -- Texture for borders ["texture"] = [[Interface\AddOns\ShestakUI\Media\Textures\Texture.tga]], -- Texture for status bars ["highlight"] = [[Interface\AddOns\ShestakUI\Media\Textures\Highlight.tga]], -- Texture for debuffs highlight ["whisp_sound"] = [[Interface\AddOns\ShestakUI\Media\Sounds\Whisper.ogg]], -- Sound for whispers ["warning_sound"] = [[Interface\AddOns\ShestakUI\Media\Sounds\Warning.ogg]], -- Sound for warning ["proc_sound"] = [[Interface\AddOns\ShestakUI\Media\Sounds\Proc.ogg]], -- Sound for procs ["classborder_color"] = {T.color.r, T.color.g, T.color.b, 1}, -- Color for class borders ["border_color"] = {0.37, 0.3, 0.3, 1}, -- Color for borders ["backdrop_color"] = {0, 0, 0, 1}, -- Color for borders backdrop ["backdrop_alpha"] = 0.7, -- Alpha for transparent backdrop } ---------------------------------------------------------------------------------------- -- General options ---------------------------------------------------------------------------------------- C["general"] = { ["welcome_message"] = true, -- Enable welcome message in chat ["auto_scale"] = true, -- Autoscale ["uiscale"] = 0.75, -- Your value (between 0.2 and 1) if "auto_scale" is disable -- Blizzard UI ["error_filter"] = "BLACKLIST", -- Filter Blizzard red errors (BLACKLIST, WHITELIST, COMBAT, NONE) ["move_blizzard"] = false, -- Move some Blizzard frames ["color_picker"] = false, -- Improved ColorPicker ["vehicle_mouseover"] = false, -- Vehicle frame on mouseover ["minimize_mouseover"] = false, -- Mouseover for quest minimize button ["hide_banner"] = false, -- Hide Boss Banner Loot Frame ["hide_talking_head"] = false, -- Hide Talking Head Frame ["hide_maw_buffs"] = false, -- Hide Maw Buffs frame in instances } if T.screenHeight == 1440 then C.general.auto_scale = false C.general.uiscale = 0.64 end ---------------------------------------------------------------------------------------- -- Skins options ---------------------------------------------------------------------------------------- C["skins"] = { ["blizzard_frames"] = false, -- Blizzard frames skin ["bubbles"] = true, -- Skin Blizzard chat bubbles ["minimap_buttons"] = false, -- Skin addons icons on minimap ["minimap_buttons_mouseover"] = true, -- Addons icons on mouseover -- Addons ["ace3"] = false, -- Ace3 options elements skin ["atlasloot"] = false, -- AtlasLoot skin ["bigwigs"] = false, -- BigWigs skin ["blood_shield_tracker"] = false, -- BloodShieldTracker skin ["capping"] = false, -- Capping skin ["clique"] = false, -- Clique skin ["cool_line"] = false, -- CoolLine skin ["dbm"] = false, -- DBM skin ["details"] = false, -- Details skin ["dominos"] = false, -- Dominos skin ["flyout_button"] = false, -- FlyoutButtonCustom skin ["ls_toasts"] = false, -- Is: Toasts skin ["mage_nuggets"] = false, -- MageNuggets skin ["my_role_play"] = false, -- MyRolePlay skin ["npcscan"] = false, -- NPCScan skin ["nug_running"] = false, -- NugRunning skin ["omen"] = false, -- Omen skin ["opie"] = false, -- OPie skin ["ovale"] = false, -- OvaleSpellPriority skin ["postal"] = false, -- Postal skin ["recount"] = false, -- Recount skin ["rematch"] = false, -- Rematch skin ["skada"] = false, -- Skada skin ["tiny_dps"] = false, -- TinyDPS skin ["vanaskos"] = false, -- VanasKoS skin ["weak_auras"] = false, -- WeakAuras skin } ---------------------------------------------------------------------------------------- -- Unit Frames options ---------------------------------------------------------------------------------------- C["unitframe"] = { -- Main ["enable"] = true, -- Enable unit frames ["own_color"] = false, -- Set your color for health bars ["uf_color"] = {0.4, 0.4, 0.4}, -- Color for health bars if ["own_color"] = true ["uf_color_bg"] = {0.1, 0.1, 0.1}, -- Color for background ["enemy_health_color"] = true, -- If enable, enemy target color is red ["show_total_value"] = false, -- Display of info text on player and target with XXXX/Total ["color_value"] = false, -- Health/mana value is colored ["bar_color_value"] = false, -- Health bar color by current health remaining ["lines"] = true, -- Show Player and Target lines -- Cast bars ["unit_castbar"] = true, -- Show castbars ["castbar_icon"] = false, -- Show castbar icons ["castbar_latency"] = true, -- Castbar latency ["castbar_ticks"] = false, -- Castbar ticks -- Frames ["show_pet"] = true, -- Show pet frame ["show_focus"] = true, -- Show focus frame ["show_target_target"] = true, -- Show target target frame ["show_boss"] = true, -- Show boss frames ["boss_on_right"] = true, -- Boss frames on the right ["show_arena"] = true, -- Show arena frames ["arena_on_right"] = true, -- Arena frames on the right -- Icons ["icons_pvp"] = false, -- Mouseover PvP text (not icons) on player and target frames ["icons_combat"] = true, -- Combat icon ["icons_resting"] = true, -- Resting icon -- Portraits ["portrait_enable"] = false, -- Enable player/target portraits ["portrait_classcolor_border"] = true, -- Enable classcolor border ["portrait_type"] = "3D", -- Type of portraits (3D, 2D, ICONS, OVERLAY) ["portrait_height"] = 92, -- Portrait height ["portrait_width"] = 67, -- Portrait width -- Plugins ["plugins_gcd"] = false, -- Global cooldown spark on player frame ["plugins_swing"] = false, -- Swing bar ["plugins_reputation_bar"] = false, -- Reputation bar (left from player frame by mouseover, Middle-Click to lock visibility) ["plugins_experience_bar"] = false, -- Experience bar (left from player frame by mouseover, Middle-Click to lock visibility) ["plugins_smooth_bar"] = false, -- Smooth bar ["plugins_enemy_spec"] = false, -- Enemy specialization in BG and Arena ["plugins_combat_feedback"] = false, -- Combat text on player/target frame ["plugins_fader"] = false, -- Fade unit frames ["plugins_diminishing"] = false, -- Diminishing Returns icons on arena frames ["plugins_power_prediction"] = false, -- Power cost prediction bar on player frame ["plugins_absorbs"] = false, -- Absorbs value on player frame -- Size ["player_width"] = 217, -- Player and Target width ["boss_width"] = 150, -- Boss and Arena width ["extra_height_auto"] = true, -- Auto height for health/power depending on font size ["extra_health_height"] = 0, -- Additional height for health ["extra_power_height"] = 0, -- Additional height for power ["castbar_width"] = 258, -- Player and Target castbar width ["castbar_height"] = 16, -- Player and Target castbar height } ---------------------------------------------------------------------------------------- -- Unit Frames Class bar options ---------------------------------------------------------------------------------------- C["unitframe_class_bar"] = { ["combo"] = true, -- Rogue/Druid Combo bar ["combo_always"] = false, -- Always show Combo bar for Druid ["combo_old"] = false, -- Show combo point on the target ["arcane"] = true, -- Arcane Charge bar ["chi"] = true, -- Chi bar ["essence"] = true, -- Essence bar ["stagger"] = true, -- Stagger bar (for Monk Tanks) ["holy"] = true, -- Holy Power bar ["shard"] = true, -- Shard/Burning bar ["rune"] = true, -- Rune bar ["totem"] = true, -- Totem bar for Shaman ["totem_other"] = true, -- Totem bar for other classes } ---------------------------------------------------------------------------------------- -- Raid Frames options ---------------------------------------------------------------------------------------- C["raidframe"] = { -- Main ["layout"] = "HEAL", -- Raid layout (HEAL, DPS, AUTO, BLIZZARD) ["show_party"] = true, -- Show party frames ["show_raid"] = true, -- Show raid frames ["show_target"] = true, -- Show target frames ["show_pet"] = true, -- Show pet frames ["solo_mode"] = false, -- Show player frame always ["player_in_party"] = true, -- Show player frame in party ["raid_tanks"] = true, -- Show raid tanks ["raid_tanks_tt"] = false, -- Show raid tanks target target ["raid_groups"] = 5, -- Number of groups in raid ["auto_position"] = "DYNAMIC", -- Auto reposition raid frame (only for Heal layout) (DYNAMIC, STATIC, NONE) ["party_vertical"] = false, -- Vertical party (only for Heal layout) ["raid_groups_vertical"] = false, -- Vertical raid groups (only for Heal layout) ["vertical_health"] = false, -- Vertical orientation of health (only for Heal layout) ["by_role"] = true, -- Sorting players in group by role ["aggro_border"] = true, -- Aggro border ["deficit_health"] = false, -- Raid deficit health ["hide_health_value"] = false, -- Hide raid health value ["alpha_health"] = false, -- Alpha of healthbars when 100%hp ["show_range"] = true, -- Show range opacity for raidframes ["range_alpha"] = 0.5, -- Alpha of unitframes when unit is out of range -- Icons ["icons_role"] = false, -- Role icon on frames ["icons_raid_mark"] = true, -- Raid mark icons on frames ["icons_ready_check"] = true, -- Ready check icons on frames ["icons_leader"] = true, -- Leader icon and assistant icon on frames ["icons_sumon"] = true, -- Sumon icons on frames ["icons_phase"] = true, -- Phase icons on frames -- Plugins ["plugins_aura_watch"] = true, -- Raid debuff icons (from the list) ["plugins_aura_watch_timer"] = false, -- Timer on raid debuff icons ["plugins_debuffhighlight_icon"] = false, -- Show dispellable debuff icon (texture will be shown anyway) ["plugins_pvp_debuffs"] = false, -- Show PvP debuff icons (from the list) ["plugins_healcomm"] = true, -- Incoming heal bar on raid frame ["plugins_over_absorb"] = false, -- Show over absorb bar on raid frame ["plugins_over_heal_absorb"] = false, -- Show over heal absorb on raid frame (from enemy debuffs) ["plugins_auto_resurrection"] = false, -- Auto cast resurrection on middle-click (doesn't work with Clique) -- Heal layout size ["heal_party_width"] = 60.2, -- Party width ["heal_party_height"] = 26, -- Party height ["heal_party_power_height"] = 2, -- Party power height ["heal_raid_width"] = 60.2, -- Raid width ["heal_raid_height"] = 26, -- Raid height ["heal_raid_power_height"] = 2, -- Raid power height -- DPS layout size ["dps_party_width"] = 140, -- Party width ["dps_party_height"] = 27, -- Party height ["dps_party_power_height"] = 5, -- Party power height ["dps_raid_width"] = 104, -- Raid width ["dps_raid_height"] = 17, -- Raid height ["dps_raid_power_height"] = 1, -- Raid power height } ---------------------------------------------------------------------------------------- -- Auras/Buffs/Debuffs options ---------------------------------------------------------------------------------------- C["aura"] = { ["player_buff_size"] = 25, -- Player buffs size ["debuff_size"] = 25, -- Debuffs size on unitframes ["show_spiral"] = false, -- Spiral on aura icons ["show_timer"] = true, -- Show cooldown timer on aura icons ["player_auras"] = true, -- Auras on player frame ["target_auras"] = true, -- Auras on target frame ["focus_debuffs"] = false, -- DeBuffs on focus frame ["fot_debuffs"] = false, -- DeBuffs on focustarget frame ["pet_debuffs"] = false, -- DeBuffs on pet frame ["tot_debuffs"] = false, -- DeBuffs on targettarget frame ["boss_auras"] = true, -- Auras on boss frame ["boss_debuffs"] = 0, -- Number of debuffs on the boss frames ["boss_buffs"] = 3, -- Number of buffs on the boss frames ["player_aura_only"] = false, -- Only your debuff on target frame ["debuff_color_type"] = true, -- Color debuff by type ["classcolor_border"] = false, -- Enable classcolor border for player buffs ["cast_by"] = false, -- Show who cast a buff/debuff in its tooltip } ---------------------------------------------------------------------------------------- -- ActionBar options ---------------------------------------------------------------------------------------- C["actionbar"] = { -- Main ["enable"] = true, -- Enable actionbars ["hotkey"] = true, -- Show hotkey on buttons ["macro"] = false, -- Show macro name on buttons ["show_grid"] = true, -- Show empty action bar buttons ["button_size"] = 25, -- Buttons size ["button_space"] = 3, -- Buttons space ["split_bars"] = false, -- Split the fifth bar on two bars on 6 buttons ["classcolor_border"] = false, -- Enable classcolor border ["hide_highlight"] = false, -- Hide proc highlight ["toggle_mode"] = true, -- Enable toggle mode -- Bottom bars ["bottombars"] = 2, -- Number of action bars on the bottom (1, 2 or 3) ["bottombars_mouseover"] = false, -- Bottom bars on mouseover -- Right bars ["rightbars"] = 3, -- Number of action bars on right (0, 1, 2 or 3) ["rightbars_mouseover"] = true, -- Right bars on mouseover -- Pet bar ["petbar_hide"] = false, -- Hide pet bar ["petbar_horizontal"] = false, -- Enable horizontal pet bar ["petbar_mouseover"] = false, -- Pet bar on mouseover (only for horizontal pet bar) -- Stance bar ["stancebar_hide"] = false, -- Hide stance bar ["stancebar_horizontal"] = true, -- Enable horizontal stance bar ["stancebar_mouseover"] = true, -- Stance bar on mouseover (only for horizontal stance bar) -- MicroMenu ["micromenu"] = false, -- Enable micro menu ["micromenu_mouseover"] = false, -- Micro menu on mouseover -- Bars editor ["editor"] = false, -- Allow to move and change each panel individually -- Bar 1 ["bar1_num"] = 12, -- Number of buttons ["bar1_row"] = 12, -- Buttons per row ["bar1_size"] = 25, -- Buttons size ["bar1_mouseover"] = false, -- Bar on mouseover -- Bar 2 ["bar2_num"] = 12, -- Number of buttons ["bar2_row"] = 12, -- Buttons per row ["bar2_size"] = 25, -- Buttons size ["bar2_mouseover"] = false, -- Bar on mouseover -- Bar 3 ["bar3_num"] = 12, -- Number of buttons ["bar3_row"] = 1, -- Buttons per row ["bar3_size"] = 25, -- Buttons size ["bar3_mouseover"] = false, -- Bar on mouseover -- Bar 4 ["bar4_num"] = 12, -- Number of buttons ["bar4_row"] = 1, -- Buttons per row ["bar4_size"] = 25, -- Buttons size ["bar4_mouseover"] = false, -- Bar on mouseover -- Bar 5 ["bar5_num"] = 12, -- Number of buttons ["bar5_row"] = 12, -- Buttons per row ["bar5_size"] = 25, -- Buttons size ["bar5_mouseover"] = false, -- Bar on mouseover -- Bar 6 ["bar6_num"] = 12, -- Number of buttons ["bar6_row"] = 1, -- Buttons per row ["bar6_size"] = 25, -- Buttons size ["bar6_mouseover"] = false, -- Bar on mouseover -- Bar 7 ["bar7_enable"] = false, -- Enable custom bar 7 ["bar7_num"] = 12, -- Number of buttons ["bar7_row"] = 12, -- Buttons per row ["bar7_size"] = 25, -- Buttons size ["bar7_mouseover"] = false, -- Bar on mouseover -- Bar 8 ["bar8_enable"] = false, -- Enable custom bar 8 ["bar8_num"] = 12, -- Number of buttons ["bar8_row"] = 12, -- Buttons per row ["bar8_size"] = 25, -- Buttons size ["bar8_mouseover"] = false, -- Bar on mouseover } ---------------------------------------------------------------------------------------- -- Tooltip options ---------------------------------------------------------------------------------------- C["tooltip"] = { ["enable"] = true, -- Enable tooltip ["shift_modifer"] = false, -- Show tooltip when Shift is pushed ["cursor"] = false, -- Tooltip above cursor ["item_icon"] = false, -- Item icon in tooltip ["health_value"] = false, -- Numeral health value ["hidebuttons"] = false, -- Hide tooltip for actions bars ["hide_combat"] = false, -- Hide tooltip in combat -- Plugins ["title"] = false, -- Player title in tooltip ["realm"] = true, -- Player realm name in tooltip ["rank"] = true, -- Player guild-rank in tooltip ["target"] = true, -- Target player in tooltip ["talents"] = false, -- Show specialization ["average_lvl"] = false, -- Average items level ["show_shift"] = true, -- Show items level and spec when Shift is pushed ["raid_icon"] = false, -- Raid icon ["unit_role"] = false, -- Unit role in tooltip ["who_targetting"] = false, -- Show who is targetting the unit (in raid or party) ["spell_id"] = false, -- Id number spells (/si to print buff info in chat) ["item_count"] = false, -- Item count in bags and bank ["achievements"] = true, -- Comparing achievements in tooltip ["instance_lock"] = false, -- Your instance lock status in tooltip ["mount"] = false, -- Show source of mount } ---------------------------------------------------------------------------------------- -- Chat options ---------------------------------------------------------------------------------------- C["chat"] = { ["enable"] = true, -- Enable chat ["width"] = 350, -- Chat width ["height"] = 112, -- Chat height ["background"] = false, -- Enable background for chat ["background_alpha"] = 0.7, -- Background alpha ["filter"] = true, -- Removing some systems spam ("Player1" won duel "Player2") ["spam"] = false, -- Removing some players spam (gold/portals/etc) ["chat_bar"] = false, -- Lite Button Bar for switch chat channel ["chat_bar_mouseover"] = false, -- Lite Button Bar on mouseover ["whisp_sound"] = true, -- Sound when whisper ["combatlog"] = true, -- Show CombatLog tab ["tabs_mouseover"] = false, -- Chat tabs on mouseover ["sticky"] = true, -- Remember last channel ["damage_meter_spam"] = false, -- Merge damage meter spam in one line-link ["loot_icons"] = false, -- Icons for loot ["role_icons"] = false, -- Role Icons ["history"] = false, -- Chat history ["hide_combat"] = false, -- Hide chat in combat ["custom_time_color"] = true, -- Enable custom timestamp coloring ["time_color"] = {1, 1, 0}, -- Timestamp coloring (http://www.december.com/html/spec/colorcodescompact.html) } ---------------------------------------------------------------------------------------- -- Nameplate options ---------------------------------------------------------------------------------------- C["nameplate"] = { ["enable"] = true, -- Enable nameplate ["width"] = 120, -- Nameplate width ["height"] = 9, -- Nameplate height ["ad_width"] = 0, -- Additional width for selected nameplate ["ad_height"] = 0, -- Additional height for selected nameplate ["alpha"] = 0.5, -- Non-target nameplate alpha ["combat"] = false, -- Automatically show nameplate in combat ["health_value"] = false, -- Numeral health value ["show_castbar_name"] = false, -- Show castbar name ["class_icons"] = false, -- Icons by class in PvP ["name_abbrev"] = false, -- Display abbreviated names ["short_name"] = false, -- Replace names with short ones ["clamp"] = false, -- Clamp nameplates to the top of the screen when outside of view ["track_debuffs"] = false, -- Show your debuffs (from the list) ["track_buffs"] = false, -- Show dispellable enemy buffs and buffs from the list ["auras_size"] = 25, -- Auras size ["healer_icon"] = false, -- Show icon above enemy healers nameplate in battlegrounds ["totem_icons"] = false, -- Show icon above enemy totems nameplate ["target_glow"] = false, -- Show glow texture for target ["only_name"] = false, -- Show only name for friendly units ["quests"] = false, -- Show quest icon ["low_health"] = false, -- Show red border when low health ["low_health_value"] = 0.2, -- Value for low health (between 0.1 and 1) ["low_health_color"] = {0.8, 0, 0}, -- Color for low health border ["cast_color"] = false, -- Show color border for casting important spells ["kick_color"] = false, -- Change cast color if interrupt on cd -- Threat ["enhance_threat"] = true, -- Enable threat feature, automatically changes by your role ["good_color"] = {0.2, 0.8, 0.2}, -- Good threat color ["near_color"] = {1, 1, 0}, -- Near threat color ["bad_color"] = {1, 0, 0}, -- Bad threat color ["offtank_color"] = {0, 0.5, 1}, -- Offtank threat color ["extra_color"] = {1, 0.3, 0}, -- Explosive and Spiteful affix color ["mob_color_enable"] = false, -- Change color for important mobs in dungeons ["mob_color"] = {0, 0.5, 0.8}, -- Color for mobs } ---------------------------------------------------------------------------------------- -- Combat text options ---------------------------------------------------------------------------------------- C["combattext"] = { ["enable"] = true, -- Global enable combat text ["blizz_head_numbers"] = false, -- Use blizzard damage/healing output (above mob/player head) ["damage_style"] = true, -- Change default damage/healing font above mobs/player heads (you need to restart WoW to see changes) ["damage"] = true, -- Show outgoing damage ["pet_damage"] = true, -- Show your pet damage ["dot_damage"] = true, -- Show damage from your dots ["healing"] = true, -- Show outgoing healing ["show_hots"] = true, -- Show periodic healing effects in healing frame ["show_overhealing"] = true, -- Show outgoing overhealing ["incoming"] = true, -- Show incoming damage and healing ["damage_color"] = true, -- Display damage numbers depending on school of magic ["dispel"] = true, -- Tells you about your dispels (works only with ["damage"] = true) ["interrupt"] = true, -- Tells you about your interrupts (works only with ["damage"] = true) ["icons"] = true, -- Show outgoing damage icons ["icon_size"] = 16, -- Icon size of spells in outgoing damage frame, also has effect on dmg font size ["max_lines"] = 15, -- Max lines to keep in scrollable mode (more lines = more memory) ["time_visible"] = 3, -- Time (seconds) a single message will be visible ["short_numbers"] = true, -- Use short numbers ("25.3k" instead of "25342") ["merge_aoe_spam"] = true, -- Merges multiple aoe damage/heal spam into single message ["merge_melee"] = true, -- Merges multiple auto attack damage spam ["merge_all"] = false, -- Merges all spells ["direction"] = true, -- Change scrolling direction from bottom to top ["dk_runes"] = true, -- Show Death Knight rune recharge ["killingblow"] = false, -- Tells you about your killingblows ["scrollable"] = false, -- Allows you to scroll frame lines with mousewheel ["crit_prefix"] = "*", -- Symbol that will be added before crit ["crit_postfix"] = "*", -- Symbol that will be added after crit ["treshold"] = 1, -- Minimum damage to show in damage frame ["heal_treshold"] = 1, -- Minimum healing to show in incoming/outgoing healing messages } ---------------------------------------------------------------------------------------- -- Bag options ---------------------------------------------------------------------------------------- C["bag"] = { ["enable"] = true, -- Enable bags ["ilvl"] = false, -- Show item level for weapons and armor ["new_items"] = false, -- Show animation for new items ["filter"] = false, -- Always show filter buttons ["button_size"] = 27, -- Buttons size ["button_space"] = 3, -- Buttons space ["bank_columns"] = 17, -- Horizontal number of columns in bank ["bag_columns"] = 10, -- Horizontal number of columns in main bag } ---------------------------------------------------------------------------------------- -- Minimap options ---------------------------------------------------------------------------------------- C["minimap"] = { ["enable"] = true, -- Enable minimap ["on_top"] = false, -- Move minimap on top right corner ["tracking_icon"] = false, -- Tracking icon ["garrison_icon"] = false, -- Covenant icon ["size"] = 130, -- Minimap size ["hide_combat"] = false, -- Hide minimap in combat ["toggle_menu"] = true, -- Show toggle menu -- Other ["bg_map_stylization"] = true, -- BG map stylization ["fog_of_war"] = false, -- Remove fog of war on World Map } ---------------------------------------------------------------------------------------- -- Loot options ---------------------------------------------------------------------------------------- C["loot"] = { ["lootframe"] = true, -- Enable loot frame ["rolllootframe"] = true, -- Enable group roll frame (Blizzard doesn't use roll system anymore) ["icon_size"] = 22, -- Icon size ["width"] = 221, -- Loot window width ["auto_greed"] = false, -- Push "greed" or "disenchant" button when green item roll at max level (Blizzard doesn't use roll system anymore) ["auto_confirm_de"] = true, -- Auto confirm disenchant and take BoP loot ["faster_loot"] = false, -- Faster auto looting } ---------------------------------------------------------------------------------------- -- Filger options ---------------------------------------------------------------------------------------- C["filger"] = { ["enable"] = true, -- Enable Filger ["show_tooltip"] = false, -- Show tooltip ["expiration"] = false, -- Sort cooldowns by expiration time -- Elements ["show_buff"] = true, -- Player buffs ["show_proc"] = true, -- Player procs ["show_debuff"] = true, -- Debuffs on target ["show_aura_bar"] = true, -- Aura bars on target ["show_special"] = true, -- Special buffs on player ["show_pvp_player"] = true, -- PvP debuffs on player ["show_pvp_target"] = true, -- PvP auras on target ["show_cd"] = true, -- Cooldowns -- Icons size ["buffs_size"] = 37, -- Buffs size ["buffs_space"] = 3, -- Buffs space ["pvp_size"] = 60, -- PvP auras size ["pvp_space"] = 3, -- PvP auras space ["cooldown_size"] = 30, -- Cooldowns size ["cooldown_space"] = 3, -- Cooldowns space -- Testing ["test_mode"] = false, -- Test icon mode ["max_test_icon"] = 5, -- Number of icons in test mode } ---------------------------------------------------------------------------------------- -- Announcements options ---------------------------------------------------------------------------------------- C["announcements"] = { ["interrupts"] = false, -- Announce when you interrupt ["spells"] = false, -- Announce when you cast some spell (from the list) ["spells_from_all"] = false, -- Check spells cast from all members ["feasts"] = false, -- Announce Feasts/Souls/Repair Bots cast ["portals"] = false, -- Announce Portals/Ritual of Summoning cast ["toys"] = false, -- Announce some annoying toys ["flask_food"] = false, -- Announce the usage of flasks and food (/ffcheck) ["flask_food_raid"] = false, -- Announce to raid channel ["flask_food_auto"] = false, -- Auto check when ReadyCheck ["drinking"] = false, -- Announce when arena enemy is drinking ["pull_countdown"] = true, -- Pull countdown announce (/pc #) ["bad_gear"] = false, -- Check your bad gear in instance (fishing pole, from the list) ["safari_hat"] = true, -- Check Safari Hat when starting Pet Battle } ---------------------------------------------------------------------------------------- -- Automation options ---------------------------------------------------------------------------------------- C["automation"] = { ["release"] = true, -- Auto release the spirit in battlegrounds ["screenshot"] = false, -- Take screenshot when player get achievement ["solve_artifact"] = true, -- Auto popup for solve artifact ["accept_invite"] = false, -- Auto accept invite ["decline_duel"] = true, -- Auto decline duel (/disduel to temporarily disable) ["accept_quest"] = false, -- Auto accept quests (disabled if hold Shift) ["auto_collapse"] = "NONE", -- Auto collapse Objective Tracker (RAID, RELOAD, SCENARIO, NONE) ["skip_cinematic"] = false, -- Auto skip cinematics/movies (disabled if hold Ctrl) ["auto_role"] = false, -- Auto set your role ["cancel_bad_buffs"] = false, -- Auto cancel annoying holiday buffs (from the list) ["tab_binder"] = false, -- Auto change Tab key to only target enemy players in PvP ["logging_combat"] = false, -- Auto enables combat log text file in raid instances ["buff_on_scroll"] = false, -- Cast buff on mouse scroll (from the list) ["open_items"] = false, -- Auto opening of items in bag ["resurrection"] = false, -- Auto confirm resurrection ["summon"] = false, -- Auto confirm summon after 10 sec ["whisper_invite"] = false, -- Auto invite when whisper keyword ["invite_keyword"] = "inv +", -- List of keyword (separated by space) } ---------------------------------------------------------------------------------------- -- Buffs reminder options ---------------------------------------------------------------------------------------- C["reminder"] = { -- Self buffs ["solo_buffs_enable"] = true, -- Enable buff reminder ["solo_buffs_sound"] = false, -- Enable warning sound notification for buff reminder ["solo_buffs_size"] = 45, -- Icon size -- Raid buffs ["raid_buffs_enable"] = true, -- Show missing raid buffs ["raid_buffs_always"] = false, -- Show frame always (default show only in raid) ["raid_buffs_size"] = 19.2, -- Icon size ["raid_buffs_alpha"] = 0, -- Transparent icons when the buff is present } ---------------------------------------------------------------------------------------- -- Raid cooldowns options ---------------------------------------------------------------------------------------- C["raidcooldown"] = { ["enable"] = true, -- Enable raid cooldowns ["height"] = 15, -- Bars height ["width"] = 186, -- Bars width (if show_icon = false, bar width+28) ["upwards"] = false, -- Sort upwards bars ["expiration"] = false, -- Sort by expiration time ["show_self"] = true, -- Show self cooldowns ["show_icon"] = true, -- Show icons ["show_inraid"] = true, -- Show in raid zone ["show_inparty"] = true, -- Show in party zone ["show_inarena"] = true, -- Show in arena zone } ---------------------------------------------------------------------------------------- -- Enemy cooldowns options ---------------------------------------------------------------------------------------- C["enemycooldown"] = { ["enable"] = true, -- Enable enemy cooldowns ["size"] = 30, -- Icon size ["direction"] = "RIGHT", -- Icon direction ["show_always"] = false, -- Show everywhere ["show_inpvp"] = false, -- Show in bg zone ["show_inarena"] = true, -- Show in arena zone ["show_inparty"] = false, -- Show in party zone for allies ["class_color"] = false, -- Enable classcolor border } ---------------------------------------------------------------------------------------- -- Pulse cooldowns options ---------------------------------------------------------------------------------------- C["pulsecooldown"] = { ["enable"] = false, -- Show cooldowns pulse ["size"] = 75, -- Icon size ["sound"] = false, -- Warning sound notification ["anim_scale"] = 1.5, -- Animation scaling ["hold_time"] = 0, -- Max opacity hold time ["threshold"] = 3, -- Minimal threshold time } ---------------------------------------------------------------------------------------- -- Threat options ---------------------------------------------------------------------------------------- C["threat"] = { ["enable"] = true, -- Enable threat meter ["height"] = 12, -- Bars height ["width"] = 217, -- Bars width ["bar_rows"] = 7, -- Number of bars ["hide_solo"] = false, -- Show only in party/raid } ---------------------------------------------------------------------------------------- -- Top panel options ---------------------------------------------------------------------------------------- C["toppanel"] = { ["enable"] = true, -- Enable top panel ["mouseover"] = true, -- Top panel on mouseover ["height"] = 55, -- Panel height ["width"] = 250, -- Panel width } ---------------------------------------------------------------------------------------- -- Stats options ---------------------------------------------------------------------------------------- C["stats"] = { ["clock"] = true, -- Clock ["latency"] = true, -- Latency ["fps"] = true, -- FPS ["friend"] = true, -- Friends ["guild"] = true, -- Guild ["durability"] = true, -- Durability ["experience"] = true, -- Experience ["talents"] = true, -- Specialization ["location"] = true, -- Location ["coords"] = true, -- Coords ["battleground"] = false, -- BG Score ["damage"] = false, -- Show damage per second ["bottom_line"] = true, -- Bottom classcolor line -- Currency (displayed in gold stats) ["currency_archaeology"] = false, -- Archaeology Fragments ["currency_cooking"] = true, -- Cooking Awards ["currency_raid"] = true, -- Raid Seals ["currency_misc"] = true, -- Expansion Currency } ---------------------------------------------------------------------------------------- -- Trade options ---------------------------------------------------------------------------------------- C["trade"] = { ["profession_tabs"] = true, -- Professions tabs on TradeSkill frames ["already_known"] = true, -- Colorizes recipes/mounts/pets/toys that is already known ["disenchanting"] = false, -- Milling, Prospecting and Disenchanting by Alt + click ["enchantment_scroll"] = false, -- Enchantment scroll on TradeSkill frame ["sum_buyouts"] = false, -- Sum up all current auctions ["archaeology"] = false, -- Archaeology tracker ('/arch' or right mouseover minimap button to show) ["merchant_itemlevel"] = false, -- Show item level for weapons and armor in merchant } ---------------------------------------------------------------------------------------- -- Miscellaneous options ---------------------------------------------------------------------------------------- C["misc"] = { ["raid_tools"] = true, -- Raid tools ["shift_marking"] = true, -- Marks mouseover target when you push Shift (only in group) ["afk_spin_camera"] = false, -- Spin camera while afk ["quest_auto_button"] = false, -- Quest/item auto button (from the list) ["item_level"] = true, -- Item level on character slot buttons ["click_cast"] = false, -- Simple click2cast spell binder ["click_cast_filter"] = false, -- Ignore Player and Target frames for click2cast ["chars_currency"] = false, -- Tracks your currency tokens across multiple characters ["hide_raid_button"] = false, -- Button to hide raid frames in DPS layout (top left mouseover) } ================================================ FILE: ShestakUI/Core/API.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) local backdropr, backdropg, backdropb, backdropa = unpack(C.media.backdrop_color) local borderr, borderg, borderb, bordera = unpack(C.media.border_color) local Mult = T.mult if T.screenHeight > 1200 then Mult = T.Scale(1) end ---------------------------------------------------------------------------------------- -- Position functions ---------------------------------------------------------------------------------------- local function SetOutside(obj, anchor, xOffset, yOffset) xOffset = xOffset or 2 yOffset = yOffset or 2 anchor = anchor or obj:GetParent() if obj:GetPoint() then obj:ClearAllPoints() end obj:SetPoint("TOPLEFT", anchor, "TOPLEFT", -xOffset, yOffset) obj:SetPoint("BOTTOMRIGHT", anchor, "BOTTOMRIGHT", xOffset, -yOffset) end local function SetInside(obj, anchor, xOffset, yOffset) xOffset = xOffset or 2 yOffset = yOffset or 2 anchor = anchor or obj:GetParent() if obj:GetPoint() then obj:ClearAllPoints() end obj:SetPoint("TOPLEFT", anchor, "TOPLEFT", xOffset, -yOffset) obj:SetPoint("BOTTOMRIGHT", anchor, "BOTTOMRIGHT", -xOffset, yOffset) end ---------------------------------------------------------------------------------------- -- Template functions ---------------------------------------------------------------------------------------- local function CreateOverlay(f) if f.overlay then return end local overlay = f:CreateTexture("$parentOverlay", "BORDER") overlay:SetInside() overlay:SetTexture(C.media.blank) overlay:SetVertexColor(0.1, 0.1, 0.1, 1) f.overlay = overlay end local function CreateBorder(f, i, o) if i then if f.iborder then return end local border = CreateFrame("Frame", "$parentInnerBorder", f, "BackdropTemplate") border:SetPoint("TOPLEFT", Mult, -Mult) border:SetPoint("BOTTOMRIGHT", -Mult, Mult) border:SetBackdrop({ edgeFile = C.media.blank, edgeSize = Mult, insets = {left = Mult, right = Mult, top = Mult, bottom = Mult} }) border:SetBackdropBorderColor(unpack(C.media.backdrop_color)) f.iborder = border end if o then if f.oborder then return end local border = CreateFrame("Frame", "$parentOuterBorder", f, "BackdropTemplate") border:SetPoint("TOPLEFT", -Mult, Mult) border:SetPoint("BOTTOMRIGHT", Mult, -Mult) border:SetFrameLevel(f:GetFrameLevel() + 1) border:SetBackdrop({ edgeFile = C.media.blank, edgeSize = Mult, insets = {left = Mult, right = Mult, top = Mult, bottom = Mult} }) border:SetBackdropBorderColor(unpack(C.media.backdrop_color)) f.oborder = border end end local function GetTemplate(t) if t == "ClassColor" then borderr, borderg, borderb, bordera = unpack(C.media.classborder_color) backdropr, backdropg, backdropb, backdropa = unpack(C.media.backdrop_color) else borderr, borderg, borderb, bordera = unpack(C.media.border_color) backdropr, backdropg, backdropb, backdropa = unpack(C.media.backdrop_color) end end local function SetTemplate(f, t) Mixin(f, BackdropTemplateMixin) -- 9.0 to set backdrop GetTemplate(t) f:SetBackdrop({ bgFile = C.media.blank, edgeFile = C.media.blank, edgeSize = Mult, insets = {left = -Mult, right = -Mult, top = -Mult, bottom = -Mult} }) if t == "Transparent" then backdropa = C.media.backdrop_alpha f:CreateBorder(true, true) elseif t == "Overlay" then backdropa = 1 f:CreateOverlay() else backdropa = C.media.backdrop_color[4] end f:SetBackdropColor(backdropr, backdropg, backdropb, backdropa) f:SetBackdropBorderColor(borderr, borderg, borderb, bordera) end local function CreatePanel(f, t, w, h, a1, p, a2, x, y) Mixin(f, BackdropTemplateMixin) -- 9.0 to set backdrop GetTemplate(t) f:SetWidth(w) f:SetHeight(h) f:SetFrameLevel(3) f:SetFrameStrata("BACKGROUND") f:SetPoint(a1, p, a2, x, y) f:SetBackdrop({ bgFile = C.media.blank, edgeFile = C.media.blank, edgeSize = Mult, insets = {left = -Mult, right = -Mult, top = -Mult, bottom = -Mult} }) if t == "Transparent" then backdropa = C.media.backdrop_alpha f:CreateBorder(true, true) elseif t == "Overlay" then backdropa = 1 f:CreateOverlay() elseif t == "Invisible" then backdropa = 0 bordera = 0 else backdropa = C.media.backdrop_color[4] end f:SetBackdropColor(backdropr, backdropg, backdropb, backdropa) f:SetBackdropBorderColor(borderr, borderg, borderb, bordera) end local function CreateBackdrop(f, t) local f = (f.IsObjectType and f:IsObjectType("Texture") and f:GetParent()) or f if f.backdrop then return end if not t then t = "Default" end local b = CreateFrame("Frame", "$parentBackdrop", f) b:SetOutside() b:SetTemplate(t) if f:GetFrameLevel() - 1 >= 0 then b:SetFrameLevel(f:GetFrameLevel() - 1) else b:SetFrameLevel(0) end f.backdrop = b end local StripTexturesBlizzFrames = { "Inset", "inset", "InsetFrame", "LeftInset", "RightInset", "NineSlice", "BG", "border", "Border", "BorderFrame", "bottomInset", "BottomInset", "bgLeft", "bgRight", "FilligreeOverlay", "PortraitOverlay", "ArtOverlayFrame", "Portrait", "portrait", "ScrollFrameBorder", } local function StripTextures(object, kill) if object.GetNumRegions then for _, region in next, {object:GetRegions()} do if region and region.IsObjectType and region:IsObjectType("Texture") then if kill then region:Kill() else region:SetTexture("") region:SetAtlas("") end end end end local frameName = object.GetName and object:GetName() for _, blizzard in pairs(StripTexturesBlizzFrames) do local blizzFrame = object[blizzard] or frameName and _G[frameName..blizzard] if blizzFrame then blizzFrame:StripTextures(kill) end end end ---------------------------------------------------------------------------------------- -- Kill object function ---------------------------------------------------------------------------------------- local HiddenFrame = CreateFrame("Frame") HiddenFrame:Hide() local function Kill(object) if object.UnregisterAllEvents then object:UnregisterAllEvents() object:SetParent(HiddenFrame) else object.Show = T.dummy end object:Hide() end ---------------------------------------------------------------------------------------- -- Style ActionBars/Bags buttons function(by Chiril & Karudon) ---------------------------------------------------------------------------------------- local function StyleButton(button, t, size, setBackdrop) if not size then size = 2 end if button.SetHighlightTexture and not button.hover then local hover = button:CreateTexture() hover:SetColorTexture(1, 1, 1, 0.3) if setBackdrop then hover:SetInside(button.backdrop) else hover:SetPoint("TOPLEFT", button, size, -size) hover:SetPoint("BOTTOMRIGHT", button, -size, size) end button.hover = hover button:SetHighlightTexture(hover) end if not t and button.SetPushedTexture and not button.pushed then local pushed = button:CreateTexture() pushed:SetColorTexture(0.9, 0.8, 0.1, 0.3) if setBackdrop then pushed:SetInside(button.backdrop) else pushed:SetPoint("TOPLEFT", button, size, -size) pushed:SetPoint("BOTTOMRIGHT", button, -size, size) end button.pushed = pushed button:SetPushedTexture(pushed) end if button.SetCheckedTexture and not button.checked then local checked = button:CreateTexture() checked:SetColorTexture(0, 1, 0, 0.3) if setBackdrop then checked:SetInside(button.backdrop) else checked:SetPoint("TOPLEFT", button, size, -size) checked:SetPoint("BOTTOMRIGHT", button, -size, size) end button.checked = checked button:SetCheckedTexture(checked) end local cooldown = button:GetName() and _G[button:GetName().."Cooldown"] if cooldown then cooldown:ClearAllPoints() cooldown:SetPoint("TOPLEFT", button, size, -size) cooldown:SetPoint("BOTTOMRIGHT", button, -size, size) end end ---------------------------------------------------------------------------------------- -- Style buttons function ---------------------------------------------------------------------------------------- T.SetModifiedBackdrop = function(self) if self:IsEnabled() then self:SetBackdropBorderColor(unpack(C.media.classborder_color)) if self.overlay then self.overlay:SetVertexColor(C.media.classborder_color[1] * 0.3, C.media.classborder_color[2] * 0.3, C.media.classborder_color[3] * 0.3, 1) end end end T.SetOriginalBackdrop = function(self) self:SetBackdropBorderColor(unpack(C.media.border_color)) if self.overlay then self.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) end end local function SkinButton(f, strip) if strip then f:StripTextures() end if f.SetNormalTexture then f:SetNormalTexture(0) end if f.SetHighlightTexture then f:SetHighlightTexture(0) end if f.SetPushedTexture then f:SetPushedTexture(0) end if f.SetDisabledTexture then f:SetDisabledTexture(0) end if f.Left then f.Left:SetAlpha(0) end if f.Right then f.Right:SetAlpha(0) end if f.Middle then f.Middle:SetAlpha(0) end if f.LeftSeparator then f.LeftSeparator:SetAlpha(0) end if f.RightSeparator then f.RightSeparator:SetAlpha(0) end if f.Flash then f.Flash:SetAlpha(0) end if f.TopLeft then f.TopLeft:Hide() end if f.TopRight then f.TopRight:Hide() end if f.BottomLeft then f.BottomLeft:Hide() end if f.BottomRight then f.BottomRight:Hide() end if f.TopMiddle then f.TopMiddle:Hide() end if f.MiddleLeft then f.MiddleLeft:Hide() end if f.MiddleRight then f.MiddleRight:Hide() end if f.BottomMiddle then f.BottomMiddle:Hide() end if f.MiddleMiddle then f.MiddleMiddle:Hide() end f:SetTemplate("Overlay") f:HookScript("OnEnter", T.SetModifiedBackdrop) f:HookScript("OnLeave", T.SetOriginalBackdrop) end ---------------------------------------------------------------------------------------- -- Style icon function ---------------------------------------------------------------------------------------- local function SkinIcon(icon, t, parent) parent = parent or icon:GetParent() if t then icon.b = CreateFrame("Frame", nil, parent) icon.b:SetTemplate("Default") icon.b:SetOutside(icon) else parent:CreateBackdrop("Default") parent.backdrop:SetOutside(icon) end icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:SetParent(t and icon.b or parent) end local function CropIcon(icon) icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:SetInside() end ---------------------------------------------------------------------------------------- -- Font function ---------------------------------------------------------------------------------------- local function FontString(parent, name, fontName, fontHeight, fontStyle) local fs = parent:CreateFontString(nil, "OVERLAY") fs:SetFont(fontName, fontHeight, fontStyle) fs:SetJustifyH("LEFT") if not name then parent.text = fs else parent[name] = fs end return fs end ---------------------------------------------------------------------------------------- -- Fade in/out functions ---------------------------------------------------------------------------------------- local function FadeIn(f) UIFrameFadeIn(f, 0.4, f:GetAlpha(), 1) end local function FadeOut(f) UIFrameFadeOut(f, 0.8, f:GetAlpha(), 0) end local function addAPI(object) local mt = getmetatable(object).__index if not object.SetOutside then mt.SetOutside = SetOutside end if not object.SetInside then mt.SetInside = SetInside end if not object.CreateOverlay then mt.CreateOverlay = CreateOverlay end if not object.CreateBorder then mt.CreateBorder = CreateBorder end if not object.SetTemplate then mt.SetTemplate = SetTemplate end if not object.CreatePanel then mt.CreatePanel = CreatePanel end if not object.CreateBackdrop then mt.CreateBackdrop = CreateBackdrop end if not object.StripTextures then mt.StripTextures = StripTextures end if not object.Kill then mt.Kill = Kill end if not object.StyleButton then mt.StyleButton = StyleButton end if not object.SkinButton then mt.SkinButton = SkinButton end if not object.SkinIcon then mt.SkinIcon = SkinIcon end if not object.CropIcon then mt.CropIcon = CropIcon end if not object.FontString then mt.FontString = FontString end if not object.FadeIn then mt.FadeIn = FadeIn end if not object.FadeOut then mt.FadeOut = FadeOut end end local handled = {["Frame"] = true} local object = CreateFrame("Frame") addAPI(object) addAPI(object:CreateTexture()) addAPI(object:CreateFontString()) object = EnumerateFrames() while object do if not object:IsForbidden() and not handled[object:GetObjectType()] then addAPI(object) handled[object:GetObjectType()] = true end object = EnumerateFrames(object) end -- Hacky fix for issue on 7.1 PTR where scroll frames no longer seem to inherit the methods from the "Frame" widget local scrollFrame = CreateFrame("ScrollFrame") addAPI(scrollFrame) ---------------------------------------------------------------------------------------- -- Style functions ---------------------------------------------------------------------------------------- T.SkinFuncs = {} T.SkinFuncs["ShestakUI"] = {} function T.SkinScrollBar(frame, minimal) frame:StripTextures() local frameName = frame.GetName and frame:GetName() local UpButton = frame.ScrollUpButton or frame.ScrollUp or frame.UpButton or frame.Back or _G[frameName and frameName.."ScrollUpButton"] or frame:GetParent().scrollUp local DownButton = frame.ScrollDownButton or frame.ScrollDown or frame.DownButton or frame.Forward or _G[frameName and frameName.."ScrollDownButton"] or frame:GetParent().scrollDown local ThumbTexture = frame.ThumbTexture or frame.thumbTexture or _G[frameName and frameName.."ThumbTexture"] local newThumb = frame.Back and frame:GetThumb() if UpButton and DownButton then if not UpButton.icon then T.SkinNextPrevButton(UpButton, nil, "Up") UpButton:SetSize(UpButton:GetWidth() + 7, UpButton:GetHeight() + 7) end if not DownButton.icon then T.SkinNextPrevButton(DownButton, nil, "Down") DownButton:SetSize(DownButton:GetWidth() + 7, DownButton:GetHeight() + 7) end if ThumbTexture then ThumbTexture:SetTexture(nil) if not frame.thumbbg then frame.thumbbg = CreateFrame("Frame", nil, frame) frame.thumbbg:SetPoint("TOPLEFT", ThumbTexture, "TOPLEFT", 0, -3) frame.thumbbg:SetPoint("BOTTOMRIGHT", ThumbTexture, "BOTTOMRIGHT", 0, 3) frame.thumbbg:SetTemplate("Overlay") frame:HookScript("OnShow", function() local _, maxValue = frame:GetMinMaxValues() if maxValue == 0 then frame:SetAlpha(0) else frame:SetAlpha(1) end end) frame:HookScript("OnMinMaxChanged", function() local _, maxValue = frame:GetMinMaxValues() if maxValue == 0 then frame:SetAlpha(0) else frame:SetAlpha(1) end end) frame:HookScript("OnDisable", function() frame:SetAlpha(0) end) frame:HookScript("OnEnable", function() frame:SetAlpha(1) end) end elseif newThumb then if frame.Background then frame.Background:Hide() end if frame.Track then frame.Track:DisableDrawLayer("ARTWORK") end newThumb:DisableDrawLayer("BACKGROUND") if not frame.thumbbg then frame.thumbbg = CreateFrame("Frame", nil, frame) frame.thumbbg:SetPoint("TOPLEFT", newThumb, "TOPLEFT", 0, -3) frame.thumbbg:SetPoint("BOTTOMRIGHT", newThumb, "BOTTOMRIGHT", 0, 3) frame.thumbbg:SetTemplate("Overlay") hooksecurefunc(newThumb, "Hide", function(self) frame:SetAlpha(0) end) hooksecurefunc(newThumb, "Show", function(self) frame:SetAlpha(1) end) end if minimal then UpButton:SetSize(17, 15) DownButton:SetSize(17, 15) newThumb:SetWidth(17) end end end end local tabs = { "LeftDisabled", "MiddleDisabled", "RightDisabled", "Left", "Middle", "Right", } function T.SkinTab(tab, bg) if not tab then return end for _, object in pairs(tabs) do local tex = tab:GetName() and _G[tab:GetName()..object] if tex then tex:SetTexture(nil) end end if tab.GetHighlightTexture and tab:GetHighlightTexture() then tab:GetHighlightTexture():SetTexture(nil) else tab:StripTextures() end tab.backdrop = CreateFrame("Frame", nil, tab) tab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1) if bg then tab.backdrop:SetTemplate("Overlay") tab.backdrop:SetPoint("TOPLEFT", 2, -9) tab.backdrop:SetPoint("BOTTOMRIGHT", -2, -2) else tab.backdrop:SetTemplate("Transparent") tab.backdrop:SetPoint("TOPLEFT", 0, -3) tab.backdrop:SetPoint("BOTTOMRIGHT", 0, 3) end end function T.SkinNextPrevButton(btn, left, scroll) local normal, pushed, disabled local frameName = btn.GetName and btn:GetName() local isPrevButton = frameName and (string.find(frameName, "Left") or string.find(frameName, "Prev") or string.find(frameName, "Decrement") or string.find(frameName, "Back")) or left local isScrollUpButton = frameName and string.find(frameName, "ScrollUp") or scroll == "Up" local isScrollDownButton = frameName and string.find(frameName, "ScrollDown") or scroll == "Down" if btn:GetNormalTexture() then normal = btn:GetNormalTexture():GetTexture() end if btn:GetPushedTexture() then pushed = btn:GetPushedTexture():GetTexture() end if btn:GetDisabledTexture() then disabled = btn:GetDisabledTexture():GetTexture() end btn:StripTextures() if btn.Texture then btn.Texture:SetAlpha(0) if btn.Overlay then btn.Overlay:SetAlpha(0) end end if scroll == "Up" or scroll == "Down" or scroll == "Any" then normal = nil pushed = nil disabled = nil end if not normal then if isPrevButton then normal = "Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up" elseif isScrollUpButton then normal = "Interface\\ChatFrame\\UI-ChatIcon-ScrollUp-Up" elseif isScrollDownButton then normal = "Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Up" else normal = "Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up" end end if not pushed then if isPrevButton then pushed = "Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Down" elseif isScrollUpButton then pushed = "Interface\\ChatFrame\\UI-ChatIcon-ScrollUp-Down" elseif isScrollDownButton then pushed = "Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Down" else pushed = "Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down" end end if not disabled then if isPrevButton then disabled = "Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Disabled" elseif isScrollUpButton then disabled = "Interface\\ChatFrame\\UI-ChatIcon-ScrollUp-Disabled" elseif isScrollDownButton then disabled = "Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Disabled" else disabled = "Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled" end end btn:SetNormalTexture(normal) btn:SetPushedTexture(pushed) btn:SetDisabledTexture(disabled) btn:SetTemplate("Overlay") btn:SetSize(btn:GetWidth() - 7, btn:GetHeight() - 7) if normal and pushed and disabled then btn:GetNormalTexture():SetTexCoord(0.3, 0.29, 0.3, 0.81, 0.65, 0.29, 0.65, 0.81) if btn:GetPushedTexture() then btn:GetPushedTexture():SetTexCoord(0.3, 0.35, 0.3, 0.81, 0.65, 0.35, 0.65, 0.81) end if btn:GetDisabledTexture() then btn:GetDisabledTexture():SetTexCoord(0.3, 0.29, 0.3, 0.75, 0.65, 0.29, 0.65, 0.75) end btn:GetNormalTexture():ClearAllPoints() btn:GetNormalTexture():SetPoint("TOPLEFT", 2, -2) btn:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2) if btn:GetDisabledTexture() then btn:GetDisabledTexture():SetAllPoints(btn:GetNormalTexture()) end if btn:GetPushedTexture() then btn:GetPushedTexture():SetAllPoints(btn:GetNormalTexture()) end if btn:GetHighlightTexture() then btn:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3) btn:GetHighlightTexture():SetAllPoints(btn:GetNormalTexture()) end end end function T.SkinRotateButton(btn) btn:SetTemplate("Default") btn:SetSize(btn:GetWidth() - 14, btn:GetHeight() - 14) btn:GetNormalTexture():SetTexCoord(0.3, 0.29, 0.3, 0.65, 0.69, 0.29, 0.69, 0.65) btn:GetPushedTexture():SetTexCoord(0.3, 0.29, 0.3, 0.65, 0.69, 0.29, 0.69, 0.65) btn:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3) btn:GetNormalTexture():ClearAllPoints() btn:GetNormalTexture():SetPoint("TOPLEFT", 2, -2) btn:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2) btn:GetPushedTexture():SetAllPoints(btn:GetNormalTexture()) btn:GetHighlightTexture():SetAllPoints(btn:GetNormalTexture()) end function T.SkinEditBox(frame, width, height) frame:DisableDrawLayer("BACKGROUND") frame:CreateBackdrop("Overlay") local frameName = frame.GetName and frame:GetName() if frameName and (frameName:find("Gold") or frameName:find("Silver") or frameName:find("Copper")) then if frameName:find("Gold") then frame.backdrop:SetPoint("TOPLEFT", -3, 1) frame.backdrop:SetPoint("BOTTOMRIGHT", -3, 0) else frame.backdrop:SetPoint("TOPLEFT", -3, 1) frame.backdrop:SetPoint("BOTTOMRIGHT", -13, 0) end end if width then frame:SetWidth(width) end if height then frame:SetHeight(height) end end function T.SkinDropDownBox(frame, width, pos) local frameName = frame.GetName and frame:GetName() local button = frame.Button or frameName and (_G[frameName.."Button"] or _G[frameName.."_Button"]) local text = frameName and _G[frameName.."Text"] or frame.Text if not width then width = 155 end frame:StripTextures() frame:SetWidth(width) if text then text:ClearAllPoints() text:SetPoint("RIGHT", button, "LEFT", -2, 0) end button:ClearAllPoints() if pos then button:SetPoint("TOPRIGHT", frame.Right, -20, -21) else button:SetPoint("RIGHT", frame, "RIGHT", -10, 3) end button.SetPoint = T.dummy T.SkinNextPrevButton(button, nil, "Down") frame:CreateBackdrop("Overlay") frame:SetFrameLevel(frame:GetFrameLevel() + 2) frame.backdrop:SetPoint("TOPLEFT", 20, -2) frame.backdrop:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", 2, -2) end function T.SkinCheckBox(frame, size) if size then frame:SetSize(size, size) end frame:SetNormalTexture(0) frame:SetPushedTexture(0) frame:CreateBackdrop("Overlay") frame:SetFrameLevel(frame:GetFrameLevel() + 2) frame.backdrop:SetPoint("TOPLEFT", 4, -4) frame.backdrop:SetPoint("BOTTOMRIGHT", -4, 4) if frame.SetHighlightTexture then local highligh = frame:CreateTexture() highligh:SetColorTexture(1, 1, 1, 0.3) highligh:SetPoint("TOPLEFT", frame, 6, -6) highligh:SetPoint("BOTTOMRIGHT", frame, -6, 6) frame:SetHighlightTexture(highligh) end if frame.SetCheckedTexture then local checked = frame:CreateTexture() checked:SetColorTexture(1, 0.82, 0, 0.8) checked:SetPoint("TOPLEFT", frame, 6, -6) checked:SetPoint("BOTTOMRIGHT", frame, -6, 6) frame:SetCheckedTexture(checked) end if frame.SetDisabledCheckedTexture then local disabled = frame:CreateTexture() disabled:SetColorTexture(0.6, 0.6, 0.6, 0.75) disabled:SetPoint("TOPLEFT", frame, 6, -6) disabled:SetPoint("BOTTOMRIGHT", frame, -6, 6) frame:SetDisabledCheckedTexture(disabled) end end function T.SkinCheckBoxAtlas(checkbox, size) if size then checkbox:SetSize(size, size) end checkbox:CreateBackdrop("Overlay") checkbox.backdrop:SetInside(nil, 4, 4) for _, region in next, { checkbox:GetRegions() } do if region:IsObjectType("Texture") then if region:GetAtlas() == "checkmark-minimal" or region:GetTexture() == 130751 then region:SetTexture(C.media.texture) local checkedTexture = checkbox:GetCheckedTexture() checkedTexture:SetColorTexture(1, 0.82, 0, 0.8) checkedTexture:SetInside(checkbox.backdrop) else region:SetTexture("") end end end end function T.SkinCloseButton(f, point, text, pixel) f:StripTextures() f:SetTemplate("Overlay") f:SetSize(18, 18) if not text then text = "x" end if text == "-" and not pixel then f.text = f:CreateTexture(nil, "OVERLAY") f.text:SetSize(7, 1) f.text:SetPoint("CENTER") f.text:SetTexture(C.media.blank) end if text == "-" and pixel then f.text = f:CreateTexture(nil, "OVERLAY") f.text:SetSize(5, 1) f.text:SetPoint("CENTER") f.text:SetTexture(C.media.blank) end if not f.text then if pixel then f.text = f:FontString(nil, [[Interface\AddOns\ShestakUI\Media\Fonts\Pixel.ttf]], 8) f.text:SetPoint("CENTER", 0, 0) else f.text = f:FontString(nil, C.media.normal_font, 17) f.text:SetPoint("CENTER", 0, 1) end f.text:SetText(text) end if point then f:SetPoint("TOPRIGHT", point, "TOPRIGHT", -4, -4) else f:SetPoint("TOPRIGHT", -4, -4) end f:HookScript("OnEnter", T.SetModifiedBackdrop) f:HookScript("OnLeave", T.SetOriginalBackdrop) end function T.SkinSlider(f) f:StripTextures() local bd = CreateFrame("Frame", nil, f) bd:SetTemplate("Overlay") if f:GetOrientation() == "VERTICAL" then bd:SetPoint("TOPLEFT", -2, -6) bd:SetPoint("BOTTOMRIGHT", 2, 6) f:GetThumbTexture():SetRotation(rad(90)) else bd:SetPoint("TOPLEFT", 14, -2) bd:SetPoint("BOTTOMRIGHT", -15, 3) end bd:SetFrameLevel(f:GetFrameLevel() - 1) f:SetThumbTexture("Interface\\CastingBar\\UI-CastingBar-Spark") f:GetThumbTexture():SetBlendMode("ADD") end function T.SkinSliderStep(frame, minimal) frame:StripTextures() local slider = frame.Slider if not slider then return end slider:DisableDrawLayer("ARTWORK") local thumb = slider.Thumb if thumb then thumb:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]]) thumb:SetBlendMode("ADD") thumb:SetSize(20, 30) end local offset = minimal and 10 or 13 slider:CreateBackdrop("Overlay") slider.backdrop:SetPoint("TOPLEFT", 10, -offset) slider.backdrop:SetPoint("BOTTOMRIGHT", -10, offset) if not slider.barStep then local step = CreateFrame("StatusBar", nil, slider.backdrop) step:SetStatusBarTexture(C.media.texture) step:SetStatusBarColor(1, 0.82, 0, 1) step:SetPoint("TOPLEFT", slider.backdrop, T.mult * 2, -T.mult * 2) step:SetPoint("BOTTOMLEFT", slider.backdrop, T.mult * 2, T.mult * 2) step:SetPoint("RIGHT", thumb, "CENTER") slider.barStep = step end end function T.SkinIconSelectionFrame(frame, numIcons, buttonNameTemplate, frameNameOverride) local frameName = frameNameOverride or frame:GetName() -- local scrollFrame = frame.ScrollFrame or _G[frameName.."ScrollFrame"] local editBox = frame.BorderBox.IconSelectorEditBox local okayButton = frame.OkayButton or frame.BorderBox.OkayButton or _G[frameName.."Okay"] local cancelButton = frame.CancelButton or frame.BorderBox.CancelButton or _G[frameName.."Cancel"] frame:StripTextures() frame.BorderBox:StripTextures() frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", 3, 1) frame:SetHeight(frame:GetHeight() + 13) T.SkinScrollBar(frame.IconSelector.ScrollBar) okayButton:SkinButton() cancelButton:SkinButton() cancelButton:ClearAllPoints() cancelButton:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -5, 5) editBox:DisableDrawLayer("BACKGROUND") T.SkinEditBox(editBox) local button = frame.BorderBox.SelectedIconArea and frame.BorderBox.SelectedIconArea.SelectedIconButton if button then button:DisableDrawLayer("BACKGROUND") local texture = button.Icon:GetTexture() button:StripTextures() button:StyleButton(true) button:SetTemplate("Default") button.Icon:ClearAllPoints() button.Icon:SetPoint("TOPLEFT", 2, -2) button.Icon:SetPoint("BOTTOMRIGHT", -2, 2) button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) if texture then button.Icon:SetTexture(texture) end end for _, button in next, {frame.IconSelector.ScrollBox.ScrollTarget:GetChildren()} do local texture = button.Icon:GetTexture() button:StripTextures() button:StyleButton(true) button:SetTemplate("Default") button.Icon:ClearAllPoints() button.Icon:SetPoint("TOPLEFT", 2, -2) button.Icon:SetPoint("BOTTOMRIGHT", -2, 2) button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) if texture then button.Icon:SetTexture(texture) end end end function T.SkinMaxMinFrame(frame, point) frame:SetSize(18, 18) if point then frame:SetPoint("RIGHT", point, "LEFT", -2, 0) end for name, direction in pairs({ ["MaximizeButton"] = "up", ["MinimizeButton"] = "down"}) do local button = frame[name] if button then button:StripTextures() button:SetTemplate("Overlay") button:SetPoint("CENTER") button:SetHitRectInsets(1, 1, 1, 1) button.minus = button:CreateTexture(nil, "OVERLAY") button.minus:SetSize(7, 1) button.minus:SetPoint("CENTER") button.minus:SetTexture(C.media.blank) if direction == "up" then button.plus = button:CreateTexture(nil, "OVERLAY") button.plus:SetSize(1, 7) button.plus:SetPoint("CENTER") button.plus:SetTexture(C.media.blank) end button:HookScript("OnEnter", T.SetModifiedBackdrop) button:HookScript("OnLeave", T.SetOriginalBackdrop) end end end function T.SkinExpandOrCollapse(f) f:SetHighlightTexture(0) f:SetPushedTexture(0) local bg = CreateFrame("Frame", nil, f) bg:SetSize(13, 13) bg:SetPoint("TOPLEFT", f:GetNormalTexture(), 0, -1) bg:SetTemplate("Overlay") f.bg = bg bg.minus = bg:CreateTexture(nil, "OVERLAY") bg.minus:SetSize(5, 1) bg.minus:SetPoint("CENTER") bg.minus:SetTexture(C.media.blank) bg.plus = bg:CreateTexture(nil, "OVERLAY") bg.plus:SetSize(1, 5) bg.plus:SetPoint("CENTER") bg.plus:SetTexture(C.media.blank) bg.plus:Hide() hooksecurefunc(f, "SetNormalTexture", function(self, texture) if self.settingTexture then return end self.settingTexture = true self:SetNormalTexture(0) if texture and texture ~= "" then if texture:find("Plus") then self.bg.plus:Show() elseif texture:find("Minus") then self.bg.plus:Hide() end self.bg:Show() else self.bg:Hide() end self.settingTexture = nil end) f:HookScript("OnEnter", function(self) self.bg:SetBackdropBorderColor(unpack(C.media.classborder_color)) if self.bg.overlay then self.bg.overlay:SetVertexColor(C.media.classborder_color[1] * 0.3, C.media.classborder_color[2] * 0.3, C.media.classborder_color[3] * 0.3, 1) end end) f:HookScript("OnLeave", function(self) self.bg:SetBackdropBorderColor(unpack(C.media.border_color)) if self.bg.overlay then self.bg.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) end end) end function T.SkinHelpBox(frame) frame:StripTextures() frame:SetTemplate("Transparent") if frame.CloseButton then T.SkinCloseButton(frame.CloseButton) end if frame.Arrow then frame.Arrow:Hide() end end function T.SkinFrame(frame, backdrop, x, y) local name = frame and frame.GetName and frame:GetName() local portraitFrame = name and _G[name.."Portrait"] or frame.Portrait or frame.portrait local portraitFrameOverlay = name and _G[name.."PortraitOverlay"] or frame.PortraitOverlay local artFrameOverlay = name and _G[name.."ArtOverlayFrame"] or frame.ArtOverlayFrame frame:StripTextures() if backdrop then frame:CreateBackdrop("Transparent") if x and y then frame.backdrop:SetPoint("TOPLEFT", x, -y) frame.backdrop:SetPoint("BOTTOMRIGHT", -x, y) end else frame:SetTemplate("Transparent") end if frame.CloseButton then T.SkinCloseButton(frame.CloseButton) end if portraitFrame then portraitFrame:SetAlpha(0) end if portraitFrameOverlay then portraitFrameOverlay:SetAlpha(0) end if artFrameOverlay then artFrameOverlay:SetAlpha(0) end end local iconColors = { ["auctionhouse-itemicon-border-gray"] = {r = borderr, g = borderg, b = borderb}, ["auctionhouse-itemicon-border-white"] = {r = borderr, g = borderg, b = borderb}, ["auctionhouse-itemicon-border-green"] = BAG_ITEM_QUALITY_COLORS[2], ["auctionhouse-itemicon-border-blue"] = BAG_ITEM_QUALITY_COLORS[3], ["auctionhouse-itemicon-border-purple"] = BAG_ITEM_QUALITY_COLORS[4], ["auctionhouse-itemicon-border-orange"] = BAG_ITEM_QUALITY_COLORS[5], ["auctionhouse-itemicon-border-artifact"] = BAG_ITEM_QUALITY_COLORS[6], ["auctionhouse-itemicon-border-account"] = BAG_ITEM_QUALITY_COLORS[7] } function T.SkinIconBorder(frame, parent) local border = parent or frame:GetParent().backdrop frame:SetAlpha(0) hooksecurefunc(frame, "SetVertexColor", function(self, r, g, b) if r ~= BAG_ITEM_QUALITY_COLORS[1].r ~= r and g ~= BAG_ITEM_QUALITY_COLORS[1].g then border:SetBackdropBorderColor(r, g, b) else border:SetBackdropBorderColor(unpack(C.media.border_color)) end end) hooksecurefunc(frame, "SetAtlas", function(self, atlas) local color = iconColors[atlas] if color then border:SetBackdropBorderColor(color.r, color.g, color.b) else -- border:SetBackdropBorderColor(unpack(C.media.border_color)) end end) hooksecurefunc(frame, "Hide", function(self) border:SetBackdropBorderColor(unpack(C.media.border_color)) end) hooksecurefunc(frame, "SetShown", function(self, show) if not show then border:SetBackdropBorderColor(unpack(C.media.border_color)) end end) end local LoadBlizzardSkin = CreateFrame("Frame") LoadBlizzardSkin:RegisterEvent("ADDON_LOADED") LoadBlizzardSkin:SetScript("OnEvent", function(self, _, addon) if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") or not C.skins.blizzard_frames then self:UnregisterEvent("ADDON_LOADED") return end for _addon, skinfunc in pairs(T.SkinFuncs) do if type(skinfunc) == "function" then if _addon == addon then if skinfunc then skinfunc() end end elseif type(skinfunc) == "table" then if _addon == addon then for _, skinfunc in pairs(T.SkinFuncs[_addon]) do if skinfunc then skinfunc() end end end end end end) ================================================ FILE: ShestakUI/Core/CheckVersion.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Check outdated UI version ---------------------------------------------------------------------------------------- local check = function(self, event, prefix, message, _, sender) if event == "CHAT_MSG_ADDON" then if prefix ~= "ShestakUIVersion" or sender == T.name then return end if tonumber(message) ~= nil and tonumber(message) > tonumber(T.version) then print("|cffff0000"..L_MISC_UI_OUTDATED.."|r") self:UnregisterEvent("CHAT_MSG_ADDON") end else if IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then C_ChatInfo.SendAddonMessage("ShestakUIVersion", tonumber(T.version), "INSTANCE_CHAT") elseif IsInRaid(LE_PARTY_CATEGORY_HOME) then C_ChatInfo.SendAddonMessage("ShestakUIVersion", tonumber(T.version), "RAID") elseif IsInGroup(LE_PARTY_CATEGORY_HOME) then C_ChatInfo.SendAddonMessage("ShestakUIVersion", tonumber(T.version), "PARTY") elseif IsInGuild() then C_ChatInfo.SendAddonMessage("ShestakUIVersion", tonumber(T.version), "GUILD") end end end local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:RegisterEvent("GROUP_ROSTER_UPDATE") frame:RegisterEvent("CHAT_MSG_ADDON") frame:SetScript("OnEvent", check) C_ChatInfo.RegisterAddonMessagePrefix("ShestakUIVersion") ---------------------------------------------------------------------------------------- -- Whisper UI version ---------------------------------------------------------------------------------------- local whisp = CreateFrame("Frame") whisp:RegisterEvent("CHAT_MSG_WHISPER") whisp:RegisterEvent("CHAT_MSG_BN_WHISPER") whisp:SetScript("OnEvent", function(_, event, text, name, ...) if text:lower():match("ui_version") or text:lower():match("уи_версия") then if event == "CHAT_MSG_WHISPER" then SendChatMessage("ShestakUI "..T.version, "WHISPER", nil, name) elseif event == "CHAT_MSG_BN_WHISPER" then BNSendWhisper(select(11, ...), "ShestakUI "..T.version) end end end) ================================================ FILE: ShestakUI/Core/Commands.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Slash commands ---------------------------------------------------------------------------------------- SlashCmdList.RELOADUI = function() ReloadUI() end SLASH_RELOADUI1 = "/rl" SLASH_RELOADUI2 = "/кд" SLASH_RELOADUI3 = "//" SLASH_RELOADUI4 = "/." SlashCmdList.RCSLASH = function() DoReadyCheck() end SLASH_RCSLASH1 = "/rc" SLASH_RCSLASH2 = "/кс" SlashCmdList.TICKET = function() ToggleHelpFrame() end SLASH_TICKET1 = "/gm" SLASH_TICKET2 = "/гм" SLASH_TICKET3 = "/пь" SlashCmdList.JOURNAL = function() ToggleEncounterJournal() end SLASH_JOURNAL1 = "/ej" SLASH_JOURNAL2 = "/уо" SlashCmdList.ROLECHECK = function() InitiateRolePoll() end SLASH_ROLECHECK1 = "/role" SLASH_ROLECHECK2 = "/кщду" SlashCmdList.CLEARCOMBAT = function() CombatLogClearEntries() end SLASH_CLEARCOMBAT1 = "/clc" SLASH_CLEARCOMBAT2 = "/сдс" ---------------------------------------------------------------------------------------- -- Description of the slash commands ---------------------------------------------------------------------------------------- SlashCmdList.UIHELP = function() for _, v in ipairs(L_SLASHCMD_HELP) do print("|cffffff00"..("%s"):format(tostring(v)).."|r") end end SLASH_UIHELP1 = "/uihelp" SLASH_UIHELP2 = "/helpui" SLASH_UIHELP3 = "/гшрудз" ---------------------------------------------------------------------------------------- -- Enable/Disable addons ---------------------------------------------------------------------------------------- SlashCmdList.DISABLE_ADDON = function(addon) local _, _, _, _, _, reason = GetAddOnInfo(addon) if reason ~= "MISSING" then DisableAddOn(addon) ReloadUI() else print("|cffffff00"..L_TOGGLE_ADDON.."'"..addon.."'"..L_TOGGLE_NOT_FOUND.."|r") end end SLASH_DISABLE_ADDON1 = "/dis" SLASH_DISABLE_ADDON2 = "/disable" SlashCmdList.ENABLE_ADDON = function(addon) local _, _, _, _, _, reason = GetAddOnInfo(addon) if reason ~= "MISSING" then EnableAddOn(addon) LoadAddOn(addon) ReloadUI() else print("|cffffff00"..L_TOGGLE_ADDON.."'"..addon.."'"..L_TOGGLE_NOT_FOUND.."|r") end end SLASH_ENABLE_ADDON1 = "/en" SLASH_ENABLE_ADDON2 = "/enable" SlashCmdList.ONLY_UI = function() for i = 1, GetNumAddOns() do local name = GetAddOnInfo(i) if name ~= "ShestakUI" and name ~= "ShestakUI_Config" and name ~= "!BaudErrorFrame" and GetAddOnEnableState(T.name, name) == 2 then DisableAddOn(name, T.name) end end ReloadUI() end SLASH_ONLY_UI1 = "/onlyui" ---------------------------------------------------------------------------------------- -- Disband party or raid(by Monolit) ---------------------------------------------------------------------------------------- local function DisbandRaidGroup() if InCombatLockdown() then return end if UnitInRaid("player") then SendChatMessage(L_INFO_DISBAND, "RAID") for i = 1, GetNumGroupMembers() do local name, _, _, _, _, _, _, online = GetRaidRosterInfo(i) if online and name ~= T.name then UninviteUnit(name) end end else SendChatMessage(L_INFO_DISBAND, "PARTY") for i = MAX_PARTY_MEMBERS, 1, -1 do if GetNumGroupMembers(i) then UninviteUnit(UnitName("party"..i)) end end end C_PartyInfo.LeaveParty() end StaticPopupDialogs.DISBAND_RAID = { text = L_POPUP_DISBAND_RAID, button1 = ACCEPT, button2 = CANCEL, OnAccept = DisbandRaidGroup, timeout = 0, whileDead = 1, hideOnEscape = true, preferredIndex = 5, } SlashCmdList.GROUPDISBAND = function() StaticPopup_Show("DISBAND_RAID") end SLASH_GROUPDISBAND1 = "/rd" SLASH_GROUPDISBAND2 = "/кв" ---------------------------------------------------------------------------------------- -- Convert party to raid ---------------------------------------------------------------------------------------- SlashCmdList.PARTYTORAID = function() if GetNumGroupMembers() > 0 then if UnitInRaid("player") and (UnitIsGroupLeader("player")) then C_PartyInfo.ConvertToParty() elseif UnitInParty("player") and (UnitIsGroupLeader("player")) then C_PartyInfo.ConvertToRaid() end else print("|cffffff00"..ERR_NOT_IN_GROUP.."|r") end end SLASH_PARTYTORAID1 = "/toraid" SLASH_PARTYTORAID2 = "/toparty" SLASH_PARTYTORAID3 = "/convert" SLASH_PARTYTORAID4 = "/сщтмуке" ---------------------------------------------------------------------------------------- -- Instance teleport ---------------------------------------------------------------------------------------- SlashCmdList.INSTTELEPORT = function() local inInstance = IsInInstance() if inInstance then LFGTeleport(true) else LFGTeleport() end end SLASH_INSTTELEPORT1 = "/teleport" SLASH_INSTTELEPORT2 = "/еудузщке" ---------------------------------------------------------------------------------------- -- Spec switching(by Monolit) ---------------------------------------------------------------------------------------- SlashCmdList.SPEC = function(spec) local canUse, failureReason = C_SpecializationInfo.CanPlayerUseTalentSpecUI()() if canUse then if GetSpecialization() ~= tonumber(spec) then SetSpecialization(spec) end else print("|cffffff00"..failureReason.."|r") end end SLASH_SPEC1 = "/ss" SLASH_SPEC2 = "/spec" SLASH_SPEC3 = "/ыы" ---------------------------------------------------------------------------------------- -- Get target NPC name and ID ---------------------------------------------------------------------------------------- SlashCmdList.NPCID = function() local name = UnitName("target") local unitGUID = UnitGUID("target") local id = unitGUID and select(6, strsplit('-', unitGUID)) if id then print(name..": "..id) end end SLASH_NPCID1 = "/getid" ---------------------------------------------------------------------------------------- -- Demo mode for DBM ---------------------------------------------------------------------------------------- SlashCmdList.DBMTEST = function() if IsAddOnLoaded("DBM-Core") then DBM:DemoMode() end end SLASH_DBMTEST1 = "/dbmtest" SLASH_DBMTEST2 = "/виьеуые" ---------------------------------------------------------------------------------------- -- Command to show frame you currently have mouseovered ---------------------------------------------------------------------------------------- SlashCmdList.FRAME = function(arg) if arg ~= "" then arg = _G[arg] else arg = GetMouseFocus() end if arg ~= nil then _G.FRAME = arg end if arg ~= nil and not arg:IsForbidden() and arg:GetName() ~= nil then local point, relativeTo, relativePoint, xOfs, yOfs = arg:GetPoint() print("|cffCC0000--------------------------------------------------------------------|r") print("Name: |cffFFD100"..arg:GetName().."|r") if arg:GetParent() and arg:GetParent():GetName() then print("Parent: |cffFFD100"..arg:GetParent():GetName().."|r") end print("Width: |cffFFD100"..format("%.2f", arg:GetWidth()).."|r") print("Height: |cffFFD100"..format("%.2f", arg:GetHeight()).."|r") print("Strata: |cffFFD100"..arg:GetFrameStrata().."|r") print("Level: |cffFFD100"..arg:GetFrameLevel().."|r") if relativeTo and relativeTo:GetName() then print('Point: |cffFFD100 "'..point..'", '..relativeTo:GetName()..', "'..relativePoint..'"'.."|r") end if xOfs then print("X: |cffFFD100"..format("%.2f", xOfs).."|r") end if yOfs then print("Y: |cffFFD100"..format("%.2f", yOfs).."|r") end print("|cffCC0000--------------------------------------------------------------------|r") elseif arg == nil then print("Invalid frame name") else print("Could not find frame info") end end SLASH_FRAME1 = "/frame" SLASH_FRAME2 = "/акфьу" ---------------------------------------------------------------------------------------- -- Print /framestack info in chat ---------------------------------------------------------------------------------------- SlashCmdList["FRAMELIST"] = function(msg) if not FrameStackTooltip then UIParentLoadAddOn("Blizzard_DebugTools") end local isPreviouslyShown = FrameStackTooltip:IsShown() if not isPreviouslyShown then if msg == tostring(true) then FrameStackTooltip_Toggle(true, true, true) else FrameStackTooltip_Toggle(false, true, true) end end print("|cffCC0000--------------------------------------------------------------------|r") for i = 2, FrameStackTooltip:NumLines() do local text = _G["FrameStackTooltipTextLeft"..i]:GetText() if text and text ~= "" then local r, g, b = _G["FrameStackTooltipTextLeft"..i]:GetTextColor() text = format("|cff%02x%02x%02x%s|r", r * 255, g * 255, b * 255, text) print(text) end end print("|cffCC0000--------------------------------------------------------------------|r") FrameStackTooltip_Toggle() SlashCmdList.COPY_CHAT() end SLASH_FRAMELIST1 = "/framelist" SLASH_FRAMELIST2 = "/акфьудшые" SLASH_FRAMELIST3 = "/fl" SLASH_FRAMELIST4 = "/ад" ---------------------------------------------------------------------------------------- -- Frame Stack on Cyrillic ---------------------------------------------------------------------------------------- SlashCmdList.FSTACK = function() UIParentLoadAddOn("Blizzard_DebugTools") FrameStackTooltip_Toggle(false, true, true) end SLASH_FSTACK1 = "/аыефсл" SLASH_FSTACK2 = "/fs" SLASH_FSTACK3 = "/аы" SLASH_FRAMESTK1 = nil -- fix LFGFilter ---------------------------------------------------------------------------------------- -- Clear chat ---------------------------------------------------------------------------------------- SlashCmdList.CLEAR_CHAT = function() for i = 1, NUM_CHAT_WINDOWS do _G[format("ChatFrame%d", i)]:Clear() end end SLASH_CLEAR_CHAT1 = "/clear" SLASH_CLEAR_CHAT2 = "/сдуфк" ---------------------------------------------------------------------------------------- -- Test Blizzard Alerts ---------------------------------------------------------------------------------------- SlashCmdList.TEST_ACHIEVEMENT = function() PlaySound(SOUNDKIT.LFG_REWARDS) if not AchievementFrame then AchievementFrame_LoadUI() end AchievementAlertSystem:AddAlert(112) CriteriaAlertSystem:AddAlert(9023, "Doing great!") GuildChallengeAlertSystem:AddAlert(3, 2, 5) InvasionAlertSystem:AddAlert(678, DUNGEON_FLOOR_THENEXUS1, true, 1, 1) WorldQuestCompleteAlertSystem:AddAlert(AlertFrameMixin:BuildQuestData(42114)) -- GarrisonFollowerAlertSystem:AddAlert(32, "Dagg", 90, 2, true, C_Garrison.GetFollowerInfo(32)) -- GarrisonShipFollowerAlertSystem:AddAlert(592, "Ship", "Transport", "GarrBuilding_Barracks_1_H", 3, 2, 1) GarrisonBuildingAlertSystem:AddAlert(GARRISON_CACHE) GarrisonTalentAlertSystem:AddAlert(3, _G.C_Garrison.GetTalentInfo(370)) -- LegendaryItemAlertSystem:AddAlert("|cffa335ee|Hitem:158712::::::::60:66::16:4:6534:6513:1533:4786::::|h[Rezan's Gleaming Eye]|h|r") -- LootAlertSystem:AddAlert("|cffa335ee|Hitem:158712::::::::60:66::16:4:6534:6513:1533:4786::::|h[Rezan's Gleaming Eye]|h|r", 1, 1, 100, 2, false, false, 0, false, false) -- LootUpgradeAlertSystem:AddAlert("|cffa335ee|Hitem:158712::::::::60:66::16:4:6534:6513:1533:4786::::|h[Rezan's Gleaming Eye]|h|r", 1, 1, 1, nil, nil, false) MoneyWonAlertSystem:AddAlert(81500) EntitlementDeliveredAlertSystem:AddAlert("", "Interface\\Icons\\Ability_pvp_gladiatormedallion", TRINKET0SLOT, 214) RafRewardDeliveredAlertSystem:AddAlert("", "Interface\\Icons\\Ability_pvp_gladiatormedallion", TRINKET0SLOT, 214) -- DigsiteCompleteAlertSystem:AddAlert("Human") NewRecipeLearnedAlertSystem:AddAlert(204) NewRuneforgePowerAlertSystem:AddAlert(204) NewCosmeticAlertFrameSystem:AddAlert(204) -- BonusRollFrame_StartBonusRoll(242969, 'test', 20, 515, 15, 14) end SLASH_TEST_ACHIEVEMENT1 = "/tach" SLASH_TEST_ACHIEVEMENT2 = "/ефср" ---------------------------------------------------------------------------------------- -- Test Blizzard Extra Action Button ---------------------------------------------------------------------------------------- SlashCmdList.TEST_EXTRABUTTON = function() if ExtraActionBarFrame:IsShown() then ExtraActionBarFrame:Hide() else ExtraActionBarFrame:Show() ExtraActionBarFrame:SetAlpha(1) ExtraActionButton1:Show() ExtraActionButton1:SetAlpha(1) ExtraActionButton1.icon:SetTexture("Interface\\Icons\\spell_deathknight_breathofsindragosa") ExtraActionButton1.icon:Show() ExtraActionButton1.icon:SetAlpha(1) ExtraActionButton1.Count:SetText("2") end end SLASH_TEST_EXTRABUTTON1 = "/teb" SLASH_TEST_EXTRABUTTON2 = "/еуи" ---------------------------------------------------------------------------------------- -- Grid on screen ---------------------------------------------------------------------------------------- local grid SlashCmdList.GRIDONSCREEN = function(msg) if grid then grid:Hide() grid = nil else if msg and msg == "hide" then return end grid = CreateFrame("Frame", nil, UIParent) grid:SetAllPoints(UIParent) local width = GetScreenWidth() / 128 local height = GetScreenHeight() / 72 for i = 0, 128 do local texture = grid:CreateTexture(nil, "BACKGROUND") if i == 64 then texture:SetColorTexture(1, 0, 0, 0.8) else texture:SetColorTexture(0, 0, 0, 0.8) end texture:SetPoint("TOPLEFT", grid, "TOPLEFT", i * width - 1, 0) texture:SetPoint("BOTTOMRIGHT", grid, "BOTTOMLEFT", i * width, 0) end for i = 0, 72 do local texture = grid:CreateTexture(nil, "BACKGROUND") if i == 36 then texture:SetColorTexture(1, 0, 0, 0.8) else texture:SetColorTexture(0, 0, 0, 0.8) end texture:SetPoint("TOPLEFT", grid, "TOPLEFT", 0, -i * height) texture:SetPoint("BOTTOMRIGHT", grid, "TOPRIGHT", 0, -i * height - 1) end end end SLASH_GRIDONSCREEN1 = "/align" SLASH_GRIDONSCREEN2 = "/фдшпт" ================================================ FILE: ShestakUI/Core/Constants.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- ShestakUI variables ---------------------------------------------------------------------------------------- T.dummy = function() return end T.name = UnitName("player") T.class = select(2, UnitClass("player")) T.level = UnitLevel("player") T.client = GetLocale() T.realm = GetRealmName() T.color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[T.class] T.version = GetAddOnMetadata("ShestakUI", "Version") T.screenWidth, T.screenHeight = GetPhysicalScreenSize() T.newPatch = select(4, GetBuildInfo()) >= 100005 -- BETA GetContainerItemInfo = function(bagIndex, slotIndex) local info = C_Container.GetContainerItemInfo(bagIndex, slotIndex) if info then return info.iconFileID, info.stackCount, info.isLocked, info.quality, info.isReadable, info.hasLoot, info.hyperlink, info.isFiltered, info.hasNoValue, info.itemID, info.isBound end end ================================================ FILE: ShestakUI/Core/Disable.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Prevent users config errors ---------------------------------------------------------------------------------------- if C.actionbar.rightbars > 3 then C.actionbar.rightbars = 3 end if C.actionbar.bottombars > 3 then C.actionbar.bottombars = 3 end if C.actionbar.split_bars == true then C.actionbar.bottombars = 3 end if C.actionbar.bottombars < 1 then C.actionbar.bottombars = 1 end if C.actionbar.editor then C.actionbar.bottombars_mouseover = false C.actionbar.rightbars_mouseover = false C.actionbar.toggle_mode = false end ---------------------------------------------------------------------------------------- -- Auto-overwrite script config is X addon is found ---------------------------------------------------------------------------------------- if IsAddOnLoaded("Stuf") or IsAddOnLoaded("PitBull4") or IsAddOnLoaded("ShadowedUnitFrames") then C.unitframe.enable = false end if IsAddOnLoaded("Grid") or IsAddOnLoaded("Grid2") or IsAddOnLoaded("HealBot") or IsAddOnLoaded("VuhDo") or IsAddOnLoaded("Cell") or IsAddOnLoaded("Aptechka") then C.raidframe.show_party = false C.raidframe.show_raid = false C.raidframe.auto_position = "NONE" end if IsAddOnLoaded("TidyPlates") or IsAddOnLoaded("nPlates") or IsAddOnLoaded("Kui_Nameplates") or IsAddOnLoaded("rNamePlates") or IsAddOnLoaded("EKplates") or IsAddOnLoaded("bdNameplates") or IsAddOnLoaded("Plater") or IsAddOnLoaded("Nameplates") or IsAddOnLoaded("NeatPlates") then C.nameplate.enable = false end if IsAddOnLoaded("Dominos") or IsAddOnLoaded("Bartender4") or IsAddOnLoaded("RazerNaga") then C.actionbar.enable = false C.actionbar.toggle_mode = false end if IsAddOnLoaded("Mapster") then C.minimap.fog_of_war = false end if IsAddOnLoaded("Prat-3.0") or IsAddOnLoaded("Chatter") or IsAddOnLoaded("BasicChatMods") or IsAddOnLoaded("Glass") then C.chat.enable = false end if IsAddOnLoaded("Quartz") or IsAddOnLoaded("AzCastBar") then C.unitframe.unit_castbar = false C.unitframe.plugins_swing = false C.unitframe.plugins_gcd = false end if IsAddOnLoaded("Afflicted3") or IsAddOnLoaded("InterruptBar") then C.enemycooldown.enable = false end if IsAddOnLoaded("TipTac") or IsAddOnLoaded("FreebTip") or IsAddOnLoaded("bTooltip") or IsAddOnLoaded("PhanxTooltip") or IsAddOnLoaded("Icetip") then C.tooltip.enable = false end if IsAddOnLoaded("Gladius") or IsAddOnLoaded("GladiusEx") then C.unitframe.show_arena = false end if IsAddOnLoaded("Omen") or IsAddOnLoaded("rThreat") then C.threat.enable = false end if IsAddOnLoaded("DBM-SpellTimers") then C.raidcooldown.enable = false end if IsAddOnLoaded("TipTacTalents") then C.tooltip.talents = false end if IsAddOnLoaded("AdiBags") or IsAddOnLoaded("ArkInventory") or IsAddOnLoaded("cargBags_Nivaya") or IsAddOnLoaded("cargBags") or IsAddOnLoaded("Bagnon") or IsAddOnLoaded("Combuctor") or IsAddOnLoaded("TBag") or IsAddOnLoaded("BaudBag") then C.bag.enable = false end if IsAddOnLoaded("MikScrollingBattleText") or IsAddOnLoaded("Parrot") or IsAddOnLoaded("xCT") or IsAddOnLoaded("sct") then C.combattext.enable = false end if IsAddOnLoaded("Doom_CooldownPulse") then C.pulsecooldown.enable = false end if IsAddOnLoaded("GnomishVendorShrinker") or IsAddOnLoaded("AlreadyKnown") then C.trade.already_known = false end if IsAddOnLoaded("Clique") or IsAddOnLoaded("sBinder") then C.misc.click_cast = false end if IsAddOnLoaded("RaidSlackCheck") then C.announcements.flask_food = false C.announcements.feasts = false end if IsAddOnLoaded("PhoenixStyle") then C.announcements.toys = false end if IsAddOnLoaded("Overachiever") then C.tooltip.achievements = false end if IsAddOnLoaded("ChatSounds") then C.chat.whisp_sound = false end if IsAddOnLoaded("Aurora") then C.skins.blizzard_frames = false end if IsAddOnLoaded("BigWigs") or IsAddOnLoaded("DBM-Core") then C.automation.auto_role = false end if IsAddOnLoaded("QuickQuest") then C.automation.accept_quest = false end ================================================ FILE: ShestakUI/Core/Functions.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Number value function ---------------------------------------------------------------------------------------- T.Round = function(number, decimals) if not decimals then decimals = 0 end if decimals and decimals > 0 then local mult = 10 ^ decimals return floor(number * mult + 0.5) / mult end return floor(number + 0.5) end T.ShortValue = function(value) if value >= 1e11 then return ("%.0fb"):format(value / 1e9) elseif value >= 1e10 then return ("%.1fb"):format(value / 1e9):gsub("%.?0+([km])$", "%1") elseif value >= 1e9 then return ("%.2fb"):format(value / 1e9):gsub("%.?0+([km])$", "%1") elseif value >= 1e8 then return ("%.0fm"):format(value / 1e6) elseif value >= 1e7 then return ("%.1fm"):format(value / 1e6):gsub("%.?0+([km])$", "%1") elseif value >= 1e6 then return ("%.2fm"):format(value / 1e6):gsub("%.?0+([km])$", "%1") elseif value >= 1e5 then return ("%.0fk"):format(value / 1e3) elseif value >= 1e3 then return ("%.1fk"):format(value / 1e3):gsub("%.?0+([km])$", "%1") else return value end end T.RGBToHex = function(r, g, b) r = tonumber(r) <= 1 and tonumber(r) >= 0 and tonumber(r) or 0 g = tonumber(g) <= tonumber(g) and tonumber(g) >= 0 and tonumber(g) or 0 b = tonumber(b) <= 1 and tonumber(b) >= 0 and tonumber(b) or 0 return string.format("|cff%02x%02x%02x", r * 255, g * 255, b * 255) end ---------------------------------------------------------------------------------------- -- Chat channel check ---------------------------------------------------------------------------------------- T.CheckChat = function(warning) if IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then return "INSTANCE_CHAT" elseif IsInRaid(LE_PARTY_CATEGORY_HOME) then if warning and (UnitIsGroupLeader("player") or UnitIsGroupAssistant("player") or IsEveryoneAssistant()) then return "RAID_WARNING" else return "RAID" end elseif IsInGroup(LE_PARTY_CATEGORY_HOME) then return "PARTY" end return "SAY" end ---------------------------------------------------------------------------------------- -- Player's role check ---------------------------------------------------------------------------------------- local isCaster = { DEATHKNIGHT = {nil, nil, nil}, DEMONHUNTER = {nil, nil}, DRUID = {true}, -- Balance HUNTER = {nil, nil, nil}, MAGE = {true, true, true}, MONK = {nil, nil, nil}, PALADIN = {nil, nil, nil}, PRIEST = {nil, nil, true}, -- Shadow ROGUE = {nil, nil, nil}, SHAMAN = {true}, -- Elemental WARLOCK = {true, true, true}, WARRIOR = {nil, nil, nil}, EVOKER = {true} } local function CheckRole() local spec = GetSpecialization() local role = spec and GetSpecializationRole(spec) T.Spec = spec if role == "TANK" then T.Role = "Tank" elseif role == "HEALER" then T.Role = "Healer" elseif role == "DAMAGER" then if isCaster[T.class][spec] then T.Role = "Caster" else T.Role = "Melee" end end end local RoleUpdater = CreateFrame("Frame") RoleUpdater:RegisterEvent("PLAYER_ENTERING_WORLD") RoleUpdater:RegisterEvent("PLAYER_TALENT_UPDATE") RoleUpdater:SetScript("OnEvent", CheckRole) T.IsHealerSpec = function() local healer = false local spec = GetSpecialization() if (T.class == "EVOKER" and spec == 2) or (T.class == "DRUID" and spec == 4) or (T.class == "MONK" and spec == 2) or (T.class == "PALADIN" and spec == 1) or (T.class == "PRIEST" and spec ~= 3) or (T.class == "SHAMAN" and spec == 3) then healer = true end return healer end ---------------------------------------------------------------------------------------- -- Player's buff check ---------------------------------------------------------------------------------------- T.CheckPlayerBuff = function(spell) for i = 1, 40 do local name, _, _, _, _, _, unitCaster = UnitBuff("player", i) if not name then break end if name == spell then return i, unitCaster end end return nil end ---------------------------------------------------------------------------------------- -- Player's level check ---------------------------------------------------------------------------------------- local function CheckLevel(_, _, level) T.level = level end local LevelUpdater = CreateFrame("Frame") LevelUpdater:RegisterEvent("PLAYER_LEVEL_UP") LevelUpdater:SetScript("OnEvent", CheckLevel) ---------------------------------------------------------------------------------------- -- Pet Battle Hider ---------------------------------------------------------------------------------------- T_PetBattleFrameHider = CreateFrame("Frame", "ShestakUI_PetBattleFrameHider", UIParent, "SecureHandlerStateTemplate") T_PetBattleFrameHider:SetAllPoints() T_PetBattleFrameHider:SetFrameStrata("LOW") RegisterStateDriver(T_PetBattleFrameHider, "visibility", "[petbattle] hide; show") ---------------------------------------------------------------------------------------- -- UTF functions ---------------------------------------------------------------------------------------- T.UTF = function(string, i, dots) if not string then return end local bytes = string:len() if bytes <= i then return string else local len, pos = 0, 1 while (pos <= bytes) do len = len + 1 local c = string:byte(pos) if c > 0 and c <= 127 then pos = pos + 1 elseif c >= 192 and c <= 223 then pos = pos + 2 elseif c >= 224 and c <= 239 then pos = pos + 3 elseif c >= 240 and c <= 247 then pos = pos + 4 end if len == i then break end end if len == i and pos <= bytes then return string:sub(1, pos - 1)..(dots and "..." or "") else return string end end end ---------------------------------------------------------------------------------------- -- Move functions ---------------------------------------------------------------------------------------- T.CalculateMoverPoints = function(mover) local centerX, centerY = UIParent:GetCenter() local width = UIParent:GetRight() local x, y = mover:GetCenter() local point = "BOTTOM" if y >= centerY then point = "TOP" y = -(UIParent:GetTop() - mover:GetTop()) else y = mover:GetBottom() end if x >= (width * 2 / 3) then point = point.."RIGHT" x = mover:GetRight() - width elseif x <= (width / 3) then point = point.."LEFT" x = mover:GetLeft() else x = x - centerX end return x, y, point end T.IsFramePositionedLeft = function(frame) local x = frame:GetCenter() local screenWidth = GetScreenWidth() local positionedLeft = false if x and x < (screenWidth / 2) then positionedLeft = true end return positionedLeft end T.CurrentProfile = function(reset) if ShestakUIOptionsGlobal[T.realm][T.name] then if ShestakUIPositionsPerChar == nil then ShestakUIPositionsPerChar = ShestakUIPositions end if not ShestakUIPositionsPerChar then return {} end local i = tostring(ShestakUIOptionsGlobal[T.realm]["Current_Profile"][T.name]) ShestakUIPositionsPerChar[i] = ShestakUIPositionsPerChar[i] or {} if reset then ShestakUIPositionsPerChar[i] = {} else return ShestakUIPositionsPerChar[i] end else if not ShestakUIPositions then return {} end local i = tostring(ShestakUIOptionsGlobal["Current_Profile"]) ShestakUIPositions[i] = ShestakUIPositions[i] or {} if reset then ShestakUIPositions[i] = {} else return ShestakUIPositions[i] end end end ================================================ FILE: ShestakUI/Core/GUI.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) -- Spells lists initialization C.filger.buff_spells_list = {} C.filger.proc_spells_list = {} C.filger.debuff_spells_list = {} C.filger.aura_bar_spells_list = {} C.filger.cd_spells_list = {} C.filger.ignore_spells_list = {} C.raidframe.plugins_aura_watch_list = {} C.announcements.spells_list = {} C.raidcooldown.spells_list = {} C.raidcooldown.spells_list_ver = 1 C.enemycooldown.spells_list = {} C.enemycooldown.spells_list_ver = 1 C.nameplate.debuffs_list = {} C.nameplate.buffs_list = {} C.combattext.spells_list = {} C.chat.spam_list = "" C.font.global_font = false C.media.profile = "-- Insert Your code here\n" C.general.choose_profile = 1 C.general.profile_name = "1" C.options = {} if not IsAddOnLoaded("ShestakUI_Config") then return end ---------------------------------------------------------------------------------------- -- This Module loads new user settings if ShestakUI_Config is loaded ---------------------------------------------------------------------------------------- -- Create the profile boolean if not ShestakUIOptionsGlobal then ShestakUIOptionsGlobal = {} end if ShestakUIOptionsGlobal[T.realm] == nil then ShestakUIOptionsGlobal[T.realm] = {} end if ShestakUIOptionsGlobal[T.realm][T.name] == nil then ShestakUIOptionsGlobal[T.realm][T.name] = false end if ShestakUIOptionsGlobal[T.realm]["Current_Profile"] == nil then ShestakUIOptionsGlobal[T.realm]["Current_Profile"] = {} end -- Create the main options table if ShestakUIOptions == nil then ShestakUIOptions = {} end -- Determine which settings to use local profile if ShestakUIOptionsGlobal[T.realm][T.name] == true then if ShestakUIOptionsPerChar == nil then ShestakUIOptionsPerChar = ShestakUIOptions ShestakUIOptionsGlobal[T.realm]["Current_Profile"][T.name] = ShestakUIOptionsGlobal["Current_Profile"] or 1 end if not ShestakUIOptionsPerChar.merged and not ShestakUIOptionsPerChar["1"] then -- TODO delete after while local backup = ShestakUIOptionsPerChar ShestakUIOptionsPerChar = {} ShestakUIOptionsPerChar["1"] = backup ShestakUIOptionsPerChar.merged = true end ShestakUIOptionsGlobal[T.realm]["Current_Profile"][T.name] = ShestakUIOptionsGlobal[T.realm]["Current_Profile"][T.name] or 1 local i = tostring(ShestakUIOptionsGlobal[T.realm]["Current_Profile"][T.name]) ShestakUIOptionsPerChar[i] = ShestakUIOptionsPerChar[i] or {} profile = ShestakUIOptionsPerChar[i] else if not ShestakUIOptions.merged and not ShestakUIOptions["1"] then -- TODO delete after while local backup = ShestakUIOptions ShestakUIOptions = {} ShestakUIOptions["1"] = backup ShestakUIOptions.merged = true end ShestakUIOptionsGlobal["Current_Profile"] = ShestakUIOptionsGlobal["Current_Profile"] or 1 local i = tostring(ShestakUIOptionsGlobal["Current_Profile"]) ShestakUIOptions[i] = ShestakUIOptions[i] or {} profile = ShestakUIOptions[i] end -- Apply or remove saved settings as needed for group, options in pairs(profile) do if C[group] then for option, value in pairs(options) do if C[group][option] == nil or C[group][option] == value then -- remove saved vars if they do not exist in lua config anymore, or are the same as the lua config profile[group][option] = nil else C[group][option] = value end end else -- profile[group] = nil end end -- Add global options variable C.options = profile -- Load edited profile code loadstring("local T, C, L = unpack(ShestakUI)\n"..C["media"].profile)() ================================================ FILE: ShestakUI/Core/Init.lua ================================================ ---------------------------------------------------------------------------------------- -- Initiation of ShestakUI ---------------------------------------------------------------------------------------- -- Including system local addon, engine = ... engine[1] = {} -- T, Functions engine[2] = {} -- C, Config engine[3] = {} -- L, Localization ShestakUI = engine -- Allow other addons to use Engine --[[ This should be at the top of every file inside of the ShestakUI AddOn: local T, C, L, _ = unpack(select(2, ...)) This is how another addon imports the ShestakUI engine: local T, C, L, _ = unpack(ShestakUI) ]] ================================================ FILE: ShestakUI/Core/Kill.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Kill all stuff on default UI that we don't need ---------------------------------------------------------------------------------------- local frame = CreateFrame("Frame") frame:RegisterEvent("ADDON_LOADED") frame:SetScript("OnEvent", function(_, _, addon) if addon == "Blizzard_AchievementUI" then if C.tooltip.enable then --BETA hooksecurefunc("AchievementFrameCategories_DisplayButton", function(button) button.showTooltipFunc = nil end) end end if ClassPowerBar then ClassPowerBar.OnEvent = T.dummy -- Fix error with druid on logon end if C.unitframe.enable and C.raidframe.layout ~= "BLIZZARD" then --BETA InterfaceOptionsFrameCategoriesButton10:SetScale(0.00001) -- InterfaceOptionsFrameCategoriesButton10:SetAlpha(0) -- if not InCombatLockdown() then -- CompactRaidFrameManager:Kill() -- CompactRaidFrameContainer:Kill() -- end -- ShowPartyFrame = T.dummy -- HidePartyFrame = T.dummy -- CompactUnitFrameProfiles_ApplyProfile = T.dummy if CompactRaidFrameManager then local function HideFrames() CompactRaidFrameManager:UnregisterAllEvents() CompactRaidFrameContainer:UnregisterAllEvents() if not InCombatLockdown() then CompactRaidFrameManager:Hide() local shown = CompactRaidFrameManager_GetSetting("IsShown") if shown and shown ~= "0" then CompactRaidFrameManager_SetSetting("IsShown", "0") end end end local hiddenFrame = CreateFrame("Frame") hiddenFrame:Hide() hooksecurefunc("CompactRaidFrameManager_UpdateShown", HideFrames) CompactRaidFrameManager:HookScript("OnShow", HideFrames) CompactRaidFrameContainer:HookScript("OnShow", HideFrames) HideFrames() end end --BETA Display_UseUIScale:Kill() -- Display_UIScaleSlider:Kill() TutorialFrameAlertButton:Kill() SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_WORLD_MAP_FRAME, true) SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_PET_JOURNAL, true) SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_GARRISON_BUILDING, true) SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TALENT_CHANGES, true) SetCVar("countdownForCooldowns", 0) --BETA InterfaceOptionsActionBarsPanelCountdownCooldowns:Hide() if C.chat.enable then --BETA InterfaceOptionsSocialPanelChatStyle:Hide() SetCVar("chatStyle", "im") end if C.unitframe.enable then if T.class == "DEATHKNIGHT" and C.unitframe_class_bar.rune ~= true then RuneFrame:Kill() end --BETA InterfaceOptionsDisplayPanelDisplayDropDown:Hide() --BETA InterfaceOptionsCombatPanelTargetOfTarget:Hide() SetCVar("showPartyBackground", 0) end if C.actionbar.enable then --BETA InterfaceOptionsActionBarsPanelBottomLeft:Hide() -- InterfaceOptionsActionBarsPanelBottomRight:Hide() -- InterfaceOptionsActionBarsPanelRight:Hide() -- InterfaceOptionsActionBarsPanelRightTwo:Hide() -- InterfaceOptionsActionBarsPanelAlwaysShowActionBars:Hide() -- InterfaceOptionsActionBarsPanelStackRightBars:Hide() -- if not InCombatLockdown() then -- SetCVar("multiBarRightVerticalLayout", 0) -- removed? -- end end if C.nameplate.enable then SetCVar("ShowClassColorInNameplate", 1) end if C.minimap.enable then --BETA InterfaceOptionsDisplayPanelRotateMinimap:Hide() SetCVar("minimapTrackingShowAll", 1) end if C.bag.enable then C_Container.SetSortBagsRightToLeft(true) C_Container.SetInsertItemsLeftToRight(false) end if C.combattext.enable then --BETA InterfaceOptionsCombatPanelEnableFloatingCombatText:Hide() if C.combattext.incoming then SetCVar("enableFloatingCombatText", 1) else SetCVar("enableFloatingCombatText", 0) end end end) local function AcknowledgeTips() if InCombatLockdown() then return end for frame in _G.HelpTip.framePool:EnumerateActive() do frame:Acknowledge() end end AcknowledgeTips() hooksecurefunc(_G.HelpTip, "Show", AcknowledgeTips) ================================================ FILE: ShestakUI/Core/Launch.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- First Time Launch and On Login file ---------------------------------------------------------------------------------------- local function InstallUI() -- Don't need to set CVar multiple time SetCVar("screenshotQuality", 8) SetCVar("cameraDistanceMaxZoomFactor", 2.6) SetCVar("showTutorials", 0) SetCVar("gameTip", "0") SetCVar("UberTooltips", 1) SetCVar("chatMouseScroll", 1) SetCVar("removeChatDelay", 1) SetCVar("WholeChatWindowClickable", 0) SetCVar("WhisperMode", "inline") SetCVar("colorblindMode", 0) SetCVar("lootUnderMouse", 0) SetCVar("autoLootDefault", 1) SetCVar("RotateMinimap", 0) SetCVar("autoQuestProgress", 1) SetCVar("scriptErrors", 1) SetCVar("taintLog", 0) SetCVar("buffDurations", 1) SetCVar("autoOpenLootHistory", 0) SetCVar("lossOfControl", 0) SetCVar("nameplateShowSelf", 0) -- Setting chat frames if C.chat.enable == true and not (IsAddOnLoaded("Prat-3.0") or IsAddOnLoaded("Chatter")) then for i = 1, NUM_CHAT_WINDOWS do local frame = _G[format("ChatFrame%s", i)] local chatFrameId = frame:GetID() frame:SetSize(C.chat.width, C.chat.height) -- Default width and height of chats SetChatWindowSavedDimensions(chatFrameId, T.Scale(C.chat.width), T.Scale(C.chat.height)) -- Move general chat to bottom left if i == 1 then frame:ClearAllPoints() frame:SetPoint(unpack(C.position.chat)) end -- Save new default position and dimension FCF_SavePositionAndDimensions(frame) -- Rename general and combat log tabs if i == 1 then FCF_SetWindowName(frame, GENERAL) end if i == 2 then FCF_SetWindowName(frame, GUILD_BANK_LOG) end -- Lock them if unlocked if not frame.isLocked then FCF_SetLocked(frame, 1) end end -- Enable classcolor automatically on login and on each character without doing /configure each time ToggleChatColorNamesByClassGroup(true, "SAY") ToggleChatColorNamesByClassGroup(true, "EMOTE") ToggleChatColorNamesByClassGroup(true, "YELL") ToggleChatColorNamesByClassGroup(true, "GUILD") ToggleChatColorNamesByClassGroup(true, "OFFICER") ToggleChatColorNamesByClassGroup(true, "GUILD_ACHIEVEMENT") ToggleChatColorNamesByClassGroup(true, "ACHIEVEMENT") ToggleChatColorNamesByClassGroup(true, "WHISPER") ToggleChatColorNamesByClassGroup(true, "PARTY") ToggleChatColorNamesByClassGroup(true, "PARTY_LEADER") ToggleChatColorNamesByClassGroup(true, "RAID") ToggleChatColorNamesByClassGroup(true, "RAID_LEADER") ToggleChatColorNamesByClassGroup(true, "RAID_WARNING") ToggleChatColorNamesByClassGroup(true, "INSTANCE_CHAT") ToggleChatColorNamesByClassGroup(true, "INSTANCE_CHAT_LEADER") ToggleChatColorNamesByClassGroup(true, "CHANNEL1") ToggleChatColorNamesByClassGroup(true, "CHANNEL2") ToggleChatColorNamesByClassGroup(true, "CHANNEL3") ToggleChatColorNamesByClassGroup(true, "CHANNEL4") ToggleChatColorNamesByClassGroup(true, "CHANNEL5") end -- Reset saved variables on char ShestakUISettingsPerChar = {} ShestakUISettingsPerChar.Install = true ShestakUISettingsPerChar.FogOfWar = true ShestakUISettingsPerChar.Coords = true ShestakUISettingsPerChar.Archaeology = false ShestakUISettingsPerChar.BarsLocked = false ShestakUISettingsPerChar.SplitBars = true ShestakUISettingsPerChar.RightBars = C.actionbar.rightbars ShestakUISettingsPerChar.BottomBars = C.actionbar.bottombars if C_ClassTrial.IsClassTrialCharacter() and IsWetxius then SlashCmdList.ONLY_UI() end -- Set to default layout of Blizzard Edit Mode C_EditMode.SetActiveLayout(1) ReloadUI() end local function DisableUI() DisableAddOn("ShestakUI") ReloadUI() end ---------------------------------------------------------------------------------------- -- Popups ---------------------------------------------------------------------------------------- StaticPopupDialogs.INSTALL_UI = { text = L_POPUP_INSTALLUI, button1 = ACCEPT, button2 = CANCEL, OnAccept = InstallUI, OnCancel = function() ShestakUISettingsPerChar.Install = false end, timeout = 0, whileDead = 1, hideOnEscape = false, preferredIndex = 5, } StaticPopupDialogs.DISABLE_UI = { text = L_POPUP_DISABLEUI, button1 = ACCEPT, button2 = CANCEL, OnAccept = DisableUI, showAlert = true, timeout = 0, whileDead = 1, hideOnEscape = true, preferredIndex = 5, } StaticPopupDialogs.RESET_UI = { text = L_POPUP_RESETUI, button1 = ACCEPT, button2 = CANCEL, OnAccept = InstallUI, OnCancel = function() ShestakUISettingsPerChar.Install = true end, showAlert = true, timeout = 0, whileDead = 1, hideOnEscape = true, preferredIndex = 5, } StaticPopupDialogs.RESET_STATS = { text = L_POPUP_RESETSTATS, button1 = ACCEPT, button2 = CANCEL, OnAccept = function() ShestakUIStats = {} ReloadUI() end, showAlert = true, timeout = 0, whileDead = 1, hideOnEscape = true, preferredIndex = 5, } SLASH_CONFIGURE1 = "/resetui" SlashCmdList.CONFIGURE = function() StaticPopup_Show("RESET_UI") end SLASH_RESETSTATS1 = "/resetstats" SlashCmdList.RESETSTATS = function() StaticPopup_Show("RESET_STATS") end ---------------------------------------------------------------------------------------- -- On logon function ---------------------------------------------------------------------------------------- local OnLogon = CreateFrame("Frame") OnLogon:RegisterEvent("PLAYER_ENTERING_WORLD") OnLogon:SetScript("OnEvent", function(self) self:UnregisterEvent("PLAYER_ENTERING_WORLD") -- Create empty CVar if they doesn't exist if ShestakUISettings == nil then ShestakUISettings = {} end if ShestakUIPositions == nil then ShestakUIPositions = {} end if ShestakUISettingsPerChar == nil then ShestakUISettingsPerChar = {} end if ShestakUISettingsPerChar.FogOfWar == nil then ShestakUISettingsPerChar.FogOfWar = true end if ShestakUISettingsPerChar.Coords == nil then ShestakUISettingsPerChar.Coords = true end if ShestakUISettingsPerChar.Archaeology == nil then ShestakUISettingsPerChar.Archaeology = false end if ShestakUISettingsPerChar.BarsLocked == nil then ShestakUISettingsPerChar.BarsLocked = false end if ShestakUISettingsPerChar.SplitBars == nil then ShestakUISettingsPerChar.SplitBars = true end if ShestakUISettingsPerChar.RightBars == nil then ShestakUISettingsPerChar.RightBars = C.actionbar.rightbars end if ShestakUISettingsPerChar.BottomBars == nil then ShestakUISettingsPerChar.BottomBars = C.actionbar.bottombars end if T.screenWidth < 1024 and GetCVar("gxMonitor") == "0" then SetCVar("useUiScale", 0) StaticPopup_Show("DISABLE_UI") else SetCVar("useUiScale", 1) if C.general.uiscale > 1.28 then C.general.uiscale = 1.28 end -- Set our uiScale if tonumber(GetCVar("uiScale")) ~= tonumber(C.general.uiscale) then SetCVar("uiScale", C.general.uiscale) end -- Hack for 4K and WQHD Resolution if C.general.uiscale < 0.64 then UIParent:SetScale(C.general.uiscale) end -- Install default if we never ran ShestakUI on this character if not ShestakUISettingsPerChar.Install then StaticPopup_Show("INSTALL_UI") end end -- Welcome message if C.general.welcome_message == true then print("|cffffff00"..L_WELCOME_LINE_1..T.version.." "..T.client..", "..T.name..".|r") print("|cffffff00"..L_WELCOME_LINE_2_1.." |cffffff00"..L_WELCOME_LINE_2_2.."|r") end end) ================================================ FILE: ShestakUI/Core/Movers.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Movement function(by Allez) ---------------------------------------------------------------------------------------- T.MoverFrames = { VehicleButtonAnchor, ExtraButtonAnchor, ZoneButtonAnchor, ActionBarAnchor, RightActionBarAnchor, PetActionBarAnchor, StanceBarAnchor, MicroAnchor, VehicleAnchor, AchievementAnchor, MinimapAnchor, TopPanelAnchor, BuffsAnchor, RaidCDAnchor, EnemyCDAnchor, ObjectiveTrackerAnchor, ThreatMeterAnchor, LootRollAnchor, RaidBuffsAnchor, PulseCDAnchor, AutoButtonAnchor, TooltipAnchor, ChatBar, P_BUFF_ICON_Anchor, P_PROC_ICON_Anchor, SPECIAL_P_BUFF_ICON_Anchor, T_DEBUFF_ICON_Anchor, T_BUFF_Anchor, PVE_PVP_DEBUFF_Anchor, PVE_PVP_CC_Anchor, COOLDOWN_Anchor, T_DE_BUFF_BAR_Anchor, SplitBarLeft, SplitBarRight, UIWidgetPowerBarAnchor } if C.actionbar.bar7_enable then tinsert(T.MoverFrames, Bar7Holder) end if C.actionbar.bar8_enable then tinsert(T.MoverFrames, Bar8Holder) end if C.actionbar.editor then tinsert(T.MoverFrames, Bar1Holder) tinsert(T.MoverFrames, Bar2Holder) tinsert(T.MoverFrames, Bar3Holder) tinsert(T.MoverFrames, Bar4Holder) tinsert(T.MoverFrames, Bar5Holder) tinsert(T.MoverFrames, Bar6Holder) tremove(T.MoverFrames, 5) -- RightActionBarAnchor tremove(T.MoverFrames, 4) -- ActionBarAnchor end local unitFrames = { oUF_Player, oUF_Target, oUF_Pet, oUF_Focus, oUF_FocusTarget, oUF_TargetTarget, oUF_Player_Castbar, oUF_Target_Castbar, oUF_Player_Portrait, oUF_Target_Portrait, PartyAnchor, PartyTargetAnchor, PartyPetAnchor, RaidTankAnchor, PartyDPSAnchor, PartyTargetDPSAnchor, PartyPetDPSAnchor, RaidTankDPSAnchor } for i = 1, 5 do tinsert(unitFrames,_G["oUF_Boss"..i]) tinsert(unitFrames,_G["oUF_Arena"..i]) tinsert(unitFrames,_G["oUF_Arena"..i.."Target"]) end for i = 1, C.raidframe.raid_groups do tinsert(unitFrames, _G["RaidAnchor"..i]) tinsert(unitFrames, _G["RaidDPSAnchor"..i]) end local moving = false local movers = {} local placed = { "Butsu", "UIAltPowerBar", "LootHistoryFrame", "stArchaeologyFrame", "StuffingFrameBags", "StuffingFrameBank", "UIWidgetTopAnchor", "UIWidgetBelowAnchor" } local function MergeOldPositions() -- TODO delete after while if ShestakUIOptionsGlobal[T.realm][T.name] then if not ShestakUIPositionsPerChar then ShestakUIPositionsPerChar = ShestakUIPositions end if not ShestakUIPositionsPerChar.merged then local backup = ShestakUIPositions ShestakUIPositionsPerChar = {} ShestakUIPositionsPerChar["1"] = backup ShestakUIPositionsPerChar.merged = true ShestakUIPositionsPerChar["1"]["1"] = nil -- T.CurrentProfile calls early and create empty table so remove this end else if not ShestakUIPositions.merged then local backup = ShestakUIPositions ShestakUIPositions = {} ShestakUIPositions["1"] = backup ShestakUIPositions.merged = true ShestakUIPositions["1"]["1"] = nil end end end local SaveDefaultPosition = function(mover) local ap, p, rp, x, y = mover.frame:GetPoint() local positionTable = T.CurrentProfile() positionTable.Default = positionTable.Default or {} if not positionTable.Default[mover.frame:GetName()] then if not p then p = UIParent end positionTable.Default[mover.frame:GetName()] = {ap, p:GetName(), rp, x, y} end end local SetPosition = function(mover) local x, y, ap = T.CalculateMoverPoints(mover) mover.frame:ClearAllPoints() mover.frame:SetPoint(ap, "UIParent", ap, x, y) local positionTable = T.CurrentProfile() positionTable[mover.frame:GetName()] = {ap, "UIParent", ap, x, y} end -- Controls local controls = CreateFrame("frame", nil, UIParent) controls:SetPoint("CENTER", UIParent) controls:SetSize(65, 25) controls:SetFrameStrata("TOOLTIP") controls:SetFrameLevel(200) controls:SetClampedToScreen(true) controls:Hide() controls:SetScript("OnLeave", function(self) if MouseIsOver(self) then return end if not self._frame then self:Hide() elseif not MouseIsOver(self._frame) then self:Hide() end controls.x:SetText("") controls.y:SetText("") end) local function CreateArrow(moveX, moveY, callback) moveX = moveX or 0 moveY = moveY or 0 local button = CreateFrame("button", nil, controls) button:SetSize(14, 14) button.controls = controls button.tex = button:CreateTexture(nil, "OVERLAY") button.tex:SetTexture("Interface\\OPTIONSFRAME\\VoiceChat-Play") button.tex:SetPoint("CENTER") button.tex:SetSize(12, 12) button.tex:SetVertexColor(0.6, 0.6, 0.6) button:SetScript("OnEnter", function(self) self.tex:SetVertexColor(1, 1, 1) end) button:SetScript("OnLeave", function(self) self.tex:SetVertexColor(0.6, 0.6, 0.6) end) callback = callback or function(self) local frame = self.controls._frame if not frame then return end local point, relativeTo, relativePoint, xOfs, yOfs = frame.frame:GetPoint() SaveDefaultPosition(frame) if IsControlKeyDown() then frame.frame:SetPoint(point, relativeTo, relativePoint, xOfs + (moveX * 20), yOfs + (moveY * 20)) elseif IsShiftKeyDown() then frame.frame:SetPoint(point, relativeTo, relativePoint, xOfs + (moveX * 5), yOfs + (moveY * 5)) else frame.frame:SetPoint(point, relativeTo, relativePoint, xOfs + (moveX * 1), yOfs + (moveY * 1)) end local point, relativeTo, relativePoint, xOfs, yOfs = frame.frame:GetPoint() if not relativeTo then relativeTo = UIParent end local positionTable = T.CurrentProfile() positionTable[frame.frame:GetName()] = {point, relativeTo:GetName(), relativePoint, xOfs, yOfs} frame:SetAllPoints(frame.frame) controls.x:SetText(T.Round(xOfs)) controls.y:SetText(T.Round(yOfs)) end button:SetScript("OnClick", callback) if controls.last then button:SetPoint("LEFT", controls.last, "RIGHT", 2, 0) else button:SetPoint("LEFT", controls, "LEFT", 2, 0) end controls.last = button return button end controls.left = CreateArrow(-1, 0) controls.left.tex:SetRotation(3.14159) controls.up = CreateArrow(0, 1) controls.up.tex:SetRotation(1.5708) controls.down = CreateArrow(0, -1) controls.down.tex:SetRotation(-1.5708) controls.right = CreateArrow(1, 0) controls.right.tex:SetRotation(0) controls.x = controls:CreateFontString(nil, "OVERLAY") controls.x:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) controls.x:SetPoint("RIGHT", controls, "LEFT", -10, 0) controls.y = controls:CreateFontString(nil, "OVERLAY") controls.y:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) controls.y:SetPoint("LEFT", controls, "RIGHT", 10, 0) controls.shadow = controls:CreateTexture(nil, "OVERLAY") controls.shadow:SetPoint("TOPLEFT", controls.x, "TOPLEFT", -5, 5) controls.shadow:SetPoint("BOTTOMRIGHT", controls.y, "BOTTOMRIGHT", 2, -5) controls.shadow:SetTexture(C.media.texture) controls.shadow:SetVertexColor(0.2, 0.2, 0.2, 0.8) local function GetQuadrant(frame) local _, y = frame:GetCenter() local vhalf = (y > UIParent:GetHeight() / 2) and "TOP" or "BOTTOM" return vhalf end local function ShowControls(frame) local y = GetQuadrant(frame) controls._frame = frame controls:Show() controls:ClearAllPoints() if y == "TOP" then controls:SetPoint("TOP", frame, "BOTTOM", 0, 0) else controls:SetPoint("BOTTOM", frame, "TOP", 0, 0) end local _, _, _, xOfs, yOfs = frame.frame:GetPoint() controls.x:SetText(T.Round(xOfs)) controls.y:SetText(T.Round(yOfs)) end local function UpdateCoords(self) local mover = self.child local x, y, ap = T.CalculateMoverPoints(mover) mover.frame:ClearAllPoints() mover.frame:SetPoint(ap, "UIParent", ap, x, y) controls.x:SetText(T.Round(x)) controls.y:SetText(T.Round(y)) end local coordFrame = CreateFrame("Frame") coordFrame:SetScript("OnUpdate", UpdateCoords) coordFrame:Hide() local OnDragStart = function(self) SaveDefaultPosition(self) self:StartMoving() coordFrame.child = self coordFrame:Show() end local OnDragStop = function(self) self:StopMovingOrSizing() SetPosition(self) coordFrame.child = nil coordFrame:Hide() end local RestoreDefaults = function(self, button) if button == "RightButton" then local positionTable = T.CurrentProfile() local data = positionTable.Default and positionTable.Default[self.frame:GetName()] if data then self.frame:ClearAllPoints() self.frame:SetPoint(unpack(data)) self:ClearAllPoints() self:SetAllPoints(self.frame) positionTable.Default[self.frame:GetName()] = nil positionTable[self.frame:GetName()] = nil end elseif button == "MiddleButton" then self:Hide() end end local UpdatePosition = function(moveX, moveY) moveX = moveX or 0 moveY = moveY or 0 local frame = controls._frame if not frame then return end local point, relativeTo, relativePoint, xOfs, yOfs = frame.frame:GetPoint() SaveDefaultPosition(frame) frame.frame:SetPoint(point, relativeTo, relativePoint, xOfs + (moveX * 1), yOfs + (moveY * 1)) local point, relativeTo, relativePoint, xOfs, yOfs = frame.frame:GetPoint() if not relativeTo then relativeTo = UIParent end local positionTable = T.CurrentProfile() positionTable[frame.frame:GetName()] = {point, relativeTo:GetName(), relativePoint, xOfs, yOfs} frame:SetAllPoints(frame.frame) controls.x:SetText(T.Round(xOfs)) controls.y:SetText(T.Round(yOfs)) end local OnMouseWheel = function(self, offset) if IsShiftKeyDown() then UpdatePosition(0, offset) elseif IsControlKeyDown() then UpdatePosition(offset, 0) end end local chatInfo = CreateFrame("Frame", nil, UIParent) chatInfo:SetFrameStrata("TOOLTIP") chatInfo:SetPoint("TOPLEFT", ChatFrame1, "TOPLEFT", -3, 1) chatInfo:SetSize(C.chat.width + 7, C.chat.height + 4) chatInfo:SetTemplate("Overlay") chatInfo:Hide() local title = chatInfo:CreateFontString(nil, "ARTWORK", "GameFontHighlight") title:SetPoint("TOP", chatInfo, "TOP", 0, -10) title:SetTextColor(0.40, 0.78, 1) local subTitle1 = chatInfo:CreateFontString(nil, "ARTWORK", "GameFontHighlight") subTitle1:SetPoint("TOP", title, "TOP", 0, -20) subTitle1:SetText(L_MOVE_RIGHT_CLICK) subTitle1:SetTextColor(0.75, 0.9, 1) local subTitle2 = chatInfo:CreateFontString(nil, "ARTWORK", "GameFontHighlight") subTitle2:SetPoint("TOP", subTitle1, "TOP", 0, -20) subTitle2:SetText(L_MOVE_MIDDLE_CLICK) subTitle2:SetTextColor(0.75, 0.9, 1) local ResetButton = CreateFrame("Button", nil, chatInfo, "UIPanelButtonTemplate") ResetButton:SetSize(100, 23) ResetButton:SetText(DEFAULT) ResetButton:SetPoint("BOTTOMLEFT", chatInfo, "BOTTOMLEFT", 10, 7) ResetButton:SetScript("OnClick", function() StaticPopup_Show("MOVEUI_RESET") end) ResetButton:SkinButton() local CloseButton = CreateFrame("Button", nil, chatInfo, "UIPanelButtonTemplate") CloseButton:SetPoint("TOPRIGHT", chatInfo, "BOTTOMRIGHT", -10, 30) CloseButton:SetSize(100, 23) CloseButton:SetText(CLOSE) CloseButton:SetScript("OnClick", function() PlaySound(SOUNDKIT.IG_MAINMENU_OPTION) SlashCmdList.MOVING() end) CloseButton:SkinButton() local index = 200 local CreateMover = function(frame, unit) local mover = CreateFrame("Frame", nil, UIParent) if unit then mover:CreateBackdrop("Transparent") mover.backdrop:SetBackdropBorderColor(0, 0.6, 0.6) else mover:SetTemplate("Transparent") mover:SetBackdropBorderColor(0, 0.6, 0.6) end mover.backdrop = mover.backdrop or mover mover:SetAllPoints(frame) mover:SetFrameStrata("TOOLTIP") mover:SetFrameLevel(index) mover:EnableMouse(true) mover:SetMovable(true) mover:SetClampedToScreen(true) mover:RegisterForDrag("LeftButton") mover:SetScript("OnDragStart", OnDragStart) mover:SetScript("OnDragStop", OnDragStop) mover:SetScript("OnEnter", function(self) self.backdrop:SetBackdropColor(0.4, 0.4, 0.4, C.media.backdrop_alpha) self.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color)) ShowControls(self) title:SetText(mover.name:GetText()) end) mover:SetScript("OnLeave", function(self) self.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha) self.backdrop:SetBackdropBorderColor(0, 0.6, 0.6) if not MouseIsOver(controls) then controls:Hide() end end) mover:SetScript("OnMouseUp", RestoreDefaults) mover:SetScript("OnMouseWheel", OnMouseWheel) mover.frame = frame mover.name = mover:CreateFontString(nil, "OVERLAY") mover.name:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) mover.name:SetPoint("CENTER") mover.name:SetTextColor(1, 1, 1) local text = frame:GetName() text = text:gsub("_Anchor", "") text = text:gsub("Anchor", "") text = text:gsub("oUF_", "") mover.name:SetText(text) mover.name:SetWidth(frame:GetWidth() - 4) movers[frame:GetName()] = mover index = index - 2 end local GetMover = function(frame, unit) if movers[frame:GetName()] then return movers[frame:GetName()] else return CreateMover(frame, unit) end end local InitMove = function(msg) if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end if msg and (msg == "reset" or msg == "куыуе") then T.CurrentProfile(true) for _, v in pairs(placed) do if _G[v] then _G[v]:SetUserPlaced(false) end end ReloadUI() return end if not moving then for _, v in pairs(T.MoverFrames) do local mover = GetMover(v) if mover then mover:Show() end end for _, v in pairs(unitFrames) do local mover = GetMover(v, true) if mover then mover:Show() end end moving = true SlashCmdList.GRIDONSCREEN() chatInfo:Show() else for _, v in pairs(movers) do v:Hide() end moving = false SlashCmdList.GRIDONSCREEN("hide") controls:Hide() chatInfo:Hide() end end local RestoreUI = function(self) if InCombatLockdown() then if not self.shedule then self.shedule = CreateFrame("Frame", nil, self) end self.shedule:RegisterEvent("PLAYER_REGEN_ENABLED") self.shedule:SetScript("OnEvent", function(self) RestoreUI(self:GetParent()) self:UnregisterEvent("PLAYER_REGEN_ENABLED") self:SetScript("OnEvent", nil) end) return end MergeOldPositions() -- TODO delete after while local positionTable = T.CurrentProfile() if positionTable then for frame_name, point in pairs(positionTable) do if _G[frame_name] then _G[frame_name]:ClearAllPoints() _G[frame_name]:SetPoint(unpack(point)) end end end end local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function(self, event) self:UnregisterEvent(event) RestoreUI(self) -- C_EditMode.SetActiveLayout(1) -- BETA Remove after while end) SlashCmdList.MOVING = InitMove SLASH_MOVING1 = "/moveui" SLASH_MOVING2 = "/ьщмугш" SLASH_MOVING3 = "/ui" SLASH_MOVING4 = "/гш" StaticPopupDialogs.RESET_UF = { text = L_POPUP_RESETUI, button1 = ACCEPT, button2 = CANCEL, OnAccept = function() if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") else local positionTable = T.CurrentProfile() for _, frame in pairs(unitFrames) do if frame:GetName() then positionTable[frame:GetName()] = nil end end ReloadUI() end end, timeout = 0, whileDead = 1, hideOnEscape = true, preferredIndex = 5, } SlashCmdList.RESETUF = function() StaticPopup_Show("RESET_UF") end SLASH_RESETUF1 = "/resetuf" StaticPopupDialogs.MOVEUI_RESET = { text = L_POPUP_RESETUI, button1 = ACCEPT, button2 = CANCEL, OnAccept = function() if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") else T.CurrentProfile(true) for _, v in pairs(placed) do if _G[v] then _G[v]:SetUserPlaced(false) end end ReloadUI() end end, timeout = 0, whileDead = 1, hideOnEscape = true, preferredIndex = 5, } -- Replace EditMode with our moving system GameMenuButtonEditMode:SetScript("OnClick", function() PlaySound(SOUNDKIT.IG_MAINMENU_OPTION) SlashCmdList.MOVING() HideUIPanel(GameMenuFrame) end) ================================================ FILE: ShestakUI/Core/Panels.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Bottom bars anchor ---------------------------------------------------------------------------------------- local BottomBarAnchor = CreateFrame("Frame", "ActionBarAnchor", T_PetBattleFrameHider) BottomBarAnchor:CreatePanel("Invisible", 1, 1, unpack(C.position.bottom_bars)) BottomBarAnchor:SetWidth((C.actionbar.button_size * 12) + (C.actionbar.button_space * 11)) if C.actionbar.bottombars == 2 then BottomBarAnchor:SetHeight((C.actionbar.button_size * 2) + C.actionbar.button_space) elseif C.actionbar.bottombars == 3 then if C.actionbar.split_bars == true then BottomBarAnchor:SetHeight((C.actionbar.button_size * 2) + C.actionbar.button_space) else BottomBarAnchor:SetHeight((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2)) end else BottomBarAnchor:SetHeight(C.actionbar.button_size) end BottomBarAnchor:SetFrameStrata("LOW") ---------------------------------------------------------------------------------------- -- Right bars anchor ---------------------------------------------------------------------------------------- local RightBarAnchor = CreateFrame("Frame", "RightActionBarAnchor", T_PetBattleFrameHider) RightBarAnchor:CreatePanel("Invisible", 1, 1, unpack(C.position.right_bars)) RightBarAnchor:SetHeight((C.actionbar.button_size * 12) + (C.actionbar.button_space * 11)) if C.actionbar.rightbars == 1 then RightBarAnchor:SetWidth(C.actionbar.button_size) elseif C.actionbar.rightbars == 2 then RightBarAnchor:SetWidth((C.actionbar.button_size * 2) + C.actionbar.button_space) elseif C.actionbar.rightbars == 3 then RightBarAnchor:SetWidth((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2)) else RightBarAnchor:Hide() end RightBarAnchor:SetFrameStrata("LOW") ---------------------------------------------------------------------------------------- -- Split bar anchor ---------------------------------------------------------------------------------------- if C.actionbar.split_bars == true then local SplitBarLeft = CreateFrame("Frame", "SplitBarLeft", T_PetBattleFrameHider) SplitBarLeft:CreatePanel("Invisible", (C.actionbar.button_size * 3) + (C.actionbar.button_space * 3), (C.actionbar.button_size * 2) + C.actionbar.button_space, "BOTTOMRIGHT", ActionBarAnchor, "BOTTOMLEFT", 0, 0) SplitBarLeft:SetFrameStrata("LOW") local SplitBarRight = CreateFrame("Frame", "SplitBarRight", T_PetBattleFrameHider) SplitBarRight:CreatePanel("Invisible", (C.actionbar.button_size * 3) + (C.actionbar.button_space * 3), (C.actionbar.button_size * 2) + C.actionbar.button_space, "BOTTOMLEFT", ActionBarAnchor, "BOTTOMRIGHT", 0, 0) SplitBarRight:SetFrameStrata("LOW") end ---------------------------------------------------------------------------------------- -- Pet bar anchor ---------------------------------------------------------------------------------------- local PetBarAnchor = CreateFrame("Frame", "PetActionBarAnchor", T_PetBattleFrameHider) if C.actionbar.petbar_horizontal == true then PetBarAnchor:CreatePanel("Invisible", (C.actionbar.button_size * 10) + (C.actionbar.button_space * 9), C.actionbar.button_size, unpack(C.position.pet_horizontal)) elseif C.actionbar.rightbars > 0 then PetBarAnchor:CreatePanel("Invisible", C.actionbar.button_size + C.actionbar.button_space, (C.actionbar.button_size * 10) + (C.actionbar.button_space * 9), "RIGHT", RightBarAnchor, "LEFT", 0, 0) else PetBarAnchor:CreatePanel("Invisible", (C.actionbar.button_size + C.actionbar.button_space), (C.actionbar.button_size * 10) + (C.actionbar.button_space * 9), unpack(C.position.right_bars)) end PetBarAnchor:SetFrameStrata("LOW") RegisterStateDriver(PetBarAnchor, "visibility", "[pet,novehicleui,nopossessbar,nopetbattle] show; hide") ---------------------------------------------------------------------------------------- -- Stance bar anchor ---------------------------------------------------------------------------------------- local StanceAnchor = CreateFrame("Frame", "StanceBarAnchor", T_PetBattleFrameHider) StanceAnchor:SetFrameStrata("LOW") if C.actionbar.stancebar_horizontal == true then if C.actionbar.petbar_horizontal == true then StanceAnchor:SetPoint(C.position.stance_bar[1], C.position.stance_bar[2], C.position.stance_bar[3], C.position.stance_bar[4], C.position.stance_bar[5] - (C.actionbar.button_size + C.actionbar.button_space)) else StanceAnchor:SetPoint(unpack(C.position.stance_bar)) end StanceAnchor:SetWidth((C.actionbar.button_size * 7) + (C.actionbar.button_space * 6)) StanceAnchor:SetHeight(C.actionbar.button_size) else if C.actionbar.petbar_horizontal == true then StanceAnchor:SetPoint("RIGHT", "RightActionBarAnchor", "LEFT", 0, (C.actionbar.button_size / 2) + 2) else StanceAnchor:SetPoint("RIGHT", PetActionBarAnchor:IsShown() and "PetActionBarAnchor" or "RightActionBarAnchor", "LEFT", 0, (C.actionbar.button_size / 2) + 2) PetBarAnchor:HookScript("OnShow", function() if InCombatLockdown() then return end StanceAnchor:SetPoint("RIGHT", "PetActionBarAnchor", "LEFT", 0, (C.actionbar.button_size / 2) + 2) end) PetBarAnchor:HookScript("OnHide", function() if InCombatLockdown() then return end StanceAnchor:SetPoint("RIGHT", "RightActionBarAnchor", "LEFT", 0, (C.actionbar.button_size / 2) + 2) end) end StanceAnchor:SetWidth(C.actionbar.button_size + C.actionbar.button_space) StanceAnchor:SetHeight((C.actionbar.button_size * 7) + (C.actionbar.button_space * 6)) end StanceAnchor:RegisterEvent("PLAYER_LOGIN") StanceAnchor:RegisterUnitEvent("PLAYER_SPECIALIZATION_CHANGED", "player") StanceAnchor:SetScript("OnEvent", function() local forms = GetNumShapeshiftForms() if forms > 0 then if C.actionbar.stancebar_horizontal == true then StanceAnchor:SetWidth((C.actionbar.button_size * forms) + (C.actionbar.button_space * (forms - 1))) else StanceAnchor:SetHeight((C.actionbar.button_size * forms) + (C.actionbar.button_space * (forms - 1))) end end if not StanceAnchor.hook then RegisterStateDriver(StanceAnchor, "visibility", GetNumShapeshiftForms() == 0 and "hide" or "show") StanceAnchor.hook = true end end) ---------------------------------------------------------------------------------------- -- Bottom line ---------------------------------------------------------------------------------------- if C.stats.bottom_line then local bottompanel = CreateFrame("Frame", "BottomPanel", UIParent) bottompanel:CreatePanel("ClassColor", 1, 1, "BOTTOM", UIParent, "BOTTOM", 0, 20) bottompanel:SetPoint("LEFT", UIParent, "LEFT", 21, 0) bottompanel:SetPoint("RIGHT", UIParent, "RIGHT", -21, 0) end ---------------------------------------------------------------------------------------- -- Chat background ---------------------------------------------------------------------------------------- if C.chat.background == true then local chatbd = CreateFrame("Frame", "ChatBackground", UIParent) chatbd:CreatePanel("Transparent", C.chat.width + 7, C.chat.height + 4, "TOPLEFT", ChatFrame1, "TOPLEFT", -3, 1) chatbd:SetBackdropBorderColor(unpack(C.media.classborder_color)) chatbd:SetBackdropColor(0, 0, 0, C.chat.background_alpha) if C.chat.tabs_mouseover ~= true then local chattabs = CreateFrame("Frame", "ChatTabsPanel", UIParent) chattabs:CreatePanel("Transparent", chatbd:GetWidth(), 20, "BOTTOM", chatbd, "TOP", 0, 3) chattabs:SetBackdropBorderColor(unpack(C.media.classborder_color)) chattabs:SetBackdropColor(0, 0, 0, C.chat.background_alpha) end elseif C.stats.bottom_line then local leftpanel = CreateFrame("Frame", "LeftPanel", UIParent) leftpanel:CreatePanel("ClassColor", 1, C.chat.height - 2, "BOTTOMLEFT", BottomPanel, "LEFT", 0, 0) end ---------------------------------------------------------------------------------------- -- Top panel ---------------------------------------------------------------------------------------- if C.toppanel.enable ~= true then return end C.toppanel.height = C.toppanel.height + ((C.font.stats_font_size - 8) * 7) C.toppanel.width = C.toppanel.width + ((C.font.stats_font_size - 8) * 3) local toppanelanchor = CreateFrame("Frame", "TopPanelAnchor", T_PetBattleFrameHider) toppanelanchor:SetPoint(unpack(C.position.top_panel)) toppanelanchor:SetSize(C.toppanel.width, C.toppanel.height / 2) local toppanel = CreateFrame("Frame", "TopPanel", T_PetBattleFrameHider) toppanel:SetPoint("CENTER", toppanelanchor, "CENTER", 0, 0) toppanel:SetSize(C.toppanel.width, C.toppanel.height / 2) if C.toppanel.mouseover == true then toppanel:SetAlpha(0) toppanel:SetScript("OnEnter", function() if InCombatLockdown() then return end toppanel:SetAlpha(1) end) toppanel:SetScript("OnLeave", function() toppanel:SetAlpha(0) end) end local r, g, b = unpack(C.media.classborder_color) toppanel.bgl = toppanel:CreateTexture(nil, "BORDER") toppanel.bgl:SetPoint("RIGHT", toppanel, "CENTER", 0, 0) toppanel.bgl:SetSize(C.toppanel.width / 2, C.toppanel.height / 2) toppanel.bgl:SetTexture(C.media.blank) toppanel.bgl:SetGradient("HORIZONTAL", CreateColor(r, g, b, 0), CreateColor(r, g, b, 0.1)) toppanel.bgr = toppanel:CreateTexture(nil, "BORDER") toppanel.bgr:SetPoint("LEFT", toppanel, "CENTER", 0, 0) toppanel.bgr:SetSize(C.toppanel.width / 2, C.toppanel.height / 2) toppanel.bgr:SetTexture(C.media.blank) toppanel.bgr:SetGradient("HORIZONTAL", CreateColor(r, g, b, 0.1), CreateColor(r, g, b, 0)) toppanel.tbl = toppanel:CreateTexture(nil, "ARTWORK") toppanel.tbl:SetPoint("RIGHT", toppanel, "TOP", 0, 0) toppanel.tbl:SetSize(C.toppanel.width / 2, 3) toppanel.tbl:SetTexture(C.media.blank) toppanel.tbl:SetGradient("HORIZONTAL", CreateColor(0, 0, 0, 0), CreateColor(0, 0, 0, 1)) toppanel.tcl = toppanel:CreateTexture(nil, "OVERLAY") toppanel.tcl:SetPoint("RIGHT", toppanel, "TOP", 0, 0) toppanel.tcl:SetSize(C.toppanel.width / 2, 1) toppanel.tcl:SetTexture(C.media.blank) toppanel.tcl:SetGradient("HORIZONTAL", CreateColor(r, g, b, 0), CreateColor(r, g, b, 1)) toppanel.tbr = toppanel:CreateTexture(nil, "ARTWORK") toppanel.tbr:SetPoint("LEFT", toppanel, "TOP", 0, 0) toppanel.tbr:SetSize(C.toppanel.width / 2, 3) toppanel.tbr:SetTexture(C.media.blank) toppanel.tbr:SetGradient("HORIZONTAL", CreateColor(0, 0, 0, 1), CreateColor(0, 0, 0, 0)) toppanel.tcr = toppanel:CreateTexture(nil, "OVERLAY") toppanel.tcr:SetPoint("LEFT", toppanel, "TOP", 0, 0) toppanel.tcr:SetSize(C.toppanel.width / 2, 1) toppanel.tcr:SetTexture(C.media.blank) toppanel.tcr:SetGradient("HORIZONTAL", CreateColor(r, g, b, 1), CreateColor(r, g, b, 0)) toppanel.bbl = toppanel:CreateTexture(nil, "ARTWORK") toppanel.bbl:SetPoint("RIGHT", toppanel, "BOTTOM", 0, 0) toppanel.bbl:SetSize(C.toppanel.width / 2, 3) toppanel.bbl:SetTexture(C.media.blank) toppanel.bbl:SetGradient("HORIZONTAL", CreateColor(0, 0, 0, 0), CreateColor(0, 0, 0, 1)) toppanel.bcl = toppanel:CreateTexture(nil, "OVERLAY") toppanel.bcl:SetPoint("RIGHT", toppanel, "BOTTOM", 0, 0) toppanel.bcl:SetSize(C.toppanel.width / 2, 1) toppanel.bcl:SetTexture(C.media.blank) toppanel.bcl:SetGradient("HORIZONTAL", CreateColor(r, g, b, 0), CreateColor(r, g, b, 1)) toppanel.bbr = toppanel:CreateTexture(nil, "ARTWORK") toppanel.bbr:SetPoint("LEFT", toppanel, "BOTTOM", 0, 0) toppanel.bbr:SetSize(C.toppanel.width / 2, 3) toppanel.bbr:SetTexture(C.media.blank) toppanel.bbr:SetGradient("HORIZONTAL", CreateColor(0, 0, 0, 1), CreateColor(0, 0, 0, 0)) toppanel.bcr = toppanel:CreateTexture(nil, "OVERLAY") toppanel.bcr:SetPoint("LEFT", toppanel, "BOTTOM", 0, 0) toppanel.bcr:SetSize(C.toppanel.width / 2, 1) toppanel.bcr:SetTexture(C.media.blank) toppanel.bcr:SetGradient("HORIZONTAL", CreateColor(r, g, b, 1), CreateColor(r, g, b, 0)) ================================================ FILE: ShestakUI/Core/PixelPerfect.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Pixel perfect script of custom ui Scale ---------------------------------------------------------------------------------------- if T.screenWidth <= 1440 then T.low_resolution = true else T.low_resolution = false end if C.general.auto_scale == true then C.general.uiscale = min(2, max(0.20, 768 / T.screenHeight)) if T.screenHeight >= 2400 then C.general.uiscale = C.general.uiscale * 3 elseif T.screenHeight >= 1600 then C.general.uiscale = C.general.uiscale * 2 end C.general.uiscale = tonumber(string.sub(C.general.uiscale, 0, 5)) -- 8.1 Fix scale bug end T.mult = 768 / T.screenHeight / C.general.uiscale T.noscalemult = T.mult * C.general.uiscale T.Scale = function(x) return T.mult * math.floor(x / T.mult + 0.5) end ---------------------------------------------------------------------------------------- -- Pixel perfect fonts for high resolution ---------------------------------------------------------------------------------------- if T.screenHeight <= 1200 then return end C.media.pixel_font_size = C.media.pixel_font_size * T.mult C.font.chat_tabs_font_size = C.font.chat_tabs_font_size * T.mult C.font.action_bars_font_size = C.font.action_bars_font_size * T.mult C.font.threat_meter_font_size = C.font.threat_meter_font_size * T.mult C.font.raid_cooldowns_font_size = C.font.raid_cooldowns_font_size * T.mult C.font.unit_frames_font_size = C.font.unit_frames_font_size * T.mult C.font.auras_font_size = C.font.auras_font_size * T.mult C.font.filger_font_size = C.font.filger_font_size * T.mult C.font.bags_font_size = C.font.bags_font_size * T.mult C.font.loot_font_size = C.font.loot_font_size * T.mult C.font.combat_text_font_size = C.font.combat_text_font_size * T.mult C.font.stats_font_size = C.font.stats_font_size * T.mult C.font.stylization_font_size = C.font.stylization_font_size * T.mult C.font.cooldown_timers_font_size = C.font.cooldown_timers_font_size * T.mult ================================================ FILE: ShestakUI/Core/Temp.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Temporary stuff ---------------------------------------------------------------------------------------- ================================================ FILE: ShestakUI/Core/WTF.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- MSBT settings ---------------------------------------------------------------------------------------- local UploadMSBT = function() if MSBTProfiles_SavedVars then table.wipe(MSBTProfiles_SavedVars) end if MSBT_SavedMedia then table.wipe(MSBT_SavedMedia) end MSBTProfiles_SavedVars = { ["profiles"] = { ["Default"] = { ["powerThrottleDuration"] = 5, ["normalOutlineIndex"] = 2, ["partialColoringDisabled"] = true, ["alwaysShowQuestItems"] = false, ["hideFullOverheals"] = true, ["normalFontSize"] = 16, ["scrollAreas"] = { ["Incoming"] = { ["scrollHeight"] = 250, ["offsetX"] = -215, ["animationStyle"] = "Straight", ["behavior"] = "MSBT_NORMAL", ["offsetY"] = 151, ["skillIconsDisabled"] = true, ["direction"] = "Up", }, ["Outgoing"] = { ["scrollHeight"] = 250, ["offsetX"] = 174, ["animationStyle"] = "Straight", ["behavior"] = "MSBT_NORMAL", ["offsetY"] = 151, ["skillIconsDisabled"] = true, ["direction"] = "Up", }, ["Notification"] = { ["offsetX"] = -176, ["offsetY"] = 201, }, ["Static"] = { ["offsetX"] = -7, ["offsetY"] = -33, }, }, ["soundsDisabled"] = true, ["hideMergeTrailer"] = true, ["triggers"] = { ["MSBT_TRIGGER_RIPOSTE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_KILL_SHOT"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_DECIMATION"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_BACKLASH"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_OVERPOWER"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_SWORD_AND_BOARD"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_RAMPAGE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_RIME"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_THE_ART_OF_WAR"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_RUNE_STRIKE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_PREDATORS_SWIFTNESS"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_ECLIPSE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_TASTE_FOR_BLOOD"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_LOW_HEALTH"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_LOCK_AND_LOAD"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_TIDAL_WAVES"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_VIPER_STING"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_NIGHTFALL"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_HOT_STREAK"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_LOW_MANA"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_SUDDEN_DEATH"] = { ["disabled"] = true, }, ["MSBT_TRIGGER_IMPACT"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_OWLKIN_FRENZY"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_BRAIN_FREEZE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_ERADICATION"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_LOW_PET_HEALTH"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_KILLING_MACHINE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_PVP_TRINKET"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_MISSILE_BARRAGE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_VICTORY_RUSH"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_BLOODSURGE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_CLEARCASTING"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_MOLTEN_CORE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_FINGERS_OF_FROST"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_COUNTER_ATTACK"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_HAMMER_OF_WRATH"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_REVENGE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_EXECUTE"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["MSBT_TRIGGER_FROSTBITE"] = { ["disabled"] = true, }, ["MSBT_TRIGGER_MAELSTROM_WEAPON"] = { ["disabled"] = true, }, }, ["regenAbilitiesDisabled"] = true, ["critFontName"] = "ShestakUI", ["hotThrottleDuration"] = 5, ["critOutlineIndex"] = 2, ["animationSpeed"] = 140, ["skillIconsDisabled"] = true, ["dotThrottleDuration"] = 5, ["creationVersion"] = "5.4.75", ["critFontSize"] = 16, ["hideSkills"] = true, ["events"] = { ["NOTIFICATION_COMBAT_ENTER"] = { ["disabled"] = true, }, ["NOTIFICATION_PC_KILLING_BLOW"] = { ["disabled"] = true, ["fontSize"] = false, }, ["NOTIFICATION_MONEY"] = { ["disabled"] = true, }, ["NOTIFICATION_REP_GAIN"] = { ["disabled"] = true, }, ["NOTIFICATION_DEBUFF_FADE"] = { ["disabled"] = true, }, ["NOTIFICATION_REP_LOSS"] = { ["disabled"] = true, }, ["NOTIFICATION_BUFF"] = { ["disabled"] = true, }, ["NOTIFICATION_LOOT"] = { ["disabled"] = true, }, ["NOTIFICATION_SOUL_SHARD_CREATED"] = { ["disabled"] = true, ["fontSize"] = false, }, ["OUTGOING_EVADE"] = { ["fontSize"] = 16, }, ["NOTIFICATION_SKILL_GAIN"] = { ["disabled"] = true, }, ["INCOMING_HEAL_CRIT"] = { ["fontSize"] = false, }, ["NOTIFICATION_POWER_LOSS"] = { ["disabled"] = true, }, ["OUTGOING_HEAL_CRIT"] = { ["fontSize"] = false, }, ["NOTIFICATION_DEBUFF_STACK"] = { ["disabled"] = true, }, ["NOTIFICATION_ITEM_BUFF_FADE"] = { ["disabled"] = true, }, ["NOTIFICATION_EXPERIENCE_GAIN"] = { ["fontSize"] = false, }, ["NOTIFICATION_BUFF_FADE"] = { ["disabled"] = true, }, ["NOTIFICATION_MONSTER_EMOTE"] = { ["disabled"] = true, }, ["NOTIFICATION_COMBAT_LEAVE"] = { ["disabled"] = true, }, ["NOTIFICATION_POWER_GAIN"] = { ["disabled"] = true, }, ["NOTIFICATION_CP_FULL"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["NOTIFICATION_ENEMY_BUFF"] = { ["disabled"] = true, }, ["NOTIFICATION_BUFF_STACK"] = { ["disabled"] = true, }, ["NOTIFICATION_EXTRA_ATTACK"] = { ["disabled"] = true, ["fontSize"] = false, }, ["NOTIFICATION_COOLDOWN"] = { ["disabled"] = true, ["fontSize"] = 16, }, ["NOTIFICATION_ITEM_BUFF"] = { ["disabled"] = true, }, ["NOTIFICATION_CP_GAIN"] = { ["disabled"] = true, }, ["PET_OUTGOING_EVADE"] = { ["fontSize"] = false, }, ["NOTIFICATION_HONOR_GAIN"] = { ["disabled"] = true, }, ["NOTIFICATION_DEBUFF"] = { ["disabled"] = true, }, ["NOTIFICATION_NPC_KILLING_BLOW"] = { ["fontSize"] = false, }, }, ["cooldownThreshold"] = 60, ["hideNames"] = true, ["normalFontName"] = "ShestakUI", ["healThreshold"] = 1000, ["qualityExclusions"] = { true, -- [1] }, }, }, } MSBT_SavedMedia = { ["fonts"] = { ["ShestakUI"] = "Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Pixel.ttf", }, ["sounds"] = { }, } end ---------------------------------------------------------------------------------------- -- Skada settings ---------------------------------------------------------------------------------------- local UploadSkada = function() if SkadaDB then table.wipe(SkadaDB) end SkadaDB = { ["profiles"] = { ["Default"] = { ["windows"] = { { ["barslocked"] = true, ["barwidth"] = 217, ["barheight"] = 12, ["barspacing"] = 7, ["background"] = { ["color"] = { ["a"] = 0, }, ["height"] = 132, }, ["point"] = "BOTTOMRIGHT", ["x"] = -247, ["y"] = 1, ["title"] = { ["height"] = 12, }, }, }, ["icon"] = { ["hide"] = true, }, }, }, } end StaticPopupDialogs.SETTINGS_ALL = { text = L_POPUP_SETTINGS_ALL, button1 = ACCEPT, button2 = CANCEL, OnAccept = function() if IsAddOnLoaded("DBM-Core") and C.skins.dbm then T.UploadDBM() end if IsAddOnLoaded("BigWigs") and C.skins.bigwigs then T.UploadBW() end if IsAddOnLoaded("MikScrollingBattleText") then UploadMSBT() end if IsAddOnLoaded("Skada") then UploadSkada() end ReloadUI() end, timeout = 0, whileDead = 1, hideOnEscape = true, preferredIndex = 5, } SlashCmdList.SETTINGS = function(msg) if msg == "dbm" then if IsAddOnLoaded("DBM-Core") then if C.skins.dbm == true then StaticPopup_Show("SETTINGS_DBM") else print("|cffffff00"..L_INFO_SKIN_DISABLED1.."DBM"..L_INFO_SKIN_DISABLED2.."|r") end else print("|cffffff00DBM"..L_INFO_NOT_INSTALLED.."|r") end elseif msg == "bw" then if IsAddOnLoaded("BigWigs") then if C.skins.bigwigs == true then StaticPopup_Show("SETTINGS_BIGWIGS") else print("|cffffff00"..L_INFO_SKIN_DISABLED1.."BigWigs"..L_INFO_SKIN_DISABLED2.."|r") end else print("|cffffff00BigWigs"..L_INFO_NOT_INSTALLED.."|r") end elseif msg == "msbt" then if IsAddOnLoaded("MikScrollingBattleText") then UploadMSBT() ReloadUI() else print("|cffffff00MSBT"..L_INFO_NOT_INSTALLED.."|r") end elseif msg == "skada" then if IsAddOnLoaded("Skada") then UploadSkada() ReloadUI() else print("|cffffff00Skada"..L_INFO_NOT_INSTALLED.."|r") end elseif msg == "all" then StaticPopup_Show("SETTINGS_ALL") else print("|cffffff00"..L_INFO_SETTINGS_DBM.."|r") print("|cffffff00"..L_INFO_SETTINGS_BIGWIGS.."|r") print("|cffffff00"..L_INFO_SETTINGS_MSBT.."|r") print("|cffffff00"..L_INFO_SETTINGS_SKADA.."|r") print("|cffffff00"..L_INFO_SETTINGS_ALL.."|r") end end SLASH_SETTINGS1 = "/settings" ================================================ FILE: ShestakUI/Libs/LitePanels/Layout.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- LitePanels configuration file -- BACKUP THIS FILE BEFORE UPDATING! ---------------------------------------------------------------------------------------- lpanels:CreateLayout("Load For All", { -- AFK panel { name = "AFK", anchor_to = "TOP", y_off = -210, width = 180 + (C.font.stats_font_size - 8), height = 75 + ((C.font.stats_font_size - 8) * 5), text = { { string = L_PANELS_AFK, anchor_to = "TOP", y_off = -10, shadow = 0, outline = 3, font = C.font.stats_font, size = C.font.stats_font_size, }, { string = function() if afk_timer then local secs = mod(time() - afk_timer, 60) local mins = floor((time() - afk_timer) / 60) return format("%s:%02.f", mins, secs) end end, update = 0.1, shadow = 0, outline = 3, font = C.font.stats_font, size = C.font.stats_font_size * 2, anchor_to = "CENTER", color = "1 0.1 0.1" }, { string = L_PANELS_AFK_RCLICK, anchor_to = "BOTTOM", y_off = 13 + (C.font.stats_font_size - 8), shadow = 0, outline = 3, font = C.font.stats_font, size = C.font.stats_font_size, }, { string = L_PANELS_AFK_LCLICK, anchor_to = "BOTTOM", y_off = 3, shadow = 0, outline = 3, font = C.font.stats_font, size = C.font.stats_font_size, } }, OnLoad = function(self) self:RegisterEvent("PLAYER_FLAGS_CHANGED") self:SetTemplate("Transparent") self:Hide() self:SetWidth(self.text4:GetWidth() + 20) end, OnEvent = function(self) if UnitIsAFK("player") and not afk_timer then self.text2:SetText("0:00") afk_timer = time() self:Show() elseif not UnitIsAFK("player") then self:Hide() afk_timer = nil end end, OnClick = function(self, b) self:Hide() if b == "LeftButton" then SendChatMessage("", "AFK") end end, OnEnter = function(self) self:SetBackdropBorderColor(unpack(C.media.classborder_color)) end, OnLeave = function(self) self:SetBackdropBorderColor(unpack(C.media.border_color)) end }, }) lpanels:ApplyLayout(nil, "Load For All") ================================================ FILE: ShestakUI/Libs/LitePanels/LitePanels.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Based on LitePanels(by Katae) ---------------------------------------------------------------------------------------- local lp, hidden, deps = CreateFrame("Frame", "lp_C"), {}, {} lp:Hide() lpanels = { profile = {}, temp = {}, cinfo = { n = strlower(UnitName("player")), r = strlower(gsub(GetRealmName(), " ", "")), c = strlower(select(2, UnitClass("player"))) }, defaults = { parent = "UIParent", strata = "BACKGROUND", anchor_to = "BOTTOMLEFT", anchor_from = "BOTTOMLEFT", x_off = 0, y_off = 0, height = 0, width = 0, text = { string = "", font = "Fonts/FRIZQT__.TTF", size = 12, justify_h = "CENTER", justify_v = "MIDDLE", anchor_to = "CENTER", anchor_from = "CENTER", x_off = 0, y_off = 0, color = "1 1 1", alpha = 1, shadow = {color = "0 0 0", alpha = 1, y = -1, x = 1}, } }, events = {"OnEvent", "OnUpdate", "OnResize", "OnClick", "OnDoubleClick", "OnMouseUp", "OnMouseDown", "OnEnter", "OnLeave", "OnHide", "OnShow"}, defaultv = {"anchor_to", "x_off", "y_off", "width", "height", "strata"}, } local gsub = string.gsub local strmatch = string.match local type = type local floor = math.floor local unpack = unpack local pairs = pairs local ipairs = ipairs local IsAddOnLoaded = IsAddOnLoaded local hooksecurefunc = hooksecurefunc local r, is = function(n, dec) return floor(n * (10 ^ (dec or 0)) + 0.5) end, function(v, t) return type(v) == t end local d = lpanels.defaults local class = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[strupper(lpanels.cinfo.c)] local function setcolor(color) if color == "CLASS" then return class.r, class.g, class.b elseif is(color, "string") then return strmatch(color, "([%d%.]+)%s+([%d%.]+)%s+([%d%.]+)") else return unpack(color) end end ---------------------------------------------------------------------------------------- -- API: lpanels:CreateLayout("Layout Name", { _layout code_ } -- » arg1 - Layout name. Name can be anything at all. -- » arg2 - Table with your layout code, can also be set as a variable. function lpanels:CreateLayout(name, layout) if name and layout then self.profile[name] = layout or {} end end ---------------------------------------------------------------------------------------- -- API: lpanels:ApplyLayout("n:Character r:Realm c:Class", "layout1", "layout2") -- » arg1 - Profile string: May be set to any combination of n:ame, r:ealm, c:lass, -- separated by a single space. If nil, applies the specified layouts to all -- characters. Additionally, a dash may be applied to front of the -- condition (-n:ame -r:ealm -c:lass) to make the layout NOT load on the specified -- value. The profile string is *not* CASE-sensitive. -- » arg2,... - Layout names created by CreateLayout() to apply to this profile. No set -- limit to how many layouts can be applied per profile. function lpanels:MatchProf(profile, AND) local apply = false for a, str in gmatch(profile, "(%-?[nrc]):([^%s]+)") do if strmatch(self.cinfo[strlower(strsub(a, -1, -1))], strlower(str)) then if strmatch(a, "^%-") then return false else apply = true end elseif strmatch(a, "^%-") then apply = true elseif AND then return false end end return apply end function lpanels:ApplyLayout(profile, ...) if not profile or profile == "" then profile = "n:"..self.cinfo.n end while strfind(profile, "%(.-%)") do for prof in gmatch(profile, "%(([^%(]-)%)") do profile = gsub(profile, "%("..gsub(prof, "%-", "%%%-").."%)", self:MatchProf(prof, 1) and "n:"..self.cinfo.n or "n:x") end end if self:MatchProf(profile) then for _, name in ipairs{...} do if self.profile[name] then for _, f in ipairs(self.profile[name]) do self.profile[#self.profile + 1] = f end end self.profile[name] = nil end end end ---------------------------------------------------------------------------------------- -- Core function lpanels.RegisterEvent(self, event) if event == "PLAYER_LOGIN" then lpanels.temp.OnEvent(self, "PLAYER_LOGIN") end end local function Resize(panel, width, height) if width and height and (strmatch(width, "%d+%%") or strmatch(height, "%d+%%")) then -- Resize based on the panel's anchor frame or parent if no anchor local _, parent = panel:GetPoint() local function hook(_, _width, _height) if strmatch(width, "%%") then panel:SetWidth(_width * strmatch(width,"(%d+)%%") * 0.01 + (strmatch(width, "%%%s([%+%-]%d+)") or 0)) end if strmatch(height, "%%") then panel:SetHeight(_height * strmatch(height,"(%d+)%%") * 0.01 + (strmatch(height, "%%.*([%+%-]%d+)") or 0)) end end parent:HookScript("OnSizeChanged", hook) end end function lpanels:MakePanel(f) -- Setting a few defaults for _, attr in ipairs(self.defaultv) do if not f[attr] then f[attr] = d[attr] end end -- Setting parent/anchor local origparent, origanchor for _, frame in pairs{f.parent, f.anchor_frame} do if is(frame, "string") and not _G[frame] then if not hidden[frame] then hidden[frame] = {} end tinsert(hidden[frame], f.name) f.parent, origparent, origanchor, f.anchor_frame = "lp_C", f.parent, f.anchor_frame end end f.parent = _G[f.parent] or _G[d.parent] -- Create frame; object name will be LP_PanelName or LP_i if anonymous local panel = CreateFrame("Frame", f.name, f.parent) panel.bg = panel:CreateTexture(nil, "BACKGROUND") -- Inserting some data into frame table if f.parent == lp_C then panel.parent, panel.anchor_frame, panel.strata, panel.level = origparent, origanchor, f.strata, f.level end panel.width, panel.height = f.width, f.height -- Hide dependant frames, will show later for late loading addons if f.require and not IsAddOnLoaded(f.require) then deps[f.name] = f.require panel:Hide() end -- Set positions panel:SetParent(f.parent) panel:ClearAllPoints() if strmatch(f.x_off, "%%") then f.x_off = (_G[f.anchor_frame] or f.parent):GetWidth() * strmatch(f.x_off,"(%d+)%%") * 0.01 end if strmatch(f.y_off, "%%") then f.y_off = (_G[f.anchor_frame] or f.parent):GetHeight() * strmatch(f.y_off,"(%d+)%%") * 0.01 end panel:SetPoint(strupper(f.anchor_to), _G[f.anchor_frame] or f.parent, strupper(f.anchor_from or f.anchor_to), f.x_off, f.y_off) if f.scale then panel:SetScale(f.scale) end -- Height, width if f.parent ~= lp then Resize(panel, f.width, f.height) end panel:SetWidth(strmatch(f.width, "%%") and (_G[f.anchor_frame] or f.parent):GetWidth() * strmatch(f.width, "(%d+)%%") * 0.01 or f.width) panel:SetHeight(strmatch(f.height, "%%") and (_G[f.anchor_frame] or f.parent):GetHeight() * strmatch(f.height, "(%d+)%%") * 0.01 or f.height) -- Strata, level panel:SetFrameStrata(f.strata or d.strata) if f.level then panel:SetFrameLevel(f.level) end -- Texts if f.text then -- If f.text contains multiple tables, treat those tables as multiple text objects; name them self.text1, text2, text3, ... f.text = is(f.text[1], "table") and f.text or {f.text} for i, t in ipairs(f.text) do if #f.text == 1 then i = "" end if is(t, "string") then t = {string = t} end panel["text"..i] = panel:CreateFontString(nil, "OVERLAY") local text = panel["text"..i] -- Keep text string and frame height/width the same if nil if i == "" and (not f.width or not f.height or f.width == 0 or f.height == 0) then local function settext() panel:SetWidth(text:GetStringWidth()) panel:SetHeight(text:GetStringHeight()) end hooksecurefunc(text, "SetText", settext) end -- Texts font if t.font and not strmatch(t.font, "[/\\]") then t.font = C.font.stats_font end local flags = C.font.stats_font_style if t.mono then flags = (flags and flags..", " or "").."MONOCHROME" end text:SetFont(t.font or d.text.font, t.size or d.text.size, flags) if not text:GetFont() then -- handle invalid font error text:SetFont(d.text.font, t.size or d.text.size, flags) print("|cffffffffLite|cff66C6FFPanels |cffff5555Font invalid:", strmatch(t.font, "([^/\\]+)$")) end -- Texts string if not t.string then t.string = d.text.string end text:SetText(tostring(is(t.string, "function") and t.string(text) or t.string)) -- Texts color local tx_r, tx_g, tx_b = setcolor(t.color or d.text.color) text:SetTextColor(tx_r, tx_g, tx_b, t.alpha or d.text.alpha) -- Texts shadow if (not t.shadow and not t.outline) or (t.shadow and t.shadow ~= 0) then if not t.shadow then t.shadow = d.text.shadow end if is(t.shadow, "number") then t.shadow = {x = t.shadow, y = -t.shadow, alpha = d.text.shadow.alpha} end if is(t.shadow, "table") then local sh_r, sh_g, sh_b = setcolor(t.shadow.color or d.text.shadow.color) text:SetShadowOffset(t.shadow.x or d.text.shadow.x, t.shadow.y or d.text.shadow.y) text:SetShadowColor(sh_r, sh_g, sh_b, t.shadow.alpha or d.text.shadow.alpha) end end -- Texts positioning within panel text:SetJustifyH(t.justify_h or d.text.justify_h) text:SetJustifyV(t.justify_v or d.text.justify_v) text:SetPoint(strupper(t.anchor_to or d.text.anchor_to), panel, strupper(t.anchor_to or t.anchor_from or d.text.anchor_from), t.x_off or d.text.x_off, t.y_off or d.text.y_off) -- If it exists, hook text function to the frame's OnUpdate script if is(t.string, "function") and t.update ~= 0 then text.elapsed = 0 local update, string = t.update or 1, t.string local function OnUpdate(_, u) text.elapsed = text.elapsed + u if text.elapsed > update then text:SetText(string(text)) text.elapsed = 0 end end if not f.OnUpdate then f.OnUpdate = OnUpdate else hooksecurefunc(f, "OnUpdate", OnUpdate) end end end end -- OnLoad handler if f.OnLoad then if f.OnEvent then -- fake PLAYER_LOGIN; it should have already fired hooksecurefunc(panel, "RegisterEvent", self.RegisterEvent) self.temp.OnEvent = f.OnEvent end f.OnLoad(panel) end -- Scripting functions, args passed to layout's function if f.mouse ~= false and (f.mouse or f.OnClick or f.OnMouseDown or f.OnMouseUp or f.OnDoubleClick or f.OnEnter or f.OnLeave) then panel:EnableMouse(true) end for _, action in ipairs(lpanels.events) do local func = f[action] if is(func, "function") then if action == "OnDoubleClick" then panel.timer, panel.button = 0, nil local function hook(self, button) if self.timer and self.timer < time() then self.startTimer = false end if self.timer == time() and self.button == button and self.startTimer then self.startTimer = false func(self, button) else self.startTimer, self.timer, self.button = true, time(), button end end panel:HookScript("OnMouseUp", hook) else if action == "OnUpdate" then panel.elapsed = 0 end panel:HookScript(gsub(gsub(action, "OnClick", "OnMouseUp"), "Resize", "SizeChanged"), func) end end end end function lpanels:Init() if #self.profile == 0 then return end -- Check if parent/anchor names are the names of other panels, then tag with "LP_" for i, f in ipairs(self.profile) do for _, p in ipairs(self.profile) do if f.name ~= nil then if f.name == p.parent then p.parent = "LP_"..p.parent end if f.name == p.anchor_frame then p.anchor_frame = "LP_"..p.anchor_frame end end end f.name = f.name and "LP_"..f.name or "LP_"..i end -- Begin to cycle through user profile and create panels for _, f in ipairs(self.profile) do self:MakePanel(f) end end function lpanels:Exit() r, is, class, setcolor = nil for k in pairs(self) do self[k] = nil end self.reset = 1 self.reset = nil end function lpanels.OnEvent(_, event) if event == "PLAYER_LOGIN" then lpanels:Init() lpanels = lpanels:Exit() elseif event == "ADDON_LOADED" and deps then for frame, addon in pairs(deps) do if IsAddOnLoaded(addon) then _G[frame]:Show() frame = nil end end end end function lpanels.CreateFrame(_, frame) if not hidden[frame] then return end for i, child in ipairs(hidden[frame]) do local panel = _G[child] if not panel.anchor_frame or _G[panel.anchor_frame] then local points = {panel:GetPoint()} points[2] = _G[panel.anchor_frame] or frame panel:SetParent(_G.frame or UIParent) panel:ClearAllPoints() panel:SetPoint(unpack(points)) Resize(panel, panel.width, panel.height) panel:SetFrameStrata(panel.strata) if panel.level then panel:SetFrameLevel(panel.level) end hidden[frame][i] = nil end end if #hidden[frame] == 0 then hidden[frame] = nil end end hooksecurefunc("CreateFrame", lpanels.CreateFrame) lp:RegisterEvent("ADDON_LOADED") lp:RegisterEvent("PLAYER_LOGIN") lp:SetScript("OnEvent", lpanels.OnEvent) ================================================ FILE: ShestakUI/Libs/LiteStats/LiteStats.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Based on LiteStats(by Katae) ---------------------------------------------------------------------------------------- local P = "player" local realm, char, class, layout = GetRealmName(), UnitName(P), select(2, UnitClass(P)), {} -- Tooltip text colors local tthead = {r = 0.40, g = 0.78, b = 1} -- Headers local ttsubh = {r = 0.75, g = 0.90, b = 1} -- Subheaders -- Strata/Level for text objects local strata, level = "MEDIUM", 20 -- Globals local profiles = LPSTAT_PROFILES local font = LPSTAT_FONT local t_icon = LTIPICONSIZE or 20 local IsAltKeyDown = IsAltKeyDown local UpdateMemUse = UpdateAddOnMemoryUsage local format = string.format local strmatch = string.match local strfind = string.find local strtrim = strtrim local unpack = unpack local pairs = pairs local ipairs = ipairs local floor = math.floor local select = select local gsub = gsub -- Config local modules = LPSTAT_CONFIG local clock = modules.Clock local latency = modules.Latency local fps = modules.FPS local friends = modules.Friends local guild = modules.Guild local durability = modules.Durability local experience = modules.Experience local talents = modules.Talents local location = modules.Location local damage = modules.Damage local coords = modules.Coords local ping = modules.Ping local gold = modules.Gold local stats = modules.Stats local stat = modules.Stat local bags = modules.Bags local loot = modules.Loot local nameplates = modules.Nameplates -- Events Reg local function RegEvents(f, l) for _, e in ipairs{strsplit(" ", l)} do f:RegisterEvent(e) end end ------------------------------------------ -- Saved Vars Init / Coords local ls, coordX, coordY, conf, Coords = CreateFrame("Frame"), 0, 0, {} RegEvents(ls, "ADDON_LOADED PLAYER_REGEN_DISABLED PLAYER_REGEN_ENABLED") ls:SetScript("OnEvent", function(_, event, addon) if event == "ADDON_LOADED" and addon == "ShestakUI" then if not ShestakUIStats then ShestakUIStats = {} end if not ShestakUIStats[realm] then ShestakUIStats[realm] = {} end if not ShestakUIStats[realm][char] then ShestakUIStats[realm][char] = {} end conf = ShestakUIStats[realm][char] -- true/false defaults for autosell and autorepair if conf.AutoSell == nil then conf.AutoSell = true end if conf.AutoRepair == nil then conf.AutoRepair = true end if conf.AutoGuildRepair == nil then conf.AutoGuildRepair = true end end end) -- Config missing? if not modules then return end local mapRects, tempVec2D = {}, CreateVector2D(0, 0) local function GetPlayerMapPos(mapID) tempVec2D.x, tempVec2D.y = UnitPosition("player") if not tempVec2D.x then return end local mapRect = mapRects[mapID] if not mapRect then local _, pos1 = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(0, 0)) local _, pos2 = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(1, 1)) if not pos1 or not pos2 then return end mapRect = {pos1, pos2} mapRect[2]:Subtract(mapRect[1]) mapRects[mapID] = mapRect end tempVec2D:Subtract(mapRect[1]) return (tempVec2D.y/mapRect[2].y), (tempVec2D.x/mapRect[2].x) end if modules and ((coords and coords.enabled) or (location and location.enabled)) then ls:SetScript("OnUpdate", function(self, elapsed) self.elapsed = (self.elapsed or 0) + elapsed if self.elapsed >= 0.2 then local unitMap = C_Map.GetBestMapForUnit("player") if unitMap then coordX, coordY = GetPlayerMapPos(unitMap) end self.elapsed = 0 end end) function Coords() return format(coords and coords.fmt or "%.0f, %.0f", coordX and coordX * 100 or 0, coordY and coordY * 100 or 0) end end -- Set profile if profiles then for _, p in ipairs{class,format("%s - %s", char, realm)} do if profiles[p] then for k, v in pairs(profiles[p]) do for _k, _v in pairs(v) do modules[k][_k] = _v end end end end profiles = nil end ------------------------------------------ local function comma_value(n) -- credit http://richard.warburton.it local left, num, right = string.match(n,"^([^%d]*%d)(%d*)(.-)$") return left..(num:reverse():gsub("(%d%d%d)","%1,"):reverse())..right end local function formatgold(style, amount) local gold, silver, copper = floor(amount * 0.0001), floor(mod(amount * 0.01, 100)), floor(mod(amount, 100)) if style == 1 then return (gold > 0 and format("%s|cffffd700%s|r ", comma_value(gold), GOLD_AMOUNT_SYMBOL) or "") .. (silver > 0 and format("%s|cffc7c7cf%s|r ", silver, SILVER_AMOUNT_SYMBOL) or "") .. ((copper > 0 or (gold == 0 and silver == 0)) and format("%s|cffeda55f%s|r", copper, COPPER_AMOUNT_SYMBOL) or "") elseif style == 2 or not style then return format("%.1f|cffffd700%s|r", amount * 0.0001, GOLD_AMOUNT_SYMBOL) elseif style == 3 then return format("|cffffd700%s|r.|cffc7c7cf%s|r.|cffeda55f%s|r", gold, silver, copper) elseif style == 4 then return (gold > 0 and format(GOLD_AMOUNT_TEXTURE, gold, 12, 12) or "") .. (silver > 0 and format(SILVER_AMOUNT_TEXTURE, silver, 12, 12) or "") .. ((copper > 0 or (gold == 0 and silver == 0)) and format(COPPER_AMOUNT_TEXTURE, copper, 12, 12) or "") .. " " elseif style == 5 then return (gold > 0 and format("%s|cffffd700%s|r ", comma_value(gold), GOLD_AMOUNT_SYMBOL) or "") .. (format("%.2d|cffc7c7cf%s|r ", silver, SILVER_AMOUNT_SYMBOL)) .. (format("%.2d|cffeda55f%s|r", copper, COPPER_AMOUNT_SYMBOL)) end end local function zsub(s, ...) local t = {...} for i = 1, #t, 2 do s = gsub(s, t[i], t[i + 1]) end return s end local function abbr(t, s) return t[s] or zsub(_G[strupper(s).."_ONELETTER_ABBR"], "%%d", "", "^%s*", "") end local function fmttime(sec, t) local t = t or {} local d, h, m, s = ChatFrame_TimeBreakDown(floor(sec)) local string = zsub(format(" %dd %dh %dm "..((d == 0 and h == 0) and "%ds" or ""), d, h, m, s), " 0[dhms]", " ", "%s+", " ") string = strtrim(gsub(string, "([dhms])", {d = abbr(t, "day"), h = abbr(t, "hour"), m = abbr(t, "minute"), s = abbr(t, "second")}), " ") return strmatch(string, "^%s*$") and "0"..abbr(t, "second") or string end local function gradient(perc) perc = perc > 1 and 1 or perc < 0 and 0 or perc -- Stay between 0-1 local seg, relperc = math.modf(perc*2) local r1, g1, b1, r2, g2, b2 = select(seg * 3 + 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0) -- R -> Y -> G local r, g, b = r1 + (r2 - r1) * relperc, g1 + (g2 - g1) * relperc, b1 + (b2 - b1) * relperc return format("|cff%02x%02x%02x", r * 255, g * 255, b * 255), r, g, b end local function HideTT(self) GameTooltip:Hide() self.hovered = false end local pxpx = {height = 1, width = 1} local function Inject(name, stat) if not name then return end if not stat then stat = pxpx end local m = modules[name] for k, v in pairs{ -- retrieving config variables from LPSTAT_CONFIG --name = name, anchor_frame = m.anchor_frame, name = name, parent = m.anchor_frame, anchor_to = m.anchor_to, anchor_from = m.anchor_from, x_off = m.x_off, y_off = m.y_off, height = m.height, width = m.width, strata = m.strata or strata, level = level } do if not stat[k] then stat[k] = v end end if not stat.text then stat.text = {} end -- retrieve font variables and insert them into text table for k,v in pairs(font) do if not stat.text[k] then stat.text[k] = m[k] or v end end if stat.OnEnter then if stat.OnLeave then hooksecurefunc(stat, "OnLeave", HideTT) else stat.OnLeave = HideTT end end tinsert(layout, stat) end -- Inject dummy frames for disabled modules for name, conf in pairs(modules) do if not conf.enabled then Inject(name) end end local function AltUpdate(self) if not self.hovered then return end if IsAltKeyDown() and not self.altdown then self.altdown = true self:GetScript("OnEnter")(self) elseif not IsAltKeyDown() and self.altdown then self.altdown = false self:GetScript("OnEnter")(self) end end local menuFrame = CreateFrame("Frame", "ContactDropDownMenu", UIParent, "UIDropDownMenuTemplate") local menuList = { {text = OPTIONS_MENU, isTitle = true, notCheckable = true}, {text = INVITE, hasArrow = true, notCheckable = true}, {text = CHAT_MSG_WHISPER_INFORM, hasArrow = true, notCheckable = true} } SLASH_LSTATS1, SLASH_LSTATS2, SLASH_LSTATS3 = "/ls", "/lstats", "/litestats" local function slprint(...) local m, l = "|cffbcee68", "|cffff9912 -|r" local t = {...} print(m, t[1]) for i = 2, #t do print(l, t[i]) end end function SlashCmdList.LSTATS() print("Lite|cff66C6FFStats|r "..L_STATS_TIPS) if clock.enabled then slprint(TIMEMANAGER_TITLE, L_STATS_OPEN_CALENDAR, L_STATS_RC_TIME_MANAGER, L_STATS_TOGGLE_TIME) end if fps.enabled then slprint(L_STATS_MEMORY, L_STATS_RC_COLLECTS_GARBAGE) end if friends.enabled or guild.enabled then slprint(format("%s/%s", FRIENDS, GUILD), L_STATS_VIEW_NOTES, L_STATS_CHANGE_SORTING) end if durability.enabled then slprint(DURABILITY, L_STATS_OPEN_CHARACTER, L_STATS_RC_AUTO_REPAIRING1, L_STATS_RC_AUTO_REPAIRING2, L_STATS_EQUIPMENT_CHANGER) end if experience.enabled then slprint(format("%s/%s/%s", COMBAT_XP_GAIN, TIME_PLAYED_MSG, FACTION), L_STATS_RC_EXPERIENCE, L_STATS_WATCH_FACTIONS, L_STATS_TOOLTIP_EXPERIENCE, L_STATS_TOOLTIP_TIME_PLAYED) end if talents.enabled then slprint(TALENTS, L_STATS_OPEN_TALENT, L_STATS_RC_TALENT) end if location.enabled or coords.enabled then slprint(L_STATS_LOCATION, L_STATS_WORLD_MAP, L_STATS_INSERTS_COORDS) end if gold.enabled then slprint(strtrim(gsub(MONEY, "%%d", "")), L_STATS_OPEN_CURRENCY, L_STATS_RC_AUTO_SELLING, L_STATS_NEED_TO_SELL, L_STATS_WATCH_CURRENCY) end print("|cffBCEE68", format(L_STATS_OTHER_OPTIONS, "|cff66C6FFShestakUI\\Config\\DataText.lua").."|r") end CreateFrame("Frame", "LSMenus", UIParent, "UIDropDownMenuTemplate") ---------------------------------------------------------------------------------------- -- Clock ---------------------------------------------------------------------------------------- if clock.enabled then local CALENDAR_MONTH_NAMES = { MONTH_JANUARY, MONTH_FEBRUARY, MONTH_MARCH, MONTH_APRIL, MONTH_MAY, MONTH_JUNE, MONTH_JULY, MONTH_AUGUST, MONTH_SEPTEMBER, MONTH_OCTOBER, MONTH_NOVEMBER, MONTH_DECEMBER, } Inject("Clock", { text = { string = function() return zsub(GameTime_GetTime(true), "%s*AM", clock.AM, "%s*PM", clock.PM, ":", clock.colon) end }, OnLoad = function(self) RequestRaidInfo() RegEvents(self, "UPDATE_INSTANCE_INFO") end, OnEvent = function(self) if self.hovered then self:GetScript("OnEnter")(self) end end, OnEnter = function(self) if not self.hovered then RequestRaidInfo() self.hovered = true end local currentCalendarTime = C_DateAndTime.GetCurrentCalendarTime() local weekday = CALENDAR_WEEKDAY_NAMES[currentCalendarTime.weekday] local month = CALENDAR_MONTH_NAMES[currentCalendarTime.month] local fullDate = format(FULLDATE, weekday, month, currentCalendarTime.monthDay, currentCalendarTime.year, currentCalendarTime.month) GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(clock.tip_anchor, clock.tip_frame, clock.tip_x, clock.tip_y) GameTooltip:ClearLines() GameTooltip:AddLine(fullDate, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(gsub(TIMEMANAGER_TOOLTIP_LOCALTIME, ":", ""), zsub(GameTime_GetLocalTime(true), "%s*AM", "am", "%s*PM", "pm"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(gsub(TIMEMANAGER_TOOLTIP_REALMTIME, ":", ""), zsub(GameTime_GetGameTime(true), "%s*AM", "am", "%s*PM", "pm"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) local titleName for i = 1, GetNumSavedInstances() do local name, _, reset, difficulty, locked, extended, _, isRaid, maxPlayers, _, numEncounters, encounterProgress = GetSavedInstanceInfo(i) if isRaid and (locked or extended) or maxPlayers == 5 and difficulty == 23 and (locked or extended) then local tr, tg, tb, diff if not titleName then GameTooltip:AddLine(" ") GameTooltip:AddLine(GROUP_FINDER, ttsubh.r, ttsubh.g, ttsubh.b) titleName = true end if extended then tr, tg, tb = 0.3, 1, 0.3 else tr, tg, tb = 1, 1, 1 end local _, _, isHeroic, _, displayHeroic, displayMythic = GetDifficultyInfo(difficulty) if displayMythic then diff = "M" elseif isHeroic or displayHeroic then diff = "H" end if (numEncounters and numEncounters > 0) and (encounterProgress and encounterProgress > 0) then GameTooltip:AddDoubleLine(format("%s |cffaaaaaa[%s%s] (%s/%s)", name, maxPlayers, diff or "", encounterProgress, numEncounters), fmttime(reset), 1, 1, 1, tr, tg, tb) else GameTooltip:AddDoubleLine(format("%s |cffaaaaaa[%s%s]", name, maxPlayers, diff or ""), fmttime(reset), 1, 1, 1, tr, tg, tb) end end end local addedLine for i = 1, GetNumSavedWorldBosses() do local name, _, reset = GetSavedWorldBossInfo(i) if reset then if not addedLine then GameTooltip:AddLine(" ") GameTooltip:AddLine(RAID_INFO_WORLD_BOSS, ttsubh.r, ttsubh.g, ttsubh.b) addedLine = true end GameTooltip:AddDoubleLine(name, fmttime(reset), 1, 1, 1, 1, 1, 1) end end -- In 9.0 seals not available -- if T.level == MAX_PLAYER_LEVEL then -- local c = 0 -- for _, q in ipairs({52834, 52835, 52837, 52838, 52839, 52840}) do -- if C_QuestLog.IsQuestFlaggedCompleted(q) then -- c = c + 1 -- end -- end -- local max = 2 -- local r, g, b = 1, 1, 1 -- if c == 0 then -- r, g, b = 1, 0, 0 -- elseif c == 1 then -- r, g, b = 1, 1, 0 -- end -- GameTooltip:AddLine(" ") -- GameTooltip:AddLine(MISCELLANEOUS, ttsubh.r, ttsubh.g, ttsubh.b) -- GameTooltip:AddDoubleLine(L_STATS_SEALS, format("%s/%s", c, max), 1, 1, 1, r, g, b) -- end GameTooltip:Show() end, OnClick = function(_, b) (b == "RightButton" and ToggleTimeManager or ToggleCalendar)() end }) end ---------------------------------------------------------------------------------------- -- Latency ---------------------------------------------------------------------------------------- if latency.enabled then Inject("Latency", { text = { string = function() local _, _, latencyHome, latencyWorld = GetNetStats() local lat = math.max(latencyHome, latencyWorld) return format(gsub(latency.fmt, "%[color%]", (gradient(1 - lat / 750))), lat) end }, OnEnter = function(self) local _, _, latencyHome, latencyWorld = GetNetStats() local latency = format(MAINMENUBAR_LATENCY_LABEL, latencyHome, latencyWorld) GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(modules.Latency.tip_anchor, modules.Latency.tip_frame, modules.Latency.tip_x, modules.Latency.tip_y) GameTooltip:ClearLines() GameTooltip:AddLine(latency, tthead.r, tthead.g, tthead.b) GameTooltip:Show() end, }) end ---------------------------------------------------------------------------------------- -- FPS ---------------------------------------------------------------------------------------- if fps.enabled then local function sortdesc(a, b) return a[2] > b[2] end local function formatmem(val, dec) return format(format("%%.%df %s", dec or 1, val > 1024 and "MB" or "KB"), val / (val > 1024 and 1024 or 1)) end local memoryt = {} local function UpdateMemory() local totalMemory = 0 UpdateMemUse() wipe(memoryt) for i = 1, GetNumAddOns() do local memory = GetAddOnMemoryUsage(i) local addon, name = GetAddOnInfo(i) if IsAddOnLoaded(i) then tinsert(memoryt, {name or addon, memory}) end totalMemory = totalMemory + memory end table.sort(memoryt, sortdesc) return totalMemory end local startTime C_Timer.After(0.25, function() ResetCPUUsage() startTime = GetTime() end) local cput = {} local lastCPU = {} local function UpdateCPU() local totalCPU = 0 UpdateAddOnCPUUsage() wipe(cput) for i = 1, GetNumAddOns() do local cpu = GetAddOnCPUUsage(i) local addon, name = GetAddOnInfo(i) local cpus = cpu / (GetTime() - startTime) local cpur = cpu - (lastCPU[i] and lastCPU[i] or cpu) lastCPU[i] = cpu if IsAddOnLoaded(i) then tinsert(cput, {name or addon, cpu, cpus, cpur}) end totalCPU = totalCPU + cpu end table.sort(cput, sortdesc) return totalCPU end local isCPU = GetCVar("scriptProfile") == "1" Inject("FPS", { text = { string = function(self) local parent = self:GetParent() if parent.hovered then self:GetParent():GetScript("OnEnter")(parent) end return format(fps.fmt, floor(GetFramerate())) end }, OnEnter = function(self) self.hovered = true GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(modules.FPS.tip_anchor, modules.FPS.tip_frame, modules.FPS.tip_x, modules.FPS.tip_y) GameTooltip:ClearLines() local lat, r = select(4, GetNetStats()), 750 local totalMemory = UpdateMemory() local totalCPU = isCPU and UpdateCPU() GameTooltip:AddDoubleLine( format("|cffffffff%s|r %s, %s%s|r %s", floor(GetFramerate()), FPS_ABBR, gradient(1 - lat / r), lat, MILLISECONDS_ABBR), format("%s: |cffffffff%s", ADDONS, formatmem(totalMemory)), tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") if fps.max_addons ~= 0 or IsAltKeyDown() then local ctable if isCPU and not IsControlKeyDown() then ctable = cput else ctable = memoryt end local exmem = 0 for i, t in ipairs(ctable) do if fps.max_addons and i > fps.max_addons and not IsAltKeyDown() then exmem = exmem + t[2] else local color = t[2] <= 102.4 and {0,1} -- 0 - 100 or t[2] <= 512 and {0.5,1} -- 100 - 512 or t[2] <= 1024 and {0.75,1} -- 512 - 1mb or t[2] <= 2560 and {1,1} -- 1mb - 2.5mb or t[2] <= 5120 and {1,0.75} -- 2.5mb - 5mb or t[2] <= 8192 and {1,0.5} -- 5mb - 8mb or {1,0.1} -- 8mb + if isCPU and not IsControlKeyDown() then GameTooltip:AddDoubleLine(t[1], format("%d ms (%.2f) | %.2f", t[2], t[3], t[4]), 1, 1, 1, color[1], color[2], 0) else GameTooltip:AddDoubleLine(t[1], formatmem(t[2]), 1, 1, 1, color[1], color[2], 0) end end end if exmem > 0 and not IsAltKeyDown() then local more = #memoryt - fps.max_addons GameTooltip:AddDoubleLine(format("%d %s (%s)", more, L_STATS_HIDDEN, ALT_KEY), formatmem(exmem), ttsubh.r, ttsubh.g, ttsubh.b, ttsubh.r, ttsubh.g, ttsubh.b) end GameTooltip:AddDoubleLine(" ", "--------------", 1, 1, 1, 0.5, 0.5, 0.5) end local bandwidth = GetAvailableBandwidth() if bandwidth ~= 0 then GameTooltip:AddDoubleLine(L_STATS_BANDWIDTH, format("%s ".."Mbps", T.Round(bandwidth, 2)), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(L_STATS_DOWNLOAD, format("%s%%", floor(GetDownloadedPercentage() * 100 + 0.5)), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddLine(" ") end GameTooltip:AddDoubleLine(L_STATS_MEMORY_USAGE, formatmem(gcinfo() - totalMemory), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(L_STATS_TOTAL_MEMORY_USAGE, formatmem(collectgarbage"count"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) if isCPU then GameTooltip:AddDoubleLine(L_STATS_TOTAL_CPU_USAGE, format("%d ms", totalCPU), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) end GameTooltip:Show() end, OnLeave = function(self) self.hovered = false end, OnClick = function(self, button) if button == "RightButton" then UpdateMemUse() local before = gcinfo() collectgarbage() UpdateMemUse() print(format("|cff66C6FF%s:|r %s", L_STATS_GARBAGE_COLLECTED, formatmem(before - gcinfo()))) self.timer, self.text.elapsed = nil, 5 self:GetScript("OnEnter")(self) elseif button == "LeftButton" then if AddonList:IsShown() then AddonList_OnCancel() else PlaySound(SOUNDKIT.IG_MAINMENU_OPTION) ShowUIPanel(AddonList) end end end }) end ---------------------------------------------------------------------------------------- -- Friends ---------------------------------------------------------------------------------------- if friends.enabled then local totalBattleNetOnline = 0 local BNTable = {} local friendTable = {} local BNTableEnter = {} local function BuildFriendTable(total) wipe(friendTable) for i = 1, total do local info = C_FriendList.GetFriendInfoByIndex(i) if info and info.connected then local class = info.className local status = "" if info.dnd then status = CHAT_FLAG_DND elseif info.afk then status = CHAT_FLAG_AFK end for k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do if class == v then class = k end end if GetLocale() ~= "enUS" then for k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do if class == v then class = k end end end friendTable[i] = {info.name, info.level, class, info.area, info.connected, status, info.notes} end end table.sort(friendTable, function(a, b) if a[1] and b[1] then return a[1] < b[1] end end) end local function BuildBNTable(total) totalBattleNetOnline = 0 wipe(BNTable) for i = 1, total do local accountInfo = C_BattleNet.GetFriendAccountInfo(i) local class = accountInfo.gameAccountInfo.className for k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do if class == v then class = k end end if GetLocale() ~= "enUS" then for k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do if class == v then class = k end end end BNTable[i] = {accountInfo.bnetAccountID, accountInfo.accountName, accountInfo.battleTag, accountInfo.gameAccountInfo.characterName, accountInfo.gameAccountInfo.gameAccountID, accountInfo.gameAccountInfo.clientProgram, accountInfo.gameAccountInfo.isOnline, accountInfo.isAFK, accountInfo.isDND, accountInfo.note, accountInfo.gameAccountInfo.realmName, accountInfo.gameAccountInfo.factionName, accountInfo.gameAccountInfo.raceName, class, accountInfo.gameAccountInfo.areaName, accountInfo.gameAccountInfo.characterLevel} if accountInfo.gameAccountInfo.isOnline then totalBattleNetOnline = totalBattleNetOnline + 1 end end end local clientTags = { -- [BNET_CLIENT_D3] = "Diablo 3", -- [BNET_CLIENT_D2] = "Diablo 2: Resurrected", -- [BNET_CLIENT_WTCG] = "Hearthstone", -- [BNET_CLIENT_HEROES] = "Heroes of the Storm", -- [BNET_CLIENT_OVERWATCH] = "Overwatch", -- [BNET_CLIENT_SC] = "StarCraft", -- [BNET_CLIENT_SC2] = "StarCraft 2", -- [BNET_CLIENT_DESTINY2] = "Destiny 2", -- [BNET_CLIENT_WC3] = "Warcraft 3: Reforged", -- [BNET_CLIENT_ARCADE] = "Arcade Collection", -- [BNET_CLIENT_CRASH4] = "Crash Bandicoot 4", -- [BNET_CLIENT_COD] = "COD: Black Ops 4", -- [BNET_CLIENT_COD_MW] = "COD: Modern Warfare", -- [BNET_CLIENT_COD_MW2] = "COD: Modern Warfare 2", -- [BNET_CLIENT_COD_BOCW] = "COD: Cold War", -- ["BSAp"] = COMMUNITIES_PRESENCE_MOBILE_CHAT } Inject("Friends", { OnLoad = function(self) RegEvents(self, "PLAYER_LOGIN PLAYER_ENTERING_WORLD GROUP_ROSTER_UPDATE FRIENDLIST_UPDATE BN_FRIEND_LIST_SIZE_CHANGED BN_FRIEND_ACCOUNT_ONLINE BN_FRIEND_ACCOUNT_OFFLINE BN_FRIEND_INFO_CHANGED BN_FRIEND_ACCOUNT_ONLINE BN_FRIEND_ACCOUNT_OFFLINE BN_FRIEND_INFO_CHANGED") end, OnEvent = function(self, event) if event ~= "GROUP_ROSTER_UPDATE" then local numBNetTotal, numBNetOnline = BNGetNumFriends() local numOnline, numTotal = C_FriendList.GetNumOnlineFriends(), C_FriendList.GetNumFriends() local online = numOnline + numBNetOnline local total = numTotal + numBNetTotal self.text:SetText(format(friends.fmt, online, total)) end if self.hovered then self:GetScript("OnEnter")(self) end end, OnUpdate = AltUpdate, OnClick = function(self, b) if b == "MiddleButton" then ToggleIgnorePanel() elseif b == "LeftButton" then ToggleFriendsFrame(1) elseif b == "RightButton" then HideTT(self) local BNTotal = BNGetNumFriends() local total = C_FriendList.GetNumFriends() BuildBNTable(BNTotal) BuildFriendTable(total) local classc, levelc, grouped local menuCountWhispers = 0 local menuCountInvites = 0 menuList[2].menuList = {} menuList[3].menuList = {} if #friendTable > 0 then for i = 1, #friendTable do if UnitInParty(friendTable[i][1]) or UnitInRaid(friendTable[i][1]) then grouped = " |cffaaaaaa*|r" else grouped = "" end classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[friendTable[i][3]], GetQuestDifficultyColor(friendTable[i][2]) if classc == nil then classc = GetQuestDifficultyColor(friendTable[i][2]) end menuCountWhispers = menuCountWhispers + 1 menuList[3].menuList[menuCountWhispers] = { text = format("|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r%s", levelc.r * 255, levelc.g * 255, levelc.b * 255, friendTable[i][2], classc.r * 255, classc.g * 255, classc.b * 255, friendTable[i][1], grouped), arg1 = friendTable[i][1], notCheckable = true, func = function(_, arg1) menuFrame:Hide() SetItemRef("player:"..arg1, ("|Hplayer:%1$s|h[%1$s]|h"):format(arg1), "LeftButton") end } if not (UnitInParty(friendTable[i][1]) or UnitInRaid(friendTable[i][1])) then menuCountInvites = menuCountInvites + 1 menuList[2].menuList[menuCountInvites] = { text = format("|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r", levelc.r * 255, levelc.g * 255, levelc.b * 255, friendTable[i][2], classc.r * 255, classc.g * 255, classc.b * 255, friendTable[i][1]), arg1 = friendTable[i][1], notCheckable = true, func = function(_, arg1) menuFrame:Hide() C_PartyInfo.InviteUnit(arg1) end } end end end if totalBattleNetOnline > 0 then for i = 1, #BNTable do if BNTable[i][7] then if UnitInParty(BNTable[i][4]) or UnitInRaid(BNTable[i][4]) then grouped = " |cffaaaaaa*|r" else grouped = "" end menuCountWhispers = menuCountWhispers + 1 menuList[3].menuList[menuCountWhispers] = { text = BNTable[i][2]..grouped, arg1 = BNTable[i][2], notCheckable = true, func = function(_, arg1) menuFrame:Hide() ChatFrame_SendBNetTell(arg1) end } if BNTable[i][6] == BNET_CLIENT_WOW and UnitFactionGroup("player") == BNTable[i][12] then if not (UnitInParty(BNTable[i][4]) or UnitInRaid(BNTable[i][4])) then classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[BNTable[i][14]], GetQuestDifficultyColor(BNTable[i][16]) if classc == nil then classc = GetQuestDifficultyColor(BNTable[i][16]) end menuCountInvites = menuCountInvites + 1 menuList[2].menuList[menuCountInvites] = { text = format("|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r", levelc.r * 255, levelc.g * 255, levelc.b * 255, BNTable[i][16], classc.r * 255, classc.g * 255, classc.b * 255, BNTable[i][4]), arg1 = BNTable[i][5], notCheckable = true, func = function(_, arg1) menuFrame:Hide() BNInviteFriend(arg1) end } end end end end end EasyMenu(menuList, menuFrame, self, 0, 0, "MENU") end end, OnEnter = function(self) C_FriendList.ShowFriends() self.hovered = true local online, total = C_FriendList.GetNumOnlineFriends(), C_FriendList.GetNumFriends() local status, classc, levelc, zone_r, zone_g, zone_b, grouped, realm_r, realm_g, realm_b local BNonline, BNtotal = 0, BNGetNumFriends() wipe(BNTableEnter) if BNtotal > 0 then for i = 1, BNtotal do local accountInfo = C_BattleNet.GetFriendAccountInfo(i) if accountInfo then BNTableEnter[i] = {accountInfo, accountInfo.gameAccountInfo.clientProgram} if accountInfo.gameAccountInfo.isOnline then BNonline = BNonline + 1 end end end end local totalonline = online + BNonline local totalfriends = total + BNtotal if online > 0 or BNonline > 0 then GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(modules.Friends.tip_anchor, modules.Friends.tip_frame, modules.Friends.tip_x, modules.Friends.tip_y) GameTooltip:ClearLines() GameTooltip:AddDoubleLine(FRIENDS_LIST, format("%s: %s/%s", GUILD_ONLINE_LABEL, totalonline, totalfriends), tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b) if online > 0 then GameTooltip:AddLine(" ") GameTooltip:AddLine(WOW_FRIEND) for i = 1, total do local info = C_FriendList.GetFriendInfoByIndex(i) local name = info.name local level = info.level local class = info.className local zone = info.area local connected = info.connected local status = "" if info.dnd then status = CHAT_FLAG_DND elseif info.afk then status = CHAT_FLAG_AFK end local note = info.notes if not connected then break end if GetRealZoneText() == zone then zone_r, zone_g, zone_b = 0.3, 1.0, 0.3 else zone_r, zone_g, zone_b = 0.65, 0.65, 0.65 end for k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do if class == v then class = k end end if GetLocale() ~= "enUS" then for k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do if class == v then class = k end end end classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class], GetQuestDifficultyColor(level) if not classc then classc = {r = 1, g = 1, b = 1} end grouped = (UnitInParty(name) or UnitInRaid(name)) and (GetRealZoneText() == zone and " |cff7fff00*|r" or " |cffff7f00*|r") or "" GameTooltip:AddDoubleLine(format("|cff%02x%02x%02x%d|r %s%s%s", levelc.r * 255, levelc.g * 255, levelc.b * 255, level, name, grouped, " "..status), zone, classc.r, classc.g, classc.b, zone_r, zone_g, zone_b) if self.altdown and note then GameTooltip:AddLine(" "..note, ttsubh.r, ttsubh.g, ttsubh.b, 1) end end end if BNonline > 0 then GameTooltip:AddLine(" ") GameTooltip:AddLine(BATTLENET_FRIEND) for i = 1, #BNTableEnter do local accountInfo = BNTableEnter[i][1] local isOnline = accountInfo.gameAccountInfo.isOnline local client = accountInfo.gameAccountInfo.clientProgram if isOnline then if client == BNET_CLIENT_WOW then if accountInfo.isAFK then status = "|cffE7E716"..L_CHAT_AFK.."|r" else if accountInfo.isDND then status = "|cffff0000"..L_CHAT_DND.."|r" else status = "" end end local characterName = accountInfo.gameAccountInfo.characterName local realmName = accountInfo.gameAccountInfo.realmName local class = accountInfo.gameAccountInfo.className local areaName = accountInfo.gameAccountInfo.areaName local level = accountInfo.gameAccountInfo.characterLevel for k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do if class == v then class = k end end if GetLocale() ~= "enUS" then for k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do if class == v then class = k end end end classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class], GetQuestDifficultyColor(level) if not classc then classc = {r = 1, g = 1, b = 1} end if UnitInParty(characterName) or UnitInRaid(characterName) then grouped = " |cffaaaaaa*|r" else grouped = "" end if accountInfo.gameAccountInfo.factionName ~= UnitFactionGroup("player") then grouped = " |cffff0000*|r" end GameTooltip:AddDoubleLine(format("%s (|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r%s) |cff%02x%02x%02x%s|r", client, levelc.r * 255, levelc.g * 255, levelc.b * 255, level, classc.r * 255, classc.g * 255, classc.b * 255, characterName, grouped, 255, 0, 0, status), accountInfo.accountName, 238, 238, 238, 238, 238, 238) if self.altdown then if GetRealZoneText() == areaName then zone_r, zone_g, zone_b = 0.3, 1.0, 0.3 else zone_r, zone_g, zone_b = 0.65, 0.65, 0.65 end if GetRealmName() == realmName then realm_r, realm_g, realm_b = 0.3, 1.0, 0.3 else realm_r, realm_g, realm_b = 0.65, 0.65, 0.65 end GameTooltip:AddDoubleLine(" "..areaName, realmName, zone_r, zone_g, zone_b, realm_r, realm_g, realm_b) end else if client == "App" then client = accountInfo.gameAccountInfo.richPresence else client = clientTags[client] or "" end if accountInfo.gameAccountInfo.isGameAFK then status = "|cffE7E716"..L_CHAT_AFK.."|r" else if accountInfo.gameAccountInfo.isGameBusy then status = "|cffff0000"..L_CHAT_DND.."|r" else status = "" end end GameTooltip:AddDoubleLine("|cffeeeeee"..accountInfo.accountName.."|r".." "..status, "|cffeeeeee"..client.."|r") end end end end GameTooltip:Show() else HideTT(self) end end }) end ---------------------------------------------------------------------------------------- -- Guild ---------------------------------------------------------------------------------------- if guild.enabled then local CURRENT_GUILD_SORTING local guildTable = {} local function BuildGuildTable() wipe(guildTable) for i = 1, GetNumGuildMembers() do local name, rank, _, level, _, zone, note, officernote, connected, status, class, _, _, mobile = GetGuildRosterInfo(i) if not name then break end name = Ambiguate(name, "none") guildTable[i] = {name, rank, level, zone, note, officernote, connected, status, class, mobile} end table.sort(guildTable, function(a, b) if (a and b) then return a[1] < b[1] end end) end Inject("Guild", { text = { string = function() if IsInGuild() then local total, _, online = GetNumGuildMembers() return format(guild.fmt, online, total) else return LOOKINGFORGUILD end end, update = 5 }, OnLoad = function(self) C_GuildInfo.GuildRoster() SortGuildRoster(guild.sorting == "note" and "rank" or "note") SortGuildRoster(guild.sorting) CURRENT_GUILD_SORTING = guild.sorting self:RegisterEvent("GROUP_ROSTER_UPDATE") self:RegisterEvent("GUILD_ROSTER_UPDATE") end, OnEvent = function(self) if self.hovered then self:GetScript("OnEnter")(self) end if IsInGuild() then BuildGuildTable() end end, OnUpdate = function(self, u) if IsInGuild() then AltUpdate(self) if not self.gmotd then if self.elapsed > 1 then C_GuildInfo.GuildRoster(); self.elapsed = 0 end if GetGuildRosterMOTD() ~= "" then self.gmotd = true; if self.hovered then self:GetScript("OnEnter")(self) end end self.elapsed = self.elapsed + u end end end, OnClick = function(self, b) if b == "LeftButton" then ToggleGuildFrame() elseif b == "MiddleButton" and IsInGuild() then local s = CURRENT_GUILD_SORTING if IsShiftKeyDown() and s then SortGuildRoster(s) elseif IsAltKeyDown() then CURRENT_GUILD_SORTING = s == "rank" and "note" or "rank" SortGuildRoster(CURRENT_GUILD_SORTING) else CURRENT_GUILD_SORTING = s == "class" and "name" or s == "name" and "level" or s == "level" and "zone" or "class" SortGuildRoster(CURRENT_GUILD_SORTING) end self:GetScript("OnEnter")(self) elseif b == "RightButton" and IsInGuild() then HideTT(self) local grouped local menuCountWhispers = 0 local menuCountInvites = 0 menuList[2].menuList = {} menuList[3].menuList = {} for i = 1, #guildTable do if (guildTable[i][7] or guildTable[i][10]) and guildTable[i][1] ~= T.name then local classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[guildTable[i][9]], GetQuestDifficultyColor(guildTable[i][3]) if UnitInParty(guildTable[i][1]) or UnitInRaid(guildTable[i][1]) then grouped = "|cffaaaaaa*|r" else grouped = "" if not guildTable[i][10] then menuCountInvites = menuCountInvites + 1 menuList[2].menuList[menuCountInvites] = { text = string.format("|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r %s", levelc.r * 255, levelc.g * 255, levelc.b * 255, guildTable[i][3], classc.r * 255, classc.g * 255, classc.b * 255, Ambiguate(guildTable[i][1], "all"), ""), arg1 = guildTable[i][1], notCheckable = true, func = function(_, arg1) menuFrame:Hide() C_PartyInfo.InviteUnit(arg1) end } end end menuCountWhispers = menuCountWhispers + 1 menuList[3].menuList[menuCountWhispers] = { text = string.format("|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r %s", levelc.r * 255, levelc.g * 255, levelc.b * 255, guildTable[i][3], classc.r * 255, classc.g * 255, classc.b * 255, Ambiguate(guildTable[i][1], "all"), grouped), arg1 = guildTable[i][1], notCheckable = true, func = function(_, arg1) menuFrame:Hide() SetItemRef("player:"..arg1, ("|Hplayer:%1$s|h[%1$s]|h"):format(arg1), "LeftButton") end } end end EasyMenu(menuList, menuFrame, self, 0, 0, "MENU") end end, OnEnter = function(self) if IsInGuild() then self.hovered = true C_GuildInfo.GuildRoster() local name, rank, level, zone, note, officernote, connected, status, class, isMobile, zone_r, zone_g, zone_b, classc, levelc, grouped local total, _, online = GetNumGuildMembers() local gmotd = GetGuildRosterMOTD() GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(modules.Guild.tip_anchor, modules.Guild.tip_frame, modules.Guild.tip_x, modules.Guild.tip_y) GameTooltip:ClearLines() GameTooltip:AddDoubleLine(GetGuildInfo(P),format("%s: %d/%d", GUILD_ONLINE_LABEL, online, total), tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b) if gmotd ~= "" then GameTooltip:AddLine(format("%s |cffaaaaaa- |cffffffff%s", GUILD_MOTD, gmotd), ttsubh.r, ttsubh.g, ttsubh.b, 1) end if guild.maxguild ~= 0 and online >= 1 then GameTooltip:AddLine(" ") for i = 1, total do if guild.maxguild and i > guild.maxguild then if online > 2 then GameTooltip:AddLine(format("%d %s (%s)", online - guild.maxguild, L_STATS_HIDDEN, ALT_KEY), ttsubh.r, ttsubh.g, ttsubh.b) end break end name, rank, _, level, _, zone, note, officernote, connected, status, class, _, _, isMobile = GetGuildRosterInfo(i) if (connected or isMobile) and level >= guild.threshold then name = Ambiguate(name, "all") if GetRealZoneText() == zone then zone_r, zone_g, zone_b = 0.3, 1, 0.3 else zone_r, zone_g, zone_b = 1, 1, 1 end if isMobile then zone = "|cffa5a5a5"..REMOTE_CHAT.."|r" end classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class], GetQuestDifficultyColor(level) grouped = (UnitInParty(name) or UnitInRaid(name)) and (GetRealZoneText() == zone and " |cff7fff00*|r" or " |cffff7f00*|r") or "" if self.altdown then GameTooltip:AddDoubleLine(format("%s%s |cff999999- |cffffffff%s", grouped, name, rank), zone, classc.r, classc.g, classc.b, zone_r, zone_g, zone_b) if note ~= "" then GameTooltip:AddLine(" "..NOTE_COLON.." "..note, ttsubh.r, ttsubh.g, ttsubh.b, 1) end if officernote ~= "" and EPGP then local ep, gp = EPGP:GetEPGP(name) if ep then officernote = " EP: "..ep.." GP: "..gp.." PR: "..string.format("%.3f", ep / gp) else officernote = " O."..NOTE_COLON.." "..officernote end elseif officernote ~= "" then officernote = " O."..NOTE_COLON.." "..officernote end if officernote ~= "" then GameTooltip:AddLine(officernote, 0.3, 1, 0.3, 1) end else if status == 1 then status = " |cffE7E716"..L_CHAT_AFK.."|r" elseif status == 2 then status = " |cffff0000"..L_CHAT_DND.."|r" else status = "" end GameTooltip:AddDoubleLine(format("|cff%02x%02x%02x%d|r %s%s%s", levelc.r * 255, levelc.g * 255, levelc.b * 255, level, name, status, grouped), zone, classc.r, classc.g, classc.b, zone_r, zone_g, zone_b) end end end GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(" ", format("%s %s", L_STATS_SORTING_BY, CURRENT_GUILD_SORTING), 1, 1, 1, ttsubh.r, ttsubh.g, ttsubh.b) end GameTooltip:Show() end end }) end ---------------------------------------------------------------------------------------- -- Durability ---------------------------------------------------------------------------------------- if durability.enabled then Inject("Durability", { OnLoad = function(self) if durability.man then DurabilityFrame.Show = DurabilityFrame.Hide end RegEvents(self, "UPDATE_INVENTORY_DURABILITY MERCHANT_SHOW PLAYER_LOGIN") end, OnEvent = function(self, event) if event == "UPDATE_INVENTORY_DURABILITY" or event == "PLAYER_LOGIN" then local dmin = 100 for id = 1, 18 do local dur, dmax = GetInventoryItemDurability(id) if dur ~= dmax then dmin = floor(min(dmin, dur / dmax * 100)) end end self.text:SetText(format(gsub(durability.fmt, "%[color%]", (gradient(dmin / 100))), dmin)) elseif event == "MERCHANT_SHOW" and not (IsAltKeyDown() or IsShiftKeyDown()) then if conf.AutoRepair and CanMerchantRepair() then local cost, total = GetRepairAllCost(), 0 if cost > 0 then if conf.AutoGuildRepair and CanGuildBankRepair() then RepairAllItems(1) total = cost end if GetRepairAllCost() > 0 then if not durability.ignore_inventory and GetRepairAllCost() <= GetMoney() then total = GetRepairAllCost(); RepairAllItems() else for id = 1, 18 do local data = C_TooltipInfo.GetInventoryItem(P, id) if data then local argVal = data.args and data.args[7] if argVal and argVal.field == "repairCost" then local cost = argVal.intVal if cost ~= 0 and cost <= GetMoney() then if not InRepairMode() then ShowRepairCursor() end PickupInventoryItem(id) total = total + cost end end end end end HideRepairCursor() end if total > 0 then print(format("|cff66C6FF%s |cffFFFFFF%s", REPAIR_COST, formatgold(1, total))) end end end end end, OnEnter = function(self) GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(modules.Durability.tip_anchor, modules.Durability.tip_frame, modules.Durability.tip_x, modules.Durability.tip_y) GameTooltip:ClearLines() if C.tooltip.average_lvl == true then local avgItemLevel, avgItemLevelEquipped = GetAverageItemLevel() avgItemLevel = floor(avgItemLevel) avgItemLevelEquipped = floor(avgItemLevelEquipped) GameTooltip:AddDoubleLine(DURABILITY, STAT_AVERAGE_ITEM_LEVEL..": "..avgItemLevelEquipped.." / "..avgItemLevel, tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b) else GameTooltip:AddLine(DURABILITY, tthead.r, tthead.g, tthead.b) end GameTooltip:AddLine(" ") local nodur, totalcost = true, 0 for slot, string in gmatch("1HEAD3SHOULDER5CHEST6WAIST7LEGS8FEET9WRIST10HANDS16MAINHAND17SECONDARYHAND", "(%d+)([^%d]+)") do local dur, dmax = GetInventoryItemDurability(slot) local string = _G[string.."SLOT"] if dur ~= dmax then local perc = dur ~= 0 and dur/dmax or 0 local hex = gradient(perc) GameTooltip:AddDoubleLine(durability.gear_icons and format("|T%s:"..t_icon..":"..t_icon..":0:0:64:64:5:59:5:59:%d|t %s", GetInventoryItemTexture(P, slot), t_icon, string) or string,format("|cffaaaaaa%s/%s | %s%s%%", dur, dmax, hex, floor(perc * 100)), 1, 1, 1) local data = C_TooltipInfo.GetInventoryItem(P, slot) if data then local argVal = data.args and data.args[7] if argVal and argVal.field == "repairCost" then totalcost = totalcost + argVal.intVal if totalcost > 0 then nodur = false end end end end end if nodur then GameTooltip:AddLine("100%", 0.1, 1, 0.1) else GameTooltip:AddDoubleLine(" ", "--------------", 1, 1, 1, 0.5, 0.5, 0.5) GameTooltip:AddDoubleLine(REPAIR_COST, formatgold(1, totalcost), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) end GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(" ", L_STATS_AUTO_REPAIR..": "..(conf.AutoRepair and "|cff55ff55"..L_STATS_ON or "|cffff5555"..strupper(OFF)), 1, 1, 1, ttsubh.r, ttsubh.g, ttsubh.b) GameTooltip:AddDoubleLine(" ", L_STATS_GUILD_REPAIR..": "..(conf.AutoGuildRepair and "|cff55ff55"..L_STATS_ON or "|cffff5555"..strupper(OFF)), 1, 1, 1, ttsubh.r, ttsubh.g, ttsubh.b) GameTooltip:Show() end, OnClick = function(self, button) if button == "RightButton" then conf.AutoRepair = not conf.AutoRepair self:GetScript("OnEnter")(self) elseif button == "MiddleButton" then conf.AutoGuildRepair = not conf.AutoGuildRepair self:GetScript("OnEnter")(self) elseif C_EquipmentSet.GetNumEquipmentSets() > 0 and button == "LeftButton" and (IsAltKeyDown() or IsShiftKeyDown()) then local menulist = {{isTitle = true, notCheckable = 1, text = format(gsub(EQUIPMENT_SETS, ":", ""), "")}} if C_EquipmentSet.GetNumEquipmentSets() == 0 then tinsert(menulist, {text = NONE, notCheckable = 1, disabled = true}) else for _, eSetID in pairs(C_EquipmentSet.GetEquipmentSetIDs()) do local name, icon, setID = C_EquipmentSet.GetEquipmentSetInfo(eSetID) if not icon then icon = 134400 end tinsert(menulist, {text = format("|T%s:"..t_icon..":"..t_icon..":0:0:64:64:5:59:5:59:%d|t %s", icon, t_icon, name), notCheckable = 1, func = function() if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end EquipmentManager_EquipSet(setID) end}) end end EasyMenu(menulist, LSMenus, "cursor", 0, 0, "MENU") elseif button == "LeftButton" then ToggleCharacter("PaperDollFrame") end end }) end ---------------------------------------------------------------------------------------- -- Experience/Played/Rep ---------------------------------------------------------------------------------------- if experience.enabled then local logintime, playedtotal, playedlevel, playedmsg, gained, lastkill, lastquest = GetTime(), 0, 0, 0, 0 local repname, repcolor, standingname, currep, minrep, maxrep local mobxp = gsub(COMBATLOG_XPGAIN_FIRSTPERSON, "%%[sd]", "(.*)") local questxp = gsub(COMBATLOG_XPGAIN_FIRSTPERSON_UNNAMED, "%%[sd]", "(.*)") local function short(num, tt) if short or tt then num = tonumber(num) if num >= 1e11 then return ("%.0f%s"):format(num / 1e9, experience.billion or "b") elseif num >= 1e10 then return ("%.1f%s"):format(num / 1e9, experience.billion or "b"):gsub("%.?0+([km])$", "%1") elseif num >= 1e9 then return ("%.2f%s"):format(num / 1e9, experience.billion or "b"):gsub("%.?0+([km])$", "%1") elseif num >= 1e8 then return ("%.0f%s"):format(num / 1e6, experience.million or "m") elseif num >= 1e7 then return ("%.1f%s"):format(num / 1e6, experience.million or "m"):gsub("%.?0+([km])$", "%1") elseif num >= 1e6 then return ("%.2f%s"):format(num / 1e6, experience.million or "m"):gsub("%.?0+([km])$", "%1") elseif num >= 1e5 then return ("%.0f%s"):format(num / 1e3, experience.thousand or "k") elseif num >= 1e3 then return ("%.1f%s"):format(num / 1e3, experience.thousand or "k"):gsub("%.?0+([km])$", "%1") end end return floor(tonumber(num)) end local function tags(sub,tt) local t = experience -- exp tags return sub == "level" and UnitLevel(P) or sub == "curxp" and short(UnitXP(P),tt) or sub == "remainingxp" and short(UnitXPMax(P) - UnitXP(P), tt) or sub == "totalxp" and short(UnitXPMax(P), tt) or sub == "cur%" and floor(UnitXP(P) / UnitXPMax(P) * 100) or sub == "remaining%" and 100 - floor(UnitXP(P) / UnitXPMax(P) * 100) or sub == "restxp" and short(GetXPExhaustion() or 0,tt) or sub == "rest%" and min(150, floor((GetXPExhaustion() or 0) / UnitXPMax(P) * 100)) or sub == "sessiongained" and short(gained,tt) or sub == "sessionrate" and short(gained / (GetTime() - playedmsg) * 3600, tt) or sub == "levelrate" and short(UnitXP(P) / (playedlevel + GetTime() - playedmsg) * 3600, tt) or sub == "sessionttl" and (gained ~= 0 and fmttime((UnitXPMax(P) - UnitXP(P)) / (gained / (GetTime() - playedmsg)), t) or L_STATS_INF) or sub == "levelttl" and (UnitXP(P) ~= 0 and fmttime((UnitXPMax(P) - UnitXP(P)) / (UnitXP(P) / (playedlevel + GetTime() - playedmsg)), t) or L_STATS_INF) or sub == "questsleft" and (lastquest and ceil((UnitXPMax(P) - UnitXP(P)) / tonumber(lastquest)) or "??") or sub == "killsleft" and (lastkill and ceil((UnitXPMax(P) - UnitXP(P)) / tonumber(lastkill)) or "??") -- time played tags or sub == "playedtotal" and fmttime(playedtotal + GetTime() - playedmsg, t) or sub == "playedlevel" and fmttime(playedlevel + GetTime() - playedmsg, t) or sub == "playedsession" and fmttime(GetTime() - logintime,t) -- rep tags or sub == "repname" and (t.faction_subs[repname] or T.UTF(repname, 25, true)) or sub == "repcolor" and "|cff"..repcolor or sub == "standing" and standingname or sub == "currep" and (currep ~= maxrep and abs(currep - minrep) or currep > 0 and 1 or 0) or sub == "repleft" and abs(maxrep - currep) or sub == "maxrep" and (currep ~= maxrep and abs(maxrep - minrep) or maxrep > 0 and 1 or 0) or sub == "rep%" and (currep ~= 0 and floor(abs(currep - minrep) / abs(maxrep - minrep) * 100) or 0) or format("[%s]", sub) end Inject("Experience", { text = { string = function(self) if conf.ExpMode == "rep" then return self:GetText() elseif conf.ExpMode == "played" then return gsub(experience.played_fmt, "%[([%w%%]-)%]", tags) elseif conf.ExpMode == "xp" then return gsub(experience[format("xp_%s_fmt", (GetXPExhaustion() or 0) > 0 and "rested" or "normal")], "%[([%w%%]-)%]", tags) or " " end end }, OnLoad = function(self) RegEvents(self, "TIME_PLAYED_MSG PLAYER_LOGOUT PLAYER_LOGIN UPDATE_FACTION CHAT_MSG_COMBAT_XP_GAIN PLAYER_LEVEL_UP") -- Filter first time played message local ofunc = ChatFrame_DisplayTimePlayed function ChatFrame_DisplayTimePlayed() ChatFrame_DisplayTimePlayed = ofunc end RequestTimePlayed() if not conf.ExpMode or conf.ExpMode == "xp" or conf.ExpMode == "art" then conf.ExpMode = UnitLevel(P) ~= MAX_PLAYER_LEVEL and "xp" or "played" end end, OnEvent = function(self, event, ...) if event == "CHAT_MSG_COMBAT_XP_GAIN" then local msg = ... if msg:find(mobxp) then _, lastkill = strmatch(msg, mobxp) lastkill = strmatch(lastkill, "%d+") gained = gained + lastkill elseif msg:find(questxp) then lastquest = strmatch(msg, questxp) lastquest = strmatch(lastquest, "%d+") gained = gained + lastquest end elseif event == "PLAYER_LEVEL_UP" then playedlevel, playedmsg = 0, GetTime() elseif event == "TIME_PLAYED_MSG" then playedtotal, playedlevel = ... playedmsg = GetTime() elseif (event == "UPDATE_FACTION" or event == "PLAYER_LOGIN") and conf.ExpMode == "rep" then local standing, factionID, standingText repname, standing, minrep, maxrep, currep, factionID = GetWatchedFactionInfo() local reputationInfo = C_GossipInfo.GetFriendshipReputation(factionID) local friendshipID = reputationInfo and reputationInfo.friendshipFactionID if friendshipID and friendshipID > 0 then local rankInfo = C_GossipInfo.GetFriendshipReputationRanks(factionID) local currentRank = rankInfo and rankInfo.currentLevel local maxRank = rankInfo and rankInfo.maxLevel local rankText if currentRank and maxRank and currentRank > 0 and maxRank > 0 then rankText = (' %s / %s'):format(currentRank, maxRank) end local repInfo = C_GossipInfo.GetFriendshipReputation(factionID) standingText = repInfo.reaction..rankText if repInfo.nextThreshold then minrep, maxrep, currep = repInfo.reactionThreshold, repInfo.nextThreshold, repInfo.standing else minrep, maxrep, currep = 0, 1, 1 end standing = 5 elseif C_Reputation.IsMajorFaction(factionID) then local majorFactionData = C_MajorFactions.GetMajorFactionData(factionID) minrep, maxrep = 0, majorFactionData.renownLevelThreshold currep = C_MajorFactions.HasMaximumRenown(factionID) and majorFactionData.renownLevelThreshold or majorFactionData.renownReputationEarned or 0 standing = 7 standingText = RENOWN_LEVEL_LABEL..majorFactionData.renownLevel else local value, nextThreshold = C_Reputation.GetFactionParagonInfo(factionID) if value then currep = value % nextThreshold minrep = 0 maxrep = nextThreshold standing = 8 standingText = PARAGON end end if not repname then repname = NONE end local color = {} if standing == 0 then color.r, color.g, color.b = GetItemQualityColor(0) elseif standing == 7 then color.r, color.g, color.b = GetItemQualityColor(3) elseif standing == 8 then color.r, color.g, color.b = GetItemQualityColor(4) else color = FACTION_BAR_COLORS[standing] end standingname = standingText or _G[format("FACTION_STANDING_LABEL%s%s", standing, UnitSex(P) == 3 and "_FEMALE" or "")] if not standingname then standingname = UNKNOWN end repcolor = format("%02x%02x%02x", min(color.r * 255 + 40, 255), min(color.g * 255 + 40, 255), min(color.b * 255 + 40, 255)) self.text:SetText(gsub(experience.faction_fmt, "%[([%w%%]-)%]", tags)) end if event == "PLAYER_LOGOUT" or event == "TIME_PLAYED_MSG" then conf.Played = floor(playedtotal + GetTime() - playedmsg) end end, OnEnter = function(self) self.hovered = true GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(modules.Experience.tip_anchor, modules.Experience.tip_frame, modules.Experience.tip_x, modules.Experience.tip_y) GameTooltip:ClearLines() if conf.ExpMode == "played" then GameTooltip:AddLine(TIME_PLAYED_MSG, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(L_STATS_PLAYED_SESSION, tags("playedsession", 1), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(L_STATS_PLAYED_LEVEL, tags("playedlevel", 1), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddLine(" ") GameTooltip:AddLine(L_STATS_ACC_PLAYED, ttsubh.r, ttsubh.g, ttsubh.b) local total = 0 for realm, t in pairs(ShestakUIStats) do for name, conf in pairs(t) do if conf.Played then local r, g, b, player = 1, 1, 1 if name == UnitName(P) and realm == GetRealmName() then conf.Played, player, r, g, b = floor(playedtotal + GetTime() - playedmsg), true, 0.5, 1, 0.5 end if conf.Played > 3600 or player then -- 1hr threshold displayed GameTooltip:AddDoubleLine(format("%s-%s", name, realm), fmttime(conf.Played), r, g, b, 1, 1, 1) end total = total + conf.Played end end end GameTooltip:AddDoubleLine(" ", "------------------", 1, 1, 1, 0.5, 0.5, 0.5) GameTooltip:AddDoubleLine(TOTAL, fmttime(total), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) elseif conf.ExpMode == "xp" then GameTooltip:AddDoubleLine(COMBAT_XP_GAIN, format(LEVEL_GAINED, UnitLevel(P)), tthead.r, tthead.g, tthead.b, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(L_STATS_CURRENT_XP, format("%s/%s (%s%%)", tags"curxp", tags"totalxp", tags"cur%"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(L_STATS_REMAINING_XP, format("%s (%s%%)", tags"remainingxp", tags"remaining%"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) if GetXPExhaustion() and GetXPExhaustion() ~= 0 then GameTooltip:AddDoubleLine(L_STATS_RESTED_XP, format("%s (%s%%)", tags"restxp", tags"rest%"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) end GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(L_STATS_SESSION_XP, format("%s/%s (%s)", tags"sessionrate", L_STATS_HR, tags"sessionttl"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(L_STATS_XP_RATE, format("%s/%s (%s)", tags"levelrate", L_STATS_HR, tags"levelttl"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(format(L_STATS_QUESTS_TO, UnitLevel(P) + 1), format("%s:%s %s:%s", L_STATS_QUEST, tags"questsleft", L_STATS_KILLS, tags"killsleft"), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(L_STATS_PLAYED_SESSION, tags"playedsession", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(L_STATS_PLAYED_LEVEL, tags"playedlevel", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(L_STATS_PLAYED_TOTAL, tags"playedtotal", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) elseif conf.ExpMode == "rep" then if repname == NONE then GameTooltip:Hide() return end local desc, war, watched for i = 1, GetNumFactions() do _, desc, _, _, _, _, war, _, _, _, _, watched = GetFactionInfo(i) if watched then break end end GameTooltip:AddLine(repname, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(desc, ttsubh.r, ttsubh.g, ttsubh.b, 1) GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(format("%s%s", tags"repcolor", tags"standing"), war and format("|cffff5555%s", AT_WAR)) if currep ~= maxrep then GameTooltip:AddDoubleLine(format("%s%% | %s/%s", tags"rep%", tags"currep", tags"maxrep"), -tags"repleft", ttsubh.r, ttsubh.g, ttsubh.b, 1, 0.33, 0.33) end end GameTooltip:Show() end, OnClick = function(self, button) if button == "RightButton" then conf.ExpMode = conf.ExpMode == "xp" and "played" or conf.ExpMode == "played" and "rep" or (conf.ExpMode == "rep" and UnitLevel(P) ~= MAX_PLAYER_LEVEL) and "xp" or conf.ExpMode == "rep" and "played" if conf.ExpMode == "rep" then self:GetScript("OnEvent")(self, "UPDATE_FACTION") else self:GetScript("OnUpdate")(self, 5) end self:GetScript("OnEnter")(self) elseif button == "LeftButton" then if conf.ExpMode == "rep" then ToggleCharacter("ReputationFrame") end end end }) end ---------------------------------------------------------------------------------------- -- Talents ---------------------------------------------------------------------------------------- if talents.enabled then local lootSpecName, specName local specList = { {text = SPECIALIZATION, isTitle = true, notCheckable = true}, {notCheckable = true}, {notCheckable = true}, {notCheckable = true}, {notCheckable = true} } local lootList = { {text = SELECT_LOOT_SPECIALIZATION, isTitle = true, notCheckable = true}, {notCheckable = true, func = function() SetLootSpecialization(0) end}, {notCheckable = true}, {notCheckable = true}, {notCheckable = true}, {notCheckable = true} } Inject("Talents", { OnLoad = function(self) self.text2 = self:CreateFontString(nil, "OVERLAY") self.text2:SetFont(self.text:GetFont()) self.text2:SetPoint("LEFT", self.text, "RIGHT", 0, -1) self.text3 = self:CreateFontString(nil, "OVERLAY") self.text3:SetFont(self.text:GetFont()) self.text3:SetPoint("LEFT", self.text2, "RIGHT", 0, 1) self.text4 = self:CreateFontString(nil, "OVERLAY") self.text4:SetFont(self.text:GetFont()) self.text4:SetPoint("LEFT", self.text3, "RIGHT", 0, -1) self.globalFrame = CreateFrame("Frame", self) self.globalFrame:SetPoint("TOPLEFT", self.text) self.globalFrame:SetPoint("BOTTOMRIGHT", self.text4) self.globalFrame:SetScript("OnEnter", function() self:GetScript("OnEnter")(self) end) self.globalFrame:SetScript("OnLeave", function() self:GetScript("OnLeave")(self) end) self.globalFrame:SetScript("OnMouseUp", function(_, b) self:GetScript("OnMouseUp")(self, b) end) RegEvents(self, "PLAYER_ENTERING_WORLD PLAYER_TALENT_UPDATE PLAYER_LOOT_SPEC_UPDATED") end, OnEvent = function(self) if UnitLevel(P) < 10 then self.text:SetText(format("%s %s", NO, SPECIALIZATION)) return end local lootSpec = GetLootSpecialization() local spec = GetSpecialization() lootSpecName = lootSpec and select(2, GetSpecializationInfoByID(lootSpec)) or NO specName = spec and select(2, GetSpecializationInfo(spec)) or NO local specText = L_STATS_SPEC..":" local specIcon, lootIcon = "", "" local lootText = LOOT..":" local _, _, _, specTex = GetSpecializationInfo(spec) local texSize = 14 if specTex then specIcon = format("|T%s:"..texSize..":"..texSize..":0:0:64:64:5:59:5:59|t", specTex) end if lootSpec == 0 then specText = "|cff55ff55"..specText.."|r" lootText = "" lootSpecName = "|cff55ff55"..specName.."|r" else local _, _, _, texture = GetSpecializationInfoByID(lootSpec) if texture then lootIcon = format("|T%s:"..texSize..":"..texSize..":0:0:64:64:5:59:5:59|t", texture) end end self.text:SetText(specText) self.text2:SetText(specIcon.." ") self.text3:SetText(lootText) self.text4:SetText(lootIcon) if self.hovered then self:GetScript("OnEnter")(self) end end, OnEnter = function(self) self.hovered = true if UnitLevel(P) >= 10 then GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(modules.Talents.tip_anchor, modules.Talents.tip_frame, modules.Talents.tip_x, modules.Talents.tip_y) GameTooltip:ClearLines() GameTooltip:AddLine(SPECIALIZATION.." "..ENCHANT_CONDITION_AND..LOOT, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(SPECIALIZATION, specName, ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(LOOT, lootSpecName, ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:Show() end end, OnLeave = function(self) self.hovered = false end, OnClick = function(self, b) if UnitLevel(P) < 10 then print("|cffffff00"..format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10).."|r") return end if b == "LeftButton" then if IsShiftKeyDown() then ToggleTalentFrame() else for index = 1, 4 do local id, name, _, texture = GetSpecializationInfo(index) if id then if GetSpecializationInfo(GetSpecialization()) == id then name = "|cff55ff55"..name.."|r" end specList[index + 1].text = format("|T%s:"..t_icon..":"..t_icon..":0:0:64:64:5:59:5:59|t %s", texture, name) specList[index + 1].func = function() SetSpecialization(index) end else specList[index + 1] = nil end end EasyMenu(specList, LSMenus, self, 0, 24, "MENU") end elseif b == "RightButton" and GetSpecialization() then local lootSpec = GetLootSpecialization() local _, specName = GetSpecializationInfo(GetSpecialization()) local specDefault = format(LOOT_SPECIALIZATION_DEFAULT, specName) if lootSpec == 0 then specDefault = "|cff55ff55"..format(LOOT_SPECIALIZATION_DEFAULT, specName).."|r" end lootList[2].text = specDefault for index = 1, 4 do local id, name, _, texture = GetSpecializationInfo(index) if id then if lootSpec == id then name = "|cff55ff55"..name.."|r" end lootList[index + 2].text = format("|T%s:"..t_icon..":"..t_icon..":0:0:64:64:5:59:5:59|t %s", texture, name) lootList[index + 2].func = function() SetLootSpecialization(id) end else lootList[index + 2] = nil end end EasyMenu(lootList, LSMenus, self, 0, 40, "MENU") end end }) end ---------------------------------------------------------------------------------------- -- Coordinates ---------------------------------------------------------------------------------------- if coords.enabled then Inject("Coords", { text = {string = Coords}, OnClick = function() if IsShiftKeyDown() then ChatEdit_ActivateChat(ChatEdit_ChooseBoxForSend()) ChatEdit_ChooseBoxForSend():Insert(format(" (%s: %s)", GetZoneText(), Coords())) else ToggleFrame(WorldMapFrame) end end }) end ---------------------------------------------------------------------------------------- -- Location ---------------------------------------------------------------------------------------- if location.enabled then Inject("Location", { OnLoad = function(self) RegEvents(self, "ZONE_CHANGED ZONE_CHANGED_INDOORS ZONE_CHANGED_NEW_AREA PLAYER_ENTERING_WORLD") self.sanctuary = {SANCTUARY_TERRITORY, {0.41, 0.8, 0.94}} self.arena = {FREE_FOR_ALL_TERRITORY, {1, 0.1, 0.1}} self.friendly = {FACTION_CONTROLLED_TERRITORY, {0.1, 1, 0.1}} self.hostile = {FACTION_CONTROLLED_TERRITORY, {1, 0.1, 0.1}} self.contested = {CONTESTED_TERRITORY, {1, 0.7, 0}} self.combat = {COMBAT_ZONE, {1, 0.1, 0.1}} self.neutral = {"", {1, 0.93, 0.76}} end, OnEvent = function(self) self.subzone, self.zone, self.pvp = GetSubZoneText(), GetZoneText(), {GetZonePVPInfo()} if not self.pvp[1] then self.pvp[1] = "neutral" end local label = (self.subzone ~= "" and location.subzone) and self.subzone or self.zone local r, g, b = unpack(self.pvp[1] and (self[self.pvp[1]][2] or self.other) or self.other) self.text:SetText(location.truncate == 0 and label or strtrim(strsub(label, 1, location.truncate))) self.text:SetTextColor(r, g, b, font.alpha) end, OnUpdate = function(self, u) if self.hovered then self.elapsed = self.elapsed + u if self.elapsed > 1 or self.init then GameTooltip:ClearLines() GameTooltip:AddLine(format("%s |cffffffff(%s)", self.zone, Coords()), tthead.r, tthead.g, tthead.b, 1, 1, 1) if self.pvp[1] and not IsInInstance() then local r, g, b = unpack(self[self.pvp[1]][2]) if self.subzone and self.subzone ~= self.zone then GameTooltip:AddLine(self.subzone, r, g, b) end GameTooltip:AddLine(format(self[self.pvp[1]][1], self.pvp[3] or ""), r, g, b) end GameTooltip:Show() self.elapsed, self.init = 0, false end end end, OnEnter = function(self) self.hovered, self.init = true, true GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(modules.Location.tip_anchor, modules.Location.tip_frame, modules.Location.tip_x, modules.Location.tip_y) end, OnClick = function(self) if IsShiftKeyDown() then local mapID = C_Map.GetBestMapForUnit("player") if C_Map.CanSetUserWaypointOnMap(mapID) then local pos = C_Map.GetPlayerMapPosition(mapID, "player") local mapPoint = UiMapPoint.CreateFromVector2D(mapID, pos) C_Map.SetUserWaypoint(mapPoint) end local hyperlink = C_Map.GetUserWaypointHyperlink() or "" ChatEdit_ActivateChat(ChatEdit_ChooseBoxForSend()) ChatEdit_ChooseBoxForSend():Insert(format(" (%s: %s) %s", self.zone, Coords(), hyperlink)) C_Map.ClearUserWaypoint() else ToggleFrame(WorldMapFrame) end end }) end ---------------------------------------------------------------------------------------- -- Damage ---------------------------------------------------------------------------------------- if damage.enabled then Inject("Damage", { text = { string = function() if IsAddOnLoaded("Details") then local combat = Details:GetCurrentCombat() local player = combat:GetActor(DETAILS_ATTRIBUTE_DAMAGE, T.name) if player then local damageDone = player.total local combatTime = combat:GetCombatTime() local effectiveDPS = damageDone / combatTime return format(damage.fmt, DAMAGE, effectiveDPS) end elseif IsAddOnLoaded("Numeration") then local text = LibStub:GetLibrary("LibDataBroker-1.1"):GetDataObjectByName("Numeration").text if text and text ~= "Numeration" then return format(damage.alt_fmt, DAMAGE, text) end end end }, OnClick = function(self, button) if IsAddOnLoaded("Details") then _detalhes:ToggleWindows() elseif IsAddOnLoaded("Numeration") then Numeration:ToggleVisibility() end end }) end ---------------------------------------------------------------------------------------- -- Ping ---------------------------------------------------------------------------------------- if ping.enabled then Inject("Ping", { OnLoad = function(self) self:RegisterEvent("MINIMAP_PING") self.animGroup = self.text:CreateAnimationGroup() self.anim = self.animGroup:CreateAnimation("Alpha") self.animGroup:SetScript("OnFinished", function() self.text:Hide() end) self.anim:SetFromAlpha(1) self.anim:SetToAlpha(0) self.anim:SetDuration(2.8) self.anim:SetStartDelay(5) end, OnEvent = function(self, _, unit) if unit == P and ping.hide_self then return end local class = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[select(2, UnitClass(unit))] self.text:SetText(format(ping.fmt, UnitName(unit))) if class then self.text:SetTextColor(class.r, class.g, class.b, 1) else self.text:SetTextColor(1, 1, 1, 1) end self.animGroup:Stop() self.text:Show() self.animGroup:Play() end }) end ---------------------------------------------------------------------------------------- -- Gold ---------------------------------------------------------------------------------------- if gold.enabled then local titleName local function Currency(id, weekly, capped) local info = C_CurrencyInfo.GetCurrencyInfo(id) local name, amount, tex, week, weekmax, maxed, discovered = info.name, info.quantity, info.iconFileID, info.canEarnPerWeek, info.maxWeeklyQuantity, info.maxQuantity, info.discovered if amount == 0 then return end if titleName then GameTooltip:AddLine(" ") GameTooltip:AddLine(titleName, ttsubh.r, ttsubh.g, ttsubh.b) titleName = nil end if weekly then if discovered then GameTooltip:AddDoubleLine(name, format("%s |T%s:"..t_icon..":"..t_icon..":0:0:64:64:5:59:5:59:%d|t", REFORGE_CURRENT..": ".. amount.." - "..WEEKLY..": "..week.." / "..weekmax, tex, t_icon), 1, 1, 1, 1, 1, 1) end elseif capped then if discovered then GameTooltip:AddDoubleLine(name, format("%s |T%s:"..t_icon..":"..t_icon..":0:0:64:64:5:59:5:59:%d|t", amount.." / "..maxed, tex, t_icon), 1, 1, 1, 1, 1, 1) end else if discovered then GameTooltip:AddDoubleLine(name, format("%s |T%s:"..t_icon..":"..t_icon..":0:0:64:64:5:59:5:59:%d|t", amount, tex, t_icon), 1, 1, 1, 1, 1, 1) end end end Inject("Gold", { OnLoad = function(self) self.started = GetMoney() RegEvents(self, "PLAYER_LOGIN PLAYER_MONEY MERCHANT_SHOW") if not ShestakUIStats.JunkIgnore then ShestakUIStats.JunkIgnore = {} end end, OnEvent = function(self, event) conf.Gold = GetMoney() if event == "MERCHANT_SHOW" then if conf.AutoSell and not (IsAltKeyDown() or IsShiftKeyDown()) then -- local profit = 0 local numItem = 0 for bag = 0, NUM_BAG_SLOTS do for slot = 0, C_Container.GetContainerNumSlots(bag) do local link = C_Container.GetContainerItemLink(bag, slot) if link then local itemstring, ignore = strmatch(link, "|Hitem:(%d-):"), false for _, exception in pairs(ShestakUIStats.JunkIgnore) do if exception == itemstring then ignore = true break end end local _, _, itemRarity, _, _, _, _, _, _, _, itemSellPrice = GetItemInfo(link) -- local _, itemCount = GetContainerItemInfo(bag, slot) if itemSellPrice and itemSellPrice > 0 and ((itemRarity == 0 and not ignore) or (ignore and itemRarity ~= 0)) then -- profit = profit + (itemSellPrice * itemCount) numItem = numItem + 1 if numItem < 12 then C_Container.UseContainerItem(bag, slot) else C_Timer.After(numItem/8, function() C_Container.UseContainerItem(bag, slot) end) end end end end end -- if profit > 0 then print(format("|cff66C6FF%s: |cffFFFFFF%s", L_STATS_JUNK_PROFIT, formatgold(1, profit))) end end return end self.text:SetText(formatgold(gold.style, conf.Gold)) end, OnEnter = function(self) local curgold = GetMoney() local _, _, archaeology, _, cooking = GetProfessions() conf.Gold = curgold GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:ClearAllPoints() GameTooltip:SetPoint(gold.tip_anchor, gold.tip_frame, gold.tip_x, gold.tip_y) GameTooltip:ClearLines() GameTooltip:AddLine(CURRENCY, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") if self.started ~= curgold then local gained = curgold > self.started local color = gained and "|cff55ff55" or "|cffff5555" GameTooltip:AddDoubleLine(L_STATS_SESSION_GAIN, format("%s$|r %s %s$|r", color, formatgold(1, abs(self.started - curgold)), color), 1, 1, 1, 1, 1, 1) GameTooltip:AddLine(" ") end GameTooltip:AddLine(L_STATS_SERVER_GOLD, ttsubh.r, ttsubh.g, ttsubh.b) local total = 0 local goldTable = {} local charIndex = 0 wipe(goldTable) for char, conf in pairs(ShestakUIStats[realm]) do if conf.Gold and conf.Gold > 99 then charIndex = charIndex + 1 goldTable[charIndex] = {char, formatgold(5, conf.Gold), conf.Gold} end end table.sort(goldTable, function(a, b) if (a and b) then return a[3] > b[3] end end) for _, v in ipairs(goldTable) do GameTooltip:AddDoubleLine(v[1], v[2], 1, 1, 1, 1, 1, 1) total = total + v[3] end GameTooltip:AddDoubleLine(" ", "-----------------", 1, 1, 1, 0.5, 0.5, 0.5) GameTooltip:AddDoubleLine(TOTAL, formatgold(5, total), ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddLine(" ") local currencies = 0 for i = 1, C_CurrencyInfo.GetCurrencyListSize() do local info = C_CurrencyInfo.GetCurrencyListInfo(i) if info and info.isShowInBackpack then if currencies == 0 then GameTooltip:AddLine(TRACKING, ttsubh.r, ttsubh.g, ttsubh.b) end local r, g, b if info.quantity > 0 then r, g, b = 1, 1, 1 else r, g, b = 0.5, 0.5, 0.5 end GameTooltip:AddDoubleLine(info.name, format("%d |T%s:"..t_icon..":"..t_icon..":0:0:64:64:5:59:5:59:%d|t", info.quantity, info.iconFileID, t_icon), r, g, b, r, g, b) currencies = currencies + 1 end end if archaeology and C.stats.currency_archaeology then titleName = PROFESSIONS_ARCHAEOLOGY Currency(384) -- Dwarf Archaeology Fragment Currency(385) -- Troll Currency(393) -- Fossil Currency(394) -- Night Elf Currency(397) -- Orc Currency(398) -- Draenei Currency(399) -- Vrykul Currency(400) -- Nerubian Currency(401) -- Tol'vir Currency(676) -- Pandaren Currency(677) -- Mogu Currency(754) -- Mantid Currency(821) -- Draenor Clans Currency(828) -- Ogre Currency(829) -- Arakkoa Currency(1172) -- Highborne Currency(1173) -- Highmountain Tauren Currency(1174) -- Demonic Currency(1534) -- Zandalari Currency(1535) -- Drust end if cooking and C.stats.currency_cooking then titleName = PROFESSIONS_COOKING Currency(81) -- Epicurean's Award Currency(402) -- Ironpaw Token end -- if C.stats.currency_raid and T.level == MAX_PLAYER_LEVEL then -- titleName = L_STATS_CURRENCY_RAID -- Currency(1580, false, true) -- Seal of Wartorn Fate -- end if C.stats.currency_misc then titleName = EXPANSION_NAME9 Currency(2122) -- Storm Sigil Currency(2118) -- Elemental Overflow Currency(2003) -- Dragon Isles Supplies end GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(" ", L_STATS_AUTO_SELL..": "..(conf.AutoSell and "|cff55ff55"..L_STATS_ON or "|cffff5555"..strupper(OFF)), 1, 1, 1, ttsubh.r, ttsubh.g, ttsubh.b) GameTooltip:Show() end, OnClick = function(self, button) if button == "LeftButton" then ToggleCharacter("TokenFrame") elseif button == "RightButton" then conf.AutoSell = not conf.AutoSell self:GetScript("OnEnter")(self) end end }) SLASH_KJUNK1 = "/junk" function SlashCmdList.KJUNK(s) local action = strsplit(" ", s) if action == "list" then print(format("|cff66C6FF%s:|r %s", L_STATS_JUNK_ADDITIONS, (#ShestakUIStats.JunkIgnore == 0 and NONE or ""))) for i, id in pairs(ShestakUIStats.JunkIgnore) do local _, link = GetItemInfo(id) print("- ["..i.."]", link) end elseif action == "clear" then ShestakUIStats.JunkIgnore = {} print("|cff66C6FF"..L_STATS_JUNK_CLEARED.."|r") elseif action == "add" or strfind(action, "^del") or strfind(action, "^rem") then local _, mouselink = GameTooltip:GetItem() for id in s:gmatch("|Hitem:(%d-):") do mouselink = nil local _, link = GetItemInfo(id) if action == "add" then if not tContains(ShestakUIStats.JunkIgnore,id) then tinsert(ShestakUIStats.JunkIgnore, id) print(format("|cff66C6FF%s:|r %s", L_STATS_JUNK_ADDED, link)) else print(format("%s |cff66C6FF%s|r", link, L_STATS_JUNK_ALREADY_ADDITIONS)) end elseif strfind(action, "^del") or strfind(action, "^rem") then tDeleteItem(ShestakUIStats.JunkIgnore, id) print(format("|cff66C6FF%s:|r %s", L_STATS_JUNK_REMOVED, link)) end end if mouselink then for id in mouselink:gmatch("|Hitem:(%d-):") do if action == "add" then if not tContains(ShestakUIStats.JunkIgnore,id) then tinsert(ShestakUIStats.JunkIgnore, id) print(format("|cff66C6FF%s:|r %s", L_STATS_JUNK_ADDED, mouselink)) else print(format("%s |cff66C6FF%s|r", mouselink, L_STATS_JUNK_ALREADY_ADDITIONS)) end elseif strfind(action, "^del") or strfind(action, "^rem") then tDeleteItem(ShestakUIStats.JunkIgnore, id) print(format("|cff66C6FF%s:|r %s", L_STATS_JUNK_REMOVED, mouselink)) end end end else print("Lite|cff66C6FFStats|r: "..L_STATS_JUNK_LIST) print(format("/junk [%s] - %s", L_STATS_JUNK_ITEMLINK, L_STATS_JUNK_ADD_ITEM)) print("/junk list - "..L_STATS_JUNK_ITEMS_LIST) print("/junk clear - "..L_STATS_JUNK_CLEAR_ADDITIONS) end end end ---------------------------------------------------------------------------------------- -- Character Stats ---------------------------------------------------------------------------------------- if stats.enabled then local function tags(sub) local percent, string = true if sub == "power" then local value, power local Base, PosBuff, NegBuff = UnitAttackPower("player") local Effective = Base + PosBuff + NegBuff local RangedBase, RangedPosBuff, RangedNegBuff = UnitRangedAttackPower("player") local range = RangedBase + RangedPosBuff + RangedNegBuff local heal = GetSpellBonusHealing() local spell = GetSpellBonusDamage(7) local attack = Effective if heal > spell then power = heal else power = spell end if attack > power and T.class ~= "HUNTER" then value = attack elseif T.class == "HUNTER" then value = range else value = power end string, percent = value elseif sub == "mastery" then string = GetMasteryEffect() elseif sub == "haste" then string = GetHaste() elseif sub == "resilience" then string, percent = GetCombatRating(16) elseif sub == "crit" then string = GetCritChance() elseif sub == "dodge" then string = GetDodgeChance() elseif sub == "parry" then string = GetParryChance() elseif sub == "block" then string = GetBlockChance() elseif sub == "avoidance" then string = GetDodgeChance() + GetParryChance() elseif sub == "manaregen" then local I5SR = true if T.class == "ROGUE" or T.class == "WARRIOR" or T.class == "DEATHKNIGHT" then string, percent = "??" else local base, cast = GetManaRegen() string, percent = floor((I5SR and cast or base) * 5) end elseif sub == "armor" then local _, eff = UnitArmor(P) string, percent = eff elseif sub == "versatility" then string = GetCombatRatingBonus(CR_VERSATILITY_DAMAGE_DONE) + GetVersatilityBonus(CR_VERSATILITY_DAMAGE_DONE) elseif sub == "leech" then string = GetLifesteal() elseif sub == "reduceaoe" then string = GetAvoidance() else string, percent = format("[%s]", sub) end if not percent then return string end return format("%.1f", string) end Inject("Stats", { OnLoad = function(self) RegEvents(self, "PLAYER_LOGIN UNIT_STATS UNIT_DAMAGE UNIT_RANGEDDAMAGE PLAYER_DAMAGE_DONE_MODS UNIT_ATTACK_SPEED UNIT_ATTACK_POWER UNIT_RANGED_ATTACK_POWER") end, OnEvent = function(self) self.fired = true end, OnUpdate = function(self, u) self.elapsed = self.elapsed + u if self.fired and self.elapsed > 2.5 then self.text:SetText(gsub(stats.fmt, "%[(%w-)%]", tags)) LP_Stat.text:SetText(gsub(stat[format("spec%dfmt", GetSpecialization() and GetSpecialization() or 1)], "%[(%w-)%]", tags)) self.elapsed, self.fired = 0, false if self.hovered then self:GetScript("OnEnter")(self) end end end, OnClick = function() ToggleCharacter("PaperDollFrame") end, OnEnter = function(self) self.hovered = true GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT", -3, 26) GameTooltip:ClearLines() GameTooltip:AddLine(PAPERDOLL_SIDEBAR_STATS, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") local spec = GetSpecialization() if spec then local primaryStat = select(6, GetSpecializationInfo(spec, nil, nil, nil, UnitSex("player"))) local value = UnitStat("player", primaryStat) local statName = _G["SPELL_STAT"..primaryStat.."_NAME"] GameTooltip:AddDoubleLine(statName, value, ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) end local leech = tonumber(tags"leech") if leech > 0 then GameTooltip:AddDoubleLine(STAT_LIFESTEAL, leech.."%", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) end local reduceaoe = tonumber(tags"reduceaoe") if reduceaoe > 0 then GameTooltip:AddDoubleLine(STAT_AVOIDANCE, reduceaoe.."%", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) end if T.Role == "Tank" then GameTooltip:AddDoubleLine(STAT_DODGE, tags"dodge".."%", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) GameTooltip:AddDoubleLine(STAT_PARRY, tags"parry".."%", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) local block = tonumber(tags"block") if block > 0 then GameTooltip:AddDoubleLine(STAT_BLOCK, block.."%", ttsubh.r, ttsubh.g, ttsubh.b, 1, 1, 1) end end GameTooltip:Show() if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(1) end end, OnLeave = function() if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(0) end end, }) Inject("Stat", { OnClick = function() ToggleCharacter("PaperDollFrame") end, OnEnter = function() LP_Stats:GetScript("OnEnter")(LP_Stats) end, OnLeave = function() LP_Stats.hovered = false if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(0) end end, }) end ---------------------------------------------------------------------------------------- -- Bags ---------------------------------------------------------------------------------------- if bags.enabled then Inject("Bags", { OnLoad = function(self) RegEvents(self, "PLAYER_LOGIN BAG_UPDATE") end, OnEvent = function(self) local free, total = 0, 0 for i = 0, NUM_BAG_SLOTS do free, total = free + C_Container.GetContainerNumFreeSlots(i), total + C_Container.GetContainerNumSlots(i) end self.text:SetText(format(bags.fmt, free, total)) end, OnClick = function() ToggleAllBags() end, OnEnter = function(self) local free, total = 0, 0 for i = 0, NUM_BAG_SLOTS do free, total = free + C_Container.GetContainerNumFreeSlots(i), total + C_Container.GetContainerNumSlots(i) end GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT", -3, 26) GameTooltip:ClearLines() if GetBindingKey("TOGGLEBACKPACK") then GameTooltip:AddLine(BACKPACK_TOOLTIP.." ("..GetBindingKey("TOGGLEBACKPACK")..")", tthead.r, tthead.g, tthead.b) else GameTooltip:AddLine(BACKPACK_TOOLTIP, tthead.r, tthead.g, tthead.b) end GameTooltip:AddLine(" ") GameTooltip:AddLine(format(NUM_FREE_SLOTS, free, total), 1, 1, 1) GameTooltip:Show() if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(1) end end, OnLeave = function() if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(0) end end, }) end ---------------------------------------------------------------------------------------- -- Loot ---------------------------------------------------------------------------------------- if loot.enabled then Inject("Loot", { OnLoad = function(self) RegEvents(self, "PLAYER_LOGIN CVAR_UPDATE") end, OnEvent = function(self) if GetCVarBool("AutoLootDefault") then self.text:SetText(format(loot.fmt, "|cff55ff55"..L_STATS_ON.."|r")) else self.text:SetText(format(loot.fmt, "|cffff5555"..strupper(OFF).."|r")) end end, OnClick = function(self, button) if button == "RightButton" or button == "LeftButton" then if GetCVarBool("AutoLootDefault") then SetCVar("AutoLootDefault", 0) self.text:SetText(format(loot.fmt, "|cffff5555"..strupper(OFF).."|r")) else SetCVar("AutoLootDefault", 1) self.text:SetText(format(loot.fmt, "|cff55ff55"..L_STATS_ON.."|r")) end end end, OnEnter = function(self) GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT", -3, 26) GameTooltip:ClearLines() GameTooltip:AddLine(AUTO_LOOT_DEFAULT_TEXT, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") GameTooltip:AddLine(OPTION_TOOLTIP_AUTO_LOOT_DEFAULT, 1, 1, 1, 1) GameTooltip:Show() if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(1) end end, OnLeave = function() if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(0) end end, }) end ---------------------------------------------------------------------------------------- -- Nameplates ---------------------------------------------------------------------------------------- if nameplates.enabled then Inject("Nameplates", { OnLoad = function(self) RegEvents(self, "PLAYER_LOGIN CVAR_UPDATE") end, OnEvent = function(self) if GetCVar("nameplateMotion") == "0" then self.text:SetText(format(nameplates.fmt, "|cff55ff55"..L_STATS_ON.."|r")) else self.text:SetText(format(nameplates.fmt, "|cffff5555"..strupper(OFF).."|r")) end end, OnClick = function(self, button) if button == "RightButton" or button == "LeftButton" then if GetCVar("nameplateMotion") == "0" then SetCVar("nameplateMotion", "1") self.text:SetText(format(nameplates.fmt, "|cffff5555"..strupper(OFF).."|r")) else SetCVar("nameplateMotion", "0") self.text:SetText(format(nameplates.fmt, "|cff55ff55"..L_STATS_ON.."|r")) end end end, OnEnter = function(self) GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT", -3, 26) GameTooltip:ClearLines() GameTooltip:AddLine(UNIT_NAMEPLATES_ALLOW_OVERLAP, tthead.r, tthead.g, tthead.b) GameTooltip:AddLine(" ") GameTooltip:AddLine(OPTION_TOOLTIP_UNIT_NAMEPLATES_ALLOW_OVERLAP, 1, 1, 1, 1) GameTooltip:Show() if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(1) end end, OnLeave = function() if C.toppanel.enable == true and C.toppanel.mouseover == true then TopPanel:SetAlpha(0) end end, }) end ---------------------------------------------------------------------------------------- -- Applying modules ---------------------------------------------------------------------------------------- lpanels:CreateLayout("LiteStats", layout) lpanels:ApplyLayout(nil, "LiteStats") Inject = nil ================================================ FILE: ShestakUI/Libs/oGlow/Displays/Border.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) local Mult = T.mult if T.screenHeight > 1200 then Mult = T.Scale(1) end local colorTable = setmetatable( {}, {__index = function(self, val) local r, g, b = GetItemQualityColor(val) rawset(self, val, {r, g, b}) return self[val] end} ) local createBorder = function(self, point) local bc = self.oGlowBorder if not bc then if C.skins.blizzard_frames == true or IsAddOnLoaded("Aurora") then if not self:IsObjectType("Frame") then bc = CreateFrame("Frame", nil, self:GetParent(), "BackdropTemplate") else bc = CreateFrame("Frame", nil, self, "BackdropTemplate") end bc:SetBackdrop({ edgeFile = C.media.blank, edgeSize = Mult, }) if self.backdrop then bc:SetPoint("TOPLEFT", 0, 0) bc:SetPoint("BOTTOMRIGHT", 0, 0) else bc:SetPoint("TOPLEFT", point or self, 0, 0) bc:SetPoint("BOTTOMRIGHT", point or self, 0, 0) end else if not self:IsObjectType("Frame") then bc = self:GetParent():CreateTexture(nil, "OVERLAY") else bc = self:CreateTexture(nil, "OVERLAY") end bc:SetTexture("Interface\\Buttons\\UI-ActionButton-Border") bc:SetBlendMode("ADD") bc:SetAlpha(0.8) bc:SetSize(70, 70) bc:SetPoint("CENTER", point or self) end self.oGlowBorder = bc end return bc end local borderDisplay = function(frame, color) if color then local bc = createBorder(frame) local rgb = colorTable[color] if rgb then if C.skins.blizzard_frames == true or IsAddOnLoaded("Aurora") then bc:SetBackdropBorderColor(rgb[1], rgb[2], rgb[3]) if bc.backdrop then bc.backdrop:SetBackdropBorderColor(rgb[1], rgb[2], rgb[3]) end else bc:SetVertexColor(rgb[1], rgb[2], rgb[3]) end bc:Show() end return true elseif frame.oGlowBorder then frame.oGlowBorder:Hide() end end function oGlow:RegisterColor(name, r, g, b) if rawget(colorTable, name) then return nil, string.format("Color [%s] is already registered.", name) else rawset(colorTable, name, {r, g, b}) end return true end oGlow:RegisterDisplay("Border", borderDisplay) ================================================ FILE: ShestakUI/Libs/oGlow/Filters/Quality.lua ================================================ local quality = function(...) local quality = -1 for i = 1, select("#", ...) do local itemLink = select(i, ...) if itemLink then local _, _, itemQuality = GetItemInfo(itemLink) if itemQuality then quality = math.max(quality, itemQuality) end end end if quality > 1 then return quality end end oGlow:RegisterFilter("Quality border", "Border", quality) ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/Bags.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.bag.enable == true then return end local hook local _E local pipe = function(self) for _, button in self:EnumerateValidItems() do local bagID = button:GetBagID() local slotID = button:GetID() local slotLink = C_Container.GetContainerItemLink(bagID, slotID) oGlow:CallFilters("bags", button, _E and slotLink) end end local update = function(self) local frame = _G["ContainerFrame1"] local i = 2 while(frame and frame.size) do pipe(frame) frame = _G["ContainerFrame"..i] i = i + 1 end end local enable = function(self) _E = true if not hook then for i = 1, NUM_CONTAINER_FRAMES do local frame = _G["ContainerFrame"..i] hooksecurefunc(frame, "UpdateItems", pipe) end hooksecurefunc(ContainerFrameCombinedBags, "UpdateItems", pipe) hook = true end end local disable = function(self) _E = nil end oGlow:RegisterPipe("bags", enable, disable, update, "Bag containers") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/Bank.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.bag.enable == true then return end local _E local update = function(self) for i = 1, NUM_BANKGENERIC_SLOTS or 28 do local slotFrame = _G["BankFrameItem"..i] local slotLink = C_Container.GetContainerItemLink(-1, i) self:CallFilters("bank", slotFrame, _E and slotLink) end end local enable = function(self) _E = true self:RegisterEvent("BANKFRAME_OPENED", update) self:RegisterEvent("PLAYERBANKSLOTS_CHANGED", update) end local disable = function(self) _E = nil self:UnregisterEvent("BANKFRAME_OPENED", update) self:UnregisterEvent("PLAYERBANKSLOTS_CHANGED", update) end oGlow:RegisterPipe("bank", enable, disable, update, "Player bank frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/Char.lua ================================================ if IsAddOnLoaded("Fizzle") then return end local _E local hook local slots = { "Head", "Neck", "Shoulder", "Shirt", "Chest", "Waist", "Legs", "Feet", "Wrist", "Hands", "Finger0", "Finger1", "Trinket0", "Trinket1", "Back", "MainHand", "SecondaryHand", [19] = "Tabard" } local update = function(self) if CharacterFrame:IsShown() then for key, slotName in pairs(slots) do local slotFrame = _G["Character"..slotName.."Slot"] local slotLink = GetInventoryItemLink("player", key) oGlow:CallFilters("char", slotFrame, _E and slotLink) end end end local PLAYER_EQUIPMENT_CHANGED = function(self) update(self) end local enable = function(self) _E = true self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED", PLAYER_EQUIPMENT_CHANGED) if not hook then hook = function(...) if _E then return update(...) end end CharacterFrame:HookScript("OnShow", hook) end end local disable = function(self) _E = nil self:UnregisterEvent("PLAYER_EQUIPMENT_CHANGED", PLAYER_EQUIPMENT_CHANGED) end oGlow:RegisterPipe("char", enable, disable, update, "Character frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/CharFlyout.lua ================================================ local hook local _E local getID = function(loc) local player, bank, bags, voidStorage, slot, bag = EquipmentManager_UnpackLocation(loc) if not player and not bank and not bags and not voidStorage then return end if not bags then return GetInventoryItemLink("player", slot) else return C_Container.GetContainerItemLink(bag, slot) end end local pipe = function(self) local location, id = self.location if location and location < EQUIPMENTFLYOUT_FIRST_SPECIAL_LOCATION then id = getID(location) end return oGlow:CallFilters("char-flyout", self, _E and id) end local update = function(self) local buttons = EquipmentFlyoutFrame.buttons for _, button in next, buttons do pipe(button) end end local enable = function(self) _E = true if not hook then hook = function(...) if _E then return pipe(...) end end hooksecurefunc("EquipmentFlyout_DisplayButton", hook) end end local disable = function(self) _E = nil end oGlow:RegisterPipe("char-flyout", enable, disable, update, "Character equipment flyout frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/GBank.lua ================================================ local _E local hook local pipe = function() local tab = GetCurrentGuildBankTab() for i = 1, 98 do local index = math.fmod(i, 14) if index == 0 then index = 14 end local column = math.ceil((i - 0.5) / 14) local slotLink = GetGuildBankItemLink(tab, i) local slotFrame = GuildBankFrame.Columns[column].Buttons[index] oGlow:CallFilters("gbank", slotFrame, _E and slotLink) end end local doHook = function() if(not hook) then hook = function(...) if(_E) then return pipe(...) end end hooksecurefunc(GuildBankFrame, "Update", hook) end end local function ADDON_LOADED(self, event, addon) if(addon == "Blizzard_GuildBankUI") then doHook() self:UnregisterEvent(event, ADDON_LOADED) end end local update = function(self) if(IsAddOnLoaded("Blizzard_GuildBankUI")) then return pipe() end end local enable = function(self) _E = true if(IsAddOnLoaded("Blizzard_GuildBankUI")) then doHook() else self:RegisterEvent("ADDON_LOADED", ADDON_LOADED) end end local disable = function(self) _E = nil self:UnregisterEvent("ADDON_LOADED", ADDON_LOADED) end oGlow:RegisterPipe("gbank", enable, disable, update, "Guild bank frame", nil) ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/Inspect.lua ================================================ if IsAddOnLoaded("Fizzle") then return end local _E local slots = { "Head", "Neck", "Shoulder", "Shirt", "Chest", "Waist", "Legs", "Feet", "Wrist", "Hands", "Finger0", "Finger1", "Trinket0", "Trinket1", "Back", "MainHand", "SecondaryHand", [19] = "Tabard" } local _MISSING = {} local pollFrame = CreateFrame("Frame") pollFrame:Hide() local time = 3 pollFrame:SetScript("OnUpdate", function(self, elapsed) time = time + elapsed if time >= 3 then local unit = InspectFrame.unit if not unit then self:Hide() table.wipe(_MISSING) end for i, slotName in next, _MISSING do local itemLink = GetInventoryItemLink(unit, i) if itemLink then oGlow:CallFilters("inspect", _G["Inspect"..slotName.."Slot"], _E and itemLink) _MISSING[i] = nil end end if not next(_MISSING) then self:Hide() end end end) local update = function(self) if not InspectFrame or not InspectFrame:IsShown() then return end local unit = InspectFrame.unit for i, slotName in next, slots do local itemLink = GetInventoryItemLink(unit, i) local itemTexture = GetInventoryItemTexture(unit, i) if itemTexture and not itemLink then _MISSING[i] = slotName pollFrame:Show() end oGlow:CallFilters("inspect", _G["Inspect"..slotName.."Slot"], _E and itemLink) end end local UNIT_INVENTORY_CHANGED = function(self, event, unit) if InspectFrame.unit == unit then update(self) end end local function ADDON_LOADED(self, event, addon) if addon == "Blizzard_InspectUI" then self:RegisterEvent("PLAYER_TARGET_CHANGED", update) self:RegisterEvent("UNIT_INVENTORY_CHANGED", UNIT_INVENTORY_CHANGED) self:RegisterEvent("INSPECT_READY", update) self:UnregisterEvent("ADDON_LOADED", ADDON_LOADED) end end local enable = function(self) _E = true if IsAddOnLoaded("Blizzard_InspectUI") then self:RegisterEvent("PLAYER_TARGET_CHANGED", update) self:RegisterEvent("UNIT_INVENTORY_CHANGED", UNIT_INVENTORY_CHANGED) self:RegisterEvent("INSPECT_READY", update) else self:RegisterEvent("ADDON_LOADED", ADDON_LOADED) end end local disable = function(self) _E = nil self:UnregisterEvent("ADDON_LOADED", ADDON_LOADED) self:UnregisterEvent("PLAYER_TARGET_CHANGED", update) self:UnregisterEvent("UNIT_INVENTORY_CHANGED", UNIT_INVENTORY_CHANGED) self:UnregisterEvent("INSPECT_READY", update) end oGlow:RegisterPipe("inspect", enable, disable, update, "Inspect frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/Loot.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.loot.lootframe == true then return end local hook local _E local update = function(self) local slot = self:GetSlotIndex() local slotFrame = self.Item local itemLink if slot then itemLink = GetLootSlotLink(slot) end oGlow:CallFilters("loot", slotFrame, _E and itemLink) end local enable = function(self) _E = true if not hook then hooksecurefunc(LootFrameElementMixin, "Init", update) hook = true end end local disable = function(self) _E = nil end oGlow:RegisterPipe("loot", enable, disable, update, "Loot frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/Mail.lua ================================================ local _E local hook local stack = {} local send = function(self) if not SendMailFrame:IsShown() then return end for i = 1, ATTACHMENTS_MAX_SEND do local slotLink = GetSendMailItemLink(i) local slotFrame = _G["SendMailAttachment"..i] self:CallFilters("mail", slotFrame, _E and slotLink) end end local inbox = function() local numItems = GetInboxNumItems() local index = ((InboxFrame.pageNum - 1) * INBOXITEMS_TO_DISPLAY) + 1 for i = 1, INBOXITEMS_TO_DISPLAY do local slotFrame = _G["MailItem"..i.."Button"] if index <= numItems then for j = 1, ATTACHMENTS_MAX_RECEIVE do local attachLink = GetInboxItemLink(index, j) if attachLink then table.insert(stack, attachLink) end end end oGlow:CallFilters("mail", slotFrame, _E and unpack(stack)) wipe(stack) index = index + 1 end end local letter = function() if not InboxFrame.openMailID then return end for i = 1, ATTACHMENTS_MAX_RECEIVE do local itemLink = GetInboxItemLink(InboxFrame.openMailID, i) if itemLink then local slotFrame = _G["OpenMailAttachmentButton"..i] oGlow:CallFilters("mail", slotFrame, _E and itemLink) end end end local update = function(self) send(self) inbox() letter() end local hookLetter = function(...) if _E then return letter(...) end end local hookInbox = function(...) if _E then return inbox(...) end end local enable = function(self) _E = true self:RegisterEvent("MAIL_SHOW", send) self:RegisterEvent("MAIL_SEND_INFO_UPDATE", send) self:RegisterEvent("MAIL_SEND_SUCCESS", send) if not hook then hooksecurefunc("OpenMail_Update", hookLetter) hooksecurefunc("InboxFrame_Update", hookInbox) hook = true end end local disable = function(self) _E = nil self:UnregisterEvent("MAIL_SHOW", send) self:UnregisterEvent("MAIL_SEND_INFO_UPDATE", send) self:UnregisterEvent("MAIL_SEND_SUCCESS", send) end oGlow:RegisterPipe("mail", enable, disable, update, "Mail frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/Merchant.lua ================================================ local _E local hook local update = function() if MerchantFrame:IsShown() then if MerchantFrame.selectedTab == 1 then for i = 1, MERCHANT_ITEMS_PER_PAGE do local index = (((MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE) + i) local itemLink = GetMerchantItemLink(index) local slotFrame = _G["MerchantItem"..i.."ItemButton"] oGlow:CallFilters("merchant", slotFrame, _E and itemLink) end local buyBackLink = GetBuybackItemLink(GetNumBuybackItems()) oGlow:CallFilters("merchant", MerchantBuyBackItemItemButton, _E and buyBackLink) else for i = 1, BUYBACK_ITEMS_PER_PAGE do local itemLink = GetBuybackItemLink(i) local slotFrame = _G["MerchantItem"..i.."ItemButton"] oGlow:CallFilters("merchant", slotFrame, _E and itemLink) end end end end local enable = function(self) _E = true if not hook then hook = function(...) if _E then return update(...) end end hooksecurefunc("MerchantFrame_Update", hook) end end local disable = function(self) _E = nil end oGlow:RegisterPipe("merchant", enable, disable, update, "Vendor frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/Trade.lua ================================================ local _E local player = function(self, event, index) local slotFrame = _G["TradePlayerItem"..index.."ItemButton"] local slotLink = GetTradePlayerItemLink(index) self:CallFilters("trade", slotFrame, _E and slotLink) end local target = function(self, event, index) local slotFrame = _G["TradeRecipientItem"..index.."ItemButton"] local slotLink = GetTradeTargetItemLink(index) self:CallFilters("trade", slotFrame, _E and slotLink) end local update = function(self) for i = 1, MAX_TRADE_ITEMS or 8 do player(self, nil, i) target(self, nil, i) end end local enable = function(self) _E = true self:RegisterEvent("TRADE_UPDATE", update) self:RegisterEvent("TRADE_SHOW", update) self:RegisterEvent("TRADE_PLAYER_ITEM_CHANGED", player) self:RegisterEvent("TRADE_TARGET_ITEM_CHANGED", target) end local disable = function(self) _E = nil self:UnregisterEvent("TRADE_UPDATE", update) self:UnregisterEvent("TRADE_SHOW", update) self:UnregisterEvent("TRADE_PLAYER_ITEM_CHANGED", player) self:UnregisterEvent("TRADE_TARGET_ITEM_CHANGED", target) end oGlow:RegisterPipe("trade", enable, disable, update, "Trade frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/TradeSkill.lua ================================================ local _E local hook local pipe = function(_, id) if not id then return end local itemLink = C_TradeSkillUI.GetRecipeItemLink(id) if itemLink then oGlow:CallFilters("tradeskill", TradeSkillFrame.DetailsFrame.Contents.ResultIcon, _E and itemLink) end for i = 1, C_TradeSkillUI.GetRecipeNumReagents(id) do local reagentFrame = TradeSkillFrame.DetailsFrame.Contents.Reagents[i].Icon local reagentLink = C_TradeSkillUI.GetRecipeReagentItemLink(id, i) oGlow:CallFilters("tradeskill", reagentFrame, _E and reagentLink) end end local doHook = function() if not hook then hook = function(...) if _E then return pipe(...) end end hooksecurefunc(TradeSkillFrame.RecipeList, "SetSelectedRecipeID", hook) end end local function ADDON_LOADED(self, event, addon) if addon == "Blizzard_TradeSkillUI" then doHook() self:UnregisterEvent(event, ADDON_LOADED) end end local update = function(self) local id = GetTradeSkillSelectionIndex() if id and IsAddOnLoaded("Blizzard_TradeSkillUI") then return pipe(id) end end local enable = function(self) _E = true if IsAddOnLoaded("Blizzard_TradeSkillUI") then doHook() else self:RegisterEvent("ADDON_LOADED", ADDON_LOADED) end end local disable = function(self) _E = nil self:UnregisterEvent("ADDON_LOADED", ADDON_LOADED) end oGlow:RegisterPipe("tradeskill", enable, disable, update, "Profession frame") ================================================ FILE: ShestakUI/Libs/oGlow/Pipes/VoidStorage.lua ================================================ local _E local hooked local updateContents = function(self) if not IsAddOnLoaded("Blizzard_VoidStorageUI") then return end for slot = 1, VOID_WITHDRAW_MAX or 80 do local slotFrame = _G["VoidStorageStorageButton"..slot] local page = VoidStorageFrame.page self:CallFilters("voidstore", slotFrame, _E and (GetVoidItemInfo(page, slot))) end for slot = 1, VOID_WITHDRAW_MAX or 9 do local slotFrame = _G["VoidStorageWithdrawButton"..slot] self:CallFilters("voidstore", slotFrame, _E and GetVoidTransferWithdrawalInfo(slot)) end end local updateDeposit = function(self, event, slot) if not IsAddOnLoaded("Blizzard_VoidStorageUI") then return end local slotFrame = _G["VoidStorageDepositButton"..slot] self:CallFilters("voidstore", slotFrame, _E and GetVoidTransferDepositInfo(slot)) end local update = function(self) if not IsAddOnLoaded("Blizzard_VoidStorageUI") then return end for slot = 1, VOID_DEPOSIT_MAX or 9 do updateDeposit(self, nil, slot) end return updateContents(self) end local function hookCheck(self) if not (IsAddOnLoaded("Blizzard_VoidStorageUI") and oGlow:IsPipeEnabled"voidstore") then return end if not hooked then hooksecurefunc("VoidStorage_SetPageNumber", function() updateContents(self) end) hooked = true self:UnregisterEvent("VOID_STORAGE_OPEN", hookCheck) end end local enable = function(self) _E = true self:RegisterEvent("VOID_STORAGE_CONTENTS_UPDATE", updateContents) self:RegisterEvent("VOID_STORAGE_DEPOSIT_UPDATE", updateDeposit) self:RegisterEvent("VOID_STORAGE_UPDATE", update) self:RegisterEvent("VOID_TRANSFER_DONE", update) -- self:RegisterEvent("VOID_STORAGE_OPEN", update) -- self:RegisterEvent("VOID_STORAGE_OPEN", hookCheck) end local disable = function(self) _E = nil self:UnregisterEvent("VOID_STORAGE_CONTENTS_UPDATE", updateContents) self:UnregisterEvent("VOID_STORAGE_DEPOSIT_UPDATE", updateDeposit) self:UnregisterEvent("VOID_STORAGE_UPDATE", update) self:UnregisterEvent("VOID_TRANSFER_DONE", update) -- self:UnregisterEvent("VOID_STORAGE_OPEN", update) -- self:UnregisterEvent("VOID_STORAGE_OPEN", hookCheck) end oGlow:RegisterPipe("voidstore", enable, disable, update, "Void storage frame") ================================================ FILE: ShestakUI/Libs/oGlow/oGlow.lua ================================================ local error = function(...) print("|cffff0000Error:|r "..string.format(...)) end local pipesTable = {} local filtersTable = {} local displaysTable = {} local numPipes = 0 local numFilters = 0 local activeFilters = {} local event_metatable = { __call = function(funcs, self, ...) for _, func in pairs(funcs) do func(self, ...) end end, } local oGlow = CreateFrame("Frame", "oGlow") function oGlow:ADDON_LOADED(event, addon) if addon == "ShestakUI" then for pipe in next, pipesTable do self:EnablePipe(pipe) for filter in next, filtersTable do self:RegisterFilterOnPipe(pipe, filter) end end self:UnregisterEvent(event, self.ADDON_LOADED) end end -- Event API local RegisterEvent = oGlow.RegisterEvent function oGlow:RegisterEvent(event, func) if type(func) == "string" and type(self[func]) == "function" then func = self[func] end local curev = self[event] if curev and func then if type(curev) == "function" then self[event] = setmetatable({curev, func}, event_metatable) else for _, infunc in next, curev do if infunc == func then return end end table.insert(curev, func) end elseif self:IsEventRegistered(event) then return else if func then self[event] = func elseif not self[event] then return error("Handler for event [%s] does not exist.", event) end RegisterEvent(self, event) end end local UnregisterEvent = oGlow.UnregisterEvent function oGlow:UnregisterEvent(event, func) local curev = self[event] if type(curev) == "table" and func then for k, infunc in next, curev do if infunc == func then curev[k] = nil if #curev == 0 then table.remove(curev, k) UnregisterEvent(self, event) end break end end else self[event] = nil UnregisterEvent(self, event) end end oGlow:SetScript("OnEvent", function(self, event, ...) return self[event](self, event, ...) end) -- Pipe API function oGlow:RegisterPipe(pipe, enable, disable, update, name) if pipesTable[pipe] then return nil, string.format("Pipe [%s] is already registered.") else numPipes = numPipes + 1 pipesTable[pipe] = { enable = enable; disable = disable; name = name; update = update; } end return true end do local function iter(_, n) local n, t = next(pipesTable, n) if t then return n, t.isActive, t.name end end function oGlow.IteratePipes() return iter, nil, nil end end function oGlow:EnablePipe(pipe) local ref = pipesTable[pipe] if ref and not ref.isActive then ref.enable(self) ref.isActive = true return true end end function oGlow:DisablePipe(pipe) local ref = pipesTable[pipe] if ref and ref.isActive then if ref.disable then ref.disable(self) end ref.isActive = nil return true end end function oGlow:IsPipeEnabled(pipe) return pipesTable[pipe].isActive end function oGlow:UpdatePipe(pipe) local ref = pipesTable[pipe] if ref and ref.isActive then ref.update(self) return true end end function oGlow:GetNumPipes() return numPipes end -- Filter API function oGlow:RegisterFilter(name, type, filter) if filtersTable[name] then return nil, "Filter function is already registered." end filtersTable[name] = {type, filter, name} numFilters = numFilters + 1 return true end do local function iter(_, n) local n, t = next(filtersTable, n) if t then return n, t[1], t[4] end end function oGlow.IterateFilters() return iter, nil, nil end end function oGlow:RegisterFilterOnPipe(pipe, filter) if not pipesTable[pipe] then return nil, "Pipe does not exist." end if not filtersTable[filter] then return nil, "Filter does not exist." end if not activeFilters[pipe] then local filterTable = filtersTable[filter] local display = filterTable[1] activeFilters[pipe] = {} activeFilters[pipe][display] = {} table.insert(activeFilters[pipe][display], filterTable) else local filterTable = filtersTable[filter] local ref = activeFilters[pipe][filterTable[1]] for _, func in next, ref do if func == filter then return nil, "Filter function is already registered." end end table.insert(ref, filterTable) end return true end -- Display API function oGlow:RegisterDisplay(name, display) displaysTable[name] = display end -- General API function oGlow:CallFilters(pipe, frame, ...) if not pipesTable[pipe] then return nil, "Pipe does not exist." end local ref = activeFilters[pipe] if ref then for display, filters in next, ref do if not displaysTable[display] then return nil, "Display does not exist." end for i = 1, #filters do local func = filters[i][2] if (displaysTable[display](frame, func(...))) then break end end end end end oGlow:RegisterEvent("ADDON_LOADED") ================================================ FILE: ShestakUI/Libs/oGlow/oGlow.xml ================================================ ================================================ FILE: ShestakUI/Modules/Blizzard/TalkingHead.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ------------------------------------------------------------------------------------------ -- Set custom position for TalkingHeadFrame ------------------------------------------------------------------------------------------ local Load = CreateFrame("Frame") Load:RegisterEvent("PLAYER_ENTERING_WORLD") Load:SetScript("OnEvent", function() TalkingHeadFrame.ignoreFramePositionManager = true TalkingHeadFrame:ClearAllPoints() TalkingHeadFrame:SetPoint(unpack(C.position.talking_head)) Load:UnregisterEvent("PLAYER_ENTERING_WORLD") end) hooksecurefunc(TalkingHeadFrame, "SetPoint", function(self, _, _, _, x) if x ~= C.position.talking_head[4] then self:ClearAllPoints() self:SetPoint(unpack(C.position.talking_head)) end end) ---------------------------------------------------------------------------------------- -- Hide TalkingHeadFrame ---------------------------------------------------------------------------------------- if C.general.hide_talking_head == true then hooksecurefunc(TalkingHeadFrame, "PlayCurrent", function() TalkingHeadFrame:Hide() end) end ================================================ FILE: ShestakUI/Modules/Blizzard/TimerTracker.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Skin TimerTracker(by Tukz) ---------------------------------------------------------------------------------------- local function SkinIt(bar) for i = 1, bar:GetNumRegions() do local region = select(i, bar:GetRegions()) if region:GetObjectType() == "Texture" then region:SetTexture(nil) elseif region:GetObjectType() == "FontString" then region:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) region:SetShadowOffset(0, 0) end end bar:CreateBackdrop("Default") bar:SetStatusBarTexture(C.media.texture) bar:SetStatusBarColor(0.7, 0, 0) bar.bg = bar:CreateTexture(nil, "BACKGROUND") bar.bg:SetAllPoints(bar) bar.bg:SetTexture(C.media.texture) bar.bg:SetVertexColor(0.7, 0, 0, 0.3) end local function SkinBlizzTimer() for _, b in pairs(TimerTracker.timerList) do if b["bar"] and not b["bar"].skinned then SkinIt(b["bar"]) b["bar"].skinned = true end end end local frame = CreateFrame("Frame") frame:RegisterEvent("START_TIMER") frame:SetScript("OnEvent", SkinBlizzTimer) ================================================ FILE: ShestakUI/Modules/Blizzard/UIWidget.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- UIWidget position ---------------------------------------------------------------------------------------- local top, below, power, maw = _G["UIWidgetTopCenterContainerFrame"], _G["UIWidgetBelowMinimapContainerFrame"], _G["UIWidgetPowerBarContainerFrame"], _G["MawBuffsBelowMinimapFrame"] -- Top Widget local topAnchor = CreateFrame("Frame", "UIWidgetTopAnchor", UIParent) topAnchor:SetSize(200, 30) topAnchor:SetPoint(unpack(C.position.uiwidget_top)) top:ClearAllPoints() top:SetPoint("TOP", topAnchor) -- Below Widget local belowAnchor = CreateFrame("Frame", "UIWidgetBelowAnchor", UIParent) belowAnchor:SetSize(150, 30) local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function(self, event) if event == "PLAYER_ENTERING_WORLD" then if not belowAnchor:IsUserPlaced() then belowAnchor:ClearAllPoints() belowAnchor:SetPoint(unpack(C.position.uiwidget_below)) end self:UnregisterEvent("PLAYER_ENTERING_WORLD") end end) hooksecurefunc(below, "SetPoint", function(self, _, anchor) if anchor and anchor ~= belowAnchor then self:ClearAllPoints() self:SetPoint("TOP", belowAnchor) end end) -- Power Bar Widget local powerAnchor = CreateFrame("Frame", "UIWidgetPowerBarAnchor", UIParent) powerAnchor:SetSize(210, 30) powerAnchor:SetPoint(unpack(C.position.uiwidget_below)) hooksecurefunc(power, "SetPoint", function(self, _, anchor) if anchor and anchor ~= powerAnchor then self:ClearAllPoints() self:SetPoint("TOP", powerAnchor) end end) -- Maw Buff Widget local mawAnchor = CreateFrame("Frame", "UIWidgetMawAnchor", UIParent) mawAnchor:SetSize(210, 30) mawAnchor:SetPoint("TOPRIGHT", BuffsAnchor, "BOTTOMRIGHT", 0, -3) hooksecurefunc(maw, "SetPoint", function(self, _, anchor) if anchor and anchor ~= mawAnchor then self:ClearAllPoints() self:SetPoint("TOPRIGHT", mawAnchor) end end) -- Mover for all widgets for _, frame in pairs({top, below, maw}) do local anchor = frame == top and topAnchor or frame == below and belowAnchor or mawAnchor anchor:SetMovable(true) anchor:SetClampedToScreen(true) frame:SetClampedToScreen(true) frame:SetScript("OnMouseDown", function(_, button) if IsAltKeyDown() or IsShiftKeyDown() then anchor:ClearAllPoints() anchor:StartMoving() elseif IsControlKeyDown() and button == "RightButton" then anchor:ClearAllPoints() if frame == top then anchor:SetPoint(unpack(C.position.uiwidget_top)) elseif frame == below then anchor:SetPoint(unpack(C.position.uiwidget_below)) else anchor:SetPoint("TOPRIGHT", BuffsAnchor, "BOTTOMRIGHT", 0, -3) end anchor:SetUserPlaced(false) end end) frame:SetScript("OnMouseUp", function() anchor:StopMovingOrSizing() end) end ---------------------------------------------------------------------------------------- -- UIWidget skin ---------------------------------------------------------------------------------------- local atlasColors = { ["UI-Frame-Bar-Fill-Blue"] = {0.2, 0.6, 1}, ["UI-Frame-Bar-Fill-Red"] = {0.9, 0.2, 0.2}, ["UI-Frame-Bar-Fill-Yellow"] = {1, 0.6, 0}, ["objectivewidget-bar-fill-left"] = {0.2, 0.6, 1}, ["objectivewidget-bar-fill-right"] = {0.9, 0.2, 0.2} } local function SkinStatusBar(widget) local bar = widget.Bar if widget:IsForbidden() then if bar and bar.tooltip then bar.tooltip = nil end return end local atlas = bar:GetStatusBarTexture() if atlasColors[atlas] then bar:SetStatusBarTexture(C.media.texture) bar:SetStatusBarColor(unpack(atlasColors[atlas])) end if widget:GetParent() == power then -- Don't skin Cosmic Energy bar if widget.widgetID == 3463 then bar.styled = true end end if not bar.styled then bar.BGLeft:SetAlpha(0) bar.BGRight:SetAlpha(0) bar.BGCenter:SetAlpha(0) bar.BorderLeft:SetAlpha(0) bar.BorderRight:SetAlpha(0) bar.BorderCenter:SetAlpha(0) bar.Spark:SetAlpha(0) local parent = widget:GetParent():GetParent() if parent.castBar or parent.UnitFrame then -- nameplate Mixin(bar, BackdropTemplateMixin) bar:SetBackdrop({ bgFile = C.media.blank, insets = {left = 0, right = 0, top = 0, bottom = 0} }) bar:SetBackdropColor(0.1, 0.1, 0.1, 1) else bar:CreateBackdrop("Overlay") end bar.styled = true end end local function SkinDoubleStatusBar(widget) for _, bar in pairs({widget.LeftBar, widget.RightBar}) do local atlas = bar:GetStatusBarTexture() if atlasColors[atlas] then bar:SetStatusBarTexture(C.media.texture) bar:SetStatusBarColor(unpack(atlasColors[atlas])) end if not bar.styled then bar.BG:SetAlpha(0) bar.BorderLeft:SetAlpha(0) bar.BorderRight:SetAlpha(0) bar.BorderCenter:SetAlpha(0) bar.Spark:SetAlpha(0) bar.SparkGlow:SetAlpha(0) bar:CreateBackdrop("Overlay") bar.styled = true end end end local function SkinCaptureBar(widget) widget.LeftLine:SetAlpha(0) widget.RightLine:SetAlpha(0) widget.BarBackground:SetAlpha(0) widget.Glow1:SetAlpha(0) widget.Glow2:SetAlpha(0) widget.Glow3:SetAlpha(0) widget.LeftBar:SetTexture(C.media.texture) widget.NeutralBar:SetTexture(C.media.texture) widget.RightBar:SetTexture(C.media.texture) widget.LeftBar:SetVertexColor(0.2, 0.6, 1) widget.NeutralBar:SetVertexColor(0.8, 0.8, 0.8) widget.RightBar:SetVertexColor(0.9, 0.2, 0.2) if not widget.backdrop then widget:CreateBackdrop("Default") widget.backdrop:SetPoint("TOPLEFT", widget.LeftBar, -2, 2) widget.backdrop:SetPoint("BOTTOMRIGHT", widget.RightBar, 2, -2) end end local VigorBar = CreateFrame("Frame", "VigorBar", UIParent) VigorBar:CreateBackdrop("Default") VigorBar:SetPoint("TOP", powerAnchor, "TOP", 0, -2) VigorBar:SetSize(250, 12) VigorBar:Hide() for i = 1, 6 do VigorBar[i] = CreateFrame("StatusBar", "Vigor"..i, VigorBar) VigorBar[i]:SetSize((250 - 5) / 6, 12) if i == 1 then VigorBar[i]:SetPoint("TOPLEFT", VigorBar, "TOPLEFT", 0, 0) else VigorBar[i]:SetPoint("TOPLEFT", VigorBar[i-1], "TOPRIGHT", 1, 0) end VigorBar[i]:SetStatusBarTexture(C.media.texture) VigorBar[i]:SetMinMaxValues(0, 100) VigorBar[i]:SetStatusBarColor(0.2, 0.58, 0.8) VigorBar[i].bg = VigorBar[i]:CreateTexture(nil, "BORDER") VigorBar[i].bg:SetAllPoints() VigorBar[i].bg:SetTexture(C.media.texture) VigorBar[i].bg:SetVertexColor(0.2, 0.58, 0.8, 0.2) VigorBar[i]:SetValue(0) end local function SkinVigorBar(widget) local widgetInfo = C_UIWidgetManager.GetFillUpFramesWidgetVisualizationInfo(4460) if not widgetInfo then return end VigorBar:Show() local total = widgetInfo.numTotalFrames for i = 1, total do local value = 0 if widgetInfo.numFullFrames >= i then value = widgetInfo.fillMax elseif widgetInfo.numFullFrames + 1 == i then value = widgetInfo.fillValue else value = widgetInfo.fillMin end VigorBar[i]:SetValue(value) end if total < 6 and IsPlayerSpell(377922) then total = 6 end -- sometimes it return 5 if total < 6 then for i = total + 1, 6 do VigorBar[i]:Hide() VigorBar[i]:SetValue(0) end local spacing = select(4, VigorBar[6]:GetPoint()) local w = VigorBar:GetWidth() local s = 0 for i = 1, total do VigorBar[i]:Show() if i ~= total then VigorBar[i]:SetWidth(w / total - spacing) s = s + (w / total) else VigorBar[i]:SetWidth(w - s) end end end widget:SetAlpha(0) if not widget.hook then hooksecurefunc(widget, "Hide", function(self) VigorBar:Hide() end) widget.hook = true end end local frame = CreateFrame("Frame") frame:RegisterEvent("UPDATE_UI_WIDGET") frame:RegisterEvent("UPDATE_ALL_UI_WIDGETS") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function() for _, widget in pairs(UIWidgetTopCenterContainerFrame.widgetFrames) do if widget.widgetType == _G.Enum.UIWidgetVisualizationType.StatusBar then SkinStatusBar(widget) elseif widget.widgetType == _G.Enum.UIWidgetVisualizationType.DoubleStatusBar then SkinDoubleStatusBar(widget) end end for _, widget in pairs(UIWidgetBelowMinimapContainerFrame.widgetFrames) do if widget.widgetType == Enum.UIWidgetVisualizationType.CaptureBar then SkinCaptureBar(widget) end end for _, widget in pairs(UIWidgetPowerBarContainerFrame.widgetFrames) do if widget.widgetID == 4460 then SkinVigorBar(widget) end end end) hooksecurefunc(UIWidgetTemplateScenarioHeaderCurrenciesAndBackgroundMixin, "Setup", function(widgetInfo) widgetInfo.Frame:SetAlpha(0) for frame in widgetInfo.currencyPool:EnumerateActive() do frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end end) hooksecurefunc(UIWidgetTemplateStatusBarMixin, "Setup", function(widget) SkinStatusBar(widget) end) -- Maw Buffs skin maw:SetSize(210, 40) maw.Container:SkinButton() maw.Container:SetSize(200, 30) maw.Container.List:StripTextures() maw.Container.List:SetTemplate("Overlay") maw.Container.List:ClearAllPoints() maw.Container.List:SetPoint("TOPRIGHT", maw.Container, "TOPLEFT", -15, 0) maw.Container.List:HookScript("OnShow", function(self) self.button:SetPushedTexture(0) self.button:SetHighlightTexture(0) self.button:SetWidth(200) self.button:SetButtonState("NORMAL") self.button:SetPushedTextOffset(0, 0) self.button:SetButtonState("PUSHED", true) end) maw.Container.List:HookScript("OnHide", function(self) self.button:SetPushedTexture(0) self.button:SetHighlightTexture(0) self.button:SetWidth(200) end) -- Hide Maw Buffs if C.general.hide_maw_buffs then maw:SetAlpha(0) maw:SetScale(0.001) end ================================================ FILE: ShestakUI/Modules/Blizzard/Vehicle.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Move vehicle indicator ---------------------------------------------------------------------------------------- local VehicleAnchor = CreateFrame("Frame", "VehicleAnchor", UIParent) VehicleAnchor:SetPoint(unpack(C.position.vehicle)) VehicleAnchor:SetSize(130, 130) hooksecurefunc(VehicleSeatIndicator, "SetPoint", function(_, _, parent) if parent == "MinimapCluster" or parent == _G["MinimapCluster"] then VehicleSeatIndicator:ClearAllPoints() VehicleSeatIndicator:SetPoint("BOTTOM", VehicleAnchor, "BOTTOM", 0, 24) VehicleSeatIndicator:SetFrameStrata("LOW") end end) ---------------------------------------------------------------------------------------- -- Vehicle indicator on mouseover ---------------------------------------------------------------------------------------- if C.general.vehicle_mouseover == true then local function VehicleSeatMouseover(vehicleID) if VehicleSeatIndicator:IsShown() then VehicleSeatIndicator:SetAlpha(0) VehicleSeatIndicator:HookScript("OnEnter", function() VehicleSeatIndicator:SetAlpha(1) end) VehicleSeatIndicator:HookScript("OnLeave", function() VehicleSeatIndicator:SetAlpha(0) end) local _, numSeat = GetVehicleUIIndicator(vehicleID) for i = 1, numSeat do local b = _G["VehicleSeatIndicatorButton"..i] b:HookScript("OnEnter", function() VehicleSeatIndicator:SetAlpha(1) end) b:HookScript("OnLeave", function() VehicleSeatIndicator:SetAlpha(0) end) end end end hooksecurefunc("VehicleSeatIndicator_SetUpVehicle", VehicleSeatMouseover) end ================================================ FILE: ShestakUI/Modules/Chat/ChatBars.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true or C.chat.chat_bar ~= true then return end ---------------------------------------------------------------------------------------- -- ChatBar(FavChatBar by Favorit) ---------------------------------------------------------------------------------------- local frame = CreateFrame("Frame", "ChatBar", UIParent) frame:CreatePanel("Invisible", 16, C.chat.background and C.chat.height + 4 or C.chat.height - 1, "BOTTOMLEFT", UIParent, "BOTTOMLEFT", 2, C.chat.background and 24 or 20) if C.chat.chat_bar_mouseover == true then frame:SetAlpha(0) frame:SetScript("OnEnter", function() frame:FadeIn() end) frame:SetScript("OnLeave", function() frame:FadeOut() end) end local function CreateButton(b, l, r, m) b:SetWidth(16) b:SetHeight(16) b:SetTemplate("Default") b:RegisterForClicks("AnyUp") b:SetScript("OnClick", function(_, b) if b == "LeftButton" then ChatFrame_OpenChat(l, SELECTED_DOCK_FRAME) elseif b == "RightButton" then ChatFrame_OpenChat(r, SELECTED_DOCK_FRAME) elseif m and b == "MiddleButton" then ChatFrame_OpenChat(m, SELECTED_DOCK_FRAME) end end) if C.chat.chat_bar_mouseover == true then b:SetScript("OnEnter", function() frame:FadeIn() end) b:SetScript("OnLeave", function() frame:FadeOut() end) end b.t = b:CreateTexture(nil, "ARTWORK") b.t:SetTexture(C.media.blank) b.t:SetPoint("TOPLEFT", b, "TOPLEFT", 2, -2) b.t:SetPoint("BOTTOMRIGHT", b, "BOTTOMRIGHT", -2, 2) end local b1 = CreateFrame("Button", "$parentButton1", frame) CreateButton(b1, "/s", "/w ", "/y") b1:SetPoint("TOP", frame, "TOP", 0, 0) b1:SetBackdropBorderColor(0.7, 0.33, 0.82, 1) b1.t:SetVertexColor(0.8, 0.8, 0.8, 1) local b2 = CreateFrame("Button", "$parentButton2", frame) CreateButton(b2, "/g", "/o") b2:SetPoint("TOP", b1, "BOTTOM", 0, C.chat.background and -4 or -3) b2:SetBackdropBorderColor(0, 0.54, 0, 1) b2.t:SetVertexColor(0, 0.8, 0, 1) local b3 = CreateFrame("Button", "$parentButton3", frame) CreateButton(b3, "/p", "/i") b3:SetPoint("TOP", b2, "BOTTOM", 0, C.chat.background and -4 or -3) b3:SetBackdropBorderColor(0.8, 0.4, 0.1, 1) b3.t:SetVertexColor(0.11, 0.5, 0.7, 1) local b4 = CreateFrame("Button", "$parentButton4", frame) CreateButton(b4, "/ra", "/rw") b4:SetPoint("TOP", b3, "BOTTOM", 0, C.chat.background and -4 or -3) b4:SetBackdropBorderColor(0.96, 0.2, 0.2, 1) b4.t:SetVertexColor(1, 0.3, 0, 1) local b5 = CreateFrame("Button", "$parentButton5", frame) CreateButton(b5, "/1", "/2") b5:SetPoint("TOP", b4, "BOTTOM", 0, C.chat.background and -4 or -3) b5:SetBackdropBorderColor(0.7, 0.7, 0, 1) b5.t:SetVertexColor(0.93, 0.8, 0.8, 1) local b6 = CreateFrame("Button", "$parentButton6", frame) CreateButton(b6, "/3", "/4") b6:SetPoint("TOP", b5, "BOTTOM", 0, C.chat.background and -4 or -3) b6:SetBackdropBorderColor(0.5, 1, 0.83, 1) b6.t:SetVertexColor(1, 0.75, 0.75, 1) ================================================ FILE: ShestakUI/Modules/Chat/ChatBind.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Binding keys for chat channels ---------------------------------------------------------------------------------------- BINDING_HEADER_CHATKEY = CHAT_CHANNELS BINDING_NAME_GUILD_MESSAGE = GUILD BINDING_NAME_PARTY_MESSAGE = PARTY BINDING_NAME_RAID_MESSAGE = RAID BINDING_NAME_RW_MESSAGE = RAID_WARNING BINDING_NAME_IC_MESSAGE = INSTANCE_CHAT BINDING_NAME_SAY_MESSAGE = SAY BINDING_NAME_TARGET_MESSAGE = TARGET function ChatKey_Chat(arg) ChatFrame_OpenChat(arg) end ================================================ FILE: ShestakUI/Modules/Chat/ChatFrames.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Style chat frame(by Tukz and p3lim) ---------------------------------------------------------------------------------------- local origs = {} local function Strip(info, name) return string.format("|Hplayer:%s|h[%s]|h", info, name:gsub("%-[^|]+", "")) end -- Function to rename channel and other stuff local AddMessage = function(self, text, ...) if type(text) == "string" then text = text:gsub("|h%[(%d+)%. .-%]|h", "|h[%1]|h") text = text:gsub("|Hplayer:(.-)|h%[(.-)%]|h", Strip) end return origs[self](self, text, ...) end -- Global strings _G.CHAT_INSTANCE_CHAT_GET = "|Hchannel:INSTANCE_CHAT|h["..L_CHAT_INSTANCE_CHAT.."]|h %s:\32" _G.CHAT_INSTANCE_CHAT_LEADER_GET = "|Hchannel:INSTANCE_CHAT|h["..L_CHAT_INSTANCE_CHAT_LEADER.."]|h %s:\32" _G.CHAT_BN_WHISPER_GET = L_CHAT_BN_WHISPER.." %s:\32" _G.CHAT_GUILD_GET = "|Hchannel:GUILD|h["..L_CHAT_GUILD.."]|h %s:\32" _G.CHAT_OFFICER_GET = "|Hchannel:OFFICER|h["..L_CHAT_OFFICER.."]|h %s:\32" _G.CHAT_PARTY_GET = "|Hchannel:PARTY|h["..L_CHAT_PARTY.."]|h %s:\32" _G.CHAT_PARTY_LEADER_GET = "|Hchannel:PARTY|h["..L_CHAT_PARTY_LEADER.."]|h %s:\32" _G.CHAT_PARTY_GUIDE_GET = CHAT_PARTY_LEADER_GET _G.CHAT_RAID_GET = "|Hchannel:RAID|h["..L_CHAT_RAID.."]|h %s:\32" _G.CHAT_RAID_LEADER_GET = "|Hchannel:RAID|h["..L_CHAT_RAID_LEADER.."]|h %s:\32" _G.CHAT_RAID_WARNING_GET = "["..L_CHAT_RAID_WARNING.."] %s:\32" _G.CHAT_PET_BATTLE_COMBAT_LOG_GET = "|Hchannel:PET_BATTLE_COMBAT_LOG|h["..L_CHAT_PET_BATTLE.."]|h:\32" _G.CHAT_PET_BATTLE_INFO_GET = "|Hchannel:PET_BATTLE_INFO|h["..L_CHAT_PET_BATTLE.."]|h:\32" _G.CHAT_SAY_GET = "%s:\32" _G.CHAT_WHISPER_GET = L_CHAT_WHISPER.." %s:\32" _G.CHAT_YELL_GET = "%s:\32" _G.CHAT_FLAG_AFK = "|cffE7E716"..L_CHAT_AFK.."|r " _G.CHAT_FLAG_DND = "|cffFF0000"..L_CHAT_DND.."|r " _G.CHAT_FLAG_GM = "|cff4154F5"..L_CHAT_GM.."|r " _G.ERR_FRIEND_ONLINE_SS = "|Hplayer:%s|h[%s]|h "..L_CHAT_COME_ONLINE _G.ERR_FRIEND_OFFLINE_S = "[%s] "..L_CHAT_GONE_OFFLINE -- Hide chat bubble menu button ChatFrameMenuButton:Kill() -- Kill channel and voice buttons ChatFrameChannelButton:Kill() ChatFrameToggleVoiceDeafenButton:Kill() ChatFrameToggleVoiceMuteButton:Kill() -- Set chat style local function SetChatStyle(frame) local id = frame:GetID() local chat = frame:GetName() _G[chat]:SetFrameLevel(5) -- Removes crap from the bottom of the chatbox so it can go to the bottom of the screen _G[chat]:SetClampedToScreen(false) -- Stop the chat chat from fading out _G[chat]:SetFading(false) -- Move the chat edit box _G[chat.."EditBox"]:ClearAllPoints() _G[chat.."EditBox"]:SetPoint("BOTTOMLEFT", ChatFrame1, "TOPLEFT", -10, 23) _G[chat.."EditBox"]:SetPoint("BOTTOMRIGHT", ChatFrame1, "TOPRIGHT", 11, 23) -- Hide textures for j = 1, #CHAT_FRAME_TEXTURES do _G[chat..CHAT_FRAME_TEXTURES[j]]:SetTexture(nil) end -- Removes Default ChatFrame Tabs texture _G[format("ChatFrame%sTab", id)].Left:Kill() _G[format("ChatFrame%sTab", id)].Middle:Kill() _G[format("ChatFrame%sTab", id)].Right:Kill() _G[format("ChatFrame%sTab", id)].ActiveLeft:Kill() _G[format("ChatFrame%sTab", id)].ActiveMiddle:Kill() _G[format("ChatFrame%sTab", id)].ActiveRight:Kill() _G[format("ChatFrame%sTab", id)].HighlightLeft:Kill() _G[format("ChatFrame%sTab", id)].HighlightMiddle:Kill() _G[format("ChatFrame%sTab", id)].HighlightRight:Kill() -- Killing off the new chat tab selected feature _G[format("ChatFrame%sButtonFrameMinimizeButton", id)]:Kill() _G[format("ChatFrame%sButtonFrame", id)]:Kill() -- Kills off the retarded new circle around the editbox _G[format("ChatFrame%sEditBoxLeft", id)]:Kill() _G[format("ChatFrame%sEditBoxMid", id)]:Kill() _G[format("ChatFrame%sEditBoxRight", id)]:Kill() _G[format("ChatFrame%sTabGlow", id)]:Kill() -- Kill scroll bar frame.ScrollBar:Kill() frame.ScrollToBottomButton:Kill() -- Kill off editbox artwork local a, b, c = select(6, _G[chat.."EditBox"]:GetRegions()) a:Kill() b:Kill() c:Kill() -- Kill bubble tex/glow if _G[chat.."Tab"].conversationIcon then _G[chat.."Tab"].conversationIcon:Kill() end -- Disable alt key usage _G[chat.."EditBox"]:SetAltArrowKeyMode(false) -- Hide editbox on login _G[chat.."EditBox"]:Hide() -- Script to hide editbox instead of fading editbox to 0.35 alpha via IM Style _G[chat.."EditBox"]:HookScript("OnEditFocusGained", function(self) self:Show() end) _G[chat.."EditBox"]:HookScript("OnEditFocusLost", function(self) if self:GetText() == "" then self:Hide() end end) -- Hide edit box every time we click on a tab _G[chat.."Tab"]:HookScript("OnClick", function() _G[chat.."EditBox"]:Hide() end) -- Create our own texture for edit box if C.chat.background == true and C.chat.tabs_mouseover ~= true then local EditBoxBackground = CreateFrame("Frame", "ChatEditBoxBackground", _G[chat.."EditBox"]) EditBoxBackground:CreatePanel("Transparent", 1, 1, "LEFT", _G[chat.."EditBox"], "LEFT", 0, 0) EditBoxBackground:ClearAllPoints() EditBoxBackground:SetPoint("TOPLEFT", _G[chat.."EditBox"], "TOPLEFT", 7, -5) EditBoxBackground:SetPoint("BOTTOMRIGHT", _G[chat.."EditBox"], "BOTTOMRIGHT", -7, 4) EditBoxBackground:SetFrameStrata("LOW") EditBoxBackground:SetFrameLevel(1) local function colorize(r, g, b) EditBoxBackground:SetBackdropBorderColor(r, g, b) end -- Update border color according where we talk hooksecurefunc("ChatEdit_UpdateHeader", function() local chatType = _G[chat.."EditBox"]:GetAttribute("chatType") if not chatType then return end local chanTarget = _G[chat.."EditBox"]:GetAttribute("channelTarget") local chanName = chanTarget and GetChannelName(chanTarget) if chanName and chatType == "CHANNEL" then if chanName == 0 then colorize(unpack(C.media.border_color)) else colorize(ChatTypeInfo[chatType..chanName].r, ChatTypeInfo[chatType..chanName].g, ChatTypeInfo[chatType..chanName].b) end else colorize(ChatTypeInfo[chatType].r, ChatTypeInfo[chatType].g, ChatTypeInfo[chatType].b) end end) end -- Rename combat log tab if _G[chat] == _G["ChatFrame2"] then CombatLogQuickButtonFrame_Custom:StripTextures() CombatLogQuickButtonFrame_Custom:CreateBackdrop("Transparent") CombatLogQuickButtonFrame_Custom.backdrop:SetPoint("TOPLEFT", 1, -4) CombatLogQuickButtonFrame_Custom.backdrop:SetPoint("BOTTOMRIGHT", -22, 0) T.SkinCloseButton(CombatLogQuickButtonFrame_CustomAdditionalFilterButton, CombatLogQuickButtonFrame_Custom.backdrop, " ", true) CombatLogQuickButtonFrame_CustomAdditionalFilterButton:SetSize(12, 12) CombatLogQuickButtonFrame_CustomAdditionalFilterButton:SetHitRectInsets (0, 0, 0, 0) CombatLogQuickButtonFrame_CustomProgressBar:ClearAllPoints() CombatLogQuickButtonFrame_CustomProgressBar:SetPoint("TOPLEFT", CombatLogQuickButtonFrame_Custom.backdrop, 2, -2) CombatLogQuickButtonFrame_CustomProgressBar:SetPoint("BOTTOMRIGHT", CombatLogQuickButtonFrame_Custom.backdrop, -2, 2) CombatLogQuickButtonFrame_CustomProgressBar:SetStatusBarTexture(C.media.texture) CombatLogQuickButtonFrameButton1:SetPoint("BOTTOM", 0, 0) end if _G[chat] ~= _G["ChatFrame2"] then origs[_G[chat]] = _G[chat].AddMessage _G[chat].AddMessage = AddMessage -- Custom timestamps color local color = C.chat.custom_time_color and T.RGBToHex(unpack(C.chat.time_color)) or "" _G.TIMESTAMP_FORMAT_HHMM = color.."[%I:%M]|r " _G.TIMESTAMP_FORMAT_HHMMSS = color.."[%I:%M:%S]|r " _G.TIMESTAMP_FORMAT_HHMMSS_24HR = color.."[%H:%M:%S]|r " _G.TIMESTAMP_FORMAT_HHMMSS_AMPM = color.."[%I:%M:%S %p]|r " _G.TIMESTAMP_FORMAT_HHMM_24HR = color.."[%H:%M]|r " _G.TIMESTAMP_FORMAT_HHMM_AMPM = color.."[%I:%M %p]|r " end frame.skinned = true end -- Setup chatframes 1 to 10 on login local function SetupChat() for i = 1, NUM_CHAT_WINDOWS do local frame = _G[format("ChatFrame%s", i)] SetChatStyle(frame) end -- Remember last channel local var if C.chat.sticky == true then var = 1 else var = 0 end ChatTypeInfo.SAY.sticky = var ChatTypeInfo.PARTY.sticky = var ChatTypeInfo.PARTY_LEADER.sticky = var ChatTypeInfo.GUILD.sticky = var ChatTypeInfo.OFFICER.sticky = var ChatTypeInfo.RAID.sticky = var ChatTypeInfo.RAID_WARNING.sticky = var ChatTypeInfo.INSTANCE_CHAT.sticky = var ChatTypeInfo.INSTANCE_CHAT_LEADER.sticky = var ChatTypeInfo.WHISPER.sticky = var ChatTypeInfo.BN_WHISPER.sticky = var ChatTypeInfo.CHANNEL.sticky = var end local function SetupChatPosAndFont() for i = 1, NUM_CHAT_WINDOWS do local chat = _G[format("ChatFrame%s", i)] local id = chat:GetID() local _, fontSize = FCF_GetChatWindowInfo(id) -- Min. size for chat font if fontSize < 11 then FCF_SetChatWindowFontSize(nil, chat, 11) else FCF_SetChatWindowFontSize(nil, chat, fontSize) end -- Font and font style for chat chat:SetFont(C.font.chat_font, fontSize, C.font.chat_font_style) chat:SetShadowOffset(C.font.chat_font_shadow and 1 or 0, C.font.chat_font_shadow and -1 or 0) -- Force chat position if i == 1 then chat:ClearAllPoints() chat:SetSize(C.chat.width, C.chat.height) if C.chat.background == true then chat:SetPoint(C.position.chat[1], C.position.chat[2], C.position.chat[3], C.position.chat[4], C.position.chat[5] + 4) else chat:SetPoint(C.position.chat[1], C.position.chat[2], C.position.chat[3], C.position.chat[4], C.position.chat[5]) end FCF_SavePositionAndDimensions(chat) elseif i == 2 then if C.chat.combatlog ~= true then FCF_DockFrame(chat) ChatFrame2Tab:EnableMouse(false) ChatFrame2Tab.Text:Hide() ChatFrame2Tab:SetWidth(0.001) ChatFrame2Tab.SetWidth = T.dummy FCF_DockUpdate() end end end -- Reposition Quick Join Toast and battle.net popup QuickJoinToastButton:ClearAllPoints() QuickJoinToastButton:SetPoint("TOPLEFT", 0, 90) QuickJoinToastButton.ClearAllPoints = T.dummy QuickJoinToastButton.SetPoint = T.dummy QuickJoinToastButton.Toast:ClearAllPoints() QuickJoinToastButton.Toast:SetPoint(unpack(C.position.bn_popup)) QuickJoinToastButton.Toast.Background:SetTexture("") QuickJoinToastButton.Toast:CreateBackdrop("Transparent") QuickJoinToastButton.Toast.backdrop:SetPoint("TOPLEFT", 0, 0) QuickJoinToastButton.Toast.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) QuickJoinToastButton.Toast.backdrop:Hide() QuickJoinToastButton.Toast:SetWidth(C.chat.width + 7) QuickJoinToastButton.Toast.Text:SetWidth(C.chat.width - 20) hooksecurefunc(QuickJoinToastButton, "ShowToast", function() QuickJoinToastButton.Toast.backdrop:Show() end) hooksecurefunc(QuickJoinToastButton, "HideToast", function() QuickJoinToastButton.Toast.backdrop:Hide() end) hooksecurefunc(BNToastFrame, "SetPoint", function(self, _, anchor) if anchor == QuickJoinToastButton then self:SetPoint(unpack(C.position.bn_popup)) end end) -- /run BNToastFrame:AddToast(BN_TOAST_TYPE_ONLINE, 1) hooksecurefunc(BNToastFrame, "ShowToast", function(self) if not self.IsSkinned then T.SkinCloseButton(self.CloseButton, nil, "x") self.CloseButton:SetSize(16, 16) self.IsSkinned = true end end) end for i = 3, NUM_CHAT_WINDOWS do local tab = _G[format("ChatFrame%sTab", i)] hooksecurefunc(tab, "SetPoint", function(self, point, anchor, attachTo, x, y) if anchor == GeneralDockManagerScrollFrameChild and y == -1 then self:ClearAllPoints() self:SetPoint(point, anchor, attachTo, x, -2) end end) end GeneralDockManagerOverflowButton:SetPoint("BOTTOMRIGHT", ChatFrame1, "TOPRIGHT", 0, 5) hooksecurefunc(GeneralDockManagerScrollFrame, "SetPoint", function(self, point, anchor, attachTo, x, y) if anchor == GeneralDockManagerOverflowButton and x == 0 and y == 0 then self:SetPoint(point, anchor, attachTo, 0, -4) end end) local UIChat = CreateFrame("Frame") UIChat:RegisterEvent("ADDON_LOADED") UIChat:RegisterEvent("PLAYER_ENTERING_WORLD") UIChat:SetScript("OnEvent", function(self, event, addon) if event == "ADDON_LOADED" then if addon == "Blizzard_CombatLog" then self:UnregisterEvent("ADDON_LOADED") SetupChat(self) end elseif event == "PLAYER_ENTERING_WORLD" then self:UnregisterEvent("PLAYER_ENTERING_WORLD") SetupChatPosAndFont(self) end end) -- Setup temp chat (BN, WHISPER) when needed local function SetupTempChat() local frame = FCF_GetCurrentChatFrame() if frame.skinned then return end SetChatStyle(frame) end hooksecurefunc("FCF_OpenTemporaryWindow", SetupTempChat) -- Disable pet battle tab local old = FCFManager_GetNumDedicatedFrames function FCFManager_GetNumDedicatedFrames(...) return select(1, ...) ~= "PET_BATTLE_COMBAT_LOG" and old(...) or 1 end -- Remove player's realm name local function RemoveRealmName(_, _, msg, author, ...) local realm = string.gsub(T.realm, " ", "") if msg:find("-" .. realm) then return false, gsub(msg, "%-"..realm, ""), author, ... end end ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", RemoveRealmName) ---------------------------------------------------------------------------------------- -- Save slash command typo ---------------------------------------------------------------------------------------- local function TypoHistory_Posthook_AddMessage(chat, text) if text and strfind(text, HELP_TEXT_SIMPLE) then ChatEdit_AddHistory(chat.editBox) end end for i = 1, NUM_CHAT_WINDOWS do if i ~= 2 then hooksecurefunc(_G["ChatFrame"..i], "AddMessage", TypoHistory_Posthook_AddMessage) end end ---------------------------------------------------------------------------------------- -- Loot icons ---------------------------------------------------------------------------------------- if C.chat.loot_icons == true then local function AddLootIcons(_, _, message, ...) local function Icon(link) local texture = GetItemIcon(link) return "\124T"..texture..":12:12:0:0:64:64:5:59:5:59\124t"..link end message = message:gsub("(\124c%x+\124Hitem:.-\124h\124r)", Icon) return false, message, ... end ChatFrame_AddMessageEventFilter("CHAT_MSG_LOOT", AddLootIcons) end ---------------------------------------------------------------------------------------- -- Swith channels by Tab ---------------------------------------------------------------------------------------- local cycles = { {chatType = "SAY", use = function() return 1 end}, {chatType = "PARTY", use = function() return not IsInRaid() and IsInGroup(LE_PARTY_CATEGORY_HOME) end}, {chatType = "RAID", use = function() return IsInRaid(LE_PARTY_CATEGORY_HOME) end}, {chatType = "INSTANCE_CHAT", use = function() return IsPartyLFG() end}, {chatType = "GUILD", use = function() return IsInGuild() end}, {chatType = "SAY", use = function() return 1 end}, } local function UpdateTabChannelSwitch(self) if strsub(tostring(self:GetText()), 1, 1) == "/" then return end local currChatType = self:GetAttribute("chatType") for i, curr in ipairs(cycles) do if curr.chatType == currChatType then local h, r, step = i + 1, #cycles, 1 if IsShiftKeyDown() then h, r, step = i - 1, 1, -1 end for j = h, r, step do if cycles[j]:use(self, currChatType) then self:SetAttribute("chatType", cycles[j].chatType) ChatEdit_UpdateHeader(self) return end end end end end hooksecurefunc("ChatEdit_CustomTabPressed", UpdateTabChannelSwitch) ---------------------------------------------------------------------------------------- -- Role icons ---------------------------------------------------------------------------------------- if C.chat.role_icons == true then local chats = { CHAT_MSG_SAY = 1, CHAT_MSG_YELL = 1, CHAT_MSG_WHISPER = 1, CHAT_MSG_WHISPER_INFORM = 1, CHAT_MSG_PARTY = 1, CHAT_MSG_PARTY_LEADER = 1, CHAT_MSG_INSTANCE_CHAT = 1, CHAT_MSG_INSTANCE_CHAT_LEADER = 1, CHAT_MSG_RAID = 1, CHAT_MSG_RAID_LEADER = 1, CHAT_MSG_RAID_WARNING = 1, } local role_tex = { TANK = "\124T"..[[Interface\AddOns\ShestakUI\Media\Textures\Tank.tga]]..":12:12:0:0:64:64:5:59:5:59\124t", HEALER = "\124T"..[[Interface\AddOns\ShestakUI\Media\Textures\Healer.tga]]..":12:12:0:0:64:64:5:59:5:59\124t", DAMAGER = "\124T"..[[Interface\AddOns\ShestakUI\Media\Textures\Damager.tga]]..":12:12:0:0:64:64:5:59:5:59\124t", } local GetColoredName_orig = _G.GetColoredName local function GetColoredName_hook(event, arg1, arg2, ...) local ret = GetColoredName_orig(event, arg1, arg2, ...) if chats[event] then local role = UnitGroupRolesAssigned(arg2) if role == "NONE" and arg2:match(" *- *"..GetRealmName().."$") then role = UnitGroupRolesAssigned(arg2:gsub(" *-[^-]+$","")) end if role and role ~= "NONE" then ret = role_tex[role]..""..ret end end return ret end _G.GetColoredName = GetColoredName_hook end ---------------------------------------------------------------------------------------- -- Prevent reposition ChatFrame ---------------------------------------------------------------------------------------- hooksecurefunc(ChatFrame1, "SetPoint", function(self, _, _, _, x) if x ~= C.position.chat[4] then self:ClearAllPoints() self:SetSize(C.chat.width, C.chat.height) if C.chat.background == true then self:SetPoint(C.position.chat[1], C.position.chat[2], C.position.chat[3], C.position.chat[4], C.position.chat[5] + 4) else self:SetPoint(C.position.chat[1], C.position.chat[2], C.position.chat[3], C.position.chat[4], C.position.chat[5]) end end end) ================================================ FILE: ShestakUI/Modules/Chat/ChatTabs.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Based on Fane(by Haste) ---------------------------------------------------------------------------------------- if C.chat.tabs_mouseover == true then CHAT_FRAME_TAB_SELECTED_NOMOUSE_ALPHA = 0 CHAT_FRAME_TAB_NORMAL_NOMOUSE_ALPHA = 0 CHAT_FRAME_TAB_ALERTING_NOMOUSE_ALPHA = 1 CHAT_FRAME_TAB_SELECTED_MOUSEOVER_ALPHA = 1 CHAT_FRAME_TAB_NORMAL_MOUSEOVER_ALPHA = 1 CHAT_FRAME_TAB_ALERTING_MOUSEOVER_ALPHA = 1 end local Fane = CreateFrame("Frame") local updateFS = function(self, _, ...) local fstring = self:GetFontString() fstring:SetFont(C.font.chat_tabs_font, C.font.chat_tabs_font_size, C.font.chat_tabs_font_style) fstring:SetShadowOffset(C.font.chat_tabs_font_shadow and 1 or 0, C.font.chat_tabs_font_shadow and -1 or 0) if (...) then fstring:SetTextColor(...) end end local OnEnter = function(self) local emphasis = _G["ChatFrame"..self:GetID().."TabFlash"]:IsShown() updateFS(self, emphasis, unpack(C.media.classborder_color)) end local OnLeave = function(self) local r, g, b local id = self:GetID() local emphasis = _G["ChatFrame"..id.."TabFlash"]:IsShown() if _G["ChatFrame"..id] == SELECTED_CHAT_FRAME then r, g, b = unpack(C.media.classborder_color) elseif emphasis then r, g, b = 1, 0, 0 else r, g, b = 1, 1, 1 end updateFS(self, emphasis, r, g, b) end local ChatFrame2_SetAlpha = function(_, alpha) if CombatLogQuickButtonFrame_Custom then CombatLogQuickButtonFrame_Custom:SetAlpha(alpha) end end local ChatFrame2_GetAlpha = function() if CombatLogQuickButtonFrame_Custom then return CombatLogQuickButtonFrame_Custom:GetAlpha() end end local faneifyTab = function(frame, selected) local i = frame:GetID() if frame:GetParent() == _G.ChatConfigFrameChatTabManager then if selected then frame.Text:SetTextColor(1, 1, 1) end frame:SetAlpha(1) else if not frame.Fane then frame:HookScript("OnEnter", OnEnter) frame:HookScript("OnLeave", OnLeave) if C.chat.tabs_mouseover ~= true then frame:SetAlpha(1) if i ~= 2 then -- Might not be the best solution, but we avoid hooking into the UIFrameFade -- system this way. frame.SetAlpha = UIFrameFadeRemoveFrame else frame.SetAlpha = ChatFrame2_SetAlpha frame.GetAlpha = ChatFrame2_GetAlpha -- We do this here as people might be using AddonLoader together with Fane if CombatLogQuickButtonFrame_Custom then CombatLogQuickButtonFrame_Custom:SetAlpha(0.4) end end end frame.Fane = true end -- We can't trust sel if i == SELECTED_CHAT_FRAME:GetID() then updateFS(frame, nil, unpack(C.media.classborder_color)) else updateFS(frame, nil, 1, 1, 1) end end end hooksecurefunc("FCF_StartAlertFlash", function(frame) local tab = _G["ChatFrame"..frame:GetID().."Tab"] updateFS(tab, true, 1, 0, 0) end) hooksecurefunc("FCFTab_UpdateColors", faneifyTab) for i = 1, NUM_CHAT_WINDOWS do faneifyTab(_G["ChatFrame"..i.."Tab"]) end function Fane:ADDON_LOADED(event, addon) if addon == "Blizzard_CombatLog" then self:UnregisterEvent(event) self[event] = nil return CombatLogQuickButtonFrame_Custom:SetAlpha(0.4) end end Fane:RegisterEvent("ADDON_LOADED") ================================================ FILE: ShestakUI/Modules/Chat/CopyChat.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Copy Chat ---------------------------------------------------------------------------------------- local frame = nil local editBox = nil local font = nil local isf = nil local sizes = { ":14:14", ":15:15", ":16:16", ":12:20", ":14" } local function CreatCopyFrame() frame = CreateFrame("Frame", "CopyFrame", UIParent) frame:SetTemplate("Transparent") frame:SetWidth(540) frame:SetHeight(300) frame:SetPoint("CENTER", UIParent, "CENTER", 0, 100) frame:SetFrameStrata("DIALOG") tinsert(UISpecialFrames, "CopyFrame") frame:Hide() frame:EnableMouse(true) editBox = CreateFrame("EditBox", "CopyBox", frame) editBox:SetMultiLine(true) editBox:SetMaxLetters(99999) editBox:SetAutoFocus(false) editBox:SetFontObject(ChatFontNormal) editBox:SetWidth(500) editBox:SetHeight(300) editBox:SetScript("OnEscapePressed", function() frame:Hide() end) editBox:SetScript("OnTextSet", function(self) local text = self:GetText() for _, size in pairs(sizes) do if string.find(text, size) and not string.find(text, size.."]") then self:SetText(string.gsub(text, size, ":12:12")) end end end) local scrollArea = CreateFrame("ScrollFrame", "CopyScroll", frame, "UIPanelScrollFrameTemplate") scrollArea:SetPoint("TOPLEFT", frame, "TOPLEFT", 8, -30) scrollArea:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -27, 8) scrollArea:SetScrollChild(editBox) T.SkinScrollBar(CopyScrollScrollBar) local close = CreateFrame("Button", "CopyCloseButton", frame, "UIPanelCloseButton") T.SkinCloseButton(close) font = frame:CreateFontString(nil, nil, "GameFontNormal") font:Hide() isf = true end local canChangeMessage = function(arg1, id) if id and arg1 == "" then return id end end local function MessageIsProtected(message) return message and (message ~= gsub(message, "(:?|?)|K(.-)|k", canChangeMessage)) end local function Copy(cf) if not isf then CreatCopyFrame() end local text = "" for i = 1, cf:GetNumMessages() do local line = cf:GetMessageInfo(i) if line and not MessageIsProtected(line) then font:SetFormattedText("%s \n", line) local cleanLine = font:GetText() or "" text = text..cleanLine end end text = text:gsub("|T[^\\]+\\[^\\]+\\[Uu][Ii]%-[Rr][Aa][Ii][Dd][Tt][Aa][Rr][Gg][Ee][Tt][Ii][Nn][Gg][Ii][Cc][Oo][Nn]_(%d)[^|]+|t", "{rt%1}") text = text:gsub("|T13700([1-8])[^|]+|t", "{rt%1}") text = text:gsub("|T[^|]+|t", "") text = text:gsub("|A[^|]+|a", "") if frame:IsShown() then frame:Hide() return end frame:Show() editBox:SetText(text) editBox:SetScript("OnTextChanged", function(_, userInput) if userInput then return end local _, max = CopyScrollScrollBar:GetMinMaxValues() for _ = 1, max do ScrollFrameTemplate_OnMouseWheel(CopyScroll, -1) end end) end for i = 1, NUM_CHAT_WINDOWS do local cf = _G[format("ChatFrame%d", i)] local button = CreateFrame("Button", format("ButtonCF%d", i), cf) button:SetPoint("BOTTOMRIGHT", 0, 1) button:SetSize(20, 20) button:SetAlpha(0) button:SetTemplate("Transparent") button:SetBackdropBorderColor(unpack(C.media.classborder_color)) local icon = button:CreateTexture(nil, "BORDER") icon:SetPoint("CENTER") icon:SetTexture("Interface\\BUTTONS\\UI-GuildButton-PublicNote-Up") icon:SetSize(16, 16) button:SetScript("OnMouseUp", function(_, btn) if btn == "RightButton" then ToggleFrame(ChatMenu) elseif btn == "MiddleButton" then RandomRoll(1, 100) else Copy(cf) end end) button:SetScript("OnEnter", function() button:FadeIn() end) button:SetScript("OnLeave", function() button:FadeOut() end) end SlashCmdList.COPY_CHAT = function() Copy(_G["ChatFrame1"]) end ================================================ FILE: ShestakUI/Modules/Chat/CopyUrl.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Copy url from chat(module from Gibberish by p3lim) ---------------------------------------------------------------------------------------- local patterns = { "(https://%S+%.%S+)", "(http://%S+%.%S+)", "(www%.%S+%.%S+)", "(%d+%.%d+%.%d+%.%d+:?%d*/?%S*)" } for _, event in next, { "CHAT_MSG_SAY", "CHAT_MSG_YELL", "CHAT_MSG_WHISPER", "CHAT_MSG_WHISPER_INFORM", "CHAT_MSG_GUILD", "CHAT_MSG_OFFICER", "CHAT_MSG_PARTY", "CHAT_MSG_PARTY_LEADER", "CHAT_MSG_RAID", "CHAT_MSG_RAID_LEADER", "CHAT_MSG_RAID_WARNING", "CHAT_MSG_INSTANCE_CHAT", "CHAT_MSG_INSTANCE_CHAT_LEADER", "CHAT_MSG_BN_WHISPER", "CHAT_MSG_BN_WHISPER_INFORM", "CHAT_MSG_CHANNEL", "CHAT_MSG_SYSTEM" } do ChatFrame_AddMessageEventFilter(event, function(_, event, str, ...) for _, pattern in pairs(patterns) do local result, match = string.gsub(str, pattern, "|cff00FF00|Hurl:%1|h[%1]|h|r") if match > 0 then return false, result, ... end end end) end local SetHyperlink = _G.ItemRefTooltip.SetHyperlink function _G.ItemRefTooltip:SetHyperlink(link, ...) if link and (strsub(link, 1, 3) == "url") then local editbox = ChatEdit_ChooseBoxForSend() ChatEdit_ActivateChat(editbox) editbox:Insert(string.sub(link, 5)) editbox:HighlightText() return end SetHyperlink(self, link, ...) end ================================================ FILE: ShestakUI/Modules/Chat/FadeCombat.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true or C.chat.hide_combat ~= true then return end ---------------------------------------------------------------------------------------- -- Hide Chat in Combat (by Urtgard) ---------------------------------------------------------------------------------------- local hcic = CreateFrame("Frame") local MouseoverFrames = {} -- Events local event = CreateFrame("Frame") event:SetScript("OnEvent", function(self, event, ...) self[event](self, ...) end) -- Register events event:RegisterEvent("PLAYER_REGEN_ENABLED") event:RegisterEvent("PLAYER_REGEN_DISABLED") event:RegisterEvent("PLAYER_LOGIN") event:RegisterEvent("PET_BATTLE_CLOSE") event:RegisterEvent("PET_BATTLE_OPENING_START") -- Handle events function event:PLAYER_REGEN_ENABLED() hcic:CombatEnd() end function event:PLAYER_REGEN_DISABLED() hcic:CombatStart() end function event:PLAYER_LOGIN() hcic:Init() end function event:PET_BATTLE_CLOSE() hcic:CombatEnd() end function event:PET_BATTLE_OPENING_START() hcic:CombatStart() end -- function hcic:Init() for i = 1, NUM_CHAT_WINDOWS do local f = _G["ChatFrame"..i] if f:IsShown() then local chatMouseover = CreateFrame("Frame", "HCIC"..i, UIParent) chatMouseover:SetPoint("TOPLEFT", "ChatFrame"..i, "TOPLEFT", -25, 30) chatMouseover:SetPoint("BOTTOMRIGHT", "ChatFrame"..i, "BOTTOMRIGHT", 2, -2) chatMouseover.FadeOut = function(self) hcic:FadeOut(self) end chatMouseover.FadeIn = function(self) hcic:FadeIn(self) end chatMouseover:SetScript("OnEnter", function(self) if InCombatLockdown() or C_PetBattles.IsInBattle() then self:FadeIn(self) end end) chatMouseover:SetScript("OnLeave", function(self) hcic:ChatOnLeave(self) end) chatMouseover.Frames = {_G["ChatFrame"..i], _G["ChatFrame"..i.."Tab"], _G["ChatFrame"..i.."ButtonFrame"]} if i == 1 then tinsert(chatMouseover.Frames, GeneralDockManager) tinsert(chatMouseover.Frames, GeneralDockManagerScrollFrame) if C.chat.background == true then tinsert(chatMouseover.Frames, ChatBackground) tinsert(chatMouseover.Frames, ChatTabsPanel) elseif C.stats.bottom_line then tinsert(chatMouseover.Frames, LeftPanel) end if C.chat.chat_bar and C.chat.chat_bar_mouseover ~= true then tinsert(chatMouseover.Frames, ChatBar) end end chatMouseover:SetFrameStrata("BACKGROUND") tinsert(MouseoverFrames, _G["HCIC"..i]) end end end -- function hcic:CombatStart() for _, f in pairs(MouseoverFrames) do f:FadeOut() end end -- function hcic:CombatEnd() for _, f in pairs(MouseoverFrames) do f:FadeIn() end end -- Fade function hcic:FadeOut(self) hcic:fade(self, 1) end function hcic:FadeIn(self) hcic:fade(self, 0) end function hcic:fade(self, mode) for _, frame in pairs(self.Frames) do local alpha = frame:GetAlpha() if mode == 0 then frame.Show = Show frame:Show() UIFrameFadeIn(frame, 0.4 * (1 - alpha), alpha, 1) else UIFrameFadeOut(frame, 0.8 * alpha, alpha, 0) frame.Show = T.dummy frame.fadeInfo.finishedArg1 = frame frame.fadeInfo.finishedFunc = frame.Hide end end end local function checkAgain(self) C_Timer.After(1, function() local f = GetMouseFocus() local name = GetMouseFocus():GetName() if f and name and not name:match("HCIC") then hcic:ChatOnLeave(self) end end) end function hcic:ChatOnLeave(self) if InCombatLockdown() or C_PetBattles.IsInBattle() then local f = GetMouseFocus() if f then if f.messageInfo then return nil end if hcic:IsInArray(self.Frames, f) then checkAgain(self) return nil end if f:GetParent() then f = f:GetParent() if hcic:IsInArray(self.Frames, f) then checkAgain(self) return nil end if f:GetParent() then f = f:GetParent() if hcic:IsInArray(self.Frames, f) then checkAgain(self) return nil end end end end self:FadeOut(self) end end function hcic:IsInArray(array, s) for _, v in pairs(array) do if v == s then return true end end return false end hooksecurefunc("FCF_Tab_OnClick", function(self) local chatFrame = _G["ChatFrame"..self:GetID()] if chatFrame.isDocked then HCIC1.Frames[1] = chatFrame end end) ================================================ FILE: ShestakUI/Modules/Chat/Filters.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Systems spam filter ---------------------------------------------------------------------------------------- if C.chat.filter == true then ChatFrame_AddMessageEventFilter("CHAT_MSG_MONSTER_SAY", function() if IsResting() then return true end end) ChatFrame_AddMessageEventFilter("CHAT_MSG_MONSTER_YELL", function() if IsResting() then return true end end) ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL_JOIN", function() return true end) ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL_LEAVE", function() return true end) ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL_NOTICE", function() return true end) ChatFrame_AddMessageEventFilter("CHAT_MSG_AFK", function() return true end) ChatFrame_AddMessageEventFilter("CHAT_MSG_DND", function() return true end) DUEL_WINNER_KNOCKOUT = "" DUEL_WINNER_RETREAT = "" DRUNK_MESSAGE_ITEM_OTHER1 = "" DRUNK_MESSAGE_ITEM_OTHER2 = "" DRUNK_MESSAGE_ITEM_OTHER3 = "" DRUNK_MESSAGE_ITEM_OTHER4 = "" DRUNK_MESSAGE_OTHER1 = "" DRUNK_MESSAGE_OTHER2 = "" DRUNK_MESSAGE_OTHER3 = "" DRUNK_MESSAGE_OTHER4 = "" DRUNK_MESSAGE_ITEM_SELF1 = "" DRUNK_MESSAGE_ITEM_SELF2 = "" DRUNK_MESSAGE_ITEM_SELF3 = "" DRUNK_MESSAGE_ITEM_SELF4 = "" DRUNK_MESSAGE_SELF1 = "" DRUNK_MESSAGE_SELF2 = "" DRUNK_MESSAGE_SELF3 = "" DRUNK_MESSAGE_SELF4 = "" ERR_PET_LEARN_ABILITY_S = "" ERR_PET_LEARN_SPELL_S = "" ERR_PET_SPELL_UNLEARNED_S = "" ERR_LEARN_ABILITY_S = "" ERR_LEARN_SPELL_S = "" ERR_LEARN_PASSIVE_S = "" ERR_SPELL_UNLEARNED_S = "" -- Prevent empty line local function systemFilter(_, _, text) if text and text == "" then return true end end ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", systemFilter) end ---------------------------------------------------------------------------------------- -- Players spam filter(by Evl, Elv22 and Affli) ---------------------------------------------------------------------------------------- if C.chat.spam == true then -- Repeat spam filter local function repeatMessageFilter(self, _, text, sender) sender = Ambiguate(sender, "guild") if sender == T.name or UnitIsInMyGuild(sender) then return end if not self.repeatMessages or self.repeatCount > 20 then self.repeatCount = 0 self.repeatMessages = {} end local lastMessage = self.repeatMessages[sender] if lastMessage == text then return true end self.repeatMessages[sender] = text self.repeatCount = self.repeatCount + 1 end ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL", repeatMessageFilter) ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL", repeatMessageFilter) -- Gold/portals spam filter local SpamList = T.ChatSpamList local function tradeFilter(_, _, text, sender) sender = Ambiguate(sender, "guild") if sender == T.name or UnitIsInMyGuild(sender) then return end for _, value in pairs(SpamList) do if text:lower():match(value) then return true end end end ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL", tradeFilter) ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL", tradeFilter) end ================================================ FILE: ShestakUI/Modules/Chat/History.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true or C.chat.history ~= true then return end ---------------------------------------------------------------------------------------- -- Chat history (TrueChatFrameHistory by Kanegasi) ---------------------------------------------------------------------------------------- local a, t = ... local f = CreateFrame("frame", a) local DB, CF, cfid, hook = {}, {}, {}, {} ShestakUIChatHistory = ShestakUIChatHistory or {} local function prnt(frame, message) if frame.historyBuffer:PushFront({message = message, r = 1, g = 1, b = 1, extraData = {[1] = "temp", n = 1}, timestamp = GetTime()}) then if frame:GetScrollOffset() ~= 0 then frame:ScrollUp() end frame:MarkDisplayDirty() end end -- CircularBuffer bug (feature?) due to modulus usage (CircularBuffer.lua:38,46,123), causing elements to be added at the back when buffer is full, screwing up saved data function t.pushfront(frame) if frame == COMBATLOG then return end -- ensure Combat Log is ignored if not hook[frame] then hook[frame] = true -- hook only once, hook doesn't go away when temporary frames are closed (11+) hooksecurefunc(frame.historyBuffer, "PushFront", function(frame) while #frame.elements > frame.maxElements - 5 do -- minimum of 2 less than max is needed, 5 to provide some buffer table.remove(frame.elements, 1) end frame.headIndex = #frame.elements end) end end -- element fading timestamp comes from GetTime() (ScrollingMessageFrame.lua:583), causing restored elements to effectively not fade if you restart your computer function t.timestamps(frame) local nameorid, timestamp = CF[frame] > NUM_CHAT_WINDOWS and frame.name or CF[frame], GetTime() if DB[nameorid] then for element = #DB[nameorid], 1, -1 do DB[nameorid][element].timestamp = timestamp end end end function t.ADDON_LOADED(addon) if addon == a then DB = ShestakUIChatHistory for frame, elements in next, DB do for element = #elements, 1, -1 do if elements[element].extraData then for _, v in next, elements[element].extraData do if v == "temp" then table.remove(DB[frame], element) break end -- remove TCFH's entries -- note to authors: passing "temp" in _any_ arg beyond the r,g,b args of AddMessage -- will allow your message to also be removed upon chat restoration, if you so desire -- examples: frame:AddMessage("message",r,g,b,"temp") -- frame:AddMessage("message",r,g,b,chatTypeID,accessID,lineID,"temp") end end end end hooksecurefunc("FCF_SetWindowName", function(frame) local id = frame:GetID() CF[frame] = id -- main ChatFrame pointers cfid[id] = frame -- access by id, used for /tcfh and ordered iteration of t.missed end) hooksecurefunc("FCFManager_RegisterDedicatedFrame", function(frame) if CF[frame] > NUM_CHAT_WINDOWS then t.pushfront(frame) if DB[frame.name] then t.timestamps(frame) frame.historyBuffer:ReplaceElements(DB[frame.name]) end end end) -- restore any history for Pet Combat Log and whispers hooksecurefunc("FCFManager_UnregisterDedicatedFrame", function(frame) if CF[frame] > NUM_CHAT_WINDOWS then DB[frame.name] = frame.historyBuffer.elements end end) -- save any history for Pet Combat Log and whispers end f:UnregisterEvent("PLAYER_ENTERING_WORLD") f:RegisterEvent("PLAYER_ENTERING_WORLD") -- attempt to ensure TCFH is last to load local frames = {GetFramesRegisteredForEvent("PLAYER_LEAVING_WORLD")} while frames[1] ~= f do frames[1]:UnregisterEvent("PLAYER_LEAVING_WORLD") frames[1]:RegisterEvent("PLAYER_LEAVING_WORLD") table.remove(frames, 1) end -- attempt to ensure TCFH is first to trigger upon UI unload end function t.PLAYER_ENTERING_WORLD() if t.pew then return end for id = #cfid, 1, -1 do if cfid[id] ~= COMBATLOG then t.pushfront(cfid[id]) t.timestamps(cfid[id]) if id <= NUM_CHAT_WINDOWS and DB[id] and #DB[id] > 0 then cfid[id].historyBuffer:ReplaceElements(DB[id]) end -- restore any history for ChatFrame1-10 (excluding Combat Log) prnt(cfid[id], "|cffBCEE68--- "..HISTORY.." ---|r") end end t.pew = true end function t.PLAYER_LEAVING_WORLD() for frame, id in next, CF do if frame ~= COMBATLOG then DB[id > NUM_CHAT_WINDOWS and frame.name or id] = frame.historyBuffer.elements end end -- save any history for all ChatFrames (excluding Combat Log) end f:RegisterEvent("ADDON_LOADED") f:RegisterEvent("PLAYER_LEAVING_WORLD") f:SetScript("OnEvent", function(_, event,...)t[event](...)end) ================================================ FILE: ShestakUI/Modules/Chat/Invite.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Alt Click to Invite player ---------------------------------------------------------------------------------------- hooksecurefunc("SetItemRef", function(link) -- Secure hook to avoid taint if IsAltKeyDown() then local ChatFrameEditBox = ChatEdit_ChooseBoxForSend() local player = link:match("^player:([^:]+)") local bplayer = link:match("^BNplayer:([^:]+)") if player then C_PartyInfo.InviteUnit(player) elseif bplayer then local _, value = strmatch(link, "(%a+):(.+)") local _, bnID = strmatch(value, "([^:]*):([^:]*):") if not bnID then return end local accountInfo = C_BattleNet.GetAccountInfoByID(bnID) if accountInfo.gameAccountInfo.clientProgram == BNET_CLIENT_WOW and CanCooperateWithGameAccount(accountInfo) then BNInviteFriend(accountInfo.gameAccountInfo.gameAccountID) end end ChatEdit_OnEscapePressed(ChatFrameEditBox) -- Secure hook opens whisper, so closing it. end end) ================================================ FILE: ShestakUI/Modules/Chat/MouseScroll.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Chat Scroll Module ---------------------------------------------------------------------------------------- local ScrollLines = 1 function FloatingChatFrame_OnMouseScroll(self, delta) if delta < 0 then if IsShiftKeyDown() then self:ScrollToBottom() else for i = 1, ScrollLines do self:ScrollDown() end end elseif delta > 0 then if IsShiftKeyDown() then self:ScrollToTop() else for i = 1, ScrollLines do self:ScrollUp() end end end end ================================================ FILE: ShestakUI/Modules/Chat/RealLinks.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Colors links in Battle.net whispers(RealLinks by p3lim) ---------------------------------------------------------------------------------------- local queuedMessages = {} local function GetLinkColor(data) local type, arg1, arg2, arg3 = string.split(":", data) if type == "item" then local _, _, quality = GetItemInfo(arg1) if quality then local _, _, _, color = GetItemQualityColor(quality) return "|c"..color else return nil, true end elseif type == "quest" then if arg2 then return ConvertRGBtoColorString(GetQuestDifficultyColor(arg2)) else return "|cffffd100" end elseif type == "currency" then local link = GetCurrencyLink(arg1) if link then return gsub(link, 0, 10) else return "|cffffffff" end elseif type == "battlepet" then if arg3 ~= -1 then local _, _, _, color = GetItemQualityColor(arg3) return "|c"..color else return "|cffffd200" end elseif type == "garrfollower" then local _, _, _, color = GetItemQualityColor(arg2) return "|c"..color elseif type == "spell" then return "|cff71d5ff" elseif type == "achievement" or type == "garrmission" then return "|cffffff00" elseif type == "trade" or type == "enchant" then return "|cffffd000" elseif type == "instancelock" then return "|cffff8000" elseif type == "glyph" or type == "journal" then return "|cff66bbff" elseif type == "talent" or type == "battlePetAbil" or type == "garrfollowerability" then return "|cff4e96f7" elseif type == "levelup" then return "|cffff4e00" else return "|cffffff00" end end local function MessageFilter(self, event, message, ...) for link, data in gmatch(message, "(|H(.-)|h.-|h)") do local color, queue = GetLinkColor(data) if queue then table.insert(queuedMessages, {self, event, message, ...}) return true elseif color then local matchLink = "|H"..data.."|h.-|h" message = gsub(message, matchLink, color..link.."|r", 1) end end return false, message, ... end local Handler = CreateFrame("Frame") Handler:RegisterEvent("GET_ITEM_INFO_RECEIVED") Handler:SetScript("OnEvent", function() if #queuedMessages > 0 then for index, data in next, queuedMessages do ChatFrame_MessageEventHandler(unpack(data)) queuedMessages[index] = nil end end end) ChatFrame_AddMessageEventFilter("CHAT_MSG_BN_WHISPER", MessageFilter) ChatFrame_AddMessageEventFilter("CHAT_MSG_BN_WHISPER_INFORM", MessageFilter) ================================================ FILE: ShestakUI/Modules/Chat/Sounds.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true or C.chat.whisp_sound ~= true then return end ---------------------------------------------------------------------------------------- -- Play sound files system(by Tukz) ---------------------------------------------------------------------------------------- local SoundSys = CreateFrame("Frame") SoundSys:RegisterEvent("CHAT_MSG_WHISPER") SoundSys:RegisterEvent("CHAT_MSG_BN_WHISPER") SoundSys:HookScript("OnEvent", function(_, event) if event == "CHAT_MSG_WHISPER" or event == "CHAT_MSG_BN_WHISPER" then PlaySoundFile(C.media.whisp_sound, "Master") end end) ================================================ FILE: ShestakUI/Modules/Chat/SpamageMeters.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true or C.chat.damage_meter_spam ~= true then return end ---------------------------------------------------------------------------------------- -- Merge damage meter spam(SpamageMeters by Wrug and Cybey) ---------------------------------------------------------------------------------------- local firstLines = { "^Details!: (.*)$", -- Details! "^Recount - (.*)$", -- Recount "^Skada: (.*) for (.*):$", -- Skada enUS "^Skada: (.*) für (.*):$", -- Skada deDE "^Skada: (.*) pour (.*):$", -- Skada frFR "^Отчёт Skada: (.*), с (.*):$", -- Skada ruRU "^Skada: (.*) por (.*):$", -- Skada esES/ptBR "^Skada: (.*) per (.*):$", -- Skada itIT "^(.*) 의 Skada 보고 (.*):$", -- Skada koKR "^Skada报告(.*)的(.*):$", -- Skada zhCN "^Skada:(.*)來自(.*):$", -- Skada zhTW "^Numeration: (.*) - (.*)$", -- Numeration "^(.*) Done for (.*)$", -- TinyDPS enUS "^(.*) für (.*)$", -- TinyDPS deDE "데미지량 -(.*)$", -- TinyDPS koKR "힐량 -(.*)$", -- TinyDPS koKR "Урон:(.*)$", -- TinyDPS ruRU "Исцеление:(.*)$" -- TinyDPS ruRU } local nextLines = { "^(%d+)\. (.*)$", -- Recount, Details! and Skada "^(.*) (.*)$", -- Additional Skada "^[+-]%d+.%d", -- Numeration deathlog details "^(%d+). (.*):(.*)(%d+)(.*)(%d+)%%(.*)%((%d+)%)$" -- TinyDPS } local meters = {} local events = { "CHAT_MSG_CHANNEL", "CHAT_MSG_GUILD", "CHAT_MSG_OFFICER", "CHAT_MSG_PARTY", "CHAT_MSG_PARTY_LEADER", "CHAT_MSG_RAID", "CHAT_MSG_RAID_LEADER", "CHAT_MSG_INSTANCE_CHAT", "CHAT_MSG_INSTANCE_CHAT_LEADER", "CHAT_MSG_SAY", "CHAT_MSG_WHISPER", "CHAT_MSG_WHISPER_INFORM", "CHAT_MSG_YELL" } local function FilterLine(event, source, message) for i = 1, #nextLines do local v = nextLines[i] if message:match(v) then local curTime = time() for i = 1, #meters do local j = meters[i] local elapsed = curTime - j.time if j.source == source and j.event == event and elapsed < 5 then local toInsert = true for i = 1, #j.data do if j.data[i] == message then toInsert = false end end if toInsert then table.insert(j.data, message) end return true, false, nil end end end end for i = 1, #firstLines do local v = firstLines[i] local newID = 0 if message:match(v) then local curTime = time() for i = 1, #meters do local j = meters[i] local elapsed = curTime - j.time if j.source == source and j.event == event and elapsed < 1 then newID = i return true, true, string.format("|Hspam:%1$d|h|cFFFFFF00[%2$s]|r|h", newID or 0, message or "nil") end end table.insert(meters, {source = source, event = event, time = curTime, data = {}, title = message}) for i = 1, #meters do local j = meters[i] if j.source == source and j.event == event and j.time == curTime then newID = i end end return true, true, string.format("|Hspam:%1$d|h|cFFFFFF00[%2$s]|r|h", newID or 0, message or "nil") end end return false, false, nil end local SetHyperlink = _G.ItemRefTooltip.SetHyperlink function _G.ItemRefTooltip:SetHyperlink(link, ...) if link and (strsub(link, 1, 4) == "spam") then local _, id = strsplit(":", link) local meterID = tonumber(id) ItemRefTooltip:ClearLines() ItemRefTooltip:AddLine(meters[meterID].title) ItemRefTooltip:AddLine(string.format(BY_SOURCE..": %s", meters[meterID].source)) for _, v in ipairs(meters[meterID].data) do local left, right = v:match("^(.*) (.*)$") if left and right then ItemRefTooltip:AddDoubleLine(left, right, 1, 1, 1, 1, 1, 1) else ItemRefTooltip:AddLine(v, 1, 1, 1) end end ItemRefTooltip:Show() return end SetHyperlink(self, link, ...) end local function ParseChatEvent(_, event, message, sender, ...) local isRecount, isFirstLine, newMessage = FilterLine(event, sender, message) if isRecount then if isFirstLine then return false, newMessage, sender, ... else return true end end end for _, event in pairs(events) do ChatFrame_AddMessageEventFilter(event, ParseChatEvent) end ================================================ FILE: ShestakUI/Modules/Chat/TellTarget.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.chat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Tell Target ---------------------------------------------------------------------------------------- for i = 1, NUM_CHAT_WINDOWS do local editbox = _G["ChatFrame"..i.."EditBox"] editbox:HookScript("OnTextChanged", function(self) local text = self:GetText() if text:len() < 7 then if text:sub(1, 4) == "/tt " or text:sub(1, 6) == "/ее " then if UnitCanAssist("player", "target") then ChatFrame_SendTell((GetUnitName("target", true)), ChatFrame1) end end end end) end -- Slash command SlashCmdList.TELLTARGET = function(msg) local name = GetUnitName("target", true) if name then SendChatMessage(msg, "WHISPER", nil, name) end end SLASH_TELLTARGET1 = "/tt" SLASH_TELLTARGET2 = "/ее" ================================================ FILE: ShestakUI/Modules/Cooldowns/DiminishingCD.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.unitframe.enable ~= true or C.unitframe.show_arena ~= true or C.unitframe.plugins_diminishing ~= true then return end ---------------------------------------------------------------------------------------- -- Based on Tukui_DrTracker(by Ildyria) ---------------------------------------------------------------------------------------- local frameposition if C.unitframe.arena_on_right == true then frameposition = {"TOPRIGHT", "TOPLEFT", -39, 2, "RIGHT", "LEFT", -3, 0} else frameposition = {"TOPLEFT", "TOPRIGHT", 39, 2, "LEFT", "RIGHT", 3, 0} end local framelist = { --[FRAME NAME] = {UNITID, SIZE, ANCHOR, ANCHORFRAME, X, Y, "ANCHORNEXT", "ANCHORPREVIOUS", nextx, nexty}, --["oUF_Player"] = {"player", 31, "TOPRIGHT", "TOPLEFT", -5, 2, "RIGHT", "LEFT", -3, 0}, ["oUF_Arena1"] = {"arena1", 31, unpack(frameposition)}, ["oUF_Arena2"] = {"arena2", 31, unpack(frameposition)}, ["oUF_Arena3"] = {"arena3", 31, unpack(frameposition)}, ["oUF_Arena4"] = {"arena4", 31, unpack(frameposition)}, ["oUF_Arena5"] = {"arena5", 31, unpack(frameposition)}, } function UpdateDRTracker(self) local time = self.start + 18 - GetTime() if time < 0 then local frame = self:GetParent() frame.actives[self.cat] = nil self:SetScript("OnUpdate", nil) DisplayDrActives(frame) end end function DisplayDrActives(self, test) local _, instanceType = IsInInstance() if instanceType ~= "arena" and not test then return end if not self.actives then return end if not self.auras then self.auras = {} end local index local previous = nil index = 1 for _, _ in pairs(self.actives) do local aura = self.auras[index] if not aura then aura = CreateFrame("Frame", "DrFrame"..self.target..index, self) aura:SetTemplate("Default") aura:SetSize(self.size, self.size) if index == 1 then aura:SetPoint(self.anchor, self:GetParent().Health, self.anchorframe, self.x, self.y) else aura:SetPoint(self.nextanchor, previous, self.nextanchorframe, self.nextx, self.nexty) end aura.icon = aura:CreateTexture("$parentIcon", "ARTWORK") aura.icon:SetPoint("TOPLEFT", 2, -2) aura.icon:SetPoint("BOTTOMRIGHT", -2, 2) aura.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) aura.cooldown = CreateFrame("Cooldown", "$parentCD", aura, "CooldownFrameTemplate") aura.cooldown:SetAllPoints(aura.icon) aura.cooldown:SetReverse(true) aura.count = aura:CreateFontString("$parentCount", "OVERLAY") aura.count:SetFont(C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style) aura.count:SetPoint("BOTTOMRIGHT", -1, 1) aura.count:SetJustifyH("CENTER") aura.cat = "cat" aura.start = 0 self.auras[index] = aura end previous = aura index = index + 1 end index = 1 for cat, value in pairs(self.actives) do local aura = self.auras[index] aura.icon:SetTexture(value.icon) aura.count:SetText(value.dr) aura.count:Hide() if value.dr == 1 then aura:SetBackdropBorderColor(0, 1, 0, 1) elseif value.dr == 2 then aura:SetBackdropBorderColor(1, 0.5, 0, 1) else aura:SetBackdropBorderColor(1, 0, 0, 1) end CooldownFrame_Set(aura.cooldown, value.start, 18, 1) aura.start = value.start aura.cat = cat aura:SetScript("OnUpdate", UpdateDRTracker) aura.cooldown:Show() aura:Show() index = index + 1 end for i = index, #self.auras, 1 do local aura = self.auras[i] aura:SetScript("OnUpdate", nil) aura:Hide() end end local spell = T.DiminishingSpells local icon = T.DiminishingIcons local eventRegistered = { ["SPELL_AURA_APPLIED"] = true, ["SPELL_AURA_REFRESH"] = true, ["SPELL_AURA_REMOVED"] = true } local function CombatLogCheck(self) local _, instanceType = IsInInstance() if instanceType ~= "arena" then return end local _, eventType, _, _, _, _, _, destGUID, _, _, _, spellID, _, _, auraType = CombatLogGetCurrentEventInfo() if not eventRegistered[eventType] then return end if destGUID ~= UnitGUID(self.target) then return end local needupdate = false if eventType == "SPELL_AURA_APPLIED" then if auraType == "DEBUFF" and spell[spellID] then if not self.actives then self.actives = {} end for _, cat in pairs(spell[spellID]) do if self.actives[cat] then if self.actives[cat].start + 18 < GetTime() then self.actives[cat].start = GetTime() self.actives[cat].dr = 1 self.actives[cat].icon = icon[cat] else self.actives[cat].start = GetTime() self.actives[cat].dr = 2 * self.actives[cat].dr self.actives[cat].icon = icon[cat] end else self.actives[cat] = {} self.actives[cat].start = GetTime() self.actives[cat].dr = 1 self.actives[cat].icon = icon[cat] end end needupdate = true end elseif eventType == "SPELL_AURA_REFRESH" then if auraType == "DEBUFF" and spell[spellID] then if not self.actives then self.actives = {} end for _, cat in pairs(spell[spellID]) do if not self.actives[cat] then self.actives[cat] = {} self.actives[cat].dr = 1 end self.actives[cat].start = GetTime() self.actives[cat].dr = 2 * self.actives[cat].dr self.actives[cat].icon = icon[cat] end needupdate = true end elseif eventType == "SPELL_AURA_REMOVED" then if auraType == "DEBUFF" and spell[spellID] then if not self.actives then self.actives = {} end for _, cat in pairs(spell[spellID]) do if self.actives[cat] then if self.actives[cat].start + 18 < GetTime() then self.actives[cat].start = GetTime() self.actives[cat].dr = 1 self.actives[cat].icon = icon[cat] else self.actives[cat].start = GetTime() self.actives[cat].dr = self.actives[cat].dr self.actives[cat].icon = icon[cat] end else self.actives[cat] = {} self.actives[cat].start = GetTime() self.actives[cat].dr = 1 self.actives[cat].icon = icon[cat] end end needupdate = true end end if needupdate then DisplayDrActives(self) end end for frame, target in pairs(framelist) do local self = _G[frame] local DrTracker = CreateFrame("Frame", nil, self) DrTracker:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") DrTracker:SetScript("OnEvent", CombatLogCheck) DrTracker.target = target[1] DrTracker.size = target[2] DrTracker.anchor = target[3] DrTracker.anchorframe = target[4] DrTracker.x = target[5] DrTracker.y = target[6] DrTracker.nextanchor = target[7] DrTracker.nextanchorframe = target[8] DrTracker.nextx = target[9] DrTracker.nexty = target[10] self.DrTracker = DrTracker end for spell in pairs(T.DiminishingSpells) do local name = GetSpellInfo(spell) if not name then print("|cffff0000WARNING: spell ID ["..tostring(spell).."] no longer exists! Report this to Shestak.|r") end end local function tdr() if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end local testlist = {"stun", "root", "silence"} for frame in pairs(framelist) do local self = _G[frame].DrTracker if not self.actives then self.actives = {} end local dr = 1 for _, cat in pairs(testlist) do if not self.actives[cat] then self.actives[cat] = {} end self.actives[cat].dr = dr self.actives[cat].start = GetTime() self.actives[cat].icon = icon[cat] dr = dr * 2 end DisplayDrActives(self, true) end end SlashCmdList.DIMINISHINGCD = tdr SLASH_DIMINISHINGCD1 = "/tdr" SLASH_DIMINISHINGCD2 = "/евк" ================================================ FILE: ShestakUI/Modules/Cooldowns/EnemyCD.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.enemycooldown.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Enemy cooldowns(alEnemyCD by Allez) ---------------------------------------------------------------------------------------- local show = { none = C.enemycooldown.show_always, pvp = C.enemycooldown.show_inpvp, arena = C.enemycooldown.show_inarena, } local direction = C.enemycooldown.direction local icons = {} local band = bit.band local pos = C.position.enemy_cooldown local limit = (C.actionbar.button_size * 12)/C.enemycooldown.size local space = C.filger.cooldown_space local EnemyCDAnchor = CreateFrame("Frame", "EnemyCDAnchor", UIParent) if C.unitframe.enable ~= true then EnemyCDAnchor:SetPoint("CENTER", UIParent, "CENTER", 0, 0) else if C.unitframe.plugins_swing == true then EnemyCDAnchor:SetPoint(unpack(C.position.enemy_cooldown)) else EnemyCDAnchor:SetPoint(pos[1], pos[2], pos[3], pos[4], pos[5] - 12) end end if direction == "UP" or direction == "DOWN" then EnemyCDAnchor:SetSize(C.enemycooldown.size, (C.enemycooldown.size * 5) + 12) else EnemyCDAnchor:SetSize((C.enemycooldown.size * 5) + 12, C.enemycooldown.size) end local OnEnter = function(self) if IsShiftKeyDown() then GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetSpellByID(self.sID) GameTooltip:SetClampedToScreen(true) GameTooltip:AddLine(" ") GameTooltip:AddLine(DONE_BY.." "..self.name) GameTooltip:Show() end end local function sortByExpiration(a, b) return a.endTime < b.endTime end local UpdatePositions = function() for i = 1, #icons do icons[i]:ClearAllPoints() if i == 1 then icons[i]:SetPoint("BOTTOMLEFT", EnemyCDAnchor, "BOTTOMLEFT", 0, 0) elseif i < limit then if direction == "UP" then icons[i]:SetPoint("BOTTOM", icons[i-1], "TOP", 0, space) elseif direction == "DOWN" then icons[i]:SetPoint("TOP", icons[i-1], "BOTTOM", 0, -space) elseif direction == "LEFT" then icons[i]:SetPoint("RIGHT", icons[i-1], "LEFT", -space, 0) else icons[i]:SetPoint("LEFT", icons[i-1], "RIGHT", space, 0) end end if i < limit then icons[i]:SetAlpha(1) else icons[i]:SetAlpha(0) end icons[i].id = i end end local StopTimer = function(icon) icon:SetScript("OnUpdate", nil) icon:Hide() tremove(icons, icon.id) UpdatePositions() end local IconUpdate = function(self) if (self.endTime < GetTime()) then StopTimer(self) end end local CreateIcon = function() local icon = CreateFrame("Frame", nil, UIParent) icon:SetSize(C.enemycooldown.size, C.enemycooldown.size) icon:SetTemplate("Default") icon.Cooldown = CreateFrame("Cooldown", nil, icon, "CooldownFrameTemplate") icon.Cooldown:SetPoint("TOPLEFT", 2, -2) icon.Cooldown:SetPoint("BOTTOMRIGHT", -2, 2) icon.Cooldown:SetReverse(true) icon.Texture = icon:CreateTexture(nil, "BORDER") icon.Texture:SetPoint("TOPLEFT", 2, -2) icon.Texture:SetPoint("BOTTOMRIGHT", -2, 2) return icon end local StartTimer = function(sGUID, sID, sName) local _, _, texture = GetSpellInfo(sID) local icon = CreateIcon() icon.Texture:SetTexture(texture) icon.Texture:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon.endTime = GetTime() + T.EnemySpells[sID] local _, class, _, _, _, name = GetPlayerInfoByGUID(sGUID) -- false check for pet if not class then class = select(2, UnitClass(sName)) name = sName end local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] if color then name = format("|cff%02x%02x%02x%s|r", color.r * 255, color.g * 255, color.b * 255, name) if C.enemycooldown.class_color then icon:SetBackdropBorderColor(color.r, color.g, color.b) end end for _, v in pairs(icons) do if v.name == name and v.sID == sID then StopTimer(v) end end icon.name = name icon.sID = sID icon:Show() icon:SetScript("OnUpdate", IconUpdate) icon:SetScript("OnEnter", OnEnter) icon:SetScript("OnLeave", GameTooltip_Hide) CooldownFrame_Set(icon.Cooldown, GetTime(), T.EnemySpells[sID], 1) tinsert(icons, icon) table.sort(icons, sortByExpiration) UpdatePositions() end local OnEvent = function(_, event) if event == "COMBAT_LOG_EVENT_UNFILTERED" then local _, eventType, _, sourceGUID, sourceName, sourceFlags, _, _, _, _, _, spellID = CombatLogGetCurrentEventInfo() if eventType == "SPELL_CAST_SUCCESS" and sourceName ~= T.name then local _, instanceType = IsInInstance() if show[instanceType] then if band(sourceFlags, COMBATLOG_OBJECT_REACTION_HOSTILE) ~= 0 then if T.EnemySpells[spellID] then StartTimer(sourceGUID, spellID, sourceName) end end elseif instanceType == "party" and C.enemycooldown.show_inparty then if band(sourceFlags, COMBATLOG_OBJECT_AFFILIATION_PARTY) ~= 0 then if T.EnemySpells[spellID] then StartTimer(sourceGUID, spellID, sourceName) end end end end elseif event == "ZONE_CHANGED_NEW_AREA" then for _, v in pairs(icons) do v.endTime = 0 end end end for spell in pairs(T.EnemySpells) do local name = GetSpellInfo(spell) if not name then print("|cffff0000WARNING: spell ID ["..tostring(spell).."] no longer exists! Report this to Shestak.|r") end end local addon = CreateFrame("Frame") addon:SetScript("OnEvent", OnEvent) addon:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") addon:RegisterEvent("ZONE_CHANGED_NEW_AREA") SlashCmdList.EnemyCD = function() StartTimer(UnitGUID(T.name), 47528) StartTimer(UnitGUID(T.name), 19647) StartTimer(UnitGUID(T.name), 47476) StartTimer(UnitGUID(T.name), 51514) end SLASH_EnemyCD1 = "/enemycd" SLASH_EnemyCD2 = "/утуьнсв" ================================================ FILE: ShestakUI/Modules/Cooldowns/PulseCD.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.pulsecooldown.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Based on Doom Cooldown Pulse(by Woffle of Dark Iron, editor Affli) ---------------------------------------------------------------------------------------- local GetTime = GetTime local fadeInTime, fadeOutTime, maxAlpha, elapsed, runtimer = 0.5, 0.7, 1, 0, 0 local animScale, iconSize, holdTime, threshold = C.pulsecooldown.anim_scale, C.pulsecooldown.size, C.pulsecooldown.hold_time, C.pulsecooldown.threshold local cooldowns, animating, watching = {}, {}, {} local anchor = CreateFrame("Frame", "PulseCDAnchor", UIParent) anchor:SetSize(C.pulsecooldown.size, C.pulsecooldown.size) anchor:SetPoint(unpack(C.position.pulse_cooldown)) local frame = CreateFrame("Frame", "PulseCDFrame", anchor, "BackdropTemplate") frame:SetScript("OnEvent", function(self, event, ...) self[event](self, ...) end) frame:SetBackdrop({ bgFile = C.media.blank, edgeFile = C.media.blank, edgeSize = T.noscalemult, insets = {left = -T.noscalemult, right = -T.noscalemult, top = -T.noscalemult, bottom = -T.noscalemult} }) frame:SetBackdropBorderColor(unpack(C.media.border_color)) frame:SetBackdropColor(unpack(C.media.backdrop_color)) frame:SetPoint("CENTER", anchor, "CENTER") local icon = frame:CreateTexture(nil, "ARTWORK") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:SetPoint("TOPLEFT", frame, "TOPLEFT", T.noscalemult * 2, -T.noscalemult * 2) icon:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -T.noscalemult * 2, T.noscalemult * 2) -- Utility Functions local function tcount(tab) local n = 0 for _ in pairs(tab) do n = n + 1 end return n end local function memoize(f) local cache = nil local memoized = {} local function get() if (cache == nil) then cache = f() end return cache end memoized.resetCache = function() cache = nil end setmetatable(memoized, {__call = get}) return memoized end local function GetPetActionIndexByName(name) for i = 1, NUM_PET_ACTION_SLOTS, 1 do if GetPetActionInfo(i) == name then return i end end return nil end -- Cooldown/Animation local function OnUpdate(_, update) elapsed = elapsed + update if elapsed > 0.05 then for i, v in pairs(watching) do if GetTime() >= v[1] + 0.5 then local getCooldownDetails if v[2] == "spell" then getCooldownDetails = memoize(function() local start, duration, enabled = GetSpellCooldown(v[3]) return { name = GetSpellInfo(v[3]), texture = GetSpellTexture(v[3]), start = start, duration = duration, enabled = enabled } end) elseif v[2] == "item" then getCooldownDetails = memoize(function() local start, duration, enabled = GetItemCooldown(i) return { name = GetItemInfo(i), texture = v[3], start = start, duration = duration, enabled = enabled } end) elseif v[2] == "pet" then getCooldownDetails = memoize(function() local name, texture = GetPetActionInfo(v[3]) local start, duration, enabled = GetPetActionCooldown(v[3]) return { name = name, texture = texture, isPet = true, start = start, duration = duration, enabled = enabled } end) end local cooldown = getCooldownDetails() if T.pulse_ignored_spells[cooldown.name] then watching[i] = nil else if cooldown.enabled ~= 0 then if cooldown.duration and cooldown.duration > threshold and cooldown.texture then cooldowns[i] = getCooldownDetails end end if not (cooldown.enabled == 0 and v[2] == "spell") then watching[i] = nil end end end end for i, getCooldownDetails in pairs(cooldowns) do local cooldown = getCooldownDetails() local remaining = cooldown.duration - (GetTime() - cooldown.start) if remaining <= 0 then tinsert(animating, {cooldown.texture, cooldown.isPet, cooldown.name}) cooldowns[i] = nil end end elapsed = 0 if #animating == 0 and tcount(watching) == 0 and tcount(cooldowns) == 0 then frame:SetScript("OnUpdate", nil) return end end if #animating > 0 then runtimer = runtimer + update if runtimer > (fadeInTime + holdTime + fadeOutTime) then tremove(animating, 1) runtimer = 0 icon:SetTexture(nil) frame:SetBackdropBorderColor(0, 0, 0, 0) frame:SetBackdropColor(0, 0, 0, 0) else if not icon:GetTexture() then icon:SetTexture(animating[1][1]) if C.pulsecooldown.sound == true then PlaySoundFile(C.media.proc_sound, "Master") end end local alpha = maxAlpha if runtimer < fadeInTime then alpha = maxAlpha * (runtimer / fadeInTime) elseif runtimer >= fadeInTime + holdTime then alpha = maxAlpha - (maxAlpha * ((runtimer - holdTime - fadeInTime) / fadeOutTime)) end frame:SetAlpha(alpha) local scale = iconSize + (iconSize * ((animScale - 1) * (runtimer / (fadeInTime + holdTime + fadeOutTime)))) frame:SetWidth(scale) frame:SetHeight(scale) frame:SetBackdropBorderColor(unpack(C.media.border_color)) frame:SetBackdropColor(unpack(C.media.backdrop_color)) end end end -- Event Handlers function frame:ADDON_LOADED() for _, v in pairs(T.pulse_ignored_spells) do T.pulse_ignored_spells[v] = true end self:UnregisterEvent("ADDON_LOADED") end frame:RegisterEvent("ADDON_LOADED") function frame:SPELL_UPDATE_COOLDOWN() for _, getCooldownDetails in pairs(cooldowns) do getCooldownDetails.resetCache() end end frame:RegisterEvent("SPELL_UPDATE_COOLDOWN") function frame:UNIT_SPELLCAST_SUCCEEDED(unit, _, spellID) if unit == "player" then local texture = GetSpellTexture(spellID) local t1 = GetInventoryItemTexture("player", 13) local t2 = GetInventoryItemTexture("player", 14) if texture == t1 or texture == t2 then return end -- Fix wrong buff cd for trinket watching[spellID] = {GetTime(), "spell", spellID} self:SetScript("OnUpdate", OnUpdate) end end frame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") function frame:COMBAT_LOG_EVENT_UNFILTERED() local _, eventType, _, _, _, sourceFlags, _, _, _, _, _, spellID = CombatLogGetCurrentEventInfo() if eventType == "SPELL_CAST_SUCCESS" then if (bit.band(sourceFlags, COMBATLOG_OBJECT_TYPE_PET) == COMBATLOG_OBJECT_TYPE_PET and bit.band(sourceFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE) then local name = GetSpellInfo(spellID) local index = GetPetActionIndexByName(name) if index and not select(7, GetPetActionInfo(index)) then watching[spellID] = {GetTime(), "pet", index} elseif not index and spellID then watching[spellID] = {GetTime(), "spell", spellID} else return end self:SetScript("OnUpdate", OnUpdate) end end end frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") function frame:PLAYER_ENTERING_WORLD() local _, instanceType = IsInInstance() if instanceType == "arena" then self:SetScript("OnUpdate", nil) wipe(cooldowns) wipe(watching) end end frame:RegisterEvent("PLAYER_ENTERING_WORLD") hooksecurefunc("UseAction", function(slot) local actionType, itemID = GetActionInfo(slot) if actionType == "item" then local texture = GetActionTexture(slot) watching[itemID] = {GetTime(), "item", texture} end end) hooksecurefunc("UseInventoryItem", function(slot) local itemID = GetInventoryItemID("player", slot) if itemID then local texture = GetInventoryItemTexture("player", slot) watching[itemID] = {GetTime(), "item", texture} end end) SlashCmdList.PulseCD = function() tinsert(animating, {GetSpellTexture(87214)}) if C.pulsecooldown.sound == true then PlaySoundFile(C.media.proc_sound, "Master") end frame:SetScript("OnUpdate", OnUpdate) end SLASH_PulseCD1 = "/pulsecd" SLASH_PulseCD2 = "/згдыусв" ================================================ FILE: ShestakUI/Modules/Cooldowns/RaidCD.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.raidcooldown.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Raid cooldowns(alRaidCD by Allez, msylgj0@NGACN) ---------------------------------------------------------------------------------------- local show = { raid = C.raidcooldown.show_inraid, party = C.raidcooldown.show_inparty, arena = C.raidcooldown.show_inarena, } local filter = COMBATLOG_OBJECT_AFFILIATION_RAID + COMBATLOG_OBJECT_AFFILIATION_PARTY + COMBATLOG_OBJECT_AFFILIATION_MINE local band = bit.band local sformat = string.format local floor = math.floor local currentNumResses = 0 local charges = nil local inBossCombat = nil local Ressesbars = {} local bars = {} local RaidCDAnchor = CreateFrame("Frame", "RaidCDAnchor", UIParent) RaidCDAnchor:SetPoint(unpack(C.position.raid_cooldown)) if C.raidcooldown.show_icon == true then RaidCDAnchor:SetSize(C.raidcooldown.width + 32, C.raidcooldown.height + 10) else RaidCDAnchor:SetSize(C.raidcooldown.width + 32, C.raidcooldown.height + 4) end local FormatTime = function(time) if time >= 60 then return sformat("%.2d:%.2d", floor(time / 60), time % 60) else return sformat("%.2d", time) end end local function sortByExpiration(a, b) return a.endTime > b.endTime end local CreateFS = function(frame) local fstring = frame:CreateFontString(nil, "OVERLAY") fstring:SetFont(C.font.raid_cooldowns_font, C.font.raid_cooldowns_font_size, C.font.raid_cooldowns_font_style) fstring:SetShadowOffset(C.font.raid_cooldowns_font_shadow and 1 or 0, C.font.raid_cooldowns_font_shadow and -1 or 0) return fstring end local UpdatePositions = function() if charges and Ressesbars[1] then Ressesbars[1]:SetPoint("TOPRIGHT", RaidCDAnchor, "TOPRIGHT", -2, C.raidcooldown.show_icon and -8 or -2) Ressesbars[1].id = 1 for i = 1, #bars do bars[i]:ClearAllPoints() if i == 1 then if C.raidcooldown.upwards == true then bars[i]:SetPoint("BOTTOMRIGHT", Ressesbars[1], "TOPRIGHT", 0, 13) else bars[i]:SetPoint("TOPRIGHT", Ressesbars[1], "BOTTOMRIGHT", 0, -13) end else if C.raidcooldown.upwards == true then bars[i]:SetPoint("BOTTOMRIGHT", bars[i-1], "TOPRIGHT", 0, 13) else bars[i]:SetPoint("TOPRIGHT", bars[i-1], "BOTTOMRIGHT", 0, -13) end end bars[i].id = i end else for i = 1, #bars do bars[i]:ClearAllPoints() if i == 1 then bars[i]:SetPoint("TOPRIGHT", RaidCDAnchor, "TOPRIGHT", -2, C.raidcooldown.show_icon and -8 or -2) else if C.raidcooldown.upwards == true then bars[i]:SetPoint("BOTTOMRIGHT", bars[i-1], "TOPRIGHT", 0, 13) else bars[i]:SetPoint("TOPRIGHT", bars[i-1], "BOTTOMRIGHT", 0, -13) end end bars[i].id = i end end end local StopTimer = function(bar) bar:SetScript("OnUpdate", nil) bar:Hide() if bar.isResses then tremove(Ressesbars, bar.id) else tremove(bars, bar.id) end UpdatePositions() end local UpdateCharges = function(bar) local curCharges, maxCharges, start, duration = GetSpellCharges(20484) if curCharges == maxCharges then bar.startTime = 0 bar.endTime = GetTime() else bar.startTime = start bar.endTime = start + duration end if curCharges ~= currentNumResses then currentNumResses = curCharges bar.left:SetText(bar.name.." : "..currentNumResses) end end local BarUpdate = function(self) local curTime = GetTime() if self.endTime < curTime then if self.isResses then UpdateCharges(self) else StopTimer(self) return end end self:SetValue(100 - (curTime - self.startTime) / (self.endTime - self.startTime) * 100) self.right:SetText(FormatTime(self.endTime - curTime)) end local OnEnter = function(self) GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetSpellByID(self.spellId) GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(self.left:GetText(), self.right:GetText()) GameTooltip:SetClampedToScreen(true) GameTooltip:Show() end local OnLeave = function() GameTooltip:Hide() end local OnMouseDown = function(self, button) if button == "LeftButton" then if self.isResses then SendChatMessage(sformat(L_COOLDOWNS_COMBATRESS_REMAINDER.."%d, "..L_COOLDOWNS_NEXTTIME.."%s.", currentNumResses, self.right:GetText()), T.CheckChat()) else SendChatMessage(sformat(L_COOLDOWNS.."%s - %s: %s", self.name, GetSpellLink(self.spellId), self.right:GetText()), T.CheckChat()) end elseif button == "RightButton" then StopTimer(self) end end local barWidth = C.raidcooldown.width + (C.raidcooldown.show_icon and 0 or 28) local CreateBar = function() local bar = CreateFrame("Statusbar", nil, UIParent) bar:SetFrameStrata("MEDIUM") bar:SetSize(barWidth, C.raidcooldown.height) bar:SetStatusBarTexture(C.media.texture) bar:SetMinMaxValues(0, 100) bar:CreateBackdrop("Default") bar.bg = bar:CreateTexture(nil, "BACKGROUND") bar.bg:SetAllPoints(bar) bar.bg:SetTexture(C.media.texture) bar.left = CreateFS(bar) bar.left:SetPoint("LEFT", 2, 0) bar.left:SetJustifyH("LEFT") bar.left:SetSize(barWidth - 30 - ((C.font.raid_cooldowns_font_size - 8) * 2), C.font.raid_cooldowns_font_size) bar.right = CreateFS(bar) bar.right:SetPoint("RIGHT", 1, 0) bar.right:SetJustifyH("RIGHT") if C.raidcooldown.show_icon == true then bar.icon = CreateFrame("Button", nil, bar) bar.icon:SetWidth(bar:GetHeight() + 6) bar.icon:SetHeight(bar.icon:GetWidth()) bar.icon:SetPoint("BOTTOMRIGHT", bar, "BOTTOMLEFT", -7, 0) bar.icon:CreateBackdrop("Default") end return bar end local StartTimer = function(name, spellId) local spell, _, icon = GetSpellInfo(spellId) if charges and spellId == 20484 then for _, v in pairs(Ressesbars) do UpdateCharges(v) return end end for _, v in pairs(bars) do if v.name == name and v.spell == spell then StopTimer(v) end end local bar = CreateBar() local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[select(2, UnitClass(name))] if charges and spellId == 20484 then local curCharges, _, start, duration = GetSpellCharges(20484) currentNumResses = curCharges bar.startTime = start bar.endTime = start + duration bar.left:SetText(name.." : "..curCharges) bar.right:SetText(FormatTime(duration)) bar.isResses = true bar.name = name bar.spell = spell bar.spellId = spellId if C.raidcooldown.show_icon == true then bar.icon:SetNormalTexture(icon) bar.icon:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9) end bar:Show() if color then bar:SetStatusBarColor(color.r, color.g, color.b) bar.bg:SetVertexColor(color.r, color.g, color.b, 0.2) else if curCharges and curCharges > 0 then bar:SetStatusBarColor(0.3, 0.7, 0.3) bar.bg:SetVertexColor(0.3, 0.7, 0.3, 0.2) else bar:SetStatusBarColor(0.8, 0.3, 0.3) bar.bg:SetVertexColor(0.8, 0.3, 0.3, 0.2) end end bar:SetScript("OnUpdate", BarUpdate) bar:EnableMouse(true) bar:SetScript("OnEnter", OnEnter) bar:SetScript("OnLeave", OnLeave) bar:SetScript("OnMouseDown", OnMouseDown) tinsert(Ressesbars, bar) if C.raidcooldown.expiration == true then table.sort(Ressesbars, sortByExpiration) end else bar.startTime = GetTime() bar.endTime = GetTime() + T.RaidSpells[spellId] bar.left:SetText(format("%s - %s", name:gsub("%-[^|]+", ""), spell)) bar.right:SetText(FormatTime(T.RaidSpells[spellId])) bar.isResses = false bar.name = name bar.spell = spell bar.spellId = spellId if C.raidcooldown.show_icon == true then bar.icon:SetNormalTexture(icon) bar.icon:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9) end bar:Show() if spellId == 264667 then color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)["HUNTER"] end -- Change color for Hunter's pet if color then bar:SetStatusBarColor(color.r, color.g, color.b) bar.bg:SetVertexColor(color.r, color.g, color.b, 0.2) else bar:SetStatusBarColor(0.3, 0.7, 0.3) bar.bg:SetVertexColor(0.3, 0.7, 0.3, 0.2) end bar:SetScript("OnUpdate", BarUpdate) bar:EnableMouse(true) bar:SetScript("OnEnter", OnEnter) bar:SetScript("OnLeave", OnLeave) bar:SetScript("OnMouseDown", OnMouseDown) tinsert(bars, bar) if C.raidcooldown.expiration == true then table.sort(bars, sortByExpiration) end end UpdatePositions() end local OnEvent = function(self, event) if event == "PLAYER_ENTERING_WORLD" or event == "ZONE_CHANGED_NEW_AREA" then if (select(2, IsInInstance()) == "raid" or select(2, IsInInstance()) == "party") and IsInGroup() then self:RegisterEvent("SPELL_UPDATE_CHARGES") else self:UnregisterEvent("SPELL_UPDATE_CHARGES") charges = nil inBossCombat = nil currentNumResses = 0 Ressesbars = {} end end if event == "SPELL_UPDATE_CHARGES" then charges = GetSpellCharges(20484) if charges then if not inBossCombat then inBossCombat = true end StartTimer(L_COOLDOWNS_COMBATRESS, 20484) elseif not charges and inBossCombat then inBossCombat = nil currentNumResses = 0 for _, v in pairs(Ressesbars) do StopTimer(v) end end end if event == "COMBAT_LOG_EVENT_UNFILTERED" then local _, eventType, _, _, sourceName, sourceFlags, _, _, _, _, _, spellId = CombatLogGetCurrentEventInfo() if band(sourceFlags, filter) == 0 then return end if eventType == "SPELL_RESURRECT" or eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_AURA_APPLIED" then if sourceName then sourceName = sourceName:gsub("-.+", "") else return end if T.RaidSpells[spellId] and show[select(2, IsInInstance())] and IsInGroup() then if (sourceName == T.name and C.raidcooldown.show_self == true) or sourceName ~= T.name then StartTimer(sourceName, spellId) end end end elseif event == "ZONE_CHANGED_NEW_AREA" and select(2, IsInInstance()) == "arena" or not IsInGroup() then for _, v in pairs(Ressesbars) do StopTimer(v) end for _, v in pairs(bars) do v.endTime = 0 end elseif event == "ENCOUNTER_END" and select(2, IsInInstance()) == "raid" then for _, v in pairs(bars) do v.endTime = 0 end end end for spell in pairs(T.RaidSpells) do local name = GetSpellInfo(spell) if not name then print("|cffff0000WARNING: spell ID ["..tostring(spell).."] no longer exists! Report this to Shestak.|r") end end local f = CreateFrame("Frame") f:SetScript("OnEvent", OnEvent) f:RegisterEvent("PLAYER_ENTERING_WORLD") f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") f:RegisterEvent("ZONE_CHANGED_NEW_AREA") f:RegisterEvent("ENCOUNTER_END") SlashCmdList.RaidCD = function() StartTimer(UnitName("player"), 20484) -- Rebirth StartTimer(UnitName("player"), 20707) -- Soulstone StartTimer(UnitName("player"), 108280) -- Healing Tide Totem end SLASH_RaidCD1 = "/raidcd" SLASH_RaidCD2 = "/кфшвсв" ================================================ FILE: ShestakUI/Modules/Loot/AutoConfirm.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.loot.auto_confirm_de ~= true then return end ---------------------------------------------------------------------------------------- -- Disenchant confirmation(tekKrush by Tekkub) ---------------------------------------------------------------------------------------- local frame = CreateFrame("Frame") frame:RegisterEvent("CONFIRM_DISENCHANT_ROLL") frame:RegisterEvent("CONFIRM_LOOT_ROLL") frame:RegisterEvent("LOOT_BIND_CONFIRM") frame:SetScript("OnEvent", function() for i = 1, STATICPOPUP_NUMDIALOGS do local frame = _G["StaticPopup"..i] if (frame.which == "CONFIRM_LOOT_ROLL" or frame.which == "LOOT_BIND") and frame:IsVisible() then StaticPopup_OnClick(frame, 1) end end end) ================================================ FILE: ShestakUI/Modules/Loot/AutoGreed.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.loot.auto_greed ~= true or T.level ~= MAX_PLAYER_LEVEL then return end ---------------------------------------------------------------------------------------- -- Auto greed/disenchant on green items(by Tekkub) ---------------------------------------------------------------------------------------- local frame = CreateFrame("Frame") frame:RegisterEvent("START_LOOT_ROLL") frame:SetScript("OnEvent", function(_, _, id) local _, _, _, quality, BoP, _, _, canDisenchant = GetLootRollItemInfo(id) if id and quality == 2 and not BoP then local link = GetLootRollItemLink(id) local _, _, _, ilevel = GetItemInfo(link) if canDisenchant and ilevel > 270 then RollOnLoot(id, 3) else RollOnLoot(id, 2) end end end) ================================================ FILE: ShestakUI/Modules/Loot/FasterLoot.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.loot.faster_loot ~= true then return end ---------------------------------------------------------------------------------------- -- Faster auto looting ---------------------------------------------------------------------------------------- local tDelay = 0 local LOOT_DELAY = 0.3 local frame = CreateFrame("Frame") frame:RegisterEvent("LOOT_READY") frame:SetScript("OnEvent", function () if GetCVarBool("autoLootDefault") ~= IsModifiedClick("AUTOLOOTTOGGLE") then if (GetTime() - tDelay) >= LOOT_DELAY then for i = GetNumLootItems(), 1, -1 do LootSlot(i) end tDelay = GetTime() end end end) ================================================ FILE: ShestakUI/Modules/Loot/GroupLoot.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.loot.rolllootframe ~= true then return end ---------------------------------------------------------------------------------------- -- Based on teksLoot(by Tekkub) ---------------------------------------------------------------------------------------- local pos = "TOP" local frames = {} local cancelled_rolls = {} local rolltypes = {"need", "greed", "disenchant", [0] = "pass"} local LootRollAnchor = CreateFrame("Frame", "LootRollAnchor", UIParent) LootRollAnchor:SetSize(313, 26) local function ClickRoll(frame) RollOnLoot(frame.parent.rollID, frame.rolltype) end local function HideTip() GameTooltip:Hide() end local function HideTip2() GameTooltip:Hide() ResetCursor() end local function SetTip(frame) GameTooltip:SetOwner(frame, "ANCHOR_TOPLEFT") GameTooltip:SetText(frame.tiptext) if not frame:IsEnabled() then GameTooltip:AddLine(frame.errtext, 1, 0.2, 0.2, 1) end for name, roll in pairs(frame.parent.rolls) do if roll == rolltypes[frame.rolltype] then GameTooltip:AddLine(name, 1, 1, 1) end end GameTooltip:Show() end local function SetItemTip(frame) if not frame.link then return end GameTooltip:SetOwner(frame, "ANCHOR_TOPLEFT") GameTooltip:SetHyperlink(frame.link) if IsShiftKeyDown() then GameTooltip_ShowCompareItem() end if IsModifiedClick("DRESSUP") then ShowInspectCursor() else ResetCursor() end end local function ItemOnUpdate(frame) if GameTooltip:IsOwned(frame) then if IsShiftKeyDown() then GameTooltip_ShowCompareItem() else ShoppingTooltip1:Hide() ShoppingTooltip2:Hide() end if IsControlKeyDown() then ShowInspectCursor() else ResetCursor() end end end local function LootClick(frame) if IsControlKeyDown() then DressUpItemLink(frame.link) elseif IsShiftKeyDown() then local _, item = GetItemInfo(frame.link) if ChatEdit_GetActiveWindow() then ChatEdit_InsertLink(item) else ChatFrame_OpenChat(item) end end end local function OnEvent(frame, _, rollID) cancelled_rolls[rollID] = true if frame.rollID ~= rollID then return end frame.rollID = nil frame.time = nil frame:Hide() end local function StatusUpdate(frame) if not frame.parent.rollID then return end local t = GetLootRollTimeLeft(frame.parent.rollID) frame:SetValue(t) end local function CreateRollButton(parent, ntex, ptex, htex, rolltype, tiptext, ...) local f = CreateFrame("Button", nil, parent) f:SetPoint(...) f:SetSize(28, 28) f:SetNormalTexture(ntex) if ptex then f:SetPushedTexture(ptex) end f:SetHighlightTexture(htex) f.rolltype = rolltype f.parent = parent f.tiptext = tiptext f:SetScript("OnEnter", SetTip) f:SetScript("OnLeave", HideTip) f:SetScript("OnClick", ClickRoll) f:SetMotionScriptsWhileDisabled(true) local txt = f:CreateFontString(nil, nil) txt:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style) txt:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0) txt:SetPoint("CENTER", 0, rolltype == 2 and 1 or rolltype == 0 and -1.2 or 0) return f, txt end local function CreateRollFrame() local frame = CreateFrame("Frame", nil, UIParent) frame:CreateBackdrop("Default") frame:SetSize(280, 22) frame:SetFrameStrata("MEDIUM") frame:SetFrameLevel(10) frame:SetScript("OnEvent", OnEvent) frame:RegisterEvent("CANCEL_LOOT_ROLL") frame:Hide() local button = CreateFrame("Button", nil, frame) button:SetPoint("LEFT", -29, 0) button:SetSize(22, 22) button:CreateBackdrop("Default") button:SetScript("OnEnter", SetItemTip) button:SetScript("OnLeave", HideTip2) button:SetScript("OnUpdate", ItemOnUpdate) button:SetScript("OnClick", LootClick) frame.button = button button.icon = button:CreateTexture(nil, "OVERLAY") button.icon:SetAllPoints() button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) local status = CreateFrame("StatusBar", nil, frame) status:SetSize(326, 20) status:SetPoint("TOPLEFT", 0, 0) status:SetPoint("BOTTOMRIGHT", 0, 0) status:SetScript("OnUpdate", StatusUpdate) status:SetFrameLevel(status:GetFrameLevel() - 1) status:SetStatusBarTexture(C.media.texture) status:SetStatusBarColor(0.8, 0.8, 0.8, 0.9) status.parent = frame frame.status = status status.bg = status:CreateTexture(nil, "BACKGROUND") status.bg:SetAlpha(0.1) status.bg:SetAllPoints() status.bg:SetDrawLayer("BACKGROUND", 2) local need, needtext = CreateRollButton(frame, "Interface\\Buttons\\UI-GroupLoot-Dice-Up", "Interface\\Buttons\\UI-GroupLoot-Dice-Highlight", "Interface\\Buttons\\UI-GroupLoot-Dice-Down", 1, NEED, "LEFT", frame.button, "RIGHT", 5, -1) local greed, greedtext = CreateRollButton(frame, "Interface\\Buttons\\UI-GroupLoot-Coin-Up", "Interface\\Buttons\\UI-GroupLoot-Coin-Highlight", "Interface\\Buttons\\UI-GroupLoot-Coin-Down", 2, GREED, "LEFT", need, "RIGHT", 0, -1) local de, detext = CreateRollButton(frame, "Interface\\Buttons\\UI-GroupLoot-DE-Up", "Interface\\Buttons\\UI-GroupLoot-DE-Highlight", "Interface\\Buttons\\UI-GroupLoot-DE-Down", 3, ROLL_DISENCHANT, "LEFT", greed, "RIGHT", 0, -1) local pass, passtext = CreateRollButton(frame, "Interface\\Buttons\\UI-GroupLoot-Pass-Up", nil, "Interface\\Buttons\\UI-GroupLoot-Pass-Down", 0, PASS, "LEFT", de or greed, "RIGHT", 0, 2.2) frame.needbutt, frame.greedbutt, frame.disenchantbutt = need, greed, de frame.need, frame.greed, frame.pass, frame.disenchant = needtext, greedtext, passtext, detext local bind = frame:CreateFontString() bind:SetPoint("LEFT", pass, "RIGHT", 3, 1) bind:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style) bind:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0) frame.fsbind = bind local loot = frame:CreateFontString(nil, "ARTWORK") loot:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style) loot:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0) loot:SetPoint("LEFT", bind, "RIGHT", 0, 0) loot:SetPoint("RIGHT", frame, "RIGHT", -5, 0) loot:SetSize(200, 10) loot:SetJustifyH("LEFT") frame.fsloot = loot frame.rolls = {} return frame end local function GetFrame() for _, f in ipairs(frames) do if not f.rollID then return f end end local f = CreateRollFrame() if pos == "TOP" then f:SetPoint("TOPRIGHT", next(frames) and frames[#frames] or LootRollAnchor, "BOTTOMRIGHT", next(frames) and 0 or -2, next(frames) and -7 or -5) else f:SetPoint("BOTTOMRIGHT", next(frames) and frames[#frames] or LootRollAnchor, "TOPRIGHT", next(frames) and 0 or -2, next(frames) and 7 or 5) end table.insert(frames, f) return f end local function FindFrame(rollID) for _, f in ipairs(frames) do if f.rollID == rollID then return f end end end local typemap = {[0] = "pass", "need", "greed", "disenchant"} local function UpdateRoll(i, rolltype) local num = 0 local rollID, _, numPlayers, isDone = C_LootHistory.GetItem(i) if isDone or not numPlayers then return end local f = FindFrame(rollID) if not f then return end for j = 1, numPlayers do local name, _, thisrolltype = C_LootHistory.GetPlayerInfo(i, j) f.rolls[name] = typemap[thisrolltype] if rolltype == thisrolltype then num = num + 1 end end f[typemap[rolltype]]:SetText(num) end local function START_LOOT_ROLL(rollID, time) if cancelled_rolls[rollID] then return end local f = GetFrame() f.rollID = rollID f.time = time for i in pairs(f.rolls) do f.rolls[i] = nil end f.need:SetText(0) f.greed:SetText(0) f.pass:SetText(0) f.disenchant:SetText(0) local texture, name, _, quality, bop, canNeed, canGreed, canDisenchant, reasonNeed, reasonGreed, reasonDisenchant, deSkillRequired = GetLootRollItemInfo(rollID) f.button.icon:SetTexture(texture) f.button.link = GetLootRollItemLink(rollID) if C.loot.auto_greed and T.level == MAX_PLAYER_LEVEL and quality == 2 and not bop then return end if canNeed then f.needbutt:Enable() f.needbutt:SetAlpha(1) SetDesaturation(f.needbutt:GetNormalTexture(), false) else f.needbutt:Disable() f.needbutt:SetAlpha(0.2) SetDesaturation(f.needbutt:GetNormalTexture(), true) f.needbutt.errtext = _G["LOOT_ROLL_INELIGIBLE_REASON"..reasonNeed] end if canGreed then f.greedbutt:Enable() f.greedbutt:SetAlpha(1) SetDesaturation(f.greedbutt:GetNormalTexture(), false) else f.greedbutt:Disable() f.greedbutt:SetAlpha(0.2) SetDesaturation(f.greedbutt:GetNormalTexture(), true) f.greedbutt.errtext = _G["LOOT_ROLL_INELIGIBLE_REASON"..reasonGreed] end if canDisenchant then f.disenchantbutt:Enable() f.disenchantbutt:SetAlpha(1) SetDesaturation(f.disenchantbutt:GetNormalTexture(), false) else f.disenchantbutt:Disable() f.disenchantbutt:SetAlpha(0.2) SetDesaturation(f.disenchantbutt:GetNormalTexture(), true) f.disenchantbutt.errtext = format(_G["LOOT_ROLL_INELIGIBLE_REASON"..reasonDisenchant], deSkillRequired) end f.fsbind:SetText(bop and "BoP" or "BoE") f.fsbind:SetVertexColor(bop and 1 or 0.3, bop and 0.3 or 1, bop and 0.1 or 0.3) local color = ITEM_QUALITY_COLORS[quality] f.fsloot:SetText(name) f.fsloot:SetVertexColor(color.r, color.g, color.b) f.status:SetStatusBarColor(color.r, color.g, color.b, 0.7) f.status.bg:SetColorTexture(color.r, color.g, color.b) f.backdrop:SetBackdropBorderColor(color.r, color.g, color.b, 0.7) f.button.backdrop:SetBackdropBorderColor(color.r, color.g, color.b, 0.7) f.status:SetMinMaxValues(0, time) f.status:SetValue(time) --BETA f:SetPoint("CENTER", WorldFrame, "CENTER") f:Show() end local function LOOT_HISTORY_ROLL_CHANGED(rollindex, playerindex) local _, _, rolltype = C_LootHistory.GetPlayerInfo(rollindex, playerindex) UpdateRoll(rollindex, rolltype) end LootRollAnchor:RegisterEvent("ADDON_LOADED") LootRollAnchor:SetScript("OnEvent", function(_, _, addon) if addon ~= "ShestakUI" then return end LootRollAnchor:UnregisterEvent("ADDON_LOADED") LootRollAnchor:RegisterEvent("START_LOOT_ROLL") LootRollAnchor:RegisterEvent("LOOT_HISTORY_ROLL_CHANGED") UIParent:UnregisterEvent("START_LOOT_ROLL") UIParent:UnregisterEvent("CANCEL_LOOT_ROLL") LootRollAnchor:SetScript("OnEvent", function(_, event, ...) if event == "LOOT_HISTORY_ROLL_CHANGED" then return LOOT_HISTORY_ROLL_CHANGED(...) else return START_LOOT_ROLL(...) end end) LootRollAnchor:SetPoint(unpack(C.position.group_loot)) end) SlashCmdList.TESTROLL = function() local f = GetFrame() local items = {32837, 34196, 33820, 84004} if f:IsShown() then f:Hide() else local item = items[math.random(1, #items)] local _, _, quality, _, _, _, _, _, _, texture = GetItemInfo(item) local r, g, b = GetItemQualityColor(quality or 1) f.button.icon:SetTexture(texture) f.button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) f.fsloot:SetText(GetItemInfo(item)) f.fsloot:SetVertexColor(r, g, b) f.status:SetMinMaxValues(0, 100) f.status:SetValue(math.random(50, 90)) f.status:SetStatusBarColor(r, g, b, 0.7) f.status.bg:SetColorTexture(r, g, b) f.backdrop:SetBackdropBorderColor(r, g, b, 0.7) f.button.backdrop:SetBackdropBorderColor(r, g, b, 0.7) f.need:SetText(0) f.greed:SetText(0) f.pass:SetText(0) f.disenchant:SetText(0) f.button.link = "item:"..item..":0:0:0:0:0:0:0" f:Show() end end SLASH_TESTROLL1 = "/testroll" SLASH_TESTROLL2 = "/еуыекщдд" ================================================ FILE: ShestakUI/Modules/Loot/Loot.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.loot.lootframe ~= true then return end ---------------------------------------------------------------------------------------- -- Loot frame(Butsu by Haste) ---------------------------------------------------------------------------------------- local _, _NS = ... local Butsu = CreateFrame("Button", "Butsu") local lb = CreateFrame("Button", "ButsuAdv", Butsu, "UIPanelScrollDownButtonTemplate") local LDD = CreateFrame("Frame", "ButsuLDD", Butsu, "UIDropDownMenuTemplate") Butsu:Hide() Butsu:SetScript("OnEvent", function(self, event, ...) self[event](self, event, ...) end) function Butsu:LOOT_OPENED(_, ...) self:Show() lb:Show() local autoLoot = ... if not self:IsShown() then CloseLoot(not autoLoot) end if IsFishingLoot() then self.title:SetText(L_LOOT_FISH) elseif not UnitIsFriend("player", "target") and UnitIsDead("target") then self.title:SetText(UnitName("target")) else self.title:SetText(LOOT) end -- Blizzard uses strings here if GetCVar("lootUnderMouse") == "1" then local x, y = GetCursorPosition() x = x / self:GetEffectiveScale() y = y / self:GetEffectiveScale() self:ClearAllPoints() self:SetPoint("TOPLEFT", nil, "BOTTOMLEFT", x - 40, y + 20) self:GetCenter() self:Raise() end local m = 0 local items = GetNumLootItems() if items > 0 then for i = 1, items do local slot = _NS.slots[i] or _NS.CreateSlot(i) local texture, item, quantity, currencyID, quality, _, isQuestItem, questId, isActive = GetLootSlotInfo(i) if currencyID then item, texture, quantity, quality = CurrencyContainerUtil.GetCurrencyContainerInfo(currencyID, quantity, item, texture, quality) end if texture then local color = ITEM_QUALITY_COLORS[quality] local r, g, b = color.r, color.g, color.b if GetLootSlotType(i) == LOOT_SLOT_MONEY then item = item:gsub("\n", ", ") end if quantity and quantity > 1 then slot.count:SetText(quantity) slot.count:Show() else slot.count:Hide() end if questId and not isActive then slot.quest:Show() else slot.quest:Hide() end if color or questId or isQuestItem then if questId or isQuestItem then r, g, b = 1, 1, 0.2 end slot.iconFrame:SetBackdropBorderColor(r, g, b) slot.backdrop:SetBackdropBorderColor(r, g, b) slot.drop:SetVertexColor(r, g, b) end slot.drop:Show() slot.isQuestItem = isQuestItem slot.quality = quality slot.name:SetText(item) if color then slot.name:SetTextColor(r, g, b) end slot.icon:SetTexture(texture) if quality then m = math.max(m, quality) end slot:Enable() slot:Show() end end else local slot = _NS.slots[1] or _NS.CreateSlot(1) local color = ITEM_QUALITY_COLORS[0] slot.name:SetText(EMPTY) slot.name:SetTextColor(color.r, color.g, color.b) slot.icon:SetTexture("Interface\\Icons\\INV_Misc_Herb_AncientLichen") slot.count:Hide() slot.drop:Hide() slot:Disable() slot:Show() end self:AnchorSlots() local color = ITEM_QUALITY_COLORS[m] self:SetBackdropBorderColor(color.r, color.g, color.b, 0.8) self:SetWidth(C.loot.width) self.title:SetWidth(C.loot.width - 45) self.title:SetHeight(C.font.loot_font_size) end Butsu:RegisterEvent("LOOT_OPENED") function Butsu:LOOT_SLOT_CLEARED(_, slot) if not self:IsShown() then return end if _NS.slots[slot] then _NS.slots[slot]:Hide() end self:AnchorSlots() end Butsu:RegisterEvent("LOOT_SLOT_CLEARED") function Butsu:LOOT_CLOSED() StaticPopup_Hide("LOOT_BIND") self:Hide() lb:Hide() for _, v in pairs(_NS.slots) do v:Hide() end end Butsu:RegisterEvent("LOOT_CLOSED") function Butsu:OPEN_MASTER_LOOT_LIST() ToggleDropDownMenu(nil, nil, GroupLootDropDown, LootFrame.selectedLootButton, 0, 0) end Butsu:RegisterEvent("OPEN_MASTER_LOOT_LIST") function Butsu:UPDATE_MASTER_LOOT_LIST() UIDropDownMenu_Refresh(GroupLootDropDown) end Butsu:RegisterEvent("UPDATE_MASTER_LOOT_LIST") do local title = Butsu:CreateFontString(nil, "OVERLAY") title:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style) title:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0) title:SetJustifyH("LEFT") title:SetPoint("TOPLEFT", Butsu, "TOPLEFT", 8, -7) Butsu.title = title end Butsu:SetScript("OnMouseDown", function(self, button) if IsAltKeyDown() or IsShiftKeyDown() then self:StartMoving() elseif IsControlKeyDown() and button == "RightButton" then self:ClearAllPoints() self:SetPoint(unpack(C.position.loot)) self:SetUserPlaced(false) end end) Butsu:SetScript("OnMouseUp", function(self) self:StopMovingOrSizing() end) Butsu:SetScript("OnHide", function() StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION") CloseLoot() end) Butsu:SetMovable(true) Butsu:RegisterForClicks("AnyUp") Butsu:SetParent(UIParent) Butsu:SetPoint(unpack(C.position.loot)) Butsu:SetTemplate("Transparent") Butsu:SetClampedToScreen(true) Butsu:SetFrameStrata("DIALOG") Butsu:SetToplevel(true) Butsu:SetFrameLevel(10) local close = CreateFrame("Button", "LootCloseButton", Butsu, "UIPanelCloseButton") T.SkinCloseButton(close, nil, nil, true) close:SetSize(15, 15) close:SetScript("OnClick", function() CloseLoot() end) ---------------------------------------------------------------------------------------- -- Announce loot(lcLoot by RustamIrzaev) ---------------------------------------------------------------------------------------- local function Announce(chn) local nums = GetNumLootItems() if nums == 0 or (nums == 1 and GetLootSlotType(1) == LOOT_SLOT_MONEY) then return end if UnitIsPlayer("target") or not UnitExists("target") then SendChatMessage(">> "..LOOT..":", chn) else SendChatMessage(">> "..LOOT.." - '"..UnitName("target").."':", chn) end for i = 1, GetNumLootItems() do if LootSlotHasItem(i) then local link = GetLootSlotLink(i) local messlink = "- %s" if GetLootSlotType(i) ~= LOOT_SLOT_MONEY then SendChatMessage(format(messlink, link), chn) end end end end local function LDD_OnClick(self) local val = self.value Announce(val) end local function LDD_Initialize() local info = {} info.text = L_LOOT_ANNOUNCE info.notCheckable = true info.isTitle = true UIDropDownMenu_AddButton(info) info = {} info.text = L_LOOT_TO_RAID info.value = "raid" info.notCheckable = 1 info.func = LDD_OnClick UIDropDownMenu_AddButton(info) info = {} info.text = L_LOOT_TO_GUILD info.value = "guild" info.notCheckable = 1 info.func = LDD_OnClick UIDropDownMenu_AddButton(info) info = {} info.text = L_LOOT_TO_PARTY info.value = "party" info.notCheckable = 1 info.func = LDD_OnClick UIDropDownMenu_AddButton(info) info = {} info.text = L_LOOT_TO_SAY info.value = "say" info.notCheckable = 1 info.func = LDD_OnClick UIDropDownMenu_AddButton(info) info = nil end T.SkinCloseButton(lb, LootCloseButton, "-", true) lb:SetSize(15, 15) lb:ClearAllPoints() lb:SetPoint("BOTTOMRIGHT", Butsu, "TOPRIGHT", -22, -19) lb:SetFrameStrata("DIALOG") lb:RegisterForClicks("RightButtonUp", "LeftButtonUp") lb:SetScript("OnClick", function(_, button) if button == "RightButton" then ToggleDropDownMenu(nil, nil, LDD, lb, 0, 0) else Announce(T.CheckChat()) end end) lb:Hide() UIDropDownMenu_Initialize(LDD, LDD_Initialize, "MENU") do local slots = {} _NS.slots = slots local OnEnter = function(self) local slot = self:GetID() if LootSlotHasItem(slot) then GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetLootItem(slot) CursorUpdate(self) end self.drop:Show() if self.isQuestItem then self.drop:SetVertexColor(0.8, 0.8, 0.2) else self.drop:SetVertexColor(1, 1, 0) end end local OnLeave = function(self) local color = ITEM_QUALITY_COLORS[self.quality] if self.isQuestItem then self.drop:SetVertexColor(1, 1, 0.2) elseif color then self.drop:SetVertexColor(color.r, color.g, color.b) end GameTooltip:Hide() ResetCursor() end local OnClick = function(self) if IsModifiedClick() then HandleModifiedItemClick(GetLootSlotLink(self:GetID())) else StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION") LootFrame.selectedLootButton = self LootFrame.selectedSlot = self:GetID() LootFrame.selectedQuality = self.quality LootFrame.selectedItemName = self.name:GetText() LootSlot(self:GetID()) end end local OnUpdate = function(self) if GameTooltip:IsOwned(self) then GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetLootItem(self:GetID()) CursorOnUpdate(self) end end function _NS.CreateSlot(id) local frame = CreateFrame("Button", "ButsuSlot"..id, Butsu) frame:SetHeight(math.max(C.font.loot_font_size, C.loot.icon_size)) frame:SetID(id) frame:RegisterForClicks("LeftButtonUp", "RightButtonUp") frame:SetScript("OnEnter", OnEnter) frame:SetScript("OnLeave", OnLeave) frame:SetScript("OnClick", OnClick) frame:SetScript("OnUpdate", OnUpdate) local iconFrame = CreateFrame("Frame", nil, frame) iconFrame:SetSize(C.loot.icon_size, C.loot.icon_size) iconFrame:SetTemplate("Default") iconFrame:SetPoint("LEFT", frame) frame.iconFrame = iconFrame local icon = iconFrame:CreateTexture(nil, "ARTWORK") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) frame.icon = icon local quest = iconFrame:CreateTexture(nil, "OVERLAY") quest:SetTexture("Interface\\Minimap\\ObjectIcons") quest:SetTexCoord(1/8, 2/8, 1/8, 2/8) quest:SetSize(C.loot.icon_size * 0.8, C.loot.icon_size * 0.8) quest:SetPoint("BOTTOMLEFT", -C.loot.icon_size * 0.15, 0) frame.quest = quest local count = iconFrame:CreateFontString(nil, "OVERLAY") count:SetJustifyH("RIGHT") count:SetPoint("BOTTOMRIGHT", iconFrame, "BOTTOMRIGHT", 1, 1) count:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style) count:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0) count:SetText(1) frame.count = count local name = frame:CreateFontString(nil, "OVERLAY") name:SetJustifyH("LEFT") name:SetPoint("LEFT", icon, "RIGHT", 10, 0) name:SetNonSpaceWrap(true) name:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style) name:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0) name:SetWidth(C.loot.width - C.loot.icon_size - 25) name:SetHeight(C.font.loot_font_size) frame.name = name local drop = frame:CreateTexture(nil, "ARTWORK") drop:SetTexture(C.media.blank) drop:SetPoint("TOPLEFT", C.loot.icon_size + 5, -2) drop:SetPoint("BOTTOMRIGHT", -2, 2) drop:SetAlpha(0.5) frame.drop = drop frame:CreateBackdrop("Default") frame.backdrop:SetPoint("TOPLEFT", C.loot.icon_size + 3, 0) frame.backdrop:SetPoint("BOTTOMRIGHT") slots[id] = frame return frame end function Butsu:AnchorSlots() local frameSize = math.max(C.loot.icon_size, C.loot.icon_size) local shownSlots = 0 local prevShown for i = 1, #slots do local frame = slots[i] if frame:IsShown() then frame:ClearAllPoints() frame:SetPoint("LEFT", 8, 0) frame:SetPoint("RIGHT", -8, 0) if not prevShown then frame:SetPoint("TOPLEFT", self, 8, -25) else frame:SetPoint("TOP", prevShown, "BOTTOM", 0, -3) end frame:SetHeight(frameSize) shownSlots = shownSlots + 1 prevShown = frame end end self:SetHeight((shownSlots * (frameSize + 3)) + 30) end end -- Kill the default loot frame LootFrame:UnregisterAllEvents() -- Escape the dungeon table.insert(UISpecialFrames, "Butsu") ================================================ FILE: ShestakUI/Modules/Loot/MasterLoot.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.loot.lootframe ~= true then return end ---------------------------------------------------------------------------------------- -- MasterLoot by Ammo ---------------------------------------------------------------------------------------- local hexColors = {} for k, v in pairs(RAID_CLASS_COLORS) do hexColors[k] = "|c"..v.colorStr end hexColors["UNKNOWN"] = string.format("|cff%02x%02x%02x", 0.6 * 255, 0.6 * 255, 0.6 * 255) if CUSTOM_CLASS_COLORS then local function update() for k, v in pairs(CUSTOM_CLASS_COLORS) do hexColors[k] = "|c"..v.colorStr end end CUSTOM_CLASS_COLORS:RegisterCallback(update) update() end local classesInRaid = {} local players, player_indices = {}, {} local randoms = {} local wipe = table.wipe local function MasterLoot_RequestRoll(frame) DoMasterLootRoll(frame.value) end local function MasterLoot_GiveLoot(frame) MasterLooterFrame.slot = LootFrame.selectedSlot MasterLooterFrame.candidateId = frame.value if LootFrame.selectedQuality >= MASTER_LOOT_THREHOLD then StaticPopup_Show("CONFIRM_LOOT_DISTRIBUTION", ITEM_QUALITY_COLORS[LootFrame.selectedQuality].hex..LootFrame.selectedItemName..FONT_COLOR_CODE_CLOSE, frame:GetText() or UNKNOWN, "LootWindow") else GiveMasterLoot(LootFrame.selectedSlot, frame.value) end CloseDropDownMenus() end local function init() local candidate, lclass, className local slot = LootFrame.selectedSlot or 0 local info = UIDropDownMenu_CreateInfo() if UIDROPDOWNMENU_MENU_LEVEL == 2 then -- Raid class menu wipe(players) wipe(player_indices) local this_class = UIDROPDOWNMENU_MENU_VALUE for i = 1, MAX_RAID_MEMBERS do candidate, lclass, className = GetMasterLootCandidate(slot, i) if candidate and this_class == className then table.insert(players, candidate) player_indices[candidate] = i end end if #players > 0 then table.sort(players) for _, cand in ipairs(players) do -- Add candidate button info.text = cand info.colorCode = hexColors[this_class] or hexColors["UNKNOWN"] info.textHeight = 12 info.value = player_indices[cand] info.notCheckable = 1 info.disabled = nil info.func = MasterLoot_GiveLoot UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL) end end return end info.isTitle = 1 info.text = GIVE_LOOT info.textHeight = 12 info.notCheckable = 1 info.disabled = nil info.notClickable = nil UIDropDownMenu_AddButton(info) if IsInRaid() then -- In a raid wipe(classesInRaid) for i = 1, MAX_RAID_MEMBERS do candidate, lclass, className = GetMasterLootCandidate(slot, i) if candidate then classesInRaid[className] = lclass end end for _, class in ipairs(CLASS_SORT_ORDER) do local cname = classesInRaid[class] if cname then info.isTitle = nil info.text = cname info.colorCode = hexColors[class] or hexColors["UNKNOWN"] info.textHeight = 12 info.hasArrow = 1 info.notCheckable = 1 info.value = class info.func = nil info.disabled = nil UIDropDownMenu_AddButton(info) end end else -- In a party for i = 1, MAX_PARTY_MEMBERS + 1, 1 do candidate, lclass, className = GetMasterLootCandidate(slot, i) if candidate then -- Add candidate button info.text = candidate info.colorCode = hexColors[className] or hexColors["UNKNOWN"] info.textHeight = 12 info.value = i info.notCheckable = 1 info.hasArrow = nil info.isTitle = nil info.disabled = nil info.func = MasterLoot_GiveLoot UIDropDownMenu_AddButton(info) end end end info.colorCode = "|cffffffff" info.isTitle = nil info.textHeight = 12 info.value = slot info.notCheckable = 1 info.hasArrow = nil info.text = REQUEST_ROLL info.func = MasterLoot_RequestRoll info.icon = "Interface\\Buttons\\UI-GroupLoot-Dice-Up" UIDropDownMenu_AddButton(info) wipe(randoms) for i = 1, MAX_RAID_MEMBERS do candidate, lclass, className = GetMasterLootCandidate(slot, i) if candidate then table.insert(randoms, i) end end if #randoms > 0 then info.colorCode = "|cffffffff" info.isTitle = nil info.textHeight = 12 info.value = randoms[math.random(1, #randoms)] info.notCheckable = 1 info.text = L_LOOT_RANDOM info.func = MasterLoot_GiveLoot info.icon = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" UIDropDownMenu_AddButton(info) end for i = 1, MAX_RAID_MEMBERS do candidate, lclass, className = GetMasterLootCandidate(slot, i) if candidate and candidate == T.name then info.colorCode = hexColors[className] or hexColors["UNKNOWN"] info.isTitle = nil info.textHeight = 12 info.value = i info.notCheckable = 1 info.text = L_LOOT_SELF info.func = MasterLoot_GiveLoot info.icon = "Interface\\GossipFrame\\VendorGossipIcon" UIDropDownMenu_AddButton(info) end end end UIDropDownMenu_Initialize(GroupLootDropDown, init, "MENU") ================================================ FILE: ShestakUI/Modules/Maps/BattlefieldMap.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.minimap.bg_map_stylization ~= true or IsAddOnLoaded("Capping") or IsAddOnLoaded("Aurora") or IsAddOnLoaded("EnhanceBattlefieldMinimap") then return end ---------------------------------------------------------------------------------------- -- BattlefieldMap style ---------------------------------------------------------------------------------------- local tinymap = CreateFrame("Frame", "UIZoneMap", UIParent) tinymap:Hide() tinymap:RegisterEvent("ADDON_LOADED") tinymap:SetScript("OnEvent", function(_, _, addon) if addon ~= "Blizzard_BattlefieldMap" then return end BattlefieldMapFrame:SetSize(223, 150) BattlefieldMapFrame:CreateBackdrop("ClassColor") BattlefieldMapFrame.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha) BattlefieldMapFrame.backdrop:SetPoint("TOPLEFT", -2, 4) BattlefieldMapFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 1) BattlefieldMapFrame.BorderFrame:DisableDrawLayer("BORDER") BattlefieldMapFrame.BorderFrame:DisableDrawLayer("ARTWORK") BattlefieldMapFrame.BorderFrame.CloseButton:Hide() BattlefieldMapFrame.BorderFrame.CloseButtonBorder:Hide() BattlefieldMapTab:SetParent(tinymap) BattlefieldMapFrame.ScrollContainer:HookScript("OnMouseUp", function(_, btn) if btn == "LeftButton" then BattlefieldMapTab:StopMovingOrSizing() if OpacityFrame:IsShown() then OpacityFrame:Hide() end elseif btn == "RightButton" then local function InitializeOptionsDropDown(BattlefieldMapFrame) BattlefieldMapFrame:GetParent():InitializeOptionsDropDown() end UIDropDownMenu_Initialize(BattlefieldMapTab.OptionsDropDown, InitializeOptionsDropDown, "MENU") ToggleDropDownMenu(nil, nil, BattlefieldMapTab.OptionsDropDown, "cursor", 0, -4) if OpacityFrame:IsShown() then OpacityFrame:Hide() end end end) BattlefieldMapFrame.ScrollContainer:HookScript("OnMouseDown", function(_, btn) if btn == "LeftButton" then if BattlefieldMapOptions and BattlefieldMapOptions.locked then return else BattlefieldMapTab:StartMoving() end end end) end) ================================================ FILE: ShestakUI/Modules/Maps/ButtonCollect.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.minimap.enable ~= true or C.skins.minimap_buttons ~= true then return end ---------------------------------------------------------------------------------------- -- Collect minimap buttons in one line ---------------------------------------------------------------------------------------- local BlackList = { ["QueueStatusButton"] = true, ["MiniMapTracking"] = true, ["MiniMapMailFrame"] = true, ["HelpOpenTicketButton"] = true, ["GameTimeFrame"] = true, } local buttons = {} local collectFrame = CreateFrame("Frame", "ButtonCollectFrame", UIParent) local line = math.ceil(C.minimap.size / 20.8) local texList = { ["136430"] = true, -- Interface\\Minimap\\MiniMap-TrackingBorder ["136467"] = true, -- Interface\\Minimap\\UI-Minimap-Background } local function SkinButton(f) f:SetPushedTexture(0) f:SetHighlightTexture(0) f:SetDisabledTexture(0) f:SetSize(20.8, 20.8) for i = 1, f:GetNumRegions() do local region = select(i, f:GetRegions()) if region:IsVisible() and region:GetObjectType() == "Texture" then local tex = tostring(region:GetTexture()) if tex and (texList[tex] or tex:find("Border") or tex:find("Background") or tex:find("AlphaMask")) then region:SetTexture(nil) else region:ClearAllPoints() region:SetPoint("TOPLEFT", f, "TOPLEFT", 2, -2) region:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -2, 2) region:SetTexCoord(0.1, 0.9, 0.1, 0.9) region:SetDrawLayer("ARTWORK") if f:GetName() == "PS_MinimapButton" then region.SetPoint = T.dummy end end end end f:SetTemplate("ClassColor") end local function PositionAndStyle() collectFrame:SetSize(20.8, 20.8) collectFrame:SetPoint(unpack(C.position.minimap_buttons)) for i = 1, #buttons do local f = buttons[i] f:ClearAllPoints() if i == 1 then f:SetPoint("TOP", collectFrame, "TOP", 0, 0) elseif i == line then f:SetPoint("TOPRIGHT", buttons[1], "TOPLEFT", -1, 0) else f:SetPoint("TOP", buttons[i-1], "BOTTOM", 0, -1) end f.ClearAllPoints = T.dummy f.SetPoint = T.dummy if C.skins.minimap_buttons_mouseover then f:SetAlpha(0) f:HookScript("OnEnter", function() f:FadeIn() end) f:HookScript("OnLeave", function() f:FadeOut() end) end SkinButton(f) end end local collect = CreateFrame("Frame") collect:RegisterEvent("PLAYER_ENTERING_WORLD") collect:SetScript("OnEvent", function() for _, child in ipairs({Minimap:GetChildren()}) do if not BlackList[child:GetName()] then if child:GetObjectType() == "Button" and child:GetNumRegions() >= 3 and child:IsShown() then child:SetParent(collectFrame) tinsert(buttons, child) end end end if #buttons == 0 then collectFrame:Hide() end PositionAndStyle() if WIM3MinimapButton and WIM3MinimapButton:GetParent() == UIParent then SkinButton(WIM3MinimapButton) WIM3MinimapButton.backGround:Hide() end collect:UnregisterEvent("PLAYER_ENTERING_WORLD") end) ================================================ FILE: ShestakUI/Modules/Maps/FogOfWar.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.minimap.fog_of_war ~= true then return end ---------------------------------------------------------------------------------------- -- Fog of war on World Map(Leatrix_Maps by Leatrix) ---------------------------------------------------------------------------------------- local zones = { [2] = {["162:157:399:440"] = "440583", ["192:184:457:406"] = "271426", ["208:157:438:0"] = "271427", ["210:200:462:298"] = "271440", ["220:218:295:48"] = "271439", ["224:227:431:157"] = "271421", ["236:196:415:60"] = "271428", ["244:222:282:174"] = "440584", ["248:158:302:264"] = "271422", ["254:258:304:312"] = "271443, 440585", ["259:165:309:0"] = "271435, 271442, 271435, 271442", ["330:255:429:413"] = "271437, 440582",}, [8] = {["172:205:248:321"] = "272176", ["174:185:449:340"] = "272180", ["186:185:514:43"] = "272169", ["186:216:448:101"] = "272177", ["187:165:435:224"] = "272185", ["190:172:331:0"] = "272172", ["201:167:333:202"] = "272178", ["208:300:530:138"] = "272186, 457475", ["218:192:226:220"] = "272181", ["222:202:400:0"] = "272179", ["237:184:201:0"] = "457473", ["260:243:527:291"] = "272170, 457474", ["302:223:319:273"] = "272173, 457470", ["373:259:208:62"] = "272187, 272171, 457476, 457477", ["446:264:286:401"] = "272168, 272165, 457471, 457472",}, [11] = {["207:332:555:129"] = "270569, 438215", ["219:175:547:379"] = "270585", ["233:193:362:275"] = "270559", ["239:231:481:254"] = "270574", ["241:195:290:104"] = "270554", ["243:217:448:127"] = "270584", ["257:249:403:6"] = "270564, 438223", ["261:216:258:6"] = "438216, 438217", ["278:209:511:7"] = "270553, 438214", ["283:270:116:57"] = "270572, 438218, 438219, 438220", ["315:212:556:456"] = "270573, 438222", ["336:289:344:379"] = "270565, 438224, 438225, 438226", ["377:325:152:318"] = "438227, 438228, 438229, 438230", ["446:256:100:208"] = "270560, 438221",}, [15] = {["183:238:506:126"] = "270360", ["196:270:293:145"] = "270352, 438180", ["210:227:404:144"] = "270350", ["212:305:0:144"] = "438173, 438174", ["215:188:332:273"] = "438169", ["220:287:85:24"] = "270347, 438168", ["227:268:132:105"] = "270351, 438179", ["228:227:201:312"] = "270346", ["237:252:261:416"] = "270348", ["249:278:171:123"] = "270349, 438167", ["252:258:327:367"] = "270342, 438166", ["260:220:476:359"] = "270353, 438184", ["270:271:581:118"] = "270336, 438176, 438177, 438178", ["273:268:77:400"] = "270361, 438170, 438171, 438172", ["284:306:21:269"] = "270358, 438181, 438182, 438183", ["306:248:430:249"] = "270343, 438175",}, [16] = {["209:196:411:116"] = "270532", ["214:285:144:99"] = "270525, 270521", ["236:260:504:19"] = "270530, 442231", ["252:353:0:66"] = "270529, 442225, 270529, 442225", ["266:210:336:0"] = "442238, 442239", ["274:448:407:220"] = "270540, 270527, 442226, 442227", ["285:223:230:68"] = "270543, 442224", ["328:313:175:178"] = "442232, 442233, 442234, 442235", ["339:347:0:281"] = "270520, 442228, 442229, 442230", ["342:353:230:315"] = "270522, 270550, 270528, 270536", ["469:613:533:55"] = "270534, 270551, 270546, 270535, 442236, 442237",}, [18] = {["168:170:375:102"] = "391431", ["195:199:436:0"] = "438233", ["199:191:333:474"] = "438238", ["218:183:459:97"] = "391430", ["233:266:386:374"] = "438236, 438237", ["235:188:327:182"] = "391434", ["238:195:225:110"] = "391425", ["240:270:578:91"] = "438234, 438235", ["268:354:533:268"] = "438243, 438244, 438245, 438246", ["272:206:258:0"] = "391435, 438231", ["295:205:530:6"] = "391432, 438232", ["308:226:144:175"] = "391429, 391428", ["348:357:132:311"] = "438247, 438248, 438249, 438250", ["370:298:368:179"] = "438239, 438240, 438241, 438242",}, [19] = {["161:234:692:99"] = "272996", ["175:210:686:232"] = "273000", ["179:169:389:255"] = "440917", ["190:214:477:129"] = "273020", ["199:182:480:252"] = "273015", ["210:292:573:122"] = "273009, 273002", ["212:177:418:317"] = "273016", ["225:281:347:325"] = "273003, 440921", ["242:179:594:324"] = "273006", ["250:279:752:150"] = "272999, 440935", ["262:262:740:47"] = "440926, 440927, 440928, 440929", ["285:260:324:90"] = "273019, 440914, 440915, 440916", ["286:225:201:192"] = "273017, 440930", ["293:338:709:330"] = "440931, 440932, 440933, 440934", ["390:267:423:359"] = "440922, 440923, 440924, 440925", ["431:407:9:207"] = "273001, 440918, 440919, 440920",}, [22] = {["152:189:433:327"] = "440742", ["162:172:461:77"] = "440744", ["174:199:323:68"] = "440735", ["176:152:471:156"] = "440741", ["179:165:337:337"] = "272613", ["186:238:369:0"] = "440734", ["217:198:483:212"] = "272598", ["218:200:341:157"] = "272620", ["227:172:236:0"] = "272610", ["251:167:312:249"] = "272616", ["255:180:349:429"] = "440740", ["281:345:147:0"] = "440736, 440737, 440738, 440739", ["283:243:509:250"] = "272614, 440725", ["318:263:505:405"] = "272599, 440726, 440727, 440728", ["352:302:581:15"] = "272600, 440729, 440730, 440731", ["361:175:445:0"] = "440732, 440733", ["409:162:318:506"] = "272609, 440743",}, [23] = {["169:195:472:332"] = "273102", ["185:230:551:151"] = "273121", ["194:208:601:390"] = "273107", ["241:212:229:228"] = "273113", ["241:252:495:213"] = "273094", ["290:133:286:211"] = "441018, 441019", ["311:436:533:0"] = "273122, 273103, 441023, 441024", ["316:316:48:235"] = "273120, 441020, 441021, 441022", ["325:192:300:232"] = "441015, 441016", ["359:182:231:123"] = "273114, 441017", ["368:220:261:448"] = "273108, 273101", ["432:271:235:0"] = "273095, 273111, 273100, 273090", ["464:325:96:343"] = "441011, 441012, 441013, 441014", ["492:314:510:354"] = "273119, 273092, 273112, 273093",}, [24] = {["177:266:595:263"] = "271543, 271530", ["181:176:541:184"] = "271542", ["182:320:383:348"] = "442692, 442693", ["186:213:493:289"] = "271544", ["196:220:687:271"] = "271533", ["202:191:258:351"] = "271548", ["202:202:133:335"] = "271551", ["214:254:651:414"] = "271553", ["228:273:774:102"] = "442674, 442675", ["238:231:382:151"] = "271523", ["243:162:391:271"] = "442677", ["248:206:211:462"] = "271514", ["250:192:401:69"] = "271521", ["258:320:0:10"] = "271522, 442685, 442686, 442687", ["262:526:0:100"] = "271538, 271513, 442695, 442696, 442697, 442698", ["264:373:738:295"] = "442680, 442681, 442682, 442683", ["265:232:570:61"] = "271520, 442678", ["266:241:462:427"] = "271532, 442676", ["274:216:183:211"] = "271536, 442688", ["277:175:351:0"] = "271535, 442679", ["280:211:56:457"] = "271512, 442694", ["286:176:528:0"] = "271554, 442699", ["297:299:650:55"] = "271537, 442689, 442690, 442691", ["310:178:118:0"] = "271529, 442684", ["328:253:144:40"] = "271518, 271527",}, [26] = {["105:148:390:255"] = "450678", ["116:129:344:254"] = "450649", ["134:124:463:101"] = "450634", ["135:160:426:224"] = "450633", ["144:139:200:505"] = "450668", ["147:160:425:279"] = "450639", ["148:120:413:55"] = "450670", ["148:146:484:166"] = "450671", ["155:147:451:140"] = "450648", ["158:169:321:42"] = "450666", ["165:203:494:226"] = "450677", ["171:136:359:191"] = "450650", ["180:182:287:399"] = "450628", ["189:181:347:85"] = "450669", ["204:244:502:373"] = "450667", ["212:160:441:0"] = "450679", ["229:219:383:352"] = "450674", ["250:167:194:216"] = "450665", ["258:113:341:0"] = "450637, 450638", ["269:258:542:410"] = "450640, 450641, 450642, 450643", ["275:193:505:44"] = "450675, 450676", ["302:175:191:302"] = "450651, 450652, 450651, 450652", ["312:254:59:310"] = "450672, 450673", ["316:238:102:137"] = "450635, 450636", ["437:451:565:217"] = "450644, 450645, 450646, 450647", ["447:263:555:68"] = "450629, 450630, 450631, 450632",}, [27] = {["176:235:490:195"] = "271933", ["191:278:133:105"] = "271927, 440600", ["199:199:390:252"] = "271929", ["199:212:286:269"] = "271934", ["208:204:367:159"] = "271910", ["225:196:357:343"] = "271922", ["226:225:152:284"] = "440603", ["238:267:0:236"] = "271917, 440597", ["240:196:220:379"] = "271937", ["241:211:220:181"] = "271928", ["244:401:677:267"] = "271938, 271916", ["281:261:565:208"] = "271915, 271921, 440601, 440602", ["287:289:487:334"] = "271912, 271920, 440598, 440599", ["303:311:475:5"] = "271908, 271935, 271936, 271909",}, [28] = {["171:234:397:132"] = "445524, 445524", ["174:249:579:306"] = "271401", ["184:188:449:220"] = "271417", ["198:251:663:288"] = "271408", ["211:160:374:287"] = "271400", ["218:234:760:268"] = "271409", ["225:276:360:340"] = "271406, 438340", ["226:335:469:256"] = "438345, 438346", ["236:358:263:0"] = "271392, 442671", ["237:366:765:43"] = "442672, 442673", ["249:183:595:225"] = "271389", ["308:335:630:0"] = "438354, 438355, 438356, 438357", ["376:347:398:0"] = "271410, 271396, 438352, 438353", ["398:302:100:366"] = "438341, 438342, 438343, 438344", ["409:318:0:27"] = "438348, 438349, 438350, 438351", ["437:249:50:227"] = "271398, 438347",}, [33] = {["304:244:243:424"] = "450682, 450683", ["365:393:0:75"] = "254509, 254510, 254511, 254512", ["375:307:0:361"] = "254503, 254504, 450680, 450681", ["392:355:588:0"] = "254505, 254506, 254507, 254508", ["429:301:255:38"] = "450692, 450693, 450694, 450695", ["441:266:531:241"] = "450684, 450685, 450686, 450687", ["481:360:232:171"] = "254529, 254530, 254531, 254532", ["571:308:413:360"] = "254527, 254528, 450688, 450689, 450690, 450691",}, [37] = {["182:360:0:0"] = "270938, 455906", ["274:263:568:151"] = "270927, 455911, 455912, 455913", ["274:413:253:255"] = "270933, 270943, 270921, 270928, 270933, 270943, 270921, 270928", ["281:388:79:0"] = "270919, 270911, 455907, 455908", ["298:410:419:258"] = "270920, 270914, 270908, 270929", ["320:385:235:0"] = "270912, 270909, 455909, 455910", ["324:354:421:0"] = "270922, 270934, 270923, 270937", ["350:341:646:7"] = "270944, 270910, 270935, 270945", ["362:431:0:237"] = "270941, 270925, 270926, 270917", ["383:413:615:255"] = "270906, 270918, 270936, 270942",}, [41] = {["220:207:417:327"] = "271560", ["230:206:396:430"] = "271582", ["269:248:240:420"] = "271576, 438414", ["269:313:116:355"] = "438426, 438427, 438428, 438429", ["270:241:529:287"] = "271573, 438425", ["276:231:247:294"] = "271567, 438415", ["285:194:708:442"] = "271557, 271583", ["287:216:532:424"] = "271559, 438412", ["294:243:703:292"] = "271578, 438413", ["295:296:355:138"] = "271572, 438416, 438417, 438418", ["340:272:552:186"] = "271584, 271565, 438419, 438420", ["512:422:0:0"] = "438421, 438422, 438423, 438424",}, [46] = {["350:449:433:208"] = "271092, 271085, 271086, 271089", ["513:358:92:310"] = "271095, 271079, 440578, 440579, 440580, 440581", ["617:522:83:0"] = "271075, 271076, 271080, 271081, 440573, 440574, 440575, 440576, 440577",}, [52] = {["189:307:0:152"] = "271453, 271454", ["205:157:96:292"] = "438381", ["219:182:661:122"] = "271466", ["233:248:401:396"] = "271449", ["268:282:228:355"] = "271448, 271456, 438391, 438392", ["279:399:497:112"] = "271470, 271477, 438379, 438380", ["291:244:627:344"] = "438385, 438386", ["291:263:539:368"] = "271455, 438382, 438383, 438384", ["299:296:32:348"] = "271444, 271483, 438377, 438378", ["320:388:314:101"] = "438387, 438388, 438389, 438390", ["323:309:91:132"] = "271473, 271463, 271467, 271464", ["329:314:640:128"] = "271471, 271461, 271450, 271451", ["931:235:71:26"] = "271481, 271460, 271474, 271468",}, [53] = {["225:252:221:0"] = "252884", ["273:230:245:324"] = "252862, 252863", ["273:294:177:345"] = "252886, 252887, 440640, 440641", ["294:249:549:52"] = "252880, 252881", ["310:345:0:311"] = "252899, 440647, 440648, 440649", ["319:289:16:0"] = "252882, 252883, 440638, 440639", ["330:474:340:81"] = "252894, 252895, 252896, 252897", ["333:200:339:0"] = "440642, 440643", ["349:292:570:209"] = "252890, 252891, 252892, 252893", ["397:291:481:296"] = "252866, 252867, 440636, 440637", ["455:295:0:146"] = "252898, 440644, 440645, 440646",}, [54] = {["189:193:445:286"] = "440660", ["228:247:350:139"] = "272334", ["228:420:480:0"] = "440672, 440673", ["306:324:688:283"] = "440668, 440669, 440670, 440671", ["316:182:525:302"] = "272347, 272371", ["323:406:0:256"] = "272364, 272348, 272358, 272359", ["357:246:214:0"] = "272357, 272342", ["392:352:148:316"] = "272344, 272354, 272350, 272339", ["410:256:0:110"] = "272351, 272340", ["413:292:37:0"] = "272362, 272356, 440664, 440665", ["427:291:451:377"] = "272369, 272363, 440666, 440667", ["428:463:574:0"] = "272372, 440661, 440662, 440663", ["464:250:81:214"] = "272335, 272343",}, [55] = {["139:150:354:184"] = "440798", ["157:173:387:246"] = "440805", ["159:137:267:168"] = "440793", ["167:179:298:228"] = "440797", ["190:176:566:164"] = "440795", ["227:190:306:63"] = "440807", ["228:265:158:0"] = "440810, 440811", ["230:170:398:375"] = "440796", ["234:206:543:253"] = "440806", ["236:224:140:208"] = "440812", ["239:205:397:243"] = "440794", ["240:228:413:95"] = "440800", ["244:238:499:0"] = "440799", ["302:166:306:0"] = "440808, 440809", ["324:263:9:22"] = "440819, 440820, 440821, 440822", ["350:259:488:364"] = "440801, 440802, 440803, 440804", ["376:560:626:0"] = "440813, 440814, 440815, 440816, 440817, 440818",}, [56] = {["229:418:703:80"] = "272739, 272746", ["238:343:194:236"] = "272747, 272763", ["257:229:575:238"] = "272772, 272760", ["262:193:600:0"] = "442700, 442701", ["266:284:161:79"] = "272736, 442717, 442718, 442719", ["268:285:0:80"] = "272759, 272750, 442713, 442714", ["268:316:7:242"] = "442702, 442703, 442704, 442705", ["292:360:331:24"] = "272768, 272770, 442720, 442721", ["330:342:478:0"] = "442706, 442707, 442708, 442709", ["347:303:540:360"] = "272740, 272773, 442715, 442716", ["357:308:297:258"] = "272742, 272751, 272752, 272764", ["402:668:600:0"] = "272756, 272737, 272769, 442710, 442711, 442712",}, [57] = {["184:217:294:168"] = "441034", ["193:273:531:200"] = "273125, 441031", ["196:229:311:0"] = "441026", ["197:213:394:0"] = "273145", ["201:195:203:376"] = "273142", ["202:179:474:0"] = "273143", ["202:224:348:118"] = "273126", ["211:167:221:477"] = "273141", ["229:265:404:226"] = "273137, 441027", ["232:213:308:325"] = "273130", ["235:306:199:79"] = "273149, 441025", ["244:237:451:81"] = "273146", ["292:273:303:395"] = "273124, 441028, 441029, 441030", ["317:261:480:378"] = "273131, 273134, 441032, 441033", ["346:222:167:263"] = "273129, 273133",}, [61] = {["185:224:372:76"] = "273173", ["236:256:359:201"] = "273159", ["250:269:460:102"] = "441042, 441043", ["250:282:218:0"] = "441048, 441049", ["256:245:599:123"] = "273181", ["257:185:356:7"] = "273164, 441041", ["258:207:371:335"] = "273174, 441054", ["276:243:121:63"] = "273178, 273167", ["298:215:346:419"] = "441039, 441040", ["298:447:185:195"] = "273155, 441055, 441056, 441057", ["300:316:532:352"] = "441050, 441051, 441052, 441053", ["301:232:37:240"] = "273163, 441035", ["321:248:31:102"] = "273171, 441036", ["325:363:0:297"] = "273156, 441044, 441045, 441046", ["329:228:506:34"] = "441037, 441038", ["369:235:506:232"] = "273177, 441047",}, [62] = {["140:210:345:243"] = "272807", ["144:226:432:109"] = "440837", ["165:249:382:83"] = "272822", ["175:235:374:221"] = "272826", ["178:186:466:237"] = "440833", ["187:196:544:217"] = "272815", ["194:244:276:90"] = "272830", ["198:181:347:355"] = "272814", ["241:217:481:104"] = "272811", ["289:202:422:310"] = "272810, 440834", ["298:337:149:181"] = "272806, 272812, 440831, 440832", ["317:220:329:448"] = "440835, 440836",}, [67] = {["200:263:517:28"] = "271043, 438260", ["203:194:280:182"] = "438259", ["244:201:207:467"] = "438258", ["245:147:565:0"] = "438262", ["250:241:596:16"] = "438261", ["277:281:391:54"] = "438254, 438255, 438256, 438257", ["303:185:277:483"] = "271044, 438263", ["314:193:280:378"] = "438264, 438265", ["326:145:294:330"] = "271045, 438251", ["328:250:305:118"] = "438266, 438267", ["330:192:300:239"] = "438252, 438253", ["453:340:0:0"] = "2175173, 2175174, 2175175, 2175176",}, [68] = {["166:211:836:148"] = "270387", ["184:232:112:148"] = "270380", ["203:310:377:121"] = "437337, 437338", ["221:257:595:253"] = "270401, 437321", ["231:223:771:265"] = "270390", ["231:256:481:221"] = "270402", ["235:236:696:154"] = "270388", ["236:271:210:331"] = "270398, 437328", ["244:251:143:0"] = "437322", ["246:361:188:0"] = "437319, 437320", ["251:271:255:164"] = "270386, 437312", ["262:390:0:0"] = "270376, 437333, 437334, 437335", ["277:333:714:317"] = "270405, 437316, 437317, 437318", ["287:276:529:385"] = "270375, 437313, 437314, 437315", ["306:283:40:275"] = "437329, 437330, 437331, 437332", ["314:241:255:78"] = "270389, 437336", ["325:239:473:97"] = "270400, 437327", ["347:308:338:335"] = "437323, 437324, 437325, 437326",}, [69] = {["234:203:527:465"] = "442249", ["246:256:756:412"] = "442250", ["246:380:0:134"] = "272968, 442244", ["272:232:136:0"] = "272963, 442255", ["280:325:0:0"] = "442268, 442269, 442270, 442271", ["317:252:169:116"] = "272962, 442240", ["358:418:125:241"] = "442264, 442265, 442266, 442267", ["361:314:298:0"] = "442245, 442246, 442247, 442248", ["374:339:347:329"] = "442260, 442261, 442262, 442263", ["411:411:591:257"] = "442256, 442257, 442258, 442259", ["431:410:571:49"] = "442251, 442252, 442253, 442254", ["436:271:276:186"] = "272954, 442241, 442242, 442243",}, [70] = {["164:258:479:401"] = "440778, 440779", ["176:189:516:289"] = "440780", ["183:196:588:341"] = "440771", ["194:156:532:512"] = "272628", ["210:189:252:121"] = "440773", ["211:131:618:537"] = "272650", ["221:235:367:411"] = "440772", ["222:222:353:285"] = "272646", ["241:192:366:95"] = "440768", ["244:247:417:143"] = "272624", ["265:206:654:369"] = "440776, 440777", ["267:352:468:263"] = "272648, 272634, 272635, 272623", ["277:274:199:368"] = "272633, 272647, 440774, 440775", ["290:297:220:189"] = "440764, 440765, 440766, 440767", ["305:244:265:0"] = "272632, 272641", ["322:220:602:448"] = "440769, 440770", ["374:287:533:179"] = "272630, 272649, 272642, 272636",}, [71] = {["161:141:210:0"] = "438321", ["212:186:275:376"] = "438337", ["220:205:440:49"] = "271111", ["222:299:142:369"] = "271125, 438327", ["231:257:573:0"] = "271114, 438320", ["250:215:360:273"] = "271127", ["274:145:399:0"] = "271126, 438336", ["274:196:207:472"] = "271122, 438317", ["289:244:613:170"] = "438318, 438319", ["292:266:637:402"] = "271105, 438324, 438325, 438326", ["309:349:589:319"] = "438328, 438329, 438330, 438331", ["312:285:415:156"] = "438313, 438314, 438315, 438316", ["317:293:655:0"] = "271104, 271124, 438322, 438323", ["321:275:170:196"] = "271106, 271129, 438338, 438339", ["326:311:381:357"] = "271108, 271112, 271113, 271109", ["338:342:208:24"] = "438332, 438333, 438334, 438335",}, [74] = {["159:218:607:170"] = "440592", ["172:198:568:287"] = "440586", ["174:220:671:181"] = "271675", ["191:179:457:281"] = "440591", ["192:157:663:116"] = "271696", ["194:304:375:343"] = "271700, 271682", ["206:237:467:354"] = "271699", ["207:209:756:191"] = "271680", ["208:204:186:229"] = "440593", ["217:192:362:237"] = "440590", ["232:206:652:298"] = "440596", ["265:284:485:101"] = "271687, 440587, 440588, 440589", ["350:334:271:0"] = "271705, 271686, 440594, 440595",}, [75] = {["206:200:656:21"] = "271494", ["270:353:428:0"] = "271507, 271504, 438410, 438411", ["279:301:358:169"] = "438397, 438398, 438399, 438400", ["305:247:542:223"] = "271500, 438407", ["317:230:137:188"] = "438405, 438406", ["344:183:199:0"] = "438393, 438394", ["384:249:133:59"] = "438395, 438396", ["433:351:109:313"] = "438401, 438402, 438403, 438404", ["436:299:359:369"] = "271503, 271509, 438408, 438409",}, [76] = {["173:163:380:341"] = "272798", ["178:243:615:201"] = "440825", ["179:190:258:211"] = "272792", ["189:180:412:92"] = "272774", ["195:163:413:211"] = "272800", ["213:173:507:238"] = "272789", ["214:149:293:99"] = "272776", ["221:293:185:280"] = "272781, 440827", ["224:216:431:452"] = "272801", ["225:187:448:364"] = "272805", ["231:177:305:257"] = "272782", ["232:211:301:349"] = "272784", ["254:341:479:9"] = "440823, 440824", ["255:194:297:148"] = "272799", ["269:190:255:431"] = "440828, 440829", ["274:186:437:289"] = "272795, 440826", ["315:190:184:0"] = "272788, 440830",}, [81] = {["184:213:353:396"] = "438209", ["206:329:316:168"] = "270412, 438210", ["207:232:407:403"] = "438208", ["210:232:245:377"] = "270409", ["218:237:228:229"] = "270414", ["219:193:575:121"] = "438207", ["243:262:343:3"] = "438197, 438198", ["250:230:70:222"] = "438199", ["256:224:113:141"] = "438185", ["260:267:204:53"] = "438193, 438194, 438195, 438196", ["295:267:476:401"] = "270410, 438204, 438205, 438206", ["306:337:684:22"] = "270434, 438211, 438212, 438213", ["321:247:477:0"] = "270432, 438192", ["352:274:22:344"] = "438200, 438201, 438202, 438203", ["587:381:395:127"] = "438186, 438187, 438188, 438189, 438190, 438191",}, [82] = {["173:163:410:505"] = "271658", ["187:176:476:484"] = "271657", ["209:226:531:57"] = "271653", ["229:210:288:458"] = "271663", ["261:273:406:55"] = "271673, 438433, 438434, 438435", ["263:199:303:9"] = "271652, 438436", ["268:214:278:359"] = "271664, 438438", ["274:212:394:382"] = "271659, 438431", ["307:161:471:0"] = "271660, 438432", ["319:176:234:317"] = "271669, 438437", ["343:250:243:107"] = "271665, 438439", ["345:192:220:231"] = "271666, 438430",}, [83] = {["186:185:328:179"] = "440938", ["197:222:706:201"] = "273051", ["204:170:462:330"] = "440937", ["224:191:557:0"] = "440936", ["263:412:573:256"] = "273072, 273039, 273037, 273063", ["309:277:145:226"] = "273043, 273075, 273069, 273061", ["316:293:162:357"] = "273046, 273053, 273071, 273047", ["321:288:356:192"] = "273042, 273065, 273050, 273036", ["332:332:157:0"] = "440943, 440944, 440945, 440946", ["337:321:565:39"] = "440939, 440940, 440941, 440942", ["381:274:335:384"] = "273059, 273066, 273073, 273054", ["432:294:305:0"] = "273052, 273062, 273057, 273058",}, [85] = {["271:296:209:91"] = "440652, 440653, 440654, 440655", ["275:346:542:210"] = "440656, 440657, 440658, 440659", ["346:244:370:135"] = "440650, 440651", ["431:319:219:273"] = "252844, 252845, 252846, 252847",}, [86] = {["292:260:427:143"] = "440714, 440715, 440716, 440717", ["309:243:550:181"] = "272580, 272544", ["315:285:614:0"] = "440721, 440722, 440723, 440724", ["329:246:126:0"] = "272581, 272562", ["405:267:345:4"] = "272565, 272566, 272577, 272546", ["434:231:100:151"] = "272573, 272545", ["489:358:380:310"] = "272567, 272547, 272555, 272548", ["542:367:0:206"] = "272559, 272543, 272574, 272575, 440718, 440719", ["580:213:0:455"] = "272564, 272553, 440720",}, [88] = {["194:229:482:195"] = "273191", ["221:209:588:181"] = "273200", ["249:217:581:314"] = "273206", ["254:150:556:439"] = "273199", ["257:238:399:340"] = "273185, 445588", ["271:258:372:268"] = "273192, 445585, 445586, 445587", ["317:183:424:474"] = "273198, 445584", ["332:268:304:0"] = "273184, 445581, 445582, 445583", ["333:255:500:17"] = "273203, 445592", ["362:252:92:302"] = "273187, 445593", ["367:340:229:33"] = "273207, 445589, 445590, 445591", ["376:289:93:118"] = "273202, 445578, 445579, 445580",}, [99] = {["128:193:554:475"] = "271603", ["128:197:584:471"] = "271598", ["128:248:511:420"] = "271592", ["128:253:183:415"] = "271625", ["128:256:292:319"] = "271633", ["128:256:580:399"] = "271630", ["256:128:231:404"] = "271627", ["256:128:243:469"] = "271635", ["256:128:255:507"] = "271596", ["256:128:524:359"] = "271591", ["256:128:539:305"] = "271628", ["256:172:378:496"] = "271614", ["256:174:464:494"] = "271615", ["256:256:215:298"] = "271601", ["256:256:307:136"] = "271608", ["256:256:324:384"] = "271599", ["256:256:361:298"] = "271637", ["256:256:386:386"] = "271612", ["256:256:460:373"] = "271588", ["256:256:474:314"] = "271610", ["256:256:605:253"] = "271604", ["256:256:669:228"] = "271586", ["256:353:648:315"] = "271587, 271590", ["512:512:195:5"] = "271619, 271602, 271589, 271638", ["512:512:440:87"] = "271632, 271600, 271617, 271618",}, [100] = {["256:256:184:238"] = "271744", ["256:256:210:126"] = "271716", ["256:256:40:287"] = "271752", ["256:256:585:0"] = "271761", ["256:262:364:406"] = "271711, 271717", ["256:449:340:219"] = "271740, 271730", ["256:512:365:2"] = "271762, 271751", ["256:512:448:150"] = "271741, 271723", ["256:512:60:117"] = "271754, 271733", ["404:436:598:232"] = "271742, 271728, 271758, 271706", ["427:256:575:0"] = "271735, 271736", ["429:256:573:136"] = "271715, 271745", ["512:256:326:0"] = "271729, 271707", ["512:256:460:0"] = "271731, 271719", ["512:293:95:375"] = "271721, 271725, 271714, 271737", ["512:431:466:237"] = "271712, 271757, 271713, 271734", ["512:512:44:0"] = "271726, 271756, 271727, 271710",}, [102] = {["128:256:462:349"] = "270497", ["256:128:356:0"] = "270493", ["256:222:23:446"] = "270498", ["256:247:220:421"] = "270482", ["256:256:174:363"] = "270492", ["256:256:176:303"] = "270463", ["256:256:281:305"] = "270509", ["256:256:291:3"] = "270510", ["256:256:352:378"] = "270481", ["256:256:365:49"] = "270488", ["256:256:383:249"] = "270513", ["256:256:449:183"] = "270508", ["256:256:488:24"] = "270474", ["256:256:507:350"] = "270512", ["256:256:515:279"] = "270476", ["475:512:527:104"] = "270511, 270483, 270489, 270484", ["512:512:74:85"] = "270475, 270515, 270495, 270505",}, [105] = {["256:256:182:412"] = "271830", ["256:256:206:110"] = "271835", ["256:256:34:142"] = "271836", ["256:256:467:154"] = "271852", ["256:256:469:298"] = "271848", ["256:256:705:368"] = "271843", ["256:260:308:408"] = "271838, 271861", ["256:378:25:290"] = "271850, 271864", ["256:458:338:210"] = "271855, 271833", ["256:512:326:45"] = "271840, 271849", ["256:512:579:128"] = "271866, 271821", ["256:512:737:156"] = "271854, 271825", ["422:238:580:430"] = "271826, 271822", ["512:255:261:413"] = "271856, 271820", ["512:256:477:6"] = "271867, 271842", ["512:342:183:326"] = "271862, 271844, 271823, 271831", ["512:512:38:152"] = "271851, 271841, 271865, 271853", ["512:512:478:25"] = "271863, 271857, 271845, 271839",}, [107] = {["256:128:124:0"] = "273241", ["256:207:720:461"] = "273266", ["256:256:175:232"] = "273267", ["256:256:31:339"] = "273262", ["256:256:342:249"] = "273233", ["256:256:512:303"] = "273271", ["256:256:596:412"] = "273280", ["256:256:81:152"] = "273222", ["256:256:88:50"] = "273235", ["256:343:141:325"] = "273224, 273225", ["256:512:219:51"] = "273268, 273226", ["256:512:329:25"] = "273223, 273272", ["256:512:462:90"] = "273253, 273242", ["256:512:569:112"] = "273249, 273238", ["286:512:716:128"] = "273243, 273273, 273250, 273251", ["308:256:694:321"] = "273276, 273246", ["512:256:20:202"] = "273248, 273279", ["512:336:314:332"] = "273221, 273269, 273236, 273277",}, [109] = {["256:256:143:256"] = "272431", ["256:256:520:93"] = "272421", ["256:256:554:308"] = "272461", ["256:512:290:129"] = "272451, 272471", ["396:512:606:126"] = "272429, 272470, 272446, 272450", ["492:223:510:445"] = "272442, 272443", ["512:358:343:310"] = "272454, 272426, 272439, 272455", ["512:410:469:258"] = "272448, 272449, 272469, 272452", ["512:439:168:229"] = "272430, 272460, 272434, 272435", ["512:512:104:155"] = "272436, 272440, 272441, 272427", ["512:512:116:35"] = "272428, 272424, 272433, 272445", ["512:512:348:8"] = "272467, 272465, 272422, 272453", ["512:512:394:90"] = "272459, 272438, 272463, 272447",}, [110] = {["256:128:563:151"] = "270643", ["256:240:271:428"] = "270622", ["256:254:446:414"] = "270642", ["256:256:254:176"] = "270663", ["256:256:286:28"] = "270625", ["256:256:412:95"] = "270631", ["256:256:422:0"] = "270665", ["256:256:439:210"] = "270649", ["256:256:527:81"] = "270611", ["256:256:585:0"] = "270651", ["256:256:623:147"] = "270666", ["256:256:629:406"] = "270667", ["256:256:658:297"] = "270655", ["256:256:673:71"] = "270626", ["256:256:733:109"] = "270609", ["256:297:342:371"] = "270669, 270657", ["256:318:289:350"] = "270638, 270630", ["256:336:533:332"] = "270612, 270658", ["256:396:405:272"] = "270664, 270659", ["256:410:554:258"] = "270629, 270606", ["256:419:512:249"] = "270644, 270610", ["256:462:166:206"] = "270652, 270653", ["256:507:314:161"] = "270619, 270620", ["256:512:479:98"] = "270616, 270617", ["416:256:586:147"] = "270628, 270605", ["512:252:144:416"] = "270662, 270632", ["512:256:214:55"] = "270621, 270633",}, [111] = {["128:128:180:216"] = "270671", ["239:256:763:256"] = "270710", ["256:185:309:483"] = "270718", ["256:198:503:470"] = "270687", ["256:256:205:39"] = "270701", ["256:256:221:136"] = "270676", ["256:256:232:242"] = "270703", ["256:256:250:404"] = "270739", ["256:256:293:285"] = "270728", ["256:256:297:136"] = "270733", ["256:256:302:27"] = "270727", ["256:256:367:209"] = "270679", ["256:256:414:406"] = "270700", ["256:256:437:258"] = "270698", ["256:256:451:29"] = "270734", ["256:256:481:117"] = "270720", ["256:256:546:410"] = "270699", ["256:256:555:87"] = "270741", ["256:256:556:216"] = "270740", ["256:256:598:338"] = "270677", ["256:256:613:82"] = "270709", ["256:256:637:0"] = "270714", ["256:256:657:78"] = "270712", ["256:256:729:54"] = "270682", ["256:512:44:62"] = "270690, 270729", ["485:141:517:527"] = "270711, 270723", ["512:242:177:426"] = "270674, 270731", ["512:430:43:238"] = "270692, 270673, 270702, 270672",}, [112] = {["256:241:558:427"] = "272204", ["256:256:157:32"] = "272235", ["256:256:162:154"] = "272198", ["256:256:219:199"] = "272231", ["256:256:277:54"] = "272242", ["256:256:335:193"] = "272213", ["256:256:351:52"] = "272237", ["256:256:387:390"] = "272220", ["256:256:391:258"] = "272230", ["256:256:431:143"] = "272188", ["256:256:504:53"] = "272208", ["256:256:532:363"] = "272236", ["256:256:533:267"] = "272206", ["256:256:598:79"] = "272232", ["256:256:666:233"] = "272244", ["256:334:660:334"] = "272196, 272197", ["256:512:10:107"] = "272199, 272200", ["512:334:168:334"] = "272205, 272229, 272190, 272238", ["512:420:36:248"] = "272224, 272233, 272191, 272212",}, [113] = {["128:256:316:268"] = "272840", ["256:208:321:460"] = "272889", ["256:234:247:434"] = "272843", ["256:256:116:4"] = "272878", ["256:256:222:362"] = "272846", ["256:256:245:289"] = "272881", ["256:256:310:345"] = "272887", ["256:256:314:0"] = "272837", ["256:256:377:272"] = "272836", ["256:256:397:165"] = "272839", ["256:256:417:327"] = "272873", ["256:256:478:19"] = "272880", ["256:256:480:277"] = "272866", ["256:256:505:154"] = "272886", ["256:256:521:275"] = "272835", ["256:367:103:301"] = "272844, 272847", ["256:512:455:34"] = "272879, 272834", ["385:512:617:149"] = "272860, 272855, 272850, 272856", ["512:256:143:171"] = "272851, 272867", ["512:320:449:348"] = "272876, 272888, 272857, 272877", ["512:512:104:4"] = "272861, 272831, 272883, 272838",}, [114] = {["256:128:241:388"] = "272255", ["256:145:490:523"] = "272274", ["256:179:357:489"] = "272288", ["256:213:239:455"] = "272292", ["256:217:454:451"] = "272253", ["256:256:132:294"] = "272262", ["256:256:171:155"] = "272247", ["256:256:229:38"] = "272263", ["256:256:237:22"] = "272273", ["256:256:253:301"] = "272283", ["256:256:298:134"] = "272285", ["256:256:328:397"] = "272280", ["256:256:356:261"] = "272249", ["256:256:396:10"] = "272269", ["256:256:411:20"] = "272248", ["256:256:465:336"] = "272260", ["256:256:481:208"] = "272264", ["256:256:513:138"] = "272282", ["256:256:644:173"] = "272287", ["256:387:147:281"] = "272279, 272265", ["409:384:593:284"] = "272267, 272254, 272268, 272284", ["512:256:354:49"] = "272296, 272294",}, [119] = {["186:276:272:237"] = "270870, 270743", ["203:209:662:11"] = "270848", ["244:214:325:140"] = "270785", ["244:319:397:66"] = "270900, 270819", ["259:302:457:264"] = "270903, 270781, 270794, 270855", ["260:278:329:237"] = "270851, 270871, 270795, 270769", ["267:378:153:238"] = "270822, 270894, 270835, 270784", ["289:279:707:181"] = "270765, 270824, 270887, 270801", ["290:292:712:15"] = "270826, 270865, 270759, 270763", ["375:342:480:0"] = "270869, 270890, 270764, 270762", ["382:258:293:383"] = "270761, 270879, 270880, 270787", ["385:316:509:214"] = "270898, 270840, 270899, 270812", ["396:203:314:0"] = "270806, 270810", ["460:381:50:0"] = "270821, 270758, 270797, 270775",}, [120] = {["188:211:374:208"] = "271192", ["196:218:543:362"] = "271358", ["213:219:403:0"] = "271232", ["214:261:614:358"] = "271313, 271133", ["226:212:661:264"] = "271378", ["229:259:487:0"] = "271146, 271257", ["229:299:42:187"] = "271267, 271201", ["235:337:134:165"] = "271254, 271233", ["235:354:569:7"] = "271149, 271222", ["236:218:258:203"] = "271170", ["258:225:433:118"] = "271239, 271157", ["299:278:703:7"] = "271351, 271270, 271175, 271330", ["301:286:698:332"] = "271280, 271346, 271164, 271387", ["304:203:256:104"] = "271352, 271244", ["306:242:210:0"] = "271187, 271231", ["311:272:691:160"] = "271333, 271199, 271364, 271162", ["317:353:453:219"] = "271205, 271248, 271252, 271236", ["356:300:217:313"] = "271322, 271298, 271290, 271337",}, [121] = {["249:235:232:129"] = "271764", ["274:207:18:461"] = "271794, 271778", ["278:290:217:244"] = "271801, 271773, 271779, 271806", ["283:247:176:421"] = "271789, 271812", ["294:227:358:187"] = "271785, 271817", ["324:265:548:137"] = "271790, 271765, 271766, 271767", ["328:260:331:32"] = "271809, 271771, 271772, 271776", ["329:246:509:0"] = "271769, 271770", ["332:294:17:307"] = "271768, 271783, 271795, 271810", ["351:284:607:41"] = "271791, 271807, 271774, 271796", ["356:224:7:207"] = "271781, 271784", ["382:285:0:46"] = "271792, 271775, 271813, 271797", ["455:400:547:257"] = "271798, 271780, 271814, 271799", ["475:362:312:294"] = "271803, 271788, 271816, 271805",}, [122] = {["174:173:576:170"] = "271946", ["177:191:342:351"] = "271992", ["178:208:595:240"] = "271945", ["181:178:490:161"] = "271993", ["187:263:397:208"] = "271980, 271994", ["193:201:668:223"] = "271950", ["213:256:283:203"] = "271976", ["222:168:222:100"] = "271959", ["223:209:354:0"] = "271957", ["223:338:664:25"] = "271956, 271974", ["232:216:585:336"] = "271941", ["238:232:343:108"] = "271984", ["242:189:225:0"] = "271954", ["244:305:621:327"] = "271969, 271989", ["248:382:477:216"] = "271985, 271968", ["251:192:490:0"] = "271970", ["263:265:99:37"] = "271940, 271975, 271953, 271991", ["266:210:420:57"] = "271952, 271967", ["284:308:415:360"] = "271997, 271998, 271963, 271964", ["298:306:572:0"] = "271977, 271978, 271979, 271958", ["333:265:99:278"] = "271962, 271987, 271983, 271988", ["347:220:90:180"] = "271986, 271960", ["350:258:168:410"] = "271965, 271966, 271972, 271973",}, [123] = {["204:268:0:167"] = "254677, 254678", ["219:283:218:291"] = "254688, 254689", ["223:207:444:276"] = "254695", ["223:399:321:15"] = "254690, 254691", ["227:210:327:305"] = "254687", ["238:240:217:50"] = "254692", ["245:239:690:267"] = "254679", ["248:243:538:181"] = "254684", ["269:217:715:390"] = "254693, 254694", ["283:231:558:329"] = "254685, 254686", ["300:343:626:31"] = "254680, 254681, 254682, 254683", ["308:202:392:466"] = "254659, 254660", ["308:212:342:392"] = "254657, 254658", ["314:224:616:30"] = "294026, 294027", ["373:375:355:37"] = "254653, 254654, 254655, 254656", ["393:474:22:122"] = "254673, 254674, 254675, 254676",}, [124] = {["207:235:427:244"] = "272524", ["233:286:705:236"] = "272529, 272506", ["239:313:265:355"] = "272530, 272516", ["249:248:172:135"] = "272507", ["268:288:138:58"] = "272517, 272534, 272496, 272502", ["293:229:396:51"] = "272500, 272501", ["294:327:308:34"] = "272523, 272487, 272539, 272532", ["312:369:501:134"] = "272494, 272495, 272504, 272533", ["322:265:596:92"] = "272521, 272515, 272522, 272499", ["329:293:76:375"] = "272509, 272491, 272520, 272484", ["455:316:82:186"] = "272535, 272518, 272490, 272519", ["468:329:359:339"] = "272498, 272531, 272510, 272541",}, [125] = {["169:164:239:301"] = "272922", ["180:239:214:144"] = "272933", ["182:270:570:113"] = "272927, 272910", ["184:191:395:470"] = "272909", ["205:232:162:143"] = "272920", ["210:179:316:296"] = "272945", ["221:200:108:206"] = "272906", ["228:158:98:318"] = "272924", ["244:220:134:429"] = "272919", ["251:200:242:468"] = "272921", ["305:298:339:370"] = "272904, 272925, 272926, 272952", ["306:484:627:179"] = "272934, 272923, 272908, 272930", ["309:383:481:285"] = "272939, 272953, 272905, 272935", ["322:195:109:375"] = "272948, 272950", ["363:341:292:122"] = "272912, 272913, 272914, 272946", ["369:265:218:0"] = "272943, 272944, 272931, 272917",}, [126] = {["218:291:174:191"] = "273324, 273292", ["237:248:288:168"] = "273329", ["247:304:431:127"] = "273322, 273320", ["249:258:479:241"] = "273304, 273305", ["261:288:607:251"] = "273309, 273286, 273310, 273328", ["265:257:533:345"] = "273296, 273300, 273285, 273287", ["266:254:289:287"] = "273330, 273291", ["272:268:0:247"] = "273318, 273298, 273336, 273303", ["286:265:326:358"] = "273311, 273297, 273331, 273317", ["302:231:380:437"] = "273323, 273289", ["307:256:7:412"] = "273326, 273333", ["311:317:575:88"] = "273325, 273307, 273308, 273319", ["321:305:181:363"] = "273312, 273332, 273282, 273302", ["336:297:629:0"] = "273295, 273301, 273321, 273288",}, [127] = {["512:416:252:252"] = "272721, 272732, 272715, 272722", ["512:512:251:4"] = "272716, 272728, 272723, 272733",}, [132] = {["252:260:0:91"] = "270966, 271005", ["264:303:0:176"] = "270987, 270962, 270973, 270997", ["288:222:0:0"] = "253268, 271000", ["416:424:0:244"] = "270970, 270961, 270971, 270996", ["446:369:536:40"] = "253267, 270960, 270995, 270989", ["502:477:500:105"] = "253269, 270985, 253270, 270986", ["544:668:129:0"] = "253264, 271003, 270968, 270965, 253265, 253266, 271002, 271004, 270984", ["558:285:444:383"] = "253271, 253272, 270974, 270975, 271001, 270980",}, [179] = {["142:133:377:359"] = "440843", ["156:142:433:11"] = "440842", ["159:230:264:144"] = "440863", ["168:205:416:368"] = "440853", ["172:175:189:408"] = "440859", ["173:180:351:21"] = "440840", ["177:172:129:348"] = "440838", ["190:186:416:131"] = "440860", ["210:258:492:161"] = "440851, 440852", ["212:193:279:68"] = "440862", ["212:216:440:452"] = "440854", ["221:211:508:345"] = "440850", ["222:190:244:458"] = "440841", ["231:216:213:325"] = "440861", ["248:209:462:43"] = "440839", ["305:288:323:185"] = "440855, 440856, 440857, 440858", ["350:517:581:21"] = "440844, 440845, 440846, 440847, 440848, 440849",}, [184] = {["177:219:293:449"] = "438477", ["194:236:167:352"] = "438476", ["210:166:261:427"] = "438440", ["222:268:393:386"] = "438482, 438483", ["244:241:141:202"] = "438475", ["267:314:387:0"] = "438484, 438485, 438486, 438487", ["280:224:504:394"] = "438498, 438499", ["280:342:298:95"] = "438478, 438479, 438480, 438481", ["281:351:639:43"] = "438443, 438444, 438445, 438446", ["282:263:483:210"] = "438447, 438448, 438449, 438450", ["282:298:482:14"] = "438488, 438489, 438490, 438491", ["286:178:272:333"] = "438441, 438442", ["321:203:516:465"] = "438492, 438493", ["328:336:160:0"] = "438500, 438501, 438502, 438503", ["350:345:652:290"] = "438494, 438495, 438496, 438497",}, [199] = {["1002:664:0:4"] = "466830, 466834, 466835, 466836, 466837, 466838, 466839, 466840, 466841, 466831, 466832, 466833",}, [203] = {["270:173:303:197"] = "438644, 438645", ["270:300:320:5"] = "438632, 438633, 438634, 438635, 438632, 438633, 438634, 438635, 438632, 438633, 438634, 438635", ["272:334:622:320"] = "438646, 438647, 438648, 438649", ["277:232:139:436"] = "438668, 438669", ["282:418:6:78"] = "438636, 438637, 438638, 438639", ["291:321:116:17"] = "438670, 438671, 438672, 438673", ["320:471:682:128"] = "438640, 438641, 438642, 438643", ["365:264:411:216"] = "438678, 438679, 438680, 438681", ["419:290:318:378"] = "438682, 438683, 438684, 438685", ["441:319:52:253"] = "438674, 438675, 438676, 438677", ["537:323:392:0"] = "438662, 438663, 438664, 438665, 438666, 438667",}, [204] = {["214:140:273:528"] = "440758", ["216:172:423:251"] = "440749", ["218:178:300:64"] = "440753", ["242:195:269:436"] = "440750", ["254:214:267:196"] = "440763", ["269:211:398:457"] = "440745, 440746", ["280:279:548:147"] = "440754, 440755, 440756, 440757", ["285:171:244:286"] = "440759, 440760", ["315:170:201:0"] = "440751, 440752", ["355:226:289:117"] = "440761, 440762", ["384:248:274:307"] = "440747, 440748",}, [206] = {["220:189:528:228"] = "440974", ["227:207:399:280"] = "440977", ["278:315:210:35"] = "440984, 440985, 440986, 440987", ["291:206:380:43"] = "440982, 440983", ["311:217:451:325"] = "440975, 440976", ["316:267:456:401"] = "440978, 440979, 440980, 440981", ["340:225:365:162"] = "440988, 440989",}, [209] = {["225:250:415:183"] = "440973", ["267:374:266:280"] = "440955, 440956, 440957, 440958", ["298:251:315:110"] = "440963, 440964", ["306:293:162:210"] = "440969, 440970, 440971, 440972", ["363:262:275:32"] = "440959, 440960, 440961, 440962", ["370:385:412:283"] = "440965, 440966, 440967, 440968", ["371:394:50:263"] = "440947, 440948, 440949, 440950", ["491:470:497:0"] = "440951, 440952, 440953, 440954",}, [210] = {["197:223:554:175"] = "440998", ["272:180:270:222"] = "440992, 440993", ["286:269:460:261"] = "440994, 440995, 440996, 440997", ["335:223:407:445"] = "440990, 440991", ["339:278:400:0"] = "441003, 441004, 441005, 441006", ["349:361:217:268"] = "440999, 441000, 441001, 441002", ["480:319:150:32"] = "441007, 441008, 441009, 441010",}, [212] = {["237:198:297:384"] = "438312", ["274:156:434:0"] = "438306, 438307", ["292:285:458:383"] = "438294, 438295, 438296, 438297", ["355:345:287:177"] = "438298, 438299, 438300, 438301", ["370:285:0:146"] = "438280, 438281, 438282, 438283", ["371:354:0:314"] = "438290, 438291, 438292, 438293", ["378:359:20:0"] = "438276, 438277, 438278, 438279", ["411:248:570:420"] = "438310, 438311", ["430:230:141:438"] = "438308, 438309", ["454:343:549:297"] = "438272, 438273, 438274, 438275", ["462:400:540:12"] = "438268, 438269, 438270, 438271", ["467:273:85:0"] = "438302, 438303, 438304, 438305", ["516:287:448:0"] = "438284, 438285, 438286, 438287, 438288, 438289",}, [215] = {["155:221:468:119"] = "438752", ["184:176:533:181"] = "438751", ["225:255:289:341"] = "438740", ["236:276:340:392"] = "438754, 438755", ["238:260:345:0"] = "438743, 438744", ["240:264:471:404"] = "438747, 438748", ["244:209:452:0"] = "438753", ["246:221:292:213"] = "438750", ["253:242:408:248"] = "438749", ["271:204:528:73"] = "438741, 438742", ["356:221:208:116"] = "438745, 438746",}, [216] = {["177:219:293:449"] = "438541", ["194:236:167:352"] = "438540", ["210:166:261:427"] = "438504", ["222:268:393:386"] = "438546, 438547", ["244:241:141:202"] = "438539", ["250:298:482:14"] = "438552, 438553", ["267:314:387:0"] = "438548, 438549, 438550, 438551", ["280:224:504:394"] = "438562, 438563", ["280:342:298:95"] = "438542, 438543, 438544, 438545", ["281:351:639:43"] = "438507, 438508, 438509, 438510", ["282:263:483:210"] = "438523, 438524, 438525, 438526", ["286:178:272:333"] = "438505, 438506", ["321:203:516:465"] = "438556, 438557", ["328:336:160:0"] = "438564, 438565, 438566, 438567", ["350:345:652:290"] = "438558, 438559, 438560, 438561",}, [220] = {["177:219:293:449"] = "438605", ["194:236:167:352"] = "438604", ["210:166:261:427"] = "438568", ["222:268:393:386"] = "438610, 438611", ["244:241:141:202"] = "438603", ["267:314:387:0"] = "438612, 438613, 438614, 438615", ["280:224:504:394"] = "438626, 438627", ["280:342:298:95"] = "438606, 438607, 438608, 438609", ["281:351:639:43"] = "438571, 438572, 438573, 438574", ["282:263:483:210"] = "438587, 438588, 438589, 438590", ["282:298:482:14"] = "438616, 438617, 438618, 438619", ["286:178:272:333"] = "438569, 438570", ["321:203:516:465"] = "438620, 438621", ["328:336:160:0"] = "438628, 438629, 438630, 438631", ["350:345:652:290"] = "438622, 438623, 438624, 438625",}, [225] = {["142:133:377:359"] = "457676", ["156:142:433:11"] = "457675", ["159:230:264:144"] = "457696", ["168:205:416:368"] = "457686", ["172:175:189:408"] = "457692", ["173:180:351:21"] = "457673", ["177:172:129:348"] = "457671", ["190:186:416:131"] = "457693", ["210:258:492:161"] = "457684, 457685", ["212:193:279:68"] = "457695", ["212:216:440:452"] = "457687", ["221:211:508:345"] = "457683", ["222:190:244:458"] = "457674", ["231:216:213:325"] = "457694", ["248:209:462:43"] = "457672", ["305:288:323:185"] = "457688, 457689, 457690, 457691", ["350:517:581:21"] = "457677, 457678, 457679, 457680, 457681, 457682",}, [226] = {["142:133:377:359"] = "440869", ["156:142:433:11"] = "440868", ["159:230:264:144"] = "440913", ["168:205:416:368"] = "440879", ["172:175:189:408"] = "440885", ["173:180:351:21"] = "440866", ["177:172:129:348"] = "440864", ["190:186:416:131"] = "440886", ["210:258:492:161"] = "440877, 440878", ["212:193:279:68"] = "440912", ["212:216:440:452"] = "440880", ["221:211:508:345"] = "440876", ["222:190:244:458"] = "440867", ["231:216:213:325"] = "440911", ["248:209:462:43"] = "440865", ["305:288:323:185"] = "440881, 440882, 440883, 440884", ["350:517:581:21"] = "440870, 440871, 440872, 440873, 440874, 440875",}, [227] = {["270:173:303:197"] = "438698, 438699", ["270:300:320:5"] = "438686, 438687, 438688, 438689, 438686, 438687, 438688, 438689, 438686, 438687, 438688, 438689", ["272:334:622:320"] = "438700, 438701, 438702, 438703", ["277:232:139:436"] = "438722, 438723", ["282:418:6:78"] = "438690, 438691, 438692, 438693", ["291:321:116:17"] = "438724, 438725, 438726, 438727", ["320:471:682:128"] = "438694, 438695, 438696, 438697", ["365:264:411:216"] = "438732, 438733, 438734, 438735", ["419:290:318:378"] = "438736, 438737, 438738, 438739", ["441:319:52:253"] = "438728, 438729, 438730, 438731, 438728, 438729, 438730, 438731", ["537:323:392:0"] = "438716, 438717, 438718, 438719, 438720, 438721",}, [228] = {["1002:668:0:0"] = "464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055, 464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055, 464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055, 464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055, 464052, 464056, 464057, 464058, 464059, 464060, 464061, 464062, 464063, 464053, 464054, 464055",}, [252] = {["143:141:344:89"] = "458560", ["165:199:327:356"] = "458579", ["174:190:291:89"] = "458554", ["175:180:269:179"] = "458572", ["177:159:302:306"] = "458587", ["182:195:370:447"] = "458548", ["191:198:205:232"] = "458589", ["194:170:543:220"] = "458555", ["197:218:395:367"] = "458552", ["198:201:622:169"] = "458570", ["199:212:312:192"] = "458574", ["203:208:387:268"] = "458547", ["206:182:296:0"] = "458569", ["211:210:498:121"] = "458571", ["214:190:358:0"] = "458588", ["215:157:416:205"] = "458546", ["215:181:499:265"] = "458553", ["220:227:697:403"] = "458558", ["226:232:654:0"] = "458573", ["230:276:83:223"] = "458556, 458557", ["238:229:374:93"] = "458580", ["239:232:482:330"] = "458559", ["251:207:631:245"] = "458551", ["260:202:610:345"] = "458581, 458582", ["283:206:76:120"] = "458549, 458550", ["308:267:482:0"] = "458561, 458562, 458563, 458564", ["324:264:71:16"] = "458583, 458584, 458585, 458586", ["342:288:436:380"] = "458565, 458566, 458567, 458568", ["361:354:151:314"] = "458575, 458576, 458577, 458578",}, [260] = {["150:159:545:193"] = "458658", ["151:144:479:215"] = "458668", ["160:193:406:174"] = "458641", ["161:236:647:15"] = "458663", ["164:185:471:277"] = "458634", ["196:170:551:121"] = "458646", ["202:169:341:402"] = "458635", ["203:215:542:0"] = "458638", ["203:249:217:289"] = "458653", ["206:204:657:349"] = "458664", ["209:254:407:384"] = "458643", ["213:195:656:473"] = "458665", ["228:227:411:67"] = "458650", ["233:321:527:291"] = "458639, 458640", ["237:194:583:162"] = "458642", ["237:316:752:170"] = "458661, 458662", ["249:243:264:136"] = "458649", ["269:203:340:282"] = "458647, 458648", ["269:242:599:184"] = "458636, 458637", ["270:229:229:433"] = "458666, 458667", ["278:173:365:0"] = "458651, 458652", ["296:209:132:127"] = "458659, 458660", ["312:289:28:221"] = "458654, 458655, 458656, 458657", ["400:224:110:0"] = "458644, 458645",}, [289] = {["150:159:545:193"] = "458693", ["151:144:479:215"] = "458715", ["160:193:406:174"] = "458676", ["161:236:647:15"] = "458698", ["164:185:471:277"] = "458669", ["196:170:551:121"] = "458681", ["202:169:341:402"] = "458670", ["203:215:542:0"] = "458673", ["203:249:217:289"] = "458688", ["206:204:657:349"] = "458699", ["209:254:407:384"] = "458678", ["213:195:656:473"] = "458700", ["228:227:411:67"] = "458685", ["233:321:527:291"] = "458674, 458675", ["237:194:583:162"] = "458677", ["237:316:752:170"] = "458696, 458697", ["249:243:264:136"] = "458684", ["269:203:340:282"] = "458682, 458683", ["269:242:599:184"] = "458671, 458672", ["270:229:229:433"] = "458701, 458702", ["278:173:365:0"] = "458686, 458687", ["296:209:132:127"] = "458694, 458695", ["312:289:28:221"] = "458689, 458690, 458691, 458692", ["400:224:110:0"] = "458679, 458680",}, [338] = {["143:141:344:89"] = "458604", ["165:199:327:356"] = "458623, 458623", ["174:190:291:89"] = "458598", ["175:180:269:179"] = "458616", ["177:159:302:306"] = "458631", ["182:195:370:447"] = "458592", ["191:198:205:232"] = "458633", ["194:170:543:220"] = "458599", ["197:218:395:367"] = "458596", ["198:201:622:169"] = "458614", ["199:212:312:192"] = "458618", ["203:208:387:268"] = "458591", ["206:182:296:0"] = "458613", ["211:210:498:121"] = "458615", ["214:190:358:0"] = "458632", ["215:157:416:205"] = "458590", ["215:181:499:265"] = "458597", ["220:227:697:403"] = "458602", ["226:232:654:0"] = "458617", ["230:276:83:223"] = "458600, 458601", ["238:229:374:93"] = "458624", ["239:232:482:330"] = "458603", ["251:207:631:245"] = "458595", ["260:202:610:345"] = "458625, 458626", ["283:206:76:120"] = "458593, 458594", ["308:267:482:0"] = "458605, 458606, 458607, 458608", ["324:264:71:16"] = "458627, 458628, 458629, 458630", ["342:288:436:380"] = "458609, 458610, 458611, 458612", ["361:354:151:314"] = "458619, 458620, 458621, 458622",}, [339] = {["887:668:115:0"] = "462974, 462978, 462979, 462980, 462981, 462982, 462983, 462984, 462985, 462975, 462976, 462977",}, [383] = {["179:180:428:416"] = "614290", ["191:216:388:299"] = "614289", ["196:158:316:0"] = "614288", ["196:166:181:75"] = "614284", ["202:204:430:21"] = "614278", ["210:158:202:0"] = "614297", ["218:148:474:520"] = "614277", ["219:186:346:482"] = "614294", ["219:205:189:151"] = "614287", ["219:256:290:330"] = "614286", ["227:198:300:56"] = "614275", ["234:210:325:178"] = "614276", ["236:142:400:146"] = "614285", ["242:210:481:215"] = "614293", ["251:348:539:43"] = "614295, 614296", ["253:229:182:214"] = "614283", ["264:211:468:295"] = "614291, 614292", ["278:310:525:358"] = "614279, 614280, 614281, 614282",}, [388] = {["175:291:170:130"] = "615423, 615424", ["199:304:224:74"] = "615411, 615412", ["206:245:438:177"] = "615408", ["208:292:438:41"] = "615404, 615405", ["209:308:0:343"] = "615402, 615403", ["213:246:513:58"] = "615418", ["230:217:561:161"] = "615413", ["249:342:104:326"] = "615414, 615415", ["254:259:530:253"] = "615421, 615422", ["257:288:227:380"] = "615425, 615426, 615427, 615428", ["260:251:5:239"] = "615409, 615410", ["273:246:12:105"] = "615416, 615417", ["277:245:582:301"] = "615419, 615420", ["286:392:253:75"] = "615429, 615430, 615431, 615432", ["303:323:699:114"] = "615437, 615438, 615439, 615440", ["314:212:334:325"] = "615406, 615407", ["380:317:622:0"] = "615433, 615434, 615435, 615436", ["510:264:215:404"] = "615398, 615399, 615400, 615401",}, [390] = {["220:188:297:324"] = "538846", ["234:286:134:9"] = "538829, 571508", ["261:315:203:36"] = "538836, 538837, 538838, 538839", ["313:321:183:198"] = "538847, 538848, 538849, 538850", ["346:263:124:405"] = "538851, 538852, 538853, 538854", ["372:475:545:12"] = "538874, 538875, 538876, 538877", ["385:373:504:295"] = "538870, 538871, 538872, 538873", ["607:461:395:182"] = "538855, 538856, 538857, 538858, 538859, 538860", ["610:374:392:294"] = "538830, 538831, 538832, 538833, 538834, 538835", ["651:262:351:406"] = "538840, 538841, 538842, 538843, 538844, 538845", ["677:668:325:0"] = "538861, 538862, 538863, 538864, 538865, 538866, 538867, 538868, 538869", ["989:466:13:202"] = "538890, 538891, 538892, 538893, 538894, 538895, 538896, 538897",}, [391] = {["224:172:322:496"] = "614341", ["224:241:453:191"] = "614367", ["229:262:603:313"] = "614351, 614352", ["240:198:607:470"] = "614340", ["250:260:587:170"] = "614361, 614362", ["252:257:233:360"] = "614346, 614347", ["253:208:462:411"] = "614348", ["259:233:602:4"] = "614344, 614345", ["261:162:449:506"] = "614342, 614343", ["287:277:333:63"] = "614353, 614354, 614355, 614356", ["298:219:502:64"] = "614368, 614369", ["310:276:398:310"] = "614363, 614364, 614365, 614366", ["313:208:228:264"] = "614349, 614350", ["385:385:88:92"] = "614357, 614358, 614359, 614360",}, [400] = {["213:170:413:385"] = "614385", ["238:296:560:185"] = "614379, 614380", ["247:221:417:447"] = "614374", ["255:269:420:209"] = "614372, 614373", ["261:235:306:433"] = "614388, 614389", ["271:205:545:369"] = "614394, 614395", ["282:306:692:362"] = "614381, 614382, 614383, 614384", ["294:283:92:192"] = "614390, 614391, 614392, 614393", ["296:359:213:241"] = "614375, 614376, 614377, 614378", ["300:246:125:0"] = "614386, 614387", ["353:200:546:468"] = "614370, 614371",}, [402] = {["242:254:328:16"] = "614447", ["267:281:278:170"] = "614466, 614467, 614468, 614469", ["267:308:349:316"] = "614458, 614459, 614460, 614461", ["272:522:444:97"] = "614452, 614453, 614454, 614455, 614456, 614457", ["298:262:482:10"] = "614462, 614463, 614464, 614465", ["310:305:200:363"] = "614435, 614436, 614437, 614438", ["337:349:87:3"] = "614431, 614432, 614433, 614434", ["350:429:0:234"] = "614443, 614444, 614445, 614446", ["361:333:4:107"] = "614470, 614471, 614472, 614473", ["373:385:629:22"] = "614439, 614440, 614441, 614442", ["446:359:556:267"] = "614448, 614449, 614450, 614451",}, [430] = {["188:412:397:59"] = "614501, 614502", ["190:282:513:3"] = "614482, 614483", ["204:383:444:44"] = "614495, 614496", ["211:395:125:88"] = "614497, 614498", ["212:265:317:63"] = "614493, 614494", ["214:393:218:77"] = "614484, 614485", ["217:279:589:27"] = "614490, 614491", ["219:259:300:215"] = "614499, 614500", ["246:240:343:373"] = "614492", ["252:313:23:267"] = "614507, 614508, 614507, 614508", ["257:300:0:79"] = "614503, 614504, 614505, 614506", ["258:170:330:498"] = "614509, 614510", ["265:194:545:205"] = "614478, 614479", ["272:250:176:376"] = "614480, 614481", ["286:268:701:19"] = "614486, 614487, 614488, 614489", ["306:204:612:0"] = "614511, 614512",}, [434] = {["209:234:593:92"] = "642686", ["209:318:341:125"] = "642670, 642671", ["218:186:236:32"] = "642683", ["236:206:458:110"] = "642680", ["250:218:351:0"] = "642665", ["262:293:191:122"] = "642674, 642675, 642676, 642677", ["268:241:450:406"] = "642684, 642685", ["290:283:162:385"] = "642687, 642688, 642689, 642690", ["322:211:437:313"] = "642672, 642673", ["323:194:441:224"] = "642678, 642679", ["325:190:485:0"] = "642681, 642682", ["325:270:214:311"] = "642666, 642667, 642668, 642669",}, [435] = {["164:191:565:289"] = "651259", ["213:257:565:126"] = "651260, 651261", ["362:222:414:96"] = "651257, 651258", ["385:146:206:173"] = "651255, 651256",}, [445] = {["290:191:412:477"] = "615054, 615055, 615054, 615055", ["294:220:433:0"] = "614718, 614719", ["479:493:371:175"] = "614714, 614715, 614716, 614717",}, [498] = {["206:200:656:21"] = "656197", ["270:353:428:0"] = "656230, 656231, 656232, 656233", ["279:301:358:169"] = "656202, 656203, 656204, 656205", ["305:247:542:223"] = "656224, 656225", ["317:230:137:188"] = "656222, 656223", ["344:183:199:0"] = "656198, 656199", ["384:249:133:59"] = "656200, 656201", ["433:351:109:313"] = "656218, 656219, 656220, 656221", ["436:299:359:369"] = "656226, 656227, 656228, 656229",}, [499] = {["188:412:397:59"] = "660517, 660518", ["190:282:513:3"] = "660486, 660487", ["204:383:444:44"] = "660511, 660512", ["211:395:125:88"] = "660513, 660514", ["212:265:317:63"] = "660509, 660510", ["214:393:218:77"] = "660488, 660489", ["217:279:589:27"] = "660506, 660507", ["219:259:300:215"] = "660515, 660516", ["246:240:343:373"] = "660508", ["257:300:0:79"] = "660519, 660520, 660521, 660522", ["258:170:330:498"] = "660527, 660528", ["272:250:176:376"] = "660484, 660485", ["275:329:0:267"] = "660523, 660524, 660525, 660526, 660523, 660524, 660525, 660526", ["295:293:701:19"] = "660490, 660491, 660492, 660493", ["306:204:612:0"] = "660529, 660530", ["347:199:545:200"] = "660482, 660483",}, [521] = {["278:325:183:95"] = "800842, 800843, 800844, 800845, 800842, 800843, 800844, 800845", ["446:429:396:9"] = "800846, 800847, 800848, 800849, 800846, 800847, 800848, 800849, 800850, 800851, 800852, 800853, 800850, 800851, 800852, 800853, 800854, 800855, 800856, 800857, 800854, 800855, 800856, 800857, 800858, 800859, 800860, 800861, 800858, 800859, 800860, 800861", ["490:290:256:378"] = "800841, 804116, 804117, 804118, 800841, 804116, 804117, 804118",}, [533] = {["278:325:183:95"] = "803902, 803903, 803904, 803905, 803902, 803903, 803904, 803905", ["446:429:396:9"] = "803910, 803911, 803912, 803913, 803914, 803915, 803916, 803917, 803906, 803907, 803908, 803909, 803918, 803919, 803920, 803921, 803918, 803919, 803920, 803921, 803914, 803915, 803916, 803917, 803910, 803911, 803912, 803913, 803906, 803907, 803908, 803909", ["490:290:256:378"] = "803901, 839100, 839101, 839102, 803901, 839100, 839101, 839102",}, [542] = {["178:203:597:210"] = "1003336", ["199:335:641:304"] = "1003346, 1003347", ["213:278:609:33"] = "1003352, 1003353", ["217:239:483:33"] = "1003341", ["251:191:306:281"] = "1003354", ["255:191:284:91"] = "1003333", ["256:210:290:192"] = "1003355", ["258:217:311:4"] = "1003327, 1003328", ["266:293:439:137"] = "1003356, 1003357, 1003358, 1003359", ["267:257:336:327"] = "1003342, 1003343, 1003344, 1003345, 1027472, 1027473, 1027474, 1027475, 1027472, 1027473, 1027474, 1027475, 1126503, 1126504, 1126505, 1126506", ["273:349:729:319"] = "1003329, 1003330, 1003331, 1003332", ["274:214:121:0"] = "1003334, 1003335", ["282:341:505:323"] = "1003337, 1003338, 1003339, 1003340", ["317:233:72:292"] = "1003360, 1003361", ["329:294:673:156"] = "1003348, 1003349, 1003350, 1003351", ["356:303:38:117"] = "1003323, 1003324, 1003325, 1003326",}, [551] = {["174:208:81:367"] = "1126684", ["189:294:303:62"] = "1126693, 1126694", ["209:245:0:264"] = "1126692", ["223:183:392:187"] = "1126689", ["238:229:501:171"] = "1126706", ["246:218:296:383"] = "1126703", ["248:314:170:354"] = "1126704, 1126705", ["270:208:465:313"] = "1126701, 1126702", ["274:251:118:194"] = "1126707, 1126708", ["327:241:254:262"] = "1126690, 1126691", ["333:437:637:136"] = "1126680, 1126681, 1126682, 1126683", ["338:254:54:94"] = "1126699, 1126700", ["343:264:429:392"] = "1126685, 1126686, 1126687, 1126688", ["365:276:392:23"] = "1126695, 1126696, 1126697, 1126698",}, [552] = {["225:224:472:148"] = "1036473", ["252:280:546:228"] = "1036441, 1036442", ["278:270:165:364"] = "1036451, 1036452, 1036453, 1036454", ["279:267:427:0"] = "1036457, 1036458, 1036459, 1036460", ["287:277:713:35"] = "1036474, 1036475, 1036476, 1036477", ["292:235:567:42"] = "1036445, 1036446", ["307:229:150:264"] = "1036443, 1036444", ["308:276:685:298"] = "1036461, 1036462, 1036463, 1036464", ["309:262:338:356"] = "1036437, 1036438, 1036439, 1036440", ["326:212:352:271"] = "1036471, 1036472", ["389:234:597:178"] = "1036435, 1036436", ["398:149:571:0"] = "1036455, 1036456", ["406:367:173:22"] = "1036465, 1036466, 1036467, 1036468", ["423:290:548:378"] = "1036447, 1036448, 1036449, 1036450", ["497:157:207:511"] = "1036469, 1036470",}, [556] = {["173:160:309:460"] = "1037676", ["202:201:383:411"] = "1037683", ["223:279:194:0"] = "1037663, 1037664, 1037674, 1037675, 1037674, 1037675, 1126508, 1126509", ["229:240:319:5"] = "1037665", ["260:309:26:0"] = "1037666, 1037667, 1037668, 1037669", ["282:201:468:467"] = "1037655, 1037656", ["282:225:259:315"] = "1037677, 1037678", ["288:261:453:306"] = "1037679, 1037680, 1037681, 1037682", ["291:266:426:0"] = "1037657, 1037658, 1037659, 1037660", ["309:264:140:160"] = "1037651, 1037652, 1037653, 1037654", ["346:252:270:158"] = "1037661, 1037662", ["393:318:537:150"] = "1037670, 1037671, 1037672, 1037673",}, [559] = {["169:178:374:276"] = "1037704", ["182:244:649:155"] = "1037688", ["188:190:444:255"] = "1037686", ["190:187:282:261"] = "1037689", ["196:284:429:84"] = "1037702, 1037703", ["197:179:310:328"] = "1037705", ["198:232:521:268"] = "1037707", ["209:154:334:210"] = "1037684", ["217:224:533:382"] = "1037687", ["226:193:465:475"] = "1037708", ["229:213:197:198"] = "1037709", ["229:246:410:350"] = "1037685", ["238:295:520:127"] = "1037698, 1037699", ["252:230:281:83"] = "1037706", ["314:304:102:0"] = "1037694, 1037695, 1037696, 1037697", ["371:174:289:0"] = "1037700, 1037701", ["382:274:459:0"] = "1037690, 1037691, 1037692, 1037693",}, [560] = {["166:161:383:371"] = "1036374", ["208:142:275:416"] = "1036391", ["209:225:411:250"] = "1036382", ["210:193:525:260"] = "1036375", ["211:221:455:74"] = "1036378", ["217:178:259:335"] = "1036390", ["217:180:454:183"] = "1036379", ["250:232:312:77"] = "1036392", ["253:198:444:323"] = "1036389", ["262:221:451:372"] = "1036393, 1036394", ["279:241:258:213"] = "1036380, 1036381", ["285:323:547:73"] = "1036383, 1036384, 1036385, 1036386", ["297:181:281:444"] = "1036376, 1036377", ["315:180:350:0"] = "1036387, 1036388", ["324:161:283:507"] = "1036372, 1036373",}, [567] = {["234:191:239:259"] = "1036395", ["236:242:283:354"] = "1036410", ["236:372:766:118"] = "1036404, 1036405", ["249:288:753:380"] = "1036413, 1036414", ["250:287:746:25"] = "1036415, 1036416", ["256:301:600:367"] = "1036402, 1036403", ["262:266:366:323"] = "1036417, 1036418, 1036419, 1036420", ["263:287:430:0"] = "1036421, 1036422, 1036423, 1036424", ["274:254:312:98"] = "1036429, 1036430", ["286:274:588:0"] = "1036398, 1036399, 1036400, 1036401", ["296:272:461:353"] = "1036431, 1036432, 1036433, 1036434", ["305:227:256:12"] = "1036396, 1036397", ["316:221:382:187"] = "1036411, 1036412", ["354:315:523:159"] = "1036425, 1036426, 1036427, 1036428", ["471:437:0:0"] = "1036406, 1036407, 1036408, 1036409",}, [594] = {["143:137:328:251"] = "1027314",}, [628] = {["168:170:375:102"] = "1085238", ["195:199:436:0"] = "1085237", ["199:191:333:474"] = "1085244", ["218:183:459:97"] = "1085239", ["233:266:386:374"] = "1085242, 1085243", ["235:188:327:182"] = "1085234", ["238:195:225:110"] = "1085231", ["240:270:578:91"] = "1085240, 1085241", ["268:354:533:268"] = "1085249, 1085250, 1085251, 1085252", ["272:206:258:0"] = "1085232, 1085233", ["295:205:530:6"] = "1085235, 1085236", ["308:226:144:175"] = "1085257, 1085258", ["348:357:132:311"] = "1085253, 1085254, 1085255, 1085256", ["370:298:368:179"] = "1085245, 1085246, 1085247, 1085248",}, [653] = {["181:243:481:340"] = "1414545", ["206:266:396:244"] = "1414541, 1414542", ["220:288:523:233"] = "1414543, 1414544", ["239:303:594:0"] = "1414528, 1414529", ["247:184:450:95"] = "1414530", ["272:192:441:173"] = "1414539, 1414540", ["288:195:477:0"] = "1414546, 1414547", ["315:185:257:0"] = "1414537, 1414538", ["321:267:281:401"] = "1414531, 1414532, 1414533, 1414534", ["330:265:166:202"] = "1414524, 1414525, 1414526, 1414527", ["351:245:219:69"] = "1414535, 1414536",}, [657] = {["132:145:689:266"] = "1414600", ["135:162:623:81"] = "1414615", ["150:180:741:313"] = "1414613", ["173:163:648:339"] = "1414601", ["177:169:506:345"] = "1414618", ["180:160:510:118"] = "1414619", ["186:158:522:288"] = "1414623", ["194:214:592:226"] = "1414616", ["199:185:361:210"] = "1414596", ["200:174:612:187"] = "1414604", ["205:199:479:183"] = "1414622", ["215:247:457:412"] = "1414599", ["241:194:345:95"] = "1414614", ["252:280:585:372"] = "1414602, 1414603", ["289:172:689:0"] = "1414617, 1417748", ["291:208:316:282"] = "1414620, 1414621", ["297:210:154:129"] = "1414597, 1414598", ["386:314:56:185"] = "1414624, 1414625, 1414626, 1414627", ["509:251:17:0"] = "1414611, 1414612", ["631:315:0:353"] = "1414605, 1414606, 1414607, 1414608, 1414609, 1414610",}, [664] = {["171:150:457:351"] = "1414675", ["177:156:467:413"] = "1414676", ["216:219:459:240"] = "1414689", ["218:168:342:416"] = "1414690", ["239:301:136:274"] = "1414673, 1414674", ["241:240:587:250"] = "1414665", ["250:253:262:175"] = "1414666", ["254:281:549:380"] = "1414681, 1414682", ["274:344:610:18"] = "1414677, 1414678, 1414679, 1414680", ["294:364:283:0"] = "1414669, 1414670, 1414671, 1414672", ["311:244:259:275"] = "1414667, 1414668", ["326:360:419:0"] = "1414683, 1414684, 1414685, 1414686", ["341:188:324:480"] = "1414687, 1414688",}, [669] = {["182:245:220:260"] = "1597370", ["276:213:350:13"] = "1597172, 1597166", ["308:244:632:169"] = "1414556, 1414557", ["312:301:500:0"] = "1414560, 1414561, 1414562, 1414563", ["332:276:596:100"] = "1597182, 1597179, 1597167, 1597186", ["338:270:389:180"] = "1597181, 1597168, 1597171, 1597187", ["338:322:254:84"] = "1597169, 1597369, 1597185, 1597180", ["387:314:312:302"] = "1597371, 1597184, 1597183, 1597170",}, [674] = {["110:98:445:190"] = "1467065", ["172:204:249:236"] = "1414595", ["186:213:391:408"] = "1414568", ["207:302:469:45"] = "1414580, 1414581", ["214:308:314:360"] = "1414578, 1414579", ["217:148:323:249"] = "1414577", ["244:199:332:302"] = "1414594", ["256:326:172:31"] = "1414566, 1414567", ["283:170:331:0"] = "1414582, 1414583", ["288:258:452:410"] = "1414569, 1414570, 1414571, 1414572", ["297:250:307:75"] = "1414564, 1414565", ["311:229:357:179"] = "1414584, 1414585", ["341:328:494:236"] = "1414586, 1414587, 1414588, 1414589", ["344:295:0:244"] = "1414573, 1414574, 1414575, 1414576", ["445:326:0:342"] = "1414590, 1414591, 1414592, 1414593",}, [700] = {["376:364:0:212"] = "1445120, 1445121, 1445122, 1445123",}, [704] = {["221:224:264:226"] = "1414656", ["222:311:132:179"] = "1414628, 1414629", ["248:317:23:136"] = "1414634, 1414635", ["289:363:183:305"] = "1414636, 1414637, 1414638, 1414639", ["327:381:492:0"] = "1414630, 1414631, 1414632, 1414633", ["355:291:344:285"] = "1414640, 1414641, 1414642, 1414643", ["387:372:327:0"] = "1414661, 1414662, 1414663, 1414664", ["419:538:583:0"] = "1414644, 1414645, 1414646, 1414647, 1414648, 1414649", ["428:316:201:0"] = "1414652, 1414653, 1414654, 1414655", ["470:337:390:331"] = "1414657, 1414658, 1414659, 1414660", ["480:245:58:0"] = "1414650, 1414651",}, [738] = {["116:118:271:238"] = "1346187", ["262:188:269:233"] = "1346188, 1346189",}, [815] = {["848:668:39:0"] = "1417775, 1417779, 1417780, 1417781, 1417782, 1417783, 1417784, 1417785, 1417786, 1417776, 1417777, 1417778",}, [855] = {["296:336:371:178"] = "1710644, 1710645, 1710646, 1710647", ["307:304:428:364"] = "1710648, 1710649, 1710650, 1710651", ["445:379:557:289"] = "1710660, 1710661, 1710662, 1710663", ["498:530:37:138"] = "1710664, 1710665, 1710666, 1710667, 1710668, 1710669", ["835:422:167:0"] = "1710652, 1710653, 1710654, 1710655, 1710656, 1710657, 1710658, 1710659",}, [887] = {["1130:672:1357:0"] = "2034223, 2034230, 2034231, 2034232, 2034233, 2034234, 2034235, 2034236, 2034237, 2034224, 2034225, 2034226, 2034227, 2034228, 2034229", ["1243:1287:1046:1273"] = "2034370, 2034381, 2034392, 2034394, 2034395, 2034396, 2034397, 2034398, 2034399, 2034371, 2034372, 2034373, 2034374, 2034375, 2034376, 2034377, 2034378, 2034379, 2034380, 2034382, 2034383, 2034384, 2034385, 2034386, 2034387, 2034388, 2034389, 2034390, 2034391, 2034393", ["1650:1565:321:378"] = "2034162, 2034173, 2034184, 2034195, 2034206, 2034207, 2034208, 2034209, 2034210, 2034163, 2034164, 2034165, 2034166, 2034167, 2034168, 2034169, 2034170, 2034171, 2034172, 2034174, 2034175, 2034176, 2034177, 2034178, 2034179, 2034180, 2034181, 2034182, 2034183, 2034185, 2034186, 2034187, 2034188, 2034189, 2034190, 2034191, 2034192, 2034193, 2034194, 2034196, 2034197, 2034198, 2034199, 2034200, 2034201, 2034202, 2034203, 2034204, 2034205", ["699:1207:1815:260"] = "2034238, 2034245, 2034246, 2034247, 2034248, 2034249, 2034250, 2034251, 2034252, 2034239, 2034240, 2034241, 2034242, 2034243, 2034244", ["726:617:2631:1023"] = "2034361, 2034362, 2034363, 2034364, 2034365, 2034366, 2034367, 2034368, 2034369", ["769:967:2107:327"] = "2034321, 2034329, 2034330, 2034331, 2034332, 2034333, 2034334, 2034335, 2034336, 2034322, 2034323, 2034324, 2034325, 2034326, 2034327, 2034328", ["793:668:2685:633"] = "2034211, 2034215, 2034216, 2034217, 2034218, 2034219, 2034220, 2034221, 2034222, 2034212, 2034213, 2034214", ["888:1512:1312:82"] = "2034269, 2034280, 2034286, 2034287, 2034288, 2034289, 2034290, 2034291, 2034292, 2034270, 2034271, 2034272, 2034273, 2034274, 2034275, 2034276, 2034277, 2034278, 2034279, 2034281, 2034282, 2034283, 2034284, 2034285", ["934:830:2325:1270"] = "2034253, 2034261, 2034262, 2034263, 2034264, 2034265, 2034266, 2034267, 2034268, 2034254, 2034255, 2034256, 2034257, 2034258, 2034259, 2034260", ["943:1559:2144:0"] = "2034293, 2034304, 2034314, 2034315, 2034316, 2034317, 2034318, 2034319, 2034320, 2034294, 2034295, 2034296, 2034297, 2034298, 2034299, 2034300, 2034301, 2034302, 2034303, 2034305, 2034306, 2034307, 2034308, 2034309, 2034310, 2034311, 2034312, 2034313", ["979:912:2409:0"] = "2034400, 2034408, 2034409, 2034410, 2034411, 2034412, 2034413, 2034414, 2034415, 2034401, 2034402, 2034403, 2034404, 2034405, 2034406, 2034407", ["999:1344:1825:1216"] = "2034337, 2034348, 2034354, 2034355, 2034356, 2034357, 2034358, 2034359, 2034360, 2034338, 2034339, 2034340, 2034341, 2034342, 2034343, 2034344, 2034345, 2034346, 2034347, 2034349, 2034350, 2034351, 2034352, 2034353",}, [888] = {["1065:1103:2309:210"] = "2023868, 2023879, 2023886, 2023887, 2023888, 2023889, 2023890, 2023891, 2023892, 2023869, 2023870, 2023871, 2023872, 2023873, 2023874, 2023875, 2023876, 2023877, 2023878, 2023880, 2023881, 2023882, 2023883, 2023884, 2023885", ["1098:996:2349:871"] = "2023693, 2023704, 2023706, 2023707, 2023708, 2023709, 2023710, 2023711, 2023712, 2023694, 2023695, 2023696, 2023697, 2023698, 2023699, 2023700, 2023701, 2023702, 2023703, 2023705", ["1157:967:484:1539"] = "2023923, 2023934, 2023936, 2023937, 2023938, 2023939, 2023940, 2023941, 2023942, 2023924, 2023925, 2023926, 2023927, 2023928, 2023929, 2023930, 2023931, 2023932, 2023933, 2023935", ["1225:1249:620:565"] = "2024017, 2024028, 2024035, 2024036, 2024037, 2024038, 2024039, 2024040, 2024041, 2024018, 2024019, 2024020, 2024021, 2024022, 2024023, 2024024, 2024025, 2024026, 2024027, 2024029, 2024030, 2024031, 2024032, 2024033, 2024034", ["1289:809:1072:1676"] = "2023943, 2023954, 2023960, 2023961, 2023962, 2023963, 2023964, 2023965, 2023966, 2023944, 2023945, 2023946, 2023947, 2023948, 2023949, 2023950, 2023951, 2023952, 2023953, 2023955, 2023956, 2023957, 2023958, 2023959", ["1349:1029:1682:0"] = "2023967, 2023978, 2023989, 2023991, 2023992, 2023993, 2023994, 2023995, 2023996, 2023968, 2023969, 2023970, 2023971, 2023972, 2023973, 2023974, 2023975, 2023976, 2023977, 2023979, 2023980, 2023981, 2023982, 2023983, 2023984, 2023985, 2023986, 2023987, 2023988, 2023990", ["1534:1119:1097:281"] = "2023893, 2023904, 2023915, 2023917, 2023918, 2023919, 2023920, 2023921, 2023922, 2023894, 2023895, 2023896, 2023897, 2023898, 2023899, 2023900, 2023901, 2023902, 2023903, 2023905, 2023906, 2023907, 2023908, 2023909, 2023910, 2023911, 2023912, 2023913, 2023914, 2023916", ["534:709:1298:1561"] = "2024042, 2024043, 2024044, 2024045, 2024046, 2024047, 2024048, 2024049, 2024050", ["800:991:1511:1043"] = "2023713, 2023721, 2023722, 2023723, 2023724, 2023725, 2023726, 2023727, 2023728, 2023714, 2023715, 2023716, 2023717, 2023718, 2023719, 2023720", ["841:1075:1807:1043"] = "2023997, 2024008, 2024010, 2024011, 2024012, 2024013, 2024014, 2024015, 2024016, 2023998, 2023999, 2024000, 2024001, 2024002, 2024003, 2024004, 2024005, 2024006, 2024007, 2024009",}, [889] = {["1086:703:576:902"] = "2033989, 2033996, 2033997, 2033998, 2033999, 2034000, 2034001, 2034002, 2034003, 2033990, 2033991, 2033992, 2033993, 2033994, 2033995", ["1139:822:1569:1281"] = "2033845, 2033856, 2033858, 2033859, 2033860, 2033861, 2033862, 2033863, 2033864, 2033846, 2033847, 2033848, 2033849, 2033850, 2033851, 2033852, 2033853, 2033854, 2033855, 2033857", ["1223:843:1733:0"] = "2034004, 2034015, 2034017, 2034018, 2034019, 2034020, 2034021, 2034022, 2034023, 2034005, 2034006, 2034007, 2034008, 2034009, 2034010, 2034011, 2034012, 2034013, 2034014, 2034016", ["1287:876:1469:1684"] = "2033821, 2033832, 2033838, 2033839, 2033840, 2033841, 2033842, 2033843, 2033844, 2033822, 2033823, 2033824, 2033825, 2033826, 2033827, 2033828, 2033829, 2033830, 2033831, 2033833, 2033834, 2033835, 2033836, 2033837", ["666:856:1180:1255"] = "2033961, 2033965, 2033966, 2033967, 2033968, 2033969, 2033970, 2033971, 2033972, 2033962, 2033963, 2033964", ["769:816:739:1332"] = "2033973, 2033981, 2033982, 2033983, 2033984, 2033985, 2033986, 2033987, 2033988, 2033974, 2033975, 2033976, 2033977, 2033978, 2033979, 2033980", ["794:542:1362:2018"] = "2033949, 2033953, 2033954, 2033955, 2033956, 2033957, 2033958, 2033959, 2033960, 2033950, 2033951, 2033952", ["849:672:1316:895"] = "2033865, 2033869, 2033870, 2033871, 2033872, 2033873, 2033874, 2033875, 2033876, 2033866, 2033867, 2033868", ["881:897:1006:341"] = "2033917, 2033925, 2033926, 2033927, 2033928, 2033929, 2033930, 2033931, 2033932, 2033918, 2033919, 2033920, 2033921, 2033922, 2033923, 2033924", ["913:727:2063:517"] = "2033877, 2033881, 2033882, 2033883, 2033884, 2033885, 2033886, 2033887, 2033888, 2033878, 2033879, 2033880", ["915:966:1579:220"] = "2033933, 2033941, 2033942, 2033943, 2033944, 2033945, 2033946, 2033947, 2033948, 2033934, 2033935, 2033936, 2033937, 2033938, 2033939, 2033940", ["926:688:807:1801"] = "2033905, 2033909, 2033910, 2033911, 2033912, 2033913, 2033914, 2033915, 2033916, 2033906, 2033907, 2033908", ["969:835:1880:859"] = "2033889, 2033897, 2033898, 2033899, 2033900, 2033901, 2033902, 2033903, 2033904, 2033890, 2033891, 2033892, 2033893, 2033894, 2033895, 2033896",}, [907] = {["265:310:278:284"] = "1710620, 1710621, 1710622, 1710623", ["284:264:410:375"] = "1710634, 1710635, 1710636, 1710637", ["313:353:498:111"] = "1710616, 1710617, 1710618, 1710619", ["463:519:265:54"] = "1710624, 1710625, 1710626, 1710627, 1710628, 1710629", ["498:461:0:0"] = "1710630, 1710631, 1710632, 1710633", ["701:323:0:0"] = "1710638, 1710639, 1710640, 1710641, 1710642, 1710643",}, [910] = {["467:430:535:238"] = "1710612, 1710613, 1710614, 1710615", ["626:385:293:0"] = "1710597, 1710598, 1710599, 1710600, 1710601, 1710602", ["660:668:0:0"] = "1710603, 1710604, 1710605, 1710606, 1710607, 1710608, 1710609, 1710610, 1710611",}, [920] = {["1047:821:2314:1739"] = "2033525, 2033536, 2033538, 2033539, 2033540, 2033541, 2033542, 2033543, 2033544, 2033526, 2033527, 2033528, 2033529, 2033530, 2033531, 2033532, 2033533, 2033534, 2033535, 2033537", ["1242:944:2451:1035"] = "2033605, 2033616, 2033618, 2033619, 2033620, 2033621, 2033622, 2033623, 2033624, 2033606, 2033607, 2033608, 2033609, 2033610, 2033611, 2033612, 2033613, 2033614, 2033615, 2033617", ["1306:678:802:0"] = "2033803, 2033813, 2033814, 2033815, 2033816, 2033817, 2033818, 2033819, 2033820, 2033804, 2033805, 2033806, 2033807, 2033808, 2033809, 2033810, 2033811, 2033812", ["1432:1009:2117:332"] = "2033473, 2033484, 2033490, 2033491, 2033492, 2033493, 2033494, 2033495, 2033496, 2033474, 2033475, 2033476, 2033477, 2033478, 2033479, 2033480, 2033481, 2033482, 2033483, 2033485, 2033486, 2033487, 2033488, 2033489", ["1777:900:1806:0"] = "2033497, 2033508, 2033518, 2033519, 2033520, 2033521, 2033522, 2033523, 2033524, 2033498, 2033499, 2033500, 2033501, 2033502, 2033503, 2033504, 2033505, 2033506, 2033507, 2033509, 2033510, 2033511, 2033512, 2033513, 2033514, 2033515, 2033516, 2033517", ["828:899:766:100"] = "2033569, 2033577, 2033578, 2033579, 2033580, 2033581, 2033582, 2033583, 2033584, 2033570, 2033571, 2033572, 2033573, 2033574, 2033575, 2033576", ["859:788:1108:451"] = "2033457, 2033465, 2033466, 2033467, 2033468, 2033469, 2033470, 2033471, 2033472, 2033458, 2033459, 2033460, 2033461, 2033462, 2033463, 2033464", ["891:1057:2852:1503"] = "2033625, 2033636, 2033638, 2033639, 2033640, 2033641, 2033642, 2033643, 2033644, 2033626, 2033627, 2033628, 2033629, 2033630, 2033631, 2033632, 2033633, 2033634, 2033635, 2033637", ["908:1284:1538:176"] = "2033545, 2033556, 2033562, 2033563, 2033564, 2033565, 2033566, 2033567, 2033568, 2033546, 2033547, 2033548, 2033549, 2033550, 2033551, 2033552, 2033553, 2033554, 2033555, 2033557, 2033558, 2033559, 2033560, 2033561", ["953:1223:1772:1199"] = "2033783, 2033794, 2033796, 2033797, 2033798, 2033799, 2033800, 2033801, 2033802, 2033784, 2033785, 2033786, 2033787, 2033788, 2033789, 2033790, 2033791, 2033792, 2033793, 2033795", ["978:1171:2054:995"] = "2033585, 2033596, 2033598, 2033599, 2033600, 2033601, 2033602, 2033603, 2033604, 2033586, 2033587, 2033588, 2033589, 2033590, 2033591, 2033592, 2033593, 2033594, 2033595, 2033597",}, [921] = {["1079:1204:1261:0"] = "2038112, 2038123, 2038130, 2038131, 2038132, 2038133, 2038134, 2038135, 2038136, 2038113, 2038114, 2038115, 2038116, 2038117, 2038118, 2038119, 2038120, 2038121, 2038122, 2038124, 2038125, 2038126, 2038127, 2038128, 2038129", ["1090:1169:1847:1025"] = "2038087, 2038098, 2038105, 2038106, 2038107, 2038108, 2038109, 2038110, 2038111, 2038088, 2038089, 2038090, 2038091, 2038092, 2038093, 2038094, 2038095, 2038096, 2038097, 2038099, 2038100, 2038101, 2038102, 2038103, 2038104", ["1125:880:1812:760"] = "2037819, 2037830, 2037832, 2037833, 2037834, 2037835, 2037836, 2037837, 2037838, 2037820, 2037821, 2037822, 2037823, 2037824, 2037825, 2037826, 2037827, 2037828, 2037829, 2037831", ["1139:1154:377:939"] = "2037884, 2037895, 2037902, 2037903, 2037904, 2037905, 2037906, 2037907, 2037908, 2037885, 2037886, 2037887, 2037888, 2037889, 2037890, 2037891, 2037892, 2037893, 2037894, 2037896, 2037897, 2037898, 2037899, 2037900, 2037901", ["1154:1059:1839:0"] = "2037839, 2037850, 2037857, 2037858, 2037859, 2037860, 2037861, 2037862, 2037863, 2037840, 2037841, 2037842, 2037843, 2037844, 2037845, 2037846, 2037847, 2037848, 2037849, 2037851, 2037852, 2037853, 2037854, 2037855, 2037856", ["1188:1421:933:863"] = "2037789, 2037800, 2037811, 2037813, 2037814, 2037815, 2037816, 2037817, 2037818, 2037790, 2037791, 2037792, 2037793, 2037794, 2037795, 2037796, 2037797, 2037798, 2037799, 2037801, 2037802, 2037803, 2037804, 2037805, 2037806, 2037807, 2037808, 2037809, 2037810, 2037812", ["1239:839:388:570"] = "2037864, 2037875, 2037877, 2037878, 2037879, 2037880, 2037881, 2037882, 2037883, 2037865, 2037866, 2037867, 2037868, 2037869, 2037870, 2037871, 2037872, 2037873, 2037874, 2037876", ["1373:1010:0:0"] = "2038137, 2038148, 2038154, 2038155, 2038156, 2038157, 2038158, 2038159, 2038160, 2038138, 2038139, 2038140, 2038141, 2038142, 2038143, 2038144, 2038145, 2038146, 2038147, 2038149, 2038150, 2038151, 2038152, 2038153", ["1424:1026:438:0"] = "2038197, 2038208, 2038219, 2038221, 2038222, 2038223, 2038224, 2038225, 2038226, 2038198, 2038199, 2038200, 2038201, 2038202, 2038203, 2038204, 2038205, 2038206, 2038207, 2038209, 2038210, 2038211, 2038212, 2038213, 2038214, 2038215, 2038216, 2038217, 2038218, 2038220", ["1521:1323:1212:1237"] = "2038161, 2038172, 2038183, 2038191, 2038192, 2038193, 2038194, 2038195, 2038196, 2038162, 2038163, 2038164, 2038165, 2038166, 2038167, 2038168, 2038169, 2038170, 2038171, 2038173, 2038174, 2038175, 2038176, 2038177, 2038178, 2038179, 2038180, 2038181, 2038182, 2038184, 2038185, 2038186, 2038187, 2038188, 2038189, 2038190", ["770:1181:2386:1049"] = "2038067, 2038078, 2038080, 2038081, 2038082, 2038083, 2038084, 2038085, 2038086, 2038068, 2038069, 2038070, 2038071, 2038072, 2038073, 2038074, 2038075, 2038076, 2038077, 2038079", ["948:1081:1644:361"] = "2038047, 2038058, 2038060, 2038061, 2038062, 2038063, 2038064, 2038065, 2038066, 2038048, 2038049, 2038050, 2038051, 2038052, 2038053, 2038054, 2038055, 2038056, 2038057, 2038059",}, [967] = {["1030:1134:1288:1426"] = "2033070, 2033081, 2033088, 2033089, 2033090, 2033091, 2033092, 2033093, 2033094, 2033071, 2033072, 2033073, 2033074, 2033075, 2033076, 2033077, 2033078, 2033079, 2033080, 2033082, 2033083, 2033084, 2033085, 2033086, 2033087", ["1052:1466:1918:0"] = "2033199, 2033210, 2033221, 2033223, 2033224, 2033225, 2033226, 2033227, 2033228, 2033200, 2033201, 2033202, 2033203, 2033204, 2033205, 2033206, 2033207, 2033208, 2033209, 2033211, 2033212, 2033213, 2033214, 2033215, 2033216, 2033217, 2033218, 2033219, 2033220, 2033222", ["1167:1224:1750:1336"] = "2033045, 2033056, 2033063, 2033064, 2033065, 2033066, 2033067, 2033068, 2033069, 2033046, 2033047, 2033048, 2033049, 2033050, 2033051, 2033052, 2033053, 2033054, 2033055, 2033057, 2033058, 2033059, 2033060, 2033061, 2033062", ["1325:1981:2515:0"] = "2033229, 2033240, 2033251, 2033262, 2033272, 2033273, 2033274, 2033275, 2033276, 2033230, 2033231, 2033232, 2033233, 2033234, 2033235, 2033236, 2033237, 2033238, 2033239, 2033241, 2033242, 2033243, 2033244, 2033245, 2033246, 2033247, 2033248, 2033249, 2033250, 2033252, 2033253, 2033254, 2033255, 2033256, 2033257, 2033258, 2033259, 2033260, 2033261, 2033263, 2033264, 2033265, 2033266, 2033267, 2033268, 2033269, 2033270, 2033271", ["1403:711:1153:1056"] = "2033161, 2033171, 2033172, 2033173, 2033174, 2033175, 2033176, 2033177, 2033178, 2033162, 2033163, 2033164, 2033165, 2033166, 2033167, 2033168, 2033169, 2033170", ["1628:1457:0:1103"] = "2033415, 2033426, 2033437, 2033448, 2033452, 2033453, 2033454, 2033455, 2033456, 2033416, 2033417, 2033418, 2033419, 2033420, 2033421, 2033422, 2033423, 2033424, 2033425, 2033427, 2033428, 2033429, 2033430, 2033431, 2033432, 2033433, 2033434, 2033435, 2033436, 2033438, 2033439, 2033440, 2033441, 2033442, 2033443, 2033444, 2033445, 2033446, 2033447, 2033449, 2033450, 2033451", ["1659:1491:2181:1069"] = "2033095, 2033106, 2033117, 2033128, 2033132, 2033133, 2033134, 2033135, 2033136, 2033096, 2033097, 2033098, 2033099, 2033100, 2033101, 2033102, 2033103, 2033104, 2033105, 2033107, 2033108, 2033109, 2033110, 2033111, 2033112, 2033113, 2033114, 2033115, 2033116, 2033118, 2033119, 2033120, 2033121, 2033122, 2033123, 2033124, 2033125, 2033126, 2033127, 2033129, 2033130, 2033131", ["859:1050:840:475"] = "2033179, 2033190, 2033192, 2033193, 2033194, 2033195, 2033196, 2033197, 2033198, 2033180, 2033181, 2033182, 2033183, 2033184, 2033185, 2033186, 2033187, 2033188, 2033189, 2033191", ["929:1380:1365:0"] = "2033137, 2033148, 2033154, 2033155, 2033156, 2033157, 2033158, 2033159, 2033160, 2033138, 2033139, 2033140, 2033141, 2033142, 2033143, 2033144, 2033145, 2033146, 2033147, 2033149, 2033150, 2033151, 2033152, 2033153",}, [968] = {["107:98:648:258"] = "1998395, 2018419", ["135:91:457:278"] = "2018445, 2018420", ["78:78:352:227"] = "1998396, 2018422",}, [1176] = {["105:88:425:38"] = "2481586",}, [1184] = {["1002:668:0:0"] = "2481373, 2481377, 2481378, 2481379, 2481380, 2481381, 2481382, 2481383, 2481384, 2481374, 2481375, 2481376",}, [1186] = {["1224:1131:935:1429"] = "3020691, 3020702, 3020709, 3020710, 3020711, 3020712, 3020713, 3020714, 3020715, 3020692, 3020693, 3020694, 3020695, 3020696, 3020697, 3020698, 3020699, 3020700, 3020701, 3020703, 3020704, 3020705, 3020706, 3020707, 3020708", ["1411:710:895:1151"] = "3020640, 3020650, 3020651, 3020652, 3020653, 3020654, 3020655, 3020656, 3020657, 3020641, 3020642, 3020643, 3020644, 3020645, 3020646, 3020647, 3020648, 3020649", ["510:520:1653:708"] = "3020618, 3020619, 3020620, 3020621, 3020622, 3020623", ["527:528:1987:49"] = "3020682, 3020683, 3020684, 3020685, 3020686, 3020687, 3020688, 3020689, 3020690", ["558:602:1297:693"] = "3020732, 3020733, 3020734, 3020735, 3020736, 3020737, 3020738, 3020739, 3020740", ["583:800:2321:57"] = "3020574, 3020578, 3020579, 3020580, 3020581, 3020582, 3020583, 3020584, 3020585, 3020575, 3020576, 3020577", ["648:650:1876:340"] = "3020549, 3020550, 3020551, 3020552, 3020553, 3020554, 3020555, 3020556, 3020557", ["703:905:2213:691"] = "3020658, 3020662, 3020663, 3020664, 3020665, 3020666, 3020667, 3020668, 3020669, 3020659, 3020660, 3020661", ["737:461:1570:1432"] = "3020676, 3020677, 3020678, 3020679, 3020680, 3020681", ["738:490:1007:1200"] = "3020670, 3020671, 3020672, 3020673, 3020674, 3020675", ["770:835:1110:118"] = "3020716, 3020724, 3020725, 3020726, 3020727, 3020728, 3020729, 3020730, 3020731, 3020717, 3020718, 3020719, 3020720, 3020721, 3020722, 3020723", ["783:597:2574:909"] = "3020598, 3020602, 3020603, 3020604, 3020605, 3020606, 3020607, 3020608, 3020609, 3020599, 3020600, 3020601", ["790:517:1360:1027"] = "3020586, 3020590, 3020591, 3020592, 3020593, 3020594, 3020595, 3020596, 3020597, 3020587, 3020588, 3020589", ["795:866:1863:804"] = "3020558, 3020566, 3020567, 3020568, 3020569, 3020570, 3020571, 3020572, 3020573, 3020559, 3020560, 3020561, 3020562, 3020563, 3020564, 3020565", ["815:1065:729:315"] = "3020529, 3020540, 3020542, 3020543, 3020544, 3020545, 3020546, 3020547, 3020548, 3020530, 3020531, 3020532, 3020533, 3020534, 3020535, 3020536, 3020537, 3020538, 3020539, 3020541", ["850:835:1469:50"] = "3020624, 3020632, 3020633, 3020634, 3020635, 3020636, 3020637, 3020638, 3020639, 3020625, 3020626, 3020627, 3020628, 3020629, 3020630, 3020631", ["979:480:2502:692"] = "3020610, 3020611, 3020612, 3020613, 3020614, 3020615, 3020616, 3020617", ["990:564:2490:365"] = "3020741, 3020745, 3020746, 3020747, 3020748, 3020749, 3020750, 3020751, 3020752, 3020742, 3020743, 3020744",}, [1276] = {["1009:1191:1910:557"] = "3022276, 3022287, 3022289, 3022290, 3022291, 3022292, 3022293, 3022294, 3022295, 3022277, 3022278, 3022279, 3022280, 3022281, 3022282, 3022283, 3022284, 3022285, 3022286, 3022288", ["1014:1022:2513:406"] = "3022368, 3022376, 3022377, 3022378, 3022379, 3022380, 3022381, 3022382, 3022383, 3022369, 3022370, 3022371, 3022372, 3022373, 3022374, 3022375", ["1049:1055:2791:121"] = "3022412, 3022423, 3022430, 3022431, 3022432, 3022433, 3022434, 3022435, 3022436, 3022413, 3022414, 3022415, 3022416, 3022417, 3022418, 3022419, 3022420, 3022421, 3022422, 3022424, 3022425, 3022426, 3022427, 3022428, 3022429", ["1169:1264:1154:496"] = "3022251, 3022262, 3022269, 3022270, 3022271, 3022272, 3022273, 3022274, 3022275, 3022252, 3022253, 3022254, 3022255, 3022256, 3022257, 3022258, 3022259, 3022260, 3022261, 3022263, 3022264, 3022265, 3022266, 3022267, 3022268", ["1366:1426:2172:1134"] = "3022332, 3022343, 3022354, 3022362, 3022363, 3022364, 3022365, 3022366, 3022367, 3022333, 3022334, 3022335, 3022336, 3022337, 3022338, 3022339, 3022340, 3022341, 3022342, 3022344, 3022345, 3022346, 3022347, 3022348, 3022349, 3022350, 3022351, 3022352, 3022353, 3022355, 3022356, 3022357, 3022358, 3022359, 3022360, 3022361", ["1424:1511:46:978"] = "3022437, 3022448, 3022459, 3022467, 3022468, 3022469, 3022470, 3022471, 3022472, 3022438, 3022439, 3022440, 3022441, 3022442, 3022443, 3022444, 3022445, 3022446, 3022447, 3022449, 3022450, 3022451, 3022452, 3022453, 3022454, 3022455, 3022456, 3022457, 3022458, 3022460, 3022461, 3022462, 3022463, 3022464, 3022465, 3022466", ["1479:1338:1125:1222"] = "3022296, 3022307, 3022318, 3022326, 3022327, 3022328, 3022329, 3022330, 3022331, 3022297, 3022298, 3022299, 3022300, 3022301, 3022302, 3022303, 3022304, 3022305, 3022306, 3022308, 3022309, 3022310, 3022311, 3022312, 3022313, 3022314, 3022315, 3022316, 3022317, 3022319, 3022320, 3022321, 3022322, 3022323, 3022324, 3022325", ["1723:945:1315:40"] = "3022384, 3022395, 3022405, 3022406, 3022407, 3022408, 3022409, 3022410, 3022411, 3022385, 3022386, 3022387, 3022388, 3022389, 3022390, 3022391, 3022392, 3022393, 3022394, 3022396, 3022397, 3022398, 3022399, 3022400, 3022401, 3022402, 3022403, 3022404",}, [1306] = { ["1019:737:2290:474"] = "3730584, 3730588, 3730589, 3730590, 3730591, 3730592, 3730593, 3730594, 3730595, 3730585, 3730586, 3730587", ["1030:1129:1200:1407"] = "3730837, 3730848, 3730855, 3730856, 3730857, 3730858, 3730859, 3730860, 3730861, 3730838, 3730839, 3730840, 3730841, 3730842, 3730843, 3730844, 3730845, 3730846, 3730847, 3730849, 3730850, 3730851, 3730852, 3730853, 3730854", ["1087:878:869:1682"] = "3730730, 3730741, 3730743, 3730744, 3730745, 3730746, 3730747, 3730748, 3730749, 3730731, 3730732, 3730733, 3730734, 3730735, 3730736, 3730737, 3730738, 3730739, 3730740, 3730742", ["1192:963:485:0"] = "3730707, 3730718, 3730720, 3730721, 3730725, 3730726, 3730727, 3730728, 3730729, 3730708, 3730709, 3730710, 3730711, 3730712, 3730713, 3730714, 3730715, 3730716, 3730717, 3730719", ["1207:1465:433:596"] = "3730807, 3730818, 3730829, 3730831, 3730832, 3730833, 3730834, 3730835, 3730836, 3730808, 3730809, 3730810, 3730811, 3730812, 3730813, 3730814, 3730815, 3730816, 3730817, 3730819, 3730820, 3730821, 3730822, 3730823, 3730824, 3730825, 3730826, 3730827, 3730828, 3730830", ["1339:746:1974:919"] = "3730750, 3730760, 3730761, 3730762, 3730763, 3730764, 3730765, 3730766, 3730767, 3730751, 3730752, 3730753, 3730754, 3730755, 3730756, 3730757, 3730758, 3730759", ["586:1091:1306:555"] = "3730641, 3730648, 3730649, 3730650, 3730651, 3730652, 3730653, 3730657, 3730669, 3730642, 3730643, 3730644, 3730645, 3730646, 3730647", ["685:688:1527:300"] = "3730685, 3730688, 3730690, 3730694, 3730695, 3730698, 3730701, 3730704, 3730706, 3730768, 3730769, 3730770, 3730771, 3730772, 3730773, 3730774, 3730775, 3730776", ["711:1183:1987:1377"] = "3730628, 3730633, 3730634, 3730635, 3730636, 3730637, 3730638, 3730639, 3730640, 3730629, 3730630, 3730631, 3730722, 3730723, 3730632", ["718:847:2597:1316"] = "3730596, 3730600, 3730601, 3730602, 3730603, 3730604, 3730605, 3730606, 3730607, 3730597, 3730598, 3730599", ["720:578:1487:1982"] = "3730777, 3730778, 3730779, 3730780, 3730781, 3730782, 3730783, 3730784, 3730785", ["835:1040:2324:1520"] = "3730786, 3730797, 3730799, 3730800, 3730801, 3730802, 3730803, 3730804, 3730805, 3730787, 3730788, 3730789, 3730790, 3730791, 3730792, 3730793, 3730794, 3730795, 3730796, 3730798", ["885:1060:1647:484"] = "3730608, 3730619, 3730621, 3730622, 3730623, 3730624, 3730625, 3730626, 3730627, 3730609, 3730610, 3730611, 3730612, 3730613, 3730614, 3730615, 3730616, 3730617, 3730618, 3730620", }, [1321] = { ["1115:704:881:993"] = "3192874, 3192881, 3192882, 3192883, 3192884, 3192885, 3192886, 3192887, 3192888, 3192875, 3192876, 3192877, 3192878, 3192879, 3192880", ["1357:856:495:250"] = "3192889, 3192900, 3192906, 3192907, 3192908, 3192909, 3192910, 3192911, 3192912, 3192890, 3192891, 3192892, 3192893, 3192894, 3192895, 3192896, 3192897, 3192898, 3192899, 3192901, 3192902, 3192903, 3192904, 3192905", ["591:503:1566:1551"] = "3192856, 3192857, 3192858, 3192859, 3192860, 3192861", ["746:528:1793:1220"] = "3192941, 3192942, 3192943, 3192944, 3192945, 3192946, 3192947, 3192948, 3192949", ["783:542:1167:1387"] = "3192986, 3192990, 3192991, 3192992, 3192993, 3192994, 3192995, 3192996, 3192997, 3192987, 3192988, 3192989", ["804:564:1626:1949"] = "3192862, 3192866, 3192867, 3192868, 3192869, 3192870, 3192871, 3192872, 3192873, 3192863, 3192864, 3192865", ["826:494:2004:1590"] = "3192962, 3192963, 3192964, 3192965, 3192966, 3192967, 3192968, 3192969", ["839:558:1068:1768"] = "3192998, 3193002, 3193003, 3193004, 3193005, 3193006, 3193007, 3193008, 3193009, 3192999, 3193000, 3193001", ["881:911:2110:588"] = "3192970, 3192978, 3192979, 3192980, 3192981, 3192982, 3192983, 3192984, 3192985, 3192971, 3192972, 3192973, 3192974, 3192975, 3192976, 3192977", ["892:763:1975:155"] = "3192913, 3192917, 3192918, 3192919, 3192920, 3192921, 3192922, 3192923, 3192924, 3192914, 3192915, 3192916", ["984:847:1400:48"] = "3192925, 3192933, 3192934, 3192935, 3192936, 3192937, 3192938, 3192939, 3192940, 3192926, 3192927, 3192928, 3192929, 3192930, 3192931, 3192932", ["985:652:1475:706"] = "3192950, 3192954, 3192955, 3192956, 3192957, 3192958, 3192959, 3192960, 3192961, 3192951, 3192952, 3192953", }, [1323] = { ["1149:703:284:1085"] = "3745117, 3745124, 3745125, 3745126, 3745127, 3745128, 3745129, 3745130, 3745131, 3745118, 3745119, 3745120, 3745121, 3745122, 3745123", ["1194:998:2438:785"] = "3745289, 3745300, 3745302, 3745303, 3745304, 3745305, 3745306, 3745307, 3745308, 3745290, 3745291, 3745292, 3745293, 3745294, 3745295, 3745296, 3745297, 3745298, 3745299, 3745301", ["1231:1391:261:65"] = "3745353, 3745364, 3745375, 3745377, 3745378, 3745379, 3745380, 3745381, 3745382, 3745354, 3745355, 3745356, 3745357, 3745358, 3745359, 3745360, 3745361, 3745362, 3745363, 3745365, 3745366, 3745367, 3745368, 3745369, 3745370, 3745371, 3745372, 3745373, 3745374, 3745376", ["1363:1137:2232:13"] = "3745189, 3745200, 3745211, 3745213, 3745214, 3745215, 3745216, 3745217, 3745218, 3745190, 3745191, 3745192, 3745193, 3745194, 3745195, 3745196, 3745197, 3745198, 3745199, 3745201, 3745202, 3745203, 3745204, 3745205, 3745206, 3745207, 3745208, 3745209, 3745210, 3745212", ["1508:1209:330:1351"] = "3745219, 3745230, 3745241, 3745243, 3745244, 3745245, 3745246, 3745247, 3745248, 3745220, 3745221, 3745222, 3745223, 3745224, 3745225, 3745226, 3745227, 3745228, 3745229, 3745231, 3745232, 3745233, 3745234, 3745235, 3745236, 3745237, 3745238, 3745239, 3745240, 3745242", ["1925:1136:1582:1424"] = "3745249, 3745260, 3745271, 3745282, 3745284, 3745285, 3745286, 3745287, 3745288, 3745250, 3745251, 3745252, 3745253, 3745254, 3745255, 3745256, 3745257, 3745258, 3745259, 3745261, 3745262, 3745263, 3745264, 3745265, 3745266, 3745267, 3745268, 3745269, 3745270, 3745272, 3745273, 3745274, 3745275, 3745276, 3745277, 3745278, 3745279, 3745280, 3745281, 3745283", ["673:788:1171:836"] = "3745341, 3745345, 3745346, 3745347, 3745348, 3745349, 3745350, 3745351, 3745352, 3745342, 3745343, 3745344", ["694:666:1815:517"] = "3745132, 3745133, 3745134, 3745135, 3745136, 3745137, 3745138, 3745139, 3745140", ["719:802:2028:894"] = "3745141, 3745145, 3745146, 3745147, 3745148, 3745149, 3745150, 3745151, 3745152, 3745142, 3745143, 3745144", ["730:730:1566:862"] = "3745383, 3745384, 3745385, 3745386, 3745387, 3745388, 3745389, 3745390, 3745391", ["757:985:1551:1342"] = "3745309, 3745313, 3745314, 3745315, 3745316, 3745317, 3745318, 3745319, 3745320, 3745310, 3745311, 3745312", ["858:1178:1202:0"] = "3745321, 3745332, 3745334, 3745335, 3745336, 3745337, 3745338, 3745339, 3745340, 3745322, 3745323, 3745324, 3745325, 3745326, 3745327, 3745328, 3745329, 3745330, 3745331, 3745333", ["932:919:1692:0"] = "3745173, 3745181, 3745182, 3745183, 3745184, 3745185, 3745186, 3745187, 3745188, 3745174, 3745175, 3745176, 3745177, 3745178, 3745179, 3745180", ["951:1071:631:46"] = "3745153, 3745164, 3745166, 3745167, 3745168, 3745169, 3745170, 3745171, 3745172, 3745154, 3745155, 3745156, 3745157, 3745158, 3745159, 3745160, 3745161, 3745162, 3745163, 3745165", }, [1329] = { ["1009:835:1442:1262"] = "3745832, 3745840, 3745841, 3745842, 3745843, 3745844, 3745845, 3745846, 3745847, 3745833, 3745834, 3745835, 3745836, 3745837, 3745838, 3745839", ["1053:934:49:918"] = "3745893, 3745904, 3745906, 3745907, 3745908, 3745909, 3745910, 3745911, 3745912, 3745894, 3745895, 3745896, 3745897, 3745898, 3745899, 3745900, 3745901, 3745902, 3745903, 3745905", ["1078:824:772:598"] = "3746082, 3746093, 3746095, 3746096, 3746097, 3746098, 3746099, 3746100, 3746101, 3746083, 3746084, 3746085, 3746086, 3746087, 3746088, 3746089, 3746090, 3746091, 3746092, 3746094", ["1186:821:1100:696"] = "3745873, 3745884, 3745886, 3745887, 3745888, 3745889, 3745890, 3745891, 3745892, 3745874, 3745875, 3745876, 3745877, 3745878, 3745879, 3745880, 3745881, 3745882, 3745883, 3745885", ["1232:1236:0:342"] = "3745848, 3745859, 3745866, 3745867, 3745868, 3745869, 3745870, 3745871, 3745872, 3745849, 3745850, 3745851, 3745852, 3745853, 3745854, 3745855, 3745856, 3745857, 3745858, 3745860, 3745861, 3745862, 3745863, 3745864, 3745865", ["1395:932:183:0"] = "3746024, 3746035, 3746041, 3746042, 3746043, 3746044, 3746045, 3746046, 3746047, 3746025, 3746026, 3746027, 3746028, 3746029, 3746030, 3746031, 3746032, 3746033, 3746034, 3746036, 3746037, 3746038, 3746039, 3746040", ["1408:988:1856:1572"] = "3746048, 3746059, 3746065, 3746066, 3746067, 3746068, 3746069, 3746070, 3746071, 3746049, 3746050, 3746051, 3746052, 3746053, 3746054, 3746055, 3746056, 3746057, 3746058, 3746060, 3746061, 3746062, 3746063, 3746064", ["1488:1946:1797:0"] = "3745913, 3745924, 3745935, 3745948, 3745959, 3745960, 3745961, 3745962, 3745963, 3745914, 3745915, 3745916, 3745917, 3745918, 3745919, 3745920, 3745921, 3745922, 3745923, 3745925, 3745926, 3745927, 3745928, 3745929, 3745930, 3745931, 3745932, 3745933, 3745934, 3745936, 3745937, 3745938, 3745939, 3745940, 3745942, 3745943, 3745944, 3745946, 3745947, 3745949, 3745950, 3745951, 3745953, 3745954, 3745955, 3745956, 3745957, 3745958", ["1504:929:1171:0"] = "3745964, 3745975, 3745981, 3745982, 3745983, 3745984, 3745985, 3745986, 3745987, 3745965, 3745966, 3745967, 3745968, 3745969, 3745970, 3745971, 3745972, 3745973, 3745974, 3745976, 3745977, 3745978, 3745979, 3745980", ["928:1359:808:1201"] = "3746000, 3746011, 3746017, 3746018, 3746019, 3746020, 3746021, 3746022, 3746023, 3746001, 3746002, 3746003, 3746004, 3746005, 3746006, 3746007, 3746008, 3746009, 3746010, 3746012, 3746013, 3746014, 3746015, 3746016", ["928:729:1404:1831"] = "3745988, 3745992, 3745993, 3745994, 3745995, 3745996, 3745997, 3745998, 3745999, 3745989, 3745990, 3745991", ["954:1076:262:1423"] = "3745812, 3745823, 3745825, 3745826, 3745827, 3745828, 3745829, 3745830, 3745831, 3745813, 3745814, 3745815, 3745816, 3745817, 3745818, 3745819, 3745820, 3745821, 3745822, 3745824", }, [1338] = { ["1179:1340:379:811"] = "3604311, 3604322, 3604333, 3604335, 3604336, 3604337, 3604338, 3604339, 3604340, 3604312, 3604313, 3604314, 3604315, 3604316, 3604317, 3604318, 3604319, 3604320, 3604321, 3604323, 3604324, 3604325, 3604326, 3604327, 3604328, 3604329, 3604330, 3604331, 3604332, 3604334", ["563:685:2107:638"] = "3604377, 3604378, 3604379, 3604380, 3604381, 3604382, 3604383, 3604384, 3604385", ["669:747:1993:885"] = "3604302, 3604303, 3604304, 3604305, 3604306, 3604307, 3604308, 3604309, 3604310", ["686:742:1487:945"] = "3604293, 3604294, 3604295, 3604296, 3604297, 3604298, 3604299, 3604300, 3604301", ["688:1139:1679:54"] = "3604262, 3604269, 3604270, 3604271, 3604272, 3604273, 3604274, 3604275, 3604276, 3604263, 3604264, 3604265, 3604266, 3604267, 3604268", ["770:603:1736:1234"] = "3604341, 3604345, 3604346, 3604347, 3604348, 3604349, 3604350, 3604351, 3604352, 3604342, 3604343, 3604344", ["798:896:1701:1607"] = "3604277, 3604285, 3604286, 3604287, 3604288, 3604289, 3604290, 3604291, 3604292, 3604278, 3604279, 3604280, 3604281, 3604282, 3604283, 3604284", ["803:645:2211:168"] = "3604353, 3604357, 3604358, 3604359, 3604360, 3604361, 3604362, 3604363, 3604364, 3604354, 3604355, 3604356", ["845:1048:1190:1242"] = "3604226, 3604237, 3604239, 3604240, 3604241, 3604242, 3604243, 3604244, 3604245, 3604227, 3604228, 3604229, 3604230, 3604231, 3604232, 3604233, 3604234, 3604235, 3604236, 3604238", ["847:783:1036:316"] = "3604198, 3604206, 3604207, 3604208, 3604209, 3604210, 3604211, 3604212, 3604213, 3604199, 3604200, 3604201, 3604202, 3604203, 3604204, 3604205", ["864:650:946:723"] = "3604365, 3604369, 3604370, 3604371, 3604372, 3604373, 3604374, 3604375, 3604376, 3604366, 3604367, 3604368", ["886:821:2339:1049"] = "3604246, 3604254, 3604255, 3604256, 3604257, 3604258, 3604259, 3604260, 3604261, 3604247, 3604248, 3604249, 3604250, 3604251, 3604252, 3604253", ["904:714:2338:474"] = "3604214, 3604218, 3604219, 3604220, 3604221, 3604222, 3604223, 3604224, 3604225, 3604215, 3604216, 3604217", }, [1342] = { ["438:658:0:0"] = "3155826, 3155827, 3155828, 3155829, 3155830, 3155831", ["604:636:11:0"] = "3155832, 3155833, 3155834, 3155835, 3155836, 3155837, 3155838, 3155839, 3155840", ["613:558:315:31"] = "3155841, 3155842, 3155843, 3155844, 3155845, 3155846, 3155847, 3155848, 3155849", }, [1343] = { ["448:651:328:7"] = "3165092, 3165093, 3165094, 3165095, 3165096, 3165097", ["504:602:448:0"] = "3165098, 3165099, 3165100, 3165101, 3165102, 3165103", ["575:570:61:0"] = "3165083, 3165084, 3165085, 3165086, 3165087, 3165088, 3165089, 3165090, 3165091", }, [1375] = { ["1022:918:1693:66"] = "3767907, 3767922, 3767924, 3767926, 3767928, 3767930, 3767932, 3767934, 3767936, 3767909, 3767911, 3767913, 3767915, 3767916, 3767918, 3767920", ["1064:818:1982:1742"] = "3768002, 3768023, 3768027, 3768029, 3768031, 3768033, 3768035, 3768036, 3768038, 3768004, 3768006, 3768008, 3768010, 3768012, 3768014, 3768016, 3768017, 3768019, 3768021, 3768025", ["1539:723:577:1835"] = "3767961, 3767983, 3767989, 3767991, 3767993, 3767995, 3767997, 3767998, 3768000, 3767963, 3767965, 3767967, 3767970, 3767971, 3767973, 3767975, 3767977, 3767979, 3767981, 3767985, 3767987", ["1875:1551:1167:485"] = "3768040, 3768062, 3768083, 3768105, 3768126, 3768141, 3768143, 3768145, 3768147, 3768042, 3768044, 3768046, 3768048, 3768050, 3768052, 3768054, 3768056, 3768058, 3768060, 3768064, 3768066, 3768068, 3768070, 3768072, 3768074, 3768076, 3768077, 3768079, 3768081, 3768085, 3768087, 3768089, 3768091, 3768093, 3768095, 3768097, 3768099, 3768101, 3768103, 3768107, 3768109, 3768111, 3768113, 3768115, 3768117, 3768119, 3768121, 3768123, 3768124, 3768128, 3768130, 3768132, 3768134, 3768136, 3768138, 3768139", ["636:1035:1207:9"] = "3767878, 3767891, 3767893, 3767895, 3767897, 3767899, 3767901, 3767903, 3767905, 3767879, 3767881, 3767883, 3767885, 3767887, 3767889", ["665:937:594:1017"] = "3767938, 3767945, 3767947, 3767949, 3767951, 3767953, 3767955, 3767957, 3767959, 3767940, 3767942, 3767943", ["699:1107:677:56"] = "3767848, 3767862, 3767864, 3767866, 3767868, 3767870, 3767872, 3767874, 3767876, 3767850, 3767852, 3767854, 3767856, 3767858, 3767860", }, [1376] = { ["1033:709:1363:1189"] = "3770207, 3770214, 3770215, 3770216, 3770217, 3770218, 3770219, 3770220, 3770221, 3770208, 3770209, 3770210, 3770211, 3770212, 3770213", ["1046:464:1356:892"] = "3770146, 3770148, 3770149, 3770150, 3770151, 3770152, 3770153, 3770154, 3770155, 3770147", ["1392:979:1382:1562"] = "3770228, 3770239, 3770245, 3770246, 3770247, 3770248, 3770249, 3770250, 3770251, 3770229, 3770230, 3770231, 3770232, 3770233, 3770234, 3770235, 3770236, 3770237, 3770238, 3770240, 3770241, 3770242, 3770243, 3770244", ["476:725:2283:1231"] = "3770222, 3770223, 3770224, 3770225, 3770226, 3770227", ["537:1134:2214:233"] = "3770172, 3770179, 3770180, 3770181, 3770182, 3770183, 3770184, 3770185, 3770186, 3770173, 3770174, 3770175, 3770176, 3770177, 3770178", ["718:769:961:26"] = "3770043, 3770114, 3770116, 3770118, 3770120, 3770122, 3770124, 3770126, 3770128, 3770045, 3770047, 3770049", ["846:1103:642:1186"] = "3770187, 3770198, 3770200, 3770201, 3770202, 3770203, 3770204, 3770205, 3770206, 3770188, 3770189, 3770190, 3770191, 3770192, 3770193, 3770194, 3770195, 3770196, 3770197, 3770199", ["943:977:1383:26"] = "3770156, 3770164, 3770165, 3770166, 3770167, 3770168, 3770169, 3770170, 3770171, 3770157, 3770158, 3770159, 3770160, 3770161, 3770162, 3770163", ["996:680:723:659"] = "3770129, 3770136, 3770137, 3770138, 3770139, 3770140, 3770141, 3770144, 3770145, 3770132, 3770134, 3770135", }, [1377] = { ["1028:1024:1472:1536"] = "3771119, 3771133, 3771135, 3771136, 3771137, 3771138, 3771139, 3771140, 3771141, 3771120, 3771121, 3771122, 3771126, 3771127, 3771128, 3771129, 3771130, 3771131, 3771132, 3771134", ["1080:487:1809:585"] = "3771091, 3771093, 3771094, 3771095, 3771096, 3771097, 3771098, 3771099, 3771100, 3771092", ["1434:734:1483:920"] = "3771101, 3771111, 3771112, 3771113, 3771114, 3771115, 3771116, 3771117, 3771118, 3771102, 3771103, 3771104, 3771105, 3771106, 3771107, 3771108, 3771109, 3771110", ["535:705:1779:0"] = "3771050, 3771051, 3771052, 3771053, 3771054, 3771055, 3771056, 3771057, 3771058", ["940:647:970:158"] = "3771059, 3771063, 3771064, 3771065, 3771066, 3771067, 3771068, 3771069, 3771070, 3771060, 3771061, 3771062", ["983:1029:960:617"] = "3771071, 3771082, 3771084, 3771085, 3771086, 3771087, 3771088, 3771089, 3771090, 3771072, 3771073, 3771074, 3771075, 3771076, 3771077, 3771078, 3771079, 3771080, 3771081, 3771083", }, [1378] = { ["1058:629:2050:189"] = "3771407, 3771414, 3771415, 3771416, 3771417, 3771418, 3771419, 3771420, 3771421, 3771408, 3771409, 3771410, 3771411, 3771412, 3771413", ["1134:804:1039:30"] = "3771422, 3771433, 3771435, 3771436, 3771437, 3771438, 3771439, 3771440, 3771441, 3771423, 3771424, 3771425, 3771426, 3771427, 3771428, 3771429, 3771430, 3771431, 3771432, 3771434", ["1456:869:1004:1691"] = "3771466, 3771477, 3771483, 3771484, 3771485, 3771486, 3771487, 3771488, 3771489, 3771467, 3771468, 3771469, 3771470, 3771471, 3771472, 3771473, 3771474, 3771475, 3771476, 3771478, 3771479, 3771480, 3771481, 3771482", ["571:1007:2339:1553"] = "3771526, 3771530, 3771531, 3771532, 3771533, 3771534, 3771535, 3771536, 3771537, 3771527, 3771528, 3771529", ["830:1232:1660:728"] = "3771490, 3771501, 3771503, 3771504, 3771505, 3771506, 3771507, 3771508, 3771509, 3771491, 3771492, 3771493, 3771494, 3771495, 3771496, 3771497, 3771498, 3771499, 3771500, 3771502", ["889:972:2008:697"] = "3771510, 3771518, 3771519, 3771520, 3771521, 3771522, 3771523, 3771524, 3771525, 3771511, 3771512, 3771513, 3771514, 3771515, 3771516, 3771517", ["988:1315:788:648"] = "3771442, 3771453, 3771459, 3771460, 3771461, 3771462, 3771463, 3771464, 3771465, 3771443, 3771444, 3771445, 3771446, 3771447, 3771448, 3771449, 3771450, 3771451, 3771452, 3771454, 3771455, 3771456, 3771457, 3771458", }, [1379] = { ["1173:780:815:1389"] = "3771635, 3771646, 3771648, 3771649, 3771650, 3771651, 3771652, 3771653, 3771654, 3771636, 3771637, 3771638, 3771639, 3771640, 3771641, 3771642, 3771643, 3771644, 3771645, 3771647", ["1369:1087:832:428"] = "3771589, 3771600, 3771611, 3771613, 3771614, 3771615, 3771616, 3771617, 3771618, 3771590, 3771591, 3771592, 3771593, 3771594, 3771595, 3771596, 3771597, 3771598, 3771599, 3771601, 3771602, 3771603, 3771604, 3771605, 3771606, 3771607, 3771608, 3771609, 3771610, 3771612", ["1795:555:798:1995"] = "3771655, 3771666, 3771672, 3771673, 3771674, 3771675, 3771676, 3771677, 3771678, 3771656, 3771657, 3771658, 3771659, 3771660, 3771661, 3771662, 3771663, 3771664, 3771665, 3771667, 3771668, 3771669, 3771670, 3771671", ["508:1023:834:38"] = "3771554, 3771555, 3771556, 3771557, 3771558, 3771559, 3771560, 3771561", ["589:1233:2053:6"] = "3771574, 3771581, 3771582, 3771583, 3771584, 3771585, 3771586, 3771587, 3771588, 3771575, 3771576, 3771577, 3771578, 3771579, 3771580", ["957:536:1215:16"] = "3771562, 3771566, 3771567, 3771568, 3771569, 3771570, 3771571, 3771572, 3771573, 3771563, 3771564, 3771565", ["983:970:1869:1134"] = "3771619, 3771627, 3771628, 3771629, 3771630, 3771631, 3771632, 3771633, 3771634, 3771620, 3771621, 3771622, 3771623, 3771624, 3771625, 3771626", }, [1381] = { ["1005:1040:1728:1510"] = "3772384, 3772395, 3772397, 3772398, 3772399, 3772400, 3772401, 3772402, 3772403, 3772385, 3772386, 3772387, 3772388, 3772389, 3772390, 3772391, 3772392, 3772393, 3772394, 3772396", ["1016:785:814:1775"] = "3772359, 3772367, 3772368, 3772369, 3772370, 3772371, 3772372, 3772373, 3772374, 3772360, 3772361, 3772362, 3772363, 3772364, 3772365, 3772366", ["1158:1228:1936:397"] = "3772273, 3772284, 3772291, 3772292, 3772293, 3772294, 3772295, 3772296, 3772297, 3772274, 3772275, 3772276, 3772277, 3772278, 3772279, 3772280, 3772281, 3772282, 3772283, 3772285, 3772286, 3772287, 3772288, 3772289, 3772290", ["444:1283:1913:873"] = "3772307, 3772311, 3772312, 3772313, 3772314, 3772315, 3772316, 3772317, 3772318, 3772308, 3772309, 3772310", ["696:779:1766:0"] = "3772261, 3772265, 3772266, 3772267, 3772268, 3772269, 3772270, 3772271, 3772272, 3772262, 3772263, 3772264", ["742:686:1275:1523"] = "3772375, 3772376, 3772377, 3772378, 3772379, 3772380, 3772381, 3772382, 3772383", ["746:747:2499:1054"] = "3772298, 3772299, 3772300, 3772301, 3772302, 3772303, 3772304, 3772305, 3772306", ["840:553:553:1330"] = "3772347, 3772351, 3772352, 3772353, 3772354, 3772355, 3772356, 3772357, 3772358, 3772348, 3772349, 3772350", ["863:770:1284:902"] = "3772319, 3772327, 3772328, 3772329, 3772330, 3772331, 3772332, 3772333, 3772334, 3772320, 3772321, 3772322, 3772323, 3772324, 3772325, 3772326", ["976:734:656:695"] = "3772335, 3772339, 3772340, 3772341, 3772342, 3772343, 3772344, 3772345, 3772346, 3772336, 3772337, 3772338", }, [1382] = { ["1050:870:890:47"] = "3772457, 3772468, 3772470, 3772471, 3772472, 3772473, 3772474, 3772475, 3772476, 3772458, 3772459, 3772460, 3772461, 3772462, 3772463, 3772464, 3772465, 3772466, 3772467, 3772469", ["1084:1084:2444:436"] = "3772404, 3772415, 3772422, 3772423, 3772424, 3772425, 3772426, 3772427, 3772428, 3772405, 3772406, 3772407, 3772408, 3772409, 3772410, 3772411, 3772412, 3772413, 3772414, 3772416, 3772417, 3772418, 3772419, 3772420, 3772421", ["1165:810:963:1719"] = "3772507, 3772518, 3772520, 3772521, 3772522, 3772523, 3772524, 3772525, 3772526, 3772508, 3772509, 3772510, 3772511, 3772512, 3772513, 3772514, 3772515, 3772516, 3772517, 3772519", ["1447:1179:653:680"] = "3772477, 3772488, 3772499, 3772501, 3772502, 3772503, 3772504, 3772505, 3772506, 3772478, 3772479, 3772480, 3772481, 3772482, 3772483, 3772484, 3772485, 3772486, 3772487, 3772489, 3772490, 3772491, 3772492, 3772493, 3772494, 3772495, 3772496, 3772497, 3772498, 3772500", ["848:1116:237:1426"] = "3772527, 3772538, 3772540, 3772541, 3772542, 3772543, 3772544, 3772545, 3772546, 3772528, 3772529, 3772530, 3772531, 3772532, 3772533, 3772534, 3772535, 3772536, 3772537, 3772539", ["959:1721:1631:40"] = "3772429, 3772440, 3772450, 3772451, 3772452, 3772453, 3772454, 3772455, 3772456, 3772430, 3772431, 3772432, 3772433, 3772434, 3772435, 3772436, 3772437, 3772438, 3772439, 3772441, 3772442, 3772443, 3772444, 3772445, 3772446, 3772447, 3772448, 3772449", }, [1383] = { ["565:1404:1748:591"] = "3774161, 3774171, 3774172, 3774173, 3774174, 3774175, 3774176, 3774177, 3774178, 3774162, 3774163, 3774164, 3774165, 3774166, 3774167, 3774168, 3774169, 3774170", ["677:1389:1198:595"] = "3774179, 3774189, 3774190, 3774191, 3774192, 3774193, 3774194, 3774195, 3774196, 3774180, 3774181, 3774182, 3774183, 3774184, 3774185, 3774186, 3774187, 3774188", ["792:1469:1817:173"] = "3774217, 3774228, 3774234, 3774235, 3774236, 3774237, 3774238, 3774239, 3774240, 3774218, 3774219, 3774220, 3774221, 3774222, 3774223, 3774224, 3774225, 3774226, 3774227, 3774229, 3774230, 3774231, 3774232, 3774233", ["802:1035:1336:1500"] = "3774197, 3774208, 3774210, 3774211, 3774212, 3774213, 3774214, 3774215, 3774216, 3774198, 3774199, 3774200, 3774201, 3774202, 3774203, 3774204, 3774205, 3774206, 3774207, 3774209", }, [1386] = { ["1114:879:1161:1076"] = "3774335, 3774346, 3774348, 3774349, 3774350, 3774351, 3774352, 3774353, 3774354, 3774336, 3774337, 3774338, 3774339, 3774340, 3774341, 3774342, 3774343, 3774344, 3774345, 3774347", ["1290:756:833:1754"] = "3774367, 3774377, 3774378, 3774379, 3774380, 3774381, 3774382, 3774383, 3774384, 3774368, 3774369, 3774370, 3774371, 3774372, 3774373, 3774374, 3774375, 3774376", ["519:902:1306:384"] = "3774323, 3774327, 3774328, 3774329, 3774330, 3774331, 3774332, 3774333, 3774334, 3774324, 3774325, 3774326", ["688:1013:786:529"] = "3774311, 3774315, 3774316, 3774317, 3774318, 3774319, 3774320, 3774321, 3774322, 3774312, 3774313, 3774314", ["835:1344:1710:388"] = "3774287, 3774298, 3774304, 3774305, 3774306, 3774307, 3774308, 3774309, 3774310, 3774288, 3774289, 3774290, 3774291, 3774292, 3774293, 3774294, 3774295, 3774296, 3774297, 3774299, 3774300, 3774301, 3774302, 3774303", ["931:654:858:1427"] = "3774355, 3774359, 3774360, 3774361, 3774362, 3774363, 3774364, 3774365, 3774366, 3774356, 3774357, 3774358", ["999:1527:1955:22"] = "3774263, 3774274, 3774280, 3774281, 3774282, 3774283, 3774284, 3774285, 3774286, 3774264, 3774265, 3774266, 3774267, 3774268, 3774269, 3774270, 3774271, 3774272, 3774273, 3774275, 3774276, 3774277, 3774278, 3774279", }, [1389] = { ["1044:733:1741:1635"] = "3776647, 3776654, 3776655, 3776656, 3776657, 3776658, 3776659, 3776660, 3776661, 3776648, 3776649, 3776650, 3776651, 3776652, 3776653", ["1370:940:1943:26"] = "3776574, 3776585, 3776591, 3776592, 3776593, 3776594, 3776595, 3776596, 3776597, 3776575, 3776576, 3776577, 3776578, 3776579, 3776580, 3776581, 3776582, 3776583, 3776584, 3776586, 3776587, 3776588, 3776589, 3776590", ["1439:1606:483:810"] = "3776662, 3776673, 3776684, 3776695, 3776699, 3776700, 3776701, 3776702, 3776703, 3776663, 3776664, 3776665, 3776666, 3776667, 3776668, 3776669, 3776670, 3776671, 3776672, 3776674, 3776675, 3776676, 3776677, 3776678, 3776679, 3776680, 3776681, 3776682, 3776683, 3776685, 3776686, 3776687, 3776688, 3776689, 3776690, 3776691, 3776692, 3776693, 3776694, 3776696, 3776697, 3776698", ["1873:1221:1807:812"] = "3776598, 3776609, 3776620, 3776631, 3776633, 3776634, 3776635, 3776636, 3776637, 3776599, 3776600, 3776601, 3776602, 3776603, 3776604, 3776605, 3776606, 3776607, 3776608, 3776610, 3776611, 3776612, 3776613, 3776614, 3776615, 3776616, 3776617, 3776618, 3776619, 3776621, 3776622, 3776623, 3776624, 3776625, 3776626, 3776627, 3776628, 3776629, 3776630, 3776632", ["603:579:1819:1159"] = "3776638, 3776639, 3776640, 3776641, 3776642, 3776643, 3776644, 3776645, 3776646", ["842:1244:400:1273"] = "3776704, 3776715, 3776717, 3776718, 3776719, 3776720, 3776721, 3776722, 3776723, 3776705, 3776706, 3776707, 3776708, 3776709, 3776710, 3776711, 3776712, 3776713, 3776714, 3776716", }, [1393] = { ["1048:440:1238:1099"] = "3776981, 3776983, 3776984, 3776985, 3776986, 3776987, 3776988, 3776989, 3776990, 3776982", ["1131:960:1605:57"] = "3776941, 3776952, 3776954, 3776955, 3776956, 3776957, 3776958, 3776959, 3776960, 3776942, 3776943, 3776944, 3776945, 3776946, 3776947, 3776948, 3776949, 3776950, 3776951, 3776953", ["839:1123:1484:1437"] = "3776991, 3777002, 3777004, 3777005, 3777006, 3777007, 3777008, 3777009, 3777010, 3776992, 3776993, 3776994, 3776995, 3776996, 3776997, 3776998, 3776999, 3777000, 3777001, 3777003", ["861:668:1943:914"] = "3776969, 3776973, 3776974, 3776975, 3776976, 3776977, 3776978, 3776979, 3776980, 3776970, 3776971, 3776972", ["951:400:1250:800"] = "3776961, 3776962, 3776963, 3776964, 3776965, 3776966, 3776967, 3776968", }, [1439] = { ["294:330:2036:1272"] = "3719472, 3719473, 3719474, 3719475", ["298:270:1381:453"] = "3719397, 3719398, 3719399, 3719400", ["303:279:1657:1012"] = "3719437, 3719438, 3719439, 3719440", ["337:359:2229:426"] = "3719413, 3719414, 3719415, 3719416", ["337:394:1378:674"] = "3719421, 3719422, 3719423, 3719424", ["339:534:2224:1619"] = "3719507, 3719508, 3719509, 3719510, 3719511, 3719512", ["344:389:2232:676"] = "3719425, 3719426, 3719427, 3719428", ["371:388:1394:1244"] = "3719464, 3719465, 3719466, 3719467", ["375:378:1102:400"] = "3719393, 3719394, 3719395, 3719396", ["377:402:1385:1520"] = "3719480, 3719481, 3719482, 3719483", ["383:389:1099:679"] = "3719417, 3719418, 3719419, 3719420", ["383:404:1104:1519"] = "3719476, 3719477, 3719478, 3719479", ["384:335:1379:957"] = "3719433, 3719434, 3719435, 3719436", ["387:328:1113:167"] = "3719386, 3719387, 3719388, 3719389", ["387:763:2225:960"] = "3719454, 3719455, 3719456, 3719457, 3719458, 3719459", ["457:334:989:1295"] = "3719460, 3719461, 3719462, 3719463", ["474:430:1855:933"] = "3719441, 3719442, 3719443, 3719451", ["487:419:1656:1228"] = "3719468, 3719469, 3719470, 3719471", ["502:321:975:961"] = "3719429, 3719430, 3719431, 3719432", ["572:338:1101:1815"] = "3719484, 3719485, 3719486, 3719487, 3719488, 3719489", ["749:786:1582:204"] = "3719401, 3719405, 3719406, 3719407, 3719408, 3719409, 3719410, 3719411, 3719412, 3719402, 3719403, 3719404", ["763:854:1568:1575"] = "3719490, 3719494, 3719500, 3719501, 3719502, 3719503, 3719504, 3719505, 3719506, 3719491, 3719492, 3719493", }, [1453] = { ["252:240:273:411"] = "3754203", }, [1464] = { ["1520:1017:1483:1230"] = "3765000, 3765011, 3765017, 3765018, 3765019, 3765020, 3765021, 3765022, 3765023, 3765001, 3765002, 3765003, 3765004, 3765005, 3765006, 3765007, 3765008, 3765009, 3765010, 3765012, 3765013, 3765014, 3765015, 3765016", ["2447:1356:600:85"] = "3764928, 3764939, 3764950, 3764961, 3764972, 3764983, 3764985, 3764986, 3764987, 3764929, 3764930, 3764931, 3764932, 3764933, 3764934, 3764935, 3764936, 3764937, 3764938, 3764940, 3764941, 3764942, 3764943, 3764944, 3764945, 3764946, 3764947, 3764948, 3764949, 3764951, 3764952, 3764953, 3764954, 3764955, 3764956, 3764957, 3764958, 3764959, 3764960, 3764962, 3764963, 3764964, 3764965, 3764966, 3764967, 3764968, 3764969, 3764970, 3764971, 3764973, 3764974, 3764975, 3764976, 3764977, 3764978, 3764979, 3764980, 3764981, 3764982, 3764984", ["651:949:2373:1518"] = "3765024, 3765028, 3765029, 3765030, 3765031, 3765032, 3765033, 3765034, 3765035, 3765025, 3765026, 3765027", ["792:729:1413:1021"] = "3764988, 3764992, 3764993, 3764994, 3764995, 3764996, 3764997, 3764998, 3764999, 3764989, 3764990, 3764991", }, [1465] = { ["1038:725:1140:184"] = "3765210, 3765224, 3765226, 3765228, 3765230, 3765236, 3765238, 3765240, 3765242, 3765213, 3765215, 3765217, 3765218, 3765220, 3765222", ["1134:710:1143:1198"] = "3765274, 3765288, 3765290, 3765292, 3765294, 3765296, 3765298, 3765300, 3765302, 3765276, 3765278, 3765280, 3765282, 3765284, 3765286", ["1135:615:1120:749"] = "3765244, 3765258, 3765260, 3765262, 3765264, 3765266, 3765268, 3765270, 3765272, 3765246, 3765248, 3765250, 3765252, 3765254, 3765256", ["823:808:1474:1747"] = "3765304, 3765320, 3765322, 3765324, 3765326, 3765328, 3765330, 3765332, 3765334, 3765306, 3765308, 3765310, 3765312, 3765314, 3765316, 3765318", }, [1474] = { ["1079:1464:756:212"] = "3779767, 3779778, 3779789, 3779791, 3779792, 3779793, 3779794, 3779795, 3779796, 3779768, 3779769, 3779770, 3779771, 3779772, 3779773, 3779774, 3779775, 3779776, 3779777, 3779779, 3779780, 3779781, 3779782, 3779783, 3779784, 3779785, 3779786, 3779787, 3779788, 3779790", ["1094:978:1710:1545"] = "3779817, 3779828, 3779830, 3779831, 3779832, 3779833, 3779834, 3779835, 3779836, 3779818, 3779819, 3779820, 3779821, 3779822, 3779823, 3779824, 3779825, 3779826, 3779827, 3779829", ["1106:973:727:1534"] = "3779797, 3779808, 3779810, 3779811, 3779812, 3779813, 3779814, 3779815, 3779816, 3779798, 3779799, 3779800, 3779801, 3779802, 3779803, 3779804, 3779805, 3779806, 3779807, 3779809", ["1401:1434:1715:208"] = "3779837, 3779848, 3779859, 3779867, 3779868, 3779869, 3779870, 3779871, 3779872, 3779838, 3779839, 3779840, 3779841, 3779842, 3779843, 3779844, 3779845, 3779846, 3779847, 3779849, 3779850, 3779851, 3779852, 3779853, 3779854, 3779855, 3779856, 3779857, 3779858, 3779860, 3779861, 3779862, 3779863, 3779864, 3779865, 3779866", }, [1475] = { ["1562:2440:61:90"] = "3780023, 3780063, 3780074, 3780106, 3780117, 3780135, 3780146, 3780148, 3780149, 3780032, 3780033, 3780034, 3780035, 3780036, 3780037, 3780038, 3780042, 3780043, 3780054, 3780064, 3780065, 3780066, 3780067, 3780068, 3780069, 3780070, 3780071, 3780072, 3780073, 3780075, 3780076, 3780077, 3780078, 3780079, 3780080, 3780081, 3780082, 3780087, 3780105, 3780107, 3780108, 3780109, 3780110, 3780111, 3780112, 3780113, 3780114, 3780115, 3780116, 3780118, 3780119, 3780120, 3780121, 3780122, 3780123, 3780124, 3780125, 3780126, 3780134, 3780136, 3780137, 3780138, 3780139, 3780140, 3780141, 3780142, 3780143, 3780144, 3780145, 3780147", ["1660:2374:2076:111"] = "3780180, 3780191, 3780202, 3780213, 3780224, 3780238, 3780249, 3780251, 3780252, 3780181, 3780182, 3780183, 3780184, 3780185, 3780186, 3780187, 3780188, 3780189, 3780190, 3780192, 3780193, 3780194, 3780195, 3780196, 3780197, 3780198, 3780199, 3780200, 3780201, 3780203, 3780204, 3780205, 3780206, 3780207, 3780208, 3780209, 3780210, 3780211, 3780212, 3780214, 3780215, 3780216, 3780217, 3780218, 3780219, 3780220, 3780221, 3780222, 3780223, 3780225, 3780229, 3780230, 3780231, 3780232, 3780233, 3780234, 3780235, 3780236, 3780237, 3780239, 3780240, 3780241, 3780242, 3780243, 3780244, 3780245, 3780246, 3780247, 3780248, 3780250", ["725:2425:1478:102"] = "3780150, 3780161, 3780172, 3780174, 3780175, 3780176, 3780177, 3780178, 3780179, 3780151, 3780152, 3780153, 3780154, 3780155, 3780156, 3780157, 3780158, 3780159, 3780160, 3780162, 3780163, 3780164, 3780165, 3780166, 3780167, 3780168, 3780169, 3780170, 3780171, 3780173", }, [1477] = { ["1208:1747:499:289"] = "3788374, 3788385, 3788396, 3788403, 3788404, 3788405, 3788406, 3788407, 3788408, 3788375, 3788376, 3788377, 3788378, 3788379, 3788380, 3788381, 3788382, 3788383, 3788384, 3788386, 3788387, 3788388, 3788389, 3788390, 3788391, 3788392, 3788393, 3788394, 3788395, 3788397, 3788398, 3788399, 3788400, 3788401, 3788402", ["1442:1755:2130:293"] = "3788427, 3788438, 3788449, 3788460, 3788464, 3788465, 3788466, 3788467, 3788468, 3788428, 3788429, 3788430, 3788431, 3788432, 3788433, 3788434, 3788435, 3788436, 3788437, 3788439, 3788440, 3788441, 3788442, 3788443, 3788444, 3788445, 3788446, 3788447, 3788448, 3788450, 3788451, 3788452, 3788453, 3788454, 3788455, 3788456, 3788457, 3788458, 3788459, 3788461, 3788462, 3788463", ["647:1310:1594:934"] = "3788409, 3788419, 3788420, 3788421, 3788422, 3788423, 3788424, 3788425, 3788426, 3788410, 3788411, 3788412, 3788413, 3788414, 3788415, 3788416, 3788417, 3788418", ["669:597:1587:449"] = "3788469, 3788470, 3788471, 3788472, 3788473, 3788474, 3788475, 3788476, 3788477", }, [1478] = { ["1117:1052:2055:1290"] = "3788748, 3788760, 3788767, 3788768, 3788769, 3788770, 3788771, 3788772, 3788773, 3788749, 3788751, 3788752, 3788753, 3788754, 3788755, 3788756, 3788757, 3788758, 3788759, 3788761, 3788762, 3788763, 3788764, 3788765, 3788766", ["1290:1210:892:1302"] = "3788717, 3788728, 3788740, 3788742, 3788743, 3788744, 3788745, 3788746, 3788747, 3788718, 3788719, 3788720, 3788721, 3788722, 3788723, 3788724, 3788725, 3788726, 3788727, 3788729, 3788730, 3788731, 3788732, 3788733, 3788734, 3788735, 3788737, 3788738, 3788739, 3788741", ["1592:1281:415:134"] = "3788675, 3788686, 3788697, 3788708, 3788712, 3788713, 3788714, 3788715, 3788716, 3788676, 3788677, 3788678, 3788679, 3788680, 3788681, 3788682, 3788683, 3788684, 3788685, 3788687, 3788688, 3788689, 3788690, 3788691, 3788692, 3788693, 3788694, 3788695, 3788696, 3788698, 3788699, 3788700, 3788701, 3788702, 3788703, 3788704, 3788705, 3788706, 3788707, 3788709, 3788710, 3788711", ["1811:1114:1912:287"] = "3788774, 3788785, 3788796, 3788807, 3788809, 3788810, 3788811, 3788812, 3788813, 3788775, 3788776, 3788777, 3788778, 3788779, 3788780, 3788781, 3788782, 3788783, 3788784, 3788786, 3788787, 3788788, 3788789, 3788790, 3788791, 3788792, 3788793, 3788794, 3788795, 3788797, 3788798, 3788799, 3788800, 3788801, 3788802, 3788803, 3788804, 3788805, 3788806, 3788808", }, [1479] = { ["1384:1253:1106:1279"] = "3789143, 3789154, 3789165, 3789167, 3789168, 3789169, 3789170, 3789171, 3789172, 3789144, 3789145, 3789146, 3789147, 3789148, 3789149, 3789150, 3789151, 3789152, 3789153, 3789155, 3789156, 3789157, 3789158, 3789159, 3789160, 3789161, 3789162, 3789163, 3789164, 3789166", ["854:1010:2003:375"] = "3789127, 3789135, 3789136, 3789137, 3789138, 3789139, 3789140, 3789141, 3789142, 3789128, 3789129, 3789130, 3789131, 3789132, 3789133, 3789134", ["876:1317:739:152"] = "3789079, 3789090, 3789096, 3789097, 3789098, 3789099, 3789100, 3789101, 3789102, 3789080, 3789081, 3789082, 3789083, 3789084, 3789085, 3789086, 3789087, 3789088, 3789089, 3789091, 3789092, 3789093, 3789094, 3789095", ["902:1372:1496:0"] = "3789103, 3789114, 3789120, 3789121, 3789122, 3789123, 3789124, 3789125, 3789126, 3789104, 3789105, 3789106, 3789107, 3789108, 3789109, 3789110, 3789111, 3789112, 3789113, 3789115, 3789116, 3789117, 3789118, 3789119", }, [1482] = { ["1060:1166:2122:1027"] = "3790858, 3790879, 3790892, 3790894, 3790896, 3790897, 3790899, 3790901, 3790903, 3790860, 3790862, 3790864, 3790866, 3790867, 3790869, 3790871, 3790873, 3790875, 3790877, 3790881, 3790882, 3790884, 3790886, 3790888, 3790890", ["1166:1131:2059:0"] = "3790950, 3790971, 3790984, 3790986, 3790988, 3790990, 3790992, 3790994, 3790996, 3790952, 3790954, 3790956, 3790958, 3790960, 3790962, 3790963, 3790965, 3790967, 3790969, 3790973, 3790975, 3790977, 3790979, 3790980, 3790982", ["775:2043:744:116"] = "3790754, 3790775, 3790800, 3790808, 3790810, 3790812, 3790814, 3790816, 3790818, 3790756, 3790758, 3790760, 3790762, 3790764, 3790766, 3790768, 3790769, 3790771, 3790773, 3790777, 3790779, 3790781, 3790783, 3790785, 3790787, 3790788, 3790790, 3790792, 3790798, 3790802, 3790804, 3790806", ["906:1314:1610:453"] = "3790905, 3790926, 3790937, 3790939, 3790941, 3790943, 3790945, 3790946, 3790948, 3790907, 3790908, 3790910, 3790912, 3790914, 3790916, 3790918, 3790920, 3790922, 3790924, 3790928, 3790930, 3790931, 3790933, 3790935", ["977:1180:1266:1179"] = "3790819, 3790840, 3790844, 3790846, 3790848, 3790850, 3790852, 3790854, 3790856, 3790821, 3790823, 3790825, 3790827, 3790829, 3790831, 3790833, 3790835, 3790837, 3790838, 3790842", }, [1484] = { ["1108:919:1745:1408"] = "3791457, 3791468, 3791470, 3791471, 3791472, 3791473, 3791474, 3791475, 3791476, 3791458, 3791459, 3791460, 3791461, 3791462, 3791463, 3791464, 3791465, 3791466, 3791467, 3791469", ["1132:1401:719:1038"] = "3791427, 3791438, 3791449, 3791451, 3791452, 3791453, 3791454, 3791455, 3791456, 3791428, 3791429, 3791430, 3791431, 3791432, 3791433, 3791434, 3791435, 3791436, 3791437, 3791439, 3791440, 3791441, 3791442, 3791443, 3791444, 3791445, 3791446, 3791447, 3791448, 3791450", ["1338:1490:1727:18"] = "3791477, 3791488, 3791499, 3791507, 3791508, 3791509, 3791510, 3791511, 3791512, 3791478, 3791479, 3791480, 3791481, 3791482, 3791483, 3791484, 3791485, 3791486, 3791487, 3791489, 3791490, 3791491, 3791492, 3791493, 3791494, 3791495, 3791496, 3791497, 3791498, 3791500, 3791501, 3791502, 3791503, 3791504, 3791505, 3791506", }, [1485] = { ["1807:872:1286:951"] = "3791702, 3791713, 3791724, 3791728, 3791729, 3791730, 3791731, 3791732, 3791733, 3791703, 3791704, 3791705, 3791706, 3791707, 3791708, 3791709, 3791710, 3791711, 3791712, 3791714, 3791715, 3791716, 3791717, 3791718, 3791719, 3791720, 3791721, 3791722, 3791723, 3791725, 3791726, 3791727", ["938:1010:1680:49"] = "3791686, 3791694, 3791695, 3791696, 3791697, 3791698, 3791699, 3791700, 3791701, 3791687, 3791688, 3791689, 3791690, 3791691, 3791692, 3791693", ["945:1059:828:56"] = "3791666, 3791677, 3791679, 3791680, 3791681, 3791682, 3791683, 3791684, 3791685, 3791667, 3791668, 3791669, 3791670, 3791671, 3791672, 3791673, 3791674, 3791675, 3791676, 3791678", ["971:827:1559:1717"] = "3791734, 3791742, 3791743, 3791744, 3791745, 3791746, 3791747, 3791748, 3791749, 3791735, 3791736, 3791737, 3791738, 3791739, 3791740, 3791741", }, [1492] = { ["1226:1196:1303:1301"] = "3795577, 3795588, 3795595, 3795596, 3795597, 3795598, 3795599, 3795600, 3795601, 3795578, 3795579, 3795580, 3795581, 3795582, 3795583, 3795584, 3795585, 3795586, 3795587, 3795589, 3795590, 3795591, 3795592, 3795593, 3795594", ["3006:1749:408:22"] = "3795602, 3795613, 3795624, 3795635, 3795646, 3795657, 3795668, 3795679, 3795685, 3795603, 3795604, 3795605, 3795606, 3795607, 3795608, 3795609, 3795610, 3795611, 3795612, 3795614, 3795615, 3795616, 3795617, 3795618, 3795619, 3795620, 3795621, 3795622, 3795623, 3795625, 3795626, 3795627, 3795628, 3795629, 3795630, 3795631, 3795632, 3795633, 3795634, 3795636, 3795637, 3795638, 3795639, 3795640, 3795641, 3795642, 3795643, 3795644, 3795645, 3795647, 3795648, 3795649, 3795650, 3795651, 3795652, 3795653, 3795654, 3795655, 3795656, 3795658, 3795659, 3795660, 3795661, 3795662, 3795663, 3795664, 3795665, 3795666, 3795667, 3795669, 3795670, 3795671, 3795672, 3795673, 3795674, 3795675, 3795676, 3795677, 3795678, 3795680, 3795681, 3795682, 3795683, 3795684", }, [1502] = { ["1005:825:2011:180"] = "3801103, 3801118, 3801120, 3801122, 3801124, 3801126, 3801128, 3801130, 3801132, 3801105, 3801107, 3801109, 3801111, 3801113, 3801115, 3801116", ["1014:1487:501:486"] = "3800970, 3800993, 3801005, 3801007, 3801008, 3801010, 3801012, 3801014, 3801016, 3800973, 3800975, 3800977, 3800979, 3800981, 3800983, 3800985, 3800987, 3800989, 3800991, 3800995, 3800997, 3800999, 3801001, 3801003", ["1323:670:2000:885"] = "3801134, 3801154, 3801156, 3801158, 3801160, 3801162, 3801164, 3801166, 3801168, 3801136, 3801138, 3801140, 3801142, 3801144, 3801146, 3801148, 3801150, 3801152", ["810:682:1319:877"] = "3801018, 3801026, 3801028, 3801030, 3801032, 3801034, 3801036, 3801038, 3801040, 3801020, 3801022, 3801024", ["877:812:1227:184"] = "3801072, 3801088, 3801090, 3801091, 3801093, 3801095, 3801097, 3801099, 3801101, 3801074, 3801076, 3801078, 3801080, 3801082, 3801084, 3801086", ["964:948:1144:1431"] = "3801042, 3801057, 3801059, 3801061, 3801063, 3801065, 3801067, 3801069, 3801071, 3801044, 3801046, 3801048, 3801050, 3801052, 3801053, 3801055", ["979:954:2013:1428"] = "3801170, 3801185, 3801187, 3801189, 3801191, 3801193, 3801195, 3801197, 3801199, 3801172, 3801174, 3801176, 3801178, 3801179, 3801181, 3801183", }, [1503] = { ["1007:1460:467:612"] = "3802618, 3802629, 3802635, 3802636, 3802637, 3802638, 3802639, 3802640, 3802641, 3802619, 3802620, 3802621, 3802622, 3802623, 3802624, 3802625, 3802626, 3802627, 3802628, 3802630, 3802631, 3802632, 3802633, 3802634", ["1586:1924:1920:448"] = "3802674, 3802685, 3802696, 3802707, 3802718, 3802726, 3802727, 3802728, 3802729, 3802675, 3802676, 3802677, 3802678, 3802679, 3802680, 3802681, 3802682, 3802683, 3802684, 3802686, 3802687, 3802688, 3802689, 3802690, 3802691, 3802692, 3802693, 3802694, 3802695, 3802697, 3802698, 3802699, 3802700, 3802701, 3802702, 3802703, 3802704, 3802705, 3802706, 3802708, 3802709, 3802710, 3802711, 3802712, 3802713, 3802714, 3802715, 3802716, 3802717, 3802719, 3802720, 3802721, 3802722, 3802723, 3802724, 3802725", ["833:1871:1274:228"] = "3802642, 3802653, 3802664, 3802668, 3802669, 3802670, 3802671, 3802672, 3802673, 3802643, 3802644, 3802645, 3802646, 3802647, 3802648, 3802649, 3802650, 3802651, 3802652, 3802654, 3802655, 3802656, 3802657, 3802658, 3802659, 3802660, 3802661, 3802662, 3802663, 3802665, 3802666, 3802667", }, [1510] = { ["1480:978:1247:1460"] = "3804855, 3804866, 3804872, 3804873, 3804874, 3804875, 3804876, 3804877, 3804878, 3804856, 3804857, 3804858, 3804859, 3804860, 3804861, 3804862, 3804863, 3804864, 3804865, 3804867, 3804868, 3804869, 3804870, 3804871", ["1664:1327:1104:231"] = "3804879, 3804890, 3804901, 3804912, 3804916, 3804917, 3804918, 3804919, 3804920, 3804880, 3804881, 3804882, 3804883, 3804884, 3804885, 3804886, 3804887, 3804888, 3804889, 3804891, 3804892, 3804893, 3804894, 3804895, 3804896, 3804897, 3804898, 3804899, 3804900, 3804902, 3804903, 3804904, 3804905, 3804906, 3804907, 3804908, 3804909, 3804910, 3804911, 3804913, 3804914, 3804915", }, [1512] = { ["1297:1026:1998:1191"] = "3805283, 3805294, 3805305, 3805307, 3805308, 3805309, 3805310, 3805311, 3805312, 3805284, 3805285, 3805286, 3805287, 3805288, 3805289, 3805290, 3805291, 3805292, 3805293, 3805295, 3805296, 3805297, 3805298, 3805299, 3805300, 3805301, 3805302, 3805303, 3805304, 3805306", ["1415:1037:251:1197"] = "3805235, 3805246, 3805257, 3805259, 3805260, 3805261, 3805262, 3805263, 3805264, 3805236, 3805237, 3805238, 3805239, 3805240, 3805241, 3805242, 3805243, 3805244, 3805245, 3805247, 3805248, 3805249, 3805250, 3805251, 3805252, 3805253, 3805254, 3805255, 3805256, 3805258", ["2454:1432:750:12"] = "3805313, 3805324, 3805335, 3805346, 3805357, 3805368, 3805370, 3805371, 3805372, 3805314, 3805315, 3805316, 3805317, 3805318, 3805319, 3805320, 3805321, 3805322, 3805323, 3805325, 3805326, 3805327, 3805328, 3805329, 3805330, 3805331, 3805332, 3805333, 3805334, 3805336, 3805337, 3805338, 3805339, 3805340, 3805341, 3805342, 3805343, 3805344, 3805345, 3805347, 3805348, 3805349, 3805350, 3805351, 3805352, 3805353, 3805354, 3805355, 3805356, 3805358, 3805359, 3805360, 3805361, 3805362, 3805363, 3805364, 3805365, 3805366, 3805367, 3805369", ["623:1489:1521:906"] = "3805265, 3805275, 3805276, 3805277, 3805278, 3805279, 3805280, 3805281, 3805282, 3805266, 3805267, 3805268, 3805269, 3805270, 3805271, 3805272, 3805273, 3805274", }, [1513] = { ["754:5050:1547:231"] = "3805692, 3805703, 3805712, 3805713, 3805714, 3805715, 3805716, 3805717, 3805718, 3805693, 3805694, 3805695, 3805696, 3805697, 3805698, 3805699, 3805700, 3805701, 3805702, 3805704, 3805705, 3805706, 3805707, 3805708, 3805709, 3805710, 3805711, 0", ["765:1894:959:406"] = "3805668, 3805679, 3805685, 3805686, 3805687, 3805688, 3805689, 3805690, 3805691, 3805669, 3805670, 3805671, 3805672, 3805673, 3805674, 3805675, 3805676, 3805677, 3805678, 3805680, 3805681, 3805682, 3805683, 3805684", ["786:1887:2142:396"] = "3805719, 3805730, 3805742, 3805747, 3805748, 3805749, 3805750, 3805751, 3805752, 3805720, 3805721, 3805722, 3805723, 3805724, 3805725, 3805726, 3805727, 3805728, 3805729, 3805731, 3805732, 3805733, 3805734, 3805735, 3805737, 3805738, 3805739, 3805740, 3805741, 3805743, 3805745, 3805746", }, [1514] = { ["1156:465:602:1062"] = "3806122, 3806124, 3806125, 3806126, 3806127, 3806128, 3806129, 3806130, 3806131, 3806123", ["1225:708:489:510"] = "3806107, 3806114, 3806115, 3806116, 3806117, 3806118, 3806119, 3806120, 3806121, 3806108, 3806109, 3806110, 3806111, 3806112, 3806113", ["1259:509:2156:653"] = "3806150, 3806152, 3806153, 3806154, 3806155, 3806156, 3806157, 3806158, 3806159, 3806151", ["1266:941:2151:1041"] = "3806160, 3806171, 3806173, 3806174, 3806175, 3806176, 3806177, 3806178, 3806179, 3806161, 3806162, 3806163, 3806164, 3806165, 3806166, 3806167, 3806168, 3806169, 3806170, 3806172", ["727:1420:1579:396"] = "3806132, 3806142, 3806143, 3806144, 3806145, 3806146, 3806147, 3806148, 3806149, 3806133, 3806134, 3806135, 3806136, 3806137, 3806138, 3806139, 3806140, 3806141", }, [1515] = { ["1350:1420:1160:120"] = "3811387, 3811398, 3811409, 3811417, 3811418, 3811419, 3811420, 3811421, 3811422, 3811388, 3811389, 3811390, 3811391, 3811392, 3811393, 3811394, 3811395, 3811396, 3811397, 3811399, 3811400, 3811401, 3811402, 3811403, 3811404, 3811405, 3811406, 3811407, 3811408, 3811410, 3811411, 3811412, 3811413, 3811414, 3811415, 3811416", ["1381:1602:1849:696"] = "3811423, 3811434, 3811445, 3811456, 3811460, 3811461, 3811462, 3811463, 3811464, 3811424, 3811425, 3811426, 3811427, 3811428, 3811429, 3811430, 3811431, 3811432, 3811433, 3811435, 3811436, 3811437, 3811438, 3811439, 3811440, 3811441, 3811442, 3811443, 3811444, 3811446, 3811447, 3811448, 3811449, 3811450, 3811451, 3811452, 3811453, 3811454, 3811455, 3811457, 3811458, 3811459", ["994:1285:724:555"] = "3811363, 3811374, 3811380, 3811381, 3811382, 3811383, 3811384, 3811385, 3811386, 3811364, 3811365, 3811366, 3811367, 3811368, 3811369, 3811370, 3811371, 3811372, 3811373, 3811375, 3811376, 3811377, 3811378, 3811379", }, [1517] = { ["1353:1415:537:717"] = "3806880, 3806891, 3806902, 3806910, 3806911, 3806912, 3806913, 3806914, 3806915, 3806881, 3806882, 3806883, 3806884, 3806885, 3806886, 3806887, 3806888, 3806889, 3806890, 3806892, 3806893, 3806894, 3806895, 3806896, 3806897, 3806898, 3806899, 3806900, 3806901, 3806903, 3806904, 3806905, 3806906, 3806907, 3806908, 3806909", ["618:2391:1775:87"] = "3806916, 3806927, 3806945, 3806947, 3806948, 3806949, 3806950, 3806951, 3806952, 3806917, 3806918, 3806919, 3806920, 3806921, 3806922, 3806923, 3806924, 3806925, 3806926, 3806928, 3806929, 3806930, 3806931, 3806932, 3806933, 3806934, 3806935, 3806936, 3806937, 3806946", ["949:1036:2246:872"] = "3806953, 3806964, 3806966, 3806967, 3806968, 3806969, 3806970, 3806971, 3806972, 3806954, 3806955, 3806956, 3806957, 3806958, 3806959, 3806960, 3806961, 3806962, 3806963, 3806965", }, [1519] = { ["1388:1297:292:102"] = "3808677, 3808688, 3808699, 3808707, 3808708, 3808709, 3808710, 3808711, 3808712, 3808678, 3808679, 3808680, 3808681, 3808682, 3808683, 3808684, 3808685, 3808686, 3808687, 3808689, 3808690, 3808691, 3808692, 3808693, 3808694, 3808695, 3808696, 3808697, 3808698, 3808700, 3808701, 3808702, 3808703, 3808704, 3808705, 3808706", ["1408:1211:288:1305"] = "3808721, 3808732, 3808743, 3808745, 3808746, 3808747, 3808748, 3808749, 3808750, 3808722, 3808723, 3808724, 3808725, 3808726, 3808727, 3808728, 3808729, 3808730, 3808731, 3808733, 3808734, 3808735, 3808736, 3808737, 3808738, 3808739, 3808740, 3808741, 3808742, 3808744", ["1417:1229:2032:1306"] = "3808790, 3808801, 3808812, 3808814, 3808815, 3808816, 3808817, 3808818, 3808819, 3808791, 3808792, 3808793, 3808794, 3808795, 3808796, 3808797, 3808798, 3808799, 3808800, 3808802, 3808803, 3808804, 3808805, 3808806, 3808807, 3808808, 3808809, 3808810, 3808811, 3808813", ["1432:1315:2024:85"] = "3808828, 3808839, 3808850, 3808858, 3808859, 3808860, 3808861, 3808862, 3808863, 3808829, 3808830, 3808831, 3808832, 3808833, 3808834, 3808835, 3808836, 3808837, 3808838, 3808840, 3808841, 3808842, 3808843, 3808844, 3808845, 3808846, 3808847, 3808848, 3808849, 3808851, 3808852, 3808853, 3808854, 3808855, 3808856, 3808857", ["559:1052:1589:1508"] = "3808775, 3808782, 3808783, 3808784, 3808785, 3808786, 3808787, 3808788, 3808789, 3808776, 3808777, 3808778, 3808779, 3808780, 3808781", ["571:539:1574:1080"] = "3808766, 3808767, 3808768, 3808769, 3808770, 3808771, 3808772, 3808773, 3808774", ["673:1186:1515:0"] = "3808751, 3808758, 3808759, 3808760, 3808761, 3808762, 3808763, 3808764, 3808765, 3808752, 3808753, 3808754, 3808755, 3808756, 3808757", ["954:507:2005:1105"] = "3808820, 3808821, 3808822, 3808823, 3808824, 3808825, 3808826, 3808827", ["970:475:741:1119"] = "3808713, 3808714, 3808715, 3808716, 3808717, 3808718, 3808719, 3808720", }, [1525] = { ["1058:629:2050:189"] = "3816506, 3816513, 3816514, 3816515, 3816516, 3816517, 3816518, 3816519, 3816520, 3816507, 3816508, 3816509, 3816510, 3816511, 3816512", ["1134:804:1039:30"] = "3816521, 3816532, 3816534, 3816535, 3816536, 3816537, 3816538, 3816539, 3816540, 3816522, 3816523, 3816524, 3816525, 3816526, 3816527, 3816528, 3816529, 3816530, 3816531, 3816533", ["1456:869:1004:1691"] = "3816565, 3816576, 3816582, 3816583, 3816584, 3816585, 3816586, 3816587, 3816588, 3816566, 3816567, 3816568, 3816569, 3816570, 3816571, 3816572, 3816573, 3816574, 3816575, 3816577, 3816578, 3816579, 3816580, 3816581", ["571:1007:2339:1553"] = "3816626, 3816630, 3816631, 3816632, 3816633, 3816634, 3816635, 3816636, 3816637, 3816627, 3816628, 3816629", ["830:1232:1660:728"] = "3816589, 3816600, 3816602, 3816603, 3816604, 3816605, 3816606, 3816607, 3816609, 3816590, 3816591, 3816592, 3816593, 3816594, 3816595, 3816596, 3816597, 3816598, 3816599, 3816601", ["889:972:2008:697"] = "3816610, 3816618, 3816619, 3816620, 3816621, 3816622, 3816623, 3816624, 3816625, 3816611, 3816612, 3816613, 3816614, 3816615, 3816616, 3816617", ["988:1315:788:648"] = "3816541, 3816552, 3816558, 3816559, 3816560, 3816561, 3816562, 3816563, 3816564, 3816542, 3816543, 3816544, 3816545, 3816546, 3816547, 3816548, 3816549, 3816550, 3816551, 3816553, 3816554, 3816555, 3816556, 3816557", }, [1526] = { ["1173:780:815:1389"] = "3816869, 3816880, 3816882, 3816883, 3816884, 3816885, 3816886, 3816887, 3816888, 3816870, 3816871, 3816872, 3816873, 3816874, 3816875, 3816876, 3816877, 3816878, 3816879, 3816881", ["1369:1087:832:428"] = "3816823, 3816834, 3816845, 3816847, 3816848, 3816849, 3816850, 3816851, 3816852, 3816824, 3816825, 3816826, 3816827, 3816828, 3816829, 3816830, 3816831, 3816832, 3816833, 3816835, 3816836, 3816837, 3816838, 3816839, 3816840, 3816841, 3816842, 3816843, 3816844, 3816846", ["1795:555:798:1995"] = "3816889, 3816900, 3816906, 3816907, 3816908, 3816909, 3816910, 3816911, 3816912, 3816890, 3816891, 3816892, 3816893, 3816894, 3816895, 3816896, 3816897, 3816898, 3816899, 3816901, 3816902, 3816903, 3816904, 3816905", ["508:1023:834:38"] = "3816788, 3816789, 3816790, 3816791, 3816792, 3816793, 3816794, 3816795", ["589:1233:2053:6"] = "3816808, 3816815, 3816816, 3816817, 3816818, 3816819, 3816820, 3816821, 3816822, 3816809, 3816810, 3816811, 3816812, 3816813, 3816814", ["957:536:1215:16"] = "3816796, 3816800, 3816801, 3816802, 3816803, 3816804, 3816805, 3816806, 3816807, 3816797, 3816798, 3816799", ["983:970:1869:1134"] = "3816853, 3816861, 3816862, 3816863, 3816864, 3816865, 3816866, 3816867, 3816868, 3816854, 3816855, 3816856, 3816857, 3816858, 3816859, 3816860", }, [1528] = { ["1005:1040:1728:1510"] = "3817339, 3817350, 3817352, 3817353, 3817354, 3817355, 3817357, 3817358, 3817359, 3817340, 3817341, 3817342, 3817343, 3817344, 3817345, 3817346, 3817347, 3817348, 3817349, 3817351", ["1016:785:814:1775"] = "3817314, 3817322, 3817323, 3817324, 3817325, 3817326, 3817327, 3817328, 0, 3817315, 3817316, 3817317, 3817318, 3817319, 3817320, 3817321", ["1158:1228:1936:397"] = "3817228, 3817239, 3817246, 3817247, 3817248, 3817249, 3817250, 3817251, 3817252, 3817229, 3817230, 3817231, 3817232, 3817233, 3817234, 3817235, 3817236, 3817237, 3817238, 3817240, 3817241, 3817242, 3817243, 3817244, 3817245", ["444:1283:1913:873"] = "3817262, 3817266, 3817267, 3817268, 3817269, 3817270, 3817271, 3817272, 3817273, 3817263, 3817264, 3817265", ["696:779:1766:0"] = "3817216, 3817220, 3817221, 3817222, 3817223, 3817224, 3817225, 3817226, 3817227, 3817217, 3817218, 3817219", ["742:686:1275:1523"] = "3817330, 3817331, 3817332, 3817333, 3817334, 3817335, 3817336, 3817337, 3817338", ["746:747:2499:1054"] = "3817253, 3817254, 3817255, 3817256, 3817257, 3817258, 3817259, 3817260, 3817261", ["840:553:553:1330"] = "3817302, 3817306, 3817307, 3817308, 3817309, 3817310, 3817311, 3817312, 3817313, 3817303, 3817304, 3817305", ["863:770:1284:902"] = "3817274, 3817282, 3817283, 3817284, 3817285, 3817286, 3817287, 3817288, 3817289, 3817275, 3817276, 3817277, 3817278, 3817279, 3817280, 3817281", ["976:734:656:695"] = "3817290, 3817294, 3817295, 3817296, 3817297, 3817298, 3817299, 3817300, 3817301, 3817291, 3817292, 3817293", }, [1530] = { ["1050:870:890:47"] = "3817566, 3817577, 3817579, 3817580, 3817581, 3817582, 3817583, 3817584, 3817585, 3817567, 3817568, 3817569, 3817570, 3817571, 3817572, 3817573, 3817574, 3817575, 3817576, 3817578", ["1084:1084:2444:436"] = "3817510, 3817521, 3817529, 3817530, 3817531, 3817533, 3817535, 3817536, 3817537, 3817511, 3817512, 3817513, 3817514, 3817515, 3817516, 3817517, 3817518, 3817519, 3817520, 3817522, 3817524, 3817525, 3817526, 3817527, 3817528", ["1165:810:963:1719"] = "3817616, 3817627, 3817629, 3817630, 3817631, 3817632, 3817633, 3817634, 3817635, 3817617, 3817618, 3817619, 3817620, 3817621, 3817622, 3817623, 3817624, 3817625, 3817626, 3817628", ["1447:1179:653:680"] = "3817586, 3817597, 3817608, 3817610, 3817611, 3817612, 3817613, 3817614, 3817615, 3817587, 3817588, 3817589, 3817590, 3817591, 3817592, 3817593, 3817594, 3817595, 3817596, 3817598, 3817599, 3817600, 3817601, 3817602, 3817603, 3817604, 3817605, 3817606, 3817607, 3817609", ["848:1116:237:1426"] = "3817636, 3817647, 3817649, 3817650, 3817651, 3817652, 3817653, 3817654, 3817655, 3817637, 3817638, 3817639, 3817640, 3817641, 3817642, 3817643, 3817644, 3817645, 3817646, 3817648", ["959:1721:1631:40"] = "3817538, 3817549, 3817559, 3817560, 3817561, 3817562, 3817563, 3817564, 3817565, 3817539, 3817540, 3817541, 3817542, 3817543, 3817544, 3817545, 3817546, 3817547, 3817548, 3817550, 3817551, 3817552, 3817553, 3817554, 3817555, 3817556, 3817557, 3817558", }, [1532] = { ["1048:440:1238:1099"] = "3819469, 3819471, 3819472, 3819473, 3819474, 3819475, 3819476, 3819477, 3819478, 3819470", ["1131:960:1605:57"] = "3819426, 3819440, 3819442, 3819443, 3819444, 3819445, 3819446, 3819447, 3819448, 3819427, 3819428, 3819429, 3819430, 3819431, 3819434, 3819436, 3819437, 3819438, 3819439, 3819441", ["839:1123:1484:1437"] = "3819479, 3819490, 3819492, 3819493, 3819494, 3819495, 3819496, 3819497, 3819498, 3819480, 3819481, 3819482, 3819483, 3819484, 3819485, 3819486, 3819487, 3819488, 3819489, 3819491", ["861:668:1943:914"] = "3819457, 3819461, 3819462, 3819463, 3819464, 3819465, 3819466, 3819467, 3819468, 3819458, 3819459, 3819460", ["951:400:1250:800"] = "3819449, 3819450, 3819451, 3819452, 3819453, 3819454, 3819455, 3819456", }, [1533] = { ["565:1404:1748:591"] = "3817806, 3817816, 3817817, 3817818, 3817819, 3817820, 3817821, 3817822, 3817823, 3817807, 3817808, 3817809, 3817810, 3817811, 3817812, 3817813, 3817814, 3817815", ["677:1389:1198:595"] = "3817824, 3817834, 3817835, 3817836, 3817837, 3817838, 3817839, 3817840, 3817841, 3817825, 3817826, 3817827, 3817828, 3817829, 3817830, 3817831, 3817832, 3817833", ["792:1469:1817:173"] = "3817862, 3817873, 3817879, 3817880, 3817881, 3817882, 3817883, 3817884, 3817885, 3817863, 3817864, 3817865, 3817866, 3817867, 3817868, 3817869, 3817870, 3817871, 3817872, 3817874, 3817875, 3817876, 3817877, 3817878", ["802:1035:1336:1500"] = "3817842, 3817853, 3817855, 3817856, 3817857, 3817858, 3817859, 3817860, 3817861, 3817843, 3817844, 3817845, 3817846, 3817847, 3817848, 3817849, 3817850, 3817851, 3817852, 3817854", }, [1535] = { ["1114:879:1161:1076"] = "3818458, 3818469, 3818471, 3818472, 3818473, 3818474, 3818475, 3818476, 3818477, 3818459, 3818460, 3818461, 3818462, 3818463, 3818464, 3818465, 3818466, 3818467, 3818468, 3818470", ["1290:756:833:1754"] = "3818490, 3818500, 3818501, 3818502, 3818503, 3818504, 3818505, 3818506, 3818507, 3818491, 3818492, 3818493, 3818494, 3818495, 3818496, 3818497, 3818498, 3818499", ["519:902:1306:384"] = "3818446, 3818450, 3818451, 3818452, 3818453, 3818454, 3818455, 3818456, 3818457, 3818447, 3818448, 3818449", ["688:1013:786:529"] = "3818434, 3818438, 3818439, 3818440, 3818441, 3818442, 3818443, 3818444, 3818445, 3818435, 3818436, 3818437", ["835:1344:1710:388"] = "3818410, 3818421, 3818427, 3818428, 3818429, 3818430, 3818431, 3818432, 3818433, 3818411, 3818412, 3818413, 3818414, 3818415, 3818416, 3818417, 3818418, 3818419, 3818420, 3818422, 3818423, 3818424, 3818425, 3818426", ["931:654:858:1427"] = "3818478, 3818482, 3818483, 3818484, 3818485, 3818486, 3818487, 3818488, 3818489, 3818479, 3818480, 3818481", ["999:1527:1955:22"] = "3818386, 3818397, 3818403, 3818404, 3818405, 3818406, 3818407, 3818408, 3818409, 3818387, 3818388, 3818389, 3818390, 3818391, 3818392, 3818393, 3818394, 3818395, 3818396, 3818398, 3818399, 3818400, 3818401, 3818402", }, [1539] = { ["1520:1017:1483:1230"] = "3815339, 3815350, 3815356, 3815357, 3815358, 3815359, 3815360, 3815361, 3815362, 3815340, 3815341, 3815342, 3815343, 3815344, 3815345, 3815346, 3815347, 3815348, 3815349, 3815351, 3815352, 3815353, 3815354, 3815355", ["2447:1356:600:85"] = "3815255, 3815270, 3815281, 3815296, 3815307, 3815322, 3815324, 3815325, 3815326, 3815256, 3815261, 3815262, 3815263, 3815264, 3815265, 3815266, 3815267, 3815268, 3815269, 3815271, 3815272, 3815273, 3815274, 3815275, 3815276, 3815277, 3815278, 3815279, 3815280, 3815282, 3815283, 3815284, 3815285, 3815286, 3815287, 3815292, 3815293, 3815294, 3815295, 3815297, 3815298, 3815299, 3815300, 3815301, 3815302, 3815303, 3815304, 3815305, 3815306, 3815308, 3815309, 3815310, 3815311, 3815312, 3815313, 3815314, 3815315, 3815320, 3815321, 3815323", ["651:949:2373:1518"] = "3815363, 3815367, 3815368, 3815369, 3815370, 3815371, 3815372, 3815373, 3815374, 3815364, 3815365, 3815366", ["792:729:1413:1021"] = "3815327, 3815331, 3815332, 3815333, 3815334, 3815335, 3815336, 3815337, 3815338, 3815328, 3815329, 3815330", }, [1540] = { ["1038:725:1140:184"] = "3815529, 3815536, 3815537, 3815538, 3815539, 3815540, 3815541, 3815542, 3815543, 3815530, 3815531, 3815532, 3815533, 3815534, 3815535", ["1134:710:1143:1198"] = "3815559, 3815566, 3815567, 3815568, 3815569, 3815570, 3815571, 3815572, 3815577, 3815560, 3815561, 3815562, 3815563, 3815564, 3815565", ["1135:615:1120:749"] = "3815544, 3815551, 3815552, 3815553, 3815554, 3815555, 3815556, 3815557, 3815558, 3815545, 3815546, 3815547, 3815548, 3815549, 3815550", ["823:808:1474:1747"] = "3815578, 3815586, 3815587, 3815588, 3815589, 3815590, 3815591, 3815592, 3815593, 3815579, 3815580, 3815581, 3815582, 3815583, 3815584, 3815585", }, [1549] = { ["1079:1464:756:212"] = "3821078, 3821089, 3821100, 3821102, 3821103, 3821104, 3821105, 3821106, 3821107, 3821079, 3821080, 3821081, 3821082, 3821083, 3821084, 3821085, 3821086, 3821087, 3821088, 3821090, 3821091, 3821092, 3821093, 3821094, 3821095, 3821096, 3821097, 3821098, 3821099, 3821101", ["1094:978:1710:1545"] = "3821128, 3821139, 3821141, 3821142, 3821143, 3821144, 3821145, 3821146, 3821147, 3821129, 3821130, 3821131, 3821132, 3821133, 3821134, 3821135, 3821136, 3821137, 3821138, 3821140", ["1106:973:727:1534"] = "3821108, 3821119, 3821121, 3821122, 3821123, 3821124, 3821125, 3821126, 3821127, 3821109, 3821110, 3821111, 3821112, 3821113, 3821114, 3821115, 3821116, 3821117, 3821118, 3821120", ["1401:1434:1715:208"] = "3821148, 3821159, 3821170, 3821178, 3821179, 3821180, 3821181, 3821182, 3821183, 3821149, 3821150, 3821151, 3821152, 3821153, 3821154, 3821155, 3821156, 3821157, 3821158, 3821160, 3821161, 3821162, 3821163, 3821164, 3821165, 3821166, 3821167, 3821168, 3821169, 3821171, 3821172, 3821173, 3821174, 3821175, 3821176, 3821177", }, [1550] = { ["1562:2440:61:90"] = "3821334, 3821345, 3821356, 3821367, 3821378, 3821389, 3821400, 3821402, 3821403, 3821335, 3821336, 3821337, 3821338, 3821339, 3821340, 3821341, 3821342, 3821343, 3821344, 3821346, 3821347, 3821348, 3821349, 3821350, 3821351, 3821352, 3821353, 3821354, 3821355, 3821357, 3821358, 3821359, 3821360, 3821361, 3821362, 3821363, 3821364, 3821365, 3821366, 3821368, 3821369, 3821370, 3821371, 3821372, 3821373, 3821374, 3821375, 3821376, 3821377, 3821379, 3821380, 3821381, 3821382, 3821383, 3821384, 3821385, 3821386, 3821387, 3821388, 3821390, 3821391, 3821392, 3821393, 3821394, 3821395, 3821396, 3821397, 3821398, 3821399, 3821401", ["1660:2374:2076:111"] = "3821434, 3821451, 3821463, 3821475, 3821486, 3821498, 3821509, 3821511, 3821512, 3821435, 3821438, 3821440, 3821441, 3821442, 3821445, 3821447, 3821448, 3821449, 3821450, 3821452, 3821453, 3821454, 3821455, 3821456, 3821457, 3821459, 3821460, 3821461, 3821462, 3821464, 3821465, 3821466, 3821467, 3821468, 3821470, 3821471, 3821472, 3821473, 3821474, 3821476, 3821477, 3821478, 3821479, 3821480, 3821481, 3821482, 3821483, 3821484, 3821485, 3821487, 3821489, 3821490, 3821491, 3821492, 3821493, 3821494, 3821495, 3821496, 3821497, 3821499, 3821500, 3821501, 3821502, 3821503, 3821504, 3821505, 3821506, 3821507, 3821508, 3821510", ["725:2425:1478:102"] = "3821404, 3821415, 3821426, 3821428, 3821429, 3821430, 3821431, 3821432, 3821433, 3821405, 3821406, 3821407, 3821408, 3821409, 3821410, 3821411, 3821412, 3821413, 3821414, 3821416, 3821417, 3821418, 3821419, 3821420, 3821421, 3821422, 3821423, 3821424, 3821425, 3821427", }, [1552] = { ["1117:1052:2055:1290"] = "3822531, 3822552, 3822565, 3822567, 3822568, 3822570, 3822572, 3822574, 3822576, 3822533, 3822535, 3822537, 3822539, 3822541, 3822542, 3822544, 3822546, 3822548, 3822550, 3822554, 3822556, 3822558, 3822559, 3822561, 3822563", ["1290:1210:892:1302"] = "3822453, 3822482, 3822509, 3822513, 3822516, 3822519, 3822522, 3822525, 3822528, 3822456, 3822459, 3822461, 3822463, 3822466, 3822469, 3822472, 3822475, 3822478, 3822480, 3822485, 3822487, 3822489, 3822492, 3822494, 3822496, 3822498, 3822500, 3822503, 3822506, 3822512", ["1592:1281:415:134"] = "3822348, 3822374, 3822402, 3822431, 3822441, 3822443, 3822445, 3822448, 3822451, 3822350, 3822352, 3822354, 3822357, 3822359, 3822362, 3822363, 3822366, 3822369, 3822371, 3822377, 3822379, 3822382, 3822385, 3822387, 3822390, 3822392, 3822395, 3822397, 3822399, 3822404, 3822407, 3822409, 3822412, 3822415, 3822418, 3822421, 3822424, 3822426, 3822428, 3822434, 3822437, 3822440", ["1811:1114:1912:287"] = "3822578, 3822598, 3822618, 3822638, 3822642, 3822643, 3822645, 3822647, 3822649, 3822579, 3822581, 3822583, 3822585, 3822587, 3822589, 3822591, 3822592, 3822594, 3822596, 3822600, 3822602, 3822603, 3822605, 3822607, 3822609, 3822611, 3822613, 3822614, 3822616, 3822620, 3822622, 3822623, 3822625, 3822627, 3822629, 3822631, 3822633, 3822634, 3822636, 3822640", }, [1554] = { ["1060:1166:2122:1027"] = "3824052, 3824072, 3824084, 3824086, 3824088, 3824089, 3824091, 3824093, 3824095, 3824054, 3824056, 3824058, 3824059, 3824061, 3824063, 3824065, 3824066, 3824068, 3824070, 3824074, 3824075, 3824077, 3824079, 3824081, 3824082", ["1166:1131:2059:0"] = "3824139, 3824159, 3824171, 3824173, 3824174, 3824176, 3824178, 3824180, 3824181, 3824141, 3824143, 3824144, 3824146, 3824148, 3824150, 3824152, 3824153, 3824155, 3824157, 3824160, 3824162, 3824164, 3824166, 3824168, 3824169", ["775:2043:744:116"] = "3823960, 3823980, 3823999, 3824006, 3824008, 3824010, 3824011, 3824013, 3824015, 3823962, 3823964, 3823966, 3823967, 3823969, 3823971, 3823973, 3823974, 3823976, 3823978, 3823981, 3823983, 3823985, 3823987, 3823988, 3823990, 3823992, 3823994, 3823995, 3823997, 3824001, 3824002, 3824004", ["906:1314:1610:453"] = "3824096, 3824116, 3824127, 3824128, 3824130, 3824132, 3824134, 3824135, 3824137, 3824098, 3824100, 3824102, 3824103, 3824105, 3824107, 3824109, 3824110, 3824112, 3824114, 3824118, 3824119, 3824121, 3824123, 3824125", ["977:1180:1266:1179"] = "3824017, 3824036, 3824040, 3824042, 3824043, 3824045, 3824047, 3824049, 3824050, 3824018, 3824020, 3824022, 3824024, 3824025, 3824027, 3824029, 3824031, 3824033, 3824034, 3824038", }, [1555] = { ["1350:1420:1160:120"] = "3824750, 3824770, 3824790, 3824804, 3824806, 3824808, 3824809, 3824811, 3824813, 3824752, 3824754, 3824756, 3824757, 3824759, 3824761, 3824763, 3824764, 3824766, 3824768, 3824772, 3824774, 3824776, 3824777, 3824779, 3824781, 3824783, 3824785, 3824786, 3824788, 3824792, 3824794, 3824795, 3824797, 3824799, 3824801, 3824802", ["1381:1602:1849:696"] = "3824815, 3824834, 3824854, 3824873, 3824880, 3824882, 3824884, 3824885, 3824887, 3824816, 3824818, 3824820, 3824822, 3824824, 3824825, 3824827, 3824829, 3824831, 3824832, 3824836, 3824838, 3824840, 3824841, 3824843, 3824845, 3824847, 3824848, 3824850, 3824852, 3824855, 3824857, 3824859, 3824861, 3824862, 3824864, 3824866, 3824868, 3824869, 3824871, 3824875, 3824877, 3824878", ["994:1285:724:555"] = "3824707, 3824727, 3824737, 3824739, 3824741, 3824743, 3824745, 3824746, 3824748, 3824709, 3824710, 3824712, 3824714, 3824716, 3824718, 3824720, 3824721, 3824723, 3824725, 3824729, 3824730, 3824732, 3824734, 3824736", }, [1556] = { ["1108:919:1745:1408"] = "3825207, 3825227, 3825230, 3825232, 3825234, 3825236, 3825237, 3825239, 3825241, 3825209, 3825210, 3825212, 3825214, 3825216, 3825218, 3825220, 3825221, 3825223, 3825225, 3825228", ["1132:1401:719:1038"] = "3825153, 3825173, 3825192, 3825196, 3825198, 3825200, 3825201, 3825203, 3825205, 3825155, 3825157, 3825158, 3825160, 3825162, 3825164, 3825166, 3825167, 3825169, 3825171, 3825175, 3825176, 3825178, 3825180, 3825182, 3825184, 3825185, 3825187, 3825189, 3825191, 3825194", ["1338:1490:1727:18"] = "3825243, 3825263, 3825282, 3825296, 3825298, 3825300, 3825302, 3825304, 3825306, 3825245, 3825246, 3825248, 3825250, 3825252, 3825254, 3825255, 3825257, 3825259, 3825261, 3825264, 3825266, 3825268, 3825270, 3825271, 3825273, 3825275, 3825277, 3825279, 3825280, 3825284, 3825286, 3825288, 3825289, 3825291, 3825293, 3825295", }, [1557] = { ["1807:872:1286:951"] = "3825564, 3825579, 3825594, 3825600, 3825601, 3825603, 3825604, 3825605, 3825606, 3825566, 3825567, 3825568, 3825570, 3825571, 3825573, 3825574, 3825575, 3825576, 3825578, 3825580, 3825582, 3825583, 3825585, 3825586, 3825587, 3825589, 3825590, 3825592, 3825593, 3825596, 3825597, 3825599", ["938:1010:1680:49"] = "3825544, 3825553, 3825554, 3825556, 3825557, 3825559, 3825560, 3825561, 3825563, 3825545, 3825546, 3825547, 3825548, 3825549, 3825550, 3825552", ["945:1059:828:56"] = "3825524, 3825535, 3825537, 3825538, 3825539, 3825540, 3825541, 3825542, 3825543, 3825525, 3825526, 3825527, 3825528, 3825529, 3825530, 3825531, 3825532, 3825533, 3825534, 3825536", ["971:827:1559:1717"] = "3825607, 3825618, 3825619, 3825621, 3825622, 3825624, 3825625, 3825626, 3825627, 3825609, 3825610, 3825612, 3825613, 3825614, 3825615, 3825617", }, [1571] = { ["1005:825:2011:180"] = "3828534, 3828542, 3828543, 3828544, 3828545, 3828546, 3828547, 3828548, 3828549, 3828535, 3828536, 3828537, 3828538, 3828539, 3828540, 3828541", ["1014:1487:501:486"] = "3828466, 3828477, 3828483, 3828484, 3828485, 3828486, 3828487, 3828488, 3828489, 3828467, 3828468, 3828469, 3828470, 3828471, 3828472, 3828473, 3828474, 3828475, 3828476, 3828478, 3828479, 3828480, 3828481, 3828482", ["1323:670:2000:885"] = "3828550, 3828560, 3828561, 3828562, 3828563, 3828564, 3828565, 3828566, 3828567, 3828551, 3828552, 3828553, 3828554, 3828555, 3828556, 3828557, 3828558, 3828559", ["810:682:1319:877"] = "3828490, 3828494, 3828495, 3828496, 3828497, 3828498, 3828499, 3828500, 3828501, 3828491, 3828492, 3828493", ["877:812:1227:184"] = "3828518, 3828526, 3828527, 3828528, 3828529, 3828530, 3828531, 3828532, 3828533, 3828519, 3828520, 3828521, 3828522, 3828523, 3828524, 3828525", ["964:948:1144:1431"] = "3828502, 3828510, 3828511, 3828512, 3828513, 3828514, 3828515, 3828516, 3828517, 3828503, 3828504, 3828505, 3828506, 3828507, 3828508, 3828509", ["979:954:2013:1428"] = "3828568, 3828576, 3828577, 3828578, 3828579, 3828580, 3828581, 3828582, 3828583, 3828569, 3828570, 3828571, 3828572, 3828573, 3828574, 3828575", }, [1572] = { ["1007:1460:467:612"] = "3828734, 3828745, 3828751, 3828752, 3828753, 3828754, 3828755, 3828756, 3828757, 3828735, 3828736, 3828737, 3828738, 3828739, 3828740, 3828741, 3828742, 3828743, 3828744, 3828746, 3828747, 3828748, 3828749, 3828750", ["1586:1924:1920:448"] = "3828790, 3828801, 3828812, 3828823, 3828834, 3828842, 3828843, 3828844, 3828845, 3828791, 3828792, 3828793, 3828794, 3828795, 3828796, 3828797, 3828798, 3828799, 3828800, 3828802, 3828803, 3828804, 3828805, 3828806, 3828807, 3828808, 3828809, 3828810, 3828811, 3828813, 3828814, 3828815, 3828816, 3828817, 3828818, 3828819, 3828820, 3828821, 3828822, 3828824, 3828825, 3828826, 3828827, 3828828, 3828829, 3828830, 3828831, 3828832, 3828833, 3828835, 3828836, 3828837, 3828838, 3828839, 3828840, 3828841", ["833:1871:1274:228"] = "3828758, 3828769, 3828780, 3828784, 3828785, 3828786, 3828787, 3828788, 3828789, 3828759, 3828760, 3828761, 3828762, 3828763, 3828764, 3828765, 3828766, 3828767, 3828768, 3828770, 3828771, 3828772, 3828773, 3828774, 3828775, 3828776, 3828777, 3828778, 3828779, 3828781, 3828782, 3828783", }, [1578] = { ["1297:1026:1998:1191"] = "3830310, 3830321, 3830332, 3830334, 3830335, 3830336, 3830337, 3830338, 3830339, 3830311, 3830312, 3830313, 3830314, 3830315, 3830316, 3830317, 3830318, 3830319, 3830320, 3830322, 3830323, 3830324, 3830325, 3830326, 3830327, 3830328, 3830329, 3830330, 3830331, 3830333", ["1415:1037:251:1197"] = "3830262, 3830273, 3830284, 3830286, 3830287, 3830288, 3830289, 3830290, 3830291, 3830263, 3830264, 3830265, 3830266, 3830267, 3830268, 3830269, 3830270, 3830271, 3830272, 3830274, 3830275, 3830276, 3830277, 3830278, 3830279, 3830280, 3830281, 3830282, 3830283, 3830285", ["2454:1432:750:12"] = "3830340, 3830351, 3830362, 3830373, 3830384, 3830395, 3830397, 3830398, 3830399, 3830341, 3830342, 3830343, 3830344, 3830345, 3830346, 3830347, 3830348, 3830349, 3830350, 3830352, 3830353, 3830354, 3830355, 3830356, 3830357, 3830358, 3830359, 3830360, 3830361, 3830363, 3830364, 3830365, 3830366, 3830367, 3830368, 3830369, 3830370, 3830371, 3830372, 3830374, 3830375, 3830376, 3830377, 3830378, 3830379, 3830380, 3830381, 3830382, 3830383, 3830385, 3830386, 3830387, 3830388, 3830389, 3830390, 3830391, 3830392, 3830393, 3830394, 3830396", ["623:1489:1521:906"] = "3830292, 3830302, 3830303, 3830304, 3830305, 3830306, 3830307, 3830308, 3830309, 3830293, 3830294, 3830295, 3830296, 3830297, 3830298, 3830299, 3830300, 3830301", }, [1579] = { ["754:5050:1547:231"] = "3830574, 3830585, 3830594, 3830595, 3830596, 3830597, 3830598, 3830599, 3830600, 3830575, 3830576, 3830577, 3830578, 3830579, 3830580, 3830581, 3830582, 3830583, 3830584, 3830586, 3830587, 3830588, 3830589, 3830590, 3830591, 3830592, 3830593, 0", ["765:1894:959:406"] = "3830550, 3830561, 3830567, 3830568, 3830569, 3830570, 3830571, 3830572, 3830573, 3830551, 3830552, 3830553, 3830554, 3830555, 3830556, 3830557, 3830558, 3830559, 3830560, 3830562, 3830563, 3830564, 3830565, 3830566", ["786:1887:2142:396"] = "3830601, 3830612, 3830623, 3830627, 3830628, 3830629, 3830630, 3830631, 3830632, 3830602, 3830603, 3830604, 3830605, 3830606, 3830607, 3830608, 3830609, 3830610, 3830611, 3830613, 3830614, 3830615, 3830616, 3830617, 3830618, 3830619, 3830620, 3830621, 3830622, 3830624, 3830625, 3830626", }, [1580] = { ["1156:465:602:1062"] = "3830798, 3830800, 3830801, 3830802, 3830803, 3830804, 3830805, 3830806, 3830807, 3830799", ["1225:708:489:510"] = "3830783, 3830790, 3830791, 3830792, 3830793, 3830794, 3830795, 3830796, 3830797, 3830784, 3830785, 3830786, 3830787, 3830788, 3830789", ["1259:509:2156:653"] = "3830826, 3830828, 3830829, 3830830, 3830831, 3830832, 3830833, 3830834, 3830835, 3830827", ["1266:941:2151:1041"] = "3830836, 3830847, 3830849, 3830850, 3830851, 3830852, 3830853, 3830854, 3830855, 3830837, 3830838, 3830839, 3830840, 3830841, 3830842, 3830843, 3830844, 3830845, 3830846, 3830848", ["727:1420:1579:396"] = "3830808, 3830818, 3830819, 3830820, 3830821, 3830822, 3830823, 3830824, 3830825, 3830809, 3830810, 3830811, 3830812, 3830813, 3830814, 3830815, 3830816, 3830817", }, [1582] = { ["1353:1415:537:717"] = "3831310, 3831321, 3831332, 3831340, 3831341, 3831342, 3831343, 3831344, 3831345, 3831311, 3831312, 3831313, 3831314, 3831315, 3831316, 3831317, 3831318, 3831319, 3831320, 3831322, 3831323, 3831324, 3831325, 3831326, 3831327, 3831328, 3831329, 3831330, 3831331, 3831333, 3831334, 3831335, 3831336, 3831337, 3831338, 3831339", ["618:2391:1775:87"] = "3831346, 3831357, 3831368, 3831370, 3831371, 3831372, 3831373, 3831374, 3831375, 3831347, 3831348, 3831349, 3831350, 3831351, 3831352, 3831353, 3831354, 3831355, 3831356, 3831358, 3831359, 3831360, 3831361, 3831362, 3831363, 3831364, 3831365, 3831366, 3831367, 3831369", ["949:1036:2246:872"] = "3831376, 3831387, 3831389, 3831390, 3831391, 3831392, 3831393, 3831394, 3831395, 3831377, 3831378, 3831379, 3831380, 3831381, 3831382, 3831383, 3831384, 3831385, 3831386, 3831388", }, [1585] = { ["1028:1024:1472:1536"] = "3816328, 3816339, 3816341, 3816342, 3816343, 3816344, 3816345, 3816349, 3816355, 3816329, 3816330, 3816331, 3816332, 3816333, 3816334, 3816335, 3816336, 3816337, 3816338, 3816340", ["1080:487:1809:585"] = "3816300, 3816302, 3816303, 3816304, 3816305, 3816306, 3816307, 3816308, 3816309, 3816301", ["1434:734:1483:920"] = "3816310, 3816320, 3816321, 3816322, 3816323, 3816324, 3816325, 3816326, 3816327, 3816311, 3816312, 3816313, 3816314, 3816315, 3816316, 3816317, 3816318, 3816319", ["535:705:1779:0"] = "3816259, 3816260, 3816261, 3816262, 3816263, 3816264, 3816265, 3816266, 3816267", ["940:647:970:158"] = "3816268, 3816272, 3816273, 3816274, 3816275, 3816276, 3816277, 3816278, 3816279, 3816269, 3816270, 3816271", ["983:1029:960:617"] = "3816280, 3816291, 3816293, 3816294, 3816295, 3816296, 3816297, 3816298, 3816299, 3816281, 3816282, 3816283, 3816284, 3816285, 3816286, 3816287, 3816288, 3816289, 3816290, 3816292", }, [1586] = { ["1044:733:1741:1635"] = "3819049, 3819056, 3819057, 3819058, 3819059, 3819060, 3819061, 3819062, 3819063, 3819050, 3819051, 3819052, 3819053, 3819054, 3819055", ["1370:940:1943:26"] = "3818973, 3818984, 3818990, 3818991, 3818992, 3818993, 3818994, 3818995, 3818996, 3818974, 3818975, 3818976, 3818977, 3818978, 3818979, 3818980, 3818981, 3818982, 3818983, 3818985, 3818986, 3818987, 3818988, 3818989", ["1439:1606:483:810"] = "3819064, 3819075, 3819086, 3819097, 3819101, 3819102, 3819103, 3819104, 3819105, 3819065, 3819066, 3819067, 3819068, 3819069, 3819070, 3819071, 3819072, 3819073, 3819074, 3819076, 3819077, 3819078, 3819079, 3819080, 3819081, 3819082, 3819083, 3819084, 3819085, 3819087, 3819088, 3819089, 3819090, 3819091, 3819092, 3819093, 3819094, 3819095, 3819096, 3819098, 3819099, 3819100", ["1873:1221:1807:812"] = "3818998, 3819011, 3819022, 3819033, 3819035, 3819036, 3819037, 3819038, 3819039, 3819001, 3819002, 3819003, 3819004, 3819005, 3819006, 3819007, 3819008, 3819009, 3819010, 3819012, 3819013, 3819014, 3819015, 3819016, 3819017, 3819018, 3819019, 3819020, 3819021, 3819023, 3819024, 3819025, 3819026, 3819027, 3819028, 3819029, 3819030, 3819031, 3819032, 3819034", ["603:579:1819:1159"] = "3819040, 3819041, 3819042, 3819043, 3819044, 3819045, 3819046, 3819047, 3819048", ["842:1244:400:1273"] = "3819106, 3819117, 3819119, 3819120, 3819121, 3819122, 3819123, 3819124, 3819125, 3819107, 3819108, 3819109, 3819110, 3819111, 3819112, 3819113, 3819114, 3819115, 3819116, 3819118", }, [1587] = { ["1208:1747:499:289"] = "3821845, 3821865, 3821885, 3821900, 3821902, 3821904, 3821905, 3821907, 3821909, 3821847, 3821849, 3821851, 3821852, 3821854, 3821856, 3821858, 3821860, 3821862, 3821863, 3821867, 3821869, 3821871, 3821873, 3821874, 3821876, 3821878, 3821880, 3821882, 3821883, 3821889, 3821891, 3821893, 3821895, 3821896, 3821898", ["1442:1755:2130:293"] = "3821944, 3821964, 3821984, 3822004, 3822011, 3822013, 3822015, 3822017, 3822019, 3821946, 3821947, 3821949, 3821951, 3821953, 3821955, 3821957, 3821958, 3821960, 3821962, 3821966, 3821967, 3821969, 3821971, 3821973, 3821975, 3821976, 3821978, 3821980, 3821982, 3821986, 3821988, 3821989, 3821991, 3821993, 3821995, 3821997, 3821999, 3822001, 3822002, 3822006, 3822008, 3822010", ["647:1310:1594:934"] = "3821911, 3821929, 3821931, 3821933, 3821935, 3821936, 3821938, 3821940, 3821942, 3821913, 3821914, 3821916, 3821918, 3821920, 3821922, 3821924, 3821925, 3821927", ["669:597:1587:449"] = "3822021, 3822022, 3822024, 3822026, 3822028, 3822030, 3822032, 3822034, 3822035", }, [1590] = { ["1388:1297:292:102"] = "3814600, 3814611, 3814622, 3814630, 3814631, 3814632, 3814633, 3814634, 3814635, 3814601, 3814602, 3814603, 3814604, 3814605, 3814606, 3814607, 3814608, 3814609, 3814610, 3814612, 3814613, 3814614, 3814615, 3814616, 3814617, 3814618, 3814619, 3814620, 3814621, 3814623, 3814624, 3814625, 3814626, 3814627, 3814628, 3814629", ["1408:1211:288:1305"] = "3814644, 3814655, 3814666, 3814668, 3814669, 3814670, 3814671, 3814672, 3814673, 3814645, 3814646, 3814647, 3814648, 3814649, 3814650, 3814651, 3814652, 3814653, 3814654, 3814656, 3814657, 3814658, 3814659, 3814660, 3814661, 3814662, 3814663, 3814664, 3814665, 3814667", ["1417:1229:2032:1306"] = "3814713, 3814724, 3814735, 3814737, 3814738, 3814739, 3814740, 3814741, 3814742, 3814714, 3814715, 3814716, 3814717, 3814718, 3814719, 3814720, 3814721, 3814722, 3814723, 3814725, 3814726, 3814727, 3814728, 3814729, 3814730, 3814731, 3814732, 3814733, 3814734, 3814736", ["1432:1315:2024:85"] = "3814751, 3814762, 3814773, 3814781, 3814782, 3814783, 3814784, 3814785, 3814786, 3814752, 3814753, 3814754, 3814755, 3814756, 3814757, 3814758, 3814759, 3814760, 3814761, 3814763, 3814764, 3814765, 3814766, 3814767, 3814768, 3814769, 3814770, 3814771, 3814772, 3814774, 3814775, 3814776, 3814777, 3814778, 3814779, 3814780", ["559:1052:1589:1508"] = "3814698, 3814705, 3814706, 3814707, 3814708, 3814709, 3814710, 3814711, 3814712, 3814699, 3814700, 3814701, 3814702, 3814703, 3814704", ["571:539:1574:1080"] = "3814689, 3814690, 3814691, 3814692, 3814693, 3814694, 3814695, 3814696, 3814697", ["673:1186:1515:0"] = "3814674, 3814681, 3814682, 3814683, 3814684, 3814685, 3814686, 3814687, 3814688, 3814675, 3814676, 3814677, 3814678, 3814679, 3814680", ["954:507:2005:1105"] = "3814743, 3814744, 3814745, 3814746, 3814747, 3814748, 3814749, 3814750", ["970:475:741:1119"] = "3814636, 3814637, 3814638, 3814639, 3814640, 3814641, 3814642, 3814643", }, [1591] = { ["1384:1253:1106:1279"] = "3823023, 3823042, 3823064, 3823068, 3823071, 3823074, 3823077, 3823078, 3823081, 3823025, 3823026, 3823028, 3823030, 3823032, 3823033, 3823035, 3823037, 3823039, 3823040, 3823044, 3823046, 3823048, 3823049, 3823051, 3823053, 3823055, 3823056, 3823059, 3823061, 3823066", ["854:1010:2003:375"] = "3822995, 3823009, 3823011, 3823012, 3823014, 3823016, 3823017, 3823019, 3823021, 3822997, 3822998, 3823000, 3823002, 3823004, 3823005, 3823007", ["876:1317:739:152"] = "3822911, 3822930, 3822941, 3822943, 3822944, 3822946, 3822948, 3822950, 3822951, 3822913, 3822915, 3822916, 3822918, 3822920, 3822922, 3822923, 3822925, 3822927, 3822929, 3822932, 3822934, 3822936, 3822937, 3822939", ["902:1372:1496:0"] = "3822953, 3822972, 3822983, 3822984, 3822986, 3822988, 3822990, 3822991, 3822993, 3822955, 3822957, 3822958, 3822960, 3822962, 3822964, 3822965, 3822967, 3822969, 3822971, 3822974, 3822976, 3822978, 3822979, 3822981", }, [1592] = { ["1226:1196:1303:1301"] = "3826854, 3826865, 3826873, 3826874, 3826875, 3826876, 3826877, 3826878, 3826879, 3826855, 3826856, 3826857, 3826858, 3826859, 3826860, 3826861, 3826862, 3826863, 3826864, 3826866, 3826945, 3826947, 3826870, 3826871, 3826872", ["3006:1749:408:22"] = "3826880, 3826891, 3826901, 3826912, 3826923, 3826934, 3826946, 3826958, 3826964, 3826881, 3826882, 3826883, 3826884, 3826885, 3826886, 3826887, 3826888, 3826889, 3826890, 3826892, 3826893, 3826894, 3826976, 3826895, 3826896, 3826897, 3826898, 3826899, 3826900, 3826902, 3826903, 3826904, 3826905, 3826906, 3826907, 3826908, 3826909, 3826910, 3826911, 3826913, 3826914, 3826915, 3826916, 3826917, 3826918, 3826919, 3826920, 3826921, 3826922, 3826924, 3826925, 3826926, 3826927, 3826928, 3826929, 3826930, 3826931, 3826932, 3826933, 3826935, 3826936, 3826937, 3826938, 3826939, 3826940, 3826941, 3826942, 3826943, 3826944, 3826948, 3826949, 3826950, 3826951, 3826952, 3826953, 3826954, 3826955, 3826956, 3826957, 3826959, 3826960, 3826961, 3826962, 3826963", }, [1600] = { ["1022:918:1693:66"] = "3815964, 3815972, 3815973, 3815974, 3815975, 3815976, 3815977, 3815978, 3815979, 3815965, 3815966, 3815967, 3815968, 3815969, 3815970, 3815971", ["1064:818:1982:1742"] = "3816013, 3816024, 3816026, 3816027, 3816028, 3816029, 3816030, 3816031, 3816032, 3816014, 3816015, 3816016, 3816017, 3816018, 3816019, 3816020, 3816021, 3816022, 3816023, 3816025", ["1539:723:577:1835"] = "3815992, 3816003, 3816006, 3816007, 3816008, 3816009, 3816010, 3816011, 3816012, 3815993, 3815994, 3815995, 3815996, 3815997, 3815998, 3815999, 3816000, 3816001, 3816002, 3816004, 3816005", ["1875:1551:1167:485"] = "3816033, 3816044, 3816055, 3816066, 3816077, 3816085, 3816086, 3816091, 3816092, 3816034, 3816035, 3816036, 3816037, 3816038, 3816039, 3816040, 3816041, 3816042, 3816043, 3816045, 3816046, 3816047, 3816048, 3816049, 3816050, 3816051, 3816052, 3816053, 3816054, 3816056, 3816057, 3816058, 3816059, 3816060, 3816061, 3816062, 3816063, 3816064, 3816065, 3816067, 3816068, 3816069, 3816070, 3816071, 3816072, 3816073, 3816074, 3816075, 3816076, 3816078, 3816079, 3816080, 3816081, 3816082, 3816083, 3816084", ["636:1035:1207:9"] = "3815949, 3815956, 3815957, 3815958, 3815959, 3815960, 3815961, 3815962, 3815963, 3815950, 3815951, 3815952, 3815953, 3815954, 3815955", ["665:937:594:1017"] = "3815980, 3815984, 3815985, 3815986, 3815987, 3815988, 3815989, 3815990, 3815991, 3815981, 3815982, 3815983", ["699:1107:677:56"] = "3815926, 3815933, 3815934, 3815935, 3815936, 3815945, 3815946, 3815947, 3815948, 3815927, 3815928, 3815929, 3815930, 3815931, 3815932", }, [1601] = { ["1480:978:1247:1460"] = "3829896, 3829907, 3829913, 3829914, 3829915, 3829916, 3829917, 3829918, 3829919, 3829897, 3829898, 3829899, 3829900, 3829901, 3829902, 3829903, 3829904, 3829905, 3829906, 3829908, 3829909, 3829910, 3829911, 3829912", ["1664:1327:1104:231"] = "3829920, 3829931, 3829942, 3829953, 3829957, 3829958, 3829959, 3829960, 3829961, 3829921, 3829922, 3829923, 3829924, 3829925, 3829926, 3829927, 3829928, 3829929, 3829930, 3829932, 3829933, 3829934, 3829935, 3829936, 3829937, 3829938, 3829939, 3829940, 3829941, 3829943, 3829944, 3829945, 3829946, 3829947, 3829948, 3829949, 3829950, 3829951, 3829952, 3829954, 3829955, 3829956", }, [1693] = { ["1078:824:772:598"] = "4178966, 4178967, 4178968, 4178969, 4178970, 4178971, 4178972, 4178973, 4178974, 4178975, 4178976, 4178977, 4178978, 4178979, 4178980, 4178981, 4178982, 4178983, 4178984, 4178985", ["954:1076:262:1423"] = "4178902, 4178903, 4178904, 4178905, 4178906, 4178907, 4178908, 4178909, 4178910, 4178911, 4178912, 4178913, 4178914, 4178915, 4178916, 4178917, 4178918, 4178919, 4178920, 4178921", ["1053:934:49:918"] = "4178986, 4178987, 4178988, 4178989, 4178990, 4178991, 4178992, 4178993, 4178994, 4178995, 4178996, 4178997, 4178998, 4178999, 4179000, 4179001, 4179002, 4179003, 4179004, 4179005", ["1488:1946:1797:0"] = "4178854, 4178855, 4178856, 4178857, 4178858, 4178859, 4178860, 4178861, 4178862, 4178863, 4178864, 4178865, 4178866, 4178867, 4178868, 4178869, 4178870, 4178871, 4178872, 4178873, 4178874, 4178875, 4178876, 4178877, 4178878, 4178879, 4178880, 4178881, 4178882, 4178883, 4178884, 4178885, 4178886, 4178887, 4178888, 4178889, 4178890, 4178891, 4178892, 4178893, 4178894, 4178895, 4178896, 4178897, 4178898, 4178899, 4178900, 4178901", ["1504:929:1171:0"] = "4179055, 4179056, 4179057, 4179058, 4179059, 4179060, 4179061, 4179062, 4179063, 4179064, 4179065, 4179066, 4179067, 4179068, 4179069, 4179070, 4179071, 4179072, 4179073, 4179074, 4179075, 4179076, 4179077, 4179078", ["928:729:1404:1831"] = "4178826, 4178827, 4178828, 4178829, 4178830, 4178831, 4178832, 4178833, 4178834, 4178835, 4178836, 4178837", ["928:1359:808:1201"] = "4178922, 4178923, 4178924, 4178925, 4178926, 4178927, 4178928, 4178929, 4178930, 4178931, 4178932, 4178933, 4178934, 4178935, 4178936, 4178937, 4178938, 4178939, 4178940, 4178941, 4178942, 4178943, 4178944, 4178945", ["1232:1236:0:342"] = "4179006, 4179007, 4179008, 4179009, 4179010, 4179011, 4179012, 4179013, 4179014, 4179015, 4179016, 4179017, 4179018, 4179019, 4179020, 4179021, 4179022, 4179023, 4179024, 4179025, 4179026, 4179027, 4179028, 4179029, 4179030", ["1408:988:1856:1572"] = "4178802, 4178803, 4178804, 4178805, 4178806, 4178807, 4178808, 4178809, 4178810, 4178811, 4178812, 4178813, 4178814, 4178815, 4178816, 4178817, 4178818, 4178819, 4178820, 4178821, 4178822, 4178823, 4178824, 4178825", ["1009:835:1442:1262"] = "4178838, 4178839, 4178840, 4178841, 4178842, 4178843, 4178844, 4178845, 4178846, 4178847, 4178848, 4178849, 4178850, 4178851, 4178852, 4178853", ["1395:932:183:0"] = "4179031, 4179032, 4179033, 4179034, 4179035, 4179036, 4179037, 4179038, 4179039, 4179040, 4179041, 4179042, 4179043, 4179044, 4179045, 4179046, 4179047, 4179048, 4179049, 4179050, 4179051, 4179052, 4179053, 4179054", ["1186:821:1100:696"] = "4178946, 4178947, 4178948, 4178949, 4178950, 4178951, 4178952, 4178953, 4178954, 4178955, 4178956, 4178957, 4178958, 4178959, 4178960, 4178961, 4178962, 4178963, 4178964, 4178965", }, [1648] = { ["929:817:597:1053"] = "4075090, 4075098, 4075099, 4075100, 4075101, 4075102, 4075103, 4075104, 4075105, 4075091, 4075092, 4075093, 4075094, 4075095, 4075096, 4075097", ["1871:1010:1231:1429"] = "4075058, 4075069, 4075080, 4075084, 4075085, 4075086, 4075087, 4075088, 4075089, 4075059, 4075060, 4075061, 4075062, 4075063, 4075064, 4075065, 4075066, 4075067, 4075068, 4075070, 4075071, 4075072, 4075073, 4075074, 4075075, 4075076, 4075077, 4075078, 4075079, 4075081, 4075082, 4075083", ["1412:792:1474:891"] = "4075034, 4075045, 4075051, 4075052, 4075053, 4075054, 4075055, 4075056, 4075057, 4075035, 4075036, 4075037, 4075038, 4075039, 4075040, 4075041, 4075042, 4075043, 4075044, 4075046, 4075047, 4075048, 4075049, 4075050", ["1264:715:1841:645"] = "4075019, 4075026, 4075027, 4075028, 4075029, 4075030, 4075031, 4075032, 4075033, 4075020, 4075021, 4075022, 4075023, 4075024, 4075025", ["834:696:1500:0"] = "4075007, 4075011, 4075012, 4075013, 4075014, 4075015, 4075016, 4075017, 4075018, 4075008, 4075009, 4075010", ["1362:1088:945:0"] = "4074977, 4074988, 4074999, 4075001, 4075002, 4075003, 4075004, 4075005, 4075006, 4074978, 4074979, 4074980, 4074981, 4074982, 4074983, 4074984, 4074985, 4074986, 4074987, 4074989, 4074990, 4074991, 4074992, 4074993, 4074994, 4074995, 4074996, 4074997, 4074998, 4075000", ["844:875:2113:0"] = "4074961, 4074969, 4074970, 4074971, 4074972, 4074973, 4074974, 4074975, 4074976, 4074962, 4074963, 4074964, 4074965, 4074966, 4074967, 4074968", ["1612:1268:153:0"] = "4074926, 4074937, 4074948, 4074955, 4074956, 4074957, 4074958, 4074959, 4074960, 4074927, 4074928, 4074929, 4074930, 4074931, 4074932, 4074933, 4074934, 4074935, 4074936, 4074938, 4074939, 4074940, 4074941, 4074942, 4074943, 4074944, 4074945, 4074946, 4074947, 4074949, 4074950, 4074951, 4074952, 4074953, 4074954", ["766:637:958:997"] = "4074917, 4074918, 4074919, 4074920, 4074921, 4074922, 4074923, 4074924, 4074925", }, --[[ Zereth Mortis ]] [1650] = { ["1008:726:1736:1363"] = "4261324, 4261328, 4261329, 4261330, 4261331, 4261332, 4261333, 4261334, 4261335, 4261325, 4261326, 4261327", ["1072:1207:269:730"] = "4261352, 4261363, 4261370, 4261371, 4261372, 4261373, 4261374, 4261375, 4261376, 4261353, 4261354, 4261355, 4261356, 4261357, 4261358, 4261359, 4261360, 4261361, 4261362, 4261364, 4261365, 4261366, 4261367, 4261368, 4261369", ["1117:1012:777:1548"] = "4261386, 4261397, 4261399, 4261400, 4261401, 4261402, 4261403, 4261404, 4261405, 4261387, 4261388, 4261389, 4261390, 4261391, 4261392, 4261393, 4261394, 4261395, 4261396, 4261398", ["1289:1364:364:57"] = "4261530, 4261544, 4261555, 4261563, 4261564, 4261565, 4261566, 4261567, 4261568, 4261531, 4261532, 4261533, 4261534, 4261535, 4261536, 4261538, 4261539, 4261541, 4261543, 4261545, 4261546, 4261547, 4261548, 4261549, 4261550, 4261551, 4261552, 4261553, 4261554, 4261556, 4261557, 4261558, 4261559, 4261560, 4261561, 4261562", ["1362:1236:2240:35"] = "4261488, 4261499, 4261510, 4261512, 4261513, 4261514, 4261515, 4261516, 4261517, 4261489, 4261490, 4261491, 4261492, 4261493, 4261494, 4261495, 4261496, 4261497, 4261498, 4261500, 4261501, 4261502, 4261503, 4261504, 4261505, 4261506, 4261507, 4261508, 4261509, 4261511", ["1709:1426:2072:665"] = "4261437, 4261448, 4261459, 4261470, 4261474, 4261475, 4261476, 4261477, 4261478, 4261438, 4261439, 4261440, 4261441, 4261442, 4261443, 4261444, 4261445, 4261446, 4261447, 4261449, 4261450, 4261451, 4261452, 4261453, 4261454, 4261455, 4261456, 4261457, 4261458, 4261460, 4261461, 4261462, 4261463, 4261464, 4261465, 4261466, 4261467, 4261468, 4261469, 4261471, 4261472, 4261473", ["516:516:2005:872"] = "4261479, 4261480, 4261481, 4261482, 4261483, 4261484, 4261485, 4261486, 4261487", ["563:715:1641:431"] = "4261569, 4261570, 4261571, 4261572, 4261573, 4261574, 4261575, 4261576, 4261577", ["579:479:1058:1264"] = "4261406, 4261407, 4261408, 4261409, 4261410, 4261411", ["582:590:1912:112"] = "4261336, 4261337, 4261338, 4261339, 4261340, 4261341, 4261349, 4261350, 4261351", ["629:554:900:1499"] = "4261412, 4261413, 4261414, 4261415, 4261416, 4261417, 4261418, 4261419, 4261420", ["649:666:1162:535"] = "4261283, 4261284, 4261285, 4261286, 4261287, 4261288, 4261289, 4261290, 4261291", ["736:755:1466:991"] = "4261377, 4261378, 4261379, 4261380, 4261381, 4261382, 4261383, 4261384, 4261385", ["823:628:1497:1932"] = "4261292, 4261296, 4261297, 4261298, 4261299, 4261300, 4261301, 4261302, 4261303, 4261293, 4261294, 4261295", ["880:1087:1924:140"] = "4261304, 4261315, 4261317, 4261318, 4261319, 4261320, 4261321, 4261322, 4261323, 4261305, 4261306, 4261307, 4261308, 4261309, 4261310, 4261311, 4261312, 4261313, 4261314, 4261316", ["928:910:1198:0"] = "4261421, 4261429, 4261430, 4261431, 4261432, 4261433, 4261434, 4261435, 4261436, 4261422, 4261423, 4261424, 4261425, 4261426, 4261427, 4261428", ["986:700:1841:1640"] = "4261518, 4261522, 4261523, 4261524, 4261525, 4261526, 4261527, 4261528, 4261529, 4261519, 4261520, 4261521", }, [1672] = { -- 1967 ["782:1388:1758:1018"] = "4083061,4083072,4083078,4083079,4083080,4083081,4083082,4083083,4083084,4083062,4083063,4083064,4083065,4083066,4083067,4083068,4083069,4083070,4083071,4083073,4083074,4083075,4083076,4083077", ["1041:518:833:1006"] = "4083046,4083053,4083054,4083055,4083056,4083057,4083058,4083059,4083060,4083047,4083048,4083049,4083050,4083051,4083052", ["1347:1265:577:1295"] = "4083085,4083096,4083107,4083109,4083110,4083111,4083112,4083113,4083114,4083086,4083087,4083088,4083089,4083090,4083091,4083092,4083093,4083094,4083095,4083097,4083098,4083099,4083100,4083101,4083102,4083103,4083104,4083105,4083106,4083108", ["1864:1120:866:78"] = "4083006,4083017,4083028,4083039,4083041,4083042,4083043,4083044,4083045,4083007,4083008,4083009,4083010,4083011,4083012,4083013,4083014,4083015,4083016,4083018,4083019,4083020,4083021,4083022,4083023,4083024,4083025,4083026,4083027,4083029,4083030,4083031,4083032,4083033,4083034,4083035,4083036,4083037,4083038,4083040", }, [1673] = { -- 1968 ["592:913:2376:750"] = "4083330,4083334,4083335,4083336,4083337,4083338,4083339,4083340,4083341,4083331,4083332,4083333", ["992:991:1851:1559"] = "4083314,4083322,4083323,4083324,4083325,4083326,4083327,4083328,4083329,4083315,4083316,4083317,4083318,4083319,4083320,4083321", ["993:743:1479:1227"] = "4083302,4083306,4083307,4083308,4083309,4083310,4083311,4083312,4083313,4083303,4083304,4083305", ["1021:484:1491:842"] = "4083342,4083343,4083344,4083345,4083346,4083347,4083348,4083349", ["1281:939:1254:3"] = "4083350,4083361,4083367,4083368,4083369,4083370,4083371,4083372,4083373,4083351,4083352,4083353,4083354,4083355,4083356,4083357,4083358,4083359,4083360,4083362,4083363,4083364,4083365,4083366", ["1356:1298:261:776"] = "4083265,4083276,4083287,4083296,4083297,4083298,4083299,4083300,4083301,4083266,4083267,4083268,4083269,4083270,4083271,4083272,4083273,4083274,4083275,4083277,4083278,4083279,4083280,4083281,4083282,4083283,4083284,4083285,4083286,4083288,4083289,4083290,4083291,4083293,4083294,4083295", }, [1674] = { -- 1969 ["334:968:1636:375"] = "4083620,4083621,4083629,4083633,4083634,4083635,4083636,4083637", ["652:445:1954:1282"] = "4083594,4083595,4083596,4083597,4083598,4083599", ["771:1152:1876:218"] = "4083600,4083611,4083613,4083614,4083615,4083616,4083617,4083618,4083619,4083601,4083602,4083603,4083604,4083605,4083606,4083607,4083608,4083609,4083610,4083612", ["889:1071:845:275"] = "4083638,4083649,4083651,4083652,4083653,4083654,4083655,4083656,4083657,4083639,4083640,4083641,4083642,4083643,4083644,4083645,4083646,4083647,4083648,4083650", ["973:722:1949:1633"] = "4083544,4083548,4083549,4083550,4083551,4083552,4083553,4083554,4083555,4083545,4083546,4083547", ["998:475:1052:1247"] = "4083576,4083577,4083585,4083588,4083590,4083591,4083592,4083593", ["1151:833:894:1627"] = "4083556,4083567,4083569,4083570,4083571,4083572,4083573,4083574,4083575,4083557,4083558,4083559,4083560,4083561,4083562,4083563,4083564,4083565,4083566,4083568", }, [1677] = { -- 1979 ["475:526:777:875"] = "4084124,4084125,4084126,4084127,4084128,4084129", ["489:857:855:218"] = "4084167,4084168,4084169,4084170,4084171,4084172,4084173,4084174", ["804:658:1060:824"] = "4084155,4084159,4084160,4084161,4084162,4084163,4084164,4084165,4084166,4084156,4084157,4084158", ["872:1021:297:954"] = "4084108,4084116,4084117,4084118,4084119,4084120,4084121,4084122,4084123,4084109,4084110,4084111,4084112,4084113,4084114,4084115", ["936:780:1248:167"] = "4084175,4084183,4084184,4084185,4084186,4084187,4084188,4084189,4084190,4084176,4084177,4084178,4084179,4084180,4084181,4084182", ["1057:723:1287:1612"] = "4084130,4084137,4084138,4084139,4084140,4084141,4084142,4084143,4084144,4084131,4084132,4084133,4084134,4084135,4084136", ["1084:336:1058:1399"] = "4084145,4084147,4084148,4084149,4084150,4084151,4084152,4084153,4084154,4084146", ["1980:1234:1772:697"] = "4084191,4084202,4084213,4084224,4084226,4084227,4084228,4084229,4084230,4084192,4084193,4084194,4084195,4084196,4084197,4084198,4084199,4084200,4084201,4084203,4084204,4084205,4084206,4084207,4084208,4084209,4084210,4084211,4084212,4084214,4084215,4084216,4084217,4084218,4084219,4084220,4084221,4084222,4084223,4084225", }, ---------------------------------------------------------------------- -- Dragonflight ---------------------------------------------------------------------- --[[Ohn'ahran Plains]] [1705] = {["1023:1309:505:531"] = "4697336, 4697347, 4697353, 4697354, 4697355, 4697356, 4697357, 4697358, 4697359, 4697337, 4697338, 4697339, 4697340, 4697341, 4697342, 4697343, 4697344, 4697345, 4697346, 4697348, 4697349, 4697350, 4697351, 4697352", ["1184:961:1511:1419"] = "4697514, 4697525, 4697527, 4697528, 4697529, 4697530, 4697531, 4697532, 4697533, 4697515, 4697516, 4697517, 4697518, 4697519, 4697520, 4697521, 4697522, 4697523, 4697524, 4697526", ["1270:973:2432:752"] = "4697422, 4697433, 4697435, 4697436, 4697437, 4697438, 4697439, 4697440, 4697441, 4697423, 4697424, 4697425, 4697426, 4697427, 4697428, 4697429, 4697430, 4697431, 4697432, 4697434", ["1285:1226:2343:1317"] = "4697360, 4697371, 4697382, 4697384, 4697385, 4697386, 4697387, 4697388, 4697389, 4697361, 4697362, 4697363, 4697364, 4697365, 4697366, 4697367, 4697368, 4697369, 4697370, 4697372, 4697373, 4697374, 4697375, 4697376, 4697377, 4697378, 4697379, 4697380, 4697381, 4697383", ["1337:1164:2464:112"] = "4697442, 4697453, 4697464, 4697466, 4697467, 4697468, 4697469, 4697470, 4697471, 4697443, 4697444, 4697445, 4697446, 4697447, 4697448, 4697449, 4697450, 4697451, 4697452, 4697454, 4697455, 4697456, 4697457, 4697458, 4697459, 4697460, 4697461, 4697462, 4697463, 4697465", ["1341:1228:512:1211"] = "4697472, 4697483, 4697494, 4697496, 4697497, 4697498, 4697499, 4697500, 4697501, 4697473, 4697474, 4697475, 4697476, 4697477, 4697478, 4697479, 4697480, 4697481, 4697482, 4697484, 4697485, 4697486, 4697487, 4697488, 4697489, 4697490, 4697491, 4697492, 4697493, 4697495", ["1444:1292:1338:404"] = "4697284, 4697295, 4697306, 4697314, 4697315, 4697316, 4697317, 4697318, 4697319, 4697285, 4697286, 4697287, 4697288, 4697289, 4697290, 4697291, 4697292, 4697293, 4697294, 4697296, 4697297, 4697298, 4697299, 4697300, 4697301, 4697302, 4697303, 4697304, 4697305, 4697307, 4697308, 4697309, 4697310, 4697311, 4697312, 4697313", ["746:767:315:920"] = "4697275, 4697276, 4697277, 4697278, 4697279, 4697280, 4697281, 4697282, 4697283", ["919:694:2733:113"] = "4697502, 4697506, 4697507, 4697508, 4697509, 4697510, 4697511, 4697512, 4697513, 4697503, 4697504, 4697505", ["942:774:1838:527"] = "4697390, 4697398, 4697399, 4697400, 4697401, 4697402, 4697403, 4697404, 4697405, 4697391, 4697392, 4697393, 4697394, 4697395, 4697396, 4697397", ["982:989:790:460"] = "4697406, 4697414, 4697415, 4697416, 4697417, 4697418, 4697419, 4697420, 4697421, 4697407, 4697408, 4697409, 4697410, 4697411, 4697412, 4697413", ["983:813:1877:50"] = "4697320, 4697328, 4697329, 4697330, 4697331, 4697332, 4697333, 4697334, 4697335, 4697321, 4697322, 4697323, 4697324, 4697325, 4697326, 4697327",}, --[[The Waking Shores]] [1706] = {["1029:899:1574:35"] = "4699848, 4699859, 4699861, 4699862, 4699863, 4699864, 4699865, 4699866, 4699867, 4699849, 4699850, 4699851, 4699852, 4699853, 4699854, 4699855, 4699856, 4699857, 4699858, 4699860", ["1035:699:283:1861"] = "4699777, 4699784, 4699785, 4699786, 4699787, 4699788, 4699789, 4699790, 4699791, 4699778, 4699779, 4699780, 4699781, 4699782, 4699783", ["1057:1289:1372:467"] = "4699928, 4699939, 4699950, 4699952, 4699953, 4699954, 4699955, 4699956, 4699957, 4699929, 4699930, 4699931, 4699932, 4699933, 4699934, 4699935, 4699936, 4699937, 4699938, 4699940, 4699941, 4699942, 4699943, 4699944, 4699945, 4699946, 4699947, 4699948, 4699949, 4699951", ["1067:771:1004:1789"] = "4699812, 4699823, 4699825, 4699826, 4699827, 4699828, 4699829, 4699830, 4699831, 4699813, 4699814, 4699815, 4699816, 4699817, 4699818, 4699819, 4699820, 4699821, 4699822, 4699824", ["1120:913:1848:1260"] = "4699958, 4699969, 4699971, 4699972, 4699973, 4699974, 4699975, 4699976, 4699977, 4699959, 4699960, 4699961, 4699962, 4699963, 4699964, 4699965, 4699966, 4699967, 4699968, 4699970", ["1163:1037:2181:0"] = "4699978, 4699989, 4699996, 4699997, 4699998, 4699999, 4700000, 4700001, 4700002, 4699979, 4699980, 4699981, 4699982, 4699983, 4699984, 4699985, 4699986, 4699987, 4699988, 4699990, 4699991, 4699992, 4699993, 4699994, 4699995", ["1191:928:2473:311"] = "4700015, 4700026, 4700028, 4700029, 4700030, 4700031, 4700032, 4700033, 4700034, 4700016, 4700017, 4700018, 4700019, 4700020, 4700021, 4700022, 4700023, 4700024, 4700025, 4700027", ["1278:851:2136:824"] = "4699792, 4699803, 4699805, 4699806, 4699807, 4699808, 4699809, 4699810, 4699811, 4699793, 4699794, 4699795, 4699796, 4699797, 4699798, 4699799, 4699800, 4699801, 4699802, 4699804", ["1331:1177:240:712"] = "4699898, 4699909, 4699920, 4699922, 4699923, 4699924, 4699925, 4699926, 4699927, 4699899, 4699900, 4699901, 4699902, 4699903, 4699904, 4699905, 4699906, 4699907, 4699908, 4699910, 4699911, 4699912, 4699913, 4699914, 4699915, 4699916, 4699917, 4699918, 4699919, 4699921", ["1505:1257:521:919"] = "4699868, 4699879, 4699890, 4699892, 4699893, 4699894, 4699895, 4699896, 4699897, 4699869, 4699870, 4699871, 4699872, 4699873, 4699874, 4699875, 4699876, 4699877, 4699878, 4699880, 4699881, 4699882, 4699883, 4699884, 4699885, 4699886, 4699887, 4699888, 4699889, 4699891", ["692:784:2536:1124"] = "4700003, 4700007, 4700008, 4700009, 4700010, 4700011, 4700012, 4700013, 4700014, 4700004, 4700005, 4700006", ["820:970:1743:1590"] = "4699832, 4699840, 4699841, 4699842, 4699843, 4699844, 4699845, 4699846, 4699847, 4699833, 4699834, 4699835, 4699836, 4699837, 4699838, 4699839",}, --[[The Azure Span]] [1707] = {["1032:1233:660:324"] = "4698024, 4698036, 4698043, 4698044, 4698045, 4698046, 4698047, 4698048, 4698049, 4698026, 4698027, 4698028, 4698029, 4698030, 4698031, 4698032, 4698033, 4698034, 4698035, 4698037, 4698038, 4698039, 4698040, 4698041, 4698042", ["1080:945:1683:478"] = "4698430, 4698500, 4698504, 4698505, 4698512, 4698518, 4698524, 4698531, 4698538, 4698437, 4698444, 4698451, 4698458, 4698463, 4698470, 4698476, 4698483, 4698489, 4698494, 4698503", ["1109:909:10:462"] = "4698050, 4698061, 4698063, 4698064, 4698065, 4698066, 4698067, 4698068, 4698069, 4698051, 4698052, 4698053, 4698054, 4698055, 4698056, 4698057, 4698058, 4698059, 4698060, 4698062", ["1129:954:706:1160"] = "4697999, 4698012, 4698015, 4698016, 4698018, 4698019, 4698020, 4698021, 4698022, 4698000, 4698001, 4698002, 4698003, 4698005, 4698007, 4698008, 4698009, 4698010, 4698011, 4698014", ["1205:689:1883:57"] = "4698734, 4698746, 4698753, 4698760, 4698767, 4698773, 4698779, 4698786, 4698793, 4698735, 4698736, 4698737, 4698738, 4698739, 4698740", ["1291:1459:2446:60"] = "4698885, 4698947, 4698958, 4698966, 4698967, 4698968, 4698969, 4698970, 4698971, 4698891, 4698898, 4698905, 4698912, 4698918, 4698924, 4698930, 4698936, 4698943, 4698946, 4698948, 4698949, 4698950, 4698951, 4698952, 4698953, 4698954, 4698955, 4698956, 4698957, 4698959, 4698960, 4698961, 4698962, 4698963, 4698964, 4698965", ["1294:1096:1843:946"] = "4698070, 4698106, 4698180, 4698193, 4698199, 4698207, 4698213, 4698220, 4698226, 4698071, 4698072, 4698073, 4698074, 4698075, 4698077, 4698082, 4698088, 4698094, 4698100, 4698114, 4698120, 4698127, 4698133, 4698140, 4698146, 4698153, 4698160, 4698167, 4698173, 4698186", ["870:818:0:839"] = "4698331, 4698377, 4698383, 4698390, 4698397, 4698403, 4698410, 4698417, 4698424, 4698336, 4698343, 4698349, 4698355, 4698361, 4698365, 4698371", ["901:742:208:115"] = "4698800, 4698829, 4698836, 4698843, 4698850, 4698857, 4698864, 4698871, 4698878, 4698808, 4698815, 4698822", ["908:825:1357:162"] = "4698233, 4698281, 4698287, 4698292, 4698298, 4698304, 4698311, 4698317, 4698323, 4698239, 4698246, 4698252, 4698258, 4698265, 4698271, 4698276", ["980:1732:1211:350"] = "4697970, 4697981, 4697992, 4697993, 4697994, 4697995, 4697996, 4697997, 4697998, 4697971, 4697972, 4697973, 4697974, 4697975, 4697976, 4697977, 4697978, 4697979, 4697980, 4697982, 4697983, 4697984, 4697986, 4697987, 4697988, 4697989, 4697990, 4697991",}, --[[Thaldraszus]] [1708] = {["1036:798:1951:0"] = "4696663, 4696674, 4696676, 4696677, 4696678, 4696679, 4696680, 4696681, 4696682, 4696664, 4696665, 4696666, 4696667, 4696668, 4696669, 4696670, 4696671, 4696672, 4696673, 4696675", ["1140:924:937:1631"] = "4696543, 4696554, 4696556, 4696557, 4696558, 4696559, 4696560, 4696561, 4696562, 4696544, 4696545, 4696546, 4696547, 4696548, 4696549, 4696550, 4696551, 4696552, 4696553, 4696555", ["1180:977:835:952"] = "4696608, 4696619, 4696621, 4696622, 4696623, 4696624, 4696625, 4696626, 4696627, 4696609, 4696610, 4696611, 4696612, 4696613, 4696614, 4696615, 4696616, 4696617, 4696618, 4696620", ["1205:1762:2424:798"] = "4696628, 4696639, 4696650, 4696657, 4696658, 4696659, 4696660, 4696661, 4696662, 4696629, 4696630, 4696631, 4696632, 4696633, 4696634, 4696635, 4696636, 4696637, 4696638, 4696640, 4696641, 4696642, 4696643, 4696644, 4696645, 4696646, 4696647, 4696648, 4696649, 4696651, 4696652, 4696653, 4696654, 4696655, 4696656", ["1416:947:1525:508"] = "4696503, 4696514, 4696520, 4696521, 4696522, 4696523, 4696524, 4696525, 4696526, 4696504, 4696505, 4696506, 4696507, 4696508, 4696509, 4696510, 4696511, 4696512, 4696513, 4696515, 4696516, 4696517, 4696518, 4696519", ["1433:919:1611:1641"] = "4696563, 4696574, 4696580, 4696581, 4696582, 4696583, 4696584, 4696585, 4696586, 4696564, 4696565, 4696566, 4696567, 4696568, 4696569, 4696570, 4696571, 4696572, 4696573, 4696575, 4696576, 4696577, 4696578, 4696579", ["787:839:1935:1048"] = "4696592, 4696600, 4696601, 4696602, 4696603, 4696604, 4696605, 4696606, 4696607, 4696593, 4696594, 4696595, 4696596, 4696597, 4696598, 4696599", ["913:812:1467:1239"] = "4696527, 4696535, 4696536, 4696537, 4696538, 4696539, 4696540, 4696541, 4696542, 4696528, 4696529, 4696530, 4696531, 4696532, 4696533, 4696534",}, --[[The Forbidden Reach]] [1709] = {["1571:2560:2269:0"] = "4697750, 4697761, 4697772, 4697783, 4697794, 4697805, 4697816, 4697818, 4697819, 4697751, 4697752, 4697753, 4697754, 4697755, 4697756, 4697757, 4697758, 4697759, 4697760, 4697762, 4697763, 4697764, 4697765, 4697766, 4697767, 4697768, 4697769, 4697770, 4697771, 4697773, 4697774, 4697775, 4697776, 4697777, 4697778, 4697779, 4697780, 4697781, 4697782, 4697784, 4697785, 4697786, 4697787, 4697788, 4697789, 4697790, 4697791, 4697792, 4697793, 4697795, 4697796, 4697797, 4697798, 4697799, 4697800, 4697801, 4697802, 4697803, 4697804, 4697806, 4697807, 4697808, 4697809, 4697810, 4697811, 4697812, 4697813, 4697814, 4697815, 4697817", ["1807:2560:0:0"] = "4697534, 4697545, 4697556, 4697567, 4697578, 4697589, 4697600, 4697611, 4697613, 4697535, 4697536, 4697537, 4697538, 4697539, 4697540, 4697541, 4697542, 4697543, 4697544, 4697546, 4697547, 4697548, 4697549, 4697550, 4697551, 4697552, 4697553, 4697554, 4697555, 4697557, 4697558, 4697559, 4697560, 4697561, 4697562, 4697563, 4697564, 4697565, 4697566, 4697568, 4697569, 4697570, 4697571, 4697572, 4697573, 4697574, 4697575, 4697576, 4697577, 4697579, 4697580, 4697581, 4697582, 4697583, 4697584, 4697585, 4697586, 4697587, 4697588, 4697590, 4697591, 4697592, 4697593, 4697594, 4697595, 4697596, 4697597, 4697598, 4697599, 4697601, 4697602, 4697603, 4697604, 4697605, 4697606, 4697607, 4697608, 4697609, 4697610, 4697612", ["1949:1295:1230:0"] = "4697614, 4697625, 4697636, 4697647, 4697657, 4697658, 4697659, 4697660, 4697661, 4697615, 4697616, 4697617, 4697618, 4697619, 4697620, 4697621, 4697622, 4697623, 4697624, 4697626, 4697627, 4697628, 4697629, 4697630, 4697631, 4697632, 4697633, 4697634, 4697635, 4697637, 4697638, 4697639, 4697640, 4697641, 4697642, 4697643, 4697644, 4697645, 4697646, 4697648, 4697649, 4697650, 4697651, 4697652, 4697653, 4697654, 4697655, 4697656", ["2648:1970:319:590"] = "4697662, 4697673, 4697684, 4697695, 4697706, 4697717, 4697728, 4697739, 4697749, 4697663, 4697664, 4697665, 4697666, 4697667, 4697668, 4697669, 4697670, 4697671, 4697672, 4697674, 4697675, 4697676, 4697677, 4697678, 4697679, 4697680, 4697681, 4697682, 4697683, 4697685, 4697686, 4697687, 4697688, 4697689, 4697690, 4697691, 4697692, 4697693, 4697694, 4697696, 4697697, 4697698, 4697699, 4697700, 4697701, 4697702, 4697703, 4697704, 4697705, 4697707, 4697708, 4697709, 4697710, 4697711, 4697712, 4697713, 4697714, 4697715, 4697716, 4697718, 4697719, 4697720, 4697721, 4697722, 4697723, 4697724, 4697725, 4697726, 4697727, 4697729, 4697730, 4697731, 4697732, 4697733, 4697734, 4697735, 4697736, 4697737, 4697738, 4697740, 4697741, 4697742, 4697743, 4697744, 4697745, 4697746, 4697747, 4697748",}, } -- Create table to store revealed overlays T.overlayTextures = {} -- Function to refresh overlays (Blizzard_SharedMapDataProviders\MapExplorationDataProvider) local function RefMap(self, fullUpdate) T.overlayTextures = {} local mapID = WorldMapFrame.mapID; if not mapID then return end local artID = C_Map.GetMapArtID(mapID); if not artID or not zones[artID] then return end local LeaMapsZone = zones[artID] -- Store already explored tiles in a table so they can be ignored local TileExists = {} local exploredMapTextures = C_MapExplorationInfo.GetExploredMapTextures(mapID) if exploredMapTextures then for _, exploredTextureInfo in ipairs(exploredMapTextures) do local key = exploredTextureInfo.textureWidth .. ":" .. exploredTextureInfo.textureHeight .. ":" .. exploredTextureInfo.offsetX .. ":" .. exploredTextureInfo.offsetY TileExists[key] = true end end -- Get the sizes self.layerIndex = self:GetMap():GetCanvasContainer():GetCurrentLayerIndex() local layers = C_Map.GetMapArtLayers(mapID) local layerInfo = layers and layers[self.layerIndex] if not layerInfo then return end local TILE_SIZE_WIDTH = layerInfo.tileWidth local TILE_SIZE_HEIGHT = layerInfo.tileHeight -- Show textures if they are in database and have not been explored for key, files in pairs(LeaMapsZone) do if not TileExists[key] then local width, height, offsetX, offsetY = strsplit(":", key) local fileDataIDs = { strsplit(",", files) } local numTexturesWide = ceil(width/TILE_SIZE_WIDTH) local numTexturesTall = ceil(height/TILE_SIZE_HEIGHT) local texturePixelWidth, textureFileWidth, texturePixelHeight, textureFileHeight for j = 1, numTexturesTall do if ( j < numTexturesTall ) then texturePixelHeight = TILE_SIZE_HEIGHT textureFileHeight = TILE_SIZE_HEIGHT else texturePixelHeight = mod(height, TILE_SIZE_HEIGHT) if ( texturePixelHeight == 0 ) then texturePixelHeight = TILE_SIZE_HEIGHT end textureFileHeight = 16 while(textureFileHeight < texturePixelHeight) do textureFileHeight = textureFileHeight * 2 end end for k = 1, numTexturesWide do local texture = self.overlayTexturePool:Acquire() if ( k < numTexturesWide ) then texturePixelWidth = TILE_SIZE_WIDTH textureFileWidth = TILE_SIZE_WIDTH else texturePixelWidth = mod(width, TILE_SIZE_WIDTH) if ( texturePixelWidth == 0 ) then texturePixelWidth = TILE_SIZE_WIDTH end textureFileWidth = 16 while(textureFileWidth < texturePixelWidth) do textureFileWidth = textureFileWidth * 2 end end texture:SetSize(texturePixelWidth, texturePixelHeight) texture:SetTexCoord(0, texturePixelWidth/textureFileWidth, 0, texturePixelHeight/textureFileHeight) texture:SetPoint("TOPLEFT", offsetX + (TILE_SIZE_WIDTH * (k-1)), -(offsetY + (TILE_SIZE_HEIGHT * (j - 1)))) texture:SetTexture(tonumber(fileDataIDs[((j - 1) * numTexturesWide) + k]), nil, nil, "TRILINEAR") texture:SetDrawLayer("ARTWORK", -1) if ShestakUISettingsPerChar.FogOfWar == true then texture:Show() else texture:Hide() end tinsert(T.overlayTextures, texture) if fullUpdate then self.textureLoadGroup:AddTexture(texture) end end end end end end -- Show overlays on startup for pin in WorldMapFrame:EnumeratePinsByTemplate("MapExplorationPinTemplate") do hooksecurefunc(pin, "RefreshOverlays", RefMap) end ================================================ FILE: ShestakUI/Modules/Maps/MiniMap.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.minimap.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Minimap border ---------------------------------------------------------------------------------------- local MinimapAnchor = CreateFrame("Frame", "MinimapAnchor", UIParent) MinimapAnchor:CreatePanel("ClassColor", C.minimap.size, C.minimap.size, unpack(C.position.minimap)) -- Disable Minimap Cluster MinimapCluster:EnableMouse(false) local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function(self, event) self:UnregisterEvent(event) -- Parent Minimap into our frame Minimap:SetParent(MinimapAnchor) Minimap:ClearAllPoints() Minimap:SetPoint("TOPLEFT", MinimapAnchor, "TOPLEFT", 2, -2) Minimap:SetPoint("BOTTOMRIGHT", MinimapAnchor, "BOTTOMRIGHT", -2, 2) Minimap:SetSize(MinimapAnchor:GetWidth(), MinimapAnchor:GetWidth()) MinimapBackdrop:ClearAllPoints() MinimapBackdrop:SetPoint("TOPLEFT", MinimapAnchor, "TOPLEFT", 2, -2) MinimapBackdrop:SetPoint("BOTTOMRIGHT", MinimapAnchor, "BOTTOMRIGHT", -2, 2) MinimapBackdrop:SetSize(MinimapAnchor:GetWidth(), MinimapAnchor:GetWidth()) -- Instance Difficulty icon MinimapCluster.InstanceDifficulty:SetParent(Minimap) MinimapCluster.InstanceDifficulty:ClearAllPoints() MinimapCluster.InstanceDifficulty:SetPoint("TOPRIGHT", Minimap, "TOPRIGHT", 1, 3) MinimapCluster.InstanceDifficulty.Instance.Border:Hide() MinimapCluster.InstanceDifficulty.Instance.Background:SetSize(28, 28) MinimapCluster.InstanceDifficulty.Instance.Background:SetVertexColor(0.6, 0.3, 0) -- Guild Instance Difficulty icon MinimapCluster.InstanceDifficulty.Guild.Border:Hide() MinimapCluster.InstanceDifficulty.Guild.Background:SetSize(28, 28) MinimapCluster.InstanceDifficulty.Guild.Background:ClearAllPoints() MinimapCluster.InstanceDifficulty.Guild.Background:SetPoint("TOPRIGHT", Minimap, "TOPRIGHT", -1, 0) -- Challenge Mode icon MinimapCluster.InstanceDifficulty.ChallengeMode.Border:Hide() MinimapCluster.InstanceDifficulty.ChallengeMode.Background:SetSize(28, 28) MinimapCluster.InstanceDifficulty.ChallengeMode.Background:SetVertexColor(0.8, 0.8, 0) MinimapCluster.InstanceDifficulty.ChallengeMode.Background:ClearAllPoints() MinimapCluster.InstanceDifficulty.ChallengeMode.Background:SetPoint("TOPRIGHT", Minimap, "TOPRIGHT", -1, 0) -- Move QueueStatus icon QueueStatusFrame:SetClampedToScreen(true) QueueStatusFrame:SetFrameStrata("TOOLTIP") QueueStatusButton:ClearAllPoints() QueueStatusButton:SetPoint("TOP", Minimap, "TOP", 1, -1) QueueStatusButton:SetParent(Minimap) QueueStatusButton:SetScale(0.5) -- Invites icon local InviteTexture = GameTimeCalendarInvitesTexture InviteTexture:ClearAllPoints() InviteTexture:SetParent(Minimap) InviteTexture:SetPoint("TOPRIGHT", Minimap, "TOPRIGHT", -1, -4) GameTimeFrame:Hide() -- Create button to show invite tooltip and allow open calendar local button = CreateFrame("Button", nil, Minimap) button:SetAllPoints(InviteTexture) if not GameTimeCalendarInvitesTexture:IsShown() then button:Hide() end button:SetScript("OnEnter", function() if InCombatLockdown() then return end if InviteTexture:IsShown() then GameTooltip:SetOwner(button, "ANCHOR_LEFT") GameTooltip:AddLine(GAMETIME_TOOLTIP_CALENDAR_INVITES) GameTooltip:AddLine(" ") GameTooltip:AddLine(GAMETIME_TOOLTIP_TOGGLE_CALENDAR) GameTooltip:Show() end end) button:SetScript("OnLeave", function() GameTooltip:Hide() end) button:SetScript("OnClick", function() if InCombatLockdown() then return end if InviteTexture:IsShown() then ToggleCalendar() end end) hooksecurefunc(InviteTexture, "Show", function() button:Show() end) hooksecurefunc(InviteTexture, "Hide", function() button:Hide() end) -- Move Mail icon local MailFrame = T.newPatch and MinimapCluster.IndicatorFrame.MailFrame or MinimapCluster.MailFrame if T.newPatch then hooksecurefunc(MailFrame, "SetPoint", function(self, _, anchor) if anchor ~= Minimap then self:ClearAllPoints() self:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMRIGHT", 4, -1) end end) else MailFrame:ClearAllPoints() MailFrame:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMRIGHT", 4, -1) end MiniMapMailIcon:SetTexture("Interface\\AddOns\\ShestakUI\\Media\\Textures\\Mail.tga") MiniMapMailIcon:SetSize(16, 16) end) -- Adjusting for patch 9.0.1 Minimap.xml Minimap:SetFrameStrata("LOW") Minimap:SetFrameLevel(2) -- Hide Border MinimapCompassTexture:Hide() MinimapCluster.BorderTop:StripTextures() -- Hide Zoom Buttons Minimap.ZoomIn:Kill() Minimap.ZoomOut:Kill() -- Hide Blob Ring Minimap:SetArchBlobRingScalar(0) Minimap:SetQuestBlobRingScalar(0) -- Hide Zone Frame MinimapCluster.ZoneTextButton:Hide() -- Garrison icon if C.minimap.garrison_icon == true then ExpansionLandingPageMinimapButton:SetScale(0.6) ExpansionLandingPageMinimapButton:ClearAllPoints() ExpansionLandingPageMinimapButton:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -3, 1) hooksecurefunc(ExpansionLandingPageMinimapButton, "UpdateIconForGarrison", function() ExpansionLandingPageMinimapButton:ClearAllPoints() ExpansionLandingPageMinimapButton:SetPoint("TOPLEFT", Minimap, "TOPLEFT", -3, 1) end) else ExpansionLandingPageMinimapButton:SetScale(0.0001) ExpansionLandingPageMinimapButton:SetAlpha(0) end -- Feedback icon if FeedbackUIButton then FeedbackUIButton:ClearAllPoints() FeedbackUIButton:SetPoint("BOTTOM", Minimap, "BOTTOM", 0, 0) FeedbackUIButton:SetScale(0.8) end -- Streaming icon if StreamingIcon then StreamingIcon:ClearAllPoints() StreamingIcon:SetPoint("BOTTOM", Minimap, "BOTTOM", 0, -10) StreamingIcon:SetScale(0.8) StreamingIcon:SetFrameStrata("BACKGROUND") end -- GhostFrame GhostFrame:StripTextures() GhostFrame:SetTemplate("Overlay") GhostFrame:StyleButton() GhostFrame:ClearAllPoints() GhostFrame:SetPoint(unpack(C.position.ghost)) GhostFrameContentsFrameIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) GhostFrameContentsFrameIcon:SetSize(32, 32) GhostFrameContentsFrame:SetFrameLevel(GhostFrameContentsFrame:GetFrameLevel() + 2) GhostFrameContentsFrame:CreateBackdrop("Overlay") GhostFrameContentsFrame.backdrop:SetPoint("TOPLEFT", GhostFrameContentsFrameIcon, -2, 2) GhostFrameContentsFrame.backdrop:SetPoint("BOTTOMRIGHT", GhostFrameContentsFrameIcon, 2, -2) -- Enable mouse scrolling Minimap:EnableMouseWheel(true) Minimap:SetScript("OnMouseWheel", function(_, d) if d > 0 then _G.Minimap.ZoomIn:Click() elseif d < 0 then _G.Minimap.ZoomOut:Click() end end) -- Hide Game Time MinimapAnchor:RegisterEvent("PLAYER_LOGIN") MinimapAnchor:RegisterEvent("ADDON_LOADED") MinimapAnchor:SetScript("OnEvent", function(_, _, addon) if addon == "Blizzard_TimeManager" then TimeManagerClockButton:Kill() elseif addon == "Blizzard_HybridMinimap" then HybridMinimap:SetFrameStrata("BACKGROUND") HybridMinimap:SetFrameLevel(100) HybridMinimap.MapCanvas:SetUseMaskTexture(false) HybridMinimap.CircleMask:SetTexture("Interface\\BUTTONS\\WHITE8X8") HybridMinimap.MapCanvas:SetUseMaskTexture(true) end end) ---------------------------------------------------------------------------------------- -- Right click menu ---------------------------------------------------------------------------------------- local menuFrame = CreateFrame("Frame", "MinimapRightClickMenu", UIParent, "UIDropDownMenuTemplate") local guildText = IsInGuild() and ACHIEVEMENTS_GUILD_TAB or LOOKINGFORGUILD local journalText = T.client == "ruRU" and ENCOUNTER_JOURNAL or ADVENTURE_JOURNAL local micromenu = { {text = CHARACTER_BUTTON, notCheckable = 1, func = function() ToggleCharacter("PaperDollFrame") end}, {text = SPELLBOOK_ABILITIES_BUTTON, notCheckable = 1, func = function() if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end ToggleFrame(SpellBookFrame) end}, {text = TALENTS_BUTTON, notCheckable = 1, func = function() if T.level >= 10 then ToggleTalentFrame() else if C.general.error_filter ~= "WHITELIST" then UIErrorsFrame:AddMessage(format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10), 1, 0.1, 0.1) else print("|cffffff00"..format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10).."|r") end end end}, {text = ACHIEVEMENT_BUTTON, notCheckable = 1, func = function() ToggleAchievementFrame() end}, {text = QUESTLOG_BUTTON, notCheckable = 1, func = function() ToggleQuestLog() end}, {text = guildText, notCheckable = 1, func = function() ToggleGuildFrame() end}, {text = SOCIAL_BUTTON, notCheckable = 1, func = function() ToggleFriendsFrame() end}, {text = CHAT_CHANNELS, notCheckable = 1, func = function() ToggleChannelFrame() end}, {text = PLAYER_V_PLAYER, notCheckable = 1, func = function() if T.level >= 10 then TogglePVPUI() else if C.general.error_filter ~= "WHITELIST" then UIErrorsFrame:AddMessage(format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10), 1, 0.1, 0.1) else print("|cffffff00"..format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10).."|r") end end end}, {text = GROUP_FINDER, notCheckable = 1, func = function() if T.level >= 10 then PVEFrame_ToggleFrame("GroupFinderFrame", nil) else if C.general.error_filter ~= "WHITELIST" then UIErrorsFrame:AddMessage(format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10), 1, 0.1, 0.1) else print("|cffffff00"..format(FEATURE_BECOMES_AVAILABLE_AT_LEVEL, 10).."|r") end end end}, {text = journalText, notCheckable = 1, func = function() if C_AdventureJournal.CanBeShown() then ToggleEncounterJournal() else if C.general.error_filter ~= "WHITELIST" then UIErrorsFrame:AddMessage(FEATURE_NOT_YET_AVAILABLE, 1, 0.1, 0.1) else print("|cffffff00"..FEATURE_NOT_YET_AVAILABLE.."|r") end end end}, {text = COLLECTIONS, notCheckable = 1, func = function() if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end ToggleCollectionsJournal() end}, {text = HELP_BUTTON, notCheckable = 1, func = function() ToggleHelpFrame() end}, {text = L_MINIMAP_CALENDAR, notCheckable = 1, func = function() ToggleCalendar() end}, {text = BATTLEFIELD_MINIMAP, notCheckable = 1, func = function() ToggleBattlefieldMap() end}, } if not IsTrialAccount() and not C_StorePublic.IsDisabledByParentalControls() then tinsert(micromenu, {text = BLIZZARD_STORE, notCheckable = 1, func = function() StoreMicroButton:Click() end}) end if T.level == MAX_PLAYER_LEVEL then tinsert(micromenu, {text = RATED_PVP_WEEKLY_VAULT, notCheckable = 1, func = function() if not WeeklyRewardsFrame then WeeklyRewards_LoadUI() end ToggleFrame(WeeklyRewardsFrame) end}) end local frame = CreateFrame("Frame") frame:RegisterEvent("GARRISON_SHOW_LANDING_PAGE") frame:SetScript("OnEvent", function() local textTitle if ExpansionLandingPageMinimapButton.garrisonMode then local garrisonType = C_Garrison.GetLandingPageGarrisonType() if garrisonType == Enum.GarrisonType.Type_6_0 then textTitle = GARRISON_LANDING_PAGE_TITLE elseif garrisonType == Enum.GarrisonType.Type_7_0 then textTitle = ORDER_HALL_LANDING_PAGE_TITLE elseif garrisonType == Enum.GarrisonType.Type_8_0 then textTitle = GARRISON_TYPE_8_0_LANDING_PAGE_TITLE elseif garrisonType == Enum.GarrisonType.Type_9_0 then textTitle = GARRISON_TYPE_9_0_LANDING_PAGE_TITLE end if textTitle then tinsert(micromenu, {text = textTitle, notCheckable = 1, func = function() GarrisonLandingPage_Toggle() end}) end else textTitle = DRAGONFLIGHT_LANDING_PAGE_TITLE tinsert(micromenu, {text = textTitle, notCheckable = 1, func = function() ToggleExpansionLandingPage() end}) end frame:UnregisterAllEvents() end) Minimap:SetScript("OnMouseUp", function(self, button) local position = MinimapAnchor:GetPoint() if button == "RightButton" then if position:match("LEFT") then EasyMenu(micromenu, menuFrame, "cursor", 0, 0, "MENU") else EasyMenu(micromenu, menuFrame, "cursor", -160, 0, "MENU") end elseif button == "MiddleButton" then if position:match("LEFT") then ToggleDropDownMenu(1, nil, MinimapCluster.Tracking.DropDown, "cursor", 0, 0, "MENU", 2) else ToggleDropDownMenu(1, nil, MinimapCluster.Tracking.DropDown, "cursor", -160, 0, "MENU", 2) end elseif button == "LeftButton" then Minimap.OnClick(self) end end) -- Set Square Map Mask Minimap:SetMaskTexture(C.media.blank) Minimap:SetArchBlobRingAlpha(0) Minimap:SetQuestBlobRingAlpha(0) -- For others mods with a minimap button, set minimap buttons position in square mode function GetMinimapShape() return "SQUARE" end ---------------------------------------------------------------------------------------- -- Hide minimap in combat ---------------------------------------------------------------------------------------- if C.minimap.hide_combat == true then MinimapAnchor:RegisterEvent("PLAYER_REGEN_ENABLED") MinimapAnchor:RegisterEvent("PLAYER_REGEN_DISABLED") MinimapAnchor:HookScript("OnEvent", function(self, event) if event == "PLAYER_REGEN_ENABLED" then self:Show() elseif event == "PLAYER_REGEN_DISABLED" then if not T.FarmMode then self:Hide() end end end) end ---------------------------------------------------------------------------------------- -- Tracking icon ---------------------------------------------------------------------------------------- if C.minimap.tracking_icon then MinimapCluster.Tracking.Background:Hide() MinimapCluster.Tracking:ClearAllPoints() MinimapCluster.Tracking:SetPoint("BOTTOMLEFT", MinimapAnchor, "BOTTOMLEFT", 5, 6) MinimapCluster.Tracking.Button:SetHighlightTexture(0) MinimapCluster.Tracking.Button:SetSize(16, 16) MinimapCluster.Tracking:CreateBackdrop("ClassColor") MinimapCluster.Tracking.backdrop:SetPoint("TOPLEFT", MinimapCluster.Tracking.Button, -2, 2) MinimapCluster.Tracking.backdrop:SetPoint("BOTTOMRIGHT", MinimapCluster.Tracking.Button, 2, -2) else MinimapCluster.Tracking:Hide() end ---------------------------------------------------------------------------------------- -- Move minimap on top ---------------------------------------------------------------------------------------- if C.minimap.on_top then MinimapAnchor:ClearAllPoints() MinimapAnchor:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", -21, -21) BuffsAnchor:ClearAllPoints() BuffsAnchor:SetPoint("TOPRIGHT", MinimapAnchor, "TOPLEFT", -25, 0) LPSTAT_CONFIG.Location.tip_frame = MinimapAnchor LPSTAT_CONFIG.Location.tip_anchor = "BOTTOMRIGHT" LPSTAT_CONFIG.Location.tip_x = 0 LPSTAT_CONFIG.Location.tip_y = -50 local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function() frame:UnregisterEvent("PLAYER_ENTERING_WORLD") local positionTable = T.CurrentProfile() if LP_Coords then LP_Coords:ClearAllPoints() LP_Coords:SetPoint("BOTTOMRIGHT", MinimapAnchor, "TOPRIGHT", 0, 5) end if TeleportMenu then TeleportMenu:ClearAllPoints() TeleportMenu:SetPoint("TOPLEFT", MinimapAnchor, "BOTTOMLEFT", 0, -13) end if RaidBuffsAnchor and not positionTable[RaidBuffsAnchor:GetName()] then RaidBuffsAnchor:ClearAllPoints() RaidBuffsAnchor:SetPoint("TOPLEFT", MinimapAnchor, "BOTTOMLEFT", 0, -3) end if not positionTable[VehicleAnchor:GetName()] then VehicleAnchor:ClearAllPoints() VehicleAnchor:SetPoint("TOP", Minimap, "BOTTOM", 0, -27) end if TooltipAnchor and not positionTable[TooltipAnchor:GetName()] then TooltipAnchor:ClearAllPoints() TooltipAnchor:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -21, 20) end GhostFrame:ClearAllPoints() GhostFrame:SetPoint("TOP", Minimap, "BOTTOM", 0, -5) if stArchaeologyFrame then stArchaeologyFrame:ClearAllPoints() stArchaeologyFrame:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 2, -5) end if AutoButtonAnchor and not positionTable[AutoButtonAnchor:GetName()] then AutoButtonAnchor:ClearAllPoints() AutoButtonAnchor:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", -2, -27) end if AutoButtonAnchor and not positionTable[AutoButtonAnchor:GetName()] then AutoButtonAnchor:ClearAllPoints() AutoButtonAnchor:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", -2, -27) end if StuffingFrameBags and not positionTable[StuffingFrameBags:GetName()] then StuffingFrameBags:ClearAllPoints() StuffingFrameBags:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -21, 20) end if TTMenuBackground then TTMenuBackground:ClearAllPoints() TTMenuBackground:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 2, -5) TTOpenMenuBackground:ClearAllPoints() TTOpenMenuBackground:SetPoint("TOP", Minimap, "BOTTOM", 0, -5) TTMenuAddOnBackground:ClearAllPoints() TTMenuAddOnBackground:SetPoint("TOP", TTMenuBackground, "TOP", 0, 0) end end) end ================================================ FILE: ShestakUI/Modules/Maps/MiniMapButtons.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.minimap.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Farm mode for minimap(by Elv22) ---------------------------------------------------------------------------------------- T.FarmMode = false SlashCmdList.FARMMODE = function() if T.FarmMode == false then MinimapAnchor:SetSize(C.minimap.size * 1.65, C.minimap.size * 1.65) Minimap:SetSize(MinimapAnchor:GetWidth(), MinimapAnchor:GetWidth()) T.FarmMode = true else MinimapAnchor:SetSize(C.minimap.size, C.minimap.size) Minimap:SetSize(MinimapAnchor:GetWidth(), MinimapAnchor:GetWidth()) T.FarmMode = false end end SLASH_FARMMODE1 = "/farmmode" SLASH_FARMMODE2 = "/афкььщву" SLASH_FARMMODE3 = "/fm" SLASH_FARMMODE4 = "/аь" ---------------------------------------------------------------------------------------- -- Farm mode mouseover button(by m2jest1c) ---------------------------------------------------------------------------------------- local farm = CreateFrame("Button", "FarmMode", UIParent) farm:SetTemplate("ClassColor") if C.actionbar.toggle_mode == true then farm:SetPoint("TOPLEFT", Minimap, "TOPRIGHT", 3, -18) else farm:SetPoint("TOPLEFT", Minimap, "TOPRIGHT", 3, 2) end farm:SetSize(19, 19) farm:SetAlpha(0) farm.t = farm:CreateTexture(nil, "OVERLAY") farm.t:SetTexture("Interface\\Icons\\inv_misc_map_01") farm.t:SetTexCoord(0.1, 0.9, 0.1, 0.9) farm.t:SetPoint("TOPLEFT", farm, 2, -2) farm.t:SetPoint("BOTTOMRIGHT", farm, -2, 2) farm:SetScript("OnClick", function() SlashCmdList.FARMMODE() end) farm:SetScript("OnEnter", function() farm:FadeIn() GameTooltip:SetOwner(farm, "ANCHOR_LEFT") GameTooltip:AddLine(L_MINIMAP_FARM, 0.40, 0.78, 1) GameTooltip:Show() end) farm:SetScript("OnLeave", function() farm:FadeOut() GameTooltip:Hide() end) ================================================ FILE: ShestakUI/Modules/Maps/ToggleMenu.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.minimap.enable ~= true or C.minimap.toggle_menu ~= true then return end ---------------------------------------------------------------------------------------- -- Toggle menu(by Hydra, Foof, Gorlasch and HyPeRnIcS) ---------------------------------------------------------------------------------------- -- Override prefix method to collapse addons C["toggleprefix"] = { ["DBM"] = "DBM-Core", ["ShestakUI"] = "ShestakUI", ["Auc-"] = "Auc-Advanced", ["!Swatter"] = "Auc-Advanced", ["BeanCounter"] = "Auc-Advanced", ["Enchantrix"] = "Auc-Advanced", ["Informant"] = "Auc-Advanced", ["SlideBar"] = "Auc-Advanced", ["Stubby"] = "Auc-Advanced", } -- Define buttons in main menu and corresponding functions C["togglemainmenu"] = { { ["text"] = CLOSE, ["function"] = function() ToggleMenu_Toggle() end }, { ["text"] = ADDONS, ["function"] = function() ToggleFrame(TTMenuAddOnBackground) ToggleFrame(TTMenuBackground) end }, { ["text"] = HELP_LABEL, ["function"] = function() SlashCmdList.UIHELP() end }, { ["text"] = RELOADUI, ["function"] = function() ReloadUI() end }, { ["text"] = "Move UI", ["function"] = function() SlashCmdList.MOVING() end }, { ["text"] = "Test UI", ["function"] = function() if C.raidcooldown.enable == true then SlashCmdList.RaidCD() end if C.enemycooldown.enable == true then SlashCmdList.EnemyCD() end if C.pulsecooldown.enable == true then SlashCmdList.PulseCD() end if C.unitframe.enable == true then SlashCmdList.TEST_UF() end if C.loot.rolllootframe == true then SlashCmdList.TESTROLL() end if C.threat.enable == true then SlashCmdList.alThreat() end SlashCmdList.DBMTEST() SlashCmdList.TEST_EXTRABUTTON() SlashCmdList.TEST_ACHIEVEMENT() --SlashCmdList.GRIDONSCREEN() end }, } -- Definde toggle functions C["toggleaddons"] = { -- Damage Meters ["alDamageMeter"] = function() ToggleFrame(alDamageMeterFrame) end, ["Recount"] = function() ToggleFrame(Recount.MainWindow) Recount.RefreshMainWindow() end, ["Skada"] = function() Skada:ToggleWindow() end, ["TinyDPS"] = function() ToggleFrame(tdpsFrame) end, -- Threat Meters ["Omen"] = function() ToggleFrame(Omen.Anchor) end, -- Boss Addons ["BigWigs"] = function() SlashCmdList.BigWigs() end, ["DBM-Core"] = function() DBM:LoadGUI() end, ["PhoenixStyle"] = function() PS_MinimapButton:Click() end, ["RaidAchievement"] = function() RA_MinimapButton:Click() end, -- Other Addons ["Archy"] = function() ToggleFrame(ArchyDigSiteFrame) ToggleFrame(ArchyArtifactFrame) end, ["AtlasLoot"] = function() ToggleFrame(AtlasLootDefaultFrame) end, ["GatherMate2"] = function() GatherMate2.db.profile["showMinimap"] = not GatherMate2.db.profile["showMinimap"] GatherMate2.db.profile["showWorldMap"] = not GatherMate2.db.profile["showWorldMap"] GatherMate2:GetModule("Config"):UpdateConfig() end, ["ShestakUI_Config"] = function() SlashCmdList.CONFIG() end, ["ACP"] = function() ToggleFrame(ACP_AddonList) end, ["epgp"] = function() EPGP:ToggleUI() end, ["WIM"] = function() WIM.ShowAllWindows() end, ["!BaudErrorFrame"] = function() SlashCmdList.BaudErrorFrame() end, } -- Button size local function buttonwidth(num) return num * (C.minimap.size - 6) end local function buttonheight(num) return num * 20 end local function buttonspacing(num) return num * 3 end local function borderwidth(num) return buttonwidth(num) + buttonspacing(num + 1) end local function borderheight(num) return buttonheight(num) + buttonspacing(num + 1) end local defaultframelevel = 0 local function updateTextures(button, checkable) if checkable then local texture = button:CreateTexture() texture:SetColorTexture(1, 1, 1, 0.3) texture:SetPoint("TOPLEFT", button, 2, -2) texture:SetPoint("BOTTOMRIGHT", button, -2, 2) button:SetCheckedTexture(texture) end button:HookScript("OnEnter", T.SetModifiedBackdrop) button:HookScript("OnLeave", T.SetOriginalBackdrop) end local MenuBG = CreateFrame("Frame", "TTMenuBackground", UIParent) MenuBG:CreatePanel("Transparent", borderwidth(1), 1, "BOTTOMRIGHT", Minimap, "TOPRIGHT", 2, 3) MenuBG:SetFrameLevel(defaultframelevel) MenuBG:SetFrameStrata("MEDIUM") MenuBG:EnableMouse(true) MenuBG:Hide() local AddonBG = CreateFrame("Frame", "TTMenuAddOnBackground", UIParent) AddonBG:CreatePanel("Transparent", borderwidth(1), 1, "BOTTOMRIGHT", MenuBG, "BOTTOMRIGHT", 0, 0) AddonBG:SetFrameLevel(defaultframelevel) AddonBG:SetFrameStrata("MEDIUM") AddonBG:EnableMouse(true) AddonBG:Hide() tinsert(UISpecialFrames, "TTMenuBackground") tinsert(UISpecialFrames, "TTMenuAddOnBackground") function ToggleMenu_Toggle() if TTMenuAddOnBackground:IsShown() or TTMenuBackground:IsShown() then TTMenuAddOnBackground:Hide() TTMenuBackground:Hide() else TTMenuAddOnBackground:Show() TTOpenMenuBackground:FadeOut() end end -- Add slash command SLASH_UITOGGLEMENU1 = "/ttm" SlashCmdList.UITOGGLEMENU = ToggleMenu_Toggle local Text local mainmenusize local lastMainMenuEntryID local totalmainmenusize local function addMainMenuButtons(menuItems, menuName, menuBackground) lastMainMenuEntryID = 0 mainmenusize = 0 local function InsertButton(items, i, hide) if hide then items[i]:Hide() else lastMainMenuEntryID = i mainmenusize = mainmenusize + 1 end end for index, value in ipairs(C.togglemainmenu) do if value.text then menuItems[index] = CreateFrame("Button", menuName..index, menuBackground) menuItems[index]:CreatePanel("Overlay", buttonwidth(1), buttonheight(1), "BOTTOM", menuBackground, "BOTTOM", 0, buttonspacing(1)) menuItems[index]:SetFrameLevel(defaultframelevel + 1) menuItems[index]:SetFrameStrata("MEDIUM") if mainmenusize == 0 then menuItems[index]:SetPoint("BOTTOMRIGHT", menuBackground, "BOTTOMRIGHT", buttonspacing(-1), buttonspacing(-1)) else menuItems[index]:SetPoint("BOTTOM", menuItems[lastMainMenuEntryID], "TOP", 0, buttonspacing(1)) end menuItems[index]:EnableMouse(true) menuItems[index]:RegisterForClicks("AnyUp") menuItems[index]:SetScript("OnClick", function() value["function"]() end) Text = menuItems[index]:CreateFontString(nil, "OVERLAY") Text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) Text:SetPoint("CENTER", menuItems[index], 0, 0) Text:SetText(value.text) Text:SetWidth(buttonwidth(1) - buttonspacing(1)) Text:SetHeight(C.media.pixel_font_size) local hideItem = (value.text == ADDONS) InsertButton(menuItems, index, hideItem) updateTextures(menuItems[index]) totalmainmenusize = index end end end -- Main buttons local menu = {} addMainMenuButtons(menu, "Menu", MenuBG) MenuBG:SetHeight(borderheight(mainmenusize)) local addonmenuitems = {} addMainMenuButtons(addonmenuitems, "AddonMenu", AddonBG) local OpenMenuBG = CreateFrame("Button", "TTOpenMenuBackground", UIParent) OpenMenuBG:CreatePanel("Overlay", borderwidth(1), buttonheight(1) / 1.3, "BOTTOM", MenuBG, "BOTTOM", 0, 0) OpenMenuBG:EnableMouse(true) OpenMenuBG:RegisterForClicks("AnyUp") OpenMenuBG:SetFrameLevel(defaultframelevel) OpenMenuBG:SetFrameStrata("MEDIUM") OpenMenuBG:SetScript("OnMouseUp", function() ToggleMenu_Toggle() if (T.class == "MAGE" and T.level >= 11) and _G["TeleportMenu"]:IsShown() then _G["TeleportMenu"]:Hide() end end) OpenMenuBG:HookScript("OnEnter", function(self) if (T.class == "MAGE" and T.level >= 11) and _G["TeleportMenu"]:IsShown() then else self:FadeIn() end end) OpenMenuBG:HookScript("OnLeave", function(self) self:FadeOut() end) Text = OpenMenuBG:CreateFontString(nil, "OVERLAY") Text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) Text:SetPoint("CENTER", OpenMenuBG, 0, 0) Text:SetText("+ + +") Text:SetTextColor(0.3, 0.3, 0.9) TTOpenMenuBackground:FadeOut() local expandbutton = CreateFrame("Button", "AddonMenuExpandButton", AddonBG) expandbutton:CreatePanel("Overlay", buttonwidth(1), buttonheight(1) / 2, "TOP", AddonBG, "TOP", 0, buttonspacing(-1)) expandbutton:EnableMouse(true) expandbutton:RegisterForClicks("AnyUp") expandbutton:SetFrameLevel(defaultframelevel + 1) expandbutton:SetFrameStrata("MEDIUM") updateTextures(expandbutton) Text = expandbutton:CreateFontString(nil, "OVERLAY") Text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) Text:SetPoint("CENTER", expandbutton, 0, 0) Text:SetText("+ + +") Text:SetTextColor(0.3, 0.3, 0.9) expandbutton.txt = Text local addonInfo local lastMainAddon = "XYZNonExistantDummyAddon" local menusize local lastMainAddonID = 0 if not addonInfo then addonInfo = {{}} for i = 1, GetNumAddOns() do local name, _, _, enabled = GetAddOnInfo(i) if name and enabled then addonInfo[i] = {["enabled"] = true, ["is_main"] = false, collapsed = true, ["parent"] = i} else addonInfo[i] = {["enabled"] = false, ["is_main"] = false, collapsed = true, ["parent"] = i} end -- Check special addon list first local addonFound = false for key, value in pairs(C["toggleprefix"]) do if strsub(name, 0, strlen(key)) == key then addonFound = true if name == value then lastMainAddon = name lastMainAddonID = i addonInfo[i].is_main = true else addonInfo[i].parent = lastMainAddonID for j = 1, GetNumAddOns() do local name_j = GetAddOnInfo(j) if name_j == value then addonInfo[i].parent = j end end end end end -- Collapse addons with common prefix if not addonFound then if strsub(name, 0, strlen(lastMainAddon)) == lastMainAddon then addonInfo[lastMainAddonID].is_main = true addonInfo[i].parent = lastMainAddonID else lastMainAddon = name lastMainAddonID = i end end end end local function addonEnableToggle(_, i) local was_enabled = addonInfo[i].enabled for j = 1, GetNumAddOns() do if (addonInfo[j].parent == i and addonInfo[i].collapsed) or (i == j and not addonInfo[addonInfo[i].parent].collapsed) then if was_enabled then DisableAddOn(j) else EnableAddOn(j) end addonInfo[j].enabled = not was_enabled end end end local function addonFrameToggle(_, i) local name = GetAddOnInfo(i) if C.toggleaddons[name] then if IsAddOnLoaded(i) then C.toggleaddons[name]() end end end local addonToggleOnly = true local function refreshAddOnMenu() menusize = mainmenusize for i = 1, GetNumAddOns() do local name = GetAddOnInfo(i) if addonInfo[i].is_main or (addonInfo[i].parent == i) or not addonInfo[addonInfo[i].parent].collapsed then if not addonToggleOnly or (C.toggleaddons[name] and IsAddOnLoaded(i)) then menusize = menusize + 1 end end end local menuwidth = ceil(menusize / 25) local menuheight = ceil(menusize / menuwidth) local lastMenuEntryID = lastMainMenuEntryID menusize = mainmenusize for i = 1, GetNumAddOns() do local j = totalmainmenusize + i local name = GetAddOnInfo(i) addonmenuitems[j]:Hide() if addonInfo[i].is_main or addonInfo[i].parent == i or not addonInfo[addonInfo[i].parent].collapsed then if (not addonToggleOnly or (C.toggleaddons[name] and IsAddOnLoaded(i))) then addonmenuitems[j]:ClearAllPoints() if menusize % menuheight == 0 then addonmenuitems[j]:SetPoint("BOTTOMRIGHT", addonmenuitems[lastMenuEntryID], "BOTTOMLEFT", buttonspacing(-1), (buttonheight(-menuheight + 1) + buttonspacing(-menuheight + 1))) else addonmenuitems[j]:SetPoint("BOTTOM", addonmenuitems[lastMenuEntryID], "TOP", 0, buttonspacing(1)) end addonmenuitems[j]:Show() lastMenuEntryID = j menusize = menusize + 1 end end if addonInfo[i].is_main then if addonToggleOnly then addonmenuitems[j].expandbtn:Hide() else addonmenuitems[j].expandbtn:Show() end end end AddonBG:SetHeight(borderheight(menuheight + 1) - buttonheight(1) / 2) AddonBG:SetWidth(borderwidth(menuwidth)) expandbutton:SetWidth(buttonwidth(menuwidth) + buttonspacing(menuwidth - 1)) end expandbutton:SetScript("OnMouseUp", function(self) addonToggleOnly = not addonToggleOnly if addonToggleOnly then self.txt:SetText("+ + +") self.txt:SetTextColor(0.3, 0.3, 0.9) else self.txt:SetText("- - -") self.txt:SetTextColor(0.9, 0.3, 0.3) end refreshAddOnMenu() end) for i = 1, GetNumAddOns() do local j = totalmainmenusize + i local name = GetAddOnInfo(i) addonmenuitems[j] = CreateFrame("CheckButton", "AddonMenu"..j, AddonBG) addonmenuitems[j]:CreatePanel("Overlay", buttonwidth(1), buttonheight(1), "BOTTOM", AddonBG, "BOTTOM", 0, buttonspacing(1)) addonmenuitems[j]:EnableMouse(true) addonmenuitems[j]:RegisterForClicks("AnyUp") addonmenuitems[j]:SetFrameLevel(defaultframelevel + 1) addonmenuitems[j]:SetFrameStrata("MEDIUM") updateTextures(addonmenuitems[j], true) addonmenuitems[j]:SetChecked(not addonInfo[i].enabled) addonmenuitems[j]:SetScript("OnMouseUp", function(self, btn) if btn == "RightButton" then addonEnableToggle(self, i) else addonFrameToggle(self, i) self:SetChecked(not self:GetChecked()) end end) addonmenuitems[j]:HookScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:AddLine(L_TOGGLE_ADDON..name) GameTooltip:AddLine("|cffffffff"..L_TOGGLE_RCLICK..name.."\n"..L_TOGGLE_RELOAD) if C.toggleaddons[name] then if IsAddOnLoaded(i) then GameTooltip:AddLine("|cffffffff"..L_TOGGLE_LCLICK..name) end end GameTooltip:Show() end) addonmenuitems[j]:HookScript("OnLeave", function() GameTooltip:Hide() end) Text = addonmenuitems[j]:CreateFontString(nil, "OVERLAY") Text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) Text:SetPoint("CENTER", addonmenuitems[j], 1, 0) Text:SetText(select(2, GetAddOnInfo(i))) Text:SetWidth(buttonwidth(1) - buttonspacing(1)) Text:SetHeight(C.media.pixel_font_size) if addonInfo[i].is_main then local expandAddonButton = CreateFrame("Button", "AddonMenuExpand"..j, addonmenuitems[j]) expandAddonButton:CreatePanel("Overlay", buttonheight(1) - 4, buttonheight(1) - 4, "TOPLEFT", addonmenuitems[j], "TOPLEFT", 2, -2) expandAddonButton:SetFrameLevel(defaultframelevel + 2) expandAddonButton:SetFrameStrata("MEDIUM") expandAddonButton:EnableMouse(true) expandAddonButton:RegisterForClicks("AnyUp") updateTextures(expandAddonButton) expandAddonButton:HookScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") if addonInfo[i].collapsed then GameTooltip:AddLine(L_TOGGLE_EXPAND..name..L_TOGGLE_ADDONS) else GameTooltip:AddLine(L_TOGGLE_COLLAPSE..name..L_TOGGLE_ADDONS) end GameTooltip:Show() end) expandAddonButton:HookScript("OnLeave", function() GameTooltip:Hide() end) Text = expandAddonButton:CreateFontString(nil, "OVERLAY") Text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) Text:SetPoint("CENTER", expandAddonButton, 2, 0) Text:SetText("+") Text:SetTextColor(0.3, 0.3, 0.9) expandAddonButton.txt = Text expandAddonButton:SetScript("OnMouseUp", function(self) addonInfo[i].collapsed = not addonInfo[i].collapsed if addonInfo[i].collapsed then self.txt:SetText("+") self.txt:SetTextColor(0.3, 0.3, 0.9) else self.txt:SetText("-") self.txt:SetTextColor(0.9, 0.3, 0.3) end refreshAddOnMenu() end) addonmenuitems[j].expandbtn = expandAddonButton end addonmenuitems[j]:Hide() end refreshAddOnMenu() ---------------------------------------------------------------------------------------- -- Reposition if minimap on top ---------------------------------------------------------------------------------------- if C.minimap.on_top then local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function() local _, y = Minimap:GetCenter() local vhalf = (y > UIParent:GetHeight() / 2) and "TOP" or "BOTTOM" if vhalf == "TOP" then MenuBG:ClearAllPoints() MenuBG:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 2, -3) AddonBG:ClearAllPoints() AddonBG:SetPoint("TOPRIGHT", MenuBG, "TOPRIGHT", 0, 0) OpenMenuBG:ClearAllPoints() OpenMenuBG:SetPoint("TOP", MenuBG, "TOP", 0, 0) end end) end ================================================ FILE: ShestakUI/Modules/Maps/WorldMap.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Font replacement ---------------------------------------------------------------------------------------- MapQuestInfoRewardsFrame.XPFrame.Name:SetFont(C.media.normal_font, 13, "") ---------------------------------------------------------------------------------------- -- Change position ---------------------------------------------------------------------------------------- hooksecurefunc(WorldMapFrame, "SynchronizeDisplayState", function() if CharacterFrame:IsShown() or SpellBookFrame:IsShown() or (PlayerTalentFrame and PlayerTalentFrame:IsShown()) or (ChannelFrame and ChannelFrame:IsShown()) or PVEFrame:IsShown() or (MacroFrame and MacroFrame:IsShown()) or (GarrisonLandingPage and GarrisonLandingPage:IsShown()) then return end if not WorldMapFrame:IsMaximized() then WorldMapFrame:ClearAllPoints() WorldMapFrame:SetPoint(unpack(C.position.map)) end end) WorldMapFrame:SetClampedToScreen(true) ---------------------------------------------------------------------------------------- -- Count of quests ---------------------------------------------------------------------------------------- local maxQuest = 35 local numQuest = CreateFrame("Frame", nil, QuestMapFrame) numQuest.text = numQuest:CreateFontString(nil, "ARTWORK", "GameFontNormal") numQuest.text:SetPoint("TOP", QuestMapFrame, "TOP", 0, -21) numQuest.text:SetJustifyH("LEFT") numQuest.text:SetText(select(2, C_QuestLog.GetNumQuestLogEntries()).."/"..maxQuest) ---------------------------------------------------------------------------------------- -- Creating coordinate ---------------------------------------------------------------------------------------- local coords = CreateFrame("Frame", "CoordsFrame", WorldMapFrame) coords:SetFrameLevel(WorldMapFrame.BorderFrame:GetFrameLevel() + 2) coords:SetFrameStrata(WorldMapFrame.BorderFrame:GetFrameStrata()) coords.PlayerText = coords:CreateFontString(nil, "ARTWORK", "GameFontNormal") coords.PlayerText:SetPoint("BOTTOMLEFT", WorldMapFrame.ScrollContainer, "BOTTOM", -40, 20) coords.PlayerText:SetJustifyH("LEFT") coords.PlayerText:SetText(UnitName("player")..": 0,0") coords.MouseText = coords:CreateFontString(nil, "ARTWORK", "GameFontNormal") coords.MouseText:SetJustifyH("LEFT") coords.MouseText:SetPoint("BOTTOMLEFT", coords.PlayerText, "TOPLEFT", 0, 5) coords.MouseText:SetText(L_MAP_CURSOR..": 0,0") local mapRects, tempVec2D = {}, CreateVector2D(0, 0) local function GetPlayerMapPos(mapID) tempVec2D.x, tempVec2D.y = UnitPosition("player") if not tempVec2D.x then return end local mapRect = mapRects[mapID] if not mapRect then local _, pos1 = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(0, 0)) local _, pos2 = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(1, 1)) if not pos1 or not pos2 then return end mapRect = {pos1, pos2} mapRect[2]:Subtract(mapRect[1]) mapRects[mapID] = mapRect end tempVec2D:Subtract(mapRect[1]) return (tempVec2D.y/mapRect[2].y), (tempVec2D.x/mapRect[2].x) end local int = 0 WorldMapFrame:HookScript("OnUpdate", function() int = int + 1 if int >= 3 then local unitMap = C_Map.GetBestMapForUnit("player") local x, y = 0, 0 if unitMap then x, y = GetPlayerMapPos(unitMap) end if x and y and x >= 0 and y >= 0 then coords.PlayerText:SetFormattedText("%s: %.0f,%.0f", T.name, x * 100, y * 100) else coords.PlayerText:SetText(UnitName("player")..": ".."|cffff0000"..L_MAP_BOUNDS.."|r") end if WorldMapFrame.ScrollContainer:IsMouseOver() then local mouseX, mouseY = WorldMapFrame.ScrollContainer:GetNormalizedCursorPosition() if mouseX and mouseY and mouseX >= 0 and mouseY >= 0 then coords.MouseText:SetFormattedText("%s %.0f,%.0f", L_MAP_CURSOR, mouseX * 100, mouseY * 100) else coords.MouseText:SetText(L_MAP_CURSOR.."|cffff0000"..L_MAP_BOUNDS.."|r") end else coords.MouseText:SetText(L_MAP_CURSOR.."|cffff0000"..L_MAP_BOUNDS.."|r") end numQuest.text:SetText(select(2, C_QuestLog.GetNumQuestLogEntries()).."/"..maxQuest) int = 0 end end) coords:RegisterEvent("PLAYER_ENTERING_WORLD") coords:SetScript("OnEvent", function(self, event) self:UnregisterEvent(event) if ShestakUISettingsPerChar and ShestakUISettingsPerChar.Coords ~= true then coords:SetAlpha(0) end end) ---------------------------------------------------------------------------------------- -- Added options to map tracking button ---------------------------------------------------------------------------------------- hooksecurefunc(WorldMapFrame.overlayFrames[2], "InitializeDropDown", function(self) UIDropDownMenu_AddSeparator() local info = UIDropDownMenu_CreateInfo() info.isTitle = true info.notCheckable = true info.text = "ShestakUI" UIDropDownMenu_AddButton(info) info.text = nil info.isTitle = nil info.disabled = nil info.notCheckable = nil info.isNotRadio = true info.keepShownOnClick = true info.text = L_MAP_COORDS info.checked = function() return ShestakUISettingsPerChar.Coords == true end info.func = function() if ShestakUISettingsPerChar.Coords == true then ShestakUISettingsPerChar.Coords = false coords:SetAlpha(0) else ShestakUISettingsPerChar.Coords = true coords:SetAlpha(1) end end UIDropDownMenu_AddButton(info) if C.minimap.fog_of_war == true then info.text = L_MAP_FOG info.checked = function() return ShestakUISettingsPerChar.FogOfWar == true end info.func = function() if ShestakUISettingsPerChar.FogOfWar == true then ShestakUISettingsPerChar.FogOfWar = false for i = 1, #T.overlayTextures do T.overlayTextures[i]:Hide() end else ShestakUISettingsPerChar.FogOfWar = true for i = 1, #T.overlayTextures do T.overlayTextures[i]:Show() end end end UIDropDownMenu_AddButton(info) end end) ================================================ FILE: ShestakUI/Modules/Misc/BattlefieldScore.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.stats.battleground ~= true then return end ---------------------------------------------------------------------------------------- -- BGScore(by Elv22, edited by Tukz) ---------------------------------------------------------------------------------------- local classcolor = ("|cff%.2x%.2x%.2x"):format(C.media.classborder_color[1] * 255, C.media.classborder_color[2] * 255, C.media.classborder_color[3] * 255) local BGFrame = CreateFrame("Frame", "InfoBattleGround", UIParent) BGFrame:CreatePanel("Invisible", 300, C.font.stats_font_size, unpack(C.position.bg_score)) BGFrame:EnableMouse(true) BGFrame:SetScript("OnEnter", function(self) local columns = C_PvP.GetMatchPVPStatColumns() for i = 1, GetNumBattlefieldScores() do local name, _, honorableKills, deaths, _, _, _, _, _, damageDone, healingDone = GetBattlefieldScore(i) if name and name == T.name then GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT", 0, T.Scale(4)) GameTooltip:ClearLines() GameTooltip:SetPoint("BOTTOM", self, "TOP", 0, 1) GameTooltip:ClearLines() GameTooltip:AddDoubleLine(STATISTICS, classcolor..name.."|r") GameTooltip:AddLine(" ") GameTooltip:AddDoubleLine(HONORABLE_KILLS..":", honorableKills, 1, 1, 1) GameTooltip:AddDoubleLine(DEATHS..":", deaths, 1, 1, 1) GameTooltip:AddDoubleLine(DAMAGE..":", T.ShortValue(damageDone), 1, 1, 1) GameTooltip:AddDoubleLine(SHOW_COMBAT_HEALING..":", T.ShortValue(healingDone), 1, 1, 1) -- Add extra statistics depending on what BG you are if columns then for j, stat in ipairs(columns) do local name = stat.name if name and strlen(name) > 0 then GameTooltip:AddDoubleLine(name, GetBattlefieldStatData(i, j), 1, 1, 1) end end end end end GameTooltip:Show() end) BGFrame:SetScript("OnLeave", function() GameTooltip:Hide() end) BGFrame:SetScript("OnMouseUp", function(_, button) if QueueStatusButton:IsShown() then if button == "RightButton" then ToggleBattlefieldMap() else TogglePVPScoreboardOrResults() end end end) local Stat = CreateFrame("Frame") Stat:EnableMouse(true) local Text1 = InfoBattleGround:CreateFontString(nil, "OVERLAY") Text1:SetFont(C.font.stats_font, C.font.stats_font_size, C.font.stats_font_style) Text1:SetShadowOffset(C.font.stats_font_shadow and 1 or 0, C.font.stats_font_shadow and -1 or 0) Text1:SetPoint("LEFT", 5, 0) Text1:SetHeight(C.font.stats_font_size) local Text2 = InfoBattleGround:CreateFontString(nil, "OVERLAY") Text2:SetFont(C.font.stats_font, C.font.stats_font_size, C.font.stats_font_style) Text2:SetShadowOffset(C.font.stats_font_shadow and 1 or 0, C.font.stats_font_shadow and -1 or 0) Text2:SetPoint("LEFT", Text1, "RIGHT", 5, 0) Text2:SetHeight(C.font.stats_font_size) local Text3 = InfoBattleGround:CreateFontString(nil, "OVERLAY") Text3:SetFont(C.font.stats_font, C.font.stats_font_size, C.font.stats_font_style) Text3:SetShadowOffset(C.font.stats_font_shadow and 1 or 0, C.font.stats_font_shadow and -1 or 0) Text3:SetPoint("LEFT", Text2, "RIGHT", 5, 0) Text3:SetHeight(C.font.stats_font_size) local int = 2 local function Update(_, t) int = int - t if int < 0 then local dmgtxt RequestBattlefieldScoreData() for i = 1, GetNumBattlefieldScores() do local name, killingBlows, _, _, honorGained, _, _, _, _, damageDone, healingDone = GetBattlefieldScore(i) if name and name == T.name then if healingDone > damageDone then dmgtxt = (classcolor..SHOW_COMBAT_HEALING.." :|r "..T.ShortValue(healingDone)) else dmgtxt = (classcolor..DAMAGE.." :|r "..T.ShortValue(damageDone)) end Text1:SetText(dmgtxt) Text2:SetText(classcolor..COMBAT_HONOR_GAIN.." :|r "..format("%d", honorGained)) Text3:SetText(classcolor..KILLING_BLOWS.." :|r "..killingBlows) end end int = 2 end end -- Hide text when not in an bg local function OnEvent(_, event) if event == "PLAYER_ENTERING_WORLD" then local _, instanceType = IsInInstance() if instanceType == "pvp" then BGFrame:Show() else Text1:SetText("") Text2:SetText("") Text3:SetText("") BGFrame:Hide() end end end Stat:RegisterEvent("PLAYER_ENTERING_WORLD") Stat:SetScript("OnEvent", OnEvent) Stat:SetScript("OnUpdate", Update) Update(Stat, 2) ================================================ FILE: ShestakUI/Modules/Misc/CharsCurrency.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.misc.chars_currency ~= true then return end ---------------------------------------------------------------------------------------- -- Tracks your currency tokens across multiple characters(Exonumist by Phanx) ---------------------------------------------------------------------------------------- local realmDB, charDB local faction = UnitFactionGroup("player") local playerList = {} local classColor = {} local nameToID = {} local collapsed = {} local function UpdateData() if TokenFrame:IsVisible() then return end local i, limit = 1, C_CurrencyInfo.GetCurrencyListSize() while i <= limit do local info = C_CurrencyInfo.GetCurrencyListInfo(i) local name, isHeader, isExpanded, count = info.name, info.isHeader, info.isHeaderExpanded, info.quantity if isHeader then if not isExpanded then collapsed[name] = true C_CurrencyInfo.ExpandCurrencyList(i, 1) limit = C_CurrencyInfo.GetCurrencyListSize() end else local link = C_CurrencyInfo.GetCurrencyListLink(i) local id = tonumber(strmatch(link, "currency:(%d+)")) nameToID[name] = id if count > 0 then charDB[id] = count else charDB[id] = nil end end i = i + 1 end while i > 0 do local info = C_CurrencyInfo.GetCurrencyListInfo(i) if info then local name, isHeader, isExpanded = info.name, info.isHeader, info.isHeaderExpanded if isHeader and isExpanded and collapsed[name] then C_CurrencyInfo.ExpandCurrencyList(i, 0) end end i = i - 1 end wipe(collapsed) end hooksecurefunc(BackpackTokenFrame, "Update", UpdateData) hooksecurefunc("TokenFrame_Update", UpdateData) local function AddTooltipInfo(tooltip, currency, includePlayer) local spaced for i = (includePlayer and 1 or 2), #playerList do local name = playerList[i] local n = realmDB[name][currency] if n then if not spaced then tooltip:AddLine(" ") spaced = true end local r, g, b local class = realmDB[name].class if class then r, g, b = unpack(classColor[class]) else r, g, b = 1, 1, 1 end tooltip:AddLine(name..": "..n, r, g, b) end end if spaced then tooltip:Show() end end hooksecurefunc(GameTooltip, "SetCurrencyByID", function(tooltip, id) AddTooltipInfo(tooltip, id, not MerchantMoneyInset:IsMouseOver()) end) hooksecurefunc(GameTooltip, "SetCurrencyToken", function(_, i) local info = C_CurrencyInfo.GetCurrencyListInfo(i) if info.name then AddTooltipInfo(GameTooltip, nameToID[info.name], not TokenFrame:IsMouseOver()) end end) hooksecurefunc(GameTooltip, "SetHyperlink", function(tooltip, link) local id = strmatch(link, "currency:(%d+)") if id then AddTooltipInfo(tooltip, tonumber(id), true) end end) hooksecurefunc(ItemRefTooltip, "SetHyperlink", function(tooltip, link) local id = strmatch(link, "currency:(%d+)") if id then AddTooltipInfo(tooltip, tonumber(id), true) end end) hooksecurefunc(GameTooltip, "SetMerchantCostItem", function(tooltip, item, currency) local _, _, _, name = GetMerchantItemCostItem(item, currency) if name then AddTooltipInfo(tooltip, nameToID[name], true) end end) hooksecurefunc(GameTooltip, "SetLFGDungeonReward", function(tooltip, dungeonID, rewardIndex) local name = GetLFGDungeonRewardInfo(dungeonID, rewardIndex) if name then AddTooltipInfo(tooltip, nameToID[name], true) end end) hooksecurefunc(GameTooltip, "SetLFGDungeonShortageReward", function(tooltip, dungeonID, shortageIndex, rewardIndex) local name = GetLFGDungeonShortageRewardInfo(dungeonID, shortageIndex, rewardIndex) if name then AddTooltipInfo(tooltip, nameToID[name], true) end end) hooksecurefunc(GameTooltip, "SetQuestCurrency", function(tooltip, type, id) local name = GetQuestCurrencyInfo(type, id) if name then AddTooltipInfo(tooltip, nameToID[name], true) end end) hooksecurefunc(GameTooltip, "SetQuestLogCurrency", function(tooltip, type, id) local name = GetQuestCurrencyInfo(type, id) if name then AddTooltipInfo(tooltip, nameToID[name], true) end end) if xMerchantFrame then local function xMerchantTooltip(self) if self.pointType == "Beta" then local id = nameToID[self.itemLink] if id then self.UpdateTooltip = nil return GameTooltip:SetCurrencyByID(id) end end self.UpdateTooltip = self.origUpdateTooltip end for i = 1, 10 do for j = 1, MAX_ITEM_COST do local item = _G["xMerchantFrame"..i.."Item"..j] item:HookScript("OnEnter", xMerchantTooltip) item.origUpdateTooltip = item.UpdateTooltip end end end local frame = CreateFrame("Frame") frame:RegisterEvent("ADDON_LOADED") frame:SetScript("OnEvent", function(self, event, addon) if event == "ADDON_LOADED" then if addon ~= "ShestakUI" then return end if faction ~= "Alliance" and faction ~= "Horde" then return end ShestakUICurrency = ShestakUICurrency or {} ShestakUICurrency[T.realm] = ShestakUICurrency[T.realm] or {} ShestakUICurrency[T.realm][faction] = ShestakUICurrency[T.realm][faction] or {} ShestakUICurrency[T.realm][faction][T.name] = ShestakUICurrency[T.realm][faction][T.name] or {} realmDB = ShestakUICurrency[T.realm][faction] if not realmDB then return end charDB = realmDB[T.name] local now = time() charDB.class = select(2, UnitClass("player")) charDB.lastSeen = now local cutoff = now - (60 * 60 * 24 * 30) for name, data in pairs(realmDB) do if data.lastSeen and data.lastSeen < cutoff then realmDB[name] = nil elseif name ~= T.name then tinsert(playerList, name) end end sort(playerList) tinsert(playerList, 1, T.name) self:UnregisterEvent("ADDON_LOADED") if IsLoggedIn() then self:GetScript("OnEvent")(self, "PLAYER_LOGIN") else self:RegisterEvent("PLAYER_LOGIN") end elseif event == "PLAYER_LOGIN" then for k, v in pairs(CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS) do classColor[k] = {v.r, v.g, v.b} end if CUSTOM_CLASS_COLORS then CUSTOM_CLASS_COLORS:RegisterCallback(function() for k, v in pairs(CUSTOM_CLASS_COLORS) do classColor[k][1] = v.r classColor[k][2] = v.g classColor[k][3] = v.b end end) end self:UnregisterEvent("PLAYER_LOGIN") end end) ================================================ FILE: ShestakUI/Modules/Misc/ClickCast.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.misc.click_cast ~= true then return end ---------------------------------------------------------------------------------------- -- Simple click2cast spell binder(sBinder by Fernir) ---------------------------------------------------------------------------------------- local SpellBinder = CreateFrame("Frame", "SpellBinder", SpellBookFrame, "ButtonFrameTemplate") SpellBinder:SetPoint("TOPLEFT", SpellBookFrame, "TOPRIGHT", 100, -1) SpellBinder:SetSize(300, 400) SpellBinder:Hide() SpellBinderPortrait:SetAlpha(0) SpellBinder.title = _G["SpellBinderTitle"] or SpellBinder:CreateFontString("SpellBinderTitle", "OVERLAY", "GameFontNormal") SpellBinder.title:SetPoint("TOP", _G["SpellBinder"], "TOP", 0, -5) SpellBinder.title:SetText(L_MISC_BINDER_OPEN) SpellBinder.sbOpen = false SpellBinder.spellbuttons = {} local DB ClickCastFrames = _G.ClickCastFrames or {} for _, v in pairs({ "PlayerFrame", "PetFrame", -- Party members "PartyMemberFrame1", "PartyMemberFrame2", "PartyMemberFrame3", "PartyMemberFrame4", "PartyMemberFrame5", -- Party pets "PartyMemberFrame1PetFrame", "PartyMemberFrame2PetFrame", "PartyMemberFrame3PetFrame", "PartyMemberFrame4PetFrame", "PartyMemberFrame5PetFrame", -- Compact party member frame "CompactPartyFrameMemberSelf", "CompactPartyFrameMemberSelfBuff1", "CompactPartyFrameMemberSelfBuff2", "CompactPartyFrameMemberSelfBuff3", "CompactPartyFrameMemberSelfDebuff1", "CompactPartyFrameMemberSelfDebuff2", "CompactPartyFrameMemberSelfDebuff3", "CompactPartyFrameMember1Buff1", "CompactPartyFrameMember1Buff2", "CompactPartyFrameMember1Buff3", "CompactPartyFrameMember1Debuff1", "CompactPartyFrameMember1Debuff2", "CompactPartyFrameMember1Debuff3", "CompactPartyFrameMember2Buff1", "CompactPartyFrameMember2Buff2", "CompactPartyFrameMember2Buff3", "CompactPartyFrameMember2Debuff1", "CompactPartyFrameMember2Debuff2", "CompactPartyFrameMember2Debuff3", "CompactPartyFrameMember3Buff1", "CompactPartyFrameMember3Buff2", "CompactPartyFrameMember3Buff3", "CompactPartyFrameMember3Debuff1", "CompactPartyFrameMember3Debuff2", "CompactPartyFrameMember3Debuff3", "CompactPartyFrameMember4Buff1", "CompactPartyFrameMember4Buff2", "CompactPartyFrameMember4Buff3", "CompactPartyFrameMember4Debuff1", "CompactPartyFrameMember4Debuff2", "CompactPartyFrameMember4Debuff3", "CompactPartyFrameMember5Buff1", "CompactPartyFrameMember5Buff2", "CompactPartyFrameMember5Buff3", "CompactPartyFrameMember5Debuff1", "CompactPartyFrameMember5Debuff2", "CompactPartyFrameMember5Debuff3", -- Target and focus frames "TargetFrame", "TargetFrameToT", "FocusFrame", "FocusFrameToT", -- Boss and arena frames "Boss1TargetFrame", "Boss2TargetFrame", "Boss3TargetFrame", "Boss4TargetFrame", "ArenaEnemyFrame1", "ArenaEnemyFrame2", "ArenaEnemyFrame3", "ArenaEnemyFrame4", "ArenaEnemyFrame5", }) do if _G[v] then ClickCastFrames[_G[v]] = true end end hooksecurefunc("CreateFrame", function(_, name, _, template) if template and template:find("SecureUnitButtonTemplate") then ClickCastFrames[_G[name]] = true end end) hooksecurefunc("CompactUnitFrame_SetUpFrame", function(frame) if frame.IsForbidden and frame:IsForbidden() then return end ClickCastFrames[frame] = true end) local ScrollSpells = CreateFrame("ScrollFrame", "SpellBinderScrollFrameSpellList", _G["SpellBinderInset"], "UIPanelScrollFrameTemplate") ScrollSpells:SetPoint("TOPLEFT", _G["SpellBinderInset"], "TOPLEFT", 0, -5) ScrollSpells:SetPoint("BOTTOMRIGHT", _G["SpellBinderInset"], "BOTTOMRIGHT", -30, 5) ScrollSpells.child = CreateFrame("Frame", "SpellBinderScrollFrameSpellListChild", ScrollSpells) ScrollSpells.child:SetSize(270, 300) ScrollSpells:SetScrollChild(ScrollSpells.child) SpellBinder.makeSpellsList = function(_, delete) local oldb local scroll = ScrollSpells.child if delete then local i = 1 while _G["SpellBinder"..i.."_cbs"] do _G["SpellBinder"..i.."_fs"]:SetText("") _G["SpellBinder"..i.."_texture"]:SetTexture(nil) _G["SpellBinder"..i.."_cbs"].checked = false _G["SpellBinder"..i.."_cbs"]:ClearAllPoints() _G["SpellBinder"..i.."_cbs"]:Hide() i = i + 1 end end for i, spell in ipairs(DB.spells) do local v = spell.spell if v then local bf = _G["SpellBinder"..i.."_cbs"] or CreateFrame("Button", "SpellBinder"..i.."_cbs", scroll, "BackdropTemplate") spell.checked = spell.checked or false if i == 1 then bf:SetPoint("TOPLEFT", scroll, "TOPLEFT", 10, -10) bf:SetPoint("BOTTOMRIGHT", scroll, "TOPRIGHT", -10, -34) else bf:SetPoint("TOPLEFT", oldb, "BOTTOMLEFT", 0, -2) bf:SetPoint("BOTTOMRIGHT", oldb, "BOTTOMRIGHT", 0, -26) end bf:EnableMouse(true) bf.tex = bf.tex or bf:CreateTexture("SpellBinder"..i.."_texture", "OVERLAY") bf.tex:SetSize(22, 22) bf.tex:SetPoint("LEFT") bf.tex:SetTexture(spell.texture) if IsAddOnLoaded("Aurora") or C.skins.blizzard_frames == true then bf.tex:SetTexCoord(0.1, 0.9, 0.1, 0.9) end bf.delete = bf.delete or CreateFrame("Button", "SpellBinder"..i.."_delete", bf) bf.delete:SetSize(16, 16) bf.delete:SetPoint("RIGHT") bf.delete:SetNormalTexture("Interface\\BUTTONS\\UI-GroupLoot-Pass-Up") bf.delete:GetNormalTexture():SetVertexColor(0.8, 0, 0) bf.delete:SetPushedTexture("Interface\\BUTTONS\\UI-GroupLoot-Pass-Up") bf.delete:SetHighlightTexture("Interface\\BUTTONS\\UI-GroupLoot-Pass-Up") bf.delete:SetScript("OnClick", function() for j, k in ipairs(DB.spells) do if k ~= spell then k.checked = false _G["SpellBinder"..j.."_cbs"]:SetBackdropColor(0, 0, 0, 0) end end spell.checked = not spell.checked SpellBinder.DeleteSpell() end) bf:SetScript("OnEnter", function(self) bf.delete:GetNormalTexture():SetVertexColor(1, 0, 0) self:SetBackdrop({bgFile = "Interface\\Buttons\\WHITE8x8"}) self:SetBackdropColor(0.2, 0.2, 0.2, 0.7) end) bf:SetScript("OnLeave", function(self) bf.delete:GetNormalTexture():SetVertexColor(0.8, 0, 0) self:SetBackdrop(nil) end) bf.fs = bf.fs or bf:CreateFontString("SpellBinder"..i.."_fs", "OVERLAY", "GameFontNormal") bf.fs:SetText(spell.modifier..spell.origbutton) bf.fs:SetPoint("RIGHT", bf.delete, "LEFT", -4, 0) if GetSpellInfo(v) then bf:SetAlpha(1) for frame in pairs(ClickCastFrames) do local f if frame and type(frame) == "table" then f = frame:GetName() end if f and SpellBinder.frames[frame] then if _G[f]:CanChangeAttribute() or _G[f]:CanChangeProtectedState() then if _G[f]:GetAttribute(spell.modifier.."type"..spell.button) ~= "menu" then _G[f]:RegisterForClicks("AnyDown") if spell.button:find("harmbutton") then _G[f]:SetAttribute(spell.modifier..spell.button, spell.spell) _G[f]:SetAttribute(spell.modifier.."type-"..spell.spell, "spell") _G[f]:SetAttribute(spell.modifier.."spell-"..spell.spell, spell.spell) DB.keys[spell.modifier..spell.button] = spell.spell DB.keys[spell.modifier.."type-"..spell.spell] = "spell" DB.keys[spell.modifier.."spell-"..spell.spell] = spell.spell else _G[f]:SetAttribute(spell.modifier.."type"..spell.button, "spell") _G[f]:SetAttribute(spell.modifier.."spell"..spell.button, spell.spell) DB.keys[spell.modifier.."type"..spell.button] = "spell" DB.keys[spell.modifier.."spell"..spell.button] = spell.spell end end end end end else bf:SetAlpha(0.3) end bf:Show() oldb = bf end end end SpellBinder.makeFramesList = function() for frame in pairs(ClickCastFrames) do local v if frame and type(frame) == "table" then v = frame:GetName() end if C.misc.click_cast_filter ~= true then if v then SpellBinder.frames[frame] = SpellBinder.frames[frame] or true end else if v ~= "oUF_Target" and v ~= "oUF_Player" then SpellBinder.frames[frame] = SpellBinder.frames[frame] or true end end end end SpellBinder.ToggleButtons = function() for i = 1, SPELLS_PER_PAGE do SpellBinder.spellbuttons[i]:Hide() if SpellBinder.sbOpen and SpellBookFrame.bookType ~= BOOKTYPE_PROFESSION then local slot = SpellBook_GetSpellBookSlot(SpellBinder.spellbuttons[i]:GetParent()) if slot then local spellname = GetSpellBookItemName(slot, SpellBookFrame.bookType) if spellname then SpellBinder.spellbuttons[i]:Show() AutoCastShine_AutoCastStart(SpellBinder.spellbuttons[i]) end end end end SpellBinder:makeFramesList() SpellBinder:makeSpellsList(true) if SpellBinder:IsVisible() then SpellBinder.OpenButton:SetChecked(true) else SpellBinder.OpenButton:SetChecked(false) end end hooksecurefunc("SpellBookFrame_Update", function() if SpellBinder.sbOpen then SpellBinder:ToggleButtons() end end) SpellBinder.OpenButton = CreateFrame("CheckButton", "SpellBinderOpenButton", _G["SpellBookSkillLineTab1"], "SpellBookSkillLineTabTemplate") SpellBinder.OpenButton:SetNormalTexture("Interface\\ICONS\\Achievement_Guild_Doctorisin") SpellBinder.OpenButton:SetScript("OnShow", function(self) if SpellBinder:IsVisible() then self:SetChecked(true) end local num = GetNumSpellTabs() local lastTab = _G["SpellBookSkillLineTab"..num] self:ClearAllPoints() self:SetPoint("TOPLEFT", lastTab, "BOTTOMLEFT", 0, -17) self:SetScript("OnEnter", function(self) GameTooltip:ClearLines() GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:AddLine(L_MISC_BINDER_OPEN) GameTooltip:Show() end) self:SetScript("OnLeave", function() GameTooltip:Hide() end) end) SpellBinder.OpenButton:SetScript("OnClick", function() if InCombatLockdown() then SpellBinder:Hide() return end if SpellBinder:IsVisible() then SpellBinder:Hide() SpellBinder.sbOpen = false else SpellBinder:Show() SpellBinder.sbOpen = true end SpellBinder:ToggleButtons() end) SpellBinder.OpenButton:Show() _G["SpellBinderCloseButton"]:SetScript("OnClick", function() SpellBinder:Hide() SpellBinder.sbOpen = false SpellBinder:ToggleButtons() end) hooksecurefunc(SpellBookFrame, "Hide", function() SpellBinder:Hide() SpellBinder.sbOpen = false SpellBinder:ToggleButtons() end) SpellBinder.DeleteSpell = function() for i, spell in ipairs(DB.spells) do if spell.checked then for frame in pairs(ClickCastFrames) do local f if frame and type(frame) == "table" then f = frame:GetName() end if f then if _G[f]:CanChangeAttribute() or _G[f]:CanChangeProtectedState() then if _G[f]:GetAttribute(spell.modifier.."type"..spell.button) ~= "menu" then if spell.button:find("harmbutton") then _G[f]:SetAttribute(spell.modifier..spell.button, nil) _G[f]:SetAttribute(spell.modifier.."type-"..spell.spell, nil) _G[f]:SetAttribute(spell.modifier.."spell-"..spell.spell, nil) else _G[f]:SetAttribute(spell.modifier.."type"..spell.button, nil) _G[f]:SetAttribute(spell.modifier.."spell"..spell.button, nil) end end end end end tremove(DB.spells, i) end end SpellBinder:makeSpellsList(true) end local addSpell = function(self, button) if SpellBinder.sbOpen then local slot = SpellBook_GetSpellBookSlot(self:GetParent()) local spellname = GetSpellBookItemName(slot, SpellBookFrame.bookType) local texture = GetSpellBookItemTexture(slot, SpellBookFrame.bookType) if spellname ~= 0 and ((SpellBookFrame.bookType == BOOKTYPE_PET) or (SpellBookFrame.selectedSkillLine > 1)) then local originalbutton = button local modifier = "" if IsShiftKeyDown() then modifier = "Shift-"..modifier end if IsControlKeyDown() then modifier = "Ctrl-"..modifier end if IsAltKeyDown() then modifier = "Alt-"..modifier end if IsHarmfulSpell(slot, SpellBookFrame.bookType) then button = format("%s%d", "harmbutton", SecureButton_GetButtonSuffix(button)) originalbutton = "|cffff2222(harm)|r "..originalbutton else button = SecureButton_GetButtonSuffix(button) end for _, v in pairs(DB.spells) do if v.spell == spellname then return end end tinsert(DB.spells, {["id"] = slot, ["modifier"] = modifier, ["button"] = button, ["spell"] = spellname, ["texture"] = texture, ["origbutton"] = originalbutton,}) SpellBinder:makeSpellsList(false) end end end SpellBinder.UpdateAll = function() if InCombatLockdown() then SpellBinder:RegisterEvent("PLAYER_REGEN_ENABLED") return end SpellBinder:makeFramesList() SpellBinder:makeSpellsList(true) end SpellBinder:RegisterEvent("PLAYER_LOGIN") SpellBinder:RegisterEvent("PLAYER_ENTERING_WORLD") SpellBinder:RegisterEvent("GROUP_ROSTER_UPDATE") SpellBinder:RegisterEvent("ZONE_CHANGED") SpellBinder:RegisterEvent("ZONE_CHANGED_NEW_AREA") SpellBinder:RegisterEvent("PLAYER_TALENT_UPDATE") SpellBinder:SetScript("OnEvent", function(self, event) if event == "PLAYER_LOGIN" then ShestakUIBindings = _G.ShestakUIBindings or {} ShestakUIBindings[UnitName("player")] = _G.ShestakUIBindings[UnitName("player")] or {} DB = ShestakUIBindings[UnitName("player")] DB.spells = DB.spells or {} DB.keys = DB.keys or {} SpellBinder.frames = SpellBinder.frames or {} SpellBinder:makeFramesList() SpellBinder:makeSpellsList(true) for i = 1, SPELLS_PER_PAGE do local parent = _G["SpellButton"..i] local button = CreateFrame("Button", "SpellBinderFakeButton"..i, parent, "AutoCastShineTemplate") button:SetID(parent:GetID()) button:RegisterForClicks("AnyDown") button:SetAllPoints(parent) button:SetScript("OnClick", addSpell) button:Hide() SpellBinder.spellbuttons[i] = button end self:UnregisterEvent("PLAYER_LOGIN") elseif event == "PLAYER_ENTERING_WORLD" or event == "GROUP_ROSTER_UPDATE" or event == "ZONE_CHANGED" or event == "ZONE_CHANGED_NEW_AREA" then C_Timer.After(0.5, function() SpellBinder.UpdateAll() end) elseif event == "PLAYER_REGEN_ENABLED" then SpellBinder.UpdateAll() self:UnregisterEvent("PLAYER_REGEN_ENABLED") elseif event == "PLAYER_TALENT_UPDATE" then if DB then for _, spell in ipairs(DB.spells) do for frame in pairs(ClickCastFrames) do local f if frame and type(frame) == "table" then f = frame:GetName() end if f then if _G[f]:CanChangeAttribute() or _G[f]:CanChangeProtectedState() then if _G[f]:GetAttribute(spell.modifier.."type"..spell.button) ~= "menu" then if spell.button:find("harmbutton") then _G[f]:SetAttribute(spell.modifier..spell.button, nil) _G[f]:SetAttribute(spell.modifier.."type-"..spell.spell, nil) _G[f]:SetAttribute(spell.modifier.."spell-"..spell.spell, nil) else _G[f]:SetAttribute(spell.modifier.."type"..spell.button, nil) _G[f]:SetAttribute(spell.modifier.."spell"..spell.button, nil) end end end end end end SpellBinder:makeSpellsList(true) end end end) if IsAddOnLoaded("Aurora") then local F, C = unpack(Aurora) SpellBinder:StripTextures() SpellBinderInset:StripTextures() SpellBinder.OpenButton:StripTextures() SpellBinder.OpenButton:SetNormalTexture("Interface\\ICONS\\Achievement_Guild_Doctorisin") SpellBinder.OpenButton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9) SpellBinder.OpenButton:SetCheckedTexture(C.media.checked) SpellBinder.OpenButton:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3) SpellBinder.OpenButton:GetHighlightTexture():SetAllPoints(SpellBinder.OpenButton:GetNormalTexture()) F.CreateBG(SpellBinder.OpenButton) F.CreateBD(SpellBinder) F.ReskinClose(SpellBinderCloseButton) F.ReskinScroll(SpellBinderScrollFrameSpellListScrollBar) elseif C.skins.blizzard_frames == true then SpellBinder:StripTextures() SpellBinder:CreateBackdrop("Transparent") SpellBinder.backdrop:SetPoint("TOPLEFT", -18, 0) SpellBinder.backdrop:SetPoint("BOTTOMRIGHT", 0, 9) SpellBinder.OpenButton:StripTextures() SpellBinder.OpenButton:SetNormalTexture("Interface\\ICONS\\Achievement_Guild_Doctorisin") SpellBinder.OpenButton:GetNormalTexture():ClearAllPoints() SpellBinder.OpenButton:GetNormalTexture():SetPoint("TOPLEFT", 2, -2) SpellBinder.OpenButton:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2) SpellBinder.OpenButton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9) SpellBinder.OpenButton:CreateBackdrop("Default") SpellBinder.OpenButton.backdrop:SetAllPoints() SpellBinder.OpenButton:StyleButton(true) SpellBinderScrollFrameSpellList:StripTextures() SpellBinderScrollFrameSpellList:CreateBackdrop("Overlay") SpellBinderScrollFrameSpellList.backdrop:SetPoint("TOPLEFT", 2, 3) SpellBinderScrollFrameSpellList.backdrop:SetPoint("BOTTOMRIGHT", 2, -3) T.SkinCloseButton(SpellBinderCloseButton) SpellBinderScrollFrameSpellListScrollBar:SetPoint("TOPLEFT", SpellBinderScrollFrameSpellList, "TOPRIGHT", 6, -13) SpellBinderScrollFrameSpellListScrollBar:SetPoint("BOTTOMLEFT", SpellBinderScrollFrameSpellList, "BOTTOMRIGHT", 6, 13) T.SkinScrollBar(SpellBinderScrollFrameSpellListScrollBar) end ================================================ FILE: ShestakUI/Modules/Misc/LFGQueueTimer.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if IsAddOnLoaded("DBM-Core") or IsAddOnLoaded("BigWigs") then return end ---------------------------------------------------------------------------------------- -- Queue timer on LFGDungeonReadyDialog ---------------------------------------------------------------------------------------- local frame = CreateFrame("Frame", nil, LFGDungeonReadyDialog) if C.skins.blizzard_frames == true then frame:SetPoint("BOTTOM", LFGDungeonReadyDialog, "BOTTOM", 0, 8) frame:CreateBackdrop("Overlay") frame:SetSize(240, 10) else frame:SetPoint("TOP", LFGDungeonReadyDialog, "BOTTOM", 0, -10) frame:SetSize(280, 10) frame.t = frame:CreateTexture(nil, "OVERLAY") frame.t:SetTexture("Interface\\CastingBar\\UI-CastingBar-Border") frame.t:SetSize(375, 64) frame.t:SetPoint("TOP", 0, 28) end frame.bar = CreateFrame("StatusBar", nil, frame) frame.bar:SetStatusBarTexture(C.media.texture) frame.bar:SetAllPoints() frame.bar:SetFrameLevel(LFGDungeonReadyDialog:GetFrameLevel() + 1) frame.bar:SetStatusBarColor(1, 0.7, 0) LFGDungeonReadyDialog.nextUpdate = 0 local function UpdateBar() local obj = LFGDungeonReadyDialog local oldTime = GetTime() local flag = 0 local duration = 40 local interval = 0.1 obj:SetScript("OnUpdate", function(_, elapsed) obj.nextUpdate = obj.nextUpdate + elapsed if obj.nextUpdate > interval then local newTime = GetTime() if (newTime - oldTime) < duration then local width = frame:GetWidth() * (newTime - oldTime) / duration frame.bar:SetPoint("BOTTOMRIGHT", frame, 0 - width, 0) flag = flag + 1 if flag >= 10 then flag = 0 end else obj:SetScript("OnUpdate", nil) end obj.nextUpdate = 0 end end) end frame:RegisterEvent("LFG_PROPOSAL_SHOW") frame:SetScript("OnEvent", function() if LFGDungeonReadyDialog:IsShown() then UpdateBar() end end) ================================================ FILE: ShestakUI/Modules/Misc/MagePortals.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if T.class ~= "MAGE" or T.level < 11 then return end ---------------------------------------------------------------------------------------- -- Mage portals menu(by Foof and Tohveli) ---------------------------------------------------------------------------------------- local spells = (UnitFactionGroup("player") == "Horde") and { [1] = {3567,11417}, -- Orgrimmar [2] = {3563,11418}, -- Undercity [3] = {3566,11420}, -- Thunder Bluff [4] = {32272,32267}, -- Silvermoon [5] = {49358,49361}, -- Stonard [6] = {35715,35717}, -- Shattrath [7] = {53140,53142}, -- Dalaran [8] = {88344,88346}, -- Tol Barad [9] = {120145,120146}, -- Ancient Dalaran [10] = {132627,132626}, -- Vale of Eternal Blossoms [11] = {176242,176244}, -- Warspear [12] = {193759, 193759}, -- Hall of the Guardian (OrderHall) [13] = {224869, 224871}, -- Dalaran, Broken Isles [14] = {281404, 281402}, -- Dazar'alor [15] = {344587, 344597}, -- Oribos [15] = {395277, 395289}, -- Valdrakken } or { -- Alliance [1] = {3561,10059}, -- Stormwind [2] = {3562,11416}, -- Ironforge [3] = {3565,11419}, -- Darnassus [4] = {32271,32266}, -- Exodar [5] = {49359,49360}, -- Theramore [6] = {33690,33691}, -- Shattrath [7] = {53140,53142}, -- Dalaran [8] = {88342,88345}, -- Tol Barad [9] = {120145,120146}, -- Ancient Dalaran [10] = {132621,132620}, -- Vale of Eternal Blossoms [11] = {176248,176246}, -- Stormshield [12] = {193759, 193759}, -- Hall of the Guardian (OrderHall) [13] = {224869, 224871}, -- Dalaran, Broken Isles [14] = {281403, 281400}, -- Boralus [15] = {344587, 344597}, -- Oribos [16] = {395277, 395289}, -- Valdrakken } local frame = CreateFrame("Frame", "TeleportMenu", UIParent) frame:CreatePanel("Invisible", C.minimap.size, (#spells) * 20 + 4, "BOTTOMLEFT", Minimap, "TOPLEFT", -2, 3) frame:SetFrameStrata("MEDIUM") frame:EnableMouse(true) frame:RegisterEvent("UNIT_SPELLCAST_START") frame:SetScript("OnEvent", function(self) if self:IsShown() then self:Hide() end end) frame:Hide() tinsert(UISpecialFrames, "TeleportMenu") for i, spell in pairs(spells) do local teleport = GetSpellInfo(spell[1]) local b = CreateFrame("Button", nil, frame, "SecureActionButtonTemplate") b:CreatePanel("Transparent", C.minimap.size, 20, "BOTTOMLEFT", frame, "BOTTOMLEFT", 0, ((i - 1) * 21)) b:SetBackdropBorderColor(unpack(C.media.classborder_color)) b:SetFrameStrata("HIGH") local l = b:CreateFontString("TeleportMenuName"..i, "OVERLAY") l:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) if i == 5 and UnitFactionGroup("player") == "Horde" then l:SetText(C_Map.GetAreaInfo(75)) elseif i == 9 then l:SetText(L_ZONE_ANCIENTDALARAN) else l:SetText(string.sub(teleport, (string.find(teleport, ":") and string.find(teleport, ":") + 1) or 0)) end l:SetPoint("LEFT", b, "LEFT", 2, 0) l:SetPoint("RIGHT", b, "RIGHT", -2, 0) l:SetWordWrap(false) b:SetFontString(l) b:RegisterForClicks("AnyUp", "AnyDown") b:SetAttribute("type1", "spell") b:SetAttribute("spell1", teleport) b:SetAttribute("type2", "spell") b:SetAttribute("spell2", GetSpellInfo(spell[2])) end local learnSpell = CreateFrame("Frame") learnSpell:RegisterEvent("PLAYER_LOGIN") learnSpell:RegisterEvent("LEARNED_SPELL_IN_TAB") learnSpell:SetScript("OnEvent", function() for i, spell in pairs(spells) do if not IsSpellKnown(spell[1]) then _G["TeleportMenuName"..i]:SetTextColor(0.4, 0.4, 0.4) else _G["TeleportMenuName"..i]:SetTextColor(1, 1, 1) end end end) local button = CreateFrame("Button", nil, UIParent) button:SetTemplate("ClassColor") button:SetPoint("TOPLEFT", Minimap, "TOPLEFT") button:SetSize(20, 20) button:SetAlpha(0) button.t = button:CreateTexture(nil, "OVERLAY") button.t:SetTexture("Interface\\Icons\\Spell_Arcane_TeleportStormwind") button.t:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.t:SetPoint("TOPLEFT", button, 2, -2) button.t:SetPoint("BOTTOMRIGHT", button, -2, 2) button:SetScript("OnClick", function() if not InCombatLockdown() then if _G["TeleportMenu"]:IsShown() then _G["TeleportMenu"]:Hide() else _G["TeleportMenu"]:Show() end if C.minimap.toggle_menu and _G["TTMenuAddOnBackground"]:IsShown() then _G["TTMenuAddOnBackground"]:Hide() end if C.minimap.toggle_menu and _G["TTMenuBackground"]:IsShown() then _G["TTMenuBackground"]:Hide() end end end) button:SetScript("OnEnter", function() if InCombatLockdown() then return end button:FadeIn() end) button:SetScript("OnLeave", function() button:FadeOut() end) ================================================ FILE: ShestakUI/Modules/Misc/Marking.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Binding keys for mouseover marking ---------------------------------------------------------------------------------------- BINDING_HEADER_TAR_MARK_HEADER = L_MISC_HEADER_MARK BINDING_NAME_TAR_MARK_1 = BINDING_NAME_RAIDTARGET1 BINDING_NAME_TAR_MARK_2 = BINDING_NAME_RAIDTARGET2 BINDING_NAME_TAR_MARK_3 = BINDING_NAME_RAIDTARGET3 BINDING_NAME_TAR_MARK_4 = BINDING_NAME_RAIDTARGET4 BINDING_NAME_TAR_MARK_5 = BINDING_NAME_RAIDTARGET5 BINDING_NAME_TAR_MARK_6 = BINDING_NAME_RAIDTARGET6 BINDING_NAME_TAR_MARK_7 = BINDING_NAME_RAIDTARGET7 BINDING_NAME_TAR_MARK_8 = BINDING_NAME_RAIDTARGET8 BINDING_NAME_TAR_MARK_0 = BINDING_NAME_RAIDTARGETNONE ---------------------------------------------------------------------------------------- -- Mob marking(by ALZA) ---------------------------------------------------------------------------------------- if C.misc.shift_marking ~= true then return end local menuFrame = CreateFrame("Frame", "MarkingFrame", UIParent, "UIDropDownMenuTemplate") local menuIcon = "Interface\\TargetingFrame\\UI-RaidTargetingIcons" local menuList = { {text = RAID_TARGET_NONE, notCheckable = 1, icon = "Interface\\Buttons\\UI-GroupLoot-Pass-Up", func = function() SetRaidTarget("target", 0) end}, {text = RAID_TARGET_8, notCheckable = 1, icon = menuIcon, tCoordLeft = 0.75, tCoordRight = 1, tCoordTop = 0.25, tCoordBottom = 0.5, func = function() SetRaidTarget("target", 8) end}, {text = "|cffff0000"..RAID_TARGET_7.."|r", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.5, tCoordRight = 0.75, tCoordTop = 0.25, tCoordBottom = 0.5, func = function() SetRaidTarget("target", 7) end}, {text = "|cff00ffff"..RAID_TARGET_6.."|r", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.25, tCoordRight = 0.5, tCoordTop = 0.25, tCoordBottom = 0.5, func = function() SetRaidTarget("target", 6) end}, {text = "|cffC7C7C7"..RAID_TARGET_5.."|r", notCheckable = 1, icon = menuIcon, tCoordLeft = 0, tCoordRight = 0.25, tCoordTop = 0.25, tCoordBottom = 0.5, func = function() SetRaidTarget("target", 5) end}, {text = "|cff00ff00"..RAID_TARGET_4.."|r", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.75, tCoordRight = 1, tCoordTop = 0, tCoordBottom = 0.25, func = function() SetRaidTarget("target", 4) end}, {text = "|cff912CEE"..RAID_TARGET_3.."|r", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.5, tCoordRight = 0.75, tCoordTop = 0, tCoordBottom = 0.25, func = function() SetRaidTarget("target", 3) end}, {text = "|cffFF8000"..RAID_TARGET_2.."|r", notCheckable = 1, icon = menuIcon, tCoordLeft = 0.25, tCoordRight = 0.5, tCoordTop = 0, tCoordBottom = 0.25, func = function() SetRaidTarget("target", 2) end}, {text = "|cffffff00"..RAID_TARGET_1.."|r", notCheckable = 1, icon = menuIcon, tCoordLeft = 0, tCoordRight = 0.25, tCoordTop = 0, tCoordBottom = 0.25, func = function() SetRaidTarget("target", 1) end}, } WorldFrame:HookScript("OnMouseDown", function(_, button) if button == "LeftButton" and IsShiftKeyDown() and UnitExists("mouseover") then if (GetNumGroupMembers() > 0 and not UnitInRaid("player")) or UnitIsGroupLeader("player") or UnitIsGroupAssistant("player") then EasyMenu(menuList, menuFrame, "cursor", 0, 0, "MENU") end end end) ================================================ FILE: ShestakUI/Modules/Misc/Misc.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Force readycheck warning ---------------------------------------------------------------------------------------- local ShowReadyCheckHook = function(_, initiator) if initiator ~= "player" then PlaySound(SOUNDKIT.READY_CHECK, "Master") end end hooksecurefunc("ShowReadyCheck", ShowReadyCheckHook) ---------------------------------------------------------------------------------------- -- Force other warning ---------------------------------------------------------------------------------------- local ForceWarning = CreateFrame("Frame") ForceWarning:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") ForceWarning:RegisterEvent("PET_BATTLE_QUEUE_PROPOSE_MATCH") ForceWarning:RegisterEvent("LFG_PROPOSAL_SHOW") ForceWarning:RegisterEvent("RESURRECT_REQUEST") ForceWarning:SetScript("OnEvent", function(_, event) if event == "UPDATE_BATTLEFIELD_STATUS" then for i = 1, GetMaxBattlefieldID() do local status = GetBattlefieldStatus(i) if status == "confirm" then PlaySound(SOUNDKIT.PVP_THROUGH_QUEUE, "Master") break end i = i + 1 end elseif event == "PET_BATTLE_QUEUE_PROPOSE_MATCH" then PlaySound(SOUNDKIT.PVP_THROUGH_QUEUE, "Master") elseif event == "LFG_PROPOSAL_SHOW" then PlaySound(SOUNDKIT.READY_CHECK, "Master") elseif event == "RESURRECT_REQUEST" then PlaySound(37, "Master") end end) ---------------------------------------------------------------------------------------- -- Misclicks for some popups ---------------------------------------------------------------------------------------- StaticPopupDialogs.RESURRECT.hideOnEscape = nil StaticPopupDialogs.AREA_SPIRIT_HEAL.hideOnEscape = nil StaticPopupDialogs.PARTY_INVITE.hideOnEscape = nil StaticPopupDialogs.CONFIRM_SUMMON.hideOnEscape = nil StaticPopupDialogs.ADDON_ACTION_FORBIDDEN.button1 = nil StaticPopupDialogs.TOO_MANY_LUA_ERRORS.button1 = nil PetBattleQueueReadyFrame.hideOnEscape = nil PVPReadyDialog.leaveButton:Hide() PVPReadyDialog.enterButton:ClearAllPoints() PVPReadyDialog.enterButton:SetPoint("BOTTOM", PVPReadyDialog, "BOTTOM", 0, 25) ---------------------------------------------------------------------------------------- -- Spin camera while afk(by Telroth and Eclipse) ---------------------------------------------------------------------------------------- if C.misc.afk_spin_camera == true then local spinning local function SpinStart() spinning = true MoveViewRightStart(0.1) UIParent:Hide() end local function SpinStop() if not spinning then return end spinning = nil MoveViewRightStop() if InCombatLockdown() then return end UIParent:Show() end local SpinCam = CreateFrame("Frame") SpinCam:RegisterEvent("PLAYER_LEAVING_WORLD") SpinCam:RegisterEvent("PLAYER_FLAGS_CHANGED") SpinCam:SetScript("OnEvent", function(_, event) if event == "PLAYER_LEAVING_WORLD" then SpinStop() else if UnitIsAFK("player") and not InCombatLockdown() then SpinStart() else SpinStop() end end end) end ---------------------------------------------------------------------------------------- -- Auto select current event boss from LFD tool(EventBossAutoSelect by Nathanyel) ---------------------------------------------------------------------------------------- local firstLFD LFDParentFrame:HookScript("OnShow", function() if not firstLFD then firstLFD = 1 for i = 1, GetNumRandomDungeons() do local id = GetLFGRandomDungeonInfo(i) local isHoliday = select(15, GetLFGDungeonInfo(id)) if isHoliday and not GetLFGDungeonRewards(id) then LFDQueueFrame_SetType(id) end end end end) ---------------------------------------------------------------------------------------- -- Undress button in dress-up frame(by Nefarion) ---------------------------------------------------------------------------------------- local strip = CreateFrame("Button", "DressUpFrameUndressButton", DressUpFrame, "UIPanelButtonTemplate") strip:SetText(L_MISC_UNDRESS) strip:SetWidth(strip:GetTextWidth() + 40) strip:SetPoint("RIGHT", DressUpFrameResetButton, "LEFT", -2, 0) strip:RegisterForClicks("AnyUp") strip:SetScript("OnClick", function(_, button) local actor = DressUpFrame.ModelScene:GetPlayerActor() if not actor then return end if button == "RightButton" then actor:UndressSlot(19) else actor:Undress() end PlaySound(SOUNDKIT.GS_TITLE_OPTION_OK) end) ---------------------------------------------------------------------------------------- -- Boss Banner Hider ---------------------------------------------------------------------------------------- if C.general.hide_banner == true then BossBanner.PlayBanner = function() end end ---------------------------------------------------------------------------------------- -- Hide button for oUF_RaidDPS ---------------------------------------------------------------------------------------- if C.misc.hide_raid_button == true then local show = false SlashCmdList.HideRaidMODE = function() if show == false then if oUF_RaidDPS1 then for i = 1, C.raidframe.raid_groups do _G["oUF_RaidDPS"..i]:SetAlpha(0) end if oUF_MainTank then oUF_MainTank:SetAlpha(0) end end show = true else if oUF_RaidDPS1 then for i = 1, C.raidframe.raid_groups do _G["oUF_RaidDPS"..i]:SetAlpha(1) end if oUF_MainTank then oUF_MainTank:SetAlpha(1) end end show = false end end SLASH_HIDERAIDMODE1 = "/hideraid" local HideRaid = CreateFrame("Button", "HideRaidMode", UIParent) HideRaid:SetTemplate("ClassColor") HideRaid:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, 0) HideRaid:SetSize(19, 19) HideRaid:SetAlpha(0) HideRaid:Hide() HideRaid.t = HideRaid:CreateTexture(nil, "OVERLAY") HideRaid.t:SetTexture("Interface\\Icons\\inv_misc_spyglass_03") HideRaid.t:SetTexCoord(0.1, 0.9, 0.1, 0.9) HideRaid.t:SetPoint("TOPLEFT", HideRaid, 2, -2) HideRaid.t:SetPoint("BOTTOMRIGHT", HideRaid, -2, 2) HideRaid:SetScript("OnClick", function() if oUF_RaidDPS1 and oUF_RaidDPS1:IsShown() then SlashCmdList.HideRaidMODE() end end) HideRaid:SetScript("OnEnter", function() if oUF_RaidDPS1 and oUF_RaidDPS1:IsShown() then HideRaid:FadeIn() end end) HideRaid:SetScript("OnLeave", function() HideRaid:FadeOut() end) HideRaid:RegisterEvent("PLAYER_LOGIN") HideRaid:SetScript("OnEvent", function(self) if C.unitframe.enable == true and C.raidframe.layout == "DPS" then self:Show() end end) end ---------------------------------------------------------------------------------------- -- Easy delete good items ---------------------------------------------------------------------------------------- local deleteDialog = StaticPopupDialogs["DELETE_GOOD_ITEM"] if deleteDialog.OnShow then hooksecurefunc(deleteDialog, "OnShow", function(s) s.editBox:SetText(DELETE_ITEM_CONFIRM_STRING) s.editBox:SetAutoFocus(false) s.editBox:ClearFocus() end) end ---------------------------------------------------------------------------------------- -- Change UIErrorsFrame strata ---------------------------------------------------------------------------------------- UIErrorsFrame:SetFrameLevel(0) ---------------------------------------------------------------------------------------- -- Increase speed for AddonList scroll ---------------------------------------------------------------------------------------- AddonList.ScrollBox.wheelPanScalar = 6 AddonList.ScrollBar.wheelPanScalar = 6 ================================================ FILE: ShestakUI/Modules/Misc/Mounts.lua ================================================ ---------------------------------------------------------------------------------------- -- Universal Mount macro(by Monolit) -- /cancelform [noform:4] -- /run Mountz("your_ground_mount","your_flying_mount","your_underwater_mount") ---------------------------------------------------------------------------------------- function Mountz(groundmount, flyingmount, underwatermount) if not underwatermount then underwatermount = groundmount end local flyablex, swimablex, vjswim, InVj, nofly local num = C_MountJournal.GetNumMounts() if not num or IsMounted() then Dismount() return end if CanExitVehicle() then VehicleExit() return end if IsUsableSpell(59569) ~= true then nofly = true end if not nofly and IsFlyableArea() then flyablex = true end for i = 1, 40 do local sid = select(10, UnitBuff("player", i)) if sid == 73701 or sid == 76377 then InVj = true end end if InVj and IsSwimming() then vjswim = true end if IsSwimming() and not flyablex and not vjswim then swimablex = true end if IsControlKeyDown() then if IsSwimming() and not vjswim then swimablex = not swimablex elseif not vjswim then flyablex = not flyablex else vjswim = not vjswim end end local mountID = C_MountJournal.GetMountIDs() for _, mountID in pairs(mountID) do local creatureName, spellID = C_MountJournal.GetMountInfoByID(mountID) if flyingmount and creatureName == flyingmount and flyablex and not swimablex then C_MountJournal.SummonByID(mountID) return elseif groundmount and creatureName == groundmount and not flyablex and not swimablex and not vjswim then C_MountJournal.SummonByID(mountID) return elseif underwatermount and creatureName == underwatermount and swimablex then C_MountJournal.SummonByID(mountID) return elseif spellID == 75207 and vjswim then C_MountJournal.SummonByID(mountID) return end end end ================================================ FILE: ShestakUI/Modules/Misc/PvPQueueTimer.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if IsAddOnLoaded("DBM-Core") then return end ---------------------------------------------------------------------------------------- -- Queue timer on PVPReadyDialog ---------------------------------------------------------------------------------------- local frame = CreateFrame("Frame", nil, PVPReadyDialog) if C.skins.blizzard_frames == true then frame:SetPoint("BOTTOM", PVPReadyDialog, "BOTTOM", 0, 8) frame:CreateBackdrop("Overlay") frame:SetSize(240, 10) else frame:SetPoint("TOP", PVPReadyDialog, "BOTTOM", 0, -10) frame:SetSize(280, 10) frame.t = frame:CreateTexture(nil, "OVERLAY") frame.t:SetTexture("Interface\\CastingBar\\UI-CastingBar-Border") frame.t:SetSize(375, 64) frame.t:SetPoint("TOP", 0, 28) end frame.bar = CreateFrame("StatusBar", nil, frame) frame.bar:SetStatusBarTexture(C.media.texture) frame.bar:SetAllPoints() frame.bar:SetFrameLevel(PVPReadyDialog:GetFrameLevel() + 1) frame.bar:SetStatusBarColor(1, 0.7, 0) PVPReadyDialog.nextUpdate = 0 local function UpdateBar() local obj = PVPReadyDialog local oldTime = GetTime() local flag = 0 local duration = 90 local interval = 0.1 obj:SetScript("OnUpdate", function(_, elapsed) obj.nextUpdate = obj.nextUpdate + elapsed if obj.nextUpdate > interval then local newTime = GetTime() if (newTime - oldTime) < duration then local width = frame:GetWidth() * (newTime - oldTime) / duration frame.bar:SetPoint("BOTTOMRIGHT", frame, 0 - width, 0) flag = flag + 1 if flag >= 10 then flag = 0 end else obj:SetScript("OnUpdate", nil) end obj.nextUpdate = 0 end end) end frame:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") frame:SetScript("OnEvent", function() if PVPReadyDialog:IsShown() then UpdateBar() end end) ================================================ FILE: ShestakUI/Modules/Misc/RaidUtility.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.misc.raid_tools ~= true then return end ---------------------------------------------------------------------------------------- -- Raid Utility(by Elv22) ---------------------------------------------------------------------------------------- -- Create main frame local RaidUtilityPanel = CreateFrame("Frame", "RaidUtilityPanel", T_PetBattleFrameHider) RaidUtilityPanel:CreatePanel("Transparent", 170, 145, unpack(C.position.raid_utility)) if GetCVarBool("watchFrameWidth") then RaidUtilityPanel:SetPoint(C.position.raid_utility[1], C.position.raid_utility[2], C.position.raid_utility[3], C.position.raid_utility[4] + 100, C.position.raid_utility[5]) end RaidUtilityPanel.toggled = false -- Check if We are Raid Leader or Raid Officer local function CheckRaidStatus() local _, instanceType = IsInInstance() if ((GetNumGroupMembers() > 0 and UnitIsGroupLeader("player") and not UnitInRaid("player")) or UnitIsGroupLeader("player") or UnitIsGroupAssistant("player")) and (instanceType ~= "pvp" or instanceType ~= "arena") then return true else return false end end -- Function to create buttons in this module local function CreateButton(name, parent, template, width, height, point, relativeto, point2, xOfs, yOfs, text) local b = CreateFrame("Button", name, parent, template) b:SetWidth(width) b:SetHeight(height) b:SetPoint(point, relativeto, point2, xOfs, yOfs) b:EnableMouse(true) if text then b.t = b:CreateFontString(nil, "OVERLAY") b.t:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) b.t:SetPoint("CENTER") b.t:SetJustifyH("CENTER") b.t:SetText(text) b.t:SetWidth(width - 2) b.t:SetHeight(C.media.pixel_font_size) end end -- Show button CreateButton("RaidUtilityShowButton", T_PetBattleFrameHider, "UIPanelButtonTemplate, SecureHandlerClickTemplate", RaidUtilityPanel:GetWidth() / 1.5, 18, "TOP", RaidUtilityPanel, "TOP", 0, 0, RAID_CONTROL) RaidUtilityShowButton:SetFrameRef("RaidUtilityPanel", RaidUtilityPanel) RaidUtilityShowButton:SetAttribute("_onclick", [=[self:Hide(); self:GetFrameRef("RaidUtilityPanel"):Show();]=]) RaidUtilityShowButton:SetScript("OnMouseUp", function(_, button) if button == "RightButton" then if CheckRaidStatus() then DoReadyCheck() end elseif button == "MiddleButton" then if CheckRaidStatus() then InitiateRolePoll() end elseif button == "LeftButton" then RaidUtilityPanel.toggled = true end end) -- Close button CreateButton("RaidUtilityCloseButton", RaidUtilityPanel, "UIPanelButtonTemplate, SecureHandlerClickTemplate", RaidUtilityPanel:GetWidth() / 1.5, 18, "TOP", RaidUtilityPanel, "BOTTOM", 0, -1, CLOSE) RaidUtilityCloseButton:SetFrameRef("RaidUtilityShowButton", RaidUtilityShowButton) RaidUtilityCloseButton:SetAttribute("_onclick", [=[self:GetParent():Hide(); self:GetFrameRef("RaidUtilityShowButton"):Show();]=]) RaidUtilityCloseButton:SetScript("OnMouseUp", function() RaidUtilityPanel.toggled = false end) -- Disband Group button CreateButton("RaidUtilityDisbandButton", RaidUtilityPanel, "UIPanelButtonTemplate", RaidUtilityPanel:GetWidth() * 0.8, 18, "TOP", RaidUtilityPanel, "TOP", 0, -5, L_RAID_UTIL_DISBAND) RaidUtilityDisbandButton:SetScript("OnMouseUp", function() StaticPopup_Show("DISBAND_RAID") end) -- Convert Group button CreateButton("RaidUtilityConvertButton", RaidUtilityPanel, "UIPanelButtonTemplate", RaidUtilityPanel:GetWidth() * 0.8, 18, "TOP", RaidUtilityDisbandButton, "BOTTOM", 0, -5, UnitInRaid("player") and CONVERT_TO_PARTY or CONVERT_TO_RAID) RaidUtilityConvertButton:SetScript("OnMouseUp", function() if UnitInRaid("player") then C_PartyInfo.ConvertToParty() RaidUtilityConvertButton.t:SetText(CONVERT_TO_RAID) elseif UnitInParty("player") then C_PartyInfo.ConvertToRaid() RaidUtilityConvertButton.t:SetText(CONVERT_TO_PARTY) end end) -- Role Check button CreateButton("RaidUtilityRoleButton", RaidUtilityPanel, "UIPanelButtonTemplate", RaidUtilityPanel:GetWidth() * 0.8, 18, "TOP", RaidUtilityConvertButton, "BOTTOM", 0, -5, ROLE_POLL) RaidUtilityRoleButton:SetScript("OnMouseUp", function() InitiateRolePoll() end) -- MainTank button CreateButton("RaidUtilityMainTankButton", RaidUtilityPanel, "UIPanelButtonTemplate, SecureActionButtonTemplate", (RaidUtilityDisbandButton:GetWidth() / 2) - 2, 18, "TOPLEFT", RaidUtilityRoleButton, "BOTTOMLEFT", 0, -5, TANK) RaidUtilityMainTankButton:SetAttribute("type", "maintank") RaidUtilityMainTankButton:SetAttribute("unit", "target") RaidUtilityMainTankButton:SetAttribute("action", "toggle") -- MainAssist button CreateButton("RaidUtilityMainAssistButton", RaidUtilityPanel, "UIPanelButtonTemplate, SecureActionButtonTemplate", (RaidUtilityDisbandButton:GetWidth() / 2) - 2, 18, "TOPRIGHT", RaidUtilityRoleButton, "BOTTOMRIGHT", 0, -5, MAINASSIST) RaidUtilityMainAssistButton:SetAttribute("type", "mainassist") RaidUtilityMainAssistButton:SetAttribute("unit", "target") RaidUtilityMainAssistButton:SetAttribute("action", "toggle") -- Ready Check button CreateButton("RaidUtilityReadyCheckButton", RaidUtilityPanel, "UIPanelButtonTemplate", RaidUtilityRoleButton:GetWidth() * 0.75, 18, "TOPLEFT", RaidUtilityMainTankButton, "BOTTOMLEFT", 0, -5, READY_CHECK) RaidUtilityReadyCheckButton:SetScript("OnMouseUp", function() DoReadyCheck() end) -- World Marker button CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:ClearAllPoints() CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:SetPoint("TOPRIGHT", RaidUtilityMainAssistButton, "BOTTOMRIGHT", 0, -5) CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:SetParent(RaidUtilityPanel) CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:SetHeight(18) CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:SetWidth(RaidUtilityRoleButton:GetWidth() * 0.22) CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:StripTextures(true) local MarkTexture = CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton:CreateTexture(nil, "OVERLAY") MarkTexture:SetTexture("Interface\\RaidFrame\\Raid-WorldPing") MarkTexture:SetPoint("CENTER", 0, -1) -- Raid Control Panel CreateButton("RaidUtilityRaidControlButton", RaidUtilityPanel, "UIPanelButtonTemplate", RaidUtilityRoleButton:GetWidth(), 18, "TOPLEFT", RaidUtilityReadyCheckButton, "BOTTOMLEFT", 0, -5, RAID_CONTROL) RaidUtilityRaidControlButton:SetScript("OnMouseUp", function() ToggleFriendsFrame(4) end) local function ToggleRaidUtil(self, event) if InCombatLockdown() then self:RegisterEvent("PLAYER_REGEN_ENABLED") return end if CheckRaidStatus() then if RaidUtilityPanel.toggled == true then RaidUtilityShowButton:Hide() RaidUtilityPanel:Show() else RaidUtilityShowButton:Show() RaidUtilityPanel:Hide() end else RaidUtilityShowButton:Hide() RaidUtilityPanel:Hide() end if event == "PLAYER_REGEN_ENABLED" then self:UnregisterEvent("PLAYER_REGEN_ENABLED") end end -- Automatically show/hide the frame if we have Raid Leader or Raid Officer local LeadershipCheck = CreateFrame("Frame") LeadershipCheck:RegisterEvent("PLAYER_ENTERING_WORLD") LeadershipCheck:RegisterEvent("GROUP_ROSTER_UPDATE") LeadershipCheck:SetScript("OnEvent", ToggleRaidUtil) -- Support Aurora if IsAddOnLoaded("Aurora") then local F = unpack(Aurora) RaidUtilityPanel:SetBackdropColor(0, 0, 0, 0) RaidUtilityPanel:SetBackdropBorderColor(0, 0, 0, 0) RaidUtilityPanelInnerBorder:SetBackdropBorderColor(0, 0, 0, 0) RaidUtilityPanelOuterBorder:SetBackdropBorderColor(0, 0, 0, 0) F.CreateBD(RaidUtilityPanel) end ================================================ FILE: ShestakUI/Modules/Misc/SlotItemLevel.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.misc.item_level ~= true then return end ---------------------------------------------------------------------------------------- -- Item level on slot buttons in Character/InspectFrame(iLevel by Sanex) ---------------------------------------------------------------------------------------- local minItemLevel = 375 -- For missing enchant and gems checking local _G = getfenv(0) local equiped = {} -- Table to store equiped items local f = CreateFrame("Frame", nil, _G.PaperDollFrame) -- iLvel number frame local g -- iLvel number for Inspect frame f:RegisterEvent("ADDON_LOADED") f:RegisterEvent("PLAYER_LOGIN") local fontObject = CreateFont("iLvLFont") fontObject:SetFontObject("SystemFont_Outline_Small") -- Tooltip and scanning by Phanx @ http://www.wowinterface.com/forums/showthread.php?p=271406 local itemLevelString = "^"..gsub(ITEM_LEVEL, "%%d", "") local function _getRealItemLevel(slotId, unit) local data = C_TooltipInfo.GetInventoryItem(unit, slotId) if not data then return nil end -- With this we don't get ilvl for offhand if we equip 2h weapon local realItemLevel for i = 2, #data.lines do local lineData = data.lines[i] local argVal = lineData and lineData.args if argVal then local text = argVal[2] and argVal[2].stringVal local found = text and strfind(text, itemLevelString) if found then local level = strmatch(text, "(%d+)%)?$") if level and (tonumber(level) > 0) then realItemLevel = level break end end end end return realItemLevel end -- local function checkSpecID(unit) -- local i = 0 -- local specID -- if unit == "player" then -- specID = GetSpecializationInfo(GetSpecialization()) -- else -- specID = GetInspectSpecialization("target") -- end -- if specID then -- if specID == 250 or specID == 251 or specID == 252 or specID == 66 or specID == 70 or specID == 71 or specID == 72 or specID == 73 then -- i = INVSLOT_HAND -- elseif specID == 577 or specID == 581 or specID == 103 or specID == 104 or specID == 253 or specID == 254 or specID == 255 -- or specID == 268 or specID == 269 or specID == 259 or specID == 260 or specID == 261 or specID == 263 then -- i = INVSLOT_FEET -- else -- i = INVSLOT_WRIST -- end -- end -- return i -- end local function _updateItems(unit, frame) -- local itemSlot = checkSpecID(unit) for i = 1, 17 do -- Only check changed player items or items without ilvl text, skip the shirt (4) and always update Inspects local itemLink = GetInventoryItemLink(unit, i) if i ~= 4 and ((frame == f and (equiped[i] ~= itemLink or frame[i]:GetText() == nil or itemLink == nil and frame[i]:GetText() ~= "")) or frame == g) then if frame == f then equiped[i] = itemLink end local realItemLevel = _getRealItemLevel(i, unit) realItemLevel = realItemLevel or "" if realItemLevel and tonumber(realItemLevel) == 1 then realItemLevel = "" end local color = "|cffFFFF00" -- Check missing enchants and gems if itemLink and (realItemLevel ~= "" and tonumber(realItemLevel) > minItemLevel) then local _, _, enchant, gem1, gem2, gem3 = strsplit(":", itemLink) if i == INVSLOT_BACK or i == INVSLOT_CHEST or i == INVSLOT_MAINHAND or i == INVSLOT_FINGER1 or i == INVSLOT_FINGER2 or i == INVSLOT_WRIST or i == INVSLOT_FEET or i == INVSLOT_LEGS then if enchant and enchant == "" then color = "|cffFF0000" end end local info = GetItemStats(itemLink) local numSocket = info["EMPTY_SOCKET_PRISMATIC"] or 0 local numGem = 0 if gem1 and gem1 ~= "" then numGem = numGem + 1 end if gem2 and gem2 ~= "" then numGem = numGem + 1 end if gem3 and gem3 ~= "" then numGem = numGem + 1 end if numGem < numSocket then color = "|cffFF00CC" end end frame[i]:SetText(color..realItemLevel) end end end local function _createStrings() local function _stringFactory(parent) local s = f:CreateFontString(nil, "OVERLAY", "iLvLFont") s:SetPoint("TOP", parent, "TOP", 0, -2) return s end f:SetFrameLevel(_G.CharacterHeadSlot:GetFrameLevel()) f[1] = _stringFactory(_G.CharacterHeadSlot) f[2] = _stringFactory(_G.CharacterNeckSlot) f[3] = _stringFactory(_G.CharacterShoulderSlot) f[15] = _stringFactory(_G.CharacterBackSlot) f[5] = _stringFactory(_G.CharacterChestSlot) f[9] = _stringFactory(_G.CharacterWristSlot) f[10] = _stringFactory(_G.CharacterHandsSlot) f[6] = _stringFactory(_G.CharacterWaistSlot) f[7] = _stringFactory(_G.CharacterLegsSlot) f[8] = _stringFactory(_G.CharacterFeetSlot) f[11] = _stringFactory(_G.CharacterFinger0Slot) f[12] = _stringFactory(_G.CharacterFinger1Slot) f[13] = _stringFactory(_G.CharacterTrinket0Slot) f[14] = _stringFactory(_G.CharacterTrinket1Slot) f[16] = _stringFactory(_G.CharacterMainHandSlot) f[17] = _stringFactory(_G.CharacterSecondaryHandSlot) f:Hide() end local function _createGStrings() local function _stringFactory(parent) local s = g:CreateFontString(nil, "OVERLAY", "iLvLFont") s:SetPoint("TOP", parent, "TOP", 0, -2) return s end g:SetFrameLevel(_G.InspectHeadSlot:GetFrameLevel()) g[1] = _stringFactory(_G.InspectHeadSlot) g[2] = _stringFactory(_G.InspectNeckSlot) g[3] = _stringFactory(_G.InspectShoulderSlot) g[15] = _stringFactory(_G.InspectBackSlot) g[5] = _stringFactory(_G.InspectChestSlot) g[9] = _stringFactory(_G.InspectWristSlot) g[10] = _stringFactory(_G.InspectHandsSlot) g[6] = _stringFactory(_G.InspectWaistSlot) g[7] = _stringFactory(_G.InspectLegsSlot) g[8] = _stringFactory(_G.InspectFeetSlot) g[11] = _stringFactory(_G.InspectFinger0Slot) g[12] = _stringFactory(_G.InspectFinger1Slot) g[13] = _stringFactory(_G.InspectTrinket0Slot) g[14] = _stringFactory(_G.InspectTrinket1Slot) g[16] = _stringFactory(_G.InspectMainHandSlot) g[17] = _stringFactory(_G.InspectSecondaryHandSlot) g:Hide() end local function OnEvent(self, event, ...) if event == "ADDON_LOADED" and (...) == "Blizzard_InspectUI" then self:UnregisterEvent(event) if not InspectFrameiLvL and not C.tooltip.average_lvl then local text = InspectModelFrame:CreateFontString("InspectFrameiLvL", "OVERLAY", "SystemFont_Outline_Small") text:SetPoint("BOTTOM", 5, 20) text:Hide() InspectPaperDollFrame:HookScript("OnShow", function() local avgilvl = C_PaperDollInfo.GetInspectItemLevel("target") if avgilvl and tonumber(avgilvl) > 0 then text:SetText("|cFFFFFF00"..avgilvl) text:Show() end end) InspectPaperDollFrame:HookScript("OnHide", function() text:Hide() end) end g = CreateFrame("Frame", nil, _G.InspectPaperDollFrame) -- iLevel number frame for Inspect _createGStrings() _createGStrings = nil _G.InspectPaperDollFrame:HookScript("OnShow", function() g:SetFrameLevel(_G.InspectHeadSlot:GetFrameLevel()) f:RegisterEvent("INSPECT_READY") f:RegisterEvent("UNIT_INVENTORY_CHANGED") _updateItems("target", g) g:Show() end) _G.InspectPaperDollFrame:HookScript("OnHide", function() f:UnregisterEvent("INSPECT_READY") f:UnregisterEvent("UNIT_INVENTORY_CHANGED") g:Hide() end) elseif event == "PLAYER_LOGIN" then self:UnregisterEvent(event) _createStrings() _createStrings = nil _G.PaperDollFrame:HookScript("OnShow", function() f:RegisterEvent("PLAYER_EQUIPMENT_CHANGED") f:RegisterEvent("ARTIFACT_UPDATE") f:RegisterEvent("SOCKET_INFO_UPDATE") f:RegisterEvent("COMBAT_RATING_UPDATE") _updateItems("player", f) f:Show() end) _G.PaperDollFrame:HookScript("OnHide", function() f:UnregisterEvent("PLAYER_EQUIPMENT_CHANGED") f:UnregisterEvent("ARTIFACT_UPDATE") f:UnregisterEvent("SOCKET_INFO_UPDATE") f:UnregisterEvent("COMBAT_RATING_UPDATE") f:Hide() end) elseif event == "PLAYER_EQUIPMENT_CHANGED" or event == "ARTIFACT_UPDATE" or event == "SOCKET_INFO_UPDATE" or event == "COMBAT_RATING_UPDATE" then if (...) == 16 then equiped[16] = nil equiped[17] = nil end _updateItems("player", f) elseif event == "INSPECT_READY" or event == "UNIT_INVENTORY_CHANGED" then _updateItems("target", g) end end f:SetScript("OnEvent", OnEvent) ---------------------------------------------------------------------------------------- -- Item level on flyout buttons (by Merathilis) ---------------------------------------------------------------------------------------- local ItemDB = {} local function _getRealItemLevel(link, bag, slot) if ItemDB[link] then return ItemDB[link] end local realItemLevel if bag and type(bag) == "string" then realItemLevel = C_Item.GetCurrentItemLevel(ItemLocation:CreateFromEquipmentSlot(slot)) else realItemLevel = C_Item.GetCurrentItemLevel(ItemLocation:CreateFromBagAndSlot(bag, slot)) end ItemDB[link] = tonumber(realItemLevel) return realItemLevel end local function SetupFlyoutLevel(button, bag, slot) if not button.iLvl then button.iLvl = button:CreateFontString(nil, "OVERLAY", "iLvLFont") button.iLvl:SetPoint("TOP", 0, -2) end local link, level if bag then link = C_Container.GetContainerItemLink(bag, slot) level = _getRealItemLevel(link, bag, slot) else link = GetInventoryItemLink("player", slot) level = _getRealItemLevel(link, "player", slot) end if level then button.iLvl:SetText("|cFFFFFF00"..level) end end hooksecurefunc("EquipmentFlyout_DisplayButton", function(button) local location = button.location if not location or location >= EQUIPMENTFLYOUT_FIRST_SPECIAL_LOCATION then if button.iLvl then button.iLvl:SetText("") end return end local _, _, bags, voidStorage, slot, bag = EquipmentManager_UnpackLocation(location) if voidStorage then return end if bags then SetupFlyoutLevel(button, bag, slot) else SetupFlyoutLevel(button, nil, slot) end end) ================================================ FILE: ShestakUI/Modules/Misc/Threat.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.threat.enable ~= true then return end ---------------------------------------------------------------------------------------- -- Based on alThreatMeter(by Allez) ---------------------------------------------------------------------------------------- local spacing = 7 local ThreatMeterAnchor = CreateFrame("Frame", "ThreatMeterAnchor", UIParent) ThreatMeterAnchor:SetSize(C.threat.width + 4, (C.threat.height * C.threat.bar_rows) + (spacing * (C.threat.bar_rows - 1)) + 4) if C.actionbar.split_bars then ThreatMeterAnchor:SetPoint(C.position.threat_meter[1], SplitBarRight, C.position.threat_meter[3], C.position.threat_meter[4], C.position.threat_meter[5]) else ThreatMeterAnchor:SetPoint(unpack(C.position.threat_meter)) end local bar, tList, barList = {}, {}, {} local targeted = false RAID_CLASS_COLORS["PET"] = {r = 0, g = 0.7, b = 0, colorStr = "ff00b200"} local CreateFS = function(frame) local fstring = frame:CreateFontString(nil, "OVERLAY") fstring:SetFont(C.font.threat_meter_font, C.font.threat_meter_font_size, C.font.threat_meter_font_style) fstring:SetShadowOffset(C.font.threat_meter_font_shadow and 1 or 0, C.font.threat_meter_font_shadow and -1 or 0) return fstring end local AddUnit = function(unit) local threatpct, _, threatval = select(3, UnitDetailedThreatSituation(unit, "target")) if threatval and threatval < 0 then threatval = threatval + 410065408 end local guid = UnitGUID(unit) if not tList[guid] then tinsert(barList, guid) tList[guid] = { name = UnitName(unit), class = UnitIsPlayer(unit) and select(2, UnitClass(unit)) or "PET", } end tList[guid].pct = threatpct or 0 tList[guid].val = threatval or 0 end local CheckUnit = function(unit) if UnitExists(unit) and UnitIsVisible(unit) then AddUnit(unit) if UnitExists(unit.."pet") then AddUnit(unit.."pet") end end end local CreateBar = function() local bar = CreateFrame("Statusbar", nil, UIParent) bar:SetSize(C.threat.width, C.threat.height) bar:SetStatusBarTexture(C.media.texture) bar:SetMinMaxValues(0, 100) bar:CreateBackdrop("Default") bar.bg = bar:CreateTexture(nil, "BACKGROUND") bar.bg:SetAllPoints(bar) bar.bg:SetTexture(C.media.texture) bar.left = CreateFS(bar) bar.left:SetPoint("LEFT", 2, 0) bar.left:SetJustifyH("LEFT") bar.right = CreateFS(bar) bar.right:SetPoint("RIGHT", 1, 0) bar.right:SetJustifyH("RIGHT") bar:Hide() return bar end local SortMethod = function(a, b) return tList[b].pct < tList[a].pct end local UpdateBars = function() for _, v in pairs(bar) do v:Hide() end table.sort(barList, SortMethod) for i = 1, #barList do local cur = tList[barList[i]] local max = tList[barList[1]] if i > C.threat.bar_rows or not cur or cur.pct == 0 then break end if not bar[i] then bar[i] = CreateBar() if i == 1 then bar[i]:SetPoint("TOP", ThreatMeterAnchor, "TOP", 0, -2) else bar[i]:SetPoint("TOPLEFT", bar[i-1], "BOTTOMLEFT", 0, -spacing) end end bar[i]:SetValue(100 * cur.pct / max.pct) local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[cur.class] bar[i]:SetStatusBarColor(color.r, color.g, color.b) bar[i].bg:SetVertexColor(color.r, color.g, color.b, 0.2) bar[i].left:SetText(cur.name) bar[i].right:SetText(string.format("%s [%d%%]", T.ShortValue(cur.val), cur.pct)) bar[i]:Show() end end local UpdateThreat = function() if targeted then if GetNumGroupMembers() > 0 then local unit = IsInRaid() and "raid" or "party" for i = 1, GetNumGroupMembers(), 1 do CheckUnit(unit..i) end end CheckUnit("targettarget") CheckUnit("player") end UpdateBars() end local OnEvent = function(_, event) if event == "PLAYER_TARGET_CHANGED" or event == "UNIT_THREAT_LIST_UPDATE" then if C.threat.hide_solo == true and GetNumGroupMembers() == 0 then targeted = false else if UnitExists("target") and not UnitIsDead("target") and not UnitIsPlayer("target") and UnitCanAttack("player", "target") then targeted = true else targeted = false end end end if event == "PLAYER_TARGET_CHANGED" or event == "PLAYER_REGEN_ENABLED" then wipe(tList) wipe(barList) end UpdateThreat() end local addon = CreateFrame("Frame") addon:SetScript("OnEvent", OnEvent) addon:RegisterEvent("PLAYER_TARGET_CHANGED") addon:RegisterEvent("UNIT_THREAT_LIST_UPDATE") addon:RegisterEvent("PLAYER_REGEN_ENABLED") SlashCmdList.alThreat = function() for i = 1, C.threat.bar_rows do tList[i] = { name = UnitName("player"), class = select(2, UnitClass("player")), pct = i / C.threat.bar_rows * 100, val = i * 10000, } tinsert(barList, i) end UpdateBars() wipe(tList) wipe(barList) end SLASH_alThreat1 = "/threat" SLASH_alThreat2 = "/еркуфе" ================================================ FILE: ShestakUI/Modules/Quests/AutoAccept.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.automation.accept_quest ~= true then return end ---------------------------------------------------------------------------------------- -- Quest automation(QuickQuest by p3lim) ---------------------------------------------------------------------------------------- local _, ns = ... local QuickQuestDB = { general = { share = false, skipgossip = true, skipgossipwhen = 1, paydarkmoonfaire = true, pausekey = 'SHIFT', pausekeyreverse = false, }, blocklist = { items = { -- Inscription weapons [79343] = true, -- Inscribed Tiger Staff [79340] = true, -- Inscribed Crane Staff [79341] = true, -- Inscribed Serpent Staff -- Darkmoon Faire artifacts [71635] = true, -- Imbued Crystal [71636] = true, -- Monstrous Egg [71637] = true, -- Mysterious Grimoire [71638] = true, -- Ornate Weapon [71715] = true, -- A Treatise on Strategy [71951] = true, -- Banner of the Fallen [71952] = true, -- Captured Insignia [71953] = true, -- Fallen Adventurer's Journal [71716] = true, -- Soothsayer's Runes -- Tiller Gifts [79264] = true, -- Ruby Shard [79265] = true, -- Blue Feather [79266] = true, -- Jade Cat [79267] = true, -- Lovely Apple [79268] = true, -- Marsh Lily -- Garrison scouting missives [122424] = true, -- Scouting Missive: Broken Precipice [122423] = true, -- Scouting Missive: Broken Precipice [122418] = true, -- Scouting Missive: Darktide Roost [122417] = true, -- Scouting Missive: Darktide Roost [122400] = true, -- Scouting Missive: Everbloom Wilds [122404] = true, -- Scouting Missive: Everbloom Wilds [122420] = true, -- Scouting Missive: Gorian Proving Grounds [122419] = true, -- Scouting Missive: Gorian Proving Grounds [122402] = true, -- Scouting Missive: Iron Siegeworks [122406] = true, -- Scouting Missive: Iron Siegeworks [122413] = true, -- Scouting Missive: Lost Veil Anzu [122414] = true, -- Scouting Missive: Lost Veil Anzu [122403] = true, -- Scouting Missive: Magnarok [122399] = true, -- Scouting Missive: Magnarok [122421] = true, -- Scouting Missive: Mok'gol Watchpost [122422] = true, -- Scouting Missive: Mok'gol Watchpost [122411] = true, -- Scouting Missive: Pillars of Fate [122409] = true, -- Scouting Missive: Pillars of Fate [122412] = true, -- Scouting Missive: Shattrath Harbor [122410] = true, -- Scouting Missive: Shattrath Harbor [122408] = true, -- Scouting Missive: Skettis [122407] = true, -- Scouting Missive: Skettis [122416] = true, -- Scouting Missive: Socrethar's Rise [122415] = true, -- Scouting Missive: Socrethar's Rise [122405] = true, -- Scouting Missive: Stonefury Cliffs [122401] = true, -- Scouting Missive: Stonefury Cliffs -- Misc [88604] = true, -- Nat's Fishing Journal }, npcs = { -- misc [103792] = true, -- Griftah (his quests are scams) [143925] = true, -- Dark Iron Mole Machine (Dark Iron Dwarf racial) -- Bodyguards [86945] = true, -- Aeda Brightdawn (Horde) [86933] = true, -- Vivianne (Horde) [86927] = true, -- Delvar Ironfist (Alliance) [86934] = true, -- Defender Illona (Alliance) [86682] = true, -- Tormmok [86964] = true, -- Leorajh [86946] = true, -- Talonpriest Ishaal -- Sassy Imps [95139] = true, [95141] = true, [95142] = true, [95143] = true, [95144] = true, [95145] = true, [95146] = true, [95200] = true, [95201] = true, }, quests = { -- 6.0 coins [36054] = true, -- Sealing Fate: Gold [37454] = true, -- Sealing Fate: Piles of Gold [37455] = true, -- Sealing Fate: Immense Fortune of Gold [36055] = true, -- Sealing Fate: Apexis Crystals [37452] = true, -- Sealing Fate: Heap of Apexis Crystals [37453] = true, -- Sealing Fate: Mountain of Apexis Crystals [36056] = true, -- Sealing Fate: Garrison Resources [37456] = true, -- Sealing Fate: Stockpiled Garrison Resources [37457] = true, -- Sealing Fate: Tremendous Garrison Resources [36057] = true, -- Sealing Fate: Honor -- 7.0 coins [43892] = true, -- Sealing Fate: Order Resources [43893] = true, -- Sealing Fate: Stashed Order Resources [43894] = true, -- Sealing Fate: Extraneous Order Resources [43895] = true, -- Sealing Fate: Gold [43896] = true, -- Sealing Fate: Piles of Gold [43897] = true, -- Sealing Fate: Immense Fortune of Gold [47851] = true, -- Sealing Fate: Marks of Honor [47864] = true, -- Sealing Fate: Additional Marks of Honor [47865] = true, -- Sealing Fate: Piles of Marks of Honor -- 8.0 coins [52834] = true, -- Seal of Wartorn Fate: Gold [52838] = true, -- Seal of Wartorn Fate: Piles of Gold [52835] = true, -- Seal of Wartorn Fate: Marks of Honor [52839] = true, -- Seal of Wartorn Fate: Additional Marks of Honor [52837] = true, -- Seal of Wartorn Fate: War Resources [52840] = true, -- Seal of Wartorn Fate: Stashed War Resources -- 7.0 valuable resources [48910] = true, -- Supplying Krokuun [48634] = true, -- Further Supplying Krokuun [48911] = true, -- Void Inoculation [48635] = true, -- More Void Inoculation [48799] = true, -- Fuel for a Doomed World -- 8.0 emissaries [54451] = true, -- Baubles from the Seekers [53982] = true, -- Supplies From The Unshackled [54453] = true, -- Supplies from Magni [54454] = true, -- Supplies from 7th Legion [54455] = true, -- Supplies from Honorbound [54456] = true, -- Supplies from Order of Embers [54457] = true, -- Supplies from Storm Wake [54458] = true, -- Supplies from Proudmoore Admiralty [54460] = true, -- Supplies from Talanji's Expedition [54461] = true, -- Supplies from Voldunai Supplies [54462] = true, -- Supplies from Zandalari Empire [55348] = true, -- Supplies from the Rustbolt Resistance [55976] = true, -- Supplies From the Waveblade Ankoan -- 9.0 valuable resources [64541] = true, -- The Cost of Death (Ve'nari) -- 10.0 valuable resources [70183] = true, -- Specialized Secrets: Alchemy (Khadin) [70184] = true, -- Specialized Secrets: Blacksmithing (Khadin) [70186] = true, -- Specialized Secrets: Enchanting (Khadin) [70187] = true, -- Specialized Secrets: Engineering (Khadin) [70190] = true, -- Specialized Secrets: Herbalism (Khadin) [70188] = true, -- Specialized Secrets: Inscription (Khadin) [70189] = true, -- Specialized Secrets: Jewelcrafting (Khadin) [70191] = true, -- Specialized Secrets: Leatherworking (Khadin) [70192] = true, -- Specialized Secrets: Mining (Khadin) [70193] = true, -- Specialized Secrets: Skinning (Khadin) [70194] = true, -- Specialized Secrets: Tailoring (Khadin) }, }, } local EventHandler = CreateFrame('Frame') EventHandler.events = {} EventHandler:SetScript('OnEvent', function(self, event, ...) self:Trigger(event, ...) end) function EventHandler:Register(event, func) local registered = not not self.events[event] if not registered then self.events[event] = {} end for _, f in next, self.events[event] do if f == func then -- avoid the same function being registered multiple times for the same event return end end table.insert(self.events[event], func) if not registered then self:RegisterEvent(event) end end function EventHandler:Unregister(event, func) local funcs = self.events[event] if funcs then for i, f in next, funcs do if f == func then funcs[i] = nil break end end end if funcs and #funcs == 0 then self:UnregisterEvent(event) end end function EventHandler:Trigger(event, ...) local funcs = self.events[event] if funcs then for _, func in next, funcs do if type(func) == 'string' then self:Trigger(func, ...) else if func(...) then self:Unregister(event, func) end end end end end ns.EventHandler = EventHandler local NPC_ID_PATTERN = '%w+%-.-%-.-%-.-%-.-%-(.-)%-' function ns.GetNPCID(unit) local npcGUID = UnitGUID(unit or 'npc') if npcGUID then return tonumber(npcGUID:match(NPC_ID_PATTERN)) end end function ns.ShouldAcceptTrivialQuests() for index = 1, GetNumTrackingTypes() do local name, _, isActive = GetTrackingInfo(index) if name == MINIMAP_TRACKING_TRIVIAL_QUESTS then return isActive end end end function ns.tLength(t) local count = 0 for _ in next, t do count = count + 1 end return count end local EventHandler = ns.EventHandler local paused local DARKMOON_ISLE_MAP_ID = 407 local DARKMOON_FAIRE_TELEPORT_NPC_ID = 57850 -- Teleportologist Fozlebub local ignoredQuests = {} local cashRewards = { [45724] = 1e5, -- Champion's Purse, 10 gold [64491] = 2e6, -- Royal Reward, 200 gold -- items from the Sixtrigger brothers quest chain in Stormheim [138127] = 15, -- Mysterious Coin, 15 copper [138129] = 11, -- Swatch of Priceless Silk, 11 copper [138131] = 24, -- Magical Sprouting Beans, 24 copper [138123] = 15, -- Shiny Gold Nugget, 15 copper [138125] = 16, -- Crystal Clear Gemstone, 16 copper [138133] = 27, -- Elixir of Endless Wonder, 27 copper } local darkmoonNPCs = { -- Darkmoon Faire teleporation NPCs [57850] = true, -- Teleportologist Fozlebub [55382] = true, -- Darkmoon Faire Mystic Mage (Horde) [54334] = true, -- Darkmoon Faire Mystic Mage (Alliance) } local rogueNPCs = { -- Rogue class hall doors [97004] = true, -- "Red" Jack Findle [96782] = true, -- Lucian Trias [93188] = true, -- Mongar } local function IsQuestIgnored(questID) if ignoredQuests[questID] then return true end local questTitle = tonumber(questID) and C_QuestLog.GetTitleForQuestID(questID) or '' for key in next, QuickQuestDB.blocklist.quests do if key == questID or questTitle:lower():find(tostring(key):lower()) then return true end end return false end EventHandler:Register('GOSSIP_CONFIRM', function(index) -- triggered when a gossip confirm prompt is displayed if paused then return end if QuickQuestDB.general.paydarkmoonfaire and darkmoonNPCs[ns.GetNPCID()] then C_GossipInfo.SelectOption(index, '', true) -- this is considered an intrusive action, as we're modifying the UI StaticPopup_Hide('GOSSIP_CONFIRM') end end) EventHandler:Register('GOSSIP_SHOW', function() -- triggered when the player interacts with an NPC that presents dialogue if paused then return end local npcID = ns.GetNPCID() if QuickQuestDB.blocklist.npcs[npcID] then return end if C_Map.GetBestMapForUnit('player') == DARKMOON_ISLE_MAP_ID then -- we want to auto-accept the dialogues from Darkmoon Faire NPCs for index, info in next, C_GossipInfo.GetOptions() do if info.name:find('FF008E8') then -- See if there is something else than the color we can easily match with C_GossipInfo.SelectOption(index) return end end end if C_GossipInfo.GetNumActiveQuests() > 0 or C_GossipInfo.GetNumAvailableQuests() > 0 then -- bail if there is more than just dialogue return end if rogueNPCs[npcID] then -- automatically open doors to the rogue class hall in Dalaran C_GossipInfo.SelectOption(1) return end if QuickQuestDB.general.paydarkmoonfaire and npcID == DARKMOON_FAIRE_TELEPORT_NPC_ID then C_GossipInfo.SelectOption(1) return end if #C_GossipInfo.GetOptions() == 1 and QuickQuestDB.general.skipgossip then -- automatically skip single dialogue under certain conditions local _, instanceType = GetInstanceInfo() if instanceType == 'raid' and QuickQuestDB.general.skipgossipwhen > 0 then if GetNumGroupMembers() == 0 or QuickQuestDB.general.skipgossipwhen == 2 then -- select dialogue if alone or when configured to "Always" while in a raid C_GossipInfo.SelectOption(1) return end elseif instanceType ~= 'raid' then -- always select single dialogue while outside a raid C_GossipInfo.SelectOption(1) return end end end) EventHandler:Register('GOSSIP_SHOW', function() -- triggered when the player interacts with an NPC that presents dialogue if paused then return end if QuickQuestDB.blocklist.npcs[ns.GetNPCID()] then return end -- turn in all completed quests for index, info in next, C_GossipInfo.GetActiveQuests() do if not IsQuestIgnored(info.questID) then if info.isComplete and not C_QuestLog.IsWorldQuest(info.questID) then C_GossipInfo.SelectActiveQuest(index) end end end -- accept all available quests for index, info in next, C_GossipInfo.GetAvailableQuests() do if not IsQuestIgnored(info.questID) then if not info.isTrivial or ns.ShouldAcceptTrivialQuests() then C_GossipInfo.SelectAvailableQuest(index) end end end end) EventHandler:Register('QUEST_GREETING', function() -- triggered when the player interacts with an NPC that hands in/out quests if paused then return end if QuickQuestDB.blocklist.npcs[ns.GetNPCID()] then return end -- turn in all completed quests for index = 1, GetNumActiveQuests() do if not IsQuestIgnored(GetActiveQuestID(index)) then local _, isComplete = GetActiveTitle(index) if isComplete and not C_QuestLog.IsWorldQuest(GetActiveQuestID(index)) then SelectActiveQuest(index) end end end -- accept all available quests for index = 1, GetNumAvailableQuests() do local isTrivial, _, _, _, questID = GetAvailableQuestInfo(index) if not IsQuestIgnored(questID) then if not isTrivial or ns.ShouldAcceptTrivialQuests() then SelectAvailableQuest(index) end end end end) EventHandler:Register('QUEST_DETAIL', function(questItemID) -- triggered when the information about an available quest is available if paused then return end if QuestIsFromAreaTrigger() then -- this type of quest is automatically accepted, but the dialogue is presented in a way that -- the player seems to have a choice to decline it, which they don't, so just accept it AcceptQuest() elseif QuestGetAutoAccept() then -- this type of quest is automatically accepted, but the dialogue persists AcknowledgeAutoAcceptQuest() elseif not C_QuestLog.IsQuestTrivial(GetQuestID()) or ns.ShouldAcceptTrivialQuests() then if IsQuestIgnored(GetQuestID()) then CloseQuest() else AcceptQuest() end end end) EventHandler:Register('QUEST_PROGRESS', function() -- triggered when an active quest is selected during turn-in if paused then return end if QuickQuestDB.blocklist.npcs[ns.GetNPCID()] then return end if not IsQuestCompletable() then return end -- iterate through the items part of the quest for index = 1, GetNumQuestItems() do local itemLink = GetQuestItemLink('required', index) if itemLink then -- check to see if the item is blocked local questItemID = GetItemInfoFromHyperlink(itemLink) for itemID in next, QuickQuestDB.blocklist.items do if itemID == questItemID then -- item is blocked, prevent this quest from opening again and close it ignoredQuests[GetQuestID()] = true CloseQuest() return end end else -- item is not cached yet, trigger the item and wait for the cache to populate EventHandler:Register('QUEST_ITEM_UPDATE', 'QUEST_PROGRESS') GetQuestItemInfo('required', index) return end end CompleteQuest() EventHandler:Unregister('QUEST_ITEM_UPDATE', 'QUEST_PROGRESS') end) EventHandler:Register('QUEST_COMPLETE', function() -- triggered when an active quest is ready to be completed if paused then return end if GetNumQuestChoices() <= 1 then -- complete the quest by accepting the first item GetQuestReward(1) end end) EventHandler:Register('QUEST_COMPLETE', function() -- triggered when an active quest is ready to be completed local numItemRewards = GetNumQuestChoices() if numItemRewards <= 1 then -- no point iterating over a single item or none at all return end local highestItemValue, highestItemValueIndex = 0 -- iterate through the item rewards and automatically select the one worth the most for index = 1, numItemRewards do local itemLink = GetQuestItemLink('choice', index) if itemLink then -- check the value on the item and compare it to the others local _, _, _, _, _, _, _, _, _, _, itemValue = GetItemInfo(itemLink) local itemID = GetItemInfoFromHyperlink(itemLink) -- some items are containers that contains currencies of worth itemValue = cashRewards[itemID] or itemValue -- compare the values if itemValue > highestItemValue then highestItemValue = itemValue highestItemValueIndex = index end else -- item is not cached yet, trigger the item and wait for the cache to populate EventHandler:Register('QUEST_ITEM_UPDATE', 'QUEST_COMPLETE') GetQuestItemInfo('choice', index) return end end if highestItemValueIndex then -- this is considered an intrusive action, as we're modifying the UI QuestInfoItem_OnClick(QuestInfoRewardsFrame.RewardButtons[highestItemValueIndex]) end EventHandler:Unregister('QUEST_ITEM_UPDATE', 'QUEST_COMPLETE') end) EventHandler:Register('QUEST_WATCH_LIST_CHANGED', function() -- triggered when the player's quest log has been altered if paused then return end -- check for quest popups whenever the quest log is updated, which also happens on login, and -- when the player loots an item that starts a quest if GetNumAutoQuestPopUps() > 0 then if UnitIsDeadOrGhost('player') then -- can't accept quests while we're dead EventHandler:Register('PLAYER_REGEN_ENABLED', 'QUEST_WATCH_LIST_CHANGED') return end EventHandler:Unregister('PLAYER_REGEN_ENABLED', 'QUEST_WATCH_LIST_CHANGED') -- this is considered an intrusive action, as we're modifying the UI local questID, questType = GetAutoQuestPopUp(1) if questType == 'OFFER' then ShowQuestOffer(questID) else ShowQuestComplete(questID) end -- remove the popup once accepted/completed, the game logic doesn't handle this, -- but this calls FrameXML API which might cause taints, we'll see AutoQuestPopupTracker_RemovePopUp(questID) end end) EventHandler:Register('QUEST_ACCEPT_CONFIRM', function() -- triggered when a quest is shared in the party, but requires confirmation (like escorts) if paused then return end AcceptQuest() end) EventHandler:Register('QUEST_ACCEPTED', function(questID) -- triggered when a quest has been accepted by the player if QuickQuestDB.general.share then local questLogIndex = C_QuestLog.GetLogIndexForQuestID(questID) if questLogIndex then QuestLogPushQuest(questLogIndex) end end end) EventHandler:Register('MODIFIER_STATE_CHANGED', function(key, state) -- triggered when the player clicks any modifier keys on the keyboard if string.sub(key, 2) == QuickQuestDB.general.pausekey then -- change the paused state if QuickQuestDB.general.pausekeyreverse then paused = state ~= 1 else paused = state == 1 end end end) EventHandler:Register('PLAYER_LOGIN', function() -- triggered when the game has completed the login process if QuickQuestDB.general.pausekeyreverse then -- default to a paused state paused = true end end) ================================================ FILE: ShestakUI/Modules/Quests/AutoButton.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.misc.quest_auto_button ~= true or IsAddOnLoaded("ExtraQuestButton") then return end ---------------------------------------------------------------------------------------- -- AutoButton for used items(by Elv22) (use macro /click AutoButton) ---------------------------------------------------------------------------------------- local function AutoButtonHide() AutoButton:SetAlpha(0) if not InCombatLockdown() then AutoButton:EnableMouse(false) else AutoButton:RegisterEvent("PLAYER_REGEN_ENABLED") AutoButton:SetScript("OnEvent", function(_, event) if event == "PLAYER_REGEN_ENABLED" then AutoButton:EnableMouse(false) AutoButton:UnregisterEvent("PLAYER_REGEN_ENABLED") end end) end end local function AutoButtonShow(item) AutoButton:SetAlpha(1) if not InCombatLockdown() then AutoButton:EnableMouse(true) if item then AutoButton:SetAttribute("item", item) end else AutoButton:RegisterEvent("PLAYER_REGEN_ENABLED") AutoButton:SetScript("OnEvent", function(_, event) if event == "PLAYER_REGEN_ENABLED" then AutoButton:EnableMouse(true) if item then AutoButton:SetAttribute("item", item) end AutoButton:UnregisterEvent("PLAYER_REGEN_ENABLED") end end) end end -- Create anchor local AutoButtonAnchor = CreateFrame("Frame", "AutoButtonAnchor", UIParent) AutoButtonAnchor:SetPoint(unpack(C.position.auto_button)) AutoButtonAnchor:SetSize(40, 40) -- Create button local AutoButton = CreateFrame("Button", "AutoButton", UIParent, "SecureActionButtonTemplate") AutoButton:SetSize(40, 40) AutoButton:SetPoint("CENTER", AutoButtonAnchor, "CENTER", 0, 0) AutoButton:SetTemplate("Default") AutoButton:StyleButton(true) AutoButton:RegisterForClicks("AnyUp", "AnyDown") AutoButton:SetAttribute("type1", "item") AutoButton:SetAttribute("type2", "item") AutoButton:SetAttribute("type3", "macro") AutoButtonHide() -- Texture for our button AutoButton.t = AutoButton:CreateTexture(nil, "BORDER") AutoButton.t:SetPoint("TOPLEFT", 2, -2) AutoButton.t:SetPoint("BOTTOMRIGHT", -2, 2) AutoButton.t:SetTexCoord(0.1, 0.9, 0.1, 0.9) -- Count text for our button AutoButton.c = AutoButton:CreateFontString(nil, "OVERLAY") AutoButton.c:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style) AutoButton.c:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0) AutoButton.c:SetPoint("BOTTOMRIGHT", 1, -2) -- Hotkey text for our button AutoButton.k = AutoButton:CreateFontString(nil, "OVERLAY") AutoButton.k:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style) AutoButton.k:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0) AutoButton.k:SetTextColor(0.7, 0.7, 0.7) AutoButton.k:SetPoint("TOPRIGHT", 0, -2) AutoButton.k:SetJustifyH("RIGHT") AutoButton.k:SetWidth(AutoButton:GetWidth() - 1) AutoButton.k:SetWordWrap(false) local frame = CreateFrame("Frame") frame:RegisterEvent("UPDATE_BINDINGS") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function() local bind = GetBindingKey("QUEST_BUTTON") if bind then SetOverrideBinding(AutoButton, false, bind, "CLICK AutoButton:LeftButton") bind = gsub(bind, "(ALT%-)", "A") bind = gsub(bind, "(CTRL%-)", "C") bind = gsub(bind, "(SHIFT%-)", "S") bind = gsub(bind, "(Mouse Button )", "M") bind = gsub(bind, "(Кнопка мыши )", "M") bind = gsub(bind, KEY_BUTTON3, "M3") bind = gsub(bind, KEY_PAGEUP, "PU") bind = gsub(bind, KEY_PAGEDOWN, "PD") bind = gsub(bind, KEY_SPACE, "SpB") bind = gsub(bind, KEY_INSERT, "Ins") bind = gsub(bind, KEY_HOME, "Hm") bind = gsub(bind, KEY_DELETE, "Del") bind = gsub(bind, KEY_NUMPADDECIMAL, "Nu.") bind = gsub(bind, KEY_NUMPADDIVIDE, "Nu/") bind = gsub(bind, KEY_NUMPADMINUS, "Nu-") bind = gsub(bind, KEY_NUMPADMULTIPLY, "Nu*") bind = gsub(bind, KEY_NUMPADPLUS, "Nu+") bind = gsub(bind, KEY_NUMLOCK, "NuL") bind = gsub(bind, KEY_MOUSEWHEELDOWN, "MWD") bind = gsub(bind, KEY_MOUSEWHEELUP, "MWU") end AutoButton.k:SetText(bind or "") end) -- Cooldown AutoButton.cd = CreateFrame("Cooldown", nil, AutoButton, "CooldownFrameTemplate") AutoButton.cd:SetAllPoints(AutoButton.t) AutoButton.cd:SetFrameLevel(1) local function startScanningBags() AutoButtonHide() -- Scan bags for Item matchs for b = 0, NUM_BAG_SLOTS do for s = 1, C_Container.GetContainerNumSlots(b) do local itemID = C_Container.GetContainerItemID(b, s) itemID = tonumber(itemID) if T.ABItems[itemID] and not T.ABItemsIgnore[itemID] then local itemName = GetItemInfo(itemID) local count = GetItemCount(itemID) local itemIcon = GetItemIcon(itemID) -- Set our texture to the item found in bags AutoButton.t:SetTexture(itemIcon) -- Get the count if there is one if count and count > 1 then AutoButton.c:SetText(count) else AutoButton.c:SetText("") end AutoButton:SetScript("OnUpdate", function() local cd_start, cd_finish, cd_enable = C_Container.GetContainerItemCooldown(b, s) CooldownFrame_Set(AutoButton.cd, cd_start, cd_finish, cd_enable) end) AutoButton:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:SetHyperlink(format("item:%s", itemID)) GameTooltip:AddLine(" ") GameTooltip:AddLine(L_MOVE_MIDDLE_CLICK, 0.75, 0.9, 1) GameTooltip:Show() end) AutoButton:SetScript("OnLeave", GameTooltip_Hide) AutoButton.id = itemID AutoButtonShow(itemName) end end end end -- Add all items from quest to our table hooksecurefunc("QuestObjectiveItem_Initialize", function(_, questLogIndex) local link = GetQuestLogSpecialItemInfo(questLogIndex) if link then local _, itemID = strsplit(":", link) itemID = tonumber(itemID) T.ABItems[itemID] = true startScanningBags() end end) local Scanner = CreateFrame("Frame") Scanner:RegisterEvent("BAG_UPDATE") Scanner:RegisterEvent("UNIT_INVENTORY_CHANGED") Scanner:SetScript("OnEvent", function() startScanningBags() end) -- Temp hide quest item by middle-click T.startScanningBags = startScanningBags local macro = "/run local T = unpack(ShestakUI) T.ABItemsIgnore[AutoButton.id] = true T.startScanningBags() C_Timer.After(0.05, function() AutoButton:SetButtonState('NORMAL') end)" AutoButton:SetAttribute("macrotext3", macro) ================================================ FILE: ShestakUI/Modules/Quests/ObjectiveTracker.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Move ObjectiveTrackerFrame and hide background ---------------------------------------------------------------------------------------- local frame = CreateFrame("Frame", "ObjectiveTrackerAnchor", UIParent) frame:SetPoint(unpack(C.position.quest)) frame:SetSize(224, 150) ObjectiveTrackerFrame:ClearAllPoints() ObjectiveTrackerFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 20, 0) ObjectiveTrackerFrame:SetHeight(T.screenHeight / 1.6) ObjectiveTrackerFrame.IsUserPlaced = function() return true end hooksecurefunc(ObjectiveTrackerFrame, "SetPoint", function(_, _, parent) if parent ~= frame then ObjectiveTrackerFrame:ClearAllPoints() ObjectiveTrackerFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 20, -20) end end) local headers = { SCENARIO_CONTENT_TRACKER_MODULE, BONUS_OBJECTIVE_TRACKER_MODULE, UI_WIDGET_TRACKER_MODULE, CAMPAIGN_QUEST_TRACKER_MODULE, QUEST_TRACKER_MODULE, ACHIEVEMENT_TRACKER_MODULE, WORLD_QUEST_TRACKER_MODULE, PROFESSION_RECIPE_TRACKER_MODULE } if T.newPatch then tinsert(headers, MONTHLY_ACTIVITIES_TRACKER_MODULE) end for i = 1, #headers do local header = headers[i].Header if header then header.Background:Hide() end end ObjectiveTrackerFrame.HeaderMenu.Title:SetAlpha(0) ---------------------------------------------------------------------------------------- -- Skin ObjectiveTrackerFrame item buttons ---------------------------------------------------------------------------------------- local function HotkeyShow(self) local item = self:GetParent() if item.rangeOverlay then item.rangeOverlay:Show() end end local function HotkeyHide(self) local item = self:GetParent() if item.rangeOverlay then item.rangeOverlay:Hide() end end local function HotkeyColor(self, r) local item = self:GetParent() if item.rangeOverlay then if r == 1 then item.rangeOverlay:Show() else item.rangeOverlay:Hide() end end end hooksecurefunc("QuestObjectiveSetupBlockButton_Item", function(block) local item = block and block.itemButton if item and not item.skinned then item:SetSize(25, 25) item:SetTemplate("Default") item:StyleButton() item:SetNormalTexture(0) item.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) item.icon:SetPoint("TOPLEFT", item, 2, -2) item.icon:SetPoint("BOTTOMRIGHT", item, -2, 2) item.Cooldown:SetAllPoints(item.icon) item.Count:ClearAllPoints() item.Count:SetPoint("TOPLEFT", 1, -1) item.Count:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style) item.Count:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0) local rangeOverlay = item:CreateTexture(nil, "OVERLAY") rangeOverlay:SetTexture(C.media.texture) rangeOverlay:SetInside() rangeOverlay:SetVertexColor(1, 0.3, 0.1, 0.6) item.rangeOverlay = rangeOverlay hooksecurefunc(item.HotKey, "Show", HotkeyShow) hooksecurefunc(item.HotKey, "Hide", HotkeyHide) hooksecurefunc(item.HotKey, "SetVertexColor", HotkeyColor) HotkeyColor(item.HotKey, item.HotKey:GetTextColor()) item.HotKey:SetAlpha(0) item.skinned = true end end) hooksecurefunc("QuestObjectiveSetupBlockButton_FindGroup", function(block) if block.groupFinderButton and not block.groupFinderButton.styled then local icon = block.groupFinderButton icon:SetSize(26, 26) icon:SetNormalTexture(0) icon:SetHighlightTexture(0) icon:SetPushedTexture(0) icon.b = CreateFrame("Frame", nil, icon) icon.b:SetTemplate("Overlay") icon.b:SetPoint("TOPLEFT", icon, "TOPLEFT", 2, -3) icon.b:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", -4, 3) icon.b:SetFrameLevel(1) icon:HookScript("OnEnter", function(self) if self:IsEnabled() then self.b:SetBackdropBorderColor(unpack(C.media.classborder_color)) if self.b.overlay then self.b.overlay:SetVertexColor(C.media.classborder_color[1] * 0.3, C.media.classborder_color[2] * 0.3, C.media.classborder_color[3] * 0.3, 1) end end end) icon:HookScript("OnLeave", function(self) self.b:SetBackdropBorderColor(unpack(C.media.border_color)) if self.b.overlay then self.b.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) end end) hooksecurefunc(icon, "Show", function(self) self.b:SetFrameLevel(1) end) icon.styled = true end end) -- WorldQuestsList button skin local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_LOGIN") frame:SetScript("OnEvent", function() if not IsAddOnLoaded("WorldQuestsList") then return end local orig = _G.WorldQuestList.ObjectiveTracker_Update_hook local function orig_hook(...) orig(...) for _, b in pairs(WorldQuestList.LFG_objectiveTrackerButtons) do if b and not b.skinned then b:SetSize(20, 20) b.texture:SetAtlas("socialqueuing-icon-eye") b.texture:SetSize(12, 12) b:SetHighlightTexture(0) local point, anchor, point2, x, y = b:GetPoint() if x == -18 then b:SetPoint(point, anchor, point2, -13, y) end b.b = CreateFrame("Frame", nil, b) b.b:SetTemplate("Overlay") b.b:SetPoint("TOPLEFT", b, "TOPLEFT", 0, 0) b.b:SetPoint("BOTTOMRIGHT", b, "BOTTOMRIGHT", 0, 0) b.b:SetFrameLevel(1) b.skinned = true end end end _G.WorldQuestList.ObjectiveTracker_Update_hook = orig_hook end) ---------------------------------------------------------------------------------------- -- Difficulty color for ObjectiveTrackerFrame lines ---------------------------------------------------------------------------------------- hooksecurefunc(QUEST_TRACKER_MODULE, "Update", function() for i = 1, C_QuestLog.GetNumQuestWatches() do local questID = C_QuestLog.GetQuestIDForQuestWatchIndex(i) if not questID then break end local col = GetDifficultyColor(C_PlayerInfo.GetContentDifficultyQuestForPlayer(questID)) local block = QUEST_TRACKER_MODULE:GetExistingBlock(questID) if block then block.HeaderText:SetTextColor(col.r, col.g, col.b) block.HeaderText.col = col end end end) hooksecurefunc(DEFAULT_OBJECTIVE_TRACKER_MODULE, "AddObjective", function(_, block) if block.module == ACHIEVEMENT_TRACKER_MODULE then block.HeaderText:SetTextColor(0.75, 0.61, 0) block.HeaderText.col = nil end end) hooksecurefunc("ObjectiveTrackerBlockHeader_OnLeave", function(self) local block = self:GetParent() if block.HeaderText.col then block.HeaderText:SetTextColor(block.HeaderText.col.r, block.HeaderText.col.g, block.HeaderText.col.b) end end) ---------------------------------------------------------------------------------------- -- Skin ObjectiveTrackerFrame.HeaderMenu.MinimizeButton ---------------------------------------------------------------------------------------- if C.skins.blizzard_frames == true then local button = ObjectiveTrackerFrame.HeaderMenu.MinimizeButton button:SetSize(17, 17) button:StripTextures() button:SetTemplate("Overlay") button.minus = button:CreateTexture(nil, "OVERLAY") button.minus:SetSize(7, 1) button.minus:SetPoint("CENTER") button.minus:SetTexture(C.media.blank) button.plus = button:CreateTexture(nil, "OVERLAY") button.plus:SetSize(1, 7) button.plus:SetPoint("CENTER") button.plus:SetTexture(C.media.blank) button:HookScript("OnEnter", T.SetModifiedBackdrop) button:HookScript("OnLeave", T.SetOriginalBackdrop) button.plus:Hide() hooksecurefunc("ObjectiveTracker_Collapse", function() button.plus:Show() button:SetNormalTexture(0) button:SetPushedTexture(0) if C.general.minimize_mouseover then button:SetAlpha(0) button:HookScript("OnEnter", function() button:SetAlpha(1) end) button:HookScript("OnLeave", function() button:SetAlpha(0) end) end end) hooksecurefunc("ObjectiveTracker_Expand", function() button.plus:Hide() button:SetNormalTexture(0) button:SetPushedTexture(0) if C.general.minimize_mouseover then button:SetAlpha(1) button:HookScript("OnEnter", function() button:SetAlpha(1) end) button:HookScript("OnLeave", function() button:SetAlpha(1) end) end end) local function SkinSmallMinimizeButton(button) button:SetSize(15, 15) button:StripTextures() button:SetTemplate("Overlay") button.minus = button:CreateTexture(nil, "OVERLAY") button.minus:SetSize(5, 1) button.minus:SetPoint("CENTER") button.minus:SetTexture(C.media.blank) button.plus = button:CreateTexture(nil, "OVERLAY") button.plus:SetSize(1, 5) button.plus:SetPoint("CENTER") button.plus:SetTexture(C.media.blank) button:HookScript("OnEnter", T.SetModifiedBackdrop) button:HookScript("OnLeave", T.SetOriginalBackdrop) button.plus:Hide() hooksecurefunc(button, "SetCollapsed", function(self, collapsed) if collapsed then button.plus:Show() else button.plus:Hide() end button:SetNormalTexture(0) button:SetPushedTexture(0) end) end for i = 1, #headers do local button = headers[i].Header.MinimizeButton if button then SkinSmallMinimizeButton(button) end end end ---------------------------------------------------------------------------------------- -- Auto collapse Objective Tracker ---------------------------------------------------------------------------------------- if C.automation.auto_collapse ~= "NONE" then local collapse = CreateFrame("Frame") collapse:RegisterEvent("PLAYER_ENTERING_WORLD") collapse:SetScript("OnEvent", function() if C.automation.auto_collapse == "RAID" then if IsInInstance() then ObjectiveTracker_Collapse() elseif ObjectiveTrackerFrame.collapsed and not InCombatLockdown() then ObjectiveTracker_Expand() end elseif C.automation.auto_collapse == "SCENARIO" then local inInstance, instanceType = IsInInstance() if inInstance then if instanceType == "party" or instanceType == "scenario" then C_Timer.After(0.1, function() -- for some reason it got error after reload in instance for i = 3, #headers do local button = headers[i].Header.MinimizeButton if button and not headers[i].collapsed then button:Click() end end end) else ObjectiveTracker_Collapse() end else if not InCombatLockdown() then for i = 3, #headers do local button = headers[i].Header.MinimizeButton if button and headers[i].collapsed then button:Click() end end if ObjectiveTrackerFrame.collapsed then ObjectiveTracker_Expand() end end end elseif C.automation.auto_collapse == "RELOAD" then ObjectiveTracker_Collapse() end end) end ---------------------------------------------------------------------------------------- -- Skin simple quest objective progress bar ---------------------------------------------------------------------------------------- local function SkinBar(_, _, line) local progressBar = line.ProgressBar local bar = progressBar.Bar local label = bar.Label if not progressBar.styled then if bar.BorderLeft then bar.BorderLeft:SetAlpha(0) end if bar.BorderRight then bar.BorderRight:SetAlpha(0) end if bar.BorderMid then bar.BorderMid:SetAlpha(0) end bar:SetSize(200, 16) bar:SetStatusBarTexture(C.media.texture) bar:CreateBackdrop("Transparent") label:ClearAllPoints() label:SetPoint("CENTER", 0, -1) label:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) label:SetDrawLayer("OVERLAY") progressBar.styled = true end end hooksecurefunc(QUEST_TRACKER_MODULE, "AddProgressBar", SkinBar) hooksecurefunc(CAMPAIGN_QUEST_TRACKER_MODULE, "AddProgressBar", SkinBar) hooksecurefunc(SCENARIO_TRACKER_MODULE, "AddProgressBar", SkinBar) ---------------------------------------------------------------------------------------- -- Skin quest objective progress bar with icon ---------------------------------------------------------------------------------------- local function SkinBarIcon(_, _, line) local progressBar = line.ProgressBar local bar = progressBar.Bar local label = bar.Label local icon = bar.Icon if not progressBar.styled then bar.BarFrame:Hide() bar.BarGlow:Kill() bar.Sheen:Hide() bar.IconBG:Kill() bar:SetSize(200, 16) bar:SetStatusBarTexture(C.media.texture) bar:CreateBackdrop("Transparent") label:ClearAllPoints() label:SetPoint("CENTER", 0, -1) label:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) icon:SetPoint("RIGHT", 26, 0) icon:SetSize(20, 20) icon:SetMask("") local border = CreateFrame("Frame", "$parentBorder", bar) border:SetAllPoints(icon) border:SetTemplate("Transparent") border:SetBackdropColor(0, 0, 0, 0) bar.newIconBg = border hooksecurefunc(bar.AnimIn, "Play", function() bar.AnimIn:Stop() end) BonusObjectiveTrackerProgressBar_PlayFlareAnim = T.dummy progressBar.styled = true end bar.newIconBg:SetShown(icon:IsShown()) end hooksecurefunc(BONUS_OBJECTIVE_TRACKER_MODULE, "AddProgressBar", SkinBarIcon) hooksecurefunc(WORLD_QUEST_TRACKER_MODULE, "AddProgressBar", SkinBarIcon) ---------------------------------------------------------------------------------------- -- Skin Timer bar ---------------------------------------------------------------------------------------- local function SkinTimer(_, _, line) local timerBar = line.TimerBar local bar = timerBar.Bar if not timerBar.styled then bar:SetStatusBarTexture(C.media.texture) bar:SetTemplate("Transparent") bar:SetBackdropColor(0, 0, 0, 0) bar:DisableDrawLayer("ARTWORK") timerBar.styled = true end end hooksecurefunc(QUEST_TRACKER_MODULE, "AddTimerBar", SkinTimer) hooksecurefunc(SCENARIO_TRACKER_MODULE, "AddTimerBar", SkinTimer) hooksecurefunc(BONUS_OBJECTIVE_TRACKER_MODULE, "AddTimerBar", SkinTimer) hooksecurefunc(ACHIEVEMENT_TRACKER_MODULE, "AddTimerBar", SkinTimer) ---------------------------------------------------------------------------------------- -- Set tooltip depending on position ---------------------------------------------------------------------------------------- hooksecurefunc("BonusObjectiveTracker_ShowRewardsTooltip", function(block) if T.IsFramePositionedLeft(ObjectiveTrackerFrame) then GameTooltip:ClearAllPoints() GameTooltip:SetPoint("TOPLEFT", block, "TOPRIGHT", 0, 0) end end) ScenarioStageBlock:HookScript("OnEnter", function(self) if T.IsFramePositionedLeft(ObjectiveTrackerFrame) then GameTooltip:ClearAllPoints() GameTooltip:SetPoint("TOPLEFT", self, "TOPRIGHT", 50, -3) end end) ---------------------------------------------------------------------------------------- -- Kill reward animation when finished dungeon or bonus objectives ---------------------------------------------------------------------------------------- ObjectiveTrackerScenarioRewardsFrame.Show = T.dummy hooksecurefunc("BonusObjectiveTracker_AnimateReward", function() ObjectiveTrackerBonusRewardsFrame:ClearAllPoints() ObjectiveTrackerBonusRewardsFrame:SetPoint("BOTTOM", UIParent, "TOP", 0, 90) end) ---------------------------------------------------------------------------------------- -- Skin ScenarioStageBlock ---------------------------------------------------------------------------------------- local StageBlock = _G["ScenarioStageBlock"] StageBlock:CreateBackdrop("Overlay") StageBlock.backdrop:SetPoint("TOPLEFT", ScenarioStageBlock.NormalBG, 3, -3) StageBlock.backdrop:SetPoint("BOTTOMRIGHT", ScenarioStageBlock.NormalBG, -6, 5) StageBlock.NormalBG:SetAlpha(0) StageBlock.FinalBG:SetAlpha(0) StageBlock.GlowTexture:SetTexture("") ---------------------------------------------------------------------------------------- -- Skin ScenarioStageBlock ---------------------------------------------------------------------------------------- local ChallengeBlock = _G["ScenarioChallengeModeBlock"] ChallengeBlock:CreateBackdrop("Overlay") ChallengeBlock.backdrop:SetPoint("TOPLEFT", ChallengeBlock, 3, -3) ChallengeBlock.backdrop:SetPoint("BOTTOMRIGHT", ChallengeBlock, -6, 3) ChallengeBlock.backdrop.overlay:SetVertexColor(0.12, 0.12, 0.12, 1) local bg = select(3, ChallengeBlock:GetRegions()) bg:SetAlpha(0) ChallengeBlock.TimerBGBack:SetAlpha(0) ChallengeBlock.TimerBG:SetAlpha(0) ChallengeBlock.StatusBar:SetStatusBarTexture(C.media.texture) ChallengeBlock.StatusBar:CreateBackdrop("Overlay") ChallengeBlock.StatusBar.backdrop:SetFrameLevel(ChallengeBlock.backdrop:GetFrameLevel() + 1) ChallengeBlock.StatusBar:SetStatusBarColor(0, 0.6, 1) ChallengeBlock.StatusBar:SetFrameLevel(ChallengeBlock.StatusBar:GetFrameLevel() + 3) ---------------------------------------------------------------------------------------- -- Skin MawBuffsBlock ---------------------------------------------------------------------------------------- TopScenarioWidgetContainerBlock.WidgetContainer:ClearAllPoints() TopScenarioWidgetContainerBlock.WidgetContainer:SetPoint("TOP", ScenarioStageBlock.backdrop, "BOTTOM", 0, -3) local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function() C_Timer.After(0.1, function() local list = ScenarioBlocksFrame.MawBuffsBlock.Container.List if list then list:ClearAllPoints() if T.IsFramePositionedLeft(ObjectiveTrackerFrame) then list:SetPoint("TOPLEFT", ScenarioBlocksFrame.MawBuffsBlock.Container, "TOPRIGHT", 15, 0) else list:SetPoint("TOPRIGHT", ScenarioBlocksFrame.MawBuffsBlock.Container, "TOPLEFT", -15, 0) end end ObjectiveTracker_Update() -- Fixed position of MinimizeButton if frame on right side -- TODO check -- BottomScenarioWidgetContainerBlock.WidgetContainer:ClearAllPoints() -- BottomScenarioWidgetContainerBlock.WidgetContainer:SetPoint("TOPLEFT", ScenarioStageBlock.backdrop, "TOPRIGHT", 10, 0) end) end) local Maw = ScenarioBlocksFrame.MawBuffsBlock.Container Maw:SkinButton() Maw:ClearAllPoints() Maw:SetPoint("TOPLEFT", ScenarioStageBlock.backdrop, "BOTTOMLEFT", 0, -35) Maw.List.button:SetSize(234, 30) Maw.List:StripTextures() Maw.List:SetTemplate("Overlay") Maw.List:HookScript("OnShow", function(self) self.button:SetPushedTexture(0) self.button:SetHighlightTexture(0) self.button:SetWidth(234) self.button:SetButtonState("NORMAL") self.button:SetPushedTextOffset(0, 0) self.button:SetButtonState("PUSHED", true) end) Maw.List:HookScript("OnHide", function(self) self.button:SetPushedTexture(0) self.button:SetHighlightTexture(0) self.button:SetWidth(234) end) ---------------------------------------------------------------------------------------- -- Ctrl+Click to abandon a quest or Alt+Click to share a quest(by Suicidal Katt) ---------------------------------------------------------------------------------------- hooksecurefunc("QuestMapLogTitleButton_OnClick", function(self) if IsControlKeyDown() then CloseDropDownMenus() QuestMapQuestOptions_AbandonQuest(self.questID) elseif IsAltKeyDown() and C_QuestLog.IsPushableQuest(self.questID) then CloseDropDownMenus() QuestMapQuestOptions_ShareQuest(self.questID) end end) hooksecurefunc(QUEST_TRACKER_MODULE, "OnBlockHeaderClick", function(_, block) if IsControlKeyDown() then CloseDropDownMenus() QuestMapQuestOptions_AbandonQuest(block.id) elseif IsAltKeyDown() and C_QuestLog.IsPushableQuest(block.id) then CloseDropDownMenus() QuestMapQuestOptions_ShareQuest(block.id) end end) ================================================ FILE: ShestakUI/Modules/Quests/WowheadLink.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Add quest/achievement wowhead link ---------------------------------------------------------------------------------------- local linkQuest, linkAchievement if T.client == "ruRU" then linkQuest = "http://ru.wowhead.com/quest=%d" linkAchievement = "http://ru.wowhead.com/achievement=%d" elseif T.client == "frFR" then linkQuest = "http://fr.wowhead.com/quest=%d" linkAchievement = "http://fr.wowhead.com/achievement=%d" elseif T.client == "deDE" then linkQuest = "http://de.wowhead.com/quest=%d" linkAchievement = "http://de.wowhead.com/achievement=%d" elseif T.client == "esES" or T.client == "esMX" then linkQuest = "http://es.wowhead.com/quest=%d" linkAchievement = "http://es.wowhead.com/achievement=%d" elseif T.client == "ptBR" or T.client == "ptPT" then linkQuest = "http://pt.wowhead.com/quest=%d" linkAchievement = "http://pt.wowhead.com/achievement=%d" elseif T.client == "itIT" then linkQuest = "http://it.wowhead.com/quest=%d" linkAchievement = "http://it.wowhead.com/achievement=%d" elseif T.client == "koKR" then linkQuest = "http://ko.wowhead.com/quest=%d" linkAchievement = "http://ko.wowhead.com/achievement=%d" elseif T.client == "zhTW" or T.client == "zhCN" then linkQuest = "http://cn.wowhead.com/quest=%d" linkAchievement = "http://cn.wowhead.com/achievement=%d" else linkQuest = "http://www.wowhead.com/quest=%d" linkAchievement = "http://www.wowhead.com/achievement=%d" end local selfText StaticPopupDialogs.WATCHFRAME_URL = { text = L_WATCH_WOWHEAD_LINK, button1 = OKAY, timeout = 0, whileDead = true, hasEditBox = true, editBoxWidth = 350, OnShow = function(self, text) self.editBox:SetMaxLetters(0) self.editBox:SetText(text) self.editBox:HighlightText() selfText = text end, EditBoxOnEnterPressed = function(self) self:GetParent():Hide() end, EditBoxOnEscapePressed = function(self) self:GetParent():Hide() end, EditBoxOnTextChanged = function(self) if self:GetText():len() < 1 then self:GetParent():Hide() else self:SetText(selfText) self:HighlightText() end end, preferredIndex = 5, } hooksecurefunc("QuestObjectiveTracker_OnOpenDropDown", function(self) local id = self.activeFrame.id local info = UIDropDownMenu_CreateInfo() info.text = L_WATCH_WOWHEAD_LINK info.func = function() local text = linkQuest:format(id) StaticPopup_Show("WATCHFRAME_URL", _, _, text) end info.notCheckable = true UIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL) end) hooksecurefunc("BonusObjectiveTracker_OnOpenDropDown", function(self) local id = self.activeFrame.TrackedQuest.questID local info = UIDropDownMenu_CreateInfo() info.text = L_WATCH_WOWHEAD_LINK info.func = function() local text = linkQuest:format(id) StaticPopup_Show("WATCHFRAME_URL", _, _, text) end info.notCheckable = true UIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL) end) hooksecurefunc("AchievementObjectiveTracker_OnOpenDropDown", function(self) local id = self.activeFrame.id local info = UIDropDownMenu_CreateInfo() info.text = L_WATCH_WOWHEAD_LINK info.func = function() local text = linkAchievement:format(id) StaticPopup_Show("WATCHFRAME_URL", _, _, text) end info.notCheckable = true UIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL) end) local frame = CreateFrame("Frame") frame:RegisterEvent("ADDON_LOADED") frame:SetScript("OnEvent", function(_, _, addon) if addon == "Blizzard_AchievementUI" then hooksecurefunc(AchievementTemplateMixin, "OnClick", function(self) local elementData = self:GetElementData() if elementData and elementData.id and IsControlKeyDown() then local text = linkAchievement:format(elementData.id) StaticPopup_Show("WATCHFRAME_URL", _, _, text) end end) end end) ================================================ FILE: ShestakUI/Modules/Skins/Ace3.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true or C.skins.ace3 ~= true then return end ---------------------------------------------------------------------------------------- -- Ace3 options skin ---------------------------------------------------------------------------------------- local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI then return end local oldRegisterAsWidget = AceGUI.RegisterAsWidget AceGUI.RegisterAsWidget = function(self, widget) local TYPE = widget.type if TYPE == "CheckBox" then widget.highlight:Kill() if not widget.skinnedCheckBG then widget.skinnedCheckBG = CreateFrame("Frame", nil, widget.frame) widget.skinnedCheckBG:SetTemplate("Overlay") widget.skinnedCheckBG:SetPoint("TOPLEFT", widget.checkbg, "TOPLEFT", 4, -4) widget.skinnedCheckBG:SetPoint("BOTTOMRIGHT", widget.checkbg, "BOTTOMRIGHT", -4, 4) end if widget.skinnedCheckBG.oborder then widget.check:SetParent(widget.skinnedCheckBG.oborder) else widget.check:SetParent(widget.skinnedCheckBG) end elseif TYPE == "Dropdown" then local frame = widget.dropdown local button = widget.button local text = widget.text frame:StripTextures() button:ClearAllPoints() button:SetPoint("RIGHT", frame, "RIGHT", -20, 0) T.SkinNextPrevButton(button) if not frame.backdrop then frame:CreateBackdrop("Overlay") frame.backdrop:SetPoint("TOPLEFT", 20, -2) frame.backdrop:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", 2, -2) frame.backdrop:SetClipsChildren(true) end button:SetParent(frame.backdrop) text:SetParent(frame.backdrop) button:HookScript("OnClick", function(this) local self = this.obj self.pullout.frame:SetTemplate("Transparent") end) elseif TYPE == "LSM30_Font" or TYPE == "LSM30_Sound" or TYPE == "LSM30_Border" or TYPE == "LSM30_Background" or TYPE == "LSM30_Statusbar" then local frame = widget.frame local button = frame.dropButton local text = frame.text frame:StripTextures() T.SkinNextPrevButton(button) frame.text:ClearAllPoints() frame.text:SetPoint("RIGHT", button, "LEFT", -2, 0) button:ClearAllPoints() button:SetPoint("RIGHT", frame, "RIGHT", -10, -6) if not frame.backdrop then frame:CreateBackdrop("Overlay") if TYPE == "LSM30_Font" then frame.backdrop:SetPoint("TOPLEFT", 20, -17) elseif TYPE == "LSM30_Sound" then frame.backdrop:SetPoint("TOPLEFT", 20, -17) widget.soundbutton:SetParent(frame.backdrop) widget.soundbutton:ClearAllPoints() widget.soundbutton:SetPoint("LEFT", frame.backdrop, "LEFT", 2, 0) elseif TYPE == "LSM30_Statusbar" then frame.backdrop:SetPoint("TOPLEFT", 20, -17) widget.bar:ClearAllPoints() widget.bar:SetPoint("TOPLEFT", frame.backdrop, "TOPLEFT", 2, -2) widget.bar:SetPoint("BOTTOMRIGHT", frame.backdrop, "BOTTOMRIGHT", -2, 2) widget.bar:SetParent(frame.backdrop) elseif TYPE == "LSM30_Border" or TYPE == "LSM30_Background" then frame.backdrop:SetPoint("TOPLEFT", 42, -16) end frame.backdrop:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", 2, -2) end button:SetParent(frame.backdrop) text:SetParent(frame.backdrop) button:HookScript("OnClick", function(this) local self = this.obj if self.dropdown then self.dropdown:SetTemplate("Transparent") end end) elseif TYPE == "EditBox" then local frame = widget.editbox local button = widget.button frame.Left:Kill() frame.Middle:Kill() frame.Right:Kill() frame:SetHeight(17) frame:CreateBackdrop("Overlay") frame.backdrop:SetPoint("TOPLEFT", -2, 0) frame.backdrop:SetPoint("BOTTOMRIGHT", 2, 0) frame.backdrop:SetParent(widget.frame) frame:SetParent(frame.backdrop) button:SkinButton() elseif TYPE == "Button" then local frame = widget.frame frame:StripTextures(true) frame:CreateBackdrop("Overlay") frame.backdrop:SetPoint("TOPLEFT", 2, -2) frame.backdrop:SetPoint("BOTTOMRIGHT", -2, 1) widget.text:SetParent(frame.backdrop) frame:HookScript("OnEnter", function() frame.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color)) if frame.backdrop.overlay then frame.backdrop.overlay:SetVertexColor(C.media.classborder_color[1], C.media.classborder_color[2], C.media.classborder_color[3], 0.3) end end) frame:HookScript("OnLeave", function() frame.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) if frame.backdrop.overlay then frame.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) end end) elseif TYPE == "Slider" then local frame = widget.slider local editbox = widget.editbox local lowtext = widget.lowtext local hightext = widget.hightext local HEIGHT = 12 frame:StripTextures() frame:SetTemplate("Overlay") frame:SetHeight(HEIGHT) frame:SetThumbTexture(C.media.blank) frame:GetThumbTexture():SetVertexColor(unpack(C.media.border_color)) frame:GetThumbTexture():SetSize(HEIGHT - 2, HEIGHT - 4) editbox:SetTemplate("Overlay") editbox:SetHeight(15) editbox:SetPoint("TOP", frame, "BOTTOM", 0, -1) lowtext:SetPoint("TOPLEFT", frame, "BOTTOMLEFT", 2, -2) hightext:SetPoint("TOPRIGHT", frame, "BOTTOMRIGHT", -2, -2) elseif TYPE == "Keybinding" then local button = widget.button local msgframe = widget.msgframe button:SkinButton() msgframe:StripTextures() msgframe:SetTemplate("Transparent") msgframe.msg:ClearAllPoints() msgframe.msg:SetPoint("CENTER") elseif TYPE == "ColorPicker" then local frame = widget.frame local colorSwatch = widget.colorSwatch frame:CreateBackdrop() if frame.backdrop then frame.backdrop:SetSize(25, 20) frame.backdrop:ClearAllPoints() frame.backdrop:SetPoint("LEFT", frame, "LEFT", 4, 0) end colorSwatch:SetTexture(C.media.blank) colorSwatch:ClearAllPoints() colorSwatch:SetParent(frame.backdrop) colorSwatch:SetInside(frame.backdrop) if colorSwatch.background then colorSwatch.background:SetColorTexture(0, 0, 0, 0) end if colorSwatch.checkers then colorSwatch.checkers:ClearAllPoints() colorSwatch.checkers:SetParent(frame.backdrop) colorSwatch.checkers:SetInside(frame.backdrop) end elseif TYPE == "Icon" then widget.frame:StripTextures() elseif TYPE == "Dropdown-Pullout" then local pullout = widget pullout.frame:SetTemplate("Transparent") end return oldRegisterAsWidget(self, widget) end local oldRegisterAsContainer = AceGUI.RegisterAsContainer AceGUI.RegisterAsContainer = function(self, widget) local TYPE = widget.type if TYPE == "ScrollFrame" then local frame = widget.scrollbar T.SkinScrollBar(frame) elseif TYPE == "InlineGroup" or TYPE == "TreeGroup" or TYPE == "TabGroup" or TYPE == "Frame" or TYPE == "DropdownGroup" or TYPE == "Window" then local frame = widget.content:GetParent() if TYPE == "Frame" then frame:StripTextures() for i = 1, frame:GetNumChildren() do local child = select(i, frame:GetChildren()) if child:IsObjectType("Button") and child:GetText() then child:SkinButton() else child:StripTextures() end end elseif TYPE == "Window" then frame:StripTextures() T.SkinCloseButton(frame.obj.closebutton) end if TYPE == "Frame" then frame:SetTemplate("Transparent") else frame:SetTemplate("Overlay") end if widget.treeframe then widget.treeframe:SetTemplate("Overlay") frame:SetPoint("TOPLEFT", widget.treeframe, "TOPRIGHT", 1, 0) end if TYPE == "TabGroup" then local oldCreateTab = widget.CreateTab widget.CreateTab = function(self, id) local tab = oldCreateTab(self, id) tab:StripTextures() tab.backdrop = CreateFrame("Frame", nil, tab) tab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1) tab.backdrop:SetTemplate("Overlay") tab.backdrop:SetPoint("TOPLEFT", 10, -3) tab.backdrop:SetPoint("BOTTOMRIGHT", -10, 3) tab.text:SetPoint("LEFT", 14, 0) return tab end end if widget.scrollbar then T.SkinScrollBar(widget.scrollbar) end end return oldRegisterAsContainer(self, widget) end ================================================ FILE: ShestakUI/Modules/Skins/AtlasLoot.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.atlasloot ~= true then return end ---------------------------------------------------------------------------------------- -- AtlasLoot skin(by Max41479) ---------------------------------------------------------------------------------------- local function SkinDropDown(Frame) _G[Frame]:StripTextures() _G[Frame]:SetTemplate("Transparent", "Shadow") T.SkinNextPrevButton(_G[Frame..'-button']) local a, b, c, d = _G[Frame..'-button']:GetPoint() _G[Frame..'-button']:SetPoint(a, b, c, d - 4, 0) _G[Frame]:HookScript('OnUpdate', function() for i = 1, 3 do local CatFrame = _G['AtlasLoot-DropDown-CatFrame'..i] if CatFrame and not CatFrame.IsSkinned then local r, g, b = CatFrame:GetBackdropColor() CatFrame:StripTextures() CatFrame:SetTemplate("Transparent", "Shadow") CatFrame:SetBackdropColor(r, g, b) CatFrame:HookScript('OnShow', function(self) local a, f, c, d, e = self:GetPoint() self:SetPoint(a, f, c, d, e - 3) end) CatFrame:GetScript('OnShow')(CatFrame) CatFrame.IsSkinned = true end local DropdownTitle = _G[Frame..'-title'] DropdownTitle:ClearAllPoints() DropdownTitle:SetPoint("BOTTOMLEFT", _G[Frame], "TOPLEFT", 0, 3) end end) end local frame = CreateFrame("Frame") frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function(self) self:UnregisterEvent("PLAYER_ENTERING_WORLD") if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") then return end if not IsAddOnLoaded("AtlasLoot") then return end local AtlasLootFrame = _G["AtlasLoot_GUI-Frame"] local AtlasLootItemFrame = _G["AtlasLoot_GUI-ItemFrame"] AtlasLootFrame:SetScript("OnUpdate", AL_OnShow) AtlasLootItemFrame:CreateBackdrop("Transparent", "Shadow") AtlasLootItemFrame.clasFilterButton:CreateBackdrop("Default") local StripAllTextures = { AtlasLootFrame, AtlasLootFrame.titleFrame, AtlasLootItemFrame.itemsButton, AtlasLootItemFrame.modelButton, _G["AtlasLoot-Select-1"], _G["AtlasLoot-Select-2"], _G["AtlasLoot-Select-3"], } local SetTemplate = { AtlasLootFrame, _G["AtlasLoot-Select-1"], _G["AtlasLoot-Select-2"], _G["AtlasLoot-Select-3"], } local buttons = { AtlasLootItemFrame.itemsButton, AtlasLootItemFrame.modelButton, } for _, object in pairs(StripAllTextures) do object:StripTextures() end for k, object in pairs(SetTemplate) do if k < 4 then object:SetTemplate("Transparent", "Shadow") else object:SetTemplate("Transparent") end end for _, button in pairs(buttons) do button:SkinButton() end SkinDropDown('AtlasLoot-DropDown-1') SkinDropDown('AtlasLoot-DropDown-2') T.SkinCloseButton(AtlasLootFrame.CloseButton) T.SkinNextPrevButton(AtlasLootItemFrame.nextPageButton) T.SkinNextPrevButton(AtlasLootItemFrame.prevPageButton) AtlasLootItemFrame.prevPageButton:ClearAllPoints() AtlasLootItemFrame.prevPageButton:SetPoint("BOTTOMLEFT", AtlasLootItemFrame, "BOTTOMLEFT", 3, 3) AtlasLootItemFrame.nextPageButton:ClearAllPoints() AtlasLootItemFrame.nextPageButton:SetPoint("BOTTOMRIGHT", AtlasLootItemFrame, "BOTTOMRIGHT", -3, 3) end) ================================================ FILE: ShestakUI/Modules/Skins/Aurora.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Skin some ShestakUI frames if loaded Aurora ---------------------------------------------------------------------------------------- local AuroraSkin = CreateFrame("Frame") AuroraSkin:RegisterEvent("PLAYER_LOGIN") AuroraSkin:SetScript("OnEvent", function() if not IsAddOnLoaded("Aurora") then return end local F = unpack(Aurora) local buttons = { "GameMenuButtonSettingsUI", "BaudErrorFrameClearButton", "BaudErrorFrameCloseButton", "RaidUtilityConvertButton", "RaidUtilityMainTankButton", "RaidUtilityMainAssistButton", "RaidUtilityRoleButton", "RaidUtilityReadyCheckButton", "RaidUtilityShowButton", "RaidUtilityCloseButton", "RaidUtilityDisbandButton", "RaidUtilityRaidControlButton", "CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton" } for i = 1, getn(buttons) do local button = _G[buttons[i]] if button then F.Reskin(button) end end local frames = { "BaudErrorFrame" } for i = 1, getn(frames) do local frame = _G[frames[i]] if frame then F.CreateBD(frame) end end local bd = { "BaudErrorFrameListScrollBox", "BaudErrorFrameDetailScrollBox" } for i = 1, getn(bd) do local frame = _G[bd[i]] if frame then F.CreateBD(frame) end end if IsAddOnLoaded("!BaudErrorFrame") then F.ReskinScroll(_G["BaudErrorFrameListScrollBoxScrollBarScrollBar"]) F.ReskinScroll(_G["BaudErrorFrameDetailScrollFrameScrollBar"]) end end) ================================================ FILE: ShestakUI/Modules/Skins/BigWigs.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.bigwigs ~= true then return end ---------------------------------------------------------------------------------------- -- BigWigs skin(by Affli) ---------------------------------------------------------------------------------------- -- Init some tables to store backgrounds local freebg = {} -- Styling functions local createbg = function() local bg = CreateFrame("Frame") bg:SetTemplate("Default") return bg end local function freestyle(bar) -- Reparent and hide bar background local bg = bar:Get("bigwigs:shestakui:bg") if bg then bg:ClearAllPoints() bg:SetParent(UIParent) bg:Hide() freebg[#freebg + 1] = bg end -- Reparent and hide icon background local ibg = bar:Get("bigwigs:shestakui:ibg") if ibg then ibg:ClearAllPoints() ibg:SetParent(UIParent) ibg:Hide() freebg[#freebg + 1] = ibg end -- Replace dummies with original method functions bar.candyBarBar.SetPoint = bar.candyBarBar.OldSetPoint bar.candyBarIconFrame.SetWidth = bar.candyBarIconFrame.OldSetWidth bar.SetScale = bar.OldSetScale -- Reset Positions -- Icon bar.candyBarIconFrame:ClearAllPoints() bar.candyBarIconFrame:SetPoint("TOPLEFT") bar.candyBarIconFrame:SetPoint("BOTTOMLEFT") bar.candyBarIconFrame:SetTexCoord(0.1, 0.9, 0.1, 0.9) -- Status Bar bar.candyBarBar:ClearAllPoints() bar.candyBarBar:SetPoint("TOPRIGHT") bar.candyBarBar:SetPoint("BOTTOMRIGHT") -- BG bar.candyBarBackground:SetAllPoints() -- Duration bar.candyBarDuration:ClearAllPoints() bar.candyBarDuration:SetPoint("RIGHT", bar.candyBarBar, "RIGHT", -2, 0) -- Name bar.candyBarLabel:ClearAllPoints() bar.candyBarLabel:SetPoint("LEFT", bar.candyBarBar, "LEFT", 2, 0) bar.candyBarLabel:SetPoint("RIGHT", bar.candyBarBar, "RIGHT", -2, 0) end local applystyle = function(bar) -- General bar settings bar:SetHeight(15) bar:SetScale(1) bar.OldSetScale = bar.SetScale -- Set currect scale if bars attached to nameplates if not bar.hook then hooksecurefunc(bar, "SetParent", function() bar:SetScale(T.noscalemult) end) bar.hook = true end -- Create or reparent and use bar background local bg = nil if #freebg > 0 then bg = table.remove(freebg) else bg = createbg() end bg:SetParent(bar) bg:ClearAllPoints() bg:SetPoint("TOPLEFT", bar, "TOPLEFT", -2, 2) bg:SetPoint("BOTTOMRIGHT", bar, "BOTTOMRIGHT", 2, -2) bg:SetFrameStrata("BACKGROUND") bg:Show() bar:Set("bigwigs:shestakui:bg", bg) -- Create or reparent and use icon background local ibg = nil if bar.candyBarIconFrame:GetTexture() then if #freebg > 0 then ibg = table.remove(freebg) else ibg = createbg() end ibg:SetParent(bar) ibg:ClearAllPoints() ibg:SetPoint("TOPLEFT", bar.candyBarIconFrame, "TOPLEFT", -2, 2) ibg:SetPoint("BOTTOMRIGHT", bar.candyBarIconFrame, "BOTTOMRIGHT", 2, -2) ibg:SetFrameStrata("BACKGROUND") ibg:Show() bar:Set("bigwigs:shestakui:ibg", ibg) end -- Setup timer and bar name fonts and positions bar.candyBarLabel:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style) bar.candyBarLabel:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0) bar.candyBarLabel:SetJustifyH("LEFT") bar.candyBarLabel:ClearAllPoints() bar.candyBarLabel:SetPoint("TOPLEFT", bar, "TOPLEFT", 2, 0) bar.candyBarLabel:SetPoint("BOTTOMRIGHT", bar, "BOTTOMRIGHT", -14, 0) bar.candyBarDuration:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style) bar.candyBarDuration:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0) bar.candyBarDuration:SetJustifyH("RIGHT") bar.candyBarDuration:ClearAllPoints() bar.candyBarDuration:SetPoint("RIGHT", bar, "RIGHT", 1, 0) -- Setup bar positions and look bar.candyBarBar:ClearAllPoints() bar.candyBarBar:SetAllPoints(bar) bar.candyBarBar.OldSetPoint = bar.candyBarBar.SetPoint bar.candyBarBar.SetPoint = T.dummy bar.candyBarBar:SetStatusBarTexture(C.media.texture) if not bar:Get("bigwigs:emphasized") then bar.candyBarBar:SetStatusBarColor(T.color.r, T.color.g, T.color.b, 1) end bar.candyBarBackground:SetTexture(C.media.texture) -- Setup icon positions and other things bar.candyBarIconFrame:ClearAllPoints() bar.candyBarIconFrame:SetPoint("BOTTOMLEFT", bar, "BOTTOMLEFT", -28, 0) bar.candyBarIconFrame:SetSize(21, 21) bar.candyBarIconFrame.OldSetWidth = bar.candyBarIconFrame.SetWidth bar.candyBarIconFrame.SetWidth = T.dummy bar.candyBarIconFrame:SetTexCoord(0.1, 0.9, 0.1, 0.9) end local function registerStyle(myProfile) if not BigWigs then return end BigWigsAPI:RegisterBarStyle("ShestakUI", { apiVersion = 1, version = 1, GetSpacing = function() return T.Scale(13) end, ApplyStyle = applystyle, BarStopped = freestyle, GetStyleName = function() return "ShestakUI" end, }) if BigWigsLoader and myProfile and myProfile.barStyle == "ShestakUI" then BigWigsLoader.RegisterMessage("BigWigs_Plugins", "BigWigs_FrameCreated", function() BigWigsProximityAnchor:SetTemplate("Transparent") BigWigsInfoBox:SetTemplate("Transparent") end) BigWigsLoader.RegisterMessage("BigWigs_Plugins", "BigWigs_BarEmphasized", function(_, _, bar) local module = bar:Get("bigwigs:module") local key = bar:Get("bigwigs:option") local colors = BigWigs:GetPlugin("Colors") bar.candyBarBar:SetStatusBarColor(colors:GetColor("barEmphasized", module, key)) end) end end local f = CreateFrame("Frame") f:RegisterEvent("ADDON_LOADED") f:SetScript("OnEvent", function(_, event, addon) if event == "ADDON_LOADED" then if addon == "BigWigs_Plugins" then local myProfile if BigWigs3DB then if BigWigs3DB.profileKeys and BigWigs3DB.namespaces and BigWigs3DB.namespaces.BigWigs_Plugins_Bars and BigWigs3DB.namespaces.BigWigs_Plugins_Bars.profiles then myProfile = BigWigs3DB.namespaces.BigWigs_Plugins_Bars.profiles[BigWigs3DB.profileKeys[UnitName("player").." - "..GetRealmName()]] end if not myProfile or myProfile.InstalledBars ~= C.actionbar.bottombars then StaticPopup_Show("SETTINGS_BIGWIGS") end end registerStyle(myProfile) f:UnregisterEvent("ADDON_LOADED") elseif addon == "ShestakUI" then if BigWigsLoader then BigWigsLoader.RegisterMessage(addon, "BigWigs_FrameCreated", function(_, frame, name) if name == "AltPower" then frame:SetTemplate("Transparent") end if name == "QueueTimer" and C.skins.blizzard_frames then frame:SetSize(240, 15) frame:StripTextures() frame:SetStatusBarTexture(C.media.texture) frame:CreateBackdrop("Overlay") end end) end end end end) function T.UploadBW() if not BigWigs then return end local bars = BigWigs:GetPlugin("Bars", true) if bars then bars.db.profile.barStyle = "ShestakUI" bars.db.profile.fontName = C.font.stylization_font bars.db.profile.BigWigsAnchor_width = 185 bars.db.profile.BigWigsAnchor_x = 188 / UIParent:GetEffectiveScale() bars.db.profile.BigWigsEmphasizeAnchor_width = 184 bars.db.profile.BigWigsEmphasizeAnchor_x = 620 bars.db.profile.emphasizeGrowup = true bars.db.profile.InstalledBars = C.actionbar.bottombars if C.actionbar.bottombars == 1 then bars.db.profile.BigWigsAnchor_y = 185 * UIParent:GetEffectiveScale() bars.db.profile.BigWigsEmphasizeAnchor_y = 344 * UIParent:GetEffectiveScale() elseif C.actionbar.bottombars == 2 then bars.db.profile.BigWigsAnchor_y = 213 * UIParent:GetEffectiveScale() bars.db.profile.BigWigsEmphasizeAnchor_y = 372 * UIParent:GetEffectiveScale() elseif C.actionbar.bottombars == 3 then bars.db.profile.BigWigsAnchor_y = 241 * UIParent:GetEffectiveScale() bars.db.profile.BigWigsEmphasizeAnchor_y = 400 * UIParent:GetEffectiveScale() end end local mess = BigWigs:GetPlugin("Messages") if mess then mess.db.profile.fontName = "Calibri" mess.db.profile.fontSize = 20 mess.db.profile.emphFontName = "Calibri" mess.db.profile.BWMessageAnchor_x = 615 mess.db.profile.BWMessageAnchor_y = 440 mess.db.profile.BWEmphasizeMessageAnchor_x = 618 mess.db.profile.BWEmphasizeMessageAnchor_y = 495 mess.db.profile.BWEmphasizeCountdownMessageAnchor_x = 665 mess.db.profile.BWEmphasizeCountdownMessageAnchor_y = 477 end local prox = BigWigs:GetPlugin("Proximity") if prox then prox.db.profile.fontName = "Calibri" prox.db.profile.objects.ability = false end BigWigs:GetPlugin("AltPower").db.profile.fontName = "Calibri" BigWigsIconDB.hide = true if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") print("|cffffff00Reload your UI to apply skin.|r") else ReloadUI() end end StaticPopupDialogs.SETTINGS_BIGWIGS = { text = L_POPUP_SETTINGS_BW, button1 = ACCEPT, button2 = CANCEL, OnAccept = function() T.UploadBW() end, timeout = 0, whileDead = 1, hideOnEscape = true, preferredIndex = 5, } SlashCmdList.BWTEST = function(msg) if msg == "apply" then SlashCmdList["BigWigs"]() HideUIPanel(InterfaceOptionsFrame) StaticPopup_Show("SETTINGS_BIGWIGS") elseif msg == "test" then SlashCmdList["BigWigs"]() BigWigs:GetPlugin("Proximity").Test(BigWigs:GetPlugin("Proximity")) HideUIPanel(InterfaceOptionsFrame) BigWigs:Test() BigWigs:Test() BigWigs:Test() BigWigs:Test() BigWigs:Test() else print("|cffffff00Type /bwtest apply to apply BigWigs settings.|r") print("|cffffff00Type /bwtest test to launch BigWigs testmode.|r") end end SLASH_BWTEST1 = "/bwtest" SLASH_BWTEST2 = "/ицеуые" ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Achievement.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- AchievementUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frames = { "AchievementFrame", "AchievementFrameCategories", "AchievementFrameSummary", "AchievementFrameSummaryCategoriesHeader", "AchievementFrameSummaryAchievementsHeader", "AchievementFrameStatsBG", "AchievementFrameAchievements", "AchievementFrameComparison", "AchievementFrameComparisonHeader", } for _, frame in pairs(frames) do _G[frame]:StripTextures(true) end AchievementFrame.Header:StripTextures(true) select(3, _G.AchievementFrameAchievements:GetChildren()):Hide() _G.AchievementFrameSummary:GetChildren():Hide() AchievementFrame:CreateBackdrop("Transparent") AchievementFrame.backdrop:SetPoint("TOPLEFT", 0, 7) AchievementFrame.backdrop:SetPoint("BOTTOMRIGHT") AchievementFrame.Header.Title:ClearAllPoints() AchievementFrame.Header.Title:SetPoint("TOPLEFT", AchievementFrame.backdrop, "TOPLEFT", -22, -8) AchievementFrame.Header.Points:ClearAllPoints() AchievementFrame.Header.Points:SetPoint("LEFT", AchievementFrame.Header.Title, "RIGHT", -2, 0) -- Backdrops AchievementFrameCategories:CreateBackdrop("Overlay") AchievementFrameCategories.backdrop:SetPoint("TOPLEFT", 0, 4) AchievementFrameCategories.backdrop:SetPoint("BOTTOMRIGHT", -2, -3) AchievementFrameSummary:CreateBackdrop("Overlay") AchievementFrameSummary.backdrop:SetPoint("TOPLEFT", -3, 0) AchievementFrameSummary.backdrop:SetPoint("BOTTOMRIGHT", -3, -3) AchievementFrameStats:CreateBackdrop("Overlay") AchievementFrameStats.backdrop:SetPoint("TOPLEFT", 2, 0) AchievementFrameStats.backdrop:SetPoint("BOTTOMRIGHT", -2, -3) AchievementFrameComparison.StatContainer:CreateBackdrop("Overlay") AchievementFrameComparison.StatContainer.backdrop:SetPoint("TOPLEFT", 2, 0) AchievementFrameComparison.StatContainer.backdrop:SetPoint("BOTTOMRIGHT", 1, -3) T.SkinCloseButton(AchievementFrameCloseButton, AchievementFrame.backdrop) T.SkinDropDownBox(AchievementFrameFilterDropDown) AchievementFrameFilterDropDown:ClearAllPoints() AchievementFrameFilterDropDown:SetPoint("TOPLEFT", AchievementFrameAchievements, "TOPLEFT", -19, 24) local frame = CreateFrame("Frame") frame:RegisterEvent("ADDON_LOADED") frame:SetScript("OnEvent", function() if not IsAddOnLoaded("Overachiever") then return end AchievementFrameFilterDropDownButton:SetWidth(17) AchievementFrameFilterDropDown:ClearAllPoints() AchievementFrameFilterDropDown:SetPoint("TOPLEFT", AchievementFrameAchievements, "TOPLEFT", -19, 24) end) T.SkinEditBox(AchievementFrame.SearchBox) AchievementFrame.SearchBox:SetHeight(15) AchievementFrame.SearchBox:ClearAllPoints() AchievementFrame.SearchBox:SetPoint("TOPRIGHT", AchievementFrame, "TOPRIGHT", -51, 0) AchievementFrame.SearchPreviewContainer:StripTextures() AchievementFrame.SearchPreviewContainer:CreateBackdrop("Transparent") AchievementFrame.SearchPreviewContainer.backdrop:SetPoint("TOPLEFT", -2, 2) AchievementFrame.SearchPreviewContainer.backdrop:SetPoint("BOTTOMRIGHT", AchievementFrame.SearchPreviewContainer.ShowAllSearchResults, 2, -2) AchievementFrame.SearchResults:StripTextures() AchievementFrame.SearchResults:SetTemplate("Transparent") T.SkinCloseButton(AchievementFrame.SearchResults.CloseButton) -- ScrollBars T.SkinScrollBar(AchievementFrameCategories.ScrollBar) T.SkinScrollBar(AchievementFrameAchievements.ScrollBar) T.SkinScrollBar(AchievementFrameStats.ScrollBar) T.SkinScrollBar(AchievementFrameComparison.AchievementContainer.ScrollBar) T.SkinScrollBar(AchievementFrameComparison.StatContainer.ScrollBar) T.SkinScrollBar(AchievementFrame.SearchResults.ScrollBar) AchievementFrameCategories.ScrollBar:SetPoint("TOPLEFT", AchievementFrameCategories, "TOPRIGHT", -1, 3) AchievementFrameCategories.ScrollBar:SetPoint("BOTTOMLEFT", AchievementFrameCategories, "BOTTOMRIGHT", -1, -7) -- Tabs for i = 1, 3 do local tab = _G["AchievementFrameTab"..i] if tab then T.SkinTab(tab) tab:SetFrameLevel(tab:GetFrameLevel() + 2) end end local function SkinStatusBar(bar, comparison) bar:StripTextures() bar:SetStatusBarTexture(C.media.texture) bar:SetStatusBarColor(0, 0.7, 0.1) bar:CreateBackdrop("Overlay") if comparison then local title = bar.Title local text = bar.Text if title then title:SetPoint("LEFT", 4, 0) end if text then text:SetPoint("CENTER") end else local title = _G[bar:GetName().."Title"] local label = _G[bar:GetName().."Label"] local text = _G[bar:GetName().."Text"] if title then title:SetPoint("LEFT", 4, 0) end if label then label:SetPoint("LEFT", 4, 0) end if text then text:SetPoint("RIGHT", -4, 0) end end end SkinStatusBar(AchievementFrameSummaryCategoriesStatusBar) SkinStatusBar(AchievementFrameComparison.Summary.Player.StatusBar, true) SkinStatusBar(AchievementFrameComparison.Summary.Friend.StatusBar, true) AchievementFrameComparisonHeader:SetPoint("BOTTOMRIGHT", AchievementFrameComparison, "TOPRIGHT", 39, 26) AchievementFrameComparisonHeader:CreateBackdrop("Transparent") AchievementFrameComparisonHeader.backdrop:SetPoint("TOPLEFT", 20, -20) AchievementFrameComparisonHeader.backdrop:SetPoint("BOTTOMRIGHT", -17, 1) for i = 1, 12 do local frame = _G["AchievementFrameSummaryCategoriesCategory"..i] local button = _G["AchievementFrameSummaryCategoriesCategory"..i.."Button"] local highlight = _G["AchievementFrameSummaryCategoriesCategory"..i.."ButtonHighlight"] SkinStatusBar(frame) button:StripTextures() highlight:StripTextures() frame.Label:SetPoint("LEFT", frame, "LEFT", 4, 0) _G[highlight:GetName().."Middle"]:SetColorTexture(1, 1, 1, 0.3) _G[highlight:GetName().."Middle"]:SetAllPoints(frame) end hooksecurefunc(_G.AchievementFrameCategories.ScrollBox, "Update", function(frame) for _, child in next, { frame.ScrollTarget:GetChildren() } do local button = child.Button if button and not button.IsSkinned then button:StripTextures() button.Background:Hide() button:StyleButton() button.IsSkinned = true end end end) hooksecurefunc(_G.AchievementFrameAchievements.ScrollBox, "Update", function(frame) for _, child in next, { frame.ScrollTarget:GetChildren() } do if not child.isSkinned then child:StripTextures(true) child.Background:SetAlpha(0) child.Highlight:SetAlpha(0) child.Icon.frame:Hide() child.Description:SetTextColor(0.6, 0.6, 0.6) child.Description.SetTextColor = T.dummy child.Description:SetShadowOffset(1, -1) child.Description.SetShadowOffset = T.dummy child:CreateBackdrop("Overlay") child.backdrop:SetPoint("TOPLEFT", 1, -1) child.backdrop:SetPoint("BOTTOMRIGHT", 0, 2) child.Icon.texture:SkinIcon() T.SkinCheckBox(child.Tracked) child.Tracked:SetSize(20, 20) child.Check:SetAlpha(0) child.Tracked:ClearAllPoints() child.Tracked:SetPoint("BOTTOMLEFT", child, "BOTTOMLEFT", 7, 2) child.Tracked.ClearAllPoints = T.dummy child.Tracked.SetPoint = T.dummy hooksecurefunc(child, "UpdatePlusMinusTexture", function (button) if button.DateCompleted:IsShown() then if button.accountWide then button.Label:SetTextColor(0.1, 0.6, 0.8) button.backdrop:SetBackdropBorderColor(ACHIEVEMENT_BLUE_BORDER_COLOR:GetRGB()) else button.Label:SetTextColor(1, 0.82, 0) button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end elseif button.accountWide then button.Label:SetTextColor(0.6, 0.6, 0.6) button.backdrop:SetBackdropBorderColor(ACHIEVEMENT_BLUE_BORDER_COLOR:GetRGB()) else button.Label:SetTextColor(0.6, 0.6, 0.6) button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end) hooksecurefunc(child, "DisplayObjectives", function (frame) local objectives = frame:GetObjectiveFrame() if objectives and objectives.progressBars then for _, bar in next, objectives.progressBars do if not bar.isSkinned then bar:StripTextures() bar:SetStatusBarTexture(C.media.texture) bar:SetStatusBarColor(0, 0.7, 0.1) bar:CreateBackdrop("Overlay") bar.isSkinned = true end end end end) child.isSkinned = true end end end) AchievementFrame:HookScript("OnShow", function() for i = 3, 8 do local tab = _G["AchievementFrameTab"..i] if tab and not tab.isSkinned then T.SkinTab(tab) tab.isSkinned = true end end AchievementFrameTab1:SetPoint("TOPLEFT", AchievementFrame, "BOTTOMLEFT", 17, 2) end) hooksecurefunc("AchievementFrameSummary_UpdateAchievements", function() for i = 1, ACHIEVEMENTUI_MAX_SUMMARY_ACHIEVEMENTS do local frame = _G["AchievementFrameSummaryAchievement"..i] frame:StripTextures() frame.Highlight:SetAlpha(0) frame.Description:SetTextColor(0.6, 0.6, 0.6) frame.Description:SetShadowOffset(1, -1) if not frame.backdrop then frame:CreateBackdrop("Overlay") frame.backdrop:SetPoint("TOPLEFT", 2, -2) frame.backdrop:SetPoint("BOTTOMRIGHT", -2, 2) frame.TitleBar:Hide() frame.Glow:Hide() frame.Icon.frame:Hide() frame.Icon:SetTemplate("Default") frame.Icon:SetHeight(frame.Icon:GetHeight() - 14) frame.Icon:SetWidth(frame.Icon:GetWidth() - 14) frame.Icon:ClearAllPoints() frame.Icon:SetPoint("LEFT", 6, 0) frame.Icon.texture:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon.texture:ClearAllPoints() frame.Icon.texture:SetPoint("TOPLEFT", 2, -2) frame.Icon.texture:SetPoint("BOTTOMRIGHT", -2, 2) end if frame.accountWide then frame.backdrop:SetBackdropBorderColor(ACHIEVEMENT_BLUE_BORDER_COLOR:GetRGB()) else frame.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end end) hooksecurefunc("AchievementObjectives_DisplayCriteria", function(objectivesFrame, id) local numCriteria = GetAchievementNumCriteria(id) local textStrings, metas = 0, 0 for i = 1, numCriteria do local _, criteriaType, completed, _, _, _, _, assetID = GetAchievementCriteriaInfo(id, i) if assetID and criteriaType == _G.CRITERIA_TYPE_ACHIEVEMENT then metas = metas + 1 criteria, object = objectivesFrame:GetMeta(metas), "Label" elseif criteriaType ~= 1 then textStrings = textStrings + 1 criteria, object = objectivesFrame:GetCriteria(textStrings), "Name" end local text = criteria and criteria[object] if text then local r, g, b, x, y if completed then if objectivesFrame.completed then r, g, b, x, y = 1, 1, 1, 0, 0 else r, g, b, x, y = 0, 1, 0, 1, -1 end else r, g, b, x, y = .6, .6, .6, 1, -1 end text:SetTextColor(r, g, b) text:SetShadowOffset(x, y) end end end) -- Comparison local Comparison = _G.AchievementFrameComparison Comparison:StripTextures() select(5, Comparison:GetChildren()):Hide() Comparison.Summary.Player:StripTextures() Comparison.Summary.Friend:StripTextures() local function HandleCompareCategory(button) button:StripTextures() button.Background:Hide() button:CreateBackdrop("Overlay") button.backdrop:SetInside(button, 2, 2) button.TitleBar:Hide() button.Glow:Hide() button.Icon.frame:Hide() button.Icon:SetTemplate("Default") button.Icon:SetHeight(button.Icon:GetHeight() - 14) button.Icon:SetWidth(button.Icon:GetWidth() - 14) button.Icon:ClearAllPoints() button.Icon:SetPoint("LEFT", 6, 0) button.Icon.texture:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.Icon.texture:ClearAllPoints() button.Icon.texture:SetPoint("TOPLEFT", 2, -2) button.Icon.texture:SetPoint("BOTTOMRIGHT", -2, 2) end hooksecurefunc(Comparison.AchievementContainer.ScrollBox, "Update", function(frame) for _, child in next, { frame.ScrollTarget:GetChildren() } do if not child.isSkinned then HandleCompareCategory(child.Player) child.Player.Description:SetTextColor(0.6, 0.6, 0.6) child.Player.Description.SetTextColor = T.dummy HandleCompareCategory(child.Friend) child.isSkinned = true end end end) hooksecurefunc(Comparison.StatContainer.ScrollBox, "Update", function(frame) for _, child in next, { frame.ScrollTarget:GetChildren() } do if not child.isSkinned then child:StyleButton() child.Background:SetColorTexture(1, 1, 1, 0.15) child.Left:Kill() child.Middle:Kill() child.Right:Kill() child.Left2:Kill() child.Middle2:Kill() child.Right2:Kill() child.IsSkinned = true end end end) -- Stats select(4, _G.AchievementFrameStats:GetChildren()):Hide() hooksecurefunc(_G.AchievementFrameStats.ScrollBox, "Update", function(frame) for _, child in next, { frame.ScrollTarget:GetChildren() } do if not child.IsSkinned then child:StyleButton() child.Background:SetColorTexture(1, 1, 1, 0.2) child.Left:Kill() child.Middle:Kill() child.Right:Kill() child.IsSkinned = true end end end) end T.SkinFuncs["Blizzard_AchievementUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/AddonList.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- AddonList skin ---------------------------------------------------------------------------------------- local function LoadSkin() local buttons = { "AddonListEnableAllButton", "AddonListDisableAllButton", "AddonListCancelButton", "AddonListOkayButton" } for _, button in pairs(buttons) do _G[button]:SkinButton() end AddonList:StripTextures() AddonList:SetTemplate("Transparent") AddonList:SetHeight(AddonList:GetHeight() + 3) AddonListInset:StripTextures() AddonListInset:SetTemplate("Overlay") AddonListInset:SetPoint("BOTTOMRIGHT", -6, 29) local function forceSaturation(self, _, force) if force then return end self:SetVertexColor(0.6, 0.6, 0.6) self:SetDesaturated(true, true) end hooksecurefunc(AddonList.ScrollBox, "Update", function(self) for i = 1, self.ScrollTarget:GetNumChildren() do local child = select(i, self.ScrollTarget:GetChildren()) if not child.styled then T.SkinCheckBox(child.Enabled) child.LoadAddonButton:SkinButton() hooksecurefunc(child.Enabled:GetCheckedTexture(), "SetDesaturated", forceSaturation) child.styled = true end end end) T.SkinScrollBar(AddonList.ScrollBar) T.SkinCloseButton(AddonListCloseButton) T.SkinDropDownBox(AddonCharacterDropDown) T.SkinCheckBox(AddonListForceLoad) AddonListForceLoad:SetSize(25, 25) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/AdventureMap.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Adventure Map skin ---------------------------------------------------------------------------------------- local function LoadSkin() AdventureMapQuestChoiceDialog:StripTextures() AdventureMapQuestChoiceDialog:CreateBackdrop("Transparent") AdventureMapQuestChoiceDialog.backdrop:SetFrameStrata("LOW") local function SkinRewards() for reward in pairs(AdventureMapQuestChoiceDialog.rewardPool.activeObjects) do if not reward.isSkinned then reward.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) reward.ItemNameBG:Hide() reward:CreateBackdrop("Default") reward.backdrop:ClearAllPoints() reward.backdrop:SetPoint("TOPLEFT", reward.Icon, -2, 2) reward.backdrop:SetPoint("BOTTOMRIGHT", reward.Icon, 2, -2) reward.isSkinned = true end end end hooksecurefunc(AdventureMapQuestChoiceDialog, "RefreshRewards", SkinRewards) AdventureMapQuestChoiceDialog.Details.Child.TitleHeader:SetTextColor(1, 1, 0) AdventureMapQuestChoiceDialog.Details.Child.DescriptionText:SetTextColor(1, 1, 1) AdventureMapQuestChoiceDialog.Details.Child.ObjectivesHeader:SetTextColor(1, 1, 0) AdventureMapQuestChoiceDialog.Details.Child.ObjectivesText:SetTextColor(1, 1, 1) AdventureMapQuestChoiceDialog.AcceptButton:SkinButton() AdventureMapQuestChoiceDialog.DeclineButton:SkinButton() T.SkinScrollBar(AdventureMapQuestChoiceDialog.Details.ScrollBar) T.SkinCloseButton(AdventureMapQuestChoiceDialog.CloseButton) end T.SkinFuncs["Blizzard_AdventureMap"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/AlertFrames.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- AlertFrames skin ---------------------------------------------------------------------------------------- local function LoadSkin() local function forceAlpha(self, alpha, isForced) if alpha ~= 1 and isForced ~= true then self:SetAlpha(1, true) end end local function SkinAchievementAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", -1, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -2, 6) end -- Background frame.Background:SetTexture(nil) frame.glow:Kill() frame.shine:Kill() frame.GuildBanner:Kill() frame.GuildBorder:Kill() -- Text frame.Unlocked:SetTextColor(1, 1, 1) frame.Name:SetTextColor(1, 0.8, 0) -- Icon frame.Icon.Texture:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon.Overlay:Kill() frame.Icon.Texture:ClearAllPoints() frame.Icon.Texture:SetPoint("LEFT", frame, 8, 0) -- Icon border if not frame.Icon.Texture.b then frame.Icon.Texture.b = CreateFrame("Frame", nil, frame) frame.Icon.Texture.b:SetTemplate("Default") frame.Icon.Texture.b:SetPoint("TOPLEFT", frame.Icon.Texture, "TOPLEFT", -2, 2) frame.Icon.Texture.b:SetPoint("BOTTOMRIGHT", frame.Icon.Texture, "BOTTOMRIGHT", 2, -2) frame.Icon.Texture:SetParent(frame.Icon.Texture.b) end end hooksecurefunc(AchievementAlertSystem, "setUpFunction", SkinAchievementAlert) local function SkinCriteriaAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", -9, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 5, 6) end frame.Unlocked:SetTextColor(1, 1, 1) frame.Name:SetTextColor(1, 0.8, 0) frame.Background:Kill() frame.glow:Kill() frame.shine:Kill() frame.Icon.Bling:Kill() frame.Icon.Overlay:Kill() -- Icon frame.Icon.Texture:SetSize(27, 27) frame.Icon.Texture:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon.Texture:ClearAllPoints() frame.Icon.Texture:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.Icon.Texture.b then frame.Icon.Texture.b = CreateFrame("Frame", nil, frame) frame.Icon.Texture.b:SetTemplate("Default") frame.Icon.Texture.b:SetPoint("TOPLEFT", frame.Icon.Texture, "TOPLEFT", -2, 2) frame.Icon.Texture.b:SetPoint("BOTTOMRIGHT", frame.Icon.Texture, "BOTTOMRIGHT", 2, -2) frame.Icon.Texture:SetParent(frame.Icon.Texture.b) end end hooksecurefunc(CriteriaAlertSystem, "setUpFunction", SkinCriteriaAlert) local function SkinDungeonCompletionAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 31, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -35, 6) end if frame.glowFrame then frame.glowFrame:Kill() if frame.glowFrame.glow then frame.glowFrame.glow:Kill() end end if frame.shine then frame.shine:Kill() end if frame.raidArt then frame.raidArt:Kill() end if frame.heroicIcon then frame.heroicIcon:Kill() end if frame.dungeonArt then frame.dungeonArt:Kill() end if frame.dungeonArt1 then frame.dungeonArt1:Kill() end if frame.dungeonArt2 then frame.dungeonArt2:Kill() end if frame.dungeonArt3 then frame.dungeonArt3:Kill() end if frame.dungeonArt4 then frame.dungeonArt4:Kill() end -- Icon frame.dungeonTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.dungeonTexture:SetDrawLayer("OVERLAY") frame.dungeonTexture:ClearAllPoints() frame.dungeonTexture:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.dungeonTexture.b then frame.dungeonTexture.b = CreateFrame("Frame", nil, frame) frame.dungeonTexture.b:SetTemplate("Default") frame.dungeonTexture.b:SetPoint("TOPLEFT", frame.dungeonTexture, "TOPLEFT", -2, 2) frame.dungeonTexture.b:SetPoint("BOTTOMRIGHT", frame.dungeonTexture, "BOTTOMRIGHT", 2, -2) frame.dungeonTexture:SetParent(frame.dungeonTexture.b) end end hooksecurefunc(DungeonCompletionAlertSystem, "setUpFunction", SkinDungeonCompletionAlert) local function SkinGuildChallengeAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", -2, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -2, 6) end -- Background local region = select(2, frame:GetRegions()) if region:GetObjectType() == "Texture" then if region:GetTexture() == 516664 then region:Kill() end end frame.glow:Kill() frame.shine:Kill() frame.EmblemBorder:Kill() -- Icon border frame.EmblemBackground:SetPoint("LEFT", frame.backdrop, 9, 0) frame.EmblemIcon:SetPoint("CENTER", frame.EmblemBackground, 0, 0) frame.EmblemBackground:SetDrawLayer("ARTWORK", 1) frame.EmblemIcon:SetDrawLayer("ARTWORK", 2) -- Icon border if not frame.EmblemBackground.b then frame.EmblemBackground.b = CreateFrame("Frame", nil, frame) frame.EmblemBackground.b:SetTemplate("Default") frame.EmblemBackground.b:SetPoint("TOPLEFT", frame.EmblemBackground, "TOPLEFT", -2, 2) frame.EmblemBackground.b:SetPoint("BOTTOMRIGHT", frame.EmblemBackground, "BOTTOMRIGHT", 2, -2) frame.EmblemBackground:SetParent(frame.EmblemBackground.b) frame.EmblemIcon:SetParent(frame.EmblemBackground.b) end end hooksecurefunc(GuildChallengeAlertSystem, "setUpFunction", SkinGuildChallengeAlert) local function SkinInvasionAlert(frame) if not frame.isSkinned then frame:SetAlpha(1) hooksecurefunc(frame, "SetAlpha", forceAlpha) frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -7, 6) local region, icon = frame:GetRegions() if region and region:GetObjectType() == "Texture" then if region:GetAtlas() == "legioninvasion-Toast-Frame" then region:Kill() end end -- Icon border if icon and icon:GetObjectType() == "Texture" then if icon:GetTexture() == 236293 then icon.b = CreateFrame("Frame", nil, frame) icon.b:SetTemplate("Default") icon.b:SetPoint("TOPLEFT", icon, "TOPLEFT", -2, 2) icon.b:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", 2, -2) icon:SetParent(icon.b) icon:SetDrawLayer("OVERLAY") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("LEFT", frame.backdrop, 9, 0) end end frame.isSkinned = true end end hooksecurefunc(InvasionAlertSystem, "setUpFunction", SkinInvasionAlert) local function SkinScenarioAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -7, 6) end -- Background for i = 1, frame:GetNumRegions() do local region = select(i, frame:GetRegions()) if region:GetObjectType() == "Texture" then if region:GetAtlas() == "Toast-IconBG" or region:GetAtlas() == "Toast-Frame" then region:Kill() end end end frame.shine:Kill() frame.glowFrame:Kill() frame.glowFrame.glow:Kill() -- Icon frame.dungeonTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.dungeonTexture:ClearAllPoints() frame.dungeonTexture:SetPoint("LEFT", frame.backdrop, 9, 0) frame.dungeonTexture:SetDrawLayer("OVERLAY") -- Icon border if not frame.dungeonTexture.b then frame.dungeonTexture.b = CreateFrame("Frame", nil, frame) frame.dungeonTexture.b:SetTemplate("Default") frame.dungeonTexture.b:SetPoint("TOPLEFT", frame.dungeonTexture, "TOPLEFT", -2, 2) frame.dungeonTexture.b:SetPoint("BOTTOMRIGHT", frame.dungeonTexture, "BOTTOMRIGHT", 2, -2) frame.dungeonTexture:SetParent(frame.dungeonTexture.b) end end hooksecurefunc(ScenarioAlertSystem, "setUpFunction", SkinScenarioAlert) local function SkinWorldQuestCompleteAlert(frame) frame:SetAlpha(1) hooksecurefunc(frame, "SetAlpha", forceAlpha) if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 18, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -22, 6) end -- Background frame.ToastBackground:Kill() frame.shine:Kill() -- Icon frame.QuestTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.QuestTexture:SetDrawLayer("ARTWORK") frame.QuestTexture:SetPoint("LEFT", frame.backdrop, 8, 0) -- Icon border if not frame.QuestTexture.b then frame.QuestTexture.b = CreateFrame("Frame", nil, frame) frame.QuestTexture.b:SetTemplate("Default") frame.QuestTexture.b:SetPoint("TOPLEFT", frame.QuestTexture, "TOPLEFT", -2, 2) frame.QuestTexture.b:SetPoint("BOTTOMRIGHT", frame.QuestTexture, "BOTTOMRIGHT", 2, -2) frame.QuestTexture:SetParent(frame.QuestTexture.b) end end hooksecurefunc(WorldQuestCompleteAlertSystem, "setUpFunction", SkinWorldQuestCompleteAlert) local function SkinGarrisonFollowerAlert(frame, _, _, _, quality) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 6) end frame.glow:Kill() frame.shine:Kill() frame.FollowerBG:SetAlpha(0) frame.DieIcon:SetAlpha(0) frame.PortraitFrame:ClearAllPoints() frame.PortraitFrame:SetPoint("LEFT", 12, -4) frame.PortraitFrame.PortraitRing:Hide() frame.PortraitFrame.PortraitRingQuality:SetTexture() frame.PortraitFrame.LevelBorder:SetAlpha(0) frame.PortraitFrame.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85) local level = frame.PortraitFrame.Level level:ClearAllPoints() level:SetPoint("BOTTOM", frame.PortraitFrame, 0, 11) level:SetFontObject("SystemFont_Outline_Small") level:SetShadowOffset(0, 0) if not frame.squareBG then frame.squareBG = CreateFrame("Frame", nil, frame.PortraitFrame) frame.squareBG:SetFrameLevel(frame.PortraitFrame:GetFrameLevel()-1) frame.squareBG:SetPoint("TOPLEFT", 2, -2) frame.squareBG:SetPoint("BOTTOMRIGHT", -2, 10) frame.squareBG:SetTemplate("Default") end local cover = frame.PortraitFrame.PortraitRingCover if cover then cover:SetColorTexture(0, 0, 0) cover:SetAllPoints(frame.squareBG) end local color = ITEM_QUALITY_COLORS[quality] if color and quality > 1 then frame.Name:SetTextColor(color.r, color.g, color.b) end -- Background for i = 1, frame:GetNumRegions() do local region = select(i, frame:GetRegions()) if region:GetObjectType() == "Texture" then if region:GetAtlas() == "Garr_MissionToast" then region:Kill() end end end end hooksecurefunc(GarrisonFollowerAlertSystem, "setUpFunction", SkinGarrisonFollowerAlert) local function SkinGarrisonShipFollowerAlert(frame) if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 6) end frame.glow:Kill() frame.shine:Kill() frame.FollowerBG:SetAlpha(0) frame.DieIcon:SetAlpha(0) frame.Background:Kill() end hooksecurefunc(GarrisonShipFollowerAlertSystem, "setUpFunction", SkinGarrisonShipFollowerAlert) local function SkinGarrisonTalentAlert(frame) if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 21, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -25, 6) end frame:GetRegions():Hide() frame.glow:Kill() frame.shine:Kill() -- Icon frame.Icon:SetSize(50, 50) frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:SetDrawLayer("ARTWORK") frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(GarrisonTalentAlertSystem, "setUpFunction", SkinGarrisonTalentAlert) local function SkinGarrisonBuildingAlert(frame) if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 6) end frame.glow:Kill() frame.shine:Kill() frame:GetRegions():Hide() -- Icon frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:SetDrawLayer("ARTWORK") frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(GarrisonBuildingAlertSystem, "setUpFunction", SkinGarrisonBuildingAlert) local function SkinGarrisonMissionAlert(frame) if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 6) end frame.glow:Kill() frame.shine:Kill() frame.IconBG:Hide() frame.Background:Kill() -- Icon frame.MissionType:SetSize(45, 45) frame.MissionType:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.MissionType:SetDrawLayer("ARTWORK") frame.MissionType:ClearAllPoints() frame.MissionType:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.MissionType.b then frame.MissionType.b = CreateFrame("Frame", nil, frame) frame.MissionType.b:SetTemplate("Default") frame.MissionType.b:SetPoint("TOPLEFT", frame.MissionType, "TOPLEFT", -2, 2) frame.MissionType.b:SetPoint("BOTTOMRIGHT", frame.MissionType, "BOTTOMRIGHT", 2, -2) frame.MissionType:SetParent(frame.MissionType.b) end frame.EncounterIcon:SetSize(45, 45) frame.EncounterIcon:SetOutside(frame.MissionType.b) frame.EncounterIcon.CircleMask:Hide() frame.EncounterIcon.PortraitBorder:Hide() frame.EncounterIcon.RareOverlay:Hide() frame.EncounterIcon.EliteOverlay:Hide() frame.EncounterIcon.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85) end hooksecurefunc(GarrisonMissionAlertSystem, "setUpFunction", SkinGarrisonMissionAlert) local function SkinGarrisonShipMissionAlert(frame) if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 6) end frame.Background:Kill() frame.glow:Kill() frame.shine:Kill() -- Icon frame.MissionType:SetSize(45, 45) frame.MissionType:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.MissionType:SetDrawLayer("ARTWORK") frame.MissionType:ClearAllPoints() frame.MissionType:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.MissionType.b then frame.MissionType.b = CreateFrame("Frame", nil, frame) frame.MissionType.b:SetTemplate("Default") frame.MissionType.b:SetPoint("TOPLEFT", frame.MissionType, "TOPLEFT", -2, 2) frame.MissionType.b:SetPoint("BOTTOMRIGHT", frame.MissionType, "BOTTOMRIGHT", 2, -2) frame.MissionType:SetParent(frame.MissionType.b) end end hooksecurefunc(GarrisonShipMissionAlertSystem, "setUpFunction", SkinGarrisonShipMissionAlert) local function SkinGarrisonRandomMissionAlert(frame) if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 6) end frame.Background:Kill() frame.Blank:Kill() frame.IconBG:Kill() frame.glow:Kill() frame.shine:Kill() -- Icon frame.MissionType:SetSize(45, 45) frame.MissionType:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.MissionType:SetDrawLayer("ARTWORK") frame.MissionType:ClearAllPoints() frame.MissionType:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.MissionType.b then frame.MissionType.b = CreateFrame("Frame", nil, frame) frame.MissionType.b:SetTemplate("Default") frame.MissionType.b:SetPoint("TOPLEFT", frame.MissionType, "TOPLEFT", -2, 2) frame.MissionType.b:SetPoint("BOTTOMRIGHT", frame.MissionType, "BOTTOMRIGHT", 2, -2) frame.MissionType:SetParent(frame.MissionType.b) end end hooksecurefunc(GarrisonRandomMissionAlertSystem, "setUpFunction", SkinGarrisonRandomMissionAlert) local function SkinLegendaryItemAlert(frame) if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 14, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -18, 6) end frame.Background:Kill() frame.Background2:Kill() frame.Background3:Kill() frame.Ring1:Kill() frame.Particles3:Kill() frame.Particles2:Kill() frame.Particles1:Kill() frame.Starglow:Kill() frame.glow:Kill() frame.shine:Kill() -- Icon frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:SetDrawLayer("ARTWORK") frame.Icon:ClearAllPoints() frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(LegendaryItemAlertSystem, "setUpFunction", SkinLegendaryItemAlert) local function SkinLootWonAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -5, 6) end frame.Background:Kill() frame.glow:Kill() frame.shine:Kill() frame.BGAtlas:Kill() frame.PvPBackground:Kill() frame.RatedPvPBackground:Kill() local lootItem = frame.lootItem lootItem.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) lootItem.Icon:SetDrawLayer("BORDER") lootItem.Icon:ClearAllPoints() lootItem.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) lootItem.IconBorder:Kill() lootItem.SpecRing:SetTexture("") -- Icon border if not lootItem.Icon.b then lootItem.Icon.b = CreateFrame("Frame", nil, frame) lootItem.Icon.b:SetTemplate("Default") lootItem.Icon.b:SetPoint("TOPLEFT", lootItem.Icon, "TOPLEFT", -2, 2) lootItem.Icon.b:SetPoint("BOTTOMRIGHT", lootItem.Icon, "BOTTOMRIGHT", 2, -2) lootItem.Icon:SetParent(lootItem.Icon.b) end end hooksecurefunc(LootAlertSystem, "setUpFunction", SkinLootWonAlert) local function SkinLootUpgradeAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -5, 6) end frame.Background:Kill() frame.BaseQualityBorder:Kill() frame.UpgradeQualityBorder:Kill() frame.BorderGlow:Kill() frame.Sheen:Kill() frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:SetDrawLayer("BORDER", 5) frame.Icon:ClearAllPoints() frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetFrameLevel(1) frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(LootUpgradeAlertSystem, "setUpFunction", SkinLootUpgradeAlert) local function SkinMoneyWonAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", -13, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 9, 6) end frame.Background:Kill() frame.IconBorder:Kill() frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) frame.Label:ClearAllPoints() frame.Label:SetPoint("CENTER", frame.backdrop, 0, 10) frame.Amount:ClearAllPoints() frame.Amount:SetPoint("CENTER", frame.backdrop, 0, -10) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(MoneyWonAlertSystem, "setUpFunction", SkinMoneyWonAlert) local function SkinHonorAwardedAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", -12, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 9, 6) end frame.Background:Kill() frame.IconBorder:Kill() frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) frame.Label:ClearAllPoints() frame.Label:SetPoint("CENTER", frame.backdrop, 0, 10) frame.Amount:ClearAllPoints() frame.Amount:SetPoint("CENTER", frame.backdrop, 0, -10) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(HonorAwardedAlertSystem, "setUpFunction", SkinHonorAwardedAlert) local function SkinEntitlementDeliveredAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 6) end -- Background frame.Background:Kill() frame.glow:Kill() frame.shine:Kill() -- Icon frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:ClearAllPoints() frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(EntitlementDeliveredAlertSystem, "setUpFunction", SkinEntitlementDeliveredAlert) local function SkinRafRewardDeliveredAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 6) end -- Background frame.StandardBackground:Kill() frame.glow:Kill() frame.shine:Kill() -- Icon frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:ClearAllPoints() frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(RafRewardDeliveredAlertSystem, "setUpFunction", SkinRafRewardDeliveredAlert) local function SkinDigsiteCompleteAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", -17, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 13, 6) end frame.glow:Kill() frame.shine:Kill() frame:GetRegions():Hide() frame.DigsiteTypeTexture:SetPoint("LEFT", -10, -14) end hooksecurefunc(DigsiteCompleteAlertSystem, "setUpFunction", SkinDigsiteCompleteAlert) local function SkinNewRecipeLearnedAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 19, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -23, 6) end frame.glow:Kill() frame.shine:Kill() frame:GetRegions():Hide() frame.Icon:SetMask("") frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:SetDrawLayer("BORDER", 5) frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) frame.Icon:SetSize(50, 50) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(NewRecipeLearnedAlertSystem, "setUpFunction", SkinNewRecipeLearnedAlert) local function SkinNewPetMountAlert(frame) frame:SetAlpha(1) if not frame.hooked then hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.hooked = true end if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -5, 6) end frame.Background:Kill() frame.IconBorder:Kill() frame.glow:Kill() frame.shine:Kill() frame.Icon:SetMask("") frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.Icon:SetDrawLayer("BORDER", 5) frame.Icon:SetPoint("LEFT", frame.backdrop, 9, 0) -- Icon border if not frame.Icon.b then frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) end end hooksecurefunc(NewPetAlertSystem, "setUpFunction", SkinNewPetMountAlert) hooksecurefunc(NewMountAlertSystem, "setUpFunction", SkinNewPetMountAlert) hooksecurefunc(NewToyAlertSystem, "setUpFunction", SkinNewPetMountAlert) hooksecurefunc(NewRuneforgePowerAlertSystem, "setUpFunction", SkinNewPetMountAlert) hooksecurefunc(NewCosmeticAlertFrameSystem, "setUpFunction", SkinNewPetMountAlert) hooksecurefunc("StandardRewardAlertFrame_AdjustRewardAnchors", function(frame) if frame.RewardFrames then for _, button in next, frame.RewardFrames do if not button.isSkinned then local icon, ring = button:GetRegions() icon:SetSize(18, 18) icon:SkinIcon(true) ring:Hide() button.isSkinned = true end end end end) -- Bonus Roll Money local frame = BonusRollMoneyWonFrame frame:SetAlpha(1) hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.Background:Kill() frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.IconBorder:Kill() -- Icon border frame.Icon.b = CreateFrame("Frame", nil, frame) frame.Icon.b:SetTemplate("Default") frame.Icon.b:SetPoint("TOPLEFT", frame.Icon, "TOPLEFT", -2, 2) frame.Icon.b:SetPoint("BOTTOMRIGHT", frame.Icon, "BOTTOMRIGHT", 2, -2) frame.Icon:SetParent(frame.Icon.b) -- Create Backdrop frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", -9, 6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 5, -6) -- Bonus Roll Loot frame = BonusRollLootWonFrame frame:SetAlpha(1) hooksecurefunc(frame, "SetAlpha", forceAlpha) frame.Background:Kill() frame.glow:Kill() frame.shine:Kill() local lootItem = frame.lootItem lootItem.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) lootItem.IconBorder:SetAlpha(0) -- Icon border lootItem.Icon.b = CreateFrame("Frame", nil, frame) lootItem.Icon.b:SetTemplate("Default") lootItem.Icon.b:SetFrameLevel(1) lootItem.Icon.b:SetPoint("TOPLEFT", lootItem.Icon, "TOPLEFT", -2, 2) lootItem.Icon.b:SetPoint("BOTTOMRIGHT", lootItem.Icon, "BOTTOMRIGHT", 2, -2) lootItem.Icon:SetParent(lootItem.Icon.b) -- Create Backdrop frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", -9, 6) frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 5, -6) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/AlliedRaces.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- AlliedRacesUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() AlliedRacesFrame:StripTextures() AlliedRacesFrame:SetTemplate("Transparent") AlliedRacesFramePortrait:SetAlpha(0) AlliedRacesFrame.ModelFrame:StripTextures() AlliedRacesFrame.ModelFrame:CreateBackdrop("Transparent") AlliedRacesFrame.ModelFrame.backdrop:SetFrameLevel(1) AlliedRacesFrame.ModelFrame.backdrop:SetPoint("TOPLEFT", -2, 2) AlliedRacesFrame.ModelFrame.backdrop:SetPoint("BOTTOMRIGHT", 2, -2) AlliedRacesFrame.ModelFrame:SetSize(313, 575) AlliedRacesFrame.ModelFrame:SetPoint("LEFT", 10, -6) local scrollFrame = AlliedRacesFrame.RaceInfoFrame.ScrollFrame scrollFrame.ScrollBar.Border:Hide() scrollFrame.ScrollBar.ScrollUpBorder:Hide() scrollFrame.ScrollBar.ScrollDownBorder:Hide() scrollFrame.ScrollBar.Track:Hide() AlliedRacesFrame.RaceInfoFrame.AlliedRacesRaceName:SetTextColor(1, .8, 0) scrollFrame.Child.RaceDescriptionText:SetTextColor(1, 1, 1) scrollFrame.Child.RacialTraitsLabel:SetTextColor(1, .8, 0) scrollFrame.Child.ObjectivesFrame:StripTextures() scrollFrame.Child.ObjectivesFrame:CreateBackdrop("Overlay") AlliedRacesFrame:HookScript("OnShow", function(self) for button in self.abilityPool:EnumerateActive() do select(3, button:GetRegions()):Hide() button.Icon:SkinIcon() button.Text:SetTextColor(1, 1, 1) end end) T.SkinScrollBar(scrollFrame.ScrollBar) T.SkinCloseButton(AlliedRacesFrameCloseButton) end T.SkinFuncs["Blizzard_AlliedRacesUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/AnimaDiversion.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Anima Diversion skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = AnimaDiversionFrame T.SkinCloseButton(frame.CloseButton) frame:StripTextures() frame:CreateBackdrop("Transparent") frame.AnimaDiversionCurrencyFrame.Background:SetAlpha(0) frame.ReinforceInfoFrame.AnimaNodeReinforceButton:SkinButton() hooksecurefunc(AnimaDiversionFrame, "SetupCurrencyFrame", function() local cur = AnimaDiversionFrame.AnimaDiversionCurrencyFrame.CurrencyFrame.Quantity local text = cur and cur:GetText() if not text or text == '' then return end local new, count = gsub(text, "|T([^:]-):[%d+:]+|t", "|T%1:14:14:0:0:64:64:5:59:5:59|t") if count > 0 then cur:SetFormattedText("%s", new) end end) end T.SkinFuncs["Blizzard_AnimaDiversionUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Archeology.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- ArchaeologyUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() ArchaeologyFrame:StripTextures(true) ArchaeologyFrame:SetTemplate("Transparent") ArchaeologyFramePortrait:SetAlpha(0) ArchaeologyFrameArtifactPageSolveFrameSolveButton:SkinButton(true) ArchaeologyFrameArtifactPageBackButton:SkinButton(true) T.SkinDropDownBox(ArchaeologyFrameRaceFilter) ArchaeologyFrameRankBar:StripTextures() ArchaeologyFrameRankBar:SetStatusBarTexture(C.media.texture) ArchaeologyFrameRankBar:CreateBackdrop("Overlay") ArchaeologyFrameArtifactPageSolveFrameStatusBar:StripTextures() ArchaeologyFrameArtifactPageSolveFrameStatusBar:SetStatusBarTexture(C.media.texture) ArchaeologyFrameArtifactPageSolveFrameStatusBar:SetStatusBarColor(0.7, 0.2, 0) ArchaeologyFrameArtifactPageSolveFrameStatusBar:CreateBackdrop("Overlay") for i = 1, ARCHAEOLOGY_MAX_COMPLETED_SHOWN do local artifact = _G["ArchaeologyFrameCompletedPageArtifact"..i] if artifact then _G["ArchaeologyFrameCompletedPageArtifact"..i.."Border"]:Kill() _G["ArchaeologyFrameCompletedPageArtifact"..i.."Bg"]:Kill() _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"]:SetTexCoord(0.1, 0.9, 0.1, 0.9) _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"].backdrop = CreateFrame("Frame", nil, artifact) _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"].backdrop:SetTemplate("Default") _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"].backdrop:SetPoint("TOPLEFT", _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"], "TOPLEFT", -2, 2) _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"].backdrop:SetPoint("BOTTOMRIGHT", _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"], "BOTTOMRIGHT", 2, -2) _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"].backdrop:SetFrameLevel(artifact:GetFrameLevel() - 2) _G["ArchaeologyFrameCompletedPageArtifact"..i.."Icon"]:SetDrawLayer("OVERLAY") _G["ArchaeologyFrameCompletedPageArtifact"..i.."ArtifactName"]:SetTextColor(1, 0.8, 0) _G["ArchaeologyFrameCompletedPageArtifact"..i.."ArtifactName"]:SetShadowOffset(1, -1) _G["ArchaeologyFrameCompletedPageArtifact"..i.."ArtifactSubText"]:SetTextColor(0.6, 0.6, 0.6) _G["ArchaeologyFrameCompletedPageArtifact"..i.."ArtifactSubText"]:SetShadowOffset(1, -1) end end for i = 1, ARCHAEOLOGY_MAX_RACES do local frame = _G["ArchaeologyFrameSummaryPageRace"..i] if frame then frame.raceName:SetTextColor(1, 1, 1) frame.raceName:SetShadowOffset(1, -1) end end for i = 1, ArchaeologyFrameCompletedPage:GetNumRegions() do local region = select(i, ArchaeologyFrameCompletedPage:GetRegions()) if region:GetObjectType() == "FontString" then region:SetTextColor(1, 0.8, 0) region:SetShadowColor(0, 0, 0) region:SetShadowOffset(1, -1) end end for i = 1, ArchaeologyFrameSummaryPage:GetNumRegions() do local region = select(i, ArchaeologyFrameSummaryPage:GetRegions()) if region:GetObjectType() == "FontString" then region:SetTextColor(1, 0.8, 0) region:SetShadowColor(0, 0, 0) region:SetShadowOffset(1, -1) end end ArchaeologyFrameCompletedPage.infoText:SetTextColor(1, 1, 1) ArchaeologyFrameHelpPageTitle:SetTextColor(1, 0.8, 0) ArchaeologyFrameHelpPageTitle:SetShadowColor(0, 0, 0) ArchaeologyFrameHelpPageTitle:SetShadowOffset(1, -1) ArchaeologyFrameHelpPageDigTitle:SetTextColor(1, 0.8, 0) ArchaeologyFrameHelpPageDigTitle:SetShadowColor(0, 0, 0) ArchaeologyFrameHelpPageDigTitle:SetShadowOffset(1, -1) ArchaeologyFrameHelpPageHelpScrollHelpText:SetTextColor(1, 1, 1) ArchaeologyFrameArtifactPageHistoryTitle:SetTextColor(1, 0.8, 0) ArchaeologyFrameArtifactPageIcon:SkinIcon(true) ArchaeologyFrameArtifactPageHistoryScrollChildText:SetTextColor(1, 1, 1) T.SkinCloseButton(ArchaeologyFrameCloseButton) T.SkinNextPrevButton(ArchaeologyFrameCompletedPageNextPageButton, nil, "Any") T.SkinNextPrevButton(ArchaeologyFrameCompletedPagePrevPageButton, nil, "Any") T.SkinNextPrevButton(ArchaeologyFrameSummaryPageNextPageButton, nil, "Any") T.SkinNextPrevButton(ArchaeologyFrameSummaryPagePrevPageButton, nil, "Any") T.SkinScrollBar(ArchaeologyFrameArtifactPageHistoryScrollScrollBar) ArchaeologyFrameInfoButton:SetPoint("TOPLEFT", ArchaeologyFrame, 4, -4) -- Archaeology progress bar (by Haleth) local frame = ArcheologyDigsiteProgressBar local bar = frame.FillBar frame.Shadow:Hide() frame.BarBackground:Hide() frame.BarBorderAndOverlay:Hide() frame.BarTitle:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style) frame.BarTitle:SetPoint("CENTER", 0, 13) bar:SetWidth(150) frame.Flash:SetWidth(172) bar:SetStatusBarTexture(C.media.texture) bar:SetStatusBarColor(unpack(C.media.classborder_color)) bar:CreateBackdrop("Overlay") end T.SkinFuncs["Blizzard_ArchaeologyUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Artifact.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- ArtifactUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() ArtifactFrame:StripTextures() ArtifactFrame:CreateBackdrop("Transparent") ArtifactFrame.BorderFrame:StripTextures() for i = 1, 2 do T.SkinTab(_G["ArtifactFrameTab" .. i]) end ArtifactFrameTab1:ClearAllPoints() ArtifactFrameTab1:SetPoint("TOPLEFT", ArtifactFrame, "BOTTOMLEFT", 0, -2) ArtifactFrame.ForgeBadgeFrame.ItemIcon:Hide() ArtifactFrame.ForgeBadgeFrame.ForgeLevelBackground:ClearAllPoints() ArtifactFrame.ForgeBadgeFrame.ForgeLevelBackground:SetPoint("TOPLEFT", ArtifactFrame) T.SkinCloseButton(ArtifactFrame.CloseButton) end T.SkinFuncs["Blizzard_ArtifactUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Auction.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- AuctionUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() AuctionHouseFrame:StripTextures() AuctionHouseFrame:SetTemplate("Transparent") AuctionHouseFramePortrait:SetAlpha(0) AuctionHouseFrame.MoneyFrameBorder:StripTextures() AuctionHouseFrame.MoneyFrameInset:StripTextures() T.SkinCloseButton(AuctionHouseFrameCloseButton) AuctionHouseFrame.SearchBar.FavoritesSearchButton:SetSize(22, 22) T.SkinEditBox(AuctionHouseFrame.SearchBar.SearchBox, nil, 18) T.SkinCloseButton(AuctionHouseFrame.SearchBar.FilterButton.ClearFiltersButton) AuctionHouseFrame.SearchBar.FilterButton.ClearFiltersButton:SetPoint("TOPRIGHT", 3, 6) local function SkinEditBoxes(Frame) T.SkinEditBox(Frame.MinLevel) T.SkinEditBox(Frame.MaxLevel) Frame.MinLevel.backdrop:SetPoint("BOTTOMRIGHT", -3, 0) Frame.MaxLevel.backdrop:SetPoint("BOTTOMRIGHT", -3, 0) end SkinEditBoxes(AuctionHouseFrame.SearchBar.FilterButton.LevelRangeFrame) local buttons = { AuctionHouseFrame.SearchBar.SearchButton, AuctionHouseFrame.SearchBar.FilterButton, AuctionHouseFrame.SearchBar.FavoritesSearchButton, AuctionHouseFrame.ItemSellFrame.QuantityInput.MaxButton, AuctionHouseFrame.ItemSellFrame.PostButton, AuctionHouseFrame.CommoditiesSellFrame.PostButton, AuctionHouseFrame.CommoditiesSellFrame.QuantityInput.MaxButton, AuctionHouseFrameAuctionsFrame.CancelAuctionButton, AuctionHouseFrameAuctionsFrame.BidFrame.BidButton, AuctionHouseFrameAuctionsFrame.BuyoutFrame.BuyoutButton, AuctionHouseFrame.ItemBuyFrame.BackButton, AuctionHouseFrame.ItemBuyFrame.BidFrame.BidButton, AuctionHouseFrame.ItemBuyFrame.BuyoutFrame.BuyoutButton, AuctionHouseFrame.BuyDialog.BuyNowButton, AuctionHouseFrame.BuyDialog.CancelButton, AuctionHouseFrame.WoWTokenResults.Buyout, AuctionHouseFrame.WoWTokenResults.GameTimeTutorial.RightDisplay.StoreButton } for i = 1, #buttons do buttons[i]:SkinButton() end local scrollbars = { AuctionHouseFrame.CategoriesList.ScrollBar, AuctionHouseFrame.CommoditiesBuyFrame.ItemList.ScrollBar, AuctionHouseFrameAuctionsFrame.SummaryList.ScrollBar, AuctionHouseFrame.WoWTokenResults.DummyScrollBar } for i = 1, #scrollbars do T.SkinScrollBar(scrollbars[i]) end local tabs = { AuctionHouseFrameBuyTab, AuctionHouseFrameSellTab, AuctionHouseFrameAuctionsTab } for _, tab in pairs(tabs) do if tab then T.SkinTab(tab) end end AuctionHouseFrame:HookScript("OnShow", function() if AuctionFrameTab4 and not AuctionFrameTab4.styled then T.SkinTab(AuctionFrameTab4) AuctionFrameTab4.styled = true end end) T.SkinTab(AuctionHouseFrameAuctionsFrameAuctionsTab, true) T.SkinTab(AuctionHouseFrameAuctionsFrameBidsTab, true) AuctionHouseFrameBuyTab:ClearAllPoints() AuctionHouseFrameBuyTab:SetPoint("BOTTOMLEFT", AuctionHouseFrame, "BOTTOMLEFT", 0, -32) AuctionHouseFrame.CategoriesList:StripTextures() hooksecurefunc("AuctionHouseFilterButton_SetUp", function(button, info) button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", button.SelectedTexture, "TOPLEFT", 1, -1) button.backdrop:SetPoint("BOTTOMRIGHT", button.SelectedTexture, "BOTTOMRIGHT", -1, 1) button.NormalTexture:SetAlpha(0) button.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.2) button.HighlightTexture:SetColorTexture(1, 1, 1, 0.2) end) local function SkinListIcon(frame) if not frame.tableBuilder then return end for i = 1, 22 do local row = frame.tableBuilder.rows[i] if row then for j = 1, 4 do local cell = row.cells and row.cells[j] if cell and cell.Icon then if not cell.IsSkinned then cell.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) if cell.IconBorder then cell.IconBorder:SetAlpha(0) end cell.IsSkinned = true end end end end end end local function SkinHeaders(frame) local maxHeaders = frame.HeaderContainer:GetNumChildren() for i = 1, maxHeaders do local header = select(i, frame.HeaderContainer:GetChildren()) if header and not header.IsSkinned then header:DisableDrawLayer("BACKGROUND") header:GetHighlightTexture():Hide() header:CreateBackdrop("Overlay") header.backdrop:SetPoint("TOPLEFT", 2, 0) header.backdrop:SetPoint("BOTTOMRIGHT", -2, 0) header.IsSkinned = true end end SkinListIcon(frame) end hooksecurefunc(AuctionHouseFrameAuctionsFrame.SummaryList.ScrollBox, "Update", function(frame) for _, button in next, {frame.ScrollTarget:GetChildren()} do if not button.styled then if button.Icon then button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) if button.IconBorder then button.IconBorder:SetAlpha(0) end end button.styled = true end end end) local function SkinAuctionFrame(frame, scroll) frame:StripTextures() frame.RefreshFrame.RefreshButton:SkinButton() frame.RefreshFrame.RefreshButton:SetSize(24, 24) T.SkinScrollBar(frame.ScrollBar) if scroll then frame.ScrollBar:SetPoint("BOTTOMLEFT", frame, "BOTTOMRIGHT", 4, 15) end hooksecurefunc(frame, "RefreshScrollFrame", SkinHeaders) end SkinAuctionFrame(AuctionHouseFrame.BrowseResultsFrame.ItemList) SkinAuctionFrame(AuctionHouseFrame.ItemBuyFrame.ItemList, true) SkinAuctionFrame(AuctionHouseFrame.ItemSellList) SkinAuctionFrame(AuctionHouseFrame.CommoditiesSellList) SkinAuctionFrame(AuctionHouseFrameAuctionsFrame.ItemList) SkinAuctionFrame(AuctionHouseFrameAuctionsFrame.AllAuctionsList, true) SkinAuctionFrame(AuctionHouseFrameAuctionsFrame.BidsList, true) SkinAuctionFrame(AuctionHouseFrameAuctionsFrame.CommoditiesList, true) local function SkinItemIcon(frame, nostrip) if not nostrip then frame:StripTextures() end if frame.IconMask then frame.IconMask:Hide() end if frame.CircleMask then frame.CircleMask:Hide() end if frame.IconBorder then frame.IconBorder:SetAlpha(0) end frame.Icon:SkinIcon() end AuctionHouseFrame.ItemBuyFrame.ItemDisplay:StripTextures() SkinItemIcon(AuctionHouseFrame.ItemBuyFrame.ItemDisplay.ItemButton) T.SkinEditBox(AuctionHouseFrameGold) T.SkinEditBox(AuctionHouseFrameSilver) local buyFrame = AuctionHouseFrame.CommoditiesBuyFrame buyFrame.BackButton:SkinButton() buyFrame.BuyDisplay.BuyButton:SkinButton() buyFrame.ItemList.RefreshFrame.RefreshButton:SkinButton() buyFrame.ItemList.RefreshFrame.RefreshButton:SetSize(24, 24) buyFrame.BuyDisplay:StripTextures() buyFrame.ItemList:StripTextures() buyFrame.BuyDisplay.QuantityInput.InputBox:DisableDrawLayer("BACKGROUND") buyFrame.BuyDisplay.QuantityInput.InputBox:CreateBackdrop("Overlay") buyFrame.BuyDisplay.QuantityInput.InputBox.backdrop:SetPoint("TOPLEFT", 2, -2) buyFrame.BuyDisplay.QuantityInput.InputBox.backdrop:SetPoint("BOTTOMRIGHT", -20, 6) local itemDisplay = buyFrame.BuyDisplay.ItemDisplay itemDisplay:StripTextures() itemDisplay.ItemButton.Icon:SkinIcon() itemDisplay.ItemButton.CircleMask:Hide() itemDisplay.ItemButton.IconBorder:SetAlpha(0) local function SkinMoneyBox(frame) frame:DisableDrawLayer("BACKGROUND") frame:CreateBackdrop("Overlay") frame.backdrop:SetPoint("TOPLEFT", 6, -2) frame.backdrop:SetPoint("BOTTOMRIGHT", -22, 6) end for _, frame in pairs({AuctionHouseFrame.ItemSellFrame, AuctionHouseFrame.CommoditiesSellFrame}) do frame:StripTextures() frame.ItemDisplay:StripTextures() SkinItemIcon(frame.ItemDisplay.ItemButton) SkinMoneyBox(frame.PriceInput.MoneyInputFrame.GoldBox) SkinMoneyBox(frame.PriceInput.MoneyInputFrame.SilverBox) SkinMoneyBox(frame.QuantityInput.InputBox) if frame.SecondaryPriceInput then SkinMoneyBox(frame.SecondaryPriceInput.MoneyInputFrame.GoldBox) SkinMoneyBox(frame.SecondaryPriceInput.MoneyInputFrame.SilverBox) end T.SkinDropDownBox(frame.DurationDropDown.DropDown) frame.DurationDropDown.DropDown.backdrop:SetPoint("TOPLEFT", 20, -1) end T.SkinCheckBox(AuctionHouseFrame.ItemSellFrame.BuyoutModeCheckButton, 25) AuctionHouseFrameAuctionsFrame.SummaryList:StripTextures() AuctionHouseFrameAuctionsFrame.ItemDisplay:StripTextures() SkinItemIcon(AuctionHouseFrameAuctionsFrame.ItemDisplay.ItemButton) T.SkinEditBox(AuctionHouseFrameAuctionsFrameGold) T.SkinEditBox(AuctionHouseFrameAuctionsFrameSilver) AuctionHouseFrame.BuyDialog:StripTextures() AuctionHouseFrame.BuyDialog:SetTemplate("Transparent") -- WoW Token AuctionHouseFrame.WoWTokenResults:StripTextures() AuctionHouseFrame.WoWTokenResults.TokenDisplay:StripTextures() SkinItemIcon(AuctionHouseFrame.WoWTokenResults.TokenDisplay.ItemButton, true) local TokenTutorial = AuctionHouseFrame.WoWTokenResults.GameTimeTutorial TokenTutorial.NineSlice:Hide() TokenTutorial:CreateBackdrop("Transparent") T.SkinCloseButton(TokenTutorial.CloseButton) TokenTutorial.Bg:SetAlpha(0) -- Auctionator skin (from AddOnSkins) if IsAddOnLoaded("Auctionator") then C_Timer.After(0.05, function() local list = _G.AuctionatorShoppingFrame if not list then return end local config = _G.AuctionatorConfigFrame local selling = _G.AuctionatorSellingFrame local cancelling = _G.AuctionatorCancellingFrame T.SkinTab(AuctionatorTabs_Shopping) T.SkinTab(AuctionatorTabs_Selling) T.SkinTab(AuctionatorTabs_Cancelling) T.SkinTab(AuctionatorTabs_Auctionator) local frames = { list.ScrollListRecents, list.ScrollListShoppingList, list.ShoppingResultsInset, selling.CurrentItemInset, selling.HistoricalPriceInset, selling.BagInset, selling.BagListing.ScrollFrame, cancelling.HistoricalPriceInset, AuctionatorConfigFrame } for i = 1, #frames do if frames[i] then frames[i]:StripTextures() end end local buttons = { list.AddItem, list.ManualSearch, list.SortItems, list.Export, list.Import, list.ExportCSV, list.OneItemSearch.SearchButton, list.OneItemSearch.ExtendedButton, selling.SaleItemFrame.MaxButton, selling.SaleItemFrame.PostButton, config.OptionsButton, config.ScanButton } for i = 1, #buttons do if buttons[i] then buttons[i]:SkinButton() end end list.ManualSearch:SetPoint("TOPRIGHT", list.ScrollListShoppingList, "BOTTOMRIGHT", -7, -4) local scrollbars = { list.ScrollListShoppingList.ScrollBar, list.ScrollListRecents.ScrollBar, list.ResultsListing.ScrollArea.ScrollBar, selling.CurrentPricesListing.ScrollArea.ScrollBar, selling.HistoricalPriceListing.ScrollArea.ScrollBar, selling.BagListing.ScrollBar, selling.ResultsListing.ScrollArea.ScrollBar, cancelling.ResultsListing.ScrollArea.ScrollBar } for i = 1, #scrollbars do T.SkinScrollBar(scrollbars[i]) end local editboxes = { selling.SaleItemFrame.Price.MoneyInput.GoldBox, selling.SaleItemFrame.Price.MoneyInput.SilverBox, selling.SaleItemFrame.Price.MoneyInput.CopperBox } for i = 1, #editboxes do editboxes[i]:DisableDrawLayer("BACKGROUND") editboxes[i]:CreateBackdrop("Overlay") editboxes[i].backdrop:SetPoint("TOPLEFT", 6, -2) editboxes[i].backdrop:SetPoint("BOTTOMRIGHT", -22, 6) end local editboxes = { list.OneItemSearch.SearchBox, selling.SaleItemFrame.Quantity.InputBox, config.DiscordLink.InputBox, config.BugReportLink.InputBox, cancelling.SearchFilter } for i = 1, #editboxes do T.SkinEditBox(editboxes[i]) end selling.SaleItemFrame.Quantity.InputBox.backdrop:SetPoint("TOPLEFT", 2, 4) selling.SaleItemFrame.Quantity.InputBox.backdrop:SetPoint("BOTTOMRIGHT", -2, 2) local function SkinHeaders(frame) local maxHeaders = frame:GetNumChildren() for i = 1, maxHeaders do local header = select(i, frame:GetChildren()) if header and not header.IsSkinned then header:DisableDrawLayer("BACKGROUND") header:GetHighlightTexture():Hide() header:CreateBackdrop("Overlay") header.backdrop:SetPoint("TOPLEFT", 2, 0) header.backdrop:SetPoint("BOTTOMRIGHT", -2, 0) header.IsSkinned = true end end end local headers = { list.ResultsListing.HeaderContainer, cancelling.ResultsListing.HeaderContainer, selling.CurrentPricesListing.HeaderContainer, selling.HistoricalPriceListing.HeaderContainer, selling.ResultsListing.HeaderContainer } for i = 1, #headers do SkinHeaders(headers[i]) end T.SkinDropDownBox(list.ListDropdown, 230) list.OneItemSearch.SearchButton:SetPoint("TOPLEFT", list.OneItemSearch.SearchBox, "TOPRIGHT", 5, 1) local tabs = { list.RecentsTabsContainer.ListTab, list.RecentsTabsContainer.RecentsTab, selling.PricesTabsContainer.CurrentPricesTab, selling.PricesTabsContainer.PriceHistoryTab, selling.PricesTabsContainer.YourHistoryTab, } for i = 1, #tabs do local tab = tabs[i] tab:DisableDrawLayer("BACKGROUND") tab:StripTextures() tab.backdrop = CreateFrame("Frame", nil, tab) tab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1) tab.backdrop:SetTemplate("Overlay") if i > 2 then tab.backdrop:SetPoint("TOPLEFT", 8, -3) tab.backdrop:SetPoint("BOTTOMRIGHT", -8, 3) else tab.backdrop:SetPoint("TOPLEFT", 5, -7) tab.backdrop:SetPoint("BOTTOMRIGHT", -5, -3) end end AuctionatorSellingFrame.AuctionatorSaleItem.Icon.Icon:SkinIcon(true) AuctionatorSellingFrame.AuctionatorSaleItem.Icon.EmptySlot:Hide() for _, duration in ipairs(selling.AuctionatorSaleItem.Duration.radioButtons) do if duration.RadioButton then T.SkinCheckBox(duration.RadioButton) end end for _, child in ipairs({cancelling:GetChildren()}) do if child.StartScanButton then child.StartScanButton:SkinButton() child.CancelNextButton:SkinButton() child.StartScanButton:SetPoint("TOPRIGHT", child.CancelNextButton, "TOPLEFT", -2, 0) end end end) local frame = CreateFrame("Frame") frame:RegisterEvent("TRADE_SKILL_SHOW") frame:SetScript("OnEvent", function(_, event) AuctionatorCraftingInfoProfessionsFrame.SearchButton:SkinButton() end) end end T.SkinFuncs["Blizzard_AuctionHouseUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Azerite.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- AzeriteUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() AzeriteEmpoweredItemUI:StripTextures() AzeriteEmpoweredItemUI:SetTemplate("Transparent") AzeriteEmpoweredItemUI.BorderFrame:StripTextures() AzeriteEmpoweredItemUIPortrait:Hide() AzeriteEmpoweredItemUI.ClipFrame.BackgroundFrame.Bg:Hide() T.SkinCloseButton(AzeriteEmpoweredItemUICloseButton) end T.SkinFuncs["Blizzard_AzeriteUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/AzeriteEssence.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- AzeriteEssenceUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() AzeriteEssenceUI:StripTextures() AzeriteEssenceUI:SetTemplate("Transparent") AzeriteEssenceUIPortrait:SetAlpha(0) AzeriteEssenceUI.PowerLevelBadgeFrame:ClearAllPoints() AzeriteEssenceUI.PowerLevelBadgeFrame:SetPoint("TOPLEFT") AzeriteEssenceUI.PowerLevelBadgeFrame.Ring:Hide() AzeriteEssenceUI.PowerLevelBadgeFrame.BackgroundBlack:Hide() for _, button in pairs(AzeriteEssenceUI.EssenceList.buttons) do button:DisableDrawLayer("ARTWORK") button:StyleButton(nil, 3) button.Icon:SkinIcon() button.Icon:SetSize(27, 27) button.Icon:SetPoint("LEFT", button, "LEFT", 6, 0) button.bg = CreateFrame("Frame", nil, button) button.bg:CreateBackdrop("Overlay") button.bg:SetFrameLevel(button:GetFrameLevel() - 1) button.bg:SetPoint("TOPLEFT", 3, -3) button.bg:SetPoint("BOTTOMRIGHT", -3, 3) end local HeaderButton = AzeriteEssenceUI.EssenceList.HeaderButton HeaderButton.Middle:Hide() HeaderButton.Left:Hide() HeaderButton.Right:Hide() T.SkinScrollBar(AzeriteEssenceUI.EssenceList.ScrollBar) T.SkinCloseButton(AzeriteEssenceUICloseButton) end T.SkinFuncs["Blizzard_AzeriteEssenceUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/AzeriteRespec.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- AzeriteRespecUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() AzeriteRespecFrame:StripTextures() AzeriteRespecFrame:SetTemplate("Transparent") local ItemSlots = AzeriteRespecFrame.ItemSlot ItemSlots:StripTextures() ItemSlots.Icon:SkinIcon() hooksecurefunc(ItemSlots.GlowOverlay, "Show", function() ItemSlots.backdrop:SetBackdropBorderColor(0.64, 0.2, 0.93) end) hooksecurefunc(ItemSlots.GlowOverlay, "Hide", function() ItemSlots.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end) AzeriteRespecFrame.ButtonFrame.MoneyFrameEdge:StripTextures() AzeriteRespecFrameMoneyFrame:SetPoint("BOTTOMRIGHT", -155, 9) AzeriteRespecFrame.ButtonFrame:StripTextures() AzeriteRespecFrame.ButtonFrame.AzeriteRespecButton:SkinButton() AzeriteRespecFrame.ButtonFrame.AzeriteRespecButton:SetPoint("BOTTOMRIGHT", -4, 5) T.SkinCloseButton(AzeriteRespecFrameCloseButton) end T.SkinFuncs["Blizzard_AzeriteRespecUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/BarberShop.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- BarbershopUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() local buttons = { BarberShopFrame.AcceptButton, BarberShopFrame.CancelButton, BarberShopFrame.ResetButton } for i = 1, #buttons do local button = buttons[i] button:SkinButton(true) button:SetScale(UIParent:GetScale()) end local smallButtons = { CharCustomizeFrame.SmallButtons.ResetCameraButton, CharCustomizeFrame.SmallButtons.ZoomOutButton, CharCustomizeFrame.SmallButtons.ZoomInButton, CharCustomizeFrame.SmallButtons.RotateLeftButton, CharCustomizeFrame.SmallButtons.RotateRightButton, } for i = 1, #smallButtons do local button = smallButtons[i] button:SetNormalTexture(0) button:SetPushedTexture(0) button:SetHighlightTexture(0) end end T.SkinFuncs["Blizzard_BarbershopUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Binding.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Binding skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = ClickBindingFrame T.SkinFrame(frame) frame.TutorialButton.Ring:Hide() frame.TutorialButton:SetPoint("TOPLEFT", frame, "TOPLEFT", -12, 12) T.SkinScrollBar(ClickBindingFrame.ScrollBar) T.SkinCheckBox(frame.EnableMouseoverCastCheckbox) T.SkinDropDownBox(frame.MouseoverCastKeyDropDown) ClickBindingFrame.MacrosPortrait:SetPoint("TOPRIGHT", -40, -60) local function updateNewGlow(self) if self.NewOutline:IsShown() then self.backdrop:SetBackdropBorderColor(0, 0.8, 0) else self.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end local function HandleScrollChild(self) for i = 1, self.ScrollTarget:GetNumChildren() do local button = select(i, self.ScrollTarget:GetChildren()) local icon = button and button.Icon if icon and not icon.IsSkinned then button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", -4, 0) button.backdrop:SetPoint("BOTTOMRIGHT", 2, 0) icon:SkinIcon(true) icon:SetSize(32, 32) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", button, "TOPLEFT", 3, -7) button.Background:Hide() button.DeleteButton:SkinButton() button.DeleteButton:SetSize(20, 20) button.FrameHighlight:SetInside(button.backdrop) button.FrameHighlight:SetColorTexture(1, 1, 1, 0.3) button.NewOutline:SetTexture("") hooksecurefunc(button, "Init", updateNewGlow) icon.IsSkinned = true end end end hooksecurefunc(frame.ScrollBox, "Update", HandleScrollChild) frame.ScrollBar:StripTextures() frame.ScrollBar.Background:Hide() frame.ScrollBoxBackground:Hide() local buttons = { "ResetButton", "AddBindingButton", "SaveButton" } for _, v in pairs(buttons) do frame[v]:SkinButton(true) end local tutorial = frame.TutorialFrame tutorial.NineSlice:StripTextures() tutorial:CreateBackdrop("Transparent") tutorial.backdrop:SetInside() end T.SkinFuncs["Blizzard_ClickBindingUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/BlackMarket.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- BlackMarket skin ---------------------------------------------------------------------------------------- local function LoadSkin() BlackMarketFrame:StripTextures() BlackMarketFrame:SetTemplate("Transparent") BlackMarketFrame.Inset:CreateBackdrop("Overlay") BlackMarketFrame.Inset.backdrop:SetPoint("TOPLEFT", 0, 0) BlackMarketFrame.Inset.backdrop:SetPoint("BOTTOMRIGHT", 1, 4) T.SkinScrollBar(BlackMarketFrame.ScrollBar) BlackMarketFrame.MoneyFrameBorder:StripTextures() T.SkinEditBox(BlackMarketBidPriceGold, nil, 18) BlackMarketFrame.BidButton:SkinButton() BlackMarketFrame.BidButton:SetHeight(20) BlackMarketFrame.BidButton:SetPoint("BOTTOMRIGHT", -255, 4) BlackMarketBidPrice:SetPoint("BOTTOMRIGHT", BlackMarketFrame.BidButton, "BOTTOMLEFT", 0, -2) BlackMarketFrame.HotDeal:StripTextures() BlackMarketFrame.HotDeal:CreateBackdrop("Overlay") BlackMarketFrame.HotDeal.Item.IconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) BlackMarketFrame.HotDeal.Item.IconBorder:SetAlpha(0) BlackMarketFrame.HotDeal.Item:CreateBackdrop("Default") BlackMarketFrame.HotDeal.Item:StyleButton() BlackMarketFrame.HotDeal.Item.hover:SetAllPoints() BlackMarketFrame.HotDeal.Item.pushed:SetAllPoints() T.SkinCloseButton(BlackMarketFrame.CloseButton) local tabs = {"ColumnName", "ColumnLevel", "ColumnType", "ColumnDuration", "ColumnHighBidder", "ColumnCurrentBid"} for _, tab in pairs(tabs) do local tab = BlackMarketFrame[tab] tab:StripTextures() end hooksecurefunc(BlackMarketItemMixin, "Init", function (button, elementData) if not button.skinned then button:StripTextures() button.Item:StripTextures() button.Item:StyleButton() button.Item:SetTemplate("Default") button.Item.IconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.Item.IconTexture:ClearAllPoints() button.Item.IconTexture:SetPoint("TOPLEFT", 2, -2) button.Item.IconTexture:SetPoint("BOTTOMRIGHT", -2, 2) button.Item.IconBorder:SetAlpha(0) button:SetHighlightTexture(C.media.texture) button:GetHighlightTexture():SetVertexColor(0.243, 0.570, 1, 0.2) button.skinned = true end local name, texture = C_BlackMarket.GetItemInfoByIndex(elementData.index) if name then button.Item.IconTexture:SetTexture(texture) end end) end T.SkinFuncs["Blizzard_BlackMarketUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/BonusRoll.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- BonusRoll skin ---------------------------------------------------------------------------------------- local function LoadSkin() -- /run BonusRollFrame_StartBonusRoll(242969,"test",40,515,79,14) BonusRollFrame:StripTextures() BonusRollFrame:CreateBackdrop("Transparent") BonusRollFrame.backdrop:SetFrameLevel(0) BonusRollFrame.backdrop:SetPoint("TOPLEFT", BonusRollFrame, "TOPLEFT", -9, 6) BonusRollFrame.backdrop:SetPoint("BOTTOMRIGHT", BonusRollFrame, "BOTTOMRIGHT", 5, -6) BonusRollFrame.PromptFrame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) BonusRollFrame.PromptFrame.Icon:SetSize(50, 50) BonusRollFrame.PromptFrame.Icon:ClearAllPoints() BonusRollFrame.PromptFrame.Icon:SetPoint("LEFT", BonusRollFrame, 0, 6) BonusRollFrame.PromptFrame.IconBackdrop = CreateFrame("Frame", nil, BonusRollFrame.PromptFrame) BonusRollFrame.PromptFrame.IconBackdrop:SetTemplate("Default") BonusRollFrame.PromptFrame.IconBackdrop:SetFrameLevel(BonusRollFrame.PromptFrame.IconBackdrop:GetFrameLevel() - 1) BonusRollFrame.PromptFrame.IconBackdrop:SetPoint("TOPLEFT", BonusRollFrame.PromptFrame.Icon, -2, 2) BonusRollFrame.PromptFrame.IconBackdrop:SetPoint("BOTTOMRIGHT", BonusRollFrame.PromptFrame.Icon, 2, -2) BonusRollFrame.PromptFrame.Timer:CreateBackdrop("Default") BonusRollFrame.PromptFrame.Timer:SetStatusBarTexture(C.media.texture) BonusRollFrame.PromptFrame.Timer:SetPoint("BOTTOMLEFT", BonusRollFrame.PromptFrame, "BOTTOMLEFT", 0, 1) BonusRollFrame.SpecRing:SetTexture("") BonusRollFrame.SpecIcon:SetPoint("TOPLEFT", BonusRollFrame, "TOPLEFT", 0, -3) BonusRollFrame.SpecIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) -- BonusRollFrame.SpecIcon:SetTexture("Interface\\Icons\\spell_nature_brilliance") BonusRollFrame.SpecIcon.b = CreateFrame("Frame", nil, BonusRollFrame) BonusRollFrame.SpecIcon.b:SetFrameLevel(6) BonusRollFrame.SpecIcon.b:SetTemplate("Default") BonusRollFrame.SpecIcon.b:SetPoint("TOPLEFT", BonusRollFrame.SpecIcon, "TOPLEFT", -2, 2) BonusRollFrame.SpecIcon.b:SetPoint("BOTTOMRIGHT", BonusRollFrame.SpecIcon, "BOTTOMRIGHT", 2, -2) BonusRollFrame.SpecIcon:SetParent(BonusRollFrame.SpecIcon.b) hooksecurefunc(BonusRollFrame.SpecIcon, "Hide", function(specIcon) if specIcon.b and specIcon.b:IsShown() then specIcon.b:Hide() end end) hooksecurefunc(BonusRollFrame.SpecIcon, "Show", function(specIcon) if specIcon.b and not specIcon.b:IsShown() and specIcon:GetTexture() ~= nil then specIcon.b:Show() end end) -- Skin currency icons hooksecurefunc("BonusRollFrame_StartBonusRoll", function() local ccf, pfifc = BonusRollFrame.CurrentCountFrame.Text, BonusRollFrame.PromptFrame.InfoFrame.Cost local text1, text2 = ccf and ccf:GetText(), pfifc and pfifc:GetText() if text1 and text1:find("|t") then ccf:SetText(text1:gsub("|T(.-):.-|t", "|T%1:16:16:0:0:64:64:5:59:5:59|t")) end if text2 and text2:find("|t") then pfifc:SetText(text2:gsub("|T(.-):.-|t", "|T%1:16:16:0:0:64:64:5:59:5:59|t")) end end) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Bubbles.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.bubbles ~= true then return end ---------------------------------------------------------------------------------------- -- ChatBubbles skin ---------------------------------------------------------------------------------------- local function styleBubble(bubble) if bubble:IsForbidden() then return end local frame = bubble:GetChildren(1) frame:DisableDrawLayer("BORDER") frame.Tail:Hide() frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", 2, -2) frame.backdrop:SetPoint("BOTTOMRIGHT", -2, 2) frame.backdrop:SetScale(UIParent:GetScale()) bubble:SetClampedToScreen(false) bubble:SetFrameStrata("BACKGROUND") bubble.styled = true end local function onUpdate(self, elapsed) self.elapsed = (self.elapsed or 0) + elapsed if self.elapsed < 0.1 then return end self.elapsed = 0 for _, bubble in pairs(C_ChatBubbles.GetAllChatBubbles()) do if not bubble.styled then styleBubble(bubble) end end end local f = CreateFrame("Frame") f:RegisterEvent("PLAYER_ENTERING_WORLD") f:SetScript("OnEvent", function() local _, instanceType = IsInInstance() if instanceType == "party" or instanceType == "raid" then f:SetScript("OnUpdate", nil) else f:SetScript("OnUpdate", onUpdate) end end) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Calendar.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Calendar skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frames = { CalendarFrame, CalendarCreateEventFrame, CalendarCreateEventFrame.Header, CalendarCreateEventInviteList, CalendarCreateEventDescriptionContainer, CalendarCreateEventInviteListSection, CalendarTexturePickerFrame, CalendarTexturePickerFrame.Header, CalendarMassInviteFrame, CalendarMassInviteFrame.Header, CalendarViewRaidFrame, CalendarViewRaidFrame.Header, CalendarViewHolidayFrame.Header, CalendarViewEventFrame, CalendarViewEventFrame.Header, CalendarViewEventDescriptionContainer, CalendarViewEventInviteList, CalendarViewEventInviteListSection, CalendarEventPickerFrame, CalendarEventPickerFrame.Header } for _, frame in pairs(frames) do frame:StripTextures() end CalendarFrame:CreateBackdrop("Transparent") CalendarFrame.backdrop:SetPoint("TOPLEFT", 0, 0) CalendarFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, -5) T.SkinCloseButton(CalendarCloseButton) T.SkinNextPrevButton(CalendarPrevMonthButton) T.SkinNextPrevButton(CalendarNextMonthButton) -- Dropdown button do local frame = CalendarFilterFrame local button = CalendarFilterButton frame:StripTextures() frame:SetWidth(155) _G[frame:GetName().."Text"]:ClearAllPoints() _G[frame:GetName().."Text"]:SetPoint("RIGHT", button, "LEFT", -2, 0) button:ClearAllPoints() button:SetPoint("RIGHT", frame, "RIGHT", -10, 3) button.SetPoint = T.dummy T.SkinNextPrevButton(button) frame:CreateBackdrop("Default") frame.backdrop:SetPoint("TOPLEFT", 20, 2) frame.backdrop:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", 2, -2) end -- Backdrop local bg = CreateFrame("Frame", "CalendarFrameBackdrop", CalendarFrame) bg:SetTemplate("Default") bg:SetPoint("TOPLEFT", 10, -72) bg:SetPoint("BOTTOMRIGHT", -8, 3) CalendarContextMenu.NineSlice:SetTemplate("Transparent") CalendarInviteStatusContextMenu.NineSlice:SetTemplate("Transparent") -- Boost frame levels for i = 1, 42 do _G["CalendarDayButton"..i]:SetFrameLevel(_G["CalendarDayButton"..i]:GetFrameLevel() + 1) end -- CreateEventFrame CalendarCreateEventFrame:SetTemplate("Transparent") CalendarCreateEventFrame:SetPoint("TOPLEFT", CalendarFrame, "TOPRIGHT", 3, 0) CalendarCreateEventCreateButton:SkinButton(true) CalendarCreateEventMassInviteButton:SkinButton(true) CalendarCreateEventInviteButton:SkinButton(true) CalendarCreateEventInviteButton:SetPoint("TOPLEFT", CalendarCreateEventInviteEdit, "TOPRIGHT", 4, 2) CalendarCreateEventInviteEdit:SetPoint("TOPLEFT", CalendarCreateEventInviteList, "BOTTOMLEFT", 2, -3) CalendarCreateEventInviteList:SetTemplate("Overlay") T.SkinEditBox(CalendarCreateEventInviteEdit, CalendarCreateEventInviteEdit:GetWidth() - 2, CalendarCreateEventInviteEdit:GetHeight() - 2) T.SkinEditBox(CalendarCreateEventTitleEdit) CalendarCreateEventTitleEdit.backdrop:SetPoint("TOPLEFT", -3, 1) CalendarCreateEventTitleEdit.backdrop:SetPoint("BOTTOMRIGHT", -3, -1) T.SkinDropDownBox(CalendarCreateEventTypeDropDown, 120) CalendarCreateEventDescriptionContainer:SetTemplate("Overlay") T.SkinCloseButton(CalendarCreateEventCloseButton) T.SkinCheckBox(CalendarCreateEventLockEventCheck) T.SkinDropDownBox(CalendarCreateEventHourDropDown, 68) T.SkinDropDownBox(CalendarCreateEventMinuteDropDown, 68) T.SkinDropDownBox(CalendarCreateEventAMPMDropDown, 68) T.SkinDropDownBox(CalendarCreateEventDifficultyOptionDropDown) CalendarCreateEventIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) CalendarCreateEventIcon.SetTexCoord = T.dummy CalendarClassButtonContainer:HookScript("OnShow", function() for i, class in ipairs(CLASS_SORT_ORDER) do local button = _G["CalendarClassButton"..i] button:StripTextures() button:CreateBackdrop("Default") local tcoords = CLASS_ICON_TCOORDS[class] local buttonIcon = button:GetNormalTexture() buttonIcon:SetTexture("Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes") buttonIcon:SetTexCoord(tcoords[1] + 0.015, tcoords[2] - 0.02, tcoords[3] + 0.018, tcoords[4] - 0.02) end CalendarClassButton1:SetPoint("TOPLEFT", CalendarClassButtonContainer, "TOPLEFT", 5, 0) CalendarClassTotalsButton:StripTextures() CalendarClassTotalsButton:CreateBackdrop("Default") end) -- Texture Picker Frame CalendarTexturePickerFrame:SetTemplate("Transparent") T.SkinScrollBar(CalendarTexturePickerFrame.ScrollBar) CalendarTexturePickerAcceptButton:SkinButton(true) CalendarTexturePickerCancelButton:SkinButton(true) CalendarCreateEventRaidInviteButton:SkinButton(true) -- Mass Invite Frame CalendarMassInviteFrame:CreateBackdrop("Overlay") T.SkinDropDownBox(CalendarMassInviteCommunityDropDown, 190) T.SkinDropDownBox(CalendarMassInviteRankMenu) T.SkinEditBox(CalendarMassInviteMinLevelEdit) T.SkinEditBox(CalendarMassInviteMaxLevelEdit) CalendarMassInviteAcceptButton:SkinButton() T.SkinCloseButton(CalendarMassInviteCloseButton) T.SkinDropDownBox(CalendarCreateEventCommunityDropDown, 240) -- Raid View CalendarViewRaidFrame:SetTemplate("Transparent") CalendarViewRaidFrame:SetPoint("TOPLEFT", CalendarFrame, "TOPRIGHT", 3, 0) T.SkinCloseButton(CalendarViewRaidCloseButton) -- Holiday View CalendarViewHolidayFrame:StripTextures(true) CalendarViewHolidayFrame:SetTemplate("Transparent") CalendarViewHolidayFrame:SetPoint("TOPLEFT", CalendarFrame, "TOPRIGHT", 3, 0) T.SkinCloseButton(CalendarViewHolidayCloseButton) -- Event View CalendarViewEventFrame:SetTemplate("Transparent") CalendarViewEventFrame:SetPoint("TOPLEFT", CalendarFrame, "TOPRIGHT", 3, 0) CalendarViewEventDescriptionContainer:SetTemplate("Overlay") CalendarViewEventInviteList:SetTemplate("Overlay") T.SkinCloseButton(CalendarViewEventCloseButton) CalendarEventPickerFrame:SetTemplate("Transparent") CalendarEventPickerCloseButton:SkinButton(true) local buttons = { "CalendarViewEventAcceptButton", "CalendarViewEventTentativeButton", "CalendarViewEventRemoveButton", "CalendarViewEventDeclineButton" } for _, button in pairs(buttons) do _G[button]:SkinButton() end end T.SkinFuncs["Blizzard_Calendar"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Channels.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Channels skin ---------------------------------------------------------------------------------------- local function LoadSkin() ChannelFrame:StripTextures() ChannelFrame:CreateBackdrop("Transparent") ChannelFrame.NewButton:SkinButton() ChannelFrame.SettingsButton:SkinButton() T.SkinScrollBar(ChannelFrame.ChannelRoster.ScrollBar) T.SkinScrollBar(ChannelFrame.ChannelList.ScrollBar) T.SkinCloseButton(ChannelFrameCloseButton) CreateChannelPopup:StripTextures() CreateChannelPopup:CreateBackdrop("Transparent") CreateChannelPopup.OKButton:SkinButton() CreateChannelPopup.CancelButton:SkinButton() CreateChannelPopup.OKButton:SetPoint("BOTTOMLEFT", 5, 5) CreateChannelPopup.CancelButton:ClearAllPoints() CreateChannelPopup.CancelButton:SetPoint("BOTTOMRIGHT", -5, 5) CreateChannelPopup.Name.Label:SetDrawLayer("OVERLAY") CreateChannelPopup.Password.Label:SetDrawLayer("OVERLAY") T.SkinEditBox(CreateChannelPopup.Name) T.SkinEditBox(CreateChannelPopup.Password) T.SkinCloseButton(CreateChannelPopup.CloseButton) VoiceChatPromptActivateChannel:StripTextures() VoiceChatPromptActivateChannel:CreateBackdrop("Transparent") VoiceChatPromptActivateChannel.AcceptButton:SkinButton() T.SkinCloseButton(VoiceChatPromptActivateChannel.CloseButton) hooksecurefunc(ChannelButtonHeaderMixin, "Update", function(self) if not self.skin then self:SkinButton() self.skin = true end end) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Character.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Character skin ---------------------------------------------------------------------------------------- local function LoadSkin() T.SkinCloseButton(CharacterFrameCloseButton) -- Azerite Items local function UpdateAzeriteItem(self) if not self.styled then self.AzeriteTexture:SetAlpha(0) self.RankFrame.Texture:SetTexture("") self.RankFrame.Label:SetFontObject("SystemFont_Outline_Small") self.RankFrame.Label:SetShadowOffset(0, 0) self.RankFrame.Label:SetPoint("CENTER", self.RankFrame.Texture, 0, 2) self.styled = true end self:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3) self:GetHighlightTexture():SetPoint("TOPLEFT", 2, -2) self:GetHighlightTexture():SetPoint("BOTTOMRIGHT", -2, 2) end local function UpdateAzeriteEmpoweredItem(self) self.AzeriteTexture:SetAtlas("AzeriteIconFrame") self.AzeriteTexture:SetTexCoord(0.05, 0.95, 0.05, 0.95) self.AzeriteTexture:SetPoint("TOPLEFT", 2, -2) self.AzeriteTexture:SetPoint("BOTTOMRIGHT", -2, 2) self.AzeriteTexture:SetDrawLayer("BORDER", 1) end local slots = { "HeadSlot", "NeckSlot", "ShoulderSlot", "BackSlot", "ChestSlot", "ShirtSlot", "TabardSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "Finger0Slot", "Finger1Slot", "Trinket0Slot", "Trinket1Slot", "MainHandSlot", "SecondaryHandSlot" } select(16, CharacterMainHandSlot:GetRegions()):Hide() select(16, CharacterSecondaryHandSlot:GetRegions()):Hide() for _, i in pairs(slots) do _G["Character"..i.."Frame"]:Hide() local icon = _G["Character"..i.."IconTexture"] local slot = _G["Character"..i] local border = _G["Character"..i].IconBorder border:SetAlpha(0) slot:StyleButton() slot:SetNormalTexture(0) slot.SetHighlightTexture = T.dummy slot:GetHighlightTexture().SetAllPoints = T.dummy slot:SetFrameLevel(slot:GetFrameLevel() + 2) slot:SetTemplate("Default") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) if slot.popoutButton:GetPoint() == "TOP" then slot.popoutButton:SetPoint("TOP", slot, "BOTTOM", 0, 2) else slot.popoutButton:SetPoint("LEFT", slot, "RIGHT", -2, 0) end hooksecurefunc(slot, "DisplayAsAzeriteItem", UpdateAzeriteItem) hooksecurefunc(slot, "DisplayAsAzeriteEmpoweredItem", UpdateAzeriteEmpoweredItem) end -- Strip Textures local charframe = { CharacterFrame, CharacterModelScene, CharacterFrameInset, CharacterStatsPane, CharacterFrameInsetRight, PaperDollSidebarTabs, -- PaperDollEquipmentManagerPane } for i = 1, #charframe do local button = charframe[i] button:StripTextures() end EquipmentFlyoutFrameHighlight:Kill() EquipmentFlyoutFrame.NavigationFrame:StripTextures() EquipmentFlyoutFrame.NavigationFrame.BottomBackground:Hide() EquipmentFlyoutFrame.NavigationFrame:SetTemplate("Transparent") EquipmentFlyoutFrame.NavigationFrame:SetPoint("TOPLEFT", EquipmentFlyoutFrameButtons, "BOTTOMLEFT", 3, -1) EquipmentFlyoutFrame.NavigationFrame:SetPoint("TOPRIGHT", EquipmentFlyoutFrameButtons, "BOTTOMRIGHT", 0, -1) T.SkinNextPrevButton(EquipmentFlyoutFrame.NavigationFrame.PrevButton) T.SkinNextPrevButton(EquipmentFlyoutFrame.NavigationFrame.NextButton) local function SkinItemFlyouts() EquipmentFlyoutFrameButtons:StripTextures() for i = 1, 23 do local button = _G["EquipmentFlyoutFrameButton"..i] local icon = _G["EquipmentFlyoutFrameButton"..i.."IconTexture"] if button then button:StyleButton() button.IconBorder:Hide() icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button:GetNormalTexture():SetTexture(nil) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) button:SetFrameStrata("DIALOG") if not button.backdrop then button:CreateBackdrop("Default") button.backdrop:SetAllPoints() end end end end -- Swap item flyout frame (shown when holding alt over a slot) EquipmentFlyoutFrame:HookScript("OnShow", SkinItemFlyouts) hooksecurefunc("EquipmentFlyout_Show", SkinItemFlyouts) -- Icon in upper right corner of character frame CharacterFrame:SetTemplate("Transparent") CharacterFramePortrait:Kill() CharacterModelFrameBackgroundOverlay:SetColorTexture(0, 0, 0) CharacterModelScene:CreateBackdrop("Default") CharacterModelScene.backdrop:SetPoint("TOPLEFT", -3, 4) CharacterModelScene.backdrop:SetPoint("BOTTOMRIGHT", 4, 0) -- Unit Background Texture CharacterModelFrameBackgroundTopLeft:SetPoint("TOPLEFT", CharacterModelScene.backdrop, "TOPLEFT", 2, -2) CharacterModelFrameBackgroundTopRight:SetPoint("TOPRIGHT", CharacterModelScene.backdrop, "TOPRIGHT", -2, -2) CharacterModelFrameBackgroundBotLeft:SetPoint("BOTTOMLEFT", CharacterModelScene.backdrop, "BOTTOMLEFT", 2, -50) CharacterModelFrameBackgroundBotRight:SetPoint("BOTTOMRIGHT", CharacterModelScene.backdrop, "BOTTOMRIGHT", -2, -50) local scrollbars = { PaperDollFrame.TitleManagerPane.ScrollBar, PaperDollFrame.EquipmentManagerPane.ScrollBar, ReputationFrame.ScrollBar, TokenFrame.ScrollBar } for i = 1, #scrollbars do T.SkinScrollBar(scrollbars[i]) end local function SkinStatsPane(frame) frame:StripTextures() local bg = frame.Background bg:SetTexture(C.media.blank) bg:ClearAllPoints() bg:SetPoint("CENTER", 0, -15) bg:SetSize(165, 1) bg:SetVertexColor(unpack(C.media.border_color)) local border = CreateFrame("Frame", "$parentOuterBorder", frame, "BackdropTemplate") border:SetPoint("TOPLEFT", bg, "TOPLEFT", -T.mult, T.mult) border:SetPoint("BOTTOMRIGHT", bg, "BOTTOMRIGHT", T.mult, -T.mult) border:SetFrameLevel(frame:GetFrameLevel() + 1) border:SetBackdrop({ edgeFile = C.media.blank, edgeSize = T.mult, insets = {left = T.mult, right = T.mult, top = T.mult, bottom = T.mult} }) border:SetBackdropBorderColor(unpack(C.media.backdrop_color)) end CharacterStatsPane.ItemLevelFrame.Value:SetFont(C.media.normal_font, 18, "") CharacterStatsPane.ItemLevelFrame.Value:SetShadowOffset(1, -1) CharacterStatsPane.ItemLevelFrame.Background:Hide() SkinStatsPane(CharacterStatsPane.ItemLevelCategory) SkinStatsPane(CharacterStatsPane.AttributesCategory) SkinStatsPane(CharacterStatsPane.EnhancementsCategory) -- Titles hooksecurefunc(_G.PaperDollFrame.TitleManagerPane.ScrollBox, "Update", function(frame) for _, child in next, {frame.ScrollTarget:GetChildren()} do if not child.isSkinned then child:DisableDrawLayer("BACKGROUND") child.isSkinned = true end end end) -- Equipement Manager PaperDollFrameEquipSet:SkinButton() PaperDollFrameSaveSet:SkinButton() PaperDollFrameEquipSet:SetWidth(PaperDollFrameEquipSet:GetWidth() - 8) PaperDollFrameSaveSet:SetWidth(PaperDollFrameSaveSet:GetWidth() - 8) PaperDollFrameEquipSet:SetPoint("TOPLEFT", PaperDollFrame.EquipmentManagerPane, "TOPLEFT", 8, 0) PaperDollFrameSaveSet:SetPoint("LEFT", PaperDollFrameEquipSet, "RIGHT", 4, 0) hooksecurefunc(_G.PaperDollFrame.EquipmentManagerPane.ScrollBox, "Update", function(frame) for _, child in next, {frame.ScrollTarget:GetChildren()} do if child.icon and not child.isSkinned then child.BgTop:SetTexture(nil) child.BgBottom:SetTexture(nil) child.BgMiddle:SetTexture(nil) child.Check:SetTexture(nil) child.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) if not child.backdrop then child:CreateBackdrop("Default") end child.backdrop:SetPoint("TOPLEFT", child.icon, "TOPLEFT", -2, 2) child.backdrop:SetPoint("BOTTOMRIGHT", child.icon, "BOTTOMRIGHT", 2, -2) child.icon:SetParent(child.backdrop) -- Making all icons the same size and position because otherwise BlizzardUI tries to attach itself to itself when it refreshes child.icon:SetPoint("LEFT", child, "LEFT", 4, 0) child.icon.SetPoint = T.dummy child.icon:SetSize(36, 36) child.icon.SetSize = T.dummy child.isSkinned = true end end end) GearManagerPopupFrame:HookScript("OnShow", function(frame) if not frame.isSkinned then T.SkinIconSelectionFrame(frame) end end) -- Handle Tabs at bottom of character frame for i = 1, 4 do T.SkinTab(_G["CharacterFrameTab"..i]) end -- Buttons used to toggle between equipment manager, titles, and character stats local function FixSidebarTabCoords() for i = 1, #PAPERDOLL_SIDEBARS do local tab = _G["PaperDollSidebarTab"..i] if tab then tab.Highlight:SetColorTexture(1, 1, 1, 0.3) tab.Highlight:SetPoint("TOPLEFT", 3, -4) tab.Highlight:SetPoint("BOTTOMRIGHT", -1, 0) tab.Hider:SetColorTexture(0.4, 0.4, 0.4, 0.4) tab.Hider:SetPoint("TOPLEFT", 3, -4) tab.Hider:SetPoint("BOTTOMRIGHT", -1, 0) tab.TabBg:Kill() if i == 1 then for i = 1, tab:GetNumRegions() do local region = select(i, tab:GetRegions()) region:SetTexCoord(0.16, 0.86, 0.16, 0.86) region.SetTexCoord = T.dummy end end tab:CreateBackdrop("Default") tab.backdrop:SetPoint("TOPLEFT", 1, -2) tab.backdrop:SetPoint("BOTTOMRIGHT", 1, -2) end end end hooksecurefunc("PaperDollFrame_UpdateSidebarTabs", FixSidebarTabCoords) -- Reputation hooksecurefunc(_G.ReputationFrame.ScrollBox, "Update", function(frame) for _, child in next, { frame.ScrollTarget:GetChildren() } do local container = child.Container if container and not container.IsSkinned then container:StripTextures() if container.ExpandOrCollapseButton then T.SkinExpandOrCollapse(container.ExpandOrCollapseButton) end if container.ReputationBar then container.ReputationBar:StripTextures() container.ReputationBar:SetStatusBarTexture(C.media.texture) if not container.ReputationBar.backdrop then container.ReputationBar:CreateBackdrop("Overlay") end end container.IsSkinned = true end end end) ReputationDetailFrame:StripTextures() ReputationDetailFrame:SetTemplate("Transparent") ReputationDetailFrame:SetPoint("TOPLEFT", ReputationFrame, "TOPRIGHT", 3, 0) T.SkinCloseButton(ReputationDetailCloseButton) T.SkinCheckBox(ReputationDetailMainScreenCheckBox) T.SkinCheckBox(ReputationDetailInactiveCheckBox) T.SkinCheckBox(ReputationDetailAtWarCheckBox) ReputationDetailViewRenownButton:SkinButton() -- Currency TokenFramePopup:StripTextures() TokenFramePopup:SetTemplate("Transparent") TokenFramePopup:SetPoint("TOPLEFT", TokenFrame, "TOPRIGHT", 3, 0) if TokenFramePopup.CloseButton then T.SkinCloseButton(TokenFramePopup.CloseButton) end T.SkinCheckBox(TokenFramePopup.InactiveCheckBox) T.SkinCheckBox(TokenFramePopup.BackpackCheckBox) hooksecurefunc(_G.TokenFrame.ScrollBox, "Update", function(frame) for _, child in next, {frame.ScrollTarget:GetChildren()} do if child.Highlight and not child.styled then child.CategoryLeft:SetAlpha(0) child.CategoryRight:SetAlpha(0) child.CategoryMiddle:SetAlpha(0) child.Highlight:Kill() child.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) child.styled = true end end end) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/ChatConfig.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- ChatConfig skin ---------------------------------------------------------------------------------------- local function LoadSkin() ChatConfigFrame:StripTextures() ChatConfigFrame:SetTemplate("Transparent") ChatConfigFrame.Header:StripTextures() ChatConfigFrame.Header:ClearAllPoints() ChatConfigFrame.Header:SetPoint("TOP", ChatConfigFrame, 0, 7) local frames = { "ChatConfigCategoryFrame", "ChatConfigBackgroundFrame", "ChatConfigChatSettingsClassColorLegend", "ChatConfigChatSettingsLeft", "ChatConfigChannelSettingsLeft", "ChatConfigChannelSettingsClassColorLegend", "ChatConfigOtherSettingsCombat", "ChatConfigOtherSettingsSystem", "ChatConfigOtherSettingsCreature", "ChatConfigOtherSettingsPVP", "ChatConfigCombatSettingsFilters", "CombatConfigMessageSourcesDoneBy", "CombatConfigMessageSourcesDoneTo", "CombatConfigColorsUnitColors", "CombatConfigColorsHighlighting", "ChatConfigTextToSpeechChannelSettingsLeft" } for i = 1, getn(frames) do local frame = _G[frames[i]] if frame then frame:StripTextures() frame:SetTemplate("Overlay") end end local colorize = { "CombatConfigColorsColorizeUnitName", "CombatConfigColorsColorizeSpellNames", "CombatConfigColorsColorizeDamageNumber", "CombatConfigColorsColorizeDamageSchool", "CombatConfigColorsColorizeEntireLine" } for i = 1, getn(colorize) do local frame = _G[colorize[i]] if frame then local bg = CreateFrame("Frame", nil, frame) bg:SetPoint("TOPLEFT", 0, 0) bg:SetPoint("BOTTOMRIGHT", 0, 2) bg:SetTemplate("Overlay") end end local buttons = { "ChatConfigFrameDefaultButton", "ChatConfigFrameOkayButton", "ChatConfigFrameCancelButton", "ChatConfigFrameRedockButton", "ChatConfigCombatSettingsFiltersCopyFilterButton", "ChatConfigCombatSettingsFiltersAddFilterButton", "ChatConfigCombatSettingsFiltersDeleteButton", "CombatConfigSettingsSaveButton", "CombatLogDefaultButton" } for i = 1, getn(buttons) do local button = _G[buttons[i]] if button then button:SkinButton() button:ClearAllPoints() end end local checkboxes = { "CombatConfigColorsHighlightingLine", "CombatConfigColorsHighlightingAbility", "CombatConfigColorsHighlightingDamage", "CombatConfigColorsHighlightingSchool", "CombatConfigColorsColorizeUnitNameCheck", "CombatConfigColorsColorizeSpellNamesCheck", "CombatConfigColorsColorizeSpellNamesSchoolColoring", "CombatConfigColorsColorizeDamageNumberCheck", "CombatConfigColorsColorizeDamageNumberSchoolColoring", "CombatConfigColorsColorizeDamageSchoolCheck", "CombatConfigColorsColorizeEntireLineCheck", "CombatConfigFormattingShowTimeStamp", "CombatConfigFormattingShowBraces", "CombatConfigFormattingUnitNames", "CombatConfigFormattingSpellNames", "CombatConfigFormattingItemNames", "CombatConfigFormattingFullText", "CombatConfigSettingsShowQuickButton", "CombatConfigSettingsSolo", "CombatConfigSettingsParty", "CombatConfigSettingsRaid", "CombatConfigColorsColorizeEntireLineBySource", "CombatConfigColorsColorizeEntireLineByTarget" } for i = 1, getn(checkboxes) do T.SkinCheckBox(_G[checkboxes[i]]) end local ReskinColourSwatch = function(f) if f.InnerBorder then f.InnerBorder:SetAlpha(0) f.SwatchBg:SetAlpha(0) end f:CreateBackdrop("Overlay") f:SetFrameLevel(f:GetFrameLevel() + 2) f.backdrop:SetOutside(f.Color, 2, 2) end hooksecurefunc("ChatConfig_CreateCheckboxes", function(frame, checkBoxTable, checkBoxTemplate) if frame.styled then return end local checkBoxNameString = frame:GetName().."CheckBox" if checkBoxTemplate == "ChatConfigCheckBoxTemplate" or checkBoxTemplate == "ChatConfigCheckBoxSmallTemplate" then for index in ipairs(checkBoxTable) do local checkBoxName = checkBoxNameString..index local checkbox = _G[checkBoxName] local bg = CreateFrame("Frame", nil, checkbox) bg:SetPoint("TOPLEFT", 2, -1) bg:SetPoint("BOTTOMRIGHT", -2, 1) bg:SetTemplate("Overlay") T.SkinCheckBox(_G[checkBoxName.."Check"]) end elseif checkBoxTemplate == "ChatConfigCheckBoxWithSwatchTemplate" or checkBoxTemplate == "ChatConfigWideCheckBoxWithSwatchTemplate" or checkBoxTemplate == "MovableChatConfigWideCheckBoxWithSwatchTemplate" then for index in ipairs(checkBoxTable) do local checkBoxName = checkBoxNameString..index local checkbox = _G[checkBoxName] checkbox:StripTextures() local bg = CreateFrame("Frame", nil, checkbox) bg:SetPoint("TOPLEFT", 2, -1) bg:SetPoint("BOTTOMRIGHT", -2, 1) bg:CreateBackdrop("Overlay") bg.backdrop:SetAllPoints(bg) ReskinColourSwatch(_G[checkBoxName.."ColorSwatch"]) T.SkinCheckBox(_G[checkBoxName.."Check"]) end end frame.styled = true end) hooksecurefunc("ChatConfig_CreateColorSwatches", function(frame, swatchTable) if frame.styled then return end local nameString = frame:GetName().."Swatch" for index in ipairs(swatchTable) do local swatchName = nameString..index local swatch = _G[swatchName] -- swatch:SetBackdrop(nil) local bg = CreateFrame("Frame", nil, swatch) bg:SetPoint("TOPLEFT", 0, 0) bg:SetPoint("BOTTOMRIGHT", 0, 0) bg:SetFrameLevel(swatch:GetFrameLevel() - 1) bg:CreateBorder(true) bg.iborder:SetBackdropBorderColor(unpack(C.media.border_color)) local bg2 = CreateFrame("Frame", nil, bg) bg2:SetPoint("TOPLEFT", 1, -1) bg2:SetPoint("BOTTOMRIGHT", -1, 1) bg2:CreateBorder(true, true) ReskinColourSwatch(_G[swatchName.."ColorSwatch"]) end frame.styled = true end) ChatConfigBackgroundFrame:SetScript("OnShow", function() ReskinColourSwatch(CombatConfigColorsColorizeSpellNamesColorSwatch) ReskinColourSwatch(CombatConfigColorsColorizeDamageNumberColorSwatch) for i = 1, 4 do for j = 1, 4 do if _G["CombatConfigMessageTypesLeftCheckBox"..i] and _G["CombatConfigMessageTypesLeftCheckBox"..i.."_"..j] then T.SkinCheckBox(_G["CombatConfigMessageTypesLeftCheckBox"..i]) T.SkinCheckBox(_G["CombatConfigMessageTypesLeftCheckBox"..i.."_"..j]) end end for j = 1, 10 do if _G["CombatConfigMessageTypesRightCheckBox"..i] and _G["CombatConfigMessageTypesRightCheckBox"..i.."_"..j] then T.SkinCheckBox(_G["CombatConfigMessageTypesRightCheckBox"..i]) T.SkinCheckBox(_G["CombatConfigMessageTypesRightCheckBox"..i.."_"..j]) end end T.SkinCheckBox(_G["CombatConfigMessageTypesMiscCheckBox"..i]) end end) for i = 1, #COMBAT_CONFIG_TABS do local tab = _G["CombatConfigTab"..i] if tab then tab:StripTextures() T.SkinTab(tab, true) tab:SetHeight(tab:GetHeight() - 3) tab:ClearAllPoints() if i == 1 then tab:SetPoint("BOTTOMLEFT", _G["ChatConfigBackgroundFrame"], "TOPLEFT", -2, 1) else tab:SetPoint("LEFT", _G["CombatConfigTab"..i-1], "RIGHT", 1, 0) end local text = tab.Text if text then text:SetWidth(text:GetWidth() + 10) end end end T.SkinScrollBar(ChatConfigCombatSettingsFilters.ScrollBar) T.SkinEditBox(_G["CombatConfigSettingsNameEditBox"], nil, _G["CombatConfigSettingsNameEditBox"]:GetHeight() - 2) T.SkinNextPrevButton(_G["ChatConfigMoveFilterUpButton"], nil, "Up") T.SkinNextPrevButton(_G["ChatConfigMoveFilterDownButton"], nil, "Down") _G["ChatConfigFrameDefaultButton"]:SetWidth(125) _G["CombatLogDefaultButton"]:SetWidth(125) _G["ChatConfigMoveFilterUpButton"]:SetPoint("TOPLEFT", _G["ChatConfigCombatSettingsFilters"], "BOTTOMLEFT", 0, -1) _G["ChatConfigMoveFilterDownButton"]:SetPoint("TOPLEFT", _G["ChatConfigMoveFilterUpButton"], "TOPRIGHT", 1, 0) _G["ChatConfigFrameDefaultButton"]:SetPoint("TOP", _G["ChatConfigCategoryFrame"], "BOTTOM", 0, -4) ChatConfigFrameRedockButton:SetPoint("LEFT", ChatConfigFrameDefaultButton, "RIGHT", 3, 0) _G["ChatConfigFrameOkayButton"]:SetPoint("TOPRIGHT", _G["ChatConfigBackgroundFrame"], "BOTTOMRIGHT", 0, -4) _G["CombatLogDefaultButton"]:SetPoint("TOPLEFT", _G["ChatConfigCategoryFrame"], "BOTTOMLEFT", 0, -4) _G["CombatConfigSettingsSaveButton"]:SetPoint("TOPLEFT", _G["CombatConfigSettingsNameEditBox"], "TOPRIGHT", 5, 2) _G["ChatConfigCombatSettingsFiltersDeleteButton"]:SetPoint("TOPRIGHT", _G["ChatConfigCombatSettingsFilters"], "BOTTOMRIGHT", 0, -1) _G["ChatConfigCombatSettingsFiltersCopyFilterButton"]:SetPoint("RIGHT", _G["ChatConfigCombatSettingsFiltersDeleteButton"], "LEFT", -3, 0) _G["ChatConfigCombatSettingsFiltersAddFilterButton"]:SetPoint("RIGHT", _G["ChatConfigCombatSettingsFiltersCopyFilterButton"], "LEFT", -3, 0) ChatConfigFrame.ToggleChatButton:SkinButton() ChatConfigFrame.ToggleChatButton:ClearAllPoints() ChatConfigFrame.ToggleChatButton:SetPoint("LEFT", _G["ChatConfigFrameRedockButton"], "RIGHT", 3, 0) T.SkinCheckBox(TextToSpeechCharacterSpecificButton, 25) hooksecurefunc(ChatConfigFrameChatTabManager, "UpdateWidth", function(self) for tab in self.tabPool:EnumerateActive() do if not tab.IsSkinned then tab:StripTextures() tab.IsSkinned = true end end end) -- TextToSpeech local checkBoxes = { TextToSpeechFramePanelContainer.PlaySoundSeparatingChatLinesCheckButton, TextToSpeechFramePanelContainer.AddCharacterNameToSpeechCheckButton, TextToSpeechFramePanelContainer.PlayActivitySoundWhenNotFocusedCheckButton, TextToSpeechFramePanelContainer.NarrateMyMessagesCheckButton, TextToSpeechFramePanelContainer.UseAlternateVoiceForSystemMessagesCheckButton } for i = 1, #checkBoxes do T.SkinCheckBox(checkBoxes[i]) end TextToSpeechDefaultButton:SkinButton() TextToSpeechFramePlaySampleButton:SkinButton() TextToSpeechFramePlaySampleAlternateButton:SkinButton() T.SkinDropDownBox(TextToSpeechFrameTtsVoiceDropdown) T.SkinDropDownBox(TextToSpeechFrameTtsVoiceAlternateDropdown) T.SkinSlider(TextToSpeechFrameAdjustRateSlider) T.SkinSlider(TextToSpeechFrameAdjustVolumeSlider) hooksecurefunc("TextToSpeechFrame_UpdateMessageCheckboxes", function(frame) local checkBoxTable = frame.checkBoxTable if checkBoxTable then local checkBoxNameString = frame:GetName().."CheckBox" local checkBoxName, checkBox for index in ipairs(checkBoxTable) do checkBoxName = checkBoxNameString..index checkBox = _G[checkBoxName] if checkBox and not checkBox.styled then T.SkinCheckBox(checkBox) checkBox.styled = true end end end end) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/ChromieTime.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Chromie Time skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = ChromieTimeFrame T.SkinCloseButton(frame.CloseButton) frame:StripTextures() frame:SetTemplate("Transparent") frame.Background:Hide() frame.SelectButton:SkinButton() local Title = frame.Title Title:DisableDrawLayer("BACKGROUND") local InfoFrame = frame.CurrentlySelectedExpansionInfoFrame InfoFrame:DisableDrawLayer("BACKGROUND") InfoFrame:CreateBackdrop("Overlay") InfoFrame.backdrop:SetPoint("BOTTOMRIGHT", 2, -10) InfoFrame.Name:SetTextColor(1, .8, 0) InfoFrame.Description:SetTextColor(1, 1, 1) InfoFrame.PortraitBorder:SetAlpha(0) InfoFrame.Portrait:SetTexCoord(0.01022494887526, 0.98977505112474, 0.01968503937008, 0.98031496062992) InfoFrame.ArtBackdrop = CreateFrame("Frame", nil, InfoFrame) InfoFrame.ArtBackdrop:SetFrameLevel(InfoFrame:GetFrameLevel() - 1) InfoFrame.ArtBackdrop:SetPoint("TOPLEFT", InfoFrame.Portrait, -2, 2) InfoFrame.ArtBackdrop:SetPoint("BOTTOMRIGHT", InfoFrame.Portrait, 2, -2) InfoFrame.ArtBackdrop:SetTemplate("Default") hooksecurefunc(ChromieTimeExpansionButtonMixin, "SetupButton", function(self) if not self.ArtBackdrop then self.ArtBackdrop = CreateFrame("Frame", nil, self) self.ArtBackdrop:SetFrameLevel(self:GetFrameLevel() - 1) self.ArtBackdrop:SetPoint("TOPLEFT", self.Background, -2, 2) self.ArtBackdrop:SetPoint("BOTTOMRIGHT", self.Background, 2, -2) self.ArtBackdrop:SetTemplate("Default") self.Background:SetTexCoord(0.01602564102564, 0.97109826589595, 0.02890173410405, 0.97109826589595) self:SetNormalTexture(0) if self.SetHighlightTexture then local highlight = self:CreateTexture() highlight:SetColorTexture(1, 1, 1, 0.3) highlight:SetPoint("TOPLEFT", self.Background, 0, 0) highlight:SetPoint("BOTTOMRIGHT", self.Background, 0, 0) self:SetHighlightTexture(highlight) end end end) hooksecurefunc(ChromieTimeExpansionButtonMixin, "OnClick", function(self) self:SetNormalTexture(0) self.ArtBackdrop:SetBackdropBorderColor(1, 1, 0) end) hooksecurefunc(ChromieTimeExpansionButtonMixin, "ClearSelection", function(self) self:SetNormalTexture(0) self.ArtBackdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end) end T.SkinFuncs["Blizzard_ChromieTimeUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Collections.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Collections skin ---------------------------------------------------------------------------------------- local LoadTootlipSkin = CreateFrame("Frame") LoadTootlipSkin:RegisterEvent("ADDON_LOADED") LoadTootlipSkin:SetScript("OnEvent", function(self, _, addon) if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") or not C.tooltip.enable then self:UnregisterEvent("ADDON_LOADED") return end if addon == "Blizzard_Collections" then local tt = PetJournalPrimaryAbilityTooltip tt.NineSlice:SetTemplate("Transparent") end end) if C.skins.blizzard_frames ~= true then return end local function LoadSkin() CollectionsJournal:StripTextures() CollectionsJournal:SetTemplate("Transparent") CollectionsJournalPortrait:SetAlpha(0) for i = 1, 5 do T.SkinTab(_G["CollectionsJournalTab"..i]) end local buttons = { MountJournalMountButton, PetJournalSummonButton, PetJournalFindBattle, PetJournalFilterButton, MountJournalFilterButton, HeirloomsJournal.FilterButton, ToyBoxFilterButton, WardrobeCollectionFrame.FilterButton } for i = 1, #buttons do buttons[i]:SkinButton() end for i = 1, 3 do T.SkinTab(_G["PetJournalParentTab"..i]) end T.SkinCloseButton(CollectionsJournalCloseButton) local function StyleItemButton(frame) frame:CreateBackdrop("Default") frame.backdrop:SetAllPoints() frame:StyleButton() _G[frame:GetName().."Border"]:Hide() frame.texture:SetTexCoord(0.1, 0.9, 0.1, 0.9) frame.texture:ClearAllPoints() frame.texture:SetPoint("TOPLEFT", 2, -2) frame.texture:SetPoint("BOTTOMRIGHT", -2, 2) end -- MountJournal MountJournal.LeftInset:StripTextures() MountJournal.RightInset:StripTextures() MountJournal.MountDisplay:StripTextures() MountJournal.MountDisplay.ShadowOverlay:StripTextures() MountJournal.MountCount:StripTextures() MountJournal.MountDisplay:SetPoint("BOTTOMRIGHT", MountJournal.RightInset, "BOTTOMRIGHT", -3, 6) MountJournal.MountDisplay:CreateBackdrop("Overlay") MountJournal.MountDisplay.backdrop:SetPoint("TOPLEFT", 2, -2) MountJournal.MountDisplay.backdrop:SetPoint("BOTTOMRIGHT", 1, -2) T.SkinEditBox(MountJournalSearchBox, nil, 18) T.SkinScrollBar(MountJournal.ScrollBar) T.SkinRotateButton(MountJournal.MountDisplay.ModelScene.RotateLeftButton) T.SkinRotateButton(MountJournal.MountDisplay.ModelScene.RotateRightButton) MountJournal.ScrollBar:SetPoint("TOPLEFT", MountJournal.ScrollBox, "TOPRIGHT", 1, 35) MountJournal.ScrollBar:SetPoint("BOTTOMLEFT", MountJournal.ScrollBox, "BOTTOMRIGHT", 1, 0) MountJournalFilterButton:SetPoint("TOPLEFT", MountJournalSearchBox, "TOPRIGHT", 5, 2) T.SkinCloseButton(_G.MountJournalFilterButton.ResetButton) _G.MountJournalFilterButton.ResetButton:ClearAllPoints() _G.MountJournalFilterButton.ResetButton:SetPoint("CENTER", _G.MountJournalFilterButton, "TOPRIGHT", 0, 0) -- New Mount Equip. 8.2 MountJournal.BottomLeftInset:StripTextures() MountJournal.BottomLeftInset:CreateBackdrop("Overlay") MountJournal.BottomLeftInset.backdrop:SetPoint("TOPLEFT", 0, 2) MountJournal.BottomLeftInset:SetPoint("BOTTOMLEFT", 0, 32) MountJournal.BottomLeftInset.SlotButton:StripTextures() MountJournal.BottomLeftInset.SlotButton.ItemIcon:SkinIcon() T.SkinCheckBox(MountJournal.MountDisplay.ModelScene.TogglePlayer, 26) hooksecurefunc(MountJournal.ScrollBox, "Update", function(frame) for _, button in next, {frame.ScrollTarget:GetChildren()} do if not button.isSkinned then button:GetRegions():Hide() button.selectedTexture:SetTexture(nil) button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 2, -2) button.backdrop:SetPoint("BOTTOMRIGHT", -2, 2) button:StyleButton(nil, 4) button.DragButton:CreateBackdrop("Default") button.DragButton.backdrop:SetPoint("TOPLEFT", -1, 1) button.DragButton.backdrop:SetPoint("BOTTOMRIGHT", 1, -1) button.DragButton:StyleButton(nil, 1) button.DragButton.ActiveTexture:SetColorTexture(0, 1, 0, 0.3) button.DragButton.ActiveTexture:SetPoint("TOPLEFT", 1, -1) button.DragButton.ActiveTexture:SetPoint("BOTTOMRIGHT", -1, 1) button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.icon:ClearAllPoints() if i == 1 then button.icon:SetPoint("BOTTOMRIGHT", button, "BOTTOMLEFT", -3, 3) else button.icon:SetPoint("BOTTOMRIGHT", button, "BOTTOMLEFT", -3, 4) end button.isSkinned = true end end end) local function ColorSelectedMount(button) if button and button.backdrop then if button.selectedTexture:IsShown() then button.name:SetTextColor(1, 1, 0) button.backdrop:SetBackdropBorderColor(1, 1, 0) button.DragButton.backdrop:SetBackdropBorderColor(1, 1, 0) else button.name:SetTextColor(1, 1, 1) button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) button.DragButton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end end hooksecurefunc("MountJournal_InitMountButton", ColorSelectedMount) StyleItemButton(MountJournalSummonRandomFavoriteButton) do local button = MountJournal.MountDisplay.InfoButton local icon = MountJournal.MountDisplay.InfoButton.Icon button:CreateBackdrop("Default") button.backdrop:SetPoint("TOPLEFT", icon, -2, 2) button.backdrop:SetPoint("BOTTOMRIGHT", icon, 2, -2) icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end -- PetJournal PetJournal.LeftInset:StripTextures() PetJournal.RightInset:StripTextures() PetJournal.PetCardInset:StripTextures() PetJournal.loadoutBorder:StripTextures() PetJournalPetCardBG:Hide() PetJournalAchievementStatus:DisableDrawLayer("BACKGROUND") PetJournalTutorialButton.Ring:Hide() PetJournalTutorialButton:SetPoint("TOPLEFT", PetJournal, "TOPLEFT", -5, 10) PetJournal.PetCount:StripTextures() T.SkinEditBox(PetJournalSearchBox, nil, 18) PetJournalFilterButton:SetPoint("TOPLEFT", PetJournalSearchBox, "TOPRIGHT", 5, 2) T.SkinCloseButton(_G.PetJournalFilterButton.ResetButton) _G.PetJournalFilterButton.ResetButton:ClearAllPoints() _G.PetJournalFilterButton.ResetButton:SetPoint("CENTER", _G.PetJournalFilterButton, "TOPRIGHT", 0, 0) PetJournalLoadoutBorderSlotHeaderText:SetParent(PetJournal) PetJournalLoadoutBorderSlotHeaderText:SetPoint("CENTER", PetJournalLoadoutBorderTop, "TOP", 0, 4) PetJournal.ScrollBar:SetPoint("TOPLEFT", PetJournal.ScrollBox, "TOPRIGHT", 1, 35) PetJournal.ScrollBar:SetPoint("BOTTOMLEFT", PetJournal.ScrollBox, "BOTTOMRIGHT", 1, -2) T.SkinScrollBar(PetJournal.ScrollBar) hooksecurefunc(PetJournal.ScrollBox, "Update", function(frame) for _, button in next, {frame.ScrollTarget:GetChildren()} do local name = button.name if not button.isSkinned then button:GetRegions():Hide() button.selectedTexture:SetTexture(nil) button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 2, -2) button.backdrop:SetPoint("BOTTOMRIGHT", -2, 2) button:StyleButton(nil, 4) button.dragButton:CreateBackdrop("Default") button.dragButton.backdrop:SetPoint("TOPLEFT", -1, 1) button.dragButton.backdrop:SetPoint("BOTTOMRIGHT", 1, -1) button.dragButton:StyleButton(nil, 1) button.dragButton.ActiveTexture:SetColorTexture(0, 1, 0, 0.3) button.dragButton.ActiveTexture:SetPoint("TOPLEFT", 1, -1) button.dragButton.ActiveTexture:SetPoint("BOTTOMRIGHT", -1, 1) button.dragButton.favorite:SetParent(button.dragButton.backdrop) button.dragButton.levelBG:SetAlpha(0) button.petTypeIcon:SetParent(button.backdrop) button.petTypeIcon:SetDrawLayer("OVERLAY") button.isDead:SetParent(button.dragButton.backdrop) name:SetParent(button.backdrop) button.dragButton.level:SetParent(button.dragButton.backdrop) button.dragButton.level:SetFontObject("SystemFont_Outline_Small") button.dragButton.level:SetDrawLayer("OVERLAY") button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.icon:SetDrawLayer("ARTWORK") button.icon:SetParent(button.dragButton.backdrop) button.icon:ClearAllPoints() button.icon:SetPoint("BOTTOMRIGHT", button, "BOTTOMLEFT", -3, 4) button.isSkinned = true end end end) local function ColorSelectedPet(button, elementData) if not button or not button.backdrop then return end local index = elementData.index local petID, _, isOwned = C_PetJournal.GetPetInfoByIndex(index) if petID and isOwned then local _, _, _, _, rarity = C_PetJournal.GetPetStats(petID) if rarity then local color = ITEM_QUALITY_COLORS[rarity-1] button.name:SetTextColor(color.r, color.g, color.b) button.dragButton.backdrop:SetBackdropBorderColor(color.r, color.g, color.b) else button.name:SetTextColor(1, 1, 1) button.dragButton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end else button.name:SetTextColor(0.5, 0.5, 0.5) end if button.selectedTexture:IsShown() then button.backdrop:SetBackdropBorderColor(1, 1, 0) button.dragButton.backdrop:SetBackdropBorderColor(1, 1, 0) else button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) button.dragButton.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end hooksecurefunc("PetJournal_InitPetButton", ColorSelectedPet) StyleItemButton(PetJournalHealPetButton) StyleItemButton(PetJournalSummonRandomFavoritePetButton) for i = 1, 3 do local button = _G["PetJournalLoadoutPet"..i] button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", -2, 0) button.backdrop:SetPoint("BOTTOMRIGHT", 5, 0) button.dragButton:CreateBackdrop("Default") button.dragButton.backdrop:SetPoint("TOPLEFT", 0, 0) button.dragButton.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) button.dragButton:StyleButton() button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.icon:SetSize(36, 36) button.level:SetParent(button.dragButton.backdrop) button.level:SetFontObject("SystemFont_Outline_Small") button.level:ClearAllPoints() button.level:SetPoint("BOTTOMRIGHT", -2, 3) hooksecurefunc(button.qualityBorder, "SetVertexColor", function(_, r, g, b) button.name:SetTextColor(r, g, b) end) for j = 1, 3 do local spell = button["spell"..j] spell:StyleButton() spell:SetTemplate("Default") spell.BlackCover:SetPoint("TOPLEFT", 2, -2) spell.BlackCover:SetPoint("BOTTOMRIGHT", -2, 2) spell.FlyoutArrow:SetTexture("Interface\\Buttons\\ActionBarFlyoutButton") spell.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) spell.icon:ClearAllPoints() spell.icon:SetPoint("TOPLEFT", 2, -2) spell.icon:SetPoint("BOTTOMRIGHT", -2, 2) _G["PetJournalLoadoutPet"..i.."Spell"..j.."Background"]:SetTexture(nil) _G["PetJournalLoadoutPet"..i.."Spell"..j.."Selected"]:SetTexture(nil) end button.iconBorder:SetAlpha(0) button.qualityBorder:SetTexture("") button.levelBG:SetAlpha(0) button.helpFrame:StripTextures() _G["PetJournalLoadoutPet"..i.."BG"]:Hide() button.petTypeIcon:ClearAllPoints() button.petTypeIcon:SetPoint("BOTTOMLEFT", button.backdrop, 2, 2) button.healthFrame.healthBar:StripTextures() button.healthFrame.healthBar:CreateBackdrop("Overlay") button.healthFrame.healthBar:SetStatusBarTexture(C.media.texture) button.xpBar:StripTextures() button.xpBar:CreateBackdrop("Overlay") button.xpBar:SetStatusBarTexture(C.media.texture) button.xpBar:SetFrameLevel(button.xpBar:GetFrameLevel() + 2) end PetJournal.SpellSelect.BgEnd:Hide() PetJournal.SpellSelect.BgTiled:Hide() for i = 1, 2 do local button = _G["PetJournalSpellSelectSpell"..i] local icon = _G["PetJournalSpellSelectSpell"..i.."Icon"] button:StyleButton() button:SetTemplate("Default") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) icon:SetDrawLayer("OVERLAY") button.BlackCover:SetDrawLayer("OVERLAY", 1) end for i = 1, 6 do local button = _G["PetJournalPetCardSpell"..i] button:StyleButton() button:SetTemplate("Default") button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.icon:ClearAllPoints() button.icon:SetPoint("TOPLEFT", 2, -2) button.icon:SetPoint("BOTTOMRIGHT", -2, 2) end PetJournalPetCard.AbilitiesBG1:SetAlpha(0) PetJournalPetCard.AbilitiesBG2:SetAlpha(0) PetJournalPetCard.AbilitiesBG3:SetAlpha(0) PetJournalPetCard:CreateBackdrop("Overlay") PetJournalPetCard.backdrop:SetPoint("TOPLEFT", 0, -2) PetJournalPetCard.backdrop:SetPoint("BOTTOMRIGHT", 1, -2) PetJournalPetCardPetInfo:SetPoint("TOPLEFT", PetJournalPetCard.backdrop, 2, -2) PetJournalPetCardPetInfo:CreateBackdrop("Default") PetJournalPetCardPetInfo.backdrop:SetPoint("TOPLEFT", PetJournalPetCardPetInfoIcon, -2, 2) PetJournalPetCardPetInfo.backdrop:SetPoint("BOTTOMRIGHT", PetJournalPetCardPetInfoIcon, 2, -2) PetJournalPetCardPetInfoIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) PetJournalPetCardPetInfoLevelBubble:SetTexture(nil) PetJournalPetCardPetInfoLevel:SetFontObject("SystemFont_Outline_Small") PetJournalPetCardPetInfoQualityBorder:SetTexture(nil) PetJournalPetCardHealthFrame.healthBar:StripTextures() PetJournalPetCardHealthFrame.healthBar:CreateBackdrop("Overlay") PetJournalPetCardHealthFrame.healthBar:SetStatusBarTexture(C.media.texture) PetJournalPetCardXPBar:StripTextures() PetJournalPetCardXPBar:CreateBackdrop("Overlay") PetJournalPetCardXPBar:SetStatusBarTexture(C.media.texture) PetJournalPetCardXPBar:SetPoint("BOTTOM", PetJournalPetCard.backdrop, "BOTTOM", 0, 6) PetJournalPetCardXPBar:SetFrameLevel(PetJournalPetCardXPBar:GetFrameLevel() + 2) hooksecurefunc(PetJournalPetCardPetInfo.qualityBorder, "SetVertexColor", function(_, r, g, b) PetJournalPetCardPetInfo.name:SetTextColor(r, g, b) end) -- ToyBox ToyBox.iconsFrame:StripTextures() T.SkinEditBox(ToyBox.searchBox, nil, 18) T.SkinNextPrevButton(ToyBox.PagingFrame.PrevPageButton) T.SkinNextPrevButton(ToyBox.PagingFrame.NextPageButton) ToyBox.progressBar:StripTextures() ToyBox.progressBar:CreateBackdrop("Overlay") ToyBox.progressBar:SetStatusBarTexture(C.media.texture) ToyBox.progressBar:SetFrameLevel(ToyBox.progressBar:GetFrameLevel() + 2) ToyBoxFilterButton:SetPoint("TOPLEFT", ToyBox.searchBox, "TOPRIGHT", 5, 2) T.SkinCloseButton(_G.ToyBoxFilterButton.ResetButton) _G.ToyBoxFilterButton.ResetButton:ClearAllPoints() _G.ToyBoxFilterButton.ResetButton:SetPoint("CENTER", _G.ToyBoxFilterButton, "TOPRIGHT", 0, 0) for i = 1, 18 do ToyBox.iconsFrame["spellButton"..i].slotFrameCollected:SetTexture("") ToyBox.iconsFrame["spellButton"..i].slotFrameUncollected:SetTexture("") local button = ToyBox.iconsFrame["spellButton"..i] local icon = ToyBox.iconsFrame["spellButton"..i].iconTexture local uicon = ToyBox.iconsFrame["spellButton"..i].iconTextureUncollected button:StyleButton(nil, 0) button:CreateBackdrop("Default") button.cooldown:SetAllPoints(icon) icon:SetPoint("TOPLEFT") icon:SetPoint("BOTTOMRIGHT") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) uicon:SetPoint("TOPLEFT") uicon:SetPoint("BOTTOMRIGHT") uicon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end -- Heirlooms HeirloomsJournal.iconsFrame:StripTextures() T.SkinEditBox(HeirloomsJournal.SearchBox, nil, 18) T.SkinNextPrevButton(HeirloomsJournal.PagingFrame.PrevPageButton) T.SkinNextPrevButton(HeirloomsJournal.PagingFrame.NextPageButton) HeirloomsJournal.progressBar:StripTextures() HeirloomsJournal.progressBar:CreateBackdrop("Overlay") HeirloomsJournal.progressBar:SetStatusBarTexture(C.media.texture) HeirloomsJournal.progressBar:SetFrameLevel(HeirloomsJournal.progressBar:GetFrameLevel() + 2) T.SkinDropDownBox(HeirloomsJournalClassDropDown, 170) HeirloomsJournal.FilterButton:SetPoint("TOPLEFT", HeirloomsJournal.SearchBox, "TOPRIGHT", 5, 2) T.SkinCloseButton(_G.HeirloomsJournal.FilterButton.ResetButton) _G.HeirloomsJournal.FilterButton.ResetButton:ClearAllPoints() _G.HeirloomsJournal.FilterButton.ResetButton:SetPoint("CENTER", _G.HeirloomsJournal.FilterButton, "TOPRIGHT", 0, 0) hooksecurefunc(HeirloomsJournal, "LayoutCurrentPage", function(self) for i = 1, #self.heirloomHeaderFrames do local header = self.heirloomHeaderFrames[i] if not header.styled then header.text:SetTextColor(0.9, 0.8, 0.5) header.styled = true end end end) hooksecurefunc(HeirloomsJournal, "UpdateButton", function(_, button) if not button.styled then button:StyleButton(nil, 0) button:CreateBackdrop("Default") hooksecurefunc(button.level, "SetFontObject", function(self, font) if font ~= "SystemFont_Outline_Small" then self:SetFontObject("SystemFont_Outline_Small") self:SetTextColor(1, 1, 1) end end) button.levelBackground:SetAlpha(0) button.slotFrameCollected:SetTexture("") button.slotFrameUncollected:SetTexture("") button.iconTexture:SetPoint("TOPLEFT") button.iconTexture:SetPoint("BOTTOMRIGHT") button.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.iconTextureUncollected:SetPoint("TOPLEFT") button.iconTextureUncollected:SetPoint("BOTTOMRIGHT") button.iconTextureUncollected:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.styled = true end if C_Heirloom.PlayerHasHeirloom(button.itemID) then button.name:SetTextColor(0.9, 0.8, 0.5) else button.name:SetTextColor(0.6, 0.6, 0.6) end end) -- Wardrobe WardrobeFrame:StripTextures() WardrobeFrame:SetTemplate("Transparent") T.SkinCloseButton(WardrobeFrameCloseButton) T.SkinDropDownBox(WardrobeOutfitDropDown) WardrobeOutfitDropDown:SetSize(221, 34) WardrobeOutfitDropDown.SaveButton:SkinButton() WardrobeOutfitDropDown.SaveButton:SetPoint("TOPLEFT", WardrobeOutfitDropDown, "TOPRIGHT", -2, -2) WardrobeTransmogFrame:StripTextures() WardrobeTransmogFrame.Inset:StripTextures() WardrobeTransmogFrame.SpecButton:SkinButton() WardrobeTransmogFrame.ApplyButton:SkinButton() WardrobeTransmogFrame.SpecButton:SetPoint("RIGHT", WardrobeTransmogFrame.ApplyButton, "LEFT", -2, 0) WardrobeTransmogFrame.ModelScene.ClearAllPendingButton:SkinButton() T.SkinCheckBox(WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox) WardrobeCollectionFrame.FilterButton:SetPoint("TOPLEFT", WardrobeCollectionFrameSearchBox, "TOPRIGHT", 5, 2) T.SkinCloseButton(WardrobeCollectionFrame.FilterButton.ResetButton) WardrobeCollectionFrame.FilterButton.ResetButton:ClearAllPoints() WardrobeCollectionFrame.FilterButton.ResetButton:SetPoint("CENTER", WardrobeCollectionFrame.FilterButton, "TOPRIGHT", 0, 0) WardrobeCollectionFrame.FilterButton:SetWidth(90) for i = 1, #WardrobeTransmogFrame.SlotButtons do local slot = WardrobeTransmogFrame.SlotButtons[i] local icon = slot.Icon local border = slot.Border if slot then border:Kill() slot:StyleButton() slot:SetFrameLevel(slot:GetFrameLevel() + 2) slot:CreateBackdrop("Default") slot.backdrop:SetAllPoints() icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) end end WardrobeCollectionFrame.ItemsCollectionFrame:StripTextures() WardrobeCollectionFrame.SetsTransmogFrame:StripTextures() WardrobeCollectionFrame.progressBar:StripTextures() WardrobeCollectionFrame.progressBar:CreateBackdrop("Overlay") WardrobeCollectionFrame.progressBar:SetStatusBarTexture(C.media.texture) WardrobeCollectionFrame.progressBar:SetFrameLevel(WardrobeCollectionFrame.progressBar:GetFrameLevel() + 2) T.SkinEditBox(WardrobeCollectionFrameSearchBox, nil, 18) WardrobeCollectionFrameSearchBox:SetFrameLevel(WardrobeCollectionFrameSearchBox:GetFrameLevel() + 2) T.SkinDropDownBox(WardrobeCollectionFrameWeaponDropDown, 170) T.SkinNextPrevButton(WardrobeCollectionFrame.ItemsCollectionFrame.PagingFrame.PrevPageButton) T.SkinNextPrevButton(WardrobeCollectionFrame.ItemsCollectionFrame.PagingFrame.NextPageButton) T.SkinNextPrevButton(WardrobeCollectionFrame.SetsTransmogFrame.PagingFrame.PrevPageButton) T.SkinNextPrevButton(WardrobeCollectionFrame.SetsTransmogFrame.PagingFrame.NextPageButton) WardrobeCollectionFrame.SetsCollectionFrame.LeftInset:StripTextures() WardrobeCollectionFrame.SetsCollectionFrame.RightInset:StripTextures() WardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame:StripTextures() WardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame:CreateBackdrop("Overlay") WardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame.backdrop:SetPoint("TOPLEFT", 4, -4) WardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame.backdrop:SetPoint("BOTTOMRIGHT", 1, 4) WardrobeSetsCollectionVariantSetsButton:SkinButton() T.SkinScrollBar(WardrobeCollectionFrame.SetsCollectionFrame.ListContainer.ScrollBar) WardrobeCollectionFrame.SetsCollectionFrame.ListContainer.ScrollBar:SetPoint("TOPLEFT", WardrobeCollectionFrame.SetsCollectionFrame.ListContainer, "TOPRIGHT", 2, 33) WardrobeCollectionFrame.SetsCollectionFrame.ListContainer.ScrollBar:SetPoint("BOTTOMLEFT", WardrobeCollectionFrame.SetsCollectionFrame.ListContainer, "BOTTOMRIGHT", 2, -4) local function SetItemQuality(_, itemFrame) if (itemFrame.backdrop) then local _, _, quality = GetItemInfo(itemFrame.itemID); local alpha = 1 if (not itemFrame.collected) then alpha = 0.4 end if (not quality or quality < 2) then -- Not collected or item is white or grey itemFrame.backdrop:SetBackdropBorderColor(0, 0, 0) else itemFrame.backdrop:SetBackdropBorderColor(ITEM_QUALITY_COLORS[quality].r, ITEM_QUALITY_COLORS[quality].g, ITEM_QUALITY_COLORS[quality].b, alpha) end end end hooksecurefunc(WardrobeCollectionFrame.SetsCollectionFrame, "SetItemFrameQuality", SetItemQuality) for i = 1, 2 do T.SkinTab(_G["WardrobeCollectionFrameTab"..i], true) end hooksecurefunc(WardrobeCollectionFrame.SetsCollectionFrame.ListContainer.ScrollBox, "Update", function(frame) for _, button in next, {frame.ScrollTarget:GetChildren()} do if not button.isSkinned then button:GetRegions():Hide() button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 2, -2) button.backdrop:SetPoint("BOTTOMRIGHT", -2, 2) button:StyleButton(nil, 4) button.HighlightTexture:SetTexture(nil) button.SelectedTexture:SetTexture(nil) button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.border = CreateFrame("Frame", nil, button) button.border:CreateBackdrop("Default") button.border.backdrop:SetPoint("TOPLEFT", button.Icon, -2, 2) button.border.backdrop:SetPoint("BOTTOMRIGHT", button.Icon, 2, -2) button.ProgressBar:SetPoint("TOPLEFT", button.backdrop, "BOTTOMLEFT", 2, 4) button.isSkinned = true end end end) local function ColorSelectedSet(button) if not button or not button.backdrop then return end if button.SelectedTexture:IsShown() then button.backdrop:SetBackdropBorderColor(1, 1, 0) button.border.backdrop:SetBackdropBorderColor(1, 1, 0) else button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) button.border.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end hooksecurefunc(WardrobeSetsScrollFrameButtonMixin, "SetSelected", ColorSelectedSet) hooksecurefunc(WardrobeCollectionFrame.SetsCollectionFrame, "DisplaySet", function() for _, child in ipairs({WardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame:GetChildren()}) do if child.Icon and not child.isSkinned then child.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) child:CreateBackdrop("Default") child.backdrop:SetPoint("TOPLEFT", child.Icon, -2, 2) child.backdrop:SetPoint("BOTTOMRIGHT", child.Icon, 2, -2) child.isSkinned = true end end end) for i = 1, #WardrobeCollectionFrame.ItemsCollectionFrame.Models do local model = WardrobeCollectionFrame.ItemsCollectionFrame.Models[i] model.Border:SetAlpha(0) local bg = CreateFrame("Frame", nil, model) bg:CreateBackdrop("Overlay") bg.backdrop:SetOutside(model, 3, 3) hooksecurefunc(model.Border, 'SetAtlas', function(_, texture) local color if texture == "transmog-wardrobe-border-uncollected" then color = {0.3, 0.3, 1} elseif texture == "transmog-wardrobe-border-unusable" then color = {0.8, 0, 0} else color = C.media.border_color end bg.backdrop:SetBackdropBorderColor(unpack(color)) end) end for i = 1, #WardrobeCollectionFrame.SetsTransmogFrame.Models do local model = WardrobeCollectionFrame.SetsTransmogFrame.Models[i] model.Border:SetAlpha(0) local bg = CreateFrame("Frame", nil, model) bg:CreateBackdrop("Overlay") bg.backdrop:SetOutside(model, 3, 3) end local function SkinSetItemButtons(self) for itemFrame in self.DetailsFrame.itemFramesPool:EnumerateActive() do itemFrame.IconBorder:SetAlpha(0) SetItemQuality(self, itemFrame) end end hooksecurefunc(WardrobeCollectionFrame.SetsCollectionFrame, "DisplaySet", SkinSetItemButtons) -- Help box local HelpBox = { ToyBox.favoriteHelpBox, WardrobeCollectionFrame.ItemsCollectionFrame.HelpBox, WardrobeCollectionFrame.SetsTabHelpBox, WardrobeTransmogFrame.SpecHelpBox, WardrobeTransmogFrame.OutfitHelpBox } for i = 1, #HelpBox do local frame = HelpBox[i] T.SkinHelpBox(frame) end end T.SkinFuncs["Blizzard_Collections"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Communities.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Communities skin ---------------------------------------------------------------------------------------- local function LoadSkin() CommunitiesFrameCommunitiesList.ScrollBar:GetChildren():Hide() CommunitiesFrame.MemberList.ScrollBar:GetChildren():Hide() CommunitiesFrameGuildDetailsFrameNews.ScrollBar:GetChildren():Hide() CommunitiesFrame.ApplicantList.ScrollBar:GetChildren():Hide() local scrollbars = { ClubFinderCommunityAndGuildFinderFrame.CommunityCards.ScrollBar, ClubFinderCommunityAndGuildFinderFrame.PendingCommunityCards.ScrollBar, CommunitiesAvatarPickerDialog.ScrollBar, CommunitiesFrame.Chat.MessageFrame.ScrollBar, CommunitiesFrame.GuildBenefitsFrame.Rewards.ScrollBar, CommunitiesFrame.MemberList.ScrollBar, CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.ScrollBar, CommunitiesFrame.RecruitmentDialog.RecruitmentMessageFrame.RecruitmentMessageInput.ScrollBar, CommunitiesFrameCommunitiesList.ScrollBar, CommunitiesFrameGuildDetailsFrameInfoScrollBar, CommunitiesFrameGuildDetailsFrameNews.ScrollBar, CommunitiesFrameGuildDetailsFrameNews.ScrollBar, CommunitiesGuildLogFrameScrollBar, CommunitiesGuildTextEditFrameScrollBar, CommunitiesFrame.ApplicantList.ScrollBar } for i = 1, #scrollbars do T.SkinScrollBar(scrollbars[i]) end local closeButton = { CommunitiesGuildNewsFiltersFrame.CloseButton, CommunitiesGuildLogFrameCloseButton, CommunitiesFrameCloseButton, CommunitiesFrame.GuildMemberDetailFrame.CloseButton, CommunitiesGuildTextEditFrameCloseButton } for i = 1, #closeButton do T.SkinCloseButton(closeButton[i]) end -- General Communities Frame CommunitiesFrame:StripTextures() CommunitiesFrame:CreateBackdrop("Transparent") CommunitiesFrame.NineSlice:Hide() CommunitiesFrame.PortraitOverlay:Kill() CommunitiesFrameCommunitiesList:StripTextures() T.SkinMaxMinFrame(CommunitiesFrame.MaximizeMinimizeFrame, CommunitiesFrameCloseButton) CommunitiesFrame.InviteButton:SkinButton() CommunitiesFrame.Chat.InsetFrame.NineSlice:Hide() CommunitiesFrame.Chat.InsetFrame:SetTemplate("Overlay") CommunitiesFrame.ChatTab:SetPoint("TOPLEFT", CommunitiesFrame, "TOPRIGHT", 5, -36) hooksecurefunc(CommunitiesFrame.Chat.MessageFrame.ScrollBar, "SetPoint", function(self, point, anchor, attachTo, x, y) if anchor == CommunitiesFrame.Chat.MessageFrame and x == 10 and y == -11 then self:SetPoint(point, anchor, attachTo, 11, -7) elseif anchor == CommunitiesFrame.Chat.MessageFrame and x == 10 and y == -17 then self:SetPoint(point, anchor, attachTo, 11, -14) end end) -- CommunitiesFrame.MemberList.ScrollBar:SetPoint("BOTTOMLEFT", CommunitiesFrame.MemberList, "BOTTOMRIGHT", 0, 14) CommunitiesFrame.MemberList:SetPoint("BOTTOMRIGHT", CommunitiesFrame, "BOTTOMRIGHT", -26, 31) hooksecurefunc(CommunitiesFrame.ChatEditBox, "SetPoint", function(self, point, anchor, attachTo, x, y) if point == "BOTTOMLEFT" and x == 10 and y == 0 then self:SetPoint(point, anchor, attachTo, 12, 5) elseif point == "BOTTOMRIGHT" and x == -12 and y == 0 then self:SetPoint(point, anchor, attachTo, -10, 5) end end) CommunitiesFrameCommunitiesList.ScrollBar:SetPoint("TOPLEFT", CommunitiesFrameCommunitiesList, "TOPRIGHT", -3, 0) CommunitiesFrameCommunitiesList.ScrollBar:SetPoint("BOTTOMLEFT", CommunitiesFrameCommunitiesList, "BOTTOMRIGHT", -3, -2) T.SkinEditBox(CommunitiesFrame.ChatEditBox, nil, 18) T.SkinDropDownBox(CommunitiesFrame.StreamDropDownMenu, nil, true) T.SkinDropDownBox(CommunitiesFrame.CommunitiesListDropDownMenu) CommunitiesFrame.AddToChatButton:SkinButton() CommunitiesFrame.CommunitiesControlFrame.CommunitiesSettingsButton:SkinButton() hooksecurefunc(CommunitiesListEntryMixin, "Init", function(self, elementData) local clubInfo = elementData.clubInfo if clubInfo then self:SetSize(166, 65) self.Background:Hide() self:SetFrameLevel(self:GetFrameLevel() + 5) self.Icon:RemoveMaskTexture(self.CircleMask) self.Icon:SetDrawLayer("OVERLAY", 1) self.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) self.IconRing:Hide() if not self.bg then self.bg = CreateFrame("Frame", nil, self) self.bg:CreateBackdrop("Overlay") self.bg:SetFrameLevel(self:GetFrameLevel() - 2) self.bg:SetPoint("TOPLEFT", 4, -3) self.bg:SetPoint("BOTTOMRIGHT", -4, 3) end local isGuild = clubInfo.clubType == Enum.ClubType.Guild if isGuild then self.Selection:SetInside(self.bg, 0, 0) self.Selection:SetColorTexture(0, 1, 0, 0.2) else self.Selection:SetInside(self.bg, 0, 0) self.Selection:SetColorTexture(FRIENDS_BNET_BACKGROUND_COLOR.r, FRIENDS_BNET_BACKGROUND_COLOR.g, FRIENDS_BNET_BACKGROUND_COLOR.b, 0.2) end local highlight = self:GetHighlightTexture() highlight:SetInside(self.bg, 0, 0) highlight:SetColorTexture(1, 1, 1, 0.3) end end) local function SkinCommunitiesButton(self, colorSection) self:SetSize(166, 65) self.Background:Hide() self:SetFrameLevel(self:GetFrameLevel() + 5) self.CircleMask:Hide() self.Icon:SetDrawLayer("OVERLAY", 1) self.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) self.IconRing:Hide() if not self.bg then self.bg = CreateFrame("Frame", nil, self) self.bg:CreateBackdrop("Overlay") self.bg:SetFrameLevel(self:GetFrameLevel() - 2) self.bg:SetPoint("TOPLEFT", 4, -3) self.bg:SetPoint("BOTTOMRIGHT", -4, 3) end if colorSection then self.Selection:SetInside(self.bg, 0, 0) if colorSection == 1 then self.Selection:SetColorTexture(GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, 0.2) else self.Selection:SetColorTexture(BATTLENET_FONT_COLOR.r, BATTLENET_FONT_COLOR.g, BATTLENET_FONT_COLOR.b, 0.2) end end local highlight = self:GetHighlightTexture() highlight:SetColorTexture(1, 1, 1, 0.3) highlight:SetInside(self.bg, 0, 0) end hooksecurefunc(CommunitiesListEntryMixin, "SetGuildFinder", function(self) SkinCommunitiesButton(self, 1) end) hooksecurefunc(CommunitiesListEntryMixin, "SetFindCommunity", function(self) SkinCommunitiesButton(self, 2) end) hooksecurefunc(CommunitiesListEntryMixin, "SetAddCommunity", function(self) SkinCommunitiesButton(self) end) -- ClubFinderInvitationFrame CommunitiesFrame.ClubFinderInvitationFrame.InsetFrame:StripTextures() CommunitiesFrame.ClubFinderInvitationFrame:SetTemplate("Overlay") CommunitiesFrame.ClubFinderInvitationFrame.AcceptButton:SkinButton() CommunitiesFrame.ClubFinderInvitationFrame.DeclineButton:SkinButton() CommunitiesFrame.ClubFinderInvitationFrame.ApplyButton:SkinButton() CommunitiesFrame.ClubFinderInvitationFrame.WarningDialog:StripTextures() CommunitiesFrame.ClubFinderInvitationFrame.WarningDialog:SetTemplate("Transparent") CommunitiesFrame.ClubFinderInvitationFrame.WarningDialog.Accept:SkinButton() CommunitiesFrame.ClubFinderInvitationFrame.WarningDialog.Cancel:SkinButton() -- InvitationFrame CommunitiesFrame.InvitationFrame.InsetFrame:StripTextures() CommunitiesFrame.InvitationFrame:SetTemplate("Overlay") CommunitiesFrame.InvitationFrame.AcceptButton:SkinButton() CommunitiesFrame.InvitationFrame.DeclineButton:SkinButton() -- GuildFinderFrame CommunitiesFrame.GuildFinderFrame:StripTextures() ClubFinderCommunityAndGuildFinderFrame:StripTextures() ClubFinderGuildFinderFrame.OptionsList.Search:SkinButton() ClubFinderCommunityAndGuildFinderFrame.OptionsList.Search:SkinButton() T.SkinDropDownBox(ClubFinderGuildFinderFrame.OptionsList.ClubFilterDropdown) T.SkinDropDownBox(ClubFinderGuildFinderFrame.OptionsList.ClubSizeDropdown) T.SkinDropDownBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.ClubFilterDropdown) T.SkinDropDownBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.SortByDropdown) ClubFinderGuildFinderFrame.OptionsList.Search:ClearAllPoints() ClubFinderGuildFinderFrame.OptionsList.Search:SetPoint("TOP", ClubFinderGuildFinderFrame.OptionsList.SearchBox, "BOTTOM", 0, -3) T.SkinEditBox(ClubFinderGuildFinderFrame.OptionsList.SearchBox, 146, 18) ClubFinderGuildFinderFrame.ClubFinderSearchTab:SetPoint("TOPLEFT", CommunitiesFrame, "TOPRIGHT", 5, -30) ClubFinderCommunityAndGuildFinderFrame.ClubFinderSearchTab:SetPoint("TOPLEFT", CommunitiesFrame, "TOPRIGHT", 5, -30) T.SkinCheckBox(ClubFinderGuildFinderFrame.OptionsList.TankRoleFrame.CheckBox) T.SkinCheckBox(ClubFinderGuildFinderFrame.OptionsList.HealerRoleFrame.CheckBox) T.SkinCheckBox(ClubFinderGuildFinderFrame.OptionsList.DpsRoleFrame.CheckBox) T.SkinCheckBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.TankRoleFrame.CheckBox) T.SkinCheckBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.HealerRoleFrame.CheckBox) T.SkinCheckBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.DpsRoleFrame.CheckBox) ClubFinderCommunityAndGuildFinderFrame.OptionsList.Search:ClearAllPoints() ClubFinderCommunityAndGuildFinderFrame.OptionsList.Search:SetPoint("TOP", ClubFinderCommunityAndGuildFinderFrame.OptionsList.SearchBox, "BOTTOM", 0, -3) T.SkinEditBox(ClubFinderCommunityAndGuildFinderFrame.OptionsList.SearchBox, 146, 18) T.SkinNextPrevButton(ClubFinderGuildFinderFrame.GuildCards.PreviousPage) T.SkinNextPrevButton(ClubFinderGuildFinderFrame.GuildCards.NextPage) T.SkinNextPrevButton(ClubFinderGuildFinderFrame.PendingGuildCards.PreviousPage) T.SkinNextPrevButton(ClubFinderGuildFinderFrame.PendingGuildCards.NextPage) local function SkinCommunityCards(frame) if not frame then return end for _, button in next, {frame.ScrollTarget:GetChildren()} do if not button.isSkinned then button.CircleMask:Hide() button.LogoBorder:Hide() button:StripTextures() button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 0, 0) button.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) button:StyleButton() button.CommunityLogo:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.isSkinned = true end end end hooksecurefunc(ClubFinderCommunityAndGuildFinderFrame.CommunityCards.ScrollBox, "Update", SkinCommunityCards) hooksecurefunc(ClubFinderCommunityAndGuildFinderFrame.PendingCommunityCards.ScrollBox, "Update", SkinCommunityCards) local function SkinCard(card) if not card.isSkinned then card.CardBackground:Hide() card.bg = CreateFrame("Frame", nil, card) card.bg:CreateBackdrop("Overlay") card.bg:SetFrameLevel(card:GetFrameLevel() - 2) card.bg:SetPoint("TOPLEFT", 2, 3) card.bg:SetPoint("BOTTOMRIGHT", -2, 3) card.RequestJoin:SkinButton() card.isSkinned = true end end for _, card in pairs(ClubFinderGuildFinderFrame.GuildCards.Cards) do SkinCard(card) end for _, card in pairs(ClubFinderGuildFinderFrame.PendingGuildCards.Cards) do SkinCard(card) end for _, t in ipairs({ClubFinderGuildFinderFrame.RequestToJoinFrame, ClubFinderCommunityAndGuildFinderFrame.RequestToJoinFrame}) do t:StripTextures() t:CreateBackdrop("Transparent") hooksecurefunc(t, "Initialize", function(self) for button in self.SpecsPool:EnumerateActive() do if button.CheckBox then T.SkinCheckBox(button.CheckBox) button.CheckBox:SetSize(26, 26) end end end) t.MessageFrame:StripTextures(true) t.MessageFrame.MessageScroll:StripTextures(true) t.MessageFrame.MessageScroll:CreateBackdrop("Overlay") t.MessageFrame.MessageScroll.backdrop:SetPoint("TOPLEFT", -4, 5) t.MessageFrame.MessageScroll.backdrop:SetPoint("BOTTOMRIGHT", 6, -6) t.Apply:SkinButton() t.Cancel:SkinButton() end -- Notification Settings local NotificationSettings = CommunitiesFrame.NotificationSettingsDialog NotificationSettings:StripTextures() NotificationSettings.Selector:StripTextures() NotificationSettings:SetTemplate("Transparent") T.SkinDropDownBox(CommunitiesFrame.NotificationSettingsDialog.CommunitiesListDropDownMenu, 190) CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.QuickJoinButton:SetSize(25, 25) T.SkinCheckBox(CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.QuickJoinButton) CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.AllButton:SkinButton() CommunitiesFrame.NotificationSettingsDialog.ScrollFrame.Child.NoneButton:SkinButton() CommunitiesFrame.NotificationSettingsDialog.Selector.OkayButton:SkinButton() CommunitiesFrame.NotificationSettingsDialog.Selector.CancelButton:SkinButton() hooksecurefunc(CommunitiesNotificationSettingsStreamEntryMixin, "SetFilter", function(self) self.ShowNotificationsButton:SetSize(18, 18) self.HideNotificationsButton:SetSize(18, 18) T.SkinCheckBox(self.ShowNotificationsButton) T.SkinCheckBox(self.HideNotificationsButton) end) local EditStreamDialog = CommunitiesFrame.EditStreamDialog EditStreamDialog:StripTextures() EditStreamDialog:SetTemplate("Transparent") EditStreamDialog.NameEdit:SetPoint("TOPLEFT", EditStreamDialog.NameLabel, "BOTTOMLEFT", 6, -5) EditStreamDialog.NameEdit:SetPoint("RIGHT", EditStreamDialog, "RIGHT", -34, 0) T.SkinEditBox(EditStreamDialog.NameEdit, nil, 18) T.SkinEditBox(EditStreamDialog.Description) T.SkinCheckBox(EditStreamDialog.TypeCheckBox) EditStreamDialog.Accept:SkinButton() EditStreamDialog.Delete:SkinButton() EditStreamDialog.Cancel:SkinButton() -- Communities Settings local Settings = CommunitiesSettingsDialog Settings.BG:Hide() Settings:SetTemplate("Transparent") Settings.IconPreview:RemoveMaskTexture(Settings.CircleMask) Settings.IconPreviewRing:Hide() Settings.IconPreview:SkinIcon(true) T.SkinEditBox(Settings.NameEdit) T.SkinEditBox(Settings.ShortNameEdit) T.SkinEditBox(Settings.Description) T.SkinEditBox(Settings.MessageOfTheDay) Settings.ChangeAvatarButton:SkinButton() Settings.Accept:SkinButton() Settings.Delete:SkinButton() Settings.Cancel:SkinButton() T.SkinDropDownBox(ClubFinderLanguageDropdown) -- Avatar Picker local Avatar = CommunitiesAvatarPickerDialog Avatar:StripTextures() Avatar.Selector:StripTextures() Avatar:SetTemplate("Transparent") Avatar.Selector.OkayButton:SkinButton() Avatar.Selector.CancelButton:SkinButton() -- Tab local function SkinTab(tab) tab:GetRegions():Hide() tab:CreateBackdrop("Default") tab.backdrop:SetAllPoints() tab:StyleButton() tab.Icon:SetPoint("TOPLEFT", 2, -2) tab.Icon:SetPoint("BOTTOMRIGHT", -2, 2) tab.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end SkinTab(CommunitiesFrame.ChatTab) SkinTab(CommunitiesFrame.RosterTab) SkinTab(CommunitiesFrame.GuildBenefitsTab) SkinTab(CommunitiesFrame.GuildInfoTab) SkinTab(ClubFinderGuildFinderFrame.ClubFinderSearchTab) SkinTab(ClubFinderGuildFinderFrame.ClubFinderPendingTab) SkinTab(ClubFinderCommunityAndGuildFinderFrame.ClubFinderSearchTab) SkinTab(ClubFinderCommunityAndGuildFinderFrame.ClubFinderPendingTab) -- Member List CommunitiesFrame.MemberList:StripTextures() CommunitiesFrame.MemberList.ColumnDisplay:StripTextures() CommunitiesFrame.MemberList.ShowOfflineButton:SetSize(25, 25) CommunitiesFrame.MemberList.ShowOfflineButton:SetPoint("BOTTOMLEFT", CommunitiesFrame.MemberList, "TOPLEFT", -3, 26) CommunitiesFrame.CommunitiesControlFrame.GuildRecruitmentButton:SkinButton() CommunitiesFrame.CommunitiesControlFrame.GuildControlButton:SkinButton() T.SkinCheckBox(CommunitiesFrame.MemberList.ShowOfflineButton) T.SkinDropDownBox(CommunitiesFrame.GuildMemberListDropDownMenu) hooksecurefunc(CommunitiesFrame.MemberList, "RefreshListDisplay", function(self) for i = 1, self.ColumnDisplay:GetNumChildren() do local child = select(i, self.ColumnDisplay:GetChildren()) if not child.IsSkinned then child:StripTextures() child:CreateBackdrop("Overlay") child.backdrop:SetPoint("TOPLEFT", 2, -2) child.backdrop:SetPoint("BOTTOMRIGHT", -2, 2) child.IsSkinned = true end end end) hooksecurefunc(CommunitiesMemberListEntryMixin, "RefreshExpandedColumns", function(self) local memberInfo = self:GetMemberInfo() if memberInfo and memberInfo.classID then local classInfo = C_CreatureInfo.GetClassInfo(memberInfo.classID) if classInfo then local texcoord = CLASS_ICON_TCOORDS[classInfo.classFile] self.Class:SetTexCoord(texcoord[1] + 0.015, texcoord[2] - 0.02, texcoord[3] + 0.018, texcoord[4] - 0.02) end end end) hooksecurefunc(CommunitiesMemberListEntryMixin, "SetProfessionHeader", function(self) local header = self.ProfessionHeader if header.styled then return end for i = 1, 3 do select(i, header:GetRegions()):Hide() end header:CreateBackdrop("Overlay") header.backdrop:SetPoint("TOPLEFT", 1, -1) header.backdrop:SetPoint("BOTTOMRIGHT", -1, 1) header.styled = true end) local ApplicantList = CommunitiesFrame.ApplicantList ApplicantList:StripTextures() ApplicantList.ColumnDisplay:StripTextures() hooksecurefunc(ApplicantList, "BuildList", function(list) local columnDisplay = list.ColumnDisplay for _, child in next, {columnDisplay:GetChildren()} do if not child.IsSkinned then child:StripTextures() child:CreateBackdrop("Overlay") child.backdrop:SetPoint("TOPLEFT", 4, -2) child.backdrop:SetPoint("BOTTOMRIGHT", 0, 2) child.IsSkinned = true end end end) hooksecurefunc(ApplicantList.ScrollBox, "Update", function(frame) for _, child in next, {frame.ScrollTarget:GetChildren()} do if not child.isSkinned then child.InviteButton:SetSize(66, 18) child.CancelInvitationButton:SetSize(20, 18) child.InviteButton:SkinButton() child.CancelInvitationButton:SkinButton() child.isSkinned = true end end end) -- Member Detail Frame CommunitiesFrame.GuildMemberDetailFrame:StripTextures() CommunitiesFrame.GuildMemberDetailFrame:SetTemplate("Transparent") CommunitiesFrame.GuildMemberDetailFrame:ClearAllPoints() CommunitiesFrame.GuildMemberDetailFrame:SetPoint("TOPLEFT", CommunitiesFrame, "TOPRIGHT", 5, 2) CommunitiesFrame.GuildMemberDetailFrame.NoteBackground:SetTemplate("Overlay") CommunitiesFrame.GuildMemberDetailFrame.OfficerNoteBackground:SetTemplate("Overlay") T.SkinDropDownBox(CommunitiesFrame.GuildMemberDetailFrame.RankDropdown, 160) CommunitiesFrame.GuildMemberDetailFrame.RemoveButton:SkinButton() CommunitiesFrame.GuildMemberDetailFrame.GroupInviteButton:SkinButton() CommunitiesFrame.GuildMemberDetailFrame.RemoveButton:ClearAllPoints() CommunitiesFrame.GuildMemberDetailFrame.RemoveButton:SetPoint("BOTTOMLEFT", CommunitiesFrame.GuildMemberDetailFrame, "BOTTOMLEFT", 9, 4) -- Guild Perk CommunitiesFrame.GuildBenefitsFrame:StripTextures() CommunitiesFrame.GuildBenefitsFrame.Perks:StripTextures() CommunitiesFrame.GuildBenefitsFrame.Perks:CreateBackdrop("Overlay") CommunitiesFrame.GuildBenefitsFrame.Perks.backdrop:SetPoint("TOPLEFT", 4, -2) CommunitiesFrame.GuildBenefitsFrame.Perks.backdrop:SetPoint("BOTTOMRIGHT", -2, -2) local GuildFactionBar = CommunitiesFrame.GuildBenefitsFrame.FactionFrame.Bar GuildFactionBar:StripTextures() GuildFactionBar.Progress:SetTexture(C.media.texture) GuildFactionBar:CreateBackdrop("Overlay") GuildFactionBar.backdrop:SetPoint("TOPLEFT", GuildFactionBar.Progress, "TOPLEFT", -2, 2) GuildFactionBar.backdrop:SetPoint("BOTTOMRIGHT", GuildFactionBar, "BOTTOMRIGHT", 0, 0) hooksecurefunc(CommunitiesFrame.GuildBenefitsFrame.Perks.ScrollBox, "Update", function(frame) for _, button in next, {frame.ScrollTarget:GetChildren()} do if not button.styled then button:StripTextures() if button.Icon then button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.Icon:ClearAllPoints() button.Icon:SetPoint("TOPLEFT", 2, -3) button:CreateBackdrop("Default") button.backdrop:SetPoint("TOPLEFT", button.Icon, "TOPLEFT", -2, 2) button.backdrop:SetPoint("BOTTOMRIGHT", button.Icon, "BOTTOMRIGHT", 2, -2) button.Icon:SetParent(button.backdrop) end button.styled = true end end end) CommunitiesFrame.GuildBenefitsFrame.Rewards:StripTextures() CommunitiesFrame.GuildBenefitsFrame.Rewards:CreateBackdrop("Overlay") CommunitiesFrame.GuildBenefitsFrame.Rewards.backdrop:SetPoint("TOPLEFT", 2, -2) CommunitiesFrame.GuildBenefitsFrame.Rewards.backdrop:SetPoint("BOTTOMRIGHT", -2, -2) hooksecurefunc(CommunitiesFrame.GuildBenefitsFrame.Rewards.ScrollBox, "Update", function(frame) for _, button in next, {frame.ScrollTarget:GetChildren()} do if not button.styled then button:StripTextures() if button.Icon then button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.Icon:ClearAllPoints() button.Icon:SetPoint("TOPLEFT", 2, -3) button:CreateBackdrop("Default") button.backdrop:SetPoint("TOPLEFT", button.Icon, "TOPLEFT", -2, 2) button.backdrop:SetPoint("BOTTOMRIGHT", button.Icon, "BOTTOMRIGHT", 2, -2) button.Icon:SetParent(button.backdrop) button.Lock:SetTexture("Interface\\GuildFrame\\GuildFrame") button.Lock:SetParent(button.backdrop) end button.styled = true end end end) -- Guild Info CommunitiesFrameGuildDetailsFrame:StripTextures() CommunitiesFrameGuildDetailsFrameInfo:StripTextures() CommunitiesFrameGuildDetailsFrameNews:StripTextures() hooksecurefunc(CommunitiesFrameGuildDetailsFrameNews.ScrollBar, "SetPoint", function(self, point, anchor, attachTo, x, y) if anchor == CommunitiesFrameGuildDetailsFrameNewsContainer and x == 1 and y == 5 then self:SetPoint(point, anchor, attachTo, x, 8) end end) hooksecurefunc("GuildNewsButton_SetNews", function(button, news_id) local newsInfo = C_GuildInfo.GetGuildNewsInfo(news_id) if newsInfo then if button.header:IsShown() then button.header:SetAlpha(0) end end end) CommunitiesFrameGuildDetailsFrameNews.SetFiltersButton:GetRegions():SetFont(C.media.normal_font, 10, "") local backdrop1 = CreateFrame("Frame", nil, CommunitiesFrameGuildDetailsFrameInfo) backdrop1:SetTemplate("Overlay") backdrop1:SetFrameLevel(CommunitiesFrameGuildDetailsFrameInfo:GetFrameLevel() - 1) backdrop1:SetPoint("TOPLEFT", CommunitiesFrameGuildDetailsFrameInfo, "TOPLEFT", 2, -22) backdrop1:SetPoint("BOTTOMRIGHT", CommunitiesFrameGuildDetailsFrameInfo, "BOTTOMRIGHT", 0, 200) local backdrop2 = CreateFrame("Frame", nil, CommunitiesFrameGuildDetailsFrameInfo) backdrop2:SetTemplate("Overlay") backdrop2:SetFrameLevel(CommunitiesFrameGuildDetailsFrameInfo:GetFrameLevel() - 1) backdrop2:SetPoint("TOPLEFT", CommunitiesFrameGuildDetailsFrameInfo, "TOPLEFT", 2, -158) backdrop2:SetPoint("BOTTOMRIGHT", CommunitiesFrameGuildDetailsFrameInfo, "BOTTOMRIGHT", -8, 123) local backdrop3 = CreateFrame("Frame", nil, CommunitiesFrameGuildDetailsFrameInfo) backdrop3:SetTemplate("Overlay") backdrop3:SetFrameLevel(CommunitiesFrameGuildDetailsFrameInfo:GetFrameLevel() - 1) backdrop3:SetPoint("TOPLEFT", CommunitiesFrameGuildDetailsFrameInfo, "TOPLEFT", 2, -236) backdrop3:SetPoint("BOTTOMRIGHT", CommunitiesFrameGuildDetailsFrameInfo, "BOTTOMRIGHT", -8, -1) local backdrop4 = CreateFrame("Frame", nil, CommunitiesFrameGuildDetailsFrameInfo) backdrop4:SetTemplate("Overlay") backdrop4:SetFrameLevel(CommunitiesFrameGuildDetailsFrameInfo:GetFrameLevel() - 1) backdrop4:SetPoint("TOPLEFT", CommunitiesFrameGuildDetailsFrameInfo, "TOPLEFT", 591, -22) backdrop4:SetPoint("BOTTOMRIGHT", CommunitiesFrameGuildDetailsFrameInfo, "BOTTOMRIGHT", 20, -1) CommunitiesFrameGuildDetailsFrameInfoMOTDScrollFrameScrollBar:SetPoint("TOPLEFT", CommunitiesFrameGuildDetailsFrameInfoMOTDScrollFrame, "TOPRIGHT", 0, -12) CommunitiesFrameGuildDetailsFrameInfoMOTDScrollFrameScrollBar:SetPoint("BOTTOMLEFT", CommunitiesFrameGuildDetailsFrameInfoMOTDScrollFrame, "BOTTOMRIGHT", 0, 12) CommunitiesFrameGuildDetailsFrameInfoScrollBar:SetPoint("TOPLEFT", CommunitiesFrameGuildDetailsFrameInfo.DetailsFrame, "TOPRIGHT", 0, -12) CommunitiesFrameGuildDetailsFrameInfoScrollBar:SetPoint("BOTTOMLEFT", CommunitiesFrameGuildDetailsFrameInfo.DetailsFrame, "BOTTOMRIGHT", 0, 13) -- Guild Message EditBox CommunitiesGuildTextEditFrame:StripTextures() CommunitiesGuildTextEditFrame:SetTemplate("Transparent") CommunitiesGuildTextEditFrame.Container:SetTemplate("Overlay") CommunitiesGuildTextEditFrameAcceptButton:SkinButton() select(4, CommunitiesGuildTextEditFrame:GetChildren()):SkinButton() -- Guild Log CommunitiesGuildLogFrame:StripTextures() CommunitiesGuildLogFrame.Container:StripTextures() CommunitiesGuildLogFrame.Container:SetTemplate("Overlay") CommunitiesGuildLogFrame:SetTemplate("Transparent") select(3, CommunitiesGuildLogFrame:GetChildren()):SkinButton() CommunitiesFrame.GuildLogButton:SkinButton() CommunitiesFrame.GuildLogButton:SetPoint("BOTTOMLEFT", CommunitiesFrame, "BOTTOMLEFT", 196, 5) -- Filters Frame CommunitiesGuildNewsFiltersFrame:StripTextures() CommunitiesGuildNewsFiltersFrame:SetTemplate("Transparent") for i = 1, #CommunitiesGuildNewsFiltersFrame.GuildNewsFilterButtons do local checkbox = CommunitiesGuildNewsFiltersFrame.GuildNewsFilterButtons[i] T.SkinCheckBox(checkbox) end end T.SkinFuncs["Blizzard_Communities"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Container.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Bank/Container skin ---------------------------------------------------------------------------------------- local function LoadSkin() if C.bag.enable == true or (IsAddOnLoaded("AdiBags") or IsAddOnLoaded("ArkInventory") or IsAddOnLoaded("cargBags_Nivaya") or IsAddOnLoaded("cargBags") or IsAddOnLoaded("Bagnon") or IsAddOnLoaded("Combuctor") or IsAddOnLoaded("TBag") or IsAddOnLoaded("BaudBag")) then return end -- Container Frame BagItemSearchBox:StripTextures(true) BagItemSearchBox:CreateBackdrop("Overlay") BagItemSearchBox.backdrop:SetPoint("TOPLEFT", 13, 0) BagItemSearchBox.backdrop:SetPoint("BOTTOMRIGHT", -2, 0) BagItemSearchBox:ClearAllPoints() BagItemSearchBox:SetPoint("TOPRIGHT", BagItemAutoSortButton, "TOPLEFT", -3, 0) BagItemSearchBox.ClearAllPoints = T.dummy BagItemSearchBox.SetPoint = T.dummy BagItemAutoSortButton:SetSize(18, 18) BagItemAutoSortButton:StyleButton() BagItemAutoSortButton:SetTemplate("Default") BagItemAutoSortButton:GetNormalTexture():SetTexture("Interface\\Icons\\inv_pet_broom") BagItemAutoSortButton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9) BagItemAutoSortButton:GetNormalTexture():ClearAllPoints() BagItemAutoSortButton:GetNormalTexture():SetPoint("TOPLEFT", 2, -2) BagItemAutoSortButton:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2) ContainerFrameCombinedBags:StripTextures(true) ContainerFrameCombinedBags:CreateBackdrop("Transparent") ContainerFrameCombinedBags.Bg:Hide() T.SkinCloseButton(ContainerFrameCombinedBags.CloseButton) -- ContainerFrameCombinedBags:ClearAllPoints() -- ContainerFrameCombinedBags:SetPoint(unpack(C.position.bag)) -- ContainerFrameCombinedBags.SetPoint = T.dummy ContainerFrameCombinedBags.MoneyFrame.Border:Hide() ContainerFrame1MoneyFrame.Border:Hide() ContainerFrameCombinedBagsPortrait:SetAlpha(0) ContainerFrameCombinedBagsPortraitButton.Highlight:SetAlpha(0) ContainerFrameCombinedBagsPortraitButtonTexture = ContainerFrameCombinedBagsPortraitButton:CreateTexture(nil, "OVERLAY") ContainerFrameCombinedBagsPortraitButtonTexture:SetSize(30, 30) ContainerFrameCombinedBagsPortraitButtonTexture:SetPoint("CENTER", 2, 1) ContainerFrameCombinedBagsPortraitButtonTexture:SetTexture("Interface\\Icons\\inv_misc_bag_08") ContainerFrameCombinedBagsPortraitButtonTexture:SkinIcon() local function updateQuestItems(self) for _, button in self:EnumerateValidItems() do if button.IconQuestTexture:IsShown() then if button.IconQuestTexture:GetTexture() == 368362 then button:SetBackdropBorderColor(1, 0.3, 0.3) else button:SetBackdropBorderColor(1, 1, 0) end else button:SetBackdropBorderColor(unpack(C.media.border_color)) end end end for i = 1, NUM_CONTAINER_FRAMES do local frame = _G["ContainerFrame"..i] local close = _G["ContainerFrame"..i].CloseButton frame:StripTextures(true) frame:CreateBackdrop("Transparent") frame.backdrop:SetPoint("TOPLEFT", 4, -2) frame.backdrop:SetPoint("BOTTOMRIGHT", 0, 2) frame.Bg:Hide() frame.TitleContainer:SetPoint("TOPLEFT", frame, "TOPLEFT", 40, -1) local portrait = _G["ContainerFrame"..i.."Portrait"] portrait:SetSize(28, 28) portrait:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -8) portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85) if frame.PortraitContainer.CircleMask then frame.PortraitContainer.CircleMask:Hide() end frame.b = CreateFrame("Frame", nil, frame) frame.b:SetTemplate("Default") frame.b:SetOutside(portrait) T.SkinCloseButton(close, frame.backdrop) for j = 1, 36 do local item = _G["ContainerFrame"..i.."Item"..j] local icon = _G["ContainerFrame"..i.."Item"..j.."IconTexture"] local quest = _G["ContainerFrame"..i.."Item"..j.."IconQuestTexture"] local border = _G["ContainerFrame"..i.."Item"..j].IconBorder border:SetAlpha(0) item:SetNormalTexture(0) item:StyleButton() item:SetTemplate("Default") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) quest:SetAlpha(0) end -- Color QuestItem hooksecurefunc(frame, "UpdateItems", function(self) updateQuestItems(self) end) end BackpackTokenFrame:StripTextures(true) hooksecurefunc(_G.BackpackTokenFrame, "Update", function (container) for _, token in next, container.Tokens do if not token.Icon.styled then token.Icon:SkinIcon() token.Count:ClearAllPoints() token.Count:SetPoint("RIGHT", token.Icon, "LEFT", -5, 0) token.Icon.styled = true end end end) -- Bank Frame BankFrame:StripTextures(true) BankFrame:CreateBackdrop("Transparent") BankFrame.backdrop:SetAllPoints() BankFramePortrait:SetAlpha(0) BankItemSearchBox:StripTextures(true) BankItemSearchBox:CreateBackdrop("Overlay") BankItemSearchBox.backdrop:SetPoint("TOPLEFT", 13, 0) BankItemSearchBox.backdrop:SetPoint("BOTTOMRIGHT", -2, 0) BankItemAutoSortButton:StyleButton() BankItemAutoSortButton:SetTemplate("Default") BankItemAutoSortButton:SetSize(20, 20) BankItemAutoSortButton:SetPoint("TOPLEFT", BankItemSearchBox, "TOPRIGHT", 3, 0) BankItemAutoSortButton:GetNormalTexture():SetTexture("Interface\\Icons\\inv_pet_broom") BankItemAutoSortButton:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9) BankItemAutoSortButton:GetNormalTexture():ClearAllPoints() BankItemAutoSortButton:GetNormalTexture():SetPoint("TOPLEFT", 2, -2) BankItemAutoSortButton:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2) BankFrameMoneyFrameInset:StripTextures() BankFrameMoneyFrameBorder:StripTextures() BankFramePurchaseButton:SkinButton() T.SkinCloseButton(BankFrameCloseButton, BankFrame.backdrop) BankSlotsFrame:StripTextures() for i = 1, 28 do local item = _G["BankFrameItem"..i] local icon = _G["BankFrameItem"..i.."IconTexture"] local quest = _G["BankFrameItem"..i].IconQuestTexture local border = _G["BankFrameItem"..i].IconBorder border:SetAlpha(0) item:SetNormalTexture(0) item:StyleButton() item:SetTemplate("Default") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) if quest then quest:SetAlpha(0) end end for i = 1, 7 do local bag = BankSlotsFrame["Bag"..i] local icon = bag.icon bag.IconBorder:SetAlpha(0) bag:StripTextures() bag:StyleButton() bag:SetTemplate("Default") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) end -- Tabs for i = 1, 2 do T.SkinTab(_G["BankFrameTab"..i]) end -- ReagentBank ReagentBankFrame:StripTextures() ReagentBankFrame:DisableDrawLayer("BACKGROUND") ReagentBankFrame:DisableDrawLayer("ARTWORK") ReagentBankFrameUnlockInfo:StripTextures() ReagentBankFrameUnlockInfo:CreateBackdrop("Overlay") ReagentBankFrameUnlockInfo.backdrop:SetPoint("TOPLEFT", 4, -2) ReagentBankFrameUnlockInfo.backdrop:SetPoint("BOTTOMRIGHT", -4, 2) ReagentBankFrameUnlockInfo.backdrop:SetFrameLevel(ReagentBankFrameUnlockInfo.backdrop:GetFrameLevel() + 1) ReagentBankFrameUnlockInfoPurchaseButton:SkinButton() ReagentBankFrameUnlockInfoPurchaseButton:SetFrameLevel(ReagentBankFrameUnlockInfo:GetFrameLevel() + 3) ReagentBankFrame.DespositButton:SkinButton() ReagentBankFrame:HookScript("OnShow", function() for i = 1, 98 do local item = _G["ReagentBankFrameItem"..i] local icon = _G["ReagentBankFrameItem"..i].icon local border = _G["ReagentBankFrameItem"..i].IconBorder border:SetAlpha(0) item:SetNormalTexture(0) item:StyleButton() item:SetTemplate("Default") icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) end end) -- Color QuestItem hooksecurefunc(ContainerFrameCombinedBags, "UpdateItems", function(self) updateQuestItems(self) end) hooksecurefunc("BankFrameItemButton_Update", function(frame) if not frame.isBag and frame.IconQuestTexture:IsShown() then if frame.IconQuestTexture:GetTexture() == 368362 then frame:SetBackdropBorderColor(1, 0.3, 0.3) else frame:SetBackdropBorderColor(1, 1, 0) end else if frame.SetBackdropBorderColor then -- ReagentBank frame:SetBackdropBorderColor(unpack(C.media.border_color)) end end end) -- Frame Anchors hooksecurefunc("UpdateContainerFrameAnchors", function() local frame, xOffset, yOffset, screenHeight, freeScreenHeight, leftMostPoint, column local screenWidth = GetScreenWidth() local containerScale = 1 local leftLimit = 0 if BankFrame:IsShown() then leftLimit = BankFrame:GetRight() - 25 end while containerScale > 0.75 do screenHeight = GetScreenHeight() / containerScale xOffset = CONTAINER_OFFSET_X / containerScale yOffset = CONTAINER_OFFSET_Y / containerScale freeScreenHeight = screenHeight - yOffset leftMostPoint = screenWidth - xOffset column = 1 local frameHeight -- for _, frameName in ipairs(ContainerFrame1.bags) do -- frameHeight = _G[frameName]:GetHeight() -- if freeScreenHeight < frameHeight then -- column = column + 1 -- leftMostPoint = screenWidth - (column * 192 * containerScale) - xOffset -- freeScreenHeight = screenHeight - yOffset -- end -- freeScreenHeight = freeScreenHeight - frameHeight - 3 -- end if leftMostPoint < leftLimit then containerScale = containerScale - 0.01 else break end end if containerScale < 0.75 then containerScale = 0.75 end screenHeight = GetScreenHeight() / containerScale xOffset = CONTAINER_OFFSET_X / containerScale yOffset = CONTAINER_OFFSET_Y / containerScale freeScreenHeight = screenHeight - yOffset column = 0 -- local bagsPerColumn = 0 -- for index, frameName in ipairs(ContainerFrame1.bags) do -- frame = _G[frameName] -- frame:SetScale(1) -- if index == 1 then -- frame:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -21, 22) -- bagsPerColumn = bagsPerColumn + 1 -- elseif freeScreenHeight < frame:GetHeight() then -- column = column + 1 -- freeScreenHeight = screenHeight - yOffset -- if column > 1 then -- frame:SetPoint("BOTTOMRIGHT", ContainerFrame1.bags[(index - bagsPerColumn) - 1], "BOTTOMLEFT", 0, 0) -- else -- frame:SetPoint("BOTTOMRIGHT", ContainerFrame1.bags[index - bagsPerColumn], "BOTTOMLEFT", 0, 0) -- end -- bagsPerColumn = 0 -- else -- frame:SetPoint("BOTTOMRIGHT", ContainerFrame1.bags[index - 1], "TOPRIGHT", 0, 0) -- bagsPerColumn = bagsPerColumn + 1 -- end -- freeScreenHeight = freeScreenHeight - frame:GetHeight() - 3 -- end end) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Contribution.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Contribution skin ---------------------------------------------------------------------------------------- local LoadTootlipSkin = CreateFrame("Frame") LoadTootlipSkin:RegisterEvent("ADDON_LOADED") LoadTootlipSkin:SetScript("OnEvent", function(self, _, addon) if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") or not C.tooltip.enable then self:UnregisterEvent("ADDON_LOADED") return end if addon == "Blizzard_Contribution" then ContributionBuffTooltip:StripTextures() ContributionBuffTooltip:SetTemplate("Transparent") ContributionBuffTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) ContributionBuffTooltip:CreateBackdrop("Default") ContributionBuffTooltip.backdrop:SetFrameLevel(ContributionBuffTooltip:GetFrameLevel()) ContributionBuffTooltip.backdrop:SetPoint("TOPLEFT", ContributionBuffTooltip.Icon, "TOPLEFT", -2, 2) ContributionBuffTooltip.backdrop:SetPoint("BOTTOMRIGHT", ContributionBuffTooltip.Icon, "BOTTOMRIGHT", 2, -2) end end) if C.skins.blizzard_frames ~= true then return end local function LoadSkin() T.SkinCloseButton(ContributionCollectionFrame.CloseButton) ContributionCollectionFrame.CloseButton:SetPoint("TOPRIGHT", ContributionCollectionFrame, "TOPRIGHT", -17, -23) ContributionCollectionFrame.CloseButton.text:SetPoint("CENTER", -T.mult, T.mult) hooksecurefunc(ContributionMixin, "SetupContributeButton", function(self) if not self.isSkinned then self.ContributeButton:SkinButton() self.isSkinned = true end local statusBar = self.Status if statusBar and not statusBar.backdrop then statusBar:StripTextures() statusBar:CreateBackdrop("Default") statusBar.Text:SetFont(C.media.normal_font, 12, "OUTLINE") end end) hooksecurefunc(ContributionRewardMixin, "Setup", function(self) if not self.backdrop then self.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) self.Icon:SetDrawLayer("OVERLAY") self:SetFrameLevel(5) self:CreateBackdrop("Default") self.backdrop:SetPoint("TOPLEFT", self.Icon, "TOPLEFT", -2, 2) self.backdrop:SetPoint("BOTTOMRIGHT", self.Icon, "BOTTOMRIGHT", 2, -2) end end) end T.SkinFuncs["Blizzard_Contribution"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/CovenantPreview.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Covenant Preview skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = CovenantPreviewFrame frame.InfoPanel.Name:SetTextColor(1, 1, 1) frame.InfoPanel.Location:SetTextColor(1, 1, 1) frame.InfoPanel.Description:SetTextColor(1, 1, 1) frame.InfoPanel.AbilitiesFrame.AbilitiesLabel:SetTextColor(1, .8, 0) frame.InfoPanel.SoulbindsFrame.SoulbindsLabel:SetTextColor(1, .8, 0) frame.InfoPanel.CovenantFeatureFrame.Label:SetTextColor(1, .8, 0) hooksecurefunc(frame, "TryShow", function(covenantInfo) if covenantInfo and not frame.IsSkinned then frame:CreateBackdrop("Transparent") frame.ModelSceneContainer.ModelSceneBorder:SetAlpha(0) frame.InfoPanel:CreateBackdrop("Overlay") frame.InfoPanel.backdrop:SetPoint("TOPLEFT", 0, 1) frame.InfoPanel.backdrop:SetPoint("BOTTOMRIGHT", 0, -1) frame.ModelSceneContainer:CreateBackdrop("Default") frame.Title:DisableDrawLayer("BACKGROUND") frame.Title.Text:SetTextColor(1, 0.8, 0) frame.Background:SetAlpha(0) frame.BorderFrame:SetAlpha(0) frame.InfoPanel.Parchment:SetAlpha(0) frame.CloseButton.Border:Kill() T.SkinCloseButton(frame.CloseButton) frame.SelectButton:SkinButton() frame.IsSkinned = true end frame.CloseButton:SetPoint("TOPRIGHT", -4, -4) end) frame.ModelSceneContainer.Background:SetTexCoord(0.00970873786408, 0.97109826589595, 0.0092807424594, 0.97109826589595) T.SkinCheckBox(TransmogAndMountDressupFrame.ShowMountCheckButton) end T.SkinFuncs["Blizzard_CovenantPreviewUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/CovenantRenown.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Covenant Renown skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = CovenantRenownFrame frame:CreateBackdrop("Transparent") T.SkinCloseButton(frame.CloseButton) hooksecurefunc(frame, "SetUpCovenantData", function(self) self.CloseButton.Border:Hide() self:StripTextures() end) hooksecurefunc(frame, "SetRewards", function(self) for reward in self.rewardsPool:EnumerateActive() do if not reward.backdrop then reward:CreateBackdrop("Overlay") reward.backdrop:SetPoint("TOPLEFT", reward, 2, -15) reward.backdrop:SetPoint("BOTTOMRIGHT", reward, -2, 15) reward.Toast:SetAlpha(0) reward.Highlight:SetAlpha(0) reward.CircleMask:Hide() reward.IconBorder:SetAlpha(0) reward.b = CreateFrame("Frame", nil, reward) reward.b:SetTemplate("Default") reward.b:SetPoint("TOPLEFT", reward.Icon, "TOPLEFT", -2, 2) reward.b:SetPoint("BOTTOMRIGHT", reward.Icon, "BOTTOMRIGHT", 2, -2) reward.Icon:SetParent(reward.b) reward.Icon:SetTexCoord(0.15, 0.85, 0.15, 0.85) reward.Check:SetParent(reward.b) end end end) end T.SkinFuncs["Blizzard_CovenantRenown"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/CovenantSanctum.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Covenant Sanctum skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = CovenantSanctumFrame frame.UpgradesTab.DepositButton:SkinButton() frame.LevelFrame.Background:SetAlpha(0) frame.UpgradesTab:CreateBackdrop("Overlay") frame.UpgradesTab.backdrop:SetPoint("TOPLEFT", frame.UpgradesTab.Background, -2, 2) frame.UpgradesTab.backdrop:SetPoint("BOTTOMRIGHT", frame.UpgradesTab.Background, 2, -2) local talentsList = frame.UpgradesTab.TalentsList talentsList:CreateBackdrop("Overlay") talentsList.backdrop:SetPoint("TOPLEFT", 6, 2) talentsList.backdrop:SetPoint("BOTTOMRIGHT", 2, -2) talentsList.UpgradeButton:SkinButton() talentsList.Divider:SetAlpha(0) talentsList.BackgroundTile:SetAlpha(0) talentsList.IntroBox.Background:Hide() local function HandleIconString(self, text) if not text then text = self:GetText() end if not text or text == '' then return end local new, count = gsub(text, '|T([^:]-):[%d+:]+|t', '|T%1:14:14:0:0:64:64:5:59:5:59|t') if count > 0 then self:SetFormattedText('%s', new) end end for frame in frame.UpgradesTab.CurrencyDisplayGroup.currencyFramePool:EnumerateActive() do if not frame.IsSkinned then HandleIconString(frame.Text) hooksecurefunc(frame.Text, "SetText", HandleIconString) frame.IsSkinned = true end end hooksecurefunc(talentsList, "Refresh", function(self) for frame in self.talentPool:EnumerateActive() do if not frame.backdrop then frame.Border:SetAlpha(0) frame.IconBorder:SetAlpha(0) frame.TierBorder:SetAlpha(0) frame.Background:SetAlpha(0) frame:CreateBackdrop("Overlay") frame.backdrop:SetInside() frame.backdrop.overlay:SetVertexColor(0.15, 0.15, 0.15, 1) frame.Icon:SetPoint("TOPLEFT", 10, -10) frame.Icon:SetSize(35, 35) frame.Icon:SkinIcon(true) frame.Highlight:SetColorTexture(1, 1, 1, 0.3) frame.Highlight:SetInside(frame.backdrop) HandleIconString(frame.InfoText) hooksecurefunc(frame.InfoText, "SetText", HandleIconString) end end end) frame:HookScript("OnShow", function() if not frame.backdrop then frame:CreateBackdrop("Transparent") frame.NineSlice:SetAlpha(0) frame.CloseButton.Border:SetAlpha(0) T.SkinCloseButton(frame.CloseButton) end end) end T.SkinFuncs["Blizzard_CovenantSanctum"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/DeathRecap.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- DeathRecap skin ---------------------------------------------------------------------------------------- local function LoadSkin() DeathRecapFrame:StripTextures() DeathRecapFrame:SetTemplate("Transparent") DeathRecapFrame.CloseButton:SkinButton(true) T.SkinCloseButton(DeathRecapFrame.CloseXButton) for i = 1, NUM_DEATH_RECAP_EVENTS do local recap = DeathRecapFrame["Recap"..i].SpellInfo recap.IconBorder:Hide() recap.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) recap:CreateBackdrop("Default") recap.backdrop:SetPoint("TOPLEFT", recap.Icon, "TOPLEFT", -2, 2) recap.backdrop:SetPoint("BOTTOMRIGHT", recap.Icon, "BOTTOMRIGHT", 2, -2) end end T.SkinFuncs["Blizzard_DeathRecap"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/DebugTools.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- DebugTools skin ---------------------------------------------------------------------------------------- local function LoadSkin() FrameStackTooltip:HookScript("OnShow", function(self) self.NineSlice:SetTemplate("Transparent") end) local function SkinTableAttributeDisplay(frame) if frame.isSkinned then return end T.SkinFrame(frame) frame.ScrollFrameArt.NineSlice:SetTemplate("Overlay") T.SkinNextPrevButton(frame.OpenParentButton, nil, "Up") T.SkinNextPrevButton(frame.NavigateBackwardButton, true, "Any") T.SkinNextPrevButton(frame.NavigateForwardButton, nil, "Any") T.SkinNextPrevButton(frame.DuplicateButton, nil, "Down") T.SkinCheckBox(frame.VisibilityButton, 26) T.SkinCheckBox(frame.HighlightButton, 26) T.SkinCheckBox(frame.DynamicUpdateButton, 26) frame.OpenParentButton:ClearAllPoints() frame.OpenParentButton:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -4) frame.OpenParentButton:SetSize(17, 17) frame.NavigateBackwardButton:ClearAllPoints() frame.NavigateBackwardButton:SetPoint("LEFT", frame.OpenParentButton, "RIGHT", 3, 0) frame.NavigateForwardButton:ClearAllPoints() frame.NavigateForwardButton:SetPoint("LEFT", frame.NavigateBackwardButton, "RIGHT", 3, 0) frame.DuplicateButton:ClearAllPoints() frame.DuplicateButton:SetPoint("LEFT", frame.NavigateForwardButton, "RIGHT", 3, 0) frame.DuplicateButton:SetSize(17, 17) T.SkinEditBox(frame.FilterBox) T.SkinScrollBar(frame.LinesScrollFrame.ScrollBar) frame.isSkinned = true end SkinTableAttributeDisplay(TableAttributeDisplay) hooksecurefunc(TableInspectorMixin, "InspectTable", SkinTableAttributeDisplay) end T.SkinFuncs["Blizzard_DebugTools"] = LoadSkin local function LoadSecondarySkin() ScriptErrorsFrame:SetParent(UIParent) ScriptErrorsFrame:SetSize(400, 280) ScriptErrorsFrame:StripTextures() ScriptErrorsFrame:SetTemplate("Transparent") ScriptErrorsFrame.Reload:SkinButton() ScriptErrorsFrame.Close:SkinButton() T.SkinNextPrevButton(ScriptErrorsFrame.PreviousError, true) T.SkinNextPrevButton(ScriptErrorsFrame.NextError) T.SkinScrollBar(ScriptErrorsFrameScrollBar) T.SkinCloseButton(ScriptErrorsFrameClose) ScriptErrorsFrame.ScrollFrame:CreateBackdrop("Overlay") ScriptErrorsFrame.ScrollFrame:SetSize(ScriptErrorsFrame:GetWidth() - 45, ScriptErrorsFrame:GetHeight() - 72) ScriptErrorsFrame.ScrollFrame.Text:SetFont(C.media.normal_font, 12, "") end tinsert(T.SkinFuncs["ShestakUI"], LoadSecondarySkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/DressUp.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- DressUp skin ---------------------------------------------------------------------------------------- local function LoadSkin() DressUpFrame:StripTextures() DressUpFrame:SetTemplate("Transparent") DressUpFramePortrait:Hide() DressUpFrameInset:Hide() DressUpFrame.ModelScene:CreateBackdrop("Default") DressUpFrame.ModelScene.backdrop:SetPoint("TOPLEFT", -3, 4) DressUpFrame.ModelScene.backdrop:SetPoint("BOTTOMRIGHT", 2, 1) DressUpFrame.ModelBackground:SetDrawLayer("BACKGROUND", 3) T.SkinMaxMinFrame(DressUpFrame.MaximizeMinimizeFrame, DressUpFrameCloseButton) DressUpFrameCancelButton:SkinButton() DressUpFrameResetButton:SkinButton() DressUpFrameResetButton:SetPoint("RIGHT", DressUpFrameCancelButton, "LEFT", -2, 0) DressUpFrameUndressButton:SkinButton() local button = DressUpFrame.ToggleOutfitDetailsButton button:SetNormalTexture(134331) button:SetPushedTexture(134331) button:StyleButton(true) button:SetTemplate("Default") button:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9) button:GetNormalTexture():SetInside() button:GetPushedTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9) button:GetPushedTexture():SetInside() DressUpFrame.OutfitDetailsPanel:StripTextures() DressUpFrame.OutfitDetailsPanel:CreateBackdrop("Transparent") DressUpFrame.OutfitDetailsPanel.backdrop:SetPoint("TOPLEFT", 11, 0) DressUpFrame.OutfitDetailsPanel.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) hooksecurefunc(DressUpFrame.OutfitDetailsPanel, "Refresh", function(self) if self.slotPool then for slot in self.slotPool:EnumerateActive() do if not slot.skinned then slot.Icon:SkinIcon() slot.IconBorder:SetAlpha(0) slot.skinned = true end local point, relativeTo, relativePoint, xOfs, yOfs = slot:GetPoint() if yOfs == 0 then slot:SetPoint(point, relativeTo, relativePoint, xOfs, yOfs - 3) end end end end) DressUpFrame.LinkButton:SkinButton() DressUpFrame.LinkButton:SetPoint("BOTTOMLEFT", 4, 4) T.SkinDropDownBox(DressUpFrameOutfitDropDown) DressUpFrameOutfitDropDown:SetSize(195, 34) DressUpFrameOutfitDropDown.SaveButton:SkinButton() DressUpFrameOutfitDropDown.SaveButton:ClearAllPoints() DressUpFrameOutfitDropDown.SaveButton:SetPoint("RIGHT", DressUpFrameOutfitDropDown, 86, 4) T.SkinCloseButton(DressUpFrameCloseButton, DressUpFrame.backdrop) SideDressUpFrame:StripTextures() SideDressUpFrame:SetTemplate("Transparent") SideDressUpFrame.ResetButton:SkinButton() SideDressUpFrame.BGTopLeft:SetPoint("TOPLEFT", 2, -2) SideDressUpFrame.BGTopLeft:SetSize(183, 292) SideDressUpFrame.BGBottomLeft:SetSize(183, 93) T.SkinCloseButton(SideDressUpFrameCloseButton, SideDressUpFrame) WardrobeOutfitFrame:StripTextures(true) WardrobeOutfitFrame:CreateBackdrop("Transparent") WardrobeOutfitFrame.backdrop:SetPoint("TOPLEFT", WardrobeOutfitFrame, "TOPLEFT", 6, -6) WardrobeOutfitFrame.backdrop:SetPoint("BOTTOMRIGHT", WardrobeOutfitFrame, "BOTTOMRIGHT", -6, 6) WardrobeOutfitEditFrame:StripTextures(true) WardrobeOutfitEditFrame:SetTemplate("Transparent") WardrobeOutfitEditFrame.AcceptButton:SkinButton() WardrobeOutfitEditFrame.CancelButton:SkinButton() WardrobeOutfitEditFrame.DeleteButton:SkinButton() T.SkinEditBox(WardrobeOutfitEditFrame.EditBox, 250, 25) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/EditorManager.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Edit Mode Manager skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = _G.EditModeManagerFrame T.SkinFrame(frame) frame.Tutorial:Kill() frame.RevertAllChangesButton:SkinButton() frame.SaveChangesButton:SkinButton() T.SkinDropDownBox(frame.LayoutDropdown.DropDownMenu, 240) T.SkinCheckBox(frame.ShowGridCheckButton.Button, 30) T.SkinCheckBox(frame.EnableSnapCheckButton.Button, 30) T.SkinSliderStep(frame.GridSpacingSlider.Slider, true) for _, frame in next, {frame.AccountSettings.Settings:GetChildren()} do if frame.Button then T.SkinCheckBox(frame.Button, 30) end end local function HandleDialogs() local dialog = _G.EditModeSystemSettingsDialog for _, button in next, {dialog.Buttons:GetChildren()} do if button.Controller and not button.isSkinned then button:SkinButton() end end for _, frame in next, {dialog.Settings:GetChildren()} do local dd = frame.Dropdown if dd and (dd.DropDownMenu and not dd.isSkinned) then T.SkinDropDownBox(dd.DropDownMenu, 240) dd.isSkinned = true end local checkbox = frame.Button if checkbox and not checkbox.backdrop then T.SkinCheckBoxAtlas(checkbox) end local slider = frame.Slider if slider and not slider.isSkinned then T.SkinSliderStep(slider, true) slider.isSkinned = true end end end -- Layout Creator local layout = _G.EditModeNewLayoutDialog layout:StripTextures() layout:CreateBackdrop("Transparent") layout.AcceptButton:SkinButton() layout.CancelButton:SkinButton() T.SkinEditBox(layout.LayoutNameEditBox) T.SkinCheckBoxAtlas(layout.CharacterSpecificLayoutCheckButton.Button, 26) -- Layout Unsaved local unsaved = _G.EditModeUnsavedChangesDialog unsaved:StripTextures() unsaved:CreateBackdrop("Transparent") unsaved.CancelButton:SkinButton() unsaved.ProceedButton:SkinButton() unsaved.SaveAndProceedButton:SkinButton() -- Layout Importer local import = _G.EditModeImportLayoutDialog import:StripTextures() import:CreateBackdrop("Transparent") import.AcceptButton:SkinButton() import.CancelButton:SkinButton() T.SkinCheckBoxAtlas(import.CharacterSpecificLayoutCheckButton.Button, 26) local importBox = import.ImportBox T.SkinEditBox(importBox) local importBackdrop = importBox.backdrop importBackdrop:ClearAllPoints() importBackdrop:SetPoint("TOPLEFT", importBox, -4, 4) importBackdrop:SetPoint("BOTTOMRIGHT", importBox, 0, -4) local scrollbar = importBox.ScrollBar T.SkinScrollBar(scrollbar) scrollbar:ClearAllPoints() scrollbar:SetPoint("TOPLEFT", importBox, "TOPRIGHT", 4, 4) scrollbar:SetPoint("BOTTOMLEFT", importBox, "BOTTOMRIGHT", 0, -4) local editbox = import.LayoutNameEditBox T.SkinEditBox(editbox) local editbackdrop = editbox.backdrop editbackdrop:ClearAllPoints() editbackdrop:SetPoint("TOPLEFT", editbox, -2, -4) editbackdrop:SetPoint("BOTTOMRIGHT", editbox, 2, 4) -- Dialog (Mover Settings) local dialog = _G.EditModeSystemSettingsDialog dialog:StripTextures() dialog:CreateBackdrop("Transparent") T.SkinCloseButton(dialog.CloseButton) hooksecurefunc(dialog.Buttons, "AddLayoutChildren", HandleDialogs) HandleDialogs() end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/EncounterJournal.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- EncounterJournal skin ---------------------------------------------------------------------------------------- local LoadTootlipSkin = CreateFrame("Frame") LoadTootlipSkin:RegisterEvent("ADDON_LOADED") LoadTootlipSkin:SetScript("OnEvent", function(self, _, addon) if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") or not C.tooltip.enable then self:UnregisterEvent("ADDON_LOADED") return end if addon == "Blizzard_EncounterJournal" then local tooltip = EncounterJournalTooltip local item1 = tooltip.Item1 local item2 = tooltip.Item2 tooltip.NineSlice:SetTemplate("Transparent") local b = CreateFrame("Frame", "$parentBackdrop", item1) b:SetPoint("TOPLEFT", item1.icon, -2, 2) b:SetPoint("BOTTOMRIGHT", item1.icon, 2, -2) b:SetFrameLevel(1) b:SetTemplate("Default") local c = CreateFrame("Frame", "$parentBackdrop", item2) c:SetPoint("TOPLEFT", item2.icon, -2, 2) c:SetPoint("BOTTOMRIGHT", item2.icon, 2, -2) c:SetFrameLevel(1) c:SetTemplate("Default") item1.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) item2.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) item1.IconBorder:SetAlpha(0) item2.IconBorder:SetAlpha(0) end end) if C.skins.blizzard_frames ~= true then return end local function LoadSkin() EncounterJournal:StripTextures(true) EncounterJournal.inset:StripTextures(true) EncounterJournal:CreateBackdrop("Transparent") EncounterJournal.backdrop:SetPoint("TOPLEFT", -3, 0) EncounterJournal.backdrop:SetPoint("BOTTOMRIGHT", 0, -2) EncounterJournalPortrait:SetAlpha(0) EncounterJournalNavBar:StripTextures(true) EncounterJournalNavBar.overlay:StripTextures(true) EncounterJournalNavBar:CreateBackdrop("Transparent") EncounterJournalNavBar.backdrop:SetPoint("TOPLEFT", -3, 1) EncounterJournalNavBar.backdrop:SetPoint("BOTTOMRIGHT", 0, -1) EncounterJournalNavBarHomeButton:SkinButton(true) EncounterJournalEncounterFrameInfoFilterToggle:SkinButton(true) EncounterJournalEncounterFrameInfoSlotFilterToggle:SkinButton(true) EncounterJournalEncounterFrameInfoClassFilterClearFrame:GetRegions():SetAlpha(0) EncounterJournalEncounterFrameInfoDifficulty:SkinButton(true) EncounterJournalEncounterFrameInfoDifficulty:SetWidth(95) EncounterJournalEncounterFrameInfoDifficulty:SetPoint("TOPRIGHT", EncounterJournalEncounterFrameInfo, "TOPRIGHT", -7, -13) -- EncounterJournalEncounterFrameInfoLootScrollFrameFilterToggle:SetPoint("TOPLEFT", EncounterJournalEncounterFrameInfo, "TOPRIGHT", -349, -13) hooksecurefunc(EncounterJournalEncounterFrameInfoResetButton, "SetPoint", function(self, _, _, _, x) if x == -10 then self:SetPoint("RIGHT", EncounterJournalEncounterFrameInfoDifficulty, "LEFT", -5, 0) end end) local mainTabs = { EncounterJournalSuggestTab, EncounterJournalDungeonTab, EncounterJournalRaidTab, EncounterJournalLootJournalTab } if T.newPatch then tinsert(mainTabs, 1, EncounterJournalMonthlyActivitiesTab) end for _, tab in pairs(mainTabs) do T.SkinTab(tab) end mainTabs[1]:SetPoint("TOPLEFT", EncounterJournal, "BOTTOMLEFT", 11, 0) T.SkinEditBox(EncounterJournalSearchBox) T.SkinCloseButton(EncounterJournalCloseButton) T.SkinDropDownBox(EncounterJournalInstanceSelectTierDropDown) if T.newPatch then EncounterJournalInstanceSelectBG:SetAlpha(0) end EncounterJournalInstanceSelect.bg:Kill() EncounterJournalEncounterFrameInfoBG:Kill() EncounterJournal.encounter.info.leftShadow:Kill() EncounterJournal.encounter.info.rightShadow:Kill() EncounterJournal.encounter.info.model.dungeonBG:Kill() EncounterJournalEncounterFrameInfoModelFrameShadow:Kill() EncounterJournal.encounter.info.instanceButton:ClearAllPoints() EncounterJournal.encounter.info.instanceButton:SetPoint("TOPLEFT", EncounterJournal.encounter.info, "TOPLEFT", 0, 15) EncounterJournal.encounter.info.instanceTitle:ClearAllPoints() EncounterJournal.encounter.info.instanceTitle:SetPoint("BOTTOM", EncounterJournal.encounter.info.bossesScroll, "TOP", 10, 15) EncounterJournal.encounter.info.detailsScroll.child.description:SetTextColor(1, 1, 1) EncounterJournal.encounter.info.overviewScroll.child.loreDescription:SetTextColor(1, 1, 1) EncounterJournalEncounterFrameInfoOverviewScrollFrameScrollChildHeader:SetAlpha(0) EncounterJournalEncounterFrameInfoOverviewScrollFrameScrollChildTitle:SetFont(C.media.normal_font, 16, "") EncounterJournalEncounterFrameInfoOverviewScrollFrameScrollChildTitle:SetTextColor(1, 1, 1) EncounterJournalEncounterFrameInfoOverviewScrollFrameScrollChild.overviewDescription.Text:SetTextColor("P", 1, 1, 1) EncounterJournal.encounter.info.reset:StripTextures() EncounterJournal.encounter.info.reset:SkinButton() EncounterJournalEncounterFrameInfoResetButtonTexture:SetTexture("Interface\\EncounterJournal\\UI-EncounterJournalTextures") EncounterJournalEncounterFrameInfoResetButtonTexture:SetTexCoord(0.90625000, 0.94726563, 0.00097656, 0.02050781) local tabs = { EncounterJournalEncounterFrameInfoOverviewTab, EncounterJournalEncounterFrameInfoLootTab, EncounterJournalEncounterFrameInfoBossTab, EncounterJournalEncounterFrameInfoModelTab } for _, tab in pairs(tabs) do tab:CreateBackdrop("Overlay") tab.backdrop:SetPoint("TOPLEFT", 3, -3) tab.backdrop:SetPoint("BOTTOMRIGHT", 0, 2) tab:SetNormalTexture(0) tab:SetPushedTexture(0) tab:SetDisabledTexture(0) tab:SetHighlightTexture(0) end EncounterJournalEncounterFrameInfoOverviewTab:SetPoint("TOPLEFT", EncounterJournalEncounterFrameInfo, "TOPRIGHT", 8, -40) EncounterJournalEncounterFrameInfoOverviewTab.SetPoint = T.dummy T.SkinScrollBar(EncounterJournalInstanceSelect.ScrollBar) T.SkinScrollBar(EncounterJournalEncounterFrameInfo.LootContainer.ScrollBar) T.SkinScrollBar(EncounterJournalEncounterFrameInstanceFrame.LoreScrollBar) T.SkinScrollBar(EncounterJournalEncounterFrameInfoDetailsScrollFrameScrollBar) T.SkinScrollBar(EncounterJournalEncounterFrameInfo.BossesScrollBar) T.SkinScrollBar(EncounterJournalEncounterFrameInfoOverviewScrollFrameScrollBar) for i = 1, AJ_MAX_NUM_SUGGESTIONS do local suggestion = EncounterJournal.suggestFrame["Suggestion"..i] suggestion.bg:Hide() suggestion.centerDisplay.title.text:SetTextColor(1, 1, 1) suggestion.centerDisplay.description.text:SetTextColor(1, 1, 1) suggestion.reward.iconRing:Hide() suggestion.reward.iconRingHighlight:SetTexture("") suggestion.icon.b = CreateFrame("Frame", nil, suggestion) suggestion.icon.b:SetTemplate("Default") suggestion.icon.b:SetPoint("TOPLEFT", suggestion.icon, "TOPLEFT", -2, 2) suggestion.icon.b:SetPoint("BOTTOMRIGHT", suggestion.icon, "BOTTOMRIGHT", 2, -2) suggestion.icon.b:SetFrameLevel(1) suggestion.reward:CreateBackdrop("Default") suggestion.reward.backdrop:SetFrameLevel(suggestion.reward:GetFrameLevel()) suggestion.reward.backdrop:SetPoint("TOPLEFT", suggestion.reward.icon, -2, 2) suggestion.reward.backdrop:SetPoint("BOTTOMRIGHT", suggestion.reward.icon, 2, -2) suggestion:CreateBackdrop("Overlay") suggestion.backdrop:SetFrameLevel(0) if i == 1 then suggestion.icon:SetPoint("TOPLEFT", 135, -15) suggestion.button:SkinButton() suggestion.reward.text:SetTextColor(1, 1, 1) suggestion.backdrop:SetPoint("TOPLEFT", -2, -2) T.SkinNextPrevButton(suggestion.prevButton) T.SkinNextPrevButton(suggestion.nextButton) else suggestion.icon:SetPoint("TOPLEFT", 10, -10) suggestion.centerDisplay:SetPoint("TOPLEFT", 85, -10) suggestion.centerDisplay.button:SkinButton() end end EncounterJournalEncounterFrameInstanceFrame.titleBG:SetAlpha(0) EncounterJournalEncounterFrameInstanceFrameBG:SetTexCoord(0.69, 0.06, 0.58, 0.09) EncounterJournalEncounterFrameInstanceFrameBG:SetRotation(rad(180)) EncounterJournalEncounterFrameInstanceFrame:CreateBackdrop("Default") EncounterJournalEncounterFrameInstanceFrame.backdrop:SetOutside(EncounterJournalEncounterFrameInstanceFrameBG) EncounterJournalEncounterFrameInstanceFrameBG:SetSize(325, 240) EncounterJournalEncounterFrameInstanceFrameBG:ClearAllPoints() EncounterJournalEncounterFrameInstanceFrameBG:SetPoint("TOP", EncounterJournalEncounterFrameInstanceFrame, "TOP", 0, -45) EncounterJournalEncounterFrameInstanceFrameMapButton:ClearAllPoints() EncounterJournalEncounterFrameInstanceFrameMapButton:SetPoint("BOTTOMLEFT", EncounterJournalEncounterFrameInstanceFrameBG, "BOTTOMLEFT", 5, 5) EncounterJournalEncounterFrameInstanceFrame.LoreScrollingFont:SetHeight(EncounterJournalEncounterFrameInstanceFrame.LoreScrollingFont:GetHeight() + 25) for _, child in next, { _G.EncounterJournalEncounterFrameInstanceFrame.LoreScrollingFont.ScrollBox.ScrollTarget:GetChildren() } do if child.FontString then child.FontString:SetTextColor(1, 1, 1) end end hooksecurefunc(_G.EncounterJournal.instanceSelect.ScrollBox, "Update", function(frame) for _, b in next, {frame.ScrollTarget:GetChildren()} do if not b.isSkinned then b:SkinButton() if b.bgImage then b.bgImage:SetPoint("TOPLEFT", 2, -2) b.bgImage:SetPoint("BOTTOMRIGHT", -2, 2) b.bgImage:SetTexCoord(0.08, 0.6, 0.08, 0.6) b.bgImage:SetDrawLayer("ARTWORK") end b.isSkinned = true end end end) hooksecurefunc(_G.EncounterJournal.encounter.info.BossesScrollBox, "Update", function(frame) for _, child in next, {frame.ScrollTarget:GetChildren()} do if not child.isSkinned then child:SkinButton() child.isSkinned = true end end end) hooksecurefunc(_G.EncounterJournal.encounter.info.LootContainer.ScrollBox, "Update", function(frame) for _, child in next, {frame.ScrollTarget:GetChildren()} do if not child.isSkinned then if child.bossTexture then child.bossTexture:SetAlpha(0) end if child.bosslessTexture then child.bosslessTexture:SetAlpha(0) end if child.boss then child.boss:ClearAllPoints() child.boss:SetPoint("BOTTOMLEFT", 4, 4) child.boss:SetTextColor(1, 1, 1) end if child.slot then child.slot:ClearAllPoints() child.slot:SetPoint("BOTTOMLEFT", child.icon, "BOTTOMRIGHT", 7, -2) child.slot:SetTextColor(1, 1, 1) end if child.armorType then child.armorType:ClearAllPoints() child.armorType:SetPoint("BOTTOMRIGHT", child.name, "TOPLEFT", 264, -25) child.armorType:SetTextColor(1, 1, 1) end if child.icon then child.icon:SetSize(30, 30) child.icon:SetPoint("TOPLEFT", T.mult*6, -(T.mult*10)) child.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) child.icon:SetDrawLayer("ARTWORK") if not child.IconBackdrop then child.IconBackdrop = CreateFrame("Frame", nil, child) child.IconBackdrop:SetFrameLevel(child:GetFrameLevel()) child.IconBackdrop:SetPoint("TOPLEFT", child.icon, -2, 2) child.IconBackdrop:SetPoint("BOTTOMRIGHT", child.icon, 2, -2) child.IconBackdrop:SetTemplate("Default") hooksecurefunc(child.IconBorder, "SetVertexColor", function(self, r, g, b) self:GetParent().IconBackdrop:SetBackdropBorderColor(r, g, b) self:SetTexture("") end) end end if not child.backdrop and not child.TipButton then child:CreateBackdrop("Overlay") child.backdrop:SetPoint("TOPLEFT", 0, -4) child.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) end child.isSkinned = true end end end) local function SkinOverviewInfo(self, _, index) local header = self.overviews[index] if not header.isSkinned then header.descriptionBG:SetAlpha(0) header.descriptionBGBottom:SetAlpha(0) for i = 4, 18 do select(i, header.button:GetRegions()):SetTexture("") end header.button:SkinButton() header.button.title:SetTextColor(1, 1, 0) header.button.title.SetTextColor = T.dummy header.button.expandedIcon:SetTextColor(1, 1, 1) header.button.expandedIcon.SetTextColor = T.dummy header.isSkinned = true end end hooksecurefunc("EncounterJournal_SetUpOverview", SkinOverviewInfo) local function SkinOverviewInfoBullets(object) local parent = object:GetParent() if parent.Bullets then for _, bullet in pairs(parent.Bullets) do if not bullet.styled then bullet.Text:SetTextColor("P", 1, 1, 1) bullet.styled = true end end end end hooksecurefunc("EncounterJournal_SetBullets", SkinOverviewInfoBullets) local function SkinAbilitiesInfo() local index = 1 local header = _G["EncounterJournalInfoHeader"..index] while header do if not header.isSkinned then header.flashAnim.Play = T.dummy header.descriptionBG:SetAlpha(0) header.descriptionBGBottom:SetAlpha(0) for i = 4, 18 do select(i, header.button:GetRegions()):SetTexture("") end header.description:SetTextColor(1, 1, 1) header.button.title:SetTextColor(1, 1, 0) header.button.title.SetTextColor = T.dummy header.button.expandedIcon:SetTextColor(1, 1, 1) header.button.expandedIcon.SetTextColor = T.dummy header.button:SkinButton(true) header.button.bg = CreateFrame("Frame", nil, header.button) header.button.bg:SetTemplate("Default") header.button.bg:SetFrameLevel(header.button.bg:GetFrameLevel() - 1) header.button.abilityIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) if header.button.abilityIcon:IsShown() then header.button.bg:Show() else header.button.bg:Hide() end header.isSkinned = true end if header.button.abilityIcon:IsShown() then header.button.bg:Show() else header.button.bg:Hide() end index = index + 1 header = _G["EncounterJournalInfoHeader"..index] end end hooksecurefunc("EncounterJournal_ToggleHeaders", SkinAbilitiesInfo) hooksecurefunc("EJSuggestFrame_RefreshDisplay", function() local self = EncounterJournal.suggestFrame if #self.suggestions > 0 then local suggestion = self.Suggestion1 local data = self.suggestions[1] suggestion.iconRing:Hide() if data.iconPath then suggestion.icon:SetMask("") suggestion.icon:SetTexture(data.iconPath) suggestion.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end end if #self.suggestions > 1 then for i = 2, #self.suggestions do local suggestion = self["Suggestion"..i] if not suggestion then break end local data = self.suggestions[i] suggestion.iconRing:Hide() if data.iconPath then suggestion.icon:SetMask("") suggestion.icon:SetTexture(data.iconPath) suggestion.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end end end end) hooksecurefunc("EJSuggestFrame_UpdateRewards", function(suggestion) local rewardData = suggestion.reward.data if rewardData then local texture = rewardData.itemIcon or rewardData.currencyIcon or [[Interface\Icons\achievement_guildperk_mobilebanking]] suggestion.reward.icon:SetMask("") suggestion.reward.icon:SetTexture(texture) suggestion.reward.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end end) local LootJournal = EncounterJournal.LootJournal LootJournal:DisableDrawLayer("BACKGROUND") LootJournal.ClassDropDownButton:SkinButton(true) LootJournal.RuneforgePowerFilterDropDownButton:SkinButton(true) EncounterJournal.LootJournalItems:DisableDrawLayer("BACKGROUND") T.SkinDropDownBox(EncounterJournalLootJournalViewDropDown) local itemSetsFrame = EncounterJournal.LootJournalItems.ItemSetsFrame itemSetsFrame.ClassButton:SkinButton(true) T.SkinScrollBar(itemSetsFrame.scrollBar) hooksecurefunc(itemSetsFrame, "ConfigureItemButton", function(_, button) if not button.styled then button.Border:SetAlpha(0) button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", button.Border, 5, -5) button.backdrop:SetPoint("BOTTOMRIGHT", button.Border, -4, 3) button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button.styled = true end local quality = select(3, GetItemInfo(button.itemID)) local color = ITEM_QUALITY_COLORS[quality or 1] button.backdrop:SetBackdropBorderColor(color.r, color.g, color.b) end) local button = itemSetsFrame.buttons for i = 1, #button do local button = button[i] button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 2, 2) button.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) button.Background:Hide() button.ItemLevel:SetTextColor(1, 1, 1) end T.SkinScrollBar(EncounterJournal.LootJournal.ScrollBar) hooksecurefunc(_G.EncounterJournal.LootJournal.ScrollBox, "Update", function(frame) for _, btn in next, {frame.ScrollTarget:GetChildren()} do if not btn.isSkinned then btn.Background:SetAlpha(0) btn.BackgroundOverlay:SetAlpha(0) btn.CircleMask:Hide() btn.Icon:SetSize(50, 50) btn.Icon:SkinIcon(true) btn:CreateBackdrop("Overlay") btn.backdrop:SetPoint("TOPLEFT", 2, -2) btn.backdrop:SetPoint("BOTTOMRIGHT", 2, 2) btn.IsSkinned = true end end end) end T.SkinFuncs["Blizzard_EncounterJournal"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/EventTrace.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- EventTrace skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = EventTrace T.SkinCloseButton(frame.CloseButton) frame:StripTextures() frame:SetTemplate("Transparent") EventTrace.SubtitleBar.OptionsDropDown:SkinButton() T.SkinEditBox(EventTrace.Log.Bar.SearchBox, nil, 16) EventTrace.Log.Events.ScrollBar.Background:Hide() EventTraceTooltip:HookScript("OnShow", function(self) self.NineSlice:SetTemplate("Transparent") end) end T.SkinFuncs["Blizzard_EventTrace"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/ExpansionLandingPage.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Expansion Landing Page skin ---------------------------------------------------------------------------------------- local function LoadSkin(self) local frame = _G.ExpansionLandingPage local panel if frame.Overlay then for i = 1, frame.Overlay:GetNumChildren() do local child = select(i, frame.Overlay:GetChildren()) if child.DragonridingPanel then panel = child break end end end if not panel then return end panel.NineSlice:SetAlpha(0) panel.Background:SetAlpha(0) panel:SetTemplate("Transparent") if panel.DragonridingPanel then panel.DragonridingPanel.SkillsButton:SkinButton() end if panel.CloseButton then T.SkinCloseButton(panel.CloseButton) end self:UnregisterEvent("ADDON_LOADED") end local frame = CreateFrame("Frame") frame:RegisterEvent("ADDON_LOADED") frame:SetScript("OnEvent", function(self, _, addon) if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") then self:UnregisterEvent("ADDON_LOADED") return end if ExpansionLandingPage then LoadSkin(self) end end) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/FlightMap.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Flight Map skin ---------------------------------------------------------------------------------------- local function LoadSkin() FlightMapFrame:CreateBackdrop("Transparent") FlightMapFrame.BorderFrame:StripTextures() FlightMapFramePortrait:Kill() FlightMapFrame.ScrollContainer:ClearAllPoints() FlightMapFrame.ScrollContainer:SetPoint("TOPLEFT") FlightMapFrame.ScrollContainer:SetPoint("BOTTOMRIGHT") T.SkinCloseButton(FlightMapFrameCloseButton) end T.SkinFuncs["Blizzard_FlightMap"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Friends.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Friends skin ---------------------------------------------------------------------------------------- local function LoadSkin() local StripAllTextures = { FriendsFrame, FriendsListFrame, FriendsTabHeader, WhoFrameColumnHeader1, WhoFrameColumnHeader2, WhoFrameColumnHeader3, WhoFrameColumnHeader4, AddFriendFrame, FriendsFriendsFrame, IgnoreListFrame, FriendsFrameInset, WhoFrameListInset, WhoFrameEditBoxInset, LFRQueueFrameListInset, LFRQueueFrameRoleInset, LFRQueueFrameCommentInset, FriendsFrameBattlenetFrame, BattleTagInviteFrame, QuickJoinRoleSelectionFrame, FriendsFrameBattlenetFrame.BroadcastFrame, FriendsFrameBattlenetFrame.UnavailableInfoFrame, RecruitAFriendFrame.RecruitList.Header, RecruitAFriendFrame.RecruitList.ScrollFrameInset, RecruitAFriendFrame.RewardClaiming, RecruitAFriendRecruitmentFrame, RecruitAFriendRewardsFrame } for i = 1, #StripAllTextures do StripAllTextures[i]:StripTextures() end local KillTextures = { FriendsFrameIcon } for i = 1, #KillTextures do KillTextures[i]:Kill() end local buttons = { FriendsFrameAddFriendButton, FriendsFrameSendMessageButton, WhoFrameWhoButton, WhoFrameAddFriendButton, WhoFrameGroupInviteButton, FriendsFrameIgnorePlayerButton, FriendsFrameUnsquelchButton, AddFriendEntryFrameAcceptButton, AddFriendEntryFrameCancelButton, AddFriendInfoFrameContinueButton, QuickJoinFrame.JoinQueueButton, QuickJoinRoleSelectionFrame.AcceptButton, QuickJoinRoleSelectionFrame.CancelButton, -- FriendsListFrameScrollFrame.PendingInvitesHeaderButton, FriendsFrameBattlenetFrame.BroadcastFrame.CancelButton, FriendsFrameBattlenetFrame.BroadcastFrame.UpdateButton, RecruitAFriendFrame.RewardClaiming.ClaimOrViewRewardButton, RecruitAFriendFrame.RecruitmentButton, RecruitAFriendFrame.SplashFrame.OKButton, RecruitAFriendRecruitmentFrame.GenerateOrCopyLinkButton, } for i = 1, #buttons do buttons[i]:SkinButton() end local scrollbars = { FriendsListFrame.ScrollBar, IgnoreListFrame.ScrollBar, WhoFrame.ScrollBar, QuickJoinFrame.ScrollBar, RecruitAFriendFrame.RecruitList.ScrollBar, } for i = 1, #scrollbars do T.SkinScrollBar(scrollbars[i]) end -- Reposition buttons WhoFrameWhoButton:SetPoint("RIGHT", WhoFrameAddFriendButton, "LEFT", -3, 0) WhoFrameAddFriendButton:SetPoint("RIGHT", WhoFrameGroupInviteButton, "LEFT", -3, 0) WhoFrameGroupInviteButton:SetPoint("BOTTOMRIGHT", WhoFrame, "BOTTOMRIGHT", -4, 4) FriendsFrameAddFriendButton:SetPoint("BOTTOMLEFT", FriendsFrame, "BOTTOMLEFT", 4, 4) FriendsFrameSendMessageButton:SetPoint("BOTTOMRIGHT", FriendsFrame, "BOTTOMRIGHT", -4, 4) FriendsFrameIgnorePlayerButton:SetPoint("BOTTOMLEFT", FriendsFrame, "BOTTOMLEFT", 4, 4) FriendsFrameUnsquelchButton:SetPoint("BOTTOMRIGHT", FriendsFrame, "BOTTOMRIGHT", -4, 4) -- Resize Buttons WhoFrameWhoButton:SetSize(WhoFrameWhoButton:GetWidth() + 7, WhoFrameWhoButton:GetHeight()) WhoFrameAddFriendButton:SetSize(WhoFrameAddFriendButton:GetWidth() - 4, WhoFrameAddFriendButton:GetHeight()) WhoFrameGroupInviteButton:SetSize(WhoFrameGroupInviteButton:GetWidth() - 4, WhoFrameGroupInviteButton:GetHeight()) T.SkinEditBox(WhoFrameEditBox, WhoFrameEditBox:GetWidth() + 30, WhoFrameEditBox:GetHeight() - 15) WhoFrameEditBox:SetPoint("BOTTOM", WhoFrame, "BOTTOM", 0, 31) T.SkinEditBox(AddFriendNameEditBox) AddFriendNameEditBox:SetHeight(AddFriendNameEditBox:GetHeight() - 5) AddFriendFrame:SetTemplate("Transparent") FriendsFriendsFrame:SetTemplate("Transparent") -- Recruit a Friend local SplashFrame = RecruitAFriendFrame.SplashFrame SplashFrame:CreateBackdrop("Overlay") SplashFrame.backdrop:SetPoint("TOPLEFT", 2, -2) SplashFrame.backdrop:SetPoint("BOTTOMRIGHT", -1, -1) SplashFrame.Picture.b = CreateFrame("Frame", nil, SplashFrame) SplashFrame.Picture.b:SetTemplate("Default") SplashFrame.Picture.b:SetPoint("TOPLEFT", SplashFrame.Picture, "TOPLEFT", -2, 2) SplashFrame.Picture.b:SetPoint("BOTTOMRIGHT", SplashFrame.Picture, "BOTTOMRIGHT", 2, -2) SplashFrame.Picture:SetParent(SplashFrame.Picture.b) RecruitAFriendFrame.SplashFrame.Description:SetTextColor(1, 1, 1) SplashFrame.Background:Hide() SplashFrame.PictureFrame:Hide() SplashFrame.Bracket_TopLeft:Hide() SplashFrame.Bracket_TopRight:Hide() SplashFrame.Bracket_BottomRight:Hide() SplashFrame.Bracket_BottomLeft:Hide() SplashFrame.PictureFrame_Bracket_TopLeft:Hide() SplashFrame.PictureFrame_Bracket_TopRight:Hide() SplashFrame.PictureFrame_Bracket_BottomRight:Hide() SplashFrame.PictureFrame_Bracket_BottomLeft:Hide() RecruitAFriendRewardsFrame:SetTemplate("Transparent") T.SkinCloseButton(RecruitAFriendRewardsFrame.CloseButton) for object in pairs(RecruitAFriendRewardsFrame.rewardPool.activeObjects) do object.Button.Icon:SkinIcon() object.Button.IconBorder:SetAlpha(0) object.Button:StyleButton(true, 0) end RecruitAFriendFrame.RewardClaiming.NextRewardButton.Icon:SkinIcon() RecruitAFriendFrame.RewardClaiming.NextRewardButton.CircleMask:Hide() RecruitAFriendFrame.RewardClaiming.NextRewardButton.IconBorder:SetAlpha(0) RecruitAFriendRecruitmentFrame:SetTemplate("Transparent") T.SkinCloseButton(RecruitAFriendRecruitmentFrame.CloseButton) T.SkinEditBox(RecruitAFriendRecruitmentFrame.EditBox, nil, 18) RecruitAFriendRecruitmentFrame.EditBox:SetPoint("RIGHT", RecruitAFriendRecruitmentFrame.GenerateOrCopyLinkButton, "LEFT", -10, 0) -- Quick Join Frame QuickJoinRoleSelectionFrame:SetTemplate("Transparent") T.SkinCloseButton(QuickJoinRoleSelectionFrame.CloseButton) T.SkinCheckBox(QuickJoinRoleSelectionFrame.RoleButtonTank.CheckButton) T.SkinCheckBox(QuickJoinRoleSelectionFrame.RoleButtonHealer.CheckButton) T.SkinCheckBox(QuickJoinRoleSelectionFrame.RoleButtonDPS.CheckButton) -- Pending invites hooksecurefunc("FriendsFrame_UpdateFriendInviteButton", function(button) if not button.IsSkinned then button.AcceptButton:SkinButton() button.DeclineButton:SkinButton() button.IsSkinned = true end end) -- Who Frame WhoFrame.ScrollBar:SetPoint("TOPLEFT", WhoFrame.ScrollBox, "TOPRIGHT", 2, 1) WhoFrame.ScrollBar:SetPoint("BOTTOMLEFT", WhoFrame.ScrollBox, "BOTTOMRIGHT", 5, -16) -- BNet Frame FriendsFrameBattlenetFrame.BroadcastButton:SetAlpha(0) FriendsFrameBattlenetFrame.BroadcastButton:ClearAllPoints() FriendsFrameBattlenetFrame.BroadcastButton:SetAllPoints(FriendsFrameBattlenetFrame) FriendsFrameBattlenetFrame.BroadcastFrame:CreateBackdrop("Transparent") FriendsFrameBattlenetFrame.BroadcastFrame.backdrop:SetPoint("TOPLEFT", 1, 1) FriendsFrameBattlenetFrame.BroadcastFrame.backdrop:SetPoint("BOTTOMRIGHT", 1, 1) T.SkinEditBox(FriendsFrameBattlenetFrame.BroadcastFrame.EditBox, nil, 24) FriendsFrameBattlenetFrame.UnavailableInfoFrame:CreateBackdrop("Transparent") FriendsFrameBattlenetFrame.UnavailableInfoFrame.backdrop:SetPoint("TOPLEFT", 4, -4) FriendsFrameBattlenetFrame.UnavailableInfoFrame.backdrop:SetPoint("BOTTOMRIGHT", -4, 4) BattleTagInviteFrame:SetTemplate("Transparent") for i = 1, BattleTagInviteFrame:GetNumChildren() do local child = select(i, BattleTagInviteFrame:GetChildren()) if child:GetObjectType() == "Button" then child:SkinButton() end end FriendsFrame:SetTemplate("Transparent") FriendsFrameStatusDropDown:SetPoint("TOPLEFT", 1, -27) local function ReskinFriendButton(button) if button.styled then return end local icon = button.gameIcon icon.b = CreateFrame("Frame", nil, button) icon.b:SetTemplate("Default") icon.b:SetPoint("TOPLEFT", icon, "TOPLEFT", -2, 2) icon.b:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", 2, -2) icon:SetParent(icon.b) icon:SetSize(22, 22) icon:SetTexCoord(.17, .83, .17, .83) icon:ClearAllPoints() icon:SetPoint("RIGHT", button, "RIGHT", -27, 0) icon.SetPoint = T.dummy button.travelPassButton:SetSize(20, 30) button.travelPassButton:SkinButton() button.travelPassButton.NormalTexture:SetAlpha(0) button.travelPassButton.PushedTexture:SetAlpha(0) button.travelPassButton.DisabledTexture:SetAlpha(0) button.travelPassButton:SetPoint("TOPRIGHT", -1, -2) button.inv = button.travelPassButton:CreateTexture(nil, "OVERLAY", nil, 7) button.inv:SetTexture([[Interface\FriendsFrame\PlusManz-PlusManz]]) button.inv:SetPoint("TOPRIGHT", 1, -4) button.inv:SetSize(22, 22) button.background:Hide() button.styled = true end hooksecurefunc("FriendsFrame_UpdateFriendButton", function(button) if button.gameIcon then ReskinFriendButton(button) end if button.buttonType == FRIENDS_BUTTON_TYPE_BNET and button.travelPassButton then local isEnabled = button.travelPassButton:IsEnabled() button.travelPassButton:SetAlpha(isEnabled and 1 or 0.4) end if button.gameIcon.b then button.gameIcon.b:SetShown(button.gameIcon:IsShown()) end end) T.SkinCloseButton(FriendsFrameCloseButton) T.SkinDropDownBox(WhoFrameDropDown, 150) T.SkinDropDownBox(FriendsFrameStatusDropDown, 70) T.SkinDropDownBox(FriendsFriendsFrameDropDown) -- Bottom Tabs for i = 1, 4 do T.SkinTab(_G["FriendsFrameTab"..i]) end for i = 1, 3 do T.SkinTab(_G["FriendsTabHeaderTab"..i], true) end end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Garrison.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) ---------------------------------------------------------------------------------------- -- Garrison, OrderHall and BFA Mission skin ---------------------------------------------------------------------------------------- local LoadTootlipSkin = CreateFrame("Frame") LoadTootlipSkin:RegisterEvent("ADDON_LOADED") LoadTootlipSkin:SetScript("OnEvent", function(self, _, addon) if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") or not C.tooltip.enable then self:UnregisterEvent("ADDON_LOADED") return end if addon == "ShestakUI" then local Tooltips = { FloatingGarrisonFollowerTooltip, FloatingGarrisonFollowerAbilityTooltip, FloatingGarrisonMissionTooltip, FloatingGarrisonShipyardFollowerTooltip, GarrisonFollowerTooltip, GarrisonFollowerAbilityTooltip, GarrisonShipyardFollowerTooltip, GarrisonFollowerMissionAbilityWithoutCountersTooltip, GarrisonFollowerAbilityWithoutCountersTooltip } for _, tt in pairs(Tooltips) do tt.NineSlice:SetAlpha(0) tt:SetTemplate("Transparent") end T.SkinCloseButton(FloatingGarrisonFollowerTooltip.CloseButton) T.SkinCloseButton(FloatingGarrisonFollowerAbilityTooltip.CloseButton) T.SkinCloseButton(FloatingGarrisonMissionTooltip.CloseButton) T.SkinCloseButton(FloatingGarrisonShipyardFollowerTooltip.CloseButton) GarrisonFollowerMissionAbilityWithoutCountersTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) GarrisonFollowerAbilityWithoutCountersTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end if addon == "Blizzard_GarrisonUI" then GarrisonBuildingFrame.BuildingLevelTooltip:StripTextures() GarrisonBuildingFrame.BuildingLevelTooltip:SetTemplate("Transparent") GarrisonShipyardMapMissionTooltip:StripTextures() GarrisonShipyardMapMissionTooltip:SetTemplate("Transparent") GarrisonShipyardMapMissionTooltip.ItemTooltip.IconBorder:SetAlpha(0) GarrisonShipyardMapMissionTooltip.ItemTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) GarrisonMissionMechanicFollowerCounterTooltip:HookScript("OnShow", function(self) self:SetTemplate("Transparent") end) GarrisonMissionMechanicTooltip:HookScript("OnShow", function(self) self:SetTemplate("Transparent") end) GarrisonLandingPage.FollowerTab.AbilitiesFrame.FlavorText:SetFontObject(SystemFont_Shadow_Med3) end end) if C.skins.blizzard_frames ~= true then return end local function LoadSkin() -- Garrison Building frame GarrisonBuildingFrame:StripTextures() GarrisonBuildingFrame:SetTemplate("Transparent") T.SkinCloseButton(GarrisonBuildingFrame.CloseButton) GarrisonBuildingFrame.GarrCorners:Hide() for _, button in pairs({GarrisonBuildingFrame.TownHallBox.UpgradeButton, GarrisonBuildingFrame.InfoBox.UpgradeButton}) do button:StripTextures(true) button:SkinButton() end -- Confirmation popup local Confirmation = GarrisonBuildingFrame.Confirmation Confirmation:StripTextures() Confirmation:SetTemplate("Transparent") Confirmation.CancelButton:SkinButton() Confirmation.BuildButton:SkinButton() Confirmation.UpgradeButton:SkinButton() Confirmation.UpgradeGarrisonButton:SkinButton() Confirmation.ReplaceButton:SkinButton() Confirmation.SwitchButton:SkinButton() -- Mission UI GarrisonMissionFrame:StripTextures() GarrisonMissionFrame.GarrCorners:StripTextures() GarrisonMissionFrame.TitleText:Show() GarrisonMissionFrame:SetTemplate("Transparent") T.SkinCloseButton(GarrisonMissionFrame.CloseButton) GarrisonMissionFrameTab1:SetPoint("BOTTOMLEFT", GarrisonMissionFrame, "BOTTOMLEFT", 11, -40) T.SkinTab(GarrisonMissionFrameTab1) T.SkinTab(GarrisonMissionFrameTab2) -- Mission list local MissionTab = GarrisonMissionFrame.MissionTab local MissionList = MissionTab.MissionList local MissionPage = GarrisonMissionFrame.MissionTab.MissionPage MissionList:DisableDrawLayer("BORDER") T.SkinScrollBar(GarrisonMissionFrameMissions.ScrollBar) T.SkinCloseButton(MissionPage.CloseButton) MissionPage.CloseButton:SetFrameLevel(MissionPage:GetFrameLevel() + 2) MissionList.CompleteDialog.BorderFrame.ViewButton:SkinButton() GarrisonMissionFrame.MissionComplete.NextMissionButton:SkinButton() local function SkinTab(tab) tab:StripTextures() tab:StyleButton() tab:CreateBackdrop("Overlay") tab.backdrop:SetAllPoints() tab:SetHeight(tab:GetHeight() - 10) end SkinTab(GarrisonMissionFrameMissionsTab1) SkinTab(GarrisonMissionFrameMissionsTab2) GarrisonMissionFrameMissionsTab1:SetPoint("BOTTOMLEFT", GarrisonMissionFrameMissions, "TOPLEFT", 18, 0) GarrisonMissionFrameMissionsTab1.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) GarrisonMissionFrameMissionsTab1.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1) hooksecurefunc("GarrisonMissonListTab_SetSelected", function(tab, isSelected) if isSelected then tab.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) tab.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1) else tab.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) tab.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) end end) hooksecurefunc(GarrisonMissionFrame.MissionTab.MissionList.ScrollBox, "Update", function(frame) for i = 1, frame.ScrollTarget:GetNumChildren() do local button = select(i, frame.ScrollTarget:GetChildren()) if not button.backdrop then button:StripTextures() button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 0, 0) button.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) button:StyleButton(nil, 2) end end end) GarrisonMissionFrameFollowers:StripTextures() GarrisonMissionFrameFollowers:SetTemplate("Transparent") T.SkinEditBox(GarrisonMissionFrameFollowers.SearchBox) GarrisonMissionFrameFollowers.SearchBox:SetPoint("TOPLEFT", 2, 25) GarrisonMissionFrameFollowers.SearchBox:SetSize(301, 20) T.SkinScrollBar(GarrisonMissionFrameFollowers.ScrollBar) GarrisonMissionFrameFollowers.MaterialFrame:GetRegions():Hide() GarrisonMissionFrameMissions.MaterialFrame:GetRegions():Hide() GarrisonMissionFrameFollowers.ScrollBar:SetPoint("TOPLEFT", GarrisonMissionFrameFollowers.ScrollBox, "TOPRIGHT", -6, 3) GarrisonMissionFrameFollowers.ScrollBar:SetPoint("BOTTOMLEFT", GarrisonMissionFrameFollowers.ScrollBox, "BOTTOMRIGHT", -3, -1) GarrisonMissionFrame.FollowerTab:StripTextures() GarrisonMissionFrame.FollowerTab:SetTemplate("Overlay") for _, item in pairs({GarrisonMissionFrame.FollowerTab.ItemWeapon, GarrisonMissionFrame.FollowerTab.ItemArmor}) do item.Border:Hide() item.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) item:CreateBackdrop("Default") item.backdrop:SetPoint("TOPLEFT", item.Icon, "TOPLEFT", -2, 2) item.backdrop:SetPoint("BOTTOMRIGHT", item.Icon, "BOTTOMRIGHT", 2, -2) item.backdrop:SetFrameLevel(item:GetFrameLevel()) end MissionPage.StartMissionButton:SkinButton() local function HandleGarrisonPortrait(portrait) if not portrait.Portrait then return end local size = portrait.Portrait:GetSize() + 2 portrait:SetSize(size, size) if not portrait.backdrop then portrait:CreateBackdrop("Default") portrait.backdrop:SetPoint("TOPLEFT", portrait, "TOPLEFT", -1, 1) portrait.backdrop:SetPoint("BOTTOMRIGHT", portrait, "BOTTOMRIGHT", 1, -1) portrait.backdrop:SetFrameLevel(portrait:GetFrameLevel()) end portrait.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85) portrait.Portrait:ClearAllPoints() portrait.Portrait:SetInside(portrait.backdrop) if portrait.PortraitRing then portrait.PortraitRing:Hide() portrait.PortraitRingQuality:SetTexture("") portrait.PortraitRingCover:SetTexture("") end if portrait.PuckBorder then portrait.PuckBorder:SetAlpha(0) end if portrait.TroopStackBorder2 then portrait.TroopStackBorder2:SetAlpha(0) end local level = portrait.Level or portrait.LevelText if level then level:ClearAllPoints() level:SetPoint("BOTTOM", 0, 1) level:SetFontObject("SystemFont_Outline_Small") if portrait.LevelCircle then portrait.LevelCircle:Hide() end if portrait.LevelBorder then portrait.LevelBorder:SetScale(0.0001) end end if portrait.HealthBar then portrait.HealthBar.Border:Hide() local roleIcon = portrait.HealthBar.RoleIcon roleIcon:ClearAllPoints() roleIcon:SetPoint("TOPRIGHT", portrait.backdrop, "TOPRIGHT", 4, 4) local background = portrait.HealthBar.Background background:SetAlpha(0) background:ClearAllPoints() background:SetPoint("TOPLEFT", portrait.backdrop, "BOTTOMLEFT", 0, -3) background:SetPoint("BOTTOMRIGHT", portrait.backdrop, "BOTTOMRIGHT", -0, -6) portrait.HealthBar.Health:SetTexture(C.media.texture) portrait.CircleMask:Hide() end end HandleGarrisonPortrait(GarrisonMissionFrame.FollowerTab.PortraitFrame) hooksecurefunc("GarrisonFollowerList_InitButton", function(frame, elementData) local follower = frame.Follower if follower and not follower.backdrop then follower:CreateBackdrop("Overlay") follower.backdrop:SetPoint("TOPLEFT", 0, 0) follower.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) follower:StyleButton() follower.BG:Hide() follower.Selection:SetTexture("") follower.AbilitiesBG:SetTexture("") follower.BusyFrame:SetAllPoints() follower.Name:SetWordWrap(false) if follower.PortraitFrame then HandleGarrisonPortrait(follower.PortraitFrame) follower.PortraitFrame:ClearAllPoints() follower.PortraitFrame:SetPoint("TOPLEFT", 6, -5) end end local counters = follower.Counters if counters then for _, counter in next, counters do if counter and not counter.styled then -- counter:SetTemplate("Default") -- FIXME looks ugly, not pixelperfect if counter.Border then counter.Border:SetTexture("") end if counter.Icon then counter.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) counter.Icon:SetInside() end counter.styled = true end end end if follower then if follower.Selection and follower.backdrop then if follower.Selection:IsShown() then follower.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) follower.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1) follower.PortraitFrame.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) else follower.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) follower.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) follower.PortraitFrame.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end local color = ITEM_QUALITY_COLORS[follower.PortraitFrame.quality] if color then follower.Name:SetTextColor(color.r, color.g, color.b) else follower.Name:SetTextColor(1, 1, 1) end end end) hooksecurefunc("GarrisonFollowerButton_AddAbility", function(self, index) local ability = self.Abilities[index] if not ability.skinned then ability.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) ability.skinned = true end end) -- Set border color according to rarity of item hooksecurefunc("GarrisonMissionButton_SetRewards", function(self) local firstRegion, r, g, b local index = 0 for _, reward in pairs(self.Rewards) do firstRegion = reward.GetRegions and reward:GetRegions() if firstRegion then firstRegion:Hide() end reward:ClearAllPoints() if IsAddOnLoaded("GarrisonMissionManager") then reward:SetPoint("TOPRIGHT", -T.mult * 65 + (index * -65), -T.mult) else reward:SetPoint("TOPRIGHT", -T.mult + (index * -65), -T.mult) end if reward.IconBorder then reward.IconBorder:SetTexture(nil) end if reward.IconBorder and reward.IconBorder:IsShown() then r, g, b = reward.IconBorder:GetVertexColor() else r, g, b = unpack(C.media.border_color) end if (r > 0.64 and r < 0.67) or (r > 0.99 and g > 0.99 and b > 0.99) then r, g, b = unpack(C.media.border_color) end if not reward.backdrop then reward.Icon:SkinIcon() reward.backdrop:SetFrameLevel(reward:GetFrameLevel()) end reward.backdrop:SetBackdropBorderColor(r, g, b) index = index + 1 end end) hooksecurefunc("GarrisonMissionPage_SetReward", function(frame) frame.BG:Hide() frame.IconBorder:SetTexture("") if not frame.backdrop then frame.Icon:SkinIcon() frame.backdrop:SetFrameLevel(frame:GetFrameLevel()) end frame.Icon:SetDrawLayer("BORDER", 0) local r, g, b if frame.IconBorder and frame.IconBorder:IsShown() then r, g, b = frame.IconBorder:GetVertexColor() if (r > 0.64 and r < 0.67) or (r > 0.99 and g > 0.99 and b > 0.99) then r, g, b = unpack(C.media.border_color) end else r, g, b = unpack(C.media.border_color) end frame.backdrop:SetBackdropBorderColor(r, g, b) end) -- Landing page GarrisonLandingPage:StripTextures() GarrisonLandingPage:CreateBackdrop("Transparent") T.SkinCloseButton(GarrisonLandingPage.CloseButton) GarrisonLandingPageTab1:SetPoint("TOPLEFT", GarrisonLandingPage, "BOTTOMLEFT", 70, -2) for i = 1, 3 do T.SkinTab(_G["GarrisonLandingPageTab"..i]) _G["GarrisonLandingPageTab"..i]:SetHeight(32) _G["GarrisonLandingPageTab"..i].Text:ClearAllPoints() _G["GarrisonLandingPageTab"..i].Text:SetPoint("CENTER") end T.SkinScrollBar(GarrisonLandingPageReportList.ScrollBar) GarrisonLandingPage.FollowerList:StripTextures() GarrisonLandingPage.FollowerList.SearchBox:SetPoint("TOPLEFT", -1, 33) T.SkinEditBox(GarrisonLandingPage.FollowerList.SearchBox) T.SkinScrollBar(GarrisonLandingPageFollowerList.ScrollBar) GarrisonLandingPage.FollowerTab:CreateBackdrop("Overlay") GarrisonLandingPage.FollowerTab.backdrop:SetPoint("TOPLEFT", 13, 0) GarrisonLandingPage.FollowerTab.backdrop:SetPoint("BOTTOMRIGHT", 2, 3) HandleGarrisonPortrait(GarrisonLandingPage.FollowerTab.PortraitFrame) GarrisonLandingPageShipFollowerList:StripTextures() GarrisonLandingPageShipFollowerList:SetTemplate("Transparent") GarrisonLandingPageShipFollowerList.SearchBox:SetPoint("TOPLEFT", 2, 25) T.SkinEditBox(GarrisonLandingPageShipFollowerList.SearchBox) T.SkinScrollBar(GarrisonLandingPageShipFollowerList.ScrollBar) GarrisonLandingPage.Report.InProgress:ClearAllPoints() GarrisonLandingPage.Report.InProgress:SetPoint("BOTTOMLEFT", GarrisonLandingPageReportList, "TOPLEFT", 5, 2) GarrisonLandingPage.Report.Available:ClearAllPoints() GarrisonLandingPage.Report.Available:SetPoint("LEFT", GarrisonLandingPage.Report.InProgress, "RIGHT", 4, 0) for _, tab in pairs({GarrisonLandingPage.Report.InProgress, GarrisonLandingPage.Report.Available}) do tab:CreateBackdrop("Overlay") tab.backdrop:SetAllPoints() tab:StyleButton() tab.Text:ClearAllPoints() tab.Text:SetPoint("CENTER") tab.Text:SetFont(C.media.normal_font, 15, "") end hooksecurefunc("GarrisonLandingPageReport_SetTab", function(self) local unselectedTab = GarrisonLandingPage.Report.unselectedTab unselectedTab:SetHeight(36) self:SetWidth(198) unselectedTab:SetWidth(198) unselectedTab:SetNormalTexture(0) unselectedTab.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) unselectedTab.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) self:SetNormalTexture(0) self.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) self.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1) end) hooksecurefunc(GarrisonLandingPage.Report.List.ScrollBox, "Update", function(frame) for i = 1, frame.ScrollTarget:GetNumChildren() do local button = select(i, frame.ScrollTarget:GetChildren()) if not button.styled then local i = 1 for _, reward in pairs(button.Rewards) do reward:GetRegions():Hide() if i == 1 then reward:ClearAllPoints() reward:SetPoint("TOPRIGHT", -35, -5) end reward.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) reward:CreateBackdrop("Default") reward.backdrop:SetPoint("TOPLEFT", reward.Icon, "TOPLEFT", -2, 2) reward.backdrop:SetPoint("BOTTOMRIGHT", reward.Icon, "BOTTOMRIGHT", 2, -2) reward.backdrop:SetFrameLevel(reward:GetFrameLevel()) reward.Quantity:SetParent(reward.backdrop) reward.IconBorder:SetAlpha(0) hooksecurefunc(reward.IconBorder, "SetVertexColor", function(self, r, g, b) if r ~= BAG_ITEM_QUALITY_COLORS[1].r ~= r and g ~= BAG_ITEM_QUALITY_COLORS[1].g then self:GetParent().backdrop:SetBackdropBorderColor(r, g, b) else self:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end) i = i + 1 end end button.styled = true end end) local xpBar = { GarrisonLandingPage.FollowerTab.XPBar, GarrisonLandingPage.ShipFollowerTab.XPBar, GarrisonMissionFrame.FollowerTab.XPBar, GarrisonShipyardFrame.FollowerTab.XPBar, OrderHallMissionFrame.FollowerTab.XPBar, BFAMissionFrame.FollowerTab.XPBar } for i = 1, #xpBar do local xpBar = xpBar[i] xpBar:StripTextures() xpBar:CreateBackdrop("Default") xpBar.backdrop:SetFrameLevel(xpBar.backdrop:GetFrameLevel() + 1) xpBar:SetStatusBarTexture(C.media.texture) if xpBar:GetParent().PortraitFrame then xpBar:ClearAllPoints() xpBar:SetPoint("BOTTOMLEFT", xpBar:GetParent().PortraitFrame, "BOTTOMRIGHT", 8, -15) end if xpBar.Label then xpBar.Label:SetFontObject(SystemFont_Outline_Small) end end local function onShowFollower(followerList) local followerTab = followerList and followerList.followerTab local abilityFrame = followerTab.AbilitiesFrame if not abilityFrame then return end -- Ability buttons local abilities = abilityFrame.Abilities if abilities then for i = 1, #abilities do local IconButton = abilities[i].IconButton if IconButton and not IconButton.backdrop then IconButton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) IconButton.Icon:SetDrawLayer("BACKGROUND", 1) IconButton:CreateBackdrop("Default") IconButton.Border:SetTexture(nil) end end end -- CombatAllySpell buttons local combatAllySpell = abilityFrame.CombatAllySpell if combatAllySpell then for i = 1, #combatAllySpell do local button = combatAllySpell[i] if button and not button.backdrop then button.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) button:CreateBackdrop("Default") end end end -- Equipment local equipment = abilityFrame.Equipment if equipment then for i = 1, #equipment do local button = equipment[i] if button then button.Border:SetTexture(nil) button.BG:SetTexture(nil) button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button:SetScale(1) if not button.backdrop then button:CreateBackdrop("Default") button.backdrop:SetPoint("TOPLEFT", button.Icon, "TOPLEFT", -2, 2) button.backdrop:SetPoint("BOTTOMRIGHT", button.Icon, "BOTTOMRIGHT", 2, -2) end end end end -- AutoSpell buttons for autoSpell in followerTab.autoSpellPool:EnumerateActive() do if not autoSpell.backdrop then autoSpell.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) autoSpell:CreateBackdrop("Default") autoSpell.SpellBorder:SetTexture("") autoSpell.IconMask:Hide() end end end hooksecurefunc(GarrisonMissionFrame.FollowerList, "ShowFollower", onShowFollower) hooksecurefunc(GarrisonLandingPageFollowerList, "ShowFollower", onShowFollower) hooksecurefunc(GarrisonShipyardFrameFollowers, "ShowFollower", onShowFollower) -- ShipYard GarrisonShipyardFrame:StripTextures(true) GarrisonShipyardFrame:CreateBackdrop("Transparent") GarrisonShipyardFrame.BorderFrame.GarrCorners:StripTextures() GarrisonShipyardFrame.BorderFrame:StripTextures(true) GarrisonShipyardFrame.BorderFrame.TitleText:SetPoint("TOP", -6, -1) T.SkinCloseButton(GarrisonShipyardFrame.BorderFrame.CloseButton2) T.SkinTab(GarrisonShipyardFrameTab1) T.SkinTab(GarrisonShipyardFrameTab2) -- ShipYard: Naval Map local MissionTab = GarrisonShipyardFrame.MissionTab local MissionList = MissionTab.MissionList -- ShipYard: Mission local MissionPage = MissionTab.MissionPage T.SkinCloseButton(MissionPage.CloseButton) MissionPage.CloseButton:SetFrameLevel(MissionPage.CloseButton:GetFrameLevel() + 2) MissionList.CompleteDialog.BorderFrame:StripTextures() MissionList.CompleteDialog.BorderFrame:SetTemplate("Transparent") MissionList.CompleteDialog.BorderFrame.ViewButton:SkinButton() MissionList.CompleteDialog:SetAllPoints(MissionList.MapTexture) GarrisonShipyardFrame.MissionComplete.NextMissionButton:SkinButton() GarrisonShipyardFrame.MissionCompleteBackground:SetAllPoints(MissionList.MapTexture) MissionPage.StartMissionButton:SkinButton() MissionList.MapTexture:ClearAllPoints() MissionList.MapTexture:SetPoint("TOPLEFT") MissionList.MapTexture:SetPoint("BOTTOMRIGHT") T.SkinEditBox(GarrisonShipyardFrameFollowers.SearchBox) GarrisonShipyardFrameFollowers.SearchBox:SetPoint("TOPLEFT", 2, 25) GarrisonShipyardFrameFollowers.SearchBox:SetSize(301, 20) GarrisonShipyardFrameFollowers:StripTextures() GarrisonShipyardFrameFollowers:SetTemplate("Transparent") GarrisonShipyardFrameFollowers.MaterialFrame:GetRegions():Hide() GarrisonShipyardFrame.FollowerTab:StripTextures() GarrisonShipyardFrame.FollowerTab:SetTemplate("Overlay") T.SkinScrollBar(GarrisonShipyardFrameFollowers.ScrollBar) hooksecurefunc("GarrisonShipyardFollowerList_InitButton", function(button, elementData) if button and not button.backdrop then button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", -1, 1) button.backdrop:SetPoint("BOTTOMRIGHT", 0, -1) button:StyleButton(nil, 1) button.BG:Hide() button.Selection:SetTexture("") button.Portrait:SetPoint("TOPLEFT", 2, 0) button.AbilitiesBG:SetTexture(C.media.blank) button.AbilitiesBG:SetColorTexture(0.1, 0.1, 0.1, 1) end if button.Selection and button.backdrop then if button.Selection:IsShown() then button.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) button.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1) else button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) button.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) end end end) local function skinFollowerTraitsAndEquipment(obj) local btn for i = 1, #obj.Traits do btn = obj.Traits[i] if not btn.backdrop then btn.Border:SetTexture(nil) btn.Portrait:SetTexCoord(0.1, 0.9, 0.1, 0.9) btn:CreateBackdrop("Default") btn.backdrop:SetPoint("TOPLEFT", btn.Portrait, "TOPLEFT", -2, 2) btn.backdrop:SetPoint("BOTTOMRIGHT", btn.Portrait, "BOTTOMRIGHT", 2, -2) btn.backdrop:SetFrameLevel(2) end end for i = 1, #obj.EquipmentFrame.Equipment do btn = obj.EquipmentFrame.Equipment[i] if not btn.backdrop then btn:DisableDrawLayer("BACKGROUND") btn.Border:SetTexture(nil) btn.Counter.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) btn.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) btn:CreateBackdrop("Default") btn.backdrop:SetPoint("TOPLEFT", btn.Icon, "TOPLEFT", -2, 2) btn.backdrop:SetPoint("BOTTOMRIGHT", btn.Icon, "BOTTOMRIGHT", 2, -2) btn.Counter.Border:SetAlpha(0) btn.Counter.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) btn.Counter:CreateBackdrop("Default") btn.Counter.backdrop:SetPoint("TOPLEFT", btn.Counter.Icon, "TOPLEFT", -2, 2) btn.Counter.backdrop:SetPoint("BOTTOMRIGHT", btn.Counter.Icon, "BOTTOMRIGHT", 2, -2) end end btn = nil end skinFollowerTraitsAndEquipment(GarrisonLandingPage.ShipFollowerTab) skinFollowerTraitsAndEquipment(GarrisonShipyardFrame.FollowerTab) -- Recruiter frame GarrisonRecruiterFrame:StripTextures(true) GarrisonRecruiterFrame:SetTemplate("Transparent") T.SkinCloseButton(GarrisonRecruiterFrame.CloseButton) GarrisonRecruiterFrame.UnavailableFrame:GetChildren():SkinButton() GarrisonRecruiterFrame.Pick.ChooseRecruits:SkinButton() T.SkinDropDownBox(GarrisonRecruiterFrame.Pick.ThreatDropDown) T.SkinCheckBox(GarrisonRecruiterFrame.Pick.Radio1) T.SkinCheckBox(GarrisonRecruiterFrame.Pick.Radio2) -- Recruiter select frame GarrisonRecruitSelectFrame:StripTextures() GarrisonRecruitSelectFrame:SetTemplate("Transparent") GarrisonRecruitSelectFrame.GarrCorners:StripTextures() T.SkinCloseButton(GarrisonRecruitSelectFrame.CloseButton) GarrisonRecruitSelectFrame.FollowerList:StripTextures() GarrisonRecruitSelectFrame.FollowerList:SetTemplate("Transparent") T.SkinScrollBar(GarrisonRecruitSelectFrame.FollowerList.ScrollBar) T.SkinEditBox(GarrisonRecruitSelectFrame.FollowerList.SearchBox) GarrisonRecruitSelectFrame.FollowerList.SearchBox:SetPoint("TOPLEFT", 2, 25) GarrisonRecruitSelectFrame.FollowerList.SearchBox:SetSize(301, 20) GarrisonRecruitSelectFrame.FollowerSelection:StripTextures() GarrisonRecruitSelectFrame.FollowerSelection:SetTemplate("Overlay") GarrisonRecruitSelectFrame.FollowerList.ScrollBar:SetPoint("TOPLEFT", GarrisonRecruitSelectFrame.FollowerList.ScrollBox, "TOPRIGHT", -6, 3) GarrisonRecruitSelectFrame.FollowerList.ScrollBar:SetPoint("BOTTOMLEFT", GarrisonRecruitSelectFrame.FollowerList.ScrollBox, "BOTTOMRIGHT", -3, -1) for i = 1, 3 do local recruit = GarrisonRecruitSelectFrame.FollowerSelection["Recruit"..i] recruit.HireRecruits:SkinButton() HandleGarrisonPortrait(recruit.PortraitFrame) end hooksecurefunc(GarrisonRecruitSelectFrame.FollowerList.ScrollBox, "Update", function(frame) for i = 1, frame.ScrollTarget:GetNumChildren() do local button = select(i, frame.ScrollTarget:GetChildren()) local follower = button.Follower if follower and not follower.backdrop then follower:CreateBackdrop("Overlay") follower.backdrop:SetPoint("TOPLEFT", 0, 0) follower.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) follower:StyleButton() follower.BG:Hide() follower.Selection:SetTexture("") follower.AbilitiesBG:SetTexture("") follower.BusyFrame:SetAllPoints() follower.Name:SetWordWrap(false) if follower.PortraitFrame then HandleGarrisonPortrait(follower.PortraitFrame) follower.PortraitFrame:ClearAllPoints() follower.PortraitFrame:SetPoint("TOPLEFT", 6, -5) end end if follower then if follower.Selection and follower.backdrop then if follower.Selection:IsShown() then follower.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) follower.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1) follower.PortraitFrame.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) else follower.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) follower.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) follower.PortraitFrame.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end end local color = ITEM_QUALITY_COLORS[follower.PortraitFrame.quality] if color then follower.Name:SetTextColor(color.r, color.g, color.b) else follower.Name:SetTextColor(1, 1, 1) end end end end) hooksecurefunc(GarrisonRecruitSelectFrame, "Show", function(self) C_Timer.After(0.01, function() -- fixed color name after open GarrisonRecruitSelectFrame.FollowerList.ScrollBox:Update() end) end) hooksecurefunc("GarrisonRecruitSelectFrame_UpdateRecruits", function(waiting) if waiting then return end for i = 1, 3 do local frame = GarrisonRecruitSelectFrame.FollowerSelection["Recruit"..i] if frame:IsShown() then local traits = frame.Traits.Entries if traits then for index = 1, #traits do local trait = traits[index] if not trait.bg then trait.Icon:SkinIcon() end end end local abilities = frame.Abilities.Entries if abilities then for index = 1, #abilities do local ability = abilities[index] if not ability.bg then ability.Icon:SkinIcon() end end end end end end) -- Capacitive display frame GarrisonCapacitiveDisplayFrame:StripTextures(true) GarrisonCapacitiveDisplayFrame:SetTemplate("Transparent") GarrisonCapacitiveDisplayFrame:SetFrameLevel(5) GarrisonCapacitiveDisplayFramePortrait:SetAlpha(0) T.SkinNextPrevButton(GarrisonCapacitiveDisplayFrame.DecrementButton, true) GarrisonCapacitiveDisplayFrame.DecrementButton:SetSize(22, 22) T.SkinNextPrevButton(GarrisonCapacitiveDisplayFrame.IncrementButton) GarrisonCapacitiveDisplayFrame.IncrementButton:SetSize(22, 22) GarrisonCapacitiveDisplayFrame.Count:StripTextures() T.SkinEditBox(GarrisonCapacitiveDisplayFrame.Count) GarrisonCapacitiveDisplayFrame.Count:SetHeight(18) T.SkinCloseButton(GarrisonCapacitiveDisplayFrameCloseButton) GarrisonCapacitiveDisplayFrame.StartWorkOrderButton:SkinButton() GarrisonCapacitiveDisplayFrame.CreateAllWorkOrdersButton:SkinButton() local CapacitiveDisplay = GarrisonCapacitiveDisplayFrame.CapacitiveDisplay CapacitiveDisplay.IconBG:SetTexture() CapacitiveDisplay.ShipmentIconFrame.Icon:SkinIcon() local CapacitiveFollower = CapacitiveDisplay.ShipmentIconFrame.Follower CapacitiveFollower.Portrait:SetAllPoints() CapacitiveFollower.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85) CapacitiveFollower.PortraitRing:Kill() CapacitiveFollower.PortraitRingQuality:Kill() CapacitiveFollower:SetPoint("TOPLEFT", -2, 2) CapacitiveFollower:SetPoint("BOTTOMRIGHT", 2, -2) CapacitiveFollower.Portrait.IconBackdrop = CreateFrame("Frame", nil, CapacitiveFollower) CapacitiveFollower.Portrait.IconBackdrop:SetFrameLevel(CapacitiveFollower:GetFrameLevel() - 1) CapacitiveFollower.Portrait.IconBackdrop:SetPoint("TOPLEFT", CapacitiveFollower.Portrait, -2, 2) CapacitiveFollower.Portrait.IconBackdrop:SetPoint("BOTTOMRIGHT", CapacitiveFollower.Portrait, 2, -2) CapacitiveFollower.Portrait.IconBackdrop:SetTemplate("Default") hooksecurefunc(CapacitiveFollower.PortraitRingQuality, "SetVertexColor", function(self, r, g, b) if r ~= 1 and g ~= 1 and b ~= 1 then CapacitiveFollower.Portrait.IconBackdrop:SetBackdropBorderColor(r, g, b) end self:SetTexture("") end) hooksecurefunc("GarrisonCapacitiveDisplayFrame_Update", function(self) for _, reagent in ipairs(self.CapacitiveDisplay.Reagents) do reagent.NameFrame:SetAlpha(0) if not reagent.backdrop then reagent.Icon:SkinIcon() end end end) ---------------------------------------------------------------------------------------- -- MasterPlan AddOn skin ---------------------------------------------------------------------------------------- do local function skinMasterPlan() T.SkinTab(GarrisonLandingPageTab4) T.SkinTab(GarrisonMissionFrameTab3) T.SkinTab(GarrisonMissionFrameTab4) T.SkinTab(GarrisonShipyardFrameTab3) local MissionPage = GarrisonMissionFrame.MissionTab.MissionPage T.SkinCloseButton(MissionPage.MinimizeButton, nil, "-") MissionPage.MinimizeButton:SetPoint("TOPRIGHT", GarrisonMissionFrame.MissionTab.MissionPage.CloseButton, "TOPLEFT", -3, 0) MissionPage.MinimizeButton:SetFrameLevel(MissionPage:GetFrameLevel() + 2) GarrisonMissionFrame.MissionTab.MissionPage.CloseButton:SetSize(18, 18) GarrisonMissionFrame.MissionTab.MissionPage.CloseButton:SetPoint("TOPRIGHT", -4, -4) local MissionPage = GarrisonShipyardFrame.MissionTab.MissionPage T.SkinCloseButton(MissionPage.MinimizeButton, nil, "-") MissionPage.MinimizeButton:SetPoint("TOPRIGHT", GarrisonShipyardFrame.MissionTab.MissionPage.CloseButton, "TOPLEFT", -3, 0) MissionPage.MinimizeButton:SetFrameLevel(MissionPage:GetFrameLevel() + 2) GarrisonShipyardFrame.MissionTab.MissionPage.CloseButton:SetSize(18, 18) GarrisonShipyardFrame.MissionTab.MissionPage.CloseButton:SetPoint("TOPRIGHT", -4, -4) MPCompleteAll:SkinButton() MPPokeTentativeParties:SkinButton() GarrisonMissionFrameFollowers.SearchBox:SetSize(270, 20) end if IsAddOnLoaded("MasterPlan") then skinMasterPlan() else local f = CreateFrame("Frame") f:RegisterEvent("ADDON_LOADED") f:SetScript("OnEvent", function(self, _, addon) if addon == "MasterPlan" then skinMasterPlan() self:UnregisterEvent("ADDON_LOADED") end end) end end ---------------------------------------------------------------------------------------- -- Order Hall skin ---------------------------------------------------------------------------------------- OrderHallMissionFrame:StripTextures() OrderHallMissionFrame:CreateBackdrop("Transparent") OrderHallMissionFrame.backdrop:SetPoint("TOPLEFT", 0, 0) OrderHallMissionFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) OrderHallMissionFrame.GarrCorners:StripTextures() OrderHallMissionFrame.ClassHallIcon:Kill() T.SkinCloseButton(OrderHallMissionFrame.CloseButton) for i = 1, 3 do T.SkinTab(_G["OrderHallMissionFrameTab"..i]) end OrderHallMissionFrameMissions.CompleteDialog.BorderFrame:StripTextures() OrderHallMissionFrameMissions.CompleteDialog.BorderFrame:SetTemplate("Overlay") OrderHallMissionFrameMissions.CompleteDialog.BorderFrame.Stage:StripTextures() OrderHallMissionFrame.MissionComplete:StripTextures() OrderHallMissionFrame.MissionComplete:CreateBackdrop("Overlay") OrderHallMissionFrame.MissionComplete.backdrop:SetPoint("TOPLEFT", 3, 2) OrderHallMissionFrame.MissionComplete.backdrop:SetPoint("BOTTOMRIGHT", -3, -12) OrderHallMissionFrame.MissionComplete.Stage.MissionInfo:StripTextures() OrderHallMissionFrame.MissionComplete.Stage.MissionInfo:CreateOverlay() OrderHallMissionFrame.MissionComplete.Stage.MissionInfo.overlay:SetPoint("TOPLEFT", 5, 0) OrderHallMissionFrame.MissionComplete.Stage.MissionInfo.overlay:SetPoint("BOTTOMRIGHT", -5, 210) OrderHallMissionFrame.MissionComplete.Stage.MissionInfo.overlay:SetVertexColor(0, 0, 0, 0.7) OrderHallMissionFrameMissions:StripTextures() T.SkinScrollBar(OrderHallMissionFrameMissions.ScrollBar) OrderHallMissionFrameMissions.CombatAllyUI:StripTextures() OrderHallMissionFrameMissions.CombatAllyUI:CreateBackdrop("Overlay") OrderHallMissionFrameMissions.CombatAllyUI.backdrop:SetPoint("TOPLEFT", 18, -2) OrderHallMissionFrameMissions.CombatAllyUI.backdrop:SetPoint("BOTTOMRIGHT", -4, 2) OrderHallMissionFrameMissions.CombatAllyUI.InProgress.Unassign:SkinButton() OrderHallMissionFrameMissions.CombatAllyUI.InProgress.CombatAllySpell.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) OrderHallMissionFrameMissions.CombatAllyUI.InProgress.CombatAllySpell:CreateBackdrop("Default") HandleGarrisonPortrait(OrderHallMissionFrameMissions.CombatAllyUI.InProgress.PortraitFrame) OrderHallMissionFrameMissions.CombatAllyUI.InProgress.CombatAllySpell:SetPoint("BOTTOMLEFT", OrderHallMissionFrameMissions.CombatAllyUI.InProgress.PortraitFrame.backdrop, "BOTTOMRIGHT", 12, -20) hooksecurefunc(OrderHallMissionFrameMissions.CombatAllyUI.InProgress.PortraitFrame.PortraitRingQuality, "SetVertexColor", function(self, r, g, b) if r ~= 1 and g ~= 1 and b ~= 1 then OrderHallMissionFrameMissions.CombatAllyUI.InProgress.PortraitFrame.backdrop:SetBackdropBorderColor(r, g, b) end self:SetTexture("") end) OrderHallMissionFrameMissions.MaterialFrame:StripTextures() OrderHallMissionFrame.MissionTab:StripTextures() OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage:StripTextures() OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage:SetTemplate("Overlay") OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CombatAllySpell:SetPoint("TOP", OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CombatAllyDescriptionLabel, "BOTTOM", 0, -5) OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CombatAllySpell.iconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9) OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CombatAllySpell:CreateBackdrop("Default") T.SkinCloseButton(OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.CloseButton) OrderHallMissionFrame.MissionTab.ZoneSupportMissionPage.StartMissionButton:SkinButton() SkinTab(OrderHallMissionFrameMissionsTab1) SkinTab(OrderHallMissionFrameMissionsTab2) OrderHallMissionFrameMissionsTab1:SetPoint("BOTTOMLEFT", OrderHallMissionFrameMissions, "TOPLEFT", 18, 0) OrderHallMissionFrameMissionsTab1.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) OrderHallMissionFrameMissionsTab1.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1) hooksecurefunc(OrderHallMissionFrame.MissionTab.MissionList.ScrollBox, "Update", function(frame) for i = 1, frame.ScrollTarget:GetNumChildren() do local button = select(i, frame.ScrollTarget:GetChildren()) if not button.backdrop then button:StripTextures() button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 0, 0) button.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) button:StyleButton(nil, 2) end end end) -- Followers local Follower = OrderHallMissionFrameFollowers Follower:StripTextures() T.SkinEditBox(Follower.SearchBox) Follower.SearchBox:SetPoint("TOPLEFT", 2, 25) Follower.SearchBox:SetSize(301, 20) T.SkinScrollBar(OrderHallMissionFrameFollowers.ScrollBar ) Follower.MaterialFrame:StripTextures() T.SkinCloseButton(OrderHallMissionFrame.MissionTab.MissionPage.CloseButton) OrderHallMissionFrame.MissionTab.MissionPage.StartMissionButton:SkinButton() local FollowerTab = OrderHallMissionFrame.FollowerTab FollowerTab:StripTextures() FollowerTab:CreateBackdrop("Overlay") FollowerTab.backdrop:SetPoint("TOPLEFT", -2, 0) FollowerTab.backdrop:SetPoint("BOTTOMRIGHT", 2, -2) FollowerTab.ModelCluster:StripTextures() FollowerTab.Class:SetSize(50, 43) HandleGarrisonPortrait(FollowerTab.PortraitFrame) hooksecurefunc(OrderHallMissionFrame.FollowerList, "ShowFollower", onShowFollower) -- Missions OrderHallMissionFrameMissions.CompleteDialog.BorderFrame.ViewButton:SkinButton() OrderHallMissionFrame.MissionComplete.NextMissionButton:SkinButton() ---------------------------------------------------------------------------------------- -- BFA Mission skin ---------------------------------------------------------------------------------------- BFAMissionFrame:StripTextures() BFAMissionFrame:CreateBackdrop("Transparent") BFAMissionFrame.backdrop:SetPoint("TOPLEFT", 0, 0) BFAMissionFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) BFAMissionFrame.OverlayElements:Hide() BFAMissionFrame.TitleScroll:Hide() BFAMissionFrameMissions.CompleteDialog.BorderFrame:StripTextures() BFAMissionFrameMissions.CompleteDialog.BorderFrame:SetTemplate("Transparent") BFAMissionFrameMissions.CompleteDialog.BorderFrame.ViewButton:SkinButton() BFAMissionFrameMissions.CompleteDialog.BorderFrame.Stage:StripTextures() BFAMissionFrame.MissionComplete.NextMissionButton:SkinButton() for i = 1, 3 do T.SkinTab(_G["BFAMissionFrameTab"..i]) end T.SkinCloseButton(BFAMissionFrame.CloseButton) SkinTab(BFAMissionFrameMissionsTab1) SkinTab(BFAMissionFrameMissionsTab2) BFAMissionFrameMissionsTab1.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1) BFAMissionFrameMissionsTab1.backdrop.overlay:SetVertexColor(1 * 0.3, 0.82 * 0.3, 0, 1) BFAMissionFrameMissionsTab1:SetPoint("BOTTOMLEFT", BFAMissionFrameMissions, "TOPLEFT", 18, 0) BFAMissionFrameMissions:StripTextures() T.SkinScrollBar(BFAMissionFrameMissions.ScrollBar) BFAMissionFrameMissions.MaterialFrame:GetRegions():Hide() BFAMissionFrameMissions.MaterialFrame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) hooksecurefunc(BFAMissionFrame.MissionTab.MissionList.ScrollBox, "Update", function(frame) for i = 1, frame.ScrollTarget:GetNumChildren() do local button = select(i, frame.ScrollTarget:GetChildren()) if not button.backdrop then button:StripTextures() button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 0, 0) button.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) button:StyleButton(nil, 2) button.LocBG:SetHeight(75) button.LocBG:SetPoint("RIGHT", 0, -1) end end end) -- Followers local Follower = BFAMissionFrameFollowers Follower:StripTextures() T.SkinEditBox(Follower.SearchBox) Follower.SearchBox:SetPoint("TOPLEFT", 2, 25) Follower.SearchBox:SetSize(301, 20) T.SkinScrollBar(BFAMissionFrameFollowers.ScrollBar) Follower.MaterialFrame:StripTextures() T.SkinCloseButton(BFAMissionFrame.MissionTab.MissionPage.CloseButton) BFAMissionFrame.MissionTab.MissionPage.StartMissionButton:SkinButton() local FollowerTab = BFAMissionFrame.FollowerTab FollowerTab:StripTextures() FollowerTab.ModelCluster:StripTextures() FollowerTab:CreateBackdrop("Overlay") FollowerTab.backdrop:SetPoint("TOPLEFT", -2, 0) FollowerTab.backdrop:SetPoint("BOTTOMRIGHT", 2, -2) FollowerTab.Class:SetSize(50, 43) HandleGarrisonPortrait(FollowerTab.PortraitFrame) hooksecurefunc(BFAMissionFrame.FollowerList, "ShowFollower", onShowFollower) -- Map BFAMissionFrame.MapTab.ScrollContainer:ClearAllPoints() BFAMissionFrame.MapTab.ScrollContainer:SetPoint("TOPLEFT") BFAMissionFrame.MapTab.ScrollContainer:SetPoint("BOTTOMRIGHT") ---------------------------------------------------------------------------------------- -- Shadowlands Mission skin ---------------------------------------------------------------------------------------- CovenantMissionFrame:CreateBackdrop("Transparent") CovenantMissionFrame.backdrop:SetPoint("TOPLEFT", 0, 0) CovenantMissionFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) CovenantMissionFrame.BackgroundTile:SetAlpha(0) CovenantMissionFrame.TopRightCorner:SetAlpha(0) CovenantMissionFrame.TopBorder:SetAlpha(0) CovenantMissionFrame.TopLeftCorner:SetAlpha(0) CovenantMissionFrame.MissionTab:StripTextures() CovenantMissionFrame:DisableDrawLayer("BORDER") CovenantMissionFrame:DisableDrawLayer("BACKGROUND") CovenantMissionFrame:HookScript("OnShow", function(self) T.SkinCloseButton(CovenantMissionFrame.CloseButton) CovenantMissionFrame.FollowerTab:StripTextures() end) hooksecurefunc(CovenantMissionFrame, "SetupTabs", function(self) self.MapTab:SetShown(not self.Tab2:IsShown()) end) local material = CovenantMissionFrameMissions.MaterialFrame material.BG:SetAlpha(0) material.LeftFiligree:Hide() material.RightFiligree:Hide() material.Icon:SkinIcon() CovenantMissionFrameMissions.RaisedFrameEdges:StripTextures() CovenantMissionFrameMissions:DisableDrawLayer("BORDER") T.SkinScrollBar(CovenantMissionFrameMissions.ScrollBar) CovenantMissionFrameMissions.ScrollBar.Back:SetSize(17, 15) CovenantMissionFrameMissions.ScrollBar.Track.Thumb:SetWidth(17) CovenantMissionFrameMissions.ScrollBar.Forward:SetSize(17, 15) CovenantMissionFrameMissions.ScrollBar:SetPoint("TOPLEFT", CovenantMissionFrameMissions.ScrollBox, "TOPRIGHT", 7, -11) CovenantMissionFrameMissions.ScrollBar:SetPoint("BOTTOMLEFT", CovenantMissionFrameMissions.ScrollBox, "BOTTOMRIGHT", 7, 2) hooksecurefunc(CovenantMissionFrame.MissionTab.MissionList.ScrollBox, "Update", function(frame) for i = 1, frame.ScrollTarget:GetNumChildren() do local button = select(i, frame.ScrollTarget:GetChildren()) if not button.backdrop then button.ButtonBG:Hide() button.Highlight:Hide() button:CreateBackdrop("Overlay") button.backdrop:SetPoint("TOPLEFT", 0, -3) button.backdrop:SetPoint("BOTTOMRIGHT", 0, 3) button:StyleButton(nil, 0) button.Overlay.Overlay:SetAllPoints(button.backdrop) end end end) for i = 1, 2 do T.SkinTab(_G["CovenantMissionFrameTab"..i]) end -- Followers local Follower = CovenantMissionFrameFollowers Follower:StripTextures() Follower.MaterialFrame:StripTextures() Follower.HealAllButton:SkinButton() Follower.ElevatedFrame:Hide() hooksecurefunc(Follower, "ShowFollower", onShowFollower) T.SkinScrollBar(CovenantMissionFrameFollowers.ScrollBar) CovenantMissionFrameFollowers.ScrollBar.Back:SetSize(17, 15) CovenantMissionFrameFollowers.ScrollBar.Track.Thumb:SetWidth(17) CovenantMissionFrameFollowers.ScrollBar.Forward:SetSize(17, 15) CovenantMissionFrameFollowers.ScrollBar:SetPoint("TOPLEFT", CovenantMissionFrameFollowers.ScrollBox, "TOPRIGHT", 7, -11) CovenantMissionFrameFollowers.ScrollBar:SetPoint("BOTTOMLEFT", CovenantMissionFrameFollowers.ScrollBox, "BOTTOMRIGHT", 7, 0) local FollowerTab = CovenantMissionFrame.FollowerTab FollowerTab:CreateBackdrop("Overlay") FollowerTab.backdrop:SetPoint("TOPLEFT", -2, 0) FollowerTab.backdrop:SetPoint("BOTTOMRIGHT", 2, 20) FollowerTab.RaisedFrameEdges:Hide() FollowerTab.HealFollowerFrame.ButtonFrame:Hide() HealFollowerButtonTemplate:SkinButton() FollowerTab.HealFollowerFrame.CostFrame.CostLabel:SetFont(C.media.normal_font, 14, "") FollowerTab.HealFollowerFrame.CostFrame.CostIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) -- Mission T.SkinCloseButton(CovenantMissionFrame.MissionTab.MissionPage.CloseButton) CovenantMissionFrame.MissionTab.MissionPage.StartMissionButton:SkinButton() CovenantMissionFrame.MissionComplete.CompleteFrame.ContinueButton:SkinButton() CovenantMissionFrame.MissionComplete.CompleteFrame.SpeedButton:SkinButton() CovenantMissionFrame.MissionComplete.RewardsScreen.FinalRewardsPanel.ContinueButton:SkinButton() HandleGarrisonPortrait(GarrisonLandingPage.FollowerTab.CovenantFollowerPortraitFrame) CovenantMissionFrame.MissionTab.MissionPage.CostFrame.CostLabel:SetFont(C.media.normal_font, 14, "") CovenantMissionFrame.MissionTab.MissionPage.CostFrame.CostIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) ---------------------------------------------------------------------------------------- -- KayrCovenantMissions AddOn skin ---------------------------------------------------------------------------------------- if IsAddOnLoaded("KayrCovenantMissions") then hooksecurefunc(CovenantMissionFrame, "SetupTabs", function() if KayrCovenantMissionsAdvice then KayrCovenantMissionsAdvice:StripTextures() KayrCovenantMissionsAdvice:CreateBackdrop("Transparent") KayrCovenantMissionsAdvice.backdrop:SetPoint("TOPLEFT", 2, -4) KayrCovenantMissionsAdvice.backdrop:SetPoint("BOTTOMRIGHT", 0, 4) end end) end end T.SkinFuncs["Blizzard_GarrisonUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/GenericTrait.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Generic Trait skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = _G.GenericTraitFrame T.SkinFrame(frame) local function ReplaceIconString(frame, text) if not text then text = frame:GetText() end if not text or text == "" then return end local newText, count = gsub(text, "|T(%d+):24:24[^|]*|t", " |T%1:16:16:0:0:64:64:5:59:5:59|t") if count > 0 then frame:SetFormattedText("%s", newText) end end ReplaceIconString(frame.Currency.UnspentPointsCount) hooksecurefunc(frame.Currency.UnspentPointsCount, "SetText", ReplaceIconString) end T.SkinFuncs["Blizzard_GenericTraitUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Gossip.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Gossip skin ---------------------------------------------------------------------------------------- local function LoadSkin() local StripAllTextures = { GossipFrame, GossipFrame.GreetingPanel } for i = 1, #StripAllTextures do local button = StripAllTextures[i] button:StripTextures() end local KillTextures = { "GossipFramePortrait" } for _, texture in pairs(KillTextures) do _G[texture]:Kill() end local buttons = { GossipFrame.GreetingPanel.GoodbyeButton } for i = 1, #buttons do buttons[i]:SkinButton(true) end local function ReplaceGossipFormat(button, textFormat, text) local newFormat, count = gsub(textFormat, "000000", "ffffff") if count > 0 then button:SetFormattedText(newFormat, text) end end local ReplacedGossipColor = { ["000000"] = "ffffff", ["414141"] = "7b8489", } local function ReplaceGossipText(button, text) if text and text ~= "" then local newText, count = gsub(text, ":32:32:0:0", ":32:32:0:0:64:64:5:59:5:59") if count > 0 then text = newText button:SetFormattedText("%s", text) end local colorStr, rawText = strmatch(text, "|c[fF][fF](%x%x%x%x%x%x)(.-)|r") colorStr = ReplacedGossipColor[colorStr] if colorStr and rawText then button:SetFormattedText("|cff%s%s|r", colorStr, rawText) end end end _G.QuestFont:SetTextColor(1, 1, 1) _G.QuestFont:SetShadowOffset(1, -1) GossipFrame:CreateBackdrop("Transparent") GossipFrame.backdrop:SetAllPoints() GossipFrame:DisableDrawLayer("BACKGROUND") T.SkinCloseButton(GossipFrameCloseButton, GossipFrame.backdrop) T.SkinScrollBar(GossipFrame.GreetingPanel.ScrollBar) GossipFrame.FriendshipStatusBar:StripTextures() GossipFrame.FriendshipStatusBar:SetStatusBarTexture(C.media.texture) GossipFrame.FriendshipStatusBar:CreateBackdrop("Overlay") GossipFrame.FriendshipStatusBar.icon:SetPoint("TOPLEFT", -30, 7) -- Extreme hackage, blizzard makes button text on quest frame use hex color codes for some reason hooksecurefunc(GossipFrame.GreetingPanel.ScrollBox, "Update", function(frame) for _, button in next, {frame.ScrollTarget:GetChildren()} do if not button.IsSkinned then local buttonText = select(3, button:GetRegions()) if buttonText and buttonText:IsObjectType("FontString") then ReplaceGossipText(button, button:GetText()) hooksecurefunc(button, "SetText", ReplaceGossipText) hooksecurefunc(button, "SetFormattedText", ReplaceGossipFormat) end button.IsSkinned = true end end end) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Guide.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- New Player Experience Guide skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = GuideFrame T.SkinCloseButton(frame.CloseButton) frame:StripTextures() frame:CreateBackdrop("Transparent") frame.Title:SetTextColor(1, 1, 1) frame.ScrollFrame.Child.Text:SetTextColor(1, 1, 1) frame.ScrollFrame.Child.ObjectivesFrame:StripTextures() frame.ScrollFrame.Child.ObjectivesFrame:CreateBackdrop("Overlay") T.SkinScrollBar(GuideFrame.ScrollFrame.ScrollBar) frame.ScrollFrame.ConfirmationButton:SkinButton() end T.SkinFuncs["Blizzard_NewPlayerExperienceGuide"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/GuildBank.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- GuildBankUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() GuildBankFrame:StripTextures() GuildBankFrame:SetTemplate("Transparent") GuildBankFrame.Emblem:StripTextures(true) GuildBankFrame.MoneyFrameBG:StripTextures() for i = 1, GuildBankFrame:GetNumChildren() do local child = select(i, GuildBankFrame:GetChildren()) if child.GetPushedTexture and child:GetPushedTexture() and not child:GetName() then T.SkinCloseButton(child) end end GuildBankFrame.DepositButton:SkinButton(true) GuildBankFrame.WithdrawButton:SkinButton(true) GuildBankInfoSaveButton:SkinButton(true) GuildBankFrame.BuyInfo.PurchaseButton:SkinButton(true) GuildBankFrame.WithdrawButton:SetPoint("RIGHT", GuildBankFrame.DepositButton, "LEFT", -2, 0) GuildBankInfoScrollFrame:StripTextures() GuildBankInfoScrollFrame:SetPoint("TOPLEFT", _G.GuildBankInfo, "TOPLEFT", -7, 12) GuildBankInfoScrollFrame:SetWidth(_G.GuildBankInfoScrollFrame:GetWidth() - 8) T.SkinScrollBar(GuildBankInfoScrollFrameScrollBar) T.SkinScrollBar(GuildBankTransactionsScrollFrameScrollBar) GuildBankInfoScrollFrame:SetHeight(GuildBankInfoScrollFrame:GetHeight() - 5) GuildBankTransactionsScrollFrame:SetHeight(GuildBankTransactionsScrollFrame:GetHeight() - 5) GuildBankFrame.inset = CreateFrame("Frame", nil, GuildBankFrame) GuildBankFrame.inset:SetTemplate("Overlay") GuildBankFrame.inset:SetPoint("TOPLEFT", 21, -58) GuildBankFrame.inset:SetPoint("BOTTOMRIGHT", -17, 61) GuildItemSearchBox:StripTextures(true) GuildItemSearchBox:CreateBackdrop("Overlay") GuildItemSearchBox.backdrop:SetPoint("TOPLEFT", 13, 0) GuildItemSearchBox.backdrop:SetPoint("BOTTOMRIGHT", -2, 0) for i = 1, 7 do local column = _G.GuildBankFrame["Column"..i] column:StripTextures() for j = 1, 14 do local button = column["Button"..j] local icon = button.icon button.IconBorder:SetAlpha(0) button:SetNormalTexture(0) button:StyleButton() button:SetTemplate("Default") icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) end end for i = 1, 8 do local tab = _G["GuildBankTab"..i] local button = tab.Button local texture = button.IconTexture tab:StripTextures(true) button:StripTextures() button:StyleButton() button:SetTemplate("Default") -- Reposition tabs button:ClearAllPoints() if i == 1 then button:SetPoint("TOPLEFT", GuildBankFrame, "TOPRIGHT", 1, 0) else button:SetPoint("TOP", _G["GuildBankTab"..i-1].Button, "BOTTOM", 0, -20) end texture:ClearAllPoints() texture:SetPoint("TOPLEFT", 2, -2) texture:SetPoint("BOTTOMRIGHT", -2, 2) texture:SetTexCoord(0.1, 0.9, 0.1, 0.9) end for i = 1, 4 do T.SkinTab(_G["GuildBankFrameTab"..i]) end -- Reposition tabs GuildBankFrameTab1:ClearAllPoints() GuildBankFrameTab1:SetPoint("TOPLEFT", GuildBankFrame, "BOTTOMLEFT", 0, 2) -- Popup GuildBankPopupFrame:HookScript("OnShow", function(frame) if not frame.isSkinned then T.SkinIconSelectionFrame(frame, nil, nil, "GuildBankPopup") frame.isSkinned = true end end) end T.SkinFuncs["Blizzard_GuildBankUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/GuildControl.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- GuildControlUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() GuildControlUI:StripTextures() GuildControlUIHbar:StripTextures() GuildControlUI:SetTemplate("Transparent") GuildControlUI:ClearAllPoints() GuildControlUI:SetPoint("TOPLEFT", GuildFrame, "TOPRIGHT", 3, 0) GuildControlUI:SetFrameLevel(GuildControlUI:GetFrameLevel() + 2) local function SkinGuildRanks() for i = 1, GuildControlGetNumRanks() do local rankFrame = _G["GuildControlUIRankOrderFrameRank"..i] if rankFrame then rankFrame.downButton:SkinButton() rankFrame.upButton:SkinButton() rankFrame.deleteButton:SkinButton() if not rankFrame.nameBox.backdrop then T.SkinEditBox(rankFrame.nameBox) end rankFrame.nameBox.backdrop:SetPoint("TOPLEFT", -2, -4) rankFrame.nameBox.backdrop:SetPoint("BOTTOMRIGHT", -4, 4) end end end hooksecurefunc("GuildControlUI_RankOrder_Update", SkinGuildRanks) T.SkinDropDownBox(GuildControlUINavigationDropDown) T.SkinDropDownBox(GuildControlUIRankSettingsFrameRankDropDown, 180) GuildControlUINavigationDropDownButton:SetWidth(20) GuildControlUIRankSettingsFrameRankDropDownButton:SetWidth(20) for i = 1, NUM_RANK_FLAGS do if _G["GuildControlUIRankSettingsFrameCheckbox"..i] then T.SkinCheckBox(_G["GuildControlUIRankSettingsFrameCheckbox"..i]) end end GuildControlUIRankOrderFrameNewButton:SkinButton() T.SkinEditBox(GuildControlUIRankSettingsFrameGoldBox) GuildControlUIRankSettingsFrameGoldBox.backdrop:SetPoint("TOPLEFT", -2, -4) GuildControlUIRankSettingsFrameGoldBox.backdrop:SetPoint("BOTTOMRIGHT", 2, 4) GuildControlUIRankSettingsFrameGoldBox:StripTextures() GuildControlUIRankBankFrameInset:StripTextures() GuildControlUIRankBankFrameInsetScrollFrame:StripTextures() hooksecurefunc("GuildControlUI_BankTabPermissions_Update", function() local numTabs = GetNumGuildBankTabs() if numTabs < MAX_BUY_GUILDBANK_TABS then numTabs = numTabs + 1 end for i = 1, numTabs do local tab = _G["GuildControlBankTab"..i.."Owned"] local purchase = _G["GuildControlBankTab"..i.."BuyPurchaseButton"] local icon = tab.tabIcon local editbox = tab.editBox icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) T.SkinCheckBox(_G["GuildControlBankTab"..i.."OwnedViewCheck"]) T.SkinCheckBox(_G["GuildControlBankTab"..i.."OwnedDepositCheck"]) T.SkinCheckBox(_G["GuildControlBankTab"..i.."OwnedUpdateInfoCheck"]) T.SkinEditBox(editbox) if purchase:GetNumRegions() < 9 then purchase:SkinButton() end end end) T.SkinDropDownBox(GuildControlUIRankBankFrameRankDropDown, 180) GuildControlUIRankBankFrameRankDropDownButton:SetWidth(20) T.SkinCloseButton(GuildControlUICloseButton) end T.SkinFuncs["Blizzard_GuildControlUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/GuildRegistrar.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- GuildRegistrar skin ---------------------------------------------------------------------------------------- local function LoadSkin() GuildRegistrarFrame:StripTextures(true) GuildRegistrarFrame:CreateBackdrop("Transparent") GuildRegistrarFrame.backdrop:SetAllPoints() GuildRegistrarGreetingFrame:StripTextures() GuildRegistrarFrameInset:StripTextures() GuildRegistrarFramePortrait:SetAlpha(0) GuildRegistrarFramePurchaseButton:SkinButton() GuildRegistrarFrameCancelButton:SkinButton() GuildRegistrarFrameGoodbyeButton:SkinButton() GuildRegistrarFramePurchaseButton:ClearAllPoints() GuildRegistrarFramePurchaseButton:SetPoint("BOTTOMLEFT", GuildRegistrarFrame.backdrop, "BOTTOMLEFT", 4, 4) GuildRegistrarFrameCancelButton:ClearAllPoints() GuildRegistrarFrameCancelButton:SetPoint("BOTTOMRIGHT", GuildRegistrarFrame.backdrop, "BOTTOMRIGHT", -4, 4) GuildRegistrarFrameGoodbyeButton:ClearAllPoints() GuildRegistrarFrameGoodbyeButton:SetPoint("BOTTOMRIGHT", GuildRegistrarFrame.backdrop, "BOTTOMRIGHT", -4, 4) T.SkinCloseButton(GuildRegistrarFrameCloseButton, GuildRegistrarFrame.backdrop) GuildRegistrarFrameEditBox:StripTextures(true) T.SkinEditBox(GuildRegistrarFrameEditBox, nil, GuildRegistrarFrameEditBox:GetHeight() - 15) for i = 1, 2 do _G["GuildRegistrarButton"..i]:GetFontString():SetTextColor(1, 1, 1) end GuildRegistrarPurchaseText:SetTextColor(1, 1, 1) AvailableServicesText:SetTextColor(1, 0.8, 0) AvailableServicesText:SetShadowColor(0, 0, 0) end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Help.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Help skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = _G.HelpFrame frame:StripTextures() frame:CreateBackdrop('Transparent') T.SkinCloseButton(HelpFrame.CloseButton, frame.backdrop) local browser = _G.HelpBrowser browser.BrowserInset:StripTextures() end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Inspect.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- InspectUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() InspectFrame:StripTextures(true) InspectFrameInset:StripTextures(true) InspectFrame:CreateBackdrop("Transparent") InspectFrame.backdrop:SetAllPoints() T.SkinCloseButton(InspectFrameCloseButton) InspectPaperDollFrame.ViewButton:SkinButton() InspectFramePortrait:SetAlpha(0) for i = 1, 4 do T.SkinTab(_G["InspectFrameTab"..i]) end InspectModelFrame:StripTextures() InspectModelFrame:CreateBackdrop("Default") InspectModelFrame.backdrop:SetPoint("TOPLEFT", -3, 4) InspectModelFrame.backdrop:SetPoint("BOTTOMRIGHT", 4, 0) InspectModelFrame.BackgroundOverlay:SetColorTexture(0, 0, 0) -- Unit Background Texture InspectModelFrameBackgroundTopLeft:SetPoint("TOPLEFT", InspectModelFrame.backdrop, "TOPLEFT", 2, -2) InspectModelFrameBackgroundTopRight:SetPoint("TOPRIGHT", InspectModelFrame.backdrop, "TOPRIGHT", -2, -2) InspectModelFrameBackgroundBotLeft:SetPoint("BOTTOMLEFT", InspectModelFrame.backdrop, "BOTTOMLEFT", 2, -50) InspectModelFrameBackgroundBotRight:SetPoint("BOTTOMRIGHT", InspectModelFrame.backdrop, "BOTTOMRIGHT", -2, -50) local slots = { "HeadSlot", "NeckSlot", "ShoulderSlot", "BackSlot", "ChestSlot", "ShirtSlot", "TabardSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "Finger0Slot", "Finger1Slot", "Trinket0Slot", "Trinket1Slot", "MainHandSlot", "SecondaryHandSlot" } for _, slot in pairs(slots) do local icon = _G["Inspect"..slot.."IconTexture"] local slot = _G["Inspect"..slot] slot:StripTextures() slot:StyleButton() icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) icon:ClearAllPoints() icon:SetPoint("TOPLEFT", 2, -2) icon:SetPoint("BOTTOMRIGHT", -2, 2) slot:SetFrameLevel(slot:GetFrameLevel() + 2) slot:CreateBackdrop("Default") slot.backdrop:SetAllPoints() hooksecurefunc(slot.IconBorder, "SetVertexColor", function(self) self:SetTexture("") end) end -- Presige texture local portrait = InspectPVPFrame:CreateTexture(nil, "OVERLAY") portrait:SetSize(55, 55) portrait:SetPoint("CENTER", InspectPVPFrame.PortraitBackground, "CENTER", 0, 0) InspectPVPFrame.SmallWreath:ClearAllPoints() InspectPVPFrame.SmallWreath:SetPoint("TOPLEFT", 3, -25) -- PvP Talents for i = 1, 3 do local slot = InspectPVPFrame["TalentSlot"..i] local icon = slot.Texture slot:StripTextures() icon:SkinIcon() icon:SetTexCoord(.15, .85, .15, .85) slot.Border:Hide() end InspectPVPFrame.BG:Kill() InspectPaperDollItemsFrame.InspectTalents:SkinButton() SpecializationRing:Hide() SpecializationSpecIcon:SkinIcon() SpecializationSpecIcon:SetTexCoord(.15, .85, .15, .85) SpecializationSpecName:SetFont(C.media.normal_font, 20, "") InspectTalentFrame:DisableDrawLayer("BACKGROUND") InspectTalentFrame:DisableDrawLayer("BORDER") InspectGuildFrameBG:Kill() end T.SkinFuncs["Blizzard_InspectUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/Islands.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- Islands skin ---------------------------------------------------------------------------------------- local LoadTootlipSkin = CreateFrame("Frame") LoadTootlipSkin:RegisterEvent("ADDON_LOADED") LoadTootlipSkin:SetScript("OnEvent", function(self, _, addon) if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") or not C.tooltip.enable then self:UnregisterEvent("ADDON_LOADED") return end if addon == "Blizzard_IslandsQueueUI" then local tt = IslandsQueueFrame.WeeklyQuest.QuestReward.Tooltip tt:SetTemplate("Transparent") tt.ItemTooltip.Icon:SkinIcon() tt.ItemTooltip.IconBorder:SetAlpha(0) end end) if C.skins.blizzard_frames ~= true then return end local function LoadSkin() IslandsQueueFrame:StripTextures() IslandsQueueFrame:SetTemplate("Transparent") IslandsQueueFrame.ArtOverlayFrame:SetAlpha(0) IslandsQueueFrame.TitleBanner.Banner:SetAlpha(0) IslandsQueueFrame.HelpButton.Ring:Hide() IslandsQueueFrame.HelpButton:SetPoint("TOPLEFT", IslandsQueueFrame, "TOPLEFT", -12, 12) IslandsQueueFrame.DifficultySelectorFrame.Background:Hide() IslandsQueueFrame.DifficultySelectorFrame:SetPoint("BOTTOM", 0, -15) IslandsQueueFrame.DifficultySelectorFrame.QueueButton:SkinButton() T.SkinCloseButton(IslandsQueueFrameCloseButton) -- StatusBar IslandsQueueFrame.WeeklyQuest.OverlayFrame:StripTextures() IslandsQueueFrame.WeeklyQuest.StatusBar:CreateBackdrop("Overlay") local reward = IslandsQueueFrame.WeeklyQuest.QuestReward reward:ClearAllPoints() reward:SetPoint("LEFT", IslandsQueueFrame.WeeklyQuest.StatusBar, "RIGHT", -3, 0) reward.CircleMask:Hide() reward:StripTextures() reward.Icon:SkinIcon() reward.Icon:SetSize(19, 19) -- TutorialFrame IslandsQueueFrame.TutorialFrame:StripTextures() IslandsQueueFrame.TutorialFrame:SetTemplate("Transparent") IslandsQueueFrame.TutorialFrame:SetPoint("TOPLEFT", 300, -150) IslandsQueueFrame.TutorialFrame:SetPoint("BOTTOMRIGHT", -300, 170) IslandsQueueFrame.TutorialFrame.TutorialText:SetTextColor(1, 1, 1) local TutorialIcon = IslandsQueueFrame.TutorialFrame:CreateTexture(nil, "BORDER") TutorialIcon:SetTexture([[Interface\Icons\INV_Glowing Azerite Spire]]) TutorialIcon:SetSize(64, 64) TutorialIcon:SetPoint("TOP", IslandsQueueFrame.TutorialFrame, "TOP", 0, -10) TutorialIcon:SkinIcon(true) IslandsQueueFrame.TutorialFrame.Leave:SkinButton() T.SkinCloseButton(IslandsQueueFrame.TutorialFrame.CloseButton) end T.SkinFuncs["Blizzard_IslandsQueueUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/ItemInteraction.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- ItemInteractionUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() ItemInteractionFrame:StripTextures() ItemInteractionFrame:CreateBackdrop("Transparent") ItemInteractionFramePortrait:Hide() ItemInteractionFrame.ButtonFrame:StripTextures() ItemInteractionFrame.ButtonFrame.MoneyFrameEdge:StripTextures() local ItemSlot = ItemInteractionFrame.ItemSlot ItemSlot:StripTextures() ItemSlot:SetSize(58, 58) ItemSlot:ClearAllPoints() ItemSlot:SetPoint("TOPLEFT", 143, -97) ItemSlot.Icon:ClearAllPoints() ItemSlot.Icon:SetPoint("TOPLEFT", 1, -1) ItemSlot.Icon:SetPoint("BOTTOMRIGHT", -1, 1) ItemSlot.Icon:SkinIcon() ItemSlot.GlowOverlay:SetAlpha(0) ItemInteractionFrame.ButtonFrame.Currency.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) ItemInteractionFrame.ButtonFrame.ActionButton:SkinButton() T.SkinCloseButton(ItemInteractionFrameCloseButton) end T.SkinFuncs["Blizzard_ItemInteractionUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/ItemSocketing.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- ItemSocketingUI skin ---------------------------------------------------------------------------------------- local function LoadSkin() ItemSocketingFrame:StripTextures() ItemSocketingFrame:CreateBackdrop("Transparent") ItemSocketingFrame.backdrop:SetPoint("TOPLEFT", 0, 0) ItemSocketingFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) ItemSocketingFrameInset:StripTextures() ItemSocketingScrollFrame:StripTextures() ItemSocketingScrollFrame:CreateBackdrop("Overlay") T.SkinScrollBar(ItemSocketingScrollFrameScrollBar) ItemSocketingDescription:DisableDrawLayer("BORDER") ItemSocketingDescription:DisableDrawLayer("BACKGROUND") for i = 1, MAX_NUM_SOCKETS do local button = _G["ItemSocketingSocket"..i] local button_bracket = _G["ItemSocketingSocket"..i.."BracketFrame"] local button_bg = _G["ItemSocketingSocket"..i.."Background"] local button_icon = _G["ItemSocketingSocket"..i.."IconTexture"] button:StripTextures() button:StyleButton() button:SetTemplate("Overlay") button_bracket:Kill() button_bg:Kill() button_icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) button_icon:ClearAllPoints() button_icon:SetPoint("TOPLEFT", 2, -2) button_icon:SetPoint("BOTTOMRIGHT", -2, 2) end local GEM_TYPE_INFO = { Yellow = {r = 0.97, g = 0.82, b = 0.29}, Red = {r = 1, g = 0.47, b = 0.47}, Blue = {r = 0.47, g = 0.67, b = 1}, PunchcardRed = {r = 1, g = 0.47, b = 0.47}, PunchcardYellow = {r = 0.97, g = 0.82, b = 0.29}, PunchcardBlue = {r = 0.47, g = 0.67, b = 1} } hooksecurefunc("ItemSocketingFrame_Update", function() for i, socket in ipairs(_G.ItemSocketingFrame.Sockets) do local gemColor = GetSocketTypes(i) local color = GEM_TYPE_INFO[gemColor] if color then socket:SetBackdropBorderColor(color.r, color.g, color.b) socket.overlay:SetVertexColor(color.r, color.g, color.b, 0.35) else socket:SetBackdropBorderColor(unpack(C.media.border_color)) socket.overlay:SetVertexColor(0.1, 0.1, 0.1, 1) end end end) ItemSocketingFramePortrait:Kill() ItemSocketingSocketButton:ClearAllPoints() ItemSocketingSocketButton:SetPoint("BOTTOMRIGHT", ItemSocketingFrame.backdrop, "BOTTOMRIGHT", -5, 5) ItemSocketingSocketButton:SkinButton() T.SkinCloseButton(ItemSocketingFrameCloseButton, ItemSocketingFrame.backdrop) end T.SkinFuncs["Blizzard_ItemSocketingUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/ItemText.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- ItemText skin ---------------------------------------------------------------------------------------- local function LoadSkin() ItemTextFrame:StripTextures(true) ItemTextFrameInset:StripTextures() ItemTextScrollFrame:StripTextures() ItemTextFrame:CreateBackdrop("Transparent") ItemTextFrame.backdrop:SetPoint("TOPLEFT", 0, 0) ItemTextFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0) T.SkinCloseButton(ItemTextFrameCloseButton, ItemTextFrame.backdrop) T.SkinNextPrevButton(ItemTextPrevPageButton) T.SkinNextPrevButton(ItemTextNextPageButton) T.SkinScrollBar(ItemTextScrollFrameScrollBar) ItemTextPageText:SetTextColor("P", 1, 1, 1) ItemTextPageText.SetTextColor = T.dummy end tinsert(T.SkinFuncs["ShestakUI"], LoadSkin) ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/ItemUpgrade.lua ================================================ local T, C, L, _ = unpack(select(2, ...)) if C.skins.blizzard_frames ~= true then return end ---------------------------------------------------------------------------------------- -- ItemUpgrade skin ---------------------------------------------------------------------------------------- local function LoadSkin() local frame = ItemUpgradeFrame T.SkinCloseButton(frame.CloseButton) frame:StripTextures() frame:SetTemplate("Transparent") ItemUpgradeFramePortrait:SetAlpha(0) frame.UpgradeItemButton:StripTextures() frame.UpgradeItemButton:SetTemplate("Default") frame.UpgradeItemButton:StyleButton() frame.UpgradeItemButton:GetNormalTexture():SetInside() frame.UpgradeItemButton.IconBorder:SetAlpha(0) frame.UpgradeItemButton.icon:SetInside() frame.UpgradeItemButton.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9) T.SkinDropDownBox(frame.ItemInfo.Dropdown) frame.UpgradeButton:SkinButton(true) frame.UpgradeCostFrame.BGTex:Hide() ItemUpgradeFrameLeftItemPreviewFrame.NineSlice:SetTemplate("Overlay") ItemUpgradeFrameRightItemPreviewFrame.NineSlice:SetTemplate("Overlay") ItemUpgradeFramePlayerCurrenciesBorder:StripTextures() local function reskinCurrencyIcon(self) for frame in self.iconPool:EnumerateActive() do if not frame.Icon.styled then frame.Icon:SkinIcon(true) frame.Icon.styled = true end end end hooksecurefunc(frame.UpgradeCostFrame, "GetIconFrame", reskinCurrencyIcon) hooksecurefunc(frame.PlayerCurrencies, "GetIconFrame", reskinCurrencyIcon) end T.SkinFuncs["Blizzard_ItemUpgradeUI"] = LoadSkin ================================================ FILE: ShestakUI/Modules/Skins/Blizzard/LoadFrames.xml ================================================