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/Libs/oUF/Blizzard.lua
================================================
local _, ns = ...
local oUF = ns.oUF
-- sourced from FrameXML\ArenaUI.lua
local MAX_ARENA_ENEMIES = _G.MAX_ARENA_ENEMIES or 5
-- sourced from FrameXML/TargetFrame.lua
local MAX_BOSS_FRAMES = _G.MAX_BOSS_FRAMES or 5
local isArenaHooked = false
local isPartyHooked = false
local hiddenParent = CreateFrame('Frame', nil, UIParent)
hiddenParent:SetAllPoints()
hiddenParent:Hide()
local function insecureOnShow(self)
self:Hide()
end
local function handleFrame(baseName, doNotReparent)
local frame
if(type(baseName) == 'string') then
frame = _G[baseName]
else
frame = baseName
end
if(frame) then
frame:UnregisterAllEvents()
frame:Hide()
if(not doNotReparent) then
frame:SetParent(hiddenParent)
end
local health = frame.healthBar or frame.healthbar or frame.HealthBar
if(health) then
health:UnregisterAllEvents()
end
local power = frame.manabar or frame.ManaBar
if(power) then
power:UnregisterAllEvents()
end
local spell = frame.castBar or frame.spellbar
if(spell) then
spell:UnregisterAllEvents()
end
local altpowerbar = frame.powerBarAlt or frame.PowerBarAlt
if(altpowerbar) then
altpowerbar:UnregisterAllEvents()
end
local buffFrame = frame.BuffFrame
if(buffFrame) then
buffFrame:UnregisterAllEvents()
end
local petFrame = frame.petFrame or frame.PetFrame
if(petFrame) then
petFrame:UnregisterAllEvents()
end
local totFrame = frame.totFrame
if(totFrame) then
totFrame:UnregisterAllEvents()
end
end
end
function oUF:DisableBlizzard(unit)
if(not unit) then return end
if(unit == 'player') then
handleFrame(PlayerFrame)
-- For the damn vehicle support:
PlayerFrame:RegisterEvent('PLAYER_ENTERING_WORLD')
PlayerFrame:RegisterEvent('UNIT_ENTERING_VEHICLE')
PlayerFrame:RegisterEvent('UNIT_ENTERED_VEHICLE')
PlayerFrame:RegisterEvent('UNIT_EXITING_VEHICLE')
PlayerFrame:RegisterEvent('UNIT_EXITED_VEHICLE')
-- User placed frames don't animate
PlayerFrame:SetUserPlaced(true)
PlayerFrame:SetDontSavePosition(true)
elseif(unit == 'pet') then
handleFrame(PetFrame)
elseif(unit == 'target') then
handleFrame(TargetFrame)
elseif(unit == 'focus') then
handleFrame(FocusFrame)
elseif(unit:match('boss%d?$')) then
local id = unit:match('boss(%d)')
if(id) then
handleFrame('Boss' .. id .. 'TargetFrame')
else
for i = 1, MAX_BOSS_FRAMES do
handleFrame('Boss' .. i .. 'TargetFrame')
end
end
elseif(unit:match('party%d?$')) then
if(not isPartyHooked) then
isPartyHooked = true
PartyFrame:UnregisterAllEvents()
for frame in PartyFrame.PartyMemberFramePool:EnumerateActive() do
handleFrame(frame)
end
end
elseif(unit:match('arena%d?$')) then
if(not isArenaHooked) then
isArenaHooked = true
-- this disables ArenaEnemyFramesContainer
SetCVar('showArenaEnemyFrames', '0')
SetCVar('showArenaEnemyPets', '0')
-- but still UAE all containers
ArenaEnemyFramesContainer:UnregisterAllEvents()
ArenaEnemyPrepFramesContainer:UnregisterAllEvents()
ArenaEnemyMatchFramesContainer:UnregisterAllEvents()
for i = 1, MAX_ARENA_ENEMIES do
handleFrame('ArenaEnemyMatchFrame' .. i)
handleFrame('ArenaEnemyPrepFrame' .. i)
end
end
elseif(unit:match('nameplate%d+$')) then
local frame = C_NamePlate.GetNamePlateForUnit(unit)
if(frame and frame.UnitFrame) then
if(not frame.UnitFrame.isHooked) then
frame.UnitFrame:HookScript('OnShow', insecureOnShow)
frame.UnitFrame.isHooked = true
end
handleFrame(frame.UnitFrame, true)
end
end
end
================================================
FILE: ShestakUI/Libs/oUF/Colors.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local frame_metatable = Private.frame_metatable
local colorMixin = {
SetRGBA = function(self, r, g, b, a)
if(r > 1 or g > 1 or b > 1) then
r, g, b = r / 255, g / 255, b / 255
end
self.r = r
self[1] = r
self.g = g
self[2] = g
self.b = b
self[3] = b
self.a = a
-- pre-generate the hex color, there's no point to this being generated on the fly
self.hex = string.format('ff%02x%02x%02x', self:GetRGBAsBytes())
end,
SetAtlas = function(self, atlas)
self.atlas = atlas
end,
GetAtlas = function(self)
return self.atlas
end,
GenerateHexColor = function(self)
return self.hex
end,
}
--[[ Colors: oUF:CreateColor(r, g, b[, a])
Wrapper for [SharedXML\Color.lua's ColorMixin](https://wowpedia.fandom.com/wiki/ColorMixin), extended to support indexed colors used in oUF, as
well as extra methods for dealing with atlases.
The rgb values can be either normalized (0-1) or bytes (0-255).
* self - the global oUF object
* r - value used as represent the red color (number)
* g - value used to represent the green color (number)
* b - value used to represent the blue color (number)
* a - value used to represent the opacity (number, optional)
## Returns
* color - the ColorMixin-based object
--]]
function oUF:CreateColor(r, g, b, a)
local color = Mixin({}, ColorMixin, colorMixin)
color:SetRGBA(r, g, b, a)
return color
end
local colors = {
smooth = {
1, 0, 0,
1, 1, 0,
0, 1, 0
},
health = oUF:CreateColor(49, 207, 37),
disconnected = oUF:CreateColor(0.6, 0.6, 0.6),
tapped = oUF:CreateColor(0.6, 0.6, 0.6),
runes = {
oUF:CreateColor(247, 65, 57), -- blood
oUF:CreateColor(148, 203, 247), -- frost
oUF:CreateColor(173, 235, 66), -- unholy
},
selection = {
[ 0] = oUF:CreateColor(255, 0, 0), -- HOSTILE
[ 1] = oUF:CreateColor(255, 129, 0), -- UNFRIENDLY
[ 2] = oUF:CreateColor(255, 255, 0), -- NEUTRAL
[ 3] = oUF:CreateColor(0, 255, 0), -- FRIENDLY
[ 4] = oUF:CreateColor(0, 0, 255), -- PLAYER_SIMPLE
[ 5] = oUF:CreateColor(96, 96, 255), -- PLAYER_EXTENDED
[ 6] = oUF:CreateColor(170, 170, 255), -- PARTY
[ 7] = oUF:CreateColor(170, 255, 170), -- PARTY_PVP
[ 8] = oUF:CreateColor(83, 201, 255), -- FRIEND
[ 9] = oUF:CreateColor(128, 128, 128), -- DEAD
-- [10] = {}, -- COMMENTATOR_TEAM_1, unavailable to players
-- [11] = {}, -- COMMENTATOR_TEAM_2, unavailable to players
[12] = oUF:CreateColor(255, 255, 139), -- SELF, buggy
[13] = oUF:CreateColor(0, 153, 0), -- BATTLEGROUND_FRIENDLY_PVP
},
class = {},
debuff = {},
reaction = {},
power = {},
threat = {},
}
-- We do this because people edit the vars directly, and changing the default
-- globals makes SPICE FLOW!
local function customClassColors()
if(_G.CUSTOM_CLASS_COLORS) then
local function updateColors()
for classToken, color in next, _G.CUSTOM_CLASS_COLORS do
colors.class[classToken] = oUF:CreateColor(color.r, color.g, color.b)
end
for _, obj in next, oUF.objects do
obj:UpdateAllElements('CUSTOM_CLASS_COLORS')
end
end
updateColors()
_G.CUSTOM_CLASS_COLORS:RegisterCallback(updateColors)
return true
end
end
if(not customClassColors()) then
for classToken, color in next, _G.RAID_CLASS_COLORS do
colors.class[classToken] = oUF:CreateColor(color.r, color.g, color.b)
end
local eventHandler = CreateFrame('Frame')
eventHandler:RegisterEvent('ADDON_LOADED')
eventHandler:SetScript('OnEvent', function(self)
if(customClassColors()) then
self:UnregisterEvent('ADDON_LOADED')
self:SetScript('OnEvent', nil)
end
end)
end
for debuffType, color in next, _G.DebuffTypeColor do
colors.debuff[debuffType] = oUF:CreateColor(color.r, color.g, color.b)
end
for eclass, color in next, _G.FACTION_BAR_COLORS do
colors.reaction[eclass] = oUF:CreateColor(color.r, color.g, color.b)
end
for power, color in next, PowerBarColor do
if (type(power) == 'string') then
if(type(select(2, next(color))) == 'table') then
colors.power[power] = {}
for index, color_ in next, color do
colors.power[power][index] = oUF:CreateColor(color_.r, color_.g, color_.b)
end
else
colors.power[power] = oUF:CreateColor(color.r, color.g, color.b)
if(color.atlas) then
colors.power[power]:SetAtlas(color.atlas)
end
end
end
end
-- sourced from FrameXML/Constants.lua
colors.power[0] = colors.power.MANA
colors.power[1] = colors.power.RAGE
colors.power[2] = colors.power.FOCUS
colors.power[3] = colors.power.ENERGY
colors.power[4] = colors.power.COMBO_POINTS
colors.power[5] = colors.power.RUNES
colors.power[6] = colors.power.RUNIC_POWER
colors.power[7] = colors.power.SOUL_SHARDS
colors.power[8] = colors.power.LUNAR_POWER
colors.power[9] = colors.power.HOLY_POWER
colors.power[11] = colors.power.MAELSTROM
colors.power[12] = colors.power.CHI
colors.power[13] = colors.power.INSANITY
colors.power[16] = colors.power.ARCANE_CHARGES
colors.power[17] = colors.power.FURY
colors.power[18] = colors.power.PAIN
-- there's no official colour for evoker's essence
-- use the average colour of the essence texture instead
colors.power.ESSENCE = oUF:CreateColor(100, 173, 206)
colors.power[19] = colors.power.ESSENCE
-- alternate power, sourced from FrameXML/CompactUnitFrame.lua
colors.power.ALTERNATE = oUF:CreateColor(0.7, 0.7, 0.6)
colors.power[10] = colors.power.ALTERNATE
for i = 0, 3 do
colors.threat[i] = oUF:CreateColor(GetThreatStatusColor(i))
end
local function colorsAndPercent(a, b, ...)
if(a <= 0 or b == 0) then
return nil, ...
elseif(a >= b) then
return nil, select(-3, ...)
end
local num = select('#', ...) / 3
local segment, relperc = math.modf((a / b) * (num - 1))
return relperc, select((segment * 3) + 1, ...)
end
-- http://www.wowwiki.com/ColorGradient
--[[ Colors: oUF:RGBColorGradient(a, b, ...)
Used to convert a percent value (the quotient of `a` and `b`) into a gradient from 2 or more RGB colors. If more than 2
colors are passed, the gradient will be between the two colors which perc lies in an evenly divided range. A RGB color
is a sequence of 3 consecutive RGB percent values (in the range [0-1]). If `a` is negative or `b` is zero then the first
RGB color (the first 3 RGB values passed to the function) is returned. If `a` is bigger than or equal to `b`, then the
last 3 RGB values are returned.
* self - the global oUF object
* a - value used as numerator to calculate the percentage (number)
* b - value used as denominator to calculate the percentage (number)
* ... - a list of RGB percent values. At least 6 values should be passed (number [0-1])
--]]
function oUF:RGBColorGradient(...)
local relperc, r1, g1, b1, r2, g2, b2 = colorsAndPercent(...)
if(relperc) then
return r1 + (r2 - r1) * relperc, g1 + (g2 - g1) * relperc, b1 + (b2 - b1) * relperc
else
return r1, g1, b1
end
end
-- HCY functions are based on http://www.chilliant.com/rgb2hsv.html
local function getY(r, g, b)
return 0.299 * r + 0.587 * g + 0.114 * b
end
local function rgbToHCY(r, g, b)
local min, max = math.min(r, g, b), math.max(r, g, b)
local chroma = max - min
local hue
if(chroma > 0) then
if(r == max) then
hue = ((g - b) / chroma) % 6
elseif(g == max) then
hue = (b - r) / chroma + 2
elseif(b == max) then
hue = (r - g) / chroma + 4
end
hue = hue / 6
end
return hue, chroma, getY(r, g, b)
end
local function hcyToRGB(hue, chroma, luma)
local r, g, b = 0, 0, 0
if(hue and luma > 0) then
local h2 = hue * 6
local x = chroma * (1 - math.abs(h2 % 2 - 1))
if(h2 < 1) then
r, g, b = chroma, x, 0
elseif(h2 < 2) then
r, g, b = x, chroma, 0
elseif(h2 < 3) then
r, g, b = 0, chroma, x
elseif(h2 < 4) then
r, g, b = 0, x, chroma
elseif(h2 < 5) then
r, g, b = x, 0, chroma
else
r, g, b = chroma, 0, x
end
local y = getY(r, g, b)
if(luma < y) then
chroma = chroma * (luma / y)
elseif(y < 1) then
chroma = chroma * (1 - luma) / (1 - y)
end
r = (r - y) * chroma + luma
g = (g - y) * chroma + luma
b = (b - y) * chroma + luma
end
return r, g, b
end
--[[ Colors: oUF:HCYColorGradient(a, b, ...)
Used to convert a percent value (the quotient of `a` and `b`) into a gradient from 2 or more HCY colors. If more than 2
colors are passed, the gradient will be between the two colors which perc lies in an evenly divided range. A HCY color
is a sequence of 3 consecutive values in the range [0-1]. If `a` is negative or `b` is zero then the first
HCY color (the first 3 HCY values passed to the function) is returned. If `a` is bigger than or equal to `b`, then the
last 3 HCY values are returned.
* self - the global oUF object
* a - value used as numerator to calculate the percentage (number)
* b - value used as denominator to calculate the percentage (number)
* ... - a list of HCY color values. At least 6 values should be passed (number [0-1])
--]]
function oUF:HCYColorGradient(...)
local relperc, r1, g1, b1, r2, g2, b2 = colorsAndPercent(...)
if(not relperc) then
return r1, g1, b1
end
local h1, c1, y1 = rgbToHCY(r1, g1, b1)
local h2, c2, y2 = rgbToHCY(r2, g2, b2)
local c = c1 + (c2 - c1) * relperc
local y = y1 + (y2 - y1) * relperc
if(h1 and h2) then
local dh = h2 - h1
if(dh < -0.5) then
dh = dh + 1
elseif(dh > 0.5) then
dh = dh - 1
end
return hcyToRGB((h1 + dh * relperc) % 1, c, y)
else
return hcyToRGB(h1 or h2, c, y)
end
end
--[[ Colors: oUF:ColorGradient(a, b, ...) or frame:ColorGradient(a, b, ...)
Used as a proxy to call the proper gradient function depending on the user's preference. If `oUF.useHCYColorGradient` is
set to true, `:HCYColorGradient` will be called, else `:RGBColorGradient`.
* self - the global oUF object or a unit frame
* a - value used as numerator to calculate the percentage (number)
* b - value used as denominator to calculate the percentage (number)
* ... - a list of color values. At least 6 values should be passed (number [0-1])
--]]
function oUF:ColorGradient(...)
return (oUF.useHCYColorGradient and oUF.HCYColorGradient or oUF.RGBColorGradient)(self, ...)
end
oUF.colors = colors
oUF.useHCYColorGradient = false
frame_metatable.__index.colors = colors
frame_metatable.__index.ColorGradient = oUF.ColorGradient
================================================
FILE: ShestakUI/Libs/oUF/CombatEvents.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local argcheck = Private.argcheck
local frame_metatable = Private.frame_metatable
local CombatLogGetCurrentEventInfo = _G.CombatLogGetCurrentEventInfo
local event_metatable = {
__call = function(funcs, ...)
for self, func in next, funcs do
if (self:IsVisible()) then
func(self, ...)
end
end
end,
}
local self_metatable = {
__call = function(funcs, self, ...)
for _, func in next, funcs do
func(self, ...)
end
end
}
local listener = CreateFrame('Frame')
listener.activeEvents = 0
local function filter(_, event, ...)
if(listener[event]) then
listener[event](event, ...)
end
end
listener:SetScript('OnEvent', function(self, event)
filter(CombatLogGetCurrentEventInfo())
end)
--[[ CombatEvents: frame:RegisterCombatEvent(event, handler)
Used to register a frame for a combat log event and add an event handler.
* self - frame that will be registered for the given event
* event - name of the combat log event to register (string)
* handler - function which will be executed when the combat log event fires. Multiple handlers can be added for the
same frame and event (function)
--]]
function frame_metatable.__index:RegisterCombatEvent(event, handler)
argcheck(event, 2, 'string')
argcheck(handler, 3, 'function')
if(not listener[event]) then
listener[event] = setmetatable({}, event_metatable)
listener.activeEvents = listener.activeEvents + 1
end
local current = listener[event][self]
if(current) then
for _, func in next, current do
if(func == handler) then return end
end
table.insert(current, handler)
else
-- even with a single handler we want to make sure the frame is visible
listener[event][self] = setmetatable({handler}, self_metatable)
end
if(listener.activeEvents > 0) then
listener:RegisterEvent('COMBAT_LOG_EVENT_UNFILTERED')
end
end
--[[ CombatEvents: frame:UnregisterCombatEvent(event, handler)
Used to remove a function from the event handler list for a combat log event.
* self - the frame registered for the event
* event - name of the registered combat log event (string)
* handler - function to be removed from the list of event handlers
--]]
function frame_metatable.__index:UnregisterCombatEvent(event, handler)
argcheck(event, 2, 'string')
if(not listener[event]) then return end
local cleanUp = false
local current = listener[event][self]
if(current) then
for i, func in next, current do
if(func == handler) then
current[i] = nil
break
end
end
if(not next(current)) then
cleanUp = true
end
end
if(cleanUp) then
listener[event][self] = nil
if(not next(listener[event])) then
listener[event] = nil
listener.activeEvents = listener.activeEvents - 1
if(listener.activeEvents <= 0) then
listener:UnregisterEvent('COMBAT_LOG_EVENT_UNFILTERED')
end
end
end
end
================================================
FILE: ShestakUI/Libs/oUF/Elements/AlternativePower.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local unitSelectionType = Private.unitSelectionType
-- sourced from FrameXML/UnitPowerBarAlt.lua
local ALTERNATE_POWER_INDEX = Enum.PowerType.Alternate or 10
local ALTERNATE_POWER_NAME = 'ALTERNATE'
local function updateTooltip(self)
local name, tooltip = GetUnitPowerBarStringsByID(self.__barID)
GameTooltip:SetText(name or '', 1, 1, 1)
GameTooltip:AddLine(tooltip or '', nil, nil, nil, true)
GameTooltip:Show()
end
local function onEnter(self)
if(not self:IsVisible()) then return end
GameTooltip_SetDefaultAnchor(GameTooltip, self)
self:UpdateTooltip()
end
local function onLeave()
GameTooltip:Hide()
end
local function UpdateColor(self, event, unit, powerType)
if(self.unit ~= unit or powerType ~= ALTERNATE_POWER_NAME) then return end
local element = self.AlternativePower
local r, g, b, color
if(element.colorThreat and not UnitPlayerControlled(unit) and UnitThreatSituation('player', unit)) then
color = self.colors.threat[UnitThreatSituation('player', unit)]
elseif(element.colorPower) then
color = self.colors.power[ALTERNATE_POWER_INDEX]
elseif(element.colorClass and UnitIsPlayer(unit))
or (element.colorClassNPC and not UnitIsPlayer(unit)) then
local _, class = UnitClass(unit)
color = self.colors.class[class]
elseif(element.colorSelection and unitSelectionType(unit, element.considerSelectionInCombatHostile)) then
color = self.colors.selection[unitSelectionType(unit, element.considerSelectionInCombatHostile)]
elseif(element.colorReaction and UnitReaction(unit, 'player')) then
color = self.colors.reaction[UnitReaction(unit, 'player')]
elseif(element.colorSmooth) then
local adjust = 0 - (element.min or 0)
r, g, b = self:ColorGradient((element.cur or 1) + adjust, (element.max or 1) + adjust, unpack(element.smoothGradient or self.colors.smooth))
end
if(color) then
r, g, b = color[1], color[2], color[3]
end
if(b) then
element:SetStatusBarColor(r, g, b)
local bg = element.bg
if(bg) then
local mu = bg.multiplier or 1
bg:SetVertexColor(r * mu, g * mu, b * mu)
end
end
--[[ Callback: AlternativePower:PostUpdateColor(unit, r, g, b)
Called after the element color has been updated.
* self - the AlternativePower element
* unit - the unit for which the update has been triggered (string)
* r - the red component of the used color (number)[0-1]
* g - the green component of the used color (number)[0-1]
* b - the blue component of the used color (number)[0-1]
--]]
if(element.PostUpdateColor) then
element:PostUpdateColor(unit, r, g, b)
end
end
local function Update(self, event, unit, powerType)
if(self.unit ~= unit or powerType ~= ALTERNATE_POWER_NAME) then return end
local element = self.AlternativePower
--[[ Callback: AlternativePower:PreUpdate()
Called before the element has been updated.
* self - the AlternativePower element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local cur, max, min
local barInfo = element.__barInfo
if(barInfo) then
cur = UnitPower(unit, ALTERNATE_POWER_INDEX)
max = UnitPowerMax(unit, ALTERNATE_POWER_INDEX)
min = barInfo.minPower
element:SetMinMaxValues(min, max)
element:SetValue(cur)
end
element.cur = cur
element.min = min
element.max = max
--[[ Callback: AlternativePower:PostUpdate(unit, cur, min, max)
Called after the element has been updated.
* self - the AlternativePower element
* unit - the unit for which the update has been triggered (string)
* cur - the current value of the unit's alternative power (number?)
* min - the minimum value of the unit's alternative power (number?)
* max - the maximum value of the unit's alternative power (number?)
--]]
if(element.PostUpdate) then
return element:PostUpdate(unit, cur, min, max)
end
end
local function Path(self, ...)
--[[ Override: AlternativePower.Override(self, event, unit, ...)
Used to completely override the element's update process.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
* ... - the arguments accompanying the event
--]]
(self.AlternativePower.Override or Update) (self, ...);
--[[ Override: AlternativePower.UpdateColor(self, event, unit, ...)
Used to completely override the internal function for updating the widgets' colors.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
* ... - the arguments accompanying the event
--]]
(self.AlternativePower.UpdateColor or UpdateColor) (self, ...)
end
local function Visibility(self, event, unit)
if(unit ~= self.unit) then return end
local element = self.AlternativePower
local barID = UnitPowerBarID(unit)
local barInfo = GetUnitPowerBarInfoByID(barID)
element.__barID = barID
element.__barInfo = barInfo
if(barInfo and (barInfo.showOnRaid and (UnitInParty(unit) or UnitInRaid(unit))
or not barInfo.hideFromOthers
or UnitIsUnit(unit, 'player')))
then
self:RegisterEvent('UNIT_POWER_UPDATE', Path)
self:RegisterEvent('UNIT_MAXPOWER', Path)
element:Show()
Path(self, event, unit, ALTERNATE_POWER_NAME)
else
self:UnregisterEvent('UNIT_POWER_UPDATE', Path)
self:UnregisterEvent('UNIT_MAXPOWER', Path)
element:Hide()
Path(self, event, unit, ALTERNATE_POWER_NAME)
end
end
local function VisibilityPath(self, ...)
--[[ Override: AlternativePower.OverrideVisibility(self, event, unit)
Used to completely override the element's visibility update process.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
--]]
return (self.AlternativePower.OverrideVisibility or Visibility) (self, ...)
end
local function ForceUpdate(element)
return VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self, unit)
local element = self.AlternativePower
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_POWER_BAR_SHOW', VisibilityPath)
self:RegisterEvent('UNIT_POWER_BAR_HIDE', VisibilityPath)
if(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then
element:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
if(element:IsMouseEnabled()) then
if(not element:GetScript('OnEnter')) then
element:SetScript('OnEnter', onEnter)
end
if(not element:GetScript('OnLeave')) then
element:SetScript('OnLeave', onLeave)
end
--[[ Override: AlternativePower:UpdateTooltip()
Called when the mouse is over the widget. Used to populate its tooltip.
* self - the AlternativePower element
--]]
if(not element.UpdateTooltip) then
element.UpdateTooltip = updateTooltip
end
end
if(unit == 'player') then
PlayerPowerBarAlt:UnregisterEvent('UNIT_POWER_BAR_SHOW')
PlayerPowerBarAlt:UnregisterEvent('UNIT_POWER_BAR_HIDE')
PlayerPowerBarAlt:UnregisterEvent('PLAYER_ENTERING_WORLD')
end
return true
end
end
local function Disable(self, unit)
local element = self.AlternativePower
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_POWER_BAR_SHOW', VisibilityPath)
self:UnregisterEvent('UNIT_POWER_BAR_HIDE', VisibilityPath)
if(unit == 'player') then
PlayerPowerBarAlt:RegisterEvent('UNIT_POWER_BAR_SHOW')
PlayerPowerBarAlt:RegisterEvent('UNIT_POWER_BAR_HIDE')
PlayerPowerBarAlt:RegisterEvent('PLAYER_ENTERING_WORLD')
end
end
end
oUF:AddElement('AlternativePower', VisibilityPath, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/AssistantIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function Update(self, event)
local element = self.AssistantIndicator
local unit = self.unit
--[[ Callback: AssistantIndicator:PreUpdate()
Called before the element has been updated.
* self - the AssistantIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local isAssistant = UnitInRaid(unit) and UnitIsGroupAssistant(unit) and not UnitIsGroupLeader(unit)
if(isAssistant) then
element:Show()
else
element:Hide()
end
--[[ Callback: AssistantIndicator:PostUpdate(isAssistant)
Called after the element has been updated.
* self - the AssistantIndicator element
* isAssistant - indicates whether the unit is a raid assistant (boolean)
--]]
if(element.PostUpdate) then
return element:PostUpdate(isAssistant)
end
end
local function Path(self, ...)
--[[ Override: AssistantIndicator.Override(self, event, ...)
Used to completely override the element's update process.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event (string)
--]]
return (self.AssistantIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate')
end
local function Enable(self)
local element = self.AssistantIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)
if(element:IsObjectType('Texture') and not element:GetTexture()) then
element:SetTexture([[Interface\GroupFrame\UI-Group-AssistantIcon]])
end
return true
end
end
local function Disable(self)
local element = self.AssistantIndicator
if(element) then
element:Hide()
self:UnregisterEvent('GROUP_ROSTER_UPDATE', Path)
end
end
oUF:AddElement('AssistantIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/Auras.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function UpdateTooltip(self)
if(GameTooltip:IsForbidden()) then return end
if(self.isHarmful) then
GameTooltip:SetUnitDebuffByAuraInstanceID(self:GetParent().__owner.unit, self.auraInstanceID)
else
GameTooltip:SetUnitBuffByAuraInstanceID(self:GetParent().__owner.unit, self.auraInstanceID)
end
end
local function onEnter(self)
if(GameTooltip:IsForbidden() or not self:IsVisible()) then return end
-- Avoid parenting GameTooltip to frames with anchoring restrictions,
-- otherwise it'll inherit said restrictions which will cause issues with
-- its further positioning, clamping, etc
GameTooltip:SetOwner(self, self:GetParent().__restricted and 'ANCHOR_CURSOR' or self:GetParent().tooltipAnchor)
self:UpdateTooltip()
end
local function onLeave()
if(GameTooltip:IsForbidden()) then return end
GameTooltip:Hide()
end
local function CreateButton(element, index)
local button = CreateFrame('Button', element:GetDebugName() .. 'Button' .. index, element)
local cd = CreateFrame('Cooldown', '$parentCooldown', button, 'CooldownFrameTemplate')
cd:SetAllPoints()
cd:SetDrawEdge(false) -- ShestakUI
button.Cooldown = cd
local icon = button:CreateTexture(nil, 'BORDER')
icon:SetAllPoints()
button.Icon = icon
local countFrame = CreateFrame('Frame', nil, button)
countFrame:SetAllPoints(button)
countFrame:SetFrameLevel(cd:GetFrameLevel() + 1)
local count = countFrame:CreateFontString(nil, 'OVERLAY', 'NumberFontNormal')
count:SetPoint('BOTTOMRIGHT', countFrame, 'BOTTOMRIGHT', -1, 0)
button.Count = count
local overlay = button:CreateTexture(nil, 'OVERLAY')
overlay:SetTexture([[Interface\Buttons\UI-Debuff-Overlays]])
overlay:SetAllPoints()
overlay:SetTexCoord(0.296875, 0.5703125, 0, 0.515625)
button.Overlay = overlay
local stealable = button:CreateTexture(nil, 'OVERLAY')
stealable:SetTexture([[Interface\TargetingFrame\UI-TargetingFrame-Stealable]])
stealable:SetPoint('TOPLEFT', -3, 3)
stealable:SetPoint('BOTTOMRIGHT', 3, -3)
stealable:SetBlendMode('ADD')
button.Stealable = stealable
button.UpdateTooltip = UpdateTooltip
button:SetScript('OnEnter', onEnter)
button:SetScript('OnLeave', onLeave)
--[[ Callback: Auras:PostCreateButton(button)
Called after a new aura button has been created.
* self - the widget holding the aura buttons
* button - the newly created aura button (Button)
--]]
if(element.PostCreateButton) then element:PostCreateButton(button) end
return button
end
local function SetPosition(element, from, to)
local width = element.width or element.size or 16
local height = element.height or element.size or 16
local sizex = width + (element['spacing-x'] or element.spacing or 0)
local sizey = height + (element['spacing-y'] or element.spacing or 0)
local anchor = element.initialAnchor or 'BOTTOMLEFT'
local growthx = (element['growth-x'] == 'LEFT' and -1) or 1
local growthy = (element['growth-y'] == 'DOWN' and -1) or 1
local cols = math.floor(element:GetWidth() / sizex + 0.5)
for i = from, to do
local button = element[i]
if(not button) then break end
local col = (i - 1) % cols
local row = math.floor((i - 1) / cols)
button:ClearAllPoints()
button:SetPoint(anchor, element, anchor, col * sizex * growthx, row * sizey * growthy)
end
end
local function updateAura(element, unit, data, position)
if(not data.name) then return end
local button = element[position]
if(not button) then
--[[ Override: Auras:CreateButton(position)
Used to create an aura button at a given position.
* self - the widget holding the aura buttons
* position - the position at which the aura button is to be created (number)
## Returns
* button - the button used to represent the aura (Button)
--]]
button = (element.CreateButton or CreateButton) (element, position)
table.insert(element, button)
element.createdButtons = element.createdButtons + 1
end
-- for tooltips
button.auraInstanceID = data.auraInstanceID
button.isHarmful = data.isHarmful
if(button.Cooldown and not element.disableCooldown) then
if(data.duration > 0) then
button.Cooldown:SetCooldown(data.expirationTime - data.duration, data.duration, data.timeMod)
button.Cooldown:Show()
else
button.Cooldown:Hide()
end
end
if(button.Overlay) then
if((data.isHarmful and element.showDebuffType) or (not data.isHarmful and element.showBuffType) or element.showType) then
local color = element.__owner.colors.debuff[data.dispelName] or element.__owner.colors.debuff.none
button.Overlay:SetVertexColor(color[1], color[2], color[3])
button.Overlay:Show()
else
button.Overlay:Hide()
end
end
if(button.Stealable) then
if(not data.isHarmful and data.isStealable and element.showStealableBuffs and not UnitIsUnit('player', unit)) then
button.Stealable:Show()
else
button.Stealable:Hide()
end
end
if(button.Icon) then button.Icon:SetTexture(data.icon) end
if(button.Count) then button.Count:SetText(data.applications > 1 and data.applications or '') end
local width = element.width or element.size or 16
local height = element.height or element.size or 16
button:SetSize(width, height)
button:EnableMouse(not element.disableMouse)
button:Show()
--[[ Callback: Auras:PostUpdateButton(unit, button, data, position)
Called after the aura button has been updated.
* self - the widget holding the aura buttons
* button - the updated aura button (Button)
* unit - the unit on which the aura is cast (string)
* data - the [UnitAuraInfo](https://wowpedia.fandom.com/wiki/Struct_UnitAuraInfo) object (table)
* position - the actual position of the aura button (number)
--]]
if(element.PostUpdateButton) then
element:PostUpdateButton(button, unit, data, position)
end
end
local function FilterAura(element, unit, data)
if((element.onlyShowPlayer and data.isPlayerAura) or (not element.onlyShowPlayer and data.name)) then
return true
end
end
-- see AuraUtil.DefaultAuraCompare
local function SortAuras(a, b)
if(a.isPlayerAura ~= b.isPlayerAura) then
return a.isPlayerAura
end
if(a.canApplyAura ~= b.canApplyAura) then
return a.canApplyAura
end
return a.auraInstanceID < b.auraInstanceID
end
local function processData(data)
if(not data) then return end
data.isPlayerAura = data.sourceUnit and (UnitIsUnit('player', data.sourceUnit) or UnitIsOwnerOrControllerOfUnit('player', data.sourceUnit))
return data
end
local function UpdateAuras(self, event, unit, updateInfo)
if(self.unit ~= unit) then return end
local auras = self.Auras
if(auras) then
--[[ Callback: Auras:PreUpdate(unit)
Called before the element has been updated.
* self - the widget holding the aura buttons
* unit - the unit for which the update has been triggered (string)
--]]
if(auras.PreUpdate) then auras:PreUpdate(unit) end
local buffsChanged = false
local numBuffs = auras.numBuffs or 32
local buffFilter = auras.buffFilter or auras.filter or 'HELPFUL'
if(type(buffFilter) == 'function') then
buffFilter = buffFilter(auras, unit)
end
local debuffsChanged = false
local numDebuffs = auras.numDebuffs or 40
local debuffFilter = auras.debuffFilter or auras.filter or 'HARMFUL'
if(type(debuffFilter) == 'function') then
debuffFilter = debuffFilter(auras, unit)
end
local numTotal = auras.numTotal or numBuffs + numDebuffs
if(not updateInfo or updateInfo.isFullUpdate) then
auras.activeBuffs = table.wipe(auras.activeBuffs or {})
auras.sortedBuffs = table.wipe(auras.sortedBuffs or {})
numBuffs = math.min(numBuffs, numTotal)
buffsChanged = true
local slots = {UnitAuraSlots(unit, buffFilter)}
if(slots[2]) then -- #1 return is continuationToken, we don't care about it
local count = 1
for i = 2, #slots do
if count <= numBuffs then
local data = processData(C_UnitAuras.GetAuraDataBySlot(unit, slots[i]))
--[[ Override: Auras:FilterAura(unit, data)
Defines a custom filter that controls if the aura button should be shown.
* self - the widget holding the aura buttons
* unit - the unit on which the aura is cast (string)
* data - [UnitAuraInfo](https://wowpedia.fandom.com/wiki/Struct_UnitAuraInfo) object (table)
## Returns
* show - indicates whether the aura button should be shown (boolean)
--]]
if((auras.FilterAura or FilterAura) (auras, unit, data)) then
auras.activeBuffs[data.auraInstanceID] = data
table.insert(auras.sortedBuffs, data)
count = count + 1
end
end
end
end
auras.activeDebuffs = table.wipe(auras.activeDebuffs or {})
auras.sortedDebuffs = table.wipe(auras.sortedDebuffs or {})
numDebuffs = math.min(numDebuffs, numTotal - #auras.sortedBuffs)
debuffsChanged = true
slots = {UnitAuraSlots(unit, debuffFilter)}
if(slots[2]) then -- #1 return is continuationToken, we don't care about it
local count = 1
for i = 2, #slots do
if(count <= numDebuffs) then
local data = processData(C_UnitAuras.GetAuraDataBySlot(unit, slots[i]))
if((auras.FilterAura or FilterAura) (auras, unit, data)) then
auras.activeDebuffs[data.auraInstanceID] = data
table.insert(auras.sortedDebuffs, data)
count = count + 1
end
end
end
end
else
if(updateInfo.updatedAuraInstanceIDs) then
for _, auraInstanceID in next, updateInfo.updatedAuraInstanceIDs do
if(auras.activeBuffs[auraInstanceID]) then
auras.activeBuffs[auraInstanceID] = processData(C_UnitAuras.GetAuraDataByAuraInstanceID(unit, auraInstanceID))
buffsChanged = true
elseif(auras.activeDebuffs[auraInstanceID]) then
auras.activeDebuffs[auraInstanceID] = processData(C_UnitAuras.GetAuraDataByAuraInstanceID(unit, auraInstanceID))
debuffsChanged = true
end
end
end
local buffCount = #auras.sortedBuffs
local debuffCount = #auras.sortedDebuffs
if(updateInfo.removedAuraInstanceIDs) then
for _, auraInstanceID in next, updateInfo.removedAuraInstanceIDs do
if(auras.activeBuffs[auraInstanceID]) then
auras.activeBuffs[auraInstanceID] = nil
buffCount = buffCount - 1
buffsChanged = true
elseif(auras.activeDebuffs[auraInstanceID]) then
auras.activeDebuffs[auraInstanceID] = nil
debuffCount = debuffCount - 1
debuffsChanged = true
end
end
end
numBuffs = math.min(numBuffs, numTotal)
if(updateInfo.addedAuras) then
for _, data in next, updateInfo.addedAuras do
if(data.isHelpful and not C_UnitAuras.IsAuraFilteredOutByInstanceID(unit, data.auraInstanceID, buffFilter)) then
-- only try to add new auras if we have enough room for them
if(buffCount <= numBuffs) then
data = processData(data)
if((auras.FilterAura or FilterAura) (auras, unit, data)) then
auras.activeBuffs[data.auraInstanceID] = data
buffCount = buffCount + 1
buffsChanged = true
end
end
elseif(data.isHarmful and not C_UnitAuras.IsAuraFilteredOutByInstanceID(unit, data.auraInstanceID, debuffFilter)) then
-- only try to add new auras if we have enough room for them
if(debuffCount <= math.min(numDebuffs, numTotal - buffCount)) then
data = processData(data)
if((auras.FilterAura or FilterAura) (auras, unit, data)) then
auras.activeDebuffs[data.auraInstanceID] = data
debuffCount = debuffCount + 1
debuffsChanged = true
end
end
end
end
end
-- instead of removing auras one by one, just wipe the tables entirely
-- and repopulate them, multiple table.remove calls are insanely slow
if(buffsChanged) then
auras.sortedBuffs = table.wipe(auras.sortedBuffs or {})
for _, data in next, auras.activeBuffs do
table.insert(auras.sortedBuffs, data)
end
--[[ Override: Auras:SortBuffs(a, b)
Defines a custom sorting alorithm for ordering the auras.
Defaults to [AuraUtil.DefaultAuraCompare](https://github.com/Gethe/wow-ui-source/search?q=DefaultAuraCompare).
--]]
--[[ Override: Auras:SortAuras(a, b)
Defines a custom sorting alorithm for ordering the auras.
Defaults to [AuraUtil.DefaultAuraCompare](https://github.com/Gethe/wow-ui-source/search?q=DefaultAuraCompare).
Overridden by the more specific SortBuffs and/or SortDebuffs overrides if they are defined.
--]]
table.sort(auras.sortedBuffs, auras.SortBuffs or auras.SortAuras or SortAuras)
end
if(debuffsChanged) then
auras.sortedDebuffs = table.wipe(auras.sortedDebuffs or {})
for _, data in next, auras.activeDebuffs do
table.insert(auras.sortedDebuffs, data)
end
--[[ Override: Auras:SortDebuffs(a, b)
Defines a custom sorting alorithm for ordering the auras.
Defaults to [AuraUtil.DefaultAuraCompare](https://github.com/Gethe/wow-ui-source/search?q=DefaultAuraCompare).
--]]
table.sort(auras.sortedDebuffs, auras.SortDebuffs or auras.SortAuras or SortAuras)
end
end
if(not (buffsChanged or debuffsChanged)) then return end
if(buffsChanged) then
for i = 1, #auras.sortedBuffs do
updateAura(auras, unit, auras.sortedBuffs[i], i)
end
end
local offset = #auras.sortedBuffs
if(auras.gap and #auras.sortedDebuffs > 0 and #auras.sortedBuffs > 0) then
offset = offset + 1
local button = auras[offset]
if(not button) then
button = (auras.CreateButton or CreateButton) (auras, offset)
table.insert(auras, button)
auras.createdButtons = auras.createdButtons + 1
end
-- Prevent the button from displaying anything.
if(button.Cooldown) then button.Cooldown:Hide() end
if(button.Icon) then button.Icon:SetTexture() end
if(button.Overlay) then button.Overlay:Hide() end
if(button.Stealable) then button.Stealable:Hide() end
if(button.Count) then button.Count:SetText("") end
button:EnableMouse(false)
button:Hide() -- ShestakUI
--[[ Callback: Auras:PostUpdateGapButton(unit, gapButton, offset)
Called after an invisible aura button has been created. Only used by Auras when the `gap` option is enabled.
* self - the widget holding the aura buttons
* unit - the unit that has the invisible aura button (string)
* gapButton - the invisible aura button (Button)
* offset - the position of the invisible aura button (number)
--]]
if(auras.PostUpdateGapButton) then
auras:PostUpdateGapButton(unit, button, offset)
end
end
-- any changes to buffs will affect debuffs, so just redraw them
for i = 1, #auras.sortedDebuffs do
updateAura(auras, unit, auras.sortedDebuffs[i], i + offset)
end
for i = offset + #auras.sortedDebuffs + 1, #auras do
auras[i]:Hide()
end
if(auras.createdButtons > auras.anchoredButtons) then
--[[ Override: Auras:SetPosition(from, to)
Used to (re-)anchor the aura buttons.
Called when new aura buttons have been created or if :PreSetPosition is defined.
* self - the widget that holds the aura buttons
* from - the offset of the first aura button to be (re-)anchored (number)
* to - the offset of the last aura button to be (re-)anchored (number)
--]]
(auras.SetPosition or SetPosition) (auras, auras.anchoredButtons + 1, auras.createdButtons)
auras.anchoredButtons = auras.createdButtons
end
--[[ Callback: Auras:PostUpdate(unit)
Called after the element has been updated.
* self - the widget holding the aura buttons
* unit - the unit for which the update has been triggered (string)
--]]
if(auras.PostUpdate) then auras:PostUpdate(unit) end
end
local buffs = self.Buffs
if(buffs) then
if(buffs.PreUpdate) then buffs:PreUpdate(unit) end
local buffsChanged = false
local numBuffs = buffs.num or 32
local buffFilter = buffs.filter or 'HELPFUL'
if(type(buffFilter) == 'function') then
buffFilter = buffFilter(buffs, unit)
end
if(not updateInfo or updateInfo.isFullUpdate) then
buffs.active = table.wipe(buffs.active or {})
buffs.sorted = table.wipe(buffs.sorted or {})
buffsChanged = true
local slots = {UnitAuraSlots(unit, buffFilter)}
if(slots[2]) then -- #1 return is continuationToken, we don't care about it
local count = 1
for i = 2, #slots do
if count <= numBuffs then
local data = processData(C_UnitAuras.GetAuraDataBySlot(unit, slots[i]))
if((buffs.FilterAura or FilterAura) (buffs, unit, data)) then
buffs.active[data.auraInstanceID] = data
table.insert(buffs.sorted, data)
count = count + 1
end
end
end
end
else
if(updateInfo.updatedAuraInstanceIDs) then
for _, auraInstanceID in next, updateInfo.updatedAuraInstanceIDs do
if(buffs.active[auraInstanceID]) then
buffs.active[auraInstanceID] = processData(C_UnitAuras.GetAuraDataByAuraInstanceID(unit, auraInstanceID))
buffsChanged = true
end
end
end
local buffCount = #buffs.sorted
if(updateInfo.removedAuraInstanceIDs) then
for _, auraInstanceID in next, updateInfo.removedAuraInstanceIDs do
if(buffs.active[auraInstanceID]) then
buffs.active[auraInstanceID] = nil
buffCount = buffCount - 1
buffsChanged = true
end
end
end
if(updateInfo.addedAuras) then
for _, data in next, updateInfo.addedAuras do
if(data.isHelpful and not C_UnitAuras.IsAuraFilteredOutByInstanceID(unit, data.auraInstanceID, buffFilter)) then
-- only try to add new buffs if we have enough room for them
if(buffCount <= numBuffs) then
data = processData(data)
if((buffs.FilterAura or FilterAura) (buffs, unit, data)) then
buffs.active[data.auraInstanceID] = data
buffCount = buffCount + 1
buffsChanged = true
end
end
end
end
end
if(buffsChanged) then
buffs.sorted = table.wipe(buffs.sorted or {})
for _, data in next, buffs.active do
table.insert(buffs.sorted, data)
end
table.sort(buffs.sorted, buffs.SortBuffs or buffs.SortAuras or SortAuras)
end
end
if(not buffsChanged) then return end
for i = 1, #buffs.sorted do
updateAura(buffs, unit, buffs.sorted[i], i)
end
for i = #buffs.sorted + 1, #buffs do
buffs[i]:Hide()
end
if(buffs.createdButtons > buffs.anchoredButtons) then
(buffs.SetPosition or SetPosition) (buffs, buffs.anchoredButtons + 1, buffs.createdButtons)
buffs.anchoredButtons = buffs.createdButtons
end
if(buffs.PostUpdate) then buffs:PostUpdate(unit) end
end
local debuffs = self.Debuffs
if(debuffs) then
if(debuffs.PreUpdate) then debuffs:PreUpdate(unit) end
local debuffsChanged = false
local numDebuffs = debuffs.num or 40
local debuffFilter = debuffs.filter or 'HARMFUL'
if(type(debuffFilter) == 'function') then
debuffFilter = debuffFilter(debuffs, unit)
end
if(not updateInfo or updateInfo.isFullUpdate) then
debuffs.active = table.wipe(debuffs.active or {})
debuffs.sorted = table.wipe(debuffs.sorted or {})
debuffsChanged = true
local slots = {UnitAuraSlots(unit, debuffFilter)}
if(slots[2]) then -- #1 return is continuationToken, we don't care about it
local count = 1
for i = 2, #slots do
if count <= numDebuffs then
local data = processData(C_UnitAuras.GetAuraDataBySlot(unit, slots[i]))
if((debuffs.FilterAura or FilterAura) (debuffs, unit, data)) then
debuffs.active[data.auraInstanceID] = data
table.insert(debuffs.sorted, data)
count = count + 1
end
end
end
end
else
if(updateInfo.updatedAuraInstanceIDs) then
for _, auraInstanceID in next, updateInfo.updatedAuraInstanceIDs do
if(debuffs.active[auraInstanceID]) then
debuffs.active[auraInstanceID] = processData(C_UnitAuras.GetAuraDataByAuraInstanceID(unit, auraInstanceID))
debuffsChanged = true
end
end
end
local debuffCount = #debuffs.sorted
if(updateInfo.removedAuraInstanceIDs) then
for _, auraInstanceID in next, updateInfo.removedAuraInstanceIDs do
if(debuffs.active[auraInstanceID]) then
debuffs.active[auraInstanceID] = nil
debuffCount = debuffCount - 1
debuffsChanged = true
end
end
end
if(updateInfo.addedAuras) then
for _, data in next, updateInfo.addedAuras do
if(data.isHarmful and not C_UnitAuras.IsAuraFilteredOutByInstanceID(unit, data.auraInstanceID, debuffFilter)) then
-- only try to add new debuffs if we have enough room for them
if(debuffCount <= numDebuffs) then
data = processData(data)
if((debuffs.FilterAura or FilterAura) (debuffs, unit, data)) then
debuffs.active[data.auraInstanceID] = data
debuffCount = debuffCount + 1
debuffsChanged = true
end
end
end
end
end
if(debuffsChanged) then
debuffs.sorted = table.wipe(debuffs.sorted or {})
for _, data in next, debuffs.active do
table.insert(debuffs.sorted, data)
end
table.sort(debuffs.sorted, debuffs.SortDebuffs or debuffs.SortAuras or SortAuras)
end
end
if(not debuffsChanged) then return end
for i = 1, #debuffs.sorted do
updateAura(debuffs, unit, debuffs.sorted[i], i)
end
for i = #debuffs.sorted + 1, #debuffs do
debuffs[i]:Hide()
end
if(debuffs.createdButtons > debuffs.anchoredButtons) then
(debuffs.SetPosition or SetPosition) (debuffs, debuffs.anchoredButtons + 1, debuffs.createdButtons)
debuffs.anchoredButtons = debuffs.createdButtons
end
if(debuffs.PostUpdate) then debuffs:PostUpdate(unit) end
end
end
local function Update(self, event, unit, updateInfo)
if(self.unit ~= unit) then return end
UpdateAuras(self, event, unit, updateInfo)
-- Assume no event means someone wants to re-anchor things. This is usually
-- done by UpdateAllElements and :ForceUpdate.
if(event == 'ForceUpdate' or not event) then
local auras = self.Auras
if(auras) then
(auras.SetPosition or SetPosition) (auras, 1, auras.createdButtons)
end
local buffs = self.Buffs
if(buffs) then
(buffs.SetPosition or SetPosition) (buffs, 1, buffs.createdButtons)
end
local debuffs = self.Debuffs
if(debuffs) then
(debuffs.SetPosition or SetPosition) (debuffs, 1, debuffs.createdButtons)
end
end
end
local function Update(self, event, unit, updateInfo)
if(self.unit ~= unit) then return end
UpdateAuras(self, event, unit, updateInfo)
-- Assume no event means someone wants to re-anchor things. This is usually
-- done by UpdateAllElements and :ForceUpdate.
if(event == 'ForceUpdate' or not event) then
local auras = self.Auras
if(auras) then
(auras.SetPosition or SetPosition) (auras, 1, auras.createdButtons)
end
local buffs = self.Buffs
if(buffs) then
(buffs.SetPosition or SetPosition) (buffs, 1, buffs.createdButtons)
end
local debuffs = self.Debuffs
if(debuffs) then
(debuffs.SetPosition or SetPosition) (debuffs, 1, debuffs.createdButtons)
end
end
end
local function ForceUpdate(element)
return Update(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
if(self.Auras or self.Buffs or self.Debuffs) then
self:RegisterEvent('UNIT_AURA', UpdateAuras)
local auras = self.Auras
if(auras) then
auras.__owner = self
-- check if there's any anchoring restrictions
auras.__restricted = not pcall(self.GetCenter, self)
auras.ForceUpdate = ForceUpdate
auras.createdButtons = auras.createdButtons or 0
auras.anchoredButtons = 0
auras.tooltipAnchor = auras.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'
-- auras:Show() -- ShestakUI
end
local buffs = self.Buffs
if(buffs) then
buffs.__owner = self
-- check if there's any anchoring restrictions
buffs.__restricted = not pcall(self.GetCenter, self)
buffs.ForceUpdate = ForceUpdate
buffs.createdButtons = buffs.createdButtons or 0
buffs.anchoredButtons = 0
buffs.tooltipAnchor = buffs.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'
-- buffs:Show() -- ShestakUI
end
local debuffs = self.Debuffs
if(debuffs) then
debuffs.__owner = self
-- check if there's any anchoring restrictions
debuffs.__restricted = not pcall(self.GetCenter, self)
debuffs.ForceUpdate = ForceUpdate
debuffs.createdButtons = debuffs.createdButtons or 0
debuffs.anchoredButtons = 0
debuffs.tooltipAnchor = debuffs.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'
-- debuffs:Show() -- ShestakUI
end
return true
end
end
local function Disable(self)
if(self.Auras or self.Buffs or self.Debuffs) then
self:UnregisterEvent('UNIT_AURA', UpdateAuras)
if(self.Auras) then self.Auras:Hide() end
if(self.Buffs) then self.Buffs:Hide() end
if(self.Debuffs) then self.Debuffs:Hide() end
end
end
oUF:AddElement('Auras', Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/CastBar.lua
================================================
local T, C, L = unpack(select(2, ...))
local _, ns = ...
local oUF = ns.oUF
local FALLBACK_ICON = 136243 -- Interface\ICONS\Trade_Engineering
local FAILED = _G.FAILED or 'Failed'
local INTERRUPTED = _G.INTERRUPTED or 'Interrupted'
local CASTBAR_STAGE_DURATION_INVALID = -1 -- defined in FrameXML/CastingBarFrame.lua
local function resetAttributes(self)
self.castID = nil
self.casting = nil
self.channeling = nil
self.empowering = nil
self.notInterruptible = nil
self.spellID = nil
for _, pip in next, self.Pips do
pip:Hide()
if pip.texture then
pip.texture:Hide()
pip.gap:Hide()
end
end
end
local colorStage = {
[1] = {1, 0, 0},
[2] = {1, 0.4, 0},
[3] = {1, 0.9, 0},
[4] = {0, 1, 0.5},
}
local function CreatePip(element, stage)
local frame = CreateFrame("Frame", nil, element)
frame:SetSize(2, element:GetHeight())
local color = colorStage[stage] or {0, 0, 0}
frame.texture = element:CreateTexture(nil, "BORDER", nil, -2)
frame.texture:SetTexture(C.media.texture)
frame.texture:SetVertexColor(unpack(color))
local r, g, b = frame.texture:GetVertexColor()
frame.gap = element:CreateTexture(nil, "ARTWORK")
frame.gap:SetAllPoints(frame)
frame.gap:SetTexture(C.media.texture)
frame.gap:SetVertexColor(r * 0.75, g * 0.75, b * 0.75)
return frame
end
local function UpdatePips(element, numStages)
local stageTotalDuration = 0
local stageMaxValue = element.max * 1000
local isHoriz = element:GetOrientation() == 'HORIZONTAL'
local elementSize = isHoriz and element:GetWidth() or element:GetHeight()
for stage = 1, numStages do
local duration
if(stage > numStages) then
duration = GetUnitEmpowerHoldAtMaxTime(element.__owner.unit)
else
duration = GetUnitEmpowerStageDuration(element.__owner.unit, stage - 1)
end
if(duration > CASTBAR_STAGE_DURATION_INVALID) then
stageTotalDuration = stageTotalDuration + duration
local portion = stageTotalDuration / stageMaxValue
local offset = elementSize * portion
local pip = element.Pips[stage]
if(not pip) then
--[[ Override: Castbar:CreatePip(stage)
Creates a "pip" for the given stage, used for empowered casts.
* self - the Castbar widget
## Returns
* pip - a frame used to depict an empowered stage boundary, typically with a line texture (frame)
--]]
pip = (element.CreatePip or CreatePip) (element, stage)
element.Pips[stage] = pip
end
pip:ClearAllPoints()
pip:Show()
if(isHoriz) then
pip:RotateTextures(0)
if(element:GetReverseFill()) then
pip:SetPoint('TOP', element, 'TOPRIGHT', -offset, 0)
pip:SetPoint('BOTTOM', element, 'BOTTOMRIGHT', -offset, 0)
else
pip:SetPoint('TOP', element, 'TOPLEFT', offset, 0)
pip:SetPoint('BOTTOM', element, 'BOTTOMLEFT', offset, 0)
end
else
pip:RotateTextures(1.5708)
if(element:GetReverseFill()) then
pip:SetPoint('LEFT', element, 'TOPLEFT', 0, -offset)
pip:SetPoint('RIGHT', element, 'TOPRIGHT', 0, -offset)
else
pip:SetPoint('LEFT', element, 'BOTTOMLEFT', 0, offset)
pip:SetPoint('RIGHT', element, 'BOTTOMRIGHT', 0, offset)
end
end
end
end
local maxStage = #element.Pips
for i, pip in next, element.Pips do
pip.texture:Show()
pip.gap:Show()
pip.texture:ClearAllPoints()
if(element:GetReverseFill()) then
if i == maxStage then
pip.texture:SetPoint('TOPLEFT', element, 0, 0)
pip.texture:SetPoint('BOTTOMRIGHT', pip, 0, 0)
else
local anchor = element.Pips[i + 1]
pip.texture:SetPoint('TOPLEFT', anchor, 0, 0)
pip.texture:SetPoint('BOTTOMRIGHT', pip, 0, 0)
end
else
if i == maxStage then
pip.texture:SetPoint('TOPRIGHT', element, 0, 0)
pip.texture:SetPoint('BOTTOMLEFT', pip, 0, 0)
else
local anchor = element.Pips[i + 1]
pip.texture:SetPoint('TOPRIGHT', anchor, 0, 0)
pip.texture:SetPoint('BOTTOMLEFT', pip, 0, 0)
end
end
end
end
local function CastStart(self, event, unit)
if(self.unit ~= unit) then return end
local element = self.Castbar
local numStages, _
local name, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible, spellID = UnitCastingInfo(unit)
event = 'UNIT_SPELLCAST_START'
if(not name) then
name, text, texture, startTime, endTime, isTradeSkill, notInterruptible, spellID, _, numStages = UnitChannelInfo(unit)
event = (numStages and numStages > 0) and 'UNIT_SPELLCAST_EMPOWER_START' or 'UNIT_SPELLCAST_CHANNEL_START'
end
if(not name or (isTradeSkill and element.hideTradeSkills)) then
resetAttributes(element)
element:Hide()
return
end
element.casting = event == 'UNIT_SPELLCAST_START'
element.channeling = event == 'UNIT_SPELLCAST_CHANNEL_START'
element.empowering = event == 'UNIT_SPELLCAST_EMPOWER_START'
if(element.empowering) then
endTime = endTime + GetUnitEmpowerHoldAtMaxTime(unit)
end
endTime = endTime / 1000
startTime = startTime / 1000
element.max = endTime - startTime
element.startTime = startTime
element.delay = 0
element.notInterruptible = notInterruptible
element.holdTime = 0
element.castID = castID
element.spellID = spellID
if(element.channeling) then
element.duration = endTime - GetTime()
else
element.duration = GetTime() - startTime
end
element:SetMinMaxValues(0, element.max)
element:SetValue(element.duration)
if(element.Icon) then element.Icon:SetTexture(texture or FALLBACK_ICON) end
if(element.Shield) then element.Shield:SetShown(notInterruptible) end
if(element.Spark) then element.Spark:Show() end
if(element.Text) then element.Text:SetText(text) end
if(element.Time) then element.Time:SetText() end
local safeZone = element.SafeZone
if(safeZone) then
local isHoriz = element:GetOrientation() == 'HORIZONTAL'
safeZone:ClearAllPoints()
safeZone:SetPoint(isHoriz and 'TOP' or 'LEFT')
safeZone:SetPoint(isHoriz and 'BOTTOM' or 'RIGHT')
if(element.channeling) then
safeZone:SetPoint(element:GetReverseFill() and (isHoriz and 'RIGHT' or 'TOP') or (isHoriz and 'LEFT' or 'BOTTOM'))
else
safeZone:SetPoint(element:GetReverseFill() and (isHoriz and 'LEFT' or 'BOTTOM') or (isHoriz and 'RIGHT' or 'TOP'))
end
local ratio = (select(4, GetNetStats()) / 1000) / element.max
if(ratio > 1) then
ratio = 1
end
safeZone[isHoriz and 'SetWidth' or 'SetHeight'](safeZone, element[isHoriz and 'GetWidth' or 'GetHeight'](element) * ratio)
end
if(element.empowering) then
--[[ Override: Castbar:UpdatePips(numStages)
Handles updates for stage separators (pips) in an empowered cast.
* self - the Castbar widget
* numStages - the number of stages in the current cast (number)
--]]
(element.UpdatePips or UpdatePips) (element, numStages)
end
--[[ Callback: Castbar:PostCastStart(unit)
Called after the element has been updated upon a spell cast or channel start.
* self - the Castbar widget
* unit - the unit for which the update has been triggered (string)
--]]
if(element.PostCastStart) then
element:PostCastStart(unit)
end
element:Show()
end
local function CastUpdate(self, event, unit, castID, spellID)
if(self.unit ~= unit) then return end
local element = self.Castbar
if(not element:IsShown() or element.castID ~= castID or element.spellID ~= spellID) then
return
end
local name, startTime, endTime, _
if(event == 'UNIT_SPELLCAST_DELAYED') then
name, _, _, startTime, endTime = UnitCastingInfo(unit)
else
name, _, _, startTime, endTime = UnitChannelInfo(unit)
end
if(not name) then return end
if(element.empowering) then
endTime = endTime + GetUnitEmpowerHoldAtMaxTime(unit)
end
endTime = endTime / 1000
startTime = startTime / 1000
local delta
if(element.channeling) then
delta = element.startTime - startTime
element.duration = endTime - GetTime()
else
delta = startTime - element.startTime
element.duration = GetTime() - startTime
end
if(delta < 0) then
delta = 0
end
element.max = endTime - startTime
element.startTime = startTime
element.delay = element.delay + delta
element:SetMinMaxValues(0, element.max)
element:SetValue(element.duration)
--[[ Callback: Castbar:PostCastUpdate(unit)
Called after the element has been updated when a spell cast or channel has been updated.
* self - the Castbar widget
* unit - the unit that the update has been triggered (string)
--]]
if(element.PostCastUpdate) then
return element:PostCastUpdate(unit)
end
end
local function CastStop(self, event, unit, castID, spellID)
if(self.unit ~= unit) then return end
local element = self.Castbar
if(not element:IsShown() or element.castID ~= castID or element.spellID ~= spellID) then
return
end
resetAttributes(element)
--[[ Callback: Castbar:PostCastStop(unit, spellID)
Called after the element has been updated when a spell cast or channel has stopped.
* self - the Castbar widget
* unit - the unit for which the update has been triggered (string)
* spellID - the ID of the spell (number)
--]]
if(element.PostCastStop) then
return element:PostCastStop(unit, spellID)
end
end
local function CastFail(self, event, unit, castID, spellID)
if(self.unit ~= unit) then return end
local element = self.Castbar
if(not element:IsShown() or element.castID ~= castID or element.spellID ~= spellID) then
return
end
if(element.Text) then
element.Text:SetText(event == 'UNIT_SPELLCAST_FAILED' and FAILED or INTERRUPTED)
end
if(element.Spark) then element.Spark:Hide() end
element.holdTime = element.timeToHold or 0
resetAttributes(element)
element:SetValue(element.max)
--[[ Callback: Castbar:PostCastFail(unit, spellID)
Called after the element has been updated upon a failed or interrupted spell cast.
* self - the Castbar widget
* unit - the unit for which the update has been triggered (string)
* spellID - the ID of the spell (number)
--]]
if(element.PostCastFail) then
return element:PostCastFail(unit, spellID)
end
end
local function CastInterruptible(self, event, unit)
if(self.unit ~= unit) then return end
local element = self.Castbar
if(not element:IsShown()) then return end
element.notInterruptible = event == 'UNIT_SPELLCAST_NOT_INTERRUPTIBLE'
if(element.Shield) then element.Shield:SetShown(element.notInterruptible) end
--[[ Callback: Castbar:PostCastInterruptible(unit)
Called after the element has been updated when a spell cast has become interruptible or uninterruptible.
* self - the Castbar widget
* unit - the unit for which the update has been triggered (string)
--]]
if(element.PostCastInterruptible) then
return element:PostCastInterruptible(unit)
end
end
local function onUpdate(self, elapsed)
if(self.casting or self.channeling or self.empowering) then
local isCasting = self.casting or self.empowering
if(isCasting) then
self.duration = self.duration + elapsed
if(self.duration >= self.max) then
local spellID = self.spellID
resetAttributes(self)
self:Hide()
if(self.PostCastStop) then
self:PostCastStop(self.__owner.unit, spellID)
end
return
end
else
self.duration = self.duration - elapsed
if(self.duration <= 0) then
local spellID = self.spellID
resetAttributes(self)
self:Hide()
if(self.PostCastStop) then
self:PostCastStop(self.__owner.unit, spellID)
end
return
end
end
if(self.Time) then
if(self.delay ~= 0) then
if(self.CustomDelayText) then
self:CustomDelayText(self.duration)
else
self.Time:SetFormattedText('%.1f|cffff0000%s%.2f|r', self.duration, isCasting and '+' or '-', self.delay)
end
else
if(self.CustomTimeText) then
self:CustomTimeText(self.duration)
else
self.Time:SetFormattedText('%.1f', self.duration)
end
end
end
self:SetValue(self.duration)
elseif(self.holdTime > 0) then
self.holdTime = self.holdTime - elapsed
else
resetAttributes(self)
self:Hide()
end
end
local function Update(...)
CastStart(...)
end
local function ForceUpdate(element)
return Update(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self, unit)
local element = self.Castbar
if(element and unit and not unit:match('%wtarget$')) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_SPELLCAST_START', CastStart)
self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_START', CastStart)
self:RegisterEvent('UNIT_SPELLCAST_EMPOWER_START', CastStart)
self:RegisterEvent('UNIT_SPELLCAST_STOP', CastStop)
self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_STOP', CastStop)
self:RegisterEvent('UNIT_SPELLCAST_EMPOWER_STOP', CastStop)
self:RegisterEvent('UNIT_SPELLCAST_DELAYED', CastUpdate)
self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_UPDATE', CastUpdate)
self:RegisterEvent('UNIT_SPELLCAST_EMPOWER_UPDATE', CastUpdate)
self:RegisterEvent('UNIT_SPELLCAST_FAILED', CastFail)
self:RegisterEvent('UNIT_SPELLCAST_INTERRUPTED', CastFail)
self:RegisterEvent('UNIT_SPELLCAST_INTERRUPTIBLE', CastInterruptible)
self:RegisterEvent('UNIT_SPELLCAST_NOT_INTERRUPTIBLE', CastInterruptible)
element.holdTime = 0
element.Pips = {}
element:SetScript('OnUpdate', element.OnUpdate or onUpdate)
if(self.unit == 'player' and not (self.hasChildren or self.isChild or self.isNamePlate)) then
PlayerCastingBarFrame:SetUnit(nil)
PetCastingBarFrame:SetUnit(nil)
PetCastingBarFrame:UnregisterEvent('UNIT_PET')
end
if(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then
element:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
local spark = element.Spark
if(spark and spark:IsObjectType('Texture') and not spark:GetTexture()) then
spark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]])
end
local shield = element.Shield
if(shield and shield:IsObjectType('Texture') and not shield:GetTexture()) then
shield:SetTexture([[Interface\CastingBar\UI-CastingBar-Small-Shield]])
end
local safeZone = element.SafeZone
if(safeZone and safeZone:IsObjectType('Texture') and not safeZone:GetTexture()) then
safeZone:SetColorTexture(1, 0, 0)
end
element:Hide()
return true
end
end
local function Disable(self)
local element = self.Castbar
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_SPELLCAST_START', CastStart)
self:UnregisterEvent('UNIT_SPELLCAST_CHANNEL_START', CastStart)
self:UnregisterEvent('UNIT_SPELLCAST_EMPOWER_START', CastStart)
self:UnregisterEvent('UNIT_SPELLCAST_STOP', CastStop)
self:UnregisterEvent('UNIT_SPELLCAST_CHANNEL_STOP', CastStop)
self:UnregisterEvent('UNIT_SPELLCAST_EMPOWER_STOP', CastStop)
self:UnregisterEvent('UNIT_SPELLCAST_DELAYED', CastUpdate)
self:UnregisterEvent('UNIT_SPELLCAST_CHANNEL_UPDATE', CastUpdate)
self:UnregisterEvent('UNIT_SPELLCAST_EMPOWER_UPDATE', CastUpdate)
self:UnregisterEvent('UNIT_SPELLCAST_FAILED', CastFail)
self:UnregisterEvent('UNIT_SPELLCAST_INTERRUPTED', CastFail)
self:UnregisterEvent('UNIT_SPELLCAST_INTERRUPTIBLE', CastInterruptible)
self:UnregisterEvent('UNIT_SPELLCAST_NOT_INTERRUPTIBLE', CastInterruptible)
element:SetScript('OnUpdate', nil)
if(self.unit == 'player' and not (self.hasChildren or self.isChild or self.isNamePlate)) then
PlayerCastingBarFrame:OnLoad()
PetCastingBarFrame:PetCastingBar_OnLoad()
end
end
end
oUF:AddElement('Castbar', Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/CombatIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function Update(self, event)
local element = self.CombatIndicator
--[[ Callback: CombatIndicator:PreUpdate()
Called before the element has been updated.
* self - the CombatIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local inCombat = UnitAffectingCombat('player')
if(inCombat) then
element:Show()
else
element:Hide()
end
--[[ Callback: CombatIndicator:PostUpdate(inCombat)
Called after the element has been updated.
* self - the CombatIndicator element
* inCombat - indicates if the player is affecting combat (boolean)
--]]
if(element.PostUpdate) then
return element:PostUpdate(inCombat)
end
end
local function Path(self, ...)
--[[ Override: CombatIndicator.Override(self, event)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
--]]
return (self.CombatIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate')
end
local function Enable(self, unit)
local element = self.CombatIndicator
if(element and UnitIsUnit(unit, 'player')) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('PLAYER_REGEN_DISABLED', Path, true)
self:RegisterEvent('PLAYER_REGEN_ENABLED', Path, true)
if(element:IsObjectType('Texture') and not element:GetTexture()) then
element:SetTexture([[Interface\CharacterFrame\UI-StateIcon]])
element:SetTexCoord(.5, 1, 0, .49)
end
return true
end
end
local function Disable(self)
local element = self.CombatIndicator
if(element) then
element:Hide()
self:UnregisterEvent('PLAYER_REGEN_DISABLED', Path)
self:UnregisterEvent('PLAYER_REGEN_ENABLED', Path)
end
end
oUF:AddElement('CombatIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/GroupRoleIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function Update(self, event)
local element = self.GroupRoleIndicator
--[[ Callback: GroupRoleIndicator:PreUpdate()
Called before the element has been updated.
* self - the GroupRoleIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local role = UnitGroupRolesAssigned(self.unit)
if role == 'TANK' then
element:SetTexture([[Interface\AddOns\ShestakUI\Media\Textures\Tank.tga]])
element:Show()
elseif role == 'HEALER' then
element:SetTexture([[Interface\AddOns\ShestakUI\Media\Textures\Healer.tga]])
element:Show()
elseif role == 'DAMAGER' then
element:SetTexture([[Interface\AddOns\ShestakUI\Media\Textures\Damager.tga]])
element:Show()
else
element:Hide()
end
--[[ Callback: GroupRoleIndicator:PostUpdate(role)
Called after the element has been updated.
* self - the GroupRoleIndicator element
* role - the role as returned by [UnitGroupRolesAssigned](http://wowprogramming.com/docs/api/UnitGroupRolesAssigned.html)
--]]
if(element.PostUpdate) then
return element:PostUpdate(role)
end
end
local function Path(self, ...)
--[[ Override: GroupRoleIndicator.Override(self, event, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
return (self.GroupRoleIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate')
end
local function Enable(self)
local element = self.GroupRoleIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
if(self.unit == 'player') then
self:RegisterEvent('PLAYER_ROLES_ASSIGNED', Path, true)
else
self:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)
end
return true
end
end
local function Disable(self)
local element = self.GroupRoleIndicator
if(element) then
element:Hide()
self:UnregisterEvent('PLAYER_ROLES_ASSIGNED', Path)
self:UnregisterEvent('GROUP_ROSTER_UPDATE', Path, true)
end
end
oUF:AddElement('GroupRoleIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/HealPrediction.lua
================================================
-- ShestakUI use modified version of HealPrediction. Do not update if you are not sure what you are doing.
local _, ns = ...
local oUF = ns.oUF
local function UpdateFillBar(frame, previousTexture, bar, amount, maxHealth, reverse)
if amount == 0 then
bar:Hide()
return previousTexture
end
local totalWidth, totalHeight = frame.Health:GetSize()
if frame.Health:GetOrientation() == "VERTICAL" then
if reverse then
bar:SetPoint("TOP", previousTexture, "TOP", 0, 0)
else
bar:SetPoint("BOTTOM", previousTexture, "TOP", 0, 0)
end
local barSize = (amount / maxHealth) * totalHeight
bar:SetHeight(barSize)
else
if reverse then
bar:SetPoint("TOPRIGHT", previousTexture, "TOPRIGHT", 0, 0)
bar:SetPoint("BOTTOMRIGHT", previousTexture, "BOTTOMRIGHT", 0, 0)
else
bar:SetPoint("TOPLEFT", previousTexture, "TOPRIGHT", 0, 0)
bar:SetPoint("BOTTOMLEFT", previousTexture, "BOTTOMRIGHT", 0, 0)
end
local barSize = (amount / maxHealth) * totalWidth
bar:SetWidth(barSize)
end
bar:Show()
return bar
end
local function Update(self, event, unit)
if(self.unit ~= unit) then return end
local element = self.HealthPrediction
if(element.PreUpdate) then
element:PreUpdate(unit)
end
local myIncomingHeal = UnitGetIncomingHeals(unit, 'player') or 0
local allIncomingHeal = UnitGetIncomingHeals(unit) or 0
local absorb = UnitGetTotalAbsorbs(unit) or 0
local healAbsorb = UnitGetTotalHealAbsorbs(unit) or 0
local health, maxHealth = UnitHealth(unit), UnitHealthMax(unit)
local overAbsorb = 0
local overHealAbsorb = 0
if healAbsorb > allIncomingHeal then
healAbsorb = healAbsorb - allIncomingHeal
allIncomingHeal = 0
myIncomingHeal = 0
absorb = 0
if health + healAbsorb > maxHealth then
overHealAbsorb = min(maxHealth, healAbsorb)
healAbsorb = maxHealth - health
overHealAbsorb = overHealAbsorb - healAbsorb
end
else
allIncomingHeal = allIncomingHeal - healAbsorb
healAbsorb = 0
if health + allIncomingHeal > maxHealth then
allIncomingHeal = maxHealth - health
end
if(allIncomingHeal < myIncomingHeal) then
myIncomingHeal = allIncomingHeal
allIncomingHeal = 0
else
allIncomingHeal = allIncomingHeal - myIncomingHeal
end
if health + myIncomingHeal + allIncomingHeal + absorb >= maxHealth then
overAbsorb = min(maxHealth, absorb)
absorb = max(0, maxHealth - (health + myIncomingHeal + allIncomingHeal))
overAbsorb = overAbsorb - absorb
end
end
local previousTexture = self.Health:GetStatusBarTexture()
if element.healAbsorbBar then
previousTexture = UpdateFillBar(self, previousTexture, element.healAbsorbBar, healAbsorb, maxHealth)
end
if element.myBar then
previousTexture = UpdateFillBar(self, previousTexture, element.myBar, myIncomingHeal, maxHealth)
end
if element.otherBar then
previousTexture = UpdateFillBar(self, previousTexture, element.otherBar, allIncomingHeal, maxHealth)
end
if element.absorbBar then
previousTexture = UpdateFillBar(self, previousTexture, element.absorbBar, absorb, maxHealth)
end
if element.overAbsorb then
previousTexture = UpdateFillBar(self, self.Health, element.overAbsorb, overAbsorb, maxHealth, true)
end
if element.overHealAbsorb then
previousTexture = UpdateFillBar(self, self.Health, element.overHealAbsorb, overHealAbsorb, maxHealth, true)
end
if(element.PostUpdate) then
return element:PostUpdate(unit, myIncomingHeal, otherIncomingHeal, absorb, healAbsorb)
end
end
local function Path(self, ...)
--[[ Override: HealthPrediction.Override(self, event, unit)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event
--]]
return (self.HealthPrediction.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
local element = self.HealthPrediction
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_HEALTH', Path)
self:RegisterEvent('UNIT_MAXHEALTH', Path)
if element.myBar or element.otherBar then
self:RegisterEvent('UNIT_HEAL_PREDICTION', Path)
end
if element.absorbBar then
self:RegisterEvent('UNIT_ABSORB_AMOUNT_CHANGED', Path)
end
if element.healAbsorbBar then
self:RegisterEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', Path)
end
return true
end
end
local function Disable(self)
local element = self.HealthPrediction
if(element) then
if(element.myBar) then
element.myBar:Hide()
end
if(element.otherBar) then
element.otherBar:Hide()
end
if(element.absorbBar) then
element.absorbBar:Hide()
end
if(element.healAbsorbBar) then
element.healAbsorbBar:Hide()
end
self:UnregisterEvent('UNIT_HEALTH', Path)
self:UnregisterEvent('UNIT_MAXHEALTH', Path)
self:UnregisterEvent('UNIT_HEAL_PREDICTION', Path)
self:UnregisterEvent('UNIT_ABSORB_AMOUNT_CHANGED', Path)
self:UnregisterEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', Path)
end
end
oUF:AddElement('HealthPrediction', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/Health.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local unitSelectionType = Private.unitSelectionType
local function UpdateColor(element, unit, cur, max)
local parent = element.__owner
local r, g, b, t
if(element.colorTapping and not UnitPlayerControlled(unit) and UnitIsTapDenied(unit)) then
t = parent.colors.tapped
elseif(element.colorDisconnected and element.disconnected) then
t = parent.colors.disconnected
elseif(element.colorClass and UnitIsPlayer(unit)) or
(element.colorClassNPC and not UnitIsPlayer(unit)) or
(element.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
local _, class = UnitClass(unit)
t = parent.colors.class[class]
elseif(element.colorSelection and unitSelectionType(unit, element.considerSelectionInCombatHostile)) then
t = parent.colors.selection[unitSelectionType(unit, element.considerSelectionInCombatHostile)]
elseif(element.colorReaction and UnitReaction(unit, 'player')) then
t = parent.colors.reaction[UnitReaction(unit, 'player')]
elseif(element.colorSmooth) then
r, g, b = parent:ColorGradient(cur, max, unpack(element.smoothGradient or parent.colors.smooth))
elseif(element.colorHealth) then
t = parent.colors.health
end
if(t) then
r, g, b = t[1], t[2], t[3]
end
if(b) then
element:SetStatusBarColor(r, g, b)
local bg = element.bg
if(bg) then
local mu = bg.multiplier or 1
bg:SetVertexColor(r * mu, g * mu, b * mu)
end
end
end
local function Update(self, event, unit)
if(not unit or self.unit ~= unit) then return end
local element = self.Health
--[[ Callback: Health:PreUpdate(unit)
Called before the element has been updated.
* self - the Health element
* unit - the unit for which the update has been triggered (string)
--]]
if(element.PreUpdate) then
element:PreUpdate(unit)
end
local cur, max = UnitHealth(unit), UnitHealthMax(unit)
local disconnected = not UnitIsConnected(unit)
element:SetMinMaxValues(0, max)
if(disconnected) then
element:SetValue(max)
else
element:SetValue(cur)
end
element.disconnected = disconnected
--[[ Override: Health:UpdateColor(unit, cur, max)
Used to completely override the internal function for updating the widgets' colors.
* self - the Health element
* unit - the unit for which the update has been triggered (string)
* cur - the unit's current health value (number)
* max - the unit's maximum possible health value (number)
--]]
element:UpdateColor(unit, cur, max)
--[[ Callback: Health:PostUpdate(unit, cur, max)
Called after the element has been updated.
* self - the Health element
* unit - the unit for which the update has been triggered (string)
* cur - the unit's current health value (number)
* max - the unit's maximum possible health value (number)
--]]
if(element.PostUpdate) then
return element:PostUpdate(unit, cur, max)
end
end
local function Path(self, ...)
--[[ Override: Health.Override(self, event, unit)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
--]]
return (self.Health.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self, unit)
local element = self.Health
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_HEALTH', Path)
self:RegisterEvent('UNIT_MAXHEALTH', Path)
self:RegisterEvent('UNIT_CONNECTION', Path)
self:RegisterEvent('UNIT_FACTION', Path) -- For tapping
self:RegisterEvent('UNIT_FLAGS', Path) -- For selection
-- Fix disconnected players
self:RegisterEvent('PARTY_MEMBER_ENABLE', Path)
self:RegisterEvent('PARTY_MEMBER_DISABLE', Path)
if(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then
element:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
if(not element.UpdateColor) then
element.UpdateColor = UpdateColor
end
element:Show()
return true
end
end
local function Disable(self)
local element = self.Health
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_HEALTH', Path)
self:UnregisterEvent('UNIT_MAXHEALTH', Path)
self:UnregisterEvent('UNIT_CONNECTION', Path)
self:UnregisterEvent('UNIT_FACTION', Path)
self:UnregisterEvent('UNIT_FLAGS', Path)
self:UnregisterEvent('PARTY_MEMBER_ENABLE', Path)
self:UnregisterEvent('PARTY_MEMBER_DISABLE', Path)
end
end
oUF:AddElement('Health', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/LeaderIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function Update(self, event)
local element = self.LeaderIndicator
local unit = self.unit
--[[ Callback: LeaderIndicator:PreUpdate()
Called before the element has been updated.
* self - the LeaderIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
-- There are two kinds of group leaders: guides and leaders. Guides are leaders of groups formed via LFD/LFR.
-- There are also two types of groups: home (LE_PARTY_CATEGORY_HOME) and instance (LE_PARTY_CATEGORY_INSTANCE).
-- A unit can be the leader of both, only one, or none. Use UnitIsGroupLeader(unit, LE_PARTY_CATEGORY_HOME) and
-- UnitIsGroupLeader(unit, LE_PARTY_CATEGORY_INSTANCE) for more detailed info.
-- There can be only ONE guide in any given party, but there can be multiple leaders, for instance, if two 2-man
-- premades were put in one group, they'll keep their leader roles which can be seen by other members of their
-- own groups via UnitIsGroupLeader(unit, LE_PARTY_CATEGORY_HOME) or by members of other groups via
-- UnitLeadsAnyGroup(unit). Inside the group formed by the dungeon finder UnitIsGroupLeader(unit) will only return
-- true for the instance leader.
local isInLFGInstance = HasLFGRestrictions()
local isLeader = UnitIsGroupLeader(unit)
if(isLeader) then
if(isInLFGInstance) then
element:SetTexture([[Interface\LFGFrame\UI-LFG-ICON-PORTRAITROLES]])
element:SetTexCoord(0, 0.296875, 0.015625, 0.3125)
else
element:SetTexture([[Interface\GroupFrame\UI-Group-LeaderIcon]])
element:SetTexCoord(0, 1, 0, 1)
end
element:Show()
else
element:Hide()
end
--[[ Callback: LeaderIndicator:PostUpdate(isLeader)
Called after the element has been updated.
* self - the LeaderIndicator element
* isLeader - indicates whether the unit is the leader of the group (boolean)
* isInLFGInstance - indicates whether the current party is subject to LFG restrictions (boolean)
--]]
if(element.PostUpdate) then
return element:PostUpdate(isLeader, isInLFGInstance)
end
end
local function Path(self, ...)
--[[ Override: LeaderIndicator.Override(self, event, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
return (self.LeaderIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate')
end
local function Enable(self)
local element = self.LeaderIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('PARTY_LEADER_CHANGED', Path, true)
self:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)
return true
end
end
local function Disable(self)
local element = self.LeaderIndicator
if(element) then
element:Hide()
self:UnregisterEvent('PARTY_LEADER_CHANGED', Path)
self:UnregisterEvent('GROUP_ROSTER_UPDATE', Path)
end
end
oUF:AddElement('LeaderIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/PhaseIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
--[[ Override: PhaseIndicator:UpdateTooltip()
Used to populate the tooltip when the widget is hovered.
* self - the PhaseIndicator widget
--]]
local function UpdateTooltip(element)
local text = PartyUtil.GetPhasedReasonString(element.reason, element.__owner.unit)
if(text) then
GameTooltip:SetText(text, nil, nil, nil, nil, true)
GameTooltip:Show()
end
end
local function onEnter(element)
if(not element:IsVisible()) then return end
if(element.reason) then
GameTooltip:SetOwner(element, 'ANCHOR_BOTTOMRIGHT')
element:UpdateTooltip()
end
end
local function onLeave()
GameTooltip:Hide()
end
local function Update(self, event, unit)
if(self.unit ~= unit) then return end
local element = self.PhaseIndicator
--[[ Callback: PhaseIndicator:PreUpdate()
Called before the element has been updated.
* self - the PhaseIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
-- BUG: UnitPhaseReason returns wrong data for friendly NPCs in phased scenarios like WM or Chromie Time
-- https://github.com/Stanzilla/WoWUIBugs/issues/49
local phaseReason = UnitIsPlayer(unit) and UnitIsConnected(unit) and UnitPhaseReason(unit) or nil
if(phaseReason) then
element:Show()
else
element:Hide()
end
element.reason = phaseReason
--[[ Callback: PhaseIndicator:PostUpdate(isInSamePhase, phaseReason)
Called after the element has been updated.
* self - the PhaseIndicator element
* isInSamePhase - indicates whether the unit is in the same phase as the player (boolean)
* phaseReason - the reason why the unit is in a different phase (number?)
--]]
if(element.PostUpdate) then
return element:PostUpdate(not phaseReason, phaseReason)
end
end
local function Path(self, ...)
--[[ Override: PhaseIndicator.Override(self, event, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
return (self.PhaseIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
local element = self.PhaseIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_PHASE', Path)
local icon = (element.Icon or element)
if(icon:IsObjectType('Texture') and not icon:GetTexture()) then
icon:SetTexture([[Interface\TargetingFrame\UI-PhasingIcon]])
end
if(element.IsMouseEnabled and element:IsMouseEnabled()) then
if(not element:GetScript('OnEnter')) then
element:SetScript('OnEnter', onEnter)
end
if(not element:GetScript('OnLeave')) then
element:SetScript('OnLeave', onLeave)
end
element.UpdateTooltip = element.UpdateTooltip or UpdateTooltip
end
return true
end
end
local function Disable(self)
local element = self.PhaseIndicator
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_PHASE', Path)
end
end
oUF:AddElement('PhaseIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/Portraits.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function Update(self, event, unit)
if(not unit or not UnitIsUnit(self.unit, unit)) then return end
local element = self.Portrait
--[[ Callback: Portrait:PreUpdate(unit)
Called before the element has been updated.
* self - the Portrait element
* unit - the unit for which the update has been triggered (string)
--]]
if(element.PreUpdate) then element:PreUpdate(unit) end
local guid = UnitGUID(unit)
local isAvailable = UnitIsConnected(unit) and UnitIsVisible(unit)
if(event ~= 'OnUpdate' or element.guid ~= guid or element.state ~= isAvailable) then
if(element:IsObjectType('PlayerModel')) then
if(not isAvailable) then
element:SetCamDistanceScale(0.25)
element:SetPortraitZoom(0)
element:SetPosition(0, 0, 0.25)
element:ClearModel()
element:SetModel([[Interface\Buttons\TalkToMeQuestionMark.m2]])
else
element:SetCamDistanceScale(1)
element:SetPortraitZoom(1)
element:SetPosition(0, 0, 0)
element:ClearModel()
element:SetUnit(unit)
end
else
if element.classIcons then
local _, class = UnitClass(self.unit)
local texcoord = CLASS_ICON_TCOORDS[class]
element.Icon:SetTexCoord(texcoord[1] + 0.015, texcoord[2] - 0.02, texcoord[3] + 0.018, texcoord[4] - 0.02)
else
SetPortraitTexture(element.Icon, unit)
element.Icon:SetTexCoord(0.15, 0.85, 0.15, 0.85)
end
end
element.guid = guid
element.state = isAvailable
end
--[[ Callback: Portrait:PostUpdate(unit)
Called after the element has been updated.
* self - the Portrait element
* unit - the unit for which the update has been triggered (string)
--]]
if(element.PostUpdate) then
return element:PostUpdate(unit)
end
end
local function Path(self, ...)
--[[ Override: Portrait.Override(self, event, unit)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
--]]
return (self.Portrait.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self, unit)
local element = self.Portrait
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_MODEL_CHANGED', Path)
self:RegisterEvent('UNIT_PORTRAIT_UPDATE', Path)
self:RegisterEvent('PORTRAITS_UPDATED', Path, true)
self:RegisterEvent('UNIT_CONNECTION', Path)
-- The quest log uses PARTY_MEMBER_{ENABLE,DISABLE} to handle updating of
-- party members overlapping quests. This will probably be enough to handle
-- model updating.
--
-- DISABLE isn't used as it fires when we most likely don't have the
-- information we want.
if(unit == 'party') then
self:RegisterEvent('PARTY_MEMBER_ENABLE', Path)
end
if element.classIcons then
element.Icon:SetTexture("Interface\\WorldStateFrame\\Icons-Classes")
end
element:Show()
return true
end
end
local function Disable(self)
local element = self.Portrait
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_MODEL_CHANGED', Path)
self:UnregisterEvent('UNIT_PORTRAIT_UPDATE', Path)
self:UnregisterEvent('PORTRAITS_UPDATED', Path)
self:UnregisterEvent('PARTY_MEMBER_ENABLE', Path)
self:UnregisterEvent('UNIT_CONNECTION', Path)
end
end
oUF:AddElement('Portrait', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/Power.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local unitSelectionType = Private.unitSelectionType
-- sourced from FrameXML/UnitPowerBarAlt.lua
local ALTERNATE_POWER_INDEX = Enum.PowerType.Alternate or 10
local function GetDisplayPower(element)
local unit = element.__owner.unit
local barInfo = GetUnitPowerBarInfo(unit)
if(barInfo and barInfo.showOnRaid and (UnitInParty(unit) or UnitInRaid(unit))) then
return ALTERNATE_POWER_INDEX, barInfo.minPower
end
end
local function UpdateColor(element, unit, cur, min, max, displayType)
local parent = element.__owner
local ptype, ptoken, altR, altG, altB = UnitPowerType(unit)
local r, g, b, t
if(element.colorTapping and element.tapped) then
t = parent.colors.tapped
elseif(element.colorDisconnected and element.disconnected) then
t = parent.colors.disconnected
elseif(displayType == ALTERNATE_POWER_INDEX and element.altPowerColor) then
t = element.altPowerColor
elseif(element.colorPower) then
t = parent.colors.power[ptoken]
if(not t) then
if(element.GetAlternativeColor) then
r, g, b = element:GetAlternativeColor(unit, ptype, ptoken, altR, altG, altB)
elseif(altR) then
r, g, b = altR, altG, altB
if(r > 1 or g > 1 or b > 1) then
-- BUG: As of 7.0.3, altR, altG, altB may be in 0-1 or 0-255 range.
r, g, b = r / 255, g / 255, b / 255
end
else
t = parent.colors.power[ptype]
end
end
elseif(element.colorClass and UnitIsPlayer(unit)) or
(element.colorClassNPC and not UnitIsPlayer(unit)) or
(element.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
local _, class = UnitClass(unit)
t = parent.colors.class[class]
elseif(element.colorSelection and unitSelectionType(unit, element.considerSelectionInCombatHostile)) then
t = parent.colors.selection[unitSelectionType(unit, element.considerSelectionInCombatHostile)]
elseif(element.colorReaction and UnitReaction(unit, 'player')) then
t = parent.colors.reaction[UnitReaction(unit, 'player')]
elseif(element.colorSmooth) then
local adjust = 0 - (min or 0)
r, g, b = parent:ColorGradient(cur + adjust, max + adjust, unpack(element.smoothGradient or parent.colors.smooth))
end
if(t) then
r, g, b = t[1], t[2], t[3]
end
if(b) then
element:SetStatusBarColor(r, g, b)
local bg = element.bg
if(bg) then
local mu = bg.multiplier or 1
bg:SetVertexColor(r * mu, g * mu, b * mu)
end
end
end
local function Update(self, event, unit)
if(self.unit ~= unit) then return end
local element = self.Power
--[[ Callback: Power:PreUpdate(unit)
Called before the element has been updated.
* self - the Power element
* unit - the unit for which the update has been triggered (string)
--]]
if(element.PreUpdate) then
element:PreUpdate(unit)
end
local displayType, min
if(element.displayAltPower) then
displayType, min = element:GetDisplayPower()
end
local cur, max = UnitPower(unit, displayType), UnitPowerMax(unit, displayType)
local disconnected = not UnitIsConnected(unit)
local tapped = not UnitPlayerControlled(unit) and UnitIsTapDenied(unit)
element:SetMinMaxValues(min or 0, max)
if(disconnected) then
element:SetValue(max)
else
element:SetValue(cur)
end
element.disconnected = disconnected
element.tapped = tapped
--[[ Override: Power:UpdateColor(unit, cur, min, max, displayType)
Used to completely override the internal function for updating the widget's colors.
* self - the Power element
* unit - the unit for which the update has been triggered (string)
* cur - the unit's current power value (number)
* min - the unit's minimum possible power value (number)
* max - the unit's maximum possible power value (number)
* displayType - the alternative power display type if applicable (number?)[Enum.PowerType.Alternate]
--]]
element:UpdateColor(unit, cur, min, max, displayType)
--[[ Callback: Power:PostUpdate(unit, cur, min, max)
Called after the element has been updated.
* self - the Power element
* unit - the unit for which the update has been triggered (string)
* cur - the unit's current power value (number)
* min - the unit's minimum possible power value (number)
* max - the unit's maximum possible power value (number)
--]]
if(element.PostUpdate) then
return element:PostUpdate(unit, cur, min, max)
end
end
local function Path(self, ...)
--[[ Override: Power.Override(self, event, unit, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
* ... - the arguments accompanying the event
--]]
return (self.Power.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
--[[ Power:SetFrequentUpdates(state)
Used to toggle frequent updates.
* self - the Power element
* state - the desired state of frequent updates (boolean)
--]]
local function SetFrequentUpdates(element, state)
if(element.frequentUpdates ~= state) then
element.frequentUpdates = state
if(element.frequentUpdates) then
element.__owner:UnregisterEvent('UNIT_POWER_UPDATE', Path)
element.__owner:RegisterEvent('UNIT_POWER_FREQUENT', Path)
else
element.__owner:UnregisterEvent('UNIT_POWER_FREQUENT', Path)
element.__owner:RegisterEvent('UNIT_POWER_UPDATE', Path)
end
end
end
local function Enable(self)
local element = self.Power
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
element.SetFrequentUpdates = SetFrequentUpdates
if(element.frequentUpdates) then
self:RegisterEvent('UNIT_POWER_FREQUENT', Path)
else
self:RegisterEvent('UNIT_POWER_UPDATE', Path)
end
self:RegisterEvent('UNIT_POWER_BAR_SHOW', Path)
self:RegisterEvent('UNIT_POWER_BAR_HIDE', Path)
self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
self:RegisterEvent('UNIT_CONNECTION', Path)
self:RegisterEvent('UNIT_MAXPOWER', Path)
self:RegisterEvent('UNIT_FACTION', Path) -- For tapping
self:RegisterEvent('UNIT_FLAGS', Path) -- For selection
if(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then
element:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
if(not element.UpdateColor) then
element.UpdateColor = UpdateColor
end
if(not element.GetDisplayPower) then
element.GetDisplayPower = GetDisplayPower
end
element:Show()
return true
end
end
local function Disable(self)
local element = self.Power
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_POWER_FREQUENT', Path)
self:UnregisterEvent('UNIT_POWER_UPDATE', Path)
self:UnregisterEvent('UNIT_POWER_BAR_SHOW', Path)
self:UnregisterEvent('UNIT_POWER_BAR_HIDE', Path)
self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
self:UnregisterEvent('UNIT_CONNECTION', Path)
self:UnregisterEvent('UNIT_MAXPOWER', Path)
self:UnregisterEvent('UNIT_FACTION', Path)
self:UnregisterEvent('UNIT_FLAGS', Path)
end
end
oUF:AddElement('Power', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/PowerPrediction.lua
================================================
local _, ns = ...
local oUF = ns.oUF
-- sourced from FrameXML/AlternatePowerBar.lua
local ADDITIONAL_POWER_BAR_INDEX = _G.ADDITIONAL_POWER_BAR_INDEX or 0
local ALT_MANA_BAR_PAIR_DISPLAY_INFO = _G.ALT_MANA_BAR_PAIR_DISPLAY_INFO
local _, playerClass = UnitClass('player')
local function Update(self, event, unit)
if(self.unit ~= unit) then return end
local element = self.PowerPrediction
--[[ Callback: PowerPrediction:PreUpdate(unit)
Called before the element has been updated.
* self - the PowerPrediction element
* unit - the unit for which the update has been triggered (string)
--]]
if(element.PreUpdate) then
element:PreUpdate(unit)
end
local _, _, _, startTime, endTime, _, _, _, spellID = UnitCastingInfo(unit)
local mainPowerType = UnitPowerType(unit)
local hasAltManaBar = ALT_MANA_BAR_PAIR_DISPLAY_INFO[playerClass]
and ALT_MANA_BAR_PAIR_DISPLAY_INFO[playerClass][mainPowerType]
local mainCost, altCost = 0, 0
if(event == 'UNIT_SPELLCAST_START' and startTime ~= endTime) then
local costTable = GetSpellPowerCost(spellID)
-- hasRequiredAura is always false if there's only 1 subtable
local checkRequiredAura = #costTable > 1
for _, costInfo in next, costTable do
if(not checkRequiredAura or costInfo.hasRequiredAura) then
if(costInfo.type == mainPowerType) then
mainCost = costInfo.cost
element.mainCost = mainCost
break
elseif(costInfo.type == ADDITIONAL_POWER_BAR_INDEX) then
altCost = costInfo.cost
element.altCost = altCost
break
end
end
end
elseif(spellID) then
-- if we try to cast a spell while casting another one we need to avoid
-- resetting the element
mainCost = element.mainCost or 0
altCost = element.altCost or 0
else
element.mainCost = mainCost
element.altCost = altCost
end
if(element.mainBar) then
element.mainBar:SetMinMaxValues(0, UnitPowerMax(unit, mainPowerType))
element.mainBar:SetValue(mainCost)
element.mainBar:Show()
end
if(element.altBar and hasAltManaBar) then
element.altBar:SetMinMaxValues(0, UnitPowerMax(unit, ADDITIONAL_POWER_BAR_INDEX))
element.altBar:SetValue(altCost)
element.altBar:Show()
end
--[[ Callback: PowerPrediction:PostUpdate(unit, mainCost, altCost, hasAltManaBar)
Called after the element has been updated.
* self - the PowerPrediction element
* unit - the unit for which the update has been triggered (string)
* mainCost - the main power type cost of the cast ability (number)
* altCost - the secondary power type cost of the cast ability (number)
* hasAltManaBar - indicates if the unit has a secondary power bar (boolean)
--]]
if(element.PostUpdate) then
return element:PostUpdate(unit, mainCost, altCost, hasAltManaBar)
end
end
local function Path(self, ...)
--[[ Override: PowerPrediction.Override(self, event, unit, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
* ... - the arguments accompanying the event
--]]
return (self.PowerPrediction.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self, unit)
local element = self.PowerPrediction
if(element and UnitIsUnit(unit, 'player')) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_SPELLCAST_START', Path)
self:RegisterEvent('UNIT_SPELLCAST_STOP', Path)
self:RegisterEvent('UNIT_SPELLCAST_FAILED', Path)
self:RegisterEvent('UNIT_SPELLCAST_SUCCEEDED', Path)
self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
if(element.mainBar) then
if(element.mainBar:IsObjectType('StatusBar') and not element.mainBar:GetStatusBarTexture()) then
element.mainBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
end
if(element.altBar) then
if(element.altBar:IsObjectType('StatusBar') and not element.altBar:GetStatusBarTexture()) then
element.altBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
end
return true
end
end
local function Disable(self)
local element = self.PowerPrediction
if(element) then
if(element.mainBar) then
element.mainBar:Hide()
end
if(element.altBar) then
element.altBar:Hide()
end
self:UnregisterEvent('UNIT_SPELLCAST_START', Path)
self:UnregisterEvent('UNIT_SPELLCAST_STOP', Path)
self:UnregisterEvent('UNIT_SPELLCAST_FAILED', Path)
self:UnregisterEvent('UNIT_SPELLCAST_SUCCEEDED', Path)
self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
end
end
oUF:AddElement('PowerPrediction', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/QuestIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function Update(self, event, unit)
if(unit ~= self.unit) then return end
local element = self.QuestIndicator
--[[ Callback: QuestIndicator:PreUpdate()
Called before the element has been updated.
* self - the QuestIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local isQuestBoss = UnitIsQuestBoss(unit)
if(isQuestBoss) then
element:Show()
else
element:Hide()
end
--[[ Callback: QuestIndicator:PostUpdate(isQuestBoss)
Called after the element has been updated.
* self - the QuestIndicator element
* isQuestBoss - indicates if the element is shown (boolean)
--]]
if(element.PostUpdate) then
return element:PostUpdate(isQuestBoss)
end
end
local function Path(self, ...)
--[[ Override: QuestIndicator.Override(self, event, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
return (self.QuestIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
local element = self.QuestIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_CLASSIFICATION_CHANGED', Path)
if(element:IsObjectType('Texture') and not element:GetTexture()) then
element:SetTexture([[Interface\TargetingFrame\PortraitQuestBadge]])
end
return true
end
end
local function Disable(self)
local element = self.QuestIndicator
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_CLASSIFICATION_CHANGED', Path)
end
end
oUF:AddElement('QuestIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/RaidTargetIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local GetRaidTargetIndex = GetRaidTargetIndex
local SetRaidTargetIconTexture = SetRaidTargetIconTexture
local function Update(self, event)
local element = self.RaidTargetIndicator
--[[ Callback: RaidTargetIndicator:PreUpdate()
Called before the element has been updated.
* self - the RaidTargetIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local index = GetRaidTargetIndex(self.unit)
if(index) then
SetRaidTargetIconTexture(element, index)
element:Show()
else
element:Hide()
end
--[[ Callback: RaidTargetIndicator:PostUpdate(index)
Called after the element has been updated.
* self - the RaidTargetIndicator element
* index - the index of the raid target marker (number?)[1-8]
--]]
if(element.PostUpdate) then
return element:PostUpdate(index)
end
end
local function Path(self, ...)
--[[ Override: RaidTargetIndicator.Override(self, event)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
--]]
return (self.RaidTargetIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
if(not element.__owner.unit) then return end
return Path(element.__owner, 'ForceUpdate')
end
local function Enable(self)
local element = self.RaidTargetIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('RAID_TARGET_UPDATE', Path, true)
if(element:IsObjectType('Texture') and not element:GetTexture()) then
element:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
end
return true
end
end
local function Disable(self)
local element = self.RaidTargetIndicator
if(element) then
element:Hide()
self:UnregisterEvent('RAID_TARGET_UPDATE', Path)
end
end
oUF:AddElement('RaidTargetIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/Range.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local _FRAMES = {}
local OnRangeFrame
local UnitInRange, UnitIsConnected = UnitInRange, UnitIsConnected
local function Update(self, event)
local element = self.Range
local unit = self.unit
--[[ Callback: Range:PreUpdate()
Called before the element has been updated.
* self - the Range element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local inRange, checkedRange
local connected = UnitIsConnected(unit)
if(connected) then
inRange, checkedRange = UnitInRange(unit)
if(checkedRange and not inRange) then
self:SetAlpha(element.outsideAlpha)
else
self:SetAlpha(element.insideAlpha)
end
else
self:SetAlpha(element.insideAlpha)
end
--[[ Callback: Range:PostUpdate(object, inRange, checkedRange, isConnected)
Called after the element has been updated.
* self - the Range element
* object - the parent object
* inRange - indicates if the unit was within 40 yards of the player (boolean)
* checkedRange - indicates if the range check was actually performed (boolean)
* isConnected - indicates if the unit is online (boolean)
--]]
if(element.PostUpdate) then
return element:PostUpdate(self, inRange, checkedRange, connected)
end
end
local function Path(self, ...)
--[[ Override: Range.Override(self, event)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
--]]
return (self.Range.Override or Update) (self, ...)
end
-- Internal updating method
local timer = 0
local function OnRangeUpdate(_, elapsed)
timer = timer + elapsed
if(timer >= .20) then
for _, object in next, _FRAMES do
if(object:IsShown()) then
Path(object, 'OnUpdate')
end
end
timer = 0
end
end
local function Enable(self)
local element = self.Range
if(element) then
element.__owner = self
element.insideAlpha = element.insideAlpha or 1
element.outsideAlpha = element.outsideAlpha or 0.55
if(not OnRangeFrame) then
OnRangeFrame = CreateFrame('Frame')
OnRangeFrame:SetScript('OnUpdate', OnRangeUpdate)
end
table.insert(_FRAMES, self)
OnRangeFrame:Show()
return true
end
end
local function Disable(self)
local element = self.Range
if(element) then
for index, frame in next, _FRAMES do
if(frame == self) then
table.remove(_FRAMES, index)
break
end
end
self:SetAlpha(element.insideAlpha)
if(#_FRAMES == 0) then
OnRangeFrame:Hide()
end
end
end
oUF:AddElement('Range', nil, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/ReadyCheckIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local unitExists = Private.unitExists
local function OnFinished(self)
local element = self:GetParent()
element:Hide()
--[[ Callback: ReadyCheckIndicator:PostUpdateFadeOut()
Called after the element has been faded out.
* self - the ReadyCheckIndicator element
--]]
if(element.PostUpdateFadeOut) then
element:PostUpdateFadeOut()
end
end
local function Update(self, event)
local element = self.ReadyCheckIndicator
local unit = self.unit
--[[ Callback: ReadyCheckIndicator:PreUpdate()
Called before the element has been updated.
* self - the ReadyCheckIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local status = GetReadyCheckStatus(unit)
if(unitExists(unit) and status) then
if(status == 'ready') then
element:SetTexture(element.readyTexture)
elseif(status == 'notready') then
element:SetTexture(element.notReadyTexture)
else
element:SetTexture(element.waitingTexture)
end
element.status = status
element:Show()
elseif(event ~= 'READY_CHECK_FINISHED') then
element.status = nil
element:Hide()
end
if(event == 'READY_CHECK_FINISHED') then
if(element.status == 'waiting') then
element:SetTexture(element.notReadyTexture)
end
element.Animation:Play()
end
--[[ Callback: ReadyCheckIndicator:PostUpdate(status)
Called after the element has been updated.
* self - the ReadyCheckIndicator element
* status - the unit's ready check status (string?)['ready', 'notready', 'waiting']
--]]
if(element.PostUpdate) then
return element:PostUpdate(status)
end
end
local function Path(self, ...)
--[[ Override: ReadyCheckIndicator.Override(self, event, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
return (self.ReadyCheckIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate')
end
local function Enable(self, unit)
local element = self.ReadyCheckIndicator
unit = unit and unit:match('(%a+)%d*$')
if(element and (unit == 'party' or unit == 'raid')) then
element.__owner = self
element.ForceUpdate = ForceUpdate
element.readyTexture = element.readyTexture or _G.READY_CHECK_READY_TEXTURE
element.notReadyTexture = element.notReadyTexture or _G.READY_CHECK_NOT_READY_TEXTURE
element.waitingTexture = element.waitingTexture or _G.READY_CHECK_WAITING_TEXTURE
local AnimationGroup = element:CreateAnimationGroup()
AnimationGroup:HookScript('OnFinished', OnFinished)
element.Animation = AnimationGroup
local Animation = AnimationGroup:CreateAnimation('Alpha')
Animation:SetFromAlpha(1)
Animation:SetToAlpha(0)
Animation:SetDuration(element.fadeTime or 1.5)
Animation:SetStartDelay(element.finishedTime or 10)
self:RegisterEvent('READY_CHECK', Path, true)
self:RegisterEvent('READY_CHECK_CONFIRM', Path, true)
self:RegisterEvent('READY_CHECK_FINISHED', Path, true)
return true
end
end
local function Disable(self)
local element = self.ReadyCheckIndicator
if(element) then
element:Hide()
self:UnregisterEvent('READY_CHECK', Path)
self:UnregisterEvent('READY_CHECK_CONFIRM', Path)
self:UnregisterEvent('READY_CHECK_FINISHED', Path)
end
end
oUF:AddElement('ReadyCheckIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/RestingIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function Update(self, event)
local element = self.RestingIndicator
--[[ Callback: RestingIndicator:PreUpdate()
Called before the element has been updated.
* self - the RestingIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local isResting = IsResting()
if(isResting) then
element:Show()
else
element:Hide()
end
--[[ Callback: RestingIndicator:PostUpdate(isResting)
Called after the element has been updated.
* self - the RestingIndicator element
* isResting - indicates if the player is resting (boolean)
--]]
if(element.PostUpdate) then
return element:PostUpdate(isResting)
end
end
local function Path(self, ...)
--[[ Override: RestingIndicator.Override(self, event)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
--]]
return (self.RestingIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate')
end
local function Enable(self, unit)
local element = self.RestingIndicator
if(element and UnitIsUnit(unit, 'player')) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('PLAYER_UPDATE_RESTING', Path, true)
if(element:IsObjectType('Texture') and not element:GetTexture()) then
element:SetTexture([[Interface\CharacterFrame\UI-StateIcon]])
element:SetTexCoord(0, 0.5, 0, 0.421875)
end
return true
end
end
local function Disable(self)
local element = self.RestingIndicator
if(element) then
element:Hide()
self:UnregisterEvent('PLAYER_UPDATE_RESTING', Path)
end
end
oUF:AddElement('RestingIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/ResurrectIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local function Update(self, event, unit)
if(self.unit ~= unit) then return end
local element = self.ResurrectIndicator
--[[ Callback: ResurrectIndicator:PreUpdate()
Called before the element has been updated.
* self - the ResurrectIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local incomingResurrect = UnitHasIncomingResurrection(unit)
if(incomingResurrect) then
element:Show()
else
element:Hide()
end
--[[ Callback: ResurrectIndicator:PostUpdate(incomingResurrect)
Called after the element has been updated.
* self - the ResurrectIndicator element
* incomingResurrect - indicates if the unit has an incoming resurrection (boolean)
--]]
if(element.PostUpdate) then
return element:PostUpdate(incomingResurrect)
end
end
local function Path(self, ...)
--[[ Override: ResurrectIndicator.Override(self, event, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
return (self.ResurrectIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
local element = self.ResurrectIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('INCOMING_RESURRECT_CHANGED', Path)
if(element:IsObjectType('Texture') and not element:GetTexture()) then
element:SetTexture([[Interface\RaidFrame\Raid-Icon-Rez]])
end
return true
end
end
local function Disable(self)
local element = self.ResurrectIndicator
if(element) then
element:Hide()
self:UnregisterEvent('INCOMING_RESURRECT_CHANGED', Path)
end
end
oUF:AddElement('ResurrectIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/Runes.lua
================================================
if(select(2, UnitClass('player')) ~= 'DEATHKNIGHT') then return end
local _, ns = ...
local oUF = ns.oUF
local runemap = {1, 2, 3, 4, 5, 6}
local hasSortOrder = false
local function onUpdate(self, elapsed)
local duration = self.duration + elapsed
self.duration = duration
self:SetValue(duration)
end
local function ascSort(runeAID, runeBID)
local runeAStart, _, runeARuneReady = GetRuneCooldown(runeAID)
local runeBStart, _, runeBRuneReady = GetRuneCooldown(runeBID)
if(runeARuneReady ~= runeBRuneReady) then
return runeARuneReady
elseif(runeAStart ~= runeBStart) then
return runeAStart < runeBStart
else
return runeAID < runeBID
end
end
local function descSort(runeAID, runeBID)
local runeAStart, _, runeARuneReady = GetRuneCooldown(runeAID)
local runeBStart, _, runeBRuneReady = GetRuneCooldown(runeBID)
if(runeARuneReady ~= runeBRuneReady) then
return runeBRuneReady
elseif(runeAStart ~= runeBStart) then
return runeAStart > runeBStart
else
return runeAID > runeBID
end
end
local function UpdateColor(self, event)
local element = self.Runes
local spec = GetSpecialization() or 0
local color
if(spec > 0 and spec < 4 and element.colorSpec) then
color = self.colors.runes[spec]
else
color = self.colors.power.RUNES
end
local r, g, b = color[1], color[2], color[3]
for index = 1, #element do
element[index]:SetStatusBarColor(r, g, b)
local bg = element[index].bg
if(bg) then
local mu = bg.multiplier or 1
bg:SetVertexColor(r * mu, g * mu, b * mu)
end
end
--[[ Callback: Runes:PostUpdateColor(r, g, b)
Called after the element color has been updated.
* self - the Runes element
* r - the red component of the used color (number)[0-1]
* g - the green component of the used color (number)[0-1]
* b - the blue component of the used color (number)[0-1]
--]]
if(element.PostUpdateColor) then
element:PostUpdateColor(r, g, b)
end
end
local function ColorPath(self, ...)
--[[ Override: Runes.UpdateColor(self, event, ...)
Used to completely override the internal function for updating the widgets' colors.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
(self.Runes.UpdateColor or UpdateColor) (self, ...)
end
local function Update(self, event)
local element = self.Runes
if(element.sortOrder == 'asc') then
table.sort(runemap, ascSort)
hasSortOrder = true
elseif(element.sortOrder == 'desc') then
table.sort(runemap, descSort)
hasSortOrder = true
elseif(hasSortOrder) then
table.sort(runemap)
hasSortOrder = false
end
local rune, start, duration, runeReady
for index, runeID in next, runemap do
rune = element[index]
if(not rune) then break end
if(UnitHasVehicleUI('player')) then
rune:Hide()
else
start, duration, runeReady = GetRuneCooldown(runeID)
if(runeReady) then
rune:SetMinMaxValues(0, 1)
rune:SetValue(1)
rune:SetScript('OnUpdate', nil)
elseif(start) then
rune.duration = GetTime() - start
rune:SetMinMaxValues(0, duration)
rune:SetValue(0)
rune:SetScript('OnUpdate', onUpdate)
end
rune:Show()
end
end
--[[ Callback: Runes:PostUpdate(runemap)
Called after the element has been updated.
* self - the Runes element
* runemap - the ordered list of runes' indices (table)
--]]
if(element.PostUpdate) then
return element:PostUpdate(runemap)
end
end
local function Path(self, ...)
--[[ Override: Runes.Override(self, event, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
(self.Runes.Override or Update) (self, ...)
end
local function AllPath(...)
Path(...)
ColorPath(...)
end
local function ForceUpdate(element)
Path(element.__owner, 'ForceUpdate')
ColorPath(element.__owner, 'ForceUpdate')
end
local function Enable(self, unit)
local element = self.Runes
if(element and UnitIsUnit(unit, 'player')) then
element.__owner = self
element.ForceUpdate = ForceUpdate
for i = 1, #element do
local rune = element[i]
if(rune:IsObjectType('StatusBar') and not rune:GetStatusBarTexture()) then
rune:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
end
self:RegisterEvent('PLAYER_SPECIALIZATION_CHANGED', ColorPath)
self:RegisterEvent('RUNE_POWER_UPDATE', Path, true)
return true
end
end
local function Disable(self)
local element = self.Runes
if(element) then
for i = 1, #element do
element[i]:Hide()
end
self:UnregisterEvent('PLAYER_SPECIALIZATION_CHANGED', ColorPath)
self:UnregisterEvent('RUNE_POWER_UPDATE', Path)
end
end
oUF:AddElement('Runes', AllPath, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/Stagger.lua
================================================
if(select(2, UnitClass('player')) ~= 'MONK') then return end
local _, ns = ...
local oUF = ns.oUF
-- sourced from FrameXML/Constants.lua
local SPEC_MONK_BREWMASTER = SPEC_MONK_BREWMASTER or 1
-- sourced from FrameXML/MonkStaggerBar.lua
local BREWMASTER_POWER_BAR_NAME = BREWMASTER_POWER_BAR_NAME or 'STAGGER'
-- percentages at which bar should change color
local STAGGER_YELLOW_TRANSITION = STAGGER_YELLOW_TRANSITION or 0.3
local STAGGER_RED_TRANSITION = STAGGER_RED_TRANSITION or 0.6
-- table indices of bar colors
local STAGGER_GREEN_INDEX = STAGGER_GREEN_INDEX or 1
local STAGGER_YELLOW_INDEX = STAGGER_YELLOW_INDEX or 2
local STAGGER_RED_INDEX = STAGGER_RED_INDEX or 3
local function UpdateColor(element, cur, max)
local colors = element.__owner.colors.power[BREWMASTER_POWER_BAR_NAME]
local perc = cur / max
local t
if(perc >= STAGGER_RED_TRANSITION) then
t = colors and colors[STAGGER_RED_INDEX]
elseif(perc > STAGGER_YELLOW_TRANSITION) then
t = colors and colors[STAGGER_YELLOW_INDEX]
else
t = colors and colors[STAGGER_GREEN_INDEX]
end
local r, g, b
if(t) then
r, g, b = t[1], t[2], t[3]
if(b) then
element:SetStatusBarColor(r, g, b)
local bg = element.bg
if(bg and b) then
local mu = bg.multiplier or 1
bg:SetVertexColor(r * mu, g * mu, b * mu)
end
end
end
end
local function Update(self, event, unit)
if(unit and unit ~= self.unit) then return end
local element = self.Stagger
--[[ Callback: Stagger:PreUpdate()
Called before the element has been updated.
* self - the Stagger element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
-- Blizzard code has nil checks for UnitStagger return
local cur = UnitStagger('player') or 0
local max = UnitHealthMax('player')
element:SetMinMaxValues(0, max)
element:SetValue(cur)
--[[ Override: Stagger:UpdateColor(cur, max)
Used to completely override the internal function for updating the widget's colors.
* self - the Stagger element
* cur - the amount of staggered damage (number)
* max - the player's maximum possible health value (number)
--]]
element:UpdateColor(cur, max)
--[[ Callback: Stagger:PostUpdate(cur, max)
Called after the element has been updated.
* self - the Stagger element
* cur - the amount of staggered damage (number)
* max - the player's maximum possible health value (number)
--]]
if(element.PostUpdate) then
element:PostUpdate(cur, max)
end
end
local function Path(self, ...)
--[[ Override: Stagger.Override(self, event, unit)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
--]]
return (self.Stagger.Override or Update)(self, ...)
end
local function Visibility(self, event, unit)
if(SPEC_MONK_BREWMASTER ~= GetSpecialization() or UnitHasVehiclePlayerFrameUI('player')) then
if(self.Stagger:IsShown()) then
self.Stagger:Hide()
self:UnregisterEvent('UNIT_AURA', Path)
end
if SPEC_MONK_WINDWALKER ~= GetSpecialization() then
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 5) end -- ShestakUI
end
else
if(not self.Stagger:IsShown()) then
self.Stagger:Show()
self:RegisterEvent('UNIT_AURA', Path)
end
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19) end -- ShestakUI
return Path(self, event, unit)
end
end
local function VisibilityPath(self, ...)
--[[ Override: Stagger.OverrideVisibility(self, event, unit)
Used to completely override the internal visibility toggling function.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
--]]
return (self.Stagger.OverrideVisibility or Visibility)(self, ...)
end
local function ForceUpdate(element)
return VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
local element = self.Stagger
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
self:RegisterEvent('PLAYER_TALENT_UPDATE', VisibilityPath, true)
element.handler = CreateFrame("Frame", nil, element) -- ShestakUI
element.handler:RegisterEvent("PLAYER_TALENT_UPDATE")
element.handler:RegisterEvent("PLAYER_ENTERING_WORLD")
element.handler:SetScript("OnEvent", function() Visibility(self) end)
if(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then
element:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
if(not element.UpdateColor) then
element.UpdateColor = UpdateColor
end
MonkStaggerBar:UnregisterEvent('PLAYER_ENTERING_WORLD')
MonkStaggerBar:UnregisterEvent('PLAYER_SPECIALIZATION_CHANGED')
MonkStaggerBar:UnregisterEvent('UNIT_DISPLAYPOWER')
MonkStaggerBar:UnregisterEvent('UNIT_EXITED_VEHICLE')
MonkStaggerBar:UnregisterEvent('UPDATE_VEHICLE_ACTIONBAR')
-- do not change this without taking Visibility into account
element:Hide()
return true
end
end
local function Disable(self)
local element = self.Stagger
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_AURA', Path)
self:UnregisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
self:UnregisterEvent('PLAYER_TALENT_UPDATE', VisibilityPath)
MonkStaggerBar:RegisterEvent('PLAYER_ENTERING_WORLD')
MonkStaggerBar:RegisterEvent('PLAYER_SPECIALIZATION_CHANGED')
MonkStaggerBar:RegisterEvent('UNIT_DISPLAYPOWER')
MonkStaggerBar:RegisterEvent('UNIT_EXITED_VEHICLE')
MonkStaggerBar:RegisterEvent('UPDATE_VEHICLE_ACTIONBAR')
end
end
oUF:AddElement('Stagger', VisibilityPath, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/SummonIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
-- sourced from Blizzard_APIDocumentation/IncomingSummonDocumentation.lua
local SUMMON_STATUS_NONE = Enum.SummonStatus.None or 0
local SUMMON_STATUS_PENDING = Enum.SummonStatus.Pending or 1
local SUMMON_STATUS_ACCEPTED = Enum.SummonStatus.Accepted or 2
local SUMMON_STATUS_DECLINED = Enum.SummonStatus.Declined or 3
local function Update(self, event, unit)
if(self.unit ~= unit) then return end
local element = self.SummonIndicator
--[[ Callback: SummonIndicator:PreUpdate()
Called before the element has been updated.
* self - the SummonIndicator element
--]]
if(element.PreUpdate) then
element:PreUpdate()
end
local status = C_IncomingSummon.IncomingSummonStatus(unit)
if(status ~= SUMMON_STATUS_NONE) then
if(status == SUMMON_STATUS_PENDING) then
element:SetAtlas('Raid-Icon-SummonPending')
elseif(status == SUMMON_STATUS_ACCEPTED) then
element:SetAtlas('Raid-Icon-SummonAccepted')
elseif(status == SUMMON_STATUS_DECLINED) then
element:SetAtlas('Raid-Icon-SummonDeclined')
end
element:Show()
else
element:Hide()
end
--[[ Callback: SummonIndicator:PostUpdate(status)
Called after the element has been updated.
* self - the SummonIndicator element
* status - the unit's incoming summon status (number)[0-3]
--]]
if(element.PostUpdate) then
return element:PostUpdate(status)
end
end
local function Path(self, ...)
--[[ Override: SummonIndicator.Override(self, event)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
return (self.SummonIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
local element = self.SummonIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('INCOMING_SUMMON_CHANGED', Path)
return true
end
end
local function Disable(self)
local element = self.SummonIndicator
if(element) then
element:Hide()
self:UnregisterEvent('INCOMING_SUMMON_CHANGED', Path)
end
end
oUF:AddElement('SummonIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Elements/Tags.lua
================================================
-- Credits: Vika, Cladhaire, Tekkub
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local nierror = Private.nierror
local unitExists = Private.unitExists
local xpcall = Private.xpcall
local _PATTERN = '%[..-%]+'
local _ENV = {
Hex = function(r, g, b)
if(type(r) == 'table') then
if(r.r) then
r, g, b = r.r, r.g, r.b
else
r, g, b = unpack(r)
end
end
return string.format('|cff%02x%02x%02x', r * 255, g * 255, b * 255)
end,
}
_ENV.ColorGradient = function(...)
return _ENV._FRAME:ColorGradient(...)
end
local _PROXY = setmetatable(_ENV, {__index = _G})
local tagStrings = {
['affix'] = [[function(u)
local c = UnitClassification(u)
if(c == 'minus') then
return 'Affix'
end
end]],
['arcanecharges'] = [[function()
if(GetSpecialization() == SPEC_MAGE_ARCANE) then
local num = UnitPower('player', Enum.PowerType.ArcaneCharges)
if(num > 0) then
return num
end
end
end]],
['arenaspec'] = [[function(u)
local id = u:match('arena(%d)$')
if(id) then
local specID = GetArenaOpponentSpec(tonumber(id))
if(specID and specID > 0) then
local _, specName = GetSpecializationInfoByID(specID)
return specName
end
end
end]],
['chi'] = [[function()
if(GetSpecialization() == SPEC_MONK_WINDWALKER) then
local num = UnitPower('player', Enum.PowerType.Chi)
if(num > 0) then
return num
end
end
end]],
['classification'] = [[function(u)
local c = UnitClassification(u)
if(c == 'rare') then
return 'Rare'
elseif(c == 'rareelite') then
return 'Rare Elite'
elseif(c == 'elite') then
return 'Elite'
elseif(c == 'worldboss') then
return 'Boss'
elseif(c == 'minus') then
return 'Affix'
end
end]],
['cpoints'] = [[function(u)
local cp = UnitPower(u, Enum.PowerType.ComboPoints)
if(cp > 0) then
return cp
end
end]],
['creature'] = [[function(u)
return UnitCreatureFamily(u) or UnitCreatureType(u)
end]],
['curmana'] = [[function(unit)
return UnitPower(unit, Enum.PowerType.Mana)
end]],
['dead'] = [[function(u)
if(UnitIsDead(u)) then
return 'Dead'
elseif(UnitIsGhost(u)) then
return 'Ghost'
end
end]],
['deficit:name'] = [[function(u)
local missinghp = _TAGS['missinghp'](u)
if(missinghp) then
return '-' .. missinghp
else
return _TAGS['name'](u)
end
end]],
['difficulty'] = [[function(u)
if UnitCanAttack('player', u) then
local l = UnitEffectiveLevel(u)
return Hex(GetCreatureDifficultyColor((l > 0) and l or 999))
end
end]],
['group'] = [[function(unit)
local name, server = UnitName(unit)
if(server and server ~= '') then
name = string.format('%s-%s', name, server)
end
for i=1, GetNumGroupMembers() do
local raidName, _, group = GetRaidRosterInfo(i)
if( raidName == name ) then
return group
end
end
end]],
['holypower'] = [[function()
if(GetSpecialization() == SPEC_PALADIN_RETRIBUTION) then
local num = UnitPower('player', Enum.PowerType.HolyPower)
if(num > 0) then
return num
end
end
end]],
['leader'] = [[function(u)
if(UnitIsGroupLeader(u)) then
return 'L'
end
end]],
['leaderlong'] = [[function(u)
if(UnitIsGroupLeader(u)) then
return 'Leader'
end
end]],
['level'] = [[function(u)
local l = UnitEffectiveLevel(u)
if(UnitIsWildBattlePet(u) or UnitIsBattlePetCompanion(u)) then
l = UnitBattlePetLevel(u)
end
if(l > 0) then
return l
else
return '??'
end
end]],
['maxmana'] = [[function(unit)
return UnitPowerMax(unit, Enum.PowerType.Mana)
end]],
['missinghp'] = [[function(u)
local current = UnitHealthMax(u) - UnitHealth(u)
if(current > 0) then
return current
end
end]],
['missingpp'] = [[function(u)
local current = UnitPowerMax(u) - UnitPower(u)
if(current > 0) then
return current
end
end]],
['name'] = [[function(u, r)
return UnitName(r or u)
end]],
['offline'] = [[function(u)
if(not UnitIsConnected(u)) then
return 'Offline'
end
end]],
['perhp'] = [[function(u)
local m = UnitHealthMax(u)
if(m == 0) then
return 0
else
return math.floor(UnitHealth(u) / m * 100 + .5)
end
end]],
['perpp'] = [[function(u)
local m = UnitPowerMax(u)
if(m == 0) then
return 0
else
return math.floor(UnitPower(u) / m * 100 + .5)
end
end]],
['plus'] = [[function(u)
local c = UnitClassification(u)
if(c == 'elite' or c == 'rareelite') then
return '+'
end
end]],
['powercolor'] = [[function(u)
local pType, pToken, altR, altG, altB = UnitPowerType(u)
local t = _COLORS.power[pToken]
if(not t) then
if(altR) then
if(altR > 1 or altG > 1 or altB > 1) then
return Hex(altR / 255, altG / 255, altB / 255)
else
return Hex(altR, altG, altB)
end
else
return Hex(_COLORS.power[pType] or _COLORS.power.MANA)
end
end
return Hex(t)
end]],
['pvp'] = [[function(u)
if(UnitIsPVP(u)) then
return 'PvP'
end
end]],
['raidcolor'] = [[function(u)
local _, class = UnitClass(u)
if(class) then
return Hex(_COLORS.class[class])
else
local id = u:match('arena(%d)$')
if(id) then
local specID = GetArenaOpponentSpec(tonumber(id))
if(specID and specID > 0) then
_, _, _, _, _, class = GetSpecializationInfoByID(specID)
return Hex(_COLORS.class[class])
end
end
end
end]],
['rare'] = [[function(u)
local c = UnitClassification(u)
if(c == 'rare' or c == 'rareelite') then
return 'Rare'
end
end]],
['resting'] = [[function(u)
if(u == 'player' and IsResting()) then
return 'zzz'
end
end]],
['runes'] = [[function()
local amount = 0
for i = 1, 6 do
local _, _, ready = GetRuneCooldown(i)
if(ready) then
amount = amount + 1
end
end
return amount
end]],
['sex'] = [[function(u)
local s = UnitSex(u)
if(s == 2) then
return 'Male'
elseif(s == 3) then
return 'Female'
end
end]],
['shortclassification'] = [[function(u)
local c = UnitClassification(u)
if(c == 'rare') then
return 'R'
elseif(c == 'rareelite') then
return 'R+'
elseif(c == 'elite') then
return '+'
elseif(c == 'worldboss') then
return 'B'
elseif(c == 'minus') then
return '-'
end
end]],
['smartclass'] = [[function(u)
if(UnitIsPlayer(u)) then
return _TAGS['class'](u)
end
return _TAGS['creature'](u)
end]],
['smartlevel'] = [[function(u)
local c = UnitClassification(u)
if(c == 'worldboss') then
return 'Boss'
else
local plus = _TAGS['plus'](u)
local level = _TAGS['level'](u)
if(plus) then
return level .. plus
else
return level
end
end
end]],
['soulshards'] = [[function()
local num = UnitPower('player', Enum.PowerType.SoulShards)
if(num > 0) then
return num
end
end]],
['status'] = [[function(u)
if(UnitIsDead(u)) then
return 'Dead'
elseif(UnitIsGhost(u)) then
return 'Ghost'
elseif(not UnitIsConnected(u)) then
return 'Offline'
else
return _TAGS['resting'](u)
end
end]],
['threat'] = [[function(u)
local s = UnitThreatSituation(u)
if(s == 1) then
return '++'
elseif(s == 2) then
return '--'
elseif(s == 3) then
return 'Aggro'
end
end]],
['threatcolor'] = [[function(u)
return Hex(GetThreatStatusColor(UnitThreatSituation(u)))
end]],
}
local tags = setmetatable(
{
curhp = UnitHealth,
curpp = UnitPower,
maxhp = UnitHealthMax,
maxpp = UnitPowerMax,
class = UnitClass,
faction = UnitFactionGroup,
race = UnitRace,
},
{
__index = function(self, key)
local tagString = tagStrings[key]
if(tagString) then
self[key] = tagString
tagStrings[key] = nil
end
return rawget(self, key)
end,
__newindex = function(self, key, val)
if(type(val) == 'string') then
local func, err = loadstring('return ' .. val)
if(func) then
val = func()
else
error(err, 3)
end
end
assert(type(val) == 'function', 'Tag function must be a function or a string that evaluates to a function.')
-- We don't want to clash with any custom envs
if(getfenv(val) == _G) then
-- pcall is needed for cases when Blizz functions are passed as
-- strings, for intance, 'UnitPowerMax', an attempt to set a
-- custom env will result in an error
pcall(setfenv, val, _PROXY)
end
rawset(self, key, val)
end,
}
)
_ENV._TAGS = tags
local vars = setmetatable({}, {
__newindex = function(self, key, val)
if(type(val) == 'string') then
local func = loadstring('return ' .. val)
if(func) then
val = func() or val
end
end
rawset(self, key, val)
end,
})
_ENV._VARS = vars
local tagEvents = {
['affix'] = 'UNIT_CLASSIFICATION_CHANGED',
['arcanecharges'] = 'UNIT_POWER_UPDATE PLAYER_TALENT_UPDATE',
['arenaspec'] = 'ARENA_PREP_OPPONENT_SPECIALIZATIONS',
['chi'] = 'UNIT_POWER_UPDATE PLAYER_TALENT_UPDATE',
['classification'] = 'UNIT_CLASSIFICATION_CHANGED',
['cpoints'] = 'UNIT_POWER_FREQUENT PLAYER_TARGET_CHANGED',
['curhp'] = 'UNIT_HEALTH UNIT_MAXHEALTH',
['curmana'] = 'UNIT_POWER_UPDATE UNIT_MAXPOWER',
['curpp'] = 'UNIT_POWER_UPDATE UNIT_MAXPOWER',
['dead'] = 'UNIT_HEALTH',
['deficit:name'] = 'UNIT_HEALTH UNIT_MAXHEALTH UNIT_NAME_UPDATE',
['difficulty'] = 'UNIT_FACTION',
['faction'] = 'NEUTRAL_FACTION_SELECT_RESULT',
['group'] = 'GROUP_ROSTER_UPDATE',
['holypower'] = 'UNIT_POWER_UPDATE PLAYER_TALENT_UPDATE',
['leader'] = 'PARTY_LEADER_CHANGED',
['leaderlong'] = 'PARTY_LEADER_CHANGED',
['level'] = 'UNIT_LEVEL PLAYER_LEVEL_UP',
['maxhp'] = 'UNIT_MAXHEALTH',
['maxmana'] = 'UNIT_POWER_UPDATE UNIT_MAXPOWER',
['maxpp'] = 'UNIT_MAXPOWER',
['missinghp'] = 'UNIT_HEALTH UNIT_MAXHEALTH',
['missingpp'] = 'UNIT_MAXPOWER UNIT_POWER_UPDATE',
['name'] = 'UNIT_NAME_UPDATE',
['offline'] = 'UNIT_HEALTH UNIT_CONNECTION',
['perhp'] = 'UNIT_HEALTH UNIT_MAXHEALTH',
['perpp'] = 'UNIT_MAXPOWER UNIT_POWER_UPDATE',
['plus'] = 'UNIT_CLASSIFICATION_CHANGED',
['powercolor'] = 'UNIT_DISPLAYPOWER',
['pvp'] = 'UNIT_FACTION',
['rare'] = 'UNIT_CLASSIFICATION_CHANGED',
['resting'] = 'PLAYER_UPDATE_RESTING',
['runes'] = 'RUNE_POWER_UPDATE',
['shortclassification'] = 'UNIT_CLASSIFICATION_CHANGED',
['smartlevel'] = 'UNIT_LEVEL PLAYER_LEVEL_UP UNIT_CLASSIFICATION_CHANGED',
['soulshards'] = 'UNIT_POWER_UPDATE',
['status'] = 'UNIT_HEALTH PLAYER_UPDATE_RESTING UNIT_CONNECTION',
['threat'] = 'UNIT_THREAT_SITUATION_UPDATE',
['threatcolor'] = 'UNIT_THREAT_SITUATION_UPDATE',
}
local unitlessEvents = {
ARENA_PREP_OPPONENT_SPECIALIZATIONS = true,
GROUP_ROSTER_UPDATE = true,
NEUTRAL_FACTION_SELECT_RESULT = true,
PARTY_LEADER_CHANGED = true,
PLAYER_LEVEL_UP = true,
PLAYER_TALENT_UPDATE = true,
PLAYER_TARGET_CHANGED = true,
PLAYER_UPDATE_RESTING = true,
RUNE_POWER_UPDATE = true,
}
local events = {}
local eventFrame = CreateFrame('Frame')
eventFrame:SetScript('OnEvent', function(self, event, unit)
local strings = events[event]
if(strings) then
for _, fs in next, strings do
if(fs:IsVisible() and (unitlessEvents[event] or fs.parent.unit == unit or (fs.extraUnits and fs.extraUnits[unit]))) then
fs:UpdateTag()
end
end
end
end)
local onUpdates = {}
local eventlessUnits = {}
local function createOnUpdate(timer)
if(not onUpdates[timer]) then
local total = timer
local frame = CreateFrame('Frame')
local strings = eventlessUnits[timer]
frame:SetScript('OnUpdate', function(self, elapsed)
if(total >= timer) then
for _, fs in next, strings do
if(fs.parent:IsShown() and unitExists(fs.parent.unit)) then
fs:UpdateTag()
end
end
total = 0
end
total = total + elapsed
end)
onUpdates[timer] = frame
end
end
--[[ Tags: frame:UpdateTags()
Used to update all tags on a frame.
* self - the unit frame from which to update the tags
--]]
local function Update(self)
if(self.__tags) then
for fs in next, self.__tags do
fs:UpdateTag()
end
end
end
local tagPool = {}
local funcPool = {}
local tmp = {}
-- full tag syntax: '[prefix$>tag-name<$suffix(a,r,g,s)]'
-- for a small test case see https://github.com/oUF-wow/oUF/pull/602
local function getBracketData(tag)
local prefixEnd, prefixOffset = tag:match('()$>'), 1
if(not prefixEnd) then
prefixEnd = 1
else
prefixEnd = prefixEnd - 1
prefixOffset = 3
end
local suffixEnd = (tag:match('()%(', prefixOffset + 1) or -1) - 1
local suffixStart, suffixOffset = tag:match('<$()', prefixEnd), 1
if(not suffixStart) then
suffixStart = suffixEnd + 1
else
suffixOffset = 3
end
return tag:sub(prefixEnd + prefixOffset, suffixStart - suffixOffset),
prefixEnd,
suffixStart,
suffixEnd,
tag:match('%((.-)%)', suffixOffset + 1)
end
local function getTagFunc(tagstr)
local func = tagPool[tagstr]
if(not func) then
local format, numTags = tagstr:gsub('%%', '%%%%'):gsub(_PATTERN, '%%s')
local args = {}
local idx = 1
local format_ = {}
for i = 1, numTags do
format_[i] = '%s'
end
for bracket in tagstr:gmatch(_PATTERN) do
local tagFunc = funcPool[bracket] or tags[bracket:sub(2, -2)]
if(not tagFunc) then
local tagName, prefixEnd, suffixStart, suffixEnd, customArgs = getBracketData(bracket)
local tag = tags[tagName]
if(tag) then
if(prefixEnd ~= 1 or suffixStart - suffixEnd ~= 1) then
local prefix = prefixEnd ~= 1 and bracket:sub(2, prefixEnd) or ''
local suffix = suffixStart - suffixEnd ~= 1 and bracket:sub(suffixStart, suffixEnd) or ''
tagFunc = function(unit, realUnit)
local str
if(customArgs) then
str = tag(unit, realUnit, string.split(',', customArgs))
else
str = tag(unit, realUnit)
end
if(str and str ~= '') then
return prefix .. str .. suffix
end
end
else
tagFunc = function(unit, realUnit)
local str
if(customArgs) then
str = tag(unit, realUnit, string.split(',', customArgs))
else
str = tag(unit, realUnit)
end
if(str and str ~= '') then
return str
end
end
end
funcPool[bracket] = tagFunc
end
end
if(tagFunc) then
table.insert(args, tagFunc)
idx = idx + 1
else
nierror(string.format('Attempted to use invalid tag %s.', bracket))
format_[idx] = bracket
format = format:format(unpack(format_, 1, numTags))
format_[idx] = '%s'
numTags = numTags - 1
end
end
func = function(self)
local parent = self.parent
local unit = parent.unit
local realUnit
if(self.overrideUnit) then
realUnit = parent.realUnit
end
_ENV._COLORS = parent.colors
_ENV._FRAME = parent
for i, f in next, args do
tmp[i] = f(unit, realUnit) or ''
end
-- We do 1, numTags because tmp can hold several unneeded variables.
return self:SetFormattedText(format, unpack(tmp, 1, numTags))
end
tagPool[tagstr] = func
end
return func
end
local function registerEvent(fontstr, event)
if(not events[event]) then events[event] = {} end
local isOK = xpcall(eventFrame.RegisterEvent, eventFrame, event)
if(isOK) then
table.insert(events[event], fontstr)
end
end
local function registerEvents(fontstr, tagstr)
for tag in tagstr:gmatch(_PATTERN) do
tag = getBracketData(tag)
local tagevents = tagEvents[tag]
if(tagevents) then
for event in tagevents:gmatch('%S+') do
registerEvent(fontstr, event)
end
end
end
end
local function unregisterEvents(fontstr)
for event, data in next, events do
local index = 1
local tagfsstr = data[index]
while tagfsstr do
if(tagfsstr == fontstr) then
if(#data == 1) then
eventFrame:UnregisterEvent(event)
end
table.remove(data, index)
else
index = index + 1
end
tagfsstr = data[index]
end
end
end
local taggedFS = {}
--[[ Tags: frame:Tag(fs, tagstr, ...)
Used to register a tag on a unit frame.
* self - the unit frame on which to register the tag
* fs - the font string to display the tag (FontString)
* tagstr - the tag string (string)
* ... - additional optional unitID(s) the tag should update for
--]]
local function Tag(self, fs, tagstr, ...)
if(not fs or not tagstr) then return end
if(not self.__tags) then
self.__tags = {}
table.insert(self.__elements, Update)
elseif(self.__tags[fs]) then
-- We don't need to remove it from the __tags table as Untag handles
-- that for us.
self:Untag(fs)
end
fs.parent = self
fs.UpdateTag = getTagFunc(tagstr)
if(self.__eventless or fs.frequentUpdates) then
local timer
if(type(fs.frequentUpdates) == 'number') then
timer = fs.frequentUpdates
else
timer = .5
end
if(not eventlessUnits[timer]) then eventlessUnits[timer] = {} end
table.insert(eventlessUnits[timer], fs)
createOnUpdate(timer)
else
registerEvents(fs, tagstr)
if(...) then
if(not fs.extraUnits) then
fs.extraUnits = {}
end
for index = 1, select('#', ...) do
fs.extraUnits[select(index, ...)] = true
end
end
end
taggedFS[fs] = tagstr
self.__tags[fs] = true
end
--[[ Tags: frame:Untag(fs)
Used to unregister a tag from a unit frame.
* self - the unit frame from which to unregister the tag
* fs - the font string holding the tag (FontString)
--]]
local function Untag(self, fs)
if(not fs or not self.__tags) then return end
unregisterEvents(fs)
for _, timers in next, eventlessUnits do
local index = 1
local fontstr = timers[index]
while fontstr do
if(fs == fontstr) then
table.remove(timers, index)
else
index = index + 1
end
fontstr = timers[index]
end
end
fs.UpdateTag = nil
taggedFS[fs] = nil
self.__tags[fs] = nil
end
local function strip(tag)
-- remove prefix, custom args, and suffix
return tag:gsub('%[.-$>', '['):gsub('%(.-%)%]', ']'):gsub('<$.-%]', ']')
end
oUF.Tags = {
Methods = tags,
Events = tagEvents,
SharedEvents = unitlessEvents,
Vars = vars,
RefreshMethods = function(self, tag)
if(not tag) then return end
-- If a tag's name contains magic chars, there's a chance that
-- string.match will fail to find the match.
tag = '%[' .. tag:gsub('[%^%$%(%)%%%.%*%+%-%?]', '%%%1') .. '%]'
for func in next, funcPool do
if(strip(func):match(tag)) then
funcPool[func] = nil
end
end
for tagstr, func in next, tagPool do
if(strip(tagstr):match(tag)) then
tagPool[tagstr] = nil
for fs in next, taggedFS do
if(fs.UpdateTag == func) then
fs.UpdateTag = getTagFunc(tagstr)
if(fs:IsVisible()) then
fs:UpdateTag()
end
end
end
end
end
end,
RefreshEvents = function(self, tag)
if(not tag) then return end
-- If a tag's name contains magic chars, there's a chance that
-- string.match will fail to find the match.
tag = '%[' .. tag:gsub('[%^%$%(%)%%%.%*%+%-%?]', '%%%1') .. '%]'
for tagstr in next, tagPool do
if(strip(tagstr):match(tag)) then
for fs, ts in next, taggedFS do
if(ts == tagstr) then
unregisterEvents(fs)
registerEvents(fs, tagstr)
end
end
end
end
end,
}
oUF:RegisterMetaFunction('Tag', Tag)
oUF:RegisterMetaFunction('Untag', Untag)
oUF:RegisterMetaFunction('UpdateTags', Update)
================================================
FILE: ShestakUI/Libs/oUF/Elements/ThreatIndicator.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local unitExists = Private.unitExists
local function Update(self, event, unit)
if(unit ~= self.unit) then return end
local element = self.ThreatIndicator
--[[ Callback: ThreatIndicator:PreUpdate(unit)
Called before the element has been updated.
* self - the ThreatIndicator element
* unit - the unit for which the update has been triggered (string)
--]]
if(element.PreUpdate) then element:PreUpdate(unit) end
local feedbackUnit = element.feedbackUnit
unit = unit or self.unit
local status
-- BUG: Non-existent '*target' or '*pet' units cause UnitThreatSituation() errors
if(unitExists(unit)) then
if(feedbackUnit and feedbackUnit ~= unit and unitExists(feedbackUnit)) then
status = UnitThreatSituation(feedbackUnit, unit)
else
status = UnitThreatSituation(unit)
end
end
local r, g, b
if(status and status > 0) then
local color = self.colors.threat[status]
r, g, b = color[1], color[2], color[3]
if(element.SetVertexColor) then
element:SetVertexColor(r, g, b)
end
element:Show()
else
element:Hide()
end
--[[ Callback: ThreatIndicator:PostUpdate(unit, status, r, g, b)
Called after the element has been updated.
* self - the ThreatIndicator element
* unit - the unit for which the update has been triggered (string)
* status - the unit's threat status (see [UnitThreatSituation](http://wowprogramming.com/docs/api/UnitThreatSituation.html))
* r - the red color component based on the unit's threat status (number?)[0-1]
* g - the green color component based on the unit's threat status (number?)[0-1]
* b - the blue color component based on the unit's threat status (number?)[0-1]
--]]
if(element.PostUpdate) then
return element:PostUpdate(unit, status, r, g, b)
end
end
local function Path(self, ...)
--[[ Override: ThreatIndicator.Override(self, event, ...)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* ... - the arguments accompanying the event
--]]
return (self.ThreatIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
local element = self.ThreatIndicator
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_THREAT_SITUATION_UPDATE', Path)
self:RegisterEvent('UNIT_THREAT_LIST_UPDATE', Path)
if(element:IsObjectType('Texture') and not element:GetTexture()) then
element:SetTexture([[Interface\RAIDFRAME\UI-RaidFrame-Threat]])
end
return true
end
end
local function Disable(self)
local element = self.ThreatIndicator
if(element) then
element:Hide()
self:UnregisterEvent('UNIT_THREAT_SITUATION_UPDATE', Path)
self:UnregisterEvent('UNIT_THREAT_LIST_UPDATE', Path)
end
end
oUF:AddElement('ThreatIndicator', Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Events.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local argcheck = Private.argcheck
local validateEvent = Private.validateEvent
local validateUnit = Private.validateUnit
local isUnitEvent = Private.isUnitEvent
local frame_metatable = Private.frame_metatable
-- Original event methods
local registerEvent = frame_metatable.__index.RegisterEvent
local registerUnitEvent = frame_metatable.__index.RegisterUnitEvent
local unregisterEvent = frame_metatable.__index.UnregisterEvent
local isEventRegistered = frame_metatable.__index.IsEventRegistered
-- to update unit frames correctly, some events need to be registered for
-- a specific combination of primary and secondary units
local secondaryUnits = {
UNIT_ENTERED_VEHICLE = {
pet = 'player',
},
UNIT_EXITED_VEHICLE = {
pet = 'player',
},
UNIT_PET = {
pet = 'player',
},
}
function Private.UpdateUnits(frame, unit, realUnit)
if(unit == realUnit) then
realUnit = nil
end
if(frame.unit ~= unit or frame.realUnit ~= realUnit) then
-- don't let invalid units in, otherwise unit events will end up being
-- registered as unitless
if(frame.unitEvents and validateUnit(unit)) then
local resetRealUnit = false
for event in next, frame.unitEvents do
if(not realUnit and secondaryUnits[event]) then
realUnit = secondaryUnits[event][unit]
resetRealUnit = true
end
local registered, unit1, unit2 = isEventRegistered(frame, event)
-- we don't want to re-register unitless/shared events in case
-- someone added them by hand to the unitEvents table
if(not registered or unit1 and (unit1 ~= unit or unit2 ~= realUnit)) then
-- BUG: passing explicit nil units to RegisterUnitEvent
-- makes it silently fall back to RegisterEvent, using ''
-- instead of explicit nils doesn't cause this behaviour
registerUnitEvent(frame, event, unit, realUnit or '')
end
if(resetRealUnit) then
realUnit = nil
resetRealUnit = false
end
end
end
frame.unit = unit
frame.realUnit = realUnit
frame.id = unit:match('^.-(%d+)')
return true
end
end
local function onEvent(self, event, ...)
if(self:IsVisible()) then
return self[event](self, event, ...)
end
end
local event_metatable = {
__call = function(funcs, self, ...)
for _, func in next, funcs do
func(self, ...)
end
end,
}
--[[ Events: frame:RegisterEvent(event, func, unitless)
Used to register a frame for a game event and add an event handler. OnUpdate polled frames are prevented from
registering events.
* self - frame that will be registered for the given event.
* event - name of the event to register (string)
* func - a function that will be executed when the event fires. Multiple functions can be added for the same frame
and event (function)
* unitless - indicates that the event does not fire for a specific unit, so the event arguments won't be
matched to the frame unit(s). Obligatory for unitless event (boolean)
--]]
function frame_metatable.__index:RegisterEvent(event, func, unitless)
-- Block OnUpdate polled frames from registering events except for
-- UNIT_PORTRAIT_UPDATE and UNIT_MODEL_CHANGED which are used for
-- portrait updates.
if(self.__eventless and event ~= 'UNIT_PORTRAIT_UPDATE' and event ~= 'UNIT_MODEL_CHANGED') then return end
argcheck(event, 2, 'string')
argcheck(func, 3, 'function')
local curev = self[event]
if(curev) then
local kind = type(curev)
if(kind == 'function' and curev ~= func) then
self[event] = setmetatable({curev, func}, event_metatable)
elseif(kind == 'table') then
for _, infunc in next, curev do
if(infunc == func) then return end
end
table.insert(curev, func)
end
if(unitless or self.__eventless) then
-- re-register the event in case we have mixed registration
registerEvent(self, event)
if(self.unitEvents) then
self.unitEvents[event] = nil
end
end
elseif(validateEvent(event)) then
self[event] = func
if(not self:GetScript('OnEvent')) then
self:SetScript('OnEvent', onEvent)
end
if(unitless or self.__eventless) then
registerEvent(self, event)
else
self.unitEvents = self.unitEvents or {}
self.unitEvents[event] = true
-- UpdateUnits will take care of unit event registration for header
-- units in case we don't have a valid unit yet
local unit1, unit2 = self.unit
if(unit1 and validateUnit(unit1)) then
if(secondaryUnits[event]) then
unit2 = secondaryUnits[event][unit1]
end
-- be helpful and throw a custom error when attempting to register
-- an event that is unitless
assert(isUnitEvent(event, unit1), string.format('Event "%s" is not an unit event', event))
registerUnitEvent(self, event, unit1, unit2 or '')
end
end
end
end
--[[ Events: frame:UnregisterEvent(event, func)
Used to remove a function from the event handler list for a game event.
* self - the frame registered for the event
* event - name of the registered event (string)
* func - function to be removed from the list of event handlers. If this is the only handler for the given event, then
the frame will be unregistered for the event (function)
--]]
function frame_metatable.__index:UnregisterEvent(event, func)
argcheck(event, 2, 'string')
local cleanUp = false
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
break
end
end
if(not next(curev)) then
cleanUp = true
end
end
if(cleanUp or curev == func) then
self[event] = nil
if(self.unitEvents) then
self.unitEvents[event] = nil
end
unregisterEvent(self, event)
end
end
================================================
FILE: ShestakUI/Libs/oUF/Factory.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local argcheck = Private.argcheck
local queue = {}
local factory = CreateFrame('Frame')
factory:SetScript('OnEvent', function(self, event, ...)
return self[event](self, event, ...)
end)
factory:RegisterEvent('PLAYER_LOGIN')
factory.active = true
function factory:PLAYER_LOGIN()
if(not self.active) then return end
for _, func in next, queue do
func(oUF)
end
-- Avoid creating dupes.
table.wipe(queue)
end
--[[ Factory: oUF:Factory(func)
Used to call a function directly if the current character is logged in and the factory is active. Else the function is
queued up to be executed at a later time (upon PLAYER_LOGIN by default).
* self - the global oUF object
* func - function to be executed or delayed (function)
--]]
function oUF:Factory(func)
argcheck(func, 2, 'function')
-- Call the function directly if we're active and logged in.
if(IsLoggedIn() and factory.active) then
return func(self)
else
table.insert(queue, func)
end
end
--[[ Factory: oUF:EnableFactory()
Used to enable the factory.
* self - the global oUF object
--]]
function oUF:EnableFactory()
factory.active = true
end
--[[ Factory: oUF:DisableFactory()
Used to disable the factory.
* self - the global oUF object
--]]
function oUF:DisableFactory()
factory.active = nil
end
--[[ Factory: oUF:RunFactoryQueue()
Used to try to execute queued up functions. The current player must be logged in and the factory must be active for
this to succeed.
* self - the global oUF object
--]]
function oUF:RunFactoryQueue()
factory:PLAYER_LOGIN()
end
================================================
FILE: ShestakUI/Libs/oUF/Finalize.lua
================================================
local _, ns = ...
-- It's named Private for a reason!
ns.oUF.Private = nil
================================================
FILE: ShestakUI/Libs/oUF/Init.lua
================================================
local _, ns = ...
ns.oUF = {}
ns.oUF.Private = {}
================================================
FILE: ShestakUI/Libs/oUF/Modules/ArcaneCharge.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or T.class ~= "MAGE" then return end
local _, ns = ...
local oUF = ns.oUF
local SPELL_POWER_ARCANE_CHARGES = Enum.PowerType.ArcaneCharges or 16
local function Update(self, _, unit, powerType)
if(self.unit ~= unit or (powerType and powerType ~= "ARCANE_CHARGES")) then return end
local element = self.ArcaneCharge
if(element.PreUpdate) then
element:PreUpdate(unit)
end
local cur = UnitPower("player", SPELL_POWER_ARCANE_CHARGES)
local max = UnitPowerMax("player", SPELL_POWER_ARCANE_CHARGES)
for i = 1, max do
if(i <= cur) then
element[i]:SetAlpha(1)
else
element[i]:SetAlpha(0.2)
end
end
if(element.PostUpdate) then
return element:PostUpdate(cur)
end
end
local function Path(self, ...)
return (self.ArcaneCharge.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit, "ARCANE_CHARGES")
end
local function Visibility(self)
local element = self.ArcaneCharge
local spec = GetSpecialization()
if spec == SPEC_MAGE_ARCANE then
element:Show()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19) end
else
element:Hide()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 5) end
end
end
local function Enable(self)
local element = self.ArcaneCharge
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent("UNIT_POWER_UPDATE", Path)
element.handler = CreateFrame("Frame", nil, element)
element.handler:RegisterEvent("PLAYER_TALENT_UPDATE")
element.handler:RegisterEvent("PLAYER_ENTERING_WORLD")
element.handler:SetScript("OnEvent", function() Visibility(self) end)
return true
end
end
local function Disable(self)
local element = self.ArcaneCharge
if(element) then
self:UnregisterEvent("UNIT_POWER_UPDATE", Path)
element.handler:UnregisterEvent("PLAYER_TALENT_UPDATE")
element.handler:UnregisterEvent("PLAYER_ENTERING_WORLD")
end
end
oUF:AddElement("ArcaneCharge", Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/AuraTracker.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.show_arena ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_AuraTracker(by Thizzelle)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local function Update(object, _, unit)
local _, instanceType = IsInInstance()
if instanceType ~= "arena" then
object.AuraTracker:Hide()
return
else
object.AuraTracker:Show()
end
if object.unit ~= unit then return end
local auraList = T.ArenaControl
local priority = 0
local auraName, auraIcon, auraExpTime
local index = 1
-- Buffs
while true do
local name, icon, _, _, _, expirationTime = UnitAura(unit, index, "HELPFUL")
if not name then break end
if auraList[name] and auraList[name] >= priority then
priority = auraList[name]
auraName = name
auraIcon = icon
auraExpTime = expirationTime
end
index = index + 1
end
index = 1
-- Debuffs
while true do
local name, icon, _, _, _, expirationTime = UnitAura(unit, index, "HARMFUL")
if not name then break end
if auraList[name] and auraList[name] >= priority then
priority = auraList[name]
auraName = name
auraIcon = icon
auraExpTime = expirationTime
end
index = index + 1
end
if auraName then -- If an aura is found, display it and set the time left!
object.AuraTracker.icon:SetTexture(auraIcon)
object.AuraTracker.timeleft = auraExpTime - GetTime()
if object.AuraTracker.timeleft > 0 then
object.AuraTracker.active = true
end
elseif not auraName then -- No aura found and one is shown? Kill it since it's no longer active!
object.AuraTracker.icon:SetTexture("")
object.AuraTracker.text:SetText("")
object.AuraTracker.active = false
end
end
local function Enable(object)
-- If we're not highlighting this unit return
if not object.AuraTracker then return end
-- Make sure aura scanning is active for this object
object:RegisterEvent("UNIT_AURA", Update)
return true
end
local function Disable(object)
if object.AuraTracker then
object:UnregisterEvent("UNIT_AURA", Update)
end
end
oUF:AddElement("AuraTracker", Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/AuraWatch.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.raidframe.plugins_aura_watch ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_AuraWatch(by Astromech)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local GUIDs = {}
local PLAYER_UNITS = {
player = true,
vehicle = true,
pet = true,
}
local setupGUID
do
local cache = setmetatable({}, {__type = "k"})
local frame = CreateFrame("Frame")
frame:SetScript("OnEvent", function()
for k,t in pairs(GUIDs) do
GUIDs[k] = nil
for a in pairs(t) do
t[a] = nil
end
cache[t] = true
end
end)
frame:RegisterEvent("PLAYER_REGEN_ENABLED")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
function setupGUID(guid)
local t = next(cache)
if t then
cache[t] = nil
else
t = {}
end
GUIDs[guid] = t
end
end
local function resetIcon(icon, count, duration, remaining)
icon:Show()
if icon.cd then
if duration and duration > 0 then
icon.cd:SetCooldown(remaining - duration, duration)
icon.cd:Show()
else
icon.cd:Hide()
end
end
if icon.count then
icon.count:SetText((count > 1 and count or ""))
end
icon:SetAlpha(1)
end
local function expireIcon(icon)
if icon.cd then icon.cd:Hide() end
if icon.count then icon.count:SetText() end
icon:SetAlpha(0)
icon:Show()
end
local found = {}
local function Update(frame, _, unit)
if frame.unit ~= unit then return end
local watch = frame.AuraWatch
local index, icons = 1, watch.watched
local _, name, count, duration, remaining, caster, key, icon, spellID
local filter = "HELPFUL"
local guid = UnitGUID(unit)
if not guid then return end
if not GUIDs[guid] then setupGUID(guid) end
for _, icon in pairs(icons) do
icon:Hide()
end
while true do
name, _, count, _, duration, remaining, caster, _, _, spellID = UnitAura(unit, index, filter)
if not name then
if filter == "HELPFUL" then
filter = "HARMFUL"
index = 1
else
break
end
else
if watch.strictMatching then
key = spellID
else
key = name
end
icon = icons[key]
if icon and not T.RaidBuffsIgnore[spellID] and (icon.anyUnit or (caster and icon.fromUnits and icon.fromUnits[caster])) then
resetIcon(icon, count, duration, remaining)
GUIDs[guid][key] = true
found[key] = true
end
index = index + 1
end
end
for key in pairs(GUIDs[guid]) do
if icons[key] and not found[key] then
expireIcon(icons[key])
end
end
for k in pairs(found) do
found[k] = nil
end
end
local function setupIcons(self)
local watch = self.AuraWatch
local icons = watch.icons
watch.watched = {}
for _, icon in pairs(icons) do
local name, _, image = GetSpellInfo(icon.spellID)
if name then
icon.name = name
if not icon.cd and not (watch.hideCooldown or icon.hideCooldown) then
local cd = CreateFrame("Cooldown", nil, icon, "CooldownFrameTemplate")
cd:SetAllPoints(icon)
cd:SetDrawEdge(false)
icon.cd = cd
end
if not icon.icon then
local tex = icon:CreateTexture(nil, "BACKGROUND")
tex:SetAllPoints(icon)
tex:SetTexture(image)
icon.icon = tex
end
if not icon.count and not (watch.hideCount or icon.hideCount) then
local count = icon:CreateFontString(nil, "OVERLAY")
count:SetFontObject(NumberFontNormal)
count:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", -1, 0)
icon.count = count
end
if icon.fromUnits == nil then
icon.fromUnits = watch.fromUnits or PLAYER_UNITS
end
if icon.anyUnit == nil then
icon.anyUnit = watch.anyUnit
end
if watch.strictMatching then
watch.watched[icon.spellID] = icon
else
watch.watched[name] = icon
end
if watch.PostCreateIcon then watch:PostCreateIcon(icon, icon.spellID, name, self) end
else
print("|cffff0000WARNING: spell ID ["..tostring(icon.spellID).."] no longer exists! Report this to Shestak.|r")
end
end
end
local function Enable(self)
if self.AuraWatch then
self:RegisterEvent("UNIT_AURA", Update)
setupIcons(self)
return true
else
return false
end
end
local function Disable(self)
if self.AuraWatch then
self:UnregisterEvent("UNIT_AURA", Update)
for _, icon in pairs(self.AuraWatch.icons) do
icon:Hide()
end
end
end
oUF:AddElement("AuraWatch", Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/AutoResurrect.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.raidframe.plugins_auto_resurrection ~= true or C.misc.click_cast == true or T.class == "DEMONHUNTER" or T.class == "HUNTER" or T.class == "MAGE" or T.class == "ROGUE" or T.class == "WARRIOR" then return end
----------------------------------------------------------------------------------------
-- Based on FreebAutoRez(by Freebaser)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local classList = {
["DEATHKNIGHT"] = {
combat = GetSpellInfo(61999), -- Raise Ally
},
["DRUID"] = {
combat = GetSpellInfo(20484), -- Rebirth
ooc = GetSpellInfo(50769), -- Revive
},
["EVOKER"] = {
ooc = GetSpellInfo(361227), -- Return
},
["MONK"] = {
ooc = GetSpellInfo(115178), -- Resuscitate
},
["PALADIN"] = {
combat = GetSpellInfo(391054), -- Intercession
ooc = GetSpellInfo(7328), -- Redemption
},
["PRIEST"] = {
ooc = GetSpellInfo(2006), -- Resurrection
},
["SHAMAN"] = {
ooc = GetSpellInfo(2008), -- Ancestral Spirit
},
["WARLOCK"] = {
combat = GetSpellInfo(6203), -- Soulstone
ooc = GetSpellInfo(6203), -- Soulstone
},
}
local body = ""
local function macroBody(class)
local combatspell = classList[class].combat
local oocspell = classList[class].ooc
body = "/stopmacro [@mouseover,nodead]\n"
if combatspell then
body = body.."/use [combat,@mouseover,help,dead] "..combatspell.."; "
if oocspell then
body = body.."[@mouseover,help,dead] "..oocspell.."; "
end
if class == "WARLOCK" then
local name = GetSpellInfo(6203)
body = body.."\n/use "..name.."\n "
end
elseif oocspell then
body = body.."/use [@mouseover,help,dead] "..oocspell.."; "
end
return body
end
local Enable = function(self)
local _, class = UnitClass("player")
if not class then return end
if classList[class] and not IsAddOnLoaded("Clique") and not InCombatLockdown() then
self:SetAttribute("*type3", "macro")
self:SetAttribute("macrotext3", macroBody(class))
return true
end
end
local Disable = function(self)
self:SetAttribute("*type3", nil)
end
oUF:AddElement("AutoResurrect", nil, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/CombatFeedback.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.plugins_combat_feedback ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_CombatFeedback(by Ammo)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local damage_format = "-%d"
local heal_format = "+%d"
local maxAlpha = 0.6
local updateFrame
local feedback = {}
local color
local colors = {
STANDARD = {1, 1, 1},
-- Damage
IMMUNE = {1, 1, 1},
DAMAGE = {1, 0, 0},
CRUSHING = {1, 0, 0},
CRITICAL = {1, 0, 0},
GLANCING = {1, 0, 0},
ABSORB = {1, 1, 1},
BLOCK = {1, 1, 1},
MISS = {1, 1, 1},
-- Heal
HEAL = {0, 1, 0},
CRITHEAL = {0, 1, 0},
-- Energize
ENERGIZE = {0.41, 0.8, 0.94},
CRITENERGIZE = {0.41, 0.8, 0.94},
}
local function createUpdateFrame()
if updateFrame then return end
updateFrame = CreateFrame("Frame")
updateFrame:Hide()
updateFrame:SetScript("OnUpdate", function()
if next(feedback) == nil then
updateFrame:Hide()
return
end
for object, startTime in pairs(feedback) do
local maxalpha = object.CombatFeedbackText.maxAlpha
local elapsedTime = GetTime() - startTime
if elapsedTime < COMBATFEEDBACK_FADEINTIME then
local alpha = maxalpha * (elapsedTime / COMBATFEEDBACK_FADEINTIME)
object.CombatFeedbackText:SetAlpha(alpha)
elseif elapsedTime < (COMBATFEEDBACK_FADEINTIME + COMBATFEEDBACK_HOLDTIME) then
object.CombatFeedbackText:SetAlpha(maxalpha)
elseif elapsedTime < (COMBATFEEDBACK_FADEINTIME + COMBATFEEDBACK_HOLDTIME + COMBATFEEDBACK_FADEOUTTIME) then
local alpha = maxalpha - maxalpha * ((elapsedTime - COMBATFEEDBACK_HOLDTIME - COMBATFEEDBACK_FADEINTIME) / COMBATFEEDBACK_FADEOUTTIME)
object.CombatFeedbackText:SetAlpha(alpha)
else
object.CombatFeedbackText:Hide()
feedback[object] = nil
end
end
end)
end
local function combat(self, event, unit, eventType, flags, amount)
if unit ~= self.unit then return end
if unit == "vehicle" then return end
local FeedbackText = self.CombatFeedbackText
local fColors = FeedbackText.colors
local font, fontHeight, fontFlags = C.font.combat_text_font, C.font.combat_text_font_size, C.font.combat_text_font_style
local text, arg
color = fColors and fColors.STANDARD or colors.STANDARD
if eventType == "IMMUNE" and not FeedbackText.ignoreImmune then
color = fColors and fColors.IMMUNE or colors.IMMUNE
fontHeight = fontHeight
text = CombatFeedbackText[eventType]
elseif eventType == "WOUND" and not FeedbackText.ignoreDamage then
if amount ~= 0 then
if flags == "CRITICAL" then
color = fColors and fColors.CRITICAL or colors.CRITICAL
fontHeight = fontHeight
elseif flags == "CRUSHING" then
color = fColors and fColors.CRUSING or colors.CRUSHING
fontHeight = fontHeight
elseif flags == "GLANCING" then
color = fColors and fColors.GLANCING or colors.GLANCING
fontHeight = fontHeight
else
color = fColors and fColors.DAMAGE or colors.DAMAGE
end
text = damage_format
arg = amount
elseif flags == "ABSORB" then
color = fColors and fColors.ABSORB or colors.ABSORB
fontHeight = fontHeight
text = CombatFeedbackText["ABSORB"]
elseif flags == "BLOCK" then
color = fColors and fColors.BLOCK or colors.BLOCK
fontHeight = fontHeight
text = CombatFeedbackText["BLOCK"]
else
color = fColors and fColors.MISS or colors.MISS
text = CombatFeedbackText["MISS"]
end
elseif eventType == "BLOCK" and not FeedbackText.ignoreDamage then
color = fColors and fColors.BLOCK or colors.BLOCK
fontHeight = fontHeight
text = CombatFeedbackText[eventType]
elseif eventType == "HEAL" and not FeedbackText.ignoreHeal then
text = heal_format
arg = amount
if flags == "CRITICAL" then
color = fColors and fColors.CRITHEAL or colors.CRITHEAL
fontHeight = fontHeight
else
color = fColors and fColors.HEAL or colors.HEAL
end
elseif event == "ENERGIZE" and not FeedbackText.ignoreEnergize then
text = amount
if flags == "CRITICAL" then
color = fColors and fColors.ENERGIZE or colors.ENERGIZE
fontHeight = fontHeight
else
color = fColors and fColors.CRITENERGIZE or colors.CRITENERGIZE
end
elseif not FeedbackText.ignoreOther then
text = CombatFeedbackText[eventType]
end
if text then
FeedbackText:SetFont(font, fontHeight, fontFlags)
FeedbackText:SetFormattedText(text, arg)
FeedbackText:SetTextColor(unpack(color))
FeedbackText:SetAlpha(0)
FeedbackText:Show()
feedback[self] = GetTime()
updateFrame:Show()
end
end
local function addCombat(object)
if not object.CombatFeedbackText then return end
local _, fontHeight = object.CombatFeedbackText:GetFont()
object.CombatFeedbackText.origHeight = fontHeight
object.CombatFeedbackText.maxAlpha = object.CombatFeedbackText.maxAlpha or maxAlpha
createUpdateFrame()
object:RegisterEvent("UNIT_COMBAT", combat)
end
for _, object in ipairs(oUF.objects) do addCombat(object) end
oUF:RegisterInitCallback(addCombat)
================================================
FILE: ShestakUI/Libs/oUF/Modules/ComboPoints.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true then return end
local _, ns = ...
local oUF = ns.oUF
local MAX_COMBO_POINTS = MAX_COMBO_POINTS
local function Update(self, _, unit, powerType)
if(self.unit ~= unit and (powerType and (powerType ~= "COMBO_POINTS"))) then return end
local element = self.ComboPoints
local cur, max
if UnitHasVehicleUI("player") then
cur = UnitPower("vehicle", 4)
max = UnitPowerMax("vehicle", 4)
else
cur = UnitPower("player", 4)
max = UnitPowerMax("player", 4)
end
if max == 0 or max > 7 then
max = MAX_COMBO_POINTS
end
local spacing = select(4, element[5]:GetPoint())
local w = element:GetWidth()
local s = 0
if element.max ~= max then
if max == 7 then
element[7]:Show()
element[6]:Show()
elseif max == 6 then
element[7]:Hide()
element[6]:Show()
else
element[7]:Hide()
element[6]:Hide()
end
for i = 1, max do
if i ~= max then
element[i]:SetWidth(w / max - spacing)
s = s + (w / max)
else
element[i]:SetWidth(w - s)
end
end
element.max = max
end
for i = 1, max do
if i <= cur then
element[i]:SetAlpha(1)
else
element[i]:SetAlpha(0.2)
end
end
if T.class == "ROGUE" then
for i = 2, 5 do
element[i]:SetStatusBarColor(unpack(element.Colors[i]))
end
local chargedPoints = GetUnitChargedPowerPoints("player")
if chargedPoints then
for _, chargedIndex in next, chargedPoints do
element[chargedIndex]:SetStatusBarColor(unpack(element.Colors[8]))
if element[chargedIndex]:GetAlpha() == 0.2 then
element[chargedIndex]:SetAlpha(0.5)
end
end
end
end
if C.unitframe_class_bar.combo_old == true or (T.class ~= "DRUID" and T.class ~= "ROGUE") then
if element[1]:GetAlpha() == 1 then
for i = 1, max do
element:Show()
element[i]:Show()
end
else
for i = 1, max do
element:Hide()
element[i]:Hide()
end
end
if element[1]:IsShown() then
if self.Auras then self.Auras:SetPoint("BOTTOMLEFT", self, "TOPLEFT", -2, 19) end
else
if self.Auras then self.Auras:SetPoint("BOTTOMLEFT", self, "TOPLEFT", -2, 5) end
end
end
end
local function Path(self, ...)
return (self.ComboPoints.Override or Update) (self, ...)
end
local function Visibility(self)
local element = self.ComboPoints
local form = GetShapeshiftFormID()
if form == CAT_FORM or (UnitHasVehicleUI("player") and UnitPower("vehicle", 4) > 0) then
element:Show()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19) end
else
element:Hide()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 5) end
end
end
local function ForceUpdate(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit, "COMBO_POINTS")
end
local Enable = function(self)
local element = self.ComboPoints
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
element.Colors = {
[1] = {0.9, 0.1, 0.1},
[2] = {0.9, 0.1, 0.1},
[3] = {0.9, 0.9, 0.1},
[4] = {0.9, 0.9, 0.1},
[5] = {0.1, 0.9, 0.1},
[6] = {0.1, 0.9, 0.1},
[7] = {0.1, 0.9, 0.1},
[8] = {0.33, 0.73, 1}, -- Echoing Reprimand
}
self:RegisterEvent("UNIT_POWER_UPDATE", Path, true)
self:RegisterEvent("UNIT_MAXPOWER", Path, true)
self:RegisterEvent("PLAYER_TARGET_CHANGED", Path, true)
if T.class == "DRUID" and C.unitframe_class_bar.combo_always ~= true and C.unitframe_class_bar.combo_old ~= true then
element.handler = CreateFrame("Frame", nil, element)
element.handler:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
element.handler:RegisterEvent("PLAYER_ENTERING_WORLD")
element.handler:SetScript("OnEvent", function() Visibility(self) end)
end
for i = 1, 7 do
element[i]:SetStatusBarColor(unpack(element.Colors[i]))
end
return true
end
end
local Disable = function(self)
local element = self.ComboPoints
if(element) then
self:UnregisterEvent("UNIT_POWER_UPDATE", Path)
self:UnregisterEvent("UNIT_MAXPOWER", Path)
self:UnregisterEvent("PLAYER_TARGET_CHANGED", Path)
element.handler:UnregisterEvent("UPDATE_SHAPESHIFT_FORM")
element.handler:UnregisterEvent("PLAYER_ENTERING_WORLD")
end
end
oUF:AddElement("ComboPoints", Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/CounterBar.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_CounterBar(by p3lim)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local OnUpdate = function(self, elapsed)
self.expiration = self.expiration - elapsed
self:SetValue(self.expiration)
end
local Update = function(self, _, unit)
if self.unit ~= unit then return end
local counterbar = self.CounterBar
if counterbar.PreUpdate then
counterbar:PreUpdate()
end
-- We just use 1 as index for now, since there currently is no more bars in use
local max, expiration, barID = UnitPowerBarTimerInfo(unit, 1)
if not barID then
counterbar:Hide()
else
counterbar.expiration = expiration - GetTime()
counterbar:SetMinMaxValues(0, max)
counterbar:Show()
end
if counterbar.PostUpdate then
-- Not sure what to pass here, since this event only fires on show/hide
return counterbar:PostUpdate()
end
end
local Path = function(self, ...)
return (self.CounterBar.Override or Update) (self, ...)
end
local ForceUpdate = function(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit)
end
local Enable = function(self, unit)
local counterbar = self.CounterBar
if counterbar then
counterbar.__owner = self
counterbar.ForceUpdate = ForceUpdate
self:RegisterEvent("UNIT_POWER_BAR_TIMER_UPDATE", Path)
counterbar:SetScript("OnUpdate", counterbar.OnUpdate or OnUpdate)
counterbar:Hide()
if unit == "player" then
PlayerBuffTimerManager:UnregisterEvent("UNIT_POWER_BAR_TIMER_UPDATE")
PlayerBuffTimerManager:UnregisterEvent("PLAYER_ENTERING_WORLD")
-- These events handles all the various alternative power bars,
-- so unregistering them might not be the optimal solution
PlayerPowerBarAlt:UnregisterEvent("UNIT_POWER_BAR_SHOW")
PlayerPowerBarAlt:UnregisterEvent("UNIT_POWER_BAR_HIDE")
end
if counterbar:IsObjectType("StatusBar") and not counterbar:GetStatusBarTexture() then
counterbar:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
end
return true
end
end
local Disable = function(self, unit)
local counterbar = self.CounterBar
if counterbar then
self:UnregisterEvent("UNIT_POWER_BAR_TIMER_UPDATE", Path)
counterbar:SetScript("OnUpdate", nil)
if unit == "player" then
PlayerBuffTimerManager:RegisterEvent("UNIT_POWER_BAR_TIMER_UPDATE")
PlayerBuffTimerManager:RegisterEvent("PLAYER_ENTERING_WORLD")
end
end
end
oUF:AddElement("CounterBar", Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/DebuffHighlight.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_DebuffHighlight(by Ammo)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
T.CanDispel = {
DRUID = {Magic = false, Curse = true, Poison = true},
EVOKER = {Magic = false, Curse = true, Poison = true, Disease = true},
MAGE = {Curse = true},
MONK = {Magic = false, Poison = true, Disease = true},
PALADIN = {Magic = false, Poison = true, Disease = true},
PRIEST = {Magic = false, Disease = true},
SHAMAN = {Magic = false, Curse = true}
}
local dispellist = T.CanDispel[T.class] or {}
local origColors = {}
local origBorderColors = {}
local function GetDebuffType(unit, filter)
if not UnitCanAssist("player", unit) then return nil end
local i = 1
while true do
local _, texture, _, debufftype = UnitAura(unit, i, "HARMFUL")
if not texture then break end
if debufftype and not filter or (filter and dispellist[debufftype]) then
return debufftype, texture
end
i = i + 1
end
end
local function CheckSpec()
local spec = GetSpecialization()
if T.class == "DRUID" then
if spec == 4 then
dispellist.Magic = true
else
dispellist.Magic = false
end
elseif T.class == "MONK" then
if spec == 2 then
dispellist.Magic = true
else
dispellist.Magic = false
end
elseif T.class == "PALADIN" then
if spec == 1 then
dispellist.Magic = true
else
dispellist.Magic = false
end
elseif T.class == "PRIEST" then
if spec == 3 then
dispellist.Magic = false
else
dispellist.Magic = true
end
elseif T.class == "SHAMAN" then
if spec == 3 then
dispellist.Magic = true
else
dispellist.Magic = false
end
end
end
local function Update(object, _, unit)
if object.unit ~= unit then return end
local debuffType, texture = GetDebuffType(unit, object.DebuffHighlightFilter)
if debuffType then
local color = DebuffTypeColor[debuffType]
if object.DebuffHighlightBackdrop or object.DebuffHighlightBackdropBorder then
if object.DebuffHighlightBackdrop then
object:SetBackdropColor(color.r, color.g, color.b, object.DebuffHighlightAlpha or 1)
end
if object.DebuffHighlightBackdropBorder then
object:SetBackdropBorderColor(color.r, color.g, color.b, object.DebuffHighlightAlpha or 1)
end
elseif object.DebuffHighlightUseTexture then
object.DebuffHighlight:SetTexture(texture)
else
object.DebuffHighlight:SetVertexColor(color.r, color.g, color.b, object.DebuffHighlightAlpha or 0.5)
end
else
if object.DebuffHighlightBackdrop or object.DebuffHighlightBackdropBorder then
local color
if object.DebuffHighlightBackdrop then
color = origColors[object]
object:SetBackdropColor(color.r, color.g, color.b, color.a)
end
if object.DebuffHighlightBackdropBorder then
color = origBorderColors[object]
object:SetBackdropBorderColor(color.r, color.g, color.b, color.a)
end
elseif object.DebuffHighlightUseTexture then
object.DebuffHighlight:SetTexture(nil)
else
local color = origColors[object]
object.DebuffHighlight:SetVertexColor(color.r, color.g, color.b, color.a)
end
end
end
local function Enable(object)
-- If we're not highlighting this unit return
if not object.DebuffHighlightBackdrop and not object.DebuffHighlightBackdropBorder and not object.DebuffHighlight then
return
end
-- If we're filtering highlights and we're not of the dispelling type, return
if object.DebuffHighlightFilter and not T.CanDispel[T.class] then
return
end
-- Make sure aura scanning is active for this object
object:RegisterEvent("UNIT_AURA", Update)
object:RegisterEvent("PLAYER_TALENT_UPDATE", CheckSpec, true)
CheckSpec()
if object.DebuffHighlightBackdrop or object.DebuffHighlightBackdropBorder then
local r, g, b, a = object:GetBackdropColor()
origColors[object] = {r = r, g = g, b = b, a = a}
r, g, b, a = object:GetBackdropBorderColor()
origBorderColors[object] = {r = r, g = g, b = b, a = a}
elseif not object.DebuffHighlightUseTexture then
local r, g, b, a = object.DebuffHighlight:GetVertexColor()
origColors[object] = {r = r, g = g, b = b, a = a}
end
return true
end
local function Disable(object)
if object.DebuffHighlightBackdrop or object.DebuffHighlightBackdropBorder or object.DebuffHighlight then
object:UnregisterEvent("UNIT_AURA", Update)
object:UnregisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
end
end
oUF:AddElement("DebuffHighlight", Update, Enable, Disable)
for _, frame in ipairs(oUF.objects) do Enable(frame) end
================================================
FILE: ShestakUI/Libs/oUF/Modules/EnemySpec.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.plugins_enemy_spec ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_Talents(by Fernir)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local function Update(object, _, unit)
if object.unit ~= unit or unit == "player" or unit:find("pet") then return end
object.EnemySpec:SetText("")
if UnitIsFriend("player", unit) or not UnitIsPlayer(unit) then return end
local _, instanceType = IsInInstance()
if instanceType == "pvp" then
for i = 1, GetNumBattlefieldScores() do
local name, _, _, _, _, _, _, _, _, _, _, _, _, _, _, talentSpec = GetBattlefieldScore(i)
if GetUnitName(unit, true) == name then
object.EnemySpec:SetText(talentSpec)
end
end
elseif instanceType == "arena" then
local ID = object.unit:match('arena(%d)') or object:GetID() or 0
local specID = GetArenaOpponentSpec(tonumber(ID))
if specID and specID > 0 then
local _, name = GetSpecializationInfoByID(specID)
object.EnemySpec:SetText(name)
end
end
end
local function Enable(object)
if not object.EnemySpec then return end
object:RegisterEvent("UPDATE_BATTLEFIELD_SCORE", Update, true)
object:RegisterEvent("ARENA_OPPONENT_UPDATE", Update, true)
return true
end
local function Disable(object)
if object.EnemySpec then
object:UnregisterEvent("UPDATE_BATTLEFIELD_SCORE", Update)
object:UnregisterEvent("ARENA_OPPONENT_UPDATE", Update)
end
end
oUF:AddElement("EnemySpec", Update, Enable, Disable)
for _, frame in ipairs(oUF.objects) do Enable(frame) end
================================================
FILE: ShestakUI/Libs/oUF/Modules/Essence.lua
================================================
if(select(2, UnitClass("player")) ~= "EVOKER") then return end
--[[ Written for ViksUI by Vik, but should work as normal plugin for oUF
## Example
-- Essence Charges (Devastation Evoker)
lib.addEssence = function(self)
if T.class == "EVOKER" then
-- Essence bar
if C.unitframe_class_bar.essence == true then
self.Essence = CreateFrame("Frame", self:GetName().."_Essence", self, "BackdropTemplate", "BackdropTemplate")
local maxEssence = UnitPowerMax(self.unit, Enum.PowerType.Essence)
self.Essence:CreateBackdrop("Default")
self.Essence:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 1,7)
self.Essence:SetHeight(7)
self.Essence:SetWidth(self:GetWidth()-2)
for i = 1, 6 do
self.Essence[i] = CreateFrame("StatusBar", self:GetName().."_Essence"..i, self.Essence, "BackdropTemplate")
self.Essence[i]:SetSize(213 / 10, 7)
if i == 1 then
self.Essence[i]:SetPoint("LEFT", self.Essence)
else
self.Essence[i]:SetPoint("TOPLEFT", self.Essence[i-1], "TOPRIGHT", 1, 0)
end
self.Essence[i]:SetStatusBarTexture(C.media.texture)
self.Essence[i]:SetStatusBarColor(0.4, 0.8, 1)
self.Essence[i].bg = self.Essence[i]:CreateTexture(nil, "BORDER")
self.Essence[i].bg:SetAllPoints()
self.Essence[i].bg:SetTexture(C.media.texture)
self.Essence[i].bg:SetVertexColor(0.4, 0.8, 1, 0.2)
end
end
end
end
]]--
local _, ns = ...
local oUF = ns.oUF
local SPELL_POWER_ESSENCE = Enum.PowerType.Essence
local function Update(self, _, unit, powerType)
if(self.unit ~= unit or (powerType and powerType ~= "ESSENCE")) then return end
local maxEssence = UnitPowerMax(self.unit, Enum.PowerType.Essence)
local element = self.Essence
if(element.PreUpdate) then
element:PreUpdate(unit)
end
if UnitHasVehicleUI("player") then
element:Hide()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 5) end
else
element:Show()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19) end
end
local cur = UnitPower("player", SPELL_POWER_ESSENCE)
local max = maxEssence
local spacing = select(4, element[5]:GetPoint())
local w = element:GetWidth()
local s = 0
if element.max ~= max then
if max == 6 then
element[6]:Show()
element[5]:Show()
else
element[6]:Hide()
element[5]:Show()
end
for i = 1, max do
if i ~= max then
element[i]:SetWidth(w / max - spacing)
s = s + (w / max)
else
element[i]:SetWidth(w - s)
end
end
element.max = max
end
for i = 1, max do
if(i <= cur) then
element[i]:SetAlpha(1)
else
element[i]:SetAlpha(0.2)
end
end
if(element.PostUpdate) then
return element:PostUpdate(cur)
end
end
local function Path(self, ...)
return (self.Essence.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit, "ESSENCE")
end
local function Visibility(self)
local element = self.Essence
if not UnitHasVehicleUI("player") then
element:Show()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19) end
end
self:RegisterEvent("UNIT_POWER_UPDATE", Path)
end
local function Enable(self)
local element = self.Essence
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent("UNIT_POWER_UPDATE", Path, true)
self:RegisterEvent("UNIT_MAXPOWER", Path, true)
self:RegisterEvent("PLAYER_TARGET_CHANGED", Path, true)
element.handler = CreateFrame("Frame", nil, element)
element.handler:RegisterEvent("PLAYER_TALENT_UPDATE")
element.handler:RegisterEvent("PLAYER_ENTERING_WORLD")
element.handler:SetScript("OnEvent", function() Visibility(self) end)
return true
end
end
local function Disable(self)
local element = self.Essence
if(element) then
self:UnregisterEvent("UNIT_POWER_UPDATE", Path)
self:UnregisterEvent("UNIT_MAXPOWER", Path)
self:UnregisterEvent("PLAYER_TARGET_CHANGED", Path)
element.handler:UnregisterEvent("PLAYER_TALENT_UPDATE")
element.handler:UnregisterEvent("PLAYER_ENTERING_WORLD")
end
end
oUF:AddElement("Essence", Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/Experience.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.plugins_experience_bar ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_Experience(by p3lim)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF or oUF
assert(oUF, 'oUF Experience was unable to locate oUF install')
local math_floor = math.floor
oUF.colors.experience = {
{0.58, 0, 0.55}, -- Normal
{0, 0.39, 0.88}, -- Rested
}
oUF.colors.honor = {
{1, 0.71, 0}, -- Normal
}
local function IsPlayerMaxLevel()
local maxLevel = GetRestrictedAccountData()
if(maxLevel == 0) then
maxLevel = GetMaxLevelForPlayerExpansion()
end
return maxLevel == UnitLevel('player')
end
local function IsPlayerMaxHonorLevel()
return not C_PvP.GetNextHonorLevelForReward(UnitHonorLevel('player'))
end
local function ShouldShowHonor()
return IsPlayerMaxLevel() and (IsWatchingHonorAsXP() or C_PvP.IsActiveBattlefield() or IsInActiveWorldPVP())
end
local function GetValues()
local isHonor = ShouldShowHonor()
local cur = (isHonor and UnitHonor or UnitXP)('player')
local max = (isHonor and UnitHonorMax or UnitXPMax)('player')
local level = (isHonor and UnitHonorLevel or UnitLevel)('player')
local rested = not isHonor and (GetXPExhaustion() or 0) or 0
local perc = math_floor(cur / max * 100 + 0.5)
local restedPerc = math_floor(rested / max * 100 + 0.5)
return cur, max, perc, rested, restedPerc, level, isHonor
end
-- Changed tooltip for ShestakUI
local function UpdateTooltip()
local cur, max, perc, rested, restedPerc, level, isHonor = GetValues()
GameTooltip:SetText(isHonor and HONOR_LEVEL_LABEL:format(level) or COMBAT_XP_GAIN.." "..format(LEVEL_GAINED, T.level), 0.40, 0.78, 1)
GameTooltip:AddLine(" ")
GameTooltip:AddLine(format(L_STATS_CURRENT_XP..": %s / %s (%d%%)", BreakUpLargeNumbers(cur), BreakUpLargeNumbers(max), perc), 0.75, 0.9, 1)
GameTooltip:AddLine(format(L_STATS_REMAINING_XP..": %s (%d%%)", BreakUpLargeNumbers(max - cur), (max - cur) / max * 100 + 0.5), 0.75, 0.9, 1)
if(rested > 0) then
GameTooltip:AddLine(format('%s: %s (%d%%)', L_STATS_RESTED_XP, BreakUpLargeNumbers(rested), restedPerc), 0.75, 0.9, 1)
end
GameTooltip:Show()
end
local function OnEnter(element)
element:SetAlpha(element.inAlpha)
GameTooltip:SetOwner(element, "ANCHOR_BOTTOM", 0, -5) -- ShestakUI
UpdateTooltip(element)
end
local function OnLeave(element)
GameTooltip:Hide()
element:SetAlpha(element.outAlpha)
end
local function OnMouseUp(element, btn)
if btn == "MiddleButton" then
if element.outAlpha == 0 then
element.outAlpha = 1
ShestakUISettings.Experience = true
else
element.outAlpha = 0
ShestakUISettings.Experience = false
end
end
end
local function CheckAlpha(element)
if ShestakUISettings and ShestakUISettings.Experience == true then
element.outAlpha = 1
element:SetAlpha(element.outAlpha or 1)
end
end
local function UpdateColor(element, isHonor, isRested)
local colors = element.__owner.colors
if(isHonor) then
colors = colors.honor
else
colors = colors.experience
end
local r, g, b = unpack(colors[isRested and 2 or 1])
element:SetStatusBarColor(r, g, b)
element.bg:SetVertexColor(r, g, b, 0.2) -- ShestakUI
if(element.SetAnimatedTextureColors) then
element:SetAnimatedTextureColors(r, g, b)
end
if(element.Rested) then
element.Rested:SetStatusBarColor(r, g, b, element.restedAlpha)
end
end
local function Update(self, event, unit)
if(self.unit ~= unit or unit ~= 'player') then return end
local element = self.Experience
if(element.PreUpdate) then element:PreUpdate(unit) end
local cur, max, _, rested, _, level, isHonor = GetValues()
if(element.SetAnimatedValues) then
element:SetAnimatedValues(cur, 0, max, level)
else
element:SetMinMaxValues(0, max)
element:SetValue(cur)
end
if(element.Rested) then
element.Rested:SetMinMaxValues(0, max)
element.Rested:SetValue(math.min(cur + rested, max))
end
(element.OverrideUpdateColor or UpdateColor)(element, isHonor, rested > 0)
if(element.PostUpdate) then
return element:PostUpdate(unit, cur, max, rested, level, isHonor)
end
end
local function Path(self, ...)
return (self.Experience.Override or Update) (self, ...)
end
local function ElementEnable(self)
local element = self.Experience
self:RegisterEvent('PLAYER_XP_UPDATE', Path, true)
self:RegisterEvent('HONOR_XP_UPDATE', Path, true)
self:RegisterEvent('ZONE_CHANGED', Path, true)
self:RegisterEvent('ZONE_CHANGED_NEW_AREA', Path, true)
if(element.Rested) then
self:RegisterEvent('UPDATE_EXHAUSTION', Path, true)
end
element:Show()
element:SetAlpha(element.outAlpha or 1)
Path(self, 'ElementEnable', 'player')
end
local function ElementDisable(self)
self:UnregisterEvent('PLAYER_XP_UPDATE', Path)
self:UnregisterEvent('HONOR_XP_UPDATE', Path)
self:UnregisterEvent('ZONE_CHANGED', Path)
self:UnregisterEvent('ZONE_CHANGED_NEW_AREA', Path)
if(self.Experience.Rested) then
self:UnregisterEvent('UPDATE_EXHAUSTION', Path)
end
self.Experience:Hide()
Path(self, 'ElementDisable', 'player')
end
local function Visibility(self, event, unit)
local shouldEnable
if(not UnitHasVehicleUI('player')) then
if(not IsPlayerMaxLevel() and not IsXPUserDisabled()) then
shouldEnable = true
elseif(ShouldShowHonor() and not IsPlayerMaxHonorLevel()) then
shouldEnable = true
end
end
if(shouldEnable) then
ElementEnable(self)
else
ElementDisable(self)
end
end
local function VisibilityPath(self, ...)
return (self.Experience.OverrideVisibility or Visibility)(self, ...)
end
local function ForceUpdate(element)
return VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self, unit)
local element = self.Experience
if(element and unit == 'player') then
element.__owner = self
element.ForceUpdate = ForceUpdate
element.restedAlpha = element.restedAlpha or 0.15
self:RegisterEvent('PLAYER_LEVEL_UP', VisibilityPath, true)
self:RegisterEvent('HONOR_LEVEL_UPDATE', VisibilityPath, true)
self:RegisterEvent('DISABLE_XP_GAIN', VisibilityPath, true)
self:RegisterEvent('ENABLE_XP_GAIN', VisibilityPath, true)
self:RegisterEvent('UPDATE_EXPANSION_LEVEL', VisibilityPath, true)
hooksecurefunc('SetWatchingHonorAsXP', function()
if(self:IsElementEnabled('Experience')) then
VisibilityPath(self, 'SetWatchingHonorAsXP', 'player')
end
end)
local child = element.Rested
if(child) then
child:SetFrameLevel(element:GetFrameLevel() - 1)
if(not child:GetStatusBarTexture()) then
child:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
end
if(not element:GetStatusBarTexture()) then
element:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
if(element:IsMouseEnabled()) then
element.tooltipAnchor = element.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'
element.inAlpha = element.inAlpha or 1
element.outAlpha = element.outAlpha or 1
if(not element:GetScript('OnEnter')) then
element:SetScript('OnEnter', OnEnter)
end
if(not element:GetScript('OnLeave')) then
element:SetScript('OnLeave', OnLeave)
end
if(not element:GetScript('OnMouseUp')) then
element:SetScript('OnMouseUp', OnMouseUp)
end
element.handler = CreateFrame("Frame", nil, element)
element.handler:RegisterEvent("PLAYER_LOGIN")
element.handler:SetScript("OnEvent", function() CheckAlpha(element) end)
end
return true
end
end
local function Disable(self)
local element = self.Experience
if(element) then
self:UnregisterEvent('PLAYER_LEVEL_UP', VisibilityPath)
self:UnregisterEvent('HONOR_LEVEL_UPDATE', VisibilityPath)
self:UnregisterEvent('DISABLE_XP_GAIN', VisibilityPath)
self:UnregisterEvent('ENABLE_XP_GAIN', VisibilityPath)
self:UnregisterEvent('UPDATE_EXPANSION_LEVEL', VisibilityPath)
ElementDisable(self)
end
end
oUF:AddElement('Experience', VisibilityPath, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/FactionIcon.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.show_arena ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_PVPSpecIcons
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local Update = function(self, event, unit)
if event == "ARENA_OPPONENT_UPDATE" and unit ~= self.unit then return end
local element = self.FactionIcon
local _, instanceType = IsInInstance()
if instanceType ~= "pvp" then
element:Hide()
return
else
element:Show()
end
if element.PreUpdate then element:PreUpdate(event) end
if UnitIsEnemy(self.unit, "player") and UnitIsPlayer(self.unit) then
element:Show()
else
element:Hide()
end
if element.PostUpdate then element:PostUpdate(event) end
end
local Enable = function(self)
local element = self.FactionIcon
if element then
self:RegisterEvent("ARENA_OPPONENT_UPDATE", Update, true)
self:RegisterEvent("PLAYER_ENTERING_WORLD", Update, true)
if UnitFactionGroup("player") == "Horde" then
element:SetAtlas("nameplates-icon-bounty-alliance")
else
element:SetAtlas("nameplates-icon-bounty-horde")
end
return true
end
end
local Disable = function(self)
local element = self.FactionIcon
if element then
self:UnregisterEvent("ARENA_OPPONENT_UPDATE", Update)
self:UnregisterEvent("PLAYER_ENTERING_WORLD", Update)
element:Hide()
end
end
oUF:AddElement("FactionIcon", Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/Fader.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.plugins_fader ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_Fader(by Slakah)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local strmatch, gmatch = string.match, string.gmatch
local objects, addon = {}, CreateFrame("Frame")
-- Events
local events = setmetatable({
Combat = "PLAYER_REGEN_ENABLED:PLAYER_REGEN_DISABLED",
PlayerTarget = "PLAYER_TARGET_CHANGED",
PlayerHostileTarget = "PLAYER_TARGET_CHANGED",
UnitTarget = "UNIT_TARGET",
UnitHostileTarget = "UNIT_TARGET",
Resting = "PLAYER_UPDATE_RESTING",
Flying = "UNIT_FLAGS",
PlayerTaxi = "UNIT_FLAGS",
UnitTaxi = "UNIT_FLAGS",
PlayerMaxHealth = "UNIT_HEALTH",
UnitMaxHealth = "UNIT_HEALTH",
PlayerMaxMana = "UNIT_POWER_UPDATE",
UnitMaxMana = "UNIT_POWER_UPDATE",
Stealth = "UPDATE_STEALTH",
PlayerNotMaxHealth = "UNIT_HEALTH",
PlayerNotMaxMana = "UNIT_POWER_UPDATE",
Casting = "UNIT_SPELLCAST_START:UNIT_SPELLCAST_FAILED:UNIT_SPELLCAST_STOP:UNIT_SPELLCAST_INTERRUPTED:UNIT_SPELLCAST_CHANNEL_START:UNIT_SPELLCAST_CHANNEL_STOP",
Arena = "ZONE_CHANGED_NEW_AREA",
Instance = "PLAYER_ENTERING_WORLD",
}, {__index = function(events, k)
local cond = strmatch(k, "not(.+)")
assert(rawget(events, cond), format("Missing event for condition %s", k))
events[k] = events[cond]
return events[cond]
end})
-- Conditions
local conditions = setmetatable({
PlayerHostileTarget = function() return UnitCanAttack("player", "target") end,
UnitHostileTarget = function(_, unit) return unit and UnitCanAttack(unit, unit.."target") end,
PlayerTarget = function() return UnitExists("target") end,
UnitTarget = function(_, unit) return unit and UnitExists(unit.."target") end,
PlayerTaxi = function() return UnitOnTaxi("player") end,
UnitTaxi = function(_, unit) return unit and UnitOnTaxi(unit) end,
UnitMaxHealth = function(_, unit) return unit and not UnitIsDeadOrGhost(unit) and UnitHealth(unit) == UnitHealthMax(unit) end,
PlayerMaxHealth = function(_, unit) return unit and not UnitIsDeadOrGhost("player") and UnitHealth("player") == UnitHealthMax("player") end,
UnitMaxMana = function(_, unit) return unit and not UnitIsDeadOrGhost(unit) and UnitPower(unit) == UnitPowerMax(unit) end,
PlayerMaxMana = function(_, unit) return unit and not UnitIsDeadOrGhost("player") and UnitPower("player") == UnitPowerMax("player") end,
Stealth = IsStealthed,
Flying = IsFlying,
Resting = IsResting,
Combat = InCombatLockdown,
PlayerNotMaxHealth = function(_, unit) return unit and UnitHealth("player") ~= UnitHealthMax("player") end,
PlayerNotMaxMana = function(_, unit)
local _, powerTypeString = UnitPowerType("player")
if powerTypeString ~= "RAGE" and powerTypeString ~= "RUNIC_POWER" then
return unit and UnitPower("player") ~= UnitPowerMax("player")
end
end,
Casting = function(_, unit) return unit and (UnitCastingInfo(unit) or UnitChannelInfo(unit)) end,
Arena = function(_, unit) return unit and GetZonePVPInfo() == "arena" end,
Instance = function(_, unit) return unit and IsInInstance() == true end,
}, {__index = function(t, k)
local cond = strmatch(k, "not(.+)")
assert(rawget(t, cond), format("Missing condition %s", k))
t[k] = function(...)
return not t[cond](...)
end
return t[k]
end})
function addon:RegisterCondition(name, func, event)
assert(type(name) == "string", format("Bad argument #1 to \"RegisterCondition\" (string expected, got %s)", type(name)))
assert(type(func) == "function", format("Bad argument #2 to \"RegisterCondition\" (function expected, got %s)", type(func)))
assert(type(event) == "string", format("Bad argument #3 to \"RegisterCondition\" (string expected, got %s)", type(event)))
conditions[name] = func
events[name] = event
end
-- Update the Alpha or obj
local function UpdateAlpha(obj)
local alpha
for _, tbl in ipairs(obj.Fader) do
for cond, condalpha in pairs(tbl) do
if conditions[cond](obj, obj.unit) then
alpha = not alpha and condalpha or condalpha > alpha and condalpha or alpha
end
end
if alpha then
break
end
end
alpha = alpha or obj.NormalAlpha
if obj.Range then
obj.inRangeAlpha = alpha
obj.outsideRangeAlpha = alpha * obj.outsideRangeAlphaPerc
end
obj:SetAlpha(alpha)
obj:SetScript("OnEnter", function(self) self:SetAlpha(1) UnitFrame_OnEnter(obj) end)
obj:SetScript("OnLeave", function(self) self:SetAlpha(alpha) UnitFrame_OnLeave(obj) end)
end
local t = 0
local function OnUpdate(addon, el) -- I do this because it's easier than passing events to conditions
t = t + el
if t > 0.1 then
t = 0
for _, v in ipairs(objects) do
UpdateAlpha(v)
end
addon:Hide()
end
end
oUF:RegisterInitCallback(
function(obj)
local F = obj.Fader
if F then
for _, tbl in ipairs(F) do
for name in pairs(tbl) do
for event in gmatch(events[name], "[^:]+") do
addon:RegisterEvent(event)
end
end
end
obj.NormalAlpha = obj.NormalAlpha or obj:GetAlpha()
obj.outsideRangeAlphaPerc = obj.outsideRangeAlphaPerc or obj.outsideRangeAlpha
UpdateAlpha(obj)
objects[#objects + 1] = obj
end
end
)
addon:SetScript("OnEvent", addon.Show)
addon:SetScript("OnUpdate", OnUpdate)
addon.Conditions = conditions
addon.Events = events
oUF.Fader = addon
================================================
FILE: ShestakUI/Libs/oUF/Modules/GCD.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.plugins_gcd ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_GCD(by ALZA)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local starttime, duration, usingspell
local GetTime = GetTime
local function OnUpdateSpark(self)
self.Spark:ClearAllPoints()
local elapsed = GetTime() - starttime
local perc = elapsed / duration
if perc > 1 then
self:Hide()
return
else
self.Spark:SetPoint("CENTER", self, "LEFT", self.width * perc, 0)
end
end
local function OnHide(self)
self:SetScript("OnUpdate", nil)
usingspell = nil
end
local function OnShow(self)
self:SetScript("OnUpdate", OnUpdateSpark)
end
local function Update(self)
local bar = self.GCD
local start, dur = GetSpellCooldown(61304)
if dur and dur > 0 and dur <= 2 then
usingspell = 1
starttime = start
duration = dur
bar:Show()
return
elseif usingspell == 1 and dur == 0 then
bar:Hide()
end
end
local function Enable(self)
local element = self.GCD
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
element.width = element:GetWidth()
element:Hide()
element.Spark = element:CreateTexture(nil, "OVERLAY")
element.Spark:SetTexture(C.media.blank)
element.Spark:SetVertexColor(unpack(element.Color))
element.Spark:SetHeight(element.Height)
element.Spark:SetWidth(element.Width)
element.Spark:SetBlendMode("ADD")
element:SetScript("OnShow", OnShow)
element:SetScript("OnHide", OnHide)
self:RegisterEvent("ACTIONBAR_UPDATE_COOLDOWN", Update, true)
return true
end
end
local function Disable(self)
local element = self.GCD
if(element) then
element:Hide()
self:UnregisterEvent("ACTIONBAR_UPDATE_COOLDOWN", Update)
end
end
oUF:AddElement("GCD", Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/HarmonyOrbs.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or T.class ~= "MONK" then return end
local _, ns = ...
local oUF = ns.oUF
local SPELL_POWER_CHI = Enum.PowerType.Chi or 12
local function Update(self, _, unit, powerType)
if(self.unit ~= unit and (powerType and (powerType ~= "CHI" and powerType ~= "DARK_FORCE"))) then return end
local element = self.HarmonyBar
if(element.PreUpdate) then
element:PreUpdate(unit)
end
local cur = UnitPower("player", SPELL_POWER_CHI)
local max = UnitPowerMax("player", SPELL_POWER_CHI)
local spacing = select(4, element[5]:GetPoint())
local barWidth = element:GetWidth()
local lastBar = 0
if element.max ~= max then
if max == 5 then
element[6]:Hide()
else
element[6]:Show()
end
for i = 1, max do
if i ~= max then
element[i]:SetWidth(barWidth / max - spacing)
lastBar = lastBar + (barWidth / max)
else
element[i]:SetWidth(barWidth - lastBar)
end
end
element.max = max
end
for i = 1, max do
if i <= cur then
element[i]:SetAlpha(1)
else
element[i]:SetAlpha(0.2)
end
end
if(element.PostUpdate) then
return element:PostUpdate(cur)
end
end
local function Path(self, ...)
return (self.HarmonyBar.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit, "CHI")
end
local function Visibility(self)
local element = self.HarmonyBar
local spec = GetSpecialization()
if spec == SPEC_MONK_WINDWALKER then
element:Show()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19) end
else
element:Hide()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 5) end
end
end
local function Enable(self, unit)
local element = self.HarmonyBar
if element and unit == "player" then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent("UNIT_POWER_UPDATE", Path)
self:RegisterEvent("UNIT_DISPLAYPOWER", Path)
self:RegisterEvent("UNIT_MAXPOWER", Path)
element.handler = CreateFrame("Frame", nil, element)
element.handler:RegisterEvent("PLAYER_TALENT_UPDATE")
element.handler:RegisterEvent("PLAYER_ENTERING_WORLD")
element.handler:SetScript("OnEvent", function() Visibility(self) end)
element.maxChi = 0
return true
end
end
local function Disable(self)
local element = self.HarmonyBar
if(element) then
self:UnregisterEvent("UNIT_POWER_UPDATE", Path)
self:UnregisterEvent("UNIT_DISPLAYPOWER", Path)
self:UnregisterEvent("UNIT_MAXPOWER", Path)
element.handler:UnregisterEvent("PLAYER_TALENT_UPDATE")
element.handler:UnregisterEvent("PLAYER_ENTERING_WORLD")
end
end
oUF:AddElement("HarmonyBar", Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/HolyPower.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or T.class ~= "PALADIN" then return end
local _, ns = ...
local oUF = ns.oUF
local SPELL_POWER_HOLY_POWER = Enum.PowerType.HolyPower or 9
local function Update(self, _, unit, powerType)
if(self.unit ~= unit or (powerType and powerType ~= "HOLY_POWER")) then return end
local element = self.HolyPower
if(element.PreUpdate) then
element:PreUpdate(unit)
end
if UnitHasVehicleUI("player") then
element:Hide()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 5) end
else
element:Show()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19) end
end
local cur = UnitPower("player", SPELL_POWER_HOLY_POWER)
local max = 5 -- Cause we don't use :Factory to spawn frames it return sometimes "3"
for i = 1, max do
if(i <= cur) then
element[i]:SetAlpha(1)
else
element[i]:SetAlpha(0.2)
end
end
if(element.PostUpdate) then
return element:PostUpdate(cur)
end
end
local function Path(self, ...)
return (self.HolyPower.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit, "HOLY_POWER")
end
local function Visibility(self)
local element = self.HolyPower
if not UnitHasVehicleUI("player") then
element:Show()
if self.Debuffs then self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19) end
end
self:RegisterEvent("UNIT_POWER_UPDATE", Path)
end
local function Enable(self)
local element = self.HolyPower
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
element.handler = CreateFrame("Frame", nil, element)
element.handler:RegisterEvent("PLAYER_TALENT_UPDATE")
element.handler:RegisterEvent("PLAYER_ENTERING_WORLD")
element.handler:SetScript("OnEvent", function() Visibility(self) end)
return true
end
end
local function Disable(self)
local element = self.HolyPower
if(element) then
element.handler:UnregisterEvent("PLAYER_TALENT_UPDATE")
element.handler:UnregisterEvent("PLAYER_ENTERING_WORLD")
end
end
oUF:AddElement("HolyPower", Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/QuestIcon.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.nameplate.enable ~= true or C.nameplate.quests ~= true then return end
----------------------------------------------------------------------------------------
-- Show quest icon on nameplates (based on code from ElvUI)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF or oUF
assert(oUF, "oUF not loaded")
local QuestIcon = {
indexByID = {}, --[questID] = questIndex
activeQuests = {} --[questTitle] = questID
}
local ScanTooltip = CreateFrame("GameTooltip", "oUF_QuestIconTooltip", UIParent, "GameTooltipTemplate")
local ThreatTooltip = THREAT_TOOLTIP:gsub("%%d", "%%d-")
local function CheckTextForQuest(text)
local x, y = strmatch(text, "(%d+)/(%d+)")
if x and y then
return floor(y - x)
elseif not strmatch(text, ThreatTooltip) then
local progress = tonumber(strmatch(text, "([%d%.]+)%%"))
if progress and progress <= 100 then
return ceil(100 - progress), true
end
end
end
local function GetQuests(unitID)
local _, instanceType = IsInInstance()
if instanceType == "arena" or instanceType == "pvp" or instanceType == "raid" or C_ChallengeMode.IsChallengeModeActive() then return end
ScanTooltip:SetOwner(_G.UIParent, "ANCHOR_NONE")
ScanTooltip:SetUnit(unitID)
ScanTooltip:Show()
local QuestList, notMyQuest, activeID
for i = 3, ScanTooltip:NumLines() do
local str = _G["oUF_QuestIconTooltipTextLeft" .. i]
local text = str and str:GetText()
if not text or text == "" then return end
if UnitIsPlayer(text) then
notMyQuest = text ~= T.name
elseif text and not notMyQuest then
local count, percent = CheckTextForQuest(text)
-- this line comes from one line up in the tooltip
local activeQuest = QuestIcon.activeQuests[text]
if activeQuest then activeID = activeQuest end
if count then
local type, index, texture, _
if activeID then
index = QuestIcon.indexByID[activeID]
_, texture = GetQuestLogSpecialItemInfo(index)
for i = 1, GetNumQuestLeaderBoards(index) or 0 do
local text, objectiveType, finished = GetQuestObjectiveInfo(activeID, i, false)
if text and not finished and (objectiveType == "item" or objectiveType == "object") then
type = "LOOT_ITEM"
end
end
end
if texture then
type = "QUEST_ITEM"
end
if not QuestList then QuestList = {} end
QuestList[#QuestList + 1] = {
isPercent = percent,
itemTexture = texture,
objectiveCount = count,
questType = type or "DEFAULT",
-- below keys are currently unused
questLogIndex = index,
questID = activeID
}
end
end
end
ScanTooltip:Hide()
return QuestList
end
local function hideIcons(element)
element:Hide()
element.Item:Hide()
element.Text:SetText("")
end
local function Update(self, event, arg1)
local element = self.QuestIcon
if not element then return end
local unit = (event == "UNIT_NAME_UPDATE" and arg1) or self.unit
if unit ~= self.unit then return end
if element.PreUpdate then
element:PreUpdate()
end
hideIcons(element)
local QuestList = GetQuests(unit)
if not QuestList then return end
for i = 1, #QuestList do
local quest = QuestList[i]
local objectiveCount = quest.objectiveCount
local questType = quest.questType
local isPercent = quest.isPercent
if isPercent or objectiveCount > 0 then
element:Show()
if element.Text and (isPercent or objectiveCount > 0) then
element.Text:SetText(objectiveCount)
if isPercent then
element.Text:SetTextColor(0.2, 1, 1)
else
element.Text:SetTextColor(1, 0.82, 0)
end
end
if questType == "QUEST_ITEM" then
element.Item:Show()
element.Item:SetTexture(quest.itemTexture)
elseif questType == "LOOT_ITEM" then
element.Item:Show()
element.Item:SetTexture(133639)
end
end
end
if element:IsShown() then
self.Level:SetAlpha(0)
end
if element.PostUpdate then
return element:PostUpdate()
end
end
local function Path(self, ...)
return (self.QuestIcon.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit)
end
local function Enable(self)
local element = self.QuestIcon
if element then
element.__owner = self
element.ForceUpdate = ForceUpdate
if element:IsObjectType("Texture") and not element:GetAtlas() then
element:SetAtlas("worldquest-tracker-questmarker")
end
self:RegisterEvent("QUEST_LOG_UPDATE", Path, true)
self:RegisterEvent("UNIT_NAME_UPDATE", Path, true)
self:RegisterEvent("PLAYER_ENTERING_WORLD", Path, true)
SetCVar("showQuestTrackingTooltips", 1)
return true
end
end
local function Disable(self)
local element = self.QuestIcon
if element then
element:Hide()
hideIcons(element)
self:UnregisterEvent("QUEST_LOG_UPDATE", Path)
self:UnregisterEvent("UNIT_NAME_UPDATE", Path)
self:UnregisterEvent("PLAYER_ENTERING_WORLD", Path)
end
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("QUEST_ACCEPTED")
frame:RegisterEvent("QUEST_REMOVED")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function(self, event)
wipe(QuestIcon.indexByID)
wipe(QuestIcon.activeQuests)
for i = 1, C_QuestLog.GetNumQuestLogEntries() do
local id = C_QuestLog.GetQuestIDForLogIndex(i)
if id and id > 0 then
QuestIcon.indexByID[id] = i
local title = C_QuestLog.GetTitleForLogIndex(i)
if title then QuestIcon.activeQuests[title] = id end
end
end
if event == "PLAYER_ENTERING_WORLD" then
self:UnregisterEvent(event)
end
end)
oUF:AddElement("QuestIcon", Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/RaidDebuffs.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.raidframe.plugins_aura_watch ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_RaidDebuffs(by Yleaf)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local bossDebuffPrio = 9999999
local invalidPrio = -1
local auraFilters = {
["HARMFUL"] = true,
}
local DispellColor = {
["Magic"] = {0.2, 0.6, 1},
["Curse"] = {0.6, 0, 1},
["Disease"] = {0.6, 0.4, 0},
["Poison"] = {0, 0.6, 0},
["none"] = {unpack(C.media.border_color)},
}
if C.aura.debuff_color_type == true then
DispellColor.none = {1, 0, 0}
end
local DispellPriority = {
["Magic"] = 4,
["Curse"] = 3,
["Disease"] = 2,
["Poison"] = 1,
}
local DispellFilter = T.CanDispel[T.class] or {}
local function CheckSpec()
local spec = GetSpecialization()
if T.class == "DRUID" then
if spec == 4 then
DispellFilter.Magic = true
else
DispellFilter.Magic = false
end
elseif T.class == "MONK" then
if spec == 2 then
DispellFilter.Magic = true
else
DispellFilter.Magic = false
end
elseif T.class == "PALADIN" then
if spec == 1 then
DispellFilter.Magic = true
else
DispellFilter.Magic = false
end
elseif T.class == "PRIEST" then
if spec == 3 then
DispellFilter.Magic = false
else
DispellFilter.Magic = true
end
elseif T.class == "SHAMAN" then
if spec == 3 then
DispellFilter.Magic = true
else
DispellFilter.Magic = false
end
end
end
local function formatTime(s)
if s > 60 then
return format("%dm", s / 60), s % 60
else
return format("%d", s), s - floor(s)
end
end
local abs = math.abs
local function OnUpdate(self, elapsed)
self.elapsed = (self.elapsed or 0) + elapsed
if self.elapsed >= 0.1 then
local timeLeft = self.expirationTime - GetTime()
if self.reverse then timeLeft = abs((self.expirationTime - GetTime()) - self.duration) end
if timeLeft > 0 then
local text = formatTime(timeLeft)
self.time:SetText(text)
else
self:SetScript("OnUpdate", nil)
self.time:Hide()
end
self.elapsed = 0
end
end
local UpdateDebuffFrame = function(rd, icon, count, debuffType, duration, expirationTime, spellId)
if rd.index and rd.type and rd.filter then
if rd.icon then
rd.icon:SetTexture(icon)
rd.icon:Show()
end
if rd.count then
if count and (count > 1) then
rd.count:SetText(count)
rd.count:Show()
else
rd.count:Hide()
end
end
if spellId and T.RaidDebuffsReverse[spellId] then
rd.reverse = true
else
rd.reverse = nil
end
if rd.time then
rd.duration = duration
if duration and (duration > 0) then
rd.expirationTime = expirationTime
rd.nextUpdate = 0
rd:SetScript("OnUpdate", OnUpdate)
rd.time:Show()
else
rd:SetScript("OnUpdate", nil)
rd.time:Hide()
end
end
if rd.cd then
if duration and (duration > 0) then
rd.cd:SetCooldown(expirationTime - duration, duration)
rd.cd:Show()
else
rd.cd:Hide()
end
end
local c = DispellColor[debuffType] or DispellColor.none
if C.aura.debuff_color_type == true then
rd:SetBackdropBorderColor(c[1], c[2], c[3])
end
if not rd:IsShown() then
rd:Show()
end
else
if rd:IsShown() then
rd:Hide()
end
end
end
local Update = function(self, _, unit)
if unit ~= self.unit then return end
local rd = self.RaidDebuffs
rd.priority = invalidPrio
local _icon, _count, _debuffType, _duration, _expirationTime, _spellId
for filter in next, (rd.Filters or auraFilters) do
local i = 0
while(true) do
i = i + 1
local name, icon, count, debuffType, duration, expirationTime, _, _, _, spellId, _, isBossDebuff = UnitAura(unit, i, filter)
if not name then break end
if rd.ShowBossDebuff and isBossDebuff then
local prio = rd.BossDebuffPriority or bossDebuffPrio
if prio and prio > rd.priority then
rd.priority = prio
rd.index = i
rd.type = "Boss"
rd.filter = filter
_icon, _count, _debuffType, _duration, _expirationTime, _spellId = icon, count, debuffType, duration, expirationTime, spellId
end
end
if rd.ShowDispellableDebuff and debuffType then
local disPrio = rd.DispellPriority or DispellPriority
local disFilter = rd.DispellFilter or DispellFilter
local prio
if rd.FilterDispellableDebuff and disFilter then
prio = disFilter[debuffType] and disPrio[debuffType]
else
prio = disPrio[debuffType]
end
if prio and prio > rd.priority then
rd.priority = prio
rd.index = i
rd.type = "Dispel"
rd.filter = filter
_icon, _count, _debuffType, _duration, _expirationTime, _spellId = icon, count, debuffType, duration, expirationTime, spellId
end
end
local prio = T.RaidDebuffs[rd.MatchBySpellName and name or spellId]
if not T.RaidDebuffsIgnore[spellId] and prio and (prio > rd.priority) then
rd.priority = prio
rd.index = i
rd.type = "Custom"
rd.filter = filter
_icon, _count, _debuffType, _duration, _expirationTime, _spellId = icon, count, debuffType, duration, expirationTime, spellId
end
end
end
if rd.priority == invalidPrio then
rd.index = nil
rd.filter = nil
rd.type = nil
end
return UpdateDebuffFrame(rd, _icon, _count, _debuffType, _duration, _expirationTime, _spellId)
end
local Path = function(self, ...)
return (self.RaidDebuffs.Override or Update) (self, ...)
end
local ForceUpdate = function(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit)
end
local Enable = function(self)
local rd = self.RaidDebuffs
if rd then
self:RegisterEvent("UNIT_AURA", Path)
rd.ForceUpdate = ForceUpdate
rd.__owner = self
return true
end
self:RegisterEvent("PLAYER_TALENT_UPDATE", CheckSpec, true)
CheckSpec()
end
local Disable = function(self)
if self.RaidDebuffs then
self:UnregisterEvent("UNIT_AURA", Path)
self.RaidDebuffs:Hide()
self.RaidDebuffs.__owner = nil
end
self:UnregisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
end
oUF:AddElement("RaidDebuffs", Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/Reputation.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.plugins_reputation_bar ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_Reputation(by p3lim)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF or oUF
assert(oUF, 'oUF Reputation was unable to locate oUF install')
local paragonStrings = {
deDE = 'Huldigend',
esES = 'Baluarte',
frFR = 'Parangon',
itIT = 'Eccellenza',
ptBR = 'Parag\195\163o',
ruRU = '\208\152\208\180\208\181\208\176\208\187',
koKR = '\235\182\136\235\169\184\236\157\152 \235\143\153\235\167\185',
zhCN = '\229\183\133\229\179\176',
}
paragonStrings.esMX = paragonStrings.esES
paragonStrings.zhTW = paragonStrings.zhCN
_G.PARAGON = paragonStrings[GetLocale()] or 'Paragon'
local function GetReputation()
local pendingReward, standingText
local name, standingID, min, max, cur, factionID = GetWatchedFactionInfo()
local repInfo = C_GossipInfo.GetFriendshipReputation(factionID)
local friendshipID = repInfo and repInfo.friendshipFactionID
if C_Reputation.IsFactionParagon(factionID) then
local value, nextThreshold, _, hasRewardPending = C_Reputation.GetFactionParagonInfo(factionID)
if(value) then
cur = value % nextThreshold
min = 0
max = nextThreshold
pendingReward = hasRewardPending
standingID = MAX_REPUTATION_REACTION + 1 -- force paragon's color
standingText = PARAGON
end
elseif C_Reputation.IsMajorFaction(factionID) then
local majorFactionData = C_MajorFactions.GetMajorFactionData(factionID)
min, max = 0, majorFactionData.renownLevelThreshold
cur = C_MajorFactions.HasMaximumRenown(factionID) and majorFactionData.renownLevelThreshold or majorFactionData.renownReputationEarned or 0
standingID = MAX_REPUTATION_REACTION + 2
standingText = RENOWN_LEVEL_LABEL..majorFactionData.renownLevel
elseif 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
standingText = repInfo.reaction..rankText
if repInfo.nextThreshold then
min, max, cur = repInfo.reactionThreshold, repInfo.nextThreshold, repInfo.standing
else
min, max, cur = 0, 1, 1 -- force a full bar when maxed out
end
standingID = 5 -- force friends' color
end
max = max - min
cur = cur - min
-- cur and max are both 0 for maxed out factions
if(cur == max) then
cur, max = 1, 1
end
standingText = standingText or GetText('FACTION_STANDING_LABEL' .. standingID, UnitSex('player'))
return cur, max, name, factionID, standingID, standingText, pendingReward
end
oUF.colors.reaction[MAX_REPUTATION_REACTION + 1] = {0.64, 0.2, 0.93} -- paragon color
oUF.colors.reaction[MAX_REPUTATION_REACTION + 2] = {0, 0.5, 0.9} -- major faction color
-- Changed tooltip for ShestakUI
local function UpdateTooltip(element)
local cur, max, name, _, standingID, standingText, pendingReward = GetReputation()
local rewardAtlas = pendingReward and "|A:ParagonReputation_Bag:0:0:0:0|a" or ""
local color = element.__owner.colors.reaction[standingID]
if not name then element:Hide() return end
GameTooltip:SetText(format("%s (%s)", name, standingText), color[1], color[2], color[3])
if(cur ~= max) then
GameTooltip:AddLine(format("%s / %s (%d%%) %s", BreakUpLargeNumbers(cur), BreakUpLargeNumbers(max), (cur) / (max) * 100, rewardAtlas), 0.75, 0.9, 1)
end
GameTooltip:Show()
end
local function OnEnter(element)
element:SetAlpha(element.inAlpha)
GameTooltip:SetOwner(element, "ANCHOR_BOTTOM", 0, -5) -- ShestakUI
element:UpdateTooltip()
end
local function OnLeave(element)
GameTooltip:Hide()
element:SetAlpha(element.outAlpha)
end
local function OnMouseUp(element, btn)
if btn == "MiddleButton" then
if element.outAlpha == 0 then
element.outAlpha = 1
ShestakUISettings.Reputation = true
else
element.outAlpha = 0
ShestakUISettings.Reputation = false
end
else
ToggleCharacter("ReputationFrame")
end
end
local function CheckAlpha(element)
if ShestakUISettings and ShestakUISettings.Reputation == true then
element.outAlpha = 1
element:SetAlpha(element.outAlpha or 1)
end
end
local function Update(self, event, unit)
local element = self.Reputation
if(element.PreUpdate) then element:PreUpdate(unit) end
local cur, max, name, factionID, standingID, standingText, pendingReward = GetReputation()
if(name) then
element:SetMinMaxValues(0, max)
element:SetValue(cur)
if(element.colorStanding) then
local colors = self.colors.reaction[standingID]
element:SetStatusBarColor(colors[1], colors[2], colors[3])
element.bg:SetVertexColor(colors[1], colors[2], colors[3], 0.2) -- ShestakUI
end
if(element.Reward) then
-- no idea what this function actually does, but Blizzard uses it as well
C_Reputation.RequestFactionParagonPreloadRewardData(factionID)
element.Reward:SetShown(pendingReward)
end
end
if(element.PostUpdate) then
return element:PostUpdate(unit, cur, max, name, factionID, standingID, standingText, pendingReward)
end
end
local function Path(self, ...)
return (self.Reputation.Override or Update) (self, ...)
end
local function ElementEnable(self)
local element = self.Reputation
self:RegisterEvent('UPDATE_FACTION', Path, true)
element:Show()
element:SetAlpha(element.outAlpha or 1)
Path(self, 'ElementEnable', 'player')
end
local function ElementDisable(self)
self:UnregisterEvent('UPDATE_FACTION', Path)
self.Reputation:Hide()
Path(self, 'ElementDisable', 'player')
end
local function Visibility(self, event, unit, selectedFactionIndex)
local shouldEnable
if(selectedFactionIndex ~= nil) then
if(selectedFactionIndex > 0) then
shouldEnable = true
end
elseif(not not (GetWatchedFactionInfo())) then
shouldEnable = true
end
if(shouldEnable) then
ElementEnable(self)
else
ElementDisable(self)
end
end
local function VisibilityPath(self, ...)
return (self.Reputation.OverrideVisibility or Visibility)(self, ...)
end
local function ForceUpdate(element)
return VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self, unit)
local element = self.Reputation
if(element) then
element.__owner = self
element.ForceUpdate = ForceUpdate
hooksecurefunc('SetWatchedFactionIndex', function(selectedFactionIndex)
if(self:IsElementEnabled('Reputation')) then
VisibilityPath(self, 'SetWatchedFactionIndex', 'player', selectedFactionIndex or 0)
end
end)
if(not element:GetStatusBarTexture()) then
element:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
if(element.Reward and element.Reward:IsObjectType('Texture') and not element.Reward:GetTexture()) then
element.Reward:SetAtlas('ParagonReputation_Bag')
end
if(element:IsMouseEnabled()) then
element.UpdateTooltip = element.UpdateTooltip or UpdateTooltip
element.tooltipAnchor = element.tooltipAnchor or 'ANCHOR_BOTTOMRIGHT'
element.inAlpha = element.inAlpha or 1
element.outAlpha = element.outAlpha or 1
if(not element:GetScript('OnEnter')) then
element:SetScript('OnEnter', OnEnter)
end
if(not element:GetScript('OnLeave')) then
element:SetScript('OnLeave', OnLeave)
end
if(not element:GetScript('OnMouseUp')) then
element:SetScript('OnMouseUp', OnMouseUp)
end
element.handler = CreateFrame("Frame", nil, element)
element.handler:RegisterEvent("PLAYER_LOGIN")
element.handler:SetScript("OnEvent", function() CheckAlpha(element) end)
end
return true
end
end
local function Disable(self)
if(self.Reputation) then
ElementDisable(self)
end
end
oUF:AddElement('Reputation', VisibilityPath, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/Smooth.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.plugins_smooth_bar ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_Smooth(by Xuerian)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local smoothing = {}
local function Smooth(self, value)
if value ~= self:GetValue() or value == 0 then
smoothing[self] = value
else
smoothing[self] = nil
end
end
local function SmoothBar(_, bar)
bar.SetValue_ = bar.SetValue
bar.SetValue = Smooth
end
local function hook(frame)
frame.SmoothBar = SmoothBar
if frame.Health and frame.Health.Smooth then
frame:SmoothBar(frame.Health)
end
if frame.Power and frame.Power.Smooth then
frame:SmoothBar(frame.Power)
end
end
for _, frame in ipairs(oUF.objects) do hook(frame) end
oUF:RegisterInitCallback(hook)
local f, min, max = CreateFrame("Frame"), math.min, math.max
f:SetScript("OnUpdate", function()
local rate = GetFramerate()
local limit = 30 / rate
for bar, value in pairs(smoothing) do
local cur = bar:GetValue()
local new = cur + min((value - cur) / 3, max(value - cur, limit))
if new ~= new then
-- Mad hax to prevent QNAN.
new = value
end
bar:SetValue_(new)
if cur == value or abs(new - value) < 2 then
bar:SetValue_(value)
smoothing[bar] = nil
end
end
end)
================================================
FILE: ShestakUI/Libs/oUF/Modules/SoulShards.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or T.class ~= "WARLOCK" then return end
local _, ns = ...
local oUF = ns.oUF
local SPELL_POWER_SOUL_SHARDS = Enum.PowerType.SoulShards or 7
local function Update(self, _, unit, powerType)
if(self.unit ~= unit or (powerType and powerType ~= "SOUL_SHARDS")) then return end
local element = self.SoulShards
if(element.PreUpdate) then
element:PreUpdate(unit)
end
local cur = UnitPower("player", SPELL_POWER_SOUL_SHARDS)
local max = UnitPowerMax("player", SPELL_POWER_SOUL_SHARDS)
for i = 1, max do
if i <= cur then
element[i]:SetAlpha(1)
else
element[i]:SetAlpha(0.2)
end
end
if(element.PostUpdate) then
return element:PostUpdate(cur)
end
end
local function Path(self, ...)
return (self.SoulShards.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit, "SOUL_SHARDS")
end
local function Enable(self, unit)
local element = self.SoulShards
if(element) and unit == "player" then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent("UNIT_POWER_UPDATE", Path)
self:RegisterEvent("UNIT_DISPLAYPOWER", Path)
return true
end
end
local function Disable(self)
local element = self.SoulShards
if(element) then
self:UnregisterEvent("UNIT_POWER_UPDATE", Path)
self:UnregisterEvent("UNIT_DISPLAYPOWER", Path)
end
end
oUF:AddElement("SoulShards", Path, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/Swing.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.plugins_swing ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_Swing(by p3lim and Thalyra)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local function OnDurationUpdate(self)
self:SetMinMaxValues(self.min, self.max)
local swingelapsed = GetTime()
if swingelapsed > self.max then
self:Hide()
self:SetScript("OnUpdate", nil)
else
self:SetValue(self.min + (swingelapsed - self.min))
if self.Text then
if self.OverrideText then
self:OverrideText(swingelapsed)
else
self.Text:SetFormattedText("%.1f", self.max - swingelapsed)
end
end
end
end
local function Melee(self)
local _, event, _, GUID, _, _, _, tarGUID, _, _, _, missType = CombatLogGetCurrentEventInfo()
local bar = self.Swing
if UnitGUID(self.unit) == tarGUID then
if string.find(event, "MISSED") then
if missType == "PARRY" and bar.max then
bar.max = bar.min + ((bar.max - bar.min) * 0.6)
bar:SetMinMaxValues(bar.min, bar.max)
end
end
elseif UnitGUID(self.unit) == GUID then
if not string.find(event, "SWING") then return end
bar.min = GetTime()
bar.max = bar.min + UnitAttackSpeed(self.unit)
local itemId = GetInventoryItemID("player", 17)
if itemId ~= nil then
local _, _, _, _, _, itemType = GetItemInfo(itemId)
local _, _, _, _, _, weaponType = GetItemInfo(25)
if itemType ~= weaponType then -- Worn Shortsword, little "hack" for language support
bar:Show()
bar:SetMinMaxValues(bar.min, bar.max)
bar:SetScript("OnUpdate", OnDurationUpdate)
else
bar:Hide()
bar:SetScript("OnUpdate", nil)
end
else
bar:Show()
bar:SetMinMaxValues(bar.min, bar.max)
bar:SetScript("OnUpdate", OnDurationUpdate)
end
end
end
local function Ranged(self, _, unit, _, spellID)
if spellID ~= 75 and spellID ~= 5019 then return end
local bar = self.Swing
bar.min = GetTime()
bar.max = bar.min + UnitRangedDamage(unit)
bar:Show()
bar:SetMinMaxValues(bar.min, bar.max)
bar:SetScript("OnUpdate", OnDurationUpdate)
end
local function Ooc(self)
local bar = self.Swing
bar:Hide()
end
local function Enable(self, unit)
local bar = self.Swing
if bar and unit == "player" then
if not bar.disableRanged then
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", Ranged)
end
if not bar.disableMelee then
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED", Melee, true)
end
if not bar.disableOoc then
self:RegisterEvent("PLAYER_REGEN_ENABLED", Ooc, true)
end
bar:Hide()
return true
end
end
local function Disable(self)
local bar = self.Swing
if bar then
if not bar.disableRanged then
self:UnregisterEvent("UNIT_SPELLCAST_SUCCEEDED", Ranged)
end
if not bar.disableMelee then
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED", Melee)
end
if not bar.disableOoc then
self:UnregisterEvent("PLAYER_REGEN_ENABLED", Ooc)
end
end
end
oUF:AddElement("Swing", nil, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/TotemBar.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe_class_bar.totem ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_TotemBar(by Soeters)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
-- In the order, fire, earth, water, air
local colors = {
[1] = {0.58, 0.23, 0.10},
[2] = {0.23, 0.45, 0.13},
[3] = {0.19, 0.48, 0.60},
[4] = {0.42, 0.18, 0.74},
}
local function onUpdate(self, elapsed)
self.elapsed = (self.elapsed or 0) + elapsed
if self.elapsed < 0.1 then return end
self.elapsed = 0
local time = self.finish - GetTime()
self:SetValue(time)
end
local function UpdateSlot(self, slot)
local element = self.TotemBar
if not element[slot] then return end
local totem = element[slot]
local haveTotem, _, startTime, duration = GetTotemInfo(slot)
totem:SetStatusBarColor(unpack(element.colors[slot]))
-- Multipliers
if totem.bg.multiplier then
local mu = totem.bg.multiplier
local r, g, b = totem:GetStatusBarColor()
r, g, b = r * mu, g * mu, b * mu
totem.bg:SetVertexColor(r, g, b)
end
if haveTotem and duration > 0 then
totem.finish = startTime + duration
totem:SetMinMaxValues(0, duration)
totem:SetValue(duration)
totem:SetScript('OnUpdate', onUpdate)
if T.class ~= "SHAMAN" then
totem:Show()
end
else
totem:SetValue(0)
totem:SetScript("OnUpdate", nil)
if T.class ~= "SHAMAN" then
totem:Hide()
end
end
end
local function Update(self)
-- Update every slot on login, still have issues with it
for i = 1, MAX_TOTEMS do
UpdateSlot(self, i)
end
end
local function Event(self, event, ...)
if event == "PLAYER_TOTEM_UPDATE" then
UpdateSlot(self, ...)
end
end
local function anchorTotems(element)
for t in next, _G.TotemFrame.totemPool.activeObjects do
local i = t.slot
t:ClearAllPoints()
t:SetParent(element[i])
t:SetAllPoints(element[i])
t:SetFrameLevel(element[i]:GetFrameLevel() + 1)
t:SetFrameStrata(element[i]:GetFrameStrata())
t:SetAlpha(0)
t.Icon:Hide()
end
end
local function Enable(self)
local element = self.TotemBar
if element then
self:RegisterEvent("PLAYER_TOTEM_UPDATE", Event, true)
element.colors = setmetatable(element.colors or {}, {__index = colors})
if element.Destroy then
anchorTotems(element)
hooksecurefunc(TotemFrame, "Update", function()
anchorTotems(element)
end)
end
return true
end
end
local function Disable(self)
local element = self.TotemBar
if element then
self:UnregisterEvent("PLAYER_TOTEM_UPDATE", Event)
TotemFrame:Show()
end
end
oUF:AddElement("TotemBar", Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Modules/Trinkets.lua
================================================
local T, C, L = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.unitframe.show_arena ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oUF_Trinkets(by Allez, editor Tukz)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF or oUF
assert(oUF, 'oUF not loaded')
local Update = function(self, event, ...)
local _, instanceType = IsInInstance()
if instanceType ~= 'arena' then
self.Trinket.Icon:SetTexture("Interface\\Icons\\Ability_pvp_gladiatormedallion")
self.Trinket:Hide()
return
else
self.Trinket:Show()
end
if(self.Trinket.PreUpdate) then self.Trinket:PreUpdate(event, ...) end
if event == "ARENA_COOLDOWNS_UPDATE" then
local unit = ...
if self.unit == unit then
C_PvP.RequestCrowdControlSpell(unit)
local spellID, startTime, duration = C_PvP.GetArenaCrowdControlInfo(unit)
if spellID and startTime ~= 0 and duration ~= 0 then
CooldownFrame_Set(self.Trinket.cooldownFrame, startTime / 1000, duration / 1000, 1)
end
end
elseif event == "ARENA_CROWD_CONTROL_SPELL_UPDATE" then
local unit, spellID = ...
if self.unit == unit then
local _, _, spellTexture = GetSpellInfo(spellID)
self.Trinket.Icon:SetTexture(spellTexture)
end
elseif event == "PLAYER_ENTERING_WORLD" then
CooldownFrame_Set(self.Trinket.cooldownFrame, 1, 1, 1)
end
if(self.Trinket.PostUpdate) then self.Trinket:PostUpdate(event, ...) end
end
local Enable = function(self)
if self.Trinket then
self:RegisterEvent("ARENA_COOLDOWNS_UPDATE", Update, true)
self:RegisterEvent("ARENA_CROWD_CONTROL_SPELL_UPDATE", Update, true)
self:RegisterEvent("PLAYER_ENTERING_WORLD", Update, true)
if not self.Trinket.cooldownFrame then
self.Trinket.cooldownFrame = CreateFrame("Cooldown", nil, self.Trinket, "CooldownFrameTemplate")
self.Trinket.cooldownFrame:SetPoint("TOPLEFT", self.Trinket, 2, -2)
self.Trinket.cooldownFrame:SetPoint("BOTTOMRIGHT", self.Trinket, -2, 2)
end
if not self.Trinket.Icon then
self.Trinket.Icon = self.Trinket:CreateTexture(nil, "BORDER")
self.Trinket.Icon:SetPoint("TOPLEFT", self.Trinket, 2, -2)
self.Trinket.Icon:SetPoint("BOTTOMRIGHT", self.Trinket, -2, 2)
self.Trinket.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.Trinket.Icon:SetTexture("Interface\\Icons\\Ability_pvp_gladiatormedallion")
end
return true
end
end
local Disable = function(self)
if self.Trinket then
self:UnregisterEvent("ARENA_COOLDOWNS_UPDATE", Update)
self:UnregisterEvent("ARENA_CROWD_CONTROL_SPELL_UPDATE", Update)
self:UnregisterEvent("PLAYER_ENTERING_WORLD", Update)
self.Trinket:Hide()
end
end
oUF:AddElement('Trinket', Update, Enable, Disable)
================================================
FILE: ShestakUI/Libs/oUF/Private.lua
================================================
local _, ns = ...
local Private = ns.oUF.Private
function Private.argcheck(value, num, ...)
assert(type(num) == 'number', "Bad argument #2 to 'argcheck' (number expected, got " .. type(num) .. ')')
for i = 1, select('#', ...) do
if(type(value) == select(i, ...)) then return end
end
local types = string.join(', ', ...)
local name = debugstack(2,2,0):match(": in function [`<](.-)['>]")
error(string.format("Bad argument #%d to '%s' (%s expected, got %s)", num, name, types, type(value)), 3)
end
function Private.print(...)
print('|cff33ff99oUF:|r', ...)
end
function Private.error(...)
Private.print('|cffff0000Error:|r ' .. string.format(...))
end
function Private.nierror(...)
return geterrorhandler()(...)
end
function Private.unitExists(unit)
return unit and (UnitExists(unit) or ShowBossFrameWhenUninteractable(unit))
end
local validator = CreateFrame('Frame')
function Private.validateUnit(unit)
local isOK, _ = pcall(validator.RegisterUnitEvent, validator, 'UNIT_HEALTH', unit)
if(isOK) then
_, unit = validator:IsEventRegistered('UNIT_HEALTH')
validator:UnregisterEvent('UNIT_HEALTH')
return not not unit
end
end
local selectionTypes = {
[ 0] = 0,
[ 1] = 1,
[ 2] = 2,
[ 3] = 3,
[ 4] = 4,
[ 5] = 5,
[ 6] = 6,
[ 7] = 7,
[ 8] = 8,
[ 9] = 9,
-- [10] = 10, -- unavailable to players
-- [11] = 11, -- unavailable to players
-- [12] = 12, -- inconsistent due to bugs and its reliance on cvars
[13] = 13,
}
function Private.unitSelectionType(unit, considerHostile)
if(considerHostile and UnitThreatSituation('player', unit)) then
return 0
else
return selectionTypes[UnitSelectionType(unit, true)]
end
end
function Private.xpcall(func, ...)
return xpcall(func, Private.nierror, ...)
end
function Private.validateEvent(event)
local isOK = xpcall(validator.RegisterEvent, Private.nierror, validator, event)
if(isOK) then
validator:UnregisterEvent(event)
end
return isOK
end
function Private.isUnitEvent(event, unit)
local isOK = pcall(validator.RegisterUnitEvent, validator, event, unit)
if(isOK) then
validator:UnregisterEvent(event)
end
return isOK
end
================================================
FILE: ShestakUI/Libs/oUF/Units.lua
================================================
local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local unitExists = Private.unitExists
local function updateArenaPreparationElements(self, event, elementName, specID)
local element = self[elementName]
if(element and self:IsElementEnabled(elementName)) then
if(element.OverrideArenaPreparation) then
--[[ Override: Health.OverrideArenaPreparation(self, event, specID)
Used to completely override the internal update function for arena preparation.
* self - the parent object
* event - the event triggering the update (string)
* specID - the specialization ID for the opponent (number)
--]]
--[[ Override: Power.OverrideArenaPreparation(self, event, specID)
Used to completely override the internal update function for arena preparation.
* self - the parent object
* event - the event triggering the update (string)
* specID - the specialization ID for the opponent (number)
--]]
element.OverrideArenaPreparation(self, event, specID)
return
end
element:SetMinMaxValues(0, 1)
element:SetValue(1)
if(element.UpdateColorArenaPreparation) then
--[[ Override: Health:UpdateColor(specID)
Used to completely override the internal function for updating the widget's colors
during arena preparation.
* self - the Health element
* specID - the specialization ID for the opponent (number)
--]]
--[[ Override: Power:UpdateColor(specID)
Used to completely override the internal function for updating the widget's colors
during arena preparation.
* self - the Power element
* specID - the specialization ID for the opponent (number)
--]]
element:UpdateColorArenaPreparation(specID)
else
-- this section just replicates the color options available to the Health and Power elements
local r, g, b, color, _
-- if(element.colorPower and elementName == 'Power') then
-- FIXME: no idea if we can get power type here without the unit
if(element.colorClass) then
local _, _, _, _, _, class = GetSpecializationInfoByID(specID)
color = self.colors.class[class]
elseif(element.colorReaction) then
color = self.colors.reaction[2]
elseif(element.colorSmooth) then
_, _, _, _, _, _, r, g, b = unpack(element.smoothGradient or self.colors.smooth)
elseif(element.colorHealth and elementName == 'Health') then
color = self.colors.health
end
if(color) then
r, g, b = color[1], color[2], color[3]
end
if(r or g or b) then
element:SetStatusBarColor(r, g, b)
local bg = element.bg
if(bg) then
local mu = bg.multiplier or 1
bg:SetVertexColor(r * mu, g * mu, b * mu)
end
end
end
if(element.PostUpdateArenaPreparation) then
--[[ Callback: Health:PostUpdateArenaPreparation(event, specID)
Called after the element has been updated during arena preparation.
* self - the Health element
* event - the event triggering the update (string)
* specID - the specialization ID for the opponent (number)
--]]
--[[ Callback: Power:PostUpdateArenaPreparation(event, specID)
Called after the element has been updated during arena preparation.
* self - the Power element
* event - the event triggering the update (string)
* specID - the specialization ID for the opponent (number)
--]]
element:PostUpdateArenaPreparation(event, specID)
end
end
end
local function updateArenaPreparation(self, event)
if(not self:GetAttribute('oUF-enableArenaPrep')) then
return
end
if(event == 'ARENA_OPPONENT_UPDATE' and not self:IsEnabled()) then
self:Enable()
self:UpdateAllElements('ArenaPreparation')
self:UnregisterEvent(event, updateArenaPreparation)
-- show elements that don't handle their own visibility
if(self:IsElementEnabled('Auras')) then
if(self.Auras) then self.Auras:Show() end
if(self.Buffs) then self.Buffs:Show() end
if(self.Debuffs) then self.Debuffs:Show() end
end
if(self.Portrait and self:IsElementEnabled('Portrait')) then
self.Portrait:Show()
end
elseif(event == 'PLAYER_ENTERING_WORLD' and not UnitExists(self.unit)) then
-- semi-recursive call for when the player zones into an arena
updateArenaPreparation(self, 'ARENA_PREP_OPPONENT_SPECIALIZATIONS')
elseif(event == 'ARENA_PREP_OPPONENT_SPECIALIZATIONS') then
if(InCombatLockdown()) then
-- prevent calling protected functions if entering arena while in combat
self:RegisterEvent('PLAYER_REGEN_ENABLED', updateArenaPreparation, true)
return
end
if(self.PreUpdate) then
self:PreUpdate(event)
end
local id = tonumber(self.id)
if(not self:IsEnabled() and GetNumArenaOpponentSpecs() < id) then
-- hide the object if the opponent leaves
self:Hide()
end
local specID = GetArenaOpponentSpec(id)
if(specID) then
if(self:IsEnabled()) then
-- disable the unit watch so we can forcefully show the object ourselves
self:Disable()
self:RegisterEvent('ARENA_OPPONENT_UPDATE', updateArenaPreparation)
end
-- update Health and Power (if available) with "fake" data
updateArenaPreparationElements(self, event, 'Health', specID)
updateArenaPreparationElements(self, event, 'Power', specID)
-- hide all other (relevant) elements (they have no effect during arena prep)
if(self.Auras) then self.Auras:Hide() end
if(self.Buffs) then self.Buffs:Hide() end
if(self.Debuffs) then self.Debuffs:Hide() end
if(self.Castbar) then self.Castbar:Hide() end
if(self.CombatIndicator) then self.CombatIndicator:Hide() end
if(self.GroupRoleIndicator) then self.GroupRoleIndicator:Hide() end
if(self.Portrait) then self.Portrait:Hide() end
if(self.PvPIndicator) then self.PvPIndicator:Hide() end
if(self.RaidTargetIndicator) then self.RaidTargetIndicator:Hide() end
self:Show()
self:UpdateTags()
end
if(self.PostUpdate) then
self:PostUpdate(event)
end
elseif(event == 'PLAYER_REGEN_ENABLED') then
self:UnregisterEvent(event, updateArenaPreparation)
updateArenaPreparation(self, 'ARENA_PREP_OPPONENT_SPECIALIZATIONS')
end
end
-- Handles unit specific actions.
function oUF:HandleUnit(object, unit)
unit = object.unit or unit
if(unit == 'target') then
object:RegisterEvent('PLAYER_TARGET_CHANGED', object.UpdateAllElements, true)
elseif(unit == 'mouseover') then
object:RegisterEvent('UPDATE_MOUSEOVER_UNIT', object.UpdateAllElements, true)
elseif(unit == 'focus') then
object:RegisterEvent('PLAYER_FOCUS_CHANGED', object.UpdateAllElements, true)
elseif(unit:match('boss%d?$')) then
object:RegisterEvent('INSTANCE_ENCOUNTER_ENGAGE_UNIT', object.UpdateAllElements, true)
object:RegisterEvent('UNIT_TARGETABLE_CHANGED', object.UpdateAllElements)
elseif(unit:match('arena%d?$')) then
object:RegisterEvent('ARENA_OPPONENT_UPDATE', object.UpdateAllElements, true)
object:RegisterEvent('ARENA_PREP_OPPONENT_SPECIALIZATIONS', updateArenaPreparation, true)
object:SetAttribute('oUF-enableArenaPrep', true)
-- the event handler only fires for visible frames, so we have to hook it for arena prep
object:HookScript('OnEvent', updateArenaPreparation)
end
end
local eventlessObjects = {}
local onUpdates = {}
local function createOnUpdate(timer)
if(not onUpdates[timer]) then
local frame = CreateFrame('Frame')
local objects = eventlessObjects[timer]
frame:SetScript('OnUpdate', function(self, elapsed)
self.elapsed = (self.elapsed or 0) + elapsed
if(self.elapsed > timer) then
for _, object in next, objects do
if(object.unit and unitExists(object.unit)) then
object:UpdateAllElements('OnUpdate')
end
end
self.elapsed = 0
end
end)
onUpdates[timer] = frame
end
end
function oUF:HandleEventlessUnit(object)
object.__eventless = true
-- It's impossible to set onUpdateFrequency before the frame is created, so
-- by default all eventless frames are created with the 0.5s timer.
-- To change it you'll need to call oUF:HandleEventlessUnit(frame) one more
-- time from the layout code after oUF:Spawn(unit) returns the frame.
local timer = object.onUpdateFrequency or 0.5
-- Remove it, in case it's already registered with any timer
for _, objects in next, eventlessObjects do
for i, obj in next, objects do
if(obj == object) then
table.remove(objects, i)
break
end
end
end
if(not eventlessObjects[timer]) then eventlessObjects[timer] = {} end
table.insert(eventlessObjects[timer], object)
createOnUpdate(timer)
end
================================================
FILE: ShestakUI/Libs/oUF/oUF.lua
================================================
local parent, ns = ...
local global = GetAddOnMetadata(parent, 'X-oUF')
local _VERSION = '@project-version@'
if(_VERSION:find('project%-version')) then
_VERSION = 'devel'
end
local oUF = ns.oUF
local Private = oUF.Private
local argcheck = Private.argcheck
local error = Private.error
local print = Private.print --luacheck: no unused
local unitExists = Private.unitExists
local styles, style = {}
local callback, objects, headers = {}, {}, {}
local elements = {}
local activeElements = {}
local PetBattleFrameHider = CreateFrame('Frame', (global or parent) .. '_PetBattleFrameHider', UIParent, 'SecureHandlerStateTemplate')
PetBattleFrameHider:SetAllPoints()
PetBattleFrameHider:SetFrameStrata('LOW')
RegisterStateDriver(PetBattleFrameHider, 'visibility', '[petbattle] hide; show')
local function updateActiveUnit(self, event)
-- Calculate units to work with
local realUnit, modUnit = SecureButton_GetUnit(self), SecureButton_GetModifiedUnit(self)
-- _GetUnit() doesn't rewrite playerpet -> pet like _GetModifiedUnit does.
if(realUnit == 'playerpet') then
realUnit = 'pet'
elseif(realUnit == 'playertarget') then
realUnit = 'target'
end
if(modUnit == 'pet' and realUnit ~= 'pet') then
modUnit = 'vehicle'
end
if(not unitExists(modUnit)) then return end
-- Change the active unit and run a full update.
if(Private.UpdateUnits(self, modUnit, realUnit)) then
self:UpdateAllElements(event or 'RefreshUnit')
return true
end
end
local function evalUnitAndUpdate(self, event)
if(not updateActiveUnit(self, event)) then
return self:UpdateAllElements(event)
end
end
local function iterateChildren(...)
for i = 1, select('#', ...) do
local obj = select(i, ...)
if(type(obj) == 'table' and obj.isChild) then
updateActiveUnit(obj, 'iterateChildren')
end
end
end
local function onAttributeChanged(self, name, value)
if(name == 'unit' and value) then
if(self.hasChildren) then
iterateChildren(self:GetChildren())
end
if(not self:GetAttribute('oUF-onlyProcessChildren')) then
updateActiveUnit(self, 'OnAttributeChanged')
end
end
end
local frame_metatable = {
__index = CreateFrame('Button')
}
Private.frame_metatable = frame_metatable
for k, v in next, {
--[[ frame:EnableElement(name, unit)
Used to activate an element for the given unit frame.
* self - unit frame for which the element should be enabled
* name - name of the element to be enabled (string)
* unit - unit to be passed to the element's Enable function. Defaults to the frame's unit (string?)
--]]
EnableElement = function(self, name, unit)
argcheck(name, 2, 'string')
argcheck(unit, 3, 'string', 'nil')
local element = elements[name]
if(not element or self:IsElementEnabled(name)) then return end
if(element.enable(self, unit or self.unit)) then
activeElements[self][name] = true
if(element.update) then
table.insert(self.__elements, element.update)
end
end
end,
--[[ frame:DisableElement(name)
Used to deactivate an element for the given unit frame.
* self - unit frame for which the element should be disabled
* name - name of the element to be disabled (string)
--]]
DisableElement = function(self, name)
argcheck(name, 2, 'string')
local enabled = self:IsElementEnabled(name)
if(not enabled) then return end
local update = elements[name].update
if(update) then
for k, func in next, self.__elements do
if(func == update) then
table.remove(self.__elements, k)
break
end
end
end
activeElements[self][name] = nil
return elements[name].disable(self)
end,
--[[ frame:IsElementEnabled(name)
Used to check if an element is enabled on the given frame.
* self - unit frame
* name - name of the element (string)
--]]
IsElementEnabled = function(self, name)
argcheck(name, 2, 'string')
local element = elements[name]
if(not element) then return end
local active = activeElements[self]
return active and active[name]
end,
--[[ frame:Enable(asState)
Used to toggle the visibility of a unit frame based on the existence of its unit. This is a reference to
`RegisterUnitWatch`.
* self - unit frame
* asState - if true, the frame's "state-unitexists" attribute will be set to a boolean value denoting whether the
unit exists; if false, the frame will be shown if its unit exists, and hidden if it does not (boolean)
--]]
Enable = RegisterUnitWatch,
--[[ frame:Disable()
Used to UnregisterUnitWatch for the given frame and hide it.
* self - unit frame
--]]
Disable = function(self)
UnregisterUnitWatch(self)
self:Hide()
end,
--[[ frame:IsEnabled()
Used to check if a unit frame is registered with the unit existence monitor. This is a reference to
`UnitWatchRegistered`.
* self - unit frame
--]]
IsEnabled = UnitWatchRegistered,
--[[ frame:UpdateAllElements(event)
Used to update all enabled elements on the given frame.
* self - unit frame
* event - event name to pass to the elements' update functions (string)
--]]
UpdateAllElements = function(self, event)
local unit = self.unit
if(not unitExists(unit)) then return end
assert(type(event) == 'string', "Invalid argument 'event' in UpdateAllElements.")
if(self.PreUpdate) then
--[[ Callback: frame:PreUpdate(event)
Fired before the frame is updated.
* self - the unit frame
* event - the event triggering the update (string)
--]]
self:PreUpdate(event)
end
for _, func in next, self.__elements do
func(self, event, unit)
end
if(self.PostUpdate) then
--[[ Callback: frame:PostUpdate(event)
Fired after the frame is updated.
* self - the unit frame
* event - the event triggering the update (string)
--]]
self:PostUpdate(event)
end
end,
} do
frame_metatable.__index[k] = v
end
local function onShow(self)
evalUnitAndUpdate(self, 'OnShow')
end
local function updatePet(self, event, unit)
local petUnit
if(unit == 'target') then
return
elseif(unit == 'player') then
petUnit = 'pet'
else
-- Convert raid26 -> raidpet26
petUnit = unit:gsub('^(%a+)(%d+)', '%1pet%2')
end
if(self.unit ~= petUnit) then return end
evalUnitAndUpdate(self, event)
end
local function updateRaid(self, event)
local unitGUID = UnitGUID(self.unit)
if(unitGUID and unitGUID ~= self.unitGUID) then
self.unitGUID = unitGUID
self:UpdateAllElements(event)
end
end
-- boss6-8 exsist in some encounters, but unit event registration seems to be
-- completely broken for them, so instead we use OnUpdate to update them.
local eventlessUnits = {
boss6 = true,
boss7 = true,
boss8 = true,
}
local function isEventlessUnit(unit)
return unit and unit:match('%w+target') or eventlessUnits[unit]
end
local function initObject(unit, style, styleFunc, header, ...)
local num = select('#', ...)
for i = 1, num do
local object = select(i, ...)
local objectUnit = object:GetAttribute('oUF-guessUnit') or unit
local suffix = object:GetAttribute('unitsuffix')
-- Handle the case where someone has modified the unitsuffix attribute in
-- oUF-initialConfigFunction.
if(suffix and not objectUnit:match(suffix)) then
objectUnit = objectUnit .. suffix
end
object.__elements = {}
object.style = style
object = setmetatable(object, frame_metatable)
-- Expose the frame through oUF.objects.
table.insert(objects, object)
-- We have to force update the frames when PEW fires.
-- It's also important to evaluate units before running an update
-- because sometimes events that are required for unit updates end up
-- not firing because of loading screens. For instance, there's a slight
-- delay between UNIT_EXITING_VEHICLE and UNIT_EXITED_VEHICLE during
-- which a user can go through a loading screen after which the player
-- frame will be stuck with the 'vehicle' unit.
object:RegisterEvent('PLAYER_ENTERING_WORLD', evalUnitAndUpdate, true)
if(not isEventlessUnit(objectUnit)) then
object:RegisterEvent('UNIT_ENTERED_VEHICLE', evalUnitAndUpdate)
object:RegisterEvent('UNIT_EXITED_VEHICLE', evalUnitAndUpdate)
-- We don't need to register UNIT_PET for the player unit. We register it
-- mainly because UNIT_EXITED_VEHICLE and UNIT_ENTERED_VEHICLE don't always
-- have pet information when they fire for party and raid units.
if(objectUnit ~= 'player') then
object:RegisterEvent('UNIT_PET', updatePet)
end
end
if(not header) then
-- No header means it's a frame created through :Spawn().
object:SetAttribute('*type1', 'target')
object:SetAttribute('*type2', 'togglemenu')
object:SetAttribute('toggleForVehicle', true)
if(isEventlessUnit(objectUnit)) then
oUF:HandleEventlessUnit(object)
else
oUF:HandleUnit(object)
end
else
-- update the frame when its prev unit is replaced with a new one
-- updateRaid relies on UnitGUID to detect the unit change
object:RegisterEvent('GROUP_ROSTER_UPDATE', updateRaid, true)
if(num > 1) then
if(object:GetParent() == header) then
object.hasChildren = true
else
object.isChild = true
end
end
if(suffix == 'target') then
oUF:HandleEventlessUnit(object)
end
end
Private.UpdateUnits(object, objectUnit)
styleFunc(object, objectUnit, not header)
object:HookScript('OnAttributeChanged', onAttributeChanged)
-- NAME_PLATE_UNIT_ADDED fires after the frame is shown, so there's no
-- need to call UAE multiple times
if(not object.isNamePlate) then
object:SetScript('OnShow', onShow)
end
activeElements[object] = {}
for element in next, elements do
object:EnableElement(element, objectUnit)
end
for _, func in next, callback do
func(object)
end
-- Make Clique kinda happy
if(not object.isNamePlate) then
_G.ClickCastFrames = _G.ClickCastFrames or {}
_G.ClickCastFrames[object] = true
end
end
end
local function walkObject(object, unit)
local parent = object:GetParent()
local style = parent.style or style
local styleFunc = styles[style]
local header = parent:GetAttribute('oUF-headerType') and parent
-- Check if we should leave the main frame blank.
if(object:GetAttribute('oUF-onlyProcessChildren')) then
object.hasChildren = true
object:HookScript('OnAttributeChanged', onAttributeChanged)
return initObject(unit, style, styleFunc, header, object:GetChildren())
end
return initObject(unit, style, styleFunc, header, object, object:GetChildren())
end
--[[ oUF:RegisterInitCallback(func)
Used to add a function to a table to be executed upon unit frame/header initialization.
* self - the global oUF object
* func - function to be added
--]]
function oUF:RegisterInitCallback(func)
table.insert(callback, func)
end
--[[ oUF:RegisterMetaFunction(name, func)
Used to make a (table of) function(s) available to all unit frames.
* self - the global oUF object
* name - unique name of the function (string)
* func - function or a table of functions (function or table)
--]]
function oUF:RegisterMetaFunction(name, func)
argcheck(name, 2, 'string')
argcheck(func, 3, 'function', 'table')
if(frame_metatable.__index[name]) then
return
end
frame_metatable.__index[name] = func
end
--[[ oUF:RegisterStyle(name, func)
Used to register a style with oUF. This will also set the active style if it hasn't been set yet.
* self - the global oUF object
* name - name of the style
* func - function(s) defining the style (function or table)
--]]
function oUF:RegisterStyle(name, func)
argcheck(name, 2, 'string')
argcheck(func, 3, 'function', 'table')
if(styles[name]) then return error('Style [%s] already registered.', name) end
if(not style) then style = name end
styles[name] = func
end
--[[ oUF:SetActiveStyle(name)
Used to set the active style.
* self - the global oUF object
* name - name of the style (string)
--]]
function oUF:SetActiveStyle(name)
argcheck(name, 2, 'string')
if(not styles[name]) then return error('Style [%s] does not exist.', name) end
style = name
end
--[[ oUF:GetActiveStyle()
Used to get the active style.
* self - the global oUF object
--]]
function oUF:GetActiveStyle()
return style
end
do
local function iter(_, n)
-- don't expose the style functions.
return (next(styles, n))
end
--[[ oUF:IterateStyles()
Returns an iterator over all registered styles.
* self - the global oUF object
--]]
function oUF.IterateStyles()
return iter, nil, nil
end
end
local getCondition
do
local conditions = {
raid40 = '[@raid26,exists] show;',
raid25 = '[@raid11,exists] show;',
raid10 = '[@raid6,exists] show;',
raid = '[group:raid] show;',
party = '[group:party,nogroup:raid] show;',
solo = '[@player,exists,nogroup:party] show;',
}
function getCondition(...)
local cond = ''
for i = 1, select('#', ...) do
local short = select(i, ...)
local condition = conditions[short]
if(condition) then
cond = cond .. condition
end
end
return cond .. 'hide'
end
end
local function generateName(unit, ...)
local name = 'oUF_' .. style:gsub('^oUF_?', ''):gsub('[^%a%d_]+', '')
local raid, party, groupFilter, unitsuffix
for i = 1, select('#', ...), 2 do
local att, val = select(i, ...)
if(att == 'oUF-initialConfigFunction') then
unitsuffix = val:match('unitsuffix[%p%s]+(%a+)')
elseif(att == 'showRaid') then
raid = val ~= false and val ~= nil
elseif(att == 'showParty') then
party = val ~= false and val ~= nil
elseif(att == 'groupFilter') then
groupFilter = val
end
end
local append
if(raid) then
if(groupFilter) then
if(type(groupFilter) == 'number' and groupFilter > 0) then
append = 'Raid' .. groupFilter
elseif(groupFilter:match('MAINTANK')) then
append = 'MainTank'
elseif(groupFilter:match('MAINASSIST')) then
append = 'MainAssist'
else
local _, count = groupFilter:gsub(',', '')
if(count == 0) then
append = 'Raid' .. groupFilter
else
append = 'Raid'
end
end
else
append = 'Raid'
end
elseif(party) then
append = 'Party'
elseif(unit) then
append = unit:gsub('^%l', string.upper)
end
if(append) then
name = name .. append .. (unitsuffix or '')
end
-- Change oUF_LilyRaidRaid into oUF_LilyRaid
name = name:gsub('(%u%l+)([%u%l]*)%1', '%1')
-- Change oUF_LilyTargettarget into oUF_LilyTargetTarget
name = name:gsub('t(arget)', 'T%1')
name = name:gsub('p(et)', 'P%1')
name = name:gsub('f(ocus)', 'F%1')
local base = name
local i = 2
while(_G[name]) do
name = base .. i
i = i + 1
end
return name
end
do
local function styleProxy(self, frame)
return walkObject(_G[frame])
end
-- There has to be an easier way to do this.
local initialConfigFunction = [[
local header = self:GetParent()
local frames = table.new()
table.insert(frames, self)
self:GetChildList(frames)
for i = 1, #frames do
local frame = frames[i]
local unit
-- There's no need to do anything on frames with onlyProcessChildren
if(not frame:GetAttribute('oUF-onlyProcessChildren')) then
RegisterUnitWatch(frame)
-- Attempt to guess what the header is set to spawn.
local groupFilter = header:GetAttribute('groupFilter')
if(type(groupFilter) == 'string' and groupFilter:match('MAIN[AT]')) then
local role = groupFilter:match('MAIN([AT])')
if(role == 'T') then
unit = 'maintank'
else
unit = 'mainassist'
end
elseif(header:GetAttribute('showRaid')) then
unit = 'raid'
elseif(header:GetAttribute('showParty')) then
unit = 'party'
end
local headerType = header:GetAttribute('oUF-headerType')
local suffix = frame:GetAttribute('unitsuffix')
if(unit and suffix) then
if(headerType == 'pet' and suffix == 'target') then
unit = unit .. headerType .. suffix
else
unit = unit .. suffix
end
elseif(unit and headerType == 'pet') then
unit = unit .. headerType
end
frame:SetAttribute('*type1', 'target')
frame:SetAttribute('*type2', 'togglemenu')
frame:SetAttribute('oUF-guessUnit', unit)
end
local body = header:GetAttribute('oUF-initialConfigFunction')
if(body) then
frame:Run(body, unit)
end
end
header:CallMethod('styleFunction', self:GetName())
local clique = header:GetFrameRef('clickcast_header')
if(clique) then
clique:SetAttribute('clickcast_button', self)
clique:RunAttribute('clickcast_register')
end
]]
--[[ oUF:SpawnHeader(overrideName, template, visibility, ...)
Used to create a group header and apply the currently active style to it.
* self - the global oUF object
* overrideName - unique global name to be used for the header. Defaults to an auto-generated name based on the name
of the active style and other arguments passed to `:SpawnHeader` (string?)
* template - name of a template to be used for creating the header. Defaults to `'SecureGroupHeaderTemplate'`
(string?)
* visibility - macro conditional(s) which define when to display the header (string).
* ... - further argument pairs. Consult [Group Headers](http://wowprogramming.com/docs/secure_template/Group_Headers.html)
for possible values.
In addition to the standard group headers, oUF implements some of its own attributes. These can be supplied by the
layout, but are optional.
* oUF-initialConfigFunction - can contain code that will be securely run at the end of the initial secure
configuration (string?)
* oUF-onlyProcessChildren - can be used to force headers to only process children (boolean?)
--]]
function oUF:SpawnHeader(overrideName, template, visibility, ...)
if(not style) then return error('Unable to create frame. No styles have been registered.') end
template = (template or 'SecureGroupHeaderTemplate')
local isPetHeader = template:match('PetHeader')
local name = overrideName or generateName(nil, ...)
local header = CreateFrame('Frame', name, PetBattleFrameHider, template)
header:SetAttribute('template', 'SecureUnitButtonTemplate, SecureHandlerStateTemplate, SecureHandlerEnterLeaveTemplate')
for i = 1, select('#', ...), 2 do
local att, val = select(i, ...)
if(not att) then break end
header:SetAttribute(att, val)
end
header.style = style
header.styleFunction = styleProxy
header.visibility = visibility
-- Expose the header through oUF.headers.
table.insert(headers, header)
-- We set it here so layouts can't directly override it.
header:SetAttribute('initialConfigFunction', initialConfigFunction)
header:SetAttribute('_initialAttributeNames', '_onenter,_onleave,refreshUnitChange,_onstate-vehicleui')
header:SetAttribute('_initialAttribute-_onenter', [[
local snippet = self:GetAttribute('clickcast_onenter')
if(snippet) then
self:Run(snippet)
end
]])
header:SetAttribute('_initialAttribute-_onleave', [[
local snippet = self:GetAttribute('clickcast_onleave')
if(snippet) then
self:Run(snippet)
end
]])
header:SetAttribute('_initialAttribute-refreshUnitChange', [[
local unit = self:GetAttribute('unit')
if(unit) then
RegisterStateDriver(self, 'vehicleui', '[@' .. unit .. ',unithasvehicleui]vehicle; novehicle')
else
UnregisterStateDriver(self, 'vehicleui')
end
]])
header:SetAttribute('_initialAttribute-_onstate-vehicleui', [[
local unit = self:GetAttribute('unit')
if(newstate == 'vehicle' and unit and UnitPlayerOrPetInRaid(unit) and not UnitTargetsVehicleInRaidUI(unit)) then
self:SetAttribute('toggleForVehicle', false)
else
self:SetAttribute('toggleForVehicle', true)
end
]])
header:SetAttribute('oUF-headerType', isPetHeader and 'pet' or 'group')
if(_G.Clique) then
SecureHandlerSetFrameRef(header, 'clickcast_header', _G.Clique.header)
end
if(header:GetAttribute('showParty')) then
self:DisableBlizzard('party')
end
if(visibility) then
local type, list = string.split(' ', visibility, 2)
if(list and type == 'custom') then
RegisterAttributeDriver(header, 'state-visibility', list)
header.visibility = list
else
local condition = getCondition(string.split(',', visibility))
RegisterAttributeDriver(header, 'state-visibility', condition)
header.visibility = condition
end
end
return header
end
end
--[[ oUF:Spawn(unit, overrideName)
Used to create a single unit frame and apply the currently active style to it.
* self - the global oUF object
* unit - the frame's unit (string)
* overrideName - unique global name to use for the unit frame. Defaults to an auto-generated name based on the unit
(string?)
oUF implements some of its own attributes. These can be supplied by the layout, but are optional.
* oUF-enableArenaPrep - can be used to toggle arena prep support. Defaults to true (boolean)
--]]
function oUF:Spawn(unit, overrideName)
argcheck(unit, 2, 'string')
if(not style) then return error('Unable to create frame. No styles have been registered.') end
unit = unit:lower()
local name = overrideName or generateName(unit)
local object = CreateFrame('Button', name, PetBattleFrameHider, 'SecureUnitButtonTemplate')
Private.UpdateUnits(object, unit)
self:DisableBlizzard(unit)
walkObject(object, unit)
object:SetAttribute('unit', unit)
RegisterUnitWatch(object)
return object
end
--[[ oUF:SpawnNamePlates(prefix, callback, variables)
Used to create nameplates and apply the currently active style to them.
* self - the global oUF object
* prefix - prefix for the global name of the nameplate. Defaults to an auto-generated prefix (string?)
* callback - function to be called after a nameplate unit or the player's target has changed. The arguments passed to
the callback are the updated nameplate, if any, the event that triggered the update, and the new unit
(function?)
* variables - list of console variable-value pairs to be set when the player logs in (table?)
--]]
function oUF:SpawnNamePlates(namePrefix, nameplateCallback, nameplateCVars)
argcheck(nameplateCallback, 3, 'function', 'nil')
argcheck(nameplateCVars, 4, 'table', 'nil')
if(not style) then return error('Unable to create frame. No styles have been registered.') end
if(_G.oUF_NamePlateDriver) then return error('oUF nameplate driver has already been initialized.') end
local style = style
local prefix = namePrefix or generateName()
-- Because there's no way to prevent nameplate settings updates without tainting UI,
-- and because forbidden nameplates exist, we have to allow default nameplate
-- driver to create, update, and remove Blizz nameplates.
-- Disable only not forbidden nameplates.
NamePlateDriverFrame:HookScript('OnEvent', function(_, event, unit)
if(event == 'NAME_PLATE_UNIT_ADDED' and unit) then
self:DisableBlizzard(unit)
end
end)
local eventHandler = CreateFrame('Frame', 'oUF_NamePlateDriver')
eventHandler:RegisterEvent('NAME_PLATE_UNIT_ADDED')
eventHandler:RegisterEvent('NAME_PLATE_UNIT_REMOVED')
eventHandler:RegisterEvent('PLAYER_TARGET_CHANGED')
if(IsLoggedIn()) then
if(nameplateCVars) then
for cvar, value in next, nameplateCVars do
SetCVar(cvar, value)
end
end
else
eventHandler:RegisterEvent('PLAYER_LOGIN')
end
eventHandler:SetScript('OnEvent', function(_, event, unit)
if(event == 'PLAYER_LOGIN') then
if(nameplateCVars) then
for cvar, value in next, nameplateCVars do
SetCVar(cvar, value)
end
end
elseif(event == 'PLAYER_TARGET_CHANGED') then
local nameplate = C_NamePlate.GetNamePlateForUnit('target')
if(nameplateCallback) then
nameplateCallback(nameplate and nameplate.unitFrame, event, 'target')
end
-- UAE is called after the callback to reduce the number of
-- ForceUpdate calls layout devs have to do themselves
if(nameplate) then
nameplate.unitFrame:UpdateAllElements(event)
end
elseif(event == 'NAME_PLATE_UNIT_ADDED' and unit) then
local nameplate = C_NamePlate.GetNamePlateForUnit(unit)
if(not nameplate) then return end
if(not nameplate.unitFrame) then
nameplate.style = style
nameplate.unitFrame = CreateFrame('Button', prefix..nameplate:GetName(), nameplate)
nameplate.unitFrame:EnableMouse(false)
nameplate.unitFrame.isNamePlate = true
Private.UpdateUnits(nameplate.unitFrame, unit)
walkObject(nameplate.unitFrame, unit)
else
Private.UpdateUnits(nameplate.unitFrame, unit)
end
nameplate.unitFrame:SetAttribute('unit', unit)
if(nameplateCallback) then
nameplateCallback(nameplate.unitFrame, event, unit)
end
-- UAE is called after the callback to reduce the number of
-- ForceUpdate calls layout devs have to do themselves
nameplate.unitFrame:UpdateAllElements(event)
elseif(event == 'NAME_PLATE_UNIT_REMOVED' and unit) then
local nameplate = C_NamePlate.GetNamePlateForUnit(unit)
if(not nameplate) then return end
nameplate.unitFrame:SetAttribute('unit', nil)
if(nameplateCallback) then
nameplateCallback(nameplate.unitFrame, event, unit)
end
end
end)
end
--[[ oUF:AddElement(name, update, enable, disable)
Used to register an element with oUF.
* self - the global oUF object
* name - unique name of the element (string)
* update - used to update the element (function)
* enable - used to enable the element for a given unit frame and unit (function)
* disable - used to disable the element for a given unit frame (function)
--]]
function oUF:AddElement(name, update, enable, disable)
argcheck(name, 2, 'string')
argcheck(update, 3, 'function', 'nil')
argcheck(enable, 4, 'function')
argcheck(disable, 5, 'function')
if(elements[name]) then return error('Element [%s] is already registered.', name) end
elements[name] = {
update = update;
enable = enable;
disable = disable;
}
end
oUF.version = _VERSION
--[[ oUF.objects
Array containing all unit frames created by `oUF:Spawn`.
--]]
oUF.objects = objects
--[[ oUF.headers
Array containing all group headers created by `oUF:SpawnHeader`.
--]]
oUF.headers = headers
if(global) then
if(parent ~= 'oUF' and global == 'oUF') then
error('%s is doing it wrong and setting its global to "oUF".', parent)
elseif(_G[global]) then
error('%s is setting its global to an existing name "%s".', parent, global)
else
_G[global] = oUF
end
end
================================================
FILE: ShestakUI/Libs/oUF/oUF.xml
================================================
================================================
FILE: ShestakUI/Licenses/ElvUI
================================================
ElvUI License
Copyright 2009-2022 The contents of this addon, excluding third-party resources, are
copyrighted to their authors with all rights reserved.
This addon is free to use and the authors hereby grants you the following rights:
1. You may make modifications to this addon for private use only, you
may not publicize any portion of this addon. The only exception being you may
upload to the tukui.org or github website.
2. Do not modify the name of this addon, including the addon folders.
3. This copyright notice shall be included in all copies or substantial
portions of the Software.
All rights not explicitly addressed in this license are reserved by
the copyright holders.
================================================
FILE: ShestakUI/Licenses/ShestakUI
================================================
Copyright (c) 2009-2022 Shestak http://shestak.org
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: ShestakUI/Licenses/TukUI
================================================
Tukui License
Copyright 2009-2021 http://www.tukui.org
The contents of this addon, excluding third-party resources, are
copyrighted to their authors with all rights reserved.
Authors of this addon hereby grant you the following rights:
1. You may NOT make any modification inside this addon. If you want
to create your own edited version, please create it from outside.
2. Do not modify the name of this addon, including the addon folders.
3. Do not include this AddOn with any edited version, a user of this AddOn
must always download this addon from tukui.org or through the Tukui Client.
4. This copyright notice shall be included in all copies or substantial
portions of the Software.
Earlier versions were released under terms that did not require permission,
but due to the actions of certain unscrupulous distributors, I have chosen
to license all versions over v9 under stricter terms.
All rights not explicitly addressed in this license are reserved by
the copyright holders.
You can write to us at contact@tukui.org for reporting abuse.
================================================
FILE: ShestakUI/Licenses/oUF
================================================
Copyright (c) 2006-2022 Trond A Ekseth
Copyright (c) 2016-2022 Val Voronov
Copyright (c) 2016-2022 Adrian L Lange
Copyright (c) 2016-2022 Rainrider
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: ShestakUI/Locales/Chinese.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if T.client ~= "zhCN" then return end
----------------------------------------------------------------------------------------
-- Localization for zhCN client
-- Translation: Ianchan, Mania, Nanjiqq, Tat2dawn
----------------------------------------------------------------------------------------
-- Announce flasks and food
L_ANNOUNCE_FF_NOFOOD = "缺少食物: "
L_ANNOUNCE_FF_NOFLASK = "缺少合剂: "
L_ANNOUNCE_FF_ALLBUFFED = "已获得所有增益 !"
L_ANNOUNCE_FF_CHECK_BUTTON = "检查食物和合剂"
-- Says thanks for some spells
L_ANNOUNCE_SS_THANKS = "谢谢你的 "
L_ANNOUNCE_SS_RECEIVED = " 收到来自于 "
-- Pull countdown announce
L_ANNOUNCE_PC_GO = "开始 !"
L_ANNOUNCE_PC_MSG = "准备接怪: %s,倒数 %s.."
L_ANNOUNCE_PC_ABORTED = "取消拉怪 !"
-- Announce feasts and portals
L_ANNOUNCE_FP_PRE = "%s 放置了 %s"
L_ANNOUNCE_FP_PUT = "%s 放置了 %s"
L_ANNOUNCE_FP_CAST = "%s 开启了 %s"
L_ANNOUNCE_FP_CLICK = "%s 正在开启 %s... 请点击 !"
L_ANNOUNCE_FP_USE = "%s 使用了 %s。"
-- Announce your interrupts
L_ANNOUNCE_INTERRUPTED = "已打断"
-- Tooltip
L_TOOLTIP_NO_TALENT = "没有天赋"
L_TOOLTIP_LOADING = "读取中..."
L_TOOLTIP_ACH_STATUS = "你的状态: "
L_TOOLTIP_ACH_COMPLETE = "你的状态: 完成"
L_TOOLTIP_ACH_INCOMPLETE = "你的状态: 未完成"
L_TOOLTIP_SPELL_ID = "法术ID: "
L_TOOLTIP_ITEM_ID = "物品ID: "
L_TOOLTIP_WHO_TARGET = "关注"
L_TOOLTIP_ITEM_COUNT = "物品数量: "
L_TOOLTIP_INSPECT_OPEN = "检查框体已开启"
-- Misc
L_MISC_UNDRESS = "无装备"
L_MISC_DRINKING = " 进食中..."
L_MISC_BUY_STACK = "Alt+右键批量购买"
L_MISC_UI_OUTDATED = "ShestakUI 版本已过期,请至 www.shestak.org 下载最新版。"
L_MISC_HEADER_MARK = "鼠标悬停显示团队图标"
L_MISC_BINDER_OPEN = "鼠标绑定"
L_MISC_SCROLL = "附魔羊皮纸"
L_MISC_HEADER_QUEST = "Auto quest button" -- Needs review
-- Raid Utility
L_RAID_UTIL_DISBAND = "解散团队"
-- Zone name
L_ZONE_ANCIENTDALARAN = "达拉然巨坑"
-- WatchFrame Wowhead link
L_WATCH_WOWHEAD_LINK = "Wowhead链接"
-- Toggle Menu
L_TOGGLE_ADDON = "插件 "
L_TOGGLE_ADDONS = " 插件系列"
L_TOGGLE_EXPAND = "展开 "
L_TOGGLE_COLLAPSE = "折叠 "
L_TOGGLE_RCLICK = "右键 启用/禁用 "
L_TOGGLE_LCLICK = "左键 显示/隐藏窗口 "
L_TOGGLE_RELOAD = " (需要重载插件)"
L_TOGGLE_NOT_FOUND = " 未创建"
-- UnitFrame
L_UF_GHOST = "灵魂"
L_UF_DEAD = "死亡"
L_UF_OFFLINE = "离线"
L_UF_MANA = "低法力值"
-- Map
L_MAP_CURSOR = "指针: "
L_MAP_BOUNDS = "超出范围 !"
L_MAP_FOG = "地图全亮"
L_MAP_COORDS = "坐标"
-- Minimap
L_MINIMAP_CALENDAR = "日历"
L_MINIMAP_FARM = "小地图缩放"
L_MINIMAP_TOGGLE = "动作条自由折叠"
-- Chat
L_CHAT_WHISPER = "From"
L_CHAT_BN_WHISPER = "From"
L_CHAT_AFK = "[AFK]"
L_CHAT_DND = "[DND]"
L_CHAT_GM = "[GM]"
L_CHAT_GUILD = "G"
L_CHAT_PARTY = "P"
L_CHAT_PARTY_LEADER = "PL"
L_CHAT_RAID = "R"
L_CHAT_RAID_LEADER = "RL"
L_CHAT_RAID_WARNING = "RW"
L_CHAT_INSTANCE_CHAT = "I"
L_CHAT_INSTANCE_CHAT_LEADER = "IL"
L_CHAT_OFFICER = "O"
L_CHAT_PET_BATTLE = "PB"
L_CHAT_COME_ONLINE = "|cff298F00上线了|r"
L_CHAT_GONE_OFFLINE = "|cffff0000下线了|r"
-- Errors frame
L_ERRORFRAME_L = "点击查看错误"
-- Bags
L_BAG_SHOW_BAGS = "显示背包"
L_BAG_RIGHT_CLICK_SEARCH = "右键搜寻物品"
L_BAG_STACK_MENU = "堆叠"
L_BAG_RIGHT_CLICK_CLOSE = "右键开启菜单"
-- Grab mail
L_MAIL_STOPPED = "无法拾取,背包已满。"
L_MAIL_UNIQUE = "中止,在背包或银行发现重复的唯一物品。"
L_MAIL_COMPLETE = "完成"
L_MAIL_NEED = "需要信箱"
L_MAIL_MESSAGES = "新邮件"
-- Loot
L_LOOT_RANDOM = "随机拾取"
L_LOOT_SELF = "个人拾取"
L_LOOT_FISH = "钓鱼拾取"
L_LOOT_ANNOUNCE = "向频道通告"
L_LOOT_TO_RAID = " 团队"
L_LOOT_TO_PARTY = " 队伍"
L_LOOT_TO_GUILD = " 公会"
L_LOOT_TO_SAY = " 说"
-- LitePanels AFK module
L_PANELS_AFK = "正处于暂离状态 !"
L_PANELS_AFK_RCLICK = "右键隐藏"
L_PANELS_AFK_LCLICK = "左键脱离暂离状态"
-- Cooldowns
L_COOLDOWNS = "CD: "
L_COOLDOWNS_COMBATRESS = "战复"
L_COOLDOWNS_COMBATRESS_REMAINDER = "战复剩余: "
L_COOLDOWNS_NEXTTIME = "下次: "
-- Bind key
L_BIND_SAVED = "快捷键设置已保存"
L_BIND_DISCARD = "新的快捷键设置已撤消"
L_BIND_INSTRUCT = "将鼠标悬停至任意快捷键进行绑定。按Esc或者右键清除当前快捷键的按键绑定。"
L_BIND_CLEARED = "已清除所有快捷键设置"
L_BIND_BINDING = "绑定"
L_BIND_KEY = "按键"
L_BIND_NO_SET = "没有绑定快捷键"
-- Info text
L_INFO_ERRORS = "目前没有错误"
L_INFO_INVITE = "接受邀请"
L_INFO_DUEL = "拒绝决斗请求"
L_INFO_PET_DUEL = "拒绝宠物对战请求"
L_INFO_DISBAND = "解散队伍..."
L_INFO_SETTINGS_DBM = "键入 /settings dbm 载入 DBM 的设定"
L_INFO_SETTINGS_BIGWIGS = "键入 /settings bw 载入 BigWigs 的设定"
L_INFO_SETTINGS_MSBT = "键入 /settings msbt 载入 MSBT 的设定"
L_INFO_SETTINGS_SKADA = "键入 /settings skada 载入 Skada 的设定"
L_INFO_SETTINGS_ALL = "键入 /settings all 载入所有UI设定"
L_INFO_NOT_INSTALLED = " 没有安装"
L_INFO_SKIN_DISABLED1 = "界面美化启用"
L_INFO_SKIN_DISABLED2 = " 已禁用"
-- Moving elements
L_MOVE_RIGHT_CLICK = "右键重置位置"
L_MOVE_MIDDLE_CLICK = "中键临时隐藏"
-- Popups
L_POPUP_INSTALLUI = "该角色首次使用ShestakUI,你必须重新加载UI来配置。"
L_POPUP_RESETUI = "你确定要重新加载ShestakUI?"
L_POPUP_RESETSTATS = "你确定要重置所有角色游戏时间和金币的统计数据?"
L_POPUP_DISBAND_RAID = "你确定要解散团队?"
L_POPUP_DISABLEUI = "ShestakUI不支持此分辨率,是否停用ShestakUI? (若要尝试其他分辨率请按取消)"
L_POPUP_SETTINGS_ALL = "套用所有插件设置?(DBM/BigWigs/Skada/MSBT)"
L_POPUP_SETTINGS_DBM = "需要改变DBM锚点及样式元素"
L_POPUP_SETTINGS_BW = "需要改变BigWigs锚点及样式元素"
L_POPUP_ARMORY = "英雄榜"
-- Welcome message
L_WELCOME_LINE_1 = "欢迎使用ShestakUI "
L_WELCOME_LINE_2_1 = "键入 /cfg 进行插件设置, 或者访问http://shestak.org"
L_WELCOME_LINE_2_2 = "获取更多信息。"
-- Combat text
L_COMBATTEXT_KILLING_BLOW = "最后一击"
L_COMBATTEXT_TEST_DISABLED = "战斗信息测试模式已禁用"
L_COMBATTEXT_TEST_ENABLED = "战斗信息测试模式已启用"
L_COMBATTEXT_TEST_USE_MOVE = "键入 /xct move 移动/调整战斗信息框架大小"
L_COMBATTEXT_TEST_USE_TEST = "键入 /xct test 启用/禁用战斗信息测试模式"
L_COMBATTEXT_TEST_USE_RESET = "键入 /xct reset 恢复到初始位置"
L_COMBATTEXT_POPUP = "保存战斗信息窗口的位置须重载插件"
L_COMBATTEXT_UNSAVED = "战斗信息窗口位置尚未保存,不要忘记重新载入插件。"
L_COMBATTEXT_UNLOCKED = "战斗信息已解锁"
-- LiteStats
L_STATS_AUTO_REPAIR = "自动修装"
L_STATS_GUILD_REPAIR = "公会银行修装"
L_STATS_AUTO_SELL = "自动出售灰色物品"
L_STATS_BANDWIDTH = "宽带: "
L_STATS_DOWNLOAD = "下载: "
L_STATS_CURRENCY_RAID = "徽记"
L_STATS_MEMORY_USAGE = "插件资源占用: "
L_STATS_TOTAL_MEMORY_USAGE = "总资源占用: "
L_STATS_TOTAL_CPU_USAGE = "总CPU使用率: "
L_STATS_GARBAGE_COLLECTED = "整理内存"
L_STATS_HIDDEN = "隐藏"
L_STATS_JUNK_ALREADY_ADDITIONS = "已加入自动出售名单"
L_STATS_JUNK_ITEMLINK = "物品链接"
L_STATS_JUNK_ADDITIONS = "自动出售名单"
L_STATS_JUNK_LIST = "自动出售常用命令"
L_STATS_JUNK_PROFIT = "自动出售所得金额"
L_STATS_JUNK_CLEARED = "自动出售名单已清除"
L_STATS_JUNK_CLEAR_ADDITIONS = "清除自动出售名单"
L_STATS_JUNK_ADDED = "自动出售 - 已加入"
L_STATS_JUNK_ADD_ITEM = "增加/移除 物品"
L_STATS_JUNK_REMOVED = "自动出售 - 已移除"
L_STATS_JUNK_ITEMS_LIST = "列出自动出售名单"
L_STATS_KILLS = "击杀"
L_STATS_XP_RATE = "当前等级经验百分值"
L_STATS_HR = "小时"
L_STATS_INF = "无限"
L_STATS_ON = "启用"
L_STATS_PLAYED_LEVEL = "当前等级总在线时间"
L_STATS_PLAYED_SESSION = "此次在线时长"
L_STATS_ACC_PLAYED = "帐号启用总时间"
L_STATS_PLAYED_TOTAL = "总在线时长"
L_STATS_QUEST = "任务"
L_STATS_QUESTS_TO = "任务/杀怪得到经验值 %s"
L_STATS_CURRENT_XP = "当前/升级所需经验值"
L_STATS_REMAINING_XP = "升级尚需经验值"
L_STATS_RESTED_XP = "休息奖励经验值"
L_STATS_SERVER_GOLD = "帐号总现金"
L_STATS_SESSION_GAIN = "此次在线时段获得/损失金额"
L_STATS_SESSION_XP = "此次在线时段所得经验值"
L_STATS_SORTING_BY = "排列方式: "
L_STATS_SEALS = "本周已领徽记"
L_STATS_SPEC = "专精"
L_STATS_TIPS = "提示: "
L_STATS_OPEN_CALENDAR = "左键开/关日历"
L_STATS_RC_TIME_MANAGER = "右键开/关计时器"
L_STATS_TOGGLE_TIME = "本地/服务器及24小时制可于计时器中设置"
L_STATS_MEMORY = "内存"
L_STATS_RC_COLLECTS_GARBAGE = "帧数模块上鼠标悬停显示,右键整理内存"
L_STATS_VIEW_NOTES = "按住Alt键检视: 好友的所在地 公会成员的会阶/注记/干部注记"
L_STATS_CHANGE_SORTING = "[公会]右键密语/邀请,中键更改排列方式,Shift+中键反转排序"
L_STATS_OPEN_CHARACTER = "左键开/关角色界面"
L_STATS_RC_AUTO_REPAIRING1 = "右键开/关自动修装"
L_STATS_RC_AUTO_REPAIRING2 = "中键开/关公会修装"
L_STATS_EQUIPMENT_CHANGER = "Shift+左键或Alt+左键开启套装选单"
L_STATS_RC_EXPERIENCE = "右键切换在线时间/神器信息/经验值/声望值"
L_STATS_WATCH_FACTIONS = "左键开/关相关界面"
L_STATS_TOOLTIP_EXPERIENCE = "未达最高等级时将优先显示经验值信息"
L_STATS_TOOLTIP_TIME_PLAYED = "达到最高等级后将优先显示角色在线时间"
L_STATS_OPEN_TALENT = "左键开启专精选单,Shift+左键开启专精界面"
L_STATS_RC_TALENT = "右键开启拾取专精选单"
L_STATS_LOCATION = "位置/座标"
L_STATS_WORLD_MAP = "点击开/关世界地图"
L_STATS_INSERTS_COORDS = "Shift+左键地名/座标/定位标记自动复制到输入框"
L_STATS_OPEN_CURRENCY = "左键开/关货币界面"
L_STATS_RC_AUTO_SELLING = "右键开/关自动出售"
L_STATS_NEED_TO_SELL = "键入 /junk 列出常用命令"
L_STATS_WATCH_CURRENCY = "在货币界面已选定的货币将在金幣提示信息中显示"
L_STATS_OTHER_OPTIONS = "其它选项可以在这里设置: %s"
-- Slash commands
L_SLASHCMD_HELP = {
"可用的命令: ",
"/rl - 重载界面",
"/rc - 就位确认",
"/gm - 开启GM界面",
"/dis ADDON_NAME - 禁用指定插件",
"/en ADDON_NAME - 启用指定插件",
"/rd - 解散队伍",
"/toraid - 转换为队伍/团队",
"/teleport - 传送随机副本",
"/ss - 切换天赋",
"/tt - 密语当前目标",
"/farmmode - 开启/关闭小地图采集模式",
"/resetui - 重置一般设置到初始值",
"/resetuf - 重置头像框架到初始位置",
"/resetconfig - 重置ShestakUI_Config到初始值",
"/resetstats - 重置所有角色游戏时间和金币的统计数据",
"/settings - 设置指定插件",
"/ls - 信息条功能说明",
"/xct - 战斗信息选项",
"/raidcd - 团队技能冷却测试模式",
"/enemycd - 敌对技能冷却测试模式",
"/pulsecd - 技能冷却闪烁测试模式",
"/threat - 仇恨栏測試模式",
"/testuf - 头像框架测试模式",
"/moveui - 解锁/锁定 界面中所有可移动的框体,Ctrl+右键选中的框架重置到预设位置", -- Need review
"/cfg - 开启ShestakUI设置界面",
}
================================================
FILE: ShestakUI/Locales/English.lua
================================================
----------------------------------------------------------------------------------------
-- Localization for enUS and enGB client
----------------------------------------------------------------------------------------
-- Announce flasks and food
L_ANNOUNCE_FF_NOFOOD = "No Food: "
L_ANNOUNCE_FF_NOFLASK = "No Flask: "
L_ANNOUNCE_FF_ALLBUFFED = "All Buffed!"
L_ANNOUNCE_FF_CHECK_BUTTON = "Check food and flask"
-- Says thanks for some spells
L_ANNOUNCE_SS_THANKS = "Thanks for "
L_ANNOUNCE_SS_RECEIVED = " received from "
-- Pull countdown announce
L_ANNOUNCE_PC_GO = "GO!"
L_ANNOUNCE_PC_MSG = "Pulling %s in %s.."
L_ANNOUNCE_PC_ABORTED = "Pull ABORTED!"
-- Announce feasts and portals
L_ANNOUNCE_FP_PRE = "%s has prepared a %s."
L_ANNOUNCE_FP_PUT = "%s has put down a %s."
L_ANNOUNCE_FP_CAST = "%s is casting %s."
L_ANNOUNCE_FP_CLICK = "%s is casting %s. Click!"
L_ANNOUNCE_FP_USE = "%s used a %s."
-- Announce your interrupts
L_ANNOUNCE_INTERRUPTED = INTERRUPTED
-- Tooltip
L_TOOLTIP_NO_TALENT = "No Talents"
L_TOOLTIP_LOADING = "Loading..."
L_TOOLTIP_ACH_STATUS = "Your Status:"
L_TOOLTIP_ACH_COMPLETE = "Your Status: Completed on "
L_TOOLTIP_ACH_INCOMPLETE = "Your Status: Incomplete"
L_TOOLTIP_SPELL_ID = "Spell ID:"
L_TOOLTIP_ITEM_ID = "Item ID:"
L_TOOLTIP_WHO_TARGET = "Targeted By"
L_TOOLTIP_ITEM_COUNT = "Item count:"
L_TOOLTIP_INSPECT_OPEN = "Inspect Frame is open"
-- Misc
L_MISC_UNDRESS = "Undress"
L_MISC_DRINKING = " is drinking."
L_MISC_BUY_STACK = "Alt-Click to buy a stack"
L_MISC_UI_OUTDATED = "Your version of ShestakUI is out of date. You can download the latest version from www.shestak.org"
L_MISC_HEADER_MARK = "Mouseover Raid Icons"
L_MISC_BINDER_OPEN = "Mouse Bindings"
L_MISC_SCROLL = "Scroll"
L_MISC_HEADER_QUEST = "Auto quest button"
BINDING_NAME_QUEST_BUTTON = AUCTION_HOUSE_HEADER_ITEM
-- Raid Utility
L_RAID_UTIL_DISBAND = "Disband Group"
-- Zone name
L_ZONE_ANCIENTDALARAN = "Dalaran Crater"
-- WatchFrame Wowhead link
L_WATCH_WOWHEAD_LINK = "Wowhead link"
-- Toggle Menu
L_TOGGLE_ADDON = "Addon "
L_TOGGLE_ADDONS = " addons"
L_TOGGLE_EXPAND = "Expand "
L_TOGGLE_COLLAPSE = "Collapse "
L_TOGGLE_RCLICK = "Right click to enable or disable "
L_TOGGLE_LCLICK = "Left click to toggle window "
L_TOGGLE_RELOAD = " (needs UI reload)"
L_TOGGLE_NOT_FOUND = " not found."
-- UnitFrame
L_UF_GHOST = "Ghost"
L_UF_DEAD = "Dead"
L_UF_OFFLINE = "Offline"
L_UF_MANA = "Low mana"
-- Map
L_MAP_CURSOR = "Cursor: "
L_MAP_BOUNDS = "Out of bounds!"
L_MAP_FOG = "Fog of War"
L_MAP_COORDS = "Coordinates"
-- Minimap
L_MINIMAP_CALENDAR = "Calendar"
L_MINIMAP_FARM = "Minimap size"
L_MINIMAP_TOGGLE = "Toggle action bars"
-- Chat
L_CHAT_WHISPER = "From"
L_CHAT_BN_WHISPER = "From"
L_CHAT_AFK = "[AFK]"
L_CHAT_DND = "[DND]"
L_CHAT_GM = "[GM]"
L_CHAT_GUILD = "G"
L_CHAT_PARTY = "P"
L_CHAT_PARTY_LEADER = "PL"
L_CHAT_RAID = "R"
L_CHAT_RAID_LEADER = "RL"
L_CHAT_RAID_WARNING = "RW"
L_CHAT_INSTANCE_CHAT = "I"
L_CHAT_INSTANCE_CHAT_LEADER = "IL"
L_CHAT_OFFICER = "O"
L_CHAT_PET_BATTLE = "PB"
L_CHAT_COME_ONLINE = "has come |cff298F00online|r."
L_CHAT_GONE_OFFLINE = "has gone |cffff0000offline|r."
-- Errors frame
L_ERRORFRAME_L = "Click to view errors."
-- Bags
L_BAG_SHOW_BAGS = "Show Bags"
L_BAG_RIGHT_CLICK_SEARCH = "Right-click to search"
L_BAG_STACK_MENU = "Stack"
L_BAG_RIGHT_CLICK_CLOSE = "Right-click to open menu"
-- Grab mail
L_MAIL_STOPPED = "Stopped, inventory is full."
L_MAIL_UNIQUE = "Stopped. Found a duplicate unique item in bag or in bank."
L_MAIL_COMPLETE = "All done."
L_MAIL_NEED = "Need a mailbox."
L_MAIL_MESSAGES = "messages"
-- Loot
L_LOOT_RANDOM = "Random Player"
L_LOOT_SELF = "Self Loot"
L_LOOT_FISH = "Fishing loot"
L_LOOT_ANNOUNCE = "Announce to"
L_LOOT_TO_RAID = " raid"
L_LOOT_TO_PARTY = " party"
L_LOOT_TO_GUILD = " guild"
L_LOOT_TO_SAY = " say"
-- LitePanels AFK module
L_PANELS_AFK = "You are AFK!"
L_PANELS_AFK_RCLICK = "Right-Click to hide."
L_PANELS_AFK_LCLICK = "Left-Click to go back."
-- Cooldowns
L_COOLDOWNS = "CD: "
L_COOLDOWNS_COMBATRESS = "BattleRes"
L_COOLDOWNS_COMBATRESS_REMAINDER = "Battle Resurrection: "
L_COOLDOWNS_NEXTTIME = "Next time: "
-- Bind key
L_BIND_SAVED = "All keybindings have been saved."
L_BIND_DISCARD = "All newly set keybindings have been discarded."
L_BIND_INSTRUCT = "Hover your mouse over any actionbutton to bind it. Press the escape key or right click to clear the current actionbutton's keybinding."
L_BIND_CLEARED = "All keybindings cleared for"
L_BIND_BINDING = "Binding"
L_BIND_KEY = "Key"
L_BIND_NO_SET = "No bindings set"
-- Info text
L_INFO_ERRORS = "No error yet."
L_INFO_INVITE = "Accepted invite from "
L_INFO_DUEL = "Declined duel request from "
L_INFO_PET_DUEL = "Declined pet duel request from "
L_INFO_DISBAND = "Disbanding group..."
L_INFO_SETTINGS_DBM = "Type /settings dbm, to apply the settings DBM."
L_INFO_SETTINGS_BIGWIGS = "Type /settings bw, to apply the settings BigWigs."
L_INFO_SETTINGS_MSBT = "Type /settings msbt, to apply the settings MSBT."
L_INFO_SETTINGS_SKADA = "Type /settings skada, to apply the settings Skada."
L_INFO_SETTINGS_ALL = "Type /settings all, to apply the settings for all modifications."
L_INFO_NOT_INSTALLED = " is not installed."
L_INFO_SKIN_DISABLED1 = "Stylization for "
L_INFO_SKIN_DISABLED2 = " is disabled."
-- Moving elements
L_MOVE_RIGHT_CLICK = "Right-click to reset position"
L_MOVE_MIDDLE_CLICK = "Middle-click to temp hide"
-- Popups
L_POPUP_INSTALLUI = "First time on ShestakUI with this Character. You must reload UI to configure it."
L_POPUP_RESETUI = "Are you sure you want to reset all settings for ShestakUI?"
L_POPUP_RESETSTATS = "Are you sure you want to reset statistics for time spent in game and gold."
L_POPUP_DISBAND_RAID = "Are you sure you want to disband the group?"
L_POPUP_DISABLEUI = "ShestakUI doesn't work for this resolution, do you want to disable ShestakUI? (Cancel if you want to try another resolution)"
L_POPUP_SETTINGS_ALL = "Apply settings for all modifications? (DBM, BigWigs, Skada and MSBT)"
L_POPUP_SETTINGS_DBM = "Need to change the position of elements DBM."
L_POPUP_SETTINGS_BW = "Need to change the position of elements BigWigs."
L_POPUP_ARMORY = "Armory"
-- Welcome message
L_WELCOME_LINE_1 = "Welcome to ShestakUI "
L_WELCOME_LINE_2_1 = "Type /cfg to config interface, or visit http://shestak.org"
L_WELCOME_LINE_2_2 = "for more information."
-- Combat text
L_COMBATTEXT_KILLING_BLOW = "Killing Blow"
L_COMBATTEXT_TEST_DISABLED = "Combat text test mode disabled."
L_COMBATTEXT_TEST_ENABLED = "Combat text test mode enabled."
L_COMBATTEXT_TEST_USE_MOVE = "Type /xct move to move and resize combat text frames."
L_COMBATTEXT_TEST_USE_TEST = "Type /xct test to toggle combat text testmode."
L_COMBATTEXT_TEST_USE_RESET = "Type /xct reset to restore default positions."
L_COMBATTEXT_POPUP = "To save combat text window positions you need to reload your UI."
L_COMBATTEXT_UNSAVED = "Combat text window positions unsaved, don't forget to reload UI."
L_COMBATTEXT_UNLOCKED = "Combat text unlocked."
-- LiteStats
L_STATS_AUTO_REPAIR = "AutoRepair"
L_STATS_GUILD_REPAIR = "Repair from guild bank"
L_STATS_AUTO_SELL = "AutoSell junk"
L_STATS_BANDWIDTH = "Bandwidth:"
L_STATS_DOWNLOAD = "Download:"
L_STATS_CURRENCY_RAID = "Raid Seals"
L_STATS_MEMORY_USAGE = "Blizzard UI Memory Usage:"
L_STATS_TOTAL_MEMORY_USAGE = "Total Memory Usage:"
L_STATS_TOTAL_CPU_USAGE = "Total CPU Usage:"
L_STATS_GARBAGE_COLLECTED = "Garbage collected"
L_STATS_HIDDEN = "Hidden"
L_STATS_JUNK_ALREADY_ADDITIONS = "is already in additions list."
L_STATS_JUNK_ITEMLINK = "itemlink"
L_STATS_JUNK_ADDITIONS = "Junk additions"
L_STATS_JUNK_LIST = "Junk List"
L_STATS_JUNK_PROFIT = "Junk profit"
L_STATS_JUNK_CLEARED = "Junk list cleared."
L_STATS_JUNK_CLEAR_ADDITIONS = "Clear additions list."
L_STATS_JUNK_ADDED = "Added junk additions"
L_STATS_JUNK_ADD_ITEM = "Add/remove items."
L_STATS_JUNK_REMOVED = "Removed junk additions"
L_STATS_JUNK_ITEMS_LIST = "List for sell items."
L_STATS_KILLS = "K"
L_STATS_XP_RATE = "Level XP rate"
L_STATS_HR = "hr"
L_STATS_INF = "inf"
L_STATS_ON = "ON"
L_STATS_PLAYED_LEVEL = "Played this level"
L_STATS_PLAYED_SESSION = "Played this session"
L_STATS_ACC_PLAYED = "Account Played"
L_STATS_PLAYED_TOTAL = "Played total"
L_STATS_QUEST = "Q"
L_STATS_QUESTS_TO = "Quests/Kills to %s"
L_STATS_CURRENT_XP = "Current/Max XP"
L_STATS_REMAINING_XP = "Remaining XP"
L_STATS_RESTED_XP = "Rested XP"
L_STATS_SERVER_GOLD = "Server Gold"
L_STATS_SESSION_GAIN = "Session Gain/Loss"
L_STATS_SESSION_XP = "Session XP rate"
L_STATS_SORTING_BY = "Sorting by"
L_STATS_SEALS = "Seals this week"
L_STATS_SPEC = "Spec"
L_STATS_TIPS = "tips:"
L_STATS_OPEN_CALENDAR = "Left-Click opens calendar."
L_STATS_RC_TIME_MANAGER = "Right-Click opens time manager frame."
L_STATS_TOGGLE_TIME = "Local/realm & 24hr time can be toggled from the time manager."
L_STATS_MEMORY = "Memory"
L_STATS_RC_COLLECTS_GARBAGE = "Right-Click collects Lua garbage."
L_STATS_VIEW_NOTES = "Hold alt key to view ranks, notes and officer notes."
L_STATS_CHANGE_SORTING = "[Guild] Right-Click to invite and whisper, Middle-Click to change the sorting, Shift-Middle-Click to reverse order."
L_STATS_OPEN_CHARACTER = "Left-Click opens character tab."
L_STATS_RC_AUTO_REPAIRING1 = "Right-Click toggles auto repairing."
L_STATS_RC_AUTO_REPAIRING2 = "Middle-Click toggles guild auto repairing."
L_STATS_EQUIPMENT_CHANGER = "Shift-Click or Alt-Click for equipment set changer."
L_STATS_RC_EXPERIENCE = "Right-Click to cycle through experience, time played, and faction watcher."
L_STATS_WATCH_FACTIONS = "Watch factions from the character faction UI."
L_STATS_TOOLTIP_EXPERIENCE = "When below max level, a tooltip will be displayed with experience details."
L_STATS_TOOLTIP_TIME_PLAYED = "When at max level, the tooltip will show time played details for the account."
L_STATS_OPEN_TALENT = "Left-Click toggles your talent specialization."
L_STATS_RC_TALENT = "Right-Click toggles your loot specialization."
L_STATS_LOCATION = "Location/Coords"
L_STATS_WORLD_MAP = "Clicking opens world map."
L_STATS_INSERTS_COORDS = "Shift-Clicking location or coords module inserts your coords into chat."
L_STATS_OPEN_CURRENCY = "Left-Click opens currency tab."
L_STATS_RC_AUTO_SELLING = "Right-Click toggles auto selling."
L_STATS_NEED_TO_SELL = "Use /junk to configure which items need to sell."
L_STATS_WATCH_CURRENCY = "Watched currency tab items will reflect onto the tooltip."
L_STATS_OTHER_OPTIONS = "Other options may be configured in %s"
-- Slash commands
L_SLASHCMD_HELP = {
"Available slash commands:",
"/rl - Reload interface.",
"/rc - Activates a ready check.",
"/gm - Opens GM frame.",
"/dis ADDON_NAME - Disable Addon.",
"/en ADDON_NAME - Enable Addon.",
"/rd - Disband party or raid.",
"/toraid - Convert to party or raid.",
"/teleport - Teleportation from random dungeon.",
"/ss - Switches between talent spec's.",
"/tt - Whisper target.",
"/farmmode - Increase the size of the minimap.",
"/resetui - Resets general settings to default.",
"/resetuf - Resets the unit frames to their default position.",
"/resetconfig - Resets ShestakUI_Config settings.",
"/resetstats - Resets the statistics of gold and time spent.",
"/settings - Applies settings to msbt, dbm, skada, bw addons.",
"/ls - Help for LiteStats.",
"/xct - Manage the combat text.",
"/raidcd - Raid cooldown test.",
"/enemycd - Enemy cooldown test.",
"/pulsecd - Self cooldown pulse test.",
"/threat - Threat meter test.",
"/testuf - Unit frame test.",
"/moveui - Allows the movement of interface elements. Right-Click to reset position",
"/cfg - Opens interface settings.",
}
================================================
FILE: ShestakUI/Locales/French.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if T.client ~= "frFR" then return end
----------------------------------------------------------------------------------------
-- Localization for frFR client
-- Translation: Cranan, Puree, AlbertDuval, Skyzo-be
----------------------------------------------------------------------------------------
-- Announce flasks and food
L_ANNOUNCE_FF_NOFOOD = "Sans nourriture : "
L_ANNOUNCE_FF_NOFLASK = "Sans flacon : "
L_ANNOUNCE_FF_ALLBUFFED = "Tout le monde possède sa nourriture et son flacon !"
L_ANNOUNCE_FF_CHECK_BUTTON = "Vérifier nourriture et flacon"
-- Says thanks for some spells
L_ANNOUNCE_SS_THANKS = "Merci pour "
L_ANNOUNCE_SS_RECEIVED = " reçu de "
-- Pull countdown announce
L_ANNOUNCE_PC_GO = "Départ !"
L_ANNOUNCE_PC_MSG = "Pull %s dans %s.."
L_ANNOUNCE_PC_ABORTED = "Pull ABANDONNE !"
-- Announce feasts and portals
L_ANNOUNCE_FP_PRE = "%s a préparé un %s."
L_ANNOUNCE_FP_PUT = "%s a déposé au sol un %s."
L_ANNOUNCE_FP_CAST = "%s lance le sort %s."
L_ANNOUNCE_FP_CLICK = "%s invoque %s. Cliquez !"
L_ANNOUNCE_FP_USE = "%s a utilisé : %s."
-- Announce your interrupts
L_ANNOUNCE_INTERRUPTED = INTERRUPTED
-- Tooltip
L_TOOLTIP_NO_TALENT = "Aucun talent"
L_TOOLTIP_LOADING = "Chargement..."
L_TOOLTIP_ACH_STATUS = "Votre statut : "
L_TOOLTIP_ACH_COMPLETE = "Votre statut : Terminé"
L_TOOLTIP_ACH_INCOMPLETE = "Votre statut : Non terminé"
L_TOOLTIP_SPELL_ID = "ID du sort :"
L_TOOLTIP_ITEM_ID = "ID de l'objet :"
L_TOOLTIP_WHO_TARGET = "Est la cible de :"
L_TOOLTIP_ITEM_COUNT = "Objet(s) possédé(s) :"
L_TOOLTIP_INSPECT_OPEN = "La fenêtre d'inspection est ouverte"
-- Misc
L_MISC_UNDRESS = "Déshabillé"
L_MISC_DRINKING = " est entrain de boire."
L_MISC_BUY_STACK = "Alt-Clic pour acheter une pile d'objet"
L_MISC_UI_OUTDATED = "Une version plus récente de ShestakUI est disponible. Vous pouvez la télécharger sur www.shestak.org"
L_MISC_HEADER_MARK = "Icône de raid au survol de la souris"
L_MISC_BINDER_OPEN = "Assignations des boutons de la souris"
L_MISC_SCROLL = "Parchemin"
L_MISC_HEADER_QUEST = "Auto quest button" -- Needs review
-- Raid Utility
L_RAID_UTIL_DISBAND = "Dissoudre le raid"
-- Zone name
L_ZONE_ANCIENTDALARAN = "Cratère de Dalaran"
-- WatchFrame Wowhead link
L_WATCH_WOWHEAD_LINK = "Lien Wowhead"
-- Toggle Menu
L_TOGGLE_ADDON = "Addon "
L_TOGGLE_ADDONS = " addons"
L_TOGGLE_EXPAND = "Permet d'ajouter des barres "
L_TOGGLE_COLLAPSE = "Permet de réduire les barres "
L_TOGGLE_RCLICK = "Faites un clic droit pour activer ou désactiver "
L_TOGGLE_LCLICK = "Clic gauche pour basculer la fenêtre "
L_TOGGLE_RELOAD = " (recharger votre UI)"
L_TOGGLE_NOT_FOUND = " non trouvé."
-- UnitFrame
L_UF_GHOST = "Fantôme"
L_UF_DEAD = "Mort"
L_UF_OFFLINE = "Hors ligne"
L_UF_MANA = "Mana faible"
-- Map
L_MAP_CURSOR = "Curseur : "
L_MAP_BOUNDS = "En dehors de la carte !"
L_MAP_FOG = "Zone non découverte"
L_MAP_COORDS = "Coordonnées"
-- Minimap
L_MINIMAP_CALENDAR = "Calendrier"
L_MINIMAP_FARM = "Taille de la minimap"
L_MINIMAP_TOGGLE = "Activer/Désactiver le mode d'extension des barres d'action"
-- Chat
L_CHAT_WHISPER = "De"
L_CHAT_BN_WHISPER = "De"
L_CHAT_AFK = "[AFK]"
L_CHAT_DND = "[DND]"
L_CHAT_GM = "[GM]"
L_CHAT_GUILD = "G"
L_CHAT_PARTY = "P"
L_CHAT_PARTY_LEADER = "PL"
L_CHAT_RAID = "R"
L_CHAT_RAID_LEADER = "RL"
L_CHAT_RAID_WARNING = "AR"
L_CHAT_INSTANCE_CHAT = "I"
L_CHAT_INSTANCE_CHAT_LEADER = "IL"
L_CHAT_OFFICER = "O"
L_CHAT_PET_BATTLE = "BP"
L_CHAT_COME_ONLINE = "vient de se |cff298F00connecter|r."
L_CHAT_GONE_OFFLINE = "vient de se |cffff0000déconnecter|r."
-- Errors frame
L_ERRORFRAME_L = "Clic gauche pour afficher les erreurs."
-- Bags
L_BAG_SHOW_BAGS = "Montrer les sacs"
L_BAG_RIGHT_CLICK_SEARCH = "Clic droit pour rechercher"
L_BAG_STACK_MENU = "Empiler"
L_BAG_RIGHT_CLICK_CLOSE = "Clic droit pour ouvrir le menu"
-- Grab mail
L_MAIL_STOPPED = "Inventaire plein."
L_MAIL_UNIQUE = "Arrêt. Un objet unique a été trouvé dans le sac ou à la banque."
L_MAIL_COMPLETE = "Terminé."
L_MAIL_NEED = "Vous avez besoin d'une boîte aux lettres."
L_MAIL_MESSAGES = "messages"
-- Loot
L_LOOT_RANDOM = "Joueur aléatoire"
L_LOOT_SELF = "Procurez-vous un"
L_LOOT_FISH = "Pêche"
L_LOOT_ANNOUNCE = "Déclarer"
L_LOOT_TO_RAID = " raid"
L_LOOT_TO_PARTY = " groupe"
L_LOOT_TO_GUILD = " corps"
L_LOOT_TO_SAY = " dire"
-- LitePanels AFK module
L_PANELS_AFK = "Tu es AFK !"
L_PANELS_AFK_RCLICK = "Clic droit pour cacher."
L_PANELS_AFK_LCLICK = "Clic gauche pour revenir."
-- Cooldowns
L_COOLDOWNS = "Temps de recharge : "
L_COOLDOWNS_COMBATRESS = "Résurrection en combat"
L_COOLDOWNS_COMBATRESS_REMAINDER = "Résurrection en combat : "
L_COOLDOWNS_NEXTTIME = "Suivant : "
-- Bind key
L_BIND_SAVED = "Vos assignations de touches ont été sauvegardées."
L_BIND_DISCARD = "Vos nouvelles assignations de touches n'ont pas été sauvegardées."
L_BIND_INSTRUCT = "Passez votre souris sur la barre d'action pour l'assigner. Appuyez sur la touche échappe ou faites un clic droit pour effacer le bouton d'action en cours."
L_BIND_CLEARED = "Tous les raccourcis ont été réinitialisés pour"
L_BIND_BINDING = "Raccourcis"
L_BIND_KEY = "Touche"
L_BIND_NO_SET = "Pas encore de raccourcis"
-- Info text
L_INFO_ERRORS = "Pas d'erreur pour le moment."
L_INFO_INVITE = "Invitation acceptée par "
L_INFO_DUEL = "Duel rejetée par "
L_INFO_PET_DUEL = "Duel de familier décliné par "
L_INFO_DISBAND = "Groupe dissous..."
L_INFO_SETTINGS_DBM = "Taper /settings dbm, pour configurer DBM automatiquement."
L_INFO_SETTINGS_BIGWIGS = "Taper /settings bw, pour configurer BigWigs automatiquement."
L_INFO_SETTINGS_MSBT = "Taper /settings msbt, pour configurer msbt automatiquement."
L_INFO_SETTINGS_SKADA = "Taper /settings skada, pour configurer skada automatiquement."
L_INFO_SETTINGS_ALL = "Taper /settings all, pour tout configurer automatiquement."
L_INFO_NOT_INSTALLED = " n'est pas installé."
L_INFO_SKIN_DISABLED1 = "Personnalisation pour "
L_INFO_SKIN_DISABLED2 = " est désactivé."
-- Moving elements
L_MOVE_RIGHT_CLICK = "Clique droit de la souris pour réinitialiser la position"
L_MOVE_MIDDLE_CLICK = "Clique du milieu de la souris pour cacher temporairement"
-- Popups
L_POPUP_INSTALLUI = "Première utilisation de ShestakUI avec ce personnage. Vous devez recharger l'interface utilisateur pour le configurer."
L_POPUP_RESETUI = "Etes-vous sûr de vouloir réinitialiser ShestakUI ?"
L_POPUP_RESETSTATS = "Réinitialiser les statistiques pour le temps passé dans le jeu ?"
L_POPUP_DISBAND_RAID = "Etes-vous sûr de vouloir dissoudre le groupe ?"
L_POPUP_DISABLEUI = "ShestakUI ne fonctionne pas avec cette résolution, voulez-vous désactiver ShestakUI ? (Annuler si vous souhaitez essayer une autre résolution)"
L_POPUP_SETTINGS_ALL = "Voulez-vous appliquer les modifications pour tout ? (DBM, BigWigs, Skada et MSBT)"
L_POPUP_SETTINGS_DBM = "La position des éléments de DBM doit être changée."
L_POPUP_SETTINGS_BW = "La position des éléments de BigWigs doit être changée."
L_POPUP_ARMORY = "Armurerie"
-- Welcome message
L_WELCOME_LINE_1 = "Bienvenue sur ShestakUI "
L_WELCOME_LINE_2_1 = "Tapez /cfg pour configurer l'interface, ou visitez http://shestak.org"
L_WELCOME_LINE_2_2 = "pour plus d'informations"
-- Combat text
L_COMBATTEXT_KILLING_BLOW = "Coup Fatal"
L_COMBATTEXT_TEST_DISABLED = "Mode test de la fenêtre des textes de combat désactivé."
L_COMBATTEXT_TEST_ENABLED = "Mode test de la fenêtre des textes de combat activé."
L_COMBATTEXT_TEST_USE_MOVE = "Tapez /xct move pour bouger et redimensionner la fenêtre des textes de combat."
L_COMBATTEXT_TEST_USE_TEST = "Tapez /xct test pour activer le mode test de la fenêtre des textes de combat."
L_COMBATTEXT_TEST_USE_RESET = "Type /xct reset pour réstaurer les positions par défaut."
L_COMBATTEXT_POPUP = "Pour sauvegardez vos modifications vous devez recharger l'interface."
L_COMBATTEXT_UNSAVED = "Position de la fenêtre des textes de combat non saugardez, n'oubliez pas de recharger l'interface."
L_COMBATTEXT_UNLOCKED = "Fenêtre des textes de combat déverrouillée."
-- LiteStats
L_STATS_AUTO_REPAIR = "Réparation automatique"
L_STATS_GUILD_REPAIR = "Réparation automatique avec la banque de guilde"
L_STATS_AUTO_SELL = "Vente automatique d'objet"
L_STATS_BANDWIDTH = "Bande passante :"
L_STATS_DOWNLOAD = "Téléchargement :"
L_STATS_CURRENCY_RAID = "Sceaux de raid"
L_STATS_MEMORY_USAGE = "Usage mémoire pour l'interface Blizzard :"
L_STATS_TOTAL_MEMORY_USAGE = "Utilisation mémoire :"
L_STATS_TOTAL_CPU_USAGE = "Utilisation processeur :"
L_STATS_GARBAGE_COLLECTED = "Déchets ramassés"
L_STATS_HIDDEN = "Caché"
L_STATS_JUNK_ALREADY_ADDITIONS = "est déjà dans la liste des objets indésirables."
L_STATS_JUNK_ITEMLINK = "élément Lien"
L_STATS_JUNK_ADDITIONS = "Ajout à la liste des indésirables"
L_STATS_JUNK_LIST = "Liste de camelote"
L_STATS_JUNK_PROFIT = "Camelote profit"
L_STATS_JUNK_CLEARED = "Liste des indésirables effacée."
L_STATS_JUNK_CLEAR_ADDITIONS = "Effacer la liste des indésirables."
L_STATS_JUNK_ADDED = "Ajouté à la liste des objets indésirables"
L_STATS_JUNK_ADD_ITEM = "Ajouter/retirer des objets."
L_STATS_JUNK_REMOVED = "Retiré de la liste des objets indésirables"
L_STATS_JUNK_ITEMS_LIST = "Liste des objets à vendre."
L_STATS_KILLS = "Tuer"
L_STATS_XP_RATE = "Niveau/taux de votre XP"
L_STATS_HR = "Par heure"
L_STATS_INF = "infini"
L_STATS_ON = "ON"
L_STATS_PLAYED_LEVEL = "Temps joué à ce niveau"
L_STATS_PLAYED_SESSION = "Temps joué à cette session"
L_STATS_ACC_PLAYED = "Temps joué pour le compte"
L_STATS_PLAYED_TOTAL = "Temps joué total"
L_STATS_QUEST = "Quête"
L_STATS_QUESTS_TO = "Quêtes/Tuer à %s"
L_STATS_CURRENT_XP = "XP courant/max"
L_STATS_REMAINING_XP = "XP restant"
L_STATS_RESTED_XP = "XP reposé"
L_STATS_SERVER_GOLD = "Or possédé sur le serveur"
L_STATS_SESSION_GAIN = "Session Gain/Perte"
L_STATS_SESSION_XP = "XP session taux"
L_STATS_SORTING_BY = "Tri par"
L_STATS_SEALS = "Sceau cette semaine"
L_STATS_SPEC = "Spé"
L_STATS_TIPS = "Conseils :"
L_STATS_OPEN_CALENDAR = "Clic-Gauche ouvre le calendrier."
L_STATS_RC_TIME_MANAGER = "Clic-Droit pour ouvrir la fenêtre de gestion du temps."
L_STATS_TOGGLE_TIME = "Local/Royaume & mode 24 heures le temps peut être changé, dans la gestion des fenêtres de temps."
L_STATS_MEMORY = "Mémoire"
L_STATS_RC_COLLECTS_GARBAGE = "Cliquez-droit sur Lua recueille les déchets."
L_STATS_VIEW_NOTES = "Maintenez enfoncé la touche Alt pour voir les grades, notes et notes d'officiers."
L_STATS_CHANGE_SORTING = "[Guild] Clic-Droit pour inviter et chuchoter, Clic-Milieu pour changer le type de tri, Maj-Clic-Centre pour inverser l'ordre."
L_STATS_OPEN_CHARACTER = "Clic-Gauche ouvre l'onglet caractère."
L_STATS_RC_AUTO_REPAIRING1 = "Clic-Droit permet de basculer en mode réparation auto."
L_STATS_RC_AUTO_REPAIRING2 = "Bouton du milieu pour activer la réparation automatique de Guilde."
L_STATS_EQUIPMENT_CHANGER = "Maj-clic ou alt-clic sur le gestionnaire équipement."
L_STATS_RC_EXPERIENCE = "Clic-Droit pour faire défiler l'expérience, le temps joué, et la faction à suivre."
L_STATS_WATCH_FACTIONS = "Superviser les factions de l'onglet de Réputation."
L_STATS_TOOLTIP_EXPERIENCE = "Quand vous êtes en dessous du niveau maximum, une bulle d'aide affichera les détails concernant votre expérience."
L_STATS_TOOLTIP_TIME_PLAYED = "Quand vous êtes au niveau maximum, la bulle d'aide affichera les détails du temps de jeu pour ce compte."
L_STATS_OPEN_TALENT = "Clic-Gauche permet de modifier votre spécialisation."
L_STATS_RC_TALENT = "Clic-Droit pour modifier la spécialisation utilisée pour le butin."
L_STATS_LOCATION = "Position/Coords"
L_STATS_WORLD_MAP = "Clic ouvre la carte du monde."
L_STATS_INSERTS_COORDS = "Maj-clic sur l'emplacement ou coords insère le module de vos coords au chat"
L_STATS_OPEN_CURRENCY = "Clic-Gauche ouvre l'onglet monnaie."
L_STATS_RC_AUTO_SELLING = "Clic-Droit permet de basculer en mode vente automatique."
L_STATS_NEED_TO_SELL = "Utiliser /junk pour définir quels objets doivent être vendu."
L_STATS_WATCH_CURRENCY = "Consulté onglet monnaie articles se reflétera dans l'info bulle."
L_STATS_OTHER_OPTIONS = "Les autres options peuvent être configurées dans %s"
-- Slash commands
L_SLASHCMD_HELP = {
"Les commandes en ligne disponibles:",
"/rl - Recharge l'interface.",
"/rc - Lance un appel raid (ready check).",
"/gm - Ouvre un ticket MJ.",
"/dis ADDON_NAME - Désactive nom_addon.",
"/en ADDON_NAME - Active nom_addon.",
"/rd - Dissout le groupe ou raid.",
"/toraid - Active le mode raid.",
"/teleport - Téléportation dans le donjon aléatoire en cours.",
"/ss - Bascule d'une spécialisation talent à l'autre.",
"/tt - Chuchote à la cible.",
"/farmmode - Agrandi la taille de la minimap.",
"/resetui - Remet les paramètres généraux à leurs valeurs par défaut.",
"/resetuf - Remet les cadres d'unité à leur position par défaut.",
"/resetconfig - Remet les paramètres ShestakUI_Config à leurs valeurs par défaut.",
"/resetstats - Remet à zéro les statitisques or et temps passé en jeu.",
"/settings - Applique les paramètres pour msbt, dbm, skada, ou à tous les addons.",
"/ls - Menu d'aide pour LiteStats.",
"/xct - Menu d'aide pour le texte de combat.",
"/raidcd - Lance un test du temps de recharge Raid.",
"/enemycd - Lance un test du temps de recharge Ennemi.",
"/pulsecd - Lance un test local de Cooldown pulse.",
"/threat - Lance un test des barres de menace.",
"/testuf - Lance un test des cadres d'unité.",
"/moveui - Permet le déplacement des éléments d’interface. Clic droit pour réinitialiser la position",
"/cfg - Ouvre les paramètres de l'interface.",
}
================================================
FILE: ShestakUI/Locales/German.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if T.client ~= "deDE" then return end
----------------------------------------------------------------------------------------
-- Localization for deDE client
-- Translation: Alwa, Baine, Chubidu, F5Hellbound, Sinaris, Vienchen
----------------------------------------------------------------------------------------
-- Announce flasks and food
L_ANNOUNCE_FF_NOFOOD = "Kein Essen: "
L_ANNOUNCE_FF_NOFLASK = "Kein Fläschchen: "
L_ANNOUNCE_FF_ALLBUFFED = "Alles drin!"
L_ANNOUNCE_FF_CHECK_BUTTON = "Überprüfe Food und Flask"
-- Says thanks for some spells
L_ANNOUNCE_SS_THANKS = "Danke für "
L_ANNOUNCE_SS_RECEIVED = " erhalten von "
-- Pull countdown announce
L_ANNOUNCE_PC_GO = "GO!"
L_ANNOUNCE_PC_MSG = "Pull %s in %s.."
L_ANNOUNCE_PC_ABORTED = "Pull ABGEBROCHEN!"
-- Announce feasts and portals
L_ANNOUNCE_FP_PRE = "%s bereitet ein %s vor."
L_ANNOUNCE_FP_PUT = "%s stellt ein %s auf."
L_ANNOUNCE_FP_CAST = "%s zaubert ein %s."
L_ANNOUNCE_FP_CLICK = "%s zaubert ein %s. Klick!"
L_ANNOUNCE_FP_USE = "%s nahm %s."
-- Announce your interrupts
L_ANNOUNCE_INTERRUPTED = INTERRUPTED
-- Tooltip
L_TOOLTIP_NO_TALENT = "Keine Talente"
L_TOOLTIP_LOADING = "Lade..."
L_TOOLTIP_ACH_STATUS = "Dein Fortschritt:"
L_TOOLTIP_ACH_COMPLETE = "Dein Status: Fertig gestellt am "
L_TOOLTIP_ACH_INCOMPLETE = "Dein Status: Noch nicht Ferig"
L_TOOLTIP_SPELL_ID = "Zauber ID:"
L_TOOLTIP_ITEM_ID = "Gegenstands ID:"
L_TOOLTIP_WHO_TARGET = "Anvisiert von"
L_TOOLTIP_ITEM_COUNT = "Gegenstandsanzahl:"
L_TOOLTIP_INSPECT_OPEN = "Betrachtungsfenster offen"
-- Misc
L_MISC_UNDRESS = "Ausziehen"
L_MISC_DRINKING = " trinkt."
L_MISC_BUY_STACK = "Alt-Klick um einen Stapel zu kaufen"
L_MISC_UI_OUTDATED = "Deine Version von ShestakUI ist veraltet. Du kannst die aktuelle Version von www.shestak.org laden"
L_MISC_HEADER_MARK = "Mausdrüber Raid Icon"
L_MISC_BINDER_OPEN = "Maus gebunden"
L_MISC_SCROLL = "Rolle"
L_MISC_HEADER_QUEST = "Auto quest button" -- Needs review
-- Raid Utility
L_RAID_UTIL_DISBAND = "Gruppe auflösen"
-- Zone name
L_ZONE_ANCIENTDALARAN = "Dalarankrater"
-- WatchFrame Wowhead link
L_WATCH_WOWHEAD_LINK = "Wowhead Link"
-- Toggle Menu
L_TOGGLE_ADDON = "Erweiterung "
L_TOGGLE_ADDONS = " Erweiterungen"
L_TOGGLE_EXPAND = "erweitern "
L_TOGGLE_COLLAPSE = "schließen "
L_TOGGLE_RCLICK = "Rechtsklick zum Aktivieren oder Deaktiveren "
L_TOGGLE_LCLICK = "Links klicken um Fenster aktiv zu halten "
L_TOGGLE_RELOAD = " (benötigt UI neustart)"
L_TOGGLE_NOT_FOUND = " nicht gefunden."
-- UnitFrame
L_UF_GHOST = "Geist"
L_UF_DEAD = "Tod"
L_UF_OFFLINE = "Offline"
L_UF_MANA = "Niedriges Mana"
-- Map
L_MAP_CURSOR = "Mauszeiger: "
L_MAP_BOUNDS = "Außerhalb der Begrenzung!"
L_MAP_FOG = "Nebel des Krieges"
L_MAP_COORDS = "Koordinaten"
-- Minimap
L_MINIMAP_CALENDAR = "Kalender"
L_MINIMAP_FARM = "Minimap größe"
L_MINIMAP_TOGGLE = "Aktionsleisten umschalten"
-- Chat
L_CHAT_WHISPER = "Von"
L_CHAT_BN_WHISPER = "Von"
L_CHAT_AFK = "[AFK]"
L_CHAT_DND = "[DND]"
L_CHAT_GM = "[GM]"
L_CHAT_GUILD = "G"
L_CHAT_PARTY = "P"
L_CHAT_PARTY_LEADER = "PL"
L_CHAT_RAID = "R"
L_CHAT_RAID_LEADER = "RL"
L_CHAT_RAID_WARNING = "RW"
L_CHAT_INSTANCE_CHAT = "I"
L_CHAT_INSTANCE_CHAT_LEADER = "IL"
L_CHAT_OFFICER = "O"
L_CHAT_PET_BATTLE = "PB"
L_CHAT_COME_ONLINE = "ist jetzt |cff298F00online|r."
L_CHAT_GONE_OFFLINE = "ist jetzt |cffff0000offline|r."
-- Errors frame
L_ERRORFRAME_L = "Klick um Fehler anzuzeigen."
-- Bags
L_BAG_SHOW_BAGS = "Zeige Taschen"
L_BAG_RIGHT_CLICK_SEARCH = "Rechtsklick um zu suchen"
L_BAG_STACK_MENU = "Stapeln"
L_BAG_RIGHT_CLICK_CLOSE = "Rechtsklick öffnet Menü"
-- Grab mail
L_MAIL_STOPPED = "Angehalten, Inventar ist voll."
L_MAIL_UNIQUE = "Angehalten, dieses einzigartiges Item befindet sich bereits in der Tasche oder auf der Bank."
L_MAIL_COMPLETE = "Alles Fertig."
L_MAIL_NEED = "Benötige einen Briefkasten."
L_MAIL_MESSAGES = "nachrichten"
-- Loot
L_LOOT_RANDOM = "Zufälliger Spieler"
L_LOOT_SELF = "Selbst nehmen"
L_LOOT_FISH = "Angeln"
L_LOOT_ANNOUNCE = "Ansagen"
L_LOOT_TO_RAID = " schlachtzug"
L_LOOT_TO_PARTY = " gruppe"
L_LOOT_TO_GUILD = " gilde"
L_LOOT_TO_SAY = " sagen"
-- LitePanels AFK module
L_PANELS_AFK = "Du bist AFK!"
L_PANELS_AFK_RCLICK = "Rechts-Klick zum Verstecken."
L_PANELS_AFK_LCLICK = "Links-Klick um zurück zu gehen."
-- Cooldowns
L_COOLDOWNS = "Abklingzeit: "
L_COOLDOWNS_COMBATRESS = "Battlerezz"
L_COOLDOWNS_COMBATRESS_REMAINDER = "Battlerezz übrig: "
L_COOLDOWNS_NEXTTIME = "Nächste möglichkeit: "
-- Bind key
L_BIND_SAVED = "Alle Tastenbelegungen wurden gespeichert."
L_BIND_DISCARD = "Alle grade neu belegten Tastenbelegungen wurden verworfen."
L_BIND_INSTRUCT = "Bewege deine Maus über einen Aktionsbutton um ihn mit einem Hotkey zu belegen. Drücke Escape oder Rechte Maustaste um die aktuelle Tastenbelegeung des Buttons zu löschen."
L_BIND_CLEARED = "Alle Tastaturbelegungen gelöscht für"
L_BIND_BINDING = "Belegung"
L_BIND_KEY = "Taste"
L_BIND_NO_SET = "Keine Tastaturbelegung festgelegt"
-- Info text
L_INFO_ERRORS = "Noch keine Fehler."
L_INFO_INVITE = "Gruppeneinladung akzeptiert von "
L_INFO_DUEL = "Duellanfrage Ignoriert von "
L_INFO_PET_DUEL = "Haustier Duellanfrage Ignoriert von "
L_INFO_DISBAND = "Löse Gruppe auf..."
L_INFO_SETTINGS_DBM = "Gebe /settings dbm ein, um DBM Einstellungen zu laden."
L_INFO_SETTINGS_BIGWIGS = "Gebe /settings bw ein, um BigWigs Einstellungen zu laden."
L_INFO_SETTINGS_MSBT = "Gebe /settings msbt ein, um die MSBT Einstellungen zu laden."
L_INFO_SETTINGS_SKADA = "Gebe /settings skada ein, um die Skada Einstellungen zu laden."
L_INFO_SETTINGS_ALL = "Gebe /settings all ein, um die Einstellungen für alle unterstützten AddOns zu laden."
L_INFO_NOT_INSTALLED = " ist nicht installiert."
L_INFO_SKIN_DISABLED1 = "Stilisierung für "
L_INFO_SKIN_DISABLED2 = " ist ausgeschaltet."
-- Moving elements
L_MOVE_RIGHT_CLICK = "Right-click to reset position" -- Needs review
L_MOVE_MIDDLE_CLICK = "Middle-click to temp hide" -- Needs review
-- Popups
L_POPUP_INSTALLUI = "Dies ist Ihre erste Benutzung von ShestakUI mit diesem Charakter. Um das Interface zu konfigurieren, wird das UI nun neugeladen."
L_POPUP_RESETUI = "Sind Sie sich sicher, dass Sie die Einstellungen von ShestakUI zurückgesetzen wollen?"
L_POPUP_RESETSTATS = "Bist du sicher das du die Gold und verbrachte Zeit Statistik zurücksetzen möchtest?"
L_POPUP_DISBAND_RAID = "Bist du dir sicher, dass du die Gruppe auflösen möchtest?"
L_POPUP_DISABLEUI = "ShestakUI funktioniert nicht mit deiner Auflösung, möchtest du ShestakUI ausschalten? (Drücke Abbrechen, falls du eine andere Auflösung testen willst)"
L_POPUP_SETTINGS_ALL = "Einstellungen für alle AddOns übernehmen? (DBM, BigWigs, Skada und MSBT)"
L_POPUP_SETTINGS_DBM = "Die Position der DBM Elemente muss verändert werden."
L_POPUP_SETTINGS_BW = "Die Position der BigWigs Elemente muss verändert werden."
L_POPUP_ARMORY = "Waffenkammer"
-- Welcome message
L_WELCOME_LINE_1 = "Willkommen bei ShestakUI "
L_WELCOME_LINE_2_1 = "Gebe /cfg ein um das Interface zu konfigurieren, oder besuche http://shestak.org"
L_WELCOME_LINE_2_2 = "für weitere Informationen."
-- Combat text
L_COMBATTEXT_KILLING_BLOW = "Todesstoß"
L_COMBATTEXT_TEST_DISABLED = "Kampftext Testmodus deaktiviert."
L_COMBATTEXT_TEST_ENABLED = "Kampftext Testmodus aktiviert."
L_COMBATTEXT_TEST_USE_MOVE = "Gib '/xct move' ein um die Kampftext Fenster freizugeben um sie verschieben und verändern zu können."
L_COMBATTEXT_TEST_USE_TEST = "Gib '/xct' ein um den Kampftext Testmodus zu aktivieren."
L_COMBATTEXT_TEST_USE_RESET = "Gib /xct reset ein, um die Standardpositionen wiederherzustellen."
L_COMBATTEXT_POPUP = "Um die Kampftext Fensterpositionen zu sichern muss das Interface neu geladen werden."
L_COMBATTEXT_UNSAVED = "Kampftext Fensterpositionen nicht gespeichert, vergiss nicht das Interface neu zu laden."
L_COMBATTEXT_UNLOCKED = "Kampftext freigegeben."
-- LiteStats
L_STATS_AUTO_REPAIR = "Automatisch reparieren"
L_STATS_GUILD_REPAIR = "Reparieren mithilfe der Gildenbank"
L_STATS_AUTO_SELL = "Junk automatisch verkaufen"
L_STATS_BANDWIDTH = "Bandbreite:"
L_STATS_DOWNLOAD = "Download:"
L_STATS_CURRENCY_RAID = "Schlachtzugs Siegel"
L_STATS_MEMORY_USAGE = "Blizzard UI Speicher Auslastung:"
L_STATS_TOTAL_MEMORY_USAGE = "Gesamte Speicherausnutzung:"
L_STATS_TOTAL_CPU_USAGE = "Gesamte CPU-Auslastung:"
L_STATS_GARBAGE_COLLECTED = "Abfall zusammengefasst"
L_STATS_HIDDEN = "Versteckt"
L_STATS_JUNK_ALREADY_ADDITIONS = "ist bereits in der Ergänzungsliste."
L_STATS_JUNK_ITEMLINK = "itemlink"
L_STATS_JUNK_ADDITIONS = "Junk-Ergänzungen"
L_STATS_JUNK_LIST = "Junk-Liste"
L_STATS_JUNK_PROFIT = "Junk-Gewinn"
L_STATS_JUNK_CLEARED = "Junk-Liste bereinigt."
L_STATS_JUNK_CLEAR_ADDITIONS = "Ergänzungsliste leeren."
L_STATS_JUNK_ADDED = "Hinzufügen von Junk"
L_STATS_JUNK_ADD_ITEM = "Items hinzufügen/entfernen."
L_STATS_JUNK_REMOVED = "Entfernen von Junk-Zusätzen"
L_STATS_JUNK_ITEMS_LIST = "Liste für Verkaufsartikel."
L_STATS_KILLS = "G"
L_STATS_XP_RATE = "Level XP-Rate"
L_STATS_HR = "std"
L_STATS_INF = "unend"
L_STATS_ON = "AN"
L_STATS_PLAYED_LEVEL = "Auf diesem Level gespielt"
L_STATS_PLAYED_SESSION = "Diese Sitzung gespielt"
L_STATS_ACC_PLAYED = "Gesamtspielzeit"
L_STATS_PLAYED_TOTAL = "Gesamt gespielt"
L_STATS_QUEST = "Q"
L_STATS_QUESTS_TO = "Quests/Getötet bis %s"
L_STATS_CURRENT_XP = "Aktuell/Max XP"
L_STATS_REMAINING_XP = "Verbleibende XP"
L_STATS_RESTED_XP = "Erholte XP"
L_STATS_SERVER_GOLD = "Server Gold"
L_STATS_SESSION_GAIN = "Sitzung - Gewinn/Verlust"
L_STATS_SESSION_XP = "Sitzung - XP Rate"
L_STATS_SORTING_BY = "Sortieren nach"
L_STATS_SEALS = "Angebot der Woche"
L_STATS_SPEC = "Spec"
L_STATS_TIPS = "Tipps:"
L_STATS_OPEN_CALENDAR = "Links-Klick, zum Öffnen des Kalenders."
L_STATS_RC_TIME_MANAGER = "Rechts-Klick, um die Einstellungen der Uhr anzuzeigen."
L_STATS_TOGGLE_TIME = "Lokal/Realm & 24-Stunden-Modus können in den Einstellungen der Uhr gewechselt werden."
L_STATS_MEMORY = "Speicher"
L_STATS_RC_COLLECTS_GARBAGE = "Rechts-Klick sammelt Lua-Abfall."
L_STATS_VIEW_NOTES = "Halte die Alt-Taste gedrückt, zum Anzeigen der Ränge, Notizen und Offizier Notizen."
L_STATS_CHANGE_SORTING = "[Gilde] Rechts-Klick, zum Ändern der Sortierung und Umschalt-Rechts-Klick zum Umkehren der Reihenfolge."
L_STATS_OPEN_CHARACTER = "Links-Klick, zum Öffnen des Charakterfensters."
L_STATS_RC_AUTO_REPAIRING1 = "Rechts-Klick, zum Ein- oder Ausschalten des automatischen Reparieren."
L_STATS_RC_AUTO_REPAIRING2 = "Mittelklick schaltet Gilde AutoReparatur ein und aus."
L_STATS_EQUIPMENT_CHANGER = "Umschalt-Klick oder Alt-Klick für den Ausrüstungsmanager."
L_STATS_RC_EXPERIENCE = "Rechts-Klick, zum Wechseln zwischen Erfahrung, gespielte Zeit und Fraktionsüberwachung."
L_STATS_WATCH_FACTIONS = "Überwache Fraktionen aus dem Ruffenster."
L_STATS_TOOLTIP_EXPERIENCE = "Wenn unter dem max. Level, wird ein Tooltip mit weiteren Details angezeigt."
L_STATS_TOOLTIP_TIME_PLAYED = "Wenn das max. Level erreicht ist, wird das Tooltip die gespielte Zeit für den Account anzeigen."
L_STATS_OPEN_TALENT = "Links-Klick, zum Wechseln Deiner Talentspezialisierung."
L_STATS_RC_TALENT = "Rechts-Klick ändert die Beute Spezialisierung."
L_STATS_LOCATION = "Standort/Koordinaten"
L_STATS_WORLD_MAP = "Klicken, zum Öffnen der World-Map."
L_STATS_INSERTS_COORDS = "Umschalt-Klick auf das Standort/Koordination Modul, zum Einfügen Deiner aktuellen Koordinaten in den Chat."
L_STATS_OPEN_CURRENCY = "Links-Klick, zum Öffnen des Abzeichen-Fensters."
L_STATS_RC_AUTO_SELLING = "Rechts-Klick, zum Ein- oder Ausschalten des automatischen Verkaufen."
L_STATS_NEED_TO_SELL = "Verwende /junk, um zu konfigurieren, welche Artikel verkauft werden sollen."
L_STATS_WATCH_CURRENCY = "Bereits gesehene Gegenstände aus dem Abzeichen-Fenster werden im Tooltip angezeigt."
L_STATS_OTHER_OPTIONS = "Weitere Einstellungen können in %s konfiguriert werden"
-- Slash commands
L_SLASHCMD_HELP = {
"Available slash commands:",
"/rl - Interface neu laden.",
"/rc - Starte Bereitschaftscheck.",
"/gm - Öffne das Game Master Fenster.",
"/dis ADDON_NAME - Deaktiviere Addon.",
"/en ADDON_NAME - Aktiviere Addon.",
"/rd - Gruppe oder Schlachtzug auflösen.",
"/toraid - In Gruppe oder Schlachtzug umwandeln.",
"/teleport - Teleport vom beliebigen Dungeon.",
"/ss - Zwischen den Talenten wechseln.",
"/tt - Ziehl anflüstern.",
"/farmmode - Erhöht die Größe der Minimap.",
"/resetui - Zurücksetzen der allgemeinen Einstellungen auf die Standardwerte.",
"/resetuf - Zurücksetzen der Einheitenfenster auf die Standardposition.",
"/resetconfig - Zurücksetzen der ShestakUI_Config Einstellungen.",
"/resetstats - Gold Statistik und gespielte Zeit zurücksetzen.",
"/settings - Einstellungen für msbt, dbm, skada, oder alle Addons anwenden.",
"/ls - Hilfe für LiteStats.",
"/xct - Kampflogtext verwalten.",
"/raidcd - Abklingzeiten für Schlachtzüge testen.",
"/enemycd - Gegnerische Abklingzeiten testen.",
"/pulsecd - Pulsierende Abklingzeiten testen.",
"/threat - Bedrohungsmeter testen.",
"/testuf - Einheitenfenster testen.",
"/moveui - Ermöglicht das Bewegen der Interface Elemente.", -- Need review
"/cfg - Interface Einstellungen öffnen.",
}
================================================
FILE: ShestakUI/Locales/Italian.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if T.client ~= "itIT" then return end
----------------------------------------------------------------------------------------
-- Localization for itIT client
-- Translation: Oz
----------------------------------------------------------------------------------------
-- Announce flasks and food
L_ANNOUNCE_FF_NOFOOD = "Senza beneficio da cibo: "
L_ANNOUNCE_FF_NOFLASK = "Senza beneficio da tonico: "
L_ANNOUNCE_FF_ALLBUFFED = "Tutti i benefici sono attivi!"
L_ANNOUNCE_FF_CHECK_BUTTON = "Controllo cibi e tonici"
-- Says thanks for some spells
L_ANNOUNCE_SS_THANKS = "Grazie per "
L_ANNOUNCE_SS_RECEIVED = " ricevuto/a da "
-- Pull countdown announce
L_ANNOUNCE_PC_GO = "VIA!"
L_ANNOUNCE_PC_MSG = "Avvio incontro %s in %s.."
L_ANNOUNCE_PC_ABORTED = "Avvio incontro ANNULLATO!"
-- Announce feasts and portals
L_ANNOUNCE_FP_PRE = "%s ha preparato un/una %s."
L_ANNOUNCE_FP_PUT = "%s ha messo già un/una %s."
L_ANNOUNCE_FP_CAST = "%s sta lanciando %s."
L_ANNOUNCE_FP_CLICK = "%s sta lanciando %s. Cliccate!"
L_ANNOUNCE_FP_USE = "%s ha utilizzato un/una %s."
-- Announce your interrupts
L_ANNOUNCE_INTERRUPTED = INTERRUPTED
-- Tooltip
L_TOOLTIP_NO_TALENT = "Nessun talento"
L_TOOLTIP_LOADING = "Caricamento..."
L_TOOLTIP_ACH_STATUS = "Il tuo status è:"
L_TOOLTIP_ACH_COMPLETE = "Il tuo status è: completato "
L_TOOLTIP_ACH_INCOMPLETE = "Il tuo status è: incompleto"
L_TOOLTIP_SPELL_ID = "ID incantesimo/abilità:"
L_TOOLTIP_ITEM_ID = "ID oggetto:"
L_TOOLTIP_WHO_TARGET = "Bersaglio di"
L_TOOLTIP_ITEM_COUNT = "Conteggio oggetti:"
L_TOOLTIP_INSPECT_OPEN = "Il riquadro 'Ispeziona' è aperto"
-- Misc
L_MISC_UNDRESS = "Senza vestiti"
L_MISC_DRINKING = " sta bevendo."
L_MISC_BUY_STACK = "Alt + click per comprarne una pila"
L_MISC_UI_OUTDATED = "La tua versione della ShestakUI non è aggiornata: puoi scaricare la nuova versione da www.shestak.org."
L_MISC_HEADER_MARK = "Marchi d'incursione al passaggio del mouse"
L_MISC_BINDER_OPEN = "Assegnazione pulsanti mouse"
L_MISC_SCROLL = "Pergamena"
L_MISC_HEADER_QUEST = "Auto quest button" -- Needs review
-- Raid Utility
L_RAID_UTIL_DISBAND = "Sciogli il gruppo"
-- Zone name
L_ZONE_ANCIENTDALARAN = "Cratere di Dalaran"
-- WatchFrame Wowhead link
L_WATCH_WOWHEAD_LINK = "Collegamento a Wowhead"
-- Toggle Menu
L_TOGGLE_ADDON = "AddOn "
L_TOGGLE_ADDONS = " AddOns"
L_TOGGLE_EXPAND = "Espandi"
L_TOGGLE_COLLAPSE = "Rimpicciolisci "
L_TOGGLE_RCLICK = "Clicca col destro per attivare o disattivare "
L_TOGGLE_LCLICK = "Clicca col sinistro per mostrare la finestra "
L_TOGGLE_RELOAD = " (bisogna ricaricare l'interfaccia)"
L_TOGGLE_NOT_FOUND = " non trovata."
-- UnitFrame
L_UF_GHOST = "Spirito"
L_UF_DEAD = "Morto"
L_UF_OFFLINE = "Disconnesso"
L_UF_MANA = "Poco mana"
-- Map
L_MAP_CURSOR = "Cursore: "
L_MAP_BOUNDS = "Fuori i confini!"
L_MAP_FOG = "Nebbia della guerra"
L_MAP_COORDS = "Coordinate"
-- Minimap
L_MINIMAP_CALENDAR = "Calendario"
L_MINIMAP_FARM = "Minimap size" -- Need review
L_MINIMAP_TOGGLE = "Toggle action bars" -- Need review
-- Chat
L_CHAT_WHISPER = "Da"
L_CHAT_BN_WHISPER = "DA"
L_CHAT_AFK = "[Assente]"
L_CHAT_DND = "[Occupato]"
L_CHAT_GM = "[RG]"
L_CHAT_GUILD = "G"
L_CHAT_PARTY = "GR"
L_CHAT_PARTY_LEADER = "CGR"
L_CHAT_RAID = "IN"
L_CHAT_RAID_LEADER = "CIN"
L_CHAT_RAID_WARNING = "AIN"
L_CHAT_INSTANCE_CHAT = "IS"
L_CHAT_INSTANCE_CHAT_LEADER = "CIS"
L_CHAT_OFFICER = "UF"
L_CHAT_PET_BATTLE = "STM"
L_CHAT_COME_ONLINE = "si è |cff298F00connesso/a|r."
L_CHAT_GONE_OFFLINE = "si è |cffff0000disconnesso/a|r."
-- Errors frame
L_ERRORFRAME_L = "Clicca per vedere gli errori."
-- Bags
L_BAG_SHOW_BAGS = "Mostra le sacche"
L_BAG_RIGHT_CLICK_SEARCH = "Clicca col destro per cercare"
L_BAG_STACK_MENU = "Impila oggetti identici"
L_BAG_RIGHT_CLICK_CLOSE = "Clicca col destro per aprire il menu"
-- Grab mail
L_MAIL_STOPPED = "Interrotto, l'inventario è pieno."
L_MAIL_UNIQUE = "Interrotto. È stato rinvenuto il duplicato di un oggetto unico in una sacca o in banca."
L_MAIL_COMPLETE = "Completato."
L_MAIL_NEED = "Hai bisogno della cassetta delle lettere."
L_MAIL_MESSAGES = "messaggi"
-- Loot
L_LOOT_RANDOM = "Giocatore casuale"
L_LOOT_SELF = "Bottino personale"
L_LOOT_FISH = "Bottino pescato"
L_LOOT_ANNOUNCE = "Annuncia a"
L_LOOT_TO_RAID = " incursione"
L_LOOT_TO_PARTY = " gruppo"
L_LOOT_TO_GUILD = " gilda"
L_LOOT_TO_SAY = " dice"
-- LitePanels AFK module
L_PANELS_AFK = "Sei assente!"
L_PANELS_AFK_RCLICK = "Click destro = nascondi pannello."
L_PANELS_AFK_LCLICK = "Click sinistro = non più assente."
-- Cooldowns
L_COOLDOWNS = "RC: "
L_COOLDOWNS_COMBATRESS = "Resurrezione in Combattimento"
L_COOLDOWNS_COMBATRESS_REMAINDER = "Resurrezione in combattimento: "
L_COOLDOWNS_NEXTTIME = "Tempi di ricarica: "
-- Bind key
L_BIND_SAVED = "Tutte le assegnazioni tasti sono state salvate."
L_BIND_DISCARD = "Tutte le nuove assegnazioni tasti non sono state salvate."
L_BIND_INSTRUCT = "Passa il tuo mouse sullo scomparto della barra delle azioni a cui vuoi assegnare un tasto. Premi il pulsante ESC o il tasto destro per cancellare l'attuale assegnazione tasti di quello scomparto."
L_BIND_CLEARED = "Tutte le assegnazioni tasti sono state cancellate per"
L_BIND_BINDING = "Assegnazione"
L_BIND_KEY = "Tasto"
L_BIND_NO_SET = "Nessuna assegnazione impostata"
-- Info text
L_INFO_ERRORS = "Nessun errore ancora."
L_INFO_INVITE = "Accettato l'invito di "
L_INFO_DUEL = "Declinata la richiesta di duello di "
L_INFO_PET_DUEL = "Declinata la richiesta di duello tra mascottes di "
L_INFO_DISBAND = "Scioglimento gruppo..."
L_INFO_SETTINGS_DBM = "Digita /settings dbm per applicare le impostazioni predefinite per DBM."
L_INFO_SETTINGS_BIGWIGS = "Digita /settings bw per applicare le impostazioni predefinite per BigWigs."
L_INFO_SETTINGS_MSBT = "Digita /settings msbt per applicare le impostazioni predefinite per MSBT."
L_INFO_SETTINGS_SKADA = "Digita /settings skada per applicare le impostazioni predefinite per Skada."
L_INFO_SETTINGS_ALL = "Digita /settings all, per applicare le impostazioni predefinite per tutte le AddOns."
L_INFO_NOT_INSTALLED = " non è installato."
L_INFO_SKIN_DISABLED1 = "Restyling per "
L_INFO_SKIN_DISABLED2 = " è disabilitato."
-- Moving elements
L_MOVE_RIGHT_CLICK = "Right-click to reset position" -- Needs review
L_MOVE_MIDDLE_CLICK = "Middle-click to temp hide" -- Needs review
-- Popups
L_POPUP_INSTALLUI = "È la prima volta che utilizzi la ShestakUI con questo personaggio. Devi riavviare l'interfaccia utente per configurarla."
L_POPUP_RESETUI = "Vuoi davvero ripristinare tutte le impostazioni iniziali della ShestakUI?"
L_POPUP_RESETSTATS = "Vuoi davvero riazzerare tutte le statistiche relative a tempo trascorso in gioco e oro?"
L_POPUP_DISBAND_RAID = "Vuoi davvero sciogliere il gruppo?"
L_POPUP_DISABLEUI = "A questa risoluzione la ShestakUI non funziona correttamente, vuoi disabilitare l'AddOn (clicca 'Cancella' se vuoi provare con un'altra risoluzione)?"
L_POPUP_SETTINGS_ALL = "Applica le impostazioni per tutte le AddOns (DBM, BigWigs, Skada e MSBT)?"
L_POPUP_SETTINGS_DBM = "È necessario cambiare la posizione degli elementi di DBM."
L_POPUP_SETTINGS_BW = "È necessario cambiare la posizione degli elementi di BigWigs."
L_POPUP_ARMORY = "Armeria"
-- Welcome message
L_WELCOME_LINE_1 = "Benvenuto/a in ShestakUI "
L_WELCOME_LINE_2_1 = "Digita /cfg per configurare l'interfaccia oppure visita http://shestak.org"
L_WELCOME_LINE_2_2 = "per maggiori informazioni."
-- Combat text
L_COMBATTEXT_KILLING_BLOW = "Colpo di grazia"
L_COMBATTEXT_TEST_DISABLED = "Modalità 'prova' del testo di combattimento disabilitata."
L_COMBATTEXT_TEST_ENABLED = "Modalità 'prova' del testo di combattimento abilitata."
L_COMBATTEXT_TEST_USE_MOVE = "Digita '/xct move' per sbloccare e quindi poter muovere e ridimensionare i riquadri del testo di combattimento."
L_COMBATTEXT_TEST_USE_TEST = "Digita '/xct test' per attivare la modalità 'prova' per il testo di combattimento."
L_COMBATTEXT_TEST_USE_RESET = "Digita '/xct reset' to ripristinare le posizioni predefinite."
L_COMBATTEXT_POPUP = "Per poter salvare la posizione delle finestre del testo di combattimento è necessario riavviare la tua interfaccia utente."
L_COMBATTEXT_UNSAVED = "La posizione delle finestre del testo di combattimento non è ancora stata salvata: non dimenticare di riavviare l'interfaccia utente."
L_COMBATTEXT_UNLOCKED = "Testo di combattimento sbloccato."
-- LiteStats
L_STATS_AUTO_REPAIR = "Riparazione automatica"
L_STATS_GUILD_REPAIR = "Riparazione con i fondi di gilda"
L_STATS_AUTO_SELL = "Vendita automatica delle cianfrusaglie"
L_STATS_BANDWIDTH = "Larghezza banda:"
L_STATS_DOWNLOAD = "Download:"
L_STATS_CURRENCY_RAID = "Sigilli d’incursione"
L_STATS_MEMORY_USAGE = "Utilizzo memoria interfaccia Blizzard:"
L_STATS_TOTAL_MEMORY_USAGE = "Utilizzo totale memoria:"
L_STATS_TOTAL_CPU_USAGE = "Total CPU Usage:" -- Need review
L_STATS_GARBAGE_COLLECTED = "Spazzatura raccolta"
L_STATS_HIDDEN = "Nascosto/a"
L_STATS_JUNK_ALREADY_ADDITIONS = "is already in additions list." -- Need review
L_STATS_JUNK_ITEMLINK = "Collegamento all'oggetto"
L_STATS_JUNK_ADDITIONS = "Junk additions" -- Need review
L_STATS_JUNK_LIST = "Elenco cianfrusaglie"
L_STATS_JUNK_PROFIT = "Profitto vendita cianfrusaglie"
L_STATS_JUNK_CLEARED = "Junk list cleared." -- Need review
L_STATS_JUNK_CLEAR_ADDITIONS = "Clear additions list." -- Need review
L_STATS_JUNK_ADDED = "Added junk additions" -- Need review
L_STATS_JUNK_ADD_ITEM = "Add/remove items." -- Need review
L_STATS_JUNK_REMOVED = "Removed junk additions" -- Need review
L_STATS_JUNK_ITEMS_LIST = "List for sell items." -- Need review
L_STATS_KILLS = "U"
L_STATS_XP_RATE = "Andamento PE per il livello"
L_STATS_HR = "o"
L_STATS_INF = "inf"
L_STATS_ON = "Acceso"
L_STATS_PLAYED_LEVEL = "Tempo giocato a questo livello"
L_STATS_PLAYED_SESSION = "Tempo giocato in questa sessione"
L_STATS_ACC_PLAYED = "Account in uso"
L_STATS_PLAYED_TOTAL = "Tempo giocato totale"
L_STATS_QUEST = "M"
L_STATS_QUESTS_TO = "Missioni/uccisioni per %s"
L_STATS_CURRENT_XP = "PE attuali/massimi"
L_STATS_REMAINING_XP = "PE rimanenti"
L_STATS_RESTED_XP = "PE da 'riposato'"
L_STATS_SERVER_GOLD = "Oro totale su questo reame"
L_STATS_SESSION_GAIN = "Guadagno/perdita della sessione"
L_STATS_SESSION_XP = "Andamento PE della sessione"
L_STATS_SORTING_BY = "Suddivisi per"
L_STATS_SEALS = "Sigilli in questa settimana"
L_STATS_SPEC = "Spec" -- Need review
L_STATS_TIPS = "suggerimenti:"
L_STATS_OPEN_CALENDAR = "Clicca col sinistro per aprire il calendario."
L_STATS_RC_TIME_MANAGER = "Clicca col destro per aprire le impostazionni orologio."
L_STATS_TOGGLE_TIME = "L'orario 'locale/reame' e quello '24 ore' possono essere attivati con le impostazioni orologio."
L_STATS_MEMORY = "Memoria"
L_STATS_RC_COLLECTS_GARBAGE = "Clicca col destro per raccogliere la 'spazzatura Lua'."
L_STATS_VIEW_NOTES = "Tieni premuto il tasto Alt per visualizzare ranghi, note e note degli ufficiali."
L_STATS_CHANGE_SORTING = "[Gilda] Clicca col destro per invitare e sussurrare, clicca col tasto centrale per cambiare l'ordine, clicca Shift + tasto centrale per invertirlo."
L_STATS_OPEN_CHARACTER = "Clicca col sinistro per aprire il pannello personaggio."
L_STATS_RC_AUTO_REPAIRING1 = "Clicca col destro per attivare/disattivare la riparazione automatica."
L_STATS_RC_AUTO_REPAIRING2 = "Middle-Click toggles Guild AutoRepairing." -- Need review
L_STATS_EQUIPMENT_CHANGER = "Tieni premuto Shift o Alt è clicca per cambiare il set d'equipaggiamento." -- Need review
L_STATS_RC_EXPERIENCE = "Clicca col destro per navigare tra esperienza, tempo giocato e il visualizzatore fazione sotto osservazione."
L_STATS_WATCH_FACTIONS = "Fazioni sotto osservazione dal pannello delle fazioni del personaggio."
L_STATS_TOOLTIP_EXPERIENCE = "A livelli inferiori a quello massimo, un suggerimento mostrerà dettagli sull'esperienza."
L_STATS_TOOLTIP_TIME_PLAYED = "A livello massimo, un suggerimento mostrerà i dettagli su quanto tempo hai giocato con questo account."
L_STATS_OPEN_TALENT = "Clicca col sinistro per cambiare la spec. talenti attiva."
L_STATS_RC_TALENT = "Right-Click toggles your loot specialization." -- Need review
L_STATS_LOCATION = "Località/Coordinate"
L_STATS_WORLD_MAP = "Clicca per aprire la mappa del mondo."
L_STATS_INSERTS_COORDS = "Tieni premuto Shift e clicca sul nome della località o sulle coordinate per inserirli automaticamente in chat."
L_STATS_OPEN_CURRENCY = "Clicca col sinistro per aprire il pannello Valuta."
L_STATS_RC_AUTO_SELLING = "Clicca col destro per attivare/disattivare la vendita automatica delle cianfrusaglie"
L_STATS_NEED_TO_SELL = "Use /junk to configure which items need to sell." -- Need review
L_STATS_WATCH_CURRENCY = "Gli oggetti attualmente osservati nel pannello Valuta saranno inseriti nei suggerimenti."
L_STATS_OTHER_OPTIONS = "Altre opzioni potranno essere configurate tra %s"
-- Slash commands
L_SLASHCMD_HELP = {
"Comandi slash disponibili:",
"/rl - Ricarica l'interfaccia.",
"/rc - Avvia un appello.",
"/gm - Apri il pannello per interagire con i RG.",
"/dis ADDON_NAME - Disabilita AddOn.",
"/en ADDON_NAME - Attiva AddOn.",
"/rd - Sciogli gruppo o incursione.",
"/toraid - Trasforma il gruppo in incursione.",
"/teleport - Teletrasporto dalle spedizioni casuali.",
"/ss - Passa da una specializzazione dei talenti all'altra",
"/tt - Sussurra al bersaglio.",
"/farmmode - Incrementa le dimensioni della minimappa.",
"/resetui - Ripristina le impostazioni generali iniziali.",
"/resetuf - Riporta i riquadri delle unità alla loro posizione originaria.",
"/resetconfig - Riporta le impostazioni della ShestakUI_Config a quelle iniziali.",
"/resetstats - Riazzera le statistiche su oro e tempo di gioco.",
"/settings - Applica le impostazioni a MSBT, DBM, Skada o a tutte le AddOns.",
"/ls - Comandi d'aiuto per LiteStats.",
"/xct - Gestione testo di combattimento.",
"/raidcd - Prova i recuperi d'incursione.",
"/enemycd - Prova i recuperi del nemico.",
"/pulsecd - Prova i tuoi recuperi con effetto 'pulse'.",
"/threat - Prova il Contatore Minaccia.",
"/testuf - Prova i riquadri delle unità.",
"/moveui - Consenti lo spostamento degli elementi dell'interfaccia.", -- Need review
"/cfg - Apri il pannello impostazioni interfaccia.",
}
================================================
FILE: ShestakUI/Locales/Russian.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if T.client ~= "ruRU" then return end
----------------------------------------------------------------------------------------
-- Localization for ruRU client
-- Translation: Shestak, Wetxius
----------------------------------------------------------------------------------------
-- Announce flasks and food
L_ANNOUNCE_FF_NOFOOD = "Нет еды: "
L_ANNOUNCE_FF_NOFLASK = "Нет настоя: "
L_ANNOUNCE_FF_ALLBUFFED = "Еда и настой есть у всех. Можно щемить!"
L_ANNOUNCE_FF_CHECK_BUTTON = "Проверка еды и настоя"
-- Says thanks for some spells
L_ANNOUNCE_SS_THANKS = "Спасибо за "
L_ANNOUNCE_SS_RECEIVED = " получено от "
-- Pull countdown announce
L_ANNOUNCE_PC_GO = "ВЫСТУПАЕМ!"
L_ANNOUNCE_PC_MSG = "Атакуем %s через %s.."
L_ANNOUNCE_PC_ABORTED = "Атака ОТМЕНЕНА!"
-- Announce feasts and portals
L_ANNOUNCE_FP_PRE = "%s готовит %s."
L_ANNOUNCE_FP_PUT = "%s ставит %s."
L_ANNOUNCE_FP_CAST = "%s создает %s."
L_ANNOUNCE_FP_CLICK = "%s создает %s. Кликаем!"
L_ANNOUNCE_FP_USE = "%s использует %s."
-- Announce your interrupts
L_ANNOUNCE_INTERRUPTED = INTERRUPTED
-- Tooltip
L_TOOLTIP_NO_TALENT = "Нет талантов"
L_TOOLTIP_LOADING = "Загрузка..."
L_TOOLTIP_ACH_STATUS = "Ваш статус:"
L_TOOLTIP_ACH_COMPLETE = "Ваш статус: Получено "
L_TOOLTIP_ACH_INCOMPLETE = "Ваш статус: Не завершено"
L_TOOLTIP_SPELL_ID = "Номер заклинания:"
L_TOOLTIP_ITEM_ID = "Номер предмета:"
L_TOOLTIP_WHO_TARGET = "Выбран целью"
L_TOOLTIP_ITEM_COUNT = "Количество предметов:"
L_TOOLTIP_INSPECT_OPEN = "Открыто окно осмотра"
-- Misc
L_MISC_UNDRESS = "Раздеть"
L_MISC_DRINKING = " пьёт."
L_MISC_BUY_STACK = "Зажмите Alt и щелкните мышью, чтобы купить связку"
L_MISC_UI_OUTDATED = "Ваша версия ShestakUI устарела. Вы можете скачать последнюю версию с www.shestak.org"
L_MISC_HEADER_MARK = "Метки по наведению курсора"
L_MISC_BINDER_OPEN = "Назначения мыши"
L_MISC_SCROLL = "Свиток"
L_MISC_HEADER_QUEST = "Кнопка для квестоввых предметов"
-- Raid Utility
L_RAID_UTIL_DISBAND = "Распустить группу"
-- Zone name
L_ZONE_ANCIENTDALARAN = "Даларанский кратер"
-- WatchFrame Wowhead link
L_WATCH_WOWHEAD_LINK = "Ссылка на Wowhead"
-- Toggle Menu
L_TOGGLE_ADDON = "Модификация "
L_TOGGLE_ADDONS = " модификации"
L_TOGGLE_EXPAND = "Показать "
L_TOGGLE_COLLAPSE = "Скрыть "
L_TOGGLE_RCLICK = "ПКМ - Включить или выключить "
L_TOGGLE_LCLICK = "ЛКМ - Показать окно "
L_TOGGLE_RELOAD = " (необходимо перезагрузить интерфейс)"
L_TOGGLE_NOT_FOUND = " не найден."
-- UnitFrame
L_UF_GHOST = "Призрак"
L_UF_DEAD = "Мёртв"
L_UF_OFFLINE = "Не в сети"
L_UF_MANA = "Мало маны"
-- Map
L_MAP_CURSOR = "Курсор: "
L_MAP_BOUNDS = "Вне карты!"
L_MAP_FOG = "Туман войны"
L_MAP_COORDS = "Координаты"
-- Minimap
L_MINIMAP_CALENDAR = "Календарь"
L_MINIMAP_FARM = "Размер миникарты"
L_MINIMAP_TOGGLE = "Переключение панелей команд"
-- Chat
L_CHAT_WHISPER = "От"
L_CHAT_BN_WHISPER = "От"
L_CHAT_AFK = "[AFK]"
L_CHAT_DND = "[DND]"
L_CHAT_GM = "[GM]"
L_CHAT_GUILD = "Г"
L_CHAT_PARTY = "Гр"
L_CHAT_PARTY_LEADER = "Лгр"
L_CHAT_RAID = "Р"
L_CHAT_RAID_LEADER = "ЛР"
L_CHAT_RAID_WARNING = "ОР"
L_CHAT_INSTANCE_CHAT = "П"
L_CHAT_INSTANCE_CHAT_LEADER = "ЛП"
L_CHAT_OFFICER = "О"
L_CHAT_PET_BATTLE = "БП"
L_CHAT_COME_ONLINE = "|cff298F00входит|r в игровой мир."
L_CHAT_GONE_OFFLINE = "|cffff0000выходит|r из игрового мира."
-- Errors frame
L_ERRORFRAME_L = "Щелкните, чтобы посмотреть ошибки."
-- Bags
L_BAG_SHOW_BAGS = "Показать сумки"
L_BAG_RIGHT_CLICK_SEARCH = "ПКМ для поиска"
L_BAG_STACK_MENU = "Сложить"
L_BAG_RIGHT_CLICK_CLOSE = "ПКМ, чтобы открыть меню"
-- Grab mail
L_MAIL_STOPPED = "Сбор почты приостановлен. Нет места в сумках."
L_MAIL_UNIQUE = "Сбор почты приостановлен. Найден дубликат уникального предмета в сумке или банке."
L_MAIL_COMPLETE = "Сбор почты окончен."
L_MAIL_NEED = "Нужен почтовый ящик."
L_MAIL_MESSAGES = "сообщений"
-- Loot
L_LOOT_RANDOM = "Случайному игроку"
L_LOOT_SELF = "Забрать себе"
L_LOOT_FISH = "Рыбалка"
L_LOOT_ANNOUNCE = "Объявить"
L_LOOT_TO_RAID = " рейду"
L_LOOT_TO_PARTY = " группе"
L_LOOT_TO_GUILD = " гильдии"
L_LOOT_TO_SAY = " сказав"
-- LitePanels AFK module
L_PANELS_AFK = "Вы отсутствуете!"
L_PANELS_AFK_RCLICK = "Нажмите ПКМ, чтобы скрыть."
L_PANELS_AFK_LCLICK = "Нажмите ЛКМ, чтобы вернуться."
-- Cooldowns
L_COOLDOWNS = "Перезарядка: "
L_COOLDOWNS_COMBATRESS = "Возрождение"
L_COOLDOWNS_COMBATRESS_REMAINDER = "Возрождений в бою: "
L_COOLDOWNS_NEXTTIME = "Следующее: "
-- Bind key
L_BIND_SAVED = "Все назначения клавиш сохранены."
L_BIND_DISCARD = "Все новые назначения клавиш были отменены."
L_BIND_INSTRUCT = "Наведите указатель мыши на кнопку действия, чтобы назначить клавишу. Нажмите клавишу ESC или правую кнопку мыши, чтобы убрать назначение."
L_BIND_CLEARED = "Все назначения были отменены для клавиши"
L_BIND_BINDING = "Назначение"
L_BIND_KEY = "Клавиша"
L_BIND_NO_SET = "Не назначено"
-- Info text
L_INFO_ERRORS = "Ошибок не обнаружено."
L_INFO_INVITE = "Приглашение принято от "
L_INFO_DUEL = "Дуэль отклонена от "
L_INFO_PET_DUEL = "Битва питомцев отклонена от "
L_INFO_DISBAND = "Роспуск группы..."
L_INFO_SETTINGS_DBM = "Введите /settings dbm, чтобы применить настройки DBM."
L_INFO_SETTINGS_BIGWIGS = "Введите /settings bw, чтобы применить настройки BigWigs."
L_INFO_SETTINGS_MSBT = "Введите /settings msbt, чтобы применить настройки MSBT."
L_INFO_SETTINGS_SKADA = "Введите /settings skada, чтобы применить настройки Skada."
L_INFO_SETTINGS_ALL = "Введите /settings all, чтобы применить настройки для всех модификаций."
L_INFO_NOT_INSTALLED = " не установлен."
L_INFO_SKIN_DISABLED1 = "Стилизация для "
L_INFO_SKIN_DISABLED2 = " выключена."
-- Moving elements
L_MOVE_RIGHT_CLICK = "Правый клик - сбросить позицию"
L_MOVE_MIDDLE_CLICK = "Средний клик - временно скрыть"
-- Popups
L_POPUP_INSTALLUI = "Это первый запуск ShestakUI для этого персонажа. Необходимо перезагрузить интерфейс для его настройки."
L_POPUP_RESETUI = "Вы уверены, что хотите сбросить настройки ShestakUI?"
L_POPUP_RESETSTATS = "Вы уверены, что хотите сбросить статистику золота и проведенного времени в игре?"
L_POPUP_DISBAND_RAID = "Вы уверены, что хотите распустить группу?"
L_POPUP_DISABLEUI = "ShestakUI не работает на этом разрешении, хотите отключить ShestakUI? (Отмена, если хотите попробовать другое разрешение)"
L_POPUP_SETTINGS_ALL = "Применить настройки для всех модификаций? (DBM, BigWigs, Skada и MSBT)"
L_POPUP_SETTINGS_DBM = "Необходимо изменить позиции элементов DBM."
L_POPUP_SETTINGS_BW = "Необходимо изменить позиции элементов BigWigs."
L_POPUP_ARMORY = "Оружейная"
-- Welcome message
L_WELCOME_LINE_1 = "Добро пожаловать в ShestakUI "
L_WELCOME_LINE_2_1 = "Введите /cfg для входа в настройки интерфейса, или посетите страницу http://shestak.org"
L_WELCOME_LINE_2_2 = "для получения дополнительной информации."
-- Combat text
L_COMBATTEXT_KILLING_BLOW = "Смерт. Удар"
L_COMBATTEXT_TEST_DISABLED = "Тестовый режим текста боя выключен."
L_COMBATTEXT_TEST_ENABLED = "Тестовый режим текста боя включен."
L_COMBATTEXT_TEST_USE_MOVE = "Введите /xct move, чтобы передвинуть или изменить размер области текста боя."
L_COMBATTEXT_TEST_USE_TEST = "Введите /xct test, чтобы включить тестовый режим текста боя."
L_COMBATTEXT_TEST_USE_RESET = "Введите /xct reset, чтобы вернуть позиции по умолчанию."
L_COMBATTEXT_POPUP = "Для сохранения позиций текста боя необходимо перезагрузить интерфейс."
L_COMBATTEXT_UNSAVED = "Позиции текста боя не сохранены, не забудьте перезагрузить интерфейс."
L_COMBATTEXT_UNLOCKED = "Текст боя разблокирован."
-- LiteStats
L_STATS_AUTO_REPAIR = "Автопочинка"
L_STATS_GUILD_REPAIR = "Починка из банка гильдии"
L_STATS_AUTO_SELL = "Автопродажа"
L_STATS_BANDWIDTH = "Скорость:"
L_STATS_DOWNLOAD = "Загрузка:"
L_STATS_CURRENCY_RAID = "Печати"
L_STATS_MEMORY_USAGE = "Использование памяти Blizzard:"
L_STATS_TOTAL_MEMORY_USAGE = "Всего использовано памяти:"
L_STATS_TOTAL_CPU_USAGE = "Использование процессора:"
L_STATS_GARBAGE_COLLECTED = "Память очищена"
L_STATS_HIDDEN = "Скрытые"
L_STATS_JUNK_ALREADY_ADDITIONS = "уже в списке автопродажи."
L_STATS_JUNK_ITEMLINK = "Ссылка на предмет"
L_STATS_JUNK_ADDITIONS = "Предметы для автопродажи"
L_STATS_JUNK_LIST = "Список автопродажи"
L_STATS_JUNK_PROFIT = "Прибыль с продажи"
L_STATS_JUNK_CLEARED = "Cписок автопродажи очищен."
L_STATS_JUNK_CLEAR_ADDITIONS = "Очистить список."
L_STATS_JUNK_ADDED = "Добавлено для автопродажи"
L_STATS_JUNK_ADD_ITEM = "Добавить/удалить предмет."
L_STATS_JUNK_REMOVED = "Удалено из автопродажи"
L_STATS_JUNK_ITEMS_LIST = "Список предметов для автопродажи."
L_STATS_KILLS = "У"
L_STATS_XP_RATE = "Темп XP на этом уровне"
L_STATS_HR = "ч"
L_STATS_INF = "бесконечно"
L_STATS_ON = "ВКЛ."
L_STATS_PLAYED_LEVEL = "Время игры на этом уровне"
L_STATS_PLAYED_SESSION = "Время игры на этой сессии"
L_STATS_ACC_PLAYED = "Время игры персонажем"
L_STATS_PLAYED_TOTAL = "Общее время игры"
L_STATS_QUEST = "З"
L_STATS_QUESTS_TO = "Заданий/Убийств до %s"
L_STATS_CURRENT_XP = "Текущий/Макс. опыт"
L_STATS_REMAINING_XP = "Осталось опыта"
L_STATS_RESTED_XP = "Опыт отдыха"
L_STATS_SERVER_GOLD = "Золото на сервере"
L_STATS_SESSION_GAIN = "Получено/Потрачено за сеанс"
L_STATS_SESSION_XP = "Темп XP за этот сеанс"
L_STATS_SORTING_BY = "Сортировка по"
L_STATS_SEALS = "Печатей на этой неделе"
L_STATS_SPEC = "Спек"
L_STATS_TIPS = "cоветы:"
L_STATS_OPEN_CALENDAR = "ЛКМ открывает календарь."
L_STATS_RC_TIME_MANAGER = "ПКМ открывает часы."
L_STATS_TOGGLE_TIME = "Местное/Серверное и 24-ч. показ времени изменяются через меню часов."
L_STATS_MEMORY = "Память"
L_STATS_RC_COLLECTS_GARBAGE = "ПКМ очищает память от lua мусора."
L_STATS_VIEW_NOTES = "Зажмите Alt для просмотра званий, обычных заметок и офицерских."
L_STATS_CHANGE_SORTING = "[Гильдия] ПКМ приглашения и шепот, СКМ изменяет сортировку, Shift+СКМ изменяет порядок сортировки."
L_STATS_OPEN_CHARACTER = "ЛКМ открывает окно персонажа."
L_STATS_RC_AUTO_REPAIRING1 = "ПКМ переключает автопочинку."
L_STATS_RC_AUTO_REPAIRING2 = "CКМ переключает автопочинку гильдии."
L_STATS_EQUIPMENT_CHANGER = "Shift+ЛКМ или Alt+ЛКМ показывает комплекты экипировки."
L_STATS_RC_EXPERIENCE = "ПКМ переключает показ опыта, время игры, слежение за фракцией."
L_STATS_WATCH_FACTIONS = "Отслеживание фракции из окна репутации."
L_STATS_TOOLTIP_EXPERIENCE = "Когда уровень не максимальный, подсказка будет показывать подробности опыта."
L_STATS_TOOLTIP_TIME_PLAYED = "Когда уровень максимальный, подсказка будет показывать время игры персонажами."
L_STATS_OPEN_TALENT = "ЛКМ переключает вашу специализацию."
L_STATS_RC_TALENT = "ПКМ переключает вашу добычу для специализации."
L_STATS_LOCATION = "Зона/Координаты"
L_STATS_WORLD_MAP = "Нажатие открывает карту."
L_STATS_INSERTS_COORDS = "Shift+клик по модулю зоны или координат для вставки в чат ваших текущих координат."
L_STATS_OPEN_CURRENCY = "ЛКМ открывает окно валюты."
L_STATS_RC_AUTO_SELLING = "ПКМ переключает автопродажу."
L_STATS_NEED_TO_SELL = "Введите /junk, чтобы настроить какие предметы принудительно продавать."
L_STATS_WATCH_CURRENCY = "Отслеживаемая валюта отображается в подсказке."
L_STATS_OTHER_OPTIONS = "Другие настройки вы можете изменить в %s"
-- Slash commands
L_SLASHCMD_HELP = {
"Доступные слэш-команды:",
"/rl - Перезагружает интерфейс.",
"/rc - Провести проверку готовности группы/рейда.",
"/gm - Связаться с ГМ. Помощь по игре.",
"/dis ADDON_NAME - Выключение аддона.",
"/en ADDON_NAME - Включение аддона.",
"/rd - Расформировать группу/рейд.",
"/toraid - Конвертация в группу/рейд.",
"/teleport - Телепортация из подземелья.",
"/ss - Переключение специализации.",
"/tt - Шепнуть цели.",
"/farmmode - Увеличивает миникарту.",
"/resetui - Сброс общих настроек на стандартные.",
"/resetuf - Сброс позиций юнит фреймов.",
"/resetconfig - Сброс настроек ShestakUI_Config.",
"/resetstats - Сброс статистики золота и проведенного времени.",
"/settings - Применение настроек для модификаций (msbt, dbm, skada, bw).",
"/ls - Помощь для инфо-текстов.",
"/xct - Управление текстом боя.",
"/raidcd - Тест рейдовых перезарядок.",
"/enemycd - Тест вражеских перезарядок.",
"/pulsecd - Тест своих перезарядок.",
"/threat - Тест списка угрозы.",
"/testuf - Тест юнит фреймов.",
"/moveui - Перемещение элементов интерфейса. Правый клик для сброса позиции",
"/cfg - Открыть настройки интерфейса.",
}
================================================
FILE: ShestakUI/Locales/Spanish.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if T.client ~= "esES" and T.client ~= "esMX" then return end
----------------------------------------------------------------------------------------
-- Localization for esES and esMX client
-- Translation: eXecrate, Seal
----------------------------------------------------------------------------------------
-- Announce flasks and food
L_ANNOUNCE_FF_NOFOOD = "No Food: " -- Needs review
L_ANNOUNCE_FF_NOFLASK = "No Flask: " -- Needs review
L_ANNOUNCE_FF_ALLBUFFED = "All Buffed!" -- Needs review
L_ANNOUNCE_FF_CHECK_BUTTON = "Check food and flask" -- Needs review
-- Says thanks for some spells
L_ANNOUNCE_SS_THANKS = "Thanks for " -- Needs review
L_ANNOUNCE_SS_RECEIVED = " received from " -- Needs review
-- Pull countdown announce
L_ANNOUNCE_PC_GO = "GO!" -- Needs review
L_ANNOUNCE_PC_MSG = "Pulling %s in %s.." -- Needs review
L_ANNOUNCE_PC_ABORTED = "Pull ABORTED!" -- Needs review
-- Announce feasts and portals
L_ANNOUNCE_FP_PRE = "%s has prepared a %s." -- Needs review
L_ANNOUNCE_FP_PUT = "%s has put down a %s." -- Needs review
L_ANNOUNCE_FP_CAST = "%s is casting %s." -- Needs review
L_ANNOUNCE_FP_CLICK = "%s is casting %s. Click!" -- Needs review
L_ANNOUNCE_FP_USE = "%s used a %s." -- Needs review
-- Announce your interrupts
L_ANNOUNCE_INTERRUPTED = INTERRUPTED
-- Tooltip
L_TOOLTIP_NO_TALENT = "No tienes talentos"
L_TOOLTIP_LOADING = "Cargando..."
L_TOOLTIP_ACH_STATUS = "Estado:"
L_TOOLTIP_ACH_COMPLETE = "Estado: Completado "
L_TOOLTIP_ACH_INCOMPLETE = "Estado: Incompleto"
L_TOOLTIP_SPELL_ID = "ID del hechizo:"
L_TOOLTIP_ITEM_ID = "ID del objeto:"
L_TOOLTIP_WHO_TARGET = "Marcado por"
L_TOOLTIP_ITEM_COUNT = "Contador del objeto:"
L_TOOLTIP_INSPECT_OPEN = "Inspect Frame is open" -- Needs review
-- Misc
L_MISC_UNDRESS = "Desvestir"
L_MISC_DRINKING = " esta bebiendo."
L_MISC_BUY_STACK = "Alt-Click para comprar un lote"
L_MISC_UI_OUTDATED = "Tu versión de ShestakUI no está actualizada. Puedes descargar la última versión de www.shestak.org"
L_MISC_HEADER_MARK = "Mouseover Raid Icons" -- Needs review
L_MISC_BINDER_OPEN = "Mouse Bindings" -- Needs review
L_MISC_SCROLL = "Pergamino"
L_MISC_HEADER_QUEST = "Auto quest button" -- Needs review
-- Raid Utility
L_RAID_UTIL_DISBAND = "Disolver grupo"
-- Zone name
L_ZONE_ANCIENTDALARAN = "Cráter de Dalaran"
-- WatchFrame Wowhead link
L_WATCH_WOWHEAD_LINK = "Link de WoWhead"
-- Toggle Menu
L_TOGGLE_ADDON = "Complemento "
L_TOGGLE_ADDONS = " complementos"
L_TOGGLE_EXPAND = "Expandir "
L_TOGGLE_COLLAPSE = "Colapsar "
L_TOGGLE_RCLICK = "Click derecho para activar o desactivar "
L_TOGGLE_LCLICK = "Click izquierdo para cambiar de ventana "
L_TOGGLE_RELOAD = " (necesita reiniciar la UI)"
L_TOGGLE_NOT_FOUND = " not found." -- Needs review
-- UnitFrame
L_UF_GHOST = "Fantasma"
L_UF_DEAD = "Muerto"
L_UF_OFFLINE = "Desconectado"
L_UF_MANA = "Mana bajo"
-- Map
L_MAP_CURSOR = "Cursor: "
L_MAP_BOUNDS = "Fuera de los limites!"
L_MAP_FOG = "Fog of War" -- Needs review
L_MAP_COORDS = "Coordinates" -- Needs review
-- Minimap
L_MINIMAP_CALENDAR = "Calendario"
L_MINIMAP_FARM = "Minimap size" -- Need review
L_MINIMAP_TOGGLE = "Toggle action bars" -- Need review
-- Chat
L_CHAT_WHISPER = "De"
L_CHAT_BN_WHISPER = "De"
L_CHAT_AFK = "[AFK]"
L_CHAT_DND = "[NM]"
L_CHAT_GM = "[GM]"
L_CHAT_GUILD = "H"
L_CHAT_PARTY = "G"
L_CHAT_PARTY_LEADER = "LG"
L_CHAT_RAID = "B"
L_CHAT_RAID_LEADER = "LB"
L_CHAT_RAID_WARNING = "AB"
L_CHAT_INSTANCE_CHAT = "I" -- Needs review
L_CHAT_INSTANCE_CHAT_LEADER = "IL" -- Needs review
L_CHAT_OFFICER = "O"
L_CHAT_PET_BATTLE = "PB" -- Needs review
L_CHAT_COME_ONLINE = "se ha |cff298F00conectado|r."
L_CHAT_GONE_OFFLINE = "se ha |cffff0000desconectado|r."
-- Errors frame
L_ERRORFRAME_L = "Click para ver errores."
-- Bags
L_BAG_SHOW_BAGS = "Mostrar Bolsas"
L_BAG_RIGHT_CLICK_SEARCH = "Click derecho para buscar"
L_BAG_STACK_MENU = "Amontonar"
L_BAG_RIGHT_CLICK_CLOSE = "Right-click to open menu" -- Need review
-- Grab mail
L_MAIL_STOPPED = "Sin espacio, inventario lleno."
L_MAIL_UNIQUE = "Abortado. Se encontró un duplicado del objeto único en las bolsas o en el banco."
L_MAIL_COMPLETE = "Todo enviado."
L_MAIL_NEED = "Necesitas un buzón."
L_MAIL_MESSAGES = "mensajes"
-- Loot
L_LOOT_RANDOM = "Jugador aleatorio"
L_LOOT_SELF = "Despojar automáticamente"
L_LOOT_FISH = "Despojar pescado"
L_LOOT_ANNOUNCE = "Anunciar a"
L_LOOT_TO_RAID = " banda"
L_LOOT_TO_PARTY = " grupo"
L_LOOT_TO_GUILD = " hermandad"
L_LOOT_TO_SAY = " decir"
-- LitePanels AFK module
L_PANELS_AFK = "Estas ausente!"
L_PANELS_AFK_RCLICK = "Botón derecho para ocultar."
L_PANELS_AFK_LCLICK = "Botón izquierdo para retroceder."
-- Cooldowns
L_COOLDOWNS = "TR: "
L_COOLDOWNS_COMBATRESS = "CombatRess" -- Needs review
L_COOLDOWNS_COMBATRESS_REMAINDER = "Combat resurrect: " -- Needs review
L_COOLDOWNS_NEXTTIME = "Next time: " -- Needs review
-- Bind key
L_BIND_SAVED = "La configuración de las teclas ha sido guardada."
L_BIND_DISCARD = "Se han descartado los cambios en la configuración de las teclas."
L_BIND_INSTRUCT = "Coloca el cursor encima de cualquier botón para asignar una tecla. Presiona la tecla ESC o el botón derecho del ratón para quitar la asignación actual."
L_BIND_CLEARED = "Todas las asignaciones de teclas se han limpiado para"
L_BIND_BINDING = "Asignación"
L_BIND_KEY = "Tecla"
L_BIND_NO_SET = "No tiene asignación"
-- Info text
L_INFO_ERRORS = "Ningún error aun."
L_INFO_INVITE = "Invitación aceptada de "
L_INFO_DUEL = "Duelo rechazado de "
L_INFO_PET_DUEL = "Declined pet duel request from " -- Needs review
L_INFO_DISBAND = "Deshaciendo banda..."
L_INFO_SETTINGS_DBM = "Escribe /settings dbm, para aplicar las preferencias del DBM."
L_INFO_SETTINGS_BIGWIGS = "Escribe /settings bw, para aplicar las preferencias del BigWigs."
L_INFO_SETTINGS_MSBT = "Escribe /settings msbt, para aplicar las preferencias del MSBT."
L_INFO_SETTINGS_SKADA = "Escribe /settings skada, para aplicar las preferencias del Skada."
L_INFO_SETTINGS_ALL = "Escribe /settings all, para aplicar todas las modificaciones."
L_INFO_NOT_INSTALLED = " no esta instalado."
L_INFO_SKIN_DISABLED1 = "Estilizacion para "
L_INFO_SKIN_DISABLED2 = " esta desactivado."
-- Moving elements
L_MOVE_RIGHT_CLICK = "Right-click to reset position" -- Needs review
L_MOVE_MIDDLE_CLICK = "Middle-click to temp hide" -- Needs review
-- Popups
L_POPUP_INSTALLUI = "Es la primera vez que usas ShestakUI con este personaje. Usted debe volver a cargar la interfaz de usuario para configurarlo."
L_POPUP_RESETUI = "¿Estás seguro de que desea restablecer ShestakUI?"
L_POPUP_RESETSTATS = "¿Estás seguro de que quieres reiniciar las estadísticas de tiempo empleado en el juego y oro adquirido?"
L_POPUP_DISBAND_RAID = "¿Estás seguro de que quieres disolver el grupo?"
L_POPUP_DISABLEUI = "ShestakUI no funciona con esta resolución, ¿Quieres desactivar ShestakUI? (Pulsa cancelar si quieres probar otra resolución)"
L_POPUP_SETTINGS_ALL = "¿Aplicar modificaciones para todos los addons? (DBM, BigWigs, Skada o MSBT)"
L_POPUP_SETTINGS_DBM = "Necesito cambiar la posición de los elementos del DBM."
L_POPUP_SETTINGS_BW = "Necesito cambiar la posición de los elementos del BigWigs."
L_POPUP_ARMORY = "Arsenal"
-- Welcome message
L_WELCOME_LINE_1 = "Bienvenido a ShestakUI "
L_WELCOME_LINE_2_1 = "Escribe /cfg para configurar la interfaz, o visita http://shestak.org"
L_WELCOME_LINE_2_2 = "para más información."
-- Combat text
L_COMBATTEXT_KILLING_BLOW = "Golpe de gracia"
L_COMBATTEXT_TEST_DISABLED = "Modo Texto de combate deshabilitado."
L_COMBATTEXT_TEST_ENABLED = "Modo Texto de combate habilitado."
L_COMBATTEXT_TEST_USE_MOVE = "Escribe /xct move para mover y cambiar el tamaño del marco de texto de combate."
L_COMBATTEXT_TEST_USE_TEST = "Escribe /xct test para probar el modo Texto de combate."
L_COMBATTEXT_TEST_USE_RESET = "Type /xct reset to restore default positions." -- Need review
L_COMBATTEXT_POPUP = "Para guardar la posición de la ventana de texto de combate necesitas recargar tu UI."
L_COMBATTEXT_UNSAVED = "La posición de la ventana de texto de combate no está guardada, no olvides recargar la UI."
L_COMBATTEXT_UNLOCKED = "Texto de combate desbloqueado."
-- LiteStats
L_STATS_AUTO_REPAIR = "Reparación auto."
L_STATS_GUILD_REPAIR = "Reparar con dinero de la hermandad"
L_STATS_AUTO_SELL = "Auto-vender basura"
L_STATS_BANDWIDTH = "Ancho de banda:"
L_STATS_DOWNLOAD = "Descarga:"
L_STATS_CURRENCY_RAID = "Raid Seals" -- Need review
L_STATS_MEMORY_USAGE = "Blizzard UI Memory Usage:" -- Needs review
L_STATS_TOTAL_MEMORY_USAGE = "Uso total de la memoria:"
L_STATS_TOTAL_CPU_USAGE = "Total CPU Usage:" -- Need review
L_STATS_GARBAGE_COLLECTED = "Basura recogida"
L_STATS_HIDDEN = "Oculto"
L_STATS_JUNK_ALREADY_ADDITIONS = "is already in additions list." -- Need review
L_STATS_JUNK_ITEMLINK = "enlace del objeto"
L_STATS_JUNK_ADDITIONS = "Junk additions" -- Need review
L_STATS_JUNK_LIST = "Lista de basura"
L_STATS_JUNK_PROFIT = "Ganancia con la basura"
L_STATS_JUNK_CLEARED = "Junk list cleared." -- Need review
L_STATS_JUNK_CLEAR_ADDITIONS = "Clear additions list." -- Need review
L_STATS_JUNK_ADDED = "Added junk additions" -- Need review
L_STATS_JUNK_ADD_ITEM = "Add/remove items." -- Need review
L_STATS_JUNK_REMOVED = "Removed junk additions" -- Need review
L_STATS_JUNK_ITEMS_LIST = "List for sell items." -- Need review
L_STATS_KILLS = "A"
L_STATS_XP_RATE = "EXP en este nivel"
L_STATS_HR = "hr"
L_STATS_INF = "inf"
L_STATS_ON = "ON"
L_STATS_PLAYED_LEVEL = "Jugado este nivel"
L_STATS_PLAYED_SESSION = "Jugado esta sesión"
L_STATS_ACC_PLAYED = "Jugado"
L_STATS_PLAYED_TOTAL = "Total jugado"
L_STATS_QUEST = "M"
L_STATS_QUESTS_TO = "Misiones/Muertes para %s"
L_STATS_CURRENT_XP = "Actual/Max EXP"
L_STATS_REMAINING_XP = "EXP Restante"
L_STATS_RESTED_XP = "EXP de descanso"
L_STATS_SERVER_GOLD = "Oro del servidor"
L_STATS_SESSION_GAIN = "Sesion ganado/perdido"
L_STATS_SESSION_XP = "EXP en esta sesion"
L_STATS_SORTING_BY = "Ordenado por"
L_STATS_SEALS = "Seals this week" -- Needs review
L_STATS_SPEC = "Spec" -- Need review
L_STATS_TIPS = "consejos:"
L_STATS_OPEN_CALENDAR = "Click-Izquierdo abre el calendario."
L_STATS_RC_TIME_MANAGER = "Click-Derecho abre el administrador de tiempo."
L_STATS_TOGGLE_TIME = "Hora Local/Reino y el reloj de 24hr se pueden activar desde el administrador de tiempo."
L_STATS_MEMORY = "Memoria"
L_STATS_RC_COLLECTS_GARBAGE = "Click-Derecho recolecta basura de Lua."
L_STATS_VIEW_NOTES = "Manten pulsada la tecla Alt para ver rangos, notas y notas de oficiales."
L_STATS_CHANGE_SORTING = "[Hermandad] Click-Derecho para cambiar la clasificacion, Shift-Click-Derecho para invertir el orden."
L_STATS_OPEN_CHARACTER = "Click-Izquierdo abre la pestana de personaje."
L_STATS_RC_AUTO_REPAIRING1 = "Click-Derecho activa el Auto-Reparar."
L_STATS_RC_AUTO_REPAIRING2 = "Middle-Click toggles Guild AutoRepairing." -- Need review
L_STATS_EQUIPMENT_CHANGER = "Shift-Click o Alt-Click para el cambiador de equipamiento."
L_STATS_RC_EXPERIENCE = "Clic derecho para alternar experiencia, tiempo jugado y facciones."
L_STATS_WATCH_FACTIONS = "Mirar facciones desde la herramienta de facciones."
L_STATS_TOOLTIP_EXPERIENCE = "Cuando no estes a nivel max, la descripcion mostrara detalles de la experiencia."
L_STATS_TOOLTIP_TIME_PLAYED = "Cuando estes a nivel max, la descripcion mostrara detalles del tiempo jugado de la cuenta."
L_STATS_OPEN_TALENT = "Click-Izquierdo activa tu especializacion de talentos."
L_STATS_RC_TALENT = "Right-Click toggles your loot specialization." -- Need review
L_STATS_LOCATION = "Situación/Coordenadas"
L_STATS_WORLD_MAP = "Clickeando abres el Mapa del Mundo."
L_STATS_INSERTS_COORDS = "Shift-Click en los modulos de localizacion o coordenadas inserta las coords en el chat."
L_STATS_OPEN_CURRENCY = "Click-Izquierdo abre la pestana de dinero."
L_STATS_RC_AUTO_SELLING = "Click-Derecho activa el Auto-Vender."
L_STATS_NEED_TO_SELL = "Use /junk to configure which items need to sell." -- Need review
L_STATS_WATCH_CURRENCY = "Elementos vistos en la pestana de dinero se reflejaran en la descripcion."
L_STATS_OTHER_OPTIONS = "Otras opciones se pueden configurar en %s"
-- Slash commands
L_SLASHCMD_HELP = {
"Lista de comandos disponibles:",
"/rl - Recargar interfaz.",
"/rc - Realizar una comprobación.",
"/gm - Abrir marco del MH.",
"/dis ADDON_NAME - Desactiva el addon.",
"/en ADDON_NAME - Activa el addon.",
"/rd - Rompe el grupo o la banda.",
"/toraid - Convierte el grupo a bandaConvert to party or raid.",
"/teleport - Teleportarse desde una mazmorra aleatoria.",
"/ss - Cambia entre especializaciones de talentos.",
"/tt - Susurrar objetivo.",
"/farmmode - Incrementa el tamaño del minimapa.",
"/resetui - Reinicia la configuración general a la por defecto.",
"/resetuf - Reinicia los marcos de unidades a su posición por defecto.",
"/resetconfig - Reinicia la configuración de ShestakUI_Config.",
"/resetstats - Reinicia las estadísticas de oro y tiempo empleado.",
"/settings - Aplica la configuración a msbt, dbm, skada, o a todos los addons (con 'all').",
"/ls - Ayuda para LiteStats.",
"/xct - Gestiona el texto de combate.",
"/raidcd - Prueba de los enfriamientos de la banda.",
"/enemycd - Prueba de los enfriamientos del enemigo.",
"/pulsecd - Prueba de tus propios enfriamientos.",
"/threat - Prueba del medidor de amenaza.",
"/testuf - Prueba de los marcos de unidades.",
"/moveui - Permite mover los elementos de la interfaz.", -- Need review
"/cfg - Abre la configuración de la interfaz.",
}
================================================
FILE: ShestakUI/Locales/Taiwan.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if T.client ~= "zhTW" then return end
----------------------------------------------------------------------------------------
-- Localization for zhTW client
-- Translation: Aelb, Ianchan, Leg883, Mania, Nanjiqq, Spacedragon, Tat2dawn, Tibles
----------------------------------------------------------------------------------------
-- Announce flasks and food
L_ANNOUNCE_FF_NOFOOD = "缺少食物: "
L_ANNOUNCE_FF_NOFLASK = "缺少精煉: "
L_ANNOUNCE_FF_ALLBUFFED = "已獲得所有增益 !"
L_ANNOUNCE_FF_CHECK_BUTTON = "檢查食物和精煉"
-- Says thanks for some spells
L_ANNOUNCE_SS_THANKS = "謝謝你的 "
L_ANNOUNCE_SS_RECEIVED = " 收到來自于 "
-- Pull countdown announce
L_ANNOUNCE_PC_GO = "開始 !"
L_ANNOUNCE_PC_MSG = "準備接怪: %s,倒數 %s.."
L_ANNOUNCE_PC_ABORTED = "取消拉怪 !"
-- Announce feasts and portals
L_ANNOUNCE_FP_PRE = "%s 放置了 %s"
L_ANNOUNCE_FP_PUT = "%s 放置了 %s"
L_ANNOUNCE_FP_CAST = "%s 開啟了 %s"
L_ANNOUNCE_FP_CLICK = "%s 正在開啟 %s... 請點擊 !"
L_ANNOUNCE_FP_USE = "%s 使用了 %s。"
-- Announce your interrupts
L_ANNOUNCE_INTERRUPTED = "已打斷"
-- Tooltip
L_TOOLTIP_NO_TALENT = "沒有天賦"
L_TOOLTIP_LOADING = "讀取中..."
L_TOOLTIP_ACH_STATUS = "你的狀態: "
L_TOOLTIP_ACH_COMPLETE = "你的狀態: 完成"
L_TOOLTIP_ACH_INCOMPLETE = "你的狀態: 未完成"
L_TOOLTIP_SPELL_ID = "法術ID: "
L_TOOLTIP_ITEM_ID = "物品ID: "
L_TOOLTIP_WHO_TARGET = "關注"
L_TOOLTIP_ITEM_COUNT = "物品數量: "
L_TOOLTIP_INSPECT_OPEN = "檢查框體已開啟"
-- Misc
L_MISC_UNDRESS = "無裝備"
L_MISC_DRINKING = " 進食中..."
L_MISC_BUY_STACK = "Alt+右鍵批量購買"
L_MISC_UI_OUTDATED = "ShestakUI 版本已過期,請至 www.shestak.org 下載最新版。"
L_MISC_HEADER_MARK = "滑鼠懸停顯示團隊圖標"
L_MISC_BINDER_OPEN = "滑鼠綁定"
L_MISC_SCROLL = "附魔皮紙"
L_MISC_HEADER_QUEST = "Auto quest button" -- Needs review
-- Raid Utility
L_RAID_UTIL_DISBAND = "解散團隊"
-- Zone name
L_ZONE_ANCIENTDALARAN = "達拉然陷坑"
-- WatchFrame Wowhead link
L_WATCH_WOWHEAD_LINK = "Wowhead鏈接"
-- Toggle Menu
L_TOGGLE_ADDON = "插件 "
L_TOGGLE_ADDONS = " 插件系列"
L_TOGGLE_EXPAND = "展開 "
L_TOGGLE_COLLAPSE = "折疊 "
L_TOGGLE_RCLICK = "右鍵 啟用/禁用"
L_TOGGLE_LCLICK = "左鍵 顯示/隱藏窗口 "
L_TOGGLE_RELOAD = " (需要重載插件)"
L_TOGGLE_NOT_FOUND = " 未創建"
-- UnitFrame
L_UF_GHOST = "靈魂"
L_UF_DEAD = "死亡"
L_UF_OFFLINE = "離線"
L_UF_MANA = "低法力值"
-- Map
L_MAP_CURSOR = "滑鼠: "
L_MAP_BOUNDS = "超出範圍 !"
L_MAP_FOG = "地圖全亮"
L_MAP_COORDS = "坐標"
-- Minimap
L_MINIMAP_CALENDAR = "日曆"
L_MINIMAP_FARM = "小地圖縮放"
L_MINIMAP_TOGGLE = "快捷列自由折疊"
-- Chat
L_CHAT_WHISPER = "From"
L_CHAT_BN_WHISPER = "From"
L_CHAT_AFK = "[AFK]"
L_CHAT_DND = "[DND]"
L_CHAT_GM = "[GM]"
L_CHAT_GUILD = "G"
L_CHAT_PARTY = "P"
L_CHAT_PARTY_LEADER = "PL"
L_CHAT_RAID = "R"
L_CHAT_RAID_LEADER = "RL"
L_CHAT_RAID_WARNING = "RW"
L_CHAT_INSTANCE_CHAT = "I"
L_CHAT_INSTANCE_CHAT_LEADER = "IL"
L_CHAT_OFFICER = "O"
L_CHAT_PET_BATTLE = "PB"
L_CHAT_COME_ONLINE = "|cff298F00上線了|r"
L_CHAT_GONE_OFFLINE = "|cffff0000下線了|r"
-- Errors frame
L_ERRORFRAME_L = "點擊查看錯誤"
-- Bags
L_BAG_SHOW_BAGS = "顯示背包"
L_BAG_RIGHT_CLICK_SEARCH = "右鍵搜尋物品"
L_BAG_STACK_MENU = "堆疊"
L_BAG_RIGHT_CLICK_CLOSE = "右鍵開啟菜單"
-- Grab mail
L_MAIL_STOPPED = "無法拾取,背包已滿。"
L_MAIL_UNIQUE = "中止,在背包或銀行發現重複的唯一物品。"
L_MAIL_COMPLETE = "完成"
L_MAIL_NEED = "需要信箱"
L_MAIL_MESSAGES = "新郵件"
-- Loot
L_LOOT_RANDOM = "隨機拾取"
L_LOOT_SELF = "個人拾取"
L_LOOT_FISH = "釣魚拾取"
L_LOOT_ANNOUNCE = "向頻道通告"
L_LOOT_TO_RAID = " 團隊"
L_LOOT_TO_PARTY = " 隊伍"
L_LOOT_TO_GUILD = " 公會"
L_LOOT_TO_SAY = " 說"
-- LitePanels AFK module
L_PANELS_AFK = "正處于暫離狀態 !"
L_PANELS_AFK_RCLICK = "右鍵隱藏"
L_PANELS_AFK_LCLICK = "左鍵脫離暫離狀態"
-- Cooldowns
L_COOLDOWNS = "CD: "
L_COOLDOWNS_COMBATRESS = "戰復"
L_COOLDOWNS_COMBATRESS_REMAINDER = "戰復剩餘: "
L_COOLDOWNS_NEXTTIME = "下次: "
-- Bind key
L_BIND_SAVED = "快捷鍵設置已保存"
L_BIND_DISCARD = "新的快捷鍵設置已取消"
L_BIND_INSTRUCT = "將滑鼠懸停至任意快捷鍵進行綁定。按ESC或者右鍵清除當前快捷鍵的按鍵綁定。"
L_BIND_CLEARED = "已清除所有快捷鍵設置"
L_BIND_BINDING = "綁定"
L_BIND_KEY = "按鍵"
L_BIND_NO_SET = "沒有綁定快捷鍵"
-- Info text
L_INFO_ERRORS = "目前沒有錯誤"
L_INFO_INVITE = "接受邀請"
L_INFO_DUEL = "拒絕決鬥請求"
L_INFO_PET_DUEL = "拒絕寵物對戰請求"
L_INFO_DISBAND = "解散隊伍..."
L_INFO_SETTINGS_DBM = "鍵入 /settings dbm 載入 DBM 的設定"
L_INFO_SETTINGS_BIGWIGS = "鍵入 /settings bw 載入 BigWigs 的設定"
L_INFO_SETTINGS_MSBT = "鍵入 /settings msbt 載入 MSBT 的設定"
L_INFO_SETTINGS_SKADA = "鍵入 /settings skada 載入 Skada 的設定"
L_INFO_SETTINGS_ALL = "鍵入 /settings all 載入所有UI設定"
L_INFO_NOT_INSTALLED = " 沒有安裝"
L_INFO_SKIN_DISABLED1 = "界面美化啟用"
L_INFO_SKIN_DISABLED2 = " 已禁用"
-- Moving elements
L_MOVE_RIGHT_CLICK = "右鍵重置位置"
L_MOVE_MIDDLE_CLICK = "中鍵臨時隱藏"
-- Popups
L_POPUP_INSTALLUI = "該角色首次使用ShestakUI,你必須重新加載UI來配置。"
L_POPUP_RESETUI = "你確定要重新加載ShestakUI?"
L_POPUP_RESETSTATS = "你確定要重置所有角色遊戲時間和金幣的統計數據?"
L_POPUP_DISBAND_RAID = "你確定要解散團隊?"
L_POPUP_DISABLEUI = "ShestakUI不支援此解析度,是否停用ShestakUI? (若要嘗試其他解析度請按取消)"
L_POPUP_SETTINGS_ALL = "應用所有的UI設置?(DBM/BigWigs/Skada/MSBT)"
L_POPUP_SETTINGS_DBM = "需要改變DBM描點及風格元素"
L_POPUP_SETTINGS_BW = "需要改變BigWigs描點及風格元素"
L_POPUP_ARMORY = "英雄榜"
-- Welcome message
L_WELCOME_LINE_1 = "歡迎使用ShestakUI "
L_WELCOME_LINE_2_1 = "鍵入 /cfg 進行UI設置, 或者訪問 http://shestak.org"
L_WELCOME_LINE_2_2 = "獲取更多信息。"
-- Combat text
L_COMBATTEXT_KILLING_BLOW = "最後一擊"
L_COMBATTEXT_TEST_DISABLED = "戰鬥信息測試模式已禁用"
L_COMBATTEXT_TEST_ENABLED = "戰鬥信息測試模式已啟用"
L_COMBATTEXT_TEST_USE_MOVE = "鍵入 /xct move 移動/調整戰鬥信息框架大小"
L_COMBATTEXT_TEST_USE_TEST = "鍵入 /xct test 啟用/禁用戰鬥信息測試模式"
L_COMBATTEXT_TEST_USE_RESET = "鍵入 /xct reset 重置到初始位置"
L_COMBATTEXT_POPUP = "保存戰鬥信息窗口的位置須重載插件"
L_COMBATTEXT_UNSAVED = "戰鬥信息窗口位置尚未保存,不要忘記重新載入插件。"
L_COMBATTEXT_UNLOCKED = "戰鬥信息已解鎖"
-- LiteStats
L_STATS_AUTO_REPAIR = "自動修裝"
L_STATS_GUILD_REPAIR = "公會銀行修裝"
L_STATS_AUTO_SELL = "自動販售灰色物品"
L_STATS_BANDWIDTH = "寬頻: "
L_STATS_DOWNLOAD = "下載: "
L_STATS_CURRENCY_RAID = "徽印"
L_STATS_MEMORY_USAGE = "插件資源佔用: "
L_STATS_TOTAL_MEMORY_USAGE = "總資源佔用: "
L_STATS_TOTAL_CPU_USAGE = "總CPU使用率: "
L_STATS_GARBAGE_COLLECTED = "整理記憶體"
L_STATS_HIDDEN = "隱藏"
L_STATS_JUNK_ALREADY_ADDITIONS = "已加入自動販售列表"
L_STATS_JUNK_ITEMLINK = "物品鏈結"
L_STATS_JUNK_ADDITIONS = "自動販售列表"
L_STATS_JUNK_LIST = "自動販售常用命令"
L_STATS_JUNK_PROFIT = "自動販售所得金額"
L_STATS_JUNK_CLEARED = "自動販售列表已清除"
L_STATS_JUNK_CLEAR_ADDITIONS = "清除自動販售列表"
L_STATS_JUNK_ADDED = "自動販售 - 已加入"
L_STATS_JUNK_ADD_ITEM = "增加/移除 物品"
L_STATS_JUNK_REMOVED = "自動販售 - 已移除"
L_STATS_JUNK_ITEMS_LIST = "列出自動販售列表"
L_STATS_KILLS = "擊殺"
L_STATS_XP_RATE = "當前等級經驗值趴數"
L_STATS_HR = "小時"
L_STATS_INF = "無限"
L_STATS_ON = "啟用"
L_STATS_PLAYED_LEVEL = "當前等級總在線時間"
L_STATS_PLAYED_SESSION = "此次在線時長"
L_STATS_ACC_PLAYED = "帳號啟用總時間"
L_STATS_PLAYED_TOTAL = "總在線時長"
L_STATS_QUEST = "任務"
L_STATS_QUESTS_TO = "任務/殺怪得到經驗值 %s"
L_STATS_CURRENT_XP = "目前/升級所需經驗值"
L_STATS_REMAINING_XP = "升級尚需經驗值"
L_STATS_RESTED_XP = "休息獎勵經驗值"
L_STATS_SERVER_GOLD = "帳號總現金"
L_STATS_SESSION_GAIN = "此次在線時段獲得/損失金額"
L_STATS_SESSION_XP = "此次在線時段所得經驗值"
L_STATS_SORTING_BY = "排列方式: "
L_STATS_SEALS = "本週已領徽印"
L_STATS_SPEC = "專精"
L_STATS_TIPS = "提示: "
L_STATS_OPEN_CALENDAR = "左鍵開/關行事曆"
L_STATS_RC_TIME_MANAGER = "右鍵開/關計時器"
L_STATS_TOGGLE_TIME = "當地/伺服器及24小時制可於計時器中設置"
L_STATS_MEMORY = "記憶體"
L_STATS_RC_COLLECTS_GARBAGE = "幀數模塊上滑鼠懸停顯示,右鍵整理記憶體"
L_STATS_VIEW_NOTES = "按住Alt鍵檢視: 好友的所在地 公會成員的階級/註記/幹部註記"
L_STATS_CHANGE_SORTING = "[公會]右鍵密語/邀請,中鍵更改排列方式,Shift+中鍵反轉排序"
L_STATS_OPEN_CHARACTER = "左鍵開/關角色界面"
L_STATS_RC_AUTO_REPAIRING1 = "右鍵開/關自動修裝"
L_STATS_RC_AUTO_REPAIRING2 = "中鍵開/關公會修裝"
L_STATS_EQUIPMENT_CHANGER = "Shift+左鍵或Alt+左鍵開啟套裝選單"
L_STATS_RC_EXPERIENCE = "右鍵切換在線時間/神器信息/經驗值/聲望值"
L_STATS_WATCH_FACTIONS = "左鍵開/關相關界面"
L_STATS_TOOLTIP_EXPERIENCE = "未達最高等級時將優先顯示經驗值訊息"
L_STATS_TOOLTIP_TIME_PLAYED = "達到最高等級後將優先顯示角色在線時間"
L_STATS_OPEN_TALENT = "左鍵開啟專精選單,Shift+左鍵開啟專精界面"
L_STATS_RC_TALENT = "右鍵開啟拾取專精選單"
L_STATS_LOCATION = "位置/座標"
L_STATS_WORLD_MAP = "點擊開/關世界地圖"
L_STATS_INSERTS_COORDS = "Shift+左鍵地名/座標/定位標記自動複製到輸入框"
L_STATS_OPEN_CURRENCY = "左鍵開/關兌換通貨界面"
L_STATS_RC_AUTO_SELLING = "右鍵開/關自動販售"
L_STATS_NEED_TO_SELL = "鍵入 /junk 列出常用命令"
L_STATS_WATCH_CURRENCY = "在兌換通貨界面已選定的通貨將在金幣提示信息中顯示"
L_STATS_OTHER_OPTIONS = "其它選項可以在這裡設置: %s"
-- Slash commands
L_SLASHCMD_HELP = {
"可用的命令: ",
"/rl - 重載界面",
"/rc - 準備確認",
"/gm - 開啟GM界面",
"/dis ADDON_NAME - 禁用指定插件",
"/en ADDON_NAME - 開啟指定插件",
"/rd - 解散隊伍",
"/toraid - 轉換為隊伍/團隊",
"/teleport - 傳出隨機副本",
"/ss - 切換天賦",
"/tt - 密語當前目標",
"/farmmode - 開啟/關閉小地圖採集模式",
"/resetui - 重置一般設置到預設值",
"/resetuf - 重置頭像框架到預設位置",
"/resetconfig - 重置ShestakUI_Config到預設值",
"/resetstats - 重置所有角色遊戲時間和金幣的統計數據",
"/settings - 設置指定插件",
"/ls - 信息條功能說明",
"/xct - 戰鬥信息選項",
"/raidcd - 團隊技能冷卻測試模式",
"/enemycd - 敵對技能冷卻測試模式",
"/pulsecd - 技能冷卻閃爍測試模式",
"/threat - 仇恨欄測試模式",
"/testuf - 頭像框架測試模式",
"/moveui - 解鎖/鎖定 界面中所有可移動的框體,Ctrl+右鍵選中的框架重置到預設位置", -- Need review
"/cfg - 開啟ShestakUI設置界面",
}
================================================
FILE: ShestakUI/Modules/ActionBars/Bar1.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- ActionBar(by Tukz)
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "Bar1Holder", ActionBarAnchor, "SecureHandlerStateTemplate")
if C.actionbar.editor then
local NumRow = ceil(C.actionbar.bar1_num / C.actionbar.bar1_row)
bar:SetWidth((C.actionbar.bar1_size * C.actionbar.bar1_row) + (C.actionbar.button_space * (C.actionbar.bar1_row - 1)))
bar:SetHeight((C.actionbar.bar1_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))
bar:SetPoint("BOTTOMLEFT", ActionBarAnchor, 0, 0)
else
bar:SetAllPoints(ActionBarAnchor)
end
local Page = {
["DRUID"] = "[bonusbar:1,nostealth] 7; [bonusbar:1,stealth] 8; [bonusbar:2] 8; [bonusbar:3] 9; [bonusbar:4] 10;",
["EVOKER"] = "[bonusbar:1] 7;",
["ROGUE"] = "[bonusbar:1] 7;",
["DEFAULT"] = "[possessbar] 16; [shapeshift] 17; [overridebar] 18; [vehicleui] 16; [bar:2] 2; [bar:3] 3; [bar:4] 4; [bar:5] 5; [bar:6] 6; [bonusbar:5] 11;",
}
local function GetBar()
local condition = Page["DEFAULT"]
local class = T.class
local page = Page[class]
if page then
condition = condition.." "..page
end
condition = condition.." 1"
return condition
end
bar:RegisterEvent("PLAYER_LOGIN")
bar:RegisterEvent("UPDATE_VEHICLE_ACTIONBAR")
bar:RegisterEvent("UPDATE_OVERRIDE_ACTIONBAR")
bar:RegisterEvent("UNIT_ENTERED_VEHICLE")
bar:RegisterEvent("UNIT_EXITED_VEHICLE")
bar:SetScript("OnEvent", function(self, event)
if event == "PLAYER_LOGIN" then
local NumPerRows = C.actionbar.bar1_row
local NextRowButtonAnchor = _G["ActionButton1"]
for i = 1, 12 do
local b = _G["ActionButton"..i]
b:SetSize(C.actionbar.button_size, C.actionbar.button_size)
b:ClearAllPoints()
if C.actionbar.editor then
if i <= C.actionbar.bar1_num then
if i == 1 then
b:SetPoint("TOPLEFT", bar, "TOPLEFT", 0, 0)
elseif i == NumPerRows + 1 then
b:SetPoint("TOPLEFT", NextRowButtonAnchor, "BOTTOMLEFT", 0, -C.actionbar.button_space)
NumPerRows = NumPerRows + C.actionbar.bar1_row
NextRowButtonAnchor = _G["ActionButton"..i]
else
b:SetPoint("LEFT", _G["ActionButton"..i-1], "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
else
b:SetPoint("TOP", UIParent, "TOP", 0, 200)
end
else
if i == 1 then
b:SetPoint("BOTTOMLEFT", Bar1Holder, 0, 0)
else
local previous = _G["ActionButton"..i-1]
b:SetPoint("LEFT", previous, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
end
self:SetFrameRef("ActionButton"..i, b)
b:SetParent(Bar1Holder)
end
self:Execute([[
buttons = table.new()
for i = 1, 12 do
table.insert(buttons, self:GetFrameRef("ActionButton"..i))
end
]])
self:SetAttribute("_onstate-page", [[
for i, button in ipairs(buttons) do
button:SetAttribute("actionpage", tonumber(newstate))
end
]])
RegisterStateDriver(self, "page", GetBar())
elseif event == "UPDATE_VEHICLE_ACTIONBAR" or event == "UPDATE_OVERRIDE_ACTIONBAR" then
for i = 1, NUM_ACTIONBAR_BUTTONS do
local button = _G["ActionButton"..i]
local action = button.action
local icon = button.icon
if action >= 120 then
local texture = GetActionTexture(action)
if texture then
icon:SetTexture(texture)
icon:Show()
else
if icon:IsShown() then
icon:Hide()
end
end
end
end
elseif event == "UNIT_ENTERED_VEHICLE" then
if UnitHasVehicleUI("player") then
for i = 1, NUM_ACTIONBAR_BUTTONS do
local button = _G["ActionButton"..i]
button:GetCheckedTexture():SetAlpha(0)
end
end
elseif event == "UNIT_EXITED_VEHICLE" then
for i = 1, NUM_ACTIONBAR_BUTTONS do
local button = _G["ActionButton"..i]
button:GetCheckedTexture():SetAlpha(1)
end
end
end)
if C.actionbar.bottombars_mouseover then
for i = 1, 12 do
local b = _G["ActionButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() BottomBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)
end
end
if C.actionbar.editor and C.actionbar.bar1_mouseover then
for i = 1, 12 do
local b = _G["ActionButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() Bar1MouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then Bar1MouseOver(0) end end)
end
bar:SetScript("OnEnter", function() Bar1MouseOver(1) end)
bar:SetScript("OnLeave", function() if not HoverBind.enabled then Bar1MouseOver(0) end end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/Bar2.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- MultiBarBottomLeft(by Tukz)
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "Bar2Holder", ActionBarAnchor)
if C.actionbar.editor then
local NumRow = ceil(C.actionbar.bar2_num / C.actionbar.bar2_row)
bar:SetWidth((C.actionbar.bar2_size * C.actionbar.bar2_row) + (C.actionbar.button_space * (C.actionbar.bar2_row - 1)))
bar:SetHeight((C.actionbar.bar2_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))
bar:SetPoint("BOTTOMLEFT", Bar1Holder, "TOPLEFT", 0, C.actionbar.button_space)
else
bar:SetAllPoints(ActionBarAnchor)
end
MultiBarBottomLeft:SetParent(bar)
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:SetScript("OnEvent", function(self, event)
Settings.SetValue("PROXY_SHOW_ACTIONBAR_2", true)
local NumPerRows = C.actionbar.bar2_row
local NextRowButtonAnchor = _G["MultiBarBottomLeftButton1"]
for i = 1, 12 do
local b = _G["MultiBarBottomLeftButton"..i]
local b2 = _G["MultiBarBottomLeftButton"..i-1]
b:ClearAllPoints()
if C.actionbar.editor then
if i <= C.actionbar.bar2_num then
if i == 1 then
b:SetPoint("TOPLEFT", bar, "TOPLEFT", 0, 0)
elseif i == NumPerRows + 1 then
b:SetPoint("TOPLEFT", NextRowButtonAnchor, "BOTTOMLEFT", 0, -C.actionbar.button_space)
NumPerRows = NumPerRows + C.actionbar.bar2_row
NextRowButtonAnchor = _G["MultiBarBottomLeftButton"..i]
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
else
b:SetPoint("TOP", UIParent, "TOP", 0, 200)
end
else
if i == 1 then
b:SetPoint("BOTTOM", ActionButton1, "TOP", 0, C.actionbar.button_space)
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
end
end
end)
-- Hide bar
if C.actionbar.bottombars == 1 then
bar:Hide()
end
if C.actionbar.bottombars_mouseover then
for i = 1, 12 do
local b = _G["MultiBarBottomLeftButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() BottomBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)
end
end
if C.actionbar.editor and C.actionbar.bar2_mouseover then
for i = 1, 12 do
local b = _G["MultiBarBottomLeftButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() Bar2MouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then Bar2MouseOver(0) end end)
end
bar:SetScript("OnEnter", function() Bar2MouseOver(1) end)
bar:SetScript("OnLeave", function() if not HoverBind.enabled then Bar2MouseOver(0) end end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/Bar3.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- MultiBarLeft(by Tukz)
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "Bar3Holder", RightActionBarAnchor)
if C.actionbar.editor then
local NumRow = ceil(C.actionbar.bar3_num / C.actionbar.bar3_row)
bar:SetWidth((C.actionbar.bar3_size * C.actionbar.bar3_row) + (C.actionbar.button_space * (C.actionbar.bar3_row - 1)))
bar:SetHeight((C.actionbar.bar3_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))
bar:SetPoint("TOPRIGHT", RightActionBarAnchor, "TOPRIGHT", -(C.actionbar.bar3_size + C.actionbar.button_space) , 0)
else
bar:SetAllPoints(RightActionBarAnchor)
end
MultiBarLeft:SetParent(bar)
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:SetScript("OnEvent", function(self, event)
Settings.SetValue("PROXY_SHOW_ACTIONBAR_3", true)
local NumPerRows = C.actionbar.bar3_row
local NextRowButtonAnchor = _G["MultiBarLeftButton1"]
for i = 1, 12 do
local b = _G["MultiBarLeftButton"..i]
local b2 = _G["MultiBarLeftButton"..i-1]
b:ClearAllPoints()
if C.actionbar.editor then
if i <= C.actionbar.bar3_num then
if i == 1 then
b:SetPoint("TOPLEFT", bar, "TOPLEFT", 0, 0)
elseif i == NumPerRows + 1 then
b:SetPoint("TOPLEFT", NextRowButtonAnchor, "BOTTOMLEFT", 0, -C.actionbar.button_space)
NumPerRows = NumPerRows + C.actionbar.bar3_row
NextRowButtonAnchor = _G["MultiBarLeftButton"..i]
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
else
b:SetPoint("TOP", UIParent, "TOP", 0, 200)
end
else
if i == 1 then
if C.actionbar.rightbars == 3 then
b:SetPoint("TOP", RightActionBarAnchor, "TOP", 0, 0)
else
b:SetPoint("TOPLEFT", RightActionBarAnchor, "TOPLEFT", 0, 0)
end
else
b:SetPoint("TOP", b2, "BOTTOM", 0, -C.actionbar.button_space)
end
end
end
end)
-- Hide bar
if C.actionbar.rightbars < 2 then
bar:Hide()
end
-- Mouseover bar
if C.actionbar.rightbars_mouseover == true then
for i = 1, 12 do
local b = _G["MultiBarLeftButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() RightBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)
end
end
if C.actionbar.editor and C.actionbar.bar3_mouseover then
for i = 1, 12 do
local b = _G["MultiBarLeftButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() Bar3MouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then Bar3MouseOver(0) end end)
end
bar:SetScript("OnEnter", function() Bar3MouseOver(1) end)
bar:SetScript("OnLeave", function() if not HoverBind.enabled then Bar3MouseOver(0) end end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/Bar4.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- MultiBarRight(by Tukz)
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "Bar4Holder", RightActionBarAnchor)
if C.actionbar.editor then
local NumRow = ceil(C.actionbar.bar4_num / C.actionbar.bar4_row)
bar:SetWidth((C.actionbar.bar4_size * C.actionbar.bar4_row) + (C.actionbar.button_space * (C.actionbar.bar4_row - 1)))
bar:SetHeight((C.actionbar.bar4_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))
bar:SetPoint("TOPRIGHT", RightActionBarAnchor, "TOPRIGHT", 0, 0)
else
bar:SetAllPoints(RightActionBarAnchor)
end
MultiBarRight:SetParent(bar)
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:SetScript("OnEvent", function(self, event)
Settings.SetValue("PROXY_SHOW_ACTIONBAR_4", true)
local NumPerRows = C.actionbar.bar4_row
local NextRowButtonAnchor = _G["MultiBarRightButton1"]
for i = 1, 12 do
local b = _G["MultiBarRightButton"..i]
local b2 = _G["MultiBarRightButton"..i-1]
b:ClearAllPoints()
if C.actionbar.editor then
if i <= C.actionbar.bar4_num then
if i == 1 then
b:SetPoint("TOPLEFT", bar, "TOPLEFT", 0, 0)
elseif i == NumPerRows + 1 then
b:SetPoint("TOPLEFT", NextRowButtonAnchor, "BOTTOMLEFT", 0, -C.actionbar.button_space)
NumPerRows = NumPerRows + C.actionbar.bar4_row
NextRowButtonAnchor = _G["MultiBarRightButton"..i]
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
else
b:SetPoint("TOP", UIParent, "TOP", 0, 200)
end
else
if i == 1 then
b:SetPoint("TOPRIGHT", RightActionBarAnchor, "TOPRIGHT", 0, 0)
else
b:SetPoint("TOP", b2, "BOTTOM", 0, -C.actionbar.button_space)
end
end
end
end)
-- Hide bar
if C.actionbar.rightbars < 1 then
bar:Hide()
end
-- Mouseover bar
if C.actionbar.rightbars_mouseover == true then
for i = 1, 12 do
local b = _G["MultiBarRightButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() RightBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)
end
end
if C.actionbar.editor and C.actionbar.bar4_mouseover then
for i = 1, 12 do
local b = _G["MultiBarRightButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() Bar4MouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then Bar4MouseOver(0) end end)
end
bar:SetScript("OnEnter", function() Bar4MouseOver(1) end)
bar:SetScript("OnLeave", function() if not HoverBind.enabled then Bar4MouseOver(0) end end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/Bar5.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- MultiBarBottomRight(by Tukz)
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "Bar5Holder", T_PetBattleFrameHider)
if C.actionbar.split_bars == true then
bar:SetAllPoints(SplitBarLeft)
else
if C.actionbar.editor then
local NumRow = ceil(C.actionbar.bar5_num / C.actionbar.bar5_row)
bar:SetWidth((C.actionbar.bar5_size * C.actionbar.bar5_row) + (C.actionbar.button_space * (C.actionbar.bar5_row - 1)))
bar:SetHeight((C.actionbar.bar5_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))
bar:SetPoint("BOTTOMLEFT", Bar2Holder, "TOPLEFT", 0, C.actionbar.button_space)
else
bar:SetAllPoints(ActionBarAnchor)
end
end
MultiBarBottomRight:SetParent(bar)
bar:SetFrameStrata("LOW")
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:SetScript("OnEvent", function(self, event)
Settings.SetValue("PROXY_SHOW_ACTIONBAR_5", true)
local NumPerRows = C.actionbar.bar5_row
local NextRowButtonAnchor = _G["MultiBarBottomRightButton1"]
for i = 1, 12 do
local b = _G["MultiBarBottomRightButton"..i]
local b2 = _G["MultiBarBottomRightButton"..i-1]
b:ClearAllPoints()
if C.actionbar.split_bars == true then
if i == 1 then
b:SetPoint("TOPLEFT", SplitBarLeft, "TOPLEFT", 0, 0)
elseif i == 4 then
b:SetPoint("BOTTOMLEFT", SplitBarLeft, "BOTTOMLEFT", 0, 0)
elseif i == 7 then
b:SetPoint("TOPLEFT", SplitBarRight, "TOPLEFT", C.actionbar.button_space, 0)
elseif i == 10 then
b:SetPoint("BOTTOMLEFT", SplitBarRight, "BOTTOMLEFT", C.actionbar.button_space, 0)
else
b:SetPoint("LEFT", b2, "RIGHT", C.actionbar.button_space, 0)
end
else
if C.actionbar.editor then
if i <= C.actionbar.bar5_num then
if i == 1 then
b:SetPoint("TOPLEFT", bar, "TOPLEFT", 0, 0)
elseif i == NumPerRows + 1 then
b:SetPoint("TOPLEFT", NextRowButtonAnchor, "BOTTOMLEFT", 0, -C.actionbar.button_space)
NumPerRows = NumPerRows + C.actionbar.bar5_row
NextRowButtonAnchor = _G["MultiBarBottomRightButton"..i]
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
else
b:SetPoint("TOP", UIParent, "TOP", 0, 200)
end
else
if i == 1 then
b:SetPoint("TOPLEFT", Bar1Holder, 0, 0)
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
end
end
end
end)
-- Hide bar
if C.actionbar.bottombars < 3 then
bar:Hide()
end
-- Mouseover bar
if C.actionbar.bottombars_mouseover then
for i = 1, 12 do
local b = _G["MultiBarBottomRightButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() BottomBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)
end
end
if C.actionbar.editor and C.actionbar.bar5_mouseover then
for i = 1, 12 do
local b = _G["MultiBarBottomRightButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() Bar5MouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then Bar5MouseOver(0) end end)
end
bar:SetScript("OnEnter", function() Bar5MouseOver(1) end)
bar:SetScript("OnLeave", function() if not HoverBind.enabled then Bar5MouseOver(0) end end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/Bar6.lua
================================================
local T, C, L, _ = unpack(ShestakUI)
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- MultiBar5
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "Bar6Holder", UIParent)
if C.actionbar.editor then
local NumRow = ceil(C.actionbar.bar6_num / C.actionbar.bar6_row)
bar:SetWidth((C.actionbar.bar6_size * C.actionbar.bar6_row) + (C.actionbar.button_space * (C.actionbar.bar6_row - 1)))
bar:SetHeight((C.actionbar.bar6_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))
bar:SetPoint("TOPRIGHT", RightActionBarAnchor, "TOPRIGHT", -2 * (C.actionbar.bar6_size + C.actionbar.button_space) , 0)
else
bar:SetAllPoints(RightActionBarAnchor)
end
MultiBar5:SetParent(bar)
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:SetScript("OnEvent", function(self, event)
Settings.SetValue("PROXY_SHOW_ACTIONBAR_6", true)
local NumPerRows = C.actionbar.bar6_row
local NextRowButtonAnchor = _G["MultiBar5Button1"]
for i = 1, 12 do
local b = _G["MultiBar5Button"..i]
local b2 = _G["MultiBar5Button"..i-1]
b:ClearAllPoints()
if C.actionbar.editor then
if i <= C.actionbar.bar6_num then
if i == 1 then
b:SetPoint("TOPLEFT", bar, "TOPLEFT", 0, 0)
elseif i == NumPerRows + 1 then
b:SetPoint("TOPLEFT", NextRowButtonAnchor, "BOTTOMLEFT", 0, -C.actionbar.button_space)
NumPerRows = NumPerRows + C.actionbar.bar6_row
NextRowButtonAnchor = _G["MultiBar5Button"..i]
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
else
b:SetPoint("TOP", UIParent, "TOP", 0, 200)
end
else
if i == 1 then
b:SetPoint("TOPLEFT", RightActionBarAnchor, "TOPLEFT", 0, 0)
else
b:SetPoint("TOP", b2, "BOTTOM", 0, -C.actionbar.button_space)
end
end
end
end)
-- Hide bar
if C.actionbar.rightbars < 3 then
bar:Hide()
end
-- Mouseover bar
if C.actionbar.rightbars_mouseover == true then
for i = 1, 12 do
local b = _G["MultiBar5Button"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() RightBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)
end
end
if C.actionbar.editor and C.actionbar.bar6_mouseover then
for i = 1, 12 do
local b = _G["MultiBar5Button"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() Bar6MouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then Bar6MouseOver(0) end end)
end
bar:SetScript("OnEnter", function() Bar6MouseOver(1) end)
bar:SetScript("OnLeave", function() if not HoverBind.enabled then Bar6MouseOver(0) end end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/Bar7.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- MultiBar6
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "Bar7Holder", UIParent)
local NumRow = ceil(C.actionbar.bar7_num / C.actionbar.bar7_row)
bar:SetWidth((C.actionbar.bar7_size * C.actionbar.bar7_row) + (C.actionbar.button_space * (C.actionbar.bar7_row - 1)))
bar:SetHeight((C.actionbar.bar7_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))
bar:SetPoint("BOTTOM", ActionBarAnchor, "TOP", 0, 3)
MultiBar6:SetParent(bar)
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:SetScript("OnEvent", function(self, event)
Settings.SetValue("PROXY_SHOW_ACTIONBAR_7", true)
local NumPerRows = C.actionbar.bar7_row
local NextRowButtonAnchor = _G["MultiBar6Button1"]
for i = 1, 12 do
local b = _G["MultiBar6Button"..i]
local b2 = _G["MultiBar6Button"..i-1]
b:ClearAllPoints()
if i <= C.actionbar.bar7_num then
if i == 1 then
b:SetPoint("TOPLEFT", bar, "TOPLEFT", 0, 0)
elseif i == NumPerRows + 1 then
b:SetPoint("TOPLEFT", NextRowButtonAnchor, "BOTTOMLEFT", 0, -C.actionbar.button_space)
NumPerRows = NumPerRows + C.actionbar.bar7_row
NextRowButtonAnchor = _G["MultiBar6Button"..i]
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
else
b:SetPoint("TOP", UIParent, "TOP", 0, 200)
end
end
end)
-- Hide bar
if not C.actionbar.bar7_enable then
bar:Hide()
end
-- Mouseover bar
if C.actionbar.bar7_mouseover then
for i = 1, 12 do
local b = _G["MultiBar6Button"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() Bar7MouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then Bar7MouseOver(0) end end)
end
bar:SetScript("OnEnter", function() Bar7MouseOver(1) end)
bar:SetScript("OnLeave", function() if not HoverBind.enabled then Bar7MouseOver(0) end end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/Bar8.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- MultiBar7
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "Bar8Holder", UIParent)
local NumRow = ceil(C.actionbar.bar8_num / C.actionbar.bar8_row)
bar:SetWidth((C.actionbar.bar8_size * C.actionbar.bar8_row) + (C.actionbar.button_space * (C.actionbar.bar8_row - 1)))
bar:SetHeight((C.actionbar.bar8_size * NumRow) + (C.actionbar.button_space * (NumRow - 1)))
bar:SetPoint("BOTTOM", Bar7Holder or ActionBarAnchor, "TOP", 0, 3)
MultiBar7:SetParent(bar)
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:SetScript("OnEvent", function(self, event)
Settings.SetValue("PROXY_SHOW_ACTIONBAR_8", true)
local NumPerRows = C.actionbar.bar8_row
local NextRowButtonAnchor = _G["MultiBar7Button1"]
for i = 1, 12 do
local b = _G["MultiBar7Button"..i]
local b2 = _G["MultiBar7Button"..i-1]
b:ClearAllPoints()
if i <= C.actionbar.bar8_num then
if i == 1 then
b:SetPoint("TOPLEFT", bar, "TOPLEFT", 0, 0)
elseif i == NumPerRows + 1 then
b:SetPoint("TOPLEFT", NextRowButtonAnchor, "BOTTOMLEFT", 0, -C.actionbar.button_space)
NumPerRows = NumPerRows + C.actionbar.bar8_row
NextRowButtonAnchor = _G["MultiBar7Button"..i]
else
b:SetPoint("LEFT", b2, "RIGHT", T.Scale(C.actionbar.button_space), 0)
end
else
b:SetPoint("TOP", UIParent, "TOP", 0, 200)
end
end
end)
-- Hide bar
if not C.actionbar.bar8_enable then
bar:Hide()
end
-- Mouseover bar
if C.actionbar.bar8_mouseover then
for i = 1, 12 do
local b = _G["MultiBar7Button"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() Bar8MouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then Bar8MouseOver(0) end end)
end
bar:SetScript("OnEnter", function() Bar8MouseOver(1) end)
bar:SetScript("OnLeave", function() if not HoverBind.enabled then Bar8MouseOver(0) end end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/BarPet.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- PetActionBar(by Tukz)
----------------------------------------------------------------------------------------
-- Hide bar
if C.actionbar.petbar_hide then PetActionBarAnchor:Hide() return end
-- Create bar
local bar = CreateFrame("Frame", "PetHolder", UIParent, "SecureHandlerStateTemplate")
bar:SetAllPoints(PetActionBarAnchor)
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:RegisterEvent("PLAYER_CONTROL_LOST")
bar:RegisterEvent("PLAYER_CONTROL_GAINED")
bar:RegisterEvent("PLAYER_FARSIGHT_FOCUS_CHANGED")
bar:RegisterEvent("PET_BAR_UPDATE")
bar:RegisterEvent("PET_BAR_UPDATE_USABLE")
bar:RegisterEvent("PET_BAR_UPDATE_COOLDOWN")
bar:RegisterEvent("UNIT_PET")
bar:RegisterEvent("UNIT_FLAGS")
bar:RegisterEvent("UNIT_AURA")
bar:SetScript("OnEvent", function(self, event, arg1)
if event == "PLAYER_ENTERING_WORLD" then
T.StylePet()
PetActionBar_ShowGrid = T.dummy
PetActionBar_HideGrid = T.dummy
PetActionBar.showgrid = nil
for i = 1, 10 do
local button = _G["PetActionButton"..i]
button:ClearAllPoints()
button:SetParent(self)
if i == 1 then
if C.actionbar.petbar_horizontal == true then
button:SetPoint("BOTTOMLEFT", 0, 0)
else
button:SetPoint("TOPLEFT", 0, 0)
end
else
local previous = _G["PetActionButton"..i-1]
if C.actionbar.petbar_horizontal == true then
button:SetPoint("LEFT", previous, "RIGHT", C.actionbar.button_space, 0)
else
button:SetPoint("TOP", previous, "BOTTOM", 0, -C.actionbar.button_space)
end
end
button:Show()
self:SetAttribute("addchild", button)
end
RegisterStateDriver(self, "visibility", "[pet,novehicleui,nopossessbar,nopetbattle] show; hide")
hooksecurefunc(PetActionBar, "Update", T.PetBarUpdate)
elseif event == "PET_BAR_UPDATE" or event == "PLAYER_CONTROL_LOST" or event == "PLAYER_CONTROL_GAINED" or event == "PLAYER_FARSIGHT_FOCUS_CHANGED"
or event == "UNIT_FLAGS" or (event == "UNIT_PET" and arg1 == "player") or (event == "UNIT_AURA" and arg1 == "pet") then
T.PetBarUpdate()
elseif event == "PET_BAR_UPDATE_COOLDOWN" then
PetActionBar:UpdateCooldowns()
end
end)
hooksecurefunc(PetActionButton10, "SetPoint", function(_, _, anchor)
if InCombatLockdown() then return end
if anchor and anchor == PetActionBar then
for i = 1, 10 do
local button = _G["PetActionButton"..i]
button:ClearAllPoints()
if i == 1 then
if C.actionbar.petbar_horizontal == true then
button:SetPoint("BOTTOMLEFT", 0, 0)
else
button:SetPoint("TOPLEFT", 0, 0)
end
else
local previous = _G["PetActionButton"..i-1]
if C.actionbar.petbar_horizontal == true then
button:SetPoint("LEFT", previous, "RIGHT", C.actionbar.button_space, 0)
else
button:SetPoint("TOP", previous, "BOTTOM", 0, -C.actionbar.button_space)
end
end
end
end
end)
-- Mouseover bar
if C.actionbar.rightbars_mouseover == true and C.actionbar.petbar_horizontal == false then
PetActionBarAnchor:SetAlpha(0)
PetActionBarAnchor:SetScript("OnEnter", function() if PetHolder:IsShown() then RightBarMouseOver(1) end end)
PetActionBarAnchor:SetScript("OnLeave", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)
for i = 1, NUM_PET_ACTION_SLOTS do
local b = _G["PetActionButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() RightBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)
end
end
if C.actionbar.petbar_mouseover == true and (C.actionbar.petbar_horizontal == true or C.actionbar.editor) then
PetActionBarAnchor:SetAlpha(0)
PetActionBarAnchor:SetScript("OnEnter", function() PetBarMouseOver(1) end)
PetActionBarAnchor:SetScript("OnLeave", function() if not HoverBind.enabled then PetBarMouseOver(0) end end)
for i = 1, NUM_PET_ACTION_SLOTS do
local b = _G["PetActionButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() PetBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then PetBarMouseOver(0) end end)
end
end
================================================
FILE: ShestakUI/Modules/ActionBars/BarStance.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- StanceBar(by Tukz)
----------------------------------------------------------------------------------------
-- Hide bar
if C.actionbar.stancebar_hide then
StanceBar:SetParent(StanceBarAnchor)
StanceBar:UnregisterAllEvents()
for _, button in pairs(StanceBar.actionButtons) do
button:UnregisterAllEvents()
button:SetAttribute("statehidden", true)
button:Hide()
end
StanceBarAnchor:Hide()
return
end
-- Create bar
local bar = CreateFrame("Frame", "StanceHolder", UIParent, "SecureHandlerStateTemplate")
bar:SetAllPoints(StanceBarAnchor)
bar:RegisterEvent("PLAYER_LOGIN")
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:RegisterEvent("UPDATE_SHAPESHIFT_FORMS")
bar:RegisterEvent("UPDATE_SHAPESHIFT_USABLE")
bar:RegisterEvent("UPDATE_SHAPESHIFT_COOLDOWN")
bar:RegisterEvent("ACTIONBAR_PAGE_CHANGED")
bar:SetScript("OnEvent", function(self, event)
if event == "PLAYER_LOGIN" then
for i = 1, 10 do
local button = _G["StanceButton"..i]
button:ClearAllPoints()
button:SetParent(self)
if i == 1 then
if C.actionbar.stancebar_horizontal == true then
button:SetPoint("BOTTOMLEFT", StanceBarAnchor, "BOTTOMLEFT", 0, 0)
else
button:SetPoint("TOPLEFT", StanceBarAnchor, "TOPLEFT", 0, 0)
end
else
local previous = _G["StanceButton"..i-1]
if C.actionbar.stancebar_horizontal == true then
button:SetPoint("LEFT", previous, "RIGHT", C.actionbar.button_space, 0)
else
button:SetPoint("TOP", previous, "BOTTOM", 0, -C.actionbar.button_space)
end
end
local icon = GetShapeshiftFormInfo(i)
if icon then
button:Show()
else
button:Hide()
end
end
elseif event == "UPDATE_SHAPESHIFT_FORMS" then
if InCombatLockdown() then return end
for i = 1, 10 do
local button = _G["StanceButton"..i]
local icon = GetShapeshiftFormInfo(i)
if icon then
button:Show()
else
button:Hide()
end
end
T.ShiftBarUpdate()
elseif event == "PLAYER_ENTERING_WORLD" then
T.StyleShift()
else
T.ShiftBarUpdate()
end
end)
local function reposition()
for i = 1, 10 do
local button = _G["StanceButton"..i]
button:ClearAllPoints()
if i == 1 then
if C.actionbar.stancebar_horizontal == true then
button:SetPoint("BOTTOMLEFT", StanceBarAnchor, "BOTTOMLEFT", 0, 0)
else
button:SetPoint("TOPLEFT", StanceBarAnchor, "TOPLEFT", 0, 0)
end
else
local previous = _G["StanceButton"..i-1]
if C.actionbar.stancebar_horizontal == true then
button:SetPoint("LEFT", previous, "RIGHT", C.actionbar.button_space, 0)
else
button:SetPoint("TOP", previous, "BOTTOM", 0, -C.actionbar.button_space)
end
end
end
end
hooksecurefunc(StanceButton1, "SetPoint", function(_, _, anchor)
if InCombatLockdown() then return end
if anchor and anchor == StanceBar then
local forms = GetNumShapeshiftForms()
local button = _G["StanceButton"..forms]
if button and not button.hook then
hooksecurefunc(button, "SetPoint", function(_, _, anchor)
if InCombatLockdown() then return end
if anchor and anchor == StanceBar then
reposition()
end
end)
button.hook = true
end
end
end)
-- Mouseover bar
if C.actionbar.rightbars_mouseover == true and C.actionbar.stancebar_horizontal == false then
StanceBarAnchor:SetAlpha(0)
StanceBarAnchor:SetScript("OnEnter", function() if StanceButton1:IsShown() then RightBarMouseOver(1) end end)
StanceBarAnchor:SetScript("OnLeave", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)
for i = 1, 10 do
local b = _G["StanceButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() RightBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)
end
end
if C.actionbar.stancebar_mouseover == true and (C.actionbar.stancebar_horizontal == true or C.actionbar.editor) then
StanceBarAnchor:SetAlpha(0)
StanceBarAnchor:SetScript("OnEnter", function() StanceBarMouseOver(1) end)
StanceBarAnchor:SetScript("OnLeave", function() if not HoverBind.enabled then StanceBarMouseOver(0) end end)
for i = 1, 10 do
local b = _G["StanceButton"..i]
b:SetAlpha(0)
b:HookScript("OnEnter", function() StanceBarMouseOver(1) end)
b:HookScript("OnLeave", function() if not HoverBind.enabled then StanceBarMouseOver(0) end end)
end
end
================================================
FILE: ShestakUI/Modules/ActionBars/Bindings.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if IsAddOnLoaded("ncHoverBind") then return end
----------------------------------------------------------------------------------------
-- Binding buttons(ncHoverBind by Nightcracker)
----------------------------------------------------------------------------------------
local bind, oneBind, localmacros = CreateFrame("Frame", "HoverBind", UIParent), true, 0
SlashCmdList.MOUSEOVERBIND = function()
if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end
if not bind.loaded then
bind:SetFrameStrata("DIALOG")
bind:EnableMouse(true)
bind:EnableKeyboard(true)
bind:EnableMouseWheel(true)
bind.texture = bind:CreateTexture()
bind.texture:SetPoint("TOPLEFT", bind, 2, -2)
bind.texture:SetPoint("BOTTOMRIGHT", bind, -2, 2)
bind.texture:SetColorTexture(1, 1, 1, 0.3)
bind:Hide()
local elapsed = 0
GameTooltip:HookScript("OnUpdate", function(self, e)
elapsed = elapsed + e
if elapsed < 0.2 then return else elapsed = 0 end
if not self.comparing and IsModifiedClick("COMPAREITEMS") then
GameTooltip_ShowCompareItem(self)
self.comparing = true
elseif self.comparing and not IsModifiedClick("COMPAREITEMS") then
for _, frame in pairs(self.shoppingTooltips) do
frame:Hide()
end
self.comparing = false
end
end)
hooksecurefunc(GameTooltip, "Hide", function(self) for _, tt in pairs(self.shoppingTooltips) do tt:Hide() end end)
bind:SetScript("OnEnter", function()
GameTooltip:SetOwner(bind, "ANCHOR_NONE")
GameTooltip:SetPoint("BOTTOM", bind, "TOP", 0, 2)
GameTooltip:AddLine(bind.button.name, 1, 1, 1)
if #bind.button.bindings == 0 then
GameTooltip:AddLine(L_BIND_NO_SET, 0.6, 0.6, 0.6)
else
GameTooltip:AddDoubleLine(L_BIND_BINDING, L_BIND_KEY, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)
for i = 1, #bind.button.bindings do
GameTooltip:AddDoubleLine(i, bind.button.bindings[i])
end
end
GameTooltip:Show()
end)
bind:SetScript("OnEvent", function(self) self:Deactivate(false) end)
bind:SetScript("OnLeave", function(self) self:HideFrame() end)
bind:SetScript("OnKeyDown", function(self, key) self:Listener(key) end)
bind:SetScript("OnMouseDown", function(self, key) self:Listener(key) end)
bind:SetScript("OnMouseWheel", function(self, delta) if delta > 0 then self:Listener("MOUSEWHEELUP") else self:Listener("MOUSEWHEELDOWN") end end)
function bind:Update(b, spellmacro)
if not self.enabled or InCombatLockdown() then return end
self.button = b
self.spellmacro = spellmacro
self:ClearAllPoints()
self:SetAllPoints(b)
self:Show()
ShoppingTooltip1:Hide()
if spellmacro == "SPELL" then
self.button.id = SpellBook_GetSpellBookSlot(self.button)
self.button.name = GetSpellBookItemName(self.button.id, SpellBookFrame.bookType)
GameTooltip:Show()
GameTooltip:SetScript("OnHide", function(self)
self:SetOwner(bind, "ANCHOR_NONE")
self:SetPoint("BOTTOM", bind, "TOP", 0, 1)
self:AddLine(bind.button.name, 1, 1, 1)
bind.button.bindings = {GetBindingKey(spellmacro.." "..bind.button.name)}
if #bind.button.bindings == 0 then
self:AddLine(L_BIND_NO_SET, 0.6, 0.6, 0.6)
else
self:AddDoubleLine(L_BIND_BINDING, L_BIND_KEY, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)
for i = 1, #bind.button.bindings do
self:AddDoubleLine(i, bind.button.bindings[i])
end
end
self:Show()
self:SetScript("OnHide", nil)
end)
elseif spellmacro == "MACRO" then
self.button.id = self.button.selectionIndex or self.button:GetID()
if localmacros == 1 then self.button.id = self.button.id + MAX_ACCOUNT_MACROS end
self.button.name = GetMacroInfo(self.button.id)
GameTooltip:SetOwner(bind, "ANCHOR_NONE")
GameTooltip:SetPoint("BOTTOM", bind, "TOP", 0, 1)
GameTooltip:AddLine(bind.button.name, 1, 1, 1)
bind.button.bindings = {GetBindingKey(spellmacro.." "..bind.button.name)}
if #bind.button.bindings == 0 then
GameTooltip:AddLine(L_BIND_NO_SET, 0.6, 0.6, 0.6)
else
GameTooltip:AddDoubleLine(L_BIND_BINDING, L_BIND_KEY, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)
for i = 1, #bind.button.bindings do
GameTooltip:AddDoubleLine(i, bind.button.bindings[i], 1, 1, 1)
end
end
GameTooltip:Show()
elseif spellmacro == "STANCE" or spellmacro == "PET" then
self.button.id = tonumber(b:GetID())
self.button.name = b:GetName()
if not self.button.name then return end
if not self.button.id or self.button.id < 1 or self.button.id > (spellmacro == "STANCE" and 10 or 12) then
self.button.bindstring = "CLICK "..self.button.name..":LeftButton"
else
self.button.bindstring = (spellmacro == "STANCE" and "SHAPESHIFTBUTTON" or "BONUSACTIONBUTTON")..self.button.id
end
GameTooltip:Show()
GameTooltip:SetScript("OnHide", function(self)
self:SetOwner(bind, "ANCHOR_NONE")
self:SetPoint("BOTTOM", bind, "TOP", 0, 1)
self:AddLine(bind.button.name, 1, 1, 1)
bind.button.bindings = {GetBindingKey(bind.button.bindstring)}
if #bind.button.bindings == 0 then
self:AddLine(L_BIND_NO_SET, 0.6, 0.6, 0.6)
else
self:AddDoubleLine(L_BIND_BINDING, L_BIND_KEY, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)
for i = 1, #bind.button.bindings do
self:AddDoubleLine(i, bind.button.bindings[i])
end
end
self:Show()
self:SetScript("OnHide", nil)
end)
else
self.button.action = tonumber(b.action)
self.button.name = b:GetName()
if not self.button.name then return end
if not self.button.action or self.button.action < 1 or self.button.action > 132 then
self.button.bindstring = "CLICK "..self.button.name..":LeftButton"
else
local modact = 1 + (self.button.action - 1) % 12
if self.button.name == "ExtraActionButton1" then
self.button.bindstring = "EXTRAACTIONBUTTON1"
elseif self.button.action < 13 or self.button.action > 72 then
self.button.bindstring = "ACTIONBUTTON"..modact
elseif self.button.action < 73 and self.button.action > 60 then
self.button.bindstring = "MULTIACTIONBAR1BUTTON"..modact
elseif self.button.action < 61 and self.button.action > 48 then
self.button.bindstring = "MULTIACTIONBAR2BUTTON"..modact
elseif self.button.action < 49 and self.button.action > 36 then
self.button.bindstring = "MULTIACTIONBAR4BUTTON"..modact
elseif self.button.action < 37 and self.button.action > 24 then
self.button.bindstring = "MULTIACTIONBAR3BUTTON"..modact
elseif self.button.action < 25 and self.button.action > 12 then
self.button.bindstring = "CLICK "..self.button.name..":LeftButton"
end
end
bind.button.bindings = {GetBindingKey(bind.button.bindstring)}
bind:GetScript("OnEnter")()
end
end
function bind:Listener(key)
if GetBindingKey(key) == "OPENCHAT" then
DEFAULT_CHAT_FRAME.editBox:Show()
return
end
if GetBindingByKey(key) == "SCREENSHOT" then
RunBinding("SCREENSHOT")
return
end
if #self.button.bindings > 0 and oneBind then
for i = 1, #self.button.bindings do
SetBinding(self.button.bindings[i])
end
self:Update(self.button, self.spellmacro)
if self.spellmacro ~= "MACRO" then GameTooltip:Hide() end
end
if key == "ESCAPE" or key == "RightButton" then
for i = 1, #self.button.bindings do
SetBinding(self.button.bindings[i])
end
print("|cffffff00"..L_BIND_CLEARED.."|r".." |cff00ff00"..self.button.name.."|r|cffffff00.|r")
self:Update(self.button, self.spellmacro)
if self.spellmacro ~= "MACRO" then GameTooltip:Hide() end
return
end
if key == "LSHIFT" or key == "RSHIFT" or key == "LCTRL" or key == "RCTRL" or key == "LALT"
or key == "RALT" or key == "UNKNOWN" or key == "LeftButton" then return end
if key == "MiddleButton" then key = "BUTTON3" end
if key:find("Button%d") then key = key:upper() end
local alt = IsAltKeyDown() and "ALT-" or ""
local ctrl = IsControlKeyDown() and "CTRL-" or ""
local shift = IsShiftKeyDown() and "SHIFT-" or ""
if not self.spellmacro or self.spellmacro == "PET" or self.spellmacro == "STANCE" then
SetBinding(alt..ctrl..shift..key, self.button.bindstring)
else
SetBinding(alt..ctrl..shift..key, self.spellmacro.." "..self.button.name)
end
print(alt..ctrl..shift..key.." |cff00ff00bound to |r"..self.button.name..".")
self:Update(self.button, self.spellmacro)
if self.spellmacro ~= "MACRO" then GameTooltip:Hide() end
end
function bind:HideFrame()
self:ClearAllPoints()
self:Hide()
GameTooltip:Hide()
end
function bind:Activate()
self.enabled = true
self:RegisterEvent("PLAYER_REGEN_DISABLED")
if C.actionbar.enable then
if C.actionbar.bottombars_mouseover == true then
BottomBarMouseOver(1)
end
if C.actionbar.rightbars_mouseover == true then
RightBarMouseOver(1)
end
if C.actionbar.stancebar_mouseover == true then
StanceBarMouseOver(1)
end
if C.actionbar.petbar_mouseover == true and C.actionbar.petbar_horizontal == true then
PetBarMouseOver(1)
end
if C.actionbar.bar7_enable and C.actionbar.bar7_mouseover then
Bar7MouseOver(1)
end
if C.actionbar.bar8_enable and C.actionbar.bar8_mouseover then
Bar8MouseOver(1)
end
end
end
function bind:Deactivate(save)
local which = GetCurrentBindingSet()
if save then
SaveBindings(which)
print("|cffffff00"..L_BIND_SAVED.."|r")
else
LoadBindings(which)
print("|cffffff00"..L_BIND_DISCARD.."|r")
end
self.enabled = false
self:HideFrame()
self:UnregisterEvent("PLAYER_REGEN_DISABLED")
StaticPopup_Hide("KEYBIND_MODE")
if C.actionbar.enable then
if C.actionbar.bottombars_mouseover == true then
BottomBarMouseOver(0)
end
if C.actionbar.rightbars_mouseover == true then
RightBarMouseOver(0)
end
if C.actionbar.stancebar_mouseover == true then
StanceBarMouseOver(0)
end
if C.actionbar.petbar_mouseover == true and C.actionbar.petbar_horizontal == true then
PetBarMouseOver(0)
end
if C.actionbar.bar7_enable and C.actionbar.bar7_mouseover then
Bar7MouseOver(0)
end
if C.actionbar.bar8_enable and C.actionbar.bar8_mouseover then
Bar8MouseOver(0)
end
end
end
StaticPopupDialogs.KEYBIND_MODE = {
text = L_BIND_INSTRUCT,
button1 = APPLY,
button2 = CANCEL,
OnAccept = function() bind:Deactivate(true) ReloadUI() end,
OnCancel = function() bind:Deactivate(false) end,
timeout = 0,
whileDead = 1,
hideOnEscape = false,
preferredIndex = 5,
}
-- Registering
for i = 1, 12 do
local b = _G["ActionButton"..i]
b:HookScript("OnEnter", function(self) bind:Update(self) end)
b = _G["MultiBarBottomLeftButton"..i]
b:HookScript("OnEnter", function(self) bind:Update(self) end)
b = _G["MultiBarLeftButton"..i]
b:HookScript("OnEnter", function(self) bind:Update(self) end)
b = _G["MultiBarRightButton"..i]
b:HookScript("OnEnter", function(self) bind:Update(self) end)
b = _G["MultiBarBottomRightButton"..i]
b:HookScript("OnEnter", function(self) bind:Update(self) end)
b = _G["MultiBar5Button"..i]
b:HookScript("OnEnter", function(self) bind:Update(self) end)
end
if C.actionbar.bar7_enable then
for i = 1, 12 do
local b = _G["MultiBar6Button"..i]
b:HookScript("OnEnter", function(self) bind:Update(self) end)
end
end
if C.actionbar.bar8_enable then
for i = 1, 12 do
local b = _G["MultiBar7Button"..i]
b:HookScript("OnEnter", function(self) bind:Update(self) end)
end
end
for i = 1, 10 do
local b = _G["StanceButton"..i]
b:HookScript("OnEnter", function(self) bind:Update(self, "STANCE") end)
end
for i = 1, NUM_PET_ACTION_SLOTS do
local b = _G["PetActionButton"..i]
b:HookScript("OnEnter", function(self) bind:Update(self, "PET") end)
end
for i = 1, 12 do
local b = _G["SpellButton"..i]
b:HookScript("OnEnter", function(self) bind:Update(self, "SPELL") end)
end
ExtraActionButton1:HookScript("OnEnter", function(self) bind:Update(self) end)
local function registermacro()
hooksecurefunc(MacroFrame, "Update", function(frame)
for _, button in next, {frame.MacroSelector.ScrollBox.ScrollTarget:GetChildren()} do
if button and not button.hook then
button:HookScript("OnEnter", function(self) bind:Update(button, "MACRO") end)
button.hook = true
end
end
end)
MacroFrameTab1:HookScript("OnMouseUp", function() localmacros = 0 end)
MacroFrameTab2:HookScript("OnMouseUp", function() localmacros = 1 end)
end
if not IsAddOnLoaded("Blizzard_MacroUI") then
hooksecurefunc("LoadAddOn", function(addon)
if addon == "Blizzard_MacroUI" then
registermacro()
end
end)
else
registermacro()
end
bind.loaded = 1
end
if not bind.enabled then
bind:Activate()
StaticPopup_Show("KEYBIND_MODE")
end
end
SLASH_MOUSEOVERBIND1 = "/bindkey"
SLASH_MOUSEOVERBIND2 = "/hoverbind"
SLASH_MOUSEOVERBIND3 = "/bk"
if not IsAddOnLoaded("Bartender4") and not IsAddOnLoaded("Dominos") then
SLASH_MOUSEOVERBIND4 = "/kb"
end
if not IsAddOnLoaded("HealBot") then
SLASH_MOUSEOVERBIND5 = "/hb"
end
================================================
FILE: ShestakUI/Modules/ActionBars/Cooldowns.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if IsAddOnLoaded("OmniCC") or IsAddOnLoaded("ncCooldown") or IsAddOnLoaded("tullaCC") then return end
----------------------------------------------------------------------------------------
-- Cooldown count(tullaCC by Tuller)
----------------------------------------------------------------------------------------
local format = string.format
local floor = math.floor
local function GetFormattedTime(s)
local day, hour, minute = 86400, 3600, 60
if s >= day then
return format("%dd", floor(s / day + 0.5)), s % day
elseif s >= hour then
return format("%dh", floor(s / hour + 0.5)), s % hour
elseif s >= minute then
return format("%dm", floor(s / minute + 0.5)), s % minute
end
return floor(s + 0.5), s - floor(s)
end
local function Timer_Stop(self)
self.enabled = nil
self:Hide()
end
local function Timer_ForceUpdate(self)
self.nextUpdate = 0
self:Show()
end
local function Timer_OnSizeChanged(self, width)
local fontScale = T.Round(width) / 40
if fontScale == self.fontScale then
return
end
self.fontScale = fontScale
if fontScale < 0.5 then
self:Hide()
else
self.text:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
self.text:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
if self.enabled then
Timer_ForceUpdate(self)
end
end
end
local function Timer_OnUpdate(self, elapsed)
if self.text:IsShown() then
if self.nextUpdate > 0 then
self.nextUpdate = self.nextUpdate - elapsed
else
if (self:GetEffectiveScale() / UIParent:GetEffectiveScale()) < 0.5 then
self.text:SetText("")
self.nextUpdate = 1
else
local remain = self.duration - (GetTime() - self.start)
if floor(remain + 0.5) > 0 then
local time, nextUpdate = GetFormattedTime(remain)
self.text:SetText(time)
self.nextUpdate = nextUpdate
if floor(remain + 0.5) > 5 then
self.text:SetTextColor(1, 1, 1)
else
self.text:SetTextColor(1, 0.2, 0.2)
end
else
Timer_Stop(self)
end
end
end
end
end
local Timer_Create
if IsWetxius then
Timer_Create = function(self)
local scaler = CreateFrame("Frame", nil, self)
scaler:SetAllPoints(self)
local timer = CreateFrame("Frame", nil, scaler)
timer:Hide()
timer:SetAllPoints(scaler)
timer:SetScript("OnUpdate", Timer_OnUpdate)
local text = timer:CreateFontString(nil, "OVERLAY")
text:SetPoint("LEFT", -2, 0)
text:SetPoint("RIGHT", 3, 0)
text:SetJustifyH("CENTER")
timer.text = text
Timer_OnSizeChanged(timer, scaler:GetSize())
scaler:SetScript("OnSizeChanged", function(_, ...) Timer_OnSizeChanged(timer, ...) end)
self.timer = timer
return timer
end
else
Timer_Create = function(self)
local scaler = CreateFrame("Frame", nil, self)
scaler:SetAllPoints(self)
local timer = CreateFrame("Frame", nil, scaler)
timer:Hide()
timer:SetAllPoints(scaler)
timer:SetScript("OnUpdate", Timer_OnUpdate)
local text = timer:CreateFontString(nil, "OVERLAY")
text:SetPoint("CENTER", 1, 0)
text:SetJustifyH("CENTER")
timer.text = text
Timer_OnSizeChanged(timer, scaler:GetSize())
scaler:SetScript("OnSizeChanged", function(_, ...) Timer_OnSizeChanged(timer, ...) end)
self.timer = timer
return timer
end
end
local Cooldown_MT = getmetatable(_G.ActionButton1Cooldown).__index
local hideNumbers = {}
local function deactivateDisplay(cooldown)
local timer = cooldown.timer
if timer then
Timer_Stop(timer)
end
end
local function setHideCooldownNumbers(cooldown, hide)
if hide then
hideNumbers[cooldown] = true
deactivateDisplay(cooldown)
else
hideNumbers[cooldown] = nil
end
end
hooksecurefunc(Cooldown_MT, "SetCooldown", function(cooldown, start, duration, modRate)
if cooldown.noCooldownCount or cooldown:IsForbidden() or hideNumbers[cooldown] then return end
local show = (start and start > 0) and (duration and duration > 2) and (modRate == nil or modRate > 0)
if show then
local parent = cooldown:GetParent()
if parent and parent.chargeCooldown == cooldown then return end
local timer = cooldown.timer or Timer_Create(cooldown)
timer.start = start
timer.duration = duration
timer.enabled = true
timer.nextUpdate = 0
if timer.fontScale >= 0.5 then timer:Show() end
else
deactivateDisplay(cooldown)
end
end)
hooksecurefunc(Cooldown_MT, "Clear", deactivateDisplay)
hooksecurefunc(Cooldown_MT, "SetHideCountdownNumbers", setHideCooldownNumbers)
hooksecurefunc("CooldownFrame_SetDisplayAsPercentage", function(cooldown)
setHideCooldownNumbers(cooldown, true)
end)
================================================
FILE: ShestakUI/Modules/ActionBars/Core.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Hide Blizzard ActionBars stuff(by Tukz)
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
MainMenuBar:SetScale(0.00001)
MainMenuBar:EnableMouse(false)
OverrideActionBar:SetScale(0.00001)
OverrideActionBar:EnableMouse(false)
PetActionBar:EnableMouse(false)
PetActionBar:UnregisterAllEvents()
StanceBar:EnableMouse(false)
StanceBar:UnregisterAllEvents()
MicroButtonAndBagsBar:SetScale(0.00001)
MicroButtonAndBagsBar:EnableMouse(false)
MicroButtonAndBagsBar:ClearAllPoints()
MicroButtonAndBagsBar:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, -99) -- Prevent scaling for right panels
BagsBar:Hide()
BagsBar:UnregisterAllEvents()
if not C.actionbar.micromenu then
MicroMenu:Hide()
end
MainMenuBar:SetMovable(true)
MainMenuBar:SetUserPlaced(true)
MainMenuBar.ignoreFramePositionManager = true
MainMenuBar:SetAttribute("ignoreFramePositionManager", true)
local elements = {
MainMenuBar, MainMenuBarArtFrame, OverrideActionBar, PossessBarFrame,
MultiBarBottomLeft.QuickKeybindGlow, MultiBarLeft.QuickKeybindGlow, MultiBarBottomRight.QuickKeybindGlow, MultiBarRight.QuickKeybindGlow,
StatusTrackingBarManager
}
if not C_ClassTrial.IsClassTrialCharacter() then
tinsert(elements, IconIntroTracker)
end
for _, element in pairs(elements) do
if element.UnregisterAllEvents then
element:UnregisterAllEvents()
end
if element ~= MainMenuBar then
element:Hide()
end
element:SetAlpha(0)
end
for i = 1, 6 do
local b = _G["OverrideActionBarButton"..i]
b:UnregisterAllEvents()
b:SetAttribute("statehidden", true)
b:SetAttribute("showgrid", 1)
end
hooksecurefunc("TalentFrame_LoadUI", function()
PlayerTalentFrame:UnregisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
end)
end)
----------------------------------------------------------------------------------------
-- Set mouseover for bars
----------------------------------------------------------------------------------------
function RightBarMouseOver(alpha)
RightActionBarAnchor:SetAlpha(alpha)
PetActionBarAnchor:SetAlpha(alpha)
StanceBarAnchor:SetAlpha(alpha)
if MultiBarLeft:IsShown() then
for i = 1, 12 do
local b = _G["MultiBarLeftButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarLeftButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
MultiBarLeft:SetAlpha(alpha)
end
if MultiBarRight:IsShown() then
for i = 1, 12 do
local b = _G["MultiBarRightButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarRightButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
MultiBarRight:SetAlpha(alpha)
end
if C.actionbar.rightbars > 2 then
if MultiBar5:IsShown() then
for i = 1, 12 do
local b = _G["MultiBar5Button"..i]
b:SetAlpha(alpha)
local c = _G["MultiBar5Button"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
MultiBar5:SetAlpha(alpha)
end
end
if C.actionbar.petbar_horizontal == false and C.actionbar.petbar_hide == false then
if PetHolder:IsShown() then
for i = 1, NUM_PET_ACTION_SLOTS do
local b = _G["PetActionButton"..i]
b:SetAlpha(alpha)
local c = _G["PetActionButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
PetHolder:SetAlpha(alpha)
end
end
if C.actionbar.stancebar_horizontal == false and C.actionbar.stancebar_hide == false then
if StanceHolder:IsShown() then
for i = 1, 10 do
local b = _G["StanceButton"..i]
b:SetAlpha(alpha)
local c = _G["StanceButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
StanceHolder:SetAlpha(alpha)
end
end
end
function StanceBarMouseOver(alpha)
for i = 1, 10 do
local b = _G["StanceButton"..i]
b:SetAlpha(alpha)
local c = _G["StanceButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
StanceHolder:SetAlpha(alpha)
end
function PetBarMouseOver(alpha)
for i = 1, NUM_PET_ACTION_SLOTS do
local b = _G["PetActionButton"..i]
b:SetAlpha(alpha)
local c = _G["PetActionButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
PetHolder:SetAlpha(alpha)
end
if C.actionbar.rightbars_mouseover == true then
RightActionBarAnchor:SetAlpha(0)
RightActionBarAnchor:SetScript("OnEnter", function() RightBarMouseOver(1) end)
RightActionBarAnchor:SetScript("OnLeave", function() if not HoverBind.enabled then RightBarMouseOver(0) end end)
end
function BottomBarMouseOver(alpha)
for i = 1, 12 do
local b = _G["ActionButton"..i]
b:SetAlpha(alpha)
local c = _G["ActionButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
if C.actionbar.bottombars > 1 and MultiBarBottomLeft:IsShown() then
for i = 1, 12 do
local b = _G["MultiBarBottomLeftButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarBottomLeftButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
if C.actionbar.bottombars > 2 and MultiBarBottomRight:IsShown() then
if C.actionbar.toggle_mode == true and ShestakUISettingsPerChar.BottomBars == 1 then
for i = 4, 6 do
local b = _G["MultiBarBottomRightButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarBottomRightButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
for i = 10, 12 do
local b = _G["MultiBarBottomRightButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarBottomRightButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
else
for i = 1, 12 do
local b = _G["MultiBarBottomRightButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarBottomRightButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
end
end
if C.actionbar.bottombars_mouseover then
ActionBarAnchor:SetScript("OnEnter", function() BottomBarMouseOver(1) end)
ActionBarAnchor:SetScript("OnLeave", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)
if C.actionbar.split_bars == true then
SplitBarLeft:SetScript("OnEnter", function() BottomBarMouseOver(1) end)
SplitBarLeft:SetScript("OnLeave", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)
SplitBarRight:SetScript("OnEnter", function() BottomBarMouseOver(1) end)
SplitBarRight:SetScript("OnLeave", function() if not HoverBind.enabled then BottomBarMouseOver(0) end end)
end
end
function Bar1MouseOver(alpha)
for i = 1, 12 do
local b = _G["ActionButton"..i]
b:SetAlpha(alpha)
local c = _G["ActionButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
function Bar2MouseOver(alpha)
if MultiBarBottomLeft:IsShown() then
for i = 1, 12 do
local b = _G["MultiBarBottomLeftButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarBottomLeftButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
end
function Bar3MouseOver(alpha)
if MultiBarLeft:IsShown() then
for i = 1, 12 do
local b = _G["MultiBarLeftButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarLeftButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
end
function Bar4MouseOver(alpha)
if MultiBarRight:IsShown() then
for i = 1, 12 do
local b = _G["MultiBarRightButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarRightButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
end
function Bar5MouseOver(alpha)
if MultiBarBottomRight:IsShown() then
for i = 1, 12 do
local b = _G["MultiBarBottomRightButton"..i]
b:SetAlpha(alpha)
local c = _G["MultiBarBottomRightButton"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
end
function Bar6MouseOver(alpha)
if MultiBar5:IsShown() then
for i = 1, 12 do
local b = _G["MultiBar6Button"..i]
b:SetAlpha(alpha)
local c = _G["MultiBar6Button"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
end
function Bar7MouseOver(alpha)
if MultiBar6:IsShown() then
for i = 1, 12 do
local b = _G["MultiBar6Button"..i]
b:SetAlpha(alpha)
local c = _G["MultiBar6Button"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
end
function Bar8MouseOver(alpha)
if MultiBar7:IsShown() then
for i = 1, 12 do
local b = _G["MultiBar7Button"..i]
b:SetAlpha(alpha)
local c = _G["MultiBar7Button"..i.."Cooldown"]
T.HideSpiral(c, alpha)
end
end
end
----------------------------------------------------------------------------------------
-- Fix cooldown spiral alpha (WoD bug)
----------------------------------------------------------------------------------------
function T.HideSpiral(f, alpha)
f:SetSwipeColor(0, 0, 0, alpha * 0.8)
f:SetDrawBling(alpha == 1)
end
local EventSpiral = CreateFrame("Frame")
EventSpiral:RegisterEvent("PLAYER_ENTERING_WORLD")
EventSpiral:SetScript("OnEvent", function()
if C.actionbar.rightbars_mouseover == true then
RightBarMouseOver(0)
end
if C.actionbar.petbar_mouseover == true and C.actionbar.petbar_horizontal == true and C.actionbar.petbar_hide ~= true then
PetBarMouseOver(0)
end
if C.actionbar.stancebar_mouseover == true and C.actionbar.stancebar_horizontal == true and C.actionbar.stancebar_hide ~= true then
StanceBarMouseOver(0)
end
if C.actionbar.bottombars_mouseover then
BottomBarMouseOver(0)
end
if C.actionbar.editor then
if C.actionbar.bar1_mouseover then
Bar1MouseOver(0)
end
if C.actionbar.bar2_mouseover then
Bar2MouseOver(0)
end
if C.actionbar.bar3_mouseover then
Bar3MouseOver(0)
end
if C.actionbar.bar4_mouseover then
Bar4MouseOver(0)
end
if C.actionbar.bar5_mouseover then
Bar5MouseOver(0)
end
if C.actionbar.bar6_mouseover then
Bar6MouseOver(0)
end
end
if C.actionbar.bar7_mouseover then
Bar7MouseOver(0)
end
if C.actionbar.bar8_mouseover then
Bar8MouseOver(0)
end
EventSpiral:UnregisterEvent("PLAYER_ENTERING_WORLD")
end)
if (C.actionbar.rightbars_mouseover == true and C.actionbar.petbar_horizontal == false and C.actionbar.petbar_hide == false) or (C.actionbar.petbar_mouseover == true and C.actionbar.petbar_horizontal == true and C.actionbar.petbar_hide == false) then
local EventPetSpiral = CreateFrame("Frame")
EventPetSpiral:RegisterEvent("PET_BAR_UPDATE_COOLDOWN")
EventPetSpiral:SetScript("OnEvent", function()
for i = 1, NUM_PET_ACTION_SLOTS do
local c = _G["PetActionButton"..i.."Cooldown"]
T.HideSpiral(c, 0)
end
EventPetSpiral:UnregisterEvent("PET_BAR_UPDATE_COOLDOWN")
end)
end
----------------------------------------------------------------------------------------
-- Show grid function
----------------------------------------------------------------------------------------
if not C.actionbar.show_grid then
local allButtons = {}
for i = 1, 12 do
local button = _G[format("ActionButton%d", i)]
tinsert(allButtons, button)
local button = _G[format("MultiBarRightButton%d", i)]
tinsert(allButtons, button)
button = _G[format("MultiBarBottomRightButton%d", i)]
tinsert(allButtons, button)
button = _G[format("MultiBarLeftButton%d", i)]
tinsert(allButtons, button)
button = _G[format("MultiBarBottomLeftButton%d", i)]
tinsert(allButtons, button)
button = _G[format("MultiBar5Button%d", i)]
tinsert(allButtons, button)
button = _G[format("MultiBar6Button%d", i)]
tinsert(allButtons, button)
button = _G[format("MultiBar7Button%d", i)]
tinsert(allButtons, button)
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("ACTIONBAR_SHOWGRID")
frame:RegisterEvent("ACTIONBAR_HIDEGRID")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterEvent("ACTIONBAR_PAGE_CHANGED")
frame:RegisterEvent("ACTIONBAR_UPDATE_STATE")
frame:RegisterEvent("UPDATE_VEHICLE_ACTIONBAR")
frame:SetScript("OnEvent", function(self, event)
if event == "ACTIONBAR_SHOWGRID" then
for i = 1, #allButtons do
allButtons[i]:SetAlpha(1)
end
elseif event == "ACTIONBAR_PAGE_CHANGED" or event == "ACTIONBAR_UPDATE_STATE" or event == "UPDATE_VEHICLE_ACTIONBAR" then
C_Timer.After(0.02, function()
for i = 1, #allButtons do
local button = allButtons[i]
button:SetAlpha(1)
if not button:HasAction() then
button:SetAlpha(0)
end
end
end)
else
C_Timer.After(0.05, function()
for i = 1, #allButtons do
local button = allButtons[i]
if not button:HasAction() then
button:SetAlpha(0)
end
end
end)
end
end)
end
----------------------------------------------------------------------------------------
-- Pet/StanceBar style functions
----------------------------------------------------------------------------------------
T.ShiftBarUpdate = function()
local numForms = GetNumShapeshiftForms()
local texture, isActive, isCastable
local button, icon, cooldown
local start, duration, enable
for i = 1, 10 do
button = _G["StanceButton"..i]
icon = _G["StanceButton"..i.."Icon"]
if i <= numForms then
texture, isActive, isCastable = GetShapeshiftFormInfo(i)
icon:SetTexture(texture)
cooldown = _G["StanceButton"..i.."Cooldown"]
if texture then
cooldown:SetAlpha(1)
else
cooldown:SetAlpha(0)
end
start, duration, enable = GetShapeshiftFormCooldown(i)
CooldownFrame_Set(cooldown, start, duration, enable)
if isActive then
button:SetChecked(true)
else
button:SetChecked(false)
end
if isCastable then
icon:SetVertexColor(1.0, 1.0, 1.0)
else
icon:SetVertexColor(0.4, 0.4, 0.4)
end
end
end
end
T.PetBarUpdate = function()
local petActionButton, petActionIcon, petAutoCastableTexture, petAutoCastShine
for i = 1, NUM_PET_ACTION_SLOTS, 1 do
local buttonName = "PetActionButton"..i
petActionButton = _G[buttonName]
petActionIcon = _G[buttonName.."Icon"]
petAutoCastableTexture = _G["PetActionButton"..i].AutoCastable or _G[buttonName.."AutoCastable"]
petAutoCastShine = _G[buttonName.."Shine"]
local name, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(i)
if not isToken then
petActionIcon:SetTexture(texture)
petActionButton.tooltipName = name
else
petActionIcon:SetTexture(_G[texture])
petActionButton.tooltipName = _G[name]
end
petActionButton.isToken = isToken
if isActive and name ~= "PET_ACTION_FOLLOW" then
petActionButton:SetChecked(true)
if IsPetAttackAction(i) then
petActionButton:StartFlash()
petActionButton:GetCheckedTexture():SetAlpha(0.5)
end
else
petActionButton:SetChecked(false)
if IsPetAttackAction(i) then
petActionButton:StopFlash()
petActionButton:GetCheckedTexture():SetAlpha(1.0)
end
end
if autoCastAllowed then
petAutoCastableTexture:Show()
else
petAutoCastableTexture:Hide()
end
if autoCastEnabled then
AutoCastShine_AutoCastStart(petAutoCastShine)
else
AutoCastShine_AutoCastStop(petAutoCastShine)
end
if name then
if not C.actionbar.show_grid then
petActionButton:SetAlpha(1)
end
else
if not C.actionbar.show_grid then
petActionButton:SetAlpha(0)
end
end
if texture then
if GetPetActionSlotUsable(i) then
SetDesaturation(petActionIcon, nil)
else
SetDesaturation(petActionIcon, 1)
end
petActionIcon:Show()
else
petActionIcon:Hide()
end
if not PetHasActionBar() and texture and name ~= "PET_ACTION_FOLLOW" then
petActionButton:StopFlash()
SetDesaturation(petActionIcon, 1)
petActionButton:SetChecked(false)
end
end
end
================================================
FILE: ShestakUI/Modules/ActionBars/ExtraBar.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
------------------------------------------------------------------------------------------
-- Make ExtraActionBarFrame movable (use macro /click ExtraActionButton1)
------------------------------------------------------------------------------------------
local anchor = CreateFrame("Frame", "ExtraButtonAnchor", UIParent)
if C.actionbar.split_bars then
anchor:SetPoint(C.position.extra_button[1], SplitBarLeft, C.position.extra_button[3], C.position.extra_button[4], C.position.extra_button[5])
else
anchor:SetPoint(unpack(C.position.extra_button))
end
local size = C.actionbar.button_size * 2 + C.actionbar.button_space
anchor:SetSize(size, size)
anchor:SetFrameStrata("LOW")
RegisterStateDriver(anchor, "visibility", "[petbattle] hide; show")
ExtraActionBarFrame:SetParent(anchor)
ExtraActionBarFrame:ClearAllPoints()
ExtraActionBarFrame:SetAllPoints()
-- Prevent reanchor
ExtraAbilityContainer.ignoreFramePositionManager = true
hooksecurefunc(ExtraActionBarFrame, "SetParent", function(self, parent)
if parent == ExtraAbilityContainer then
self:SetParent(anchor)
end
end)
-- Zone Ability button
local zoneAnchor = CreateFrame("Frame", "ZoneButtonAnchor", UIParent)
if C.actionbar.split_bars then
zoneAnchor:SetPoint(C.position.zone_button[1], SplitBarLeft, C.position.zone_button[3], C.position.zone_button[4], C.position.zone_button[5])
else
zoneAnchor:SetPoint(unpack(C.position.zone_button))
end
zoneAnchor:SetSize(size * 2, size)
zoneAnchor:SetFrameStrata("LOW")
RegisterStateDriver(zoneAnchor, "visibility", "[petbattle] hide; show")
ZoneAbilityFrame:SetParent(zoneAnchor)
ZoneAbilityFrame:ClearAllPoints()
ZoneAbilityFrame:SetAllPoints()
ZoneAbilityFrame.ignoreInLayout = true
ZoneAbilityFrame.SpellButtonContainer:SetPoint("TOPRIGHT", zoneAnchor)
ZoneAbilityFrame.SpellButtonContainer.spacing = 3
hooksecurefunc(ZoneAbilityFrame, "SetParent", function(self, parent)
if parent == ExtraAbilityContainer then
self:SetParent(zoneAnchor)
end
end)
C_Timer.After(0.1, function()
ZoneAbilityFrame.SpellButtonContainer:SetSize(size, size)
end)
hooksecurefunc("ExtraActionBar_Update", function()
local positionTable = T.CurrentProfile()
if positionTable["ZoneButtonAnchor"] then return end
if HasExtraActionBar() then
zoneAnchor:SetPoint("BOTTOMRIGHT", anchor, "BOTTOMLEFT", -3, 0)
else
if C.actionbar.split_bars then
zoneAnchor:SetPoint(C.position.zone_button[1], SplitBarLeft, C.position.zone_button[3], C.position.zone_button[4], C.position.zone_button[5])
else
zoneAnchor:SetPoint(unpack(C.position.zone_button))
end
end
end)
------------------------------------------------------------------------------------------
-- Skin ExtraActionBarFrame(by Zork)
------------------------------------------------------------------------------------------
local button = ExtraActionButton1
local texture = button.style
local disableTexture = function(style, texture)
if texture then
style:SetTexture(nil)
end
end
button.style:SetTexture(nil)
hooksecurefunc(texture, "SetTexture", disableTexture)
button:SetSize(size, size)
button.Count:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
button.Count:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
button.Count:SetPoint("BOTTOMRIGHT", 0, 1)
button.Count:SetJustifyH("RIGHT")
button:SetAttribute("showgrid", 1)
------------------------------------------------------------------------------------------
-- Skin ZoneAbilityFrame
------------------------------------------------------------------------------------------
local function SkinZoneAbilities()
for button in ZoneAbilityFrame.SpellButtonContainer:EnumerateActive() do
if not button.IsSkinned then
button.NormalTexture:SetAlpha(0)
button:StyleButton()
button:SetSize(size, size)
button:SetTemplate("Transparent")
if C.actionbar.classcolor_border == true then
button:SetBackdropBorderColor(unpack(C.media.classborder_color))
end
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Icon:SetPoint("TOPLEFT", button, 2, -2)
button.Icon:SetPoint("BOTTOMRIGHT", button, -2, 2)
button.Icon:SetDrawLayer("BACKGROUND", 7)
button.Count:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
button.Count:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
button.Count:SetPoint("BOTTOMRIGHT", 0, 1)
button.Count:SetJustifyH("RIGHT")
button.Cooldown:SetAllPoints(button.Icon)
button.IsSkinned = true
end
end
end
hooksecurefunc(ZoneAbilityFrame, "UpdateDisplayedZoneAbilities", SkinZoneAbilities)
ZoneAbilityFrame.Style:SetAlpha(0)
------------------------------------------------------------------------------------------
-- Skin ExtraQuestButton
------------------------------------------------------------------------------------------
if IsAddOnLoaded("ExtraQuestButton") then
local button = ExtraQuestButton
ExtraQuestButtonArtwork:Hide()
button:StyleButton()
ExtraQuestButtonNormalTexture:SetAlpha(0)
ExtraQuestButtonIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
ExtraQuestButtonIcon:SetPoint("TOPLEFT", button, 2, -2)
ExtraQuestButtonIcon:SetPoint("BOTTOMRIGHT", button, -2, 2)
ExtraQuestButtonIcon:SetDrawLayer("BACKGROUND", 7)
ExtraQuestButtonCooldown:SetDrawEdge(false)
button:SetTemplate("Transparent")
if C.actionbar.classcolor_border == true then
button:SetBackdropBorderColor(unpack(C.media.classborder_color))
end
end
================================================
FILE: ShestakUI/Modules/ActionBars/MicroMenu.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true or C.actionbar.micromenu ~= true then return end
----------------------------------------------------------------------------------------
-- Micro menu(by Elv22)
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame", "MicroAnchor", T_PetBattleFrameHider)
frame:SetPoint(unpack(C.position.micro_menu))
frame:SetSize(250, 25)
if C.actionbar.micromenu_mouseover then
frame:SetAlpha(0)
frame:SetScript("OnEnter", function() frame:SetAlpha(1) end)
frame:SetScript("OnLeave", function() frame:SetAlpha(0) end)
end
local MICRO_BUTTONS = {
"CharacterMicroButton",
"SpellbookMicroButton",
"TalentMicroButton",
"AchievementMicroButton",
"QuestLogMicroButton",
"GuildMicroButton",
"LFDMicroButton",
"EJMicroButton",
"CollectionsMicroButton",
"StoreMicroButton",
"MainMenuMicroButton",
"HelpMicroButton",
}
local colors = {
[1] = {0.35, 0.65, 1},
[2] = {1, 0.58, 0.65},
[3] = {0.21, 1, 0.95},
[4] = {1, 0.62, 0.1},
[5] = {0.96, 1, 0},
[6] = {0, 1, 0.1},
[7] = {0.7, 0.7, 1},
[8] = {1, 1, 1},
[9] = {1, 0.7, 0.58},
[10] = {1, 0.83, 0.50},
[11] = {1, 0.4, 0.4},
[12] = {1, 1, 1},
}
for i, button in pairs(MICRO_BUTTONS) do
local bu = _G[button]
local normal = bu:GetNormalTexture()
local pushed = bu:GetPushedTexture()
local disabled = bu:GetDisabledTexture()
bu:SetSize(22, 29)
local point = bu:GetPoint()
if point then
bu:ClearAllPoints()
if i == 1 then
bu:SetPoint("TOPLEFT", frame, "TOPLEFT", -1, 2)
else
bu:SetPoint("TOPLEFT", frame, "TOPLEFT", ((i - 1) * 23) - 1, 2)
end
end
bu:SetParent(frame)
bu.SetParent = T.dummy
bu:SetHighlightTexture(0)
bu.SetHighlightTexture = T.dummy
local f = CreateFrame("Frame", nil, bu)
f:SetFrameLevel(1)
f:SetFrameStrata("BACKGROUND")
f:SetPoint("BOTTOMLEFT", bu, "BOTTOMLEFT", 1, 2)
f:SetPoint("TOPRIGHT", bu, "TOPRIGHT", -1, -2)
f:SetTemplate("Default")
bu.frame = f
local flash = bu.FlashBorder
if flash then
flash:SetInside(f)
flash:SetTexture(C.media.blank)
flash:SetVertexColor(0.6, 0.6, 0.6)
end
if bu.FlashContent then bu.FlashContent:SetTexture(nil) end
local highlight = bu:GetHighlightTexture()
if highlight then
highlight:SetAlpha(0)
end
normal:SetTexCoord(0.1, 0.85, 0.12, 0.78)
normal:ClearAllPoints()
normal:SetPoint("TOPLEFT", f, "TOPLEFT", 2, -2)
normal:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -2, 2)
normal:SetVertexColor(unpack(colors[i]))
pushed:SetTexCoord(0.1, 0.85, 0.12, 0.78)
pushed:ClearAllPoints()
pushed:SetPoint("TOPLEFT", f, "TOPLEFT", 2, -2)
pushed:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -2, 2)
if disabled then
disabled:SetTexCoord(0.1, 0.85, 0.12, 0.78)
disabled:ClearAllPoints()
disabled:SetPoint("TOPLEFT", f, "TOPLEFT", 2, -2)
disabled:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -2, 2)
end
bu:HookScript("OnEnter", function(self)
self.frame:SetBackdropBorderColor(unpack(C.media.classborder_color))
if C.actionbar.micromenu_mouseover then
frame:SetAlpha(1)
end
end)
bu:HookScript("OnLeave", function(self)
self.frame:SetBackdropBorderColor(unpack(C.media.border_color))
if C.actionbar.micromenu_mouseover then
frame:SetAlpha(0)
end
end)
end
-- Fix textures for buttons
MainMenuMicroButton.MainMenuBarPerformanceBar:SetTexture(C.media.texture)
MainMenuMicroButton.MainMenuBarPerformanceBar:SetSize(16, 2)
MainMenuMicroButton.MainMenuBarPerformanceBar:SetPoint("BOTTOM", MainMenuMicroButton, "BOTTOM", 0, 4)
================================================
FILE: ShestakUI/Modules/ActionBars/Range.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Out of range check(tullaRange by Tuller)
----------------------------------------------------------------------------------------
local AddonName = ...
-- the addon event handler
local Addon = CreateFrame('Frame', AddonName, _G.InterfaceOptionsFrame)
-- how quickly attack actions flash
local ATTACK_BUTTON_FLASH_TIME = _G.ATTACK_BUTTON_FLASH_TIME
-- the name of the database
local DB_KEY = 'TULLARANGE_COLORS'
-- how frequently we want to update colors, in seconds
local UPDATE_DELAY = 0.2
local ActionHasRange = _G.ActionHasRange
local After = _G.C_Timer.After
local GetTime = _G.GetTime
local IsActionInRange = _G.IsActionInRange
local IsUsableAction = _G.IsUsableAction
local GetPetActionInfo = _G.GetPetActionInfo
local GetPetActionSlotUsable = _G.GetPetActionSlotUsable
local GetActionInfo = _G.GetActionInfo
local GetMacroInfo = _G.GetMacroInfo
local GetMacroSpell = _G.GetMacroSpell
local GetSpellPowerCost = _G.GetSpellPowerCost
local UnitPower = _G.UnitPower
--------------------------------------------------------------------------------
-- Event Handlers
--------------------------------------------------------------------------------
-- addon intially loaded
function Addon:OnLoad()
-- a table for the action buttons we want to periodically check the range of
self.watchedActions = {}
-- a table for the action buttons we want to periodically check the ranges of
self.watchedPetActions = {}
-- a table for all of the known action button states
self.buttonStates = {}
-- setup script handlers
self:SetScript('OnShow', self.OnShow)
self:SetScript('OnEvent', self.OnEvent)
-- register any events we need to watch
self:RegisterEvent('ADDON_LOADED')
self:RegisterEvent('PLAYER_LOGIN')
self:RegisterEvent('PLAYER_LOGOUT')
-- drop this method, as we won't need it again
self.OnLoad = nil
end
-- addon shown (which in this case means that InterfaceOptionsFrame was shown)
-- load the config addon and get rid of this method
function Addon:OnShow()
LoadAddOn(AddonName .. '_Config')
-- drop this method, as we won't need it again
self:SetScript('OnShow', nil)
self.OnShow = nil
end
function Addon:OnEvent(event, ...)
local func = self[event]
if func then
func(self, event, ...)
end
end
-- when the addon finishes loading...
function Addon:ADDON_LOADED(event, addonName)
if addonName ~= AddonName then
return
end
-- setup our saved settings stuff
self:SetupDatabase()
-- get rid of the handler, as we don't need it anymore
self:UnregisterEvent(event)
self[event] = nil
end
-- when the player first logs in...
function Addon:PLAYER_LOGIN(event)
local function button_StartFlash(button)
if button:IsVisible() then
self:StartButtonFlashing(button)
end
end
local function actionButton_OnShowHide(button)
self:UpdateActionButtonWatched(button)
self:UpdateButtonFlashing(button)
end
local function actionButton_Update(button)
self:UpdateActionButtonWatched(button)
end
local function actionButton_UpdateUsable(button)
self:UpdateActionButtonState(button, true)
end
-- register existing action buttons
-- the method varies between classic and shadowlands, as action buttons in
-- shadowlands use ActionBarActionButtonMixin
local ActionBarActionButtonMixin = _G.ActionBarActionButtonMixin
if ActionBarActionButtonMixin then
local function actionButton_OnLoad(button)
button:SetScript("OnUpdate", nil)
button:HookScript('OnShow', actionButton_OnShowHide)
button:HookScript('OnHide', actionButton_OnShowHide)
-- Update is called whenever an action button changes, so we
-- check here to we if we need to pay attention to the button anymore
hooksecurefunc(button, 'Update', actionButton_Update)
-- UpdateUsable is called when the button normally changes
-- color when unusuable, so we need to reapply our custom coloring
hooksecurefunc(button, 'UpdateUsable', actionButton_UpdateUsable)
if self:EnableFlashAnimations() then
hooksecurefunc(button, 'StartFlash', button_StartFlash)
end
self:UpdateActionButtonWatched(button)
end
-- hook any existing frames that are derived from ActionBarActionButtonMixin
local mixin_OnLoad = ActionBarActionButtonMixin.OnLoad
local EnumerateFrames = _G.EnumerateFrames
local f = EnumerateFrames()
while f do
if f.OnLoad == mixin_OnLoad then
actionButton_OnLoad(f)
end
f = EnumerateFrames(f)
end
-- grab later ones, too
hooksecurefunc(ActionBarActionButtonMixin, "OnLoad", actionButton_OnLoad)
else
local function actionButton_OnUpdate(button)
button:SetScript('OnUpdate', nil)
button:HookScript('OnShow', actionButton_OnShowHide)
button:HookScript('OnHide', actionButton_OnShowHide)
self:UpdateActionButtonWatched(button)
end
-- hook any action button events we need to take care of
-- register events on update initially, and wipe out their individual on
-- update handlers. This is why tullaRange has a negative performance
-- impact
hooksecurefunc('ActionButton_OnUpdate', actionButton_OnUpdate)
-- ActionButton_UpdateUsable is called when the button normally changes
-- color when unusuable, so we need to reapply our custom coloring at this
-- point
hooksecurefunc('ActionButton_UpdateUsable', actionButton_UpdateUsable)
-- ActionButton_Update is called whenever an action button changes, so we
-- check here to we if we need to pay attention to the button anymore or not
hooksecurefunc('ActionButton_Update', actionButton_Update)
-- setup flash animations
if self:EnableFlashAnimations() then
hooksecurefunc('ActionButton_StartFlash', button_StartFlash)
end
end
-- register pet actions, if we want to
if self:EnablePetActions() then
-- register all pet action slots
self.petActions = {}
for i = 1, NUM_PET_ACTION_SLOTS do
tinsert(self.petActions, _G['PetActionButton' .. i])
end
local function petButton_OnShowHide(button)
self:UpdatePetActionButtonWatched(button)
self:UpdateButtonFlashing(button)
end
local function petButton_OnUpdate(button)
button:SetScript('OnUpdate', nil)
button:HookScript('OnShow', petButton_OnShowHide)
button:HookScript('OnHide', petButton_OnShowHide)
self:UpdatePetActionButtonWatched(button)
end
local function petActionBar_Update(bar)
-- the UI does not actually use the self arg here
-- and sometimes calls the method without it
bar = bar or _G.PetActionBarFrame
-- reset the timer on update, so that we don't trigger the bar's
-- own range updater code
bar.rangeTimer = nil
-- if we have a bar, update all the actions
if PetHasActionBar() then
for _, button in pairs(self.petActions) do
-- clear our current styling
self.buttonStates[button] = nil
self:UpdatePetActionButtonWatched(button)
end
-- if we don't, wipe any actions we currently are showing
else
wipe(self.watchedPetActions)
end
end
-- hook any pet button events we need to take care of
-- register events on update initially, and wipe out their individual on
-- update handlers.
local PetActionBar = _G.PetActionBar
if type(PetActionBar.Update) == "function" then
hooksecurefunc(PetActionBar, 'Update', petActionBar_Update)
end
local buttons = PetActionBar.actionButtons
if type(buttons) == "table" then
for _, button in pairs(PetActionBar.actionButtons) do
hooksecurefunc(button, 'OnUpdate', petButton_OnUpdate)
hooksecurefunc(button, 'StartFlash', button_StartFlash)
end
end
end
-- get rid of the handler, as we don't need it anymore
self:UnregisterEvent(event)
self[event] = nil
end
function Addon:PLAYER_LOGOUT()
self:CleanupDatabase()
end
--------------------------------------------------------------------------------
-- Update API
--------------------------------------------------------------------------------
local function handleUpdate()
if Addon:UpdateButtonStates() then
Addon.updating = GetTime()
After(UPDATE_DELAY, handleUpdate)
else
Addon.updating = nil
end
end
function Addon:RequestUpdate()
if self.updating ~= nil then
return
end
self.updating = GetTime()
After(UPDATE_DELAY, handleUpdate)
end
function Addon:SetButtonState(button, state, force)
if self.buttonStates[button] == state and not force then
return
end
self.buttonStates[button] = state
local r, g, b, a = self:GetColor(state)
button.icon:SetVertexColor(r, g, b, a)
end
function Addon:UpdateButtonStates(force)
local updatedButtons = false
if next(self.watchedActions) then
for button in pairs(self.watchedActions) do
self:UpdateActionButtonState(button, force)
end
updatedButtons = true
end
if next(self.watchedPetActions) then
for button in pairs(self.watchedPetActions) do
self:UpdatePetActionButtonState(button, force)
end
updatedButtons = true
end
return updatedButtons
end
function Addon:GetActionButtonState(button)
local action = button.action
local actionType, actionTypeId = GetActionInfo(action)
if not actionType then
return 'normal'
end
-- for macros with names that start with a #, we prioritize the OOM check
-- using a spell cost strategy over other ones to better clarify if the
-- macro is actually usable or not
if actionType == 'macro' then
local name = GetMacroInfo(actionTypeId)
if name and name:sub(1, 1) == '#' then
local spellId = GetMacroSpell(actionTypeId)
-- only run the check for spell macros
if spellId then
local costs = GetSpellPowerCost(spellId)
for _, cost in ipairs(costs) do
if UnitPower('player', cost.type) < cost.minCost then
return 'oom'
end
end
if IsActionInRange(action) == false then
return 'oor'
end
return 'normal'
end
end
end
local isUsable, notEnoughMana = IsUsableAction(action)
if not isUsable then
if notEnoughMana then
return 'oom'
end
return 'unusable'
end
-- we do == false here because IsActionInRange can return one of true
-- (has range, in range), false (has range, out of range), and nil (does
-- not have range) and we explicitly want to know about (has range, oor)
if IsActionInRange(action) == false then
return 'oor'
end
return 'normal'
end
function Addon:UpdateActionButtonState(button, force)
self:SetButtonState(button, self:GetActionButtonState(button), force)
end
function Addon:UpdateActionButtonWatched(button)
local action = button.action
if action and button:IsVisible() and ActionHasRange(action) then
self.watchedActions[button] = true
else
self.watchedActions[button] = nil
end
self:RequestUpdate()
end
-- pet action button specific stuff
function Addon:GetPetActionButtonState(button)
local slot = button:GetID() or 0
local _, _, _, _, _, _, _, checksRange, inRange = GetPetActionInfo(slot)
local isUsable, notEnoughMana = GetPetActionSlotUsable(slot)
-- usable (ignoring target information)
if isUsable then
-- but out of range
if checksRange and not inRange then
return 'oor'
else
return 'normal'
end
elseif notEnoughMana then
return 'oom'
else
return 'unusable'
end
end
function Addon:UpdatePetActionButtonState(button, force)
self:SetButtonState(button, self:GetPetActionButtonState(button), force)
end
function Addon:UpdatePetActionButtonWatched(button)
local slot = button:GetID() or 0
local _, _, _, _, _, _, _, checksRange = GetPetActionInfo(slot)
if button:IsVisible() and checksRange then
self.watchedPetActions[button] = true
else
self.watchedPetActions[button] = nil
end
self:RequestUpdate()
end
--------------------------------------------------------------------------------
-- Flashing replacement
--------------------------------------------------------------------------------
local function alpha_OnFinished(self)
local owner = self.owner
if owner.flashing ~= 1 then
Addon:StopButtonFlashing(owner)
end
end
function Addon:StartButtonFlashing(button)
local animation = self.flashAnimations and self.flashAnimations[button]
if not animation then
animation = button.Flash:CreateAnimationGroup()
animation:SetLooping('BOUNCE')
local alpha = animation:CreateAnimation('ALPHA')
alpha:SetDuration(self:GetFlashDuration())
alpha:SetFromAlpha(0)
alpha:SetToAlpha(1)
alpha:SetScript('OnFinished', alpha_OnFinished)
alpha.owner = button
if self.flashAnimations then
self.flashAnimations[button] = animation
else
self.flashAnimations = {[button] = animation}
end
end
button.Flash:Show()
animation:Play()
end
function Addon:StopButtonFlashing(button)
local animation = self.flashAnimations and self.flashAnimations[button]
if animation then
animation:Stop()
button.Flash:Hide()
end
end
function Addon:UpdateButtonFlashing(button)
if button.flashing == 1 and button:IsVisible() then
self:StartButtonFlashing(button)
else
self:StopButtonFlashing(button)
end
end
--------------------------------------------------------------------------------
-- Saved settings setup stuff
--------------------------------------------------------------------------------
local function removeDefaults(tbl, defaults)
for k, v in pairs(defaults) do
if type(tbl[k]) == 'table' and type(v) == 'table' then
removeDefaults(tbl[k], v)
if next(tbl[k]) == nil then
tbl[k] = nil
end
elseif tbl[k] == v then
tbl[k] = nil
end
end
return tbl
end
local function copyDefaults(tbl, defaults)
for k, v in pairs(defaults) do
if type(v) == 'table' then
tbl[k] = copyDefaults(tbl[k] or {}, v)
elseif tbl[k] == nil then
tbl[k] = v
end
end
return tbl
end
function Addon:SetupDatabase()
local sets = _G[DB_KEY]
if not sets then
sets = {}
_G[DB_KEY] = sets
end
self.sets = copyDefaults(sets, self:GetDatabaseDefaults())
end
function Addon:CleanupDatabase()
local sets = self.sets
if sets then
removeDefaults(sets, self:GetDatabaseDefaults())
end
end
function Addon:GetDatabaseDefaults()
return {
-- enable range coloring on pet actions
petActions = true,
-- enable flash animations,
flashAnimations = true,
flashDuration = ATTACK_BUTTON_FLASH_TIME * 1.5,
-- default color (r, g, b, a)
normal = {1, 1, 1, 1},
-- out of range
oor = {1, 0.3, 0.1, 1},
-- out of mana
oom = {0.1, 0.3, 1, 1},
-- unusable action
unusable = {0.4, 0.4, 0.4, 1}
}
end
function Addon:ResetDatabase()
_G[DB_KEY] = nil
self:SetupDatabase()
self:UpdateButtonStates(true)
end
--------------------------------------------------------------------------------
-- Configuration API
--------------------------------------------------------------------------------
function Addon:GetColor(state)
local color = self.sets[state]
return color[1], color[2], color[3], color[4]
end
function Addon:SetColor(state, r, g, b, a)
local color = self.sets[state]
color[1] = r
color[2] = g
color[3] = b
color[4] = a or 1
self:UpdateButtonStates(true)
end
-- gets or sets enabling action button flashing
function Addon:EnableFlashAnimations()
return self.sets.flashAnimations
end
function Addon:SetEnableFlashAnimations(enable)
self.sets.flashAnimations = enable
end
-- sets the flash animation speed
function Addon:GetFlashDuration()
return self.sets.flashDuration
end
function Addon:SetFlashDuration(duration)
self.sets.flashDuration = tonumber(duration)
end
-- gets or sets enabling out of range coloring on pet actions
function Addon:EnablePetActions()
return self.sets.petActions
end
function Addon:SetEnablePetActions(enable)
self.sets.petActions = enable
end
-- load the addon
Addon:OnLoad()
================================================
FILE: ShestakUI/Modules/ActionBars/Style.lua
================================================
local T, C, L, _ = unpack(ShestakUI)
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Style ActionBars buttons(by Tukz)
----------------------------------------------------------------------------------------
local function StyleNormalButton(button, size)
if not button.isSkinned then
local name = button:GetName()
local icon = _G[name.."Icon"]
local count = _G[name.."Count"]
local flash = _G[name.."Flash"]
local hotkey = _G[name.."HotKey"]
local border = button.Border or _G[name..'Border']
local btname = _G[name.."Name"]
local normal = _G[name.."NormalTexture"]
local float = _G[name.."FloatingBG"]
local highlight = button.SpellHighlightTexture
local isExtraAction = name:match("ExtraAction")
local isFlyout = name:match("Flyout")
local flyoutBorder = _G[name.."FlyoutBorder"]
local flyoutBorderShadow = _G[name.."FlyoutBorderShadow"]
local autocast = button.AutoCastable
local shine = _G[name.."Shine"]
local spellAlert = button.SpellActivationAlert
local normal = button.NormalTexture or _G[name..'NormalTexture']
local normal2 = button:GetNormalTexture()
if button.IconMask then
button.IconMask:Hide()
end
if button.SlotArt then
button.SlotArt:SetAlpha(0)
end
if button.RightDivider then
button.RightDivider:Kill()
end
if button.SlotBackground then
button.SlotBackground:SetAlpha(0)
end
if button.NewActionTexture then
button.NewActionTexture:SetAlpha(0)
end
if normal then
normal:SetTexture()
normal:Hide()
normal:SetAlpha(0)
end
if normal2 then
normal2:SetTexture()
normal2:Hide()
normal2:SetAlpha(0)
end
flash:SetTexture("")
button:SetNormalTexture(0)
if float then
float:SetTexture("")
end
if border then
border:SetTexture("")
end
if not isExtraAction then
count:ClearAllPoints()
count:SetPoint("BOTTOMRIGHT", 0, 2)
count:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
count:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
count:SetHeight(C.font.action_bars_font_size)
end
if btname then
if C.actionbar.macro == true then
btname:ClearAllPoints()
btname:SetPoint("BOTTOM", 0, 1)
btname:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
btname:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
btname:SetWidth(C.actionbar.button_size - 1)
btname:SetHeight(C.font.action_bars_font_size)
else
btname:Kill()
end
end
if C.actionbar.hotkey == true then
hotkey:ClearAllPoints()
hotkey:SetPoint("TOPRIGHT", 0, -1)
hotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
hotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
hotkey:SetWidth(C.actionbar.button_size - 1)
hotkey:SetHeight(C.font.action_bars_font_size)
else
hotkey:Kill()
end
if not isFlyout and not isExtraAction then
button:SetSize(size or C.actionbar.button_size, size or C.actionbar.button_size)
-- Dragonflight - Hide profession quality icons
if button.ProfessionQualityOverlayFrame then
button.ProfessionQualityOverlayFrame:SetAlpha(0)
end
hooksecurefunc(button, "UpdateProfessionQuality", function(self)
if self.ProfessionQualityOverlayFrame then
self.ProfessionQualityOverlayFrame:SetAlpha(0)
end
end)
end
button:SetTemplate("Transparent")
if C.actionbar.classcolor_border == true then
button:SetBackdropBorderColor(unpack(C.media.classborder_color))
end
icon:CropIcon()
icon:SetDrawLayer("BACKGROUND", 7)
if normal then
normal:ClearAllPoints()
normal:SetPoint("TOPLEFT")
normal:SetPoint("BOTTOMRIGHT")
end
if highlight then
highlight:ClearAllPoints()
highlight:SetPoint("TOPLEFT", -4, 4)
highlight:SetPoint("BOTTOMRIGHT", 4, -4)
end
button.oborder:SetFrameLevel(button:GetFrameLevel())
button.iborder:SetFrameLevel(button:GetFrameLevel())
if button.QuickKeybindHighlightTexture then
button.QuickKeybindHighlightTexture:SetScale(0.0001)
end
if flyoutBorder then
flyoutBorder:SetTexture("")
end
if flyoutBorderShadow then
flyoutBorderShadow:SetTexture("")
end
if autocast then
autocast:SetSize((C.actionbar.button_size * 2) - 10, (C.actionbar.button_size * 2) - 10)
autocast:ClearAllPoints()
autocast:SetPoint("CENTER", button, 0, 0)
end
if shine then
shine:SetSize(C.actionbar.button_size, C.actionbar.button_size)
end
if spellAlert then
spellAlert:SetSize((size or C.actionbar.button_size) * 1.4, (size or C.actionbar.button_size) * 1.4)
ActionButton_HideOverlayGlow(button)
end
button:StyleButton()
button.isSkinned = true
end
end
local function StyleSmallButton(normal, button, icon, name, pet)
if not button.isSkinned then
local flash = _G[name.."Flash"]
local hotkey = _G[name.."HotKey"]
local normal = _G[name.."NormalTexture"]
button:SetNormalTexture(0)
if normal then
normal:SetAlpha(0)
end
if button.IconMask then
button.IconMask:Hide()
end
hooksecurefunc(button, "SetNormalTexture", function(self, texture)
if texture and texture ~= "" then
self:SetNormalTexture(0)
end
end)
flash:SetColorTexture(0.8, 0.8, 0.8, 0.5)
flash:SetPoint("TOPLEFT", button, 2, -2)
flash:SetPoint("BOTTOMRIGHT", button, -2, 2)
if C.actionbar.hotkey == true then
hotkey:ClearAllPoints()
hotkey:SetPoint("TOPRIGHT", 0, 0)
hotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
hotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
hotkey:SetWidth(C.actionbar.button_size - 1)
else
hotkey:Kill()
end
button:SetSize(C.actionbar.button_size, C.actionbar.button_size)
button:SetTemplate("Transparent")
if C.actionbar.classcolor_border == true then
button:SetBackdropBorderColor(unpack(C.media.classborder_color))
end
icon:CropIcon()
icon:SetDrawLayer("BACKGROUND", 7)
if pet then
local autocast = button.AutoCastable
autocast:SetSize((C.actionbar.button_size * 2) - 10, (C.actionbar.button_size * 2) - 10)
autocast:ClearAllPoints()
autocast:SetPoint("CENTER", button, 0, 0)
local shine = _G[name.."Shine"]
shine:SetSize(C.actionbar.button_size, C.actionbar.button_size)
local cooldown = _G[name.."Cooldown"]
cooldown:SetSize(C.actionbar.button_size - 2, C.actionbar.button_size - 2)
end
if normal then
normal:ClearAllPoints()
normal:SetPoint("TOPLEFT")
normal:SetPoint("BOTTOMRIGHT")
end
if button.QuickKeybindHighlightTexture then
button.QuickKeybindHighlightTexture:SetScale(0.0001)
end
button:StyleButton()
button.isSkinned = true
end
end
function T.StyleShift()
for i = 1, 10 do
local name = "StanceButton"..i
local button = _G[name]
local icon = _G[name.."Icon"]
local normal = _G[name.."NormalTexture"]
StyleSmallButton(normal, button, icon, name)
end
end
function T.StylePet()
for i = 1, NUM_PET_ACTION_SLOTS do
local name = "PetActionButton"..i
local button = _G[name]
local icon = _G[name.."Icon"]
local normal = _G[name.."NormalTexture2"]
StyleSmallButton(normal, button, icon, name, true)
end
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function(self, event)
for i = 1, 12 do
StyleNormalButton(_G["ActionButton"..i], C.actionbar.editor and C.actionbar.bar1_size)
StyleNormalButton(_G["MultiBarBottomLeftButton"..i], C.actionbar.editor and C.actionbar.bar2_size)
StyleNormalButton(_G["MultiBarLeftButton"..i], C.actionbar.editor and C.actionbar.bar3_size)
StyleNormalButton(_G["MultiBarRightButton"..i], C.actionbar.editor and C.actionbar.bar4_size)
StyleNormalButton(_G["MultiBarBottomRightButton"..i], C.actionbar.editor and C.actionbar.bar5_size)
StyleNormalButton(_G["MultiBar5Button"..i], C.actionbar.editor and C.actionbar.bar6_size)
StyleNormalButton(_G["MultiBar6Button"..i], C.actionbar.bar7_size)
StyleNormalButton(_G["MultiBar7Button"..i], C.actionbar.bar8_size)
end
StyleNormalButton(ExtraActionButton1)
end)
local function SetupFlyoutButton(button, self)
if button:GetHeight() ~= C.actionbar.button_size and not InCombatLockdown() then
button:SetSize(C.actionbar.button_size, C.actionbar.button_size)
end
if not button.IsSkinned then
StyleNormalButton(button)
if C.actionbar.rightbars_mouseover == true then
SpellFlyout:HookScript("OnEnter", function() RightBarMouseOver(1) end)
SpellFlyout:HookScript("OnLeave", function() RightBarMouseOver(0) end)
button:HookScript("OnEnter", function() RightBarMouseOver(1) end)
button:HookScript("OnLeave", function() RightBarMouseOver(0) end)
end
if C.actionbar.bottombars_mouseover == true then
SpellFlyout:HookScript("OnEnter", function() BottomBarMouseOver(1) end)
SpellFlyout:HookScript("OnLeave", function() BottomBarMouseOver(0) end)
button:HookScript("OnEnter", function() BottomBarMouseOver(1) end)
button:HookScript("OnLeave", function() BottomBarMouseOver(0) end)
end
button.IsSkinned = true
end
end
local function StyleFlyoutButton(self)
local button, i = _G["SpellFlyoutButton1"], 1
while button do
SetupFlyoutButton(button, self)
i = i + 1
button = _G["SpellFlyoutButton"..i]
end
end
SpellFlyout:HookScript("OnShow", StyleFlyoutButton)
SpellFlyout.Background:Hide()
if C.actionbar.hotkey == true then
local gsub = string.gsub
local function UpdateHotkey(self, pass)
local hotkey = _G[self:GetName().."HotKey"]
local text = hotkey:GetText()
if not text then return end
text = gsub(text, "(s%-)", "S")
text = gsub(text, "(a%-)", "A")
text = gsub(text, "(а%-)", "A") -- fix ruRU
text = gsub(text, "(c%-)", "C")
text = gsub(text, "(Mouse Button )", "M")
text = gsub(text, "(Кнопка мыши )", "M")
text = gsub(text, KEY_BUTTON3, "M3")
text = gsub(text, KEY_PAGEUP, "PU")
text = gsub(text, KEY_PAGEDOWN, "PD")
text = gsub(text, KEY_SPACE, "SpB")
text = gsub(text, KEY_INSERT, "Ins")
text = gsub(text, KEY_HOME, "Hm")
text = gsub(text, KEY_DELETE, "Del")
text = gsub(text, KEY_NUMPADDECIMAL, "Nu.")
text = gsub(text, KEY_NUMPADDIVIDE, "Nu/")
text = gsub(text, KEY_NUMPADMINUS, "Nu-")
text = gsub(text, KEY_NUMPADMULTIPLY, "Nu*")
text = gsub(text, KEY_NUMPADPLUS, "Nu+")
text = gsub(text, KEY_NUMLOCK, "NuL")
text = gsub(text, KEY_MOUSEWHEELDOWN, "MWD")
text = gsub(text, KEY_MOUSEWHEELUP, "MWU")
if not pass then
hotkey:ClearAllPoints()
hotkey:SetPoint("TOPRIGHT", 0, -1)
hotkey:SetWidth(self:GetWidth() - 1)
hotkey:SetHeight(C.font.action_bars_font_size)
end
if hotkey:GetText() == _G["RANGE_INDICATOR"] then
hotkey:SetText("")
else
hotkey:SetText(text)
end
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("UPDATE_BINDINGS")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function()
for i = 1, 12 do
UpdateHotkey(_G["ActionButton"..i])
UpdateHotkey(_G["MultiBarBottomLeftButton"..i])
UpdateHotkey(_G["MultiBarBottomRightButton"..i])
UpdateHotkey(_G["MultiBarLeftButton"..i])
UpdateHotkey(_G["MultiBarRightButton"..i])
UpdateHotkey(_G["MultiBar5Button"..i])
UpdateHotkey(_G["MultiBar6Button"..i])
UpdateHotkey(_G["MultiBar7Button"..i])
end
for i = 1, 10 do
UpdateHotkey(_G["StanceButton"..i], true)
UpdateHotkey(_G["PetActionButton"..i], true)
end
UpdateHotkey(ExtraActionButton1, true)
end)
end
if C.actionbar.hide_highlight == true then
local function HideHighlightButton(self)
if self.overlay then
self.overlay:Hide()
ActionButton_HideOverlayGlow(self)
end
end
hooksecurefunc("ActionButton_ShowOverlayGlow", HideHighlightButton)
end
================================================
FILE: ShestakUI/Modules/ActionBars/Toggle.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true or C.actionbar.toggle_mode ~= true then return end
----------------------------------------------------------------------------------------
-- Toggle ActionBars
----------------------------------------------------------------------------------------
local ToggleBar = CreateFrame("Frame", "ToggleActionbar", UIParent)
local ToggleBarText = function(i, text, plus, neg)
if plus then
ToggleBar[i].Text:SetText(text)
ToggleBar[i].Text:SetTextColor(0.3, 0.3, 0.9)
elseif neg then
ToggleBar[i].Text:SetText(text)
ToggleBar[i].Text:SetTextColor(0.9, 0.3, 0.3)
end
end
local MainBars = function()
if C.actionbar.split_bars ~= true then
if ShestakUISettingsPerChar.BottomBars == 1 then
ActionBarAnchor:SetHeight(C.actionbar.button_size)
ToggleBarText(1, "+ + +", true)
Bar2Holder:Hide()
Bar5Holder:Hide()
elseif ShestakUISettingsPerChar.BottomBars == 2 then
ActionBarAnchor:SetHeight(C.actionbar.button_size * 2 + C.actionbar.button_space)
ToggleBarText(1, "+ + +", true)
Bar2Holder:Show()
Bar5Holder:Hide()
elseif ShestakUISettingsPerChar.BottomBars == 3 then
ActionBarAnchor:SetHeight((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2))
ToggleBarText(1, "- - -", false, true)
Bar2Holder:Show()
Bar5Holder:Show()
end
elseif C.actionbar.split_bars == true then
if ShestakUISettingsPerChar.BottomBars == 1 then
ActionBarAnchor:SetHeight(C.actionbar.button_size)
ToggleBarText(1, "+ + +", true)
Bar2Holder:Hide()
ToggleBar[3]:SetHeight(C.actionbar.button_size)
ToggleBar[4]:SetHeight(C.actionbar.button_size)
for i = 1, 3 do
local b = _G["MultiBarBottomRightButton"..i]
b:SetAlpha(0)
b:SetScale(0.000001)
end
for i = 7, 9 do
local b = _G["MultiBarBottomRightButton"..i]
b:SetAlpha(0)
b:SetScale(0.000001)
end
elseif ShestakUISettingsPerChar.BottomBars == 2 then
ActionBarAnchor:SetHeight(C.actionbar.button_size * 2 + C.actionbar.button_space)
ToggleBarText(1, "- - -", false, true)
Bar2Holder:Show()
ToggleBar[3]:SetHeight(C.actionbar.button_size * 2 + C.actionbar.button_space)
ToggleBar[4]:SetHeight(C.actionbar.button_size * 2 + C.actionbar.button_space)
for i = 1, 3 do
local b = _G["MultiBarBottomRightButton"..i]
if not C.actionbar.bottombars_mouseover then
b:SetAlpha(1)
end
b:SetScale(1)
end
for i = 7, 9 do
local b = _G["MultiBarBottomRightButton"..i]
if not C.actionbar.bottombars_mouseover then
b:SetAlpha(1)
end
b:SetScale(1)
end
end
end
end
local RightBars = function()
if C.actionbar.rightbars > 2 then
if ShestakUISettingsPerChar.RightBars == 1 then
RightActionBarAnchor:SetWidth(C.actionbar.button_size)
if not C.actionbar.petbar_horizontal == true then
PetActionBarAnchor:ClearAllPoints()
PetActionBarAnchor:SetPoint("RIGHT", RightActionBarAnchor, "LEFT", 0, 0)
end
ToggleBar[2]:SetWidth(C.actionbar.button_size)
ToggleBarText(2, "> > >", false, true)
Bar3Holder:Hide()
Bar4Holder:Hide()
elseif ShestakUISettingsPerChar.RightBars == 2 then
RightActionBarAnchor:SetWidth(C.actionbar.button_size * 2 + C.actionbar.button_space)
if not C.actionbar.petbar_horizontal == true then
PetActionBarAnchor:ClearAllPoints()
PetActionBarAnchor:SetPoint("RIGHT", RightActionBarAnchor, "LEFT", 0, 0)
end
ToggleBar[2]:SetWidth(C.actionbar.button_size * 2 + C.actionbar.button_space)
ToggleBarText(2, "> > >", false, true)
Bar3Holder:Hide()
Bar4Holder:Show()
elseif ShestakUISettingsPerChar.RightBars == 3 then
RightActionBarAnchor:SetWidth((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2))
if not C.actionbar.petbar_horizontal == true then
PetActionBarAnchor:ClearAllPoints()
PetActionBarAnchor:SetPoint("RIGHT", RightActionBarAnchor, "LEFT", 0, 0)
end
ToggleBar[2]:SetWidth((C.actionbar.button_size * 3) + (C.actionbar.button_space * 2))
ToggleBarText(2, "> > >", false, true)
RightActionBarAnchor:Show()
Bar3Holder:Show()
Bar4Holder:Show()
Bar6Holder:Show()
elseif ShestakUISettingsPerChar.RightBars == 0 then
if not C.actionbar.petbar_horizontal == true then
PetActionBarAnchor:ClearAllPoints()
PetActionBarAnchor:SetPoint("BOTTOMRIGHT", ToggleBar[2], "TOPRIGHT", 3, 3)
end
ToggleBar[2]:SetWidth(C.actionbar.button_size)
ToggleBarText(2, "< < <", true)
RightActionBarAnchor:Hide()
Bar3Holder:Hide()
Bar4Holder:Hide()
Bar6Holder:Hide()
end
elseif C.actionbar.rightbars < 3 then
if ShestakUISettingsPerChar.RightBars == 1 then
RightActionBarAnchor:SetWidth(C.actionbar.button_size)
if not C.actionbar.petbar_horizontal == true then
PetActionBarAnchor:ClearAllPoints()
PetActionBarAnchor:SetPoint("RIGHT", RightActionBarAnchor, "LEFT", 0, 0)
end
ToggleBar[2]:SetWidth(C.actionbar.button_size)
ToggleBarText(2, "> > >", false, true)
Bar3Holder:Show()
Bar4Holder:Hide()
elseif ShestakUISettingsPerChar.RightBars == 2 then
RightActionBarAnchor:SetWidth(C.actionbar.button_size * 2 + C.actionbar.button_space)
if not C.actionbar.petbar_horizontal == true then
PetActionBarAnchor:ClearAllPoints()
PetActionBarAnchor:SetPoint("RIGHT", RightActionBarAnchor, "LEFT", 0, 0)
end
ToggleBar[2]:SetWidth(C.actionbar.button_size * 2 + C.actionbar.button_space)
ToggleBarText(2, "> > >", false, true)
RightActionBarAnchor:Show()
Bar3Holder:Show()
Bar4Holder:Show()
elseif ShestakUISettingsPerChar.RightBars == 0 then
if not C.actionbar.petbar_horizontal == true then
PetActionBarAnchor:ClearAllPoints()
PetActionBarAnchor:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -18, 320)
end
ToggleBar[2]:SetWidth(C.actionbar.button_size)
ToggleBarText(2, "< < <", true)
RightActionBarAnchor:Hide()
Bar3Holder:Hide()
Bar4Holder:Hide()
Bar6Holder:Hide()
end
end
end
local SplitBars = function()
if C.actionbar.split_bars == true then
if ShestakUISettingsPerChar.SplitBars == true then
ToggleBar[3]:ClearAllPoints()
ToggleBar[3]:SetPoint("BOTTOMLEFT", SplitBarRight, "BOTTOMRIGHT", C.actionbar.button_space, 0)
ToggleBar[4]:ClearAllPoints()
ToggleBar[4]:SetPoint("BOTTOMRIGHT", SplitBarLeft, "BOTTOMLEFT", -C.actionbar.button_space, 0)
VehicleButtonAnchor:ClearAllPoints()
VehicleButtonAnchor:SetPoint("BOTTOMRIGHT", SplitBarLeft, "BOTTOMLEFT", -C.actionbar.button_space, 0)
if ShestakUISettingsPerChar.BottomBars == 2 then
ToggleBarText(3, "<\n<\n<", false, true)
ToggleBarText(4, ">\n>\n>", false, true)
else
ToggleBarText(3, "<\n<", false, true)
ToggleBarText(4, ">\n>", false, true)
end
Bar5Holder:Show()
SplitBarLeft:Show()
SplitBarRight:Show()
elseif ShestakUISettingsPerChar.SplitBars == false then
ToggleBar[3]:ClearAllPoints()
ToggleBar[3]:SetPoint("BOTTOMLEFT", ActionBarAnchor, "BOTTOMRIGHT", C.actionbar.button_space, 0)
ToggleBar[4]:ClearAllPoints()
ToggleBar[4]:SetPoint("BOTTOMRIGHT", ActionBarAnchor, "BOTTOMLEFT", -C.actionbar.button_space, 0)
VehicleButtonAnchor:ClearAllPoints()
VehicleButtonAnchor:SetPoint("BOTTOMRIGHT", ActionBarAnchor, "BOTTOMLEFT", -C.actionbar.button_space, 0)
if ShestakUISettingsPerChar.BottomBars == 2 then
ToggleBarText(3, ">\n>\n>", true)
ToggleBarText(4, "<\n<\n<", true)
else
ToggleBarText(3, ">\n>", true)
ToggleBarText(4, "<\n<", true)
end
Bar5Holder:Hide()
SplitBarLeft:Hide()
SplitBarRight:Hide()
end
end
end
local LockCheck = function(i)
if ShestakUISettingsPerChar.BarsLocked == true then
ToggleBar[i].Text:SetText("U")
ToggleBar[i].Text:SetTextColor(0.3, 0.3, 0.9)
elseif ShestakUISettingsPerChar.BarsLocked == false then
ToggleBar[i].Text:SetText("L")
ToggleBar[i].Text:SetTextColor(0.9, 0.3, 0.3)
else
ToggleBar[i].Text:SetText("L")
ToggleBar[i].Text:SetTextColor(0.9, 0.3, 0.3)
end
end
for i = 1, 5 do
ToggleBar[i] = CreateFrame("Frame", "ToggleBar"..i, ToggleBar)
ToggleBar[i]:EnableMouse(true)
ToggleBar[i]:SetAlpha(0)
ToggleBar[i].Text = ToggleBar[i]:CreateFontString(nil, "OVERLAY")
ToggleBar[i].Text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
ToggleBar[i].Text:SetPoint("CENTER", 2, 0)
if i == 1 then
ToggleBar[i]:CreatePanel("Transparent", ActionBarAnchor:GetWidth(), C.actionbar.button_size / 1.5, "BOTTOM", ActionBarAnchor, "TOP", 0, C.actionbar.button_space)
ToggleBarText(i, "- - -", false, true)
ToggleBar[i]:SetScript("OnMouseDown", function()
if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end
ShestakUISettingsPerChar.BottomBars = ShestakUISettingsPerChar.BottomBars + 1
if C.actionbar.split_bars ~= true then
if ShestakUISettingsPerChar.BottomBars > 3 then
ShestakUISettingsPerChar.BottomBars = 1
elseif ShestakUISettingsPerChar.BottomBars > 2 then
ShestakUISettingsPerChar.BottomBars = 3
elseif ShestakUISettingsPerChar.BottomBars < 1 then
ShestakUISettingsPerChar.BottomBars = 3
end
elseif C.actionbar.split_bars == true then
if ShestakUISettingsPerChar.BottomBars > 2 then
ShestakUISettingsPerChar.BottomBars = 1
end
end
MainBars()
end)
ToggleBar[i]:SetScript("OnEvent", MainBars)
elseif i == 2 then
ToggleBar[i]:CreatePanel("Transparent", RightActionBarAnchor:GetWidth(), C.actionbar.button_size / 1.5, "TOPRIGHT", RightActionBarAnchor, "BOTTOMRIGHT", 0, -C.actionbar.button_space)
ToggleBar[i]:SetFrameStrata("LOW")
ToggleBarText(i, "> > >", false, true)
ToggleBar[i]:SetScript("OnMouseDown", function()
if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end
ShestakUISettingsPerChar.RightBars = ShestakUISettingsPerChar.RightBars - 1
if C.actionbar.rightbars > 2 then
if ShestakUISettingsPerChar.RightBars > 3 then
ShestakUISettingsPerChar.RightBars = 2
elseif ShestakUISettingsPerChar.RightBars > 2 then
ShestakUISettingsPerChar.RightBars = 1
elseif ShestakUISettingsPerChar.RightBars < 0 then
ShestakUISettingsPerChar.RightBars = 3
end
elseif C.actionbar.rightbars < 3 then
if ShestakUISettingsPerChar.RightBars > 2 then
ShestakUISettingsPerChar.RightBars = 1
elseif ShestakUISettingsPerChar.RightBars < 0 then
ShestakUISettingsPerChar.RightBars = 2
end
end
RightBars()
end)
ToggleBar[i]:SetScript("OnEvent", RightBars)
elseif i == 3 then
if C.actionbar.split_bars == true then
ToggleBar[i]:CreatePanel("Transparent", C.actionbar.button_size / 1.5, ActionBarAnchor:GetHeight(), "BOTTOMLEFT", SplitBarRight, "BOTTOMRIGHT", C.actionbar.button_space, 0)
ToggleBarText(i, "<\n<", false, true)
ToggleBar[i]:SetFrameLevel(SplitBarRight:GetFrameLevel() + 1)
end
elseif i == 4 then
if C.actionbar.split_bars == true then
ToggleBar[i]:CreatePanel("Transparent", C.actionbar.button_size / 1.5, ActionBarAnchor:GetHeight(), "BOTTOMRIGHT", SplitBarLeft, "BOTTOMLEFT", -C.actionbar.button_space, 0)
ToggleBarText(i, ">\n>", false, true)
ToggleBar[i]:SetFrameLevel(SplitBarLeft:GetFrameLevel() + 1)
end
elseif i == 5 then
ToggleBar[i]:CreatePanel("Transparent", 19, 19, "TOPLEFT", Minimap, "TOPRIGHT", 3, 2)
ToggleBar[i]:SetBackdropBorderColor(unpack(C.media.classborder_color))
ToggleBar[i].Text:SetPoint("CENTER", 1, 0)
ToggleBar[i]:SetScript("OnMouseDown", function()
if InCombatLockdown() then return end
if ShestakUISettingsPerChar.BarsLocked == true then
ShestakUISettingsPerChar.BarsLocked = false
elseif ShestakUISettingsPerChar.BarsLocked == false then
ShestakUISettingsPerChar.BarsLocked = true
end
LockCheck(i)
ToggleBar[i]:GetScript("OnEnter")(ToggleBar[i])
end)
ToggleBar[i]:SetScript("OnEvent", function() LockCheck(i) end)
end
if i == 3 or i == 4 then
ToggleBar[i]:SetScript("OnMouseDown", function()
if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end
if ShestakUISettingsPerChar.SplitBars == false then
ShestakUISettingsPerChar.SplitBars = true
elseif ShestakUISettingsPerChar.SplitBars == true then
ShestakUISettingsPerChar.SplitBars = false
end
SplitBars()
end)
ToggleBar[i]:SetScript("OnEvent", SplitBars)
end
ToggleBar[i]:RegisterEvent("PLAYER_ENTERING_WORLD")
ToggleBar[i]:RegisterEvent("PLAYER_REGEN_DISABLED")
ToggleBar[i]:RegisterEvent("PLAYER_REGEN_ENABLED")
ToggleBar[i]:SetScript("OnEnter", function()
if InCombatLockdown() then return end
if i == 2 then
if C.actionbar.rightbars_mouseover == true then
ToggleBar[i]:SetAlpha(1)
RightBarMouseOver(1)
else
ToggleBar[i]:FadeIn()
end
elseif i == 3 or i == 4 then
if C.actionbar.bottombars_mouseover then
ToggleBar[i]:SetAlpha(1)
BottomBarMouseOver(1)
else
ToggleBar[3]:FadeIn()
ToggleBar[4]:FadeIn()
end
VehicleButtonAnchor:ClearAllPoints()
VehicleButtonAnchor:SetPoint("BOTTOMRIGHT", ToggleBar[4], "BOTTOMLEFT", -C.actionbar.button_space, 0)
else
if i == 1 and C.actionbar.bottombars_mouseover then
BottomBarMouseOver(1)
ToggleBar[i]:SetAlpha(1)
return
end
ToggleBar[i]:FadeIn()
end
if i == 5 then
GameTooltip:SetOwner(ToggleBar[i], "ANCHOR_LEFT")
GameTooltip:AddLine(L_MINIMAP_TOGGLE, 0.40, 0.78, 1)
GameTooltip:AddDoubleLine(" ", TALENT_TREE_LOCKED..": "..(ShestakUISettingsPerChar.BarsLocked and "|cff55ff55"..L_STATS_ON or "|cffff5555"..strupper(OFF)), 1, 1, 1, 0.75, 0.90, 1)
GameTooltip:Show()
end
end)
ToggleBar[i]:SetScript("OnLeave", function()
if i == 2 then
if C.actionbar.rightbars_mouseover == true then
ToggleBar[i]:SetAlpha(0)
RightBarMouseOver(0)
else
ToggleBar[i]:FadeOut()
end
elseif i == 3 or i == 4 then
if InCombatLockdown() then return end
if C.actionbar.bottombars_mouseover then
ToggleBar[i]:SetAlpha(0)
BottomBarMouseOver(0)
else
ToggleBar[3]:FadeOut()
ToggleBar[4]:FadeOut()
end
VehicleButtonAnchor:ClearAllPoints()
if ShestakUISettingsPerChar.SplitBars == true then
VehicleButtonAnchor:SetPoint("BOTTOMRIGHT", SplitBarLeft, "BOTTOMLEFT", -C.actionbar.button_space, 0)
else
VehicleButtonAnchor:SetPoint("BOTTOMRIGHT", ActionBarAnchor, "BOTTOMLEFT", -C.actionbar.button_space, 0)
end
else
if i == 1 and C.actionbar.bottombars_mouseover then
BottomBarMouseOver(0)
ToggleBar[i]:SetAlpha(0)
return
end
ToggleBar[i]:FadeOut()
end
if i == 5 then
GameTooltip:Hide()
end
end)
ToggleBar[i]:SetScript("OnUpdate", function()
if InCombatLockdown() then return end
if ShestakUISettingsPerChar.BarsLocked == true then
for i = 1, 4 do
ToggleBar[i]:EnableMouse(false)
end
elseif ShestakUISettingsPerChar.BarsLocked == false then
for i = 1, 4 do
ToggleBar[i]:EnableMouse(true)
end
end
end)
end
================================================
FILE: ShestakUI/Modules/ActionBars/VehicleExit.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Vehicle exit button(by Tukz)
----------------------------------------------------------------------------------------
local anchor = CreateFrame("Frame", "VehicleButtonAnchor", UIParent)
if C.actionbar.split_bars then
anchor:SetPoint(C.position.vehicle_bar[1], SplitBarLeft, C.position.vehicle_bar[3], C.position.vehicle_bar[4], C.position.vehicle_bar[5])
else
anchor:SetPoint(unpack(C.position.vehicle_bar))
end
anchor:SetSize(C.actionbar.button_size, C.actionbar.button_size)
local vehicle = CreateFrame("Button", "VehicleButton", UIParent)
vehicle:SetSize(C.actionbar.button_size, C.actionbar.button_size)
vehicle:SetPoint("BOTTOMLEFT", anchor, "BOTTOMLEFT")
vehicle:SetNormalTexture("Interface\\Vehicles\\UI-Vehicles-Button-Exit-Up")
vehicle:GetNormalTexture():SetTexCoord(0.2, 0.8, 0.2, 0.8)
vehicle:GetNormalTexture():ClearAllPoints()
vehicle:GetNormalTexture():SetPoint("TOPLEFT", 2, -2)
vehicle:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2)
vehicle:SetTemplate("Default")
vehicle:StyleButton(true)
vehicle:RegisterForClicks("AnyUp")
vehicle:SetFrameLevel(6)
vehicle:SetFrameStrata("HIGH")
vehicle:Hide()
hooksecurefunc(MainMenuBarVehicleLeaveButton, "Update", function()
if CanExitVehicle() then
if UnitOnTaxi("player") then
vehicle:SetScript("OnClick", function(self)
TaxiRequestEarlyLanding()
self:LockHighlight()
end)
else
vehicle:SetScript("OnClick", function()
VehicleExit()
end)
end
vehicle:Show()
else
vehicle:UnlockHighlight()
vehicle:Hide()
end
end)
hooksecurefunc(PossessActionBar, "UpdateState", function()
for i = 1, NUM_POSSESS_SLOTS do
local _, _, enabled = GetPossessInfo(i)
if enabled then
vehicle:SetScript("OnClick", function()
CancelPetPossess()
end)
vehicle:Show()
else
vehicle:Hide()
end
end
end)
-- Set tooltip
vehicle:SetScript("OnEnter", function(self)
if UnitOnTaxi("player") then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetText(TAXI_CANCEL, 1, 1, 1)
GameTooltip:AddLine(TAXI_CANCEL_DESCRIPTION, 1, 0.8, 0, true)
GameTooltip:Show()
elseif IsPossessBarVisible() then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip_SetTitle(GameTooltip, CANCEL)
else
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip_SetTitle(GameTooltip, LEAVE_VEHICLE)
end
end)
vehicle:SetScript("OnLeave", function() GameTooltip:Hide() end)
================================================
FILE: ShestakUI/Modules/Announcements/BadGear.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.announcements.bad_gear ~= true then return end
----------------------------------------------------------------------------------------
-- Check bad gear in instance
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("ZONE_CHANGED_NEW_AREA")
frame:SetScript("OnEvent", function(_, event)
if event ~= "ZONE_CHANGED_NEW_AREA" or not IsInInstance() then return end
for i = 1, 17 do
if T.AnnounceBadGear[i] then
local id = GetInventoryItemID("player", i) or 0
if T.AnnounceBadGear[i][id] then
local _, itemLink = GetItemInfo(id)
PlaySound(SOUNDKIT.RAID_WARNING, "Master")
RaidNotice_AddMessage(RaidWarningFrame, format("%s %s", CURRENTLY_EQUIPPED, itemLink.."!"), ChatTypeInfo["RAID_WARNING"])
print(format("|cffff3300%s %s", CURRENTLY_EQUIPPED, itemLink.."|cffff3300!|r"))
end
end
end
end)
================================================
FILE: ShestakUI/Modules/Announcements/Drinking.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.announcements.drinking ~= true then return end
----------------------------------------------------------------------------------------
-- Announce enemy drinking in arena(by Duffed)
----------------------------------------------------------------------------------------
local drinkSpell = {
[GetSpellInfo(118358)] = true, -- Drink
[GetSpellInfo(167152)] = true, -- Refreshment
[GetSpellInfo(167268)] = true, -- Ba'ruun's Bountiful Bloom
}
local frame = CreateFrame("Frame")
frame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
frame:SetScript("OnEvent", function(_, event, ...)
if not (event == "UNIT_SPELLCAST_SUCCEEDED" and GetZonePVPInfo() == "arena") then return end
local unit, _, spellID = ...
if UnitIsEnemy("player", unit) and drinkSpell[GetSpellInfo(spellID)] then
SendChatMessage(UnitClass(unit).." "..UnitName(unit)..L_MISC_DRINKING, T.CheckChat(true))
end
end)
================================================
FILE: ShestakUI/Modules/Announcements/FeastsAndPortals.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.announcements.feasts ~= true and C.announcements.portals ~= true and C.announcements.toys ~= true then return end
----------------------------------------------------------------------------------------
-- Announce Feasts/Souls/Repair Bots/Portals/Ritual of Summoning
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
frame:SetScript("OnEvent", function()
if not IsInGroup() or InCombatLockdown() then return end
local _, subEvent, _, _, srcName, _, _, _, destName, _, _, spellID = CombatLogGetCurrentEventInfo()
if not subEvent or not spellID or not srcName then return end
if not UnitInRaid(srcName) and not UnitInParty(srcName) then return end
local srcName = srcName:gsub("%-[^|]+", "")
if subEvent == "SPELL_CAST_SUCCESS" then
-- Feasts and Cauldron
if C.announcements.feasts and T.AnnounceFeast[spellID] then
SendChatMessage(string.format(L_ANNOUNCE_FP_PRE, srcName, GetSpellLink(spellID)), T.CheckChat(true))
-- Refreshment Table
elseif C.announcements.feasts and spellID == 43987 then
SendChatMessage(string.format(L_ANNOUNCE_FP_PRE, srcName, GetSpellLink(spellID)), T.CheckChat(true))
-- Ritual of Summoning
elseif C.announcements.portals and spellID == 698 then
SendChatMessage(string.format(L_ANNOUNCE_FP_CLICK, srcName, GetSpellLink(spellID)), T.CheckChat(true))
-- Piccolo of the Flaming Fire
elseif C.announcements.toys and spellID == 182346 then
SendChatMessage(string.format(L_ANNOUNCE_FP_USE, srcName, GetSpellLink(spellID)), T.CheckChat(true))
end
elseif subEvent == "SPELL_SUMMON" then
-- Repair Bots and Codex
if C.announcements.feasts and T.AnnounceBots[spellID] then
SendChatMessage(string.format(L_ANNOUNCE_FP_PUT, srcName, GetSpellLink(spellID)), T.CheckChat(true))
end
elseif subEvent == "SPELL_CREATE" then
-- Healthstone and MOLL-E
if C.announcements.feasts and (spellID == 29893 or spellID == 54710) then
SendChatMessage(string.format(L_ANNOUNCE_FP_PUT, srcName, GetSpellLink(spellID)), T.CheckChat(true))
-- Toys
elseif C.announcements.toys and T.AnnounceToys[spellID] then
SendChatMessage(string.format(L_ANNOUNCE_FP_PUT, srcName, GetSpellLink(spellID)), T.CheckChat(true))
-- Portals
elseif C.announcements.portals and T.AnnouncePortals[spellID] then
SendChatMessage(string.format(L_ANNOUNCE_FP_CAST, srcName, GetSpellLink(spellID)), T.CheckChat(true))
end
elseif subEvent == "SPELL_AURA_APPLIED" then
-- Turkey Feathers and Party G.R.E.N.A.D.E.
if C.announcements.toys and (spellID == 61781 or ((spellID == 51508 or spellID == 51510) and destName == T.name)) then
SendChatMessage(string.format(L_ANNOUNCE_FP_USE, srcName, GetSpellLink(spellID)), T.CheckChat(true))
end
end
end)
================================================
FILE: ShestakUI/Modules/Announcements/FlaskAndFood.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.announcements.flask_food ~= true then return end
----------------------------------------------------------------------------------------
-- Checks the usage of flasks and food of your party/raid members(ffCheck by Silverwind)
----------------------------------------------------------------------------------------
local noFood, noFlask, unitBuffs = {}, {}, {}
local foods = T.ReminderBuffs["Food"]
local flasks = T.ReminderBuffs["Flask"]
local function scan(unit)
table.wipe(unitBuffs)
local i = 1
while true do
local name = UnitAura(unit, i, "HELPFUL")
if not name then return end
unitBuffs[name] = true
i = i + 1
end
end
local function checkFood()
for i = 1, #foods do
local name = unpack(foods[i])
if unitBuffs[name] then
return true
end
end
end
local function checkFlask()
for i = 1, #flasks do
local name = unpack(flasks[i])
if unitBuffs[name] then
return true
end
end
end
local function checkUnit(unit)
local name = UnitName(unit)
scan(unit)
if not checkFood() then
noFood[#noFood + 1] = name
end
if not checkFlask() then
noFlask[#noFlask + 1] = name
end
end
local function print(text)
_G.print("|cffffff00"..text.."|r")
end
-- The Main function to run a check
local function run()
local checkType
local output
table.wipe(noFood)
table.wipe(noFlask)
if UnitInRaid("player") then
checkType = "raid"
else
checkType = "party"
checkUnit("player")
end
for i = 1, GetNumGroupMembers() do
if checkType == "raid" then
local online = select(8, GetRaidRosterInfo(i))
if online then
local unit = checkType..i
checkUnit(unit)
end
else
local unit = checkType..i
if UnitIsConnected(unit) then
checkUnit(unit)
end
end
end
if #noFlask > 0 then
table.sort(noFlask)
output = L_ANNOUNCE_FF_NOFLASK..table.concat(noFlask, ", ")
if C.announcements.flask_food_raid then
SendChatMessage(output, T.CheckChat())
else
print(output)
end
end
if #noFood > 0 then
table.sort(noFood)
output = L_ANNOUNCE_FF_NOFOOD..table.concat(noFood, ", ")
if C.announcements.flask_food_raid then
SendChatMessage(output, T.CheckChat())
else
print(output)
end
end
if #noFood == 0 and #noFlask == 0 then
if C.announcements.flask_food_raid then
SendChatMessage(L_ANNOUNCE_FF_ALLBUFFED, T.CheckChat())
else
print(L_ANNOUNCE_FF_ALLBUFFED)
end
end
end
-- Event Handler
local frame = CreateFrame("Frame")
frame:RegisterEvent("READY_CHECK")
frame:SetScript("OnEvent", function()
if C.announcements.flask_food_auto then
run()
end
end)
-- Slash command
SlashCmdList.FFCHECK = run
SLASH_FFCHECK1 = "/ffcheck"
SLASH_FFCHECK2 = "/аасрусл"
-- Check button
if C.misc.raid_tools == true then
RaidUtilityPanel:SetHeight(168)
local button = CreateFrame("Button", "FoodFlaskCheckButton", RaidUtilityPanel, "UIPanelButtonTemplate")
button:SetWidth(RaidUtilityRoleButton:GetWidth())
button:SetHeight(18)
button:SetPoint("TOP", RaidUtilityRaidControlButton, "BOTTOM", 0, -5)
if IsAddOnLoaded("Aurora") then
local F = unpack(Aurora)
F.Reskin(button)
else
button:SkinButton()
end
button:EnableMouse(true)
button:SetScript("OnMouseUp", function() run() end)
local t = button:CreateFontString(nil, "OVERLAY")
t:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
t:SetPoint("CENTER")
t:SetJustifyH("CENTER")
t:SetText(L_ANNOUNCE_FF_CHECK_BUTTON)
end
================================================
FILE: ShestakUI/Modules/Announcements/Interrupts.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.announcements.interrupts ~= true then return end
----------------------------------------------------------------------------------------
-- Announce your interrupts(by Elv22)
----------------------------------------------------------------------------------------
local RaidIconMaskToIndex = {
[COMBATLOG_OBJECT_RAIDTARGET1] = 1,
[COMBATLOG_OBJECT_RAIDTARGET2] = 2,
[COMBATLOG_OBJECT_RAIDTARGET3] = 3,
[COMBATLOG_OBJECT_RAIDTARGET4] = 4,
[COMBATLOG_OBJECT_RAIDTARGET5] = 5,
[COMBATLOG_OBJECT_RAIDTARGET6] = 6,
[COMBATLOG_OBJECT_RAIDTARGET7] = 7,
[COMBATLOG_OBJECT_RAIDTARGET8] = 8,
}
local function GetRaidIcon(unitFlags)
local raidTarget = bit.band(unitFlags, COMBATLOG_OBJECT_RAIDTARGET_MASK)
if raidTarget == 0 then
return ""
end
return "{rt"..RaidIconMaskToIndex[raidTarget].."}"
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
frame:SetScript("OnEvent", function()
if not IsInGroup() then return end
local _, event, _, sourceGUID, _, _, _, _, destName, _, destRaidFlags, _, _, _, spellID = CombatLogGetCurrentEventInfo()
if not (event == "SPELL_INTERRUPT" and sourceGUID == UnitGUID("player")) then return end
local destIcon = ""
if destName then
destIcon = GetRaidIcon(destRaidFlags)
end
SendChatMessage(L_ANNOUNCE_INTERRUPTED.." "..destIcon..destName..": "..GetSpellLink(spellID), T.CheckChat())
end)
================================================
FILE: ShestakUI/Modules/Announcements/PullCountdown.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.announcements.pull_countdown ~= true then return end
----------------------------------------------------------------------------------------
-- Pull Countdown(by Dridzt)
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame", "PullCountdown")
local timerframe = CreateFrame("Frame")
local firstdone, delay, target
local interval = 1.5
local lastupdate = 0
local function reset()
timerframe:SetScript("OnUpdate", nil)
firstdone, delay, target = nil, nil, nil
lastupdate = 0
end
local function pull(_, elapsed)
local tname = UnitName("target")
if tname then
target = tname
else
target = ""
end
if not firstdone then
SendChatMessage(string.format(L_ANNOUNCE_PC_MSG, target, tostring(delay)), T.CheckChat(true))
firstdone = true
delay = delay - 1
end
lastupdate = lastupdate + elapsed
if lastupdate >= interval then
lastupdate = 0
if delay > 0 then
SendChatMessage(tostring(delay).."..", T.CheckChat(true))
delay = delay - 1
else
SendChatMessage(L_ANNOUNCE_PC_GO, T.CheckChat(true))
reset()
end
end
end
function frame.Pull(timer)
delay = timer or 3
if timerframe:GetScript("OnUpdate") then
reset()
SendChatMessage(L_ANNOUNCE_PC_ABORTED, T.CheckChat(true))
else
timerframe:SetScript("OnUpdate", pull)
end
end
SlashCmdList.PULLCOUNTDOWN = function(msg)
if not IsInGroup() then return end
if tonumber(msg) ~= nil then
frame.Pull(msg)
else
frame.Pull()
end
end
SLASH_PULLCOUNTDOWN1 = "/pc"
SLASH_PULLCOUNTDOWN2 = "/зс"
================================================
FILE: ShestakUI/Modules/Announcements/SafariHat.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.announcements.safari_hat ~= true then return end
----------------------------------------------------------------------------------------
-- Check Safari Hat
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(_, _, addon)
if addon == "Blizzard_Collections" then
if not PlayerHasToy(92738) then return end
local button = CreateFrame("Button", "PetJournalSafariButton", PetJournal, "SecureActionButtonTemplate, ActionButtonTemplate")
button:RegisterForClicks("LeftButtonUp", "LeftButtonDown")
button:SetSize(36, 36)
button:SetAttribute("type", "toy")
button:SetAttribute("toy", 92738)
if C.skins.blizzard_frames == true then
button:SetPoint("TOPLEFT", PetJournal, "TOPRIGHT", 1, 0)
button:SetTemplate("Default")
button:StyleButton()
button:SetNormalTexture(0)
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)
button.icon:SetDrawLayer("OVERLAY")
else
button:SetPoint("TOPLEFT", PetJournal, "TOPRIGHT", 3, -24)
end
button.icon:SetTexture(774766)
button:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
GameTooltip:SetToyByItemID(92738)
end)
button:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
end
end)
local announceFrame = CreateFrame("Frame")
announceFrame:RegisterEvent("PET_BATTLE_OPENING_DONE")
announceFrame:RegisterEvent("PET_BATTLE_OVER")
announceFrame:SetScript("OnEvent", function(_, event)
if event == "PET_BATTLE_OPENING_DONE" then
local name = GetSpellInfo(158486)
if PlayerHasToy(92738) and not T.CheckPlayerBuff(name) then
local maxlevel = true
for i = 1, 3 do
local level = C_PetBattles.GetLevel(1, i)
if level and level < 25 then
maxlevel = false
end
end
if maxlevel then return end
PlaySound(SOUNDKIT.RAID_WARNING, "master")
RaidNotice_AddMessage(RaidWarningFrame, RESISTANCE_NONE.." "..GetSpellLink(158486).."!", ChatTypeInfo["RAID_WARNING"])
print("|cffff3300"..RESISTANCE_NONE.." "..GetSpellLink(158486).."|cffff3300!|r")
end
end
end)
================================================
FILE: ShestakUI/Modules/Announcements/Spells.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.announcements.spells ~= true then return end
----------------------------------------------------------------------------------------
-- Announce some spells
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
frame:SetScript("OnEvent", function()
local _, event, _, sourceGUID, sourceName, _, _, _, destName, _, _, spellID = CombatLogGetCurrentEventInfo()
local _, _, difficultyID = GetInstanceInfo()
if difficultyID == 0 or event ~= "SPELL_CAST_SUCCESS" then return end
if sourceName then sourceName = sourceName:gsub("%-[^|]+", "") end
if destName then destName = destName:gsub("%-[^|]+", "") end
if C.announcements.spells_from_all == true and not (sourceGUID == UnitGUID("player") and sourceName == T.name) then
if not sourceName then return end
if T.AnnounceSpells[spellID] then
if destName == nil then
SendChatMessage(string.format(L_ANNOUNCE_FP_USE, sourceName, GetSpellLink(spellID)), T.CheckChat())
else
SendChatMessage(string.format(L_ANNOUNCE_FP_USE, sourceName, GetSpellLink(spellID).." -> "..destName), T.CheckChat())
end
end
else
if not (sourceGUID == UnitGUID("player") and sourceName == T.name) then return end
if T.AnnounceSpells[spellID] then
if destName == nil then
SendChatMessage(string.format(L_ANNOUNCE_FP_USE, sourceName, GetSpellLink(spellID)), T.CheckChat())
else
SendChatMessage(GetSpellLink(spellID).." -> "..destName, T.CheckChat())
end
end
end
end)
================================================
FILE: ShestakUI/Modules/Auras/AuraSource.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.aura.cast_by ~= true then return end
----------------------------------------------------------------------------------------
-- Tells you who cast a buff or debuff in its tooltip(prButler by Renstrom)
----------------------------------------------------------------------------------------
local function addAuraSource(self, func, unit, index, filter, instanceID)
local srcUnit
if instanceID then
local aura = C_UnitAuras.GetAuraDataByAuraInstanceID(unit, index)
srcUnit = aura and aura.sourceUnit
else
srcUnit = select(7, func(unit, index, filter))
end
if srcUnit then
local src = GetUnitName(srcUnit, true)
if srcUnit == "pet" or srcUnit == "vehicle" then
src = format("%s (|cff%02x%02x%02x%s|r)", src, T.color.r * 255, T.color.g * 255, T.color.b * 255, GetUnitName("player", true))
else
local partypet = srcUnit:match("^partypet(%d+)$")
local raidpet = srcUnit:match("^raidpet(%d+)$")
if partypet then
src = format("%s (%s)", src, GetUnitName("party"..partypet, true))
elseif raidpet then
src = format("%s (%s)", src, GetUnitName("raid"..raidpet, true))
end
end
if UnitIsPlayer(srcUnit) then
local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[select(2, UnitClass(srcUnit))]
if color then
src = format("|cff%02x%02x%02x%s|r", color.r * 255, color.g * 255, color.b * 255, src)
end
else
local color = T.oUF_colors.reaction[UnitReaction(srcUnit, "player")]
if color then
src = format("|cff%02x%02x%02x%s|r", color[1] * 255, color[2] * 255, color[3] * 255, src)
end
end
self:AddLine(DONE_BY.." "..src)
self:Show()
end
end
local funcs = {
SetUnitAura = UnitAura,
SetUnitBuff = UnitBuff,
SetUnitDebuff = UnitDebuff,
SetUnitBuffByAuraInstanceID = UnitBuff,
SetUnitDebuffByAuraInstanceID = UnitDebuff,
}
for k, v in pairs(funcs) do
if k == "SetUnitBuffByAuraInstanceID" or k == "SetUnitBuffByAuraInstanceID" then
hooksecurefunc(GameTooltip, k, function(self, unit, index, filter)
addAuraSource(self, v, unit, index, filter, true)
end)
else
hooksecurefunc(GameTooltip, k, function(self, unit, index, filter)
addAuraSource(self, v, unit, index, filter)
end)
end
end
================================================
FILE: ShestakUI/Modules/Auras/BuffFrame.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.aura.player_auras ~= true then return end
----------------------------------------------------------------------------------------
-- Style player buff(by Tukz)
----------------------------------------------------------------------------------------
local rowbuffs = 16
local GetFormattedTime = function(s)
if s >= 86400 then
return format("%dd", floor(s / 86400 + 0.5))
elseif s >= 3600 then
return format("%dh", floor(s / 3600 + 0.5))
elseif s >= 60 then
return format("%dm", floor(s / 60 + 0.5))
end
return floor(s + 0.5)
end
local BuffsAnchor = CreateFrame("Frame", "BuffsAnchor", UIParent)
BuffsAnchor:SetPoint(unpack(C.position.player_buffs))
BuffsAnchor:SetSize((15 * C.aura.player_buff_size) + 42, (C.aura.player_buff_size * 2) + 3)
local function UpdateDuration(aura, timeLeft)
local duration = aura.Duration
if timeLeft and C.aura.show_timer == true then
duration:SetVertexColor(1, 1, 1)
duration:SetFormattedText(GetFormattedTime(timeLeft))
else
duration:Hide()
end
end
hooksecurefunc(BuffFrame.AuraContainer, "UpdateGridLayout", function(self, auras)
local previousBuff, aboveBuff
for index, aura in ipairs(auras) do
aura:SetSize(C.aura.player_buff_size, C.aura.player_buff_size)
aura:SetTemplate("Default")
aura.TempEnchantBorder:SetAlpha(0)
hooksecurefunc(aura.TempEnchantBorder, "Show", function(self)
aura:SetBackdropBorderColor(0.6, 0.1, 0.6)
end)
hooksecurefunc(aura.TempEnchantBorder, "Hide", function(self)
if C.aura.classcolor_border == true then
aura:SetBackdropBorderColor(unpack(C.media.classborder_color))
else
aura:SetBackdropBorderColor(unpack(C.media.border_color))
end
end)
aura:ClearAllPoints()
if (index > 1) and (mod(index, rowbuffs) == 1) then
aura:SetPoint("TOP", aboveBuff, "BOTTOM", 0, -3)
aboveBuff = aura
elseif index == 1 then
aura:SetPoint("TOPRIGHT", BuffsAnchor, "TOPRIGHT", 0, 0)
aboveBuff = aura
else
aura:SetPoint("RIGHT", previousBuff, "LEFT", -3, 0)
end
previousBuff = aura
aura.Icon:CropIcon()
aura.Icon:SetDrawLayer("BORDER")
local duration = aura.Duration
duration:ClearAllPoints()
duration:SetPoint("CENTER", 2, 1)
duration:SetDrawLayer("ARTWORK")
duration:SetFont(C.font.auras_font, C.font.auras_font_size, C.font.auras_font_style)
duration:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)
if not aura.hook then
hooksecurefunc(aura, "UpdateDuration", function(aura, timeLeft)
UpdateDuration(aura, timeLeft)
end)
aura.hook = true
end
if aura.Count then -- need to check exist to prevent error in EditMode
aura.Count:ClearAllPoints()
aura.Count:SetPoint("BOTTOMRIGHT", 2, 0)
aura.Count:SetDrawLayer("ARTWORK")
aura.Count:SetFont(C.font.auras_font, C.font.auras_font_size, C.font.auras_font_style)
aura.Count:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)
end
end
end)
-- Hide collapse button
BuffFrame.CollapseAndExpandButton:Kill()
-- Hide debuffs
DebuffFrame.AuraContainer:Hide()
================================================
FILE: ShestakUI/Modules/Auras/Filger.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.unitframe.enable ~= true or C.filger.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Lightweight buff/debuff tracking (Filger by Nils Ruesch, editors Affli/SinaC/Ildyria)
----------------------------------------------------------------------------------------
P_BUFF_ICON_Anchor:SetPoint(unpack(C.position.filger.player_buff_icon))
P_BUFF_ICON_Anchor:SetSize(C.filger.buffs_size, C.filger.buffs_size)
P_PROC_ICON_Anchor:SetPoint(unpack(C.position.filger.player_proc_icon))
P_PROC_ICON_Anchor:SetSize(C.filger.buffs_size, C.filger.buffs_size)
SPECIAL_P_BUFF_ICON_Anchor:SetPoint(unpack(C.position.filger.special_proc_icon))
SPECIAL_P_BUFF_ICON_Anchor:SetSize(C.filger.buffs_size, C.filger.buffs_size)
T_DEBUFF_ICON_Anchor:SetPoint(unpack(C.position.filger.target_debuff_icon))
T_DEBUFF_ICON_Anchor:SetSize(C.filger.buffs_size, C.filger.buffs_size)
T_BUFF_Anchor:SetPoint(unpack(C.position.filger.target_buff_icon))
T_BUFF_Anchor:SetSize(C.filger.pvp_size, C.filger.pvp_size)
PVE_PVP_DEBUFF_Anchor:SetPoint(unpack(C.position.filger.pve_debuff))
PVE_PVP_DEBUFF_Anchor:SetSize(C.filger.pvp_size, C.filger.pvp_size)
PVE_PVP_CC_Anchor:SetPoint(unpack(C.position.filger.pve_cc))
PVE_PVP_CC_Anchor:SetSize(221, 25)
COOLDOWN_Anchor:SetPoint(C.position.filger.cooldown[1], C.position.filger.cooldown[2], C.position.filger.cooldown[3], C.position.filger.cooldown[4], C.unitframe.plugins_swing and C.position.filger.cooldown[5] + 12 or C.position.filger.cooldown[5])
COOLDOWN_Anchor:SetSize(C.filger.cooldown_size, C.filger.cooldown_size)
T_DE_BUFF_BAR_Anchor:SetPoint(C.position.filger.target_bar[1], C.unitframe.portrait_enable and "oUF_Target_Portrait" or C.position.filger.target_bar[2], C.position.filger.target_bar[3], C.unitframe.portrait_enable and C.position.filger.target_bar[4] - 3 or C.position.filger.target_bar[4], C.unitframe.portrait_enable and C.position.filger.target_bar[5] + 38 or C.position.filger.target_bar[5])
T_DE_BUFF_BAR_Anchor:SetSize(218, 25)
SpellActivationOverlayFrame:SetFrameStrata("BACKGROUND")
local Filger = {}
local MyUnits = {player = true, vehicle = true, pet = true}
local SpellGroups = {}
function Filger:TooltipOnEnter()
if self.spellID > 20 then
local str = "spell:%s"
GameTooltip:ClearLines()
GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT", 0, 3)
GameTooltip:SetHyperlink(format(str, self.spellID))
GameTooltip:Show()
end
end
function Filger:TooltipOnLeave()
GameTooltip:Hide()
end
function Filger:UpdateCD()
local time = self.value.start + self.value.duration - GetTime()
if self:GetParent().Mode == "BAR" then
self.statusbar:SetValue(time)
if time <= 60 then
self.time:SetFormattedText("%.1f", time)
else
self.time:SetFormattedText("%d:%.2d", time / 60, time % 60)
end
else
if time < 0 then
local frame = self:GetParent()
frame.actives[self.value.spid] = nil
self:SetScript("OnUpdate", nil)
Filger.DisplayActives(frame)
end
end
end
function Filger:DisplayActives()
if not self.actives then return end
if not self.bars then self.bars = {} end
local id = self.Id
local index = 1
local previous = nil
local temp = {}
for _, value in pairs(self.actives) do
local bar = self.bars[index]
if not bar then
bar = CreateFrame("Frame", "FilgerAnchor"..id.."Frame"..index, self)
bar:SetScale(1)
bar:SetTemplate("Default")
if index == 1 then
bar:SetPoint(unpack(self.Position))
else
if self.Direction == "UP" then
bar:SetPoint("BOTTOM", previous, "TOP", 0, self.Interval)
elseif self.Direction == "RIGHT" then
bar:SetPoint("LEFT", previous, "RIGHT", self.Mode == "ICON" and self.Interval or (self.BarWidth + self.Interval + 7), 0)
elseif self.Direction == "LEFT" then
bar:SetPoint("RIGHT", previous, "LEFT", self.Mode == "ICON" and -self.Interval or -(self.BarWidth + self.Interval + 7), 0)
else
bar:SetPoint("TOP", previous, "BOTTOM", 0, -self.Interval)
end
end
if bar.icon then
bar.icon = _G[bar.icon:GetName()]
else
bar.icon = bar:CreateTexture("$parentIcon", "BORDER")
bar.icon:SetPoint("TOPLEFT", 2, -2)
bar.icon:SetPoint("BOTTOMRIGHT", -2, 2)
bar.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
if self.Mode == "ICON" then
if bar.cooldown then
bar.cooldown = _G[bar.cooldown:GetName()]
else
bar.cooldown = CreateFrame("Cooldown", "$parentCD", bar, "CooldownFrameTemplate")
bar.cooldown:SetAllPoints(bar.icon)
bar.cooldown:SetReverse(true)
bar.cooldown:SetDrawEdge(false)
bar.cooldown:SetFrameLevel(3)
end
if bar.count then
bar.count = _G[bar.count:GetName()]
else
bar.count = bar:CreateFontString("$parentCount", "OVERLAY")
bar.count:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
bar.count:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
bar.count:SetPoint("BOTTOMRIGHT", 1, -2)
bar.count:SetJustifyH("RIGHT")
end
else
if bar.statusbar then
bar.statusbar = _G[bar.statusbar:GetName()]
else
bar.statusbar = CreateFrame("StatusBar", "$parentStatusBar", bar)
bar.statusbar:SetWidth(self.BarWidth)
bar.statusbar:SetHeight(self.IconSize - 10)
bar.statusbar:SetStatusBarTexture(C.media.texture)
bar.statusbar:SetStatusBarColor(T.color.r, T.color.g, T.color.b, 1)
if self.IconSide == "LEFT" then
bar.statusbar:SetPoint("BOTTOMLEFT", bar, "BOTTOMRIGHT", 5, 2)
elseif self.IconSide == "RIGHT" then
bar.statusbar:SetPoint("BOTTOMRIGHT", bar, "BOTTOMLEFT", -5, 2)
end
end
bar.statusbar:SetMinMaxValues(0, 1)
bar.statusbar:SetValue(0)
if bar.bg then
bar.bg = _G[bar.bg:GetName()]
else
bar.bg = CreateFrame("Frame", "$parentBG", bar.statusbar)
bar.bg:SetPoint("TOPLEFT", -2, 2)
bar.bg:SetPoint("BOTTOMRIGHT", 2, -2)
bar.bg:SetFrameStrata("BACKGROUND")
bar.bg:SetTemplate("Default")
end
if bar.background then
bar.background = _G[bar.background:GetName()]
else
bar.background = bar.statusbar:CreateTexture(nil, "BACKGROUND")
bar.background:SetAllPoints()
bar.background:SetTexture(C.media.texture)
bar.background:SetVertexColor(T.color.r, T.color.g, T.color.b, 0.2)
end
if bar.time then
bar.time = _G[bar.time:GetName()]
else
bar.time = bar.statusbar:CreateFontString("$parentTime", "OVERLAY")
bar.time:SetFont(C.font.filger_font, C.font.filger_font_size, C.font.filger_font_style)
bar.time:SetShadowOffset(C.font.filger_font_shadow and 1 or 0, C.font.filger_font_shadow and -1 or 0)
bar.time:SetPoint("RIGHT", bar.statusbar, 0, 0)
bar.time:SetJustifyH("RIGHT")
end
if bar.count then
bar.count = _G[bar.count:GetName()]
else
bar.count = bar:CreateFontString("$parentCount", "OVERLAY")
bar.count:SetFont(C.font.filger_font, C.font.filger_font_size, C.font.filger_font_style)
bar.count:SetShadowOffset(C.font.filger_font_shadow and 1 or 0, C.font.filger_font_shadow and -1 or 0)
bar.count:SetPoint("BOTTOMRIGHT", 1, 0)
bar.count:SetJustifyH("RIGHT")
end
if bar.spellname then
bar.spellname = _G[bar.spellname:GetName()]
else
bar.spellname = bar.statusbar:CreateFontString("$parentSpellName", "OVERLAY")
bar.spellname:SetFont(C.font.filger_font, C.font.filger_font_size, C.font.filger_font_style)
bar.spellname:SetShadowOffset(C.font.filger_font_shadow and 1 or 0, C.font.filger_font_shadow and -1 or 0)
bar.spellname:SetPoint("LEFT", bar.statusbar, 2, 0)
bar.spellname:SetPoint("RIGHT", bar.time, "LEFT")
bar.spellname:SetJustifyH("LEFT")
end
end
bar.spellID = 0
self.bars[index] = bar
end
previous = bar
index = index + 1
table.insert(temp, value)
end
local function sortTable(a, b)
if C.filger.expiration == true and a.data.filter == "CD" then
return a.start + a.duration < b.start + b.duration
else
return a.sort < b.sort
end
end
table.sort(temp, sortTable)
local limit = (C.actionbar.button_size * 12)/self.IconSize
index = 1
for activeIndex, value in pairs(temp) do
if activeIndex >= limit then
break
end
local bar = self.bars[index]
bar.spellName = GetSpellInfo(value.spid)
if self.Mode == "BAR" then
bar.spellname:SetText(bar.spellName)
end
bar.icon:SetTexture(value.icon)
if value.count and value.count > 1 then
bar.count:SetText(value.count)
bar.count:Show()
else
bar.count:Hide()
end
if value.duration and value.duration > 0 then
if self.Mode == "ICON" then
if value.start + value.duration - GetTime() > 0.3 then
bar.cooldown:SetCooldown(value.start + 0.1, value.duration)
end
if value.data.filter == "CD" or value.data.filter == "ICD" then
bar.value = value
bar:SetScript("OnUpdate", Filger.UpdateCD)
else
bar:SetScript("OnUpdate", nil)
end
bar.cooldown:Show()
else
bar.statusbar:SetMinMaxValues(0, value.duration)
bar.value = value
bar:SetScript("OnUpdate", Filger.UpdateCD)
end
else
if self.Mode == "ICON" then
bar.cooldown:Hide()
else
bar.statusbar:SetMinMaxValues(0, 1)
bar.statusbar:SetValue(1)
bar.time:SetText("")
end
bar:SetScript("OnUpdate", nil)
end
bar.spellID = value.spid
if C.filger.show_tooltip then
bar:EnableMouse(true)
bar:SetScript("OnEnter", Filger.TooltipOnEnter)
bar:SetScript("OnLeave", Filger.TooltipOnLeave)
end
bar:SetWidth(self.IconSize or C.filger.buffs_size)
bar:SetHeight(self.IconSize or C.filger.buffs_size)
bar:SetAlpha(value.data.opacity or 1)
bar:Show()
index = index + 1
end
for i = index, #self.bars, 1 do
local bar = self.bars[i]
bar:Hide()
end
end
local function FindAuras(self, unit)
for spid in pairs(self.actives) do
if self.actives[spid].data.filter ~= "CD" and self.actives[spid].data.filter ~= "ICD" and self.actives[spid].data.unitID == unit then
self.actives[spid] = nil
end
end
for i = 1, 2 do
local filter = (i == 1 and "HELPFUL" or "HARMFUL")
local index = 1
while true do
local name, icon, count, _, duration, expirationTime, caster, _, _, spid = UnitAura(unit, index, filter)
if not name then break end
local data = SpellGroups[self.Id].spells[name] or SpellGroups[self.Id].spells[spid]
if data and (data.caster ~= 1 and (caster == data.caster or data.caster == "all") or MyUnits[caster]) and (not data.unitID or data.unitID == unit) and (not data.absID or spid == data.spellID) then
local isTalent = data.talentID and select(10, GetTalentInfoByID(data.talentID))
if ((data.filter == "BUFF" and filter == "HELPFUL") or (data.filter == "DEBUFF" and filter == "HARMFUL")) and (not data.spec or data.spec == T.Spec) and (not data.talentID or isTalent) then
if not data.count or count >= data.count then
self.actives[spid] = {data = data, name = name, icon = icon, count = count, start = expirationTime - duration, duration = duration, spid = spid, sort = data.sort}
end
elseif data.filter == "ICD" and (data.trigger == "BUFF" or data.trigger == "DEBUFF") and (not data.spec or data.spec == T.Spec) and (not data.talentID or isTalent) then
if data.slotID then
local slotLink = GetInventoryItemLink("player", data.slotID)
_, _, _, _, _, _, _, _, _, icon = GetItemInfo(slotLink)
end
self.actives[spid] = {data = data, name = name, icon = icon, count = count, start = expirationTime - duration, duration = data.duration, spid = spid, sort = data.sort}
end
end
index = index + 1
end
end
Filger.DisplayActives(self)
end
function Filger:OnEvent(event, unit, _, castID)
if event == "UNIT_AURA" and (unit == "player" or unit == "target" or unit == "pet" or unit == "focus") then
FindAuras(self, unit)
elseif event == "UNIT_SPELLCAST_SUCCEEDED" and unit == "player" then
local name, _, icon = GetSpellInfo(castID)
local data = SpellGroups[self.Id].spells[name]
if data and data.filter == "ICD" and data.trigger == "NONE" and (not data.spec or data.spec == T.Spec) then
local start, duration = GetTime(), data.duration
if data.totem then
local haveTotem, _, startTime, durationTime = GetTotemInfo(1)
if haveTotem then
start, duration = startTime, durationTime
end
end
self.actives[data.spellID] = {data = data, name = name, icon = icon, count = nil, start = start, duration = duration, spid = data.spellID, sort = data.sort}
Filger.DisplayActives(self)
end
elseif event == "PLAYER_TARGET_CHANGED" then
FindAuras(self, "target")
elseif event == "PLAYER_FOCUS_CHANGED" then
FindAuras(self, "focus")
elseif event == "PLAYER_ENTERING_WORLD" or event == "SPELL_UPDATE_COOLDOWN" then
if event == "PLAYER_ENTERING_WORLD" then
local _, instanceType = IsInInstance()
if instanceType == "raid" or instanceType == "pvp" then
if self:IsEventRegistered("UNIT_AURA") then
self:UnregisterEvent("UNIT_AURA")
self:SetScript("OnUpdate", function(timer, elapsed)
timer.elapsed = (timer.elapsed or 0) + elapsed
if timer.elapsed < 0.1 then return end
timer.elapsed = 0
for spid in pairs(self.actives) do
if self.actives[spid].data.filter ~= "CD" and self.actives[spid].data.filter ~= "ICD" then
self.actives[spid] = nil
end
end
FindAuras(self, "player")
if UnitExists("target") then
FindAuras(self, "target")
end
if UnitExists("pet") then
FindAuras(self, "pet")
end
if UnitExists("focus") then
FindAuras(self, "focus")
end
end)
end
else
if self:GetScript("OnUpdate") then
self:SetScript("OnUpdate", nil)
self:RegisterEvent("UNIT_AURA")
end
end
for spid in pairs(self.actives) do
if self.actives[spid].data.filter ~= "CD" and self.actives[spid].data.filter ~= "ICD" then
self.actives[spid] = nil
end
end
FindAuras(self, "player")
if UnitExists("pet") then
FindAuras(self, "pet")
end
elseif event == "SPELL_UPDATE_COOLDOWN" then
for spid in pairs(self.actives) do
if self.actives[spid].data.filter == "CD" then
self.actives[spid] = nil
end
end
end
for i = 1, #C["filger_spells"][T.class][self.Id], 1 do
local data = C["filger_spells"][T.class][self.Id][i]
if data.filter == "CD" and (not data.spec or data.spec == T.Spec) then
local name, icon, start, duration, spid
if data.spellID then
name, _, icon = GetSpellInfo(data.spellID)
if name then
if data.absID then
start, duration = GetSpellCooldown(data.spellID)
else
start, duration = GetSpellCooldown(name)
end
spid = data.spellID
end
elseif data.slotID then
spid = data.slotID
local slotLink = GetInventoryItemLink("player", data.slotID)
if slotLink then
name, _, _, _, _, _, _, _, _, icon = GetItemInfo(slotLink)
start, duration = GetInventoryItemCooldown("player", data.slotID)
end
end
if name and (duration or 0) > 1.5 and duration < 900 then
if not (T.class == "DEATHKNIGHT" and data.filter == "CD" and duration < 10) then -- Filter rune cd
self.actives[spid] = {data = data, name = name, icon = icon, count = nil, start = start, duration = duration, spid = spid, sort = data.sort}
end
end
end
end
Filger.DisplayActives(self)
end
end
if C["filger_spells"] and C["filger_spells"]["ALL"] then
if not C["filger_spells"][T.class] then
C["filger_spells"][T.class] = {}
end
for i = 1, #C["filger_spells"]["ALL"], 1 do
local merge = false
local spellListAll = C["filger_spells"]["ALL"][i]
local spellListClass = nil
for j = 1, #C["filger_spells"][T.class], 1 do
spellListClass = C["filger_spells"][T.class][j]
local mergeAll = spellListAll.Merge or false
local mergeClass = spellListClass.Merge or false
if spellListClass.Name == spellListAll.Name and (mergeAll or mergeClass) then
merge = true
break
end
end
if not merge or not spellListClass then
table.insert(C["filger_spells"][T.class], C["filger_spells"]["ALL"][i])
else
for j = 1, #spellListAll, 1 do
table.insert(spellListClass, spellListAll[j])
end
end
end
end
for _, spell in pairs(C.filger.buff_spells_list) do
if spell[2] == T.class then
tinsert(T.CustomFilgerSpell, {"P_BUFF_ICON", {spellID = spell[1], unitID = "player", caster = "player", filter = "BUFF", absID = true}})
end
end
for _, spell in pairs(C.filger.proc_spells_list) do
if spell[2] == T.class then
tinsert(T.CustomFilgerSpell, {"P_PROC_ICON", {spellID = spell[1], unitID = "player", caster = "player", filter = "BUFF", absID = true}})
end
end
for _, spell in pairs(C.filger.debuff_spells_list) do
if spell[2] == T.class then
tinsert(T.CustomFilgerSpell, {"T_DEBUFF_ICON", {spellID = spell[1], unitID = "target", caster = "player", filter = "DEBUFF", absID = true}})
end
end
for _, spell in pairs(C.filger.aura_bar_spells_list) do
if spell[2] == T.class then
tinsert(T.CustomFilgerSpell, {"T_DE/BUFF_BAR", {spellID = spell[1], unitID = "target", caster = "player", filter = "DEBUFF", absID = true}})
end
end
for _, spell in pairs(C.filger.cd_spells_list) do
if spell[2] == T.class then
tinsert(T.CustomFilgerSpell, {"COOLDOWN", {spellID = spell[1], filter = "CD", absID = true}})
end
end
local ignoreTable = {}
for _, spell in pairs(C.filger.ignore_spells_list) do
if spell[2] == T.class then
ignoreTable[GetSpellInfo(spell[1])] = true
end
end
if C["filger_spells"] and C["filger_spells"][T.class] then
for class in pairs(C["filger_spells"]) do
if class ~= T.class then
C["filger_spells"][class] = nil
end
end
local idx = {}
for i = 1, #C["filger_spells"][T.class], 1 do
local jdx = {}
local data = C["filger_spells"][T.class][i]
local group = {spells = {}}
for _, import in pairs(T.CustomFilgerSpell) do
if data.Name == import[1] then
tinsert(data, import[2])
end
end
for j = 1, #data, 1 do
local name
if data[j].spellID then
name = GetSpellInfo(data[j].spellID)
else
local slotLink = GetInventoryItemLink("player", data[j].slotID)
if slotLink then
name = GetItemInfo(slotLink)
end
end
if name and not ignoreTable[name] or data[j].slotID then
local id = data[j].absID and data[j].spellID or GetSpellInfo(data[j].spellID) or data[j].slotID
data[j].sort = j
group.spells[id] = data[j]
end
if not name and not data[j].slotID then
print("|cffff0000WARNING: spell/slot ID ["..(data[j].spellID or data[j].slotID or "UNKNOWN").."] no longer exists! Report this to Shestak.|r")
table.insert(jdx, j)
end
if ignoreTable[name] then
table.insert(jdx, j)
end
end
for _, v in ipairs(jdx) do
table.remove(data, v)
end
group.data = data
table.insert(SpellGroups, i, group)
if #data == 0 then
print("|cffff0000WARNING: section ["..data.Name.."] is empty! Report this to Shestak.|r")
table.insert(idx, i)
end
end
for _, v in ipairs(idx) do
table.remove(C["filger_spells"][T.class], v)
end
local isEnabled = {
["P_BUFF_ICON"] = C.filger.show_buff,
["P_PROC_ICON"] = C.filger.show_proc,
["T_DEBUFF_ICON"] = C.filger.show_debuff,
["T_DE/BUFF_BAR"] = C.filger.show_aura_bar,
["PVE/PVP_CC"] = C.filger.show_aura_bar,
["SPECIAL_P_BUFF_ICON"] = C.filger.show_special,
["PVE/PVP_DEBUFF"] = C.filger.show_pvp_player,
["T_BUFF"] = C.filger.show_pvp_target,
["COOLDOWN"] = C.filger.show_cd,
}
for i = 1, #SpellGroups, 1 do
local data = SpellGroups[i].data
if isEnabled[data.Name] then
local frame = CreateFrame("Frame", "FilgerFrame"..i.."_"..data.Name, T_PetBattleFrameHider)
frame.Id = i
frame.Name = data.Name
frame.Direction = data.Direction or "DOWN"
frame.IconSide = data.IconSide or "LEFT"
frame.Mode = data.Mode or "ICON"
frame.Interval = data.Interval or 3
frame:SetAlpha(data.Alpha or 1)
frame.IconSize = data.IconSize or C.filger.buffs_size
frame.BarWidth = data.BarWidth or 186
frame.Position = data.Position or "CENTER"
frame:SetPoint(unpack(data.Position))
frame.actives = {}
if C.filger.test_mode then
frame.actives = {}
for j = 1, math.min(C.filger.max_test_icon, #C["filger_spells"][T.class][i]), 1 do
local data = C["filger_spells"][T.class][i][j]
local name, icon
if data.spellID then
name, _, icon = GetSpellInfo(data.spellID)
elseif data.slotID then
local slotLink = GetInventoryItemLink("player", data.slotID)
if slotLink then
name, _, _, _, _, _, _, _, _, icon = GetItemInfo(slotLink)
end
end
frame.actives[j] = {data = data, name = name, icon = icon, count = 9, start = 0, duration = 0, spid = data.spellID or data.slotID, sort = data.sort}
end
Filger.DisplayActives(frame)
else
for j = 1, #C["filger_spells"][T.class][i], 1 do
local data = C["filger_spells"][T.class][i][j]
if data.filter == "BUFF" or data.filter == "DEBUFF" or (data.filter == "ICD" and (data.trigger == "BUFF" or data.trigger == "DEBUFF")) then
frame:RegisterEvent("UNIT_AURA")
elseif data.filter == "CD" then
frame:RegisterEvent("SPELL_UPDATE_COOLDOWN")
elseif data.trigger == "NONE" then
frame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
end
if data.unitID == "target" then
frame:RegisterEvent("PLAYER_TARGET_CHANGED")
elseif data.unitID == "focus" then
frame:RegisterEvent("PLAYER_FOCUS_CHANGED")
end
end
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", Filger.OnEvent)
end
end
end
end
================================================
FILE: ShestakUI/Modules/Auras/RaidBuffsReminder.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.reminder.raid_buffs_enable ~= true then return end
----------------------------------------------------------------------------------------
-- Raid buffs on player(by Elv22)
----------------------------------------------------------------------------------------
local flaskbuffs = T.ReminderBuffs["Flask"]
local battleelixirbuffs = T.ReminderBuffs["BattleElixir"]
local guardianelixirbuffs = T.ReminderBuffs["GuardianElixir"]
local foodbuffs = T.ReminderBuffs["Food"]
local staminabuffs = T.ReminderBuffs["Stamina"]
local versbuffs = T.ReminderBuffs["Vers"]
local reducebuffs = T.ReminderBuffs["Reduce"]
local custombuffs = T.ReminderBuffs["Custom"]
local visible, flask, battleelixir, guardianelixir, food, stamina, vers, spell4, reduce, custom, weapon
local playerBuff = {}
local icons = {}
local UpdatePositions
local function CheckElixir()
if #battleelixirbuffs > 0 then
for i = 1, #battleelixirbuffs do
local name, icon = unpack(battleelixirbuffs[i])
if playerBuff[name] then
FlaskFrame.t:SetTexture(icon)
battleelixir = true
break
else
battleelixir = false
end
end
end
if #guardianelixirbuffs > 0 then
for i = 1, #guardianelixirbuffs do
local name, icon = unpack(guardianelixirbuffs[i])
if playerBuff[name] then
guardianelixir = true
if not battleelixir then
FlaskFrame.t:SetTexture(icon)
end
break
else
guardianelixir = false
end
end
end
if guardianelixir == true and battleelixir == true then
FlaskFrame:SetAlpha(C.reminder.raid_buffs_alpha)
flask = true
return
else
FlaskFrame:SetAlpha(1)
flask = false
end
end
local function CheckWeaponBuff()
local weaponBuff = false
local weaponOffBuff = false
local hasMainHandEnchant, _, _, _, hasOffHandEnchant = GetWeaponEnchantInfo()
if hasMainHandEnchant then
weaponBuff = true
end
local OffhandHasWeapon = C_PaperDollInfo.OffhandHasWeapon()
if not OffhandHasWeapon or OffhandHasWeapon and hasOffHandEnchant then
weaponOffBuff = true
end
if weaponBuff == true and weaponOffBuff == true then
WeaponFrame:SetAlpha(C.reminder.raid_buffs_alpha)
weapon = true
return
else
WeaponFrame:SetAlpha(1)
weapon = false
end
end
local function OnAuraChange(_, event, arg1)
if (event == "UNIT_AURA" or event == "UNIT_INVENTORY_CHANGED") and arg1 ~= "player" then return end
wipe(playerBuff)
local i = 1
while true do
local name = UnitBuff("player", i)
if not name then break end
playerBuff[name] = true
i = i + 1
end
-- If We're a caster we may want to see different buffs
if T.Role == "Caster" or T.Role == "Healer" then
T.ReminderCasterBuffs()
else
T.ReminderPhysicalBuffs()
end
-- Start checking buffs to see if we can find a match from the list
for i = 1, #flaskbuffs do
local name, icon = unpack(flaskbuffs[i])
if i == 1 then
FlaskFrame.t:SetTexture(icon)
end
if playerBuff[name] then
FlaskFrame:SetAlpha(C.reminder.raid_buffs_alpha)
flask = true
break
else
CheckElixir()
end
end
for i = 1, #foodbuffs do
local name, icon = unpack(foodbuffs[i])
if i == 1 then
FoodFrame.t:SetTexture(icon)
end
if playerBuff[name] then
FoodFrame:SetAlpha(C.reminder.raid_buffs_alpha)
food = true
break
else
FoodFrame:SetAlpha(1)
food = false
end
end
do
WeaponFrame.t:SetTexture(135250)
CheckWeaponBuff()
end
for i = 1, #staminabuffs do
local name, icon = unpack(staminabuffs[i])
if i == 1 then
StaminaFrame.t:SetTexture(icon)
end
if playerBuff[name] then
StaminaFrame:SetAlpha(C.reminder.raid_buffs_alpha)
stamina = true
break
else
StaminaFrame:SetAlpha(1)
stamina = false
end
end
for i = 1, #versbuffs do
local name, icon = unpack(versbuffs[i])
if i == 1 then
VersFrame.t:SetTexture(icon)
end
if playerBuff[name] then
VersFrame:SetAlpha(C.reminder.raid_buffs_alpha)
vers = true
break
else
VersFrame:SetAlpha(1)
vers = false
end
end
for i = 1, #Spell4Buff do
local name, icon = unpack(Spell4Buff[i])
if i == 1 then
Spell4Frame.t:SetTexture(icon)
end
if playerBuff[name] then
Spell4Frame:SetAlpha(C.reminder.raid_buffs_alpha)
spell4 = true
break
else
Spell4Frame:SetAlpha(1)
spell4 = false
end
end
for i = 1, #reducebuffs do
local name, icon = unpack(reducebuffs[i])
if i == 1 then
ReduceFrame.t:SetTexture(icon)
end
if playerBuff[name] then
ReduceFrame:SetAlpha(C.reminder.raid_buffs_alpha)
reduce = true
break
else
ReduceFrame:SetAlpha(1)
reduce = false
end
end
if #custombuffs > 0 then
for i = 1, #custombuffs do
local name, icon = unpack(custombuffs[i])
if i == 1 then
CustomFrame.t:SetTexture(icon)
end
if playerBuff[name] then
CustomFrame:SetAlpha(C.reminder.raid_buffs_alpha)
custom = true
break
else
CustomFrame:SetAlpha(1)
custom = false
end
end
else
CustomFrame:Hide()
custom = true
end
UpdatePositions()
local _, instanceType = IsInInstance()
if (not IsInGroup() or instanceType ~= "raid") and C.reminder.raid_buffs_always == false then
RaidBuffReminder:SetAlpha(0)
visible = false
elseif flask == true and food == true and stamina == true and spell4 == true and custom == true and weapon == true and vers == true and reduce == true then
if not visible then
RaidBuffReminder:SetAlpha(0)
visible = false
end
if visible then
UIFrameFadeOut(RaidBuffReminder, 0.5)
visible = false
end
else
if not visible then
UIFrameFadeIn(RaidBuffReminder, 0.5)
visible = true
end
end
end
-- Create Anchor
local RaidBuffsAnchor = CreateFrame("Frame", "RaidBuffsAnchor", UIParent)
RaidBuffsAnchor:SetWidth((C.reminder.raid_buffs_size * 6) + 15)
RaidBuffsAnchor:SetHeight(C.reminder.raid_buffs_size)
RaidBuffsAnchor:SetPoint(unpack(C.position.raid_buffs))
-- Create Main bar
local raidbuff_reminder = CreateFrame("Frame", "RaidBuffReminder", UIParent)
raidbuff_reminder:CreatePanel("Invisible", (C.reminder.raid_buffs_size * 6) + 15, C.reminder.raid_buffs_size + 4, "TOPLEFT", RaidBuffsAnchor, "TOPLEFT", 0, 4)
raidbuff_reminder:RegisterEvent("UNIT_AURA")
raidbuff_reminder:RegisterEvent("PLAYER_ENTERING_WORLD")
raidbuff_reminder:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
raidbuff_reminder:RegisterEvent("ZONE_CHANGED_NEW_AREA")
raidbuff_reminder:RegisterEvent("UNIT_INVENTORY_CHANGED")
raidbuff_reminder:SetScript("OnEvent", OnAuraChange)
local line = math.ceil(C.minimap.size / (C.reminder.raid_buffs_size + 2))
local buffButtons = {
"FlaskFrame",
"FoodFrame",
"WeaponFrame",
"StaminaFrame",
"VersFrame",
"Spell4Frame",
"ReduceFrame",
"CustomFrame",
}
for i = 1, #buffButtons do
local name = buffButtons[i]
local button = CreateFrame("Frame", name, RaidBuffReminder)
if i == 1 then
button:CreatePanel("Default", C.reminder.raid_buffs_size, C.reminder.raid_buffs_size, "BOTTOMLEFT", RaidBuffReminder, "BOTTOMLEFT", 0, 0)
elseif i == line then
button:CreatePanel("Default", C.reminder.raid_buffs_size, C.reminder.raid_buffs_size, "BOTTOM", buffButtons[1], "TOP", 0, 3)
else
button:CreatePanel("Default", C.reminder.raid_buffs_size, C.reminder.raid_buffs_size, "LEFT", buffButtons[i-1], "RIGHT", 3, 0)
end
button:SetFrameLevel(RaidBuffReminder:GetFrameLevel() + 2)
button.t = button:CreateTexture(name..".t", "OVERLAY")
button.t:CropIcon()
tinsert(icons, button)
end
function UpdatePositions()
local line = math.ceil(C.minimap.size / (C.reminder.raid_buffs_size + 2))
local first
for i = 1, #icons do
local buff = icons[i]
buff:ClearAllPoints()
if buff:GetAlpha() == C.reminder.raid_buffs_alpha then
line = line + 1
else
if not first then
buff:SetPoint("BOTTOMLEFT", RaidBuffReminder, "BOTTOMLEFT", 0, 0)
first = true
else
buff:SetPoint("LEFT", previousBuff, "RIGHT", 3, 0)
end
previousBuff = buff
if i >= line then
buff:SetAlpha(0)
else
buff:SetAlpha(1)
end
end
end
end
================================================
FILE: ShestakUI/Modules/Auras/SelfBuffsReminder.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.reminder.solo_buffs_enable ~= true then return end
----------------------------------------------------------------------------------------
-- Self buffs on player(by Tukz and Elv22)
----------------------------------------------------------------------------------------
local tab = T.ReminderSelfBuffs[T.class]
if not tab then return end
local playerBuff = {}
local function OnEvent(self, event, arg1)
local group = tab[self.id]
if not group.spells then return end
if not GetSpecialization() then return end
if (event == "UNIT_AURA" or event == "UNIT_INVENTORY_CHANGED") and arg1 ~= "player" then return end
if group.level and T.level < group.level then return end
self:Hide()
for i = 1, #group.spells do
local name, icon = unpack(group.spells[i])
local usable, nomana = IsUsableSpell(name)
if usable or nomana or group.level then
self.icon:SetTexture(icon)
break
else
self.icon:SetTexture(nil)
end
end
if event == "PLAYER_LOGIN" then
if not self.icon:GetTexture() then
self:UnregisterAllEvents()
self:RegisterEvent("LEARNED_SPELL_IN_TAB")
end
return
end
if event == "LEARNED_SPELL_IN_TAB" and self.icon:GetTexture() then
self:UnregisterAllEvents()
self:RegisterEvent("UNIT_AURA")
self:RegisterEvent("UNIT_ENTERED_VEHICLE")
self:RegisterEvent("UNIT_EXITED_VEHICLE")
if group.combat then
self:RegisterEvent("PLAYER_REGEN_ENABLED")
self:RegisterEvent("PLAYER_REGEN_DISABLED")
end
if group.instance or group.pvp then
self:RegisterEvent("ZONE_CHANGED_NEW_AREA")
end
end
if group.mainhand or group.offhand then
self:RegisterEvent("UNIT_INVENTORY_CHANGED")
end
local role = group.role
local spec = group.spec
local reversecheck = group.reversecheck
local canplaysound = false
local rolepass = true
local specpass = true
local _, instanceType, difficultyID = GetInstanceInfo()
if role and role ~= T.Role then
rolepass = false
end
if spec and spec ~= T.Spec then
specpass = false
end
-- Prevent user error
if reversecheck ~= nil and (role == nil and spec == nil) then reversecheck = nil end
-- Check event to play sound
if (event == "ZONE_CHANGED_NEW_AREA" or event == "PLAYER_REGEN_DISABLED") and C.reminder.solo_buffs_sound == true then canplaysound = true end
if ((group.combat and UnitAffectingCombat("player")) or (group.instance and difficultyID ~= 0 and not C_Garrison.IsOnGarrisonMap()) or (group.pvp and (instanceType == "arena" or instanceType == "pvp"))) and
specpass == true and rolepass == true and not UnitInVehicle("player") then
if group.mainhand then
local hasMainHandEnchant = GetWeaponEnchantInfo()
if not hasMainHandEnchant then
self:Show()
if canplaysound == true then PlaySoundFile(C.media.warning_sound, "Master") end
end
return
elseif group.offhand then
local _, _, _, _, hasOffHandEnchant = GetWeaponEnchantInfo()
if not hasOffHandEnchant and C_PaperDollInfo.OffhandHasWeapon() then
self:Show()
if canplaysound == true then PlaySoundFile(C.media.warning_sound, "Master") end
end
return
end
wipe(playerBuff)
local i = 1
while true do
local name = UnitBuff("player", i)
if not name then break end
playerBuff[name] = true
i = i + 1
end
if reversecheck then
if group.negate_reversecheck and group.negate_reversecheck == T.Spec then self:Hide() return end
for i = 1, #group.spells do
local name = group.spells[i][1]
if name and playerBuff[name] then
self:Show()
if canplaysound == true then PlaySoundFile(C.media.warning_sound, "Master") end
return
end
end
else
for i = 1, #group.spells do
local name = group.spells[i][1]
if name and playerBuff[name] then
self:Hide()
return
end
end
self:Show()
if canplaysound == true then PlaySoundFile(C.media.warning_sound, "Master") end
end
end
end
for i = 1, #tab do
local frame = CreateFrame("Frame", "ReminderFrame"..i, UIParent)
frame:CreatePanel("Default", C.reminder.solo_buffs_size, C.reminder.solo_buffs_size, unpack(C.position.self_buffs))
frame:SetFrameLevel(6)
frame.id = i
frame.icon = frame:CreateTexture(nil, "OVERLAY")
frame.icon:CropIcon()
frame.icon:SetSize(C.reminder.solo_buffs_size, C.reminder.solo_buffs_size)
frame:Hide()
frame:RegisterEvent("UNIT_AURA")
frame:RegisterEvent("PLAYER_LOGIN")
frame:RegisterEvent("PLAYER_REGEN_ENABLED")
frame:RegisterEvent("PLAYER_REGEN_DISABLED")
frame:RegisterEvent("ZONE_CHANGED_NEW_AREA")
frame:RegisterEvent("UNIT_ENTERED_VEHICLE")
frame:RegisterEvent("UNIT_EXITED_VEHICLE")
frame:SetScript("OnEvent", OnEvent)
frame:SetScript("OnUpdate", function(self)
if not self.icon:GetTexture() then
self:Hide()
end
end)
frame:SetScript("OnShow", function(self)
if not self.icon:GetTexture() then
self:Hide()
end
end)
end
================================================
FILE: ShestakUI/Modules/Automation/AutoInvite.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Accept invites from guild members or friend list(by ALZA)
----------------------------------------------------------------------------------------
if C.automation.accept_invite == true then
local function CheckFriend(inviterGUID)
if C_BattleNet.GetAccountInfoByGUID(inviterGUID) or C_FriendList.IsFriend(inviterGUID) or IsGuildMember(inviterGUID) then
return true
end
end
local ai = CreateFrame("Frame")
ai:RegisterEvent("PARTY_INVITE_REQUEST")
ai:SetScript("OnEvent", function(_, _, name, _, _, _, _, _, inviterGUID)
if QueueStatusButton:IsShown() or GetNumGroupMembers() > 0 then return end
if CheckFriend(inviterGUID) then
RaidNotice_AddMessage(RaidWarningFrame, L_INFO_INVITE..name, {r = 0.41, g = 0.8, b = 0.94}, 3)
print(format("|cffffff00"..L_INFO_INVITE..name..".|r"))
AcceptGroup()
for i = 1, STATICPOPUP_NUMDIALOGS do
local frame = _G["StaticPopup"..i]
if frame:IsVisible() and frame.which == "PARTY_INVITE" then
frame.inviteAccepted = 1
StaticPopup_Hide("PARTY_INVITE")
return
elseif frame:IsVisible() and frame.which == "PARTY_INVITE_XREALM" then
frame.inviteAccepted = 1
StaticPopup_Hide("PARTY_INVITE_XREALM")
return
end
end
end
end)
end
----------------------------------------------------------------------------------------
-- Auto invite by whisper(by Tukz)
----------------------------------------------------------------------------------------
if T.client == "ruRU" then
C.automation.invite_keyword = "инв inv +"
end
local list_keyword = {}
for word in gmatch(C.automation.invite_keyword, "%S+") do
list_keyword[word] = true
end
local autoinvite = CreateFrame("Frame")
autoinvite:RegisterEvent("CHAT_MSG_WHISPER")
autoinvite:RegisterEvent("CHAT_MSG_BN_WHISPER")
autoinvite:SetScript("OnEvent", function(_, event, arg1, arg2, ...)
if not C.automation.whisper_invite then return end
if ((not UnitExists("party1") or UnitIsGroupLeader("player") or UnitIsGroupAssistant("player"))) and not QueueStatusButton:IsShown() then
for word in pairs(list_keyword) do
if arg1:lower():match(word) then
if event == "CHAT_MSG_WHISPER" then
C_PartyInfo.InviteUnit(arg2)
elseif event == "CHAT_MSG_BN_WHISPER" then
local bnetIDAccount = select(11, ...)
local accountInfo = C_BattleNet.GetAccountInfoByID(bnetIDAccount)
BNInviteFriend(accountInfo.gameAccountInfo.gameAccountID)
end
end
end
end
end)
================================================
FILE: ShestakUI/Modules/Automation/AutoOpens.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.open_items ~= true then return end
----------------------------------------------------------------------------------------
-- Auto opening of items in bag (kAutoOpen by Kellett)
----------------------------------------------------------------------------------------
local frame, atBank, atMail, atMerchant = CreateFrame("Frame")
frame:SetScript("OnEvent", function(self, event, ...) self[event](...) end)
function frame:Register(event, func)
self:RegisterEvent(event)
self[event] = function(...)
func(...)
end
end
frame:Register("BANKFRAME_OPENED", function()
atBank = true
end)
frame:Register("BANKFRAME_CLOSED", function()
atBank = false
end)
frame:Register("PLAYER_INTERACTION_MANAGER_FRAME_SHOW", function(...)
local type = ...
if type == 10 then -- Guild bank
atBank = true
end
end)
frame:Register("PLAYER_INTERACTION_MANAGER_FRAME_HIDE", function(...)
local type = ...
if type == 10 then -- Guild bank
atBank = false
end
end)
frame:Register("MAIL_SHOW", function()
atMail = true
end)
frame:Register("MAIL_CLOSED", function()
atMail = false
end)
frame:Register("MERCHANT_SHOW", function()
atMerchant = true
end)
frame:Register("MERCHANT_CLOSED", function()
atMerchant = false
end)
frame:Register("BAG_UPDATE_DELAYED", function()
if atBank or atMail or atMerchant then return end
for bag = 0, 4 do
for slot = 0, C_Container.GetContainerNumSlots(bag) do
local _, _, locked, _, _, lootable, _, _, _, id = GetContainerItemInfo(bag, slot)
if lootable and not locked and id and T.OpenItems[id] then
print("|cffff0000"..OPENING..": "..C_Container.GetContainerItemLink(bag, slot)..".|r")
C_Container.UseContainerItem(bag, slot)
return
end
end
end
end)
================================================
FILE: ShestakUI/Modules/Automation/AutoRelease.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.release ~= true then return end
----------------------------------------------------------------------------------------
-- Auto release the spirit in battlegrounds
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_DEAD")
frame:SetScript("OnEvent", function()
local inBattlefield = false
for i = 1, GetMaxBattlefieldID() do
local status = GetBattlefieldStatus(i)
if status == "active" then inBattlefield = true end
end
if C_DeathInfo.GetSelfResurrectOptions() and #C_DeathInfo.GetSelfResurrectOptions() > 0 then return end
local areaID = C_Map.GetBestMapForUnit("player") or 0
if areaID == 123 or areaID == 244 or areaID == 588 or areaID == 622 or areaID == 624 or inBattlefield == true then
RepopMe()
end
end)
================================================
FILE: ShestakUI/Modules/Automation/BuffOnScroll.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.buff_on_scroll ~= true or T.level ~= MAX_PLAYER_LEVEL then return end
----------------------------------------------------------------------------------------
-- Cast buff on mouse scroll(by Gsuz)
----------------------------------------------------------------------------------------
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
local spells = {
DRUID = {
[SpellName(1126)] = true, -- Mark of the Wild
},
EVOKER = {
[SpellName(364342)] = true, -- Blessing of the Bronze
},
MAGE = {
[SpellName(1459)] = true, -- Arcane Intellect
},
PRIEST = {
[SpellName(21562)] = true, -- Power Word: Fortitude
},
WARRIOR = {
[SpellName(6673)] = true, -- Battle Shout
},
}
local specSpells = spells[T.class]
local frame = CreateFrame("Frame")
-- Function for waiting through the global cooldown
local GcTimer, CheckBuffs = 0
local function WaitForGC(_, elapsed)
GcTimer = GcTimer + elapsed
if GcTimer >= 1.5 then
CheckBuffs()
frame:SetScript("OnUpdate", nil)
GcTimer = 0
end
end
-- Create Secure Action Button for better control
local btn = CreateFrame("Button", "AutoBuffButton", UIParent, "SecureActionButtonTemplate")
btn:SetAttribute("type", "action")
btn:SetAttribute("action", 1)
btn:SetAttribute("type", "spell")
btn:SetAttribute("unit", "player")
-- Main function for changing keybinding to mousewheel when a buff is needed
function CheckBuffs()
if IsFlying() or IsMounted() or UnitIsDeadOrGhost("Player") or InCombatLockdown() then return end
ClearOverrideBindings(btn)
btn:SetAttribute("spell", nil)
if specSpells then
for name in pairs(specSpells) do
if name and not T.CheckPlayerBuff(name) then
if GetSpellCooldown(name) == 0 then
btn:SetAttribute("spell", name)
SetOverrideBindingClick(btn, true, "MOUSEWHEELUP", "AutoBuffButton")
SetOverrideBindingClick(btn, true, "MOUSEWHEELDOWN", "AutoBuffButton")
else
local _, duration = GetSpellCooldown(name)
if duration == nil or duration > 1.5 then return end
frame:SetScript("OnUpdate", WaitForGC)
end
end
end
end
end
-- Events that will trigger the Main Function
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterEvent("UNIT_AURA")
frame:RegisterEvent("SPELL_UPDATE_USABLE")
frame:RegisterEvent("SPELL_UPDATE_COOLDOWN")
frame:RegisterEvent("PLAYER_LEAVE_COMBAT")
frame:RegisterEvent("READY_CHECK")
frame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
frame:SetScript("OnEvent", CheckBuffs)
================================================
FILE: ShestakUI/Modules/Automation/CancelBadBuffs.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.cancel_bad_buffs ~= true then return end
----------------------------------------------------------------------------------------
-- Auto cancel various buffs(by Unknown)
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("UNIT_AURA")
frame:SetScript("OnEvent", function(_, event, unit)
if event == "UNIT_AURA" and unit == "player" and not InCombatLockdown() then
local i = 1
while true do
local name = UnitBuff(unit, i)
if not name then return end
if T.BadBuffs[name] then
CancelSpellByName(name)
print("|cffffff00"..ACTION_SPELL_AURA_REMOVED.." ["..name.."].|r")
end
i = i + 1
end
end
end)
================================================
FILE: ShestakUI/Modules/Automation/DeclineDuel.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.decline_duel ~= true then return end
----------------------------------------------------------------------------------------
-- Auto decline duel
----------------------------------------------------------------------------------------
local disable = false
local frame = CreateFrame("Frame")
frame:RegisterEvent("DUEL_REQUESTED")
frame:RegisterEvent("PET_BATTLE_PVP_DUEL_REQUESTED")
frame:SetScript("OnEvent", function(_, event, name)
if disable == true then return end
if event == "DUEL_REQUESTED" then
CancelDuel()
RaidNotice_AddMessage(RaidWarningFrame, L_INFO_DUEL..name, {r = 0.41, g = 0.8, b = 0.94}, 3)
print(format("|cffffff00"..L_INFO_DUEL..name.."."))
StaticPopup_Hide("DUEL_REQUESTED")
elseif event == "PET_BATTLE_PVP_DUEL_REQUESTED" then
C_PetBattles.CancelPVPDuel()
RaidNotice_AddMessage(RaidWarningFrame, L_INFO_PET_DUEL..name, {r = 0.41, g = 0.8, b = 0.94}, 3)
print(format("|cffffff00"..L_INFO_PET_DUEL..name.."."))
StaticPopup_Hide("PET_BATTLE_PVP_DUEL_REQUESTED")
end
end)
SlashCmdList.DISABLEDECLINE = function()
if not disable then
disable = true
else
disable = false
end
end
SLASH_DISABLEDECLINE1 = "/disduel"
SLASH_DISABLEDECLINE2 = "/вшывгуд"
================================================
FILE: ShestakUI/Modules/Automation/LoggingCombat.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.logging_combat ~= true then return end
----------------------------------------------------------------------------------------
-- Auto enables combat log text file in raid instances(EasyLogger by Sildor)
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function()
local _, instanceType = IsInInstance()
if instanceType == "raid" and IsInRaid(LE_PARTY_CATEGORY_HOME) then
if not LoggingCombat() then
LoggingCombat(1)
print("|cffffff00"..COMBATLOGENABLED.."|r")
end
else
if LoggingCombat() then
LoggingCombat(0)
print("|cffffff00"..COMBATLOGDISABLED.."|r")
end
end
end)
================================================
FILE: ShestakUI/Modules/Automation/Resurrection.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.resurrection ~= true then return end
----------------------------------------------------------------------------------------
-- Auto confirm resurrection
----------------------------------------------------------------------------------------
local AutoResurrect = CreateFrame("Frame")
AutoResurrect:RegisterEvent("RESURRECT_REQUEST")
AutoResurrect:SetScript("OnEvent", function(_, event, name)
if event == "RESURRECT_REQUEST" then
if not UnitAffectingCombat(name) then
AcceptResurrect()
StaticPopup_Hide("RESURRECT_NO_TIMER")
C_Timer.After(2, function()
DoEmote("thank", name)
end)
end
end
end)
================================================
FILE: ShestakUI/Modules/Automation/Screenshots.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.screenshot ~= true then return end
----------------------------------------------------------------------------------------
-- Take screenshots of defined events (Sinaris)
----------------------------------------------------------------------------------------
local function OnEvent()
C_Timer.After(1, function() Screenshot() end)
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("ACHIEVEMENT_EARNED")
frame:SetScript("OnEvent", OnEvent)
================================================
FILE: ShestakUI/Modules/Automation/SetRole.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.auto_role ~= true then return end
----------------------------------------------------------------------------------------
-- Automatically sets your role(Auto role setter by iSpawnAtHome)
----------------------------------------------------------------------------------------
local prev = 0
local function SetRole()
if T.level >= 10 and not InCombatLockdown() and IsInGroup() and not IsPartyLFG() then
local spec = GetSpecialization()
if spec then
local role = GetSpecializationRole(spec)
if UnitGroupRolesAssigned("player") ~= role then
local t = GetTime()
if t - prev > 2 then
prev = t
UnitSetRole("player", role)
end
end
else
UnitSetRole("player", "No Role")
end
end
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_TALENT_UPDATE")
frame:RegisterEvent("GROUP_ROSTER_UPDATE")
frame:SetScript("OnEvent", SetRole)
RolePollPopup:UnregisterEvent("ROLE_POLL_BEGIN")
================================================
FILE: ShestakUI/Modules/Automation/SkipCinematic.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.skip_cinematic ~= true then return end
----------------------------------------------------------------------------------------
-- Skip cinematics/movies(CinematicSkip by Pigmonkey)
----------------------------------------------------------------------------------------
-- Cancel cinematics after they start
local frame = CreateFrame("Frame")
frame:RegisterEvent("CINEMATIC_START")
frame:SetScript("OnEvent", function(_, event)
if event == "CINEMATIC_START" then
if not IsControlKeyDown() then
CinematicFrame_CancelCinematic()
end
end
end)
-- Hook movies and stop them before they get called
local PlayMovie_hook = MovieFrame_PlayMovie
MovieFrame_PlayMovie = function(...)
if IsControlKeyDown() then
PlayMovie_hook(...)
else
GameMovieFinished()
end
end
================================================
FILE: ShestakUI/Modules/Automation/SolveArtifact.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.solve_artifact ~= true then return end
----------------------------------------------------------------------------------------
-- Auto popup for solve artifact(module from Inomena by p3lim)
----------------------------------------------------------------------------------------
StaticPopupDialogs.ARCHAEOLOGY_SOLVE = {
text = "%s",
button1 = SOLVE,
button2 = CANCEL,
OnAccept = SolveArtifact,
timeout = 0,
preferredIndex = 5,
}
local fragment = {
["1535"] = 1, -- Drust
["1534"] = 2, -- Zandalari
["1174"] = 3, -- Demonic
["1173"] = 4, -- Highmountain
["1172"] = 5, -- Highborne
["828"] = 6, -- Ogre
["821"] = 7, -- Draenor Clans
["829"] = 8, -- Arakkoa
["677"] = 9, -- Mogu
["676"] = 10, -- Pandaren
["754"] = 11, -- Mantid
["399"] = 12, -- Vrykul
["385"] = 13, -- Troll
["401"] = 14, -- Tol'vir
["397"] = 15, -- Orc
["400"] = 16, -- Nerubian
["394"] = 17, -- Night Elf
["393"] = 18, -- Fossil
["398"] = 19, -- Draenei
["384"] = 20, -- Dwarf
}
local frame = CreateFrame("Frame")
frame:RegisterEvent("CHAT_MSG_CURRENCY")
frame:SetScript("OnEvent", function(_, _, msg)
local _, _, currencyID = string.find(msg, "currency:(%d+)");
if not currencyID then return end
local race = fragment[currencyID]
if race then
SetSelectedArtifact(race)
local race, _, stone = GetArchaeologyRaceInfo(race)
local artifact, _, rare, _, _, stones = GetSelectedArtifactInfo()
if not artifact then return end
for index = 1, math.min(stones, GetItemCount(stone)) do
if not ItemAddedToArtifact(index) then
SocketItemToArtifact()
end
end
local fragments, stones, total = GetArtifactProgress()
if fragments + stones >= total then
local color
if rare and rare > 0 then
color = "|cff0070dd"
else
color = "|cff9d9d9d"
end
StaticPopup_Show("ARCHAEOLOGY_SOLVE", string.format("%s %s: %s[%s]|r?", SOLVE, race, color, artifact))
end
end
end)
================================================
FILE: ShestakUI/Modules/Automation/Summon.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.summon ~= true then return end
----------------------------------------------------------------------------------------
-- Auto confirm summon
----------------------------------------------------------------------------------------
local disable = false
local AutoSummon = CreateFrame("Frame")
AutoSummon:RegisterEvent("CONFIRM_SUMMON")
AutoSummon:SetScript("OnEvent", function(_, event)
if event == "CONFIRM_SUMMON" then
if not UnitAffectingCombat("player") and PlayerCanTeleport() then
StaticPopup_Show("CANCEL_SUMMON")
C_Timer.After(10, function()
if disable then return end
if not UnitAffectingCombat("player") and PlayerCanTeleport() then
C_SummonInfo.ConfirmSummon()
StaticPopup_Hide("CONFIRM_SUMMON")
end
end)
end
end
end)
StaticPopupDialogs["CANCEL_SUMMON"] = {
text = LFG_LIST_AUTO_ACCEPT.." ".. string.lower(SUMMONS),
button1 = CANCEL,
OnAccept = function()
disable = true
end,
timeout = 12,
}
================================================
FILE: ShestakUI/Modules/Automation/TabBinder.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.automation.tab_binder ~= true then return end
----------------------------------------------------------------------------------------
-- Auto change Tab key to only target enemy players(RE/TabBinder by Veev/AcidWeb)
----------------------------------------------------------------------------------------
local TabBinder = CreateFrame("Frame")
TabBinder:RegisterEvent("PLAYER_ENTERING_WORLD")
TabBinder:RegisterEvent("ZONE_CHANGED_NEW_AREA")
TabBinder:RegisterEvent("PLAYER_REGEN_ENABLED")
TabBinder:RegisterEvent("DUEL_REQUESTED")
TabBinder:RegisterEvent("DUEL_FINISHED")
TabBinder:RegisterEvent("CHAT_MSG_SYSTEM")
local RTB_Fail, RTB_DefaultKey, LastTargetKey, TargetKey, CurrentBind, Success = false, true
TabBinder:SetScript("OnEvent", function(_, event, ...)
if event == "CHAT_MSG_SYSTEM" then
local RTBChatMessage = ...
if RTBChatMessage == ERR_DUEL_REQUESTED then
event = "DUEL_REQUESTED"
end
elseif event == "ZONE_CHANGED_NEW_AREA" or event == "PLAYER_ENTERING_WORLD" or (event == "PLAYER_REGEN_ENABLED" and RTB_Fail) or event == "DUEL_REQUESTED" or event == "DUEL_FINISHED" then
local BindSet = GetCurrentBindingSet()
if BindSet ~= 1 and BindSet ~= 2 then
return
end
if InCombatLockdown() then
RTB_Fail = true
return
end
local PVPType = GetZonePVPInfo()
local _, ZoneType = IsInInstance()
TargetKey = GetBindingKey("TARGETNEARESTENEMYPLAYER")
if TargetKey == nil then
TargetKey = GetBindingKey("TARGETNEARESTENEMY")
end
if TargetKey == nil and RTB_DefaultKey then
TargetKey = "TAB"
end
LastTargetKey = GetBindingKey("TARGETPREVIOUSENEMYPLAYER")
if LastTargetKey == nil then
LastTargetKey = GetBindingKey("TARGETPREVIOUSENEMY")
end
if LastTargetKey == nil and RTB_DefaultKey then
LastTargetKey = "SHIFT-TAB"
end
if TargetKey then
CurrentBind = GetBindingAction(TargetKey)
end
if ZoneType == "arena" or ZoneType == "pvp" or PVPType == "combat" or event == "DUEL_REQUESTED" then
if CurrentBind ~= "TARGETNEARESTENEMYPLAYER" then
if TargetKey == nil then
Success = true
else
Success = SetBinding(TargetKey, "TARGETNEARESTENEMYPLAYER")
end
if LastTargetKey then
SetBinding(LastTargetKey, "TARGETPREVIOUSENEMYPLAYER")
end
if Success then
SaveBindings(BindSet)
RTB_Fail = false
else
RTB_Fail = true
end
end
else
if CurrentBind ~= "TARGETNEARESTENEMY" then
if TargetKey == nil then
Success = true
else
Success = SetBinding(TargetKey, "TARGETNEARESTENEMY")
end
if LastTargetKey then
SetBinding(LastTargetKey, "TARGETPREVIOUSENEMY")
end
if Success then
SaveBindings(BindSet)
RTB_Fail = false
else
RTB_Fail = true
end
end
end
end
end)
================================================
FILE: ShestakUI/Modules/Blizzard/AlertFrames.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if IsAddOnLoaded("MoveAnything") then return end
----------------------------------------------------------------------------------------
-- AlertFrameMove(by Gethe)
----------------------------------------------------------------------------------------
local AchievementAnchor = CreateFrame("Frame", "AchievementAnchor", UIParent)
AchievementAnchor:SetWidth(230)
AchievementAnchor:SetHeight(50)
AchievementAnchor:SetPoint(unpack(C.position.achievement))
local alertBlacklist = {
GroupLootContainer = C.loot.rolllootframe,
TalkingHeadFrame = true
}
local POSITION, ANCHOR_POINT, YOFFSET, FIRST_YOFFSET = "BOTTOM", "TOP", -9
local function CheckGrow()
local point = AchievementAnchor:GetPoint()
if string.find(point, "TOP") or point == "CENTER" or point == "LEFT" or point == "RIGHT" then
POSITION = "TOP"
ANCHOR_POINT = "BOTTOM"
YOFFSET = 9
FIRST_YOFFSET = YOFFSET - 2
else
POSITION = "BOTTOM"
ANCHOR_POINT = "TOP"
YOFFSET = -9
FIRST_YOFFSET = YOFFSET + 2
end
end
local ReplaceAnchors do
local function QueueAdjustAnchors(self, relativeAlert)
CheckGrow()
for alertFrame in self.alertFramePool:EnumerateActive() do
alertFrame:ClearAllPoints()
alertFrame:SetPoint(POSITION, relativeAlert, ANCHOR_POINT, 0, YOFFSET)
relativeAlert = alertFrame
end
-- if C.loot.rolllootframe then
-- GroupLootContainer:ClearAllPoints()
-- GroupLootContainer:SetPoint(POSITION, relativeAlert, ANCHOR_POINT, 0, YOFFSET)
-- else
-- GroupLootContainer:ClearAllPoints()
-- GroupLootContainer:SetPoint(POSITION, AchievementAnchor, POSITION, 2, FIRST_YOFFSET)
-- end
return relativeAlert
end
local function SimpleAdjustAnchors(self, relativeAlert)
CheckGrow()
if self.alertFrame:IsShown() then
self.alertFrame:ClearAllPoints()
self.alertFrame:SetPoint(POSITION, relativeAlert, ANCHOR_POINT, 0, YOFFSET)
return self.alertFrame
end
return relativeAlert
end
local function AnchorAdjustAnchors(self, relativeAlert)
if self.anchorFrame:IsShown() then
return self.anchorFrame
end
return relativeAlert
end
function ReplaceAnchors(alertFrameSubSystem)
if alertFrameSubSystem.alertFramePool then
if alertBlacklist[alertFrameSubSystem.alertFramePool.frameTemplate] then
return alertFrameSubSystem.alertFramePool.frameTemplate, true
else
alertFrameSubSystem.AdjustAnchors = QueueAdjustAnchors
end
elseif alertFrameSubSystem.alertFrame then
local frame = alertFrameSubSystem.alertFrame
if alertBlacklist[frame:GetName()] then
return frame:GetName(), true
else
alertFrameSubSystem.AdjustAnchors = SimpleAdjustAnchors
end
elseif alertFrameSubSystem.anchorFrame then
local frame = alertFrameSubSystem.anchorFrame
if alertBlacklist[frame:GetName()] then
return frame:GetName(), true
else
alertFrameSubSystem.AdjustAnchors = AnchorAdjustAnchors
end
end
end
end
local function SetUpAlert()
hooksecurefunc(AlertFrame, "UpdateAnchors", function(self)
CheckGrow()
self:ClearAllPoints()
self:SetPoint(POSITION, AchievementAnchor, POSITION, 2, FIRST_YOFFSET)
end)
hooksecurefunc(AlertFrame, "AddAlertFrameSubSystem", function(_, alertFrameSubSystem)
local _, isBlacklisted = ReplaceAnchors(alertFrameSubSystem)
if isBlacklisted then
for i, alertSubSystem in ipairs(AlertFrame.alertFrameSubSystems) do
if alertFrameSubSystem == alertSubSystem then
return table.remove(AlertFrame.alertFrameSubSystems, i)
end
end
end
end)
local remove = {}
for i, alertFrameSubSystem in ipairs(AlertFrame.alertFrameSubSystems) do
local name, isBlacklisted = ReplaceAnchors(alertFrameSubSystem)
if isBlacklisted then
remove[i] = name
end
end
for i in next, remove do
table.remove(AlertFrame.alertFrameSubSystems, i)
end
end
SetUpAlert()
================================================
FILE: ShestakUI/Modules/Blizzard/AltPowerBar.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Skin AltPowerBar(by Tukz)
----------------------------------------------------------------------------------------
-- Get rid of old AltPowerBar
PlayerPowerBarAlt:UnregisterEvent("UNIT_POWER_BAR_SHOW")
PlayerPowerBarAlt:UnregisterEvent("UNIT_POWER_BAR_HIDE")
PlayerPowerBarAlt:UnregisterEvent("PLAYER_ENTERING_WORLD")
-- AltPowerBar
local bar = CreateFrame("Frame", "UIAltPowerBar", UIParent)
bar:SetSize(221, 25)
bar:SetTemplate("Default")
-- Make moveable
bar:EnableMouse(true)
bar:SetMovable(true)
bar:SetFrameStrata("HIGH")
bar:SetScript("OnMouseDown", function(_, button)
if IsAltKeyDown() or IsShiftKeyDown() then
bar:ClearAllPoints()
bar:StartMoving()
elseif IsControlKeyDown() and button == "RightButton" then
bar:ClearAllPoints()
bar:SetPoint(unpack(C.position.alt_power_bar))
bar:SetUserPlaced(false)
end
end)
bar:SetScript("OnMouseUp", function()
bar:StopMovingOrSizing()
end)
-- Event handling
bar:RegisterEvent("UNIT_POWER_UPDATE")
bar:RegisterEvent("UNIT_POWER_BAR_SHOW")
bar:RegisterEvent("UNIT_POWER_BAR_HIDE")
bar:RegisterEvent("PLAYER_ENTERING_WORLD")
bar:SetScript("OnEvent", function(self, event)
if event == "PLAYER_ENTERING_WORLD" then
if not bar:IsUserPlaced() then
bar:ClearAllPoints()
bar:SetPoint(unpack(C.position.alt_power_bar))
end
end
self:UnregisterEvent("PLAYER_ENTERING_WORLD")
if GetUnitPowerBarInfo("player") then
self:Show()
else
self:Hide()
end
end)
-- Tooltip
bar:SetScript("OnEnter", function(self)
local name, tooltip = GetUnitPowerBarStrings("player")
GameTooltip:SetOwner(self, "ANCHOR_BOTTOM", 0, -5)
GameTooltip:AddLine(name, 1, 1, 1)
GameTooltip:AddLine(tooltip, nil, nil, nil, true)
GameTooltip:Show()
end)
bar:SetScript("OnLeave", GameTooltip_Hide)
-- StatusBar
local status = CreateFrame("StatusBar", "UIAltPowerBarStatus", bar)
status:SetFrameLevel(bar:GetFrameLevel() + 1)
status:SetStatusBarTexture(C.media.texture)
status:SetMinMaxValues(0, 100)
status:SetPoint("TOPLEFT", bar, "TOPLEFT", 2, -2)
status:SetPoint("BOTTOMRIGHT", bar, "BOTTOMRIGHT", -2, 2)
status.bg = status:CreateTexture(nil, "BACKGROUND")
status.bg:SetAllPoints(status)
status.bg:SetTexture(C.media.texture)
status.text = status:CreateFontString(nil, "OVERLAY")
status.text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
status.text:SetPoint("CENTER", bar, "CENTER", 0, 0)
local _, ns = ...
local oUF = ns.oUF
-- Update Function
local update = 1
status:SetScript("OnUpdate", function(self, elapsed)
if not bar:IsShown() then return end
update = update + elapsed
if update >= 1 then
local cur = UnitPower("player", ALTERNATE_POWER_INDEX)
local max = UnitPowerMax("player", ALTERNATE_POWER_INDEX)
local texture, r, g, b = GetUnitPowerBarTextureInfo("player", 2, 0)
if not texture or (r == 1 and g == 1 and b == 1) then
r, g, b = oUF:ColorGradient(cur, max, 0.8, 0.2, 0.1, 1, 0.8, 0.1, 0.33, 0.59, 0.33)
end
self:SetMinMaxValues(0, max)
self:SetValue(cur)
self.text:SetText(cur.."/"..max)
self:SetStatusBarColor(r, g, b)
self.bg:SetVertexColor(r, g, b, 0.25)
update = 0
end
end)
================================================
FILE: ShestakUI/Modules/Blizzard/Bags.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.bag.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Based on Stuffing(by Hungtar, editor Tukz)
----------------------------------------------------------------------------------------
local BAGS_BACKPACK = {0, 1, 2, 3, 4, 5}
local BAGS_BANK = {-1, 6, 7, 8, 9, 10, 11, 12}
local ST_NORMAL = 1
local ST_FISHBAG = 2
local ST_SPECIAL = 3
local bag_bars = 0
local unusable
-- Unfit-1.0 Library
if T.class == "DEATHKNIGHT" then
unusable = { -- weapon, armor, dual-wield
{Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Staff, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Dagger, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},
{Enum.ItemArmorSubclass.Shield}
}
elseif T.class == "DEMONHUNTER" then
unusable = {
{Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace1H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Staff, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},
{Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield}
}
elseif T.class == "DRUID" then
unusable = {
{Enum.ItemWeaponSubclass.Axe1H, Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Sword1H, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},
{Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},
true
}
elseif T.class == "EVOKER" then
unusable = {
{Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},
{Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},
true
}
elseif T.class == "HUNTER" then
unusable = {
{Enum.ItemWeaponSubclass.Mace1H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Wand},
{Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield}
}
elseif T.class == "MAGE" then
unusable = {
{Enum.ItemWeaponSubclass.Axe1H, Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace1H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow},
{Enum.ItemArmorSubclass.Leather, Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},
true
}
elseif T.class == "MONK" then
unusable = {
{Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Dagger, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},
{Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield}
}
elseif T.class == "PALADIN" then
unusable = {
{Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Staff, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Dagger, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},
{},
true
}
elseif T.class == "PRIEST" then
unusable = {
{Enum.ItemWeaponSubclass.Axe1H, Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword1H, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow},
{Enum.ItemArmorSubclass.Leather, Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},
true
}
elseif T.class == "ROGUE" then
unusable = {
{Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Staff, Enum.ItemWeaponSubclass.Wand},
{Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield}
}
elseif T.class == "SHAMAN" then
unusable = {
{Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword1H, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow, Enum.ItemWeaponSubclass.Wand},
{Enum.ItemArmorSubclass.Plate}
}
elseif T.class == "WARLOCK" then
unusable = {
{Enum.ItemWeaponSubclass.Axe1H, Enum.ItemWeaponSubclass.Axe2H, Enum.ItemWeaponSubclass.Bows, Enum.ItemWeaponSubclass.Guns, Enum.ItemWeaponSubclass.Mace1H, Enum.ItemWeaponSubclass.Mace2H, Enum.ItemWeaponSubclass.Polearm, Enum.ItemWeaponSubclass.Sword2H, Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Unarmed, Enum.ItemWeaponSubclass.Thrown, Enum.ItemWeaponSubclass.Crossbow},
{Enum.ItemArmorSubclass.Leather, Enum.ItemArmorSubclass.Mail, Enum.ItemArmorSubclass.Plate, Enum.ItemArmorSubclass.Shield},
true
}
elseif T.class == "WARRIOR" then
unusable = {{Enum.ItemWeaponSubclass.Warglaive, Enum.ItemWeaponSubclass.Wand}, {}}
else
unusable = {{}, {}}
end
local _unusable = {}
for i, class in ipairs({Enum.ItemClass.Weapon, Enum.ItemClass.Armor}) do
local list = {}
for _, subclass in ipairs(unusable[i]) do
list[subclass] = true
end
_unusable[class] = list
end
local function IsClassUnusable(class, subclass, slot)
if class and subclass and _unusable[class] then
return slot ~= "" and _unusable[class][subclass] or slot == "INVTYPE_WEAPONOFFHAND" and unusable[3]
end
end
local function IsItemUnusable(...)
if ... then
local slot, _,_, class, subclass = select(9, GetItemInfo(...))
return IsClassUnusable(class, subclass, slot)
end
end
Stuffing = CreateFrame("Frame", nil, UIParent)
Stuffing:RegisterEvent("ADDON_LOADED")
Stuffing:RegisterEvent("PLAYER_ENTERING_WORLD")
Stuffing:SetScript("OnEvent", function(this, event, ...)
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 return end
Stuffing[event](this, ...)
end)
-- Drop down menu stuff from Postal
local Stuffing_DDMenu = CreateFrame("Frame", "StuffingDropDownMenu")
Stuffing_DDMenu.displayMode = "MENU"
Stuffing_DDMenu.info = {}
Stuffing_DDMenu.HideMenu = function()
if UIDROPDOWNMENU_OPEN_MENU == Stuffing_DDMenu then
CloseDropDownMenus()
end
end
local function Stuffing_OnShow()
Stuffing:PLAYERBANKSLOTS_CHANGED(29)
for i = 0, #BAGS_BACKPACK - 1 do
Stuffing:BAG_UPDATE(i)
end
Stuffing:Layout()
Stuffing:SearchReset()
PlaySound(SOUNDKIT.IG_BACKPACK_OPEN)
end
local function StuffingBank_OnHide()
if _G["StuffingFrameReagent"] and _G["StuffingFrameReagent"]:IsShown() then return end
CloseBankFrame()
if Stuffing.frame:IsShown() then
Stuffing.frame:Hide()
end
PlaySound(SOUNDKIT.IG_BACKPACK_CLOSE)
end
local function Stuffing_OnHide()
if _G["StuffingFrameReagent"] and _G["StuffingFrameReagent"]:IsShown() then
CloseBankFrame()
end
if Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then
Stuffing.bankFrame:Hide()
end
PlaySound(SOUNDKIT.IG_BACKPACK_CLOSE)
end
local function Stuffing_Open()
if not Stuffing.frame:IsShown() then
Stuffing.frame:Show()
end
end
local function Stuffing_Close()
C_Timer.After(0.01, function() -- fix showing GameMenu when pressing ESC
if Stuffing.frame:IsShown() then
Stuffing.frame:Hide()
end
end)
end
local function Stuffing_Toggle()
if Stuffing.frame:IsShown() then
Stuffing.frame:Hide()
else
Stuffing.frame:Show()
end
end
-- Bag slot stuff
local trashButton = {}
local trashBag = {}
local ItemDB = {}
local function _getRealItemLevel(link, bag, slot)
if ItemDB[link] then return ItemDB[link] end
local realItemLevel = C_Item.GetCurrentItemLevel(ItemLocation:CreateFromBagAndSlot(bag, slot))
ItemDB[link] = tonumber(realItemLevel)
return realItemLevel
end
function Stuffing:SlotUpdate(b)
local texture, count, locked, quality = GetContainerItemInfo(b.bag, b.slot)
texture = texture or 0
local clink = C_Container.GetContainerItemLink(b.bag, b.slot)
local questData = C_Container.GetContainerItemQuestInfo(b.bag, b.slot)
local isQuestItem, questId, isActiveQuest = questData.isQuestItem, questData.questID, questData.isActive
local itemIsUpgrade
-- Set all slot color to default ShestakUI on update
if not b.frame.lock then
b.frame:SetBackdropBorderColor(unpack(C.media.border_color))
end
if b.cooldown and StuffingFrameBags and StuffingFrameBags:IsShown() then
local start, duration, enable = C_Container.GetContainerItemCooldown(b.bag, b.slot)
CooldownFrame_Set(b.cooldown, start, duration, enable)
end
if C.bag.ilvl == true then
b.frame.text:SetText("")
end
b.frame.Azerite:Hide()
b.frame.Conduit:Hide()
b.frame.Conduit2:Hide()
b.frame.profQuality:Hide()
b.frame:UpdateItemContextMatching() -- Update Scrap items
if b.frame.UpgradeIcon then
b.frame.UpgradeIcon:SetPoint("TOPLEFT", C.bag.button_size/2.7, -C.bag.button_size/2.7)
b.frame.UpgradeIcon:SetSize(C.bag.button_size/1.7, C.bag.button_size/1.7)
-- Use Pawn's (third-party addon) function if present; else fallback to Blizzard's.
-- 10.0.2 Build 46658 No longer have IsContainerItemAnUpgrade
itemIsUpgrade = PawnIsContainerItemAnUpgrade and PawnIsContainerItemAnUpgrade(b.frame:GetParent():GetID(), b.frame:GetID())
b.frame.UpgradeIcon:SetShown(itemIsUpgrade or false)
end
if IsAddOnLoaded("CanIMogIt") then
CIMI_AddToFrame(b.frame, ContainerFrameItemButton_CIMIUpdateIcon)
ContainerFrameItemButton_CIMIUpdateIcon(b.frame.CanIMogItOverlay)
end
if clink then
b.name, _, _, b.itemlevel, b.level, _, _, _, _, _, _, b.itemClassID, b.itemSubClassID = GetItemInfo(clink)
if not b.name then -- Keystone bug
b.name = clink:match("%[(.-)%]") or ""
end
if C.bag.ilvl == true and b.itemlevel and quality > 1 and (b.itemClassID == 2 or b.itemClassID == 4 or (b.itemClassID == 3 and b.itemSubClassID == 11)) then
b.itemlevel = _getRealItemLevel(clink, b.bag, b.slot) or b.itemlevel
b.frame.text:SetText(b.itemlevel)
end
if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItemByID(clink) then
b.frame.Azerite:SetAtlas("AzeriteIconFrame")
b.frame.Azerite:Show()
elseif C_Soulbinds.IsItemConduitByItemInfo(clink) then
b.frame.Conduit:SetAtlas("ConduitIconFrame")
b.frame.Conduit:Show()
local color = BAG_ITEM_QUALITY_COLORS[quality]
if color then
b.frame.Conduit:SetVertexColor(color.r, color.g, color.b)
end
b.frame.Conduit2:SetAtlas("ConduitIconFrame-Corners")
b.frame.Conduit2:Show()
end
local profQual = C_TradeSkillUI.GetItemReagentQualityByItemInfo(clink) or C_TradeSkillUI.GetItemCraftedQualityByItemInfo(clink)
if profQual then
local atlas = ("Professions-Icon-Quality-Tier%d-Inv"):format(profQual)
b.frame.profQuality:SetAtlas(atlas, TextureKitConstants.UseAtlasSize)
b.frame.profQuality:Show()
end
if (IsItemUnusable(clink) or b.level and b.level > T.level) and not locked then
_G[b.frame:GetName().."IconTexture"]:SetVertexColor(1, 0.1, 0.1)
else
_G[b.frame:GetName().."IconTexture"]:SetVertexColor(1, 1, 1)
end
-- Color slot according to item quality
if not b.frame.lock and quality and quality > 1 and not (isQuestItem or questId) then
local R, G, B = GetItemQualityColor(quality)
if b.frame then
b.frame:SetBackdropBorderColor(R, G, B)
end
elseif questId and not isActiveQuest then
b.frame:SetBackdropBorderColor(1, 0.3, 0.3)
elseif questId or isQuestItem then
b.frame:SetBackdropBorderColor(1, 1, 0)
end
else
b.name, b.level = nil, nil
end
SetItemButtonTexture(b.frame, texture)
SetItemButtonCount(b.frame, count)
SetItemButtonDesaturated(b.frame, locked)
if C.bag.new_items then
local IsNewItem = C_NewItems.IsNewItem(b.bag, b.slot)
if IsNewItem then
if not b.frame.Animation then
b.frame.Animation = b.frame:CreateAnimationGroup()
b.frame.Animation:SetLooping("BOUNCE")
b.frame.Animation.FadeOut = b.frame.Animation:CreateAnimation("Alpha")
b.frame.Animation.FadeOut:SetFromAlpha(1)
b.frame.Animation.FadeOut:SetToAlpha(0.6)
b.frame.Animation.FadeOut:SetDuration(0.4)
b.frame.Animation.FadeOut:SetSmoothing("IN_OUT")
b.frame:HookScript("OnEnter", function(self)
local IsNewItem = C_NewItems.IsNewItem(b.bag, b.slot)
if not IsNewItem and b.frame.Animation:IsPlaying() then
b.frame.Animation:Stop()
end
end)
end
if not b.frame.Animation:IsPlaying() then
b.frame.Animation:Play()
end
end
end
b.frame:Show()
end
function Stuffing:BagSlotUpdate(bag)
if not self.buttons then
return
end
for _, v in ipairs(self.buttons) do
if v.bag == bag then
self:SlotUpdate(v)
end
end
end
function Stuffing:UpdateCooldowns(b)
if b.cooldown and StuffingFrameBags and StuffingFrameBags:IsShown() then
local start, duration, enable = C_Container.GetContainerItemCooldown(b.bag, b.slot)
CooldownFrame_Set(b.cooldown, start, duration, enable)
end
end
function Stuffing:CreateReagentContainer()
ReagentBankFrame:StripTextures()
local Reagent = CreateFrame("Frame", "StuffingFrameReagent", UIParent)
local SwitchBankButton = CreateFrame("Button", nil, Reagent)
local NumRows, LastRowButton, NumButtons, LastButton = 0, ReagentBankFrameItem1, 1, ReagentBankFrameItem1
local Deposit = ReagentBankFrame.DespositButton
Reagent:SetWidth(((C.bag.button_size + C.bag.button_space) * C.bag.bank_columns) + 17)
Reagent:SetPoint("TOPLEFT", _G["StuffingFrameBank"], "TOPLEFT", 0, 0)
Reagent:SetTemplate("Transparent")
Reagent:SetFrameStrata(_G["StuffingFrameBank"]:GetFrameStrata())
Reagent:SetFrameLevel(_G["StuffingFrameBank"]:GetFrameLevel() + 5)
Reagent:EnableMouse(true)
Reagent:SetMovable(true)
Reagent:SetClampedToScreen(true)
Reagent:SetClampRectInsets(0, 0, 0, -20)
Reagent:SetScript("OnMouseDown", function(self, button)
if IsShiftKeyDown() and button == "LeftButton" then
self:StartMoving()
end
end)
Reagent:SetScript("OnMouseUp", Reagent.StopMovingOrSizing)
SwitchBankButton:SetSize(80, 20)
SwitchBankButton:SkinButton()
SwitchBankButton:SetPoint("TOPLEFT", 10, -4)
SwitchBankButton:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
SwitchBankButton.text:SetPoint("CENTER")
SwitchBankButton.text:SetText(BANK)
SwitchBankButton:SetScript("OnClick", function()
Reagent:Hide()
_G["StuffingFrameBank"]:Show()
BankFrame_ShowPanel(BANK_PANELS[1].name)
PlaySound(SOUNDKIT.IG_BACKPACK_OPEN)
end)
Deposit:SetParent(Reagent)
Deposit:ClearAllPoints()
Deposit:SetSize(170, 20)
Deposit:SetPoint("TOPLEFT", SwitchBankButton, "TOPRIGHT", 3, 0)
Deposit:SkinButton()
Deposit:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
Deposit.text:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)
Deposit.text:SetTextColor(1, 1, 1)
Deposit.text:SetText(REAGENTBANK_DEPOSIT)
Deposit:SetFontString(Deposit.text)
-- Close button
local Close = CreateFrame("Button", "StuffingCloseButtonReagent", Reagent, "UIPanelCloseButton")
T.SkinCloseButton(Close, nil, nil, true)
Close:SetSize(15, 15)
Close:RegisterForClicks("AnyUp")
Close:SetScript("OnClick", function(self, btn)
if btn == "RightButton" then
if Stuffing_DDMenu.initialize ~= Stuffing.Menu then
CloseDropDownMenus()
Stuffing_DDMenu.initialize = Stuffing.Menu
end
ToggleDropDownMenu(nil, nil, Stuffing_DDMenu, self:GetName(), 0, 0)
return
else
Reagent:Hide()
StuffingBank_OnHide()
end
end)
local tooltip_hide = function()
GameTooltip:Hide()
end
local tooltip_show = function(self)
GameTooltip:SetOwner(self, "ANCHOR_LEFT", 19, 7)
GameTooltip:ClearLines()
GameTooltip:SetText(L_BAG_RIGHT_CLICK_CLOSE)
end
Close:HookScript("OnEnter", tooltip_show)
Close:HookScript("OnLeave", tooltip_hide)
for i = 1, 98 do
local button = _G["ReagentBankFrameItem"..i]
local icon = _G[button:GetName().."IconTexture"]
local count = _G[button:GetName().."Count"]
ReagentBankFrame:SetParent(Reagent)
ReagentBankFrame:ClearAllPoints()
ReagentBankFrame:SetAllPoints()
button:StyleButton()
button:SetTemplate("Default")
button:SetNormalTexture(0)
button.IconBorder:SetAlpha(0)
button:ClearAllPoints()
button:SetSize(C.bag.button_size, C.bag.button_size)
local _, _, _, quality = GetContainerItemInfo(-3, i)
local clink = C_Container.GetContainerItemLink(-3, i)
if clink then
if quality and quality > 1 then
local r, g, b = GetItemQualityColor(quality)
button:SetBackdropBorderColor(r, g, b)
end
end
if i == 1 then
button:SetPoint("TOPLEFT", Reagent, "TOPLEFT", 10, -27)
LastRowButton = button
LastButton = button
elseif NumButtons == C.bag.bank_columns then
button:SetPoint("TOPRIGHT", LastRowButton, "TOPRIGHT", 0, -(C.bag.button_space + C.bag.button_size))
button:SetPoint("BOTTOMLEFT", LastRowButton, "BOTTOMLEFT", 0, -(C.bag.button_space + C.bag.button_size))
LastRowButton = button
NumRows = NumRows + 1
NumButtons = 1
else
button:SetPoint("TOPRIGHT", LastButton, "TOPRIGHT", (C.bag.button_space + C.bag.button_size), 0)
button:SetPoint("BOTTOMLEFT", LastButton, "BOTTOMLEFT", (C.bag.button_space + C.bag.button_size), 0)
NumButtons = NumButtons + 1
end
icon:CropIcon()
count:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
count:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)
count:SetPoint("BOTTOMRIGHT", 1, 1)
LastButton = button
end
Reagent:SetHeight(((C.bag.button_size + C.bag.button_space) * (NumRows + 1) + 40) - C.bag.button_space)
MoneyFrame_Update(ReagentBankFrame.UnlockInfo.CostMoneyFrame, GetReagentBankCost())
ReagentBankFrameUnlockInfo:StripTextures()
ReagentBankFrameUnlockInfo:SetAllPoints(Reagent)
ReagentBankFrameUnlockInfo:SetTemplate("Overlay")
ReagentBankFrameUnlockInfo:SetFrameStrata("FULLSCREEN")
ReagentBankFrameUnlockInfoPurchaseButton:SkinButton()
end
function Stuffing:BagFrameSlotNew(p, slot)
for _, v in ipairs(self.bagframe_buttons) do
if v.slot == slot then
return v, false
end
end
local ret = {}
if slot > 5 then
ret.slot = slot
slot = slot - 5
ret.frame = CreateFrame("ItemButton", "StuffingBBag"..slot.."Slot", p, "BankItemButtonBagTemplate")
Mixin(ret.frame, BackdropTemplateMixin)
ret.frame:StripTextures()
ret.frame:SetID(slot)
hooksecurefunc(ret.frame.IconBorder, "SetVertexColor", function(self, r, g, b)
if r ~= 0.65882 and g ~= 0.65882 and b ~= 0.65882 then
self:GetParent():SetBackdropBorderColor(r, g, b)
end
self:SetTexture("")
end)
hooksecurefunc(ret.frame.IconBorder, "Hide", function(self)
self:GetParent():SetBackdropBorderColor(unpack(C.media.border_color))
end)
table.insert(self.bagframe_buttons, ret)
BankFrameItemButton_Update(ret.frame)
if not ret.frame.tooltipText then
ret.frame.tooltipText = ""
end
ret.frame.ID = ret.frame:GetInventorySlot()
local quality = GetInventoryItemQuality("player", ret.frame.ID)
if quality then
ret.frame.quality = quality
end
if slot > GetNumBankSlots() then
SetItemButtonTextureVertexColor(ret.frame, 1.0, 0.1, 0.1)
else
SetItemButtonTextureVertexColor(ret.frame, 1.0, 1.0, 1.0)
end
else
ret.frame = CreateFrame("ItemButton", "StuffingFBag"..(slot + 1).."Slot", p, "")
Mixin(ret.frame, BackdropTemplateMixin)
ret.frame.ID = C_Container.ContainerIDToInventoryID(slot + 1)
local bag_tex = GetInventoryItemTexture("player", ret.frame.ID)
_G[ret.frame:GetName().."IconTexture"]:SetTexture(bag_tex)
ret.frame:SetID(ret.frame.ID)
ret.frame:RegisterForDrag("LeftButton")
ret.frame:SetScript("OnDragStart", function(self)
PickupBagFromSlot(self:GetID())
end)
ret.frame:SetScript("OnReceiveDrag", function(self)
PutItemInBag(self:GetID())
end)
local tooltip_hide = function()
GameTooltip:Hide()
end
local tooltip_show = function(self)
GameTooltip:SetOwner(self, "ANCHOR_LEFT", 19, 7)
GameTooltip:ClearLines()
if GetInventoryItemLink("player", ret.frame.ID) then
GameTooltip:SetInventoryItem("player", self:GetID())
else
local text = ret.slot == 4 and EQUIP_CONTAINER_REAGENT or EQUIP_CONTAINER
GameTooltip:AddLine(text)
GameTooltip:Show()
end
end
ret.frame:HookScript("OnEnter", tooltip_show)
ret.frame:HookScript("OnLeave", tooltip_hide)
local quality = GetInventoryItemQuality("player", ret.frame.ID)
if quality then
ret.frame.quality = quality
-- else
-- C_Timer.After(1, function() -- TODO: Test it if quality not returned after first open
-- ret.frame.quality = GetInventoryItemQuality("player", ret.frame.ID)
-- end)
end
ret.slot = slot
table.insert(self.bagframe_buttons, ret)
end
ret.frame:StyleButton()
ret.frame:SetTemplate("Default")
ret.frame:SetNormalTexture((0))
ret.icon = _G[ret.frame:GetName().."IconTexture"]
ret.icon:CropIcon()
-- C_Timer.After(2, function()
if ret.frame.quality and ret.frame.quality > 1 then
local r, g, b = GetItemQualityColor(ret.frame.quality)
ret.frame:SetBackdropBorderColor(r, g, b)
end
-- end)
return ret
end
function Stuffing:SlotNew(bag, slot)
for _, v in ipairs(self.buttons) do
if v.bag == bag and v.slot == slot then
v.lock = false
return v, false
end
end
local tpl = "ContainerFrameItemButtonTemplate"
if bag == -1 then
tpl = "BankItemButtonGenericTemplate"
end
local ret = {}
if #trashButton > 0 then
local f = -1
for i, v in ipairs(trashButton) do
local b, s = v:GetName():match("(%d+)_(%d+)")
b = tonumber(b)
s = tonumber(s)
if b == bag and s == slot then
f = i
break
else
v:Hide()
end
end
if f ~= -1 then
ret.frame = trashButton[f]
table.remove(trashButton, f)
ret.frame:Show()
end
end
if not ret.frame then
ret.frame = CreateFrame("ItemButton", "StuffingBag"..bag.."_"..slot, self.bags[bag], tpl)
ret.frame:StyleButton()
ret.frame:SetTemplate("Default")
ret.frame:SetNormalTexture(0)
ret.frame:SetFrameStrata("HIGH")
ret.icon = _G[ret.frame:GetName().."IconTexture"]
ret.icon:CropIcon()
ret.count = _G[ret.frame:GetName().."Count"]
ret.count:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
ret.count:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)
ret.count:SetPoint("BOTTOMRIGHT", 1, 1)
if C.bag.ilvl == true then
ret.frame.text = ret.frame:CreateFontString(nil, "ARTWORK")
ret.frame.text:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
ret.frame.text:SetPoint("TOPLEFT", 1, -1)
ret.frame.text:SetTextColor(1, 1, 0)
end
ret.frame.Azerite = ret.frame:CreateTexture(nil, "ARTWORK")
ret.frame.Azerite:SetAtlas("AzeriteIconFrame")
ret.frame.Azerite:SetPoint("TOPLEFT", ret.frame, 1, -1)
ret.frame.Azerite:SetPoint("BOTTOMRIGHT", ret.frame, -1, 1)
ret.frame.Azerite:Hide()
ret.frame.Conduit = ret.frame:CreateTexture(nil, "ARTWORK")
ret.frame.Conduit:SetAtlas("ConduitIconFrame")
ret.frame.Conduit:SetPoint("TOPLEFT", ret.frame, 2, -2)
ret.frame.Conduit:SetPoint("BOTTOMRIGHT", ret.frame, -2, 2)
ret.frame.Conduit:Hide()
ret.frame.Conduit2 = ret.frame:CreateTexture(nil, "ARTWORK")
ret.frame.Conduit2:SetAtlas("ConduitIconFrame-Corners")
ret.frame.Conduit2:SetPoint("TOPLEFT", ret.frame, 2, -2)
ret.frame.Conduit2:SetPoint("BOTTOMRIGHT", ret.frame, -2, 2)
ret.frame.Conduit2:Hide()
ret.frame.profQuality = ret.frame:CreateTexture(nil, "ARTWORK")
ret.frame.profQuality:SetPoint("TOPLEFT", ret.frame, 0, 0)
ret.frame.profQuality:Hide()
local Battlepay = _G[ret.frame:GetName()].BattlepayItemTexture
if Battlepay then
Battlepay:SetAlpha(0)
end
end
ret.bag = bag
ret.slot = slot
ret.frame:SetID(slot)
ret.cooldown = _G[ret.frame:GetName().."Cooldown"]
ret.cooldown:Show()
self:SlotUpdate(ret)
return ret, true
end
-- From OneBag
local BAGTYPE_PROFESSION = 0x0008 + 0x0010 + 0x0020 + 0x0040 + 0x0080 + 0x0200 + 0x0400 + 0x10000
local BAGTYPE_FISHING = 32768
function Stuffing:BagType(bag)
local bagType = select(2, C_Container.GetContainerNumFreeSlots(bag))
if bagType and bit.band(bagType, BAGTYPE_FISHING) > 0 then
return ST_FISHBAG
elseif bagType and bit.band(bagType, BAGTYPE_PROFESSION) > 0 then
return ST_SPECIAL
end
return ST_NORMAL
end
function Stuffing:BagNew(bag, f)
for _, v in pairs(self.bags) do
if v:GetID() == bag then
v.bagType = self:BagType(bag)
return v
end
end
local ret
if #trashBag > 0 then
local f = -1
for i, v in pairs(trashBag) do
if v:GetID() == bag then
f = i
break
end
end
if f ~= -1 then
ret = trashBag[f]
table.remove(trashBag, f)
ret:Show()
ret.bagType = self:BagType(bag)
return ret
end
end
ret = CreateFrame("Frame", "StuffingBag"..bag, f)
ret.bagType = self:BagType(bag)
ret:SetID(bag)
return ret
end
local bind = {
[0] = "",
[1] = "bop bound"..ITEM_BIND_ON_PICKUP,
[2] = "boe"..ITEM_BIND_ON_EQUIP,
[3] = ITEM_BIND_ON_USE,
[4] = ITEM_BIND_QUEST
}
local bindAccount = {
[ITEM_ACCOUNTBOUND] = true,
[ITEM_BIND_TO_ACCOUNT] = true,
[ITEM_BNETACCOUNTBOUND] = true,
}
function Stuffing:SearchUpdate(str)
str = string.lower(str)
for _, b in ipairs(self.buttons) do
if b.frame and not b.name then
if str == "" then
b.frame.searchOverlay:Hide()
else
b.frame.searchOverlay:Show()
end
end
if b.name then
local ilink = C_Container.GetContainerItemLink(b.bag, b.slot)
if ilink then
local _, setName = C_Container.GetContainerItemEquipmentSetInfo(b.bag, b.slot)
setName = setName or ""
local _, _, _, _, minLevel, class, subclass, _, equipSlot, _, _, _, _, bindType = GetItemInfo(ilink)
class = class or ""
subclass = subclass or ""
equipSlot = equipSlot or ""
bindType = bind[bindType] or ""
minLevel = minLevel or 1
local isBoA = false
if str and str == "boa" then
local data = C_TooltipInfo.GetBagItem(b.bag, b.slot)
if data then
for j = 2, 5 do
local lineData = data.lines[j]
if not lineData then break end
local argVal = lineData.args
if argVal then
local lineText = argVal[2] and argVal[2].stringVal
local bindOn = lineText and bindAccount[lineText]
if bindOn then
isBoA = true
break
end
end
end
end
end
if not isBoA and not string.find(string.lower(b.name), str) and not string.find(string.lower(setName), str) and not string.find(string.lower(class), str) and not string.find(string.lower(subclass), str) and not string.find(string.lower(equipSlot), str) and not string.find(string.lower(bindType), str) then
if IsItemUnusable(b.name) or minLevel > T.level then
_G[b.frame:GetName().."IconTexture"]:SetVertexColor(0.5, 0.5, 0.5)
end
SetItemButtonDesaturated(b.frame, true)
b.frame.searchOverlay:Show()
else
if IsItemUnusable(b.name) or minLevel > T.level then
_G[b.frame:GetName().."IconTexture"]:SetVertexColor(1, 0.1, 0.1)
end
SetItemButtonDesaturated(b.frame, false)
b.frame.searchOverlay:Hide()
end
end
end
end
if ReagentBankFrameItem1 then
for slotID = 1, 98 do
local _, _, _, _, _, _, ilink = GetContainerItemInfo(-3, slotID)
local button = _G["ReagentBankFrameItem"..slotID]
if ilink then
local name, _, _, _, minLevel, class, subclass = GetItemInfo(ilink)
class = class or ""
subclass = subclass or ""
minLevel = minLevel or 1
if not string.find(string.lower(name), str) and not string.find(string.lower(class), str) and not string.find(string.lower(subclass), str) then
if IsItemUnusable(name) or minLevel > T.level then
_G[button:GetName().."IconTexture"]:SetVertexColor(0.5, 0.5, 0.5)
end
SetItemButtonDesaturated(button, true)
button.searchOverlay:Show()
else
if IsItemUnusable(name) or minLevel > T.level then
_G[button:GetName().."IconTexture"]:SetVertexColor(1, 0.1, 0.1)
end
SetItemButtonDesaturated(button, false)
button.searchOverlay:Hide()
end
end
end
end
end
function Stuffing:SearchReset()
for _, b in ipairs(self.buttons) do
if IsItemUnusable(b.name) or (b.level and b.level > T.level) then
_G[b.frame:GetName().."IconTexture"]:SetVertexColor(1, 0.1, 0.1)
end
b.frame.searchOverlay:Hide()
SetItemButtonDesaturated(b.frame, false)
end
self.frame.editbox:SetText("")
self.frame.editbox:Hide()
self.frame.editbox:ClearFocus()
self.frame.detail:Show()
end
local function DragFunction(self, mode)
for index = 1, select("#", self:GetChildren()) do
local frame = select(index, self:GetChildren())
if frame:GetName() and frame:GetName():match("StuffingBag") then
if mode then
frame:Hide()
else
frame:Show()
end
end
end
end
function Stuffing:CreateBagFrame(w)
local n = "StuffingFrame"..w
local f = CreateFrame("Frame", n, UIParent)
f:EnableMouse(true)
f:SetMovable(true)
f:SetFrameStrata("MEDIUM")
f:SetFrameLevel(10)
f:RegisterForDrag("LeftButton")
f:SetScript("OnDragStart", function(self)
if IsAltKeyDown() or IsShiftKeyDown() then
self:StartMoving()
DragFunction(self, true)
f.moved = true
end
end)
f:SetScript("OnDragStop", function(self)
if f.moved then -- prevent false register without modifier key
self:StopMovingOrSizing()
DragFunction(self, false)
local ap, p, rp, x, y = f:GetPoint()
if not p then p = UIParent end
local positionTable = T.CurrentProfile()
positionTable[f:GetName()] = {ap, p:GetName(), rp, x, y}
f.moved = nil
end
end)
f:SetScript("OnMouseDown", function(_, button)
if IsControlKeyDown() and button == "RightButton" then
f:ClearAllPoints()
if w == "Bank" then
f:SetPoint(unpack(C.position.bank))
else
f:SetPoint(unpack(C.position.bag))
end
f:SetUserPlaced(false)
local positionTable = T.CurrentProfile()
positionTable[f:GetName()] = nil
end
end)
local positionTable = T.CurrentProfile()
if positionTable[f:GetName()] then
f:SetPoint(unpack(positionTable[f:GetName()]))
else
if w == "Bank" then
f:SetPoint(unpack(C.position.bank))
else
f:SetPoint(unpack(C.position.bag))
end
end
if w == "Bank" then
-- Reagent button
f.b_reagent = CreateFrame("Button", "StuffingReagentButton"..w, f)
f.b_reagent:SetSize(105, 20)
f.b_reagent:SetPoint("TOPLEFT", 10, -4)
f.b_reagent:RegisterForClicks("AnyUp")
f.b_reagent:SkinButton()
f.b_reagent:SetScript("OnClick", function()
BankFrame_ShowPanel(BANK_PANELS[2].name)
PlaySound(SOUNDKIT.IG_BACKPACK_OPEN)
if not ReagentBankFrame.isMade then
self:CreateReagentContainer()
ReagentBankFrame.isMade = true
else
_G["StuffingFrameReagent"]:Show()
end
_G["StuffingFrameBank"]:Hide()
end)
f.b_reagent:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
f.b_reagent.text:SetPoint("CENTER")
f.b_reagent.text:SetText(REAGENT_BANK)
f.b_reagent:SetFontString(f.b_reagent.text)
-- Buy button
f.b_purchase = CreateFrame("Button", "StuffingPurchaseButton"..w, f)
f.b_purchase:SetSize(80, 20)
f.b_purchase:SetPoint("TOPLEFT", f.b_reagent, "TOPRIGHT", 3, 0)
f.b_purchase:RegisterForClicks("AnyUp")
f.b_purchase:SkinButton()
f.b_purchase:SetScript("OnClick", function() StaticPopup_Show("BUY_BANK_SLOT") end)
f.b_purchase:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
f.b_purchase.text:SetPoint("CENTER")
f.b_purchase.text:SetText(BANKSLOTPURCHASE)
f.b_purchase:SetFontString(f.b_purchase.text)
local _, full = GetNumBankSlots()
if full then
f.b_purchase:Hide()
else
f.b_purchase:Show()
end
end
-- Close button
f.b_close = CreateFrame("Button", "StuffingCloseButton"..w, f, "UIPanelCloseButton")
T.SkinCloseButton(f.b_close, nil, nil, true)
f.b_close:SetSize(15, 15)
f.b_close:RegisterForClicks("AnyUp")
f.b_close:SetScript("OnClick", function(self, btn)
if btn == "RightButton" then
if Stuffing_DDMenu.initialize ~= Stuffing.Menu then
CloseDropDownMenus()
Stuffing_DDMenu.initialize = Stuffing.Menu
end
ToggleDropDownMenu(nil, nil, Stuffing_DDMenu, self:GetName(), 0, 0)
return
elseif btn == "LeftButton" and IsShiftKeyDown() then
if InCombatLockdown() then
print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return
end
Stuffing:SetBagsForSorting("d")
Stuffing:Restack()
return
end
self:GetParent():Hide()
end)
local tooltip_hide = function()
GameTooltip:Hide()
end
local tooltip_show = function(self)
GameTooltip:SetOwner(self, "ANCHOR_LEFT", 19, 7)
GameTooltip:ClearLines()
GameTooltip:SetText(L_BAG_RIGHT_CLICK_CLOSE)
end
f.b_close:HookScript("OnEnter", tooltip_show)
f.b_close:HookScript("OnLeave", tooltip_hide)
-- Create the bags frame
local fb = CreateFrame("Frame", n.."BagsFrame", f)
fb:SetPoint("BOTTOMLEFT", f, "TOPLEFT", 0, 3)
fb:SetFrameStrata("MEDIUM")
f.bags_frame = fb
return f
end
function Stuffing:InitBank()
if self.bankFrame then
return
end
local f = self:CreateBagFrame("Bank")
f:SetScript("OnHide", StuffingBank_OnHide)
self.bankFrame = f
end
function Stuffing:InitBags()
if self.frame then return end
self.buttons = {}
self.bags = {}
self.bagframe_buttons = {}
self.bags_num = {}
local f = self:CreateBagFrame("Bags")
f:SetScript("OnShow", Stuffing_OnShow)
f:SetScript("OnHide", Stuffing_OnHide)
-- Search editbox (tekKonfigAboutPanel.lua)
local editbox = CreateFrame("EditBox", nil, f)
editbox:Hide()
editbox:SetAutoFocus(false)
editbox:SetHeight(32)
editbox:CreateBackdrop("Overlay")
editbox.backdrop:SetPoint("TOPLEFT", -2, 1)
editbox.backdrop:SetPoint("BOTTOMRIGHT", 2, -1)
local fullReset = function(self)
Stuffing:SearchReset()
end
local clearFocus = function(self)
self:HighlightText(0, 0)
self:ClearFocus()
end
local gainFocus = function(self)
self:HighlightText()
end
local updateSearch = function(self, t)
if t == true then
Stuffing:SearchUpdate(self:GetText())
end
end
editbox:SetScript("OnEscapePressed", fullReset)
editbox:SetScript("OnEnterPressed", clearFocus)
editbox:SetScript("OnEditFocusLost", clearFocus)
editbox:SetScript("OnEditFocusGained", gainFocus)
editbox:SetScript("OnTextChanged", updateSearch)
-- editbox:SetText(SEARCH)
local detail = f:CreateFontString(nil, "ARTWORK", "GameFontHighlightLarge")
detail:SetPoint("TOPLEFT", f, 12, -8)
detail:SetPoint("RIGHT", f, -150, -8)
detail:SetHeight(13)
detail:SetShadowColor(0, 0, 0, 0)
detail:SetJustifyH("LEFT")
detail:SetText("|cff9999ff"..SEARCH.."|r")
editbox:SetAllPoints(detail)
local buttons = {}
local filterTable = {
[1] = {3566860, GetItemClassInfo(0)}, -- Consumable
[2] = {135280, GetItemClassInfo(2)}, -- Weapon
[3] = {132341, GetItemClassInfo(4)}, -- Armor
[4] = {132281, GetItemClassInfo(7)}, -- Tradeskill
[5] = {236667, ITEM_BIND_QUEST}, -- Quest
[6] = {133784, ITEM_BIND_ON_EQUIP}, -- BoE
}
for i = 1, #filterTable do
local button = CreateFrame("Button", "BagsFilterButton"..i, C.bag.filter and f or editbox)
button:SetSize(25, 25)
button:SetTemplate("Overlay")
button:EnableMouse(true)
button:RegisterForClicks("AnyUp")
if i == 1 then
button:SetPoint("TOPRIGHT", f, "TOPLEFT", -1, 0)
else
button:SetPoint("TOP", buttons[i-1], "BOTTOM", 0, -1)
end
buttons[i] = button
local icon, text = unpack(filterTable[i])
button.Icon = button:CreateTexture(nil, "OVERLAY")
button.Icon:SetTexture(icon)
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Icon:SetPoint("TOPLEFT", button, 2, -2)
button.Icon:SetPoint("BOTTOMRIGHT", button, -2, 2)
button:SetScript("OnClick", function(self)
if editbox:GetText() == text then
Stuffing:SearchReset()
else
detail:Hide()
editbox:Show()
editbox:SetText(text)
Stuffing:SearchUpdate(text)
end
end)
local tooltip_hide = function()
GameTooltip:Hide()
end
local tooltip_show = function(self)
GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT", -5, 5)
GameTooltip:ClearLines()
GameTooltip:SetText(text)
end
button:SetScript("OnEnter", tooltip_show)
button:SetScript("OnLeave", tooltip_hide)
end
local button = CreateFrame("Button", nil, f)
button:EnableMouse(true)
button:RegisterForClicks("LeftButtonUp", "RightButtonUp")
button:SetAllPoints(detail)
button.ttText = L_BAG_RIGHT_CLICK_SEARCH
button:SetScript("OnClick", function(self, btn)
if btn == "RightButton" then
self:GetParent().detail:Hide()
self:GetParent().editbox:Show()
self:GetParent().editbox:HighlightText()
self:GetParent().editbox:SetFocus()
else
if self:GetParent().editbox:IsShown() then
Stuffing:SearchReset()
end
end
end)
local tooltip_hide = function()
GameTooltip:Hide()
end
local tooltip_show = function(self)
GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT", -12, 11)
GameTooltip:ClearLines()
GameTooltip:SetText(self.ttText)
end
button:SetScript("OnEnter", tooltip_show)
button:SetScript("OnLeave", tooltip_hide)
f.editbox = editbox
f.detail = detail
f.button = button
self.frame = f
f:Hide()
end
function Stuffing:Layout(isBank)
local slots = 0
local rows = 0
local off = 20
local cols, f, bs
if isBank then
bs = BAGS_BANK
cols = C.bag.bank_columns
f = self.bankFrame
f:SetAlpha(1)
else
bs = BAGS_BACKPACK
cols = C.bag.bag_columns
f = self.frame
f.editbox:SetFont(C.media.normal_font, C.font.bags_font_size + 3, "")
f.detail:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
f.detail:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)
end
f:SetClampedToScreen(1)
f:SetTemplate("Transparent")
-- Bag frame stuff
local fb = f.bags_frame
if bag_bars == 1 then
fb:SetClampedToScreen(1)
fb:SetTemplate("Transparent")
local bsize = C.bag.button_size
local w = 2 * 10
w = w + ((#bs - 1) * bsize)
w = w + ((#bs - 2) * 4)
fb:SetHeight(2 * 10 + bsize)
fb:SetWidth(w)
fb:Show()
else
fb:Hide()
end
local idx = 0
for _, v in ipairs(bs) do
if (not isBank and v <= 4) or (isBank and v ~= -1) then
local bsize = C.bag.button_size
local b = self:BagFrameSlotNew(fb, v)
local xoff = 10
xoff = xoff + (idx * bsize)
xoff = xoff + (idx * 4)
b.frame:ClearAllPoints()
b.frame:SetPoint("LEFT", fb, "LEFT", xoff, 0)
b.frame:SetSize(bsize, bsize)
local btns = self.buttons
b.frame:HookScript("OnEnter", function()
local bag
if isBank then bag = v else bag = v + 1 end
for _, val in ipairs(btns) do
if val.bag == bag then
val.frame.searchOverlay:Hide()
else
val.frame.searchOverlay:Show()
end
end
end)
b.frame:HookScript("OnLeave", function()
for _, btn in ipairs(btns) do
btn.frame.searchOverlay:Hide()
end
end)
b.frame:SetScript("OnClick", nil)
idx = idx + 1
end
end
for _, i in ipairs(bs) do
local x = C_Container.GetContainerNumSlots(i)
if x > 0 then
if not self.bags[i] then
self.bags[i] = self:BagNew(i, f)
end
slots = slots + C_Container.GetContainerNumSlots(i)
end
self.bags_num[i] = x
end
rows = floor(slots / cols)
if (slots % cols) ~= 0 then
rows = rows + 1
end
f:SetWidth(cols * C.bag.button_size + (cols - 1) * C.bag.button_space + 10 * 2)
f:SetHeight(rows * C.bag.button_size + (rows - 1) * C.bag.button_space + off + 10 * 2)
local idx = 0
for _, i in ipairs(bs) do
local bag_cnt = C_Container.GetContainerNumSlots(i)
local specialType = select(2, C_Container.GetContainerNumFreeSlots(i))
if bag_cnt > 0 then
self.bags[i] = self:BagNew(i, f)
local bagType = self.bags[i].bagType
self.bags[i]:Show()
for j = 1, bag_cnt do
local b, isnew = self:SlotNew(i, j)
local xoff
local yoff
local x = (idx % cols)
local y = floor(idx / cols)
if isnew then
table.insert(self.buttons, idx + 1, b)
end
xoff = 10 + (x * C.bag.button_size) + (x * C.bag.button_space)
yoff = off + 10 + (y * C.bag.button_size) + ((y - 1) * C.bag.button_space)
yoff = yoff * -1
b.frame:ClearAllPoints()
b.frame:SetPoint("TOPLEFT", f, "TOPLEFT", xoff, yoff)
b.frame:SetSize(C.bag.button_size, C.bag.button_size)
b.frame.lock = false
b.frame:SetAlpha(1)
if bagType == ST_FISHBAG then
b.frame:SetBackdropBorderColor(1, 0, 0) -- Tackle
b.frame.lock = true
elseif bagType == ST_SPECIAL then
if specialType == 0x0008 then -- Leatherworking
b.frame:SetBackdropBorderColor(0.8, 0.7, 0.3)
elseif specialType == 0x0010 then -- Inscription
b.frame:SetBackdropBorderColor(0.3, 0.3, 0.8)
elseif specialType == 0x0020 then -- Herbs
b.frame:SetBackdropBorderColor(0.3, 0.7, 0.3)
elseif specialType == 0x0040 then -- Enchanting
b.frame:SetBackdropBorderColor(0.6, 0, 0.6)
elseif specialType == 0x0080 then -- Engineering
b.frame:SetBackdropBorderColor(0.9, 0.4, 0.1)
elseif specialType == 0x0200 then -- Gems
b.frame:SetBackdropBorderColor(0, 0.7, 0.8)
elseif specialType == 0x0400 then -- Mining
b.frame:SetBackdropBorderColor(0.4, 0.3, 0.1)
elseif specialType == 0x10000 then -- Cooking
b.frame:SetBackdropBorderColor(0.9, 0, 0.1)
end
b.frame.lock = true
elseif i == 5 then -- Reagent
b.frame:SetBackdropBorderColor(0.5, 0.25, 0.1)
b.frame.lock = true
end
idx = idx + 1
end
end
end
end
function Stuffing:SetBagsForSorting(c)
Stuffing_Open()
self.sortBags = {}
local cmd = ((c == nil or c == "") and {"d"} or {strsplit("/", c)})
for _, s in ipairs(cmd) do
if s == "c" then
self.sortBags = {}
elseif s == "d" then
if not self.bankFrame or not self.bankFrame:IsShown() then
for _, i in ipairs(BAGS_BACKPACK) do
if self.bags[i] and self.bags[i].bagType == ST_NORMAL then
table.insert(self.sortBags, i)
end
end
elseif not _G["StuffingFrameReagent"] or not _G["StuffingFrameReagent"]:IsShown() then
for _, i in ipairs(BAGS_BANK) do
if self.bags[i] and self.bags[i].bagType == ST_NORMAL then
table.insert(self.sortBags, i)
end
end
end
elseif s == "p" then
if not self.bankFrame or not self.bankFrame:IsShown() then
for _, i in ipairs(BAGS_BACKPACK) do
if self.bags[i] and self.bags[i].bagType == ST_SPECIAL then
table.insert(self.sortBags, i)
end
end
else
for _, i in ipairs(BAGS_BANK) do
if self.bags[i] and self.bags[i].bagType == ST_SPECIAL then
table.insert(self.sortBags, i)
end
end
end
else
table.insert(self.sortBags, tonumber(s))
end
end
end
function Stuffing:ADDON_LOADED(addon)
if addon ~= "ShestakUI" then return nil end
self:RegisterEvent("BAG_UPDATE")
self:RegisterEvent("ITEM_LOCK_CHANGED")
self:RegisterEvent("BANKFRAME_OPENED")
self:RegisterEvent("BANKFRAME_CLOSED")
self:RegisterEvent("PLAYER_INTERACTION_MANAGER_FRAME_SHOW")
self:RegisterEvent("PLAYER_INTERACTION_MANAGER_FRAME_HIDE")
self:RegisterEvent("PLAYERBANKSLOTS_CHANGED")
self:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED")
self:RegisterEvent("PLAYERREAGENTBANKSLOTS_CHANGED")
self:RegisterEvent("BAG_CLOSED")
self:RegisterEvent("BAG_UPDATE_COOLDOWN")
self:RegisterEvent("BAG_CONTAINER_UPDATE")
self:RegisterEvent("BAG_UPDATE_DELAYED")
self:InitBags()
tinsert(UISpecialFrames, "StuffingFrameBags")
tinsert(UISpecialFrames, "StuffingFrameReagent")
ToggleBackpack = Stuffing_Toggle
ToggleBag = Stuffing_Toggle
ToggleAllBags = Stuffing_Toggle
OpenAllBags = Stuffing_Open
OpenBackpack = Stuffing_Open
CloseAllBags = Stuffing_Close
CloseBackpack = Stuffing_Close
OpenAllBagsMatchingContext = function()
local count = 0
for i = 0, NUM_BAG_FRAMES do
if ItemButtonUtil.GetItemContextMatchResultForContainer(i) == ItemButtonUtil.ItemContextMatchResult.Match then
Stuffing_Open()
count = count + 1
end
end
return count
end
BankFrame:UnregisterAllEvents()
BankFrame:SetScale(0.00001)
BankFrame:SetAlpha(0)
BankFrame:SetPoint("TOPLEFT")
end
function Stuffing:PLAYER_ENTERING_WORLD()
Stuffing:UnregisterEvent("PLAYER_ENTERING_WORLD")
ToggleBackpack()
ToggleBackpack()
end
function Stuffing:PLAYERBANKSLOTS_CHANGED(id)
if self.bankFrame and self.bankFrame:IsShown() then
self:BagSlotUpdate(-1)
end
end
function Stuffing:PLAYERREAGENTBANKSLOTS_CHANGED(id)
local button = _G["ReagentBankFrameItem"..id]
if not button then return end
local clink = C_Container.GetContainerItemLink(-3, id)
button:SetBackdropBorderColor(unpack(C.media.border_color))
if clink then
local _, _, _, quality = GetContainerItemInfo(-3, id)
if quality and quality > 1 then
local r, g, b = GetItemQualityColor(quality)
button:SetBackdropBorderColor(r, g, b)
end
end
end
function Stuffing:BAG_UPDATE(id)
self:BagSlotUpdate(id)
end
function Stuffing:BAG_UPDATE_DELAYED()
for _, i in ipairs(BAGS_BACKPACK) do
local numSlots = C_Container.GetContainerNumSlots(i)
if self.bags_num[i] and self.bags_num[i] ~= numSlots then
self:Layout()
return
end
end
end
function Stuffing:ITEM_LOCK_CHANGED(bag, slot)
if slot == nil then return end
for _, v in ipairs(self.buttons) do
if v.bag == bag and v.slot == slot then
self:SlotUpdate(v)
break
end
end
end
function Stuffing:BANKFRAME_OPENED()
if not self.bankFrame then
self:InitBank()
end
self:Layout(true)
for _, x in ipairs(BAGS_BANK) do
self:BagSlotUpdate(x)
end
self.bankFrame:Show()
Stuffing_Open()
for _, v in ipairs(self.bagframe_buttons) do
if v.frame and v.frame.GetInventorySlot then
v.frame:SetBackdropBorderColor(unpack(C.media.border_color))
BankFrameItemButton_Update(v.frame)
if not v.frame.tooltipText then
v.frame.tooltipText = ""
end
end
end
end
function Stuffing:BANKFRAME_CLOSED()
if StuffingFrameReagent then
StuffingFrameReagent:Hide()
end
if self.bankFrame then
self.bankFrame:Hide()
end
end
function Stuffing:PLAYER_INTERACTION_MANAGER_FRAME_SHOW(...)
local type = ...
if type == 10 then -- Guild bank
Stuffing_Open()
elseif type == 40 then -- ScrappingMachine
for i = 0, #BAGS_BACKPACK - 1 do
Stuffing:BAG_UPDATE(i)
end
end
end
function Stuffing:PLAYER_INTERACTION_MANAGER_FRAME_HIDE(...)
local type = ...
if type == 10 then -- Guild bank
Stuffing_Close()
end
end
function Stuffing:BAG_CLOSED(id)
local b = self.bags[id]
if b then
table.remove(self.bags, id)
b:Hide()
table.insert(trashBag, #trashBag + 1, b)
self.bags_num[id] = -1
end
while true do
local changed = false
for i, v in ipairs(self.buttons) do
if v.bag == id then
v.frame:Hide()
v.frame.lock = false
table.insert(trashButton, #trashButton + 1, v.frame)
table.remove(self.buttons, i)
v = nil
changed = true
end
end
if not changed then
break
end
end
if id > 5 then
Stuffing_Close() -- prevent graphical bug with empty slots
end
end
function Stuffing:BAG_UPDATE_COOLDOWN()
for _, v in pairs(self.buttons) do
self:UpdateCooldowns(v)
end
end
function Stuffing:BAG_CONTAINER_UPDATE()
for _, v in ipairs(self.bagframe_buttons) do
if v.frame and v.slot < 5 then -- exclude bank
v.frame.ID = C_Container.ContainerIDToInventoryID(v.slot + 1)
local slotLink = GetInventoryItemLink("player", v.frame.ID)
v.frame:SetBackdropBorderColor(unpack(C.media.border_color))
if slotLink then
local _, _, quality = GetItemInfo(slotLink)
if quality and quality > 1 then
local r, g, b = GetItemQualityColor(quality)
v.frame:SetBackdropBorderColor(r, g, b)
end
end
local bag_tex = GetInventoryItemTexture("player", v.frame.ID)
_G[v.frame:GetName().."IconTexture"]:SetTexture(bag_tex)
end
end
end
local function InBags(x)
if not Stuffing.bags[x] then
return false
end
for _, v in ipairs(Stuffing.sortBags) do
if x == v then
return true
end
end
return false
end
local BS_bagGroups
local BS_itemSwapGrid
local function BS_clearData()
BS_itemSwapGrid = {}
BS_bagGroups = {}
end
function Stuffing:SortOnUpdate(elapsed)
self.elapsed = (self.elapsed or 0) + elapsed
if self.elapsed < 0.05 then
return
end
self.elapsed = 0
local changed = false
local blocked = false
for bagIndex in pairs(BS_itemSwapGrid) do
for slotIndex in pairs(BS_itemSwapGrid[bagIndex]) do
local destinationBag = BS_itemSwapGrid[bagIndex][slotIndex].destinationBag
local destinationSlot = BS_itemSwapGrid[bagIndex][slotIndex].destinationSlot
local _, _, locked1 = GetContainerItemInfo(bagIndex, slotIndex)
local _, _, locked2 = GetContainerItemInfo(destinationBag, destinationSlot)
if locked1 or locked2 then
blocked = true
elseif bagIndex ~= destinationBag or slotIndex ~= destinationSlot then
C_Container.PickupContainerItem(bagIndex, slotIndex)
C_Container.PickupContainerItem(destinationBag, destinationSlot)
local tempItem = BS_itemSwapGrid[destinationBag][destinationSlot]
BS_itemSwapGrid[destinationBag][destinationSlot] = BS_itemSwapGrid[bagIndex][slotIndex]
BS_itemSwapGrid[bagIndex][slotIndex] = tempItem
changed = true
return
end
end
end
if not changed and not blocked then
self:SetScript("OnUpdate", nil)
BS_clearData()
end
end
function Stuffing:SortBags()
BS_clearData()
local bagList
if _G["StuffingFrameReagent"] and _G["StuffingFrameReagent"]:IsShown() then
bagList = {-3}
elseif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then
bagList = {12, 11, 10, 9, 8, 7, 6, -1}
else
bagList = {4, 3, 2, 1, 0}
end
for _, slotNum in pairs(bagList) do
if C_Container.GetContainerNumSlots(slotNum) > 0 then
BS_itemSwapGrid[slotNum] = {}
local family = select(2, C_Container.GetContainerNumFreeSlots(slotNum))
if family then
if family == 0 then family = "Default" end
if not BS_bagGroups[family] then
BS_bagGroups[family] = {}
BS_bagGroups[family].bagSlotNumbers = {}
end
table.insert(BS_bagGroups[family].bagSlotNumbers, slotNum)
end
end
end
for _, group in pairs(BS_bagGroups) do
group.itemList = {}
for _, bagSlot in pairs(group.bagSlotNumbers) do
for itemSlot = 1, C_Container.GetContainerNumSlots(bagSlot) do
local itemLink = C_Container.GetContainerItemLink(bagSlot, itemSlot)
if itemLink ~= nil then
local newItem = {}
local n, _, q, iL, rL, c1, c2, _, Sl, _, _, classID = GetItemInfo(itemLink)
local p = 1
-- Hearthstone
if n == GetItemInfo(6948) or n == GetItemInfo(110560) or n == GetItemInfo(140192) then
p = 99
elseif n == GetItemInfo(141605) then -- Flight Master's Whistle
p = 98
elseif n == GetItemInfo(128353) then -- Admiral's Compass
p = 97
end
-- Fix for battle pets
if not n then
n = itemLink
q = select(4, GetContainerItemInfo(bagSlot, itemSlot))
iL = 1
rL = 1
c1 = "Pet"
c2 = "Pet"
Sl = ""
end
-- Keystone
local ks = strmatch(itemLink, "keystone:(%d+)")
if ks then
p = 10
end
if classID == 0 then -- Consumable
p = 9
elseif classID == 2 or classID == 4 then -- Weapon and Armor
p = 8
end
newItem.sort = p..q..c1..c2..rL..n..iL..Sl
tinsert(group.itemList, newItem)
BS_itemSwapGrid[bagSlot][itemSlot] = newItem
newItem.startBag = bagSlot
newItem.startSlot = itemSlot
end
end
end
table.sort(group.itemList, function(a, b)
return a.sort > b.sort
end)
for index, item in pairs(group.itemList) do
local gridSlot = index
for _, bagSlotNumber in pairs(group.bagSlotNumbers) do
if gridSlot <= C_Container.GetContainerNumSlots(bagSlotNumber) then
BS_itemSwapGrid[item.startBag][item.startSlot].destinationBag = bagSlotNumber
BS_itemSwapGrid[item.startBag][item.startSlot].destinationSlot = C_Container.GetContainerNumSlots(bagSlotNumber) - gridSlot + 1
break
else
gridSlot = gridSlot - C_Container.GetContainerNumSlots(bagSlotNumber)
end
end
end
end
self:SetScript("OnUpdate", Stuffing.SortOnUpdate)
end
function Stuffing:RestackOnUpdate(e)
if not self.elapsed then
self.elapsed = 0
end
self.elapsed = self.elapsed + e
if self.elapsed < 0.1 then return end
self.elapsed = 0
self:Restack()
end
function Stuffing:Restack()
local st = {}
local sr = {}
local did_restack = false
Stuffing_Open()
if _G["StuffingFrameReagent"] and _G["StuffingFrameReagent"]:IsShown() then
for slotID = 1, 98 do
local _, cnt, _, _, _, _, clink = GetContainerItemInfo(-3, slotID)
if clink then
local n, _, _, _, _, _, _, s = GetItemInfo(clink)
if n and cnt ~= s then
if not sr[clink] then
sr[clink] = {{item = slotID, size = cnt, max = s}}
else
table.insert(sr[clink], {item = slotID, size = cnt, max = s})
end
end
end
end
for _, v in pairs(sr) do
if #v > 1 then
for j = 2, #v, 2 do
local a, b = v[j - 1], v[j]
local _, _, l1 = GetContainerItemInfo(-3, a.item)
local _, _, l2 = GetContainerItemInfo(-3, b.item)
if l1 or l2 then
did_restack = true
else
C_Container.PickupContainerItem(-3, a.item)
C_Container.PickupContainerItem(-3, b.item)
did_restack = true
end
end
end
end
else
for _, v in pairs(self.buttons) do
if InBags(v.bag) then
local _, cnt, _, _, _, _, clink = GetContainerItemInfo(v.bag, v.slot)
if clink then
local n, _, _, _, _, _, _, s = GetItemInfo(clink)
if n and cnt ~= s then
if not st[clink] then
st[clink] = {{item = v, size = cnt, max = s}}
else
table.insert(st[clink], {item = v, size = cnt, max = s})
end
end
end
end
end
for _, v in pairs(st) do
if #v > 1 then
for j = 2, #v, 2 do
local a, b = v[j - 1], v[j]
local _, _, l1 = GetContainerItemInfo(a.item.bag, a.item.slot)
local _, _, l2 = GetContainerItemInfo(b.item.bag, b.item.slot)
if l1 or l2 then
did_restack = true
else
C_Container.PickupContainerItem(a.item.bag, a.item.slot)
C_Container.PickupContainerItem(b.item.bag, b.item.slot)
did_restack = true
end
end
end
end
end
if did_restack then
self:SetScript("OnUpdate", Stuffing.RestackOnUpdate)
else
self:SetScript("OnUpdate", nil)
end
end
function Stuffing:PLAYERBANKBAGSLOTS_CHANGED()
if not StuffingPurchaseButtonBank then return end
local numSlots, full = GetNumBankSlots()
if full then
StuffingPurchaseButtonBank:Hide()
else
StuffingPurchaseButtonBank:Show()
end
local button
for i = 1, NUM_BANKBAGSLOTS, 1 do
button = _G["StuffingBBag"..i.."Slot"]
if button then
if i <= numSlots then
SetItemButtonTextureVertexColor(button, 1.0, 1.0, 1.0)
else
SetItemButtonTextureVertexColor(button, 1.0, 0.1, 0.1)
end
end
end
end
function Stuffing.Menu(self, level)
if not level then return end
local info = self.info
wipe(info)
if level ~= 1 then return end
wipe(info)
info.text = BAG_FILTER_CLEANUP.." Blizzard"
info.notCheckable = 1
info.func = function()
if _G["StuffingFrameReagent"] and _G["StuffingFrameReagent"]:IsShown() then
C_Container.SortReagentBankBags()
elseif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then
C_Container.SortBankBags()
else
C_Container.SortBags()
end
end
UIDropDownMenu_AddButton(info, level)
wipe(info)
info.text = BAG_FILTER_CLEANUP
info.notCheckable = 1
info.func = function()
if InCombatLockdown() then
print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return
end
Stuffing:SortBags()
end
UIDropDownMenu_AddButton(info, level)
wipe(info)
info.text = L_BAG_STACK_MENU
info.notCheckable = 1
info.func = function()
if InCombatLockdown() then
print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return
end
Stuffing:SetBagsForSorting("d")
Stuffing:Restack()
end
UIDropDownMenu_AddButton(info, level)
wipe(info)
info.text = L_BAG_SHOW_BAGS
info.checked = function()
return bag_bars == 1
end
info.func = function()
if bag_bars == 1 then
bag_bars = 0
else
bag_bars = 1
end
Stuffing:Layout()
if Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then
Stuffing:Layout(true)
end
end
UIDropDownMenu_AddButton(info, level)
wipe(info)
info.disabled = nil
info.notCheckable = 1
info.text = CLOSE
info.func = self.HideMenu
info.tooltipTitle = CLOSE
UIDropDownMenu_AddButton(info, level)
end
StaticPopupDialogs.BUY_BANK_SLOT = {
text = CONFIRM_BUY_BANK_SLOT,
button1 = YES,
button2 = NO,
OnAccept = PurchaseSlot,
OnShow = function(self)
MoneyFrame_Update(self.moneyFrame, GetBankSlotCost())
end,
hasMoneyFrame = 1,
timeout = 0,
hideOnEscape = 1,
}
-- Kill Blizzard functions
LootWonAlertFrame_OnClick = T.dummy
LootUpgradeFrame_OnClick = T.dummy
LegendaryItemAlertFrame_OnClick = T.dummy
================================================
FILE: ShestakUI/Modules/Blizzard/ClassColorNames.lua
================================================
if IsAddOnLoaded("yClassColor") then return end
----------------------------------------------------------------------------------------
-- Class color guild/friends/etc list(yClassColor by Yleaf)
----------------------------------------------------------------------------------------
local GUILD_INDEX_MAX = 12
local SMOOTH = {1, 0, 0, 1, 1, 0, 0, 1, 0}
local BC = {}
for k, v in pairs(LOCALIZED_CLASS_NAMES_MALE) do
BC[v] = k
end
for k, v in pairs(LOCALIZED_CLASS_NAMES_FEMALE) do
BC[v] = k
end
local RAID_CLASS_COLORS = CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS
local WHITE_HEX = "|cffffffff"
local function Hex(r, g, b)
if type(r) == "table" then
if (r.r) then r, g, b = r.r, r.g, r.b else r, g, b = unpack(r) end
end
if not r or not g or not b then
r, g, b = 1, 1, 1
end
return format("|cff%02x%02x%02x", r * 255, g * 255, b * 255)
end
local function ColorGradient(perc, ...)
if perc >= 1 then
local r, g, b = select(select("#", ...) - 2, ...)
return r, g, b
elseif perc <= 0 then
local r, g, b = ...
return r, g, b
end
local num = select("#", ...) / 3
local segment, relperc = math.modf(perc * (num - 1))
local r1, g1, b1, r2, g2, b2 = select((segment * 3) + 1, ...)
return r1 + (r2 - r1) * relperc, g1 + (g2 - g1) * relperc, b1 + (b2 - b1) * relperc
end
local guildRankColor = setmetatable({}, {
__index = function(t, i)
if i then
local c = Hex(ColorGradient(i / GUILD_INDEX_MAX, unpack(SMOOTH)))
if c then
t[i] = c
return c
else
t[i] = t[0]
end
end
end
})
guildRankColor[0] = WHITE_HEX
local diffColor = setmetatable({}, {
__index = function(t, i)
local c = i and GetQuestDifficultyColor(i)
t[i] = c and Hex(c) or t[0]
return t[i]
end
})
diffColor[0] = WHITE_HEX
local classColor = setmetatable({}, {
__index = function(t, i)
local c = i and RAID_CLASS_COLORS[BC[i] or i]
if c then
t[i] = Hex(c)
return t[i]
else
return WHITE_HEX
end
end
})
local WHITE = {1, 1, 1}
local classColorRaw = setmetatable({}, {
__index = function(t, i)
local c = i and RAID_CLASS_COLORS[BC[i] or i]
if not c then return WHITE end
t[i] = c
return c
end
})
if CUSTOM_CLASS_COLORS then
CUSTOM_CLASS_COLORS:RegisterCallback(function()
wipe(classColorRaw)
wipe(classColor)
end)
end
-- WhoList
local function whoFrame(self)
local playerZone = GetRealZoneText()
local playerGuild = GetGuildInfo("player")
local playerRace = UnitRace("player")
for i = 1, self.ScrollTarget:GetNumChildren() do
local button = select(i, self.ScrollTarget:GetChildren())
local nameText = button.Name
local levelText = button.Level
local variableText = button.Variable
local info = C_FriendList.GetWhoInfo(button.index)
if info then
local guild, level, race, zone, class = info.fullGuildName, info.level, info.raceStr, info.area, info.filename
if zone == playerZone then
zone = "|cff00ff00"..zone
end
if guild == playerGuild then
guild = "|cff00ff00"..guild
end
if race == playerRace then
race = "|cff00ff00"..race
end
local columnTable = {zone, guild, race}
local c = classColorRaw[class]
nameText:SetTextColor(c.r, c.g, c.b)
levelText:SetText(diffColor[level]..level)
variableText:SetText(columnTable[UIDropDownMenu_GetSelectedID(_G.WhoFrameDropDown)])
end
end
end
hooksecurefunc(_G.WhoFrame.ScrollBox, "Update", whoFrame)
-- LFRBrowseList
hooksecurefunc("LFRBrowseFrameListButton_SetData", function(button, index)
local name, level, _, className, _, _, _, class = SearchLFGGetResults(index)
if index and class and name and level then
button.name:SetText(classColor[class]..name)
button.class:SetText(classColor[class]..className)
button.level:SetText(diffColor[level]..level)
button.level:SetWidth(30)
end
end)
-- PVPMatchResults
hooksecurefunc(PVPCellNameMixin, "Populate", function(self, rowData)
local name = rowData.name
local className = rowData.className or ""
local n, r = strsplit("-", name, 2)
n = classColor[className]..n.."|r"
if name == UnitName("player") then
n = ">>> "..n.." <<<"
end
if r then
local color
local faction = rowData.faction
local inArena = IsActiveBattlefieldArena()
if inArena then
if faction == 1 then
color = "|cffffd100"
else
color = "|cff19ff19"
end
else
if faction == 1 then
color = "|cff00adf0"
else
color = "|cffff1919"
end
end
r = color..r.."|r"
n = n.."|cffffffff - |r"..r
end
local text = self.text
text:SetText(n)
end)
local _VIEW
local function viewChanged(view)
_VIEW = view
end
-- GuildList
local function update()
_VIEW = _VIEW or GetCVar("guildRosterView")
local playerArea = GetRealZoneText()
local buttons = GuildRosterContainer.buttons
for _, button in ipairs(buttons) do
if button:IsShown() and button.online and button.guildIndex then
if _VIEW == "tradeskill" then
local _, _, _, headerName, _, _, _, playerName, _, _, _, zone, _, classFileName, isMobile = GetGuildTradeSkillInfo(button.guildIndex)
if not headerName and playerName then
local c = classColorRaw[classFileName]
button.string1:SetTextColor(c.r, c.g, c.b)
if not isMobile and zone == playerArea then
button.string2:SetText("|cff00ff00"..zone)
elseif isMobile then
button.string2:SetText("|cffa5a5a5"..REMOTE_CHAT)
end
end
else
local name, rank, rankIndex, level, _, zone, _, _, _, isAway, classFileName, _, _, isMobile = GetGuildRosterInfo(button.guildIndex)
name = string.gsub(name, "-.*", "")
local displayedName = classColor[classFileName]..name
if isMobile then
if isAway == 1 then
displayedName = "|TInterface\\ChatFrame\\UI-ChatIcon-ArmoryChat-AwayMobile:14:14:0:0:16:16:0:16:0:16|t"..displayedName.." |cffE7E716"..L_CHAT_AFK.."|r"
elseif isAway == 2 then
displayedName = "|TInterface\\ChatFrame\\UI-ChatIcon-ArmoryChat-BusyMobile:14:14:0:0:16:16:0:16:0:16|t"..displayedName.." |cffff0000"..L_CHAT_DND.."|r"
else
displayedName = ChatFrame_GetMobileEmbeddedTexture(0.3, 1, 0.3)..displayedName
end
else
if isAway == 1 then
displayedName = displayedName.." |cffE7E716"..L_CHAT_AFK.."|r"
elseif isAway == 2 then
displayedName = displayedName.." |cffff0000"..L_CHAT_DND.."|r"
else
displayedName = displayedName
end
end
if _VIEW == "playerStatus" then
button.string1:SetText(diffColor[level]..level)
button.string2:SetText(displayedName)
if not isMobile and zone == playerArea then
button.string3:SetText("|cff4cff4c"..zone)
elseif isMobile then
button.string3:SetText("|cffa5a5a5"..REMOTE_CHAT)
end
elseif _VIEW == "guildStatus" then
button.string1:SetText(displayedName)
if rankIndex and rank then
button.string2:SetText(guildRankColor[rankIndex]..rank)
end
elseif _VIEW == "achievement" then
button.string1:SetText(diffColor[level]..level)
if classFileName and name then
button.string2:SetText(displayedName)
end
elseif _VIEW == "reputation" then
button.string1:SetText(diffColor[level]..level)
button.string2:SetText(displayedName)
end
end
end
end
end
local loaded = false
hooksecurefunc("GuildFrame_LoadUI", function()
if loaded then
return
else
loaded = true
hooksecurefunc("GuildRoster_SetView", viewChanged)
hooksecurefunc("GuildRoster_Update", update)
hooksecurefunc(GuildRosterContainer, "update", update)
end
end)
-- CommunitiesFrame
local function RefreshList(self)
local playerArea = GetRealZoneText()
local memberInfo = self:GetMemberInfo()
if memberInfo then
if memberInfo.presence == Enum.ClubMemberPresence.Offline then return end
if memberInfo.zone and memberInfo.zone == playerArea then
self.Zone:SetText("|cff4cff4c"..memberInfo.zone)
end
if memberInfo.level then
self.Level:SetText(diffColor[memberInfo.level]..memberInfo.level)
end
if memberInfo.guildRankOrder and memberInfo.guildRank then
self.Rank:SetText(guildRankColor[memberInfo.guildRankOrder]..memberInfo.guildRank)
end
end
end
local loaded = false
hooksecurefunc("Communities_LoadUI", function()
if loaded then
return
else
loaded = true
hooksecurefunc(CommunitiesMemberListEntryMixin, "RefreshExpandedColumns", RefreshList)
end
end)
-- FriendsList
local FRIENDS_LEVEL_TEMPLATE = FRIENDS_LEVEL_TEMPLATE:gsub("%%d", "%%s")
FRIENDS_LEVEL_TEMPLATE = FRIENDS_LEVEL_TEMPLATE:gsub("%$d", "%$s")
local function friendsFrame(self)
local playerArea = GetRealZoneText()
for i = 1, self.ScrollTarget:GetNumChildren() do
local nameText, infoText
local button = select(i, self.ScrollTarget:GetChildren())
if button:IsShown() then
if button.buttonType == FRIENDS_BUTTON_TYPE_WOW then
local info = C_FriendList.GetFriendInfoByIndex(button.id)
if info.connected then
nameText = classColor[info.className]..info.name.."|r, "..format(FRIENDS_LEVEL_TEMPLATE, diffColor[info.level]..info.level.."|r", info.className)
if info.area == playerArea then
infoText = format("|cff00ff00%s|r", info.area)
end
end
elseif button.buttonType == FRIENDS_BUTTON_TYPE_BNET then
local accountInfo = C_BattleNet.GetFriendAccountInfo(button.id)
if accountInfo.gameAccountInfo.isOnline and accountInfo.gameAccountInfo.clientProgram == BNET_CLIENT_WOW then
local accountName = accountInfo.accountName
local characterName = accountInfo.gameAccountInfo.characterName
local class = accountInfo.gameAccountInfo.className
local areaName = accountInfo.gameAccountInfo.areaName
if accountName and characterName and class then
nameText = format(BATTLENET_NAME_FORMAT, accountName, "").." "..FRIENDS_WOW_NAME_COLOR_CODE.."("..classColor[class]..classColor[class]..characterName..FRIENDS_WOW_NAME_COLOR_CODE..")"
if areaName == playerArea then
infoText = format("|cff00ff00%s|r", areaName)
end
end
end
end
end
if nameText then
button.name:SetText(nameText)
end
if infoText then
button.info:SetText(infoText)
end
end
end
hooksecurefunc(FriendsListFrame.ScrollBox, "Update", friendsFrame)
================================================
FILE: ShestakUI/Modules/Blizzard/ColorPicker.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.general.color_picker ~= true then return end
----------------------------------------------------------------------------------------
-- Improved ColorPicker(ColorPickerPlus by Jaslm)
----------------------------------------------------------------------------------------
local colorBuffer = {}
local editingText
local function UpdateAlphaText()
local a = OpacitySliderFrame:GetValue()
a = (1 - a) * 100
a = math.floor(a + 0.05)
ColorPPBoxA:SetText(string.format("%d", a))
end
local function UpdateAlpha(tbox)
local a = tbox:GetNumber()
if a > 100 then
a = 100
ColorPPBoxA:SetText(string.format("%d", a))
end
a = 1 - (a / 100)
editingText = true
OpacitySliderFrame:SetValue(a)
editingText = nil
end
local function UpdateColorTexts(r, g, b)
if not r then r, g, b = ColorPickerFrame:GetColorRGB() end
r = math.floor (r * 255 + 0.5)
g = math.floor (g * 255 + 0.5)
b = math.floor (b * 255 + 0.5)
ColorPPBoxR:SetText(string.format("%d", r))
ColorPPBoxG:SetText(string.format("%d", g))
ColorPPBoxB:SetText(string.format("%d", b))
ColorPPBoxH:SetText(string.format("%.2x", r)..string.format("%.2x", g)..string.format("%.2x", b))
end
local function UpdateColor(tbox)
local r, g, b = ColorPickerFrame:GetColorRGB()
local id = tbox:GetID()
if id == 1 then
r = string.format("%d", tbox:GetNumber())
if not r then r = 0 end
r = r / 255
elseif id == 2 then
g = string.format("%d", tbox:GetNumber())
if not g then g = 0 end
g = g / 255
elseif id == 3 then
b = string.format("%d", tbox:GetNumber())
if not b then b = 0 end
b = b / 255
elseif id == 4 then
-- hex values
if tbox:GetNumLetters() == 6 then
local rgb = tbox:GetText()
r, g, b = tonumber("0x"..strsub(rgb, 0, 2)), tonumber("0x"..strsub(rgb, 3, 4)), tonumber("0x"..strsub(rgb, 5, 6))
if not r then r = 0 else r = r / 255 end
if not g then g = 0 else g = g / 255 end
if not b then b = 0 else b = b / 255 end
else
return
end
end
-- This takes care of updating the hex entry when changing rgb fields and vice versa
UpdateColorTexts(r, g, b)
editingText = true
ColorPickerFrame:SetColorRGB(r, g, b)
ColorSwatch:SetColorTexture(r, g, b)
editingText = nil
end
local load = CreateFrame("Frame")
load:RegisterEvent("PLAYER_ENTERING_WORLD")
load:SetScript("OnEvent", function(self)
self:UnregisterAllEvents()
if IsAddOnLoaded("ColorPickerPlus") then return end
ColorPickerFrame:HookScript("OnShow", function()
-- Get color that will be replaced
local r, g, b = ColorPickerFrame:GetColorRGB()
ColorPPOldColorSwatch:SetColorTexture(r, g, b)
-- Show/hide the alpha box
if ColorPickerFrame.hasOpacity then
ColorPPBoxA:Show()
ColorPPBoxLabelA:Show()
ColorPPBoxH:SetScript("OnTabPressed", function() ColorPPBoxA:SetFocus() end)
UpdateAlphaText()
else
ColorPPBoxA:Hide()
ColorPPBoxLabelA:Hide()
ColorPPBoxH:SetScript("OnTabPressed", function() ColorPPBoxR:SetFocus() end)
end
end)
ColorPickerFrame:HookScript("OnColorSelect", function(_, r, g, b)
ColorSwatch:SetColorTexture(r, g, b)
if not editingText then
UpdateColorTexts(r, g, b)
end
end)
OpacitySliderFrame:HookScript("OnValueChanged", function()
if not editingText then
UpdateAlphaText()
end
end)
-- Make the Color Picker dialog a bit taller, to make room for edit boxes
ColorPickerFrame:SetHeight(ColorPickerFrame:GetHeight() + 40)
-- Move the Color Swatch
ColorSwatch:ClearAllPoints()
ColorSwatch:SetPoint("TOPLEFT", ColorPickerFrame, "TOPLEFT", 230, -45)
-- Add Color Swatch for original color
local t = ColorPickerFrame:CreateTexture("ColorPPOldColorSwatch")
local w, h = ColorSwatch:GetSize()
t:SetSize(w * 0.75, h * 0.75)
t:SetColorTexture(0, 0, 0)
-- OldColorSwatch to appear beneath ColorSwatch
t:SetDrawLayer("BORDER")
t:SetPoint("BOTTOMLEFT", "ColorSwatch", "TOPRIGHT", -(w / 2), -(h / 3))
-- Add Color Swatch for the copied color
t = ColorPickerFrame:CreateTexture("ColorPPCopyColorSwatch")
t:SetSize(w, h)
t:SetColorTexture(0, 0, 0)
t:Hide()
-- Add copy button to the ColorPickerFrame
local b = CreateFrame("Button", "ColorPPCopy", ColorPickerFrame, "UIPanelButtonTemplate")
b:SkinButton()
b:SetText(CALENDAR_COPY_EVENT)
b:SetWidth(85)
b:SetHeight(22)
b:SetPoint("TOPLEFT", "ColorSwatch", "BOTTOMLEFT", -15, -5)
-- Copy color into buffer on button click
b:SetScript("OnClick", function()
-- Copy current dialog colors into buffer
colorBuffer.r, colorBuffer.g, colorBuffer.b = ColorPickerFrame:GetColorRGB()
-- Enable Paste button and display copied color into swatch
ColorPPPaste:Enable()
ColorPPCopyColorSwatch:SetColorTexture(colorBuffer.r, colorBuffer.g, colorBuffer.b)
ColorPPCopyColorSwatch:Show()
if ColorPickerFrame.hasOpacity then
colorBuffer.a = OpacitySliderFrame:GetValue()
else
colorBuffer.a = nil
end
end)
-- Paste button
b = CreateFrame("Button", "ColorPPPaste", ColorPickerFrame, "UIPanelButtonTemplate")
b:SetText(CALENDAR_PASTE_EVENT)
b:SkinButton()
b:SetWidth(85)
b:SetHeight(22)
b:SetPoint("TOPLEFT", "ColorPPCopy", "BOTTOMLEFT", 0, -7)
b:Disable()
-- Paste color on button click, updating frame components
b:SetScript("OnClick", function()
ColorPickerFrame:SetColorRGB(colorBuffer.r, colorBuffer.g, colorBuffer.b)
ColorSwatch:SetColorTexture(colorBuffer.r, colorBuffer.g, colorBuffer.b)
if ColorPickerFrame.hasOpacity then
if colorBuffer.a then -- Color copied had an alpha value
OpacitySliderFrame:SetValue(colorBuffer.a)
end
end
end)
-- ClassColor button
b = CreateFrame("Button", "ColorPPClass", ColorPickerFrame, "UIPanelButtonTemplate")
b:SkinButton()
b:SetText(CLASS)
b:SetWidth(b:GetWidth() + 10)
b:SetHeight(22)
b:SetPoint("TOPRIGHT", "ColorPPPaste", "BOTTOMRIGHT", 0, -7)
b:SetScript("OnClick", function()
ColorPickerFrame:SetColorRGB(T.color.r, T.color.g, T.color.b)
ColorSwatch:SetColorTexture(T.color.r, T.color.g, T.color.b)
if ColorPickerFrame.hasOpacity then
OpacitySliderFrame:SetValue(0)
end
end)
-- Locate Color Swatch for copy color
ColorPPCopyColorSwatch:SetPoint("LEFT", "ColorSwatch", "LEFT")
ColorPPCopyColorSwatch:SetPoint("TOP", "ColorPPPaste", "BOTTOM", 0, -5)
-- Move the Opacity Slider Frame to align with bottom of Copy ColorSwatch
OpacitySliderFrame:ClearAllPoints()
OpacitySliderFrame:SetPoint("BOTTOM", "ColorPPCopyColorSwatch", "BOTTOM", 0, 23)
OpacitySliderFrame:SetPoint("RIGHT", "ColorPickerFrame", "RIGHT", -35, 18)
-- Set up edit box frames and interior label and text areas
local boxes = {"R", "G", "B", "H", "A"}
for i = 1, table.getn(boxes) do
local rgb = boxes[i]
local box = CreateFrame("EditBox", "ColorPPBox"..rgb, ColorPickerFrame, "InputBoxTemplate")
T.SkinEditBox(box)
box:SetID(i)
box:SetFrameStrata("DIALOG")
box:SetAutoFocus(false)
box:SetTextInsets(0, 7, 1, 0)
box:SetJustifyH("RIGHT")
box:SetHeight(14)
if i == 4 then
-- Hex entry box
box:SetMaxLetters(6)
box:SetWidth(60)
box:SetNumeric(false)
else
box:SetMaxLetters(3)
box:SetWidth(40)
box:SetNumeric(true)
end
box:SetPoint("TOP", "ColorPickerWheel", "BOTTOM", 0, -15)
-- Label
local label = box:CreateFontString("ColorPPBoxLabel"..rgb, "ARTWORK", "GameFontNormalSmall")
label:SetTextColor(1, 1, 1)
label:SetPoint("RIGHT", "ColorPPBox"..rgb, "LEFT", -5, 0)
if i == 4 then
label:SetText("#")
else
label:SetText(rgb)
end
-- Set up scripts to handle event appropriately
if i == 5 then
box:SetScript("OnEscapePressed", function(self) self:ClearFocus() UpdateAlphaText() end)
box:SetScript("OnEnterPressed", function(self) self:ClearFocus() UpdateAlphaText() end)
box:SetScript("OnTextChanged", function(self) UpdateAlpha(self) end)
else
box:SetScript("OnEscapePressed", function(self) self:ClearFocus() UpdateColorTexts() end)
box:SetScript("OnEnterPressed", function(self) self:ClearFocus() UpdateColorTexts() end)
box:SetScript("OnTextChanged", function(self) UpdateColor(self) end)
end
box:SetScript("OnEditFocusGained", function(self) self:SetCursorPosition(0) self:HighlightText() end)
box:SetScript("OnEditFocusLost", function(self) self:HighlightText(0, 0) end)
box:SetScript("OnTextSet", function(self) self:ClearFocus() end)
box:Show()
end
-- Finish up with placement
ColorPPBoxR:SetPoint("BOTTOMLEFT", "ColorPickerOkayButton", "TOPLEFT", 13, 24)
ColorPPBoxG:SetPoint("LEFT", "ColorPPBoxR", "RIGHT", 18, 0)
ColorPPBoxB:SetPoint("LEFT", "ColorPPBoxG", "RIGHT", 18, 0)
ColorPPBoxH:SetPoint("LEFT", "ColorPPBoxB", "RIGHT", 18, 0)
ColorPPBoxA:SetPoint("LEFT", "ColorPPBoxH", "RIGHT", 18, 0)
-- Define the order of tab cursor movement
ColorPPBoxR:SetScript("OnTabPressed", function() ColorPPBoxG:SetFocus() end)
ColorPPBoxG:SetScript("OnTabPressed", function() ColorPPBoxB:SetFocus() end)
ColorPPBoxB:SetScript("OnTabPressed", function() ColorPPBoxH:SetFocus() end)
ColorPPBoxA:SetScript("OnTabPressed", function() ColorPPBoxR:SetFocus() end)
-- Make the color picker movable
local mover = CreateFrame("Frame", nil, ColorPickerFrame)
mover:SetPoint("TOPLEFT", ColorPickerFrame, "TOPLEFT", 0, 0)
mover:SetPoint("BOTTOMRIGHT", ColorPickerFrame, "TOPRIGHT", 0, -15)
mover:EnableMouse(true)
mover:SetScript("OnMouseDown", function() ColorPickerFrame:StartMoving() end)
mover:SetScript("OnMouseUp", function() ColorPickerFrame:StopMovingOrSizing() end)
ColorPickerFrame:EnableKeyboard(false)
end)
================================================
FILE: ShestakUI/Modules/Blizzard/CombatText.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.combattext.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Combat Text(xCT by Affli)
----------------------------------------------------------------------------------------
-- Justify messages in frames
local ct = {
["justify_1"] = "LEFT", -- Incoming damage justify
["justify_2"] = "RIGHT", -- Incoming healing justify
["justify_3"] = "CENTER", -- Various messages justify
["justify_4"] = "RIGHT", -- Outgoing damage/healing justify
}
-- Do not edit below unless you know what you are doing
local numf
if C.combattext.damage or C.combattext.healing then
numf = 4
else
numf = 3
end
-- Detect vehicle
local function SetUnit()
if UnitHasVehicleUI("player") then
ct.unit = "vehicle"
else
ct.unit = "player"
end
CombatTextSetActiveUnit(ct.unit)
end
-- Limit lines
local function LimitLines()
for i = 1, #ct.frames do
local f = ct.frames[i]
if i == 4 and C.combattext.icons then
f:SetMaxLines(math.floor(f:GetHeight() / (C.combattext.icon_size * 1.5)))
else
f:SetMaxLines(math.floor(f:GetHeight() / C.font.combat_text_font_size - 1))
end
end
end
-- Scrollable frames
local function SetScroll()
for i = 1, #ct.frames do
ct.frames[i]:EnableMouseWheel(true)
ct.frames[i]:SetScript("OnMouseWheel", function(self, delta)
if delta > 0 then
self:ScrollUp()
elseif delta < 0 then
self:ScrollDown()
end
end)
end
end
-- Partial resists styler
local part = "-%s [%s %s]"
local r, g, b, lowMana, lowHealth
-- Function, handles everything
local function OnEvent(_, event, subevent, powerType)
if event == "COMBAT_TEXT_UPDATE" then
local arg2, arg3 = GetCurrentCombatTextEventInfo()
if not CVarCallbackRegistry:GetCVarValueBool("enableFloatingCombatText") then
return
else
if subevent == "DAMAGE" then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
end
xCT1:AddMessage("-"..arg2, 0.75, 0.1, 0.1)
elseif subevent == "DAMAGE_CRIT" then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
end
xCT1:AddMessage("|cffFF0000"..C.combattext.crit_prefix.."|r".."-"..arg2.."|cffFF0000"..C.combattext.crit_postfix.."|r", 1, 0.1, 0.1)
elseif subevent == "SPELL_DAMAGE" then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
end
xCT1:AddMessage("-"..arg2, 0.75, 0.3, 0.85)
elseif subevent == "SPELL_DAMAGE_CRIT" then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
end
xCT1:AddMessage("|cffFF0000"..C.combattext.crit_prefix.."|r".."-"..arg2.."|cffFF0000"..C.combattext.crit_postfix.."|r", 1, 0.3, 0.5)
elseif subevent == "HEAL" then
if arg3 >= C.combattext.heal_treshold then
if C.combattext.short_numbers == true then
arg3 = T.ShortValue(arg3)
end
if arg2 then
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextFriendlyHealers") then
xCT2:AddMessage(arg2.." +"..arg3, 0.1, 0.75, 0.1)
else
xCT2:AddMessage("+"..arg3, 0.1, 0.75, 0.1)
end
end
end
elseif subevent == "HEAL_CRIT" then
if arg3 >= C.combattext.heal_treshold then
if C.combattext.short_numbers == true then
arg3 = T.ShortValue(arg3)
end
if arg2 then
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextFriendlyHealers") then
xCT2:AddMessage(arg2.." +"..arg3, 0.1, 1, 0.1)
else
xCT2:AddMessage("+"..arg3, 0.1, 1, 0.1)
end
end
end
elseif subevent == "PERIODIC_HEAL" then
if arg3 >= C.combattext.heal_treshold then
if C.combattext.short_numbers == true then
arg3 = T.ShortValue(arg3)
end
xCT2:AddMessage("+"..arg3, 0.1, 0.5, 0.1)
end
elseif subevent == "ABSORB_ADDED" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextCombatHealingAbsorbSelf") then
if arg3 >= C.combattext.heal_treshold then
if C.combattext.short_numbers == true then
arg3 = T.ShortValue(arg3)
end
if arg2 then
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextFriendlyHealers") then
xCT2:AddMessage(arg2.." +"..arg3, 0.6, 0.65, 0.1)
else
xCT2:AddMessage("+"..arg3, 0.6, 0.65, 0.1)
end
end
end
elseif subevent == "SPELL_CAST" then
xCT3:AddMessage(arg2, 1, 0.82, 0)
elseif subevent == "MISS" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(MISS, 0.5, 0.5, 0.5)
elseif subevent == "DODGE" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(DODGE, 0.5, 0.5, 0.5)
elseif subevent == "PARRY" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(PARRY, 0.5, 0.5, 0.5)
elseif subevent == "EVADE" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(EVADE, 0.5, 0.5, 0.5)
elseif subevent == "IMMUNE" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(IMMUNE, 0.5, 0.5, 0.5)
elseif subevent == "DEFLECT" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(DEFLECT, 0.5, 0.5, 0.5)
elseif subevent == "REFLECT" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(REFLECT, 0.5, 0.5, 0.5)
elseif subevent == "SPELL_MISS" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(MISS, 0.5, 0.5, 0.5)
elseif subevent == "SPELL_DODGE"and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(DODGE, 0.5, 0.5, 0.5)
elseif subevent == "SPELL_PARRY" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(PARRY, 0.5, 0.5, 0.5)
elseif subevent == "SPELL_EVADE" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(EVADE, 0.5, 0.5, 0.5)
elseif subevent == "SPELL_IMMUNE" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(IMMUNE, 0.5, 0.5, 0.5)
elseif subevent == "SPELL_DEFLECT" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(DEFLECT, 0.5, 0.5, 0.5)
elseif subevent == "SPELL_REFLECT" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDodgeParryMiss") then
xCT1:AddMessage(REFLECT, 0.5, 0.5, 0.5)
elseif subevent == "RESIST" then
if arg3 then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
arg3 = T.ShortValue(arg3)
end
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(part:format(arg2, RESIST, arg3), 0.75, 0.5, 0.5)
else
xCT1:AddMessage("-"..arg2, 0.75, 0.1, 0.1)
end
elseif CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(RESIST, 0.5, 0.5, 0.5)
end
elseif subevent == "BLOCK" then
if arg3 then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
arg3 = T.ShortValue(arg3)
end
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(part:format(arg2, BLOCK, arg3), 0.75, 0.5, 0.5)
else
xCT1:AddMessage("-"..arg2, 0.75, 0.1, 0.1)
end
elseif CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(BLOCK, 0.5, 0.5, 0.5)
end
elseif subevent == "ABSORB" then
if arg3 then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
arg3 = T.ShortValue(arg3)
end
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(part:format(arg2, ABSORB, arg3), 0.75, 0.5, 0.5)
else
xCT1:AddMessage("-"..arg2, 0.75, 0.1, 0.1)
end
elseif CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(ABSORB, 0.5, 0.5, 0.5)
end
elseif subevent == "SPELL_RESIST" then
if arg3 then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
arg3 = T.ShortValue(arg3)
end
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(part:format(arg2, RESIST, arg3), 0.5, 0.3, 0.5)
else
xCT1:AddMessage("-"..arg2, 0.75, 0.3, 0.85)
end
elseif CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(RESIST, 0.5, 0.5, 0.5)
end
elseif subevent == "SPELL_BLOCK" then
if arg3 then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
arg3 = T.ShortValue(arg3)
end
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(part:format(arg2, BLOCK, arg3), 0.5, 0.3, 0.5)
else
xCT1:AddMessage("-"..arg2, 0.75, 0.3, 0.85)
end
elseif CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(BLOCK, 0.5, 0.5, 0.5)
end
elseif subevent == "SPELL_ABSORB" then
if arg3 then
if C.combattext.short_numbers == true then
arg2 = T.ShortValue(arg2)
arg3 = T.ShortValue(arg3)
end
if CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(part:format(arg2, ABSORB, arg3), 0.5, 0.3, 0.5)
else
xCT1:AddMessage("-"..arg2, 0.75, 0.3, 0.85)
end
elseif CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextDamageReduction") then
xCT1:AddMessage(ABSORB, 0.5, 0.5, 0.5)
end
elseif (subevent == "ENERGIZE" or subevent == "PERIODIC_ENERGIZE") and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextEnergyGains") then
if tonumber(arg2) > 0 then
if arg3 then
if arg3 == "MANA" or arg3 == "RAGE" or arg3 == "FOCUS" or arg3 == "ENERGY" or arg3 == "RUNIC_POWER" or arg3 == "DEMONIC_FURY" then
xCT3:AddMessage("+"..arg2.." ".._G[arg3], PowerBarColor[arg3].r, PowerBarColor[arg3].g, PowerBarColor[arg3].b)
elseif arg3 == "HOLY_POWER" or arg3 == "SOUL_SHARDS" or arg3 == "CHI" or arg3 == "ARCANE_CHARGES" then
local numPower = UnitPower("player", GetPowerEnumFromEnergizeString(arg3))
xCT3:AddMessage("<"..numPower.." ".._G[arg3]..">", PowerBarColor[arg3].r, PowerBarColor[arg3].g, PowerBarColor[arg3].b)
end
end
end
elseif subevent == "SPELL_AURA_START" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextAuras") then
xCT3:AddMessage("+"..arg2, 1, 0.5, 0.5)
elseif subevent == "SPELL_AURA_END" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextAuras") then
xCT3:AddMessage("-"..arg2, 0.5, 0.5, 0.5)
elseif subevent == "SPELL_AURA_START_HARMFUL" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextAuras") then
xCT3:AddMessage("+"..arg2, 1, 0.1, 0.1)
elseif subevent == "SPELL_AURA_END_HARMFUL" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextAuras") then
xCT3:AddMessage("-"..arg2, 0.1, 1, 0.1)
elseif subevent == "HONOR_GAINED" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextHonorGains") then
arg2 = tonumber(arg2)
if arg2 and abs(arg2) > 1 then
arg2 = floor(arg2)
if arg2 > 0 then
xCT3:AddMessage(HONOR.." +"..arg2, 0.1, 0.1, 1)
end
end
elseif subevent == "FACTION" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextRepChanges") then
xCT3:AddMessage(arg2.." +"..arg3, 0.1, 0.1, 1)
elseif subevent == "SPELL_ACTIVE" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextReactives") then
xCT3:AddMessage(arg2, 1, 0.82, 0)
end
end
elseif event == "UNIT_HEALTH" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextLowManaHealth") then
if subevent == ct.unit then
if UnitHealth(ct.unit) / UnitHealthMax(ct.unit) <= COMBAT_TEXT_LOW_HEALTH_THRESHOLD then
if not lowHealth then
xCT3:AddMessage(HEALTH_LOW, 1, 0.1, 0.1)
lowHealth = true
end
else
lowHealth = nil
end
end
elseif event == "UNIT_MANA" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextLowManaHealth") then
if subevent == ct.unit then
local _, powerToken = UnitPowerType(ct.unit)
if powerToken == "MANA" and (UnitPower(ct.unit) / UnitPowerMax(ct.unit)) <= COMBAT_TEXT_LOW_MANA_THRESHOLD then
if not lowMana then
xCT3:AddMessage(MANA_LOW, 1, 0.1, 0.1)
lowMana = true
end
else
lowMana = nil
end
end
elseif event == "PLAYER_REGEN_ENABLED" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextCombatState") then
xCT3:AddMessage("-"..LEAVING_COMBAT, 0.1, 1, 0.1)
elseif event == "PLAYER_REGEN_DISABLED" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextCombatState") then
xCT3:AddMessage("+"..ENTERING_COMBAT, 1, 0.1, 0.1)
elseif event == "UNIT_POWER_UPDATE" and CVarCallbackRegistry:GetCVarValueBool("floatingCombatTextEnergyGains") then
if subevent == ct.unit then
if powerType and powerType ~= 'COMBO_POINTS' then return end
local cp = UnitPower(ct.unit, 4)
if cp > 0 then
r, g, b = 1, 0.82, 0
if cp == MAX_COMBO_POINTS then
r, g, b = 0, 0.82, 1
end
xCT3:AddMessage(format(COMBAT_TEXT_COMBO_POINTS, cp), r, g, b)
end
end
elseif event == "RUNE_POWER_UPDATE" then
local arg1 = subevent
if GetRuneCooldown(arg1) ~= 0 then return end
xCT3:AddMessage("+"..COMBAT_TEXT_RUNE_DEATH, 0.75, 0, 0)
elseif event == "UNIT_ENTERED_VEHICLE" or event == "UNIT_EXITING_VEHICLE" then
local arg1 = subevent
if arg1 == "player" then
SetUnit()
end
elseif event == "PLAYER_ENTERING_WORLD" then
SetUnit()
if C.combattext.scrollable then
SetScroll()
else
LimitLines()
end
if C.combattext.damage or C.combattext.healing then
ct.pguid = UnitGUID("player")
end
end
end
-- Change damage font
if C.combattext.damage_style then
DAMAGE_TEXT_FONT = C.font.combat_text_font
end
-- Hide blizzard combat text
if C.combattext.blizz_head_numbers ~= true then
SetCVar("floatingCombatTextCombatHealing", 0)
SetCVar("floatingCombatTextCombatDamage", 0)
else
SetCVar("floatingCombatTextCombatHealing", 1)
SetCVar("floatingCombatTextCombatDamage", 1)
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGOUT")
frame:SetScript("OnEvent", function(_, event)
if event == "PLAYER_LOGOUT" then
SetCVar("floatingCombatTextCombatHealing", 1)
SetCVar("floatingCombatTextCombatDamage", 1)
end
end)
-- Frames
ct.locked = true
ct.frames = {}
for i = 1, numf do
local f = CreateFrame("ScrollingMessageFrame", "xCT"..i, UIParent)
f:SetFont(C.font.combat_text_font, C.font.combat_text_font_size, C.font.combat_text_font_style)
f:SetShadowColor(0, 0, 0, C.font.combat_text_font_shadow and 1 or 0)
f:SetShadowOffset(C.font.combat_text_font_shadow and 1 or 0, C.font.combat_text_font_shadow and -1 or 0)
f:SetTimeVisible(C.combattext.time_visible)
f:SetMaxLines(C.combattext.max_lines)
f:SetSpacing(1)
f:SetWidth(128)
f:SetHeight(112)
f:SetPoint("CENTER", 0, 0)
f:SetMovable(true)
f:SetResizable(true)
f:SetResizeBounds(128, 128, 768, 768)
f:SetClampedToScreen(true)
f:SetClampRectInsets(0, 0, C.font.combat_text_font_size, 0)
f:SetInsertMode(C.combattext.direction and 2 or 1)
if i == 1 then
f:SetJustifyH(ct.justify_1)
if C.unitframe.enable == true and _G.oUF_Player then
f:SetPoint("BOTTOMLEFT", "oUF_Player", "TOPLEFT", -3, 60)
else
f:SetPoint("CENTER", -192, -32)
end
elseif i == 2 then
f:SetJustifyH(ct.justify_2)
if C.unitframe.enable == true and _G.oUF_Player then
f:SetPoint("BOTTOMRIGHT", "oUF_Player", "TOPRIGHT", 5, 60)
else
f:SetPoint("CENTER", 192, -32)
end
elseif i == 3 then
f:SetJustifyH(ct.justify_3)
f:SetWidth(256)
f:SetPoint("CENTER", 0, 205)
else
f:SetJustifyH(ct.justify_4)
f:SetWidth(200)
if C.combattext.icons then
f:SetHeight(150)
end
if C.unitframe.enable == true and _G.oUF_Target then
f:SetPoint("BOTTOMRIGHT", "oUF_Target", "TOPRIGHT", 2, 278)
else
f:SetPoint("CENTER", 330, 205)
end
local a, _, c = f:GetFont()
if C.font.combat_text_font_size == "auto" then
if C.combattext.icons then
f:SetFont(a, C.combattext.icon_size / 2, c)
end
elseif type(C.font.combat_text_font_size) == "number" then
f:SetFont(a, C.font.combat_text_font_size, c)
end
end
ct.frames[i] = f
end
-- Register events
local xCT = CreateFrame("Frame")
xCT:RegisterEvent("COMBAT_TEXT_UPDATE")
xCT:RegisterEvent("UNIT_HEALTH")
xCT:RegisterEvent("UNIT_MANA")
xCT:RegisterEvent("PLAYER_REGEN_DISABLED")
xCT:RegisterEvent("PLAYER_REGEN_ENABLED")
xCT:RegisterEvent("UNIT_POWER_UPDATE")
if C.combattext.dk_runes and T.class == "DEATHKNIGHT" then
xCT:RegisterEvent("RUNE_POWER_UPDATE")
end
xCT:RegisterEvent("UNIT_ENTERED_VEHICLE")
xCT:RegisterEvent("UNIT_EXITING_VEHICLE")
xCT:RegisterEvent("PLAYER_ENTERING_WORLD")
xCT:SetScript("OnEvent", OnEvent)
-- Turn off Blizzard CT
CombatText:UnregisterAllEvents()
CombatText:SetScript("OnLoad", nil)
CombatText:SetScript("OnEvent", nil)
CombatText:SetScript("OnUpdate", nil)
-- Steal external messages sent by other addons using CombatText_AddMessage
hooksecurefunc("CombatText_AddMessage", function(message, _, r, g, b)
local lastEntry = COMBAT_TEXT_TO_ANIMATE[#COMBAT_TEXT_TO_ANIMATE]
CombatText_RemoveMessage(lastEntry)
xCT3:AddMessage(message, r, g, b)
end)
-- Color printer
local pr = function(msg)
print(tostring(msg))
end
-- Configmode and testmode
local StartConfigmode = function()
if not InCombatLockdown()then
for i = 1, #ct.frames do
local f = ct.frames[i]
f:SetTemplate("Transparent")
f:SetBackdropBorderColor(1, 0, 0, 1)
f.fs = f:CreateFontString(nil, "OVERLAY")
f.fs:SetFont(C.font.combat_text_font, C.font.combat_text_font_size, C.font.combat_text_font_style)
f.fs:SetPoint("BOTTOM", f, "TOP", 0, 0)
if i == 1 then
f.fs:SetText(DAMAGE)
f.fs:SetTextColor(1, 0.1, 0.1, 0.9)
elseif i == 2 then
f.fs:SetText(SHOW_COMBAT_HEALING)
f.fs:SetTextColor(0.1, 1, 0.1, 0.9)
elseif i == 3 then
f.fs:SetText(COMBAT_TEXT_LABEL)
f.fs:SetTextColor(0.1, 0.1, 1, 0.9)
else
f.fs:SetText(SCORE_DAMAGE_DONE.." / "..SCORE_HEALING_DONE)
f.fs:SetTextColor(1, 1, 0, 0.9)
end
f.t = f:CreateTexture(nil, "ARTWORK")
f.t:SetPoint("TOPLEFT", f, "TOPLEFT", 1, -1)
f.t:SetPoint("TOPRIGHT", f, "TOPRIGHT", -1, -19)
f.t:SetHeight(20)
f.t:SetColorTexture(0.5, 0.5, 0.5)
f.t:SetAlpha(0.3)
f.d = f:CreateTexture(nil, "ARTWORK")
f.d:SetHeight(16)
f.d:SetWidth(16)
f.d:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -1, 1)
f.d:SetColorTexture(0.5, 0.5, 0.5)
f.d:SetAlpha(0.3)
if not f.tr then
f.tr = CreateFrame("Frame", nil, f)
f.tr:SetScript("OnDragStart", function(self)
self:GetParent():StartMoving()
end)
f.tr:SetScript("OnDragStop", function(self)
self:GetParent():StopMovingOrSizing()
end)
f.tr:EnableMouse(true)
f.tr:RegisterForDrag("LeftButton")
f.tr:SetPoint("TOPLEFT", f, "TOPLEFT", 0, 0)
f.tr:SetPoint("TOPRIGHT", f, "TOPRIGHT", 0, 0)
f.tr:SetHeight(20)
end
f:EnableMouse(true)
f:RegisterForDrag("LeftButton")
f:SetScript("OnDragStart", f.StartSizing)
if not C.combattext.scrollable then
if i == 4 and C.combattext.icons then
f:SetScript("OnSizeChanged", function(self)
self:SetMaxLines(math.floor(self:GetHeight() / (C.combattext.icon_size * 1.5)))
self:Clear()
end)
else
f:SetScript("OnSizeChanged", function(self)
self:SetMaxLines(math.floor(self:GetHeight() / C.font.combat_text_font_size - 1))
self:Clear()
end)
end
end
f:SetScript("OnDragStop", f.StopMovingOrSizing)
ct.locked = false
end
pr("|cffffff00"..L_COMBATTEXT_UNLOCKED.."|r")
else
pr("|cffffff00"..ERR_NOT_IN_COMBAT.."|r")
end
end
local function EndConfigmode()
for i = 1, #ct.frames do
local f = ct.frames[i]
f:SetBackdrop(nil)
f.iborder:Hide()
f.oborder:Hide()
f.fs:Hide()
f.fs = nil
f.t:Hide()
f.t = nil
f.d:Hide()
f.d = nil
f.tr = nil
f:EnableMouse(false)
f:SetScript("OnDragStart", nil)
f:SetScript("OnDragStop", nil)
end
ct.locked = true
pr("|cffffff00"..L_COMBATTEXT_UNSAVED.."|r")
end
local function StartTestMode()
-- Init random number generator
local random = math.random
random(time()); random(); random(time())
local TimeSinceLastUpdate = 0
local UpdateInterval
if C.combattext.damage_color then
ct.dmindex = {}
ct.dmindex[1] = 1
ct.dmindex[2] = 2
ct.dmindex[3] = 4
ct.dmindex[4] = 8
ct.dmindex[5] = 16
ct.dmindex[6] = 32
ct.dmindex[7] = 64
end
for i = 1, #ct.frames do
ct.frames[i]:SetScript("OnUpdate", function(_, elapsed)
UpdateInterval = random(65, 1000) / 250
TimeSinceLastUpdate = TimeSinceLastUpdate + elapsed
if TimeSinceLastUpdate > UpdateInterval then
if i == 1 then
ct.frames[i]:AddMessage("-"..random(100000), 1, random(255) / 255, random(255) / 255)
elseif i == 2 then
ct.frames[i]:AddMessage("+"..random(50000), 0.1, random(128, 255) / 255, 0.1)
elseif i == 3 then
ct.frames[i]:AddMessage(COMBAT_TEXT_LABEL, random(255) / 255, random(255) / 255, random(255) / 255)
elseif i == 4 then
local msg
local icon
local color = {}
msg = random(40000)
if C.combattext.icons then
_, _, icon = GetSpellInfo(msg)
if not icon then
icon = GetSpellTexture(6603)
end
end
if icon then
msg = msg.." \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
if C.combattext.damage_color then
color = ct.dmgcolor[ct.dmindex[random(#ct.dmindex)]]
else
color = {1, 1, 0}
end
elseif C.combattext.damage_color and not C.combattext.icons then
color = ct.dmgcolor[ct.dmindex[random(#ct.dmindex)]]
elseif not C.combattext.damage_color then
color = {1, 1, random(0, 1)}
end
ct.frames[i]:AddMessage(msg, unpack(color))
end
TimeSinceLastUpdate = 0
end
end)
ct.testmode = true
end
end
local function EndTestMode()
for i = 1, #ct.frames do
ct.frames[i]:SetScript("OnUpdate", nil)
ct.frames[i]:Clear()
end
if C.combattext.damage_color then
ct.dmindex = nil
end
ct.testmode = false
end
-- Popup dialog
StaticPopupDialogs.XCT_LOCK = {
text = L_COMBATTEXT_POPUP,
button1 = ACCEPT,
button2 = CANCEL,
OnAccept = function() if not InCombatLockdown() then ReloadUI() else EndConfigmode() end end,
OnCancel = EndConfigmode,
timeout = 0,
whileDead = 1,
hideOnEscape = true,
showAlert = true,
preferredIndex = 5,
}
local placed = {
"xCT1",
"xCT2",
"xCT3",
"xCT4"
}
-- Slash commands
SlashCmdList.XCT = function(input)
input = string.lower(input)
if input == "move" then
if ct.locked then
StartConfigmode()
if not ct.testmode then
StartTestMode()
end
else
StaticPopup_Show("XCT_LOCK")
if ct.testmode then
EndTestMode()
end
end
elseif input == "test" then
if ct.testmode then
EndTestMode()
pr("|cffffff00"..L_COMBATTEXT_TEST_DISABLED.."|r")
else
StartTestMode()
pr("|cffffff00"..L_COMBATTEXT_TEST_ENABLED.."|r")
end
elseif input == "reset" then
for _, v in pairs(placed) do
if _G[v] then
_G[v]:SetUserPlaced(false)
end
end
ReloadUI()
else
pr("|cffffff00"..L_COMBATTEXT_TEST_USE_MOVE.."|r")
pr("|cffffff00"..L_COMBATTEXT_TEST_USE_TEST.."|r")
pr("|cffffff00"..L_COMBATTEXT_TEST_USE_RESET.."|r")
end
end
SLASH_XCT1 = "/xct"
SLASH_XCT2 = "/чсе"
-- Spam merger
local SQ
if C.combattext.merge_aoe_spam then
if C.combattext.damage or C.combattext.healing then
local pairs = pairs
SQ = {}
for k in pairs(T.aoespam) do
SQ[k] = {queue = 0, msg = "", color = {}, count = 0, utime = 0, locked = false}
end
ct.SpamQueue = function(spellId, add)
local amount
local spam = SQ[spellId]["queue"]
if spam and type(spam) == "number" then
amount = spam + add
else
amount = add
end
return amount
end
local tslu = 0
local xCTspam = CreateFrame("Frame")
xCTspam:SetScript("OnUpdate", function(_, elapsed)
local count
tslu = tslu + elapsed
if tslu > 0.5 then
tslu = 0
local utime = time()
for k in pairs(SQ) do
if not SQ[k]["locked"] and SQ[k]["queue"] > 0 and SQ[k]["utime"] <= utime then
if SQ[k]["count"] > 1 then
count = " |cffFFFFFF x "..SQ[k]["count"].."|r"
else
count = ""
end
if C.combattext.short_numbers == true then
SQ[k]["queue"] = T.ShortValue(SQ[k]["queue"])
end
xCT4:AddMessage(SQ[k]["queue"]..count..SQ[k]["msg"], unpack(SQ[k]["color"]))
SQ[k]["queue"] = 0
SQ[k]["count"] = 0
end
end
end
end)
end
end
local unpack, select, time = unpack, select, time
local gflags = bit.bor(COMBATLOG_OBJECT_AFFILIATION_MINE,
COMBATLOG_OBJECT_REACTION_FRIENDLY,
COMBATLOG_OBJECT_CONTROL_PLAYER,
COMBATLOG_OBJECT_TYPE_GUARDIAN
)
-- Damage
if C.combattext.damage then
local xCTd = CreateFrame("Frame")
if C.combattext.damage_color then
ct.dmgcolor = {}
ct.dmgcolor[1] = {1, 1, 0} -- Physical
ct.dmgcolor[2] = {1, 0.9, 0.5} -- Holy
ct.dmgcolor[4] = {1, 0.5, 0} -- Fire
ct.dmgcolor[8] = {0.3, 1, 0.3} -- Nature
ct.dmgcolor[16] = {0.5, 1, 1} -- Frost
ct.dmgcolor[32] = {0.5, 0.5, 1} -- Shadow
ct.dmgcolor[64] = {1, 0.5, 1} -- Arcane
end
if C.combattext.icons then
ct.blank = "Interface\\AddOns\\ShestakUI\\Media\\Textures\\Blank.tga"
end
local misstypes = {ABSORB = ABSORB, BLOCK = BLOCK, DEFLECT = DEFLECT, DODGE = DODGE, EVADE = EVADE, IMMUNE = IMMUNE, MISS = MISS, MISFIRE = MISS, PARRY = PARRY, REFLECT = REFLECT, RESIST = RESIST}
local dmg = function()
local msg, icon
local _, eventType, _, sourceGUID, _, sourceFlags, _, destGUID = CombatLogGetCurrentEventInfo()
if (sourceGUID == ct.pguid and destGUID ~= ct.pguid) or (sourceGUID == UnitGUID("pet") and C.combattext.pet_damage) or (sourceFlags == gflags) then
if eventType == "SWING_DAMAGE" then
local amount, _, _, _, _, _, critical = select(12, CombatLogGetCurrentEventInfo())
if amount >= C.combattext.treshold then
local rawamount = amount
if C.combattext.short_numbers == true then
amount = T.ShortValue(amount)
end
if critical then
amount = "|cffFF0000"..C.combattext.crit_prefix.."|r"..amount.."|cffFF0000"..C.combattext.crit_postfix.."|r"
end
if C.combattext.icons then
if (sourceGUID == UnitGUID("pet")) or (sourceFlags == gflags) then
icon = PET_ATTACK_TEXTURE
else
icon = GetSpellTexture(6603)
end
end
if icon then
msg = " \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
elseif C.combattext.icons then
msg = " \124T"..ct.blank..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
else
msg = ""
end
local color = {1, 1, 1}
if C.combattext.merge_aoe_spam and C.combattext.merge_melee then
local spellId = 6603
SQ[spellId]["locked"] = true
SQ[spellId]["queue"] = ct.SpamQueue(spellId, rawamount)
SQ[spellId]["msg"] = msg
SQ[spellId]["color"] = color
SQ[spellId]["count"] = SQ[spellId]["count"] + 1
if SQ[spellId]["count"] == 1 then
SQ[spellId]["utime"] = time() + T.aoespam[spellId]
end
SQ[spellId]["locked"] = false
return
end
xCT4:AddMessage(amount..""..msg, unpack(color))
end
elseif eventType == "RANGE_DAMAGE" then
local spellId, _, _, amount, _, _, _, _, _, critical = select(12, CombatLogGetCurrentEventInfo())
if amount >= C.combattext.treshold then
local rawamount = amount
if C.combattext.short_numbers == true then
amount = T.ShortValue(amount)
end
if critical then
amount = "|cffFF0000"..C.combattext.crit_prefix.."|r"..amount.."|cffFF0000"..C.combattext.crit_postfix.."|r"
end
if C.combattext.icons then
icon = GetSpellTexture(spellId)
end
if icon then
msg = " \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
elseif C.combattext.icons then
msg = " \124T"..ct.blank..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
else
msg = ""
end
if C.combattext.merge_aoe_spam then
spellId = T.merge[spellId] or spellId
if T.aoespam[spellId] then
SQ[spellId]["locked"] = true
SQ[spellId]["queue"] = ct.SpamQueue(spellId, rawamount)
SQ[spellId]["msg"] = msg
SQ[spellId]["count"] = SQ[spellId]["count"] + 1
if SQ[spellId]["count"] == 1 then
SQ[spellId]["utime"] = time() + T.aoespam[spellId]
end
SQ[spellId]["locked"] = false
return
end
end
xCT4:AddMessage(amount..""..msg)
end
elseif eventType == "SPELL_DAMAGE" or (eventType == "SPELL_PERIODIC_DAMAGE" and C.combattext.dot_damage) then
local spellId, _, spellSchool, amount, _, _, _, _, _, critical = select(12, CombatLogGetCurrentEventInfo())
if amount >= C.combattext.treshold then
local color = {}
local rawamount = amount
if C.combattext.short_numbers == true then
amount = T.ShortValue(amount)
end
if critical then
amount = "|cffFF0000"..C.combattext.crit_prefix.."|r"..amount.."|cffFF0000"..C.combattext.crit_postfix.."|r"
end
if C.combattext.icons then
icon = GetSpellTexture(spellId)
end
if C.combattext.damage_color then
if ct.dmgcolor[spellSchool] then
color = ct.dmgcolor[spellSchool]
else
color = ct.dmgcolor[1]
end
else
color = {1, 1, 0}
end
if icon then
msg = " \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
elseif C.combattext.icons then
msg = " \124T"..ct.blank..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
else
msg = ""
end
if C.combattext.merge_aoe_spam then
spellId = T.merge[spellId] or spellId
if bit.band(sourceFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) ~= COMBATLOG_OBJECT_AFFILIATION_MINE then
spellId = 6603
end
if (sourceGUID == UnitGUID("pet") or sourceFlags == gflags or C.combattext.merge_all) and not T.aoespam[spellId] then
T.aoespam[spellId] = 3
SQ[spellId] = {queue = 0, msg = "", color = {}, count = 0, utime = 0, locked = false}
end
if T.aoespam[spellId] then
SQ[spellId]["locked"] = true
SQ[spellId]["queue"] = ct.SpamQueue(spellId, rawamount)
SQ[spellId]["msg"] = msg
SQ[spellId]["color"] = color
SQ[spellId]["count"] = SQ[spellId]["count"] + 1
if SQ[spellId]["count"] == 1 then
SQ[spellId]["utime"] = time() + T.aoespam[spellId]
end
SQ[spellId]["locked"] = false
return
end
end
xCT4:AddMessage(amount..""..msg, unpack(color))
end
elseif eventType == "SWING_MISSED" then
local missType = select(12, CombatLogGetCurrentEventInfo())
if C.combattext.icons then
if sourceGUID == UnitGUID("pet") or sourceFlags == gflags then
icon = PET_ATTACK_TEXTURE
else
icon = GetSpellTexture(6603)
end
missType = misstypes[missType].." \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
else
missType = misstypes[missType]
end
xCT4:AddMessage(missType)
elseif eventType == "SPELL_MISSED" or eventType == "RANGE_MISSED" then
local spellId, _, _, missType = select(12, CombatLogGetCurrentEventInfo())
if missType == "IMMUNE" and spellId == 204242 then return end -- Consecration slow
if C.combattext.icons then
icon = GetSpellTexture(spellId)
missType = misstypes[missType].." \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
else
missType = misstypes[missType]
end
xCT4:AddMessage(missType)
elseif eventType == "SPELL_DISPEL" and C.combattext.dispel then
local id, effect, _, etype = select(15, CombatLogGetCurrentEventInfo())
local color
if C.combattext.icons then
icon = GetSpellTexture(id)
end
if icon then
msg = " \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
elseif C.combattext.icons then
msg = " \124T"..ct.blank..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
else
msg = ""
end
if etype == "BUFF" then
color = {0, 1, 0.5}
else
color = {1, 0, 0.5}
end
xCT3:AddMessage(ACTION_SPELL_DISPEL..": "..effect..msg, unpack(color))
elseif eventType == "SPELL_STOLEN" and C.combattext.dispel then
local id, effect = select(15, CombatLogGetCurrentEventInfo())
local color = {1, 0.5, 0}
if C.combattext.icons then
icon = GetSpellTexture(id)
end
if icon then
msg = " \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
elseif C.combattext.icons then
msg = " \124T"..ct.blank..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
else
msg = ""
end
xCT3:AddMessage(ACTION_SPELL_STOLEN..": "..effect..msg, unpack(color))
elseif eventType == "SPELL_INTERRUPT" and C.combattext.interrupt then
local id, effect = select(15, CombatLogGetCurrentEventInfo())
local color = {1, 0.5, 0}
if C.combattext.icons then
icon = GetSpellTexture(id)
end
if icon then
msg = " \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
elseif C.combattext.icons then
msg = " \124T"..ct.blank..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
else
msg = ""
end
xCT3:AddMessage(ACTION_SPELL_INTERRUPT..": "..effect..msg, unpack(color))
elseif eventType == "PARTY_KILL" and C.combattext.killingblow then
local destGUID, tname = select(8, CombatLogGetCurrentEventInfo())
local classIndex = select(2, GetPlayerInfoByGUID(destGUID))
local color = classIndex and RAID_CLASS_COLORS[classIndex] or {r = 0.2, g = 1, b = 0.2}
xCT3:AddMessage("|cff33FF33"..ACTION_PARTY_KILL..": |r"..tname, color.r, color.g, color.b)
end
end
end
xCTd:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
xCTd:SetScript("OnEvent", dmg)
end
-- Healing
if C.combattext.healing then
local xCTh = CreateFrame("Frame")
if C.combattext.icons then
ct.blank = "Interface\\AddOns\\ShestakUI\\Media\\Textures\\Blank.tga"
end
local heal = function()
local msg, icon
local _, eventType, _, sourceGUID, _, sourceFlags = CombatLogGetCurrentEventInfo()
if sourceGUID == ct.pguid or sourceFlags == gflags then
if eventType == "SPELL_HEAL" or (eventType == "SPELL_PERIODIC_HEAL" and C.combattext.show_hots) then
if C.combattext.healing then
local spellId, _, _, amount, overhealing, _, critical = select(12, CombatLogGetCurrentEventInfo())
if T.healfilter[spellId] then
return
end
if amount >= C.combattext.heal_treshold then
local color = {}
local rawamount = amount
if C.combattext.show_overhealing and abs(overhealing) > 0 then
if C.combattext.short_numbers == true then
amount = T.ShortValue(math.floor(amount-overhealing)).." ["..T.ShortValue(floor(overhealing)).."]"
else
amount = math.floor(amount-overhealing).." ["..floor(overhealing).."]"
end
else
if C.combattext.short_numbers == true then
amount = T.ShortValue(amount)
end
end
if critical then
amount = "|cffFF0000"..C.combattext.crit_prefix.."|r"..amount.."|cffFF0000"..C.combattext.crit_postfix.."|r"
color = {0.1, 1, 0.1}
else
color = {0.1, 0.65, 0.1}
end
if C.combattext.icons then
icon = GetSpellTexture(spellId)
else
msg = ""
end
if icon then
msg = " \124T"..icon..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
elseif C.combattext.icons then
msg = " \124T"..ct.blank..":"..C.combattext.icon_size..":"..C.combattext.icon_size..":0:0:64:64:5:59:5:59\124t"
end
if C.combattext.merge_aoe_spam then
spellId = T.merge[spellId] or spellId
if T.aoespam[spellId] then
SQ[spellId]["locked"] = true
SQ[spellId]["queue"] = ct.SpamQueue(spellId, rawamount)
SQ[spellId]["msg"] = msg
SQ[spellId]["color"] = color
SQ[spellId]["count"] = SQ[spellId]["count"] + 1
if SQ[spellId]["count"] == 1 then
SQ[spellId]["utime"] = time() + T.aoespam[spellId]
end
SQ[spellId]["locked"] = false
return
end
end
xCT4:AddMessage(amount..""..msg, unpack(color))
end
end
end
end
end
xCTh:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
xCTh:SetScript("OnEvent", heal)
end
-- Check outdated spells
if C.combattext.merge_aoe_spam then
for spell in pairs(T.aoespam) 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
for spell in pairs(T.merge) 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
end
if C.combattext.healing then
for spell in pairs(T.healfilter) 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
end
================================================
FILE: ShestakUI/Modules/Blizzard/Durability.lua
================================================
----------------------------------------------------------------------------------------
-- Durability value on slot buttons in CharacterFrame(tekability by Tekkub)
----------------------------------------------------------------------------------------
local SLOTIDS = {}
for _, slot in pairs({"Head", "Shoulder", "Chest", "Waist", "Legs", "Feet", "Wrist", "Hands", "MainHand", "SecondaryHand"}) do
SLOTIDS[slot] = GetInventorySlotInfo(slot.."Slot")
end
local frame = CreateFrame("Frame", nil, CharacterFrame)
local function RYGColorGradient(perc)
local relperc = perc * 2 % 1
if perc <= 0 then
return 1, 0, 0
elseif perc < 0.5 then
return 1, relperc, 0
elseif perc == 0.5 then
return 1, 1, 0
elseif perc < 1.0 then
return 1 - relperc, 1, 0
else
return 0, 1, 0
end
end
local fontstrings = setmetatable({}, {
__index = function(t, i)
local gslot = _G["Character"..i.."Slot"]
local fstr = gslot:CreateFontString(nil, "OVERLAY", "SystemFont_Outline_Small")
fstr:SetPoint("BOTTOM", gslot, "BOTTOM", 0, 1)
t[i] = fstr
return fstr
end,
})
function frame:OnEvent()
local min = 1
for slot, id in pairs(SLOTIDS) do
local v1, v2 = GetInventoryItemDurability(id)
if v1 and v2 and v2 ~= 0 then
min = math.min(v1 / v2, min)
local str = fontstrings[slot]
str:SetTextColor(RYGColorGradient(v1 / v2))
if v1 < v2 then
str:SetText(string.format("%d%%", v1 / v2 * 100))
else
str:SetText(nil)
end
else
local str = rawget(fontstrings, slot)
if str then str:SetText(nil) end
end
end
end
frame:SetScript("OnEvent", frame.OnEvent)
frame:RegisterEvent("ADDON_LOADED")
frame:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
================================================
FILE: ShestakUI/Modules/Blizzard/Errors.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Clear UIErrorsFrame(module from Kousei by Haste)
----------------------------------------------------------------------------------------
if C.general.error_filter == "WHITELIST" or C.general.error_filter == "BLACKLIST" then
local frame = CreateFrame("Frame")
frame:RegisterEvent("UI_ERROR_MESSAGE")
frame:SetScript("OnEvent", function(_, _, messageType, text)
if C.general.error_filter == "WHITELIST" then
if T.white_list[text] then
UIErrorsFrame:TryDisplayMessage(messageType, text, RED_FONT_COLOR:GetRGB())
else
L_INFO_ERRORS = text
end
elseif C.general.error_filter == "BLACKLIST" then
if T.black_list[text] then
L_INFO_ERRORS = text
else
UIErrorsFrame:TryDisplayMessage(messageType, text, RED_FONT_COLOR:GetRGB())
end
end
end)
UIErrorsFrame:UnregisterEvent("UI_ERROR_MESSAGE")
end
SlashCmdList.ERROR = function()
UIErrorsFrame:AddMessage(L_INFO_ERRORS, 1, 0, 0)
end
SLASH_ERROR1 = "/error"
----------------------------------------------------------------------------------------
-- Clear all UIErrors frame in combat
----------------------------------------------------------------------------------------
if C.general.error_filter == "COMBAT" then
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_REGEN_DISABLED")
frame:RegisterEvent("PLAYER_REGEN_ENABLED")
frame:SetScript("OnEvent", function(_, event)
if event == "PLAYER_REGEN_DISABLED" then
UIErrorsFrame:UnregisterEvent("UI_ERROR_MESSAGE")
else
UIErrorsFrame:RegisterEvent("UI_ERROR_MESSAGE")
end
end)
end
================================================
FILE: ShestakUI/Modules/Blizzard/Fixes.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Fix blank tooltip
----------------------------------------------------------------------------------------
local bug = nil
local FixTooltip = CreateFrame("Frame")
FixTooltip:RegisterEvent("UPDATE_BONUS_ACTIONBAR")
FixTooltip:RegisterEvent("ACTIONBAR_PAGE_CHANGED")
FixTooltip:SetScript("OnEvent", function()
if GameTooltip:IsShown() then
bug = true
end
end)
local FixTooltipBags = CreateFrame("Frame")
FixTooltipBags:RegisterEvent("BAG_UPDATE_DELAYED")
FixTooltipBags:SetScript("OnEvent", function()
if StuffingFrameBags and StuffingFrameBags:IsShown() then
if GameTooltip:IsShown() then
bug = true
end
end
end)
GameTooltip:HookScript("OnTooltipCleared", function(self)
if self:IsForbidden() then return end
if bug and self:NumLines() == 0 then
self:Hide()
bug = false
end
end)
----------------------------------------------------------------------------------------
-- Fix RemoveTalent() taint
----------------------------------------------------------------------------------------
FCF_StartAlertFlash = T.dummy
----------------------------------------------------------------------------------------
-- Fix DeclensionFrame strata
----------------------------------------------------------------------------------------
if T.client == "ruRU" then
_G["DeclensionFrame"]:SetFrameStrata("HIGH")
end
----------------------------------------------------------------------------------------
-- Fix SearchLFGLeave() taint
----------------------------------------------------------------------------------------
local TaintFix = CreateFrame("Frame")
TaintFix:SetScript("OnUpdate", function()
if LFRBrowseFrame.timeToClear then
LFRBrowseFrame.timeToClear = nil
end
end)
----------------------------------------------------------------------------------------
-- Fix Keybind taint
----------------------------------------------------------------------------------------
_G.SettingsPanel.TransitionBackOpeningPanel = _G.HideUIPanel
----------------------------------------------------------------------------------------
-- Allow to show ProfessionsFrame and AuctionHouseFrame together
----------------------------------------------------------------------------------------
function GetMaxUIPanelsWidth()
if UIParent:GetRight() < 1925 and UIParent:GetRight() > 1915 then
return UIParent:GetRight() - UIParent:GetAttribute("RIGHT_OFFSET_BUFFER") + 110
else
return UIParent:GetRight() - UIParent:GetAttribute("RIGHT_OFFSET_BUFFER")
end
end
------------------------------------------------------------------------
-- !!NoTaint2, first-aid addon for Dragon Flight action bars taint.
-- Code by warbaby 2022-11 http://abyui.top https://github.com/aby-ui
-------------------------------------------------------------------------
if IsAddOnLoaded("!!NoTaint2") then return end
if not NoTaint2_Proc_ResetActionButtonAction then
NoTaint2_Proc_ResetActionButtonAction = 1
-- use /run ActionButton2.action = 2 ActionButton2:UpdateAction() to test
function NoTaint2_ResetActionButtonAction(self)
local ok, tainted_by = issecurevariable(self, "action")
if not ok and not InCombatLockdown() then
self.action=nil
self:SetAttribute("_aby", "action")
-- if self:IsVisible() then NoTaint2_ShowWarning(tainted_by) end
end
end
for _, v in ipairs(ActionBarButtonEventsFrame.frames) do
hooksecurefunc(v, "UpdateAction", NoTaint2_ResetActionButtonAction)
end
local f1 = CreateFrame("Frame")
f1:RegisterEvent("PLAYER_REGEN_ENABLED")
f1:SetScript("OnEvent", function(self, event, ...)
for _, v in ipairs(ActionBarButtonEventsFrame.frames) do
NoTaint2_ResetActionButtonAction(v)
end
end)
end
if not NoTaint2_CleanStaticPopups then
--code since !NoTaint, test: /run StaticPopup_Show('PARTY_INVITE',"a") /dump issecurevariable(StaticPopup1, "which")
function NoTaint2_CleanStaticPopups()
for index = 1, STATICPOPUP_NUMDIALOGS, 1 do
local frame = _G["StaticPopup"..index];
if not issecurevariable(frame, "which") then
if frame:IsShown() then
local info = StaticPopupDialogs[frame.which];
if info and not issecurevariable(info, "OnCancel") then
info.OnCancel()
end
frame:Hide()
end
frame.which = nil
end
end
end
function NoTaint2_CleanDropDownList()
local frameToShow = LFDQueueFrameTypeDropDown
local parent = frameToShow:GetParent()
frameToShow:SetParent(nil) --to show
--RequestLFDPlayerLockInfo() --to trigger LFG_LOCK_INFO_RECEIVED
frameToShow:SetParent(parent)
end
local global_obj_name = {
UIDROPDOWNMENU_MAXBUTTONS = 1,
UIDROPDOWNMENU_MAXLEVELS = 1,
UIDROPDOWNMENU_OPEN_MENU = 1,
UIDROPDOWNMENU_INIT_MENU = 1,
OBJECTIVE_TRACKER_UPDATE_REASON = 1,
}
function NoTaint2_CleanGlobal(self)
for k, _ in pairs(global_obj_name) do
if not issecurevariable(k) then
--print("clean", k, issecurevariable(k))
_G[k] = nil
end
end
--ObjectiveTrackerFrame.lastMapID = nil
end
hooksecurefunc(EditModeManagerFrame, "ClearActiveChangesFlags", function(self)
for _, systemFrame in ipairs(self.registeredSystemFrames) do
systemFrame:SetHasActiveChanges(nil);
end
self:SetHasActiveChanges(nil);
end)
-- not sure if this is of any use. PetFrame and ActionBar call it.
hooksecurefunc(EditModeManagerFrame, "HideSystemSelections", function(self)
if self.editModeActive == false then
self.editModeActive = nil
end
end)
hooksecurefunc(EditModeManagerFrame, "IsEditModeLocked", function()
NoTaint2_CleanGlobal()
end)
local function cleanAll()
NoTaint2_CleanDropDownList()
NoTaint2_CleanStaticPopups()
NoTaint2_CleanGlobal()
end
local Origin_IsShown = EditModeManagerFrame.IsShown
hooksecurefunc(EditModeManagerFrame, "IsShown", function(self)
if Origin_IsShown(self) then return end
local stack = debugstack(4)
--call from UIParent.lua if ( not frame or frame:IsShown() ) then
--different when hooked
if stack:find('[string "=[C]"]: in function `ShowUIPanel\'\n', 1, true) then
cleanAll()
end
end)
-- In case the stack check is failed, assure the game menu entrance.
-- Running cleanAll() multi times has no side effects.
GameMenuButtonEditMode:HookScript("PreClick", cleanAll)
end
if not NoTaint2_Proc_StopEnterWorldLayout then
NoTaint2_Proc_StopEnterWorldLayout = 1
local f2 = CreateFrame("Frame")
f2:RegisterEvent("PLAYER_LEAVING_WORLD")
f2:RegisterEvent("PLAYER_ENTERING_WORLD")
f2:SetScript("OnEvent", function(self, event, ...)
if event == "PLAYER_ENTERING_WORLD" then
local login, reload = ...
if not login and not reload then
NoTaint2_CleanDropDownList()
NoTaint2_CleanStaticPopups()
NoTaint2_CleanGlobal()
end
EditModeManagerFrame:RegisterEvent("EDIT_MODE_LAYOUTS_UPDATED")
elseif event == "PLAYER_LEAVING_WORLD" then
EditModeManagerFrame:UnregisterEvent("EDIT_MODE_LAYOUTS_UPDATED")
end
end)
end
if not NoTaint2_Proc_CleanActionButtonFlyout then
NoTaint2_Proc_CleanActionButtonFlyout = 1
--[[------------------------------------------------------------
this is totally magic, thanks god ObjectiveTrackerFrame is after the ActionBars
---------------------------------------------------------------]]
local barsToUpdate = { MainMenuBar, MultiBarBottomLeft, MultiBarBottomRight, StanceBar, PetActionBar, PossessActionBar, MultiBarRight, MultiBarLeft, MultiBar5, MultiBar6, MultiBar7 }
for _, bar in ipairs(barsToUpdate) do
hooksecurefunc(bar, "UpdateSpellFlyoutDirection", function(self)
if not issecurevariable(self, "flyoutDirection") then
self.flyoutDirection = nil
end
if not issecurevariable(self, "snappedToFrame") then
self.snappedToFrame = nil
end
end)
end
hooksecurefunc("SetClampedTextureRotation", function(texture)
local parent = texture and texture:GetParent()
if parent and parent.FlyoutArrowPushed and parent.FlyoutArrowHighlight then
if not issecurevariable(texture, "rotationDegrees") then
texture.rotationDegrees = nil
end
end
end)
end
================================================
FILE: ShestakUI/Modules/Blizzard/Fonts.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Based on tekticles(by Tekkub)
----------------------------------------------------------------------------------------
local SetFont = function(obj, font, size, style, r, g, b, sr, sg, sb, sox, soy)
if not obj then return end
obj:SetFont(font, size, style or "")
if sr and sg and sb then obj:SetShadowColor(sr, sg, sb) end
if sox and soy then obj:SetShadowOffset(sox, soy) end
if r and g and b then obj:SetTextColor(r, g, b) end
end
local frame = CreateFrame("Frame", nil, UIParent)
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(_, _, addon)
if addon ~= "ShestakUI" or addon == "tekticles" then return end
local NORMAL = C.media.normal_font
-- local BLANK = C.media.blank_font
UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT = 12
CHAT_FONT_HEIGHTS = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
UNIT_NAME_FONT = NORMAL
STANDARD_TEXT_FONT = NORMAL
-- Base fonts
SetFont(AchievementFont_Small, NORMAL, 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(InvoiceFont_Med, NORMAL, 13, nil, 0.15, 0.09, 0.04)
SetFont(InvoiceFont_Small, NORMAL, 11, nil, 0.15, 0.09, 0.04)
SetFont(MailFont_Large, NORMAL, 15, nil, 0, 0, 0, 0, 0, 0, C.skins.blizzard_frames and 1, C.skins.blizzard_frames and -1)
SetFont(NumberFont_Outline_Huge, NORMAL, 30, "THICKOUTLINE", 30)
SetFont(NumberFont_Outline_Large, NORMAL, 17, "OUTLINE")
SetFont(NumberFont_Outline_Med, NORMAL, 15, "OUTLINE")
SetFont(NumberFont_Shadow_Med, NORMAL, 14)
SetFont(NumberFont_Shadow_Small, NORMAL, 13, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(NumberFont_Normal_Med, NORMAL, 13)
SetFont(NumberFont_Small, NORMAL, 10)
SetFont(QuestFont_Large, NORMAL, 16)
SetFont(QuestFont_Shadow_Huge, NORMAL, 19, nil, nil, nil, nil, 0.54, 0.4, 0.1)
SetFont(QuestFont_Shadow_Small, NORMAL, 15)
SetFont(QuestFont_Super_Huge, NORMAL, 20, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(QuestFont_Huge, NORMAL, 17, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(QuestFont_Enormous, NORMAL, 30, nil, 1, 0.82, 0)
SetFont(ReputationDetailFont, NORMAL, 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(SpellFont_Small, NORMAL, 11)
SetFont(SystemFont_InverseShadow_Small, NORMAL, 11)
SetFont(SystemFont_Large, NORMAL, 17)
SetFont(SystemFont_Huge1, NORMAL, 20)
SetFont(SystemFont_Huge2, NORMAL, 24)
SetFont(SystemFont_Med1, NORMAL, 13)
SetFont(SystemFont_Med2, NORMAL, 14, nil, 0.15, 0.09, 0.04)
SetFont(SystemFont_Med3, NORMAL, 15)
SetFont(SystemFont_Outline, NORMAL, 13, "OUTLINE")
SetFont(SystemFont_OutlineThick_Huge2, NORMAL, 22, "THICKOUTLINE")
SetFont(SystemFont_OutlineThick_Huge4, NORMAL, 27, "THICKOUTLINE")
SetFont(SystemFont_OutlineThick_WTF, NORMAL, 31, "THICKOUTLINE", nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(SystemFont_Huge1_Outline, NORMAL, 19, "OUTLINE")
SetFont(SystemFont_Outline_Small, NORMAL, 12, "OUTLINE")
SetFont(SystemFont_Shadow_Huge1, NORMAL, 20)
SetFont(SystemFont_Shadow_Huge3, NORMAL, 25)
SetFont(SystemFont_Shadow_Large, NORMAL, 17)
SetFont(SystemFont_Shadow_Large2, NORMAL, 17)
SetFont(SystemFont_Shadow_Med1, NORMAL, 13)
SetFont(SystemFont_Shadow_Med2, NORMAL, 13)
SetFont(SystemFont_Shadow_Med3, NORMAL, 15)
SetFont(SystemFont22_Shadow_Outline, NORMAL, 22, "OUTLINE")
SetFont(SystemFont_Shadow_Small, NORMAL, 11)
SetFont(SystemFont_Shadow_Small2, NORMAL, 11)
SetFont(SystemFont_Small, NORMAL, 12)
SetFont(SystemFont_Small2, NORMAL, 12)
SetFont(SystemFont_Tiny, NORMAL, 11)
SetFont(GameTooltipHeader, NORMAL, C.font.tooltip_header_font_size, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(Tooltip_Med, NORMAL, C.font.tooltip_font_size, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(Tooltip_Small, NORMAL, GetLocale() == "zhTW" and 12 or 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(FriendsFont_Small, NORMAL, 11)
SetFont(FriendsFont_Normal, NORMAL, 12)
SetFont(FriendsFont_Large, NORMAL, 15)
SetFont(FriendsFont_UserText, NORMAL, 11)
SetFont(CoreAbilityFont, NORMAL, 32, nil, 1, 0.82, 0, 0, 0, 0, 1, -1)
SetFont(ChatBubbleFont, NORMAL, C.font.bubble_font_size)
SetFont(Game13FontShadow, NORMAL, 14)
SetFont(Game32Font_Shadow2, NORMAL, 32)
SetFont(Game15Font_o1, NORMAL, 15)
SetFont(Fancy14Font, NORMAL, 14)
SetFont(Game18Font, NORMAL, 18)
SetFont(Game16Font, NORMAL, 16)
SetFont(Game12Font, NORMAL, 12)
SetFont(Game13Font, NORMAL, 13)
SetFont(Fancy16Font, NORMAL, 16)
SetFont(FriendsFont_11, NORMAL, 11)
SetFont(PriceFont, NORMAL, 13)
SetFont(Number11Font, NORMAL, 10)
SetFont(Number12Font, NORMAL, 11)
SetFont(Number12FontOutline, NORMAL, 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(Number13Font, NORMAL, 12)
SetFont(Number15Font, NORMAL, 14)
SetFont(Game11Font_o1, NORMAL, 11, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(Game12Font_o1, NORMAL, 12, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(Game13Font_o1, NORMAL, 13, nil, nil, nil, nil, 0, 0, 0, 1, -1)
-- Derived fonts
SetFont(BossEmoteNormalHuge, NORMAL, 27, "THICKOUTLINE")
SetFont(ErrorFont, NORMAL, 16)
SetFont(QuestFontNormalSmall, NORMAL, 13, nil, nil, nil, nil, 0.54, 0.4, 0.1)
SetFont(WorldMapTextFont, NORMAL, 32, "OUTLINE")
SetFont(SubZoneTextFont, NORMAL, 30, "OUTLINE")
SetFont(WhiteNormalNumberFont, NORMAL, 11)
SetFont(ZoneTextString, NORMAL, 32, "OUTLINE")
SetFont(SubZoneTextString, NORMAL, 25, "OUTLINE")
SetFont(PVPInfoTextString, NORMAL, 22, "THINOUTLINE")
SetFont(PVPArenaTextString, NORMAL, 22, "THINOUTLINE")
SetFont(QuestMapRewardsFont, NORMAL, 12, nil, nil, nil, nil, 0, 0, 0, 1, -1)
SetFont(NumberFontNormalSmall, NORMAL, 11, "OUTLINE")
end)
-- Registering fonts in LibSharedMedia
local LSM = LibStub and LibStub:GetLibrary("LibSharedMedia-3.0", true)
local LOCALE_MASK = 0
if GetLocale() == "koKR" then
LOCALE_MASK = 1
elseif GetLocale() == "ruRU" then
LOCALE_MASK = 2
elseif GetLocale() == "zhCN" then
LOCALE_MASK = 4
elseif GetLocale() == "zhTW" then
LOCALE_MASK = 8
else
LOCALE_MASK = 128
end
if LSM then
LSM:Register(LSM.MediaType.FONT, "Calibri", [[Interface\AddOns\ShestakUI\Media\Fonts\Normal.ttf]], LOCALE_MASK)
LSM:Register(LSM.MediaType.FONT, "Hooge", [[Interface\AddOns\ShestakUI\Media\Fonts\Pixel.ttf]], LOCALE_MASK)
LSM:Register(LSM.MediaType.STATUSBAR, "Smooth!", [[Interface\AddOns\ShestakUI\Media\Textures\Texture.tga]])
end
================================================
FILE: ShestakUI/Modules/Blizzard/LibShowUIPanel.lua
================================================
-- LibShowUIPanel-1.0.lua
-- @Author : Dencer (tdaddon@163.com)
-- @Link : https://dengsir.github.io
-- @Date : 6/15/2021, 11:20:01 PM
--
local MAJOR, MINOR = 'LibShowUIPanel-1.0', 6
local Lib, oldminor = LibStub and LibStub:NewLibrary(MAJOR, MINOR)
if not Lib then
return
end
local ShowUIPanel = ShowUIPanel
local HideUIPanel = HideUIPanel
local InCombatLockdown = InCombatLockdown
Lib.Delegate = Lib.Delegate or (function()
local frame = EnumerateFrames()
while frame do
if frame.SetUIPanel and issecurevariable(frame, 'SetUIPanel') then
return frame
end
frame = EnumerateFrames(frame)
end
end)()
local Delegate = Lib.Delegate
local function GetUIPanelWindowInfo(frame, name)
if not frame:GetAttribute('UIPanelLayout-defined') then
local info = UIPanelWindows[frame:GetName()]
if not info then
return
end
frame:SetAttribute('UIPanelLayout-defined', true)
for k, v in pairs(info) do
frame:SetAttribute('UIPanelLayout-' .. k, v)
end
end
return frame:GetAttribute('UIPanelLayout-' .. name)
end
local function ShowPanel(frame, force)
if not frame or frame:IsShown() then
return
end
if not GetUIPanelWindowInfo(frame, 'area') then
frame:Show()
return
end
Delegate:SetAttribute('panel-force', force)
Delegate:SetAttribute('panel-frame', frame)
Delegate:SetAttribute('panel-show', true)
end
local function HidePanel(frame, skipSetPoint)
if not frame or not frame:IsShown() then
return
end
if not GetUIPanelWindowInfo(frame, 'area') then
frame:Hide()
return
end
Delegate:SetAttribute('panel-frame', frame)
Delegate:SetAttribute('panel-skipSetPoint', skipSetPoint)
Delegate:SetAttribute('panel-hide', true)
end
function Lib.Show(frame, force)
if not InCombatLockdown() then
return ShowUIPanel(frame, force)
else
return ShowPanel(frame, force)
end
end
function Lib.Hide(frame, skipSetPoint)
if not InCombatLockdown() then
return HideUIPanel(frame, skipSetPoint)
else
return HidePanel(frame, skipSetPoint)
end
end
function Lib.Toggle(frame)
if frame:IsShown() then
Lib.Hide(frame)
else
Lib.Show(frame)
end
end
if not oldminor or oldminor < 6 then
-- 可长期持有的API
function Lib.ShowUIPanel(frame, force)
return Lib.Show(frame, force)
end
function Lib.HideUIPanel(frame, skipSetPoint)
return Lib.Hide(frame, skipSetPoint)
end
function Lib.ToggleFrame(frame)
return Lib.Toggle(frame)
end
end
---- hooks
if not Lib.OnCallShowUIPanel then
hooksecurefunc('ShowUIPanel', function(...)
return Lib.OnCallShowUIPanel(...)
end)
end
if not Lib.OnCallHideUIPanel then
hooksecurefunc('HideUIPanel', function(...)
return Lib.OnCallHideUIPanel(...)
end)
end
function Lib.OnCallShowUIPanel(frame, force)
if not frame or frame:IsShown() or not InCombatLockdown() then
return
end
return ShowPanel(frame, force)
end
function Lib.OnCallHideUIPanel(frame, skipSetPoint)
if not frame or not frame:IsShown() or not InCombatLockdown() then
return
end
return HidePanel(frame, skipSetPoint)
end
================================================
FILE: ShestakUI/Modules/Blizzard/Mail.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if IsAddOnLoaded("OpenAll") or IsAddOnLoaded("Postal") or IsAddOnLoaded("TradeSkillMaster_Mailing") then return end
----------------------------------------------------------------------------------------
-- Grab mail in 1 button(OpenAll by Kemayo)
----------------------------------------------------------------------------------------
local deletedelay, t = 0.5, 0
local takingOnlyCash = false
local button, button2, waitForMail, openAll, openAllCash, openMail, lastopened, stopOpening, onEvent, needsToWait, copper_to_pretty_money, total_cash
local baseInboxFrame_OnClick
-- local profit = 0
function openAll()
if GetInboxNumItems() == 0 then return end
button:SetScript("OnClick", nil)
button2:SetScript("OnClick", nil)
baseInboxFrame_OnClick = InboxFrame_OnClick
InboxFrame_OnClick = function() end
button:RegisterEvent("UI_ERROR_MESSAGE")
openMail(GetInboxNumItems())
end
function openAllCash()
takingOnlyCash = true
openAll()
end
function openMail(index)
if not InboxFrame:IsVisible() then return stopOpening(L_MAIL_NEED) end
if index == 0 then MinimapCluster.IndicatorFrame.MailFrame:Hide() return stopOpening(L_MAIL_COMPLETE) end
local _, _, _, _, money, COD, _, numItems = GetInboxHeaderInfo(index)
if money > 0 then
TakeInboxMoney(index)
needsToWait = true
if total_cash then total_cash = total_cash - money end
-- profit = profit + money
elseif (not takingOnlyCash) and (numItems and numItems > 0) and COD <= 0 then
TakeInboxItem(index)
needsToWait = true
end
local items = GetInboxNumItems()
if (numItems and numItems > 0) or (items > 1 and index <= items) then
lastopened = index
t = 0
button:SetScript("OnUpdate", waitForMail)
else
stopOpening(L_MAIL_COMPLETE)
MinimapCluster.IndicatorFrame.MailFrame:Hide()
end
end
function waitForMail(_, elapsed)
t = t + elapsed
if (not needsToWait) or (t > deletedelay) then
needsToWait = false
button:SetScript("OnUpdate", nil)
local _, _, _, _, money, COD, _, numItems = GetInboxHeaderInfo(lastopened)
if money > 0 or ((not takingOnlyCash) and COD <= 0 and numItems and (numItems > 0)) then
openMail(lastopened)
else
openMail(lastopened - 1)
end
end
end
function copper_to_pretty_money(c)
if c > 10000 then
return ("%d|cffffd700"..GOLD_AMOUNT_SYMBOL.."|r %d|cffc7c7cf"..SILVER_AMOUNT_SYMBOL.."|r %d|cffeda55f"..COPPER_AMOUNT_SYMBOL.."|r"):format(c / 10000, (c / 100) % 100, c % 100)
elseif c > 100 then
return ("%d|cffc7c7cf"..SILVER_AMOUNT_SYMBOL.."|r %d|cffeda55f"..COPPER_AMOUNT_SYMBOL.."|r"):format((c / 100) % 100, c % 100)
else
return ("%d|cffeda55f"..COPPER_AMOUNT_SYMBOL.."|r"):format(c % 100)
end
end
function stopOpening(msg)
button:SetScript("OnUpdate", nil)
button:SetScript("OnClick", openAll)
button2:SetScript("OnClick", openAllCash)
if baseInboxFrame_OnClick then
InboxFrame_OnClick = baseInboxFrame_OnClick
end
button:UnregisterEvent("UI_ERROR_MESSAGE")
takingOnlyCash = false
total_cash = nil
if msg then print("|cffffff00"..msg.."|r") end
-- if profit > 0 then print(format("|cff66C6FF%s |cffFFFFFF%s", AMOUNT_RECEIVED_COLON, copper_to_pretty_money(profit))) profit = 0 end
end
function onEvent(_, event, _, text)
if event == "UI_ERROR_MESSAGE" then
if text == ERR_INV_FULL then
stopOpening(L_MAIL_STOPPED)
elseif text == ERR_ITEM_MAX_COUNT then
stopOpening(L_MAIL_UNIQUE)
end
end
end
local function makeButton(id, text, w, h, x, y)
local button = CreateFrame("Button", id, InboxFrame, "UIPanelButtonTemplate")
button:SetWidth(w)
button:SetHeight(h)
button:SetPoint("CENTER", InboxFrame, "TOP", x, y)
button:SetText(text)
return button
end
button = makeButton("OpenAllButton", ALL, 70, 25, -65, -398)
button:SetScript("OnClick", openAll)
button:SetScript("OnEvent", onEvent)
button:SetScript("OnEnter", function()
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
GameTooltip:AddLine(string.format("%d "..L_MAIL_MESSAGES, GetInboxNumItems()), 1, 1, 1)
GameTooltip:Show()
end)
button:SetScript("OnLeave", function() GameTooltip:Hide() end)
button2 = makeButton("OpenAllButton2", MONEY, 70, 25, 18, -398)
button2:SetScript("OnClick", openAllCash)
button2:SetScript("OnEnter", function()
if not total_cash then
total_cash = 0
for index = 0, GetInboxNumItems() do
local _, _, _, _, money = GetInboxHeaderInfo(index)
total_cash = total_cash + money
end
end
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
GameTooltip:AddLine(copper_to_pretty_money(total_cash), 1, 1, 1)
GameTooltip:Show()
end)
button2:SetScript("OnLeave", function() GameTooltip:Hide() end)
if C.skins.blizzard_frames == true then
OpenAllButton:SkinButton()
OpenAllButton2:SkinButton()
end
OpenAllMail:Hide() -- 7.2 new button
================================================
FILE: ShestakUI/Modules/Blizzard/MirrorBars.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.unitframe.unit_castbar ~= true or C.unitframe.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Based on oMirrorBars(by Haste)
----------------------------------------------------------------------------------------
local position = {
["BREATH"] = "TOP#UIParent#TOP#0#-96";
["EXHAUSTION"] = "TOP#UIParent#TOP#0#-116";
["FEIGNDEATH"] = "TOP#UIParent#TOP#0#-142";
}
local colors = {
EXHAUSTION = {1, 0.9, 0};
BREATH = {0.31, 0.45, 0.63};
DEATH = {1, 0.7, 0};
FEIGNDEATH = {1, 0.7, 0};
}
local Spawn, PauseAll
do
local barPool = {}
local loadPosition = function(self)
local pos = position[self.type]
local p1, frame, p2, x, y = strsplit("#", pos)
return self:SetPoint(p1, frame, p2, x, y)
end
local OnUpdate = function(self)
if self.paused then return end
self:SetValue(GetMirrorTimerProgress(self.type) / 1e3)
end
local Start = function(self, value, maxvalue, _, paused, text)
if paused > 0 then
self.paused = 1
elseif self.paused then
self.paused = nil
end
self.text:SetText(text)
self:SetMinMaxValues(0, maxvalue / 1e3)
self:SetValue(value / 1e3)
if not self:IsShown() then self:Show() end
end
function Spawn(type)
if barPool[type] then return barPool[type] end
local frame = CreateFrame("StatusBar", nil, UIParent)
frame:SetScript("OnUpdate", OnUpdate)
local r, g, b = unpack(colors[type])
local bg = frame:CreateTexture(nil, "BACKGROUND")
bg:SetAllPoints(frame)
bg:SetTexture(C.media.texture)
bg:SetVertexColor(r * 0.3, g * 0.3, b * 0.3)
local border = CreateFrame("Frame", nil, frame)
border:SetPoint("TOPLEFT", frame, -2, 2)
border:SetPoint("BOTTOMRIGHT", frame, 2, -2)
border:SetTemplate("Default")
border:SetFrameLevel(0)
local text = frame:CreateFontString(nil, "OVERLAY")
text:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
text:SetJustifyH("CENTER")
text:SetShadowOffset(0, 0)
text:SetTextColor(1, 1, 1)
text:SetPoint("LEFT", frame)
text:SetPoint("RIGHT", frame)
text:SetPoint("TOP", frame, 0, 1)
text:SetPoint("BOTTOM", frame)
frame:SetSize(281, 16)
frame:SetStatusBarTexture(C.media.texture)
frame:SetStatusBarColor(r, g, b)
frame.type = type
frame.text = text
frame.Start = Start
frame.Stop = Stop
loadPosition(frame)
barPool[type] = frame
return frame
end
function PauseAll(val)
for _, bar in next, barPool do
bar.paused = val
end
end
end
local frame = CreateFrame("Frame")
frame:SetScript("OnEvent", function(self, event, ...)
return self[event](self, ...)
end)
function frame:ADDON_LOADED(addon)
if addon == "ShestakUI" then
UIParent:UnregisterEvent("MIRROR_TIMER_START")
self:UnregisterEvent("ADDON_LOADED")
self.ADDON_LOADED = nil
end
end
frame:RegisterEvent("ADDON_LOADED")
function frame:PLAYER_ENTERING_WORLD()
for i = 1, MIRRORTIMER_NUMTIMERS do
local type, value, maxvalue, scale, paused, text = GetMirrorTimerInfo(i)
if type ~= "UNKNOWN" then
Spawn(type):Start(value, maxvalue, scale, paused, text)
end
end
end
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
function frame:MIRROR_TIMER_START(type, value, maxvalue, scale, paused, text)
return Spawn(type):Start(value, maxvalue, scale, paused, text)
end
frame:RegisterEvent("MIRROR_TIMER_START")
function frame:MIRROR_TIMER_STOP(type)
return Spawn(type):Hide()
end
frame:RegisterEvent("MIRROR_TIMER_STOP")
function frame:MIRROR_TIMER_PAUSE(duration)
return PauseAll((duration > 0 and duration) or nil)
end
frame:RegisterEvent("MIRROR_TIMER_PAUSE")
================================================
FILE: ShestakUI/Modules/Blizzard/MoveBlizzFrames.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.general.move_blizzard ~= true then return end
----------------------------------------------------------------------------------------
-- Move some Blizzard frames
----------------------------------------------------------------------------------------
local frames = {
"CharacterFrame", "SpellBookFrame", "TaxiFrame", "QuestFrame", "PVEFrame", "AddonList",
"QuestLogPopupDetailFrame", "MerchantFrame", "TradeFrame", "MailFrame", "LootFrame",
"FriendsFrame", "CinematicFrame", "TabardFrame", "PetStableFrame", "BankFrame",
"PetitionFrame", "HelpFrame", "GossipFrame", "DressUpFrame", "GuildRegistrarFrame",
"ChatConfigFrame", "RaidBrowserFrame", "InterfaceOptionsFrame", "WorldMapFrame",
"GameMenuFrame", "VideoOptionsFrame", "GuildInviteFrame", "ItemTextFrame",
"OpenMailFrame", "StackSplitFrame", "TutorialFrame", "StaticPopup1",
"StaticPopup2", "ScrollOfResurrectionSelectionFrame", "ProfessionsFrame"
}
for _, v in pairs(frames) do
if _G[v] then
_G[v]:EnableMouse(true)
_G[v]:SetMovable(true)
_G[v]:SetClampedToScreen(true)
_G[v]:RegisterForDrag("LeftButton")
_G[v]:SetScript("OnDragStart", function(self) self:StartMoving() end)
_G[v]:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
end
end
local AddOnFrames = {
["Blizzard_AchievementUI"] = {"AchievementFrame"},
["Blizzard_ArchaeologyUI"] = {"ArchaeologyFrame"},
["Blizzard_ArtifactUI"] = {"ArtifactRelicForgeFrame"},
["Blizzard_AuctionHouseUI"] = {"AuctionHouseFrame"},
["Blizzard_BarberShopUI"] = {"BarberShopFrame"},
["Blizzard_BindingUI"] = {"KeyBindingFrame"},
["Blizzard_BlackMarketUI"] = {"BlackMarketFrame"},
["Blizzard_Calendar"] = {"CalendarCreateEventFrame", "CalendarFrame", "CalendarViewEventFrame", "CalendarViewHolidayFrame"},
["Blizzard_ChallengesUI"] = {"ChallengesLeaderboardFrame"},
["Blizzard_Collections"] = {"CollectionsJournal", "WardrobeFrame"},
["Blizzard_Communities"] = {"CommunitiesFrame"},
["Blizzard_EncounterJournal"] = {"EncounterJournal"},
["Blizzard_GMChatUI"] = {"GMChatStatusFrame"},
["Blizzard_GMSurveyUI"] = {"GMSurveyFrame"},
["Blizzard_GarrisonUI"] = {"GarrisonLandingPage", "GarrisonMissionFrame", "GarrisonCapacitiveDisplayFrame", "GarrisonBuildingFrame", "GarrisonRecruiterFrame", "GarrisonRecruitSelectFrame", "GarrisonShipyardFrame"},
["Blizzard_GuildBankUI"] = {"GuildBankFrame"},
["Blizzard_GuildControlUI"] = {"GuildControlUI"},
["Blizzard_InspectUI"] = {"InspectFrame"},
["Blizzard_ItemAlterationUI"] = {"TransmogrifyFrame"},
["Blizzard_ItemSocketingUI"] = {"ItemSocketingFrame"},
["Blizzard_ItemUpgradeUI"] = {"ItemUpgradeFrame"},
["Blizzard_LookingForGuildUI"] = {"LookingForGuildFrame"},
["Blizzard_MacroUI"] = {"MacroFrame"},
["Blizzard_OrderHallUI"] = {"OrderHallMissionFrame"},
["Blizzard_QuestChoice"] = {"QuestChoiceFrame"},
["Blizzard_ReforgingUI"] = {"ReforgingFrame"},
["Blizzard_TalentUI"] = {"PlayerTalentFrame"},
["Blizzard_TalkingHeadUI"] = {"TalkingHeadFrame"},
-- ["Blizzard_TradeSkillUI"] = {"TradeSkillFrame"},
["Blizzard_TrainerUI"] = {"ClassTrainerFrame"},
["Blizzard_VoidStorageUI"] = {"VoidStorageFrame"}
}
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(_, _, addon)
-- Fix move
if addon == "Blizzard_Collections" then
local checkbox = _G.WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox
checkbox.Label:ClearAllPoints()
checkbox.Label:SetPoint("LEFT", checkbox, "RIGHT", 2, 1)
checkbox.Label:SetPoint("RIGHT", checkbox, "RIGHT", 160, 1)
elseif addon == "Blizzard_EncounterJournal" then
local replacement = function(rewardFrame)
if rewardFrame.data then
_G.EncounterJournalTooltip:ClearAllPoints()
end
AdventureJournal_Reward_OnEnter(rewardFrame)
end
_G.EncounterJournal.suggestFrame.Suggestion1.reward:HookScript("OnEnter", replacement)
_G.EncounterJournal.suggestFrame.Suggestion2.reward:HookScript("OnEnter", replacement)
_G.EncounterJournal.suggestFrame.Suggestion3.reward:HookScript("OnEnter", replacement)
elseif addon == "Blizzard_Communities" then
local dialog = _G.CommunitiesFrame.NotificationSettingsDialog
if dialog then
dialog:ClearAllPoints()
dialog:SetAllPoints()
end
end
if AddOnFrames[addon] then
for _, v in pairs(AddOnFrames[addon]) do
if _G[v] then
_G[v]:EnableMouse(true)
_G[v]:SetMovable(true)
_G[v]:SetClampedToScreen(true)
_G[v]:RegisterForDrag("LeftButton")
_G[v]:SetScript("OnDragStart", function(self) self:StartMoving() end)
_G[v]:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
end
end
end
end)
================================================
FILE: ShestakUI/Modules/Blizzard/PetBattle.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Pet Battles UI
----------------------------------------------------------------------------------------
local bar = CreateFrame("Frame", "PetBattleBarHolder", UIParent, "SecureHandlerStateTemplate")
bar:SetSize(((C.actionbar.button_size * 1.5) * 6) + (C.actionbar.button_space * 5), C.actionbar.button_size * 1.5)
bar:EnableMouse(true)
bar:SetFrameStrata("LOW")
bar:SetPoint(unpack(C.position.bottom_bars))
RegisterStateDriver(bar, "visibility", "[petbattle] show; hide")
local f = PetBattleFrame
local bf = f.BottomFrame
local units = {
f.ActiveAlly,
f.ActiveEnemy
}
-- General
f:StripTextures()
-- Pets unitframes
for i, unit in pairs(units) do
unit.Border:SetAlpha(0)
unit.Border2:SetAlpha(0)
unit.healthBarWidth = 300
unit.IconBackdrop = CreateFrame("Frame", nil, unit)
unit.IconBackdrop:SetFrameLevel(unit:GetFrameLevel() - 1)
unit.IconBackdrop:SetPoint("TOPLEFT", unit.Icon, -2, 2)
unit.IconBackdrop:SetPoint("BOTTOMRIGHT", unit.Icon, 2, -2)
unit.IconBackdrop:SetTemplate("Default")
unit.HealthBarBG:Kill()
unit.HealthBarFrame:Kill()
unit.HealthBarBackdrop = CreateFrame("Frame", nil, unit)
unit.HealthBarBackdrop:SetFrameLevel(unit:GetFrameLevel() - 1)
unit.HealthBarBackdrop:SetTemplate("Transparent")
unit.HealthBarBackdrop:SetWidth(unit.healthBarWidth + 4)
unit.ActualHealthBar:SetTexture(C.media.texture)
unit.ActualHealthBar:ClearAllPoints()
unit.Name:ClearAllPoints()
unit.PetTypeFrame = CreateFrame("Frame", nil, unit)
unit.PetTypeFrame:SetSize(23, 23)
unit.SpeedIcon:SetAlpha(0)
unit.SpeedUnderlay:SetAlpha(0)
unit.FirstAttack = unit:CreateTexture(nil, "ARTWORK")
unit.FirstAttack:SetSize(20, 20)
unit.FirstAttack:SetTexture("Interface\\PetBattles\\PetBattle-StatIcons")
unit.FirstAttack:Hide()
if i == 1 then
unit.HealthBarBackdrop:SetPoint("TOPLEFT", unit.ActualHealthBar, "TOPLEFT", -2, 2)
unit.HealthBarBackdrop:SetPoint("BOTTOMLEFT", unit.ActualHealthBar, "BOTTOMLEFT", -2, -2)
f.Ally2.iconPoint = unit.IconBackdrop
f.Ally3.iconPoint = unit.IconBackdrop
unit.ActualHealthBar:SetPoint("BOTTOMLEFT", unit.Icon, "BOTTOMRIGHT", 10, 0)
unit.Name:SetPoint("BOTTOMLEFT", unit.ActualHealthBar, "TOPLEFT", 0, 10)
unit.PetTypeFrame:SetPoint("BOTTOMRIGHT", unit.HealthBarBackdrop, "TOPRIGHT", 0, 7)
unit.FirstAttack:SetPoint("LEFT", unit.HealthBarBackdrop, "RIGHT", 5, 0)
unit.FirstAttack:SetTexCoord(unit.SpeedIcon:GetTexCoord())
unit.FirstAttack:SetVertexColor(0.1, 0.1, 0.1, 1)
unit.Level:SetPoint("BOTTOMLEFT", unit.Icon, "BOTTOMLEFT", 2, 0)
else
unit.HealthBarBackdrop:SetPoint("TOPRIGHT", unit.ActualHealthBar, "TOPRIGHT", 2, 2)
unit.HealthBarBackdrop:SetPoint("BOTTOMRIGHT", unit.ActualHealthBar, "BOTTOMRIGHT", 2, -2)
f.Enemy2.iconPoint = unit.IconBackdrop
f.Enemy3.iconPoint = unit.IconBackdrop
unit.ActualHealthBar:SetPoint("BOTTOMRIGHT", unit.Icon, "BOTTOMLEFT", -10, 0)
unit.Name:SetPoint("BOTTOMRIGHT", unit.ActualHealthBar, "TOPRIGHT", 0, 10)
unit.PetTypeFrame:SetPoint("BOTTOMLEFT", unit.HealthBarBackdrop, "TOPLEFT", 0, 7)
unit.FirstAttack:SetPoint("RIGHT", unit.HealthBarBackdrop, "LEFT", -5, 0)
unit.FirstAttack:SetTexCoord(0.5, 0, 0.5, 1)
unit.FirstAttack:SetVertexColor(0.1, 0.1, 0.1, 1)
unit.Level:SetPoint("BOTTOMRIGHT", unit.Icon, "BOTTOMRIGHT", -2, 0)
end
unit.PetType:ClearAllPoints()
unit.PetType:SetAllPoints(unit.PetTypeFrame)
unit.PetType:SetAlpha(1)
unit.PetType.ActiveStatus:Kill()
unit.HealthText:ClearAllPoints()
unit.HealthText:SetPoint("CENTER", unit.HealthBarBackdrop, "CENTER")
unit.LevelUnderlay:SetAlpha(0)
unit.Level:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
unit.Level:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
unit.Level:SetTextColor(1, 1, 1)
unit.BorderFlash:Kill()
end
-- Pets speed indicator update
hooksecurefunc("PetBattleFrame_UpdateSpeedIndicators", function()
if not f.ActiveAlly.SpeedIcon:IsShown() and not f.ActiveEnemy.SpeedIcon:IsShown() then
f.ActiveAlly.FirstAttack:Hide()
f.ActiveEnemy.FirstAttack:Hide()
return
end
for _, unit in pairs(units) do
unit.FirstAttack:Show()
if unit.SpeedIcon:IsShown() then
unit.FirstAttack:SetVertexColor(0, 1, 0, 1)
else
unit.FirstAttack:SetVertexColor(0.8, 0, 0.3, 1)
end
end
end)
-- Pets unitframes aura skins
hooksecurefunc("PetBattleAuraHolder_Update", function(self)
if not self.petOwner or not self.petIndex then return end
local nextFrame = 1
for i = 1, C_PetBattles.GetNumAuras(self.petOwner, self.petIndex) do
local _, _, turnsRemaining, isBuff = C_PetBattles.GetAuraInfo(self.petOwner, self.petIndex, i)
if (isBuff and self.displayBuffs) or (not isBuff and self.displayDebuffs) then
local frame = self.frames[nextFrame]
frame:SetWidth(frame:GetHeight())
-- Always hide the border
frame.DebuffBorder:Hide()
if not frame.isSkinned then
frame:CreateBackdrop("Default")
frame.backdrop:SetPoint("TOPLEFT", frame, 2, -2)
frame.backdrop:SetPoint("BOTTOMRIGHT", frame, -2, 2)
frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
frame.Icon:SetPoint("TOPLEFT", frame.backdrop, 2, -2)
frame.Icon:SetPoint("BOTTOMRIGHT", frame.backdrop, -2, 2)
end
if isBuff then
frame.backdrop:SetBackdropBorderColor(0, 1, 0)
else
frame.backdrop:SetBackdropBorderColor(1, 0, 0)
end
if turnsRemaining > 0 then
frame.Duration:SetText(turnsRemaining)
end
frame.Duration:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
frame.Duration:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
frame.Duration:ClearAllPoints()
frame.Duration:SetPoint("CENTER", frame.Icon, "CENTER", 1, -2)
nextFrame = nextFrame + 1
end
end
end)
-- Reposition "vs" text
f.TopVersusText:ClearAllPoints()
f.TopVersusText:SetPoint("TOP", f, "TOP", 0, -46)
-- Pets #2 and #3
local extraUnits = {
f.Ally2,
f.Ally3,
f.Enemy2,
f.Enemy3
}
for _, unit in pairs(extraUnits) do
unit.BorderAlive:SetAlpha(0)
unit.HealthBarBG:SetAlpha(0)
unit.HealthDivider:SetAlpha(0)
unit:SetSize(40, 40)
unit:CreateBackdrop("Default")
unit:ClearAllPoints()
unit.healthBarWidth = 40
unit.ActualHealthBar:ClearAllPoints()
unit.ActualHealthBar:SetPoint("TOPLEFT", unit.backdrop, "BOTTOMLEFT", 2, -3)
unit.HealthBarBackdrop = CreateFrame("Frame", nil, unit)
unit.HealthBarBackdrop:SetFrameLevel(unit:GetFrameLevel() - 1)
unit.HealthBarBackdrop:SetTemplate("Default")
unit.HealthBarBackdrop:SetWidth(unit.healthBarWidth + 4)
unit.HealthBarBackdrop:SetPoint("TOPLEFT", unit.ActualHealthBar, "TOPLEFT", -2, 2)
unit.HealthBarBackdrop:SetPoint("BOTTOMLEFT", unit.ActualHealthBar, "BOTTOMLEFT", -2, -1)
end
f.Ally2:SetPoint("TOPRIGHT", f.Ally2.iconPoint, "TOPLEFT", -6, -2)
f.Ally3:SetPoint("TOPRIGHT", f.Ally2, "TOPLEFT", -8, 0)
f.Enemy2:SetPoint("TOPLEFT", f.Enemy2.iconPoint, "TOPRIGHT", 6, -2)
f.Enemy3:SetPoint("TOPLEFT", f.Enemy2, "TOPRIGHT", 8, 0)
-- Weather
hooksecurefunc("PetBattleWeatherFrame_Update", function(self)
local weather = C_PetBattles.GetAuraInfo(Enum.BattlePetOwner.Weather, PET_BATTLE_PAD_INDEX, 1)
if weather then
self.Icon:Hide()
self.Name:Hide()
self.DurationShadow:Hide()
self.Label:Hide()
self.Duration:SetPoint("CENTER", self, 0, 8)
self:ClearAllPoints()
self:SetPoint("TOP", UIParent, 0, -15)
self:SetFrameStrata("MEDIUM")
if not self.ChildFrame then
self.ChildFrame = CreateFrame("Frame", nil, self)
self.ChildFrame:SetAllPoints(self)
self.ChildFrame:SetFrameStrata("LOW")
end
self.BackgroundArt:SetParent(self.ChildFrame)
end
end)
bf:StripTextures()
bf.TurnTimer:StripTextures()
bf.TurnTimer.SkipButton:SetParent(bar)
bf.TurnTimer.SkipButton:SkinButton()
bf.TurnTimer.SkipButton:SetWidth(bar:GetWidth())
bf.TurnTimer.SkipButton:SetHeight(21)
bf.TurnTimer.SkipButton:ClearAllPoints()
bf.TurnTimer.SkipButton:SetPoint("BOTTOM", bar, "TOP", 0, 3)
bf.TurnTimer.SkipButton.ClearAllPoints = T.dummy
bf.TurnTimer.SkipButton.SetPoint = T.dummy
bf.xpBar:SetParent(bar)
bf.xpBar:SetWidth(bar:GetWidth() - 4)
bf.xpBar:StripTextures()
bf.xpBar:CreateBackdrop("Overlay")
bf.xpBar:SetStatusBarTexture(C.media.texture)
bf.xpBar:ClearAllPoints()
bf.xpBar:SetPoint("BOTTOM", bf.TurnTimer.SkipButton, "TOP", 0, 5)
bf.TurnTimer:SetParent(bar)
bf.TurnTimer:SetSize(bf.TurnTimer.SkipButton:GetWidth(), bf.TurnTimer.SkipButton:GetHeight())
bf.TurnTimer:ClearAllPoints()
bf.TurnTimer:SetPoint("BOTTOM", bf.xpBar, "TOP", 0, 5)
bf.TurnTimer.TimerText:SetPoint("CENTER")
bf.MicroButtonFrame:StripTextures()
bf.MicroButtonFrame:Hide()
bf.Delimiter:StripTextures()
bf.FlowFrame:Kill()
-- Pets selection skin
for i = 1, 3 do
local unit = bf.PetSelectionFrame["Pet"..i]
unit.HealthBarBG:SetAlpha(0)
unit.HealthDivider:SetAlpha(0)
unit.ActualHealthBar:SetAlpha(0)
unit.SelectedTexture:SetAlpha(0)
unit.MouseoverHighlight:SetAlpha(0)
unit.Framing:SetAlpha(0)
unit.Icon:SetAlpha(0)
unit.Name:SetAlpha(0)
unit.DeadOverlay:SetAlpha(0)
unit.Level:SetAlpha(0)
unit.HealthText:SetAlpha(0)
end
-- Move default position of pets selection
hooksecurefunc("PetBattlePetSelectionFrame_Show", function()
bf.PetSelectionFrame:ClearAllPoints()
bf.PetSelectionFrame:SetPoint("BOTTOM", bf.xpBar, "TOP", 0, 8)
end)
-- Function to skin pet action buttons
local function SkinPetButton(self)
self:SetNormalTexture(0)
self:CreateBackdrop("Transparent")
self.backdrop:SetAllPoints()
if C.actionbar.classcolor_border == true then
self.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color))
end
self.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.Icon:SetPoint("TOPLEFT", self, 2, -2)
self.Icon:SetPoint("BOTTOMRIGHT", self, -2, 2)
self.checked = true
self:StyleButton()
self.SelectedHighlight:SetTexture("")
self.CooldownShadow:SetAllPoints()
self.CooldownFlash:SetAllPoints()
if C.actionbar.hotkey == true then
self.HotKey:SetPoint("TOPRIGHT", 0, 0)
self.HotKey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
self.HotKey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
self.HotKey:SetWidth((C.actionbar.button_size * 1.5) - 1)
else
self.HotKey:Kill()
end
end
-- Setup pet action bar
hooksecurefunc("PetBattleFrame_UpdateActionBarLayout", function()
for i = 1, NUM_BATTLE_PET_ABILITIES do
local b = bf.abilityButtons[i]
SkinPetButton(b)
b:SetParent(bar)
b:SetSize(C.actionbar.button_size * 1.5, C.actionbar.button_size * 1.5)
b:ClearAllPoints()
if i == 1 then
b:SetPoint("BOTTOMLEFT", 0, 0)
else
local previous = bf.abilityButtons[i-1]
b:SetPoint("LEFT", previous, "RIGHT", C.actionbar.button_space, 0)
end
end
bf.SwitchPetButton:SetParent(bar)
bf.SwitchPetButton:SetSize(C.actionbar.button_size * 1.5, C.actionbar.button_size * 1.5)
bf.SwitchPetButton:ClearAllPoints()
bf.SwitchPetButton:SetPoint("LEFT", bf.abilityButtons[3], "RIGHT", C.actionbar.button_space, 0)
bf.SwitchPetButton:SetScript("OnClick", function()
PetBattlePetSelectionFrame_Show(bf.PetSelectionFrame)
end)
bf.CatchButton:SetParent(bar)
bf.CatchButton:SetSize(C.actionbar.button_size * 1.5, C.actionbar.button_size * 1.5)
bf.CatchButton:ClearAllPoints()
bf.CatchButton:SetPoint("LEFT", bf.SwitchPetButton, "RIGHT", C.actionbar.button_space, 0)
bf.ForfeitButton:SetParent(bar)
bf.ForfeitButton:ClearAllPoints()
bf.ForfeitButton:SetSize(C.actionbar.button_size * 1.5, C.actionbar.button_size * 1.5)
bf.ForfeitButton:SetPoint("LEFT", bf.CatchButton, "RIGHT", C.actionbar.button_space, 0)
SkinPetButton(bf.SwitchPetButton)
SkinPetButton(bf.CatchButton)
SkinPetButton(bf.ForfeitButton)
end)
-- Tooltips skinning
local tooltips = {BattlePetTooltip, PetBattlePrimaryAbilityTooltip, PetBattlePrimaryUnitTooltip, FloatingPetBattleAbilityTooltip, FloatingBattlePetTooltip}
for _, tt in pairs(tooltips) do
tt:SetTemplate("Transparent")
tt.NineSlice:SetAlpha(0)
if tt.CloseButton then
T.SkinCloseButton(tt.CloseButton)
end
if tt.Delimiter1 then
tt.Delimiter1:SetTexture(nil)
tt.Delimiter2:SetTexture(nil)
elseif tt.Delimiter then
tt.Delimiter:SetTexture(nil)
end
end
table.insert(UISpecialFrames, "FloatingBattlePetTooltip")
-- Tooltip position
hooksecurefunc("PetBattleAbilityButton_OnEnter", function()
PetBattleAbilityTooltip_Show(unpack(C.position.tooltip))
PetBattlePrimaryAbilityTooltip:SetFrameLevel(5)
end)
----------------------------------------------------------------------------------------
-- Coloring borders/names by pets quality(PetBattleQualityGlow by Tia Lynn)
----------------------------------------------------------------------------------------
hooksecurefunc("PetBattleUnitFrame_UpdateDisplay", function(self)
self.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-- There must be a petOwner and a petIndex
if not self.petOwner or not self.petIndex then return end
-- Check if this is the Tooltip
local isTooltip = false
if self:GetName() == "PetBattlePrimaryUnitTooltip" then isTooltip = true end
-- Set the color for the Glow
local nQuality = C_PetBattles.GetBreedQuality(self.petOwner, self.petIndex) - 1
local r, g, b, hex = GetItemQualityColor(nQuality)
if nQuality >= 2 and not isTooltip and self.IconBackdrop then
self.IconBackdrop:SetBackdropBorderColor(r, g, b)
elseif self.IconBackdrop then
self.IconBackdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end
-- Color the Name with the Quality color
if self.Name then
local sPetName = C_PetBattles.GetName(self.petOwner, self.petIndex)
if sPetName then
self.Name:SetText("|c"..hex..sPetName.."|r")
end
end
-- Color the non-active Health Bars with the Quality color
if self.ActualHealthBar and not isTooltip then
self.ActualHealthBar:SetVertexColor(r, g, b)
end
end)
================================================
FILE: ShestakUI/Modules/Blizzard/TaintLess.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
================================================
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Loot.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Loot skin
----------------------------------------------------------------------------------------
local function LoadSkin()
-- Loot History frame
LootHistoryFrame:StripTextures()
LootHistoryFrame:SetTemplate("Transparent")
T.SkinCloseButton(LootHistoryFrame.CloseButton)
T.SkinCloseButton(LootHistoryFrame.ResizeButton, nil, " ")
LootHistoryFrameScrollFrame:GetRegions():Hide()
T.SkinScrollBar(LootHistoryFrameScrollFrameScrollBar)
LootHistoryFrame.ResizeButton:SetTemplate("Default")
LootHistoryFrame.ResizeButton:SetWidth(LootHistoryFrame:GetWidth())
LootHistoryFrame.ResizeButton:ClearAllPoints()
LootHistoryFrame.ResizeButton:SetPoint("TOP", LootHistoryFrame, "BOTTOM", 0, -1)
local function UpdateLoots(self)
local numItems = C_LootHistory.GetNumItems()
for i = 1, numItems do
local frame = self.itemFrames[i]
if not frame.isSkinned then
local Icon = frame.Icon:GetTexture()
frame:StripTextures()
frame:CreateBackdrop("Default")
frame.backdrop:SetPoint("TOPLEFT", frame.Icon, -2, 2)
frame.backdrop:SetPoint("BOTTOMRIGHT", frame.Icon, 2, -2)
frame.Icon:SetTexture(Icon)
frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
frame.Icon:SetParent(frame.backdrop)
frame.isSkinned = true
end
end
end
hooksecurefunc("LootHistoryFrame_FullUpdate", UpdateLoots)
LootHistoryFrame:HookScript("OnShow", UpdateLoots)
-- Master Looter frame
MasterLooterFrame:StripTextures()
MasterLooterFrame:SetTemplate("Transparent")
hooksecurefunc("MasterLooterFrame_Show", function()
local button = MasterLooterFrame.Item
if button then
local icon = button.Icon
local texture = icon:GetTexture()
local color = ITEM_QUALITY_COLORS[LootFrame.selectedQuality]
button:StripTextures()
icon:SetTexture(texture)
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button:CreateBackdrop("Default")
button.backdrop:SetPoint("TOPLEFT", icon, -2, 2)
button.backdrop:SetPoint("BOTTOMRIGHT", icon, 2, -2)
button.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)
end
for i = 1, MasterLooterFrame:GetNumChildren() do
local child = select(i, MasterLooterFrame:GetChildren())
if child and not child.isSkinned and not child:GetName() then
if child:GetObjectType() == "Button" then
if child:GetPushedTexture() then
T.SkinCloseButton(child)
else
child:StripTextures()
child:SkinButton()
end
child.isSkinned = true
end
end
end
end)
-- Loot frame
if C.loot.lootframe == 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
LootFrame:StripTextures(true)
LootFrame:SetTemplate("Transparent")
T.SkinCloseButton(LootFrame.ClosePanelButton)
hooksecurefunc(LootFrameElementMixin, "Init", function(button)
local item = button.Item
if item and not item.styled then
item:StyleButton()
item:SetNormalTexture(0)
item:SetTemplate("Default")
item.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
item.icon:ClearAllPoints()
item.icon:SetPoint("TOPLEFT", 2, -2)
item.icon:SetPoint("BOTTOMRIGHT", -2, 2)
button:CreateBackdrop("Overlay")
button.backdrop:SetPoint("TOPLEFT", 0, 0)
button.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
button.HighlightNameFrame:SetAlpha(0)
button.PushedNameFrame:SetAlpha(0)
item.IconBorder:SetAlpha(0)
button.NameFrame:Hide()
item.styled = true
end
button.IconQuestTexture:SetAlpha(0)
button.BorderFrame:SetAlpha(0)
if button.QualityStripe then
button.QualityStripe:SetAlpha(0)
end
if button.IconQuestTexture:IsShown() then
item:SetBackdropBorderColor(1, 1, 0)
else
item:SetBackdropBorderColor(unpack(C.media.border_color))
end
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/LossOfControl.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- LossOfControl skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local IconBackdrop = CreateFrame("Frame", nil, LossOfControlFrame)
IconBackdrop:SetTemplate("Default")
IconBackdrop:ClearAllPoints()
IconBackdrop:SetPoint("TOPLEFT", LossOfControlFrame.Icon, -2, 2)
IconBackdrop:SetPoint("BOTTOMRIGHT", LossOfControlFrame.Icon, 2, -2)
IconBackdrop:SetFrameLevel(LossOfControlFrame:GetFrameLevel() - 1)
LossOfControlFrame:StripTextures()
LossOfControlFrame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
LossOfControlFrame.AbilityName:ClearAllPoints()
hooksecurefunc("LossOfControlFrame_SetUpDisplay", function(self)
self.Icon:ClearAllPoints()
self.Icon:SetPoint("CENTER", self, "CENTER", 0, 0)
self.AbilityName:ClearAllPoints()
self.AbilityName:SetPoint("BOTTOM", self, 0, -28)
self.AbilityName.scrollTime = nil
self.TimeLeft.NumberText:ClearAllPoints()
self.TimeLeft.NumberText:SetPoint("BOTTOM", self, 4, -58)
self.TimeLeft.NumberText.scrollTime = nil
self.TimeLeft.SecondsText:ClearAllPoints()
self.TimeLeft.SecondsText:SetPoint("BOTTOM", self, 0, -80)
self.TimeLeft.SecondsText.scrollTime = nil
if self.Anim:IsPlaying() then
self.Anim:Stop()
end
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Macro.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- MacroUI skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local buttons = {
"MacroEditButton",
"MacroDeleteButton",
"MacroNewButton",
"MacroExitButton",
"MacroFrameTab1",
"MacroFrameTab2",
"MacroSaveButton",
"MacroCancelButton"
}
for i = 1, #buttons do
_G[buttons[i]]:SkinButton(true)
end
hooksecurefunc(MacroFrame, "UpdateButtons", function()
for i = 1, 3 do -- Prevent disappear our scripts
_G[buttons[i]]:HookScript("OnEnter", T.SetModifiedBackdrop)
_G[buttons[i]]:HookScript("OnLeave", T.SetOriginalBackdrop)
end
end)
for i = 1, 2 do
local tab = _G[format("MacroFrameTab%s", i)]
tab:SetHeight(22)
end
MacroFrameTab1:SetPoint("TOPLEFT", MacroFrame, "TOPLEFT", 10, -39)
MacroFrameTab2:SetPoint("LEFT", MacroFrameTab1, "RIGHT", 4, 0)
MacroFrameTab1.Text:SetAllPoints(MacroFrameTab1)
MacroFrameTab2.Text:SetAllPoints(MacroFrameTab2)
-- General
MacroFrame:StripTextures()
MacroFrame:CreateBackdrop("Transparent")
MacroFrame.backdrop:SetPoint("TOPLEFT", 0, 0)
MacroFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
MacroFrameInset:StripTextures()
MacroFrameTextBackground:StripTextures()
MacroFrameTextBackground:CreateBackdrop("Overlay")
MacroFrameTextBackground.backdrop:SetPoint("TOPLEFT", 4, -3)
MacroFrameTextBackground.backdrop:SetPoint("BOTTOMRIGHT", -23, 0)
T.SkinCloseButton(MacroFrameCloseButton, MacroFrame.backdrop)
-- Reposition buttons
MacroEditButton:ClearAllPoints()
MacroEditButton:SetPoint("BOTTOMLEFT", MacroFrameSelectedMacroButton, "BOTTOMRIGHT", 10, 0)
MacroDeleteButton:ClearAllPoints()
MacroDeleteButton:SetPoint("BOTTOMLEFT", MacroFrame.backdrop, "BOTTOMLEFT", 9, 4)
MacroNewButton:ClearAllPoints()
MacroNewButton:SetPoint("RIGHT", MacroExitButton, "LEFT", -3, 0)
-- Regular scroll bar
T.SkinScrollBar(MacroFrame.MacroSelector.ScrollBar)
T.SkinScrollBar(MacroFrameScrollFrameScrollBar)
-- Big icon
MacroFrameSelectedMacroButton:StripTextures()
MacroFrameSelectedMacroButton:StyleButton(true)
MacroFrameSelectedMacroButton:GetNormalTexture():SetTexture(nil)
MacroFrameSelectedMacroButton:SetTemplate("Default")
MacroFrameSelectedMacroButton.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
MacroFrameSelectedMacroButton.Icon:ClearAllPoints()
MacroFrameSelectedMacroButton.Icon:SetPoint("TOPLEFT", 2, -2)
MacroFrameSelectedMacroButton.Icon:SetPoint("BOTTOMRIGHT", -2, 2)
-- Moving text
MacroFrameCharLimitText:ClearAllPoints()
MacroFrameCharLimitText:SetPoint("BOTTOM", MacroFrameTextBackground, 0, -12)
-- Skin all buttons
hooksecurefunc(MacroFrame.MacroSelector.ScrollBox, "Update", function()
for _, button in next, {MacroFrame.MacroSelector.ScrollBox.ScrollTarget:GetChildren()} do
if button.Icon and not button.isSkinned then
button:StripTextures()
button:StyleButton(true)
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)
button.isSkinned = true
end
end
end)
-- Icon selection frame
MacroPopupFrame:HookScript("OnShow", function(frame)
if not frame.isSkinned then
T.SkinIconSelectionFrame(frame, nil, nil, "MacroPopup")
frame.isSkinned = true
end
end)
end
T.SkinFuncs["Blizzard_MacroUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Mail.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Mail skin
----------------------------------------------------------------------------------------
local function LoadSkin()
MailFrame:StripTextures()
MailFrame:CreateBackdrop("Transparent")
MailFrame.backdrop:SetPoint("TOPLEFT", 0, 0)
MailFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
InboxFrame:StripTextures()
MailFrameInset:StripTextures()
SendMailMoneyInset:StripTextures()
SendMailMoneyBg:StripTextures()
MailFramePortrait:SetAlpha(0)
for i = 1, INBOXITEMS_TO_DISPLAY do
local bg = _G["MailItem"..i]
bg:StripTextures()
bg:CreateBackdrop("Overlay")
bg.backdrop:SetPoint("TOPLEFT", 2, 1)
bg.backdrop:SetPoint("BOTTOMRIGHT", -2, 2)
local b = _G["MailItem"..i.."Button"]
b:StripTextures()
b:SetTemplate("Default")
b:StyleButton()
local t = _G["MailItem"..i.."ButtonIcon"]
t:SetTexCoord(0.1, 0.9, 0.1, 0.9)
t:ClearAllPoints()
t:SetPoint("TOPLEFT", 2, -2)
t:SetPoint("BOTTOMRIGHT", -2, 2)
_G["MailItem"..i.."ButtonIconBorder"]:SetAlpha(0)
end
T.SkinCloseButton(MailFrameCloseButton, MailFrame.backdrop)
T.SkinNextPrevButton(InboxPrevPageButton)
T.SkinNextPrevButton(InboxNextPageButton)
T.SkinTab(MailFrameTab1)
T.SkinTab(MailFrameTab2)
-- Send mail
SendMailFrame:StripTextures()
SendMailScrollFrame:StripTextures(true)
SendMailScrollFrame:CreateBackdrop("Overlay")
SendMailScrollFrame.backdrop:SetPoint("TOPLEFT", 12, 0)
SendMailScrollFrame.backdrop:SetPoint("BOTTOMRIGHT", 2, 0)
T.SkinScrollBar(SendMailScrollFrameScrollBar)
select(3, SendMailNameEditBox:GetRegions()):SetDrawLayer("OVERLAY")
select(3, SendMailSubjectEditBox:GetRegions()):SetDrawLayer("OVERLAY")
T.SkinEditBox(SendMailNameEditBox)
T.SkinEditBox(SendMailSubjectEditBox)
T.SkinEditBox(SendMailMoneyGold)
T.SkinEditBox(SendMailMoneySilver)
T.SkinEditBox(SendMailMoneyCopper)
SendMailNameEditBox.backdrop:SetPoint("TOPLEFT", -3, -2)
SendMailNameEditBox.backdrop:SetPoint("BOTTOMRIGHT", 2, 3)
SendMailSubjectEditBox.backdrop:SetPoint("TOPLEFT", -3, 0)
SendMailSubjectEditBox.backdrop:SetPoint("BOTTOMRIGHT", -4, 0)
SendMailNameEditBox:ClearAllPoints()
SendMailNameEditBox:SetPoint('TOPLEFT', SendMailFrame, 'TOPLEFT', 90, -30)
SendMailNameEditBox.SetPoint = T.dummy
local function MailFrameSkin()
for i = 1, ATTACHMENTS_MAX_SEND do
local b = _G["SendMailAttachment"..i]
if not b.skinned then
b:StripTextures()
b:SetTemplate("Default")
b:StyleButton()
b.IconBorder:SetAlpha(0)
b.skinned = true
end
local t = b:GetNormalTexture()
if t then
t:SetTexCoord(0.1, 0.9, 0.1, 0.9)
t:ClearAllPoints()
t:SetPoint("TOPLEFT", 2, -2)
t:SetPoint("BOTTOMRIGHT", -2, 2)
end
end
end
hooksecurefunc("SendMailFrame_Update", MailFrameSkin)
SendMailMailButton:SkinButton()
SendMailCancelButton:SkinButton()
SendMailSendMoneyButton:SetSize(18, 18)
SendMailCODButton:SetSize(18, 18)
T.SkinCheckBox(SendMailSendMoneyButton)
T.SkinCheckBox(SendMailCODButton)
-- Open mail (cod)
OpenMailFrame:StripTextures(true)
OpenMailFrame:CreateBackdrop("Transparent")
OpenMailFrame.backdrop:SetPoint("TOPLEFT", -5, 0)
OpenMailFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
OpenMailFrameInset:StripTextures()
T.SkinCloseButton(OpenMailFrameCloseButton, OpenMailFrame.backdrop)
OpenMailReportSpamButton:SkinButton()
OpenMailReplyButton:SkinButton()
OpenMailDeleteButton:SkinButton()
OpenMailCancelButton:SkinButton()
OpenMailScrollFrame:StripTextures(true)
OpenMailScrollFrame:CreateBackdrop("Overlay")
OpenMailScrollFrame.backdrop:SetPoint("TOPLEFT", 5, 5)
OpenMailScrollFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, -5)
T.SkinScrollBar(OpenMailScrollFrameScrollBar)
SendMailBodyEditBox:SetTextColor(1, 1, 1)
MailTextFontNormal:SetTextColor(1, 1, 1)
InvoiceTextFontNormal:SetTextColor(1, 1, 1)
OpenMailArithmeticLine:Kill()
OpenMailLetterButton:StripTextures()
OpenMailLetterButton:SetTemplate("Default")
OpenMailLetterButton:StyleButton()
OpenMailLetterButtonIconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)
OpenMailLetterButtonIconTexture:ClearAllPoints()
OpenMailLetterButtonIconTexture:SetPoint("TOPLEFT", 2, -2)
OpenMailLetterButtonIconTexture:SetPoint("BOTTOMRIGHT", -2, 2)
OpenMailMoneyButton:StripTextures()
OpenMailMoneyButton:SetTemplate("Default")
OpenMailMoneyButton:StyleButton()
OpenMailMoneyButtonIconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)
OpenMailMoneyButtonIconTexture:ClearAllPoints()
OpenMailMoneyButtonIconTexture:SetPoint("TOPLEFT", 2, -2)
OpenMailMoneyButtonIconTexture:SetPoint("BOTTOMRIGHT", -2, 2)
for i = 1, ATTACHMENTS_MAX_RECEIVE do
local b = _G["OpenMailAttachmentButton"..i]
local t = _G["OpenMailAttachmentButton"..i.."IconTexture"]
b:StripTextures()
b:SetTemplate("Default")
b:StyleButton()
b.IconBorder:SetAlpha(0)
if t then
t:SetTexCoord(0.1, 0.9, 0.1, 0.9)
t:ClearAllPoints()
t:SetPoint("TOPLEFT", 2, -2)
t:SetPoint("BOTTOMRIGHT", -2, 2)
end
end
OpenMailReplyButton:SetPoint("RIGHT", OpenMailDeleteButton, "LEFT", -2, 0)
OpenMailDeleteButton:SetPoint("RIGHT", OpenMailCancelButton, "LEFT", -2, 0)
SendMailMailButton:SetPoint("RIGHT", SendMailCancelButton, "LEFT", -2, 0)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/MajorFaction.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Major Factions skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = _G.MajorFactionRenownFrame
T.SkinFrame(frame)
frame.Background:SetAlpha(0)
end
T.SkinFuncs["Blizzard_MajorFactions"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Merchant.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Merchant skin
----------------------------------------------------------------------------------------
local function LoadSkin()
-- Main frames
MerchantFrame:StripTextures(true)
MerchantFrame:CreateBackdrop("Transparent")
MerchantFrame.backdrop:SetPoint("TOPLEFT", 0, 0)
MerchantFrame.backdrop:SetPoint("BOTTOMRIGHT", 2, 0)
MerchantFrameInset:StripTextures()
MerchantMoneyBg:StripTextures()
MerchantMoneyInset:StripTextures()
MerchantExtraCurrencyBg:StripTextures()
MerchantExtraCurrencyInset:StripTextures()
MerchantFramePortrait:SetAlpha(0)
-- Skin tabs
for i = 1, 2 do
T.SkinTab(_G["MerchantFrameTab"..i])
end
-- Icons/merchant slots
for i = 1, BUYBACK_ITEMS_PER_PAGE do
local b = _G["MerchantItem"..i.."ItemButton"]
local t = _G["MerchantItem"..i.."ItemButtonIconTexture"]
local item_bar = _G["MerchantItem"..i]
local c = _G["MerchantItem"..i.."AltCurrencyFrameItem1"]
item_bar:StripTextures(true)
item_bar:CreateBackdrop("Overlay")
b:StripTextures()
b:StyleButton()
b:SetTemplate("Default")
b:SetPoint("TOPLEFT", item_bar, "TOPLEFT", 4, -4)
b.IconBorder:SetAlpha(0)
t:SetTexCoord(0.1, 0.9, 0.1, 0.9)
t:ClearAllPoints()
t:SetPoint("TOPLEFT", 2, -2)
t:SetPoint("BOTTOMRIGHT", -2, 2)
hooksecurefunc(_G["MerchantItem"..i.."AltCurrencyFrame"], "SetPoint", function(self, _, _, _, x)
if x == -14 then
c:SetPoint("LEFT", self, "LEFT", 15, 0)
elseif x == 0 then
c:SetPoint("LEFT", self, "LEFT", 14, 5)
end
end)
for j = 1, 3 do
local c = _G["MerchantItem"..i.."AltCurrencyFrameItem"..j]
local ct = _G["MerchantItem"..i.."AltCurrencyFrameItem"..j.."Texture"]
c:CreateBackdrop("Default")
c.backdrop:SetPoint("TOPLEFT", ct, "TOPLEFT", -2, 2)
c.backdrop:SetPoint("BOTTOMRIGHT", ct, "BOTTOMRIGHT", 2, -2)
ct:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
_G["MerchantItem"..i.."MoneyFrame"]:ClearAllPoints()
_G["MerchantItem"..i.."MoneyFrame"]:SetPoint("BOTTOMLEFT", b, "BOTTOMRIGHT", 3, 0)
end
-- Buyback item frame + icon
MerchantBuyBackItem:StripTextures(true)
MerchantBuyBackItem:CreateBackdrop("Overlay")
MerchantBuyBackItem.backdrop:SetPoint("TOPLEFT", -2, 6)
MerchantBuyBackItem.backdrop:SetPoint("BOTTOMRIGHT", 2, -5)
MerchantBuyBackItemItemButton:SetPoint("TOPLEFT", MerchantBuyBackItem, "TOPLEFT", 4, 0)
MerchantBuyBackItemItemButton:StripTextures()
MerchantBuyBackItemItemButton:StyleButton()
MerchantBuyBackItemItemButton:SetTemplate("Default")
MerchantBuyBackItemItemButtonIconTexture:SetTexCoord(0.1, 0.9, 0.1, 0.9)
MerchantBuyBackItemItemButtonIconTexture:ClearAllPoints()
MerchantBuyBackItemItemButtonIconTexture:SetPoint("TOPLEFT", 2, -2)
MerchantBuyBackItemItemButtonIconTexture:SetPoint("BOTTOMRIGHT", -2, 2)
MerchantBuyBackItemItemButton.IconBorder:SetAlpha(0)
MerchantRepairItemButton:StyleButton()
MerchantRepairItemButton:SetTemplate("Default")
MerchantRepairItemButton:GetRegions():SetTexCoord(0.04, 0.24, 0.06, 0.5)
MerchantRepairItemButton:GetRegions():ClearAllPoints()
MerchantRepairItemButton:GetRegions():SetPoint("TOPLEFT", 2, -2)
MerchantRepairItemButton:GetRegions():SetPoint("BOTTOMRIGHT", -2, 2)
MerchantGuildBankRepairButton:StyleButton()
MerchantGuildBankRepairButton:SetTemplate("Default")
MerchantGuildBankRepairButtonIcon:SetTexCoord(0.61, 0.82, 0.1, 0.52)
MerchantGuildBankRepairButtonIcon:ClearAllPoints()
MerchantGuildBankRepairButtonIcon:SetPoint("TOPLEFT", 2, -2)
MerchantGuildBankRepairButtonIcon:SetPoint("BOTTOMRIGHT", -2, 2)
MerchantRepairAllButton:StyleButton()
MerchantRepairAllButton:SetTemplate("Default")
MerchantRepairAllIcon:SetTexCoord(0.34, 0.1, 0.34, 0.535, 0.535, 0.1, 0.535, 0.535)
MerchantRepairAllIcon:ClearAllPoints()
MerchantRepairAllIcon:SetPoint("TOPLEFT", 2, -2)
MerchantRepairAllIcon:SetPoint("BOTTOMRIGHT", -2, 2)
-- Misc frames
T.SkinCloseButton(MerchantFrameCloseButton, MerchantFrame.backdrop)
T.SkinNextPrevButton(MerchantNextPageButton)
T.SkinNextPrevButton(MerchantPrevPageButton)
T.SkinDropDownBox(MerchantFrameLootFilter)
-- Reposition tabs
MerchantFrameTab1:ClearAllPoints()
MerchantFrameTab1:SetPoint("TOPLEFT", MerchantFrame.backdrop, "BOTTOMLEFT", 0, 2)
hooksecurefunc("MerchantFrame_UpdateCurrencies", function()
for i = 1, MAX_MERCHANT_CURRENCIES do
local b = _G["MerchantToken"..i]
if b and not b.reskinned then
local t = _G["MerchantToken"..i].Icon
local c = _G["MerchantToken"..i].Count
t:SetTexCoord(0.1, 0.9, 0.1, 0.9)
c:SetPoint("RIGHT", t, "LEFT", -3, 0)
b:CreateBackdrop("Default")
b.backdrop:SetPoint("TOPLEFT", t, "TOPLEFT", -2, 2)
b.backdrop:SetPoint("BOTTOMRIGHT", t, "BOTTOMRIGHT", 2, -2)
b.reskinned = true
end
end
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Options.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Options skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = SettingsPanel
frame:StripTextures()
frame:SetTemplate("Transparent")
frame.Bg:Hide()
local tabs = {
frame.GameTab,
frame.AddOnsTab
}
for i = 1, #tabs do
local tab = tabs[i]
tab:SkinButton(true)
tab:SetHeight(25)
end
SettingsPanel.GameTab:SetPoint("TOPLEFT", 17, -40)
T.SkinCloseButton(frame.ClosePanelButton)
T.SkinEditBox(frame.SearchBox, nil, 20)
frame.ApplyButton:SkinButton()
frame.CloseButton:SkinButton()
frame.Container.SettingsList.Header.DefaultsButton:SkinButton()
T.SkinScrollBar(SettingsPanel.Container.SettingsList.ScrollBar)
SettingsPanel.Container.SettingsList.ScrollBar.Back:SetSize(17, 15)
SettingsPanel.Container.SettingsList.ScrollBar.Track.Thumb:SetWidth(17)
SettingsPanel.Container.SettingsList.ScrollBar.Forward:SetSize(17, 15)
SettingsPanel.CategoryList:CreateBackdrop("Overlay")
SettingsPanel.Container.SettingsList:CreateBackdrop("Overlay")
SettingsPanel.Container.SettingsList.backdrop:SetPoint("BOTTOMRIGHT", 6, -3)
hooksecurefunc(SettingsPanel.CategoryList.ScrollBox, "Update", function(frame)
for _, child in next, {frame.ScrollTarget:GetChildren()} do
if not child.isSkinned then
if child.Background then
child.Background:SetAlpha(0)
end
local toggle = child.Toggle
if toggle then
toggle:GetPushedTexture():SetAlpha(0)
end
child.isSkinned = true
end
end
end)
local function UpdateKeybindButtons(self)
if not self.bindingsPool then return end
for panel in self.bindingsPool:EnumerateActive() do
if not panel.isSkinned then
panel.Button1:SkinButton()
panel.Button2:SkinButton()
panel.Button2:SetPoint("LEFT", panel.Button1, "RIGHT", 2, 0)
if panel.CustomButton then
panel.CustomButton:SkinButton()
end
local selected = panel.Button1.SelectedHighlight
selected:SetPoint("TOPLEFT", 2, -2)
selected:SetPoint("BOTTOMRIGHT", -2, 2)
selected:SetColorTexture(1, 0.82, 0, 0.3)
selected = panel.Button2.SelectedHighlight
selected:SetPoint("TOPLEFT", 2, -2)
selected:SetPoint("BOTTOMRIGHT", -2, 2)
selected:SetColorTexture(1, 0.82, 0, 0.3)
panel.isSkinned = true
end
end
end
local function UpdateHeaderExpand(self, expanded)
self.collapseTex:SetAtlas(expanded and "Soulbinds_Collection_CategoryHeader_Collapse" or "Soulbinds_Collection_CategoryHeader_Expand", true)
UpdateKeybindButtons(self)
end
hooksecurefunc(SettingsPanel.Container.SettingsList.ScrollBox, "Update", function(frame)
for _, child in next, { frame.ScrollTarget:GetChildren() } do
if not child.isSkinned then
if child.CheckBox then
T.SkinCheckBoxAtlas(child.CheckBox)
end
if child.Button then
if child.Button:GetWidth() < 250 then
child.Button:SkinButton()
else
child.Button:StripTextures()
child.Button.Right:SetAlpha(0)
child.Button:CreateBackdrop("Overlay")
child.Button.backdrop:SetPoint("TOPLEFT", 2, -1)
child.Button.backdrop:SetPoint("BOTTOMRIGHT", -2, 3)
child.Button.backdrop.overlay:SetVertexColor(0.08, 0.08, 0.08, 1)
child.Button.hl = child.Button:CreateTexture(nil, "HIGHLIGHT")
child.Button.hl:SetColorTexture(1, 1, 1, 0.3)
child.Button.hl:SetInside(child.Button.backdrop)
child.Button.hl:SetBlendMode("ADD")
child.collapseTex = child.Button.backdrop:CreateTexture(nil, "OVERLAY")
child.collapseTex:SetPoint("RIGHT", -10, 0)
UpdateHeaderExpand(child, false)
hooksecurefunc(child, "EvaluateVisibility", UpdateHeaderExpand)
end
end
if child.ToggleTest then
child.ToggleTest:SkinButton()
child.VUMeter:StripTextures()
child.VUMeter.NineSlice:Hide()
child.VUMeter:CreateBackdrop("Overlay")
child.VUMeter.backdrop:SetInside(4, 4)
child.VUMeter.Status:SetStatusBarTexture(C.media.texture)
end
if child.PushToTalkKeybindButton then
child.PushToTalkKeybindButton:SkinButton()
end
if child.SliderWithSteppers then
T.SkinSliderStep(child.SliderWithSteppers)
end
if child.Button1 and child.Button2 then
child.Button1:SkinButton()
child.Button2:SkinButton()
end
child.isSkinned = true
end
end
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/OrderHall.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- OrderHallUI skin
----------------------------------------------------------------------------------------
local function LoadSkin()
OrderHallCommandBar:StripTextures()
OrderHallCommandBar:SetTemplate("Transparent")
OrderHallCommandBar:ClearAllPoints()
OrderHallCommandBar:SetPoint("TOP", UIParent, 0, -1)
OrderHallCommandBar.ClassIcon:SetTexture("Interface\\TargetingFrame\\UI-Classes-Circles")
OrderHallCommandBar.ClassIcon:SetSize(46, 20)
OrderHallCommandBar.CurrencyIcon:SetAtlas("legionmission-icon-currency", false)
OrderHallCommandBar.AreaName:ClearAllPoints()
OrderHallCommandBar.AreaName:SetPoint("LEFT", OrderHallCommandBar.CurrencyIcon, "RIGHT", 25, 0)
OrderHallCommandBar.AreaName:SetVertexColor(unpack(C.media.classborder_color))
OrderHallCommandBar.WorldMapButton:Kill()
OrderHallTalentFramePortrait:SetAlpha(0)
hooksecurefunc(OrderHallCommandBar, "RefreshCategories", function(self)
local index = 0
C_Timer.After(0.5, function()
for _, child in ipairs({self:GetChildren()}) do
if child.Icon and child.Count and child.TroopPortraitCover then
index = index + 1
child.TroopPortraitCover:Hide()
child.Icon:SetSize(38, 21)
end
end
self:SetWidth(270 + index * 112)
end)
end)
-- TalentFrame skin from ElvUI
local function colorBorder(child, backdrop, atlas)
if child.AlphaIconOverlay:IsShown() then -- isBeingResearched or (talentAvailability and not selected)
local alpha = child.AlphaIconOverlay:GetAlpha()
if alpha <= 0.5 then -- talentAvailability
backdrop:SetBackdropBorderColor(0.5, 0.5, 0.5) -- [border = grey, shadow x2]
child.darkOverlay:SetColorTexture(0, 0, 0, 0.50)
child.darkOverlay:Show()
elseif alpha <= 0.7 then -- isBeingResearched
backdrop:SetBackdropBorderColor(0, 1, 1) -- [border = teal, shadow x1]
child.darkOverlay:SetColorTexture(0, 0, 0, 0.25)
child.darkOverlay:Show()
end
elseif atlas:find("green") then
backdrop:SetBackdropBorderColor(0, 1, 0) -- [border = green, no shadow]
child.darkOverlay:Hide()
elseif atlas:find("yellow") then
backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) -- [border = yellow, no shadow]
child.darkOverlay:Hide()
else
backdrop:SetBackdropBorderColor(0.2, 0.2, 0.2) -- [border = dark grey, shadow x3]
child.darkOverlay:SetColorTexture(0, 0, 0, 0.75)
child.darkOverlay:Show()
end
end
OrderHallTalentFrame:StripTextures()
OrderHallTalentFrame:SetTemplate("Transparent")
OrderHallTalentFrame.NineSlice:Hide()
OrderHallTalentFrame.OverlayElements:Hide()
T.SkinCloseButton(OrderHallTalentFrameCloseButton)
hooksecurefunc(OrderHallTalentFrame, "SetUseThemedTextures", function(self)
self.Background:ClearAllPoints()
self.Background:SetPoint("TOPLEFT")
self.Background:SetPoint("BOTTOMRIGHT")
self.Background:SetDrawLayer("BACKGROUND", 2)
end)
OrderHallTalentFrame:HookScript("OnShow", function(self)
if self.CloseButton.Border then
self.CloseButton.Border:SetAlpha(0)
end
if self.portrait then
self.portrait:SetAlpha(0)
end
if self.skinned then return end
self.Currency.Icon:SkinIcon()
self.BackButton:SkinButton()
for i = 1, self:GetNumChildren() do
local child = select(i, self:GetChildren())
if child and child.Icon and child.DoneGlow and not child.backdrop then
child:StyleButton()
child:CreateBackdrop()
child.Border:SetAlpha(0)
child.Highlight:SetAlpha(0)
child.AlphaIconOverlay:SetTexture(nil)
child.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
child.Icon:SetInside(child.backdrop)
child.hover:SetInside(child.backdrop)
child.pushed:SetInside(child.backdrop)
child.backdrop:SetFrameLevel(child.backdrop:GetFrameLevel() + 1)
child.darkOverlay = child:CreateTexture()
child.darkOverlay:SetAllPoints(child.Icon)
child.darkOverlay:SetDrawLayer('OVERLAY')
child.darkOverlay:Hide()
colorBorder(child, child.backdrop, child.Border:GetAtlas())
child.TalentDoneAnim:HookScript("OnFinished", function()
child.Border:SetAlpha(0) -- clear the yellow glow border again, after it finishes the animation
end)
end
end
self.choiceTexturePool:ReleaseAll()
hooksecurefunc(self, "RefreshAllData", function(frame)
frame.choiceTexturePool:ReleaseAll()
for i = 1, frame:GetNumChildren() do
local child = select(i, frame:GetChildren())
if child and child.Icon and child.Border and child.backdrop then
colorBorder(child, child.backdrop, child.Border:GetAtlas())
end
end
end)
self.skinned = true
end)
end
T.SkinFuncs["Blizzard_OrderHallUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Others.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Reskin Blizzard windows(by Tukz and Co)
----------------------------------------------------------------------------------------
local SkinBlizzUI = CreateFrame("Frame")
SkinBlizzUI:RegisterEvent("ADDON_LOADED")
SkinBlizzUI:SetScript("OnEvent", function(_, _, addon)
if IsAddOnLoaded("Skinner") or IsAddOnLoaded("Aurora") then return end
-- Stuff not in Blizzard load-on-demand
if addon == "ShestakUI" then
-- Skin checkButtons
local checkButtons = {
"LFDRoleCheckPopupRoleButtonTank",
"LFDRoleCheckPopupRoleButtonDPS",
"LFDRoleCheckPopupRoleButtonHealer"
}
for _, object in pairs(checkButtons) do
T.SkinCheckBox(_G[object].checkButton)
end
-- Blizzard Frame reskin
local bgskins = {
"GameMenuFrame",
"BNToastFrame",
"TicketStatusFrameButton",
"ReadyCheckFrame",
"ColorPickerFrame",
"LFDRoleCheckPopup",
"LFDReadyCheckPopup",
"GuildInviteFrame",
"RolePollPopup",
"BaudErrorFrame",
"OpacityFrame",
"GeneralDockManagerOverflowButtonList",
"QueueStatusFrame",
"BasicScriptErrors"
}
QueueStatusFrame:StripTextures()
GameMenuFrame:StripTextures()
LFDRoleCheckPopup:StripTextures()
RolePollPopup:StripTextures()
OpacityFrame:StripTextures()
ColorPickerFrame.Border:Hide()
AutoCompleteBox.NineSlice:SetTemplate("Transparent")
for i = 1, getn(bgskins) do
local frame = _G[bgskins[i]]
if frame then
frame:SetTemplate("Transparent")
end
end
local insetskins = {
"BaudErrorFrameListScrollBox",
"BaudErrorFrameDetailScrollBox"
}
for i = 1, getn(insetskins) do
local frame = _G[insetskins[i]]
if frame then
frame:SetTemplate("Overlay")
end
end
-- Reskin popups
for i = 1, 4 do
for j = 1, 4 do
_G["StaticPopup"..i.."Button"..j]:SkinButton()
end
_G["StaticPopup"..i]:StripTextures()
_G["StaticPopup"..i].Border:StripTextures()
_G["StaticPopup"..i]:CreateBackdrop("Transparent")
_G["StaticPopup"..i].backdrop:SetPoint("TOPLEFT", 2, -2)
_G["StaticPopup"..i].backdrop:SetPoint("BOTTOMRIGHT", -2, 2)
T.SkinEditBox(_G["StaticPopup"..i.."EditBox"])
T.SkinEditBox(_G["StaticPopup"..i.."MoneyInputFrameGold"])
T.SkinEditBox(_G["StaticPopup"..i.."MoneyInputFrameSilver"])
T.SkinEditBox(_G["StaticPopup"..i.."MoneyInputFrameCopper"])
_G["StaticPopup"..i.."EditBox"].backdrop:SetPoint("TOPLEFT", -3, -6)
_G["StaticPopup"..i.."EditBox"].backdrop:SetPoint("BOTTOMRIGHT", -3, 6)
_G["StaticPopup"..i.."MoneyInputFrameGold"].backdrop:SetPoint("TOPLEFT", -3, 0)
_G["StaticPopup"..i.."MoneyInputFrameSilver"].backdrop:SetPoint("TOPLEFT", -3, 0)
_G["StaticPopup"..i.."MoneyInputFrameCopper"].backdrop:SetPoint("TOPLEFT", -3, 0)
_G["StaticPopup"..i.."ItemFrameNameFrame"]:Kill()
_G["StaticPopup"..i.."ItemFrame"]:GetNormalTexture():Kill()
_G["StaticPopup"..i.."ItemFrame"]:SetTemplate("Default")
_G["StaticPopup"..i.."ItemFrame"]:StyleButton()
_G["StaticPopup"..i.."ItemFrame"].IconBorder:SetAlpha(0)
_G["StaticPopup"..i.."ItemFrameIconTexture"]:SetTexCoord(0.1, 0.9, 0.1, 0.9)
_G["StaticPopup"..i.."ItemFrameIconTexture"]:ClearAllPoints()
_G["StaticPopup"..i.."ItemFrameIconTexture"]:SetPoint("TOPLEFT", 2, -2)
_G["StaticPopup"..i.."ItemFrameIconTexture"]:SetPoint("BOTTOMRIGHT", -2, 2)
_G["StaticPopup"..i.."CloseButton"]:SetNormalTexture(0)
_G["StaticPopup"..i.."CloseButton"].SetNormalTexture = T.dummy
_G["StaticPopup"..i.."CloseButton"]:SetPushedTexture(0)
_G["StaticPopup"..i.."CloseButton"].SetPushedTexture = T.dummy
T.SkinCloseButton(_G["StaticPopup"..i.."CloseButton"])
end
_G["StaticPopup1ExtraButton"]:SkinButton()
T.SkinCloseButton(_G["RolePollPopupCloseButton"])
-- Cinematic popup
_G["CinematicFrameCloseDialog"]:SetScale(C.general.uiscale)
_G["CinematicFrameCloseDialog"]:StripTextures()
_G["CinematicFrameCloseDialog"]:SetTemplate("Transparent")
_G["CinematicFrameCloseDialogConfirmButton"]:SkinButton()
_G["CinematicFrameCloseDialogResumeButton"]:SkinButton()
_G["CinematicFrameCloseDialogResumeButton"]:SetPoint("LEFT", _G["CinematicFrameCloseDialogConfirmButton"], "RIGHT", 15, 0)
-- Movie popup /run MovieFrame_PlayMovie(MovieFrame, 18)
MovieFrame.CloseDialog:SetScale(C.general.uiscale)
MovieFrame.CloseDialog:StripTextures()
MovieFrame.CloseDialog:SetTemplate("Transparent")
MovieFrame.CloseDialog.ConfirmButton:SkinButton()
MovieFrame.CloseDialog.ResumeButton:SkinButton()
MovieFrame.CloseDialog.ResumeButton:SetPoint("LEFT", MovieFrame.CloseDialog.ConfirmButton, "RIGHT", 15, 0)
-- PetBattle popup
_G["PetBattleQueueReadyFrame"]:SetTemplate("Transparent")
_G["PetBattleQueueReadyFrame"].AcceptButton:SkinButton()
_G["PetBattleQueueReadyFrame"].DeclineButton:SkinButton()
-- Reskin Dropdown menu
local dropdowns = {"DropDownList", "L_DropDownList", "Lib_DropDownList"}
hooksecurefunc("UIDropDownMenu_InitializeHelper", function()
for _, name in next, dropdowns do
for i = 1, UIDROPDOWNMENU_MAXLEVELS do
local backdrop = _G[name..i.."Backdrop"]
if backdrop then
backdrop:SetTemplate("Transparent")
local menu = _G[name..i.."MenuBackdrop"].NineSlice or _G[name..i.."MenuBackdrop"]
if menu then
menu:SetTemplate("Transparent")
end
if backdrop.Bg then
backdrop.Bg:SetAlpha(0)
end
end
end
end
end)
hooksecurefunc("ToggleDropDownMenu", function(level)
if not level then
level = 1
end
for i = 1, _G.UIDROPDOWNMENU_MAXBUTTONS do
local button = _G["DropDownList"..level.."Button"..i]
local check = _G["DropDownList"..level.."Button"..i.."Check"]
local uncheck = _G["DropDownList"..level.."Button"..i.."UnCheck"]
if not button.backdrop then
button:CreateBackdrop("Transparent")
button.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], 0.3)
end
button.backdrop:Hide()
local texture = check:GetTexture()
if not button.notCheckable and texture == 375502 then
uncheck:SetTexture()
local _, co = check:GetTexCoord()
if co == 0 then
check:SetTexture([[Interface\Buttons\UI-CheckBox-Check]])
check:SetVertexColor(1, 0.9, 0, 1)
check:SetSize(18, 18)
check:SetDesaturated(true)
button.backdrop:SetInside(check, 4, 4)
else
check:SetTexture(C.media.blank)
check:SetVertexColor(1, 0.82, 0, 0.8)
check:SetSize(6, 6)
check:SetDesaturated(false)
button.backdrop:SetOutside(check)
end
button.backdrop:Show()
check:SetTexCoord(0, 1, 0, 1)
else
check:SetSize(16, 16)
end
end
end)
if RaiderIO_CustomDropDownListMenuBackdrop then
RaiderIO_CustomDropDownListMenuBackdrop:StripTextures()
end
-- Reskin menu
local ChatMenus = {
"ChatMenu",
"EmoteMenu",
"LanguageMenu",
"VoiceMacroMenu"
}
for i = 1, getn(ChatMenus) do
if _G[ChatMenus[i]] == _G["ChatMenu"] then
_G[ChatMenus[i]]:HookScript("OnShow", function(self)
self:SetTemplate("Transparent")
self:ClearAllPoints()
self:SetPoint("BOTTOMRIGHT", ChatFrame1, "BOTTOMRIGHT", 0, 30)
end)
else
_G[ChatMenus[i]]:HookScript("OnShow", function(self)
self:SetTemplate("Transparent")
end)
end
end
-- Hide header textures and move text/buttons
local BlizzardHeader = {
GameMenuFrame,
ColorPickerFrame
}
for _, frame in pairs(BlizzardHeader) do
local title = frame.Header
if title then
title:StripTextures()
title:ClearAllPoints()
title:SetPoint("TOP", frame, 0, 7)
end
end
-- Reskin buttons
local BlizzardButtons = {
"GameMenuButtonOptions",
"GameMenuButtonHelp",
"GameMenuButtonStore",
"GameMenuButtonSettings",
"GameMenuButtonEditMode",
"GameMenuButtonKeybindings",
"GameMenuButtonMacros",
"GameMenuButtonRatings",
"GameMenuButtonAddOns",
"GameMenuButtonAddons",
"GameMenuButtonLogout",
"GameMenuButtonQuit",
"GameMenuButtonContinue",
"GameMenuButtonMacOptions",
"GameMenuButtonOptionHouse",
"GameMenuButtonSettingsUI",
"GameMenuButtonWhatsNew",
"ReadyCheckFrameYesButton",
"ReadyCheckFrameNoButton",
"ColorPickerOkayButton",
"ColorPickerCancelButton",
"BaudErrorFrameClearButton",
"BaudErrorFrameCloseButton",
"GuildInviteFrameJoinButton",
"GuildInviteFrameDeclineButton",
"RolePollPopupAcceptButton",
"LFDRoleCheckPopupDeclineButton",
"LFDRoleCheckPopupAcceptButton",
"LFDReadyCheckPopupAcceptButton",
"RaidUtilityConvertButton",
"RaidUtilityMainTankButton",
"RaidUtilityMainAssistButton",
"RaidUtilityRoleButton",
"RaidUtilityReadyCheckButton",
"RaidUtilityShowButton",
"RaidUtilityCloseButton",
"RaidUtilityDisbandButton",
"RaidUtilityRaidControlButton",
"BasicScriptErrorsButton"
}
if C.misc.raid_tools == true then
tinsert(BlizzardButtons, "CompactRaidFrameManagerDisplayFrameLeaderOptionsRaidWorldMarkerButton")
end
for i = 1, getn(BlizzardButtons) do
local buttons = _G[BlizzardButtons[i]]
if buttons then
buttons:SkinButton()
end
end
LFDReadyCheckPopup.YesButton:SkinButton(true)
LFDReadyCheckPopup.NoButton:SkinButton(true)
-- Reskin scrollbars
local scrollbars = {
"BaudErrorFrameListScrollBoxScrollBarScrollBar",
"BaudErrorFrameDetailScrollFrameScrollBar"
}
for _, scrollbar in pairs(scrollbars) do
local bars = _G[scrollbar]
if bars then
T.SkinScrollBar(bars)
end
end
-- Button position or text
_G["ColorPickerOkayButton"]:ClearAllPoints()
_G["ColorPickerOkayButton"]:SetPoint("BOTTOMLEFT", _G["ColorPickerFrame"], "BOTTOMLEFT", 6, 6)
_G["ColorPickerCancelButton"]:ClearAllPoints()
_G["ColorPickerCancelButton"]:SetPoint("BOTTOMRIGHT", _G["ColorPickerFrame"], "BOTTOMRIGHT", -6, 6)
_G["ReadyCheckFrameYesButton"]:SetParent(_G["ReadyCheckFrame"])
_G["ReadyCheckFrameYesButton"]:ClearAllPoints()
_G["ReadyCheckFrameNoButton"]:SetParent(_G["ReadyCheckFrame"])
_G["ReadyCheckFrameNoButton"]:ClearAllPoints()
_G["ReadyCheckFrameYesButton"]:SetPoint("RIGHT", _G["ReadyCheckFrame"], "CENTER", 0, -22)
_G["ReadyCheckFrameNoButton"]:SetPoint("LEFT", _G["ReadyCheckFrameYesButton"], "RIGHT", 6, 0)
_G["ReadyCheckFrameText"]:SetParent(_G["ReadyCheckFrame"])
_G["ReadyCheckFrameText"]:ClearAllPoints()
_G["ReadyCheckFrameText"]:SetPoint("TOP", 0, -12)
-- Others
for i = 1, 10 do
select(i, GuildInviteFrame:GetRegions()):Hide()
end
_G["GeneralDockManagerOverflowButtonList"]:SetFrameStrata("HIGH")
_G["ReadyCheckListenerFrame"]:SetAlpha(0)
_G["ReadyCheckFrame"]:HookScript("OnShow", function(self) if UnitIsUnit("player", self.initiator) then self:Hide() end end)
-- StackSplit
StackSplitFrame:SetFrameStrata("TOOLTIP")
StackSplitFrame:StripTextures()
StackSplitFrame:CreateBackdrop("Transparent")
StackSplitFrame.backdrop:SetPoint("TOPLEFT", 5, -5)
StackSplitFrame.backdrop:SetPoint("BOTTOMRIGHT", -5, 10)
StackSplitFrame.OkayButton:SkinButton()
StackSplitFrame.CancelButton:SkinButton()
if C.skins.blizzard_frames == true then
-- Social Browser frame
SocialBrowserFrame:StripTextures()
SocialBrowserFrame:SetTemplate("Transparent")
T.SkinCloseButton(SocialBrowserFrame.CloseButton)
SocialBrowserFrame.CloseButton:SetSize(16, 16)
-- What's new frame
SplashFrame:CreateBackdrop("Transparent")
SplashFrame.BottomCloseButton:SkinButton()
T.SkinCloseButton(SplashFrame.TopCloseButton)
-- NavBar Buttons (Used in EncounterJournal and HelpFrame)
local function SkinNavBarButtons(self)
if self:GetParent():GetName() == "WorldMapFrame" then return end
local navButton = self.navList[#self.navList]
if navButton and not navButton.isSkinned then
navButton:SkinButton(true)
if navButton.MenuArrowButton then
navButton.MenuArrowButton:SetNormalTexture(0)
navButton.MenuArrowButton:SetPushedTexture(0)
navButton.MenuArrowButton:SetHighlightTexture(0)
end
navButton.xoffset = 1
navButton.isSkinned = true
end
end
hooksecurefunc("NavBar_AddButton", SkinNavBarButtons)
local function SetHomeButtonOffsetX(self)
if self:GetParent():GetName() == "WorldMapFrame" then return end
if self.homeButton then
self.homeButton.xoffset = 1
end
end
hooksecurefunc("NavBar_Initialize", SetHomeButtonOffsetX)
if T.client == "ruRU" then
_G["DeclensionFrame"]:SetTemplate("Transparent")
_G["DeclensionFrameCancelButton"]:SkinButton()
_G["DeclensionFrameOkayButton"]:SkinButton()
T.SkinNextPrevButton(_G["DeclensionFrameSetNext"])
T.SkinNextPrevButton(_G["DeclensionFrameSetPrev"])
for i = 1, 5 do
_G["DeclensionFrameDeclension"..i.."Edit"]:StripTextures(true)
_G["DeclensionFrameDeclension"..i.."Edit"]:SetTemplate("Overlay")
_G["DeclensionFrameDeclension"..i.."Edit"]:SetTextInsets(3, 0, 0, 0)
end
end
if C.skins.clique ~= true and IsAddOnLoaded("Clique") then
CliqueSpellTab:GetRegions():SetSize(0.1, 0.1)
CliqueSpellTab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)
CliqueSpellTab:GetNormalTexture():ClearAllPoints()
CliqueSpellTab:GetNormalTexture():SetPoint("TOPLEFT", 2, -2)
CliqueSpellTab:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2)
CliqueSpellTab:CreateBackdrop("Default")
CliqueSpellTab.backdrop:SetAllPoints()
CliqueSpellTab:StyleButton()
end
local function SkinIconArray(baseName, numIcons)
for i = 1, numIcons do
local button = _G[baseName..i]
local texture = _G[baseName..i.."Icon"]
button:StripTextures()
button:StyleButton(true)
button:SetTemplate("Default")
texture:ClearAllPoints()
texture:SetPoint("TOPLEFT", 2, -2)
texture:SetPoint("BOTTOMRIGHT", -2, 2)
texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
end
-- This is used to create icons for the GuildBankPopupFrame, MacroPopupFrame, and GearManagerDialogPopup
hooksecurefunc("BuildIconArray", function(_, baseName, _, rowSize, numRows)
local numIcons = rowSize * numRows
SkinIconArray(baseName, numIcons)
end)
hooksecurefunc(HelpTipTemplateMixin, "ApplyText", function(self)
T.SkinHelpBox(self)
end)
end
end
if addon == "Blizzard_GuildUI" and T.client == "ruRU" then
_G["GuildFrameTab1"]:ClearAllPoints()
_G["GuildFrameTab1"]:SetPoint("TOPLEFT", _G["GuildFrame"], "BOTTOMLEFT", -4, 2)
end
end)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/PartyPoseUI.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- PartyPoseUI skin
----------------------------------------------------------------------------------------
local function SkinPartyPoseFrame(frame)
frame:StripTextures()
frame:CreateBackdrop("Transparent")
frame.backdrop:SetPoint("TOPLEFT", -2, UnitFactionGroup("player") == "Horde" and 11 or 15)
frame.backdrop:SetPoint("BOTTOMRIGHT", 2, -3)
frame.Border:Hide()
frame.ModelScene:StripTextures()
frame.ModelScene:CreateBackdrop("Transparent")
local rewardFrame = frame.RewardAnimations.RewardFrame
rewardFrame.NameFrame:SetAlpha(0)
rewardFrame.IconBorder:SetAlpha(0)
rewardFrame.Icon:SetPoint("TOPLEFT", -15, -2)
rewardFrame.Icon:SkinIcon()
frame.LeaveButton:SkinButton()
end
local function LoadSkin()
SkinPartyPoseFrame(IslandsPartyPoseFrame)
end
T.SkinFuncs["Blizzard_IslandsPartyPoseUI"] = LoadSkin
local function LoadSecondarySkin()
SkinPartyPoseFrame(WarfrontsPartyPoseFrame)
end
T.SkinFuncs["Blizzard_WarfrontsPartyPoseUI"] = LoadSecondarySkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/PetStable.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- PetStable skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = PetStableFrame
T.SkinFrame(frame)
PetStableFrameInset:SetTemplate("Overlay")
T.SkinRotateButton(PetStableModelRotateLeftButton)
T.SkinRotateButton(PetStableModelRotateRightButton)
PetStableModelRotateRightButton:ClearAllPoints()
PetStableModelRotateRightButton:SetPoint("LEFT", PetStableModelRotateLeftButton, "RIGHT", 3, 0)
T.SkinNextPrevButton(PetStablePrevPageButton, nil, "Any")
T.SkinNextPrevButton(PetStableNextPageButton, nil, "Any")
for i = 1, NUM_PET_ACTIVE_SLOTS do
local button = _G["PetStableActivePet"..i]
local icon = _G["PetStableActivePet"..i.."IconTexture"]
button:StripTextures()
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)
end
for i = 1, NUM_PET_STABLE_SLOTS do
local button = _G["PetStableStabledPet"..i]
local icon = _G["PetStableStabledPet"..i.."IconTexture"]
button:StripTextures()
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)
end
PetStableSelectedPetIcon:SkinIcon()
PetStableDiet:StripTextures()
PetStableDiet:SetSize(20, 20)
PetStableDiet:SetPoint("TOPRIGHT", -9, -2)
PetStableDietTexture:SetTexture("Interface\\Icons\\ability_hunter_beasttraining")
PetStableDietTexture:SkinIcon()
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Petition.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Petition skin
----------------------------------------------------------------------------------------
local function LoadSkin()
PetitionFrame:StripTextures(true)
PetitionFrameInset:StripTextures()
PetitionFrame:CreateBackdrop("Transparent")
PetitionFrame.backdrop:SetAllPoints()
PetitionFramePortrait:SetAlpha(0)
PetitionFrameSignButton:SkinButton()
PetitionFrameRequestButton:SkinButton()
PetitionFrameRenameButton:SkinButton()
PetitionFrameCancelButton:SkinButton()
T.SkinCloseButton(PetitionFrameCloseButton, PetitionFrame.backdrop)
PetitionFrameCharterTitle:SetTextColor(1, 0.8, 0)
PetitionFrameCharterTitle:SetShadowColor(0, 0, 0)
PetitionFrameCharterName:SetTextColor(1, 1, 1)
PetitionFrameMasterTitle:SetTextColor(1, 0.8, 0)
PetitionFrameMasterTitle:SetShadowColor(0, 0, 0)
PetitionFrameMasterName:SetTextColor(1, 1, 1)
PetitionFrameMemberTitle:SetTextColor(1, 0.8, 0)
PetitionFrameMemberTitle:SetShadowColor(0, 0, 0)
for i = 1, 9 do
_G["PetitionFrameMemberName"..i]:SetTextColor(1, 1, 1)
end
PetitionFrameInstructions:SetTextColor(1, 1, 1)
PetitionFrameRenameButton:SetPoint("LEFT", PetitionFrameRequestButton, "RIGHT", 3, 0)
PetitionFrameRenameButton:SetPoint("RIGHT", PetitionFrameCancelButton, "LEFT", -3, 0)
PetitionFrameCancelButton:SetPoint("BOTTOMRIGHT", PetitionFrame, "BOTTOMRIGHT", -5, 4)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/PlayerChoice.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Player Choice skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = _G.PlayerChoiceFrame
hooksecurefunc(frame, "SetupOptions", function(self)
if not frame.IsSkinned then
frame.BlackBackground:SetAlpha(0)
frame.Background:SetAlpha(0)
frame.NineSlice:SetAlpha(0)
frame.Header.Texture:SetAlpha(0)
frame:CreateBackdrop("Transparent")
frame.Title:DisableDrawLayer("BACKGROUND")
frame.Title.Text:SetTextColor(1, .8, 0)
T.SkinCloseButton(frame.CloseButton)
hooksecurefunc(frame.CloseButton, "SetPoint", function(self, point, anchor, attachTo, x)
if x ~= -4 then
self:SetPoint(point, anchor, attachTo, -4, -4)
end
end)
frame.IsSkinned = true
end
if frame.CloseButton.Border then
frame.CloseButton.Border:SetAlpha(0)
end
local IsAnima = frame.uiTextureKit and frame.uiTextureKit == "jailerstower"
frame.backdrop:SetShown(not IsAnima)
for option in self.optionPools:EnumerateActiveByTemplate(self.optionFrameTemplate) do
local hasArtwork = option.ArtworkBorder and option.ArtworkBorder:IsShown()
option:CreateBackdrop("Overlay")
option.backdrop:SetPoint("TOPLEFT", -2, 20)
option.backdrop:SetPoint("BOTTOMRIGHT", 2, -8)
option.backdrop:SetShown(not IsAnima and hasArtwork)
if option.Header.Ribbon then option.Header.Ribbon:SetAlpha(0) end
if option.Header.Contents then option.Header.Contents.Text:SetTextColor(1, .8, 0) end
option.OptionText:SetTextColor(1, 1, 1)
option.Background:SetShown(not hasArtwork)
if IsAnima then
option.Background:Show()
end
if option.ArtworkBorder then
option.ArtworkBorder:SetAlpha(0)
if not option.ArtBackdrop then
option.ArtBackdrop = CreateFrame("Frame", nil, option)
option.ArtBackdrop:SetFrameLevel(option:GetFrameLevel())
option.ArtBackdrop:SetPoint("TOPLEFT", option.Artwork, -2, 2)
option.ArtBackdrop:SetPoint("BOTTOMRIGHT", option.Artwork, 2, -2)
option.ArtBackdrop:SetTemplate("Default")
end
option.ArtBackdrop:SetShown(not IsAnima and hasArtwork)
if PlayerChoiceFrame:IsLegacy() then -- Garrison
option.ArtBackdrop:Hide()
end
end
local buttonsContainer = option.OptionButtonsContainer
if buttonsContainer and buttonsContainer.buttonPool then
for button in buttonsContainer.buttonPool:EnumerateActive() do
if not button.isSkinned then
if IsAnima then
button:StripTextures(true)
end
-- if i == 1 or (hasArtwork and i == 2) then
button:SkinButton()
-- end
button.isSkinned = true
end
end
end
local rewardframe = option.Rewards
if rewardframe then
for reward in rewardframe.rewardsPool:EnumerateActive() do
if not reward.backdrop and reward.Icon then
reward.Icon:SkinIcon()
end
if reward.Name then reward.Name:SetTextColor(1, 1, 1) end
if reward.IconBorder then reward.IconBorder:SetTexture("") end
local r, g, b
if reward.IconBorder and reward.IconBorder:IsShown() then
r, g, b = reward.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
if reward.backdrop then reward.backdrop:SetBackdropBorderColor(r, g, b) end
end
end
local widgetFrames = option.WidgetContainer.widgetFrames
if widgetFrames then
for _, widgetFrame in next, widgetFrames do
if widgetFrame.widgetType == _G.Enum.UIWidgetVisualizationType.TextWithState then
widgetFrame.Text:SetTextColor(1, 1, 1)
elseif widgetFrame.widgetType == _G.Enum.UIWidgetVisualizationType.SpellDisplay then
local _, g = widgetFrame.Spell.Text:GetTextColor()
if g < 0.2 then
widgetFrame.Spell.Text:SetTextColor(1, 1, 1)
end
widgetFrame.Spell.Border:Hide()
widgetFrame.Spell.IconMask:Hide()
if not widgetFrame.Spell.backdrop then
widgetFrame.Spell.Icon:SkinIcon()
end
if widgetFrame.Spell.Icon:GetWidth() < 25 then
widgetFrame.Spell.Icon:SetSize(20, 20)
end
end
end
end
end
end)
end
T.SkinFuncs["Blizzard_PlayerChoice"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Professions.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Professions skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = ProfessionsFrame
T.SkinFrame(frame)
ProfessionsFrame.CraftingPage.TutorialButton.Ring:Hide()
ProfessionsFrame.CraftingPage.TutorialButton:SetPoint("TOPLEFT", frame, "TOPLEFT", -5, 10)
T.SkinEditBox(frame.CraftingPage.RecipeList.SearchBox, nil, 16)
frame.CraftingPage.RecipeList.FilterButton:SkinButton()
frame.CraftingPage.RecipeList.FilterButton:SetPoint("TOPRIGHT", ProfessionsFrame.CraftingPage.RecipeList, "TOPRIGHT", -8, -6)
T.SkinCloseButton(ProfessionsFrame.CraftingPage.RecipeList.FilterButton.ResetButton)
ProfessionsFrame.CraftingPage.RecipeList.FilterButton.ResetButton:ClearAllPoints()
ProfessionsFrame.CraftingPage.RecipeList.FilterButton.ResetButton:SetPoint("CENTER", ProfessionsFrame.CraftingPage.RecipeList.FilterButton, "TOPRIGHT", 0, 0)
local RankBar = frame.CraftingPage.RankBar
RankBar.Border:Hide()
RankBar.Background:Hide()
RankBar:CreateBackdrop("Overlay")
RankBar.backdrop:SetOutside(RankBar.Fill)
local LinkButton = frame.CraftingPage.LinkButton
LinkButton:GetNormalTexture():SetTexCoord(0.25, 0.7, 0.37, 0.75)
LinkButton:GetPushedTexture():SetTexCoord(0.25, 0.7, 0.45, 0.8)
LinkButton:GetHighlightTexture():Kill()
LinkButton:CreateBackdrop("Overlay")
LinkButton:SetSize(17, 14)
LinkButton:SetPoint("LEFT", ProfessionsFrame.CraftingPage.RankBar, "RIGHT", 1, -3)
for _, name in pairs({"Prof0ToolSlot", "Prof0Gear0Slot", "Prof0Gear1Slot", "Prof1ToolSlot", "Prof1Gear0Slot", "Prof1Gear1Slot", "CookingToolSlot", "CookingGear0Slot", "FishingToolSlot", "FishingGear0Slot", "FishingGear1Slot"}) do
local button = frame.CraftingPage[name]
if button then
button:StripTextures()
button.icon:SkinIcon()
T.SkinIconBorder(button.IconBorder, button.icon:GetParent().backdrop)
button:SetNormalTexture(0)
button:SetPushedTexture(0)
end
end
local RecipeList = frame.CraftingPage.RecipeList
RecipeList:StripTextures()
RecipeList.BackgroundNineSlice:Hide()
T.SkinScrollBar(RecipeList.ScrollBar, true)
local SchematicForm = frame.CraftingPage.SchematicForm
SchematicForm:StripTextures()
SchematicForm:CreateBackdrop("Overlay")
SchematicForm.backdrop:SetInside()
SchematicForm.Background:SetInside(SchematicForm, 4, 4)
T.SkinCheckBox(SchematicForm.TrackRecipeCheckBox, 24)
T.SkinCheckBox(SchematicForm.AllocateBestQualityCheckBox, 24)
local function skinDetails(frame)
frame:SetFrameLevel(frame:GetFrameLevel() + 1)
frame:StripTextures()
frame.backdrop = CreateFrame("Frame", nil, frame)
frame.backdrop:SetFrameLevel(frame:GetFrameLevel() - 1)
frame.backdrop:SetTemplate("Overlay")
frame.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha)
frame.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 0.5)
frame.backdrop:SetPoint("TOPLEFT", -2, -15)
frame.backdrop:SetPoint("BOTTOMRIGHT", 2, 15)
end
skinDetails(SchematicForm.Details)
local OutputIcon = SchematicForm.OutputIcon
if OutputIcon then
OutputIcon.Icon:SkinIcon()
T.SkinIconBorder(OutputIcon.IconBorder, OutputIcon.Icon:GetParent().backdrop)
OutputIcon:GetHighlightTexture():Hide()
OutputIcon.CircleMask:Hide()
if OutputIcon.CountShadow then OutputIcon.CountShadow:SetAlpha(0) end
end
local qualityDialog = SchematicForm.QualityDialog
qualityDialog:StripTextures()
qualityDialog:SetTemplate("Transparent")
T.SkinCloseButton(qualityDialog.ClosePanelButton)
qualityDialog.AcceptButton:SkinButton()
qualityDialog.CancelButton:SkinButton()
local function ReskinQualityContainer(container)
local button = container.Button
button:StripTextures()
button:SetNormalTexture(0)
button:SetPushedTexture(0)
button:GetHighlightTexture():Hide()
button.Icon:SkinIcon()
T.SkinIconBorder(button.IconBorder, button.Icon:GetParent().backdrop)
local box = container.EditBox
box:DisableDrawLayer("BACKGROUND")
T.SkinEditBox(box, nil, 18)
T.SkinNextPrevButton(box.DecrementButton, true)
T.SkinNextPrevButton(box.IncrementButton)
box.DecrementButton:SetSize(22, 22)
box.IncrementButton:SetSize(22, 22)
box.IncrementButton:SetPoint("LEFT", box, "RIGHT", 6, 0)
end
ReskinQualityContainer(qualityDialog.Container1)
ReskinQualityContainer(qualityDialog.Container2)
ReskinQualityContainer(qualityDialog.Container3)
local function skinReagentIcon(button)
if button and not button.styled then
button.Icon:SkinIcon()
button:SetNormalTexture(0)
button:SetPushedTexture(0)
button:GetHighlightTexture():Hide()
T.SkinIconBorder(button.IconBorder, button.Icon:GetParent().backdrop)
if button.SlotBackground then
button.SlotBackground:Hide()
end
button.styled = true
end
end
hooksecurefunc(SchematicForm, "Init", function(frame)
for slot in frame.reagentSlotPool:EnumerateActive() do
skinReagentIcon(slot.Button)
end
local slot = SchematicForm.salvageSlot
if slot then
skinReagentIcon(slot.Button)
end
local slot = SchematicForm.enchantSlot
if slot then
skinReagentIcon(slot.Button)
end
end)
hooksecurefunc("OpenProfessionsItemFlyout", function(_, parent)
for i = 1, parent:GetNumChildren() do
local frame = select(i, parent:GetChildren())
if frame.HideUnownedCheckBox and not frame.backdrop then
frame:StripTextures()
frame:CreateBackdrop("Transparent")
frame.backdrop:SetFrameLevel(2)
frame.backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 5, 2)
T.SkinCheckBox(frame.HideUnownedCheckBox, 24)
hooksecurefunc(frame.ScrollBox, "Update", function(self)
for i = 1, self.ScrollTarget:GetNumChildren() do
local button = select(i, self.ScrollTarget:GetChildren())
if button.IconBorder and not button.styled then
button:SetTemplate("Transparent")
button.icon:CropIcon()
button:SetNormalTexture(0)
button:SetPushedTexture(0)
button:GetHighlightTexture():Hide()
T.SkinIconBorder(button.IconBorder, button)
button.styled = true
end
end
end)
break
end
end
end)
frame.CraftingPage.CreateAllButton:SkinButton()
frame.CraftingPage.CreateButton:SkinButton()
T.SkinEditBox(ProfessionsFrame.CraftingPage.CreateMultipleInputBox, nil, 18)
T.SkinNextPrevButton(ProfessionsFrame.CraftingPage.CreateMultipleInputBox.DecrementButton, true)
T.SkinNextPrevButton(ProfessionsFrame.CraftingPage.CreateMultipleInputBox.IncrementButton)
ProfessionsFrame.CraftingPage.CreateMultipleInputBox.IncrementButton:SetPoint("LEFT", ProfessionsFrame.CraftingPage.CreateMultipleInputBox, "RIGHT", 5, 0)
ProfessionsFrame.CraftingPage.CreateMultipleInputBox.IncrementButton:SetSize(22, 22)
ProfessionsFrame.CraftingPage.CreateMultipleInputBox.DecrementButton:SetSize(22, 22)
for _, tab in next, {frame.TabSystem:GetChildren()} do
T.SkinTab(tab)
end
local function HandleOutputButtons(frame)
for _, child in next, {frame.ScrollTarget:GetChildren()} do
if not child.isSkinned then
local itemContainer = child.ItemContainer
if itemContainer then
local item = itemContainer.Item
item:SetNormalTexture(0)
item:SetPushedTexture(0)
item:SetHighlightTexture(0)
local icon = item:GetRegions()
icon:SkinIcon()
item.IconBorder:Kill()
itemContainer.CritFrame:SetAlpha(0)
itemContainer.BorderFrame:Hide()
itemContainer.HighlightNameFrame:SetAlpha(0)
itemContainer.PushedNameFrame:SetAlpha(0)
itemContainer.NameFrame:Hide()
end
local bonus = child.CreationBonus
if bonus then
local item = bonus.Item
item:StripTextures()
local icon = item:GetRegions()
icon:SkinIcon()
end
child.isSkinned = true
end
local itemContainer = child.ItemContainer
if itemContainer then
itemContainer.Item.IconBorder:Hide()
itemContainer.Item.IconBorder:SetAlpha(0)
end
end
end
local function ReskinOutputLog(frame)
frame:StripTextures()
frame:SetTemplate("Transparent")
T.SkinCloseButton(frame.ClosePanelButton)
T.SkinScrollBar(frame.ScrollBar, true)
hooksecurefunc(frame.ScrollBox, "Update", HandleOutputButtons)
end
ReskinOutputLog(frame.CraftingPage.CraftingOutputLog)
-- Guild
frame.CraftingPage.ViewGuildCraftersButton:SkinButton()
local GuildFrame = frame.CraftingPage.GuildFrame
GuildFrame:StripTextures()
GuildFrame:CreateBackdrop("Transparent")
GuildFrame.Container:StripTextures()
GuildFrame.Container:CreateBackdrop("Overlay")
-- Spec page
local specPage = frame.SpecPage
specPage.UnlockTabButton:SkinButton()
specPage.ApplyButton:SkinButton()
specPage.TreeView:StripTextures()
specPage.TreeView.Background:Hide()
specPage.PanelFooter:StripTextures()
hooksecurefunc(specPage, "UpdateTabs", function(self)
for tab in self.tabsPool:EnumerateActive() do
if not tab.styled then
tab.styled = true
tab:DisableDrawLayer("BACKGROUND")
tab:StripTextures()
tab.backdrop = CreateFrame("Frame", nil, tab)
tab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)
tab.backdrop:SetTemplate("Overlay")
tab.backdrop:SetPoint("TOPLEFT", 6, -2)
tab.backdrop:SetPoint("BOTTOMRIGHT", -6, 2)
end
end
end)
local DetailedView = specPage.DetailedView
DetailedView:StripTextures()
DetailedView.UnlockPathButton:SkinButton()
DetailedView.SpendPointsButton:SkinButton()
DetailedView.UnspentPoints.Icon:SkinIcon()
-- Order page
local Orders = ProfessionsFrame.OrdersPage
local tabs = {
Orders.BrowseFrame.PublicOrdersButton,
Orders.BrowseFrame.GuildOrdersButton,
Orders.BrowseFrame.PersonalOrdersButton
}
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")
tab.backdrop:SetPoint("TOPLEFT", 6, -2)
tab.backdrop:SetPoint("BOTTOMRIGHT", -6, 2)
end
local BrowseFrame = Orders.BrowseFrame
BrowseFrame.OrdersRemainingDisplay:StripTextures()
BrowseFrame.OrdersRemainingDisplay:CreateBackdrop("Overlay")
BrowseFrame.FavoritesSearchButton:SkinButton()
BrowseFrame.FavoritesSearchButton:SetSize(22, 22)
BrowseFrame.FavoritesSearchButton:SetPoint("BOTTOMLEFT", Orders.BrowseFrame.RecipeList, "TOPLEFT", 11, 0)
BrowseFrame.SearchButton:SkinButton()
BrowseFrame.SearchButton:SetPoint("LEFT", BrowseFrame.FavoritesSearchButton, "RIGHT", 3, 0)
local BrowseList = Orders.BrowseFrame.RecipeList
BrowseList:StripTextures()
T.SkinScrollBar(BrowseList.ScrollBar, true)
T.SkinEditBox(BrowseList.SearchBox, nil, 16)
T.SkinCloseButton(BrowseList.FilterButton.ResetButton)
BrowseList.FilterButton.ResetButton:ClearAllPoints()
BrowseList.FilterButton.ResetButton:SetPoint("CENTER", BrowseList.FilterButton, "TOPRIGHT", 0, 0)
BrowseList.FilterButton:SkinButton()
BrowseList.FilterButton:SetPoint("TOPRIGHT", BrowseList, "TOPRIGHT", -8, -6)
BrowseList.BackgroundNineSlice:Hide()
local OrderList = Orders.BrowseFrame.OrderList
OrderList:StripTextures()
T.SkinScrollBar(OrderList.ScrollBar, true)
hooksecurefunc(Orders, "SetupTable", function()
local maxHeaders = OrderList.HeaderContainer:GetNumChildren()
for i = 1, maxHeaders do
local header = select(i, OrderList.HeaderContainer:GetChildren())
if not header.styled then
header:DisableDrawLayer("BACKGROUND")
header:GetHighlightTexture():Hide()
header:CreateBackdrop("Overlay")
header.backdrop:SetPoint("TOPLEFT", 2, 0)
header.backdrop:SetPoint("BOTTOMRIGHT", -2, 0)
header.styled = true
end
end
end)
Orders:SetupTable() -- init header
local OrderView = Orders.OrderView
local OrderRankBar = OrderView.RankBar
OrderRankBar.Border:Hide()
OrderRankBar.Background:Hide()
OrderRankBar:CreateBackdrop("Overlay")
OrderRankBar.backdrop:SetOutside(OrderRankBar.Fill)
ReskinOutputLog(OrderView.CraftingOutputLog)
OrderView.CreateButton:SkinButton()
OrderView.StartRecraftButton:SkinButton()
OrderView.CompleteOrderButton:SkinButton()
local OrderInfo = OrderView.OrderInfo
OrderInfo:StripTextures()
OrderInfo.BackButton:SkinButton()
OrderInfo.IgnoreButton:SkinButton()
OrderInfo.StartOrderButton:SkinButton()
OrderInfo.DeclineOrderButton:SkinButton()
OrderInfo.ReleaseOrderButton:SkinButton()
local NoteBox = OrderInfo.NoteBox
NoteBox:StripTextures()
NoteBox:CreateBackdrop("Overlay")
NoteBox.Background:Hide()
local OrderDetails = OrderView.OrderDetails
OrderDetails:StripTextures()
OrderDetails:CreateBackdrop("Transparent")
OrderDetails.backdrop:SetPoint("BOTTOMRIGHT", -2, 0)
OrderDetails.Background:ClearAllPoints()
OrderDetails.Background:SetInside(OrderDetails.backdrop)
local OrderSchematicForm = OrderDetails.SchematicForm
T.SkinCheckBox(OrderSchematicForm.AllocateBestQualityCheckBox)
skinDetails(OrderSchematicForm.Details)
hooksecurefunc(OrderSchematicForm, "Init", function(frame)
for slot in frame.reagentSlotPool:EnumerateActive() do
skinReagentIcon(slot.Button)
end
local slot = OrderSchematicForm.salvageSlot
if slot then
skinReagentIcon(slot.Button)
end
end)
local OutputIcon = OrderSchematicForm.OutputIcon
if OutputIcon then
OutputIcon.Icon:SkinIcon()
T.SkinIconBorder(OutputIcon.IconBorder, OutputIcon.Icon:GetParent().backdrop)
OutputIcon:GetHighlightTexture():Hide()
OutputIcon.CircleMask:Hide()
if OutputIcon.CountShadow then OutputIcon.CountShadow:SetAlpha(0) end
end
local FulfillmentForm = OrderDetails.FulfillmentForm
local NoteBox = FulfillmentForm.NoteEditBox
NoteBox:StripTextures()
NoteBox:CreateBackdrop("Overlay")
local OutputIcon = OrderDetails.FulfillmentForm.ItemIcon
if OutputIcon then
OutputIcon.Icon:SkinIcon()
T.SkinIconBorder(OutputIcon.IconBorder, OutputIcon.Icon:GetParent().backdrop)
OutputIcon:GetHighlightTexture():Hide()
OutputIcon.CircleMask:Hide()
if OutputIcon.CountShadow then OutputIcon.CountShadow:SetAlpha(0) end
end
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/ProfessionsOrders.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- ProfessionsOrders skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = ProfessionsCustomerOrdersFrame
T.SkinFrame(frame)
frame.MoneyFrameBorder:StripTextures()
frame.MoneyFrameInset:StripTextures()
local buttons = {
frame.BrowseOrders.SearchBar.SearchButton,
frame.BrowseOrders.SearchBar.FilterButton,
frame.BrowseOrders.SearchBar.FavoritesSearchButton,
frame.Form.BackButton,
frame.Form.PaymentContainer.ListOrderButton,
frame.Form.CurrentListings.CloseButton,
frame.Form.PaymentContainer.CancelOrderButton
}
for i = 1, #buttons do
buttons[i]:SkinButton()
end
local scrollbars = {
frame.BrowseOrders.RecipeList.ScrollBar,
frame.BrowseOrders.CategoryList.ScrollBar,
frame.MyOrdersPage.OrderList.ScrollBar,
frame.Form.CurrentListings.OrderList.ScrollBar
}
for i = 1, #scrollbars do
T.SkinScrollBar(scrollbars[i], true)
end
local tabs = {
ProfessionsCustomerOrdersFrameBrowseTab,
ProfessionsCustomerOrdersFrameOrdersTab,
}
for _, tab in pairs(tabs) do
if tab then
T.SkinTab(tab)
end
end
ProfessionsCustomerOrdersFrameBrowseTab:ClearAllPoints()
ProfessionsCustomerOrdersFrameBrowseTab:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 0, -32)
local orders = frame.BrowseOrders
orders.SearchBar.FavoritesSearchButton:SetSize(22, 22)
T.SkinEditBox(orders.SearchBar.SearchBox, nil, 18)
T.SkinCloseButton(orders.SearchBar.FilterButton.ClearFiltersButton)
orders.SearchBar.FilterButton.ClearFiltersButton:SetPoint("TOPRIGHT", 3, 6)
orders.CategoryList:StripTextures()
orders.CategoryList.ScrollBar:SetPoint("TOPLEFT", orders.CategoryList.ScrollBox, "TOPRIGHT", 6, -1)
orders.CategoryList.ScrollBar:SetPoint("BOTTOMLEFT", orders.CategoryList.ScrollBox, "BOTTOMRIGHT", 7, 2)
local function skinCategoryButton(button)
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
hooksecurefunc(orders.CategoryList.ScrollBox, "Update", function(self)
for i = 1, self.ScrollTarget:GetNumChildren() do
local child = select(i, self.ScrollTarget:GetChildren())
if child.Text and not child.styled then
if not child.SpacerLine:IsShown() then
skinCategoryButton(child)
hooksecurefunc(child, "Init", skinCategoryButton)
end
child.styled = true
end
end
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
frame.BrowseOrders.RecipeList:StripTextures()
hooksecurefunc(frame.BrowseOrders, "SetupTable", function()
SkinHeaders(frame.BrowseOrders.RecipeList)
end)
hooksecurefunc(frame.BrowseOrders, "StartSearch", SkinListIcon)
local form = frame.Form
form.RecipeHeader:Hide()
form.RecipeHeader:CreateBackdrop("Overlay")
form.RecipeHeader:GetParent().backdrop:SetAllPoints(form.RecipeHeader)
form.LeftPanelBackground:StripTextures()
form.RightPanelBackground:StripTextures()
T.SkinCheckBox(form.TrackRecipeCheckBox.Checkbox, 20)
if form.AllocateBestQualityCheckBox then
T.SkinCheckBox(form.AllocateBestQualityCheckBox)
end
T.SkinDropDownBox(form.OrderRecipientDropDown)
form.OrderRecipientDropDown:SetPoint("TOPRIGHT", form, "TOPRIGHT", -3, -10)
T.SkinEditBox(form.OrderRecipientTarget)
form.OrderRecipientTarget.backdrop:SetPoint("TOPLEFT", -3, -2)
form.OrderRecipientTarget.backdrop:SetPoint("BOTTOMRIGHT", -2, 2)
T.SkinDropDownBox(form.MinimumQuality.DropDown)
local OutputIcon = form.OutputIcon
OutputIcon.Icon:SkinIcon()
T.SkinIconBorder(OutputIcon.IconBorder, OutputIcon.Icon:GetParent().backdrop)
OutputIcon:GetHighlightTexture():Hide()
OutputIcon.CircleMask:Hide()
local qualityDialog = form.QualityDialog
qualityDialog:StripTextures()
qualityDialog:SetTemplate("Transparent")
T.SkinCloseButton(qualityDialog.ClosePanelButton)
qualityDialog.AcceptButton:SkinButton()
qualityDialog.CancelButton:SkinButton()
local function ReskinQualityContainer(container)
local button = container.Button
button:StripTextures()
button:SetNormalTexture(0)
button:SetPushedTexture(0)
button:GetHighlightTexture():Hide()
button.Icon:SkinIcon()
T.SkinIconBorder(button.IconBorder, button.Icon:GetParent().backdrop)
local box = container.EditBox
box:DisableDrawLayer("BACKGROUND")
T.SkinEditBox(box, nil, 18)
T.SkinNextPrevButton(box.DecrementButton, true)
T.SkinNextPrevButton(box.IncrementButton)
box.DecrementButton:SetSize(22, 22)
box.IncrementButton:SetSize(22, 22)
box.IncrementButton:SetPoint("LEFT", box, "RIGHT", 6, 0)
end
ReskinQualityContainer(qualityDialog.Container1)
ReskinQualityContainer(qualityDialog.Container2)
ReskinQualityContainer(qualityDialog.Container3)
hooksecurefunc(form, "Init", function(self)
for slot in self.reagentSlotPool:EnumerateActive() do
local button = slot.Button
if button and not button.styled then
button.Icon:SkinIcon()
button:SetNormalTexture(0)
button:SetPushedTexture(0)
button:GetHighlightTexture():Hide()
T.SkinIconBorder(button.IconBorder, button.Icon:GetParent().backdrop)
button.HighlightTexture:SetColorTexture(1, 0.8, 0, 0.4)
button.HighlightTexture:SetAllPoints(button)
if button.SlotBackground then
button.SlotBackground:Hide()
end
T.SkinCheckBox(slot.Checkbox)
button.styled = true
end
end
end)
local payment = form.PaymentContainer
payment.NoteEditBox:StripTextures()
payment.NoteEditBox:CreateBackdrop("Overlay")
payment.NoteEditBox.backdrop:SetPoint("TOPLEFT", 15, 5)
payment.NoteEditBox.backdrop:SetPoint("BOTTOMRIGHT", -18, 0)
local function SkinMoneyBox(frame)
frame:DisableDrawLayer("BACKGROUND")
frame:CreateBackdrop("Overlay")
frame.backdrop:SetPoint("TOPLEFT", 6, -2)
frame.backdrop:SetPoint("BOTTOMRIGHT", -4, 6)
end
SkinMoneyBox(payment.TipMoneyInputFrame.GoldBox)
SkinMoneyBox(payment.TipMoneyInputFrame.SilverBox)
local viewButton = payment.ViewListingsButton
viewButton:SetAlpha(0)
local buttonFrame = CreateFrame("Frame", nil, payment)
buttonFrame:SetInside(viewButton)
local tex = buttonFrame:CreateTexture(nil, "ARTWORK")
tex:SetAllPoints()
tex:SetTexture("Interface\\CURSOR\\Crosshair\\Repair")
T.SkinDropDownBox(payment.DurationDropDown)
local currentListings = frame.Form.CurrentListings
currentListings:StripTextures()
currentListings:SetTemplate("Transparent")
SkinHeaders(currentListings.OrderList)
currentListings.OrderList:StripTextures()
currentListings:ClearAllPoints()
currentListings:SetPoint("LEFT", frame, "RIGHT", 5, 0)
local myOrders = frame.MyOrdersPage
myOrders.OrderList:StripTextures()
myOrders.RefreshButton:SkinButton()
myOrders.RefreshButton:SetSize(24, 24)
SkinHeaders(myOrders.OrderList)
end
T.SkinFuncs["Blizzard_ProfessionsCustomerOrders"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/PvE.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- PvE skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local StripAllTextures = {
PVEFrame,
PVEFrameLeftInset,
LFDParentFrame,
LFDParentFrameInset,
RaidFinderFrame,
RaidFinderQueueFrame,
RaidFinderFrameBottomInset,
RaidFinderFrameRoleInset,
LFGDungeonReadyDialog,
LFGDungeonReadyStatus,
LFDQueueFrameCooldownFrame,
RaidFinderQueueFrameCooldownFrame,
RaidFinderQueueFramePartyBackfill,
LFDQueueFramePartyBackfill,
LFDQueueFrame,
LFGListApplicationDialog
}
for i = 1, #StripAllTextures do
StripAllTextures[i]:StripTextures()
end
local KillTextures = {
LFDQueueFrameBackground,
PVEFramePortrait,
LFGDungeonReadyDialogBackground,
RaidFinderQueueFrameBackground,
LFGDungeonReadyDialogBottomArt,
LFGDungeonReadyDialogFiligree,
RaidFinderQueueFrameScrollFrameScrollBackground,
RaidFinderQueueFrameScrollFrameScrollBackgroundTopLeft,
RaidFinderQueueFrameScrollFrameScrollBackgroundBottomRight,
PVEFrame.shadows,
LFGListFrame.EntryCreation.ActivityFinder.Background
}
for i = 1, #KillTextures do
KillTextures[i]:Kill()
end
local buttons = {
LFDQueueFrameFindGroupButton,
RaidFinderFrameFindRaidButton,
LFGDungeonReadyDialogLeaveQueueButton,
LFGDungeonReadyDialogEnterDungeonButton,
RaidFinderQueueFramePartyBackfillBackfillButton,
RaidFinderQueueFramePartyBackfillNoBackfillButton,
LFDQueueFramePartyBackfillBackfillButton,
LFDQueueFramePartyBackfillNoBackfillButton,
LFGInvitePopupAcceptButton,
LFGInvitePopupDeclineButton,
LFGListApplicationDialog.SignUpButton,
LFGListApplicationDialog.CancelButton
}
for i = 1, #buttons do
buttons[i]:SkinButton()
end
local checkButtons = {
LFDQueueFrameRoleButtonTank,
LFDQueueFrameRoleButtonHealer,
LFDQueueFrameRoleButtonDPS,
LFDQueueFrameRoleButtonLeader,
RaidFinderQueueFrameRoleButtonTank,
RaidFinderQueueFrameRoleButtonHealer,
RaidFinderQueueFrameRoleButtonDPS,
RaidFinderQueueFrameRoleButtonLeader,
LFGListApplicationDialog.TankButton,
LFGListApplicationDialog.HealerButton,
LFGListApplicationDialog.DamagerButton,
LFGInvitePopupRoleButtonTank,
LFGInvitePopupRoleButtonHealer,
LFGInvitePopupRoleButtonDPS,
RolePollPopupRoleButtonTank,
RolePollPopupRoleButtonHealer,
RolePollPopupRoleButtonDPS
}
for _, roleButton in pairs(checkButtons) do
T.SkinCheckBox(roleButton.checkButton or roleButton.CheckButton)
end
hooksecurefunc("SetCheckButtonIsRadio", function(button)
T.SkinCheckBox(button)
end)
local scrollbars = {
-- LFGListApplicationViewerScrollFrameScrollBar,
LFDQueueFrameSpecific.ScrollBar,
LFDQueueFrameRandomScrollFrameScrollBar,
RaidFinderQueueFrameScrollFrameScrollBar,
-- LFGListEntryCreationSearchScrollFrameScrollBar,
}
for i = 1, #scrollbars do
T.SkinScrollBar(scrollbars[i])
end
-- Set texture to hide circle
_G.GroupFinderFrame.groupButton1.icon:SetTexture("Interface\\Icons\\INV_Helmet_08")
_G.GroupFinderFrame.groupButton2.icon:SetTexture("Interface\\LFGFrame\\UI-LFR-PORTRAIT")
_G.GroupFinderFrame.groupButton3.icon:SetTexture("Interface\\Icons\\Achievement_General_StayClassy")
for i = 1, 3 do
local button = GroupFinderFrame["groupButton"..i]
button.ring:Hide()
button:CreateBackdrop("Overlay")
button.backdrop:SetAllPoints()
button:StyleButton()
button.bg:SetTexture("")
button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.icon:SetPoint("LEFT", button, "LEFT", 10, 0)
button.icon:SetDrawLayer("OVERLAY")
button.icon:SetSize(40, 40)
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)
end
hooksecurefunc("GroupFinderFrame_SelectGroupButton", function(index)
local self = GroupFinderFrame
for i = 1, 3 do
local button = self["groupButton"..i]
if i == index then
button.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)
button.backdrop.overlay:SetVertexColor(1, 0.82, 0, 0.3)
button.border.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)
else
button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
button.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)
button.border.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end
end
end)
hooksecurefunc("LFGRewardsFrame_SetItemButton", function(parentFrame, _, index)
local parentName = parentFrame:GetName()
local item = _G[parentName.."Item"..index]
if item and not item.isSkinned then
item.border = CreateFrame("Frame", nil, item)
item.border:CreateBackdrop("Default")
item.border.backdrop:SetPoint("TOPLEFT", item.Icon, "TOPLEFT", -2, 2)
item.border.backdrop:SetPoint("BOTTOMRIGHT", item.Icon, "BOTTOMRIGHT", 2, -2)
item.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
item.Icon:SetDrawLayer("OVERLAY")
item.Icon:SetParent(item.border)
hooksecurefunc(item.IconBorder, "SetVertexColor", function(self, r, g, b)
if r ~= 0.65882 and g ~= 0.65882 and b ~= 0.65882 then
self:GetParent().border.backdrop:SetBackdropBorderColor(r, g, b)
end
self:SetTexture("")
end)
hooksecurefunc(item.IconBorder, "Hide", function(self)
self:GetParent().border.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end)
item.Count:SetDrawLayer("OVERLAY")
item.Count:SetParent(item.border)
item.NameFrame:Hide()
item.shortageBorder:SetTexture(nil)
item.roleIcon1:SetParent(item.border)
item.roleIcon2:SetParent(item.border)
item.isSkinned = true
end
end)
local function SkinMoney(button)
_G[button].border = CreateFrame("Frame", nil, _G[button])
_G[button].border:CreateBackdrop("Default")
_G[button].border.backdrop:SetPoint("TOPLEFT", _G[button.."IconTexture"], "TOPLEFT", -2, 2)
_G[button].border.backdrop:SetPoint("BOTTOMRIGHT", _G[button.."IconTexture"], "BOTTOMRIGHT", 2, -2)
_G[button.."IconTexture"]:SetTexCoord(0.1, 0.9, 0.1, 0.9)
_G[button.."IconTexture"]:SetDrawLayer("OVERLAY")
_G[button.."IconTexture"]:SetParent(_G[button].border)
_G[button.."NameFrame"]:Hide()
_G[button.."Count"]:SetDrawLayer("OVERLAY")
_G[button.."Count"]:SetParent(_G[button].border)
end
SkinMoney("LFDQueueFrameRandomScrollFrameChildFrameMoneyReward")
SkinMoney("RaidFinderQueueFrameScrollFrameChildFrameMoneyReward")
hooksecurefunc("LFGDungeonListButton_SetDungeon", function(button)
if not button.expandOrCollapseButton.isSkinned then
T.SkinCheckBox(button.enableButton)
button.enableButton:SetFrameLevel(button.enableButton:GetFrameLevel() - 2)
button.enableButton.SetCheckedTexture = T.dummy -- Blizzard changes checked texture, prevent it
T.SkinExpandOrCollapse(button.expandOrCollapseButton)
button.expandOrCollapseButton.isSkinned = true
end
end)
for i = 1, 3 do
T.SkinTab(_G["PVEFrameTab"..i])
end
LFGListApplicationDialog:SetTemplate("Transparent")
PVEFrame:CreateBackdrop("Transparent")
PVEFrame.backdrop:SetAllPoints()
LFDQueueFrameNoLFDWhileLFR:CreateBackdrop("Overlay")
LFDQueueFrameNoLFDWhileLFR.backdrop:SetPoint("TOPLEFT", 2, 5)
LFDQueueFrameNoLFDWhileLFR.backdrop:SetPoint("BOTTOMRIGHT", 0, 6)
LFDQueueFrameCooldownFrame:CreateBackdrop("Overlay")
LFDQueueFrameCooldownFrame.backdrop:SetPoint("TOPLEFT", 2, 4)
LFDQueueFrameCooldownFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 6)
LFDQueueFramePartyBackfill:CreateBackdrop("Overlay")
LFDQueueFramePartyBackfill.backdrop:SetPoint("TOPLEFT", 2, 4)
LFDQueueFramePartyBackfill.backdrop:SetPoint("BOTTOMRIGHT", 0, 6)
RaidFinderQueueFrameCooldownFrame:CreateBackdrop("Overlay")
RaidFinderQueueFrameCooldownFrame.backdrop:SetPoint("TOPLEFT", 2, 6)
RaidFinderQueueFrameCooldownFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 8)
RaidFinderQueueFramePartyBackfill:CreateBackdrop("Overlay")
RaidFinderQueueFramePartyBackfill.backdrop:SetPoint("TOPLEFT", 2, 6)
RaidFinderQueueFramePartyBackfill.backdrop:SetPoint("BOTTOMRIGHT", 0, 8)
T.SkinDropDownBox(LFDQueueFrameTypeDropDown, 300)
LFDQueueFrameTypeDropDown.backdrop:SetParent(LFDQueueFrame) -- fixed SetFrameLevel raise to 10000
LFDQueueFrameTypeDropDown:SetPoint("RIGHT", -10, 0)
T.SkinDropDownBox(RaidFinderQueueFrameSelectionDropDown, 300)
RaidFinderQueueFrameSelectionDropDown:SetPoint("RIGHT", -10, 0)
LFGListFrame.SearchPanel.ResultsInset:StripTextures()
LFGListFrame.NothingAvailable:StripTextures()
LFGListFrame.CategorySelection:StripTextures()
LFGListFrame.CategorySelection.FindGroupButton:SkinButton()
LFGListFrame.CategorySelection.StartGroupButton:SkinButton()
LFGListFrame.SearchPanel.BackToGroupButton:SkinButton()
LFGListFrame.SearchPanel.BackButton:SkinButton()
LFGListFrame.SearchPanel.SignUpButton:SkinButton()
LFGListFrame.SearchPanel.ScrollBox.StartGroupButton:SkinButton()
LFGListFrame.SearchPanel.RefreshButton:SkinButton()
LFGListFrame.SearchPanel.RefreshButton:SetSize(24, 24)
LFGListFrame.SearchPanel.RefreshButton.Icon:SetPoint("CENTER")
LFGListFrame.SearchPanel.FilterButton:SkinButton()
LFGListFrame.SearchPanel.FilterButton:SetPoint("LEFT", LFGListFrame.SearchPanel.SearchBox, "RIGHT", 5, 0)
T.SkinScrollBar(LFGListFrame.SearchPanel.ScrollBar)
hooksecurefunc("LFGListApplicationViewer_UpdateApplicant", function(button)
if not button.DeclineButton.isSkinned then
button.DeclineButton:SkinButton()
button.DeclineButton.isSkinned = true
end
if not button.InviteButtonSmall.isSkinned then
button.InviteButtonSmall:SkinButton()
button.InviteButtonSmall.isSkinned = true
end
end)
hooksecurefunc("LFGListSearchEntry_Update", function(button)
if button and not button.isSkinned then
button.CancelButton:SkinButton()
button.isSkinned = true
end
end)
hooksecurefunc("LFGListSearchPanel_UpdateAutoComplete", function(self)
for i = 1, LFGListFrame.SearchPanel.AutoCompleteFrame:GetNumChildren() do
local child = select(i, LFGListFrame.SearchPanel.AutoCompleteFrame:GetChildren())
if child and not child.isSkinned and child:GetObjectType() == "Button" then
child:SkinButton()
child.isSkinned = true
end
end
local text = self.SearchBox:GetText()
local matchingActivities = C_LFGList.GetAvailableActivities(self.categoryID, nil, self.filters, text)
local numResults = math.min(#matchingActivities, MAX_LFG_LIST_SEARCH_AUTOCOMPLETE_ENTRIES)
for i = 2, numResults do
local button = self.AutoCompleteFrame.Results[i]
if button and not button.moved then
button:SetPoint("TOPLEFT", self.AutoCompleteFrame.Results[i-1], "BOTTOMLEFT", 0, -2)
button:SetPoint("TOPRIGHT", self.AutoCompleteFrame.Results[i-1], "BOTTOMRIGHT", 0, -2)
button.moved = true
end
end
self.AutoCompleteFrame:SetHeight(numResults * (self.AutoCompleteFrame.Results[1]:GetHeight() + 3.5) + 8)
end)
LFGListFrame.SearchPanel.AutoCompleteFrame:StripTextures()
LFGListFrame.SearchPanel.AutoCompleteFrame:CreateBackdrop("Transparent")
LFGListFrame.SearchPanel.AutoCompleteFrame.backdrop:SetPoint("TOPLEFT", LFGListFrame.SearchPanel.AutoCompleteFrame, "TOPLEFT", 0, 3)
LFGListFrame.SearchPanel.AutoCompleteFrame.backdrop:SetPoint("BOTTOMRIGHT", LFGListFrame.SearchPanel.AutoCompleteFrame, "BOTTOMRIGHT", 6, 3)
LFGListFrame.SearchPanel.AutoCompleteFrame:SetPoint("TOPLEFT", LFGListFrame.SearchPanel.SearchBox, "BOTTOMLEFT", -2, -8)
LFGListFrame.SearchPanel.AutoCompleteFrame:SetPoint("TOPRIGHT", LFGListFrame.SearchPanel.SearchBox, "BOTTOMRIGHT", -4, -8)
T.SkinEditBox(LFGListFrame.SearchPanel.SearchBox)
T.SkinCloseButton(PVEFrameCloseButton)
T.SkinCloseButton(LFGDungeonReadyStatusCloseButton, nil, "-")
T.SkinCloseButton(LFGDungeonReadyDialogCloseButton, LFGDungeonReadyDialog, "-")
LFDQueueFrameRandomScrollFrameScrollBackground:SetTexture(nil)
LFDQueueFrameRandomScrollFrameScrollBackgroundTopLeft:SetTexture(nil)
LFDQueueFrameRandomScrollFrameScrollBackgroundBottomRight:SetTexture(nil)
LFGInvitePopup:StripTextures()
LFGInvitePopup:SetTemplate("Transparent")
LFGDungeonReadyPopup:SetTemplate("Transparent")
LFGDungeonReadyDialog.SetBackdrop = T.dummy
LFGDungeonReadyDialog.Border:Hide()
LFGDungeonReadyStatus.Border:Hide()
hooksecurefunc("LFGDungeonReadyDialog_UpdateRewards", function()
for i = 1, LFD_MAX_REWARDS do
local reward = LFGDungeonReadyDialogRewardsFrame.Rewards[i]
if not reward.isSkinned then
reward.texture:SetSize(18, 18)
reward.texture:SkinIcon(true)
reward:DisableDrawLayer("OVERLAY")
reward.isSkinned = true
end
end
end)
LFGListFrame.CategorySelection.CategoryButtons[1]:SetNormalFontObject(GameFontNormal)
hooksecurefunc("LFGListCategorySelection_AddButton", function(self, index)
local button = self.CategoryButtons[index]
if button and not button.styled then
button.Cover:Hide()
button:SetTemplate("Overlay")
button:StyleButton()
button.Icon:SetDrawLayer("ARTWORK")
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Icon:SetPoint("TOPLEFT", 2, -2)
button.Icon:SetPoint("BOTTOMRIGHT", -2, 2)
button.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.3)
button.SelectedTexture:SetPoint("TOPLEFT", 2, -2)
button.SelectedTexture:SetPoint("BOTTOMRIGHT", -2, 2)
button.Label:SetFontObject(_G.GameFontNormal)
button.styled = true
end
end)
LFGListFrame.EntryCreation:StripTextures()
LFGListFrame.EntryCreation.Description:StripTextures()
LFGListApplicationDialogDescription:StripTextures()
LFGListInviteDialog:StripTextures()
LFGListInviteDialog:SetTemplate("Transparent")
LFGListInviteDialog.AcknowledgeButton:SkinButton()
LFGListInviteDialog.AcceptButton:SkinButton()
LFGListInviteDialog.DeclineButton:SkinButton()
T.SkinEditBox(LFGListApplicationDialogDescription)
T.SkinEditBox(LFGListFrame.EntryCreation.Name, nil, 17)
T.SkinEditBox(LFGListFrame.EntryCreation.ItemLevel.EditBox, nil, 17)
T.SkinEditBox(LFGListFrame.EntryCreation.VoiceChat.EditBox, nil, 17)
T.SkinEditBox(LFGListFrame.EntryCreation.Description)
T.SkinDropDownBox(LFGListFrame.EntryCreation.GroupDropDown)
T.SkinDropDownBox(LFGListFrame.EntryCreation.ActivityDropDown)
T.SkinCheckBox(LFGListFrame.EntryCreation.VoiceChat.CheckButton)
T.SkinCheckBox(LFGListFrame.EntryCreation.ItemLevel.CheckButton)
T.SkinCheckBox(LFGListFrame.EntryCreation.PrivateGroup.CheckButton)
T.SkinCheckBox(LFGListFrame.EntryCreation.CrossFactionGroup.CheckButton)
LFGListFrame.EntryCreation.ListGroupButton:SkinButton()
LFGListFrame.EntryCreation.CancelButton:SkinButton()
T.SkinDropDownBox(LFGListEntryCreationPlayStyleDropdown)
T.SkinCheckBox(LFGListFrame.EntryCreation.MythicPlusRating.CheckButton)
T.SkinEditBox(LFGListFrame.EntryCreation.MythicPlusRating.EditBox, nil, 17)
T.SkinCheckBox(LFGListFrame.EntryCreation.PvpItemLevel.CheckButton)
T.SkinEditBox(LFGListFrame.EntryCreation.PvpItemLevel.EditBox, nil, 17)
T.SkinCheckBox(LFGListFrame.EntryCreation.PVPRating.CheckButton)
T.SkinEditBox(LFGListFrame.EntryCreation.PVPRating.EditBox, nil, 17)
LFGListFrame.EntryCreation.ActivityFinder.Dialog:StripTextures()
LFGListFrame.EntryCreation.ActivityFinder.Dialog:SetTemplate("Transparent")
LFGListFrame.EntryCreation.ActivityFinder.Dialog.BorderFrame:StripTextures()
LFGListFrame.EntryCreation.ActivityFinder.Dialog.BorderFrame:SetTemplate("Transparent")
T.SkinEditBox(LFGListFrame.EntryCreation.ActivityFinder.Dialog.EntryBox, 276, 17)
LFGListFrame.EntryCreation.ActivityFinder.Dialog.SelectButton:SkinButton()
LFGListFrame.EntryCreation.ActivityFinder.Dialog.CancelButton:SkinButton()
-- ApplicationViewer (Custom Groups)
T.SkinCheckBox(LFGListFrame.ApplicationViewer.AutoAcceptButton)
LFGListFrame.ApplicationViewer.Inset:StripTextures()
LFGListFrame.ApplicationViewer.Inset:SetTemplate("Transparent")
LFGListFrame.ApplicationViewer.NameColumnHeader:SkinButton(true)
LFGListFrame.ApplicationViewer.NameColumnHeader:ClearAllPoints()
LFGListFrame.ApplicationViewer.NameColumnHeader:SetPoint("BOTTOMLEFT", LFGListFrame.ApplicationViewer.Inset, "TOPLEFT", 0, 1)
LFGListFrame.ApplicationViewer.NameColumnHeader.Label:SetFont(C.media.normal_font, 10, "")
LFGListFrame.ApplicationViewer.RoleColumnHeader:SkinButton(true)
LFGListFrame.ApplicationViewer.RoleColumnHeader:ClearAllPoints()
LFGListFrame.ApplicationViewer.RoleColumnHeader:SetPoint("LEFT", LFGListFrame.ApplicationViewer.NameColumnHeader, "RIGHT", 1, 0)
LFGListFrame.ApplicationViewer.RoleColumnHeader.Label:SetFont(C.media.normal_font, 10, "")
LFGListFrame.ApplicationViewer.ItemLevelColumnHeader:SkinButton(true)
LFGListFrame.ApplicationViewer.ItemLevelColumnHeader:ClearAllPoints()
LFGListFrame.ApplicationViewer.ItemLevelColumnHeader:SetPoint("LEFT", LFGListFrame.ApplicationViewer.RoleColumnHeader, "RIGHT", 1, 0)
LFGListFrame.ApplicationViewer.ItemLevelColumnHeader.Label:SetFont(C.media.normal_font, 10, "")
LFGListFrame.ApplicationViewer.RatingColumnHeader:SkinButton(true)
LFGListFrame.ApplicationViewer.RatingColumnHeader:ClearAllPoints()
LFGListFrame.ApplicationViewer.RatingColumnHeader:SetPoint("LEFT", LFGListFrame.ApplicationViewer.ItemLevelColumnHeader, "RIGHT", 1, 0)
LFGListFrame.ApplicationViewer.RatingColumnHeader.Label:SetFont(C.media.normal_font, 10, "")
LFGListFrame.ApplicationViewer.RefreshButton:SkinButton()
LFGListFrame.ApplicationViewer.RefreshButton:SetSize(24,24)
LFGListFrame.ApplicationViewer.RefreshButton:ClearAllPoints()
LFGListFrame.ApplicationViewer.RefreshButton:SetPoint("BOTTOMRIGHT", LFGListFrame.ApplicationViewer.Inset, "TOPRIGHT", 16, 4)
LFGListFrame.ApplicationViewer.BrowseGroupsButton:SkinButton(true)
LFGListFrame.ApplicationViewer.BrowseGroupsButton:ClearAllPoints()
LFGListFrame.ApplicationViewer.BrowseGroupsButton:SetPoint("BOTTOMLEFT", -1, 2)
LFGListFrame.ApplicationViewer.RemoveEntryButton:SkinButton(true)
LFGListFrame.ApplicationViewer.RemoveEntryButton:SetWidth(80)
LFGListFrame.ApplicationViewer.EditButton:SkinButton(true)
LFGListFrame.ApplicationViewer.EditButton:ClearAllPoints()
LFGListFrame.ApplicationViewer.EditButton:SetPoint("BOTTOMRIGHT", -6, 2)
LFGListFrame.ApplicationViewer.EditButton:SetWidth(80)
LFGListFrame.ApplicationViewer.ScrollBar:ClearAllPoints()
LFGListFrame.ApplicationViewer.ScrollBar:SetPoint("TOPLEFT", LFGListFrame.ApplicationViewer.Inset, "TOPRIGHT", 0, -14)
LFGListFrame.ApplicationViewer.ScrollBar:SetPoint("BOTTOMLEFT", LFGListFrame.ApplicationViewer.Inset, "BOTTOMRIGHT", 0, 14)
T.SkinScrollBar(LFGListFrame.ApplicationViewer.ScrollBar)
LFGListFrame.ApplicationViewer.InfoBackground:SkinIcon()
LFGListFrame.ApplicationViewer.InfoBackground:SetPoint("TOPLEFT", 1, -27)
LFGListFrame.ApplicationViewer.InfoBackground:SetSize(324, 90)
if IsAddOnLoaded("PremadeGroupsFilter") then
PremadeGroupsFilterDialog:StripTextures()
PremadeGroupsFilterDialog:CreateBackdrop("Transparent")
PremadeGroupsFilterDialog.backdrop:SetPoint("TOPLEFT", 3, 0)
PremadeGroupsFilterDialog.backdrop:SetPoint("BOTTOMRIGHT", 0, -1)
PremadeGroupsFilterDialog.ResetButton:SkinButton()
PremadeGroupsFilterDialog.RefreshButton:SkinButton()
T.SkinCloseButton(PremadeGroupsFilterDialog.CloseButton)
T.SkinCloseButton(PremadeGroupsFilterDialog.MaxMinButtonFrame.MinimizeButton, nil, "-")
PremadeGroupsFilterDialog.MaxMinButtonFrame.MinimizeButton:SetHitRectInsets(0, 0, 0, 0)
PremadeGroupsFilterDialog.MaxMinButtonFrame.MinimizeButton:ClearAllPoints()
PremadeGroupsFilterDialog.MaxMinButtonFrame.MinimizeButton:SetPoint("TOPRIGHT", PremadeGroupsFilterDialog.CloseButton, "TOPLEFT", -3, 0)
T.SkinCloseButton(PremadeGroupsFilterDialog.MaxMinButtonFrame.MaximizeButton, nil, "+")
PremadeGroupsFilterDialog.MaxMinButtonFrame.MaximizeButton:SetHitRectInsets(0, 0, 0, 0)
PremadeGroupsFilterDialog.MaxMinButtonFrame.MaximizeButton:ClearAllPoints()
PremadeGroupsFilterDialog.MaxMinButtonFrame.MaximizeButton:SetPoint("TOPRIGHT", PremadeGroupsFilterDialog.CloseButton, "TOPLEFT", -3, 0)
T.SkinDropDownBox(PremadeGroupsFilterDialog.Difficulty.DropDown)
T.SkinEditBox(PremadeGroupsFilterDialog.Expression)
PremadeGroupsFilterDialog.Difficulty.DropDown:SetPoint("TOPRIGHT", PremadeGroupsFilterDialog.Difficulty, "TOPRIGHT", 5, 1)
local checkButtons = {
PremadeGroupsFilterDialog.Difficulty.Act,
PremadeGroupsFilterDialog.MPRating.Act,
PremadeGroupsFilterDialog.PVPRating.Act,
PremadeGroupsFilterDialog.Defeated.Act,
PremadeGroupsFilterDialog.Members.Act,
PremadeGroupsFilterDialog.Tanks.Act,
PremadeGroupsFilterDialog.Heals.Act,
PremadeGroupsFilterDialog.Dps.Act
}
for _, button in pairs(checkButtons) do
button:SetSize(27, 27)
T.SkinCheckBox(button)
end
local editBoxes = {
PremadeGroupsFilterDialog.MPRating.Min,
PremadeGroupsFilterDialog.MPRating.Max,
PremadeGroupsFilterDialog.Defeated.Min,
PremadeGroupsFilterDialog.Defeated.Max,
PremadeGroupsFilterDialog.PVPRating.Min,
PremadeGroupsFilterDialog.PVPRating.Max,
PremadeGroupsFilterDialog.Members.Min,
PremadeGroupsFilterDialog.Members.Max,
PremadeGroupsFilterDialog.Tanks.Min,
PremadeGroupsFilterDialog.Tanks.Max,
PremadeGroupsFilterDialog.Heals.Min,
PremadeGroupsFilterDialog.Heals.Max,
PremadeGroupsFilterDialog.Dps.Min,
PremadeGroupsFilterDialog.Dps.Max
}
for _, box in pairs(editBoxes) do
T.SkinEditBox(box, nil, 17)
end
local button = UsePFGButton or UsePGFButton
if button then
T.SkinCheckBox(button)
end
end
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
local function LoadSecondarySkin()
ChallengesFrameInset:StripTextures()
ChallengesFrame:DisableDrawLayer("BACKGROUND")
ChallengesFrame.WeeklyInfo.Child:DisableDrawLayer("BACKGROUND")
hooksecurefunc(ChallengesFrame, "Update", function(self)
for _, frame in ipairs(self.DungeonIcons) do
if not frame.backdrop then
frame:CreateBackdrop("Transparent")
frame.backdrop:SetAllPoints()
frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
frame.Icon:SetInside()
frame.HighestLevel:SetFont(C.media.normal_font, 18, "OUTLINE")
end
end
end)
local function HandleAffixIcons(self)
for _, frame in ipairs(self.Affixes) do
frame.Border:SetTexture(nil)
frame.Portrait:SetTexture(nil)
if frame.info then
frame.Portrait:SetTexture(CHALLENGE_MODE_EXTRA_AFFIX_INFO[frame.info.key].texture)
elseif frame.affixID then
local _, _, filedataid = C_ChallengeMode.GetAffixInfo(frame.affixID)
frame.Portrait:SetTexture(filedataid)
end
frame.Portrait:SetTexCoord(0.1, 0.9, 0.1, 0.9)
if not frame.backdrop then
frame:CreateBackdrop("Default")
frame.backdrop:SetPoint("TOPLEFT", frame.Portrait, "TOPLEFT", -2, 2)
frame.backdrop:SetPoint("BOTTOMRIGHT", frame.Portrait, "BOTTOMRIGHT", 2, -2)
end
end
end
hooksecurefunc(ChallengesFrame.WeeklyInfo, "SetUp", function(self)
local affixes = C_MythicPlus.GetCurrentAffixes()
if affixes then
HandleAffixIcons(self.Child)
end
end)
hooksecurefunc(ChallengesKeystoneFrame, "Reset", function(self)
self:GetRegions():SetAlpha(0)
self.InstructionBackground:SetAlpha(0)
end)
hooksecurefunc(ChallengesKeystoneFrame, "OnKeystoneSlotted", HandleAffixIcons)
T.SkinCloseButton(ChallengesKeystoneFrame.CloseButton)
ChallengesKeystoneFrame.StartButton:SkinButton(true)
ChallengesKeystoneFrame:DisableDrawLayer("BACKGROUND")
ChallengesKeystoneFrame:CreateBackdrop("Transparent")
local NoticeFrame = ChallengesFrame.SeasonChangeNoticeFrame
NoticeFrame:StripTextures()
NoticeFrame:CreateBackdrop("Overlay")
NoticeFrame:SetFrameLevel(5)
NoticeFrame.NewSeason:SetTextColor(1, 0.8, 0)
NoticeFrame.NewSeason:SetShadowOffset(1, -1)
NoticeFrame.SeasonDescription:SetTextColor(1, 1, 1)
NoticeFrame.SeasonDescription:SetShadowOffset(1, -1)
NoticeFrame.SeasonDescription2:SetTextColor(1, 1, 1)
NoticeFrame.SeasonDescription2:SetShadowOffset(1, -1)
NoticeFrame.SeasonDescription2:SetWidth(400)
NoticeFrame.SeasonDescription3:SetTextColor(1, 0.8, 0)
NoticeFrame.SeasonDescription3:SetShadowOffset(1, -1)
NoticeFrame.Affix:StripTextures()
NoticeFrame.Affix.Portrait:SkinIcon()
NoticeFrame.Leave:SkinButton()
end
T.SkinFuncs["Blizzard_ChallengesUI"] = LoadSecondarySkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/PvP.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- PvP 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_PVPUI" then
ConquestTooltip:SetTemplate("Transparent")
end
end)
if C.skins.blizzard_frames ~= true then return end
local function LoadSkin()
-- Set texture to hide circle
PVPQueueFrame.CategoryButton1.Icon:SetTexture("Interface\\Icons\\achievement_bg_winwsg")
PVPQueueFrame.CategoryButton2.Icon:SetTexture("Interface\\Icons\\achievement_bg_killxenemies_generalsroom")
PVPQueueFrame.CategoryButton3.Icon:SetTexture("Interface\\Icons\\Achievement_General_StayClassy")
for i = 1, 3 do
local button = _G["PVPQueueFrameCategoryButton"..i]
button.Ring:Kill()
button:CreateBackdrop("Overlay")
button.backdrop:SetAllPoints()
button:StyleButton()
button.Background:Kill()
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Icon:SetPoint("LEFT", button, "LEFT", 10, 0)
button.Icon:SetDrawLayer("OVERLAY")
button.Icon:SetSize(40, 40)
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)
end
hooksecurefunc("PVPQueueFrame_SelectButton", function(index)
local self = PVPQueueFrame
for i = 1, 3 do
local button = self["CategoryButton"..i]
if i == index then
button.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)
button.backdrop.overlay:SetVertexColor(1, 0.82, 0, 0.3)
button.border.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)
else
button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
button.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)
button.border.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end
end
end)
-- HonorFrame
HonorFrame.Inset:StripTextures()
HonorFrame.BonusFrame:StripTextures()
HonorFrame.BonusFrame.ShadowOverlay:StripTextures()
T.SkinDropDownBox(HonorFrameTypeDropDown, 165)
HonorFrameTypeDropDown:SetPoint("BOTTOMRIGHT", HonorFrame.Inset, "TOPRIGHT", -6, -1)
T.SkinScrollBar(HonorFrame.SpecificScrollBar)
--HonorFrame.SpecificScrollBar:SetPoint("TOPLEFT", HonorFrameSpecificFrame, "TOPRIGHT", 0, -15)
--HonorFrame.SpecificScrollBar:SetPoint("BOTTOMLEFT", HonorFrameSpecificFrame, "BOTTOMRIGHT", 0, 15)
HonorFrameQueueButton:SkinButton(true)
PVPQueueFrame.HonorInset:StripTextures()
PVPQueueFrame.HonorInset.RatedPanel.Label:SetWidth(160)
local RewardFrameSeason = PVPQueueFrame.HonorInset.RatedPanel.SeasonRewardFrame
RewardFrameSeason.Ring:Hide()
RewardFrameSeason.CircleMask:Hide()
RewardFrameSeason.Icon:SkinIcon()
for _, i in pairs({"RandomBGButton", "RandomEpicBGButton", "Arena1Button", "BrawlButton", "BrawlButton2"}) do
local button = HonorFrame.BonusFrame[i]
button:StripTextures()
button:SetTemplate("Overlay")
button:StyleButton()
button.SelectedTexture:SetDrawLayer("ARTWORK")
button.SelectedTexture:ClearAllPoints()
button.SelectedTexture:SetAllPoints()
button.SelectedTexture:SetPoint("TOPLEFT", 2, -2)
button.SelectedTexture:SetPoint("BOTTOMRIGHT", -2, 2)
button.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.3)
local reward = button.Reward
reward:StripTextures()
reward:SetTemplate("Default")
reward:SetSize(40, 40)
reward:SetPoint("RIGHT", button, "RIGHT", -8, 0)
reward.CircleMask:Hide()
reward.Icon:SetAllPoints()
reward.Icon:SetPoint("TOPLEFT", 2, -2)
reward.Icon:SetPoint("BOTTOMRIGHT", -2, 2)
reward.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
reward.EnlistmentBonus:StripTextures()
reward.EnlistmentBonus:SetTemplate("Default")
reward.EnlistmentBonus:SetSize(20, 20)
reward.EnlistmentBonus:SetPoint("TOPRIGHT", 2, 2)
local EnlistmentBonusIcon = reward.EnlistmentBonus:CreateTexture()
EnlistmentBonusIcon:SetPoint("TOPLEFT", reward.EnlistmentBonus, "TOPLEFT", 2, -2)
EnlistmentBonusIcon:SetPoint("BOTTOMRIGHT", reward.EnlistmentBonus, "BOTTOMRIGHT", -2, 2)
EnlistmentBonusIcon:SetTexture("Interface\\Icons\\achievement_guildperk_honorablemention_rank2")
EnlistmentBonusIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
hooksecurefunc("PVPUIFrame_ConfigureRewardFrame", function(rewardFrame, _, _, itemRewards, currencyRewards)
local rewardTexture, rewardQuaility, _ = nil, 1
if currencyRewards then
for _, reward in ipairs(currencyRewards) do
local info = C_CurrencyInfo.GetCurrencyInfo(reward.id)
if info and info.quality == ITEMQUALITY_ARTIFACT then
_, rewardTexture, _, rewardQuaility = CurrencyContainerUtil_GetCurrencyContainerInfo(reward.id, reward.quantity, info.name, info.iconFileID, info.quality)
end
end
end
if not rewardTexture and itemRewards then
local reward = itemRewards[1]
if reward then
_, _, rewardQuaility, _, _, _, _, _, _, rewardTexture = GetItemInfo(reward.id)
end
end
if rewardTexture then
local r, g, b = GetItemQualityColor(rewardQuaility)
rewardFrame.Icon:SetTexture(rewardTexture)
--rewardFrame.Icon.backdrop:SetBackdropBorderColor(r, g, b)
end
end)
hooksecurefunc(HonorFrame.SpecificScrollBox, "Update", function (self)
for i = 1, self.ScrollTarget:GetNumChildren() do
local button = select(i, self.ScrollTarget:GetChildren())
if not button.IsSkinned then
button:SetSize(368, 38)
button:StripTextures()
button:CreateBackdrop("Overlay")
button.backdrop:SetPoint("TOPLEFT", 0, 0)
button.backdrop:SetPoint("BOTTOMRIGHT", 0, 2)
button:StyleButton(nil, nil, true)
button.SelectedTexture:SetDrawLayer("ARTWORK")
button.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.3)
button.SelectedTexture:SetInside(button.backdrop)
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Icon:SetPoint("TOPLEFT", 5, -3)
button.IsSkinned = true
end
end
end)
local checkButtons = {
HonorFrame.TankIcon,
HonorFrame.HealerIcon,
HonorFrame.DPSIcon,
ConquestFrame.TankIcon,
ConquestFrame.HealerIcon,
ConquestFrame.DPSIcon
}
for i = 1, #checkButtons do
local button = checkButtons[i].checkButton
button:SetSize(22, 22)
T.SkinCheckBox(button)
end
for _, bar in pairs({HonorFrame.ConquestBar, ConquestFrame.ConquestBar}) do
bar:StripTextures()
bar:CreateBackdrop("Overlay")
bar:SetStatusBarTexture(C.media.texture)
bar:SetFrameLevel(bar:GetFrameLevel() + 2)
bar.Reward:ClearAllPoints()
bar.Reward:SetPoint("LEFT", bar, "RIGHT", -1, 0)
bar.Reward.Ring:Hide()
bar.Reward.CircleMask:Hide()
bar.Reward:StripTextures()
bar.Reward.Icon:SkinIcon()
bar.Reward.Icon:SetSize(20, 20)
local faction = UnitFactionGroup("player") == "Horde" and [[Interface\Icons\UI_Horde_HonorboundMedal]] or [[Interface\Icons\UI_Alliance_7LegionMedal]]
hooksecurefunc(bar.Reward, "SetTexture", function(self, texture)
if not texture then
self.Icon:SetTexture(faction)
end
end)
bar:SetStatusBarColor(unpack(UnitFactionGroup("player") == "Horde" and {0.8, 0.2, 0.2} or {0.2, 0.2, 0.8}))
end
-- ConquestFrame
ConquestFrame:StripTextures()
ConquestFrame.Inset:StripTextures()
ConquestFrame.ShadowOverlay:StripTextures()
for _, button in pairs({ConquestFrame.RatedSoloShuffle, ConquestFrame.Arena2v2, ConquestFrame.Arena3v3, ConquestFrame.RatedBG}) do
button:StripTextures()
button:SetTemplate("Overlay")
button:StyleButton()
button.SelectedTexture:SetDrawLayer("ARTWORK")
button.SelectedTexture:ClearAllPoints()
button.SelectedTexture:SetAllPoints()
button.SelectedTexture:SetPoint("TOPLEFT", 2, -2)
button.SelectedTexture:SetPoint("BOTTOMRIGHT", -2, 2)
button.SelectedTexture:SetColorTexture(1, 0.82, 0, 0.3)
button.Reward:StripTextures()
button.Reward:SetTemplate("Default")
button.Reward:SetSize(40, 40)
button.Reward:SetPoint("RIGHT", button, "RIGHT", -7, -1)
button.Reward.CircleMask:Hide()
button.Reward.Icon:SetAllPoints()
button.Reward.Icon:SetPoint("TOPLEFT", 2, -2)
button.Reward.Icon:SetPoint("BOTTOMRIGHT", -2, 2)
button.Reward.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
ConquestFrame.Arena3v3:SetPoint("TOP", ConquestFrame.Arena2v2, "BOTTOM", 0, -3)
ConquestJoinButton:SkinButton(true)
local NewSeasonPopup = PVPQueueFrame.NewSeasonPopup
NewSeasonPopup:StripTextures()
NewSeasonPopup:CreateBackdrop("Overlay")
NewSeasonPopup.backdrop:SetPoint("TOPLEFT", 10, -10)
NewSeasonPopup.backdrop:SetPoint("BOTTOMRIGHT", -10, 10)
NewSeasonPopup:SetFrameLevel(5)
NewSeasonPopup.NewSeason:SetTextColor(1, 0.8, 0)
NewSeasonPopup.NewSeason:SetShadowOffset(1, -1)
NewSeasonPopup.SeasonDescriptionHeader:SetTextColor(1, 1, 1)
NewSeasonPopup.SeasonDescriptionHeader:SetShadowOffset(1, -1)
NewSeasonPopup:HookScript("OnShow", function(self)
for _, text in pairs(self.SeasonDescriptions) do
text:SetTextColor(1, 1, 1)
text:SetShadowOffset(1, -1)
end
end)
NewSeasonPopup.SeasonRewardText:SetTextColor(1, 0.8, 0)
NewSeasonPopup.SeasonRewardText:SetShadowOffset(1, -1)
local RewardFrame = NewSeasonPopup.SeasonRewardFrame
RewardFrame.Ring:Hide()
RewardFrame.CircleMask:Hide()
RewardFrame.Icon:SkinIcon()
NewSeasonPopup.Leave:SkinButton()
end
T.SkinFuncs["Blizzard_PVPUI"] = LoadSkin
local function LoadSecondarySkin()
-- PvP Ready Dialog
PVPReadyDialog:StripTextures()
PVPReadyDialog:SetTemplate("Transparent")
PVPReadyDialogBackground:SetAlpha(0)
PVPReadyDialogEnterBattleButton:SkinButton()
PVPReadyDialogLeaveQueueButton:SkinButton()
T.SkinCloseButton(PVPReadyDialogCloseButton, PVPReadyDialog, "-")
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSecondarySkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/PvPMatch.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- PVPMatch skin
----------------------------------------------------------------------------------------
local function LoadSkin()
-- Macro to show the PVPMatchScoreboard: /run PVPMatchScoreboard:Show()
local PVPMatchScoreboard = _G.PVPMatchScoreboard
PVPMatchScoreboard:StripTextures()
PVPMatchScoreboard:DisableDrawLayer("BORDER")
PVPMatchScoreboard:CreateBackdrop("Transparent")
PVPMatchScoreboard.Content:StripTextures()
T.SkinScrollBar(PVPMatchScoreboard.Content.ScrollBar)
T.SkinCloseButton(PVPMatchScoreboard.CloseButton)
for i = 1, 3 do
T.SkinTab(_G.PVPMatchScoreboard.Content.TabContainer.TabGroup["Tab"..i])
end
-- Macro to show the PVPMatchResults: /run PVPMatchResults:Show()
local PVPMatchResults = _G.PVPMatchResults
PVPMatchResults:StripTextures()
PVPMatchResults:DisableDrawLayer("BORDER")
PVPMatchResults:CreateBackdrop("Transparent")
PVPMatchResults.content:StripTextures()
PVPMatchResults.content.tabContainer:StripTextures()
T.SkinScrollBar(PVPMatchResults.content.scrollBar)
T.SkinCloseButton(PVPMatchResults.CloseButton)
PVPMatchResults.buttonContainer.leaveButton:SkinButton()
PVPMatchResults.buttonContainer.requeueButton:SkinButton()
for i = 1, 3 do
T.SkinTab(_G.PVPMatchResults.content.tabContainer.tabGroup["tab"..i])
end
local honor = PVPMatchResults.content.earningsContainer.progressContainer.honor.button
honor.CircleMask:Hide()
honor.Ring:Hide()
honor.Icon:SkinIcon()
PVPMatchResults.content.earningsContainer.progressContainer.honor:SetScale(1)
local conquest = PVPMatchResults.content.earningsContainer.progressContainer.conquest.button
conquest.CircleMask:Hide()
conquest.Ring:Hide()
conquest.Icon:SkinIcon()
PVPMatchResults.content.earningsContainer.progressContainer.conquest:SetScale(1)
hooksecurefunc(PVPMatchResults, "AddItemReward", function()
for itemFrame in PVPMatchResults.itemPool:EnumerateActive() do
itemFrame.IconBorder:Hide()
itemFrame.IconBorderDropShadow:SetAlpha(0)
itemFrame:SetScale(1)
if not itemFrame.backdrop then
itemFrame.Icon:SkinIcon()
end
local atlas = itemFrame.IconBorder:GetAtlas()
local r, g, b = unpack(C.media.border_color)
if atlas:find("green") then
r, g, b = GetItemQualityColor(2)
elseif atlas:find("blue") then
r, g, b = GetItemQualityColor(3)
elseif atlas:find("purple") then
r, g, b = GetItemQualityColor(4)
end
itemFrame.backdrop:SetBackdropBorderColor(r, g, b)
end
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Quest.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Quest skin
----------------------------------------------------------------------------------------
local function LoadSkin()
QuestFrame:StripTextures(true)
QuestFrameInset:StripTextures(true)
QuestFrameDetailPanel:StripTextures(true)
QuestDetailScrollFrame:StripTextures(true)
QuestDetailScrollChildFrame:StripTextures(true)
QuestRewardScrollFrame:StripTextures(true)
QuestRewardScrollChildFrame:StripTextures(true)
QuestProgressScrollFrame:StripTextures(true)
QuestGreetingScrollFrame:StripTextures(true)
QuestFrameProgressPanel:StripTextures(true)
QuestFrameRewardPanel:StripTextures(true)
QuestFramePortrait:SetAlpha(0)
QuestFrameProgressPanelMaterialTopLeft:SetAlpha(0)
QuestFrameProgressPanelMaterialTopRight:SetAlpha(0)
QuestFrameProgressPanelMaterialBotLeft:SetAlpha(0)
QuestFrameProgressPanelMaterialBotRight:SetAlpha(0)
QuestFrame:CreateBackdrop("Transparent")
QuestFrame.backdrop:SetPoint("TOPLEFT", 0, 0)
QuestFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
QuestFrameAcceptButton:SkinButton(true)
QuestFrameDeclineButton:SkinButton(true)
QuestFrameCompleteButton:SkinButton(true)
QuestFrameGoodbyeButton:SkinButton(true)
QuestFrameCompleteQuestButton:SkinButton(true)
T.SkinCloseButton(QuestFrameCloseButton, QuestFrame.backdrop)
T.SkinScrollBar(QuestDetailScrollFrameScrollBar)
T.SkinScrollBar(QuestProgressScrollFrameScrollBar)
T.SkinScrollBar(QuestRewardScrollFrameScrollBar)
T.SkinScrollBar(QuestGreetingScrollFrameScrollBar)
T.SkinScrollBar(QuestNPCModelTextScrollFrameScrollBar)
for i = 1, 6 do
local button = _G["QuestProgressItem"..i]
local texture = _G["QuestProgressItem"..i.."IconTexture"]
if button.NameFrame then button.NameFrame:Hide() end
button.Name:SetFont(C.media.normal_font, 12, "")
button:CreateBackdrop("Default")
button.backdrop:ClearAllPoints()
button.backdrop:SetPoint("TOPLEFT", texture, -2, 2)
button.backdrop:SetPoint("BOTTOMRIGHT", texture, 2, -2)
texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
hooksecurefunc("QuestFrameProgressItems_Update", function()
QuestProgressTitleText:SetTextColor(1, 0.8, 0)
QuestProgressTitleText:SetShadowColor(0, 0, 0)
QuestProgressText:SetTextColor(1, 1, 1)
QuestProgressRequiredItemsText:SetTextColor(1, 0.8, 0)
QuestProgressRequiredItemsText:SetShadowColor(0, 0, 0)
QuestProgressRequiredMoneyText:SetTextColor(1, 0.8, 0)
end)
-- QuestGreeting
local function UpdateGreetingPanel()
QuestFrameGreetingPanel:StripTextures()
QuestFrameGreetingGoodbyeButton:SkinButton()
GreetingText:SetTextColor(1, 1, 1)
CurrentQuestsText:SetTextColor(1, 0.8, 0)
AvailableQuestsText:SetTextColor(1, 0.8, 0)
QuestGreetingFrameHorizontalBreak:Kill()
for button in QuestFrameGreetingPanel.titleButtonPool:EnumerateActive() do
local text = button:GetFontString():GetText()
if text and strfind(text, "|cff000000") then
button:GetFontString():SetText(gsub(text, "|cff000000", "|cffFFFF00"))
end
end
end
QuestFrameGreetingPanel:HookScript("OnShow", UpdateGreetingPanel)
hooksecurefunc("QuestFrameGreetingPanel_OnShow", UpdateGreetingPanel)
-- QuestLog
QuestLogPopupDetailFrameInset:StripTextures()
QuestLogPopupDetailFrame:StripTextures()
QuestLogPopupDetailFrame:CreateBackdrop("Transparent")
QuestLogPopupDetailFrame.backdrop:SetPoint("TOPLEFT", 0, 0)
QuestLogPopupDetailFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
T.SkinCloseButton(QuestLogPopupDetailFrameCloseButton, QuestLogPopupDetailFrame.backdrop)
QuestLogPopupDetailFrameScrollFrame:StripTextures()
QuestLogPopupDetailFrameScrollFrame:SetPoint("TOPLEFT", 13, -65)
T.SkinScrollBar(QuestLogPopupDetailFrameScrollFrameScrollBar)
QuestLogPopupDetailFrame.ShowMapButton:SkinButton(true)
QuestLogPopupDetailFrame.ShowMapButton.Text:ClearAllPoints()
QuestLogPopupDetailFrame.ShowMapButton.Text:SetPoint("CENTER", T.mult, 0)
QuestLogPopupDetailFrame.ShowMapButton:SetSize(QuestLogPopupDetailFrame.ShowMapButton:GetWidth() - 30, QuestLogPopupDetailFrame.ShowMapButton:GetHeight() - 5)
QuestLogPopupDetailFrame.AbandonButton:SkinButton()
QuestLogPopupDetailFrame.TrackButton:SkinButton()
QuestLogPopupDetailFrame.ShareButton:SkinButton()
QuestLogPopupDetailFrame.ShareButton:ClearAllPoints()
QuestLogPopupDetailFrame.ShareButton:SetPoint("LEFT", QuestLogPopupDetailFrame.AbandonButton, "RIGHT", 3, 0)
QuestLogPopupDetailFrame.ShareButton:SetPoint("RIGHT", QuestLogPopupDetailFrame.TrackButton, "LEFT", -3, 0)
QuestLogPopupDetailFrame.TrackButton:SetWidth(110)
QuestLogPopupDetailFrame.TrackButton:SetPoint("BOTTOMRIGHT", -4, 5)
local function QuestObjectiveText()
if not QuestInfoFrame.questLog then return end
local numVisibleObjectives = 0
local waypointText = C_QuestLog.GetNextWaypointText(C_QuestLog.GetSelectedQuest())
if waypointText then
numVisibleObjectives = numVisibleObjectives + 1
QuestInfoObjectivesFrame.Objectives[numVisibleObjectives]:SetTextColor(0.5, 0.5, 0.5)
end
for i = 1, GetNumQuestLeaderBoards() do
local _, type, finished = GetQuestLogLeaderBoard(i)
if type ~= "spell" and type ~= "log" and numVisibleObjectives < MAX_OBJECTIVES then
numVisibleObjectives = numVisibleObjectives + 1
if finished then
QuestInfoObjectivesFrame.Objectives[numVisibleObjectives]:SetTextColor(1, 1, 1)
else
QuestInfoObjectivesFrame.Objectives[numVisibleObjectives]:SetTextColor(0.5, 0.5, 0.5)
end
QuestInfoObjectivesFrame.Objectives[numVisibleObjectives]:SetShadowOffset(1, -1)
end
end
end
hooksecurefunc("QuestMapFrame_ShowQuestDetails", QuestObjectiveText)
-- Rewards
local function SkinReward(button, mapReward)
if button.NameFrame then button.NameFrame:Hide() end
if button.CircleBackground then button.CircleBackground:Hide() end
if button.CircleBackgroundGlow then button.CircleBackgroundGlow:Hide() end
if button.ValueText then button.ValueText:SetPoint("BOTTOMRIGHT", button.Icon, 0, 0) end
if button.IconBorder then button.IconBorder:SetAlpha(0) end
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button:CreateBackdrop("Default")
button.backdrop:ClearAllPoints()
button.backdrop:SetPoint("TOPLEFT", button.Icon, -2, 2)
button.backdrop:SetPoint("BOTTOMRIGHT", button.Icon, 2, -2)
if mapReward then
button.Icon:SetSize(26, 26)
end
end
local function SkinRewardSpell(button)
local name = button:GetName()
local icon = button.Icon
_G[name.."NameFrame"]:Hide()
_G[name.."SpellBorder"]:Hide()
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button:CreateBackdrop("Default")
button.backdrop:ClearAllPoints()
button.backdrop:SetPoint("TOPLEFT", icon, -2, 2)
button.backdrop:SetPoint("BOTTOMRIGHT", icon, 2, -2)
end
SkinRewardSpell(QuestInfoSpellObjectiveFrame)
for _, name in next, {"HonorFrame", "MoneyFrame", "SkillPointFrame", "XPFrame", "ArtifactXPFrame", "TitleFrame", "WarModeBonusFrame"} do
SkinReward(MapQuestInfoRewardsFrame[name], true)
end
for _, name in next, {"HonorFrame", "SkillPointFrame", "ArtifactXPFrame", "WarModeBonusFrame"} do
SkinReward(QuestInfoRewardsFrame[name])
end
hooksecurefunc("QuestInfo_GetRewardButton", function(rewardsFrame, index)
local button = rewardsFrame.RewardButtons[index]
if not button.backdrop then
SkinReward(button, rewardsFrame == MapQuestInfoRewardsFrame)
hooksecurefunc(button.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
self:SetTexture("")
end)
hooksecurefunc(button.IconBorder, "Hide", function(self)
self:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end)
end
end)
-- QuestInfo
QuestInfoPlayerTitleFrame.FrameLeft:SetTexture()
QuestInfoPlayerTitleFrame.FrameCenter:SetTexture()
QuestInfoPlayerTitleFrame.FrameRight:SetTexture()
QuestInfoPlayerTitleFrame.Icon:SkinIcon()
hooksecurefunc("QuestInfo_Display", function(template, parentFrame)
-- Headers
QuestInfoTitleHeader:SetTextColor(1, 0.8, 0)
QuestInfoTitleHeader:SetShadowColor(0, 0, 0)
QuestInfoDescriptionHeader:SetTextColor(1, 0.8, 0)
QuestInfoDescriptionHeader:SetShadowColor(0, 0, 0)
QuestInfoObjectivesHeader:SetTextColor(1, 0.8, 0)
QuestInfoObjectivesHeader:SetShadowColor(0, 0, 0)
QuestInfoRewardsFrame.Header:SetTextColor(1, 0.8, 0)
QuestInfoRewardsFrame.Header:SetShadowColor(0, 0, 0)
-- Other text
QuestInfoDescriptionText:SetTextColor(1, 1, 1)
QuestInfoDescriptionText:SetShadowOffset(1, -1)
QuestInfoObjectivesText:SetTextColor(1, 1, 1)
QuestInfoObjectivesText:SetShadowOffset(1, -1)
QuestInfoGroupSize:SetTextColor(1, 1, 1)
QuestInfoGroupSize:SetShadowOffset(1, -1)
QuestInfoRewardText:SetTextColor(1, 1, 1)
QuestInfoRewardText:SetShadowOffset(1, -1)
QuestInfoSpellObjectiveLearnLabel:SetTextColor(1, 1, 1)
QuestInfoSpellObjectiveLearnLabel:SetShadowOffset(1, -1)
QuestInfoQuestType:SetTextColor(1, 1, 1)
QuestInfoQuestType:SetShadowOffset(1, -1)
-- Reward frame text
QuestInfoRewardsFrame.ItemChooseText:SetTextColor(1, 1, 1)
QuestInfoRewardsFrame.ItemChooseText:SetShadowOffset(1, -1)
QuestInfoRewardsFrame.ItemReceiveText:SetTextColor(1, 1, 1)
QuestInfoRewardsFrame.ItemReceiveText:SetShadowOffset(1, -1)
QuestInfoRewardsFrame.XPFrame.ReceiveText:SetTextColor(1, 1, 1)
QuestInfoRewardsFrame.XPFrame.ReceiveText:SetShadowOffset(1, -1)
QuestInfoRewardsFrame.PlayerTitleText:SetTextColor(1, 1, 1)
QuestInfoRewardsFrame.PlayerTitleText:SetShadowOffset(1, -1)
QuestObjectiveText()
if template.canHaveSealMaterial then
local questFrame = parentFrame:GetParent():GetParent()
questFrame.SealMaterialBG:Hide()
local text = QuestInfoSealFrame.Text:GetText()
if text and text:find("|cff042c54") then
QuestInfoSealFrame.Text:SetText(string.gsub(text, "|cff042c54", "|cff1C86EE"))
end
end
local rewardsFrame = QuestInfoFrame.rewardsFrame
local isQuestLog = QuestInfoFrame.questLog ~= nil
local isMapQuest = rewardsFrame == MapQuestInfoRewardsFrame
local numSpellRewards = isQuestLog and GetNumQuestLogRewardSpells() or GetNumRewardSpells()
if numSpellRewards > 0 then
-- Spell Headers
for spellHeader in rewardsFrame.spellHeaderPool:EnumerateActive() do
spellHeader:SetVertexColor(1, 1, 1)
end
-- Follower Rewards
for followerReward in rewardsFrame.followerRewardPool:EnumerateActive() do
if not followerReward.isSkinned then
followerReward:CreateBackdrop("Overlay")
followerReward.backdrop:SetAllPoints(followerReward.BG)
followerReward.backdrop:SetPoint("TOPLEFT", 45, -5)
followerReward.backdrop:SetPoint("BOTTOMRIGHT", 2, 5)
followerReward.BG:Hide()
followerReward.isSkinned = true
followerReward.PortraitFrame:SetWidth(followerReward.PortraitFrame:GetHeight())
followerReward.PortraitFrame:ClearAllPoints()
followerReward.PortraitFrame:SetPoint("RIGHT", followerReward.backdrop, "LEFT", -2, 0)
followerReward.PortraitFrame.PortraitRing:Hide()
followerReward.PortraitFrame.PortraitRingQuality:SetTexture()
followerReward.PortraitFrame.LevelBorder:SetAlpha(0)
followerReward.PortraitFrame.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)
local level = followerReward.PortraitFrame.Level
level:ClearAllPoints()
level:SetPoint("BOTTOM", followerReward.PortraitFrame, 0, 5)
level:SetFontObject("SystemFont_Outline_Small")
level:SetShadowOffset(0, 0)
local squareBG = CreateFrame("Frame", nil, followerReward.PortraitFrame)
squareBG:SetFrameLevel(followerReward.PortraitFrame:GetFrameLevel()-1)
squareBG:SetPoint("TOPLEFT", 2, -2)
squareBG:SetPoint("BOTTOMRIGHT", -2, 2)
squareBG:SetTemplate("Default")
followerReward.PortraitFrame.squareBG = squareBG
followerReward.PortraitFrame.Portrait:SetPoint("TOPLEFT", squareBG, 2, -2)
followerReward.PortraitFrame.Portrait:SetPoint("BOTTOMRIGHT", squareBG, -2, 2)
-- AdventuresFollowerPortraitFrame
local portrait = followerReward.AdventuresFollowerPortraitFrame
portrait:SetWidth(portrait:GetHeight() - 2)
portrait:ClearAllPoints()
portrait:SetPoint("RIGHT", followerReward.backdrop, "LEFT", -2, 0)
portrait.CircleMask:Hide()
portrait.PuckBorder:Hide()
portrait.LevelDisplayFrame.LevelCircle:SetAlpha(0)
local level = portrait.LevelDisplayFrame.LevelText
level:ClearAllPoints()
level:SetPoint("BOTTOM", portrait, 0, 5)
level:SetFontObject("SystemFont_Outline_Small")
level:SetShadowOffset(0, 0)
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, 3, 3)
local point, relativeTo, relativePoint, _, yOfs = followerReward:GetPoint()
followerReward:SetPoint(point, relativeTo, relativePoint, 8, yOfs)
end
local r, g, b = followerReward.PortraitFrame.PortraitRingQuality:GetVertexColor()
if r > 0.99 and r < 1 then
r, g, b = unpack(C.media.border_color)
end
followerReward.PortraitFrame.squareBG:SetBackdropBorderColor(r, g, b)
end
-- Spell Rewards
for spellReward in rewardsFrame.spellRewardPool:EnumerateActive() do
if not spellReward.isSkinned then
SkinReward(spellReward)
if not isMapQuest then
local border = select(3, spellReward:GetRegions())
border:Hide()
spellReward.Icon:SetPoint("TOPLEFT", 0, 0)
spellReward:SetHitRectInsets(0, 0, 0, 0)
spellReward:SetSize(147, 41)
end
spellReward.isSkinned = true
end
end
end
-- Reputation Rewards
for repReward in rewardsFrame.reputationRewardPool:EnumerateActive() do
if not repReward.isSkinned then
SkinReward(repReward, isMapQuest)
repReward.isSkinned = true
end
end
end)
hooksecurefunc(QuestInfoRequiredMoneyText, "SetTextColor", function(self, r)
if r == 0 then
self:SetTextColor(1, 0.8, 0)
elseif r == 0.2 then
self:SetTextColor(0.6, 0.6, 0.6)
end
end)
QuestInfoItemHighlight:StripTextures()
QuestInfoItemHighlight:SetTemplate("Default")
QuestInfoItemHighlight:SetBackdropBorderColor(1, 1, 0)
QuestInfoItemHighlight:SetBackdropColor(1, 1, 1, 0.2)
hooksecurefunc("QuestInfoItem_OnClick", function(self)
if self.type == "choice" then
QuestInfoItemHighlight:ClearAllPoints()
QuestInfoItemHighlight:SetPoint("TOPLEFT", self.Icon, "TOPLEFT", -2, 2)
QuestInfoItemHighlight:SetPoint("BOTTOMRIGHT", self.Icon, "BOTTOMRIGHT", 2, -2)
local parent = self:GetParent()
for i = 1, #parent.RewardButtons do
local questItem = QuestInfoRewardsFrame.RewardButtons[i]
if questItem ~= self then
questItem.Name:SetTextColor(1, 1, 1)
else
self.Name:SetTextColor(1, 1, 0)
end
end
end
end)
hooksecurefunc("QuestInfo_Display", function()
for i = 1, #QuestInfoRewardsFrame.RewardButtons do
local questItem = QuestInfoRewardsFrame.RewardButtons[i]
if not questItem:IsShown() then break end
local point, relativeTo, relativePoint, _, y = questItem:GetPoint()
if point and relativeTo and relativePoint then
if i == 1 then
questItem:SetPoint(point, relativeTo, relativePoint, 0, y)
elseif relativePoint == "BOTTOMLEFT" then
questItem:SetPoint(point, relativeTo, relativePoint, 0, -5)
else
questItem:SetPoint(point, relativeTo, relativePoint, 5, 0)
end
end
questItem.Name:SetTextColor(1, 1, 1)
end
end)
-- NPC Model
QuestModelScene:StripTextures()
QuestModelScene:CreateBackdrop("Overlay")
QuestModelScene.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha)
QuestNPCModelNameTooltipFrame:CreateBackdrop("Overlay")
QuestNPCModelNameTooltipFrame.backdrop:SetBackdropColor(C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha)
QuestNPCModelNameTooltipFrame.backdrop:SetPoint("TOPLEFT", QuestModelScene.backdrop, "BOTTOMLEFT", 0, -3)
QuestNPCModelNameTooltipFrame.backdrop:SetPoint("BOTTOMRIGHT", QuestNPCModelTextFrame, "BOTTOMRIGHT", 2, -1)
QuestNPCModelNameText:SetPoint("TOPLEFT", QuestNPCModelNameplate, 15, -20)
QuestNPCModelNameText:SetPoint("BOTTOMRIGHT", QuestNPCModelNameplate, -15, 7)
QuestNPCModelTextFrame:SetHeight(85)
QuestNPCModelTextFrame:StripTextures()
hooksecurefunc("QuestFrame_ShowQuestPortrait", function(parentFrame, _, _, _, _, _, x, y)
if parentFrame == QuestLogPopupDetailFrame or parentFrame == QuestFrame then
x = x + 8
y = y + 40
QuestModelScene.backdrop.overlay:Hide()
QuestNPCModelNameTooltipFrame.backdrop.overlay:Hide()
else
QuestModelScene.backdrop.overlay:Show()
QuestNPCModelNameTooltipFrame.backdrop.overlay:Show()
end
QuestModelScene:ClearAllPoints()
QuestModelScene:SetPoint("TOPLEFT", parentFrame, "TOPRIGHT", x, y)
end)
-- Expand amd Collapse buttons
local function SkinExpandOrCollapse(f)
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, "SetNormalAtlas", function(self, texture)
if self.settingTexture then return end
self.settingTexture = true
self:SetNormalTexture(0)
if texture and texture ~= "" then
if texture:find("Closed") then
self.bg.plus:Show()
elseif texture:find("Open") then
self.bg.plus:Hide()
end
self.bg:Show()
else
self.bg:Hide()
end
self.settingTexture = nil
end)
hooksecurefunc(f, "SetPushedAtlas", function(self)
if self.settingTexture then return end
self.settingTexture = true
self:SetPushedTexture(0)
self.settingTexture = nil
end)
hooksecurefunc(f, "SetHighlightTexture", function(self, texture)
if texture == "Interface\\Buttons\\UI-PlusButton-Hilight" then
self:SetHighlightTexture(0)
end
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
-- Campaign
local campaignColor = {
Bastion = {0.45, 0.4, 0.4, 1},
Maldraxxus = {0.1, 0.3, 0.15, 1},
Ardenweald = {0.15, 0.25, 0.35, 1},
Revendreth = {0.25, 0.1, 0.1, 1},
Kyrian = {0.45, 0.4, 0.4, 1},
Necrolord = {0.1, 0.3, 0.15, 1},
Fey = {0.15, 0.25, 0.35, 1},
Venthyr = {0.25, 0.1, 0.1, 1},
Shadowlands = {0.15, 0.2, 0.4, 1}
}
hooksecurefunc("QuestLogQuests_Update", function()
for i = 1, QuestMapFrame.QuestsFrame.Contents:GetNumChildren() do
local child = select(i, QuestMapFrame.QuestsFrame.Contents:GetChildren())
if child and child.ButtonText and not child.Text then
if not child.isSkinned then
SkinExpandOrCollapse(child)
child.isSkinned = true
end
end
end
for campaignHeader in QuestScrollFrame.campaignHeaderFramePool:EnumerateActive() do
local campaign = campaignHeader:GetCampaign()
if campaign then
if not campaignHeader.backdrop then
campaignHeader:CreateBackdrop("Overlay")
campaignHeader.backdrop:SetPoint("TOPLEFT", campaignHeader.Background, 6, -2)
campaignHeader.backdrop:SetPoint("BOTTOMRIGHT", campaignHeader.Background, -6, 10)
campaignHeader.SelectedHighlight:SetAlpha(0)
campaignHeader.HighlightTexture:SetAlpha(0)
campaignHeader.Background:SetAlpha(0)
campaignHeader.TopFiligree:Hide()
SkinExpandOrCollapse(campaignHeader.CollapseButton)
end
if campaignHeader.backdrop then
if campaignColor[campaign.uiTextureKit] then
campaignHeader.backdrop.overlay:SetVertexColor(unpack(campaignColor[campaign.uiTextureKit]))
else
campaignHeader.backdrop.overlay:SetVertexColor(1, 1, 1, 0.2)
end
end
end
end
for callingHeader in QuestScrollFrame.covenantCallingsHeaderFramePool:EnumerateActive() do
if not callingHeader.backdrop then
callingHeader:CreateBackdrop("Overlay")
callingHeader.backdrop:SetPoint("TOPLEFT", callingHeader.Background, 7, -2)
callingHeader.backdrop:SetPoint("BOTTOMRIGHT", callingHeader.Background, -5, 10)
callingHeader.backdrop.overlay:SetVertexColor(1, 1, 1, 0.2)
callingHeader.Background:SetAlpha(0)
callingHeader.HighlightBackground:SetAlpha(0)
callingHeader.SelectedTexture:SetAlpha(0)
callingHeader.Divider:SetAlpha(0)
end
end
for header in QuestScrollFrame.campaignHeaderMinimalFramePool:EnumerateActive() do
if not header.CollapseButton.styled then
SkinExpandOrCollapse(header.CollapseButton)
header.CollapseButton.styled = true
end
end
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/QuickKeybind.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- QuickKeybind skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = _G.QuickKeybindFrame
T.SkinFrame(frame)
frame.Header:StripTextures()
T.SkinCheckBox(frame.UseCharacterBindingsButton, 26)
frame.OkayButton:SkinButton()
frame.DefaultsButton:SkinButton()
frame.CancelButton:SkinButton()
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Raid.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- RaidUI skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local StripAllTextures = {
"RaidGroup1",
"RaidGroup2",
"RaidGroup3",
"RaidGroup4",
"RaidGroup5",
"RaidGroup6",
"RaidGroup7",
"RaidGroup8"
}
for _, object in pairs(StripAllTextures) do
_G[object]:StripTextures()
end
for i = 1, MAX_RAID_GROUPS * 5 do
_G["RaidGroupButton"..i]:SkinButton(true)
end
for i = 1, 8 do
for j = 1, 5 do
_G["RaidGroup"..i.."Slot"..j]:StripTextures()
_G["RaidGroup"..i.."Slot"..j]:SetTemplate("Transparent")
end
end
end
T.SkinFuncs["Blizzard_RaidUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/RaidInfo.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- RaidInfo skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local StripAllTextures = {
RaidInfoScrollFrame,
RaidInfoFrame,
RaidInfoInstanceLabel,
RaidInfoIDLabel,
RaidInfoFrame.Header
}
local KillTextures = {
RaidInfoScrollFrameScrollBarBG,
RaidInfoScrollFrameScrollBarTop,
RaidInfoScrollFrameScrollBarBottom,
RaidInfoScrollFrameScrollBarMiddle
}
local buttons = {
RaidFrameConvertToRaidButton,
RaidFrameRaidInfoButton,
RaidInfoExtendButton,
RaidInfoCancelButton
}
for _, object in pairs(StripAllTextures) do
object:StripTextures()
end
for _, texture in pairs(KillTextures) do
texture:Kill()
end
for i = 1, #buttons do
local button = buttons[i]
if button then
button:SkinButton()
end
end
RaidInfoFrame:CreateBackdrop("Transparent")
RaidInfoFrame.backdrop:SetPoint("TOPLEFT", RaidInfoFrame, "TOPLEFT")
RaidInfoFrame.backdrop:SetPoint("BOTTOMRIGHT", RaidInfoFrame, "BOTTOMRIGHT")
RaidInfoFrame:SetPoint("TOPLEFT", FriendsFrame, "TOPRIGHT", 3, 0)
T.SkinCloseButton(RaidInfoCloseButton, RaidInfoFrame)
T.SkinCheckBox(RaidFrameAllAssistCheckButton)
T.SkinScrollBar(RaidInfoFrame.ScrollBar)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Runeforge.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Runeforge skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = RuneforgeFrame
T.SkinCloseButton(frame.CloseButton)
frame.CloseButton:SetPoint("TOPRIGHT", -50, 0)
frame.CreateFrame.CraftItemButton:SkinButton()
local powerFrame = frame.CraftingFrame.PowerFrame
powerFrame:StripTextures()
powerFrame:CreateBackdrop("Overlay")
local pageControl = powerFrame.PageControl
T.SkinNextPrevButton(pageControl.BackwardButton)
T.SkinNextPrevButton(pageControl.ForwardButton)
hooksecurefunc(powerFrame.PowerList, "RefreshListDisplay", function(list)
if not list.elements then return end
for i = 1, list:GetNumElementFrames() do
local button = list.elements[i]
if button and not button.IsSkinned then
button.Border:SetAlpha(0)
button.CircleMask:Hide()
button.Icon:SkinIcon()
button.IsSkinned = true
end
end
end)
end
T.SkinFuncs["Blizzard_RuneforgeUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Scrapping.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- ScrappingMachine skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = ScrappingMachineFrame
T.SkinFrame(frame)
frame.ScrapButton:SkinButton()
local ItemSlots = frame.ItemSlots
ItemSlots:StripTextures()
for button in pairs(ItemSlots.scrapButtons.activeObjects) do
if not button.styled then
button:SetHighlightTexture(0)
button.Icon:SkinIcon()
button.IconBorder:SetAlpha(0)
hooksecurefunc(button.IconBorder, "SetVertexColor", function(_, r, g, b) button.backdrop:SetBackdropBorderColor(r, g, b) end)
hooksecurefunc(button.IconBorder, "Hide", function() button.backdrop:SetBackdropBorderColor(unpack(C.media.border_color)) end)
button.styled = true
end
end
end
T.SkinFuncs["Blizzard_ScrappingMachineUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Soulbinds.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Soulbinds skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = SoulbindViewer
T.SkinCloseButton(frame.CloseButton)
frame:StripTextures()
frame:CreateBackdrop("Transparent")
frame.Background:Hide()
frame.CommitConduitsButton:SkinButton()
frame.ActivateSoulbindButton:SkinButton()
local function SkinConduitList(frame)
local header = frame.CategoryButton.Container
if not header.backdrop then
header:DisableDrawLayer("BACKGROUND")
header:CreateBackdrop("Overlay")
header.backdrop:SetPoint("TOPLEFT", 2, 0)
header.backdrop:SetPoint("BOTTOMRIGHT", 15, 0)
end
for button in frame.pool:EnumerateActive() do
if not button.styled then
for _, element in ipairs(button.Hovers) do
local _, sublevel = element:GetDrawLayer()
if sublevel == 4 then -- Highlight texture
element:SetColorTexture(1, 1, 1, 0.3)
element:SetPoint("TOPLEFT", button, "TOPLEFT", 11, 0)
end
end
button.PendingBackground:SetColorTexture(0.9, 0.8, 0.1, 0.3)
button.PendingBackground:SetPoint("TOPLEFT", button, "TOPLEFT", 11, 0)
button.styled = true
end
end
end
local numChildrenStyled = 0
hooksecurefunc(SoulbindViewer.ConduitList.ScrollBox, "Update", function(self)
local numChildren = self.ScrollTarget:GetNumChildren()
if numChildren > numChildrenStyled then
for i = 1, numChildren do
local list = select(i, self.ScrollTarget:GetChildren())
if list and not list.hooked then
hooksecurefunc(list, "Layout", SkinConduitList)
list.hooked = true
end
end
numChildrenStyled = numChildren
end
end)
end
T.SkinFuncs["Blizzard_Soulbinds"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/SpellBook.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- SpellBook skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local StripAllTextures = {
"SpellBookFrame",
"SpellBookFrameInset",
"SpellBookSpellIconsFrame",
"SpellBookSideTabsFrame",
"SpellBookPageNavigationFrame"
}
local KillTextures = {
"SpellBookPage1",
"SpellBookPage2"
}
for _, object in pairs(StripAllTextures) do
_G[object]:StripTextures()
end
for _, texture in pairs(KillTextures) do
_G[texture]:Kill()
end
local pagebackdrop = CreateFrame("Frame", nil, SpellBookPage1:GetParent())
pagebackdrop:SetTemplate("Overlay")
pagebackdrop:SetPoint("TOPLEFT", SpellBookFrame, "TOPLEFT", 50, -50)
pagebackdrop:SetPoint("BOTTOMRIGHT", SpellBookFrame, "BOTTOMRIGHT", -26, 23)
T.SkinNextPrevButton(SpellBookPrevPageButton)
T.SkinNextPrevButton(SpellBookNextPageButton)
SpellBookNextPageButton:SetPoint("BOTTOMRIGHT", pagebackdrop, "BOTTOMRIGHT", -15, 10)
SpellBookPrevPageButton:SetPoint("BOTTOMRIGHT", SpellBookNextPageButton, "BOTTOMLEFT", -6, 0)
SpellBookFramePortrait:SetAlpha(0)
SpellBookFrameTutorialButton.Ring:Hide()
SpellBookFrameTutorialButton:SetPoint("TOPLEFT", SpellBookFrame, "TOPLEFT", -5, 10)
-- Skin SpellButtons
local function SpellButtons()
if _G.SpellBookFrame.bookType == BOOKTYPE_PROFESSION then return end
for i = 1, _G.SPELLS_PER_PAGE do
local button = _G["SpellButton"..i]
button.SpellSubName:SetTextColor(0.6, 0.6, 0.6)
button.RequiredLevelString:SetTextColor(0.6, 0.6, 0.6)
local r = button.SpellName:GetTextColor()
if r < 0.8 then
button.SpellName:SetTextColor(0.6, 0.6, 0.6)
elseif r ~= 1 then
button.SpellName:SetTextColor(1, 1, 1)
end
end
end
for i = 1, SPELLS_PER_PAGE do
local button = _G["SpellButton"..i]
local icon = _G["SpellButton"..i.."IconTexture"]
local highlight = _G["SpellButton"..i.."Highlight"]
_G["SpellButton"..i.."SlotFrame"]:SetAlpha(0)
button.EmptySlot:SetAlpha(0)
button.TextBackground:Hide()
button.TextBackground2:Hide()
button.UnlearnedFrame:SetAlpha(0)
button:SetCheckedTexture(0)
button:SetPushedTexture(0)
if highlight then
highlight:ClearAllPoints()
highlight:SetAllPoints(icon)
hooksecurefunc(highlight, "SetTexture", function(button, texture)
if texture == [[Interface\Buttons\ButtonHilight-Square]] then
button:SetColorTexture(1, 1, 1, 0.3)
end
end)
end
if icon then
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon:ClearAllPoints()
icon:SetAllPoints()
if not button.backdrop then
button:SetFrameLevel(button:GetFrameLevel() + 1)
button:CreateBackdrop("Default")
end
end
hooksecurefunc(button, "UpdateButton", SpellButtons)
end
SpellBookPageText:SetTextColor(0.6, 0.6, 0.6)
-- Skill Line Tabs
for i = 1, MAX_SKILLLINE_TABS do
local tab = _G["SpellBookSkillLineTab"..i]
_G["SpellBookSkillLineTab"..i.."Flash"]:Kill()
if tab then
tab:StripTextures()
tab:GetNormalTexture():ClearAllPoints()
tab:GetNormalTexture():SetPoint("TOPLEFT", 2, -2)
tab:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2)
tab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)
tab:SetTemplate("Default")
tab:StyleButton(true)
local point, relatedTo, point2 = tab:GetPoint()
tab:SetPoint(point, relatedTo, point2, 16, -1)
end
end
hooksecurefunc("SpellBookFrame_UpdateSkillLineTabs", function()
for i = 1, MAX_SKILLLINE_TABS do
local tab = _G["SpellBookSkillLineTab"..i]
if tab:GetNormalTexture() then
tab:GetNormalTexture():ClearAllPoints()
tab:GetNormalTexture():SetPoint("TOPLEFT", 2, -2)
tab:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2)
tab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
end
end)
SpellBookFrame:CreateBackdrop("Transparent")
SpellBookFrame.backdrop:SetPoint("TOPLEFT", 5, -1)
SpellBookFrame.backdrop:SetPoint("BOTTOMRIGHT", 15, -1)
T.SkinCloseButton(SpellBookFrameCloseButton, SpellBookFrame.backdrop)
-- Profession Tab
local professionbuttons = {
"PrimaryProfession1SpellButtonTop",
"PrimaryProfession1SpellButtonBottom",
"PrimaryProfession2SpellButtonTop",
"PrimaryProfession2SpellButtonBottom",
"SecondaryProfession1SpellButtonLeft",
"SecondaryProfession1SpellButtonRight",
"SecondaryProfession2SpellButtonLeft",
"SecondaryProfession2SpellButtonRight",
"SecondaryProfession3SpellButtonLeft",
"SecondaryProfession3SpellButtonRight"
}
local professionheaders = {
"PrimaryProfession1",
"PrimaryProfession2",
"SecondaryProfession1",
"SecondaryProfession2",
"SecondaryProfession3"
}
for _, header in pairs(professionheaders) do
_G[header.."Missing"]:SetTextColor(1, 0.8, 0)
_G[header.."Missing"]:SetShadowColor(0, 0, 0)
_G[header.."Missing"]:SetShadowOffset(1, -1)
_G[header].missingText:SetTextColor(0.6, 0.6, 0.6)
end
for _, button in pairs(professionbuttons) do
local icon = _G[button.."IconTexture"]
local rank = _G[button.."SubSpellName"]
local button = _G[button]
button:StripTextures()
if rank then
rank:SetTextColor(1, 1, 1)
end
button:GetCheckedTexture():SetColorTexture(0, 1, 0, 0.3)
button:GetCheckedTexture():SetPoint("TOPLEFT", button, 4, -4)
button:GetCheckedTexture():SetPoint("BOTTOMRIGHT", button, -4, 4)
button.cooldown:SetPoint("TOPLEFT", button, 4, -4)
button.cooldown:SetPoint("BOTTOMRIGHT", button, -4, 4)
if icon then
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon:ClearAllPoints()
icon:SetPoint("TOPLEFT", 4, -4)
icon:SetPoint("BOTTOMRIGHT", -4, 4)
if not button.backdrop then
button:SetFrameLevel(button:GetFrameLevel() + 2)
button:CreateBackdrop("Default")
button.backdrop:SetPoint("TOPLEFT", 2, -2)
button.backdrop:SetPoint("BOTTOMRIGHT", -2, 2)
end
end
end
hooksecurefunc("UpdateProfessionButton", function()
for _, button in pairs(professionbuttons) do
local button = _G[button]
button:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3)
button:GetHighlightTexture():SetPoint("TOPLEFT", button, 4, -4)
button:GetHighlightTexture():SetPoint("BOTTOMRIGHT", button, -4, 4)
end
end)
local professionstatusbars = {
"PrimaryProfession1StatusBar",
"PrimaryProfession2StatusBar",
"SecondaryProfession1StatusBar",
"SecondaryProfession2StatusBar",
"SecondaryProfession3StatusBar"
}
for _, statusbar in pairs(professionstatusbars) do
local statusbar = _G[statusbar]
statusbar:StripTextures()
statusbar:SetStatusBarTexture(C.media.texture)
statusbar:SetStatusBarColor(0, 0.8, 0)
statusbar:CreateBackdrop("Overlay")
statusbar.rankText:ClearAllPoints()
statusbar.rankText:SetPoint("CENTER")
end
-- Bottom Tabs
for i = 1, 5 do
T.SkinTab(_G["SpellBookFrameTabButton"..i])
end
_G["SpellBookFrameTabButton1"]:ClearAllPoints()
_G["SpellBookFrameTabButton1"]:SetPoint("TOPLEFT", _G["SpellBookFrame"], "BOTTOMLEFT", 5, 1)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Subscription.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- SubscriptionInterstitialUI skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = SubscriptionInterstitialFrame
T.SkinCloseButton(frame.CloseButton)
frame:StripTextures()
frame:SetTemplate("Transparent")
frame.ShadowOverlay:Hide()
frame.ClosePanelButton:SkinButton()
if IsWetxius then
SubscriptionInterstitialFrame:Kill()
end
end
T.SkinFuncs["Blizzard_SubscriptionInterstitialUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Tabard.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Tabard skin
----------------------------------------------------------------------------------------
local function LoadSkin()
TabardFrame:StripTextures()
TabardFrame:CreateBackdrop("Transparent")
TabardFrame.backdrop:SetPoint("TOPLEFT", 0, 0)
TabardFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
TabardFrameInset:StripTextures()
TabardFramePortrait:Kill()
TabardModel:CreateBackdrop("Overlay")
TabardModel.backdrop:SetPoint("TOPLEFT", 2, 0)
TabardModel.backdrop:SetPoint("BOTTOMRIGHT", 2, -4)
T.SkinCloseButton(TabardFrameCloseButton, TabardFrame.backdrop)
TabardFrameCancelButton:SkinButton()
TabardFrameAcceptButton:SkinButton()
TabardFrameAcceptButton:ClearAllPoints()
TabardFrameAcceptButton:SetPoint("RIGHT", TabardFrameCancelButton, "LEFT", -3, 0)
T.SkinRotateButton(TabardCharacterModelRotateLeftButton)
T.SkinRotateButton(TabardCharacterModelRotateRightButton)
TabardCharacterModelRotateLeftButton:ClearAllPoints()
TabardCharacterModelRotateLeftButton:SetPoint("BOTTOMLEFT", TabardModel.backdrop, "BOTTOMLEFT", 4, 4)
TabardCharacterModelRotateRightButton:ClearAllPoints()
TabardCharacterModelRotateRightButton:SetPoint("LEFT", TabardCharacterModelRotateLeftButton, "RIGHT", 3, 0)
TabardFrameMoneyBg:StripTextures()
TabardFrameMoneyInset:StripTextures()
TabardFrameCostFrame:StripTextures()
TabardFrameCustomizationFrame:StripTextures()
for i = 1, 5 do
local custom = "TabardFrameCustomization"..i
_G[custom]:StripTextures()
T.SkinNextPrevButton(_G[custom.."LeftButton"])
T.SkinNextPrevButton(_G[custom.."RightButton"])
if i > 1 then
_G[custom]:ClearAllPoints()
_G[custom]:SetPoint("TOP", _G["TabardFrameCustomization"..i-1], "BOTTOM", 0, -6)
else
local point, anchor, point2, x, y = _G[custom]:GetPoint()
_G[custom]:SetPoint(point, anchor, point2, x, y + 4)
end
end
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Talent.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- TalentUI skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = ClassTalentFrame
T.SkinFrame(frame)
ClassTalentFrame.TalentsTab.BlackBG:SetAlpha(0)
ClassTalentFrame.TalentsTab.BottomBar:SetAlpha(0)
ClassTalentFrame.TalentsTab.ApplyButton:SkinButton(true)
T.SkinDropDownBox(ClassTalentFrame.TalentsTab.LoadoutDropDown.DropDownControl.DropDownMenu, 190)
T.SkinEditBox(ClassTalentFrame.TalentsTab.SearchBox)
ClassTalentFrame.TalentsTab.SearchBox.backdrop:SetPoint("TOPLEFT", -4, -4)
ClassTalentFrame.TalentsTab.SearchBox.backdrop:SetPoint("BOTTOMRIGHT", 0, 5)
ClassTalentFrame.TalentsTab.SearchPreviewContainer:StripTextures()
ClassTalentFrame.TalentsTab.SearchPreviewContainer:CreateBackdrop("Transparent")
if T.newPatch then
ClassTalentFrame.TalentsTab.InspectCopyButton:SkinButton()
end
for _, tab in next, {ClassTalentFrame.TabSystem:GetChildren()} do
T.SkinTab(tab)
end
-- Profiles
local function SkinTalentFrameDialog(dialog)
if not dialog then return end
dialog:StripTextures()
dialog:CreateBackdrop("Transparent")
if dialog.AcceptButton then dialog.AcceptButton:SkinButton() end
if dialog.CancelButton then dialog.CancelButton:SkinButton() end
if dialog.DeleteButton then dialog.DeleteButton:SkinButton() end
T.SkinEditBox(dialog.NameControl.EditBox)
dialog.NameControl.EditBox.backdrop:SetPoint("TOPLEFT", -5, -10)
dialog.NameControl.EditBox.backdrop:SetPoint("BOTTOMRIGHT", 5, 10)
end
local ImportDialog = _G.ClassTalentLoadoutImportDialog
if ImportDialog then
SkinTalentFrameDialog(ImportDialog)
ImportDialog.ImportControl.InputContainer:StripTextures()
ImportDialog.ImportControl.InputContainer:CreateBackdrop("Transparent")
end
local CreateDialog = _G.ClassTalentLoadoutCreateDialog
if CreateDialog then
SkinTalentFrameDialog(CreateDialog)
end
local EditDialog = _G.ClassTalentLoadoutEditDialog
if EditDialog then
SkinTalentFrameDialog(EditDialog)
local editbox = EditDialog.LoadoutName
if editbox then
T.SkinEditBox(editbox)
editbox.backdrop:SetPoint("TOPLEFT", -5, -5)
editbox.backdrop:SetPoint("BOTTOMRIGHT", 5, 5)
end
local check = EditDialog.UsesSharedActionBars
if check then
T.SkinCheckBox(check.CheckButton)
end
end
-- Spec tab
ClassTalentFrame.SpecTab:CreateBackdrop("Overlay")
ClassTalentFrame.SpecTab.backdrop:SetPoint("TOPLEFT", 4, -4)
ClassTalentFrame.SpecTab.backdrop:SetPoint("BOTTOMRIGHT", -4, 4)
ClassTalentFrame.SpecTab.Background:SetAlpha(0)
ClassTalentFrame.SpecTab.BlackBG:SetAlpha(0)
hooksecurefunc(ClassTalentFrame.SpecTab, "UpdateSpecFrame", function(frame)
for specContentFrame in frame.SpecContentFramePool:EnumerateActive() do
if not specContentFrame.isSkinned then
specContentFrame.ActivateButton:SkinButton()
if specContentFrame.SpellButtonPool then
for button in specContentFrame.SpellButtonPool:EnumerateActive() do
if button.Ring then
button.Ring:Hide()
end
if button.spellID then
local texture = GetSpellTexture(button.spellID)
if texture then
button.Icon:SetTexture(texture)
end
end
button.Icon:SkinIcon()
end
end
specContentFrame.isSkinned = true
end
end
end)
-- PvP
ClassTalentFrame.TalentsTab.PvPTalentList:StripTextures()
ClassTalentFrame.TalentsTab.PvPTalentList:CreateBackdrop("Overlay")
ClassTalentFrame.TalentsTab.PvPTalentList.backdrop:SetFrameStrata(ClassTalentFrame.TalentsTab.PvPTalentList:GetFrameStrata())
ClassTalentFrame.TalentsTab.PvPTalentList.backdrop:SetFrameLevel(2000)
end
T.SkinFuncs["Blizzard_ClassTalentUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/TalkingHead.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- TalkingHeadUI skin
----------------------------------------------------------------------------------------
local function LoadSkin()
TalkingHeadFrame:StripTextures()
TalkingHeadFrame:CreateBackdrop("Transparent")
TalkingHeadFrame.backdrop:SetPoint("TOPLEFT", 13, -13)
TalkingHeadFrame.backdrop:SetPoint("BOTTOMRIGHT", -35, 11)
TalkingHeadFrame.BackgroundFrame.TextBackground:SetAtlas(nil)
TalkingHeadFrame.PortraitFrame.Portrait:SetAtlas(nil)
TalkingHeadFrame.MainFrame.Model.PortraitBg:SetAtlas(nil)
TalkingHeadFrame.BackgroundFrame.TextBackground.SetAtlas = T.dummy
TalkingHeadFrame.PortraitFrame.Portrait.SetAtlas = T.dummy
TalkingHeadFrame.MainFrame.Model.PortraitBg.SetAtlas = T.dummy
TalkingHeadFrame.MainFrame.Model:CreateBackdrop("Default")
TalkingHeadFrame.MainFrame.Model.backdrop:SetPoint("TOPLEFT", -2, 2)
TalkingHeadFrame.MainFrame.Model.backdrop:SetPoint("BOTTOMRIGHT", 3, -3)
T.SkinCloseButton(TalkingHeadFrame.MainFrame.CloseButton)
TalkingHeadFrame.MainFrame.CloseButton:SetPoint("TOPRIGHT", -39, -17)
hooksecurefunc(TalkingHeadFrame.TextFrame.Text, "SetTextColor", function(self, r)
if r == 0 then
self:SetTextColor(1, 1, 1)
end
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Taxi.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Taxi skin
----------------------------------------------------------------------------------------
local function LoadSkin()
TaxiFrame:StripTextures()
TaxiFrame.TitleText:SetPoint("TOP", TaxiFrame, "TOP", -4, -25)
TaxiRouteMap:CreateBackdrop("Default")
T.SkinCloseButton(TaxiFrame.CloseButton)
TaxiFrame.CloseButton:SetPoint("TOPRIGHT", -9, -26)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/TimeManager.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- TimeManager skin
----------------------------------------------------------------------------------------
local function LoadSkin()
TimeManagerFrame:StripTextures()
TimeManagerFrame:CreateBackdrop("Transparent")
TimeManagerFrame.backdrop:SetPoint("TOPLEFT", -3, 0)
TimeManagerFrame.backdrop:SetPoint("BOTTOMRIGHT", -3, 3)
TimeManagerFrameInset:StripTextures()
T.SkinCloseButton(TimeManagerFrameCloseButton, TimeManagerFrame.backdrop)
T.SkinDropDownBox(TimeManagerAlarmHourDropDown, 79)
T.SkinDropDownBox(TimeManagerAlarmMinuteDropDown, 79)
T.SkinDropDownBox(TimeManagerAlarmAMPMDropDown, 70)
T.SkinEditBox(TimeManagerAlarmMessageEditBox, nil, TimeManagerAlarmMessageEditBox:GetHeight() - 5)
T.SkinCheckBox(TimeManagerAlarmEnabledButton)
T.SkinCheckBox(TimeManagerMilitaryTimeCheck)
T.SkinCheckBox(TimeManagerLocalTimeCheck)
TimeManagerStopwatchFrame:StripTextures()
TimeManagerStopwatchCheck:StyleButton(true)
TimeManagerStopwatchCheck:SetTemplate("Default")
TimeManagerStopwatchCheck:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)
TimeManagerStopwatchCheck:GetNormalTexture():ClearAllPoints()
TimeManagerStopwatchCheck:GetNormalTexture():SetPoint("TOPLEFT", 2, -2)
TimeManagerStopwatchCheck:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2)
StopwatchFrame:StripTextures()
StopwatchFrame:CreateBackdrop("Transparent")
StopwatchFrame.backdrop:SetPoint("TOPLEFT", 2, -15)
StopwatchFrame.backdrop:SetPoint("BOTTOMRIGHT", -2, 2)
StopwatchTabFrame:StripTextures()
T.SkinCloseButton(StopwatchCloseButton)
T.SkinNextPrevButton(StopwatchPlayPauseButton)
T.SkinNextPrevButton(StopwatchResetButton)
StopwatchPlayPauseButton:SetPoint("RIGHT", StopwatchResetButton, "LEFT", -4, 0)
StopwatchResetButton:SetPoint("BOTTOMRIGHT", StopwatchFrame, "BOTTOMRIGHT", -7, 7)
StopwatchCloseButton:ClearAllPoints()
StopwatchCloseButton:SetPoint("BOTTOMRIGHT", StopwatchFrame.backdrop, "TOPRIGHT", 0, 3)
end
T.SkinFuncs["Blizzard_TimeManager"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/TorghastLevelPicker.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Torghast Level Picker skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local frame = TorghastLevelPickerFrame
T.SkinCloseButton(frame.CloseButton)
frame.CloseButton:SetPoint("TOPRIGHT", -50, -50)
T.SkinNextPrevButton(frame.Pager.PreviousPage)
T.SkinNextPrevButton(frame.Pager.NextPage)
frame.OpenPortalButton:SkinButton()
hooksecurefunc(TorghastLevelPickerFrame, "ScrollAndSelectHighestAvailableLayer", function(self)
for layer in self.gossipOptionsPool:EnumerateActive() do
if not layer.styled then
layer.SelectedBorder:SetAtlas("charactercreate-ring-select")
layer.SelectedBorder:SetSize(120, 120)
layer.SelectedBorder:SetPoint("CENTER", 0, 0)
layer.styled = true
end
end
end)
end
T.SkinFuncs["Blizzard_TorghastLevelPicker"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Trade.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Trade skin
----------------------------------------------------------------------------------------
local function LoadSkin()
TradeFrame:StripTextures(true)
TradeFrameInset:StripTextures()
TradePlayerItemsInset:StripTextures()
TradeRecipientItemsInset:StripTextures()
TradePlayerEnchantInset:StripTextures()
TradeRecipientEnchantInset:StripTextures()
TradePlayerInputMoneyInset:StripTextures()
TradeRecipientMoneyInset:StripTextures()
TradeRecipientMoneyBg:StripTextures()
TradeFramePortrait:SetAlpha(0)
TradeFrame.RecipientOverlay.portrait:SetAlpha(0)
TradeFrame.RecipientOverlay.portraitFrame:SetAlpha(0)
TradeFrame:CreateBackdrop("Transparent")
TradeFrame.backdrop:SetPoint("TOPLEFT", 0, 0)
TradeFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
TradeFrameTradeButton:SkinButton(true)
TradeFrameCancelButton:SkinButton(true)
T.SkinCloseButton(TradeFrameCloseButton, TradeFrame.backdrop)
T.SkinEditBox(TradePlayerInputMoneyFrameGold)
T.SkinEditBox(TradePlayerInputMoneyFrameSilver)
T.SkinEditBox(TradePlayerInputMoneyFrameCopper)
for i = 1, MAX_TRADE_ITEMS do
local player = _G["TradePlayerItem"..i]
local recipient = _G["TradeRecipientItem"..i]
local player_button = _G["TradePlayerItem"..i.."ItemButton"]
local recipient_button = _G["TradeRecipientItem"..i.."ItemButton"]
local player_button_icon = _G["TradePlayerItem"..i.."ItemButtonIconTexture"]
local recipient_button_icon = _G["TradeRecipientItem"..i.."ItemButtonIconTexture"]
local player_button_count = _G["TradePlayerItem"..i.."ItemButtonCount"]
local recipient_button_count = _G["TradeRecipientItem"..i.."ItemButtonCount"]
if player_button and recipient_button then
player:StripTextures()
recipient:StripTextures()
player_button:StripTextures()
recipient_button:StripTextures()
player_button.IconBorder:SetAlpha(0)
recipient_button.IconBorder:SetAlpha(0)
player_button_icon:ClearAllPoints()
player_button_icon:SetPoint("TOPLEFT", player_button, "TOPLEFT", 2, -2)
player_button_icon:SetPoint("BOTTOMRIGHT", player_button, "BOTTOMRIGHT", -2, 2)
player_button_icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
player_button_icon:SetDrawLayer("OVERLAY")
player_button_count:SetDrawLayer("OVERLAY")
player_button:SetTemplate("Overlay")
player_button:StyleButton()
player_button.bg = CreateFrame("Frame", nil, player_button)
player_button.bg:SetTemplate("Overlay")
player_button.bg:SetPoint("TOPLEFT", player_button, "TOPRIGHT", 4, 0)
player_button.bg:SetPoint("BOTTOMRIGHT", _G["TradePlayerItem"..i.."NameFrame"], "BOTTOMRIGHT", 0, 14)
player_button.bg:SetFrameLevel(player_button:GetFrameLevel() - 4)
recipient_button_icon:ClearAllPoints()
recipient_button_icon:SetPoint("TOPLEFT", recipient_button, "TOPLEFT", 2, -2)
recipient_button_icon:SetPoint("BOTTOMRIGHT", recipient_button, "BOTTOMRIGHT", -2, 2)
recipient_button_icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
recipient_button_icon:SetDrawLayer("OVERLAY")
recipient_button_count:SetDrawLayer("OVERLAY")
recipient_button:SetTemplate("Overlay")
recipient_button:StyleButton()
recipient_button.bg = CreateFrame("Frame", nil, recipient_button)
recipient_button.bg:SetTemplate("Overlay")
recipient_button.bg:SetPoint("TOPLEFT", recipient_button, "TOPRIGHT", 4, 0)
recipient_button.bg:SetPoint("BOTTOMRIGHT", _G["TradeRecipientItem"..i.."NameFrame"], "BOTTOMRIGHT", 0, 14)
recipient_button.bg:SetFrameLevel(recipient_button:GetFrameLevel() - 4)
end
end
TradeHighlightPlayerTop:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightPlayerBottom:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightPlayerMiddle:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightPlayer:SetFrameStrata("HIGH")
TradeHighlightPlayer:SetPoint("TOPLEFT", TradeFrame, "TOPLEFT", 11, -86)
TradeHighlightPlayerEnchantTop:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightPlayerEnchantBottom:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightPlayerEnchantMiddle:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightPlayerEnchant:SetFrameStrata("HIGH")
TradeHighlightRecipientTop:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightRecipientBottom:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightRecipientMiddle:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightRecipient:SetFrameStrata("HIGH")
TradeHighlightRecipient:SetPoint("TOPLEFT", TradeFrame, "TOPLEFT", 179, -86)
TradeHighlightRecipientEnchantTop:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightRecipientEnchantBottom:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightRecipientEnchantMiddle:SetColorTexture(0, 1, 0, 0.2)
TradeHighlightRecipientEnchant:SetFrameStrata("HIGH")
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Trainer.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- TrainerUI skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local StripAllTextures = {
"ClassTrainerFrame",
"ClassTrainerFrameSkillStepButton",
"ClassTrainerFrameBottomInset"
}
local buttons = {
"ClassTrainerTrainButton"
}
local KillTextures = {
"ClassTrainerFramePortrait",
}
for _, object in pairs(StripAllTextures) do
_G[object]:StripTextures()
end
for _, texture in pairs(KillTextures) do
_G[texture]:Kill()
end
for i = 1, #buttons do
_G[buttons[i]]:SkinButton(true)
end
ClassTrainerFrame:CreateBackdrop("Transparent")
ClassTrainerFrame.backdrop:SetPoint("TOPLEFT", ClassTrainerFrame, "TOPLEFT")
ClassTrainerFrame.backdrop:SetPoint("BOTTOMRIGHT", ClassTrainerFrame, "BOTTOMRIGHT")
T.SkinDropDownBox(ClassTrainerFrameFilterDropDown)
ClassTrainerFrameFilterDropDown:ClearAllPoints()
ClassTrainerFrameFilterDropDown:SetPoint("TOPRIGHT", ClassTrainerFrame.backdrop, "TOPRIGHT", 4, -30)
T.SkinCloseButton(ClassTrainerFrameCloseButton, ClassTrainerFrame)
T.SkinScrollBar(ClassTrainerFrame.ScrollBar)
ClassTrainerFrame.ScrollBar:SetPoint("TOPLEFT", ClassTrainerFrame.ScrollBox, "TOPRIGHT", 0, 3)
ClassTrainerFrame.ScrollBar:SetPoint("BOTTOMLEFT", ClassTrainerFrame.ScrollBox, "BOTTOMRIGHT", 0, -4)
ClassTrainerStatusBar:StripTextures()
ClassTrainerStatusBar:SetStatusBarTexture(C.media.texture)
ClassTrainerStatusBar:CreateBackdrop("Overlay")
ClassTrainerStatusBar:SetHeight(17)
ClassTrainerStatusBar:ClearAllPoints()
ClassTrainerStatusBar:SetPoint("RIGHT", ClassTrainerFrameFilterDropDown, "LEFT", 10, 3)
ClassTrainerStatusBar.rankText:ClearAllPoints()
ClassTrainerStatusBar.rankText:SetPoint("CENTER", ClassTrainerStatusBar, "CENTER")
local stepButton = ClassTrainerFrameSkillStepButton
stepButton:ClearAllPoints()
stepButton:SetPoint("TOPRIGHT", ClassTrainerFrameFilterDropDown, "BOTTOMRIGHT", -16, 0)
stepButton:CreateBackdrop("Overlay")
stepButton.backdrop:SetPoint("BOTTOMRIGHT", 2, -3)
stepButton:StyleButton(nil, nil, true)
stepButton.icon:SkinIcon(true)
stepButton.icon:SetPoint("LEFT", stepButton, "LEFT", 6, -1)
stepButton.icon:SetSize(33, 33)
stepButton.selectedTex:ClearAllPoints()
stepButton.selectedTex:SetInside(stepButton.backdrop)
stepButton.selectedTex:SetColorTexture(1, 0.82, 0, 0.3)
hooksecurefunc(ClassTrainerFrame.ScrollBox, "Update", function(frame)
for _, button in next, {frame.ScrollTarget:GetChildren()} do
if not button.IsSkinned then
button:CreateBackdrop("Overlay")
button.backdrop:SetPoint("TOPLEFT", 0, 0)
button.backdrop:SetPoint("BOTTOMRIGHT", 0, 2)
button:StyleButton(nil, nil, true)
button.icon:SkinIcon(true)
button.icon:SetPoint("LEFT", button, "LEFT", 6, 1)
button.icon:SetSize(33, 33)
button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button:SetNormalTexture(0)
button.disabledBG:SetTexture()
button.selectedTex:ClearAllPoints()
button.selectedTex:SetInside(button.backdrop)
button.selectedTex:SetColorTexture(1, 0.82, 0, 0.3)
button.IsSkinned = true
end
end
end)
end
T.SkinFuncs["Blizzard_TrainerUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/Tutorial.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Tutorial skin
----------------------------------------------------------------------------------------
local function LoadSkin()
TutorialFrame:StripTextures()
TutorialFrame:CreateBackdrop("Transparent")
TutorialFrame.backdrop:SetPoint("TOPLEFT", 6, 0)
TutorialFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, -6)
T.SkinNextPrevButton(TutorialFrameNextButton)
T.SkinNextPrevButton(TutorialFramePrevButton)
TutorialFrameOkayButton:SkinButton()
TutorialFrameOkayButton:ClearAllPoints()
TutorialFrameOkayButton:SetPoint("LEFT", TutorialFrameNextButton, "RIGHT", 10, 0)
T.SkinCloseButton(TutorialFrameCloseButton, TutorialFrame.backdrop)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/VoidStorage.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- VoidStorageUI skin
----------------------------------------------------------------------------------------
local function LoadSkin()
local StripAllTextures = {
"VoidStorageBorderFrame",
"VoidStorageDepositFrame",
"VoidStorageWithdrawFrame",
"VoidStorageCostFrame",
"VoidStorageStorageFrame",
"VoidStoragePurchaseFrame",
"VoidItemSearchBox"
}
for _, object in pairs(StripAllTextures) do
_G[object]:StripTextures()
end
VoidStorageFrame:SetTemplate("Transparent")
VoidStoragePurchaseFrame:SetTemplate("Overlay")
VoidStoragePurchaseFrame:SetFrameLevel(VoidStorageFrame:GetFrameLevel() + 2)
VoidStorageFrameMarbleBg:Kill()
VoidStorageFrameLines:Kill()
select(2, VoidStorageFrame:GetRegions()):Kill()
VoidStoragePurchaseButton:SkinButton()
VoidStorageTransferButton:SkinButton()
T.SkinCloseButton(VoidStorageBorderFrame.CloseButton)
VoidItemSearchBox:CreateBackdrop("Overlay")
VoidItemSearchBox.backdrop:SetPoint("TOPLEFT", 10, -1)
VoidItemSearchBox.backdrop:SetPoint("BOTTOMRIGHT", 4, 1)
VoidStorageFrame:HookScript("OnShow", function()
SideDressUpFrame:ClearAllPoints()
SideDressUpFrame:SetPoint("TOPLEFT", VoidStorageFrame, "TOPRIGHT", 3, 0)
end)
for i = 1, 9 do
local button_d = _G["VoidStorageDepositButton"..i]
local button_w = _G["VoidStorageWithdrawButton"..i]
local icon_d = _G["VoidStorageDepositButton"..i.."IconTexture"]
local icon_w = _G["VoidStorageWithdrawButton"..i.."IconTexture"]
_G["VoidStorageDepositButton"..i.."Bg"]:Hide()
_G["VoidStorageWithdrawButton"..i.."Bg"]:Hide()
button_d:StyleButton()
button_d:SetTemplate("Default")
button_d.IconBorder:Kill()
button_w:StyleButton()
button_w:SetTemplate("Default")
button_w.IconBorder:Kill()
icon_d:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon_d:ClearAllPoints()
icon_d:SetPoint("TOPLEFT", 2, -2)
icon_d:SetPoint("BOTTOMRIGHT", -2, 2)
icon_w:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon_w:ClearAllPoints()
icon_w:SetPoint("TOPLEFT", 2, -2)
icon_w:SetPoint("BOTTOMRIGHT", -2, 2)
end
for i = 1, 80 do
local button = _G["VoidStorageStorageButton"..i]
local icon = _G["VoidStorageStorageButton"..i.."IconTexture"]
_G["VoidStorageStorageButton"..i.."Bg"]:Hide()
button:StyleButton()
button:SetTemplate("Default")
button.IconBorder:Kill()
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon:ClearAllPoints()
icon:SetPoint("TOPLEFT", 2, -2)
icon:SetPoint("BOTTOMRIGHT", -2, 2)
end
for i = 1, 2 do
local tab = VoidStorageFrame["Page"..i]
tab:GetRegions():Hide()
tab:GetNormalTexture():ClearAllPoints()
tab:GetNormalTexture():SetPoint("TOPLEFT", 2, -2)
tab:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2)
tab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)
tab:CreateBackdrop("Default")
tab.backdrop:SetAllPoints()
tab:StyleButton(true)
if i == 1 then
tab:SetPoint("TOPLEFT", VoidStorageFrame, "TOPRIGHT", 1, 0)
end
end
end
T.SkinFuncs["Blizzard_VoidStorageUI"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/WeeklyRewards.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- Weekly Rewards skin
----------------------------------------------------------------------------------------
local function LoadSkin()
hooksecurefunc(WeeklyRewardsFrame, "SetupTextures", function()
local frame = WeeklyRewardsFrame
frame:StripTextures()
frame.HeaderFrame:StripTextures()
local headers = {
frame.RaidFrame,
frame.MythicFrame,
frame.PVPFrame
}
for i = 1, #headers do
local header = headers[i]
header.Border:Hide()
end
end)
local frame = WeeklyRewardsFrame
T.SkinCloseButton(frame.CloseButton)
-- frame:StripTextures()
frame:CreateBackdrop("Transparent")
-- frame.HeaderFrame:StripTextures()
frame.SelectRewardButton:StripTextures()
frame.SelectRewardButton:SkinButton()
local headers = {
frame.RaidFrame,
frame.MythicFrame,
frame.PVPFrame
}
for i = 1, #headers do
local header = headers[i]
-- header.Border:Hide()
header:CreateBackdrop("Default")
header.backdrop:SetOutside(header.Background)
header.Background:SetTexCoord(0.01602564102564, 0.97109826589595, 0.02890173410405, 0.97109826589595)
end
for _, activity in pairs(frame.Activities) do
if activity.Border then
activity.Border:SetAlpha(0)
activity.SelectedTexture:SetAlpha(0)
activity.UnselectedFrame:SetAlpha(0)
activity:CreateBackdrop("Default")
activity.backdrop:SetOutside(activity.Background)
hooksecurefunc(activity, "SetSelectionState", function(self)
if self.SelectedTexture:IsShown() then
self.backdrop:SetBackdropBorderColor(1, 1, 0)
else
self.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end
end)
hooksecurefunc(activity.ItemFrame, "SetDisplayedItem", function(item)
if not item.IsSkinned then
item:DisableDrawLayer("BORDER")
item.Icon:SkinIcon()
item.Name:SetTextColor(0.639, 0.207, 0.933)
item.IsSkinned = true
end
end)
end
end
hooksecurefunc(frame, "SelectReward", function(self)
local frame = self.confirmSelectionFrame
if frame and not frame.styled then
WeeklyRewardsFrameIconTexture:SkinIcon()
WeeklyRewardsFrameNameFrame:SetAlpha(0)
frame.ItemFrame.IconBorder:SetAlpha(0)
frame.styled = true
local alsoItems = frame.AlsoItemsFrame
if alsoItems and alsoItems.pool then
for items in alsoItems.pool:EnumerateActive() do
if not items.styled then
items.IconBorder:SetAlpha(0)
items.Icon:SkinIcon()
items.styled = true
end
end
end
end
end)
local rewardText = frame.ConcessionFrame.RewardsFrame.Text
hooksecurefunc(rewardText, "SetText", function(self, text)
if not text then text = self:GetText() end
if not text or text == "" then return end
local newText, count = gsub(text, "24:24:0:%-2", "14:14:0:0:64:64:5:59:5:59")
if count > 0 then self:SetFormattedText("%s", newText) end
end)
end
T.SkinFuncs["Blizzard_WeeklyRewards"] = LoadSkin
================================================
FILE: ShestakUI/Modules/Skins/Blizzard/WorldMap.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true then return end
----------------------------------------------------------------------------------------
-- WorldMap skin
----------------------------------------------------------------------------------------
local function LoadSkin()
if IsAddOnLoaded("Mapster") then return end
local frame = CreateFrame("Frame")
frame:RegisterEvent("VARIABLES_LOADED")
frame:SetScript("OnEvent", function()
SetCVar("miniWorldMap", 1)
end)
WorldMapFrame:StripTextures()
WorldMapFramePortrait:SetAlpha(0)
WorldMapFrame:CreateBackdrop("Default")
WorldMapFrame.backdrop:ClearAllPoints()
WorldMapFrame.backdrop:SetPoint("TOPLEFT", 1, -66)
WorldMapFrame.backdrop:SetSize(700, 468)
WorldMapFrame.Header = CreateFrame("Frame", nil, WorldMapFrame)
WorldMapFrame.Header:SetSize(WorldMapFrame.backdrop:GetWidth(), 23)
WorldMapFrame.Header:SetPoint("BOTTOMLEFT", WorldMapFrame.backdrop, "TOPLEFT", 0, 2)
WorldMapFrame.Header:SetTemplate("Overlay")
WorldMapFrame.BorderFrame:StripTextures()
WorldMapFrame.BorderFrame.NineSlice:Hide()
WorldMapFrame.BorderFrame.Tutorial:Kill()
QuestMapFrame:StripTextures()
QuestMapFrame:CreateBackdrop("Overlay")
QuestMapFrame.backdrop:ClearAllPoints()
QuestMapFrame.backdrop:SetPoint("LEFT", WorldMapFrame.backdrop, "RIGHT", 2, 0)
QuestMapFrame.backdrop:SetSize(284, 468)
QuestScrollFrame:ClearAllPoints()
QuestScrollFrame:SetPoint("TOP", WorldMapFrame.backdrop, "TOP", 0, -3)
QuestScrollFrame:SetPoint("LEFT", WorldMapFrame.backdrop, "RIGHT", 4, 0)
QuestScrollFrame.DetailFrame:StripTextures()
QuestScrollFrame.DetailFrame.BottomDetail:Hide()
QuestScrollFrame.Contents.Separator.Divider:Hide()
QuestScrollFrame:SetSize(259, 463)
local CampaignOverview = QuestMapFrame.CampaignOverview
CampaignOverview:StripTextures()
CampaignOverview.ScrollFrame:StripTextures()
T.SkinScrollBar(QuestMapFrameScrollBar)
CampaignOverview:CreateBackdrop("Overlay")
CampaignOverview.backdrop:SetPoint("TOPLEFT", CampaignOverview.Header, "TOPLEFT", 8, -2)
CampaignOverview.backdrop:SetPoint("BOTTOMRIGHT", CampaignOverview.Header, "BOTTOMRIGHT", -4, 10)
CampaignOverview.backdrop.overlay:SetVertexColor(1, 1, 1, 0.2)
CampaignOverview.Header.Background:SetAlpha(0)
CampaignOverview.Header.TopFiligree:Hide()
do
local frame = QuestScrollFrame.Contents.StoryHeader
frame:CreateBackdrop("Overlay")
frame.backdrop:SetPoint("TOPLEFT", 6, -9)
frame.backdrop:SetPoint("BOTTOMRIGHT", -6, 11)
frame.HighlightTexture:Hide()
frame.Background:SetAlpha(0)
frame.backdrop.overlay:SetVertexColor(1, 1, 1, 0.2)
end
QuestScrollFrame.ScrollBar:SetPoint("TOPLEFT", QuestScrollFrame, "TOPRIGHT", 4, -16)
QuestScrollFrame.ScrollBar:SetPoint("BOTTOMLEFT", QuestScrollFrame, "BOTTOMRIGHT", 4, 15)
T.SkinScrollBar(QuestScrollFrame.ScrollBar)
local QuestScrollFrameTopBorder = CreateFrame("Frame", "$parentBorder", QuestScrollFrame)
QuestScrollFrameTopBorder:CreateBackdrop("Overlay")
QuestScrollFrameTopBorder.backdrop:ClearAllPoints()
QuestScrollFrameTopBorder.backdrop:SetSize(284, 23)
QuestScrollFrameTopBorder.backdrop:SetPoint("LEFT", WorldMapFrame.Header, "RIGHT", 2, 0)
local QuestScrollFrameTopBorder = CreateFrame("Frame", "$parentBorder", QuestMapFrame.CampaignOverview)
QuestScrollFrameTopBorder:CreateBackdrop("Overlay")
QuestScrollFrameTopBorder.backdrop:ClearAllPoints()
QuestScrollFrameTopBorder.backdrop:SetSize(284, 23)
QuestScrollFrameTopBorder.backdrop:SetPoint("LEFT", WorldMapFrame.Header, "RIGHT", 2, 0)
QuestMapDetailsScrollFrame:SetPoint("TOPLEFT", 1, 0)
QuestMapDetailsScrollFrame.ScrollBar:SetPoint("TOPLEFT", QuestMapDetailsScrollFrame, "TOPRIGHT", 0, -18)
T.SkinScrollBar(QuestMapDetailsScrollFrame.ScrollBar)
QuestMapFrame.Background:SetAlpha(0)
QuestMapFrame.DetailsFrame:StripTextures()
QuestMapFrame.DetailsFrame.RewardsFrame:StripTextures()
QuestMapFrame.DetailsFrame.Bg:Hide()
QuestMapFrame.DetailsFrame.BackButton:SkinButton()
QuestMapFrame.DetailsFrame.BackButton:ClearAllPoints()
QuestMapFrame.DetailsFrame.BackButton:SetPoint("LEFT", WorldMapFrame.Header, "RIGHT", 2, 0)
QuestMapFrame.DetailsFrame.BackButton:SetSize(284, 23)
local AbandonButton = QuestMapFrame.DetailsFrame.AbandonButton
AbandonButton:SkinButton()
AbandonButton:ClearAllPoints()
AbandonButton:SetPoint("BOTTOMLEFT", QuestMapFrame.backdrop, "BOTTOMLEFT", 4, 4)
local TrackButton = QuestMapFrame.DetailsFrame.TrackButton
TrackButton:SkinButton()
TrackButton:SetSize(90, 22)
TrackButton:ClearAllPoints()
TrackButton:SetPoint("BOTTOMRIGHT", QuestMapFrame.backdrop, "BOTTOMRIGHT", -4, 4)
local ShareButton = QuestMapFrame.DetailsFrame.ShareButton
ShareButton:SkinButton(true)
ShareButton:ClearAllPoints()
ShareButton:SetPoint("LEFT", AbandonButton, "RIGHT", 3, 0)
ShareButton:SetPoint("RIGHT", TrackButton, "LEFT", -3, 0)
QuestMapFrame.DetailsFrame.CompleteQuestFrame:StripTextures()
QuestMapFrame.DetailsFrame.CompleteQuestFrame.CompleteButton:SkinButton(true)
QuestMapFrame.DetailsFrame.CompleteQuestFrame.CompleteButton:SetPoint("TOP", 0, 4)
-- Quests Buttons
for i = 1, 2 do
local button = i == 1 and WorldMapFrame.SidePanelToggle.CloseButton or WorldMapFrame.SidePanelToggle.OpenButton
local texture = i == 1 and "Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up" or "Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up"
button:ClearAllPoints()
button:SetPoint("BOTTOMRIGHT", -2, 2)
button:SetSize(20, 20)
button:StripTextures()
button:SetTemplate("Default")
button:StyleButton()
button.icon = button:CreateTexture(nil, "BORDER")
button.icon:SetTexture(texture)
button.icon:SetTexCoord(0.3, 0.29, 0.3, 0.79, 0.65, 0.29, 0.65, 0.79)
button.icon:ClearAllPoints()
button.icon:SetPoint("TOPLEFT", 2, -2)
button.icon:SetPoint("BOTTOMRIGHT", -2, 2)
end
WorldMapFrame.NavBar:Hide()
WorldMapFrame.BorderFrame.TitleContainer.TitleText:ClearAllPoints()
WorldMapFrame.BorderFrame.TitleContainer.TitleText:SetPoint("CENTER", WorldMapFrame.Header)
T.SkinCloseButton(WorldMapFrameCloseButton)
WorldMapFrameCloseButton:ClearAllPoints()
WorldMapFrameCloseButton:SetPoint("RIGHT", WorldMapFrame.Header, "RIGHT", -4, 0)
WorldMapFrameCloseButton:SetSize(15, 15)
WorldMapFrame.BorderFrame.MaximizeMinimizeFrame.MaximizeButton:Kill()
WorldMapFrame.BorderFrame.MaximizeMinimizeFrame.MinimizeButton:Kill()
-- Floor Dropdown
local function WorldMapFloorNavigationDropDown(frame)
T.SkinDropDownBox(frame)
frame:SetPoint("TOPLEFT", -15, -67)
end
-- Tracking Button
local function WorldMapTrackingOptionsButton(button)
local shadow = button:GetRegions()
shadow:Hide()
button.Background:Hide()
button.IconOverlay:SetAlpha(0)
button.Border:Hide()
local tex = button:GetHighlightTexture()
tex:SetTexture([[Interface\Minimap\Tracking\None]], "ADD")
tex:SetAllPoints(button.Icon)
end
-- Tracking Pin
local function WorldMapTrackingPinButton(button)
local shadow = button:GetRegions()
shadow:Hide()
button.Background:Hide()
button.IconOverlay:SetAlpha(0)
button.Border:Hide()
local tex = button:GetHighlightTexture()
tex:SetAtlas("Waypoint-MapPin-Untracked")
tex:SetAllPoints(button.Icon)
end
local function HandyNotesButton(button)
local shadow = button:GetRegions()
shadow:Hide()
button.Background:Hide()
button.IconOverlay:SetAlpha(0)
button.Border:Hide()
local tex = button:GetHighlightTexture()
tex:SetAtlas(button.Icon:GetTexture())
tex:SetAllPoints(button.Icon)
end
-- Elements
WorldMapFloorNavigationDropDown(WorldMapFrame.overlayFrames[1])
WorldMapTrackingOptionsButton(WorldMapFrame.overlayFrames[2])
WorldMapTrackingPinButton(WorldMapFrame.overlayFrames[3])
for i = 1, 10 do
local button = _G["Krowi_WorldMapButtons"..i]
if button then
HandyNotesButton(button)
end
end
for i = 3, #WorldMapFrame.overlayFrames do
local frame = WorldMapFrame.overlayFrames[i]
if frame.BountyDropdownButton then
T.SkinNextPrevButton(frame.BountyDropdownButton)
break
end
end
-- QuestSessionManagement skin (based on skin from Aurora)
QuestMapFrame.QuestSessionManagement:StripTextures()
local ExecuteSessionCommand = QuestMapFrame.QuestSessionManagement.ExecuteSessionCommand
ExecuteSessionCommand:SetTemplate("Default")
ExecuteSessionCommand:StyleButton()
local icon = ExecuteSessionCommand:CreateTexture(nil, "ARTWORK")
icon:SetPoint("TOPLEFT", 0, 0)
icon:SetPoint("BOTTOMRIGHT", 0, 0)
ExecuteSessionCommand.normalIcon = icon
local sessionCommandToButtonAtlas = { -- Skin from Aurora
[_G.Enum.QuestSessionCommand.Start] = "QuestSharing-DialogIcon",
[_G.Enum.QuestSessionCommand.Stop] = "QuestSharing-Stop-DialogIcon"
}
hooksecurefunc(QuestMapFrame.QuestSessionManagement, "UpdateExecuteCommandAtlases", function(self, command)
self.ExecuteSessionCommand:SetNormalTexture(0)
self.ExecuteSessionCommand:SetPushedTexture(0)
self.ExecuteSessionCommand:SetDisabledTexture(0)
local atlas = sessionCommandToButtonAtlas[command]
if atlas then
self.ExecuteSessionCommand.normalIcon:SetAtlas(atlas)
end
end)
hooksecurefunc(QuestSessionManager, "NotifyDialogShow", function(_, dialog)
if not dialog.isSkinned then
dialog:StripTextures()
dialog:SetTemplate("Transparent")
dialog.ButtonContainer.Confirm:SkinButton()
dialog.ButtonContainer.Decline:SkinButton()
if dialog.MinimizeButton then
T.SkinCloseButton(dialog.MinimizeButton, nil, "-")
end
dialog.isSkinned = true
end
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/BloodShieldTracker.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blood_shield_tracker ~= true or T.class ~= "DEATHKNIGHT" then return end
----------------------------------------------------------------------------------------
-- BloodShieldTracker skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("BloodShieldTracker") then return end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["AMSBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["AMSBar"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PWSBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PWSBar"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["ShieldBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["ShieldBar"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["HealthBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["HealthBar"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["IllumBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["IllumBar"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["EstimateBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["EstimateBar"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PurgatoryBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PurgatoryBar"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["TotalAbsorbsBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["TotalAbsorbsBar"] = {} end
if not BloodShieldTrackerDB["profiles"]["Default"]["bars"]["BloodChargeBar"] then BloodShieldTrackerDB["profiles"]["Default"]["bars"]["BloodChargeBar"] = {} end
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["AMSBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["AMSBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["AMSBar"]["scale"] = 1
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PWSBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PWSBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PWSBar"]["scale"] = 1
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["ShieldBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["ShieldBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["ShieldBar"]["scale"] = 1
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["HealthBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["HealthBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["HealthBar"]["scale"] = 1
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["IllumBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["IllumBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["IllumBar"]["scale"] = 1
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["EstimateBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["EstimateBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["EstimateBar"]["scale"] = 1
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PurgatoryBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PurgatoryBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["PurgatoryBar"]["scale"] = 1
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["TotalAbsorbsBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["TotalAbsorbsBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["TotalAbsorbsBar"]["scale"] = 1
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["BloodChargeBar"]["border"] = false
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["BloodChargeBar"]["texture"] = "Smooth!"
BloodShieldTrackerDB["profiles"]["Default"]["bars"]["BloodChargeBar"]["scale"] = 1
local bars = {
"BloodShieldTracker_AMSBar",
"BloodShieldTracker_PWSBar",
"BloodShieldTracker_EstimateBar",
"BloodShieldTracker_ShieldBar",
"BloodShieldTracker_TotalAbsorbsBar",
"BloodShieldTracker_IllumBar",
"BloodShieldTracker_HealthBar",
"BloodShieldTracker_PurgatoryBar",
"BloodShieldTracker_BloodChargeBar"
}
for i = 1, getn(bars) do
local bar = _G[bars[i]]
if bar then
bar:CreateBackdrop("Default")
bar.value:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
bar.value:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
if bar.stacks then
bar.stacks:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
bar.stacks:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
if bar.time then
bar.time:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
bar.time:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
end
end
end)
================================================
FILE: ShestakUI/Modules/Skins/Capping.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.capping ~= true then return end
----------------------------------------------------------------------------------------
-- Capping skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("Capping") then return end
local db = CappingFrame.db.profile
db.barTexture = "Smooth!"
db.spacing = 7
db.font = "Hooge"
db.fontSize = C.font.stylization_font_size
CappingFrame:HookScript('OnUpdate', function(self)
for bar in pairs(self.bars) do
if not bar.backdrop then
bar:CreateBackdrop("Default")
end
end
end)
end)
================================================
FILE: ShestakUI/Modules/Skins/Clique.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.blizzard_frames ~= true or C.skins.clique ~= true then return end
----------------------------------------------------------------------------------------
-- Clique skin
----------------------------------------------------------------------------------------
local function LoadSkin()
if not IsAddOnLoaded("Clique") then return end
CliqueConfig:StripTextures()
CliqueConfig:SetTemplate("Transparent")
CliqueConfigPortrait:SetAlpha(0)
CliqueConfigPage1Column1:StripTextures()
CliqueConfigPage1Column2:StripTextures()
CliqueConfigInset:StripTextures()
CliqueConfigPage1_VSlider:StripTextures()
CliqueClickGrabber:StripTextures()
CliqueClickGrabber:CreateBackdrop("Overlay")
CliqueClickGrabber.backdrop:SetPoint("TOPLEFT", -1, 0)
CliqueClickGrabber.backdrop:SetPoint("BOTTOMRIGHT", 2, 3)
CliqueDialog:StripTextures()
CliqueDialog:SetTemplate("Transparent")
T.SkinCloseButton(CliqueConfigCloseButton)
if CliqueDialog.CloseButton then T.SkinCloseButton(CliqueDialog.CloseButton) end
if CliqueDialogCloseButton then T.SkinCloseButton(CliqueDialogCloseButton) end
CliqueConfigPage1ButtonOptions:SkinButton(true)
CliqueConfigPage1ButtonOther:SkinButton(true)
CliqueConfigPage1ButtonSpell:SkinButton(true)
CliqueConfigPage2ButtonBinding:SkinButton()
CliqueConfigPage2ButtonSave:SkinButton(true)
CliqueConfigPage2ButtonCancel:SkinButton(true)
CliqueDialogButtonBinding:SkinButton()
CliqueDialogButtonAccept:SkinButton()
if T.client == "ruRU" then
CliqueConfigPage1ButtonSpell:SetWidth(130)
CliqueConfigPage1ButtonSpellText:SetWidth(CliqueConfigPage1ButtonSpell:GetWidth())
CliqueConfigPage1ButtonSpellText:SetHeight(CliqueConfigPage1ButtonSpell:GetHeight())
CliqueConfigPage1ButtonOther:SetWidth(110)
end
CliqueSpellTab:GetRegions():SetSize(0.1, 0.1)
CliqueSpellTab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)
CliqueSpellTab:GetNormalTexture():ClearAllPoints()
CliqueSpellTab:GetNormalTexture():SetPoint("TOPLEFT", 2, -2)
CliqueSpellTab:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2)
CliqueSpellTab:CreateBackdrop("Default")
CliqueSpellTab.backdrop:SetAllPoints()
CliqueSpellTab:StyleButton()
CliqueConfigPage1:SetScript("OnShow", function()
for i = 1, 12 do
if _G["CliqueRow"..i] then
_G["CliqueRow"..i.."Icon"]:SetTexCoord(0.1, 0.9, 0.1, 0.9)
_G["CliqueRow"..i.."Bind"]:ClearAllPoints()
if _G["CliqueRow"..i] == CliqueRow1 then
_G["CliqueRow"..i.."Bind"]:SetPoint("RIGHT", _G["CliqueRow"..i], 8, 0)
else
_G["CliqueRow"..i.."Bind"]:SetPoint("RIGHT", _G["CliqueRow"..i], -8, 0)
end
end
end
CliqueRow1:ClearAllPoints()
CliqueRow1:SetPoint("TOPLEFT", 5, -(CliqueConfigPage1Column1:GetHeight() + 3))
end)
end
tinsert(T.SkinFuncs["ShestakUI"], LoadSkin)
================================================
FILE: ShestakUI/Modules/Skins/CoolLine.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.cool_line ~= true then return end
----------------------------------------------------------------------------------------
-- CoolLine skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("CoolLine") then return end
CoolLineDB.border = "None"
CoolLineDB.bgcolor.a = 0
CoolLineDB.inactivealpha = 1
CoolLineDB.activealpha = 1
CoolLineDB.font = "Hooge"
CoolLineDB.fontsize = C.font.stylization_font_size
CoolLineDB.w = (C.actionbar.button_size * 12) + (C.actionbar.button_space * 11) - 4
CoolLineDB.h = C.actionbar.button_size - 4
local CoolLineBar = CreateFrame("Frame", "CoolLineBar", CoolLine)
CoolLineBar:SetPoint("TOPLEFT", CoolLine, "TOPLEFT", -2, 2)
CoolLineBar:SetPoint("BOTTOMRIGHT", CoolLine, "BOTTOMRIGHT", 2, -2)
CoolLineBar:SetTemplate("Transparent")
CoolLineBar:SetFrameStrata("BACKGROUND")
end)
================================================
FILE: ShestakUI/Modules/Skins/DBM.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.dbm ~= true then return end
----------------------------------------------------------------------------------------
-- DBM skin(by Affli)
----------------------------------------------------------------------------------------
local backdrop = {
bgFile = C.media.blank,
insets = {left = 0, right = 0, top = 0, bottom = 0},
}
local DBMSkin = CreateFrame("Frame")
DBMSkin:RegisterEvent("PLAYER_LOGIN")
DBMSkin:RegisterEvent("ADDON_LOADED")
DBMSkin:SetScript("OnEvent", function()
if IsAddOnLoaded("DBM-Core") then
local function SkinBars(self)
for bar in self:GetBarIterator() do
if not bar.injected then
bar.ApplyStyle = function()
local frame = bar.frame
local tbar = _G[frame:GetName().."Bar"]
local spark = _G[frame:GetName().."BarSpark"]
local icon1 = _G[frame:GetName().."BarIcon1"]
local icon2 = _G[frame:GetName().."BarIcon2"]
local name = _G[frame:GetName().."BarName"]
local timer = _G[frame:GetName().."BarTimer"]
if icon1.overlay then
icon1.overlay = _G[icon1.overlay:GetName()]
else
icon1.overlay = CreateFrame("Frame", "$parentIcon1Overlay", tbar)
icon1.overlay:SetWidth(25)
icon1.overlay:SetHeight(25)
icon1.overlay:SetFrameStrata("BACKGROUND")
icon1.overlay:SetPoint("BOTTOMRIGHT", tbar, "BOTTOMLEFT", -5, -2)
icon1.overlay:SetTemplate("Transparent")
end
if icon2.overlay then
icon2.overlay = _G[icon2.overlay:GetName()]
else
icon2.overlay = CreateFrame("Frame", "$parentIcon2Overlay", tbar)
icon2.overlay:SetWidth(25)
icon2.overlay:SetHeight(25)
icon2.overlay:SetFrameStrata("BACKGROUND")
icon2.overlay:SetPoint("BOTTOMLEFT", tbar, "BOTTOMRIGHT", 5, -2)
icon2.overlay:SetTemplate("Transparent")
end
Mixin(tbar, BackdropTemplateMixin)
if bar.color then
tbar:SetStatusBarColor(bar.color.r, bar.color.g, bar.color.b)
tbar:SetBackdrop(backdrop)
tbar:SetBackdropColor(bar.color.r, bar.color.g, bar.color.b, 0.15)
else
tbar:SetStatusBarColor(DBT.Options.StartColorR, DBT.Options.StartColorG, DBT.Options.StartColorB)
tbar:SetBackdrop(backdrop)
tbar:SetBackdropColor(DBT.Options.StartColorR, DBT.Options.StartColorG, DBT.Options.StartColorB, 0.15)
end
if bar.enlarged then
frame:SetWidth(DBT.Options.HugeWidth)
tbar:SetWidth(DBT.Options.HugeWidth)
else
frame:SetWidth(DBT.Options.Width)
tbar:SetWidth(DBT.Options.Width)
end
if not frame.styled then
frame:SetScale(1)
frame:SetHeight(19)
frame:SetTemplate("Default")
frame.styled = true
end
if not spark.killed then
spark:SetAlpha(0)
spark:SetTexture(nil)
spark.killed = true
end
if not icon1.styled then
icon1:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon1:ClearAllPoints()
icon1:SetPoint("TOPLEFT", icon1.overlay, 2, -2)
icon1:SetPoint("BOTTOMRIGHT", icon1.overlay, -2, 2)
icon1.styled = true
end
if not icon2.styled then
icon2:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon2:ClearAllPoints()
icon2:SetPoint("TOPLEFT", icon2.overlay, 2, -2)
icon2:SetPoint("BOTTOMRIGHT", icon2.overlay, -2, 2)
icon2.styled = true
end
if not tbar.styled then
tbar:SetPoint("TOPLEFT", frame, "TOPLEFT", 2, -2)
tbar:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -2, 2)
tbar.styled = true
end
if not name.styled then
name:ClearAllPoints()
name:SetPoint("LEFT", frame, "LEFT", 4, 0)
name:SetWidth(165)
name:SetHeight(8)
name:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
name:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
name:SetJustifyH("LEFT")
name.SetFont = T.dummy
name.styled = true
end
if not timer.styled then
timer:ClearAllPoints()
timer:SetPoint("RIGHT", frame, "RIGHT", -1, 0)
timer:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
timer:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
timer:SetJustifyH("RIGHT")
timer.SetFont = T.dummy
timer.styled = true
end
if DBT.Options.IconLeft then icon1:Show() icon1.overlay:Show() else icon1:Hide() icon1.overlay:Hide() end
if DBT.Options.IconRight then icon2:Show() icon2.overlay:Show() else icon2:Hide() icon2.overlay:Hide() end
tbar:SetAlpha(1)
frame:SetAlpha(1)
frame:Show()
bar:Update(0)
bar.injected = true
end
bar:ApplyStyle()
end
end
end
if DBM then
hooksecurefunc(DBT, "CreateBar", SkinBars)
hooksecurefunc(DBM.RangeCheck, "Show", function()
if DBMRangeCheck then
DBMRangeCheck:SetTemplate("Transparent")
end
if DBMRangeCheckRadar then
DBMRangeCheckRadar:SetTemplate("Transparent")
end
end)
hooksecurefunc(DBM.InfoFrame, "Show", function()
if DBMInfoFrame then
DBMInfoFrame:SetTemplate("Transparent")
end
end)
end
local replace = string.gsub
local old = RaidNotice_AddMessage
RaidNotice_AddMessage = function(noticeFrame, textString, colorInfo)
if textString:find(" |T") then
textString = replace(textString, "(:12:12)", ":13:13:0:0:64:64:5:59:5:59")
end
return old(noticeFrame, textString, colorInfo)
end
end
if IsAddOnLoaded("DBM-GUI") then
tinsert(UISpecialFrames, "DBM_GUI_OptionsFrame")
_G["DBM_GUI_OptionsFrame"]:SetTemplate("Transparent")
_G["DBM_GUI_OptionsFramePanelContainer"]:SetTemplate("Overlay")
_G["DBM_GUI_OptionsFrameTab1"]:ClearAllPoints()
_G["DBM_GUI_OptionsFrameTab1"]:SetPoint("TOPLEFT", _G["DBM_GUI_OptionsFrameList"], "TOPLEFT", 10, 27)
_G["DBM_GUI_OptionsFrameTab2"]:ClearAllPoints()
_G["DBM_GUI_OptionsFrameTab2"]:SetPoint("TOPLEFT", _G["DBM_GUI_OptionsFrameTab1"], "TOPRIGHT", 6, 0)
_G["DBM_GUI_OptionsFrameList"]:HookScript("OnShow", function(self) self:SetTemplate("Overlay") end)
_G["DBM_GUI_OptionsFrameDBMOptions"]:HookScript("OnShow", function(self) self:SetTemplate("Overlay") end)
_G["DBM_GUI_OptionsFrameHeader"]:SetTexture("")
_G["DBM_GUI_OptionsFrameHeader"]:ClearAllPoints()
_G["DBM_GUI_OptionsFrameHeader"]:SetPoint("TOP", DBM_GUI_OptionsFrame, 0, 7)
local dbmbskins = {
"DBM_GUI_OptionsFrameWebsiteButton",
"DBM_GUI_OptionsFrameOkay",
"DBM_GUI_OptionsFrameTab1",
"DBM_GUI_OptionsFrameTab2"
}
for i = 1, getn(dbmbskins) do
local buttons = _G[dbmbskins[i]]
if buttons and not buttons.overlay then
buttons:SkinButton(true)
end
end
end
end)
----------------------------------------------------------------------------------------
-- DBM settings(by ALZA and help from Affli)
----------------------------------------------------------------------------------------
function T.UploadDBM()
if IsAddOnLoaded("DBM-Core") then
DBM_UseDualProfile = false
DBM_AllSavedOptions["Default"].Enabled = true
DBM_AllSavedOptions["Default"].ShowMinimapButton = C.skins.minimap_buttons and true or false
DBM_AllSavedOptions["Default"].WarningIconLeft = false
DBM_AllSavedOptions["Default"].WarningIconRight = false
DBM_AllSavedOptions["Default"].WarningColors = {
{["b"] = T.color.b, ["g"] = T.color.g, ["r"] = T.color.r,},
{["b"] = T.color.b, ["g"] = T.color.g, ["r"] = T.color.r,},
{["b"] = T.color.b, ["g"] = T.color.g, ["r"] = T.color.r,},
{["b"] = T.color.b, ["g"] = T.color.g, ["r"] = T.color.r,},
}
DBM_AllSavedOptions["Default"].RangeFrameX = 244
DBM_AllSavedOptions["Default"].RangeFramePoint = "LEFT"
DBM_AllSavedOptions["Default"].ShowSpecialWarnings = true
DBM_AllSavedOptions["Default"].SpecialWarningFont = C.media.normal_font
DBM_AllSavedOptions["Default"].SpecialWarningFontSize = 50
DBM_AllSavedOptions["Default"].SpecialWarningX = 0
DBM_AllSavedOptions["Default"].SpecialWarningY = 75
DBT_AllPersistentOptions["Default"]["DBM"].StartColorR = T.color.r
DBT_AllPersistentOptions["Default"]["DBM"].StartColorG = T.color.g
DBT_AllPersistentOptions["Default"]["DBM"].StartColorB = T.color.b
DBT_AllPersistentOptions["Default"]["DBM"].EndColorR = T.color.r
DBT_AllPersistentOptions["Default"]["DBM"].EndColorG = T.color.g
DBT_AllPersistentOptions["Default"]["DBM"].EndColorB = T.color.b
DBT_AllPersistentOptions["Default"]["DBM"].Scale = 1
DBT_AllPersistentOptions["Default"]["DBM"].HugeScale = 1
DBT_AllPersistentOptions["Default"]["DBM"].BarXOffset = 0
DBT_AllPersistentOptions["Default"]["DBM"].BarYOffset = 7
DBT_AllPersistentOptions["Default"]["DBM"].Font = C.font.stylization_font
DBT_AllPersistentOptions["Default"]["DBM"].FontSize = C.font.stylization_font_size
DBT_AllPersistentOptions["Default"]["DBM"].Width = 189
DBT_AllPersistentOptions["Default"]["DBM"].TimerX = 143
DBT_AllPersistentOptions["Default"]["DBM"].TimerPoint = "BOTTOMLEFT"
DBT_AllPersistentOptions["Default"]["DBM"].FillUpBars = true
DBT_AllPersistentOptions["Default"]["DBM"].IconLeft = true
DBT_AllPersistentOptions["Default"]["DBM"].ExpandUpwards = true
DBT_AllPersistentOptions["Default"]["DBM"].Texture = C.media.texture
DBT_AllPersistentOptions["Default"]["DBM"].IconRight = false
DBT_AllPersistentOptions["Default"]["DBM"].HugeBarXOffset = 0
DBT_AllPersistentOptions["Default"]["DBM"].HugeBarsEnabled = false
DBT_AllPersistentOptions["Default"]["DBM"].HugeWidth = 189
DBT_AllPersistentOptions["Default"]["DBM"].HugeTimerX = 7
DBT_AllPersistentOptions["Default"]["DBM"].HugeTimerPoint = "CENTER"
DBT_AllPersistentOptions["Default"]["DBM"].HugeBarYOffset = 7
if C.actionbar.bottombars == 1 then
DBM_AllSavedOptions["Default"].RangeFrameY = 101
DBT_AllPersistentOptions["Default"]["DBM"].TimerY = 139
DBT_AllPersistentOptions["Default"]["DBM"].HugeTimerY = -136
elseif C.actionbar.bottombars == 2 then
DBM_AllSavedOptions["Default"].RangeFrameY = 129
DBT_AllPersistentOptions["Default"]["DBM"].TimerY = 167
DBT_AllPersistentOptions["Default"]["DBM"].HugeTimerY = -108
elseif C.actionbar.bottombars == 3 then
DBM_AllSavedOptions["Default"].RangeFrameY = 157
DBT_AllPersistentOptions["Default"]["DBM"].TimerY = 195
DBT_AllPersistentOptions["Default"]["DBM"].HugeTimerY = -80
end
DBM_AllSavedOptions["Default"].InstalledBars = C.actionbar.bottombars
end
end
StaticPopupDialogs.SETTINGS_DBM = {
text = L_POPUP_SETTINGS_DBM,
button1 = ACCEPT,
button2 = CANCEL,
OnAccept = function() T.UploadDBM() ReloadUI() end,
timeout = 0,
whileDead = 1,
hideOnEscape = true,
preferredIndex = 5,
}
----------------------------------------------------------------------------------------
-- On logon function
----------------------------------------------------------------------------------------
local OnLogon = CreateFrame("Frame")
OnLogon:RegisterEvent("PLAYER_ENTERING_WORLD")
OnLogon:SetScript("OnEvent", function(self)
self:UnregisterEvent("PLAYER_ENTERING_WORLD")
if IsAddOnLoaded("DBM-Core") then
if DBM_AllSavedOptions["Default"].InstalledBars ~= C.actionbar.bottombars then
StaticPopup_Show("SETTINGS_DBM")
end
end
end)
================================================
FILE: ShestakUI/Modules/Skins/Details.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.details ~= true or not IsAddOnLoaded("Details") then return end
----------------------------------------------------------------------------------------
-- Details skin
----------------------------------------------------------------------------------------
hooksecurefunc(_detalhes.gump, "CreateNewLine", function(_, instancia, index)
local bar = _G["DetailsBarra_"..instancia.meu_id.."_"..index]
local icon = _G["DetailsBarra_IconFrame_"..instancia.meu_id.."_"..index]
if bar and not bar.backdrop then
bar:CreateBackdrop("Defalt")
bar.backdrop:SetPoint("TOPLEFT", icon, -2, 2)
bar.bg = bar:CreateTexture(nil, "BORDER")
bar.bg:SetAllPoints(bar)
bar.bg:SetTexture(C.media.texture)
bar.bg:SetVertexColor(.6, .6, .6, 0.25)
end
local frame = _G["DetailsUpFrameInstance"..instancia.meu_id]
if not frame.b then
frame.b = CreateFrame("Frame", nil, frame:GetParent())
frame.b:SetTemplate("Overlay")
frame.b:SetPoint("TOPLEFT", frame, "TOPLEFT", -23, 2)
frame.b:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 34, 4)
frame.b:SetFrameLevel(frame:GetFrameLevel() - 1)
end
end)
hooksecurefunc(_detalhes, "SetFontOutline", function(_, fontString)
local fonte, size = fontString:GetFont()
if fonte == "Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Pixel.ttf" then
fontString:SetFont(fonte, size, "MONOCHROMEOUTLINE")
if fontString:GetShadowColor() then
fontString:SetShadowColor(0, 0, 0, 0)
end
end
end)
local skinTable = {
file = [[Interface\AddOns\Details\images\skins\classic_skin_v1.blp]],
author = "Shestak",
version = "1.0",
site = "unknown",
desc = "ShestakUI style skin.",
--micro frames
micro_frames = {
color = {1, 1, 1, 1},
font = "Hooge",
size = 8,
textymod = 1,
},
can_change_alpha_head = true,
icon_anchor_main = {-1, -5},
icon_anchor_plugins = {-7, -13},
icon_plugins_size = {19, 18},
--anchors:
icon_point_anchor = {-37, 0},
left_corner_anchor = {-107, 0},
right_corner_anchor = {96, 0},
icon_point_anchor_bottom = {-37, 12},
left_corner_anchor_bottom = {-107, 0},
right_corner_anchor_bottom = {96, 0},
icon_on_top = true,
icon_ignore_alpha = true,
icon_titletext_position = {3, 3},
--overwrites
instance_cprops = {
["show_statusbar"] = false,
["menu_icons_size"] = 0.850000023841858,
["color"] = {
0, -- [1]
0, -- [2]
0, -- [3]
0, -- [4]
},
["menu_anchor"] = {
16, -- [1]
6, -- [2]
["side"] = 2,
},
["bg_r"] = 1,
["hide_out_of_combat"] = false,
["following"] = {
["bar_color"] = {
1, -- [1]
1, -- [2]
1, -- [3]
},
["enabled"] = false,
["text_color"] = {
1, -- [1]
1, -- [2]
1, -- [3]
},
},
["color_buttons"] = {
1, -- [1]
1, -- [2]
1, -- [3]
1, -- [4]
},
["skin_custom"] = "",
["menu_anchor_down"] = {
16, -- [1]
-3, -- [2]
},
["micro_displays_locked"] = true,
["row_show_animation"] = {
["anim"] = "Fade",
["options"] = {
},
},
["tooltip"] = {
["n_abilities"] = 3,
["n_enemies"] = 3,
},
["total_bar"] = {
["enabled"] = false,
["only_in_group"] = true,
["icon"] = "Interface\\ICONS\\INV_Sigil_Thorim",
["color"] = {
1, -- [1]
1, -- [2]
1, -- [3]
},
},
["show_sidebars"] = false,
["instance_button_anchor"] = {
-27, -- [1]
1, -- [2]
},
["row_info"] = {
["spec_file"] = "Interface\\AddOns\\Details\\images\\spec_icons_normal",
["textL_outline"] = true,
["textR_outline"] = true,
["textL_outline_small"] = false,
["textR_outline_small"] = false,
["texture_highlight"] = "Interface\\FriendsFrame\\UI-FriendsList-Highlight",
["textR_show_data"] = {
true, -- [1]
true, -- [2]
true, -- [3]
},
["textL_enable_custom_text"] = false,
["fixed_text_color"] = {
1, -- [1]
1, -- [2]
1, -- [3]
},
["space"] = {
["right"] = 0,
["left"] = 0,
["between"] = 7,
},
["texture_background_class_color"] = false,
["start_after_icon"] = true,
["font_face_file"] = "Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Pixel.ttf",
["backdrop"] = {
["enabled"] = false,
["size"] = 12,
["color"] = {
1, -- [1]
1, -- [2]
1, -- [3]
1, -- [4]
},
["texture"] = "Details BarBorder 2",
},
["font_size"] = 8,
["height"] = 14,
["texture_file"] = "AddOns\\ShestakUI\\Media\\Textures\\Texture.tga",
["icon_file"] = "Interface\\AddOns\\Details\\images\\classes_small",
["textR_bracket"] = "(",
["textR_enable_custom_text"] = false,
["fixed_texture_color"] = {
0, -- [1]
0, -- [2]
0, -- [3]
},
["textL_show_number"] = true,
["textL_custom_text"] = "{data1}. {data3}{data2}",
["textR_custom_text"] = "{data1} ({data2}, {data3}%)",
["fixed_texture_background_color"] = {
0, -- [1]
0, -- [2]
0, -- [3]
0, -- [4]
},
["models"] = {
["upper_model"] = "Spells\\AcidBreath_SuperGreen.M2",
["lower_model"] = "World\\EXPANSION02\\DOODADS\\Coldarra\\COLDARRALOCUS.m2",
["upper_alpha"] = 0.5,
["lower_enabled"] = false,
["lower_alpha"] = 0.1,
["upper_enabled"] = false,
},
["textR_class_colors"] = false,
["texture_custom"] = "AddOns\\ShestakUI\\Media\\Textures\\Texture.tga",
["texture"] = "Smooth!",
["textL_class_colors"] = false,
["alpha"] = 1,
["no_icon"] = false,
["texture_background"] = "Smooth!",
["texture_background_file"] = "AddOns\\ShestakUI\\Media\\Textures\\Texture.tga",
["font_face"] = "Hooge",
["font_shadow"] = "OUTLINE",
["texture_class_colors"] = true,
["percent_type"] = 1,
["fast_ps_update"] = false,
["textR_separator"] = ",",
["use_spec_icons"] = true,
},
["plugins_grow_direction"] = 1,
["menu_alpha"] = {
["enabled"] = false,
["onleave"] = 1,
["ignorebars"] = false,
["iconstoo"] = true,
["onenter"] = 1,
},
["micro_displays_side"] = 2,
["grab_on_top"] = false,
["strata"] = "LOW",
["bars_grow_direction"] = 1,
["bg_alpha"] = 0,
["ignore_mass_showhide"] = false,
["hide_in_combat_alpha"] = 0,
["menu_icons"] = {
true, -- [1]
true, -- [2]
true, -- [3]
true, -- [4]
true, -- [5]
false, -- [6]
["space"] = -2,
["shadow"] = false,
},
["auto_hide_menu"] = {
["left"] = false,
["right"] = false,
},
["statusbar_info"] = {
["alpha"] = 0,
["overlay"] = {
0.333333333333333, -- [1]
0.333333333333333, -- [2]
0.333333333333333, -- [3]
},
},
["window_scale"] = 1,
["libwindow"] = {
["y"] = 90.9987335205078,
["x"] = -80.0020751953125,
["point"] = "BOTTOMRIGHT",
},
["backdrop_texture"] = "Details Ground",
["hide_icon"] = true,
["bg_b"] = 0.0941176470588235,
["toolbar_side"] = 1,
["bg_g"] = 0.0941176470588235,
["desaturated_menu"] = false,
["wallpaper"] = {
["enabled"] = false,
["texcoord"] = {
0, -- [1]
1, -- [2]
0, -- [3]
0.7, -- [4]
},
["overlay"] = {
1, -- [1]
1, -- [2]
1, -- [3]
1, -- [4]
},
["anchor"] = "all",
["height"] = 114.042518615723,
["alpha"] = 0.5,
["width"] = 283.000183105469,
},
["stretch_button_side"] = 1,
["attribute_text"] = {
["enabled"] = true,
["shadow"] = true,
["side"] = 1,
["text_size"] = 8,
["custom_text"] = "{name}",
["text_face"] = "Hooge",
["anchor"] = {
-19, -- [1]
9, -- [2]
},
["text_color"] = {
1, -- [1]
1, -- [2]
1, -- [3]
1, -- [4]
},
["enable_custom_text"] = false,
["show_timer"] = {
true, -- [1]
true, -- [2]
true, -- [3]
},
},
["bars_sort_direction"] = 1,
},
}
_detalhes.skins["Minimalistic v2"] = skinTable
local lower_instance = _detalhes:GetLowerInstanceNumber()
if lower_instance then
for i = lower_instance, #_detalhes.tabela_instancias do
local instance = Details:GetInstance(i)
if instance and instance.rows_fit_in_window then
for j = 1, instance.rows_fit_in_window do
local bar = _G["DetailsBarra_Statusbar_"..i.."_"..j]
local icon = _G["DetailsBarra_IconFrame_"..i.."_"..j]
if bar and not bar.backdrop then
bar:CreateBackdrop("Defalt")
bar.backdrop:SetPoint("TOPLEFT", icon, -2, 2)
bar.bg = bar:CreateTexture(nil, "BORDER")
bar.bg:SetAllPoints(bar)
bar.bg:SetTexture(C.media.texture)
bar.bg:SetVertexColor(.6, .6, .6, 0.25)
end
end
local frame = _G["DetailsUpFrameInstance"..i]
frame.b = CreateFrame("Frame", nil, frame:GetParent())
frame.b:SetTemplate("Overlay")
frame.b:SetPoint("TOPLEFT", frame, "TOPLEFT", -23, 2)
frame.b:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 34, 4)
frame.b:SetFrameLevel(frame:GetFrameLevel() - 1)
instance:ChangeSkin("Minimalistic v2")
end
end
end
================================================
FILE: ShestakUI/Modules/Skins/Dominos.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.dominos ~= true then return end
----------------------------------------------------------------------------------------
-- Dominos skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("Dominos") then return end
local function StyleNormalButton(self)
local name = self:GetName()
if name:match("ExtraActionButton") then return end
local button = self
local icon = _G[name.."Icon"]
local count = _G[name.."Count"]
local flash = _G[name.."Flash"]
local hotkey = _G[name.."HotKey"]
local border = _G[name.."Border"]
local btname = _G[name.."Name"]
local normal = _G[name.."NormalTexture"]
flash:SetTexture("")
button:SetNormalTexture(0)
if border then
border:Hide()
border = T.dummy
end
if count then
count:ClearAllPoints()
count:SetPoint("BOTTOMRIGHT", 0, 2)
count:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
count:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
end
if btname then
btname:ClearAllPoints()
btname:SetPoint("BOTTOM", 0, 0)
btname:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
btname:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
end
if hotkey then
hotkey:ClearAllPoints()
hotkey:SetPoint("TOPRIGHT", 0, 0)
hotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
hotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
hotkey:SetWidth(button:GetWidth() - 1)
end
if not button.isSkinned then
button:CreateBackdrop("Transparent")
button.backdrop:SetAllPoints()
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon:SetPoint("TOPLEFT", button, 2, -2)
icon:SetPoint("BOTTOMRIGHT", button, -2, 2)
button.isSkinned = true
end
if normal then
normal:ClearAllPoints()
normal:SetPoint("TOPLEFT")
normal:SetPoint("BOTTOMRIGHT")
end
end
local function StyleSmallButton(button, icon, name, hotkey, pet)
if not button then return end
local flash = _G[name.."Flash"]
button:StyleButton()
button:SetNormalTexture(0)
hooksecurefunc(button, "SetNormalTexture", function(self, texture)
if texture and texture ~= "" then
self:SetNormalTexture(0)
end
end)
if flash then
flash:SetColorTexture(0.8, 0.8, 0.8, 0.5)
flash:SetPoint("TOPLEFT", button, 2, -2)
flash:SetPoint("BOTTOMRIGHT", button, -2, 2)
end
if hotkey then
hotkey:ClearAllPoints()
hotkey:SetPoint("TOPRIGHT", 0, 0)
hotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
hotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
hotkey:SetWidth(button:GetWidth() - 1)
end
if not button.isSkinned then
button:CreateBackdrop("Transparent")
button.backdrop:SetAllPoints()
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon:ClearAllPoints()
icon:SetPoint("TOPLEFT", button, 2, -2)
icon:SetPoint("BOTTOMRIGHT", button, -2, 2)
if pet then
local autocast = button.AutoCastable
autocast:SetSize((button:GetWidth() * 2) - 10, (button:GetWidth() * 2) - 10)
autocast:ClearAllPoints()
autocast:SetPoint("CENTER", button, 0, 0)
local shine = _G[name.."Shine"]
shine:SetSize(button:GetWidth(), button:GetWidth())
local cooldown = _G[name.."Cooldown"]
cooldown:SetSize(button:GetWidth() - 2, button:GetWidth() - 2)
end
button.isSkinned = true
end
end
do
for i = 1, 168 do
if _G["DominosActionButton"..i] then
_G["DominosActionButton"..i]:StyleButton()
StyleNormalButton(_G["DominosActionButton"..i])
end
end
for i = 1, 12 do
_G["ActionButton"..i]:StyleButton()
_G["MultiBarBottomLeftButton"..i]:StyleButton()
_G["MultiBarBottomRightButton"..i]:StyleButton()
_G["MultiBarLeftButton"..i]:StyleButton()
_G["MultiBarRightButton"..i]:StyleButton()
StyleNormalButton(_G["ActionButton"..i])
StyleNormalButton(_G["MultiBarBottomLeftButton"..i])
StyleNormalButton(_G["MultiBarBottomRightButton"..i])
StyleNormalButton(_G["MultiBarLeftButton"..i])
StyleNormalButton(_G["MultiBarRightButton"..i])
end
for i = 1, 10 do
local name = "DominosStanceButton"..i
local button = _G[name]
local icon = _G[name.."Icon"]
local hotkey = _G[name.."HotKey"]
StyleSmallButton(button, icon, name, hotkey)
end
for i = 1, NUM_PET_ACTION_SLOTS do
local name = "DominosPetActionButton"..i
local button = _G[name]
local icon = _G[name.."Icon"]
local hotkey = _G[name.."HotKey"]
StyleSmallButton(button, icon, name, hotkey, true)
end
end
end)
================================================
FILE: ShestakUI/Modules/Skins/FlyoutButtonCustom.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.actionbar.enable ~= true or C.skins.flyout_button ~= true then return end
----------------------------------------------------------------------------------------
-- FlyoutButtonCustom skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("FlyoutButtonCustom") then return end
FlyoutButtonCustom_Settings.Highlight = false
FlyoutButtonCustom_Settings.ShowBorders = false
FlyoutButtonCustom_Settings.ButtonsScale = 1
FBC_BUTTON_PLACE_SIZE = C.actionbar.button_size
FBC_BUTTON_PLACE_OFFSET = C.actionbar.button_space
FBC_FRAME_OFFSET = C.actionbar.button_space - 7
local function CreateBorder(self)
local name = self:GetName()
local button = self
local icon = _G[name.."Icon"]
local border = _G[name.."Border"]
local count = _G[name.."Count"]
local btname = _G[name.."Name"]
local hotkey = _G[name.."HotKey"]
local normal = _G[name.."NormalTexture"]
button:StyleButton()
button:SetNormalTexture(0)
if border then
border:Hide()
border = T.dummy
end
count:ClearAllPoints()
count:SetPoint("BOTTOMRIGHT", 0, 2)
count:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
count:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
if btname then
if C.actionbar.macro == true then
btname:ClearAllPoints()
btname:SetPoint("BOTTOM", 0, 0)
btname:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
btname:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
--btname:SetWidth(C.actionbar.button_size - 1)
else
btname:Kill()
end
end
if C.actionbar.hotkey == true then
hotkey:ClearAllPoints()
hotkey:SetPoint("TOPRIGHT", 0, 0)
hotkey:SetFont(C.font.action_bars_font, C.font.action_bars_font_size, C.font.action_bars_font_style)
hotkey:SetShadowOffset(C.font.action_bars_font_shadow and 1 or 0, C.font.action_bars_font_shadow and -1 or 0)
hotkey:SetWidth(C.actionbar.button_size - 1)
hotkey.ClearAllPoints = T.dummy
hotkey.SetPoint = T.dummy
else
hotkey:Kill()
end
if not button.isSkinned then
if self:GetHeight() ~= C.actionbar.button_size and not InCombatLockdown() then
self:SetSize(C.actionbar.button_size, C.actionbar.button_size)
end
button:CreateBackdrop("Transparent")
button.backdrop:SetAllPoints()
if C.actionbar.classcolor_border == true then
button.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color))
end
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon:SetPoint("TOPLEFT", button, 2, -2)
icon:SetPoint("BOTTOMRIGHT", button, -2, 2)
button.isSkinned = true
end
if normal then
normal:ClearAllPoints()
normal:SetPoint("TOPLEFT")
normal:SetPoint("BOTTOMRIGHT")
end
end
hooksecurefunc(FlyoutListButton, "UpdateButton", CreateBorder)
hooksecurefunc(FlyoutListButton, "OnReceiveDrag", CreateBorder)
hooksecurefunc(FlyoutListButton, "UpdateTexture", CreateBorder)
end)
================================================
FILE: ShestakUI/Modules/Skins/MageNuggets.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.mage_nuggets ~= true then return end
----------------------------------------------------------------------------------------
-- MageNuggets skin /run ShowConfigFrames()
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("MageNuggets") then return end
MageNuggets.cooldownSize = 3
local sparks = {
"MageNugMBProcFrame_ProcBarSpark",
"MageNugFoFProcFrame_ProcBarSpark",
"MageNugImpactProcFrame_ProcBarSpark",
"MageNugBFProcFrame_ProcBarSpark",
"MageNugProcFrame_ProcBarSpark",
"MageNugLB1_Frame_BarSpark",
"MageNugLB2_Frame_BarSpark",
"MageNugLB3_Frame_BarSpark",
}
for i = 1, getn(sparks) do
local spark = _G[sparks[i]]
if spark then
spark:SetTexture(nil)
end
end
local icons = {
"MNPyromaniac_FrameTexture",
"MageNugMI_FrameTexture1",
"MageNugCauterize_FrameTexture1",
"MageNugMBProcFrameTexture",
"MageNugPolyFrameTexture",
"MageNugFoFProcFrameTexture",
"MageNugImpactProcFrameTexture",
"MageNugBFProcFrameTexture",
"MageNugProcFrameTexture",
"MageNugClearcast_FrameTexture",
"MageNugAB_FrameTexture",
"MageNugIgnite_FrameTexture",
"MageNugLB_FrameTextureIcon",
"MageNugMoonkin_Frame_Texture",
"MNmoonFire_FrameTexture",
"MNinsectSwarm_FrameTexture",
"MNstarSurge_FrameTexture",
"MageNugCD1_Frame_Texture",
"MageNugCD2_Frame_Texture",
"MageNugCD3_Frame_Texture",
"MageNugCD4_Frame_Texture",
"MageNugCD5_Frame_Texture",
"MageNugCD6_Frame_Texture"
}
for i = 1, getn(icons) do
local icon = _G[icons[i]]
if icon then
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
end
local checkboxes = {
"MageNugOptionsFrame_CheckButton2",
"MageNugOptionsFrame_CheckButton3",
"MageNugOptionsFrame_CheckButton6",
"MageNugOptionsFrame_CheckButton7",
"MageNugOptionsFrame_CheckButton8",
"MageNugOptionsFrame_CheckButton9",
"MageNugOptionsFrame_CheckButton11",
"MageNugOptionsFrame_CheckButton13",
"MageNugOptionsFrame_CheckButton14",
"MageNugOptionsFrame_CheckButtonCC",
"MageNugOptionsFrame_CheckButtonMG",
"MageNugOptionsFrame_CheckButtonMGcombat",
"MageNugOptionsFrame_IgniteCheckButton",
"MageNugOptionsFrame_ABcastCheckButton",
"CauterizeCheckButton",
"MageNugStatMonOptionFrame_CheckButton0",
"MageNugStatMonOptionFrame_CheckButton1",
"MageNugStatMonOptionFrame_CheckButton2",
"MageNugMsgOptionFrame_CheckButton",
"MageNugMsgOptionFrame_CheckButton2",
"MageNugMsgOptionFrame_CheckButton3",
"MageNugMsgOptionFrame_CheckButton4",
"MageNugMsgOptionFrame_CheckButton5",
"MageNugMsgOptionFrame_CheckButton6",
"MageNugMoonkinOptionFrame_CheckButton",
"MageNugMoonkinOptionFrame_CheckButton0",
"MageNugMoonkinOptionFrame_CheckButton1",
"MageNugMoonkinOptionFrame_CheckButton2",
"MageNugMoonkinOptionFrame_CheckButton3",
"MageNugMoonkinOptionFrame_CheckButtonMin",
"MageNugMoonkinOptionFrame_CheckButtonAnchor",
"MageNugMoonkinOptionFrame_ProcCheckButton",
"MageNugMoonkinOptionFrame_CastCheckButton",
"MageNugPriestOptionFrame_CheckButton0",
"MageNugPriestOptionFrame_CheckButton2",
"MageNugPriestOptionFrame_CheckButton3",
"MageNugSoundOptionFrame_MICheckButton",
"MageNugSoundOptionFrame_ProcCheckButton",
"MageNugSoundOptionFrame_PolyCheckButton",
"MageNugSoundOptionFrame_HotStreakCheckButton",
"MageNugSoundOptionFrame_ImpactCheckButton",
"MageNugSoundOptionFrame_FoFCheckButton",
"MageNugSoundOptionFrame_BrainFreezeCheckButton",
"MageNugSoundOptionFrame_CauterizeCheckButton",
"MageNugSoundOptionFrame_TimeWarpCheckButton",
"MageNugSoundOptionFrame_ABCheckButton",
"MageNugOption2Frame_MinimapCheckButton",
"MageNugOption2Frame_CameraCheckButton",
"MageNugOption2Frame_ConsoleTextCheckButton",
"MageNugOption2Frame_LockFramesCheckButton",
"MageNugOption2Frame_CheckButtonTT",
"MageNugOption2Frame_ClickThruCheckButton",
"MageNugOption2Frame_SimpleUICheckButton",
"MageNugCooldownFrame_apButton",
"MageNugCooldownFrame_cdButton",
"MageNugCooldownFrame_bwButton",
"MageNugCooldownFrame_cbButton",
"MageNugCooldownFrame_csButton",
"MageNugCooldownFrame_dfButton",
"MageNugCooldownFrame_dbButton",
"MageNugCooldownFrame_mwButton",
"MageNugCooldownFrame_frzButton",
"MageNugCooldownFrame_msButton",
"MageNugCooldownFrame_ibrButton",
"MageNugCooldownFrame_starfallButton",
"MageNugCooldownFrame_evoButton",
"MageNugCooldownFrame_treantButton",
"MageNugCooldownFrame_ivButton",
"MageNugCooldownFrame_blinkButton",
"MageNugCooldownFrame_miButton"
}
for i = 1, getn(checkboxes) do
local checkbox = _G[checkboxes[i]]
if checkbox then
T.SkinCheckBox(checkbox)
end
end
local sliders = {
"MageNugOptionsFrame_Slider1",
"MageNugOptionsFrame_Slider2",
"MageNugOptionsFrame_Slider3",
"MageNugOptionsFrame_Slider4",
"MageNugOptionsFrame_Slider5",
"MageNugStatMonOptionFrame_SPSizeSlider",
"MageNugStatMonOptionFrame_BorderSlider",
"MageNugStatMonOptionFrame_TransparencySlider",
"MageNugMoonkinOptionFrame_Slider",
"MageNugMoonkinOptionFrame_Slider1",
"MageNugCooldownFrame_Slider1"
}
for i = 1, getn(sliders) do
local slider = _G[sliders[i]]
if slider then
T.SkinSlider(slider)
slider:SetFrameLevel(slider:GetFrameLevel() + 2)
end
end
local editboxs = {
"SlowFallMsgEditBox",
"SlowFallMsgEditBox2",
"SlowFallMsgEditBox3",
"FocMagNotifyEditBox",
"FocMagNotifyEditBox2",
"FocMagNotifyEditBox3",
"FocMagThankEditBox",
"FocMagThankEditBox2",
"InnervThankEditBox",
"InnervThankEditBox2",
"PowerInfusionEditBox",
"DarkIntentEditBox",
"MageNugMoonkinOptionFrame_SoundEditBox",
"MageNugMoonkinOptionFrame_InnervateEditBox",
"MageNugPriestOptionFrame_EditBox1",
"MageNugPriestOptionFrame_EditBox2",
"MageNugPriestOptionFrame_EditBox3",
"MageNugSoundOptionFrame_MISoundEditBox",
"MageNugSoundOptionFrame_ProcSoundEditBox",
"MageNugSoundOptionFrame_PolySoundEditBox",
"MageNugSoundOptionFrame_HotStreakSoundEditBox",
"MageNugSoundOptionFrame_ImpactSoundEditBox",
"MageNugSoundOptionFrame_FoFSoundEditBox",
"MageNugSoundOptionFrame_BrainFreezeSoundEditBox",
"MageNugSoundOptionFrame_CauterizeSoundEditBox",
"MageNugSoundOptionFrame_ABSoundEditBox",
"MageNugSoundOptionFrame_TimeWarpSoundEditBox"
}
for i = 1, getn(editboxs) do
local editbox = _G[editboxs[i]]
if editbox then
T.SkinEditBox(editbox, nil, 14)
end
end
local backdrops = {
"MNPyromaniac_Frame",
"MageNugMBProcFrame",
"MageNugPolyFrame",
"MageNugFoFProcFrame",
"MageNugImpactProcFrame",
"MageNugBFProcFrame",
"MageNugProcFrame",
"MageNugCauterizeFrame",
"MNabCast_Frame",
"MageNugLB1_Frame",
"MageNugLB2_Frame",
"MageNugLB3_Frame",
"MageNugSSProcFrame"
}
for i = 1, getn(backdrops) do
local backdrop = _G[backdrops[i]]
if backdrop then
backdrop:SetBackdrop(nil)
end
end
local texts = {
"MageNugMI_Frame_MIText",
"MageNugMI_Frame_MIText1",
"MageNugCauterize_Frame_Text",
"MageNugCauterize_Frame_Text1",
"MageNugMBProcFrameText",
"MageNugMBProcFrameText2",
"MageNugPolyFrameText",
"MageNugPolyFrameTimerText",
"MageNugFoFProcFrameCountText",
"MageNugFoFProcFrameText",
"MageNugFoFProcFrameText2",
"MageNugImpactProcFrameText",
"MageNugImpactProcFrameText2",
"MageNugBFProcFrameText",
"MageNugBFProcFrameText2",
"MageNugProcFrameText",
"MageNugProcFrameText2",
"MageNugClearcast_FrameText",
"MageNugClearcast_FrameText2",
"MageNugAB_FrameText",
"MageNugAB_FrameText1",
"MageNugAB_FrameText2",
"MNabCast_FrameText",
"MageNugIgnite_FrameText2",
"MageNugLB1_Frame_Text",
"MageNugLB1_Frame_Text2",
"MageNugLB2_Frame_Text",
"MageNugLB2_Frame_Text2",
"MageNugLB3_Frame_Text",
"MageNugLB3_Frame_Text2",
"MageNugSP_FrameText",
"MNSpellSteal_FrameTitleText",
"MNSpellSteal_FrameBuffText",
"MNSpellStealFocus_FrameTitleText",
"MNSpellStealFocus_FrameBuffText",
"MageNugMoonkin_Frame_Text",
"MNmoonFire_FrameText",
"MNinsectSwarm_FrameText",
"MNstarSurge_FrameText",
"MageNugCD_Frame_Text",
"MageNugCD1_Frame_Text",
"MageNugCD2_Frame_Text",
"MageNugCD3_Frame_Text",
"MageNugCD4_Frame_Text",
"MageNugCD5_Frame_Text",
"MageNugCD6_Frame_Text",
"MageNugCD1_Frame_Text2",
"MageNugCD2_Frame_Text2",
"MageNugCD3_Frame_Text2",
"MageNugCD4_Frame_Text2",
"MageNugCD5_Frame_Text2",
"MageNugCD6_Frame_Text2",
}
for i = 1, getn(texts) do
local text = _G[texts[i]]
if text then
text:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
text:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
end
local bars = {
"MageNugCauterize_Frame_Bar",
"MageNugMBProcFrame_ProcBar",
"MageNugPolyFrame_Bar",
"MageNugFoFProcFrame_ProcBar",
"MageNugImpactProcFrame_ProcBar",
"MageNugBFProcFrame_ProcBar",
"MageNugProcFrame_ProcBar",
"MageNugClearcast_Frame_Bar",
"MageNugAB_Frame_ABBar",
"MageNugIgnite_Frame_Bar",
"MageNugLB1_Frame_Bar",
"MageNugLB2_Frame_Bar",
"MageNugLB3_Frame_Bar",
"MageNugMoonkin_Frame_Bar",
"MageNugMI_Frame_MiBar",
"MageNugCD1_Frame_Bar",
"MageNugCD2_Frame_Bar",
"MageNugCD3_Frame_Bar",
"MageNugCD4_Frame_Bar",
"MageNugCD5_Frame_Bar",
"MageNugCD6_Frame_Bar",
}
for i = 1, getn(bars) do
local bar = _G[bars[i]]
if bar then
bar:SetStatusBarTexture(C.media.texture)
end
end
-- MageNugMI_Frame
MageNugMI_FrameTexture1:SetSize(21, 21)
MageNugMI_Frame:CreateBackdrop("Default")
MageNugMI_Frame.backdrop:SetPoint("TOPLEFT", MageNugMI_FrameTexture1, -2, 2)
MageNugMI_Frame.backdrop:SetPoint("BOTTOMRIGHT", MageNugMI_FrameTexture1, 2, -2)
MageNugMI_Frame_MiBar:SetWidth(186)
MageNugMI_Frame_MiBar:SetHeight(15)
MageNugMI_Frame_MiBar:CreateBackdrop("Default")
MageNugMI_Frame_MiBar:ClearAllPoints()
MageNugMI_Frame_MiBar:SetPoint("BOTTOMLEFT", MageNugMI_FrameTexture1, "BOTTOMRIGHT", 7, 0)
MageNugMI_Frame_MIText:ClearAllPoints()
MageNugMI_Frame_MIText:SetPoint("LEFT", MageNugMI_Frame_MiBar, "LEFT", 2, 0)
MageNugMI_Frame_MIText1:ClearAllPoints()
MageNugMI_Frame_MIText1:SetPoint("RIGHT", MageNugMI_Frame_MiBar, "RIGHT", 0, 0)
-- MageNugCauterize_Frame
MageNugCauterize_FrameTexture1:SetSize(21, 21)
MageNugCauterize_Frame:CreateBackdrop("Default")
MageNugCauterize_Frame.backdrop:SetPoint("TOPLEFT", MageNugCauterize_FrameTexture1, -2, 2)
MageNugCauterize_Frame.backdrop:SetPoint("BOTTOMRIGHT", MageNugCauterize_FrameTexture1, 2, -2)
MageNugCauterize_Frame_Bar:SetWidth(186)
MageNugCauterize_Frame_Bar:SetHeight(15)
MageNugCauterize_Frame_Bar:CreateBackdrop("Default")
MageNugCauterize_Frame_Bar:ClearAllPoints()
MageNugCauterize_Frame_Bar:SetPoint("BOTTOMLEFT", MageNugCauterize_FrameTexture1, "BOTTOMRIGHT", 7, 0)
MageNugCauterize_Frame_Text:ClearAllPoints()
MageNugCauterize_Frame_Text:SetPoint("LEFT", MageNugCauterize_Frame_Bar, "LEFT", 2, 0)
MageNugCauterize_Frame_Text1:ClearAllPoints()
MageNugCauterize_Frame_Text1:SetPoint("RIGHT", MageNugCauterize_Frame_Bar, "RIGHT", 0, 0)
-- MageNugMBProcFrame
MageNugMBProcFrameTextureBorder:Hide()
MageNugMBProcFrame:CreateBackdrop("Default")
MageNugMBProcFrame.backdrop:SetPoint("TOPLEFT", MageNugMBProcFrameTexture, -2, 2)
MageNugMBProcFrame.backdrop:SetPoint("BOTTOMRIGHT", MageNugMBProcFrameTexture, 2, -2)
MageNugMBProcFrame_ProcBar:SetFrameStrata("BACKGROUND")
MageNugMBProcFrame_ProcBar:SetWidth(186)
MageNugMBProcFrame_ProcBar:SetHeight(15)
MageNugMBProcFrame_ProcBar:CreateBackdrop("Default")
MageNugMBProcFrame_ProcBar:ClearAllPoints()
MageNugMBProcFrame_ProcBar:SetPoint("BOTTOMLEFT", MageNugMBProcFrameTexture, "BOTTOMRIGHT", 7, 0)
MageNugMBProcFrameText:ClearAllPoints()
MageNugMBProcFrameText:SetPoint("LEFT", MageNugMBProcFrame_ProcBar, "LEFT", 2, 0)
MageNugMBProcFrameText2:ClearAllPoints()
MageNugMBProcFrameText2:SetPoint("RIGHT", MageNugMBProcFrame_ProcBar, "RIGHT", 0, 0)
-- MageNugPolyFrame
MageNugPolyFrameTextureBorder:Hide()
MageNugPolyFrame:CreateBackdrop("Default")
MageNugPolyFrame.backdrop:SetPoint("TOPLEFT", MageNugPolyFrameTexture, -2, 2)
MageNugPolyFrame.backdrop:SetPoint("BOTTOMRIGHT", MageNugPolyFrameTexture, 2, -2)
MageNugPolyFrame_Bar:SetFrameStrata("BACKGROUND")
MageNugPolyFrame_Bar:SetWidth(186)
MageNugPolyFrame_Bar:SetHeight(15)
MageNugPolyFrame_Bar:CreateBackdrop("Default")
MageNugPolyFrame_Bar:ClearAllPoints()
MageNugPolyFrame_Bar:SetPoint("BOTTOMLEFT", MageNugPolyFrameTexture, "BOTTOMRIGHT", 7, 0)
MageNugPolyFrameText:ClearAllPoints()
MageNugPolyFrameText:SetPoint("LEFT", MageNugPolyFrame_Bar, "LEFT", 2, 0)
MageNugPolyFrameTimerText:ClearAllPoints()
MageNugPolyFrameTimerText:SetPoint("RIGHT", MageNugPolyFrame_Bar, "RIGHT", 0, 0)
-- MageNugFoFProcFrame
MageNugFoFProcFrameTextureBorder:Hide()
MageNugFoFProcFrame:CreateBackdrop("Default")
MageNugFoFProcFrame.backdrop:SetPoint("TOPLEFT", MageNugFoFProcFrameTexture, -2, 2)
MageNugFoFProcFrame.backdrop:SetPoint("BOTTOMRIGHT", MageNugFoFProcFrameTexture, 2, -2)
MageNugFoFProcFrame_ProcBar:SetFrameStrata("BACKGROUND")
MageNugFoFProcFrame_ProcBar:SetWidth(186)
MageNugFoFProcFrame_ProcBar:SetHeight(15)
MageNugFoFProcFrame_ProcBar:CreateBackdrop("Default")
MageNugFoFProcFrame_ProcBar:ClearAllPoints()
MageNugFoFProcFrame_ProcBar:SetPoint("BOTTOMLEFT", MageNugFoFProcFrameTexture, "BOTTOMRIGHT", 7, 0)
MageNugFoFProcFrameCountText:ClearAllPoints()
MageNugFoFProcFrameCountText:SetPoint("BOTTOMRIGHT", MageNugFoFProcFrameTexture, "BOTTOMRIGHT", -2, 2)
MageNugFoFProcFrameText:ClearAllPoints()
MageNugFoFProcFrameText:SetPoint("LEFT", MageNugFoFProcFrame_ProcBar, "LEFT", 2, 0)
MageNugFoFProcFrameText2:ClearAllPoints()
MageNugFoFProcFrameText2:SetPoint("RIGHT", MageNugFoFProcFrame_ProcBar, "RIGHT", 0, 0)
-- MageNugImpactProcFrame
MageNugImpactProcFrameTexture:SetSize(21, 21)
MageNugImpactProcFrame:CreateBackdrop("Default")
MageNugImpactProcFrame.backdrop:SetPoint("TOPLEFT", MageNugImpactProcFrameTexture, -2, 2)
MageNugImpactProcFrame.backdrop:SetPoint("BOTTOMRIGHT", MageNugImpactProcFrameTexture, 2, -2)
MageNugImpactProcFrame_ProcBar:SetFrameStrata("BACKGROUND")
MageNugImpactProcFrame_ProcBar:SetWidth(186)
MageNugImpactProcFrame_ProcBar:SetHeight(15)
MageNugImpactProcFrame_ProcBar:CreateBackdrop("Default")
MageNugImpactProcFrame_ProcBar:ClearAllPoints()
MageNugImpactProcFrame_ProcBar:SetPoint("BOTTOMLEFT", MageNugImpactProcFrameTexture, "BOTTOMRIGHT", 7, 0)
MageNugImpactProcFrameText:ClearAllPoints()
MageNugImpactProcFrameText:SetPoint("LEFT", MageNugImpactProcFrame_ProcBar, "LEFT", 2, 0)
MageNugImpactProcFrameText2:ClearAllPoints()
MageNugImpactProcFrameText2:SetPoint("RIGHT", MageNugImpactProcFrame_ProcBar, "RIGHT", 0, 0)
-- MageNugBFProcFrame
MageNugBFProcFrameTextureBorder:Hide()
MageNugBFProcFrame:CreateBackdrop("Default")
MageNugBFProcFrame.backdrop:SetPoint("TOPLEFT", MageNugBFProcFrameTexture, -2, 2)
MageNugBFProcFrame.backdrop:SetPoint("BOTTOMRIGHT", MageNugBFProcFrameTexture, 2, -2)
MageNugBFProcFrame_ProcBar:SetFrameStrata("BACKGROUND")
MageNugBFProcFrame_ProcBar:SetWidth(186)
MageNugBFProcFrame_ProcBar:SetHeight(15)
MageNugBFProcFrame_ProcBar:CreateBackdrop("Default")
MageNugBFProcFrame_ProcBar:ClearAllPoints()
MageNugBFProcFrame_ProcBar:SetPoint("BOTTOMLEFT", MageNugBFProcFrameTexture, "BOTTOMRIGHT", 7, 0)
MageNugBFProcFrameText:ClearAllPoints()
MageNugBFProcFrameText:SetPoint("LEFT", MageNugBFProcFrame_ProcBar, "LEFT", 2, 0)
MageNugBFProcFrameText2:ClearAllPoints()
MageNugBFProcFrameText2:SetPoint("RIGHT", MageNugBFProcFrame_ProcBar, "RIGHT", 0, 0)
-- MageNugProcFrame
MageNugProcFrameTextureBorder:Hide()
MageNugProcFrame:CreateBackdrop("Default")
MageNugProcFrame.backdrop:SetPoint("TOPLEFT", MageNugProcFrameTexture, -2, 2)
MageNugProcFrame.backdrop:SetPoint("BOTTOMRIGHT", MageNugProcFrameTexture, 2, -2)
MageNugProcFrame_ProcBar:SetFrameStrata("BACKGROUND")
MageNugProcFrame_ProcBar:SetWidth(186)
MageNugProcFrame_ProcBar:SetHeight(15)
MageNugProcFrame_ProcBar:CreateBackdrop("Default")
MageNugProcFrame_ProcBar:ClearAllPoints()
MageNugProcFrame_ProcBar:SetPoint("BOTTOMLEFT", MageNugProcFrameTexture, "BOTTOMRIGHT", 7, 0)
MageNugProcFrameText:ClearAllPoints()
MageNugProcFrameText:SetPoint("LEFT", MageNugProcFrame_ProcBar, "LEFT", 2, 0)
MageNugProcFrameText2:ClearAllPoints()
MageNugProcFrameText2:SetPoint("RIGHT", MageNugProcFrame_ProcBar, "RIGHT", 0, 0)
-- MageNugCauterizeFrame
MageNugCauterizeFrame:CreateBackdrop("Transparent")
MageNugCauterizeFrame.backdrop:SetPoint("TOPLEFT", MageNugCauterizeFrame, -2, -3)
MageNugCauterizeFrame.backdrop:SetPoint("BOTTOMRIGHT", MageNugCauterizeFrame, 2, 3)
for i = 1, MageNugCauterizeFrame:GetNumRegions() do
local region = select(i, MageNugCauterizeFrame:GetRegions())
if region:GetObjectType() == "Texture" then
region:SetSize(30, 30)
region:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
if region:GetObjectType() == "FontString" then
region:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
region:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
end
-- MageNugClearcast_Frame
MageNugClearcast_Frame:SetTemplate("Default")
MageNugClearcast_FrameTexture:SetDrawLayer("ARTWORK")
MageNugClearcast_FrameTexture:ClearAllPoints()
MageNugClearcast_FrameTexture:SetPoint("TOPLEFT", 2, -2)
MageNugClearcast_FrameTexture:SetPoint("BOTTOMRIGHT", -2, 2)
-- MageNugAB_Frame
MageNugAB_Frame:SetTemplate("Default")
MageNugAB_FrameTexture:SetDrawLayer("ARTWORK")
MageNugAB_FrameTexture:ClearAllPoints()
MageNugAB_FrameTexture:SetPoint("TOPLEFT", 2, -2)
MageNugAB_FrameTexture:SetPoint("BOTTOMRIGHT", -2, 2)
-- MageNugIgnite_Frame
MageNugIgnite_Frame:SetTemplate("Default")
MageNugIgnite_FrameTexture:SetDrawLayer("ARTWORK")
MageNugIgnite_FrameTexture:ClearAllPoints()
MageNugIgnite_FrameTexture:SetPoint("TOPLEFT", 2, -2)
MageNugIgnite_FrameTexture:SetPoint("BOTTOMRIGHT", -2, 2)
MageNugIgnite_FrameText:SetFont(C.font.stylization_font, C.font.stylization_font_size * 2, C.font.stylization_font_style)
MageNugIgnite_FrameText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
MageNugIgnite_FrameText:ClearAllPoints()
MageNugIgnite_FrameText:SetPoint("CENTER", MageNugIgnite_Frame, "CENTER", 0, 0)
-- MageNugLB_Frame
MageNugLB_Frame:SetTemplate("Default")
MageNugLB_Frame:SetSize(21, 21)
MageNugLB_FrameTexture:SetTexture()
MageNugLB_FrameTextureBorder:SetTexture()
MageNugLB_FrameTextureTitle:SetTexture()
MageNugLB_Frame_Text:SetFont(C.font.stylization_font, C.font.stylization_font_size * 2, C.font.stylization_font_style)
MageNugLB_Frame_Text:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
MageNugLB_Frame_Text:ClearAllPoints()
MageNugLB_Frame_Text:SetPoint("CENTER", MageNugLB_Frame, "CENTER", 0, 0)
-- MageNugLB1_Frame
MageNugLB1_Frame:SetFrameStrata("BACKGROUND")
MageNugLB1_Frame:CreateBackdrop("Default")
MageNugLB1_Frame.backdrop:SetPoint("TOPLEFT", MageNugLB1_Frame, -2, 0)
MageNugLB1_Frame.backdrop:SetPoint("BOTTOMRIGHT", MageNugLB1_Frame, 2, -1)
MageNugLB1_Frame:ClearAllPoints()
MageNugLB1_Frame:SetPoint("BOTTOMLEFT", MageNugLB_Frame, "BOTTOMRIGHT", 5, 1)
MageNugLB1_Frame_Text:SetParent(MageNugLB1_Frame_Bar)
MageNugLB1_Frame_Text:ClearAllPoints()
MageNugLB1_Frame_Text:SetPoint("RIGHT", MageNugLB1_Frame, "RIGHT", 0, 0)
MageNugLB1_Frame_Text2:SetParent(MageNugLB1_Frame_Bar)
MageNugLB1_Frame_Text2:ClearAllPoints()
MageNugLB1_Frame_Text2:SetPoint("LEFT", MageNugLB1_Frame, "LEFT", 2, 0)
-- MageNugLB2_Frame
MageNugLB2_Frame:SetFrameStrata("BACKGROUND")
MageNugLB2_Frame:CreateBackdrop("Default")
MageNugLB2_Frame.backdrop:SetPoint("TOPLEFT", MageNugLB2_Frame, -2, 0)
MageNugLB2_Frame.backdrop:SetPoint("BOTTOMRIGHT", MageNugLB2_Frame, 2, -1)
MageNugLB2_Frame:ClearAllPoints()
MageNugLB2_Frame:SetPoint("BOTTOM", MageNugLB1_Frame, "TOP", 0, 6)
MageNugLB2_Frame_Text:SetParent(MageNugLB2_Frame_Bar)
MageNugLB2_Frame_Text:ClearAllPoints()
MageNugLB2_Frame_Text:SetPoint("RIGHT", MageNugLB2_Frame, "RIGHT", 0, 0)
MageNugLB2_Frame_Text2:SetParent(MageNugLB2_Frame_Bar)
MageNugLB2_Frame_Text2:ClearAllPoints()
MageNugLB2_Frame_Text2:SetPoint("LEFT", MageNugLB2_Frame, "LEFT", 2, 0)
-- MageNugLB3_Frame
MageNugLB3_Frame:SetFrameStrata("BACKGROUND")
MageNugLB3_Frame:CreateBackdrop("Default")
MageNugLB3_Frame.backdrop:SetPoint("TOPLEFT", MageNugLB3_Frame, -2, 0)
MageNugLB3_Frame.backdrop:SetPoint("BOTTOMRIGHT", MageNugLB3_Frame, 2, -1)
MageNugLB3_Frame:ClearAllPoints()
MageNugLB3_Frame:SetPoint("BOTTOM", MageNugLB2_Frame, "TOP", 0, 6)
MageNugLB3_Frame_Text:SetParent(MageNugLB3_Frame_Bar)
MageNugLB3_Frame_Text:ClearAllPoints()
MageNugLB3_Frame_Text:SetPoint("RIGHT", MageNugLB3_Frame, "RIGHT", 0, 0)
MageNugLB3_Frame_Text2:SetParent(MageNugLB3_Frame_Bar)
MageNugLB3_Frame_Text2:ClearAllPoints()
MageNugLB3_Frame_Text2:SetPoint("LEFT", MageNugLB3_Frame, "LEFT", 2, 0)
-- MageNugSP_Frame
MageNugSP_Frame:SetTemplate("Transparent")
-- MNSpellSteal_Frame
MNSpellSteal_Frame:SetTemplate("Transparent")
-- MNSpellStealFocus_Frame
MNSpellStealFocus_Frame:SetTemplate("Transparent")
-- MageNugMoonkin_Frame
MageNugMoonkin_Frame:CreateBackdrop("Default")
MageNugMoonkin_Frame.backdrop:SetPoint("TOPLEFT", MageNugMoonkin_Frame_Texture, -2, 2)
MageNugMoonkin_Frame.backdrop:SetPoint("BOTTOMRIGHT", MageNugMoonkin_Frame_Texture, 2, -2)
MageNugMoonkin_Frame_Bar:CreateBackdrop("Default")
MageNugMoonkin_Frame_Bar:ClearAllPoints()
MageNugMoonkin_Frame_Bar:SetPoint("BOTTOMLEFT", MageNugMoonkin_Frame_Texture, "BOTTOMRIGHT", 7, 0)
MageNugMoonkin_Frame_Bar:SetSize(80, 15)
-- MNmoonFire_Frame
MNmoonFire_Frame:SetTemplate("Default")
MNmoonFire_Frame:ClearAllPoints()
MNmoonFire_Frame:SetPoint("BOTTOMLEFT", MageNugMoonkin_Frame_Bar, "TOPLEFT", -2, 5)
MNmoonFire_FrameTexture:ClearAllPoints()
MNmoonFire_FrameTexture:SetPoint("TOPLEFT", 2, -2)
MNmoonFire_FrameTexture:SetPoint("BOTTOMRIGHT", -2, 2)
MNmoonFire_FrameText:ClearAllPoints()
MNmoonFire_FrameText:SetPoint("CENTER", MNmoonFire_Frame, 0, 0)
-- MNinsectSwarm_Frame
MNinsectSwarm_Frame:SetTemplate("Default")
MNinsectSwarm_Frame:ClearAllPoints()
MNinsectSwarm_Frame:SetPoint("LEFT", MNmoonFire_Frame, "RIGHT", 3, 0)
MNinsectSwarm_FrameTexture:ClearAllPoints()
MNinsectSwarm_FrameTexture:SetPoint("TOPLEFT", 2, -2)
MNinsectSwarm_FrameTexture:SetPoint("BOTTOMRIGHT", -2, 2)
MNinsectSwarm_FrameText:ClearAllPoints()
MNinsectSwarm_FrameText:SetPoint("CENTER", MNinsectSwarm_Frame, 0, 0)
-- MNstarSurge_Frame
MNstarSurge_Frame:SetTemplate("Default")
MNstarSurge_Frame:ClearAllPoints()
MNstarSurge_Frame:SetPoint("LEFT", MNinsectSwarm_Frame, "RIGHT", 3, 0)
MNstarSurge_FrameTexture:ClearAllPoints()
MNstarSurge_FrameTexture:SetPoint("TOPLEFT", 2, -2)
MNstarSurge_FrameTexture:SetPoint("BOTTOMRIGHT", -2, 2)
MNstarSurge_FrameText:ClearAllPoints()
MNstarSurge_FrameText:SetPoint("CENTER", MNstarSurge_Frame, 0, 0)
-- MageNugCD_Frame
for i = 1, 6 do
local cooldown = _G["MageNugCD"..i.."_Frame"]
local text1 = _G["MageNugCD"..i.."_Frame_Text"]
local text2 = _G["MageNugCD"..i.."_Frame_Text2"]
if cooldown then
cooldown:CreateBackdrop("Default")
cooldown.backdrop:SetFrameStrata("BACKGROUND")
cooldown.backdrop:SetPoint("TOPLEFT", cooldown, -2, 2)
cooldown.backdrop:SetPoint("BOTTOMRIGHT", cooldown, 14, -2)
end
if text1 then
text1:ClearAllPoints()
text1:SetPoint("LEFT", cooldown, "LEFT", 15, 0)
end
if text2 then
text2:ClearAllPoints()
text2:SetPoint("RIGHT", cooldown, "RIGHT", 14, 0)
end
if i == 1 then
cooldown:SetPoint("TOP", MageNugCD_Frame, "TOP", 0, -11)
else
cooldown:SetPoint("TOP", _G["MageNugCD"..(i-1).."_Frame"], "BOTTOM", 0, -7)
end
end
-- MageNugAlliFrame
MageNugAlliFrame:SetTemplate("Transparent")
MageNugAlliFrameClose:SkinButton()
MageNugAlliFrameShowOptions:SkinButton()
MageNugAlliFrameText:SetFont(C.media.normal_font, 13, "")
MageNugAlliFrameText2:SetFont(C.media.normal_font, 13, "")
MageNugHordeFrameText:SetFont(C.media.normal_font, 13, "")
MageNugHordeFrameText2:SetFont(C.media.normal_font, 13, "")
local portals = {
"MageNugAlliFramePortDal",
"MageNugAlliFramePortShat",
"MageNugAlliFramePortOrg",
"MageNugAlliFramePortUC",
"MageNugAlliFramePortTB",
"MageNugAlliFramePortSMC",
"MageNugAlliFramePortStonard",
"MageNugAlliFramePortTol",
"MageNugAlliFramePortIF",
"MageNugAlliFramePortSW",
"MageNugAlliFramePortDarn",
"MageNugAlliFramePortExo",
"MageNugAlliFramePortTheramore",
"MageNugAlliFrameTeleDal",
"MageNugAlliFrameTeleShat",
"MageNugAlliFrameTeleOrg",
"MageNugAlliFrameTeleUC",
"MageNugAlliFrameTeleTB",
"MageNugAlliFrameTeleSMC",
"MageNugAlliFrameTeleStonard",
"MageNugAlliFrameTeleTol",
"MageNugAlliFrameTeleIF",
"MageNugAlliFrameTeleSW",
"MageNugAlliFrameTeleDarn",
"MageNugAlliFrameTeleExo",
"MageNugAlliFrameTeleTheramore",
"MageNugAlliFrameHearth"
}
for i = 1, getn(portals) do
local portal = _G[portals[i]]
local texture = _G[portals[i].."TelDalTexture"]
if portal then
portal:SetTemplate("Default")
portal:StyleButton()
end
if texture then
texture:SetDrawLayer("ARTWORK")
texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)
texture:ClearAllPoints()
texture:SetPoint("TOPLEFT", 2, -2)
texture:SetPoint("BOTTOMRIGHT", -2, 2)
end
end
-- Options
MageNugStatMonOptionFrameBlackBackdropButton:SkinButton()
MageNugMoonkinOptionFrame_Button:SkinButton()
MageNugOption2FrameButton1:SkinButton()
MageNugOption2FrameButton2:SkinButton()
MageNugOption2FrameButton3:SkinButton()
end)
================================================
FILE: ShestakUI/Modules/Skins/MyRolePlay.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.my_role_play ~= true or not IsAddOnLoaded("MyRolePlay") then return end
----------------------------------------------------------------------------------------
-- MyRolePlay skin
----------------------------------------------------------------------------------------
hooksecurefunc(mrp, "AddMRPTab", function()
T.SkinTab(CharacterFrameTab5)
CharacterFrameTab5:SetText("MyRolePlay")
end)
hooksecurefunc(mrp, "CreateOptionsPanel", function()
T.SkinCheckBox(MyRolePlayOptionsPanel_Enable)
T.SkinCheckBox(MyRolePlayOptionsPanel_MRPButton)
T.SkinCheckBox(MyRolePlayOptionsPanel_RPChatName)
T.SkinCheckBox(MyRolePlayOptionsPanel_Biog)
T.SkinCheckBox(MyRolePlayOptionsPanel_FormAC)
T.SkinCheckBox(MyRolePlayOptionsPanel_EquipAC)
T.SkinDropDownBox(MyRolePlayOptionsPanel_TTStyle)
T.SkinDropDownBox(MyRolePlayOptionsPanel_HeightUnit)
T.SkinDropDownBox(MyRolePlayOptionsPanel_WeightUnit)
end)
local function reskinHeader(_, field)
for i = 1, field:GetNumChildren() do
local f = select(i, field:GetChildren())
if not f.reskinned then
f.h:SetBackdrop({bgFile = "Interface\\ChatFrame\\ChatFrameBackground"})
f.h:SetBackdropColor(0.5, 0.5, 0.5, 0.1)
f.h.SetBackdrop = T.dummy
f.h.fs:SetPoint("TOPLEFT", f.h, "TOPLEFT", 0, 0)
if f.sep then
f.sep:SetAlpha(0)
end
f.reskinned = true
end
end
end
hooksecurefunc(mrp, "CreateCFpfield", reskinHeader)
hooksecurefunc(mrp, "CreateBFpfield", reskinHeader)
hooksecurefunc(mrp, "CreateBrowseFrame", function()
MyRolePlayBrowseFrameInset:StripTextures()
MyRolePlayBrowseFrame:StripTextures()
MyRolePlayBrowseFrame:SetTemplate("Transparent")
T.SkinTab(MyRolePlayBrowseFrameTab1)
T.SkinTab(MyRolePlayBrowseFrameTab2)
T.SkinCloseButton(MyRolePlayBrowseFrameCloseButton)
end)
hooksecurefunc(mrp, "CreateEditFrames", function()
MyRolePlayMultiEditFrame:DisableDrawLayer("BORDER")
MyRolePlayMultiEditFrameBg:Hide()
MyRolePlayMultiEditFrameScrollFrameTop:Hide()
MyRolePlayMultiEditFrameScrollFrameBottom:Hide()
MyRolePlayMultiEditFrameOK:SkinButton()
MyRolePlayMultiEditFrameCancel:SkinButton()
MyRolePlayMultiEditFrameInherit:SkinButton()
MyRolePlayComboEditFrameOK:SkinButton()
MyRolePlayComboEditFrameCancel:SkinButton()
MyRolePlayComboEditFrameInherit:SkinButton()
MyRolePlayCharacterFrame_NewProfileButton:SkinButton()
MyRolePlayCharacterFrame_RenProfileButton:SkinButton()
MyRolePlayCharacterFrame_DelProfileButton:SkinButton()
MyRolePlayEditFrameOK:SkinButton()
MyRolePlayEditFrameCancel:SkinButton()
MyRolePlayEditFrameInherit:SkinButton()
MyRolePlayEditFrame.editbox:StripTextures()
MyRolePlayEditFrame.editbox:CreateBackdrop("Overlay")
MyRolePlayEditFrame.editbox.backdrop:SetPoint("TOPLEFT", 7, -8)
MyRolePlayEditFrame.editbox.backdrop:SetPoint("BOTTOMRIGHT", -7, 8)
MyRolePlayCharacterFrame.ver:SetText("")
MyRolePlayCharacterFrame_ProfileComboBox:SetPoint("TOP", CharacterFrameInset, "TOP", 0, 22)
MyRolePlayCharacterFrame_ProfileComboBox.text:SetPoint("LEFT", MyRolePlayCharacterFrame_ProfileComboBox, "LEFT", 27, 3)
T.SkinDropDownBox(MyRolePlayCharacterFrame_ProfileComboBox)
T.SkinDropDownBox(MyRolePlayComboEditFrameComboBox)
MyRolePlayCharacterFrame_RenProfileButton:SetSize(21, 21)
MyRolePlayCharacterFrame_DelProfileButton:SetSize(21, 21)
MyRolePlayCharacterFrame_NewProfileButton:SetSize(21, 21)
MyRolePlayCharacterFrame_NewProfileButton:ClearAllPoints()
MyRolePlayCharacterFrame_NewProfileButton:SetPoint("LEFT", MyRolePlayCharacterFrame_ProfileComboBox.backdrop, "RIGHT", 1, 0)
end)
================================================
FILE: ShestakUI/Modules/Skins/NPCScan.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.npcscan ~= true then return end
----------------------------------------------------------------------------------------
-- NPCScan skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("_NPCScan") then return end
_NPCScanButton:StripTextures()
_NPCScanButton:SetTemplate("Transparent")
_NPCScanButton:SetScale(1)
_NPCScanTest:SkinButton()
local checkboxes = {
"_NPCScanConfigCacheWarningsCheckbox",
"_NPCScanConfigPrintTimeCheckbox",
"_NPCScanConfigUnmuteCheckbox",
"_NPCScanSearchAchievementAddFoundCheckbox"
}
for i = 1, getn(checkboxes) do
local checkbox = _G[checkboxes[i]]
if checkbox then
T.SkinCheckBox(checkbox)
end
end
for i = 1, _NPCScanButton:GetNumChildren() do
local close = select(i, _NPCScanButton:GetChildren())
if close.GetPushedTexture and close:GetPushedTexture() and not close:GetName() then
close:StripTextures()
close:SetPoint("TOPRIGHT", 4, 4)
close:SetScale(1)
close:CreateBackdrop("Overlay")
close.backdrop:SetPoint("TOPLEFT", 8, -8)
close.backdrop:SetPoint("BOTTOMRIGHT", -8, 8)
close.text = close:FontString(nil, C.media.normal_font, 17)
close.text:SetPoint("CENTER", 0, 1)
close.text:SetText("x")
close:HookScript("OnEnter", function()
close.backdrop:SetBackdropBorderColor(unpack(C.media.classborder_color))
if close.backdrop.overlay then
close.backdrop.overlay:SetVertexColor(C.media.classborder_color[1], C.media.classborder_color[2], C.media.classborder_color[3], 0.3)
end
end)
close:HookScript("OnLeave", function()
close.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
if close.backdrop.overlay then
close.backdrop.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)
end
end)
end
local text = select(4, _NPCScanButton:GetRegions())
text:SetTextColor(1, 1, 0)
text:SetShadowOffset(1, -1)
end
end)
================================================
FILE: ShestakUI/Modules/Skins/NugRunning.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.nug_running ~= true then return end
----------------------------------------------------------------------------------------
-- NugRunning skin(by MrRuben5)
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("NugRunning") then return end
local NugRunning = NugRunning
local TimerBar = NugRunning and NugRunning.TimerBar
-- Creates timerbar
local _ConstructTimerBar = NugRunning.ConstructTimerBar
function NugRunning.ConstructTimerBar(w, h)
local f = _ConstructTimerBar(w, h)
f:SetBackdrop(nil)
local ic = f.icon:GetParent()
ic:CreateBackdrop("Default")
f.bar:CreateBackdrop("Default")
f.bar:SetStatusBarTexture(C.media.texture)
f.bar:GetStatusBarTexture():SetDrawLayer("ARTWORK")
f.bar.bg:SetTexture(C.media.texture)
f.bar.bg:SetAlpha(0.3)
f.timeText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
f.timeText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
f.spellText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
f.spellText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
f.stacktext:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
f.stacktext:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
TimerBar.Resize(f, w, h)
return f
end
-- Resizes timerbar
local _Resize = TimerBar.VScale
function TimerBar.Resize(f, w, h)
_Resize(f, w, h)
local ic = f.icon:GetParent()
ic:ClearAllPoints()
ic:SetPoint("TOPLEFT", f, 1, -1)
ic:SetPoint("BOTTOMLEFT", f, 1, 0)
f.bar:ClearAllPoints()
f.bar:SetPoint("TOPRIGHT", f, -1, -1)
f.bar:SetPoint("BOTTOMRIGHT", f, -1, 0)
f.bar:SetPoint("LEFT", ic, "RIGHT", 5, 0)
f.timeText:SetJustifyH("RIGHT")
f.timeText:ClearAllPoints()
f.timeText:SetPoint("RIGHT", 1, 0)
f.spellText:SetJustifyH("LEFT")
f.spellText:ClearAllPoints()
f.spellText:SetPoint("LEFT", 2, 0)
f.spellText:SetWidth(f.bar:GetWidth() - 10)
end
end)
================================================
FILE: ShestakUI/Modules/Skins/OPie.lua
================================================
local T, C = unpack(ShestakUI)
if C.skins.opie ~= true or not IsAddOnLoaded("OPie") then return end
----------------------------------------------------------------------------------------
-- OPie skin (OPie Masque)
----------------------------------------------------------------------------------------
local SPECIAL_COLOR_ALPHA = 0
-- 0 = invisible, 1 = fully visible, lower it if your skin is ugly
local buttons = {}
local prototype = {}
local STATE_USABLE, STATE_NOMANA, STATE_NORANGE, STATE_UNUSABLE = 0, 1, 2, 3
function prototype:SetIcon(texture)
self.Icon:SetTexture(texture)
end
function prototype:SetIconTexCoord(a, b, c, d, e, f, g, h)
if not a or not b or not c or not d then return end -- Broker plugins???
self.Icon:SetTexCoord(a, b, c, d, e, f, g, h)
end
function prototype:SetIconVertexColor(r, g, b)
if r == 0.5 and g == 0.5 and b == 0.5 then return end -- don't darken icons on cooldown
self.icon_r, self.icon_g, self.icon_b = r, g, b
if self.ustate == STATE_USABLE then
self.Icon:SetVertexColor(r, g, b)
end
end
function prototype:SetUsable(usable, _, cd, nomana, norange)
local state = usable and STATE_USABLE or (norange and STATE_NORANGE or (nomana and STATE_NOMANA or STATE_UNUSABLE))
if state == self.ustate then return end
self.ustate = state
if state == STATE_NORANGE then
self.Icon:SetVertexColor(0.8, 0.1, 0.1)
elseif state == STATE_NOMANA then
self.Icon:SetVertexColor(0.5, 0.5, 1)
elseif state == STATE_UNUSABLE and not cd then -- don't black it out while on cooldown
self.Icon:SetVertexColor(0.4, 0.4, 0.4)
else
self.Icon:SetVertexColor(self.icon_r or 1, self.icon_g or 1, self.icon_b or 1)
end
end
function prototype:SetDominantColor(r, g, b)
self.Border:SetShown(2.85 > (r + g + b)) -- don't override skin color if it's white
self.Border:SetVertexColor(r, g, b)
self.Border:SetAlpha(SPECIAL_COLOR_ALPHA)
end
function prototype:SetOverlayIcon(texture, w, h, ...)
if not texture then
self.OverlayIcon:Hide()
else
self.OverlayIcon:SetTexture(texture)
self.OverlayIcon:SetSize(w, h)
if ... then
self.OverlayIcon:SetTexCoord(...)
end
self.OverlayIcon:Show()
end
end
function prototype:SetCount(count)
self.Count:SetText(count or "")
end
function prototype:SetOverlayIconVertexColor(...)
self.overIcon:SetVertexColor(...)
end
local displaySubs = {
["ALT%-"] = "a",
["CTRL%-"] = "c",
["SHIFT%-"] = "s", -- fr, it: "m"
["BUTTON"] = "m", -- fr: souris, it: mouse
["MOUSEWHEEL"] = "w", -- fr: molette, it: rotellina
["NUMPAD"] = "n",
["PLUS"] = "+",
["MINUS"] = "-",
["MULTIPLY"] = "*",
["DIVIDE"] = "/",
["DECIMAL"] = ".",
}
function prototype:SetBinding(text)
if not text then
return self.HotKey:SetText("")
end
for k, v in pairs(displaySubs) do
text = gsub(text, k, v)
end
self.HotKey:SetText(text)
end
function prototype:SetCooldown(remain, duration, usable)
if duration and remain and duration > 0 and remain > 0 then
local start = GetTime() + remain - duration
if usable then
-- show recharge time
self.Cooldown:SetDrawEdge(true)
self.Cooldown:SetDrawSwipe(false)
else
-- show cooldown time
self.Cooldown:SetDrawEdge(false)
self.Cooldown:SetDrawSwipe(true)
self.Cooldown:SetSwipeColor(0, 0, 0, 0.8)
end
self.Cooldown:SetCooldown(start, duration)
self.Cooldown:Show()
else
self.Cooldown:Hide()
end
end
function prototype:SetCooldownFormattedText(pattern, ...)
-- do nothing
end
function prototype:SetCooldownTextShown()
-- do nothing
end
function prototype:SetHighlighted(highlight)
self[highlight and "LockHighlight" or "UnlockHighlight"](self)
end
function prototype:SetActive(active)
self:SetChecked(active)
end
function prototype:SetOuterGlow(shown)
for i = 1, #self.GlowTextures do
self.GlowTextures[i]:SetShown(shown)
end
end
function prototype:SetEquipState(inBags, isEquipped)
if isEquipped then
self.Flash:SetVertexColor(0.1, 0.9, 0.15)
self.Flash:Show()
elseif inBags then
self.Flash:SetVertexColor(1, 0.9, 0.2)
self.Flash:Show()
else
self.Flash:Hide()
end
end
local id = 0
local function CreateIndicator(name, parent, size, ghost)
id = id + 1
name = name or "OPieSliceButton"..id
parent = parent or UIParent
size = size or 36
local button = CreateFrame("CheckButton", name, parent, "ActionButtonTemplate")
button:SetSize(size, size)
button:EnableMouse(false)
button.Border = _G[name .. "Border"] -- highlight
button.Cooldown = _G[name .. "Cooldown"]
button.Count = _G[name .. "Count"]
button.Flash = _G[name .. "Flash"] -- inner glow / checked
button.HotKey = _G[name .. "HotKey"]
button.Icon = _G[name .. "Icon"]
button.NormalTexture = _G[name .. "NormalTexture"] -- border
-- Overlay icon (???)
button.OverlayIcon = button:CreateTexture(nil, "ARTWORK", nil, 1)
button.OverlayIcon:SetPoint("BOTTOMLEFT", button, "BOTTOMLEFT", 4, 4)
-- Outer glow (doesn't seem to do anything?)
button.GlowTextures = {}
for k, v in pairs(prototype) do
button[k] = v
end
-- ViksUI Skin
if not button.isSkinned then
button.NormalTexture:SetTexture(0)
button:CreateBackdrop("Overlay")
button:StyleButton(nil, 4)
button.backdrop:SetAllPoints()
button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.icon:SetDrawLayer("ARTWORK")
button.icon:SetParent(button.backdrop)
button.icon:ClearAllPoints()
button.icon:SetSize(size, size)
button.icon:SetPoint("CENTER",0,0)
button.Cooldown:SetSize(size, size)
button.Cooldown:ClearAllPoints()
button.Cooldown:SetPoint("CENTER",0,0)
button.Flash:SetSize(size, size)
button.Flash:ClearAllPoints()
button.Flash:SetPoint("CENTER",0,0)
button.hover:SetSize(size, size)
button.hover:ClearAllPoints()
button.hover:SetPoint("CENTER",0,0)
button.checked:SetSize(size, size)
button.checked:ClearAllPoints()
button.checked:SetPoint("CENTER",0,0)
button.isSkinned = true
end
tinsert(buttons, button)
return button
end
OPie.UI:RegisterIndicatorConstructor("OpieMasque", {CreateIndicator=CreateIndicator, name="OpieMasque", apiLevel=1})
================================================
FILE: ShestakUI/Modules/Skins/Omen.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.omen ~= true or not IsAddOnLoaded("Omen") then return end
----------------------------------------------------------------------------------------
-- Omen skin
----------------------------------------------------------------------------------------
local Omen = LibStub("AceAddon-3.0"):GetAddon("Omen")
-- Skin Bar Texture
Omen.UpdateBarTextureSettings_ = Omen.UpdateBarTextureSettings
Omen.UpdateBarTextureSettings = function(self)
for _, v in ipairs(self.Bars) do
v.texture:SetTexture(C.media.texture)
v:CreateBackdrop("Transparent")
end
end
-- Skin Bar fonts
Omen.UpdateBarLabelSettings_ = Omen.UpdateBarLabelSettings
Omen.UpdateBarLabelSettings = function(self)
self:UpdateBarLabelSettings_()
for _, v in ipairs(self.Bars) do
v.Text1:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
v.Text1:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
v.Text2:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
v.Text2:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
v.Text3:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
v.Text3:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
end
-- Skin Title Bar
Omen.UpdateTitleBar_ = Omen.UpdateTitleBar
Omen.UpdateTitleBar = function(self)
Omen.db.profile.Scale = 1
Omen.db.profile.Background.EdgeSize = 1
Omen.db.profile.Background.BarInset = 2
Omen.db.profile.TitleBar.UseSameBG = true
self:UpdateTitleBar_()
self.TitleText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
self.TitleText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
self.BarList:SetPoint("TOPLEFT", self.Title, "BOTTOMLEFT", 0, -3)
end
-- Skin Title/Bars backgrounds
Omen.UpdateBackdrop_ = Omen.UpdateBackdrop
Omen.UpdateBackdrop = function(self)
Omen.db.profile.Scale = 1
Omen.db.profile.Background.EdgeSize = 1
Omen.db.profile.Background.BarInset = 2
self:UpdateBackdrop_()
self.Title:SetTemplate("Transparent")
self.BarList:SetPoint("TOPLEFT", self.Title, "BOTTOMLEFT", 0, -3)
end
-- Hook bar creation to apply settings
local omen_mt = getmetatable(Omen.Bars)
local oldidx = omen_mt.__index
omen_mt.__index = function(self, barID)
local bar = oldidx(self, barID)
Omen:UpdateBarTextureSettings()
Omen:UpdateBarLabelSettings()
return bar
end
-- Option Overrides
Omen.db.profile.NumBars = 7
if C.skins.minimap_buttons == true then
Omen.db.profile.MinimapIcon.hide = false
else
Omen.db.profile.MinimapIcon.hide = true
end
Omen.db.profile.Autocollapse = true
Omen.db.profile.Bar.Spacing = 7
Omen.db.profile.Bar.Height = 12
Omen.db.profile.Bar.Texture = "Smooth!"
Omen.db.profile.Bar.FontSize = 8
Omen.db.profile.Bar.Font = "Hooge"
Omen.db.profile.Bar.ShowHeadings = false
Omen.db.profile.TitleBar.ShowTitleBar = false
Omen.db.profile.TitleBar.FontSize = 8
Omen.db.profile.TitleBar.Font = "Hooge"
Omen.db.profile.Background.Texture = "Smooth!"
Omen.db.profile.Bar.FontSize = 8
Omen.db.profile.Bar.ShowHeadings = false
Omen.db.profile.Shown = true
Omen.db.profile.Locked = true
-- Force updates
Omen:UpdateBarTextureSettings()
Omen:UpdateBarLabelSettings()
Omen:UpdateTitleBar()
Omen:UpdateBackdrop()
Omen:ReAnchorBars()
Omen:ResizeBars()
================================================
FILE: ShestakUI/Modules/Skins/Ovale.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.ovale ~= true then return end
----------------------------------------------------------------------------------------
-- OvaleSpellPriority skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("Ovale") then return end
if not OvaleDB then OvaleDB = {} end
if not OvaleDB["profiles"] then OvaleDB["profiles"] = {} end
if not OvaleDB["profiles"][T.name.." - "..T.realm] then OvaleDB["profiles"][T.name.." - "..T.realm] = {} end
if not OvaleDB["profiles"][T.name.." - "..T.realm]["apparence"] then OvaleDB["profiles"][T.name.." - "..T.realm]["apparence"] = {} end
OvaleDB["profiles"][T.name.." - "..T.realm]["apparence"]["iconScale"] = 1
OvaleDB["profiles"][T.name.." - "..T.realm]["apparence"]["smallIconScale"] = 1
OvaleDB["profiles"][T.name.." - "..T.realm]["apparence"]["secondIconScale"] = 1
OvaleDB["profiles"][T.name.." - "..T.realm]["apparence"]["margin"] = 3
for i = 1, 10 do
for j = 1, 2 do
local button = _G["Icon"..i.."n"..j]
if button and not button.isSkinned then
button.cd.noCooldownCount = true
button:StyleButton()
button:SetNormalTexture(0)
button:CreateBackdrop("Transparent")
button.backdrop:SetAllPoints()
button.icone:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.icone:SetPoint("TOPLEFT", button, 2, -2)
button.icone:SetPoint("BOTTOMRIGHT", button, -2, 2)
button.remains:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
button.remains:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
button.shortcut:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
button.shortcut:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
button.focusText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
button.focusText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
button.isSkinned = true
end
end
end
end)
================================================
FILE: ShestakUI/Modules/Skins/Postal.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.postal ~= true then return end
----------------------------------------------------------------------------------------
-- Postal skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("Postal") then return end
T.SkinRotateButton(Postal_ModuleMenuButton)
Postal_ModuleMenuButton:ClearAllPoints()
Postal_ModuleMenuButton:SetWidth(18)
Postal_ModuleMenuButton:SetHeight(18)
Postal_ModuleMenuButton:SetPoint("TOPRIGHT", MailFrameCloseButton, "TOPLEFT", -2, 0)
T.SkinRotateButton(Postal_OpenAllMenuButton)
Postal_OpenAllMenuButton:ClearAllPoints()
Postal_OpenAllMenuButton:SetWidth(18)
Postal_OpenAllMenuButton:SetHeight(18)
Postal_OpenAllMenuButton:SetPoint("TOPLEFT", PostalOpenAllButton, "TOPRIGHT", 2, -4)
T.SkinRotateButton(Postal_BlackBookButton)
Postal_BlackBookButton:ClearAllPoints()
Postal_BlackBookButton:SetWidth(16)
Postal_BlackBookButton:SetHeight(20)
Postal_BlackBookButton:SetPoint("TOPLEFT", SendMailNameEditBox, "TOPRIGHT", 0, -2)
PostalSelectOpenButton:SkinButton()
PostalSelectReturnButton:SkinButton()
PostalOpenAllButton:SkinButton()
end)
================================================
FILE: ShestakUI/Modules/Skins/Recount.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.recount ~= true or not IsAddOnLoaded("Recount") then return end
----------------------------------------------------------------------------------------
-- Recount skin
----------------------------------------------------------------------------------------
local Recount = _G.Recount
local function SkinFrame(frame)
frame.bgMain = CreateFrame("Frame", nil, frame)
if frame ~= Recount.MainWindow then
frame.bgMain:SetTemplate("Transparent")
T.SkinCloseButton(frame.CloseButton)
frame.CloseButton:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -4, -11)
end
if frame == Recount.MainWindow then
frame.Title:SetPoint("TOPLEFT", frame, "TOPLEFT", 3, -15)
frame.Title:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
frame.Title:SetShadowColor(0, 0, 0, C.font.stylization_font_shadow and 1 or 0)
frame.CloseButton:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 3, -9)
end
frame.bgMain:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT")
frame.bgMain:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT")
frame.bgMain:SetPoint("TOP", frame, "TOP", 0, -7)
frame.bgMain:SetFrameLevel(frame:GetFrameLevel())
frame:SetBackdrop(nil)
end
local function SkinButton(frame, text)
if frame.SetNormalTexture then frame:SetNormalTexture(0) end
if frame.SetHighlightTexture then frame:SetHighlightTexture(0) end
if frame.SetPushedTexture then frame:SetPushedTexture(0) end
if not frame.text then
frame:FontString("text", C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
frame.text:SetPoint("CENTER")
frame.text:SetText(text)
end
frame:HookScript("OnEnter", function(self) self.text:SetTextColor(unpack(C.media.classborder_color)) end)
frame:HookScript("OnLeave", function(self) self.text:SetTextColor(1, 1, 1) end)
end
-- Override bar textures
Recount.UpdateBarTextures = function()
for _, v in pairs(Recount.MainWindow.Rows) do
v.StatusBar:SetStatusBarTexture(C.media.texture)
v.StatusBar:GetStatusBarTexture():SetHorizTile(false)
v.StatusBar:GetStatusBarTexture():SetVertTile(false)
v.background = v.StatusBar:CreateTexture("$parentBackground", "BACKGROUND")
v.background:SetAllPoints(v.StatusBar)
v.background:SetTexture(C.media.texture)
v.background:SetVertexColor(0.15, 0.15, 0.15, 0.75)
v.overlay = CreateFrame("Frame", nil, v.StatusBar)
v.overlay:SetTemplate("Default")
v.overlay:SetFrameStrata("BACKGROUND")
v.overlay:SetPoint("TOPLEFT", -2, 2)
v.overlay:SetPoint("BOTTOMRIGHT", 2, -2)
v.LeftText:ClearAllPoints()
v.LeftText:SetPoint("LEFT", v.StatusBar, "LEFT", 2, 0)
v.LeftText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
v.LeftText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
v.RightText:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
v.RightText:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
end
Recount.SetBarTextures = Recount.UpdateBarTextures
-- Fix bar textures as they're created
Recount.SetupBar_ = Recount.SetupBar
Recount.SetupBar = function(self, bar)
self:SetupBar_(bar)
bar.StatusBar:SetStatusBarTexture(C.media.texture)
end
-- Skin frames when they're created
Recount.CreateFrame_ = Recount.CreateFrame
Recount.CreateFrame = function(self, Name, Title, Height, Width, ShowFunc, HideFunc)
local frame = self:CreateFrame_(Name, Title, Height, Width, ShowFunc, HideFunc)
SkinFrame(frame)
return frame
end
-- Skin some others frame, not available outside Recount
Recount.AddWindow_ = Recount.AddWindow
Recount.AddWindow = function(_, frame)
Recount:AddWindow_(frame)
if frame.YesButton then
frame:SetTemplate("Transparent")
frame.YesButton:SkinButton()
frame.NoButton:SkinButton()
end
if frame.ReportButton then
frame.ReportButton:SkinButton()
end
end
-- Skin existing frames
if Recount.MainWindow then SkinFrame(Recount.MainWindow) end
if Recount.ConfigWindow then SkinFrame(Recount.ConfigWindow) end
if Recount.GraphWindow then SkinFrame(Recount.GraphWindow) end
if Recount.DetailWindow then SkinFrame(Recount.DetailWindow) end
if Recount.ResetFrame then SkinFrame(Recount.ResetFrame) end
if _G["Recount_Realtime_!RAID_DAMAGE"] then SkinFrame(_G["Recount_Realtime_!RAID_DAMAGE"].Window) end
if _G["Recount_Realtime_!RAID_HEALING"] then SkinFrame(_G["Recount_Realtime_!RAID_HEALING"].Window) end
if _G["Recount_Realtime_!RAID_HEALINGTAKEN"] then SkinFrame(_G["Recount_Realtime_!RAID_HEALINGTAKEN"].Window) end
if _G["Recount_Realtime_!RAID_DAMAGETAKEN"] then SkinFrame(_G["Recount_Realtime_!RAID_DAMAGETAKEN"].Window) end
if _G["Recount_Realtime_Bandwidth Available_AVAILABLE_BANDWIDTH"] then SkinFrame(_G["Recount_Realtime_Bandwidth Available_AVAILABLE_BANDWIDTH"].Window) end
if _G["Recount_Realtime_FPS_FPS"] then SkinFrame(_G["Recount_Realtime_FPS_FPS"].Window) end
if _G["Recount_Realtime_Latency_LAG"] then SkinFrame(_G["Recount_Realtime_Latency_LAG"].Window) end
if _G["Recount_Realtime_Downstream Traffic_DOWN_TRAFFIC"] then SkinFrame(_G["Recount_Realtime_Downstream Traffic_DOWN_TRAFFIC"].Window) end
if _G["Recount_Realtime_Upstream Traffic_UP_TRAFFIC"] then SkinFrame(_G["Recount_Realtime_Upstream Traffic_UP_TRAFFIC"].Window) end
-- Update Textures
Recount:UpdateBarTextures()
Recount.MainWindow.ConfigButton:HookScript("OnClick", function() Recount:UpdateBarTextures() end)
-- Reskin Dropdown
Recount.MainWindow.FileButton:HookScript("OnClick", function() if LibDropdownFrame0 then LibDropdownFrame0:SetTemplate("Transparent") end end)
-- Reskin Buttons
SkinButton(Recount.MainWindow.CloseButton, "X")
SkinButton(Recount.MainWindow.RightButton, ">")
SkinButton(Recount.MainWindow.LeftButton, "<")
SkinButton(Recount.MainWindow.ResetButton, "R")
SkinButton(Recount.MainWindow.FileButton, "F")
SkinButton(Recount.MainWindow.ConfigButton, "C")
SkinButton(Recount.MainWindow.ReportButton, "S")
-- Force some default profile options
if not RecountDB then RecountDB = {} end
if not RecountDB["profiles"] then RecountDB["profiles"] = {} end
if not RecountDB["profiles"][T.name.." - "..GetRealmName()] then RecountDB["profiles"][T.name.." - "..T.realm] = {} end
if not RecountDB["profiles"][T.name.." - "..GetRealmName()]["MainWindow"] then RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"] = {} end
RecountDB["profiles"][T.name.." - "..T.realm]["Locked"] = true
RecountDB["profiles"][T.name.." - "..T.realm]["Scaling"] = 1
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["RowHeight"] = 12
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["RowSpacing"] = 7
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["ShowScrollbar"] = false
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["HideTotalBar"] = true
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["Position"]["x"] = 284
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["Position"]["y"] = -281
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["Position"]["w"] = 221
--RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["Position"]["h"] = 158
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindow"]["BarText"]["NumFormat"] = 3
RecountDB["profiles"][T.name.." - "..T.realm]["MainWindowWidth"] = 221
--RecountDB["profiles"][T.name.." - "..T.realm]["MainWindowHeight"] = 158
RecountDB["profiles"][T.name.." - "..T.realm]["ClampToScreen"] = true
RecountDB["profiles"][T.name.." - "..T.realm]["Font"] = "Calibri"
================================================
FILE: ShestakUI/Modules/Skins/Rematch.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.rematch ~= true or not IsAddOnLoaded("Rematch") then return end
----------------------------------------------------------------------------------------
-- Rematch skin
----------------------------------------------------------------------------------------
local _,skin = ...
Skin = skin
local rematch = Rematch
local roster = rematch.Roster
skin.panels = {
Frame = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
self:SetTemplate("Transparent")
self.TitleBar:StripTextures()
T.SkinCloseButton(RematchFrame.CloseButton)
self.TitleBar.LockButton:Kill()
for _,tab in ipairs(self.PanelTabs.Tabs) do
skin:HandlePanelTab(tab)
end
hooksecurefunc(Rematch.Frame,"Update",function()
local titlebar = Rematch.Frame.TitleBar
titlebar.SinglePanelButton:SetShown(not RematchSettings.Minimized)
end)
T.SkinCloseButton(RematchFrame.TitleBar.MinimizeButton, nil, "+")
RematchFrame.TitleBar.MinimizeButton:SetSize(18,18)
RematchFrame.TitleBar.MinimizeButton:SetPoint("TOPRIGHT", RematchFrame.CloseButton, "TOPLEFT", -3, 0)
T.SkinNextPrevButton(RematchFrame.TitleBar.SinglePanelButton, nil)
end,
Journal = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
self:SetTemplate("Transparent")
for _,tab in ipairs(self.PanelTabs.Tabs) do
skin:HandlePanelTab(tab)
end
RematchJournalPortrait:Hide()
T.SkinCloseButton(self.CloseButton)
local handled
self:HookScript("OnEvent",function()
if not handled and UseRematchButton then
T.SkinCheckBox(UseRematchButton)
handled = true
end
end)
-- added in Rematch 4.3.4
if self.OtherAddonJournalStuff then
hooksecurefunc(self,"OtherAddonJournalStuff",function()
if self.CollectMeButton then
self.CollectMeButton:SkinButton()
self.CollectMeButton:SetHeight(20)
self.CollectMeButton:SetPoint("RIGHT",Rematch.BottomPanel.SaveButton,"LEFT",-2,0)
end
if self.PetTrackerJournalButton then
T.SkinCheckBox(self.PetTrackerJournalButton)
end
end)
end
end,
BottomPanel = function(self)
for _,button in ipairs({"SummonButton","SaveButton","SaveAsButton","FindBattleButton"}) do
self[button]:SkinButton()
self[button]:SetHeight(20)
end
T.SkinCheckBox(self.UseDefault)
end,
Toolbar = function(self)
for _,button in ipairs(self.Buttons) do
button.IconBorder:SetTexture(nil)
button:CreateBackdrop("Overlay")
button:StyleButton(nil, 4)
button:SetSize(26, 26)
button:CreateBackdrop("Default")
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Icon:SetDrawLayer("ARTWORK")
button.Icon:SetParent(button.backdrop)
button.hover:SetSize(26, 26)
button.hover:ClearAllPoints()
button.hover:SetPoint("CENTER",0,0)
button.pushed:SetSize(26, 26)
button.pushed:ClearAllPoints()
button.pushed:SetPoint("CENTER",0,0)
button.Cooldown:SetSize(26, 26)
button.Cooldown:ClearAllPoints()
button.Cooldown:SetPoint("CENTER",0,0)
end
self.PetCount:StripTextures()
end,
PetCard = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
self:SetTemplate("Transparent")
T.SkinCloseButton(self.CloseButton)
T.SkinCloseButton(self.PinButton,nil,"")
self.Title.TitleBG:SetDrawLayer("BACKGROUND",2)
local r,g,b = 0.05, 0.05, 0.05
Mixin(self.Front, BackdropTemplateMixin)
self.Front:SetBackdrop({edgeFile="Interface\\ChatFrame\\ChatFrameBackground",edgeSize=4})
self.Front:SetBackdropBorderColor(r,g,b)
Mixin(self.Back, BackdropTemplateMixin)
self.Back:SetBackdrop({})
self.Back:SetBackdrop({edgeFile="Interface\\ChatFrame\\ChatFrameBackground",edgeSize=4})
self.Back:SetBackdropBorderColor(r,g,b)
-- also reskinning ability card here
local abilityCard = RematchAbilityCard
Mixin(abilityCard, BackdropTemplateMixin)
abilityCard:SetBackdrop({edgeFile="Interface\\ChatFrame\\ChatFrameBackground",edgeSize=4})
abilityCard:SetBackdropBorderColor(r,g,b)
-- change all the horizontal divider lines to solid black lines
for _, frame in ipairs({
self.Front.Bottom,
self.Front.Middle,
self.Back.Source,
self.Back.Bottom,
self.Back.Middle,
abilityCard,
abilityCard.Hints,
}) do
for _, region in ipairs({ frame:GetRegions() }) do
local anchorPoint, relativeTo = region:GetPoint()
if
region:GetObjectType() == "Texture"
and region:GetDrawLayer() == "ARTWORK"
and anchorPoint == "LEFT"
and relativeTo == frame
then
region:SetTexture(r, g, b)
region:SetHeight(4)
end
end
end
end,
LoadoutPanel = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
Mixin(self.Target, BackdropTemplateMixin)
self.Target:StripTextures()
self.Target:SetTemplate("Transparent")
for i=1,3 do
Mixin(self.Loadouts[i], BackdropTemplateMixin)
self.Loadouts[i]:StripTextures()
self.Loadouts[i]:SetTemplate("Default")
end
self.Target.TargetButton:SkinButton()
self.Target.LoadSaveButton:SkinButton()
for i=1,3 do
for j=1,3 do
self.Loadouts[i].Abilities[j]:SkinButton()
self.Loadouts[i].Abilities[j].IconBorder:Hide()
end
end
self.Flyout:SetTemplate("Transparent")
for i=1,2 do
self.Flyout.Abilities[i]:SkinButton()
self.Flyout.Abilities[i].IconBorder:Hide()
end
end,
LoadedTeamPanel = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
self:SetTemplate("Transparent")
Mixin(self.Footnotes, BackdropTemplateMixin)
self.Footnotes:StripTextures()
self.Footnotes:SetTemplate("Transparent")
T.SkinCloseButton(self.Footnotes.Close)
T.SkinCloseButton(self.Footnotes.Maximize,nil,"-")
end,
PetPanel = function(self)
skin:HandleAutoScrollFrame(self.List)
-- top
Mixin(self.Top, BackdropTemplateMixin)
self.Top:StripTextures()
Mixin(self.Top.TypeBar, BackdropTemplateMixin)
self.Top.TypeBar:StripTextures()
self.Top.Filter:SkinButton()
self.Top.Toggle:SkinButton()
T.SkinEditBox(self.Top.SearchBox)
Mixin(self.Top.SearchBox, BackdropTemplateMixin)
self.Top.SearchBox:SetBackdrop({})
self.Top.SearchBox.NineSlice:Hide()
for _,region in ipairs({self.Top.SearchBox:GetRegions()}) do
if region:GetDrawLayer()=="BACKGROUND" then
region:Hide()
end
end
self.Top.SearchBox:SetHeight(20)
self.Top.SearchBox:SetPoint("LEFT",self.Top.Toggle,"RIGHT",4,0)
self.Top.SearchBox:SetPoint("RIGHT",self.Top.Filter,"LEFT",-4,0)
Mixin(self.Results, BackdropTemplateMixin)
self.Results:StripTextures()
self.Results:SetTemplate("Transparent")
-- typebar requires a bit of extra work
self.Top.TypeBar:SetPoint("BOTTOM",0,-2)
for _,button in ipairs(self.Top.TypeBar.Tabs) do
button:SkinButton()
button:SetWidth(button:GetWidth() - 7)
end
for _,button in ipairs(self.Top.TypeBar.Tabs) do
button.Selected:ClearAllPoints()
button.Selected:SetPoint("TOPLEFT", 0, -2)
button.Selected:SetPoint("BOTTOMRIGHT", 0, 2)
for _,texture in ipairs({"LeftSelected","RightSelected","MidSelected"}) do
button.Selected[texture]:SetColorTexture(1, 1, 1, 0.25)
button.Selected[texture]:SetHeight(20)
end
for _,region in ipairs({button.Selected:GetRegions()}) do
if region:GetDrawLayer()=="ARTWORK" then
region:Hide()
end
end
for _,region in ipairs({button:GetRegions()}) do
if region:GetDrawLayer()=="HIGHLIGHT" then
region:Hide()
end
end
button.HasStuff:SetPoint("TOPLEFT",3,-18)
button.HasStuff:SetAlpha(1)
end
for _,button in ipairs(self.Top.TypeBar.Buttons) do
button.IconBorder:SetTexture(nil)
button:CreateBackdrop("Overlay")
button:StyleButton(nil, 4)
button:SetSize(20, 20)
button:CreateBackdrop("Default")
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Icon:SetDrawLayer("ARTWORK")
button.Icon:SetParent(button.backdrop)
button.hover:SetSize(20, 20)
button.hover:ClearAllPoints()
button.hover:SetPoint("CENTER",0,0)
button.checked:SetSize(20, 20)
button.checked:ClearAllPoints()
button.checked:SetPoint("CENTER",0,0)
end
end,
LoadoutPanel = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
Mixin(self.Target, BackdropTemplateMixin)
self.Target:StripTextures()
self.Target:SetTemplate("Transparent")
self.Target.Pet1:SkinButton()
self.Target.Pet1.IconBorder:SetAlpha(0)
self.Target.Pet2:SkinButton()
self.Target.Pet2.IconBorder:SetAlpha(0)
self.Target.Pet3:SkinButton()
self.Target.Pet3.IconBorder:SetAlpha(0)
self.Target.Model:CreateBackdrop("Transparent")
self.Target.Model.backdrop:SetPoint("TOPLEFT", 0, 0)
self.Target.Model.backdrop:SetPoint("BOTTOMRIGHT", 0, 0)
self.Target.ModelBorder:SetAlpha(0)
for i = 1, 3 do
Mixin(self.Loadouts[i], BackdropTemplateMixin)
self.Loadouts[i]:StripTextures()
self.Loadouts[i]:CreateBackdrop("Overlay")
self.Loadouts[i].backdrop:SetPoint("TOPLEFT")
self.Loadouts[i].backdrop:SetPoint("BOTTOMRIGHT")
self.Loadouts[i].Pet.Pet.IconBorder:SetAlpha(0)
self.Loadouts[i].Pet.Pet:StyleButton(nil, 4)
self.Loadouts[i].Pet.Pet:SetSize(40, 40)
self.Loadouts[i].Pet.Pet:CreateBackdrop("Default")
self.Loadouts[i].Pet.Pet.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.Loadouts[i].Pet.Pet.Icon:SetDrawLayer("ARTWORK")
self.Loadouts[i].Pet.Pet.Icon:SetParent(self.Loadouts[i].Pet.Pet.backdrop)
self.Loadouts[i].Pet.Pet.hover:SetSize(40, 40)
self.Loadouts[i].Pet.Pet.hover:ClearAllPoints()
self.Loadouts[i].Pet.Pet.hover:SetPoint("CENTER",0,0)
self.Loadouts[i].Pet.Pet.Level.BG:SetAlpha(0)
self.Loadouts[i].HP:StripTextures()
self.Loadouts[i].HP:CreateBackdrop("Overlay")
self.Loadouts[i].HP:SetStatusBarTexture(C.media.texture)
self.Loadouts[i].XP:StripTextures()
self.Loadouts[i].XP:CreateBackdrop("Overlay")
self.Loadouts[i].XP:SetStatusBarTexture(C.media.texture)
self.Loadouts[i].XP:SetFrameLevel(self.Loadouts[i].XP:GetFrameLevel() + 2)
end
self.Target.TargetButton:SkinButton()
self.Target.LoadSaveButton:SkinButton()
for i = 1, 3 do
for j = 1, 3 do
self.Loadouts[i].Abilities[j].IconBorder:Hide()
self.Loadouts[i].Abilities[j].IconBorder:SetTexture(nil)
self.Loadouts[i].Abilities[j]:StyleButton(nil, 4)
self.Loadouts[i].Abilities[j]:SetSize(30, 30)
self.Loadouts[i].Abilities[j]:CreateBackdrop("Default")
self.Loadouts[i].Abilities[j].Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.Loadouts[i].Abilities[j].Icon:SetDrawLayer("ARTWORK")
self.Loadouts[i].Abilities[j].Icon:SetParent(self.Loadouts[i].Abilities[j].backdrop)
self.Loadouts[i].Abilities[j].hover:SetSize(30, 30)
self.Loadouts[i].Abilities[j].hover:ClearAllPoints()
self.Loadouts[i].Abilities[j].hover:SetPoint("CENTER",0,0)
self.Loadouts[i].Abilities[j].checked:SetSize(30, 30)
self.Loadouts[i].Abilities[j].checked:ClearAllPoints()
self.Loadouts[i].Abilities[j].checked:SetPoint("CENTER",0,0)
end
end
self.Flyout:SetTemplate("Transparent")
for i = 1, 2 do
self.Flyout.Abilities[i].IconBorder:Hide()
self.Flyout.Abilities[i]:StyleButton()
self.Flyout.Abilities[i]:SetTemplate("Default")
self.Flyout.Abilities[i].Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.Flyout.Abilities[i].Icon:ClearAllPoints()
self.Flyout.Abilities[i].Icon:SetPoint("TOPLEFT", 2, -2)
self.Flyout.Abilities[i].Icon:SetPoint("BOTTOMRIGHT", -2, 2)
self.Flyout.Abilities[i].Icon:SetDrawLayer("OVERLAY")
end
end,
LoadedTeamPanel = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
self:SetTemplate("Transparent")
Mixin(self.Footnotes, BackdropTemplateMixin)
self.Footnotes:StripTextures()
self.Footnotes:SetTemplate("Transparent")
T.SkinCloseButton(self.Footnotes.Close)
T.SkinCloseButton(self.Footnotes.Maximize,nil,"-")
end,
TeamPanel = function(self)
skin:HandleAutoScrollFrame(self.List)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
Mixin(self.Top, BackdropTemplateMixin)
self.Top:StripTextures()
self.Top.Teams:SkinButton()
T.SkinEditBox(self.Top.SearchBox)
Mixin(self.Top.SearchBox, BackdropTemplateMixin)
self.Top.SearchBox:SetBackdrop({})
self.Top.SearchBox.NineSlice:Hide()
for _,region in ipairs({self.Top.SearchBox:GetRegions()}) do
if region:GetDrawLayer()=="BACKGROUND" then
region:Hide()
end
end
self.Top.SearchBox:SetHeight(22)
self.Top.SearchBox:SetPoint("RIGHT",self.Top.Teams,"LEFT",-4,0)
end,
MiniPanel = function(self)
Mixin(self.Background, BackdropTemplateMixin)
self.Background:StripTextures()
self.Background:SetTemplate("Transparent")
Mixin(self.Target, BackdropTemplateMixin)
self.Target:StripTextures()
self.Target:SetTemplate("Transparent")
self.Target.LoadButton:SkinButton()
for i = 1, 3 do
for j = 1, 3 do
self.Pets[i].Abilities[j]:SkinButton()
self.Pets[i].Abilities[j].IconBorder:Hide()
end
end
self.Flyout:SetTemplate("Transparent")
for i = 1, 2 do
self.Flyout.Abilities[i]:SkinButton()
self.Flyout.Abilities[i].IconBorder:Hide()
end
end,
MiniQueue = function(self)
skin:HandleAutoScrollFrame(self.List)
Mixin(self.Top, BackdropTemplateMixin)
self.Top:StripTextures()
self.Top:SetTemplate("Transparent")
self.Top.QueueButton:SkinButton()
Mixin(self.Status, BackdropTemplateMixin)
self.Status:StripTextures()
self.Status:SetTemplate("Transparent")
end,
QueuePanel = function(self)
skin:HandleAutoScrollFrame(self.List)
Mixin(self.Top, BackdropTemplateMixin)
self.List:StripTextures()
self.List:SetTemplate("Transparent")
T.SkinScrollBar(self.List.ScrollFrame.ScrollBar)
self.Top:StripTextures()
self.Top.QueueButton:SkinButton()
Mixin(self.Status, BackdropTemplateMixin)
self.Status:StripTextures()
self.Status:SetTemplate("Transparent")
end,
OptionPanel = function(self)
skin:HandleAutoScrollFrame(self.List)
end,
TeamTabs = function(self)
hooksecurefunc(self,"Update",function(self)
if RematchSettings.TeamTabsToLeft and RematchSettings.AlwaysTeamTabs and self:GetParent()==Rematch.Frame then
local anchorPoint,relativeTo,relativePoint,x,y = self:GetPoint()
self:SetPoint(anchorPoint,relativeTo,relativePoint,x+5,y)
end
for _,button in ipairs(self.Tabs) do
button:SkinButton()
button:SetSize(40,40)
button.Icon:SetPoint("CENTER")
end
self.UpButton:SkinButton()
self.UpButton:SetSize(40,40)
self.UpButton.Icon:SetPoint("CENTER")
self.DownButton:SkinButton()
self.DownButton:SetSize(40,40)
self.DownButton.Icon:SetPoint("CENTER")
end)
end,
Dialog = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
self:SetTemplate("Default")
T.SkinCloseButton(self.CloseButton)
self.Accept:SkinButton()
self.Cancel:SkinButton()
self.Other:SkinButton()
Mixin(self.Prompt, BackdropTemplateMixin)
self.Prompt:StripTextures()
self.Prompt:SetTemplate("Transparent")
--T.SkinEditBox(self.EditBox)
--self.EditBox:SetBackdrop({})
Mixin(self.TabPicker, BackdropTemplateMixin)
self.TabPicker:SkinButton()
self.TabPicker.Icon:SetDrawLayer("ARTWORK")
Mixin(self.TeamTabIconPicker, BackdropTemplateMixin)
self.TeamTabIconPicker:StripTextures()
self.TeamTabIconPicker:SetTemplate("Transparent")
T.SkinScrollBar(self.TeamTabIconPicker.ScrollFrame.ScrollBar)
T.SkinEditBox(self.MultiLine)
Mixin(self.MultiLine, BackdropTemplateMixin)
self.MultiLine:SetTemplate("Transparent")
T.SkinScrollBar(self.MultiLine.ScrollBar)
for _,child in ipairs({self.MultiLine:GetChildren()}) do
if child:GetObjectType()=="Button" then
child:SetBackdrop({})
end
end
T.SkinCheckBox(self.CheckButton)
--self.CollectionReport.ChartTypeComboBox:SetBackdrop({})
--self.CollectionReport.Chart:SetBackdrop({})
T.SkinEditBox(self.SaveAs.Name)
--self.SaveAs.Name:SetBackdrop({})
T.SkinEditBox(self.SaveAs.Target)
Mixin(self.SaveAs.Target, BackdropTemplateMixin)
self.SaveAs.Target:StripTextures()
self.SaveAs.Target:SetTemplate("Transparent")
T.SkinEditBox(self.ScriptFilter.Name)
--self.ScriptFilter.Name:SetBackdrop({})
for i=1,3 do
self.ScriptFilter.ReferenceButtons[i]:SkinButton()
end
for _,button in ipairs({"MinHP","MaxHP","MinXP","MaxXP"}) do
T.SkinEditBox(self.Preferences[button])
--self.Preferences[button]:SetBackdrop({})
end
T.SkinCheckBox(self.Preferences.AllowMM)
local handledExpectedDD
hooksecurefunc(Rematch,"ShowPreferencesDialog",function()
if not handledExpectedDD then
for i=1,10 do
self.Preferences.expectedDD[i]:SkinButton()
self.Preferences.expectedDD[i].IconBorder:Hide()
end
handledExpectedDD = true
end
end)
end,
Notes = function(self)
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
self:SetTemplate("Transparent")
self.Controls.SaveButton:SkinButton()
self.Controls.UndoButton:SkinButton()
self.Controls.DeleteButton:SkinButton()
T.SkinCloseButton(self.CloseButton)
self.LockButton:Kill()
self.Content:StripTextures()
self.Content:SetTemplate("Transparent")
for _,region in ipairs({self.Content:GetRegions()}) do
if region:GetDrawLayer()=="ARTWORK" then
if region:GetObjectType()=="Texture" then -- restore thin gold border around icons
region:SetTexture("Interface\\PetBattles\\PetBattleHUD")
region:SetTexCoord(0.884765625,0.943359375,0.681640625,0.798828125)
end
end
end
end,
}
--[[ Stuff that needs to be done on login that has no panel goes here (menus, tooltips, etc) ]]
skin.misc = {
Menu = function()
-- menu framepool is local, going to force the creation of three levels of menus and skin them
for i=1,3 do
local menu = Rematch:GetMenuFrame(i,UIParent)
menu:Hide()
Mixin(menu, BackdropTemplateMixin)
menu:StripTextures()
menu:SetTemplate("Default")
for _,region in ipairs({menu.Title:GetRegions()}) do
if region:GetObjectType()=="Texture" and region:GetDrawLayer()=="BACKGROUND" then
region:SetTexture()
end
end
end
end,
Tooltip = function()
Mixin(RematchTooltip, BackdropTemplateMixin)
RematchTooltip:StripTextures()
RematchTooltip:SetTemplate("Default")
Mixin(RematchTableTooltip, BackdropTemplateMixin)
RematchTableTooltip:StripTextures()
RematchTableTooltip:SetTemplate("Default")
end,
WinRecordCard = function()
local self = RematchWinRecordCard
Mixin(self, BackdropTemplateMixin)
self:StripTextures()
self:SetTemplate("Transparent")
for _,button in ipairs({"SaveButton","CancelButton","ResetButton"}) do
self.Controls[button]:SkinButton()
self.Controls[button]:SetHeight(20)
end
T.SkinCloseButton(self.CloseButton)
Mixin(self.Content, BackdropTemplateMixin)
self.Content:StripTextures()
self.Content:SetTemplate("Default")
for _,stat in ipairs({"Wins","Losses","Draws"}) do
T.SkinEditBox(self.Content[stat].EditBox)
self.Content[stat].EditBox:SetBackdrop({bgFile="Interface\\ChatFrame\\ChatFrameBackground",insets={left=3,right=3,top=3,bottom=3}})
self.Content[stat].EditBox:SetBackdropColor(0,0,0)
self.Content[stat].Add:SkinButton()
self.Content[stat].Add.IconBorder:Hide()
end
end,
}
--[[ Helper functions ]]
local icons = {
Locked = {0, 0.5, 0, 0.25},
Unlocked = {0.5, 1, 0, 0.25},
Minimized = {0, 0.5, 0.25, 0.5},
Maximized = {0.5, 1, 0.25, 0.5},
SinglePanel = {0, 0.5, 0.5, 0.75},
DualPanel = {0.5, 1, 0.5, 0.75},
Pinned = {0, 0.5, 0.75, 1},
}
function skin:ColorPetListBordersPet()
for _,button in ipairs(self.buttons) do
if (button.index ~= nil) then
local petID = roster.petList[button.index]
if type(petID) == "string" 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)
else
button.Name:SetTextColor(1, 1, 1)
end
else
button.Name:SetTextColor(0.5, 0.5, 0.5)
end
end
end
end
function skin:ColorPetListBordersQueue()
for _,button in ipairs(self.buttons) do
if (button.index ~= nil) then
local petID = RematchSettings.LevelingQueue[button.index]
if type(petID) == "string" 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)
else
button.Name:SetTextColor(1, 1, 1)
end
else
button.Name:SetTextColor(0.5, 0.5, 0.5)
end
end
end
end
function skin:HandlePanelTab(tab)
if not tab then return end
for _,texture in ipairs({tab:GetRegions()}) do
if texture:GetDrawLayer()=="BACKGROUND" then
texture:SetTexture(nil)
end
end
Mixin(tab, BackdropTemplateMixin)
if tab.GetHighlightTexture and tab:GetHighlightTexture() then
tab:GetHighlightTexture():SetTexture(nil)
else
Mixin(tab, BackdropTemplateMixin)
tab:StripTextures()
end
tab.backdrop = CreateFrame("Frame", nil, tab)
Mixin(tab.backdrop, BackdropTemplateMixin)
tab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)
if bg then
tab.backdrop:SetTemplate("Overlay")
tab.backdrop:SetPoint("TOPLEFT", 3, -7)
tab.backdrop:SetPoint("BOTTOMRIGHT", -3, 2)
else
tab.backdrop:SetTemplate("Transparent")
tab.backdrop:SetPoint("TOPLEFT", 3, -3)
tab.backdrop:SetPoint("BOTTOMRIGHT", -3, 3)
end
end
function skin:HandleAutoScrollFrame(listFrame)
if not listFrame then
return
end
Mixin(listFrame, BackdropTemplateMixin)
Mixin(listFrame.Background, BackdropTemplateMixin)
listFrame:StripTextures()
listFrame.Background:StripTextures()
Mixin(listFrame.ScrollFrame, BackdropTemplateMixin)
Mixin(listFrame.ScrollFrame.ScrollBar, BackdropTemplateMixin)
listFrame.ScrollFrame:StripTextures()
listFrame.ScrollFrame.ScrollBar:StripTextures()
local upButton = listFrame.ScrollFrame.ScrollBar.UpButton
T.SkinNextPrevButton(upButton, nil, "Up")
upButton:SetSize(upButton:GetWidth() + 7,upButton:GetHeight() + 7)
local downButton = listFrame.ScrollFrame.ScrollBar.DownButton
T.SkinNextPrevButton(downButton, nil, "Down")
downButton:SetSize(downButton:GetWidth() + 7,downButton:GetHeight() + 7)
local scrollBar = listFrame.ScrollFrame.ScrollBar
scrollBar:GetThumbTexture():SetTexture(nil)
scrollBar.thumbbg = CreateFrame("Frame", nil, scrollBar)
scrollBar.thumbbg:SetPoint("TOPLEFT", scrollBar:GetThumbTexture(), "TOPLEFT", 0, -3)
scrollBar.thumbbg:SetPoint("BOTTOMRIGHT", scrollBar:GetThumbTexture(), "BOTTOMRIGHT", 0, 3)
scrollBar.thumbbg:SetTemplate("Overlay")
end
local f = CreateFrame("Frame")
f:SetScript("OnEvent",function(self)
C_Timer.After(0,function()
if Rematch.isLoaded and not self.skinDone then
for panel,func in pairs(skin.panels) do
func(Rematch[panel])
end
for _,func in pairs(skin.misc) do
func()
end
self.skinDone = true
self:UnregisterAllEvents()
end
end)
end)
f:RegisterEvent("PLAYER_LOGIN")
f:RegisterEvent("PET_JOURNAL_LIST_UPDATE")
================================================
FILE: ShestakUI/Modules/Skins/Skada.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.skada ~= true then return end
----------------------------------------------------------------------------------------
-- Skada skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("Skada") then return end
local barmod = Skada.displays["bar"]
-- Used to strip unecessary options from the in-game config
local function StripOptions(options)
options.baroptions.args.barspacing = nil
options.titleoptions.args.texture = nil
options.titleoptions.args.bordertexture = nil
options.titleoptions.args.thickness = nil
options.titleoptions.args.margin = nil
options.titleoptions.args.color = nil
options.windowoptions = nil
options.baroptions.args.barfont = nil
options.baroptions.args.reversegrowth = nil
options.titleoptions.args.font = nil
end
barmod.AddDisplayOptions_ = barmod.AddDisplayOptions
barmod.AddDisplayOptions = function(self, win, options)
self:AddDisplayOptions_(win, options)
StripOptions(options)
end
for _, options in pairs(Skada.options.args.windows.args) do
if options.type == "group" then
StripOptions(options.args)
end
end
-- Override settings from in-game GUI
barmod.ApplySettings_ = barmod.ApplySettings
barmod.ApplySettings = function(self, win)
barmod.ApplySettings_(self, win)
local skada = win.bargroup
local titlefont = CreateFont("TitleFont"..win.db.name)
titlefont:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
titlefont:SetShadowColor(0, 0, 0, C.font.stylization_font_shadow and 1 or 0)
if win.db.enabletitle then
skada.button:SetNormalFontObject(titlefont)
skada.button:SetBackdrop(nil)
skada.button:GetFontString():SetPoint("TOPLEFT", skada.button, "TOPLEFT", 2, -2)
skada.button:SetHeight(19)
if not skada.button.backdrop then
skada.button:CreateBackdrop("Transparent")
skada.button.backdrop:SetPoint("TOPLEFT", win.bargroup.button, "TOPLEFT", -2, 2)
skada.button.backdrop:SetPoint("BOTTOMRIGHT", win.bargroup.button, "BOTTOMRIGHT", 2, 5)
end
skada.button.bg = skada.button:CreateTexture(nil, "BACKGROUND")
skada.button.bg:SetTexture(C.media.texture)
skada.button.bg:SetVertexColor(unpack(C.media.border_color))
skada.button.bg:SetPoint("TOPLEFT", win.bargroup.button, "TOPLEFT", 0, 0)
skada.button.bg:SetPoint("BOTTOMRIGHT", win.bargroup.button, "BOTTOMRIGHT", 0, 7)
end
skada:SetTexture(C.media.texture)
skada:SetSpacing(7)
skada:SetBackdrop(nil)
skada.borderFrame:SetBackdrop(nil)
end
hooksecurefunc(Skada, "UpdateDisplay", function(self)
for _, win in ipairs(self:GetWindows()) do
for _, v in pairs(win.bargroup:GetBars()) do
if not v.BarStyled then
if not v.backdrop then
v:CreateBackdrop("Transparent")
end
v:SetHeight(12)
v.label:ClearAllPoints()
v.label.ClearAllPoints = T.dummy
v.label:SetPoint("LEFT", v, "LEFT", 2, 0)
v.label.SetPoint = T.dummy
v.label:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
v.label.SetFont = T.dummy
v.label:SetShadowOffset(0, 0)
v.label.SetShadowOffset = T.dummy
v.timerLabel:ClearAllPoints()
v.timerLabel.ClearAllPoints = T.dummy
v.timerLabel:SetPoint("RIGHT", v, "RIGHT", 0, 0)
v.timerLabel.SetPoint = T.dummy
v.timerLabel:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
v.timerLabel.SetFont = T.dummy
v.timerLabel:SetShadowOffset(0, 0)
v.timerLabel.SetShadowOffset = T.dummy
v.BarStyled = true
end
if v.icon and v.icon:IsShown() then
v.backdrop:SetPoint("TOPLEFT", -14, 2)
v.backdrop:SetPoint("BOTTOMRIGHT", 2, -2)
else
v.backdrop:SetPoint("TOPLEFT", -2, 2)
v.backdrop:SetPoint("BOTTOMRIGHT", 2, -2)
end
end
end
end)
hooksecurefunc(Skada, "OpenReportWindow", function(self)
if not self.ReportWindow.frame.reskinned then
self.ReportWindow.frame:StripTextures()
self.ReportWindow.frame:SetTemplate("Transparent")
T.SkinCloseButton(self.ReportWindow.frame:GetChildren())
self.ReportWindow.frame.reskinned = true
end
end)
-- Update pre-existing displays
for _, window in ipairs(Skada:GetWindows()) do
window:UpdateDisplay()
end
end)
================================================
FILE: ShestakUI/Modules/Skins/TinyDPS.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.tiny_dps ~= true then return end
----------------------------------------------------------------------------------------
-- TinyDPS skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("TinyDPS") then return end
tdps.width = 221
tdps.barHeight = 12
tdps.spacing = 3
tdps.border = {0, 0, 0, 0}
tdps.backdrop = {0, 0, 0, 0}
tdps.barbackdrop = {0, 0, 0, 0}
tdps.swapColor = true
tdps.showMinimapButton = false
tdps.layout = 11
tdpsVisibleBars = 7
tdpsFont.name = C.font.stylization_font
tdpsFont.size = C.font.stylization_font_size
tdpsFont.outline = C.font.stylization_font_style
tdpsFont.shadow = C.font.stylization_font_shadow and 1 or 0
tdpsTextOffset = 0
tdpsFrame:SetTemplate("Default")
noData:SetTextColor(1, 1, 1, 1)
if tdpsStatusBar then
tdpsStatusBar:SetStatusBarTexture(C.media.texture)
end
end)
================================================
FILE: ShestakUI/Modules/Skins/VanasKoS.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.vanaskos ~= true then return end
----------------------------------------------------------------------------------------
-- VanasKoS skin
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("VanasKoS") then return end
table.insert(UISpecialFrames, "VanasKoSFrame")
VanasKoS_WarnFrame:SetTemplate("Transparent")
VanasKoS_WarnFrame.SetBackdropBorderColor = T.dummy
VanasKoS_FontKos:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
VanasKoS_FontEnemy:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
VanasKoS_FontFriendly:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
VanasKoS_FontNormal:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
VanasKoSFrame:StripTextures(true)
VanasKoSFrame:CreateBackdrop("Transparent")
VanasKoSFrame.backdrop:SetPoint("TOPLEFT", 16, -12)
VanasKoSFrame.backdrop:SetPoint("BOTTOMRIGHT", -30, 75)
VanasKoSListFrameChangeButton:SkinButton()
VanasKoSListFrameRemoveButton:SkinButton()
VanasKoSListFrameAddButton:SkinButton()
VanasKoSListFrameConfigurationButton:SkinButton()
T.SkinCloseButton(VanasKosFrameCloseButton, VanasKoSFrame.backdrop)
T.SkinCheckBox(VanasKoSListFrameCheckBox)
T.SkinNextPrevButton(VanasKoSListFrameToggleRightButton)
T.SkinNextPrevButton(VanasKoSListFrameToggleLeftButton)
T.SkinDropDownBox(VanasKoSPvPStatsCharacterDropDown, 90)
T.SkinDropDownBox(VanasKoSPvPStatsTimeSpanDropDown, 90)
T.SkinDropDownBox(VanasKoSFrameChooseListDropDown)
T.SkinEditBox(VanasKoSListFrameSearchBox, nil, 18)
for i = 1, 2 do
T.SkinTab(_G["VanasKoSFrameTab"..i])
end
for i = 1, 5 do
_G["VanasKoSListFrameColButton"..i]:StripTextures()
end
VanasKoSPvPStatsCharacterDropDown:ClearAllPoints()
VanasKoSPvPStatsCharacterDropDown:SetPoint("RIGHT", VanasKoSListFrameToggleLeftButton, "LEFT", -7, 0)
VanasKoSPvPStatsTimeSpanDropDown:ClearAllPoints()
VanasKoSPvPStatsTimeSpanDropDown:SetPoint("RIGHT", VanasKoSPvPStatsCharacterDropDown, "LEFT", 10, 0)
VanasKoSListFrameAddButton:ClearAllPoints()
VanasKoSListFrameAddButton:SetPoint("BOTTOMRIGHT", VanasKoSFrame.backdrop, "BOTTOMRIGHT", -4, 4)
VanasKoSListFrameRemoveButton:ClearAllPoints()
VanasKoSListFrameRemoveButton:SetPoint("RIGHT", VanasKoSListFrameAddButton, "LEFT", -3, 0)
VanasKoSListFrameChangeButton:ClearAllPoints()
VanasKoSListFrameChangeButton:SetPoint("RIGHT", VanasKoSListFrameRemoveButton, "LEFT", -3, 0)
VanasKoSListFrameConfigurationButton:ClearAllPoints()
VanasKoSListFrameConfigurationButton:SetPoint("BOTTOMRIGHT", VanasKoSListFrameAddButton, "TOPRIGHT", 0, 3)
VanasKoSListFrameSearchBox:ClearAllPoints()
VanasKoSListFrameSearchBox:SetPoint("RIGHT", VanasKoSListFrameConfigurationButton, "LEFT", -5, 0)
end)
================================================
FILE: ShestakUI/Modules/Skins/WeakAuras.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.weak_auras ~= true then return end
----------------------------------------------------------------------------------------
-- WeakAuras skin
----------------------------------------------------------------------------------------
if not IsAddOnLoaded("WeakAuras") then return end
local i = 0
local function Skin_WeakAuras(frame, type)
if not frame.styled then
if type == "icon" then
frame.b = CreateFrame("Frame", nil, frame)
frame.b:CreateBackdrop("Transparent")
frame.b:SetInside(frame)
frame.b.backdrop:SetBackdropColor(0, 0, 0, 0)
frame.b.backdrop:HookScript("OnUpdate", function(self)
self:SetAlpha(frame.icon:GetAlpha())
end)
frame.icon:SetAllPoints(frame.b)
frame.styled = true
elseif type == "aurabar" then
if i < 50 then
frame.bar:CreateBackdrop("Transparent")
frame.bar.backdrop:SetBackdropColor(0, 0, 0, 0)
else
frame.bar:CreateBackdrop("Default")
end
i = i + 1
frame.styled = true
end
end
if frame.icon then
frame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
frame.icon.SetTexCoord = T.dummy
end
if frame.bar then
frame.bar.fg:SetTexture(C.media.texture)
frame.bar.bg:SetTexture(C.media.texture)
end
if frame.stacks then
frame.stacks:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
frame.stacks:SetShadowOffset(C.media.cooldown_timers_font_shadow and 1 or 0, C.media.cooldown_timers_font_shadow and -1 or 0)
end
if frame.text then
frame.text:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
frame.text:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
end
if frame.text2 then
frame.text2:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
frame.text2:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
end
if frame.timer then
frame.timer:SetFont(C.font.cooldown_timers_font, C.font.cooldown_timers_font_size, C.font.cooldown_timers_font_style)
frame.timer:SetShadowOffset(C.font.cooldown_timers_font_shadow and 1 or 0, C.font.cooldown_timers_font_shadow and -1 or 0)
end
end
hooksecurefunc(WeakAuras.regionPrototype, "create", function(region)
if region.regionType == "icon" or region.regionType == "aurabar" then
Skin_WeakAuras(region, region.regionType)
end
end)
hooksecurefunc(WeakAuras.regionPrototype, "modifyFinish", function(_, region)
if region.regionType == "icon" or region.regionType == "aurabar" then
Skin_WeakAuras(region, region.regionType)
end
end)
================================================
FILE: ShestakUI/Modules/Skins/lsToasts.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.skins.ls_toasts ~= true or not IsAddOnLoaded("ls_Toasts") then return end
----------------------------------------------------------------------------------------
-- ls:Toasts skin
----------------------------------------------------------------------------------------
local toast_F = unpack(ls_Toasts)
function toast_F:SkinToast(toast, toastType)
toast:SetFrameStrata("DIALOG")
toast.Border:SetAlpha(0)
toast:SetTemplate("Default")
toast.BG:SetAlpha(0.9)
toast.BG:SetPoint("TOPLEFT", toast, 0, 0)
toast.BG:SetPoint("BOTTOMRIGHT", toast, 0, 0)
if toast.Level then
toast.Level:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
toast.Level:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
if toast.Count then
toast.Count:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
toast.Count:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
toast.CountUpdate:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
toast.CountUpdate:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
if toast.Points then
toast.Points:SetFont(C.font.stylization_font, C.font.stylization_font_size, C.font.stylization_font_style)
toast.Points:SetShadowOffset(C.font.stylization_font_shadow and 1 or 0, C.font.stylization_font_shadow and -1 or 0)
end
if toastType == "mission" or toastType == "follower" then return end
if toast.IconBorder then
if toastType == "misc" then
local texture = toast.BG:GetTexture()
if texture == "Interface\\AddOns\\ls_Toasts\\media\\toast-bg-archaeology" then return end
end
toast.IconBorder:Hide()
toast:CreateBackdrop("Default")
toast.backdrop:SetPoint("TOPLEFT", toast.IconBorder, 1, -1)
toast.backdrop:SetPoint("BOTTOMRIGHT", toast.IconBorder, -1, 1)
toast.backdrop:SetBackdropColor(0, 0, 0, 0)
local r, g, b = toast.IconBorder:GetVertexColor()
toast.backdrop:SetBackdropBorderColor(r, g, b, 1)
toast.backdrop:SetFrameStrata("FULLSCREEN")
if toast.Icon then
toast.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
toast.Icon:SetPoint("TOPLEFT", toast.IconBorder, 2, -2)
toast.Icon:SetPoint("BOTTOMRIGHT", toast.IconBorder, -2, 2)
end
end
end
================================================
FILE: ShestakUI/Modules/Tooltip/Achievement.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.achievements ~= true then return end
----------------------------------------------------------------------------------------
-- Your achievement status in tooltip(Enhanced Achievements by Syzgyn)
----------------------------------------------------------------------------------------
local function SetHyperlink(tooltip, refString)
if select(3, string.find(refString, "(%a-):")) ~= "achievement" then return end
local _, _, achievementID = string.find(refString, ":(%d+):")
local _, _, GUID = string.find(refString, ":%d+:(.-):")
if GUID == UnitGUID("player") then
tooltip:Show()
return
end
tooltip:AddLine(" ")
local _, _, _, completed, _, _, _, _, _, _, _, _, wasEarnedByMe, earnedBy = GetAchievementInfo(achievementID)
if completed then
if earnedBy then
if earnedBy ~= "" then
tooltip:AddLine(format(ACHIEVEMENT_EARNED_BY, earnedBy))
end
if not wasEarnedByMe then
tooltip:AddLine(format(ACHIEVEMENT_NOT_COMPLETED_BY, T.name))
elseif T.name ~= earnedBy then
tooltip:AddLine(format(ACHIEVEMENT_COMPLETED_BY, T.name))
end
end
end
tooltip:Show()
end
hooksecurefunc(GameTooltip, "SetHyperlink", SetHyperlink)
hooksecurefunc(ItemRefTooltip, "SetHyperlink", SetHyperlink)
================================================
FILE: ShestakUI/Modules/Tooltip/HyperLink.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.chat.enable ~= true or C.tooltip.enable ~= true or IsAddOnLoaded("tekKompare") then return end
----------------------------------------------------------------------------------------
-- Based on tekKompare(by Tekkub)
----------------------------------------------------------------------------------------
local orig1, orig2, GameTooltip = {}, {}, GameTooltip
local linktypes = {item = true, enchant = true, spell = true, quest = true, unit = true, talent = true, achievement = true, glyph = true, instancelock = true, currency = true}
local function OnHyperlinkEnter(frame, link, ...)
local linktype = link:match("^([^:]+)")
if linktype and linktype == "battlepet" then
GameTooltip:SetOwner(frame, "ANCHOR_TOPLEFT", -3, 0)
GameTooltip:Show()
local _, speciesID, level, breedQuality, maxHealth, power, speed = strsplit(":", link)
BattlePetToolTip_Show(tonumber(speciesID), tonumber(level), tonumber(breedQuality), tonumber(maxHealth), tonumber(power), tonumber(speed))
elseif linktype and linktypes[linktype] then
GameTooltip:SetOwner(frame, "ANCHOR_TOPLEFT", -3, 0)
GameTooltip:SetHyperlink(link)
GameTooltip:Show()
end
if orig1[frame] then return orig1[frame](frame, link, ...) end
end
local function OnHyperlinkLeave(frame, link, ...)
if BattlePetTooltip:IsShown() then
BattlePetTooltip:Hide()
else
GameTooltip:Hide()
end
if orig1[frame] then return orig1[frame](frame, link, ...) end
end
for i = 1, NUM_CHAT_WINDOWS do
local frame = _G["ChatFrame"..i]
orig1[frame] = frame:GetScript("OnHyperlinkEnter")
frame:SetScript("OnHyperlinkEnter", OnHyperlinkEnter)
orig2[frame] = frame:GetScript("OnHyperlinkLeave")
frame:SetScript("OnHyperlinkLeave", OnHyperlinkLeave)
end
================================================
FILE: ShestakUI/Modules/Tooltip/InstanceLockCompare.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.instance_lock ~= true then return end
----------------------------------------------------------------------------------------
-- Your instance lock status in tooltip(Instance Lock Compare by Dridzt)
----------------------------------------------------------------------------------------
local myTip = CreateFrame("GameTooltip", "InstanceLockTooltip", nil, "GameTooltipTemplate")
local function ILockCompare(frame, link)
if not frame or not link then return end
local linkType = string.match(link, "(instancelock):")
if linkType == "instancelock" then
local mylink, templink
local myguid = UnitGUID("player")
local guid = string.match(link, "instancelock:([^:]+)")
if guid ~= myguid then
local instanceguid = string.match(link, "instancelock:[^:]+:(%d+):")
local numsaved = GetNumSavedInstances()
if numsaved > 0 then
for i = 1, numsaved do
local locked, extended = select(5, GetSavedInstanceInfo(i))
if extended or locked then
templink = GetSavedInstanceChatLink(i)
local myinstanceguid = string.match(templink, "instancelock:[^:]+:(%d+):")
if myinstanceguid == instanceguid then
mylink = string.match(templink, "(instancelock:[^:]+:%d+:%d+:%d+)")
break
end
end
end
mylink = mylink or string.gsub(link, "(instancelock:)([^:]+)(:%d+:%d+:)(%d+)", function(a, g, b, k) g = myguid; k = "0"; return a..g..b..k end)
else
mylink = string.gsub(link, "(instancelock:)([^:]+)(:%d+:%d+:)(%d+)", function(a, g, b, k) g = myguid; k = "0"; return a..g..b..k end)
end
end
if mylink then
if not myTip:IsVisible() and frame:IsVisible() then
myTip:SetParent(frame)
myTip:SetOwner(frame, "ANCHOR_NONE")
myTip:SetTemplate("Transparent")
local side = "left"
local rightDist = 0
local leftPos = frame:GetLeft()
local rightPos = frame:GetRight()
if not rightPos then
rightPos = 0
end
if not leftPos then
leftPos = 0
end
rightDist = GetScreenWidth() - rightPos
if leftPos and (rightDist < leftPos) then
side = "left"
else
side = "right"
end
myTip:ClearAllPoints()
if side == "left" then
myTip:SetPoint("TOPRIGHT", frame, "TOPLEFT", -3, -10)
elseif side == "right" then
myTip:SetPoint("TOPLEFT", frame, "TOPRIGHT", 3, -10)
end
myTip:SetHyperlink(mylink)
myTip:Show()
end
end
end
end
ItemRefTooltip:HookScript("OnDragStop", function(self)
if myTip:IsVisible() and (myTip:GetParent():GetName() == self:GetName()) then
local side = "left"
local rightDist = 0
local leftPos = self:GetLeft()
local rightPos = self:GetRight()
if not rightPos then
rightPos = 0
end
if not leftPos then
leftPos = 0
end
rightDist = GetScreenWidth() - rightPos
if leftPos and (rightDist < leftPos) then
side = "left"
else
side = "right"
end
myTip:ClearAllPoints()
if side == "left" then
myTip:SetPoint("TOPRIGHT", self, "TOPLEFT", -3, -10)
elseif side == "right" then
myTip:SetPoint("TOPLEFT", self, "TOPRIGHT", 3, -10)
end
end
end)
hooksecurefunc(GameTooltip, "SetHyperlink", ILockCompare)
hooksecurefunc(ItemRefTooltip,"SetHyperlink", ILockCompare)
================================================
FILE: ShestakUI/Modules/Tooltip/ItemCount.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.item_count ~= true then return end
----------------------------------------------------------------------------------------
-- Item count in bags and bank(by Tukz)
----------------------------------------------------------------------------------------
local function OnTooltipSetItem(self, data)
if self ~= GameTooltip or self:IsForbidden() then return end
local num = GetItemCount(data.id, true)
if num > 1 then
self:AddLine("|cffffffff"..L_TOOLTIP_ITEM_COUNT.." "..num.."|r")
end
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, OnTooltipSetItem)
================================================
FILE: ShestakUI/Modules/Tooltip/ItemIcons.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.item_icon ~= true then return end
----------------------------------------------------------------------------------------
-- Adds item icons to tooltips(Tipachu by Tuller)
----------------------------------------------------------------------------------------
local function setTooltipIcon(self, icon)
local title = icon and _G[self:GetName().."TextLeft1"]
local text = title:GetText()
if title and text and not text:find("|T"..icon) then
title:SetFormattedText("|T%s:20:20:0:0:64:64:5:59:5:59:%d|t %s", icon, 20, text)
end
end
local whiteTooltip = {
[GameTooltip] = true,
[ItemRefTooltip] = true,
[ItemRefShoppingTooltip1] = true,
[ItemRefShoppingTooltip2] = true,
[ShoppingTooltip1] = true,
[ShoppingTooltip2] = true,
}
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, function(self, data)
if whiteTooltip[self] and not self:IsForbidden() then
if data and data.id then
setTooltipIcon(self, GetItemIcon(data.id))
end
end
end)
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Spell, function(self, data)
if whiteTooltip[self] and not self:IsForbidden() then
if data and data.id then
setTooltipIcon(self, select(3, GetSpellInfo(data.id)))
end
end
end)
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Macro, function(self, data)
if whiteTooltip[self] and not self:IsForbidden() then
local lineData = data.lines and data.lines[1]
local tooltipType = lineData and lineData.tooltipType
if not tooltipType then return end
if tooltipType == 0 then -- item
setTooltipIcon(self, GetItemIcon(lineData.tooltipID))
elseif tooltipType == 1 then -- spell
setTooltipIcon(self, select(3, GetSpellInfo(lineData.tooltipID)))
end
end
end)
================================================
FILE: ShestakUI/Modules/Tooltip/ItemLevel.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.average_lvl ~= true then return end
----------------------------------------------------------------------------------------
-- Equipped average item level(AverageItemLevel by Semlar)
----------------------------------------------------------------------------------------
local F, Events = CreateFrame("frame"), {}
local function Raise(_, event, ...)
if Events[event] then
for module in pairs(Events[event]) do
module[event](module, ...)
end
end
end
local function RegisterEvent(module, event, func)
if func then
rawset(module, event, func)
end
if not Events[event] then
Events[event] = {}
end
Events[event][module] = true
if strmatch(event, "^[%u_]+$") then
pcall(function() return F:RegisterEvent(event) end)
end
return module
end
local function UnregisterEvent(module, event)
if Events[event] then
Events[event][module] = nil
if not next(Events[event]) and strmatch(event, "^[%u_]+$") then
F:UnregisterEvent(event)
end
end
return module
end
local Module = {
__newindex = RegisterEvent,
__call = Raise,
__index = {
RegisterEvent = RegisterEvent,
UnregisterEvent = UnregisterEvent,
Raise = Raise,
},
}
T.Eve = setmetatable({}, {
__call = function(eve)
local module = setmetatable({}, Module)
eve[ #eve + 1 ] = module
return module
end,
})
F:SetScript("OnEvent", Raise)
local E = T:Eve()
local CACHE_TIMEOUT = 5
local GuidCache = {}
local ActiveGUID
local ScannedGUID
local INSPECT_TIMEOUT = 1.5
local function GetUnitIDFromGUID(guid)
local _, _, _, _, _, name = GetPlayerInfoByGUID(guid)
if UnitExists(name) then -- unit is in our group and can use its name as a unit ID
return name, name
elseif UnitGUID("mouseover") == guid then -- unit is under our cursor
return "mouseover", name
elseif UnitGUID("target") == guid then -- unit is our target
return "target", name
elseif GetCVar("nameplateShowFriends") == "1" then -- friendly nameplates are visible
for i = 1, 30 do
local unitID = "nameplate"..i
local nameplateGUID = UnitGUID(unitID)
if nameplateGUID then
if nameplateGUID == guid then
return unitID, name
end
else
break
end
end
else -- scan every group member"s target (this is probably overkill)
local numMembers = GetNumGroupMembers()
if numMembers > 0 then
local unitPrefix = IsInRaid() and "raid" or "party"
if unitPrefix == "party" then numMembers = numMembers - 1 end
for i = 1, numMembers do
local unitID = unitPrefix..i.."-target"
local targetGUID = UnitGUID(unitID)
if targetGUID == guid then
return unitID, name
end
end
end
end
return nil, name
end
local function ColorDiff(p, t)
local diff = t - p
local r, g, b
if diff >= 10 then
r, g, b = 1, 0.1, 0.1
elseif diff >= 5 then
r, g, b = 1, 0.5, 0.25
elseif diff >= -5 then
r, g, b = 1, 1, 0
elseif diff >= -10 then
r, g, b = 0.25, 0.75, 0.25
else
r, g, b = 0.7, 0.7, 0.7
end
return r, g, b
end
local ItemLevelPattern1 = ITEM_LEVEL:gsub("%%d", "(%%d+)")
local ItemLevelPattern2 = ITEM_LEVEL_ALT:gsub("([()])", "%%%1"):gsub("%%d", "(%%d+)")
local TwoHanders = {
["INVTYPE_RANGED"] = true,
["INVTYPE_RANGEDRIGHT"] = true,
["INVTYPE_2HWEAPON"] = true,
}
local InventorySlots = {}
for i = 1, 17 do
if i ~= 4 then -- ignore shirt, tabard is 19
tinsert(InventorySlots, i)
end
end
local function IsArtifact(itemLink)
return itemLink:find("|cffe6cc80") -- this is probably a horrible way to find whether it"s an artifact
end
local function IsCached(itemLink) -- we can"t get the correct level of an artifact until all of its relics have been cached
local cached = true
local _, itemID, _, relic1, relic2, relic3 = strsplit(":", itemLink)
if not GetDetailedItemLevelInfo(itemID) then cached = false end
if IsArtifact(itemLink) then
if relic1 and relic1 ~= "" and not GetDetailedItemLevelInfo(relic1) then cached = false end
if relic2 and relic2 ~= "" and not GetDetailedItemLevelInfo(relic2) then cached = false end
if relic3 and relic3 ~= "" and not GetDetailedItemLevelInfo(relic3) then cached = false end
end
return cached
end
local Sekret = "|Hilvl|h"
local function AddLine(sekret, leftText, rightText, prefixColor, detailColor, dontShow)
leftText = sekret..leftText
for i = 2, GameTooltip:NumLines() do
local line = _G["GameTooltipTextLeft"..i]
local text = line and line:IsShown() and line:GetText()
if text and text:find(sekret) then
line:SetText(prefixColor..leftText..detailColor..rightText)
GameTooltip:Show()
return
end
end
if not dontShow or GameTooltip:IsShown() then
GameTooltip:AddLine(prefixColor..leftText..detailColor..rightText)
GameTooltip:Show()
end
end
local SlotCache = {} -- [slot] = itemLevel or false
local ItemCache = {} -- [slot] = itemLink
local TestTips = {}
for _, slot in pairs(InventorySlots) do
local tip = CreateFrame("GameTooltip", "AverageItemLevelTooltip"..slot, nil, "GameTooltipTemplate")
tip:SetOwner(WorldFrame, "ANCHOR_NONE")
TestTips[slot] = tip
tip.slot = slot
end
function OnTooltipSetItem(self)
local slot = self.slot
if(not slot) then
return
end
local _, itemLink = self:GetItem()
local tipName = self:GetName()
if self.itemLink then
itemLink = self.itemLink
end
if itemLink then
local isCached = IsCached(itemLink)
if isCached then
for i = 2, self:NumLines() do
local str = _G[tipName.."TextLeft"..i]
local text = str and str:GetText()
if text then
local ilevel = text:match(ItemLevelPattern1)
if not ilevel then
ilevel = text:match(ItemLevelPattern2)
end
if ilevel then
SlotCache[slot] = tonumber(ilevel)
ItemCache[slot] = itemLink
end
end
end
end
end
local finished = true
local totalItemLevel = 0
for slot, ilevel in pairs(SlotCache) do
if not ilevel then
finished = false
break
else
if slot ~= 16 and slot ~= 17 then
totalItemLevel = totalItemLevel + ilevel
end
end
end
if finished then
local weaponLevel = 0
local isDual = false
if SlotCache[16] and SlotCache[17] then -- we have 2 weapons
isDual = true
if IsArtifact(ItemCache[16]) or IsArtifact(ItemCache[17]) then -- take the higher of the 2 weapons and double it
local ilevelMain = SlotCache[16]
local ilevelOff = SlotCache[17]
weaponLevel = ilevelMain > ilevelOff and ilevelMain or ilevelOff
totalItemLevel = totalItemLevel + (weaponLevel * 2)
else
local ilevelMain = SlotCache[16]
local ilevelOff = SlotCache[17]
totalItemLevel = totalItemLevel + ilevelMain + ilevelOff
if ilevelMain > ilevelOff then
weaponLevel = ilevelMain
else
weaponLevel = ilevelOff
end
end
elseif SlotCache[16] then -- main hand only
local _, _, _, weaponType = GetItemInfoInstant(ItemCache[16])
local ilevelMain = SlotCache[16]
weaponLevel = ilevelMain
if TwoHanders[weaponType] then -- 2 handed, count it twice
totalItemLevel = totalItemLevel + (ilevelMain * 2)
else
totalItemLevel = totalItemLevel + ilevelMain
end
elseif SlotCache[17] then -- off hand only?
local ilevelOff = SlotCache[17]
totalItemLevel = totalItemLevel + ilevelOff
weaponLevel = ilevelOff
end
if weaponLevel >= 900 and ScannedGUID ~= UnitGUID("player") then
weaponLevel = weaponLevel + 15
if isDual then
totalItemLevel = totalItemLevel + 15
else
totalItemLevel = totalItemLevel + 30
end
end
local averageItemLevel = totalItemLevel / 16
-- should we just return the cache for this GUID?
local guid = ScannedGUID
if not GuidCache[guid] then
GuidCache[guid] = {}
end
GuidCache[guid].ilevel = averageItemLevel
GuidCache[guid].weaponLevel = weaponLevel
GuidCache[guid].timestamp = GetTime()
E("ItemScanComplete", guid, GuidCache[guid])
end
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, OnTooltipSetItem)
local function GetTooltipGUID()
local _, unitID = GameTooltip:GetUnit()
local guid = unitID and UnitGUID(unitID)
if UnitIsPlayer(unitID) and CanInspect(unitID) then
return guid
end
end
local f = CreateFrame("frame", nil, GameTooltip)
local ShouldInspect = false
lastInspectRequest = 0
local FailTimeout = 1
f:SetScript("OnUpdate", function()
local _, unitID = GameTooltip:GetUnit()
local guid = unitID and UnitGUID(unitID)
if not guid or (InspectFrame and InspectFrame:IsVisible()) then return end
local timeSince = GetTime() - lastInspectRequest
if ShouldInspect and (ActiveGUID == guid or (timeSince >= INSPECT_TIMEOUT)) then
ShouldInspect = false
if ActiveGUID ~= guid then
local cache = GuidCache[guid]
if cache and GetTime() - cache.timestamp <= CACHE_TIMEOUT then
elseif CanInspect(unitID) then
NotifyInspect(unitID)
end
end
elseif ShouldInspect and (timeSince < INSPECT_TIMEOUT) then
if unitID and UnitIsPlayer(unitID) and CanInspect(unitID) and not GuidCache[ guid ]then
AddLine(Sekret, QUEUED_STATUS_WAITING..": ", format("%.1fs", INSPECT_TIMEOUT - (GetTime() - lastInspectRequest)), "|cff9A9A9A", "|cff9A9A9A")
end
else
if ActiveGUID then
if guid == ActiveGUID then
if timeSince <= FailTimeout then
AddLine(Sekret, SEARCH..": ", format("%d%%", timeSince / FailTimeout * 100), "|cff9A9A9A", "|cff9A9A9A")
else
AddLine(Sekret, SEARCH..": ", FAILED, "|cff9A9A9A", "|cff9A9A9A")
ActiveGUID = nil
end
else
ActiveGUID = nil
if timeSince > FailTimeout and CanInspect(unitID) then
NotifyInspect(unitID)
end
end
end
end
end)
hooksecurefunc("NotifyInspect", function(unitID)
if not GuidCache[UnitGUID(unitID)] then
ActiveGUID = UnitGUID(unitID)
end
lastInspectRequest = GetTime()
end)
hooksecurefunc("ClearInspectPlayer", function()
ActiveGUID = nil
end)
local function DoInspect()
ShouldInspect = true
end
local function DecorateTooltip(guid, isInspect)
local cache = GuidCache[guid]
if not cache then return end
if GetTooltipGUID() == guid or (isInspect and guid == UnitGUID("target")) then
local _, ourEquippedItemLevel = GetAverageItemLevel()
local averageItemLevel = cache.ilevel or 0
local r1, g1, b1 = ColorDiff(ourEquippedItemLevel, averageItemLevel)
local _, unitID = GameTooltip:GetUnit()
if isInspect then
unitID = "target"
end
local levelText = format("|cff%2x%2x%2x%.1f|r", r1 * 255, g1 * 255, b1 * 255, averageItemLevel)
if isInspect and averageItemLevel > 0 then
InspectFrameiLvL:SetText(levelText)
end
AddLine(Sekret, STAT_AVERAGE_ITEM_LEVEL..": ", levelText, "|cffF9D700", "|cffffffff")
end
end
local function ScanUnit(unitID)
ScannedGUID = UnitGUID(unitID)
wipe(SlotCache)
wipe(ItemCache)
local numEquipped = 0
for _, slot in pairs(InventorySlots) do
if GetInventoryItemTexture(unitID, slot) then
SlotCache[slot] = false
numEquipped = numEquipped + 1
end
end
if numEquipped > 0 then
for slot in pairs(SlotCache) do
TestTips[slot].itemLink = GetInventoryItemLink(unitID, slot)
TestTips[slot]:SetOwner(WorldFrame, "ANCHOR_NONE")
TestTips[slot]:SetInventoryItem(unitID, slot)
end
else
local guid = ScannedGUID
if not GuidCache[guid] then GuidCache[guid] = {} end
GuidCache[guid].ilevel = 0
GuidCache[guid].weaponLevel = 0
GuidCache[guid].timestamp = GetTime()
E("ItemScanComplete", guid, GuidCache[guid])
end
end
function E:INSPECT_READY(guid)
ActiveGUID = nil
local unitID = GetUnitIDFromGUID(guid)
if unitID then
-- local _, class = UnitClass(unitID)
-- local colors = class and RAID_CLASS_COLORS[class]
-- local specID = GetInspectSpecialization(unitID)
-- local specName
-- if not specName and specID and specID ~= 0 then
-- specID, specName = GetSpecializationInfoByID(specID, UnitSex(unitID))
-- if colors then
-- specName = "|c"..colors.colorStr..specName.."|r"
-- end
-- end
if not GuidCache[guid] then
GuidCache[guid] = {
ilevel = 0,
weaponLevel = 0,
timestamp = 0,
}
end
-- local cache = GuidCache[guid]
-- cache.specID = specID
-- cache.class = class
-- cache.specName = specName
-- cache.itemLevel = C_PaperDollInfo.GetInspectItemLevel(unitID)
ScanUnit(unitID)
end
end
local function InspectLevel()
if not InspectFrameiLvL then
local text = InspectModelFrame:CreateFontString("InspectFrameiLvL", "OVERLAY", "SystemFont_Outline_Small")
text:SetPoint("BOTTOM", 5, 20)
text:Hide()
InspectPaperDollFrame:HookScript("OnShow", function()
text:Show()
DecorateTooltip(UnitGUID("target"), true)
end)
InspectPaperDollFrame:HookScript("OnHide", function()
text:Hide()
end)
end
end
function E:ADDON_LOADED(addon)
if addon == "Blizzard_InspectUI" then
InspectLevel()
end
end
function E:ItemScanComplete(guid)
DecorateTooltip(guid)
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, function(self)
if self ~= GameTooltip or self:IsForbidden() then return end
if C.tooltip.show_shift and not IsShiftKeyDown() then return end
local _, unitID = self:GetUnit()
local guid = unitID and UnitGUID(unitID)
if guid and UnitIsPlayer(unitID) then
local cache = GuidCache[guid]
if cache then
DecorateTooltip(guid)
end
if CanInspect(unitID) then
DoInspect()
end
end
end)
----------------------------------------------------------------------------------------
-- Character Info Sheet
----------------------------------------------------------------------------------------
MIN_PLAYER_LEVEL_FOR_ITEM_LEVEL_DISPLAY = 1
hooksecurefunc("PaperDollFrame_SetItemLevel", function(self, unit)
if unit ~= "player" then return end
local total, equip = GetAverageItemLevel()
if total > 0 then total = string.format("%.1f", total) end
if equip > 0 then equip = string.format("%.1f", equip) end
local ilvl = equip
if equip ~= total then
ilvl = equip.." / "..total
end
self.Value:SetText(ilvl)
self.tooltip = "|cffffffff"..STAT_AVERAGE_ITEM_LEVEL..": "..ilvl
end)
================================================
FILE: ShestakUI/Modules/Tooltip/MountSource.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.mount ~= true then return end
----------------------------------------------------------------------------------------
-- Show source of mount
----------------------------------------------------------------------------------------
local MountCache = {}
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
for _, mountID in ipairs(C_MountJournal.GetMountIDs()) do
MountCache[select(2, C_MountJournal.GetMountInfoByID(mountID))] = mountID
end
end)
hooksecurefunc(GameTooltip, "SetUnitBuffByAuraInstanceID", function(self, ...)
if not UnitIsPlayer(...) or UnitIsUnit(..., "player") then return end
local aura = C_UnitAuras.GetAuraDataByAuraInstanceID(...)
local id = aura and aura.spellId
if id and MountCache[id] then
local text = NOT_COLLECTED
local r, g, b = 1, 0, 0
local collected = select(11, C_MountJournal.GetMountInfoByID(MountCache[id]))
if collected then
text = COLLECTED
r, g, b = 0, 1, 0
end
self:AddLine(" ")
self:AddLine(text, r, g, b)
local sourceText = select(3, C_MountJournal.GetMountInfoExtraByID(MountCache[id]))
self:AddLine(sourceText, 1, 1, 1)
self:AddLine(" ")
self:Show()
end
end)
================================================
FILE: ShestakUI/Modules/Tooltip/MultiItemRef.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Multi ItemRefTooltip
----------------------------------------------------------------------------------------
local tips = {[1] = _G["ItemRefTooltip"]}
local types = {item = true, enchant = true, spell = true, quest = true, unit = true, talent = true, achievement = true, glyph = true, instancelock = true, currency = true}
local shown
local CreateTip = function(link)
for _, v in ipairs(tips) do
for _, tip in ipairs(tips) do
if tip:IsShown() and tip.link == link then
tip.link = nil
HideUIPanel(tip)
return
end
end
if not v:IsShown() then
v.link = link
return v
end
end
local num = #tips + 1
local tip = CreateFrame("GameTooltip", "ItemRefTooltip"..num, UIParent, "GameTooltipTemplate")
if num == 2 then
tip:SetPoint("LEFT", ItemRefTooltip, "RIGHT", 3, 0)
else
tip:SetPoint("LEFT", "ItemRefTooltip"..num - 1, "RIGHT", 3, 0)
end
tip:SetSize(128, 64)
tip:EnableMouse(true)
tip:SetMovable(true)
tip:SetClampedToScreen(true)
tip:RegisterForDrag("LeftButton")
tip:SetScript("OnDragStart", function(self) self:StartMoving() end)
tip:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
tip.NineSlice:SetAlpha(0)
local bg = CreateFrame("Frame", nil, tip)
bg:SetPoint("TOPLEFT")
bg:SetPoint("BOTTOMRIGHT")
bg:SetFrameLevel(tip:GetFrameLevel() - 1)
bg:SetTemplate("Transparent")
local close = CreateFrame("Button", "ItemRefTooltip"..num.."CloseButton", tip)
close:SetScript("OnClick", function() HideUIPanel(tip) end)
T.SkinCloseButton(close)
table.insert(UISpecialFrames, tip:GetName())
tip.link = link
tips[num] = tip
return tip
end
local ShowTip = function(tip, link)
ShowUIPanel(tip)
if not tip:IsShown() then
tip:SetOwner(UIParent, "ANCHOR_PRESERVE")
end
shown = true
tip:SetHyperlink(link)
shown = nil
end
local SetHyperlink = _G.ItemRefTooltip.SetHyperlink
function _G.ItemRefTooltip:SetHyperlink(link, ...)
local handled = strsplit(":", link)
if not InCombatLockdown() and not IsModifiedClick() and handled and types[handled] and not shown then
local tip = CreateTip(link)
if tip then
ShowTip(tip, link)
end
return
end
SetHyperlink(self, link, ...)
end
================================================
FILE: ShestakUI/Modules/Tooltip/RuFix.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Clean ruRU tooltip(snt_rufix by Don Kaban, edited by ALZA)
----------------------------------------------------------------------------------------
ITEM_CREATED_BY = "" -- No creator name
ITEM_SOCKETABLE = "" -- No gem info line
EMPTY_SOCKET_RED = "|cffFF4040"..EMPTY_SOCKET_RED.."|r"
EMPTY_SOCKET_YELLOW = "|cffffff40"..EMPTY_SOCKET_YELLOW.."|r"
EMPTY_SOCKET_BLUE = "|cff6060ff"..EMPTY_SOCKET_BLUE.."|r"
if T.client ~= "ruRU" then return end
GUILD_ACHIEVEMENT = "Уведомл. для гильдии"
local ttext
local replace = {
["красного цвета"] = "|cffFF4040красного цвета|r",
["синего цвета"] = "|cff6060ffсинего цвета|r",
["желтого цвета"] = "|cffffff40желтого цвета|r",
["Требуется хотя бы"] = "Требуется",
}
local replaceclass = {
["Воин"] = "|cffC79C6EВоин|r",
["Друид"] = "|cffFF7D0AДруид|r",
["Жрец"] = "|cffFFFFFFЖрец|r",
["Маг"] = "|cff69CCF0Маг|r",
["Монах"] = "|cff00FF96Монах|r",
["Охотник"] = "|cffABD473Охотник|r",
["Охотник на демонов"] = "|cffA330C9Охотник на демонов|r",
["Паладин"] = "|cffF58CBAПаладин|r",
["Разбойник"] = "|cffFFF569Разбойник|r",
["Рыцарь смерти"] = "|cffC41F3BРыцарь смерти|r",
["Чернокнижник"] = "|cff9482C9Чернокнижник|r",
["Шаман"] = "|cff0070DEШаман|r",
}
local function Translate(text)
if text then
for rus, replace in next, replace do
text = text:gsub(rus, replace)
end
return text
end
end
local function TranslateClass(text)
if text then
for rus, replaceclass in next, replaceclass do
if not (rus == "Охотник" and string.find(text, "Охотник на демонов")) then
text = text:gsub(rus, replaceclass)
end
end
return text
end
end
local whiteTooltip = {
[GameTooltip] = true,
[ItemRefTooltip] = true,
[ShoppingTooltip1] = true,
[ShoppingTooltip2] = true,
}
local function UpdateTooltip(self)
if whiteTooltip[self] and not self:IsForbidden() then
if not TooltipUtil.GetDisplayedItem(self) then return end
local tname = self:GetName()
for i = 3, self:NumLines() do
ttext = _G[tname.."TextLeft"..i]
local class = ttext:GetText() and (string.find(ttext:GetText(), "Класс") or string.find(ttext:GetText(), "Требуется"))
if ttext then ttext:SetText(Translate(ttext:GetText())) end
if ttext and class then ttext:SetText(TranslateClass(ttext:GetText())) end
ttext = _G[tname.."TextRight"..i]
if ttext then ttext:SetText(Translate(ttext:GetText())) end
end
ttext = nil
end
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, UpdateTooltip)
================================================
FILE: ShestakUI/Modules/Tooltip/SpellID.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.spell_id ~= true then return end
----------------------------------------------------------------------------------------
-- Spell/Item IDs(idTip by Silverwind)
----------------------------------------------------------------------------------------
local debuginfo = false
local function addLine(self, id, isItem)
for i = 1, self:NumLines() do
local line = _G[self:GetName().."TextLeft"..i]
if not line then break end
local text = line:GetText()
if text and strfind(text, id) then return end
end
if isItem then
self:AddLine("|cffffffff"..L_TOOLTIP_ITEM_ID.." "..id)
else
self:AddLine("|cffffffff"..L_TOOLTIP_SPELL_ID.." "..id)
self:Show()
end
end
-- Spells
hooksecurefunc(GameTooltip, "SetUnitAura", function(self, ...)
local id = select(10, UnitAura(...))
if id then addLine(self, id) end
if debuginfo == true and id and IsModifierKeyDown() then print(UnitAura(...)..": "..id) end
end)
local function attachByAuraInstanceID(self, ...)
local aura = C_UnitAuras.GetAuraDataByAuraInstanceID(...)
local id = aura and aura.spellId
if id then addLine(self, id) end
if debuginfo == true and id and IsModifierKeyDown() then print(UnitAura(...)..": "..id) end
end
hooksecurefunc(GameTooltip, "SetUnitBuffByAuraInstanceID", attachByAuraInstanceID) -- from oUF Auras
hooksecurefunc(GameTooltip, "SetUnitDebuffByAuraInstanceID", attachByAuraInstanceID)
hooksecurefunc("SetItemRef", function(link)
local id = tonumber(link:match("spell:(%d+)"))
if id then addLine(ItemRefTooltip, id) end
end)
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Spell, function(self, data)
if self ~= GameTooltip or self:IsForbidden() then return end
if data and data.id then
addLine(self, data.id)
end
end)
-- Items
local whiteTooltip = {
[GameTooltip] = true,
[ItemRefTooltip] = true,
[ItemRefShoppingTooltip1] = true,
[ItemRefShoppingTooltip2] = true,
[ShoppingTooltip1] = true,
[ShoppingTooltip2] = true,
}
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, function(self, data)
if whiteTooltip[self] and not self:IsForbidden() then
if data and data.id then
addLine(self, data.id, true)
end
end
end)
-- Macros
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Macro, function(self, data)
if self:IsForbidden() then return end
local lineData = data.lines and data.lines[1]
local tooltipType = lineData and lineData.tooltipType
if not tooltipType then return end
if tooltipType == 0 then -- item
addLine(self, lineData.tooltipID, true)
elseif tooltipType == 1 then -- spell
addLine(self, lineData.tooltipID)
end
end)
-- Toys
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Toy, function(self, data)
if self ~= GameTooltip or self:IsForbidden() then return end
if data and data.id then
addLine(self, data.id, true)
end
end)
SlashCmdList.SHOWSPELLID = function()
if not debuginfo then
debuginfo = true
else
debuginfo = false
end
end
SLASH_SHOWSPELLID1 = "/showid"
SLASH_SHOWSPELLID2 = "/si"
SLASH_SHOWSPELLID3 = "/ыш"
================================================
FILE: ShestakUI/Modules/Tooltip/Talents.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.talents ~= true then return end
----------------------------------------------------------------------------------------
-- Target Talents(TipTacTalents by Aezay)
----------------------------------------------------------------------------------------
-- Constants
local TALENTS_PREFIX = SPECIALIZATION..":|cffffffff "
local CACHE_SIZE = 25
local INSPECT_DELAY = 0.2
local INSPECT_FREQ = 1.5
-- Variables
local ttt = CreateFrame("Frame", "TipTacTalents")
local cache = {}
local current = {}
-- Time of the last inspect reuqest. Init this to zero, just to make sure. This is a global so other addons could use this variable as well
lastInspectRequest = 0
-- Allow these to be accessed through other addons
ttt.cache = cache
ttt.current = current
ttt:Hide()
----------------------------------------------------------------------------------------
-- Gather Talents
----------------------------------------------------------------------------------------
local function GatherTalents(mouseover)
if mouseover == 1 then
local id = GetInspectSpecialization("mouseover")
local currentSpecName = id and select(2, GetSpecializationInfoByID(id)) or L_TOOLTIP_LOADING
current.tree = currentSpecName
else
local currentSpec = GetSpecialization()
local currentSpecName = currentSpec and select(2, GetSpecializationInfo(currentSpec)) or L_TOOLTIP_NO_TALENT
current.tree = currentSpecName
end
-- Set the tips line output, for inspect, only update if the tip is still showing a unit
if mouseover == 0 then
GameTooltip:AddLine(TALENTS_PREFIX..current.tree)
elseif GameTooltip:GetUnit() then
for i = 2, GameTooltip:NumLines() do
if (_G["GameTooltipTextLeft"..i]:GetText() or ""):match("^"..TALENTS_PREFIX) then
_G["GameTooltipTextLeft"..i]:SetFormattedText("%s%s", TALENTS_PREFIX, current.tree)
break
end
end
end
-- Organise Cache
local cacheSize = CACHE_SIZE
for i = #cache, 1, -1 do
if current.name == cache[i].name then
tremove(cache, i)
break
end
end
if #cache > cacheSize then
tremove(cache, 1)
end
-- Cache the new entry
if cacheSize > 0 then
cache[#cache + 1] = CopyTable(current)
end
GameTooltip:Show()
end
----------------------------------------------------------------------------------------
-- Event Handling
----------------------------------------------------------------------------------------
-- OnEvent
ttt:SetScript("OnEvent", function(self, event, guid)
self:UnregisterEvent(event)
if guid == current.guid then
GatherTalents(1)
end
end)
-- OnUpdate
ttt:SetScript("OnUpdate", function(self, elapsed)
self.nextUpdate = (self.nextUpdate - elapsed)
if self.nextUpdate <= 0 then
self:Hide()
-- Make sure the mouseover unit is still our unit
if UnitGUID("mouseover") == current.guid then
if (InspectFrame and InspectFrame:IsVisible()) then return end
lastInspectRequest = GetTime()
self:RegisterEvent("INSPECT_READY")
NotifyInspect(current.unit)
end
end
end)
-- HOOK: OnTooltipSetUnit
local function OnTooltipSetUnit(self)
if self ~= GameTooltip or self:IsForbidden() then return end
-- Abort any delayed inspect in progress
ttt:Hide()
if C.tooltip.show_shift and not IsShiftKeyDown() then return end
-- Get the unit -- Check the UnitFrame unit if this tip is from a concated unit, such as "targettarget".
local _, unit = self:GetUnit()
if not unit then
local mFocus = GetMouseFocus()
if mFocus and mFocus.unit then
unit = mFocus.unit
end
end
-- No Unit or not a Player
if not unit or not UnitIsPlayer(unit) then
return
end
-- Only bother for players over level 9
local level = UnitLevel(unit)
if level > 9 or level == -1 then
-- Wipe Current Record
wipe(current)
current.unit = unit
current.name = UnitName(unit)
current.guid = UnitGUID(unit)
-- No need for inspection on the player
if UnitIsUnit(unit, "player") then
GatherTalents(0)
return
end
-- Show Cached Talents, If Available
local isInspectOpen = (InspectFrame and InspectFrame:IsShown()) or (Examiner and Examiner:IsShown())
local cacheLoaded = false
for _, entry in ipairs(cache) do
if current.name == entry.name and not isInspectOpen then
self:AddLine(TALENTS_PREFIX..entry.tree)
current.tree = entry.tree
cacheLoaded = true
break
end
end
-- Queue an inspect request
if CanInspect(unit) and not isInspectOpen then
if C.tooltip.average_lvl then
ttt:RegisterEvent("INSPECT_READY")
else
local lastInspectTime = GetTime() - lastInspectRequest
ttt.nextUpdate = (lastInspectTime > INSPECT_FREQ) and INSPECT_DELAY or (INSPECT_FREQ - lastInspectTime + INSPECT_DELAY)
ttt:Show()
end
if not cacheLoaded then
self:AddLine(TALENTS_PREFIX..L_TOOLTIP_LOADING)
end
elseif isInspectOpen then
self:AddLine(TALENTS_PREFIX..L_TOOLTIP_INSPECT_OPEN)
end
end
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, OnTooltipSetUnit)
================================================
FILE: ShestakUI/Modules/Tooltip/Tooltip.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Based on aTooltip(by ALZA)
----------------------------------------------------------------------------------------
local StoryTooltip = QuestScrollFrame.StoryTooltip
StoryTooltip:SetFrameLevel(4)
local CampaignTooltip = QuestScrollFrame.CampaignTooltip
T.SkinCloseButton(_G.ItemRefTooltip.CloseButton)
local tooltips = {
GameTooltip,
ItemRefTooltip,
ShoppingTooltip1,
ShoppingTooltip2,
FriendsTooltip,
ItemRefShoppingTooltip1,
ItemRefShoppingTooltip2,
StoryTooltip,
ReputationParagonTooltip,
CampaignTooltip,
EmbeddedItemTooltip,
QuickKeybindTooltip,
SettingsTooltip,
-- Addons
AtlasLootTooltip,
QuestGuru_QuestWatchTooltip,
TomTomTooltip,
LibDBIconTooltip,
AceConfigDialogTooltip,
BigWigsOptionsTooltip
}
local backdrop = {
bgFile = C.media.blank, edgeFile = C.media.blank, edgeSize = T.mult,
insets = {left = -T.mult, right = -T.mult, top = -T.mult, bottom = -T.mult}
}
for _, tt in pairs(tooltips) do
if not IsAddOnLoaded("Aurora") then
tt.NineSlice:SetAlpha(0)
local bg = CreateFrame("Frame", nil, tt)
bg:SetPoint("TOPLEFT")
bg:SetPoint("BOTTOMRIGHT")
if tt:GetFrameLevel() - 1 >= 0 then
bg:SetFrameLevel(tt:GetFrameLevel() - 1)
else
bg:SetFrameLevel(0)
end
bg:SetTemplate("Transparent")
tt.GetBackdrop = function() return backdrop end
tt.GetBackdropColor = function() return C.media.backdrop_color[1], C.media.backdrop_color[2], C.media.backdrop_color[3], C.media.backdrop_alpha end
tt.GetBackdropBorderColor = function() return unpack(C.media.border_color) end
end
end
-- LibExtraTip skin
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
if not IsAddOnLoaded("Auc-Advanced") then return end
local LT = LibStub("LibExtraTip-1")
for _, Tooltip in pairs({GameTooltip, ItemRefTooltip}) do
Tooltip:HookScript("OnUpdate", function(self)
if not LT then return end
local ExtraTip = LT:GetExtraTip(self)
if ExtraTip then
if not ExtraTip.IsDone then
ExtraTip:StripTextures()
ExtraTip:CreateBackdrop("Transparent")
ExtraTip.backdrop:SetPoint("TOPLEFT", 0, -3)
ExtraTip.backdrop:SetPoint("BOTTOMRIGHT", 0, 2)
ExtraTip:HookScript("OnShow", function()
ExtraTip.backdrop:SetFrameLevel(0)
end)
ExtraTip.IsDone = true
end
end
end)
end
end)
if IsAddOnLoaded("RaiderIO") then
PVEFrame:HookScript("OnShow", function(self)
if not RaiderIO_ProfileTooltip.styled then
RaiderIO_ProfileTooltip.NineSlice:SetAlpha(0)
RaiderIO_ProfileTooltip:CreateBackdrop("Transparent")
RaiderIO_ProfileTooltip.backdrop:SetPoint("TOPLEFT", 3, 0)
RaiderIO_ProfileTooltip.backdrop:SetPoint("BOTTOMRIGHT", -2, 0)
RaiderIO_ProfileTooltip.styled = true
if DF_Frame and C.skins.blizzard_frames then
DF_Frame:StripTextures()
DF_Frame:SetTemplate("Transparent")
T.SkinEditBox(DF_Frame.minRioEdit, nil, 15)
T.SkinEditBox(DF_Frame.maxRioEdit, nil, 15)
T.SkinCheckBox(DF_Frame.showRIO)
T.SkinCheckBox(DF_Frame.showClass)
T.SkinCheckBox(DF_Frame.removeSelfRole)
T.SkinCheckBox(DF_Frame.showPreviousRIO)
DF_Frame.applyBtn:SkinButton()
end
end
end)
end
local anchor = CreateFrame("Frame", "TooltipAnchor", UIParent)
anchor:SetSize(200, 40)
anchor:SetPoint(unpack(C.position.tooltip))
-- Hide PVP text
PVP_ENABLED = ""
-- Statusbar
GameTooltipStatusBar:SetStatusBarTexture(C.media.texture)
GameTooltipStatusBar:SetHeight(4)
GameTooltipStatusBar:ClearAllPoints()
GameTooltipStatusBar:SetPoint("TOPLEFT", GameTooltip, "BOTTOMLEFT", 2, 6)
GameTooltipStatusBar:SetPoint("TOPRIGHT", GameTooltip, "BOTTOMRIGHT", -2, 6)
-- Raid icon
local ricon = GameTooltip:CreateTexture("GameTooltipRaidIcon", "OVERLAY")
ricon:SetHeight(18)
ricon:SetWidth(18)
ricon:SetPoint("BOTTOM", GameTooltip, "TOP", 0, 5)
GameTooltip:HookScript("OnHide", function() ricon:SetTexture(nil) end)
-- Add "Targeted By" line
local targetedList = {}
local ClassColors = {}
local token
for class, color in next, RAID_CLASS_COLORS do
ClassColors[class] = ("|cff%.2x%.2x%.2x"):format(color.r * 255, color.g * 255, color.b * 255)
end
local function AddTargetedBy()
local numParty, numRaid = GetNumSubgroupMembers(), GetNumGroupMembers()
if numParty > 0 or numRaid > 0 then
for i = 1, (numRaid > 0 and numRaid or numParty) do
local unit = (numRaid > 0 and "raid"..i or "party"..i)
if UnitIsUnit(unit.."target", token) and not UnitIsUnit(unit, "player") then
local _, class = UnitClass(unit)
targetedList[#targetedList + 1] = ClassColors[class]
targetedList[#targetedList + 1] = UnitName(unit)
targetedList[#targetedList + 1] = "|r, "
end
end
if #targetedList > 0 then
targetedList[#targetedList] = nil
GameTooltip:AddLine(" ", nil, nil, nil, 1)
local line = _G["GameTooltipTextLeft"..GameTooltip:NumLines()]
if not line then return end
line:SetFormattedText(L_TOOLTIP_WHO_TARGET.." (|cffffffff%d|r): %s", (#targetedList + 1) / 3, table.concat(targetedList))
wipe(targetedList)
end
end
end
----------------------------------------------------------------------------------------
-- Unit tooltip styling
----------------------------------------------------------------------------------------
local function GetColor(unit)
if not unit then return end
local r, g, b
if UnitIsPlayer(unit) then
local _, class = UnitClass(unit)
local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]
if color then
r, g, b = color.r, color.g, color.b
else
r, g, b = 1, 1, 1
end
elseif UnitIsTapDenied(unit) or UnitIsDead(unit) then
r, g, b = 0.6, 0.6, 0.6
else
local reaction = T.oUF_colors.reaction[UnitReaction(unit, "player")]
if reaction then
r, g, b = reaction[1], reaction[2], reaction[3]
else
r, g, b = 1, 1, 1
end
end
return r, g, b
end
local function GameTooltipDefault(tooltip, parent)
if C.tooltip.cursor == true then
tooltip:SetOwner(parent, "ANCHOR_CURSOR_RIGHT", 20, 20)
else
tooltip:SetOwner(parent, "ANCHOR_NONE")
tooltip:ClearAllPoints()
tooltip:SetPoint("BOTTOMRIGHT", TooltipAnchor, "BOTTOMRIGHT", 0, 0)
tooltip.default = 1
end
if not C.tooltip.shift_modifer then
if InCombatLockdown() and C.tooltip.hide_combat and not IsShiftKeyDown() then
tooltip:Hide()
end
end
end
hooksecurefunc("GameTooltip_SetDefaultAnchor", GameTooltipDefault)
if C.tooltip.shift_modifer == true then
GameTooltip:SetScript("OnShow", function(self)
if IsShiftKeyDown() then
self:Show()
else
if not HoverBind.enabled then
self:Hide()
end
end
end)
end
if C.tooltip.health_value == true then
GameTooltipStatusBar:SetScript("OnValueChanged", function(self, value)
if not value then return end
local min, max = self:GetMinMaxValues()
if (value < min) or (value > max) then return end
self:SetStatusBarColor(0, 1, 0)
local _, unit = GameTooltip:GetUnit()
if unit then
min, max = UnitHealth(unit), UnitHealthMax(unit)
if not self.text then
self.text = self:CreateFontString(nil, "OVERLAY", "Tooltip_Med")
self.text:SetPoint("CENTER", GameTooltipStatusBar, 0, 1.5)
end
self.text:Show()
local hp = T.ShortValue(min).." / "..T.ShortValue(max)
self.text:SetText(hp)
end
end)
end
local OnTooltipSetUnit = function(self)
if self ~= GameTooltip or self:IsForbidden() then return end
local lines = self:NumLines()
local unit = (select(2, self:GetUnit())) or (GetMouseFocus() and GetMouseFocus().GetAttribute and GetMouseFocus():GetAttribute("unit")) or (UnitExists("mouseover") and "mouseover") or nil
if not unit then return end
local name, realm = UnitName(unit)
local race, englishRace = UnitRace(unit)
local level = UnitLevel(unit)
local levelColor = GetCreatureDifficultyColor(level)
local classification = UnitClassification(unit)
local creatureType = UnitCreatureType(unit)
local _, faction = UnitFactionGroup(unit)
local _, playerFaction = UnitFactionGroup("player")
local titleName = UnitPVPName(unit)
local isPlayer = UnitIsPlayer(unit)
if level and level == -1 then
if classification == "worldboss" then
level = "|cffff0000|r"..ENCOUNTER_JOURNAL_ENCOUNTER
else
level = "|cffff0000??|r"
end
end
if classification == "rareelite" then classification = " R+"
elseif classification == "rare" then classification = " R"
elseif classification == "elite" then classification = "+"
else classification = "" end
if titleName and C.tooltip.title then
name = titleName
end
local r, g, b = GetColor(unit)
_G["GameTooltipTextLeft1"]:SetFormattedText("|cff%02x%02x%02x%s|r", r * 255, g * 255, b * 255, name or "")
if realm and realm ~= "" and C.tooltip.realm then
self:AddLine(FRIENDS_LIST_REALM.."|cffffffff"..realm.."|r")
end
if isPlayer then
if UnitIsAFK(unit) then
self:AppendText((" %s"):format("|cffE7E716"..L_CHAT_AFK.."|r"))
elseif UnitIsDND(unit) then
self:AppendText((" %s"):format("|cffFF0000"..L_CHAT_DND.."|r"))
end
if isPlayer and (englishRace == "Pandaren" or englishRace == "Dracthyr") and faction ~= nil and faction ~= playerFaction then
local hex = "cffff3333"
if faction == "Alliance" then
hex = "cff69ccf0"
end
self:AppendText((" [|%s%s|r]"):format(hex, faction:sub(1, 2)))
end
local guildName, guildRank = GetGuildInfo(unit)
if guildName then
_G["GameTooltipTextLeft2"]:SetFormattedText("%s", guildName)
if UnitIsInMyGuild(unit) then
_G["GameTooltipTextLeft2"]:SetTextColor(1, 1, 0)
else
_G["GameTooltipTextLeft2"]:SetTextColor(0, 1, 1)
end
if C.tooltip.rank then
self:AddLine(RANK..": |cffffffff"..guildRank.."|r")
end
end
local n = guildName and 3 or 2
-- thx TipTac for the fix above with color blind enabled
if GetCVar("colorblindMode") == "1" then
n = n + 1
local class = UnitClass(unit)
_G["GameTooltipTextLeft"..n]:SetFormattedText("|cff%02x%02x%02x%s|r %s %s", levelColor.r * 255, levelColor.g * 255, levelColor.b * 255, level, race or UNKNOWN, class or "")
else
_G["GameTooltipTextLeft"..n]:SetFormattedText("|cff%02x%02x%02x%s|r %s", levelColor.r * 255, levelColor.g * 255, levelColor.b * 255, level, race or UNKNOWN)
end
for i = n + 1, lines do
local line = _G["GameTooltipTextLeft"..i]
if not line or not line:GetText() then return end
if line and line:GetText() and (line:GetText() == FACTION_HORDE or line:GetText() == FACTION_ALLIANCE) then
line:SetText()
break
end
end
else
for i = 2, lines do
local line = _G["GameTooltipTextLeft"..i]
if not line or not line:GetText() or UnitIsBattlePetCompanion(unit) then return end
if (level and line:GetText():find("^"..LEVEL)) or (creatureType and line:GetText():find("^"..creatureType)) then
line:SetFormattedText("|cff%02x%02x%02x%s%s|r %s", levelColor.r * 255, levelColor.g * 255, levelColor.b * 255, level, classification, creatureType or "")
break
end
end
end
if C.tooltip.target == true and UnitExists(unit.."target") then
local r, g, b = GetColor(unit.."target")
local text = ""
if UnitIsEnemy("player", unit.."target") then
r, g, b = unpack(T.oUF_colors.reaction[1])
elseif not UnitIsFriend("player", unit.."target") then
r, g, b = unpack(T.oUF_colors.reaction[4])
end
if UnitName(unit.."target") == UnitName("player") then
text = "|cfffed100"..STATUS_TEXT_TARGET..":|r ".."|cffff0000> "..UNIT_YOU.." <|r"
else
text = "|cfffed100"..STATUS_TEXT_TARGET..":|r "..UnitName(unit.."target")
end
self:AddLine(text, r, g, b)
end
if C.tooltip.raid_icon == true then
local raidIndex = GetRaidTargetIndex(unit)
if raidIndex then
ricon:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcon_"..raidIndex)
else
ricon:SetTexture(nil)
end
end
if C.tooltip.who_targetting == true then
token = unit AddTargetedBy()
end
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, OnTooltipSetUnit)
----------------------------------------------------------------------------------------
-- Hide tooltips in combat for action bars, pet bar and stance bar
----------------------------------------------------------------------------------------
if C.tooltip.hidebuttons == true then
local CombatHideActionButtonsTooltip = function(self)
if not IsShiftKeyDown() then
self:Hide()
end
end
hooksecurefunc(GameTooltip, "SetAction", CombatHideActionButtonsTooltip)
hooksecurefunc(GameTooltip, "SetPetAction", CombatHideActionButtonsTooltip)
hooksecurefunc(GameTooltip, "SetShapeshift", CombatHideActionButtonsTooltip)
end
----------------------------------------------------------------------------------------
-- Fix compare tooltips(by Blizzard)(../FrameXML/GameTooltip.lua)
----------------------------------------------------------------------------------------
hooksecurefunc(TooltipComparisonManager, "AnchorShoppingTooltips", function(self, primaryShown, secondaryItemShown)
local tooltip = self.tooltip;
local shoppingTooltip1 = tooltip.shoppingTooltips[1];
local shoppingTooltip2 = tooltip.shoppingTooltips[2];
local point = shoppingTooltip1:GetPoint(2)
if secondaryItemShown then
if point == "TOP" then
shoppingTooltip1:ClearAllPoints()
shoppingTooltip2:ClearAllPoints()
shoppingTooltip1:SetPoint("TOPLEFT", self.anchorFrame, "TOPRIGHT", 3, -10)
shoppingTooltip2:SetPoint("TOPLEFT", shoppingTooltip1, "TOPRIGHT", 3, 0)
elseif point == "RIGHT" then
shoppingTooltip1:ClearAllPoints()
shoppingTooltip2:ClearAllPoints()
shoppingTooltip1:SetPoint("TOPRIGHT", self.anchorFrame, "TOPLEFT", -3, -10)
shoppingTooltip2:SetPoint("TOPRIGHT", shoppingTooltip1, "TOPLEFT", -3, 0)
end
else
if point == "LEFT" then
shoppingTooltip1:ClearAllPoints()
shoppingTooltip1:SetPoint("TOPLEFT", self.anchorFrame, "TOPRIGHT", 3, -10)
elseif point == "RIGHT" then
shoppingTooltip1:ClearAllPoints()
shoppingTooltip1:SetPoint("TOPRIGHT", self.anchorFrame, "TOPLEFT", -3, -10)
end
end
end)
----------------------------------------------------------------------------------------
-- Fix GameTooltipMoneyFrame font size
----------------------------------------------------------------------------------------
hooksecurefunc("SetTooltipMoney", function()
for i = 1, 2 do
if _G["GameTooltipMoneyFrame"..i] then
_G["GameTooltipMoneyFrame"..i.."PrefixText"]:SetFontObject("GameTooltipText")
_G["GameTooltipMoneyFrame"..i.."SuffixText"]:SetFontObject("GameTooltipText")
_G["GameTooltipMoneyFrame"..i.."GoldButton"]:SetNormalFontObject("GameTooltipText")
_G["GameTooltipMoneyFrame"..i.."SilverButton"]:SetNormalFontObject("GameTooltipText")
_G["GameTooltipMoneyFrame"..i.."CopperButton"]:SetNormalFontObject("GameTooltipText")
end
end
for i = 1, 2 do
if _G["ShoppingTooltip1MoneyFrame"..i] then
_G["ShoppingTooltip1MoneyFrame"..i.."PrefixText"]:SetFontObject("GameTooltipText")
_G["ShoppingTooltip1MoneyFrame"..i.."SuffixText"]:SetFontObject("GameTooltipText")
_G["ShoppingTooltip1MoneyFrame"..i.."GoldButton"]:SetNormalFontObject("GameTooltipText")
_G["ShoppingTooltip1MoneyFrame"..i.."SilverButton"]:SetNormalFontObject("GameTooltipText")
_G["ShoppingTooltip1MoneyFrame"..i.."CopperButton"]:SetNormalFontObject("GameTooltipText")
end
end
-- Custom tooltip from MultiItemRef.lua
if _G["ItemRefTooltipMoneyFrame1"] then
_G["ItemRefTooltipMoneyFrame1PrefixText"]:SetFontObject("GameTooltipText")
_G["ItemRefTooltipMoneyFrame1SuffixText"]:SetFontObject("GameTooltipText")
_G["ItemRefTooltipMoneyFrame1GoldButton"]:SetNormalFontObject("GameTooltipText")
_G["ItemRefTooltipMoneyFrame1SilverButton"]:SetNormalFontObject("GameTooltipText")
_G["ItemRefTooltipMoneyFrame1CopperButton"]:SetNormalFontObject("GameTooltipText")
end
for i = 2, 4 do
if _G["ItemRefTooltip"..i.."MoneyFrame1"] then
_G["ItemRefTooltip"..i.."MoneyFrame1PrefixText"]:SetFontObject("GameTooltipText")
_G["ItemRefTooltip"..i.."MoneyFrame1SuffixText"]:SetFontObject("GameTooltipText")
_G["ItemRefTooltip"..i.."MoneyFrame1GoldButton"]:SetNormalFontObject("GameTooltipText")
_G["ItemRefTooltip"..i.."MoneyFrame1SilverButton"]:SetNormalFontObject("GameTooltipText")
_G["ItemRefTooltip"..i.."MoneyFrame1CopperButton"]:SetNormalFontObject("GameTooltipText")
end
end
end)
----------------------------------------------------------------------------------------
-- Skin GameTooltip.ItemTooltip and EmbeddedItemTooltip
----------------------------------------------------------------------------------------
GameTooltip.ItemTooltip.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
hooksecurefunc(GameTooltip.ItemTooltip.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)
end
self:SetTexture("")
end)
hooksecurefunc(GameTooltip.ItemTooltip.IconBorder, "Hide", function(self)
self:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end)
GameTooltip.ItemTooltip:CreateBackdrop("Default")
GameTooltip.ItemTooltip.backdrop:SetPoint("TOPLEFT", GameTooltip.ItemTooltip.Icon, "TOPLEFT", -2, 2)
GameTooltip.ItemTooltip.backdrop:SetPoint("BOTTOMRIGHT", GameTooltip.ItemTooltip.Icon, "BOTTOMRIGHT", 2, -2)
GameTooltip.ItemTooltip.Count:ClearAllPoints()
GameTooltip.ItemTooltip.Count:SetPoint("BOTTOMRIGHT", GameTooltip.ItemTooltip.Icon, "BOTTOMRIGHT", 1, 0)
BONUS_OBJECTIVE_REWARD_FORMAT = "|T%1$s:16:16:0:0:64:64:5:59:5:59|t %2$s"
BONUS_OBJECTIVE_REWARD_WITH_COUNT_FORMAT = "|T%1$s:16:16:0:0:64:64:5:59:5:59|t |cffffffff%2$d|r %3$s"
local reward = EmbeddedItemTooltip.ItemTooltip
local icon = reward.Icon
if icon then
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
reward:CreateBackdrop("Default")
reward.backdrop:SetPoint("TOPLEFT", icon, "TOPLEFT", -2, 2)
reward.backdrop:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", 2, -2)
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)
end
self:SetTexture("")
end)
hooksecurefunc(reward.IconBorder, "Hide", function(self)
self:GetParent().backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end)
end
hooksecurefunc("GameTooltip_ShowProgressBar", function(tt)
if not tt or tt:IsForbidden() or not tt.progressBarPool then return end
local frame = tt.progressBarPool:GetNextActive()
if (not frame or not frame.Bar) or frame.Bar.backdrop then return end
local bar = frame.Bar
local label = bar.Label
if bar then
bar:StripTextures()
bar:CreateBackdrop("Transparent")
bar.backdrop:SetBackdropColor(0.1, 0.1, 0.1, 1)
bar:SetStatusBarTexture(C.media.texture)
label:ClearAllPoints()
label:SetPoint("CENTER", bar, 0, 0)
label:SetDrawLayer("OVERLAY")
label:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
end
end)
hooksecurefunc("GameTooltip_ShowStatusBar", function(tt)
if not tt or tt:IsForbidden() or not tt.statusBarPool then return end
local frame = tt.statusBarPool:GetNextActive()
if frame and not frame.backdrop then
frame:StripTextures()
frame:CreateBackdrop("Transparent")
frame.backdrop:SetBackdropColor(0.1, 0.1, 0.1, 1)
frame:SetStatusBarTexture(C.media.texture)
end
end)
================================================
FILE: ShestakUI/Modules/Tooltip/UnitRole.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.tooltip.enable ~= true or C.tooltip.unit_role ~= true then return end
----------------------------------------------------------------------------------------
-- Displays a players LFD/LFR role(gTooltipRoles by g0st)
----------------------------------------------------------------------------------------
local function GetLFDRole(unit)
local role = UnitGroupRolesAssigned(unit)
if role == "NONE" then
return "|cFFB5B5B5"..NO_ROLE.."|r"
elseif role == "TANK" then
return "|cFF0070DE"..TANK.."|r"
elseif role == "HEALER" then
return "|cFF00CC12"..HEALER.."|r"
else
return "|cFFFF3030"..DAMAGER.."|r"
end
end
local function OnTooltipSetUnit(self)
if self ~= GameTooltip or self:IsForbidden() then return end
local _, instanceType = IsInInstance()
if instanceType == "scenario" then return end
local _, unit = GameTooltip:GetUnit()
if unit and UnitIsPlayer(unit) and ((UnitInParty(unit) or UnitInRaid(unit)) and GetNumGroupMembers() > 0) then
local leaderText = UnitIsGroupLeader(unit) and "|cfFFFFFFF - "..LEADER.."|r" or ""
GameTooltip:AddLine(ROLE..": "..GetLFDRole(unit)..leaderText)
end
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, OnTooltipSetUnit)
================================================
FILE: ShestakUI/Modules/Trade/AlreadyKnown.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.trade.already_known ~= true then return end
----------------------------------------------------------------------------------------
-- Colorizes recipes/mounts/pets/toys that is already known(AlreadyKnown by Villiv)
----------------------------------------------------------------------------------------
local color = {r = 0.1, g = 1, b = 0.1}
local knowns, lines = {}, {}
local recipe = Enum.ItemClass.Recipe
local pet = Enum.ItemMiscellaneousSubclass.CompanionPet
local mount = Enum.ItemMiscellaneousSubclass.Mount
local knowables = {[recipe] = true, [pet] = true, [mount] = true}
local pattern = ITEM_PET_KNOWN:gsub("%(", "%%(")
pattern = pattern:gsub("%)", "%%)")
local tooltip = CreateFrame("GameTooltip", "AKScanningTooltip", nil, "GameTooltipTemplate")
tooltip:SetOwner(WorldFrame, "ANCHOR_NONE")
local function Scan(line, numLines)
if line > numLines then return end
local text = _G["AKScanningTooltipTextLeft"..line]:GetText()
if not text or text == "" or text ~= ITEM_SPELL_KNOWN and not text:match(pattern) then return Scan(line + 1, numLines) end
return true
end
local function IsKnown(itemLink)
if not itemLink then return end
local speciesID = itemLink:match("battlepet:(%d+):")
if speciesID then return C_PetJournal.GetNumCollectedInfo(speciesID) > 0 and true end
local itemID = itemLink:match("item:(%d+):")
if not itemID then return end
if knowns[itemID] then return true end
if PlayerHasToy(itemID) then
knowns[itemID] = true
return true
end
if C_Heirloom.PlayerHasHeirloom(itemID) then
knowns[itemID] = true
return true
end
local _, _, _, _, _, _, _, _, _, _, _, class, subClass = GetItemInfo(itemID)
if not (knowables[class] or knowables[subClass]) then return end
tooltip:ClearLines()
tooltip:SetHyperlink(itemLink)
if not Scan(2, tooltip:NumLines()) then return end
if subClass ~= pet then knowns[itemID] = true end
return true
end
-- Mail frame
local function OpenMailFrame_UpdateButtonPositions()
for i = 1, ATTACHMENTS_MAX_RECEIVE do
local button = _G["OpenMailAttachmentButton"..i]
if button then
local name, _, _, _, canUse = GetInboxItem(InboxFrame.openMailID, i)
if name and canUse and IsKnown(GetInboxItemLink(InboxFrame.openMailID, i)) then
SetItemButtonTextureVertexColor(button, color.r, color.g, color.b)
end
end
end
end
hooksecurefunc("OpenMailFrame_UpdateButtonPositions", OpenMailFrame_UpdateButtonPositions)
-- Loot frame
local function LootFrame_UpdateButton(self)
local slotIndex = self:GetSlotIndex()
local texture, _, _, _, _, locked = GetLootSlotInfo(slotIndex)
if texture and not locked and IsKnown(GetLootSlotLink(slotIndex)) then
SetItemButtonTextureVertexColor(self.Item, color.r, color.g, color.b)
end
end
hooksecurefunc(LootFrameElementMixin, "Init", LootFrame_UpdateButton)
-- Merchant frame
local function MerchantFrame_UpdateMerchantInfo()
local numItems = GetMerchantNumItems()
for i = 1, MERCHANT_ITEMS_PER_PAGE do
local index = (MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE + i
if index > numItems then return end
local button = _G["MerchantItem"..i.."ItemButton"]
if button and button:IsShown() then
local _, _, _, _, _, isUsable = GetMerchantItemInfo(index)
if isUsable and IsKnown(GetMerchantItemLink(index)) then
SetItemButtonTextureVertexColor(button, color.r, color.g, color.b)
end
end
end
end
hooksecurefunc("MerchantFrame_UpdateMerchantInfo", MerchantFrame_UpdateMerchantInfo)
local function MerchantFrame_UpdateBuybackInfo()
local numItems = GetNumBuybackItems()
for i = 1, BUYBACK_ITEMS_PER_PAGE do
if i > numItems then return end
local button = _G["MerchantItem"..i.."ItemButton"]
if button and button:IsShown() then
local _, _, _, _, _, isUsable = GetBuybackItemInfo(i)
if isUsable and IsKnown(GetBuybackItemLink(i)) then
SetItemButtonTextureVertexColor(button, color.r, color.g, color.b)
end
end
end
end
hooksecurefunc("MerchantFrame_UpdateBuybackInfo", MerchantFrame_UpdateBuybackInfo)
-- Quest frame
local function QuestInfo_ShowRewards()
local numQuestRewards, numQuestChoices
if QuestInfoFrame.questLog then
numQuestRewards, numQuestChoices = GetNumQuestLogRewards(), GetNumQuestLogChoices(C_QuestLog.GetSelectedQuest(), true)
else
numQuestRewards, numQuestChoices = GetNumQuestRewards(), GetNumQuestChoices()
end
local totalRewards = numQuestRewards + numQuestChoices
if totalRewards == 0 then return end
local rewardsCount = 0
if numQuestChoices > 0 then
local baseIndex = rewardsCount
for i = 1, numQuestChoices do
local button = _G["QuestInfoItem"..i + baseIndex]
if button and button:IsShown() then
local isUsable
if QuestInfoFrame.questLog then
_, _, _, _, isUsable = GetQuestLogChoiceInfo(i)
else
_, _, _, _, isUsable = GetQuestItemInfo("choice", i)
end
if isUsable and IsKnown(QuestInfoFrame.questLog and GetQuestLogItemLink("choice", i) or GetQuestItemLink("choice", i)) then
SetItemButtonTextureVertexColor(button, color.r, color.g, color.b)
end
end
rewardsCount = rewardsCount + 1
end
end
if numQuestRewards > 0 then
local baseIndex = rewardsCount
for i = 1, numQuestRewards do
local button = _G["QuestInfoItem"..i + baseIndex]
if button and button:IsShown() then
local isUsable
if QuestInfoFrame.questLog then
_, _, _, _, isUsable = GetQuestLogRewardInfo(i)
else
_, _, _, _, isUsable = GetQuestItemInfo("reward", i)
end
if isUsable and IsKnown(QuestInfoFrame.questLog and GetQuestLogItemLink("reward", i) or GetQuestItemLink("reward", i)) then
SetItemButtonTextureVertexColor(button, color.r, color.g, color.b)
end
rewardsCount = rewardsCount + 1
end
end
end
end
if IsAddOnLoaded("Pawn") then
hooksecurefunc("PawnUI_OnQuestInfo_ShowRewards", QuestInfo_ShowRewards)
else
hooksecurefunc("QuestInfo_ShowRewards", QuestInfo_ShowRewards)
end
-- Guild rewards frame
local function GuildRewards_Update()
local offset = HybridScrollFrame_GetOffset(GuildRewardsContainer)
local buttons = GuildRewardsContainer.buttons
local _, _, standingID = GetGuildFactionInfo()
for i = 1, #buttons do
local button = buttons[i]
if button and button:IsShown() then
local achievementID, itemID, itemName, _, repLevel = GetGuildRewardInfo(offset + i)
if itemName and not (achievementID and achievementID > 0) and repLevel <= standingID then
local _, itemLink = GetItemInfo(itemID)
if IsKnown(itemLink) then
button.icon:SetVertexColor(color.r, color.g, color.b)
end
end
end
end
end
local isBlizzard_GuildUILoaded
if IsAddOnLoaded("Blizzard_GuildUI") then
isBlizzard_GuildUILoaded = true
hooksecurefunc("GuildRewards_Update", GuildRewards_Update)
hooksecurefunc(GuildRewardsContainer, "update", GuildRewards_Update)
end
-- GuildBank frame
local function GuildBankFrame_Update()
if GuildBankFrame.mode ~= "bank" then return end
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 button = GuildBankFrame.Columns[column].Buttons[index]
if button and button:IsShown() then
local texture, _, locked = GetGuildBankItemInfo(tab, i)
if texture and not locked then
if IsKnown(GetGuildBankItemLink(tab, i)) then
SetItemButtonTextureVertexColor(button, color.r, color.g, color.b)
else
SetItemButtonTextureVertexColor(button, 1, 1, 1)
end
end
end
end
end
local isBlizzard_GuildBankUILoaded
if IsAddOnLoaded("Blizzard_GuildBankUI") then
isBlizzard_GuildBankUILoaded = true
hooksecurefunc(GuildBankFrame, "Update", GuildBankFrame_Update)
end
-- Auction frame
local function AuctionHouseFrame_RefreshScrollFrame(self)
-- Derived from https://www.townlong-yak.com/framexml/10.0.0/Blizzard_AuctionHouseUI/Blizzard_AuctionHouseItemList.lua#322
self.ScrollBox:ForEachFrame(function(button)
if button.rowData.itemKey.itemID then
local itemLink
if button.rowData.itemKey.itemID == 82800 then -- BattlePet
itemLink = format("|Hbattlepet:%d::::::|h[Dummy]|h", button.rowData.itemKey.battlePetSpeciesID)
else -- Normal item
itemLink = format("item:%d:", button.rowData.itemKey.itemID)
end
if itemLink and IsKnown(itemLink) then
-- Highlight
button.SelectedHighlight:Show()
button.SelectedHighlight:SetVertexColor(color.r, color.g, color.b)
button.SelectedHighlight:SetAlpha(.2)
-- Icon
button.cells[2].Icon:SetVertexColor(color.r, color.g, color.b)
button.cells[2].IconBorder:SetVertexColor(color.r, color.g, color.b)
else
-- Highlight
button.SelectedHighlight:SetVertexColor(1, 1, 1)
-- Icon
button.cells[2].Icon:SetVertexColor(1, 1, 1)
button.cells[2].IconBorder:SetVertexColor(1, 1, 1)
end
end
end)
end
-- Black market frame
local function BlackMarketFrame_UpdateHotItem(self)
local texture = self.HotDeal.Item.IconTexture
if not (texture and texture:IsShown()) then return end
local name, _, _, _, usable, _, _, _, _, _, _, _, _, _, link = C_BlackMarket.GetHotItem()
if name and usable and IsKnown(link) then
texture:SetVertexColor(color.r, color.g, color.b)
end
end
local function BlackMarketScrollFrame_Update(self, elementData)
local name, _, _, _, usable, _, _, _, _, _, _, _, _, _, link = C_BlackMarket.GetItemInfoByIndex(elementData.index)
if name and usable and IsKnown(link) then
self.Item.IconTexture:SetVertexColor(color.r, color.g, color.b)
end
end
local isBlizzard_BlackMarketUILoaded
if IsAddOnLoaded("Blizzard_BlackMarketUI") then
isBlizzard_BlackMarketUILoaded = true
hooksecurefunc("BlackMarketFrame_UpdateHotItem", BlackMarketFrame_UpdateHotItem)
hooksecurefunc(BlackMarketItemMixin, "Init", BlackMarketScrollFrame_Update)
end
-- LoD addons
if not (isBlizzard_GuildUILoaded and isBlizzard_GuildBankUILoaded and isBlizzard_AuctionUILoaded and isBlizzard_BlackMarketUILoaded) then
local function OnEvent(self, event, addon)
if addon == "Blizzard_GuildUI" then
isBlizzard_GuildUILoaded = true
hooksecurefunc("GuildRewards_Update", GuildRewards_Update)
hooksecurefunc(GuildRewardsContainer, "update", GuildRewards_Update)
elseif addon == "Blizzard_GuildBankUI" then
isBlizzard_GuildBankUILoaded = true
hooksecurefunc(GuildBankFrame, "Update", GuildBankFrame_Update)
elseif addon == "Blizzard_AuctionHouseUI" then
isBlizzard_AuctionUILoaded = true
hooksecurefunc(AuctionHouseFrame.BrowseResultsFrame.ItemList, "RefreshScrollFrame", AuctionHouseFrame_RefreshScrollFrame)
elseif addon == "Blizzard_BlackMarketUI" then
isBlizzard_BlackMarketUILoaded = true
hooksecurefunc("BlackMarketFrame_UpdateHotItem", BlackMarketFrame_UpdateHotItem)
hooksecurefunc(BlackMarketItemMixin, "Init", BlackMarketScrollFrame_Update)
end
if isBlizzard_GuildUILoaded and isBlizzard_GuildBankUILoaded and isBlizzard_AuctionUILoaded and isBlizzard_BlackMarketUILoaded then
self:UnregisterEvent(event)
self:SetScript("OnEvent", nil)
OnEvent = nil
end
end
tooltip:SetScript("OnEvent", OnEvent)
tooltip:RegisterEvent("ADDON_LOADED")
end
================================================
FILE: ShestakUI/Modules/Trade/Archaeology.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.trade.archaeology ~= true or IsAddOnLoaded("stArchaeologist") then return end
----------------------------------------------------------------------------------------
-- Archaeology tracker(stArchaeologist by Safturento)
----------------------------------------------------------------------------------------
local stArch = {}
stArch["archSkill"] = {} -- Archaeology skill level
stArch["progressBars"] = {} -- Status bars for artifacts
stArch["artifactInfo"] = {} -- Information to update bars
local numRaces = 20
local Loaded = false
function stArch:OnLoad(self)
if ShestakUISettingsPerChar == nil then ShestakUISettingsPerChar = {} end
if ShestakUISettingsPerChar.Archaeology == false then self:Hide() end
-- Title Bar
stArch["title"] = CreateFrame("Frame", "ArchTitleFrame", self)
stArch["title"]:SetWidth(self:GetWidth() - 10)
stArch["title"]:SetHeight(19)
stArch["title"]:SetPoint("TOP", self, "TOP", 0, 0)
stArch["title"]["text"] = stArch["title"]:CreateFontString()
stArch["title"]["text"]:SetPoint("CENTER", stArch["title"], "CENTER", 0, 0)
stArch["title"]["text"]:SetJustifyH("CENTER")
stArch["title"]["text"]:SetJustifyV("CENTER")
stArch["title"]["text"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
stArch["title"]["text"]:SetText(PROFESSIONS_ARCHAEOLOGY)
-- Close button
stArch["close"] = CreateFrame("Button", "ArchCloseButton", self)
T.SkinCloseButton(stArch["close"], nil, nil, true)
stArch["close"]:SetWidth(12)
stArch["close"]:SetHeight(12)
stArch["close"]:SetScript("OnMouseUp", function() self:Hide() ShestakUISettingsPerChar.Archaeology = false end)
-- Artifact Progress Bars
local progressBars = stArch["progressBars"]
progressBars["frame"] = CreateFrame("Frame", "ArchBarFrame", self)
progressBars["frame"]:SetHeight(200)
progressBars["frame"]:SetWidth(self:GetWidth() - 8)
progressBars["frame"]:SetPoint("TOP", stArch["title"], "BOTTOM", 0, 0)
progressBars["frame"]:SetTemplate("Overlay")
for i = 1, numRaces do
-- Fill Table
progressBars[i] = {}
progressBars[i]["border"] = CreateFrame("Frame", "ArchBar"..i.."Border", progressBars["frame"])
progressBars[i]["bar"] = CreateFrame("StatusBar", "ArchBar"..i, progressBars[i]["border"], "TextStatusBar")
progressBars[i]["race"] = progressBars[i]["bar"]:CreateFontString()
progressBars[i]["progress"] = progressBars[i]["bar"]:CreateFontString()
progressBars[i]["solve"] = CreateFrame("Button", "ArchBar"..i, self)
-- Border
progressBars[i]["border"]:SetWidth(progressBars["frame"]:GetWidth() - 10)
progressBars[i]["border"]:SetHeight(16)
progressBars[i]["border"]:SetTemplate("Overlay")
if i == 1 then
progressBars[i]["border"]:SetPoint("TOP", progressBars["frame"], "TOP", 0, -5)
else
progressBars[i]["border"]:SetPoint("TOP", progressBars[i-1]["border"], "BOTTOM", 0, -5)
end
-- Bar
progressBars[i]["bar"]:SetStatusBarTexture(C.media.texture)
progressBars[i]["bar"]:SetPoint("TOPRIGHT", progressBars[i]["border"], "TOPRIGHT", -2, -2)
progressBars[i]["bar"]:SetPoint("BOTTOMLEFT", progressBars[i]["border"], "BOTTOMLEFT", 2, 2)
progressBars[i]["bar"]:SetStatusBarColor(0.4, 0.4, 0.4)
progressBars[i]["bar"]:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT", -2, 7)
GameTooltip:ClearLines()
if GetNumArtifactsByRace(i) > 0 then
SetSelectedArtifact(i)
local artifactName, artifactDescription, artifactRarity, _, _, keystoneCount = GetSelectedArtifactInfo()
local numFragmentsCollected, _, numFragmentsRequired = GetArtifactProgress()
local r, g, b
if artifactRarity == 1 then
artifactRarity = ITEM_QUALITY3_DESC
r, g, b = GetItemQualityColor(3)
else
artifactRarity = ITEM_QUALITY1_DESC
r, g, b = GetItemQualityColor(1)
end
GameTooltip:AddLine(artifactName, r, g, b, 1)
GameTooltip:AddLine(artifactRarity, r, g, b, r, g, b)
GameTooltip:AddDoubleLine(ARCHAEOLOGY_RUNE_STONES..": "..numFragmentsCollected.."/"..numFragmentsRequired, "Keystones: "..keystoneCount, 1, 1, 1, 1, 1, 1)
GameTooltip:AddLine(" ")
GameTooltip:AddLine(artifactDescription, 1, 1, 1, 1)
GameTooltip:Show()
end
end)
progressBars[i]["bar"]:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
-- Progress Text
progressBars[i]["progress"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
progressBars[i]["progress"]:SetText("")
progressBars[i]["progress"]:SetPoint("RIGHT", progressBars[i]["bar"], "RIGHT", 1, 0)
-- Race Text
progressBars[i]["race"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
progressBars[i]["race"]:SetText(RACE)
progressBars[i]["race"]:SetPoint("LEFT", progressBars[i]["bar"], "LEFT", 2, 0)
progressBars[i]["race"]:SetPoint("RIGHT", progressBars[i]["progress"], "LEFT", -2, 0)
progressBars[i]["race"]:SetWordWrap(false)
progressBars[i]["race"]:SetJustifyH("LEFT")
end
-------------------------------------------------------------
-- Archaeology Skill Level Frame
local archSkill = stArch["archSkill"]
archSkill["frame"] = CreateFrame("Frame", "ArchSkillFrame", self)
archSkill["bar"] = CreateFrame("StatusBar", "ArchSkillBar", archSkill["frame"], "TextStatusBar")
archSkill["text"] = archSkill["bar"]:CreateFontString()
-- Border
archSkill["frame"]:SetHeight(24)
archSkill["frame"]:SetWidth(self:GetWidth() - 8)
archSkill["frame"]:SetPoint("TOP", progressBars["frame"], "BOTTOM", 0, -3)
archSkill["frame"]:SetTemplate("Overlay")
-- StatusBar
archSkill["bar"]:SetStatusBarTexture(C.media.texture)
archSkill["bar"]:SetPoint("TOPRIGHT", archSkill["frame"], "TOPRIGHT", -2, -2)
archSkill["bar"]:SetPoint("BOTTOMLEFT", archSkill["frame"], "BOTTOMLEFT", 2, 2)
archSkill["bar"]:SetStatusBarColor(0, 0.4, 0.8)
archSkill["bar"]:SetScript("OnMouseUp", function()
if IsAddOnLoaded("Blizzard_ArchaeologyUI") then
ToggleFrame(ArchaeologyFrame)
else
local loaded = LoadAddOn("Blizzard_ArchaeologyUI")
if loaded then
ShowUIPanel(ArchaeologyFrame)
end
end
end)
-- Text
archSkill["text"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
archSkill["text"]:SetText("-")
archSkill["text"]:SetPoint("CENTER", archSkill["bar"], "CENTER", 0, 0)
-------------------------------------------------------------
-- Solve Frame
progressBars["solveFrame"] = CreateFrame("Frame", "ArchSolveFrame", self)
progressBars["solveFrame"]:SetHeight(progressBars["frame"]:GetHeight())
progressBars["solveFrame"]:SetWidth(85)
progressBars["solveFrame"]:SetFrameLevel(0)
progressBars["solveFrame"]:SetPoint("LEFT", self, "RIGHT", 1, 0)
progressBars["solveFrame"]:SetPoint("TOP", progressBars["frame"], "TOP", 0, 0)
progressBars["solveFrame"]:SetTemplate("Transparent")
progressBars["solveFrame"]:Hide()
for i = 1, numRaces do progressBars[i]["solve"]:Hide() end
-- Solve Toggle
progressBars["solveToggle"] = CreateFrame("Frame", "ArchSolveToggle", self)
progressBars["solveToggle"]:SetHeight(progressBars["solveFrame"]:GetHeight())
progressBars["solveToggle"]:SetWidth(16)
progressBars["solveToggle"]:SetPoint("LEFT", self, "RIGHT", 1, 0)
progressBars["solveToggle"]:SetPoint("TOP", progressBars["frame"], "TOP", 0, 0)
progressBars["solveToggle"]:SetTemplate("Transparent")
progressBars["solveToggle"]:SetAlpha(0)
-- Solve Toggle Text
progressBars["solveToggle"]["text"] = progressBars["solveToggle"]:CreateFontString()
progressBars["solveToggle"]["text"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
progressBars["solveToggle"]["text"]:SetText(">")
progressBars["solveToggle"]["text"]:SetPoint("CENTER", progressBars["solveToggle"], "CENTER", 1, 0)
progressBars["solveToggle"]["closeDirection"] = "<"
progressBars["solveToggle"]["openDirection"] = ">"
progressBars["solveToggle"]:SetScript("OnEnter", function()
progressBars["solveToggle"]["text"]:SetTextColor(unpack(C.media.classborder_color))
progressBars["solveToggle"]:FadeIn()
end)
progressBars["solveToggle"]:SetScript("OnLeave", function()
progressBars["solveToggle"]["text"]:SetTextColor(1, 1, 1)
progressBars["solveToggle"]:FadeOut()
end)
progressBars["solveToggle"]:SetScript("OnMouseUp", function()
if progressBars["solveFrame"]:IsShown() then
progressBars["solveFrame"]:Hide()
for i = 1, numRaces do progressBars[i]["solve"]:Hide() end
progressBars["solveToggle"]["text"]:SetText(progressBars["solveToggle"]["openDirection"])
progressBars["solveToggle"]:ClearAllPoints()
progressBars["solveToggle"]:SetPoint(unpack(progressBars["solveToggle"]["openPoint1"]))
progressBars["solveToggle"]:SetPoint(unpack(progressBars["solveToggle"]["openPoint2"]))
else
progressBars["solveFrame"]:Show()
for i = 1, numRaces do progressBars[i]["solve"]:Show() end
progressBars["solveToggle"]["text"]:SetText(progressBars["solveToggle"]["closeDirection"])
progressBars["solveToggle"]:ClearAllPoints()
progressBars["solveToggle"]:SetPoint(unpack(progressBars["solveToggle"]["closePoint"]))
end
end)
local solveFrame = stArch["progressBars"]
for i = 1, numRaces do
-- Button
solveFrame[i]["solve"]:SetHeight(progressBars[i]["border"]:GetHeight())
solveFrame[i]["solve"]:SetWidth(progressBars["solveFrame"]:GetWidth() - 10)
solveFrame[i]["solve"]:SetPoint("LEFT", progressBars["solveFrame"], "LEFT", 5, 0)
solveFrame[i]["solve"]:SetPoint("TOP", progressBars[i]["border"], "TOP", 0, 0)
solveFrame[i]["solve"]:SetTemplate("Overlay")
-- Text
solveFrame[i]["solve"]["text"] = solveFrame[i]["solve"]:CreateFontString()
solveFrame[i]["solve"]["text"]:SetFont(C.media.pixel_font, C.media.pixel_font_size, C.media.pixel_font_style)
solveFrame[i]["solve"]["text"]:SetText(SOLVE)
solveFrame[i]["solve"]["text"]:SetPoint("CENTER", solveFrame[i]["solve"], "CENTER", 2, 0)
end
-------------------------------------------------------------
-- Construct artifact info table
for i = 1, numRaces do
stArch["artifactInfo"][i] = {}
end
Loaded = true
end
function stArch:UpdateFrameHeight(self)
-- Update frame Sizes to fit correctly
stArch["progressBars"]["frame"]:SetHeight(numRaces * (stArch["progressBars"][1]["border"]:GetHeight() + 5) + 5)
stArch["progressBars"]["solveFrame"]:SetHeight(stArch["progressBars"]["frame"]:GetHeight())
stArch["progressBars"]["solveToggle"]:SetHeight(stArch["progressBars"]["frame"]:GetHeight())
if stArch["archSkill"]["frame"]:IsShown() then
self:SetHeight(stArch["title"]:GetHeight() + stArch["progressBars"]["frame"]:GetHeight() + stArch["archSkill"]["frame"]:GetHeight() + 7)
else
self:SetHeight(stArch["title"]:GetHeight() + stArch["progressBars"]["frame"]:GetHeight() + 5)
end
end
local function IsArchaeologist()
local _, _, arch = GetProfessions()
if arch then
return true
else
return false
end
end
-- Update archaeology skill information
function stArch:updateSkillLevel()
if IsArchaeologist() then
local _, _, rank, maxRank = GetProfessionInfo(select(3, GetProfessions()))
stArch["archSkill"]["rank"] = rank
stArch["archSkill"]["maxRank"] = maxRank
else
stArch["archSkill"]["rank"] = 0
stArch["archSkill"]["maxRank"] = 0
end
end
-- Update a status bar to represent the skill information
function stArch:updateSkillBar()
local skill = stArch["archSkill"]
skill["bar"]:SetMinMaxValues(0, skill["maxRank"])
skill["bar"]:SetValue(skill["rank"])
skill["text"]:SetText(skill["rank"].."/"..skill["maxRank"])
if (skill["rank"] + 5) > skill["maxRank"] and skill["rank"] ~= skill["maxRank"] then
skill["bar"]:SetStatusBarColor(0.7, 0.2, 0)
else
skill["bar"]:SetStatusBarColor(0, 0.4, 0.8)
end
end
-- Update artifact details, only keep relevant data
function stArch:updateArtifact(index)
local numProjects = GetNumArtifactsByRace(index)
local raceName, _, raceItemID = GetArchaeologyRaceInfo(index)
local artifact = stArch["artifactInfo"][index]
artifact["race"] = raceName
artifact["keyID"] = raceItemID
artifact["numKeystones"] = 0 -- Will dig for these in inventory later
if numProjects == 0 then -- The Artifact hasn"t been discovered
artifact["numKeysockets"] = 0
artifact["progress"] = 0
artifact["modifier"] = 0
artifact["total"] = 0
artifact["canSolve"] = false
else
SetSelectedArtifact(index)
local _, _, _, _, _, keystoneCount = GetSelectedArtifactInfo()
local numFragmentsCollected, numFragmentsAdded, numFragmentsRequired = GetArtifactProgress()
artifact["numKeysockets"] = keystoneCount
artifact["progress"] = numFragmentsCollected
artifact["modifier"] = numFragmentsAdded
artifact["total"] = numFragmentsRequired
artifact["canSolve"] = CanSolveArtifact()
for i = 0, 4 do
for j = 1, C_Container.GetContainerNumSlots(i) do
local slotID = C_Container.GetContainerItemID(i, j)
if slotID == artifact["keyID"] then
local _, count = GetContainerItemInfo(i, j)
if artifact["numKeystones"] < artifact["numKeysockets"] then
artifact["numKeystones"] = artifact["numKeystones"] + count
end
if min(artifact["numKeystones"], artifact["numKeysockets"]) * numRaces + artifact["progress"] >= artifact["total"] then
artifact["canSolve"] = true
end
end
end
end
end
end
function stArch:updateArtifactBar(index)
local artifact = stArch["artifactInfo"][index]
local bar = stArch["progressBars"][index]
bar["race"]:SetText(artifact["race"])
if GetNumArtifactsByRace(index) ~= 0 then
local keystoneBonus = 0
if artifact["numKeysockets"] then
keystoneBonus = min(artifact["numKeystones"], artifact["numKeysockets"]) * numRaces
end
bar["bar"]:SetMinMaxValues(0, artifact["total"])
bar["bar"]:SetValue(min(artifact["progress"] + keystoneBonus, artifact["total"]))
if artifact["numKeysockets"] and artifact["numKeysockets"] > 0 then
bar["solve"]["text"]:SetText(SOLVE.." ["..artifact["numKeystones"].."/"..artifact["numKeysockets"].."]")
else
bar["solve"]["text"]:SetText(SOLVE)
end
if keystoneBonus > 0 then
bar["progress"]:SetText(format("|cff00c1ea%d|r/%d", artifact["progress"] + keystoneBonus, artifact["total"]))
else
if artifact["total"] > 65 then
bar["progress"]:SetText(format("%d/|cff00c1ea%d|r", artifact["progress"], artifact["total"]))
else
bar["progress"]:SetText(format("%d/%d", artifact["progress"], artifact["total"]))
end
end
if artifact["canSolve"] then
bar["bar"]:SetStatusBarColor(0.2, 0.8, 0.2)
stArch:EnableSolve(index, bar["solve"])
else
bar["bar"]:SetStatusBarColor(0.7, 0.2, 0)
stArch:DisableSolve(bar["solve"])
end
bar["border"]:SetAlpha(1)
bar["solve"]:SetAlpha(1)
else
-- Empty information, sometimes tries to falsely update
bar["solve"]["text"]:SetText("")
bar["progress"]:SetText("")
stArch:DisableSolve(bar["solve"])
bar["bar"]:SetStatusBarColor(0.4, 0.4, 0.4)
stArch["progressBars"][index]["border"]:SetAlpha(0.2)
stArch["progressBars"][index]["solve"]:SetAlpha(0.2)
end
end
function stArch:EnableSolve(index, button)
button["text"]:SetTextColor(1, 1, 1)
button:HookScript("OnEnter", T.SetModifiedBackdrop)
button:HookScript("OnLeave", T.SetOriginalBackdrop)
button:SetScript("OnClick", function()
SetSelectedArtifact(index)
local _, _, _, _, _, numSockets = GetActiveArtifactByRace(index)
local _, _, itemID = GetArchaeologyRaceInfo(index)
if numSockets and numSockets > 0 then
for socketNum = 1, numSockets do
if not ItemAddedToArtifact(itemID) then
SocketItemToArtifact()
end
end
end
if GetNumArtifactsByRace(index) > 0 then
if stArch["artifactInfo"][index]["canSolve"] then
if not ((stArch["archSkill"]["rank"] + 5) > stArch["archSkill"]["maxRank"] and stArch["archSkill"]["rank"] ~= stArch["archSkill"]["maxRank"]) or IsShiftKeyDown() then
SolveArtifact()
end
if (stArch["archSkill"]["rank"] + 5) > stArch["archSkill"]["maxRank"] and stArch["archSkill"]["rank"] ~= stArch["archSkill"]["maxRank"] and not IsShiftKeyDown() then
print("[|cffe76a6ast|rArch] You should go train before finishing this cast or you won't get all your skill points! (Hold shift if you don't care and still want to complete your artifact now)")
end
end
end
end)
end
function stArch:DisableSolve(button)
button["text"]:SetTextColor(0.5, 0.5, 0.5)
button:SetBackdropBorderColor(unpack(C.media.border_color))
button.overlay:SetVertexColor(0.1, 0.1, 0.1, 1)
button:SetScript("OnEnter", function() end)
button:SetScript("OnLeave", function() end)
button:SetScript("OnMouseUp", function() end)
end
function stArch:OnEvent()
for i = 1, numRaces do
stArch:updateArtifact(i)
end
for i = 1, numRaces do
stArch:updateArtifactBar(i)
end
stArch:updateSkillLevel()
stArch:updateSkillBar()
if stArch["archSkill"]["rank"] == stArch["archSkill"]["maxRank"] then
stArch["archSkill"]["frame"]:Hide()
end
end
function stArch:updateFramePosition(self)
local progressBars = stArch["progressBars"]
local _, _, relativePoint = self:GetPoint()
if relativePoint == "TOPRIGHT" or relativePoint == "RIGHT" or relativePoint == "BOTTOMRIGHT" then
progressBars["solveFrame"]:ClearAllPoints()
progressBars["solveFrame"]:SetPoint("RIGHT", self, "LEFT", -1, 0)
progressBars["solveFrame"]:SetPoint("TOP", progressBars["frame"], "TOP", 0, 0)
progressBars["solveToggle"]["openPoint1"] = {"RIGHT", self, "LEFT", -1, 0}
progressBars["solveToggle"]["openPoint2"] = {"TOP", progressBars["frame"], "TOP", 0, 0}
progressBars["solveToggle"]["closePoint"] = {"RIGHT", progressBars["solveFrame"], "LEFT", -1, 0}
progressBars["solveToggle"]["closeDirection"] = ">"
progressBars["solveToggle"]["openDirection"] = "<"
else
progressBars["solveFrame"]:ClearAllPoints()
progressBars["solveFrame"]:SetPoint("LEFT", self, "RIGHT", 1, 0)
progressBars["solveFrame"]:SetPoint("TOP", progressBars["frame"], "TOP", 0, 0)
progressBars["solveToggle"]["openPoint1"] = {"LEFT", self, "RIGHT", 1, 0}
progressBars["solveToggle"]["openPoint2"] = {"TOP", progressBars["frame"], "TOP", 0, 0 }
progressBars["solveToggle"]["closePoint"] = {"LEFT", progressBars["solveFrame"], "RIGHT", 1, 0}
progressBars["solveToggle"]["closeDirection"] = "<"
progressBars["solveToggle"]["openDirection"] = ">"
end
if progressBars["solveFrame"]:IsShown() then
progressBars["solveToggle"]["text"]:SetText(progressBars["solveToggle"]["closeDirection"])
else
progressBars["solveToggle"]["text"]:SetText(progressBars["solveToggle"]["openDirection"])
end
progressBars["solveToggle"]:ClearAllPoints()
if progressBars["solveFrame"]:IsShown() then
progressBars["solveToggle"]:SetPoint(unpack(progressBars["solveToggle"]["closePoint"]))
else
progressBars["solveToggle"]:SetPoint(unpack(progressBars["solveToggle"]["openPoint1"]))
progressBars["solveToggle"]:SetPoint(unpack(progressBars["solveToggle"]["openPoint2"]))
end
end
local stArchFrame = CreateFrame("Frame", "stArchaeologyFrame", UIParent)
stArchFrame:RegisterEvent("RESEARCH_ARTIFACT_HISTORY_READY")
stArchFrame:RegisterEvent("RESEARCH_ARTIFACT_COMPLETE")
stArchFrame:RegisterEvent("RESEARCH_ARTIFACT_DIG_SITE_UPDATED")
stArchFrame:RegisterEvent("CURRENCY_DISPLAY_UPDATE")
stArchFrame:RegisterEvent("SKILL_LINES_CHANGED")
stArchFrame:RegisterEvent("BAG_UPDATE")
stArchFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
stArchFrame:SetWidth(C.minimap.size)
stArchFrame:SetHeight(15)
stArchFrame:SetPoint(unpack(C.position.archaeology))
stArchFrame:SetTemplate("Transparent")
stArchFrame:SetFrameLevel(1)
stArchFrame:SetFrameStrata("HIGH")
stArchFrame:EnableMouse(true)
stArchFrame:SetMovable(true)
stArchFrame:HookScript("OnMouseDown", function(self, button)
if IsAltKeyDown() or IsShiftKeyDown() then
self:StartMoving()
elseif IsControlKeyDown() and button == "RightButton" then
self:ClearAllPoints()
self:SetPoint(unpack(C.position.archaeology))
self:SetUserPlaced(false)
end
end)
stArchFrame:HookScript("OnMouseUp", function(self)
self:StopMovingOrSizing()
stArch:updateFramePosition(self)
end)
SlashCmdList.STARCHAEOLOGIST = function()
ToggleFrame(stArchFrame)
stArchFrame:StopMovingOrSizing()
if stArchFrame:IsShown() then ShestakUISettingsPerChar.Archaeology = true else ShestakUISettingsPerChar.Archaeology = false end
end
SLASH_STARCHAEOLOGIST1 = "/starch"
SLASH_STARCHAEOLOGIST2 = "/arch"
stArchFrame:HookScript("OnEvent", function(self)
if Loaded ~= true then
stArch:OnLoad(self)
stArch:updateFramePosition(self)
else
stArch:OnEvent()
stArch:UpdateFrameHeight(self)
end
if not select(3, GetProfessions()) then stArchFrame:Hide() ShestakUISettingsPerChar.Archaeology = false end
if ShestakUISettingsPerChar.Archaeology == true and not self:IsShown() then self:Show() end
end)
local b = CreateFrame("Button", "SwitchArch", UIParent)
b:SetTemplate("ClassColor")
if C.actionbar.toggle_mode == true then
b:SetPoint("TOPLEFT", Minimap, "TOPRIGHT", 3, -58)
else
b:SetPoint("TOPLEFT", Minimap, "TOPRIGHT", 3, -38)
end
b:SetSize(19, 19)
b:SetAlpha(0)
b:SetScript("OnClick", function()
if _G["stArchaeologyFrame"]:IsShown() then
_G["stArchaeologyFrame"]:Hide()
ShestakUISettingsPerChar.Archaeology = false
else
_G["stArchaeologyFrame"]:Show()
ShestakUISettingsPerChar.Archaeology = true
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)
b:SetScript("OnEnter", function()
b:FadeIn()
GameTooltip:SetOwner(b, "ANCHOR_LEFT")
GameTooltip:AddLine(PROFESSIONS_ARCHAEOLOGY)
GameTooltip:Show()
end)
b:SetScript("OnLeave", function()
b:FadeOut()
GameTooltip:Hide()
end)
local bt = b:CreateTexture(nil, "OVERLAY")
bt:SetTexture("Interface\\Icons\\Trade_Archaeology")
bt:SetTexCoord(0.1, 0.9, 0.1, 0.9)
bt:SetPoint("TOPLEFT", b, 2, -2)
bt:SetPoint("BOTTOMRIGHT", b, -2, 2)
----------------------------------------------------------------------------------------
-- Survey cooldown timer
----------------------------------------------------------------------------------------
local f = CreateFrame("Frame", nil, UIParent)
f:SetPoint("CENTER", 0, -80)
f:SetSize(40, 40)
local text = f:CreateFontString(nil, "OVERLAY")
text:SetFont(C.media.pixel_font, 16, "MONOCHROMEOUTLINE")
text:SetPoint("CENTER")
local last = 0
local time = 3
f:RegisterEvent("UNIT_SPELLCAST_STOP")
f:SetScript("OnEvent", function(_, _, unit, _, _, _, spellid)
if not unit == "player" or select(2, UnitRace("player")) == "Dwarf" then return end
if spellid == 80451 then
text:SetText("3")
f:SetScript("OnUpdate", function(_, elapsed)
last = last + elapsed
if last > 1 then
time = time - 1
text:SetText(time)
if time <= 0 then
f:SetScript("OnUpdate", nil)
text:SetText("")
time = 3
end
last = 0
end
end)
end
end)
================================================
FILE: ShestakUI/Modules/Trade/Merchant.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Alt+Click to buy a stack
----------------------------------------------------------------------------------------
hooksecurefunc("MerchantItemButton_OnModifiedClick", function(self)
if IsAltKeyDown() then
local id = self:GetID()
local itemLink = GetMerchantItemLink(id)
if not itemLink then return end
local maxStack = select(8, GetItemInfo(itemLink))
if maxStack and maxStack > 1 then
local numAvailable = select(5, GetMerchantItemInfo(id))
if numAvailable > -1 then
BuyMerchantItem(id, numAvailable)
else
BuyMerchantItem(id, GetMerchantItemMaxStack(id))
end
end
end
end)
ITEM_VENDOR_STACK_BUY = _G.ITEM_VENDOR_STACK_BUY.."\n|cff00ff00<"..L_MISC_BUY_STACK..">|r"
----------------------------------------------------------------------------------------
-- Show item level for weapons and armor in merchant
----------------------------------------------------------------------------------------
if C.trade.merchant_itemlevel ~= true then return end
local function MerchantItemlevel()
local numItems = GetMerchantNumItems()
for i = 1, MERCHANT_ITEMS_PER_PAGE do
local index = (MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE + i
if index > numItems then return end
local button = _G["MerchantItem"..i.."ItemButton"]
if button and button:IsShown() then
if not button.text then
button.text = button:CreateFontString(nil, "OVERLAY", "SystemFont_Outline_Small")
button.text:SetPoint("TOPLEFT", 1, -1)
button.text:SetTextColor(1, 1, 0)
else
button.text:SetText("")
end
local itemLink = GetMerchantItemLink(index)
if itemLink then
local _, _, quality, itemlevel, _, _, _, _, _, _, _, itemClassID = GetItemInfo(itemLink)
if (itemlevel and itemlevel > 1) and (quality and quality > 1) and (itemClassID == Enum.ItemClass.Weapon or itemClassID == Enum.ItemClass.Armor) then
button.text:SetText(itemlevel)
end
end
end
end
end
hooksecurefunc("MerchantFrame_UpdateMerchantInfo", MerchantItemlevel)
================================================
FILE: ShestakUI/Modules/Trade/OneClickDisenchanting.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.trade.disenchanting ~= true then return end
----------------------------------------------------------------------------------------
-- One-click Milling, Prospecting and Disenchanting(Molinari by p3lim)
----------------------------------------------------------------------------------------
local button = CreateFrame("Button", "OneClickMPD", UIParent, "SecureActionButtonTemplate, AutoCastShineTemplate")
button:RegisterForClicks("AnyUp", "AnyDown")
button:SetScript("OnEvent", function(self, event, ...) self[event](self, ...) end)
button:RegisterEvent("PLAYER_LOGIN")
local enchantingItems = {
-- Legion enchanting quest line
[137195] = true, -- Highmountain Armor
[137221] = true, -- Enchanted Raven Sigil
[137286] = true, -- Fel-Crusted Rune
-- Shadowlands profession world quests
[182021] = true, -- Antique Kyrian Javelin
[182043] = true, -- Antique Necromancer's Staff
[182067] = true, -- Antique Duelist's Rapier
[181991] = true, -- Antique Stalker's Bow
-- Dragonflight profession items
-- https://www.wowhead.com/items?filter=104;0;amount+of+magical+power+can+be+sensed+from+within
[200939] = true, -- Chromatic Pocketwatch
[200940] = true, -- Everflowing Inkwell
[200941] = true, -- Seal of Order
[200942] = true, -- Vibrant Emulsion
[200943] = true, -- Whispering Band
[200945] = true, -- Valiant Hammer
[200946] = true, -- Thunderous Blade
[200947] = true, -- Carving of Awakening
-- https://www.wowhead.com/items?filter=104;0;Disenchant+to+gain+Enchanting+knowledge
[198694] = true, -- Enriched Earthen Shard
[198798] = true, -- Flashfrozen Scroll
[198800] = true, -- Fractured Titanic Sphere
[198689] = true, -- Stormbound Horn
[198799] = true, -- Forgotten Arcane Tome
[198675] = true, -- Lava-Infused Seed
[201360] = true, -- Glimmer of Order
[201358] = true, -- Glimmer of Air
[201357] = true, -- Glimmer of Frost
[201359] = true, -- Glimmer of Earth
[201356] = true, -- Glimmer of Fire
}
function button:PLAYER_LOGIN()
local disenchanter, rogue
if IsSpellKnown(13262) then
disenchanter = true
end
if IsSpellKnown(1804) then
rogue = ITEM_MIN_SKILL:gsub("%%s", (T.client == "ruRU" and "Взлом замков" or GetSpellInfo(1809))):gsub("%%d", "%(.*%)")
end
local function OnTooltipSetUnit(self)
if self ~= GameTooltip or self:IsForbidden() then return end
local _, link = TooltipUtil.GetDisplayedItem(self)
if link and not InCombatLockdown() and IsAltKeyDown() and not (AuctionHouseFrame and AuctionHouseFrame:IsShown()) then
local itemID = GetItemInfoFromHyperlink(link)
if not itemID then return end
local spell, r, g, b
if disenchanter then
if enchantingItems[itemID] then
spell, r, g, b = GetSpellInfo(13262), 0.5, 0.5, 1
else
local _, _, quality, _, _, _, _, _, _, _, _, class, subClass = GetItemInfo(link)
if quality and ((quality >= Enum.ItemQuality.Uncommon and quality <= Enum.ItemQuality.Epic)
and C_Item.GetItemInventoryTypeByID(itemID) ~= Enum.InventoryType.IndexBodyType
and (class == Enum.ItemClass.Weapon
or (class == Enum.ItemClass.Armor and subClass ~= Enum.ItemClass.Cosmetic)
or (class == Enum.ItemClass.Gem and subClass == 11)
or class == Enum.ItemClass.Profession)) then
spell, r, g, b = GetSpellInfo(13262), 0.5, 0.5, 1
end
end
elseif rogue then
for index = 1, self:NumLines() do
if string.match(_G["GameTooltipTextLeft"..index]:GetText() or "", rogue) then
spell, r, g, b = GetSpellInfo(1804), 0, 1, 1
end
end
end
local bag, slot = GetMouseFocus():GetParent(), GetMouseFocus()
if spell and C_Container.GetContainerItemLink(bag:GetID(), slot:GetID()) == link then
button:SetAttribute("macrotext", string.format("/cast %s\n/use %s %s", spell, bag:GetID(), slot:GetID()))
button:SetAllPoints(slot)
button:Show()
AutoCastShine_AutoCastStart(button, r, g, b)
end
end
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, OnTooltipSetUnit)
self:SetFrameStrata("TOOLTIP")
self:SetAttribute("*type1", "macro")
self:SetScript("OnLeave", self.MODIFIER_STATE_CHANGED)
self:RegisterEvent("MODIFIER_STATE_CHANGED")
self:Hide()
for _, sparks in pairs(self.sparkles) do
sparks:SetHeight(sparks:GetHeight() * 3)
sparks:SetWidth(sparks:GetWidth() * 3)
end
end
function button:MODIFIER_STATE_CHANGED(key)
if not self:IsShown() and not key and key ~= "LALT" and key ~= "RALT" then return end
if InCombatLockdown() then
self:SetAlpha(0)
self:RegisterEvent("PLAYER_REGEN_ENABLED")
else
self:ClearAllPoints()
self:SetAlpha(1)
self:Hide()
AutoCastShine_AutoCastStop(self)
end
end
function button:PLAYER_REGEN_ENABLED()
self:UnregisterEvent("PLAYER_REGEN_ENABLED")
self:MODIFIER_STATE_CHANGED()
end
================================================
FILE: ShestakUI/Modules/Trade/OneClickEnchantScroll.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.trade.enchantment_scroll ~= true or IsAddOnLoaded("OneClickEnchantScroll") then return end
----------------------------------------------------------------------------------------
-- Enchantment scroll on TradeSkill frame(OneClickEnchantScroll by Sara.Festung)
----------------------------------------------------------------------------------------
local button = CreateFrame("Button", "TradeSkillCreateScrollButton", ProfessionsFrame, "MagicButtonTemplate")
if C.skins.blizzard_frames == true then
button:SkinButton(true)
button:SetPoint("TOPRIGHT", ProfessionsFrame.CraftingPage.CreateButton, "TOPLEFT", -1, 0)
else
button:SetPoint("TOPRIGHT", ProfessionsFrame.CraftingPage.CreateButton, "TOPLEFT")
end
button:SetScript("OnClick", function()
local currentRecipeInfo = ProfessionsFrame.CraftingPage.SchematicForm:GetRecipeInfo()
if currentRecipeInfo then
C_TradeSkillUI.CraftRecipe(currentRecipeInfo.recipeID)
UseItemByName(38682)
end
end)
hooksecurefunc(ProfessionsFrame.CraftingPage, "ValidateControls", function(self)
if C_TradeSkillUI.IsTradeSkillGuild() or C_TradeSkillUI.IsNPCCrafting() or C_TradeSkillUI.IsTradeSkillLinked() then
button:Hide()
else
local currentRecipeInfo = ProfessionsFrame.CraftingPage.SchematicForm:GetRecipeInfo()
if currentRecipeInfo and currentRecipeInfo.alternateVerb then
local professionInfo = ProfessionsFrame:GetProfessionInfo()
if professionInfo and professionInfo.parentProfessionID == 333 then
button:Show()
local isEnchantingRecipe = currentRecipeInfo.isEnchantingRecipe
local numScrollsAvailable = GetItemCount(38682)
button:SetText(L_MISC_SCROLL.." ("..numScrollsAvailable..")")
if numScrollsAvailable == 0 then
isEnchantingRecipe = false
end
if isEnchantingRecipe then
button:Enable()
else
button:Disable()
end
else
button:Hide()
end
else
button:Hide()
end
end
end)
================================================
FILE: ShestakUI/Modules/Trade/ProfessionTabs.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.trade.profession_tabs ~= true then return end
----------------------------------------------------------------------------------------
-- Professions tabs on tradeskill frame(ProfessionTabs by Beoko)
----------------------------------------------------------------------------------------
local IsCurrentSpell = IsCurrentSpell
local format = string.format
local next = next
local ranks = PROFESSION_RANKS
local tabs, spells = {}, {}
local handler = CreateFrame("Frame")
handler:SetScript("OnEvent", function(self, event) self[event](self, event) end)
handler:RegisterEvent("TRADE_SKILL_SHOW")
handler:RegisterEvent("TRADE_SKILL_CLOSE")
handler:RegisterEvent("TRADE_SHOW")
handler:RegisterEvent("SKILL_LINES_CHANGED")
handler:RegisterEvent("CURRENT_SPELL_CAST_CHANGED")
local buttonList = {
[1] = {"Professions-Icon-Skill-High", TRADESKILL_FILTER_HAS_SKILL_UP, C_TradeSkillUI.GetOnlyShowSkillUpRecipes, C_TradeSkillUI.SetOnlyShowSkillUpRecipes},
[2] = {"Interface\\RAIDFRAME\\ReadyCheck-Ready", CRAFT_IS_MAKEABLE, C_TradeSkillUI.GetOnlyShowMakeableRecipes, C_TradeSkillUI.SetOnlyShowMakeableRecipes},
}
local function filterClick(self)
local value = self.__value
if value[3]() then
value[4](false)
self:SetBackdropBorderColor(unpack(C.media.border_color))
else
value[4](true)
self:SetBackdropBorderColor(1, 0.8, 0)
end
end
local buttons = {}
for index, value in pairs(buttonList) do
local button = CreateFrame("Button", nil, ProfessionsFrame.CraftingPage, "BackdropTemplate")
button:SetSize(22, 22)
button:SetPoint("BOTTOMRIGHT", ProfessionsFrame.CraftingPage.RecipeList.FilterButton, "TOPRIGHT", -(index-1)*27, 10)
button:SetTemplate("Overlay")
button.Icon = button:CreateTexture(nil, "OVERLAY")
if index == 1 then
button.Icon:SetAtlas(value[1])
else
button.Icon:SetTexture(value[1])
end
button.Icon:SetPoint("TOPLEFT", button, 2, -2)
button.Icon:SetPoint("BOTTOMRIGHT", button, -2, 2)
local tooltip_hide = function()
GameTooltip:Hide()
end
local tooltip_show = function(self)
GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT", 0, 3)
GameTooltip:ClearLines()
GameTooltip:SetText(value[2])
end
button:SetScript("OnEnter", tooltip_show)
button:SetScript("OnLeave", tooltip_hide)
button.__value = value
button:SetScript("OnClick", filterClick)
buttons[index] = button
end
function handler:TRADE_SKILL_LIST_UPDATE()
for index, value in pairs(buttonList) do
if value[3]() then
buttons[index]:SetBackdropBorderColor(1, 0.8, 0)
else
buttons[index]:SetBackdropBorderColor(unpack(C.media.border_color))
end
end
end
handler:RegisterEvent("TRADE_SKILL_LIST_UPDATE")
local defaults = {
-- Primary Professions
[171] = {true, false}, -- Alchemy
[164] = {true, false}, -- Blacksmithing
[333] = {true, true}, -- Enchanting
[202] = {true, false}, -- Engineering
[182] = {false, false}, -- Herbalism
[773] = {true, true}, -- Inscription
[755] = {true, true}, -- Jewelcrafting
[165] = {true, false}, -- Leatherworking
[186] = {true, false}, -- Mining
[393] = {false, false}, -- Skinning
[197] = {true, false}, -- Tailoring
-- Secondary Professions
[794] = {false, false}, -- Archaeology
[185] = {true, true}, -- Cooking
[356] = {false, false}, -- Fishing
}
if T.class == "DEATHKNIGHT" then spells[#spells + 1] = 53428 end -- Runeforging
if T.class == "ROGUE" then spells[#spells + 1] = 1804 end -- Pick Lock
local function UpdateSelectedTabs(object)
if not handler:IsEventRegistered("CURRENT_SPELL_CAST_CHANGED") then
handler:RegisterEvent("CURRENT_SPELL_CAST_CHANGED")
end
for index = 1, #tabs[object] do
local tab = tabs[object][index]
tab:SetChecked(IsCurrentSpell(tab.name))
end
end
local function ResetTabs(object)
for index = 1, #tabs[object] do
tabs[object][index]:Hide()
end
tabs[object].index = 0
end
local function UpdateTab(object, name, rank, texture, hat)
local index = tabs[object].index + 1
local tab = tabs[object][index] or CreateFrame("CheckButton", "ProTabs"..tabs[object].index, object, "SpellBookSkillLineTabTemplate, SecureActionButtonTemplate")
tab:RegisterForClicks("LeftButtonUp", "LeftButtonDown")
tab:ClearAllPoints()
if IsAddOnLoaded("Aurora") then
tab:SetPoint("TOPLEFT", object, "TOPRIGHT", 11, (-44 * index) + 10)
tab:DisableDrawLayer("BACKGROUND")
tab:SetNormalTexture(texture)
tab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)
local F, C = unpack(Aurora)
tab:SetCheckedTexture(C.media.checked)
tab:GetHighlightTexture():SetColorTexture(1, 1, 1, 0.3)
tab:GetHighlightTexture():SetAllPoints(tab:GetNormalTexture())
F.CreateBG(tab)
elseif C.skins.blizzard_frames == true then
tab:SetPoint("TOPLEFT", object, "TOPRIGHT", 1, (-44 * index) + 44)
tab:DisableDrawLayer("BACKGROUND")
tab:SetNormalTexture(texture)
tab:GetNormalTexture():ClearAllPoints()
tab:GetNormalTexture():SetPoint("TOPLEFT", 2, -2)
tab:GetNormalTexture():SetPoint("BOTTOMRIGHT", -2, 2)
tab:GetNormalTexture():SetTexCoord(0.1, 0.9, 0.1, 0.9)
tab:CreateBackdrop("Default")
tab.backdrop:SetAllPoints()
tab:StyleButton(true)
else
tab:SetPoint("TOPLEFT", object, "TOPRIGHT", 0, (-44 * index) + 18)
tab:SetNormalTexture(texture)
end
if hat then
tab:SetAttribute("type", "toy")
tab:SetAttribute("toy", 134020)
elseif texture == 135805 then -- Cooking Fire
tab:SetAttribute("type", "macro")
tab:SetAttribute("macrotext", "/cast [@player]"..name)
else
tab:SetAttribute("type", "spell")
tab:SetAttribute("spell", name)
end
tab:Show()
tab.name = name
tab.tooltip = rank and (rank ~= "" and rank ~= name) and format("%s (%s)", name, rank) or name
tabs[object][index] = tabs[object][index] or tab
tabs[object].index = tabs[object].index + 1
end
local function GetProfessionRank(currentSkill, skillLineName)
if skillLineName then
return skillLineName
end
if currentSkill <= 74 then
return APPRENTICE
end
for index = #ranks, 1, -1 do
local requiredSkill, title = ranks[index][1], ranks[index][2]
if currentSkill >= requiredSkill then
return title
end
end
end
local function HandleProfession(object, professionID, hat)
if professionID then
local _, _, currentSkill, _, numAbilities, offset, skillID, _, _, _, skillLineName = GetProfessionInfo(professionID)
if defaults[skillID] then
for index = 1, numAbilities do
if defaults[skillID][index] then
local name = GetSpellBookItemName(offset + index, "profession")
local rank = GetProfessionRank(currentSkill, skillLineName)
local texture = GetSpellBookItemTexture(offset + index, "profession")
if name and rank and texture then
UpdateTab(object, name, rank, texture)
end
end
end
end
if hat and PlayerHasToy(134020) and C_ToyBox.IsToyUsable(134020) then
UpdateTab(object, GetSpellInfo(67556), nil, 236571, true)
end
end
end
local function HandleTabs(object)
if not object then return end
tabs[object] = tabs[object] or {}
if InCombatLockdown() then
handler:RegisterEvent("PLAYER_REGEN_ENABLED")
else
local firstProfession, secondProfession, archaeology, fishing, cooking = GetProfessions()
ResetTabs(object)
HandleProfession(object, firstProfession)
HandleProfession(object, secondProfession)
HandleProfession(object, archaeology)
HandleProfession(object, fishing)
HandleProfession(object, cooking, true)
for index = 1, #spells do
if IsSpellKnown(spells[index]) then
local name, rank, texture = GetSpellInfo(spells[index])
UpdateTab(object, name, rank, texture)
end
end
end
UpdateSelectedTabs(object)
end
function handler:TRADE_SKILL_SHOW(event)
local owner = ATSWFrame or MRTSkillFrame or SkilletFrame or ProfessionsFrame
if IsAddOnLoaded("TradeSkillDW") and owner == ProfessionsFrame then
self:UnregisterEvent(event)
else
HandleTabs(owner)
UpdateSelectedTabs(owner)
end
end
function handler:TRADE_SKILL_CLOSE()
for object in next, tabs do
if object:IsShown() then
UpdateSelectedTabs(object)
end
end
end
function handler:TRADE_SHOW(event)
local owner = TradeFrame
HandleTabs(owner)
self[event] = function() UpdateSelectedTabs(owner) end
end
function handler:PLAYER_REGEN_ENABLED(event)
self:UnregisterEvent(event)
for object in next, tabs do HandleTabs(object) end
end
function handler:SKILL_LINES_CHANGED()
for object in next, tabs do HandleTabs(object) end
end
function handler:CURRENT_SPELL_CAST_CHANGED(event)
local numShown = 0
for object in next, tabs do
if object:IsShown() then
numShown = numShown + 1
UpdateSelectedTabs(object)
end
end
if numShown == 0 then self:UnregisterEvent(event) end
end
================================================
FILE: ShestakUI/Modules/Trade/SumAucBuyouts.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.trade.sum_buyouts ~= true then return end
----------------------------------------------------------------------------------------
-- Sum up all current auctions(Sigma by Ailae)
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(_, _, addon)
if addon == "Blizzard_AuctionHouseUI" then
local f = CreateFrame("Frame", nil, AuctionHouseFrame)
f:SetSize(200, 20)
f:SetPoint("LEFT", AuctionHouseFrame.MoneyFrameBorder, "RIGHT", 38, -1)
local text = f:CreateFontString(nil, "OVERLAY", "PriceFont")
text:SetPoint("LEFT")
f:RegisterEvent("OWNED_AUCTIONS_UPDATED")
f:SetScript("OnEvent", function()
local totalBuyout = 0
local totalBid = 0
for i = 1, C_AuctionHouse.GetNumOwnedAuctions() do
local info = C_AuctionHouse.GetOwnedAuctionInfo(i)
if info.buyoutAmount then
totalBuyout = totalBuyout + (info.buyoutAmount * info.quantity)
end
if info.bidAmount then
totalBid = totalBid + info.bidAmount
end
end
if totalBid > 0 and totalBuyout > 0 then
text:SetText(BIDS..": "..GetCoinTextureString(totalBid).." "..BUYOUT..": "..GetCoinTextureString(totalBuyout))
elseif totalBid > 0 and totalBuyout == 0 then
text:SetText(BIDS..": "..GetCoinTextureString(totalBid))
elseif totalBid == 0 and totalBuyout > 0 then
text:SetText(BUYOUT..": "..GetCoinTextureString(totalBuyout))
else
text:SetText("")
end
end)
end
end)
================================================
FILE: ShestakUI/Modules/Trade/TrainAll.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Learn all available skills(TrainAll by SDPhantom)
----------------------------------------------------------------------------------------
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(_, _, addon)
if addon == "Blizzard_TrainerUI" then
local cost, num
local button = CreateFrame("Button", "ClassTrainerTrainAllButton", ClassTrainerFrame, "UIPanelButtonTemplate")
button:SetText(ACHIEVEMENTFRAME_FILTER_ALL)
button:SetScript("OnEnter", function()
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
GameTooltip:SetText(AVAILABLE..": "..num.."\n"..COSTS_LABEL.." "..GetMoneyString(cost))
end)
button:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
if C.skins.blizzard_frames == true then
button:SkinButton()
button:SetPoint("TOPRIGHT", ClassTrainerTrainButton, "TOPLEFT", -3, 0)
else
button:SetPoint("TOPRIGHT", ClassTrainerTrainButton, "TOPLEFT", 0, 0)
end
button:SetWidth(min(50, button:GetTextWidth() + 15))
button:SetScript("OnClick", function()
for i = 1, GetNumTrainerServices() do
if select(2, GetTrainerServiceInfo(i)) == "available" then
BuyTrainerService(i)
end
end
end)
hooksecurefunc("ClassTrainerFrame_Update", function()
num, cost = 0, 0
for i = 1, GetNumTrainerServices() do
if select(2, GetTrainerServiceInfo(i)) == "available" then
num = num + 1
cost = cost + GetTrainerServiceCost(i)
end
end
button:SetEnabled(num > 0)
end)
end
end)
================================================
FILE: ShestakUI/Modules/UnitFrames/Colors.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
----------------------------------------------------------------------------------------
-- Colors
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
T.oUF_colors = setmetatable({
tapped = {0.6, 0.6, 0.6},
disconnected = {0.84, 0.75, 0.65},
power = setmetatable({
["MANA"] = {0.31, 0.45, 0.63},
["RAGE"] = {0.69, 0.31, 0.31},
["FOCUS"] = {0.71, 0.43, 0.27},
["ENERGY"] = {0.65, 0.63, 0.35},
["POWER_TYPE_FEL_ENERGY"] = {0.65, 0.63, 0.35},
["RUNES"] = {0.55, 0.57, 0.61},
["RUNIC_POWER"] = {0, 0.82, 1},
["AMMOSLOT"] = {0.8, 0.6, 0},
["FUEL"] = {0, 0.55, 0.5},
}, {__index = oUF.colors.power}),
reaction = setmetatable({
[1] = {0.85, 0.27, 0.27}, -- Hated
[2] = {0.85, 0.27, 0.27}, -- Hostile
[3] = {0.85, 0.27, 0.27}, -- Unfriendly
[4] = {0.85, 0.77, 0.36}, -- Neutral
[5] = {0.33, 0.59, 0.33}, -- Friendly
[6] = {0.33, 0.59, 0.33}, -- Honored
[7] = {0.33, 0.59, 0.33}, -- Revered
[8] = {0.33, 0.59, 0.33}, -- Exalted
}, {__index = oUF.colors.reaction}),
}, {__index = oUF.colors})
================================================
FILE: ShestakUI/Modules/UnitFrames/Functions.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.unitframe.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Unit frames functions
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
T.oUF = oUF
T.UpdateAllElements = function(frame)
for _, v in ipairs(frame.__elements) do
v(frame, "UpdateElement", frame.unit)
end
end
T.SetFontString = function(parent, fontName, fontHeight, fontStyle)
local fs = parent:CreateFontString(nil, "ARTWORK")
fs:SetFont(fontName, fontHeight, fontStyle)
fs:SetShadowOffset(C.font.unit_frames_font_shadow and 1 or 0, C.font.unit_frames_font_shadow and -1 or 0)
return fs
end
T.PostUpdateHealth = function(health, unit, min, max)
if unit and unit:find("arena%dtarget") then return end
if not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then
health:SetValue(0)
if not UnitIsConnected(unit) then
health.value:SetText("|cffD7BEA5"..L_UF_OFFLINE.."|r")
elseif UnitIsDead(unit) then
health.value:SetText("|cffD7BEA5"..L_UF_DEAD.."|r")
elseif UnitIsGhost(unit) then
health.value:SetText("|cffD7BEA5"..L_UF_GHOST.."|r")
end
else
local r, g, b
if (C.unitframe.own_color ~= true and C.unitframe.enemy_health_color and unit == "target" and UnitIsEnemy(unit, "player") and UnitIsPlayer(unit)) or (C.unitframe.own_color ~= true and unit == "target" and not UnitIsPlayer(unit) and UnitIsFriend(unit, "player")) then
local c = T.oUF_colors.reaction[UnitReaction(unit, "player")]
if c then
r, g, b = c[1], c[2], c[3]
health:SetStatusBarColor(r, g, b)
else
r, g, b = 0.3, 0.7, 0.3
health:SetStatusBarColor(r, g, b)
end
end
if unit == "pet" then
local _, class = UnitClass("player")
local r, g, b = unpack(T.oUF_colors.class[class])
if C.unitframe.own_color == true then
health:SetStatusBarColor(unpack(C.unitframe.uf_color))
health.bg:SetVertexColor(0.1, 0.1, 0.1)
else
if b then
health:SetStatusBarColor(r, g, b)
if health.bg and health.bg.multiplier then
local mu = health.bg.multiplier
health.bg:SetVertexColor(r * mu, g * mu, b * mu)
end
end
end
end
if C.unitframe.bar_color_value == true and not UnitIsTapDenied(unit) then
if C.unitframe.own_color == true then
r, g, b = C.unitframe.uf_color[1], C.unitframe.uf_color[2], C.unitframe.uf_color[3]
else
r, g, b = health:GetStatusBarColor()
end
local newr, newg, newb = oUF:ColorGradient(min, max, 1, 0, 0, 1, 1, 0, r, g, b)
health:SetStatusBarColor(newr, newg, newb)
if health.bg and health.bg.multiplier then
local mu = health.bg.multiplier
health.bg:SetVertexColor(newr * mu, newg * mu, newb * mu)
end
end
if min ~= max then
r, g, b = oUF:ColorGradient(min, max, 0.69, 0.31, 0.31, 0.65, 0.63, 0.35, 0.33, 0.59, 0.33)
if (unit == "player" and not UnitHasVehicleUI("player") or unit == "vehicle") and health:GetAttribute("normalUnit") ~= "pet" then
if C.unitframe.show_total_value == true then
if C.unitframe.color_value == true then
health.value:SetFormattedText("|cff559655%s|r |cffD7BEA5-|r |cff559655%s|r", T.ShortValue(min), T.ShortValue(max))
else
health.value:SetFormattedText("|cffffffff%s - %s|r", T.ShortValue(min), T.ShortValue(max))
end
else
if C.unitframe.color_value == true then
health.value:SetFormattedText("|cffAF5050%d|r |cffD7BEA5-|r |cff%02x%02x%02x%d%%|r", min, r * 255, g * 255, b * 255, floor(min / max * 100))
else
health.value:SetFormattedText("|cffffffff%d - %d%%|r", min, floor(min / max * 100))
end
end
elseif unit == "target" then
if C.unitframe.show_total_value == true then
if C.unitframe.color_value == true then
health.value:SetFormattedText("|cff559655%s|r |cffD7BEA5-|r |cff559655%s|r", T.ShortValue(min), T.ShortValue(max))
else
health.value:SetFormattedText("|cffffffff%s - %s|r", T.ShortValue(min), T.ShortValue(max))
end
else
if C.unitframe.color_value == true then
health.value:SetFormattedText("|cff%02x%02x%02x%d%%|r |cffD7BEA5-|r |cffAF5050%s|r", r * 255, g * 255, b * 255, floor(min / max * 100), T.ShortValue(min))
else
health.value:SetFormattedText("|cffffffff%d%% - %s|r", floor(min / max * 100), T.ShortValue(min))
end
end
elseif unit and unit:find("boss%d") then
if C.unitframe.color_value == true then
health.value:SetFormattedText("|cff%02x%02x%02x%d%%|r |cffD7BEA5-|r |cffAF5050%s|r", r * 255, g * 255, b * 255, floor(min / max * 100), T.ShortValue(min))
else
health.value:SetFormattedText("|cffffffff%d%% - %s|r", floor(min / max * 100), T.ShortValue(min))
end
else
if C.unitframe.color_value == true then
health.value:SetFormattedText("|cff%02x%02x%02x%d%%|r", r * 255, g * 255, b * 255, floor(min / max * 100))
else
health.value:SetFormattedText("|cffffffff%d%%|r", floor(min / max * 100))
end
end
else
if (unit == "player" and not UnitHasVehicleUI("player") or unit == "vehicle") then
if C.unitframe.color_value == true then
health.value:SetText("|cff559655"..max.."|r")
else
health.value:SetText("|cffffffff"..max.."|r")
end
else
if C.unitframe.color_value == true then
health.value:SetText("|cff559655"..T.ShortValue(max).."|r")
else
health.value:SetText("|cffffffff"..T.ShortValue(max).."|r")
end
end
end
end
end
T.PostUpdateRaidHealth = function(health, unit, min, max)
local self = health:GetParent()
local power = self.Power
local border = self.backdrop
if not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then
health:SetValue(0)
if not UnitIsConnected(unit) then
health.value:SetText("|cffD7BEA5"..L_UF_OFFLINE.."|r")
elseif UnitIsDead(unit) then
health.value:SetText("|cffD7BEA5"..L_UF_DEAD.."|r")
elseif UnitIsGhost(unit) then
health.value:SetText("|cffD7BEA5"..L_UF_GHOST.."|r")
end
else
local r, g, b
if not UnitIsPlayer(unit) and UnitIsFriend(unit, "player") and C.unitframe.own_color ~= true then
local c = T.oUF_colors.reaction[5]
local r, g, b = c[1], c[2], c[3]
health:SetStatusBarColor(r, g, b)
if health.bg and health.bg.multiplier then
local mu = health.bg.multiplier
health.bg:SetVertexColor(r * mu, g * mu, b * mu)
end
end
if C.unitframe.bar_color_value == true and not UnitIsTapDenied(unit) then
if C.unitframe.own_color == true then
r, g, b = C.unitframe.uf_color[1], C.unitframe.uf_color[2], C.unitframe.uf_color[3]
else
r, g, b = health:GetStatusBarColor()
end
local newr, newg, newb = oUF:ColorGradient(min, max, 1, 0, 0, 1, 1, 0, r, g, b)
health:SetStatusBarColor(newr, newg, newb)
if health.bg and health.bg.multiplier then
local mu = health.bg.multiplier
health.bg:SetVertexColor(newr * mu, newg * mu, newb * mu)
end
end
if min ~= max then
r, g, b = oUF:ColorGradient(min, max, 0.69, 0.31, 0.31, 0.65, 0.63, 0.35, 0.33, 0.59, 0.33)
if self:GetParent():GetName():match("oUF_PartyDPS") then
if C.unitframe.color_value == true then
health.value:SetFormattedText("|cffAF5050%s|r |cffD7BEA5-|r |cff%02x%02x%02x%d%%|r", T.ShortValue(min), r * 255, g * 255, b * 255, floor(min / max * 100))
else
health.value:SetFormattedText("|cffffffff%s - %d%%|r", T.ShortValue(min), floor(min / max * 100))
end
else
if C.unitframe.color_value == true then
if C.raidframe.deficit_health == true then
health.value:SetText("|cffffffff".."-"..T.ShortValue(max - min))
else
health.value:SetFormattedText("|cff%02x%02x%02x%d%%|r", r * 255, g * 255, b * 255, floor(min / max * 100))
end
else
if C.raidframe.deficit_health == true then
health.value:SetText("|cffffffff".."-"..T.ShortValue(max - min))
else
health.value:SetFormattedText("|cffffffff%d%%|r", floor(min / max * 100))
end
end
end
else
if C.unitframe.color_value == true then
health.value:SetText("|cff559655"..T.ShortValue(max).."|r")
else
health.value:SetText("|cffffffff"..T.ShortValue(max).."|r")
end
end
if C.raidframe.alpha_health == true then
if min / max > 0.95 then
health:SetAlpha(0.6)
power:SetAlpha(0.6)
border:SetAlpha(0.6)
else
health:SetAlpha(1)
power:SetAlpha(1)
border:SetAlpha(1)
end
end
end
end
T.PreUpdatePower = function(power, unit)
local _, pToken = UnitPowerType(unit)
local color = T.oUF_colors.power[pToken]
if color then
power:SetStatusBarColor(color[1], color[2], color[3])
end
end
T.PostUpdatePower = function(power, unit, cur, _, max)
if unit and unit:find("arena%dtarget") then return end
local self = power:GetParent()
local pType, pToken = UnitPowerType(unit)
local color = T.oUF_colors.power[pToken]
if color then
power.value:SetTextColor(color[1], color[2], color[3])
end
if not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then
power:SetValue(0)
end
if unit == "focus" or unit == "focustarget" or unit == "targettarget" or (self:GetParent():GetName():match("oUF_RaidDPS")) then return end
if not UnitIsConnected(unit) then
power.value:SetText()
elseif UnitIsDead(unit) or UnitIsGhost(unit) or max == 0 then
power.value:SetText()
else
if cur ~= max then
if pType == 0 and pToken ~= "POWER_TYPE_DINO_SONIC" then
if unit == "target" then
if C.unitframe.show_total_value == true then
if C.unitframe.color_value == true then
power.value:SetFormattedText("%s |cffD7BEA5-|r %s", T.ShortValue(max - (max - cur)), T.ShortValue(max))
else
power.value:SetFormattedText("|cffffffff%s - %s|r", T.ShortValue(max - (max - cur)), T.ShortValue(max))
end
else
if C.unitframe.color_value == true then
power.value:SetFormattedText("%d%% |cffD7BEA5-|r %s", floor(cur / max * 100), T.ShortValue(max - (max - cur)))
else
power.value:SetFormattedText("|cffffffff%d%% - %s|r", floor(cur / max * 100), T.ShortValue(max - (max - cur)))
end
end
elseif (unit == "player" and power:GetAttribute("normalUnit") == "pet") or unit == "pet" then
if C.unitframe.show_total_value == true then
if C.unitframe.color_value == true then
power.value:SetFormattedText("%s |cffD7BEA5-|r %s", T.ShortValue(max - (max - cur)), T.ShortValue(max))
else
power.value:SetFormattedText("%s |cffffffff-|r %s", T.ShortValue(max - (max - cur)), T.ShortValue(max))
end
else
if C.unitframe.color_value == true then
power.value:SetFormattedText("%d%%", floor(cur / max * 100))
else
power.value:SetFormattedText("|cffffffff%d%%|r", floor(cur / max * 100))
end
end
elseif unit and (unit:find("arena%d") or unit:find("boss%d")) then
if C.unitframe.color_value == true then
power.value:SetFormattedText("|cffD7BEA5%d%% - %s|r", floor(cur / max * 100), T.ShortValue(max - (max - cur)))
else
power.value:SetFormattedText("|cffffffff%d%% - %s|r", floor(cur / max * 100), T.ShortValue(max - (max - cur)))
end
elseif self:GetParent():GetName():match("oUF_PartyDPS") then
if C.unitframe.color_value == true then
power.value:SetFormattedText("%s |cffD7BEA5-|r %d%%", T.ShortValue(max - (max - cur)), floor(cur / max * 100))
else
power.value:SetFormattedText("|cffffffff%s - %d%%|r", T.ShortValue(max - (max - cur)), floor(cur / max * 100))
end
else
if C.unitframe.show_total_value == true then
if C.unitframe.color_value == true then
power.value:SetFormattedText("%s |cffD7BEA5-|r %s", T.ShortValue(max - (max - cur)), T.ShortValue(max))
else
power.value:SetFormattedText("|cffffffff%s - %s|r", T.ShortValue(max - (max - cur)), T.ShortValue(max))
end
else
if C.unitframe.color_value == true then
power.value:SetFormattedText("%d |cffD7BEA5-|r %d%%", max - (max - cur), floor(cur / max * 100))
else
power.value:SetFormattedText("|cffffffff%d - %d%%|r", max - (max - cur), floor(cur / max * 100))
end
end
end
else
if C.unitframe.color_value == true then
power.value:SetText(max - (max - cur))
else
power.value:SetText("|cffffffff"..max - (max - cur).."|r")
end
end
else
if unit == "pet" or unit == "target" or (unit and unit:find("arena%d")) or (self:GetParent():GetName():match("oUF_PartyDPS")) then
if C.unitframe.color_value == true then
power.value:SetText(T.ShortValue(cur))
else
power.value:SetText("|cffffffff"..T.ShortValue(cur).."|r")
end
else
if C.unitframe.color_value == true then
power.value:SetText(cur)
else
power.value:SetText("|cffffffff"..cur.."|r")
end
end
end
end
end
local SetUpAnimGroup = function(self)
self.anim = self:CreateAnimationGroup()
self.anim:SetLooping("BOUNCE")
self.anim.fade = self.anim:CreateAnimation("Alpha")
self.anim.fade:SetFromAlpha(1)
self.anim.fade:SetToAlpha(0)
self.anim.fade:SetDuration(0.6)
self.anim.fade:SetSmoothing("IN_OUT")
end
local Flash = function(self)
if not self.anim then
SetUpAnimGroup(self)
end
if not self.anim:IsPlaying() then
self.anim:Play()
end
end
local StopFlash = function(self)
if self.anim then
self.anim:Finish()
end
end
T.UpdateManaLevel = function(self, elapsed)
self.elapsed = (self.elapsed or 0) + elapsed
if self.elapsed < 0.2 then return end
self.elapsed = 0
if UnitPowerType("player") == 0 then
local cur = UnitPower("player", 0)
local max = UnitPowerMax("player", 0)
local percMana = max > 0 and (cur / max * 100) or 100
if percMana <= 20 and not UnitIsDeadOrGhost("player") then
self.ManaLevel:SetText("|cffaf5050"..MANA_LOW.."|r")
Flash(self)
else
self.ManaLevel:SetText()
StopFlash(self)
end
elseif T.class ~= "DRUID" and T.class ~= "PRIEST" and T.class ~= "SHAMAN" then
self.ManaLevel:SetText()
StopFlash(self)
end
end
T.UpdateClassMana = function(self)
if self.unit ~= "player" then return end
if UnitPowerType("player") ~= 0 then
local min = UnitPower("player", 0)
local max = UnitPowerMax("player", 0)
local percMana = max > 0 and (min / max * 100) or 100
if percMana <= 20 and not UnitIsDeadOrGhost("player") then
self.FlashInfo.ManaLevel:SetText("|cffaf5050"..MANA_LOW.."|r")
Flash(self.FlashInfo)
else
self.FlashInfo.ManaLevel:SetText()
StopFlash(self.FlashInfo)
end
if min ~= max then
if self.Power.value:GetText() then
self.ClassMana:SetPoint("RIGHT", self.Power.value, "LEFT", -1, 0)
self.ClassMana:SetFormattedText("%d%%|r |cffD7BEA5-|r", floor(min / max * 100))
self.ClassMana:SetJustifyH("RIGHT")
else
self.ClassMana:SetPoint("LEFT", self.Power, "LEFT", 4, 0)
self.ClassMana:SetFormattedText("%d%%", floor(min / max * 100))
end
else
self.ClassMana:SetText()
end
self.ClassMana:SetAlpha(1)
else
self.ClassMana:SetAlpha(0)
end
end
T.UpdatePvPStatus = function(self)
local unit = self.unit
if self.Status then
local factionGroup = UnitFactionGroup(unit)
if UnitIsPVPFreeForAll(unit) then
self.Status:SetText(PVP)
elseif factionGroup and UnitIsPVP(unit) then
self.Status:SetText(PVP)
else
self.Status:SetText("")
end
end
end
local ticks = {}
local setBarTicks = function(Castbar, numTicks)
for _, v in pairs(ticks) do
v:Hide()
end
if numTicks and numTicks > 0 then
local delta = Castbar:GetWidth() / numTicks
for i = 1, numTicks do
if not ticks[i] then
ticks[i] = Castbar:CreateTexture(nil, "OVERLAY")
ticks[i]:SetTexture(C.media.texture)
ticks[i]:SetVertexColor(unpack(C.media.border_color))
ticks[i]:SetWidth(1)
ticks[i]:SetHeight(Castbar:GetHeight())
ticks[i]:SetDrawLayer("OVERLAY", 7)
end
ticks[i]:ClearAllPoints()
ticks[i]:SetPoint("CENTER", Castbar, "RIGHT", -delta * i, 0)
ticks[i]:Show()
end
end
end
local function castColor(unit)
local r, g, b
if UnitIsPlayer(unit) then
local _, class = UnitClass(unit)
local color = T.oUF_colors.class[class]
if color then
r, g, b = color[1], color[2], color[3]
end
else
local reaction = UnitReaction(unit, "player")
local color = T.oUF_colors.reaction[reaction]
if color and reaction >= 5 then
r, g, b = color[1], color[2], color[3]
else
r, g, b = 0.85, 0.77, 0.36
end
end
return r, g, b
end
T.PostCastStart = function(Castbar, unit)
if unit == "vehicle" then unit = "player" end
if unit == "player" and C.unitframe.castbar_latency == true and Castbar.Latency then
local _, _, _, ms = GetNetStats()
Castbar.Latency:SetText(("%dms"):format(ms))
if Castbar.casting then
Castbar.SafeZone:SetDrawLayer("BORDER")
Castbar.SafeZone:SetVertexColor(0.85, 0.27, 0.27)
else
Castbar.SafeZone:SetDrawLayer("ARTWORK")
Castbar.SafeZone:SetVertexColor(0.85, 0.27, 0.27, 0.75)
end
end
if unit == "player" and C.unitframe.castbar_ticks == true then
if Castbar.casting then
setBarTicks(Castbar, 0)
else
local spell = UnitChannelInfo(unit)
Castbar.channelingTicks = T.CastBarTicks[spell] or 0
setBarTicks(Castbar, Castbar.channelingTicks)
end
end
if Castbar.notInterruptible and UnitCanAttack("player", unit) then
Castbar:SetStatusBarColor(0.8, 0, 0)
Castbar.bg:SetVertexColor(0.8, 0, 0, 0.2)
Castbar.Overlay:SetBackdropBorderColor(0.8, 0, 0)
if C.unitframe.castbar_icon == true and (unit == "target" or unit == "focus") then
Castbar.Button:SetBackdropBorderColor(0.8, 0, 0)
end
else
if unit == "pet" or unit == "vehicle" then
local _, class = UnitClass("player")
local r, g, b = unpack(T.oUF_colors.class[class])
if C.unitframe.own_color == true then
Castbar:SetStatusBarColor(unpack(C.unitframe.uf_color))
Castbar.bg:SetVertexColor(C.unitframe.uf_color_bg[1], C.unitframe.uf_color_bg[2], C.unitframe.uf_color_bg[3], 1)
else
if b then
Castbar:SetStatusBarColor(r, g, b)
Castbar.bg:SetVertexColor(r, g, b, 0.2)
end
end
else
if C.unitframe.own_color == true then
Castbar:SetStatusBarColor(unpack(C.unitframe.uf_color))
Castbar.bg:SetVertexColor(C.unitframe.uf_color_bg[1], C.unitframe.uf_color_bg[2], C.unitframe.uf_color_bg[3], 1)
else
local r, g, b = castColor(unit)
Castbar:SetStatusBarColor(r, g, b)
Castbar.bg:SetVertexColor(r, g, b, 0.2)
end
end
Castbar.Overlay:SetBackdropBorderColor(unpack(C.media.border_color))
if C.unitframe.castbar_icon == true and (unit == "target" or unit == "focus") then
Castbar.Button:SetBackdropBorderColor(unpack(C.media.border_color))
end
end
if Castbar.Time and Castbar.Text then
local timeWidth = Castbar.Time:GetStringWidth()
local textWidth = Castbar:GetWidth() - timeWidth - 5
if timeWidth == 0 then
C_Timer.After(0.05, function()
textWidth = Castbar:GetWidth() - Castbar.Time:GetStringWidth() - 5
if textWidth > 0 then
Castbar.Text:SetWidth(textWidth)
end
end)
else
Castbar.Text:SetWidth(textWidth)
end
end
end
T.CustomCastTimeText = function(self, duration)
self.Time:SetText(("%.1f / %.1f"):format(self.channeling and duration or self.max - duration, self.max))
end
T.CustomCastDelayText = function(self, duration)
self.Time:SetText(("%.1f |cffaf5050%s %.1f|r"):format(self.channeling and duration or self.max - duration, self.channeling and "-" or "+", abs(self.delay)))
end
T.AuraTrackerTime = function(self, elapsed)
if self.active then
self.timeleft = self.timeleft - elapsed
if self.timeleft <= 5 then
self.text:SetTextColor(1, 0, 0)
else
self.text:SetTextColor(1, 1, 1)
end
if self.timeleft <= 0 then
self.icon:SetTexture("")
self.text:SetText("")
end
self.text:SetFormattedText("%.1f", self.timeleft)
end
end
T.HideAuraFrame = function(self)
if self.unit == "player" then
if not C.aura.player_auras then
BuffFrame:Hide()
self.Debuffs:Hide()
end
elseif self.unit == "pet" and not C.aura.pet_debuffs or self.unit == "focus" and not C.aura.focus_debuffs
or self.unit == "focustarget" and not C.aura.fot_debuffs or self.unit == "targettarget" and not C.aura.tot_debuffs then
self.Debuffs:Hide()
elseif self.unit == "target" and not C.aura.target_auras then
self.Auras:Hide()
end
end
T.PostCreateIcon = function(element, button)
button:SetTemplate("Default")
button.remaining = T.SetFontString(button, C.font.auras_font, C.font.auras_font_size, C.font.auras_font_style)
button.remaining:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)
button.remaining:SetPoint("CENTER", button, "CENTER", 1, 1)
button.remaining:SetJustifyH("CENTER")
button.Cooldown.noCooldownCount = true
button.Icon:SetPoint("TOPLEFT", 2, -2)
button.Icon:SetPoint("BOTTOMRIGHT", -2, 2)
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Count:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", 1, 0)
button.Count:SetJustifyH("RIGHT")
button.Count:SetFont(C.font.auras_font, C.font.auras_font_size, C.font.auras_font_style)
button.Count:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)
if C.aura.show_spiral == true then
element.disableCooldown = false
button.Cooldown:SetReverse(true)
button.Cooldown:SetPoint("TOPLEFT", button, "TOPLEFT", 2, -2)
button.Cooldown:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -2, 2)
button.parent = CreateFrame("Frame", nil, button)
button.parent:SetFrameLevel(button.Cooldown:GetFrameLevel() + 1)
button.Count:SetParent(button.parent)
button.remaining:SetParent(button.parent)
else
element.disableCooldown = true
end
end
local day, hour, minute = 86400, 3600, 60
local FormatTime = function(s)
if s >= day then
return format("%dd", floor(s / day + 0.5))
elseif s >= hour then
return format("%dh", floor(s / hour + 0.5))
elseif s >= minute then
return format("%dm", floor(s / minute + 0.5))
elseif s >= 5 then
return floor(s + 0.5)
end
return format("%.1f", s)
end
T.CreateAuraTimer = function(self, elapsed)
if self.timeLeft then
self.elapsed = (self.elapsed or 0) + elapsed
if self.elapsed >= 0.1 then
if not self.first then
self.timeLeft = self.timeLeft - self.elapsed
else
self.timeLeft = self.timeLeft - GetTime()
self.first = false
end
if self.timeLeft > 0 then
local time = FormatTime(self.timeLeft)
self.remaining:SetText(time)
else
self.remaining:Hide()
self:SetScript("OnUpdate", nil)
end
self.elapsed = 0
end
end
end
local playerUnits = {
player = true,
pet = true,
vehicle = true,
}
T.PostUpdateIcon = function(_, button, unit, data)
if data.isHarmful then
if not UnitIsFriend("player", unit) and not playerUnits[data.sourceUnit] then
if not C.aura.player_aura_only then
button:SetBackdropBorderColor(unpack(C.media.border_color))
button.Icon:SetDesaturated(true)
end
else
if C.aura.debuff_color_type == true then
local color = DebuffTypeColor[data.dispelName] or DebuffTypeColor.none
button:SetBackdropBorderColor(color.r, color.g, color.b)
button.Icon:SetDesaturated(false)
else
button:SetBackdropBorderColor(1, 0, 0)
end
end
else
if (data.isStealable or ((T.class == "MAGE" or T.class == "PRIEST" or T.class == "SHAMAN" or T.class == "HUNTER") and data.dispelName == "Magic")) and not UnitIsFriend("player", unit) then
button:SetBackdropBorderColor(1, 0.85, 0)
else
button:SetBackdropBorderColor(unpack(C.media.border_color))
end
button.Icon:SetDesaturated(false)
end
if data.duration and data.duration > 0 and C.aura.show_timer == true then
button.remaining:Show()
button.timeLeft = data.expirationTime
button:SetScript("OnUpdate", T.CreateAuraTimer)
else
button.remaining:Hide()
button.timeLeft = math.huge
button:SetScript("OnUpdate", nil)
end
button.first = true
end
T.CustomFilter = function(element, unit, data)
if C.aura.player_aura_only then
if data.isHarmful then
if not UnitIsFriend("player", unit) and not playerUnits[data.sourceUnit] then
return false
end
end
end
return true
end
T.CustomFilterBoss = function(element, unit, data)
if data.isHarmful then
if (playerUnits[data.sourceUnit] or data.sourceUnit == unit) then
if (T.DebuffBlackList and not T.DebuffBlackList[data.name]) or not T.DebuffBlackList then
return true
end
end
return false
end
return true
end
T.UpdateThreat = function(self, unit, status, r, g, b)
local parent = self:GetParent()
local badunit = not unit or parent.unit ~= unit
if not badunit and status and status > 1 then
parent.backdrop:SetBackdropBorderColor(r, g, b)
else
parent.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end
end
local CountOffSets = {
TOPLEFT = {"LEFT", "RIGHT", 1, 0},
TOPRIGHT = {"RIGHT", "LEFT", 2, 0},
BOTTOMLEFT = {"LEFT", "RIGHT", 1, 0},
BOTTOMRIGHT = {"RIGHT", "LEFT", 2, 0},
LEFT = {"LEFT", "RIGHT", 1, 0},
RIGHT = {"RIGHT", "LEFT", 2, 0},
TOP = {"RIGHT", "LEFT", 2, 0},
BOTTOM = {"RIGHT", "LEFT", 2, 0},
}
T.CreateAuraWatchIcon = function(_, icon)
icon:SetTemplate("Default")
icon.icon:SetPoint("TOPLEFT", icon, 1, -1)
icon.icon:SetPoint("BOTTOMRIGHT", icon, -1, 1)
icon.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon.icon:SetDrawLayer("ARTWORK")
if icon.cd then
icon.cd:SetReverse(true)
end
end
T.CreateAuraWatch = function(self)
local auras = CreateFrame("Frame", nil, self)
auras:SetPoint("TOPLEFT", self.Health, 0, 0)
auras:SetPoint("BOTTOMRIGHT", self.Health, 0, 0)
auras.icons = {}
auras.PostCreateIcon = T.CreateAuraWatchIcon
if not C.aura.show_timer then
auras.hideCooldown = true
end
local buffs = {}
if T.RaidBuffs["ALL"] then
for _, value in pairs(T.RaidBuffs["ALL"]) do
tinsert(buffs, value)
end
end
if T.RaidBuffs[T.class] then
for _, value in pairs(T.RaidBuffs[T.class]) do
tinsert(buffs, value)
end
end
if buffs then
for _, spell in pairs(buffs) do
local icon = CreateFrame("Frame", nil, auras)
icon.spellID = spell[1]
icon.anyUnit = spell[4]
icon.strictMatching = spell[5]
icon:SetSize(7 * C.raidframe.icon_multiplier, 7 * C.raidframe.icon_multiplier)
icon:SetPoint(spell[2], 0, 0)
local tex = icon:CreateTexture(nil, "OVERLAY")
tex:SetAllPoints(icon)
tex:SetTexture(C.media.blank)
if spell[3] then
tex:SetVertexColor(unpack(spell[3]))
else
tex:SetVertexColor(0.8, 0.8, 0.8)
end
icon.icon = tex
local count = T.SetFontString(icon, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
local point, anchorPoint, x, y = unpack(CountOffSets[spell[2]])
count:SetPoint(point, icon, anchorPoint, x, y)
icon.count = count
auras.icons[spell[1]] = icon
end
end
self.AuraWatch = auras
end
T.CreateHealthPrediction = function(self)
local mhpb = self.Health:CreateTexture(nil, "ARTWORK")
mhpb:SetTexture(C.media.texture)
mhpb:SetVertexColor(0, 1, 0.5, 0.2)
local ohpb = self.Health:CreateTexture(nil, "ARTWORK")
ohpb:SetTexture(C.media.texture)
ohpb:SetVertexColor(0, 1, 0, 0.2)
local ahpb = self.Health:CreateTexture(nil, "ARTWORK")
ahpb:SetTexture(C.media.texture)
ahpb:SetVertexColor(1, 1, 0, 0.2)
local hab = self.Health:CreateTexture(nil, "ARTWORK")
hab:SetTexture(C.media.texture)
hab:SetVertexColor(1, 0, 0, 0.4)
local oa = self.Health:CreateTexture(nil, "ARTWORK")
oa:SetTexture([[Interface\AddOns\ShestakUI\Media\Textures\Cross.tga]], "REPEAT", "REPEAT")
oa:SetVertexColor(0.5, 0.5, 1)
oa:SetHorizTile(true)
oa:SetVertTile(true)
oa:SetAlpha(0.4)
oa:SetBlendMode("ADD")
local oha = self.Health:CreateTexture(nil, "ARTWORK")
oha:SetTexture([[Interface\AddOns\ShestakUI\Media\Textures\Cross.tga]], "REPEAT", "REPEAT")
oha:SetVertexColor(1, 0, 0)
oha:SetHorizTile(true)
oha:SetVertTile(true)
oha:SetAlpha(0.4)
oha:SetBlendMode("ADD")
self.HealthPrediction = {
myBar = mhpb,
otherBar = ohpb,
absorbBar = ahpb,
healAbsorbBar = hab,
overAbsorb = C.raidframe.plugins_over_absorb and oa,
overHealAbsorb = C.raidframe.plugins_over_heal_absorb and oha
}
end
================================================
FILE: ShestakUI/Modules/UnitFrames/Layout.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.unitframe.enable ~= true then return end
----------------------------------------------------------------------------------------
-- UnitFrames based on oUF_Caellian(by Caellian)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
-- Frame size
if C.unitframe.extra_height_auto then
C.unitframe.extra_health_height = C.font.unit_frames_font_size - 8
C.unitframe.extra_power_height = C.font.unit_frames_font_size - 8
end
T.extraHeight = C.unitframe.extra_health_height + C.unitframe.extra_power_height
local player_width = C.unitframe.player_width
local pet_width = (player_width - 7) / 2
local boss_width = C.unitframe.boss_width
-- Create layout
local function Shared(self, unit)
-- Set our own colors
self.colors = T.oUF_colors
-- Register click
self:RegisterForClicks("AnyUp")
self:SetScript("OnEnter", UnitFrame_OnEnter)
self:SetScript("OnLeave", UnitFrame_OnLeave)
local unit = (unit and unit:find("arena%dtarget")) and "arenatarget"
or (unit and unit:find("arena%d")) and "arena"
or (unit and unit:find("boss%d")) and "boss" or unit
-- Menu
if (unit == "arena" and C.unitframe.show_arena == true and unit ~= "arenatarget") or (unit == "boss" and C.unitframe.show_boss == true) then
self:SetAttribute("type2", "focus")
self:SetAttribute("type3", "macro")
self:SetAttribute("macrotext3", "/clearfocus")
self:SetAttribute('oUF-enableArenaPrep', false)
else
self:SetAttribute("*type2", "togglemenu")
end
-- Backdrop for every units
self:CreateBackdrop("Default")
self:SetFrameStrata("BACKGROUND")
self.backdrop:SetFrameLevel(3)
-- Health bar
self.Health = CreateFrame("StatusBar", self:GetName().."_Health", self)
if unit == "player" or unit == "target" or unit == "arena" or unit == "boss" then
self.Health:SetHeight(21 + C.unitframe.extra_health_height)
elseif unit == "arenatarget" then
self.Health:SetHeight(27 + T.extraHeight)
else
self.Health:SetHeight(13 + (C.unitframe.extra_health_height / 2))
end
self.Health:SetPoint("TOPLEFT", self, "TOPLEFT", 0, 0)
self.Health:SetPoint("TOPRIGHT", self, "TOPRIGHT", 0, 0)
self.Health:SetStatusBarTexture(C.media.texture)
if C.unitframe.own_color == true then
self.Health.colorTapping = false
self.Health.colorDisconnected = false
self.Health.colorClass = false
self.Health.colorReaction = false
self.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))
else
self.Health.colorTapping = true
self.Health.colorDisconnected = true
self.Health.colorClass = true
self.Health.colorReaction = true
end
if C.unitframe.plugins_smooth_bar == true then
self.Health.Smooth = true
end
self.Health.PostUpdate = T.PostUpdateHealth
-- Health bar background
self.Health.bg = self.Health:CreateTexture(nil, "BORDER")
self.Health.bg:SetAllPoints()
self.Health.bg:SetTexture(C.media.texture)
if C.unitframe.own_color == true then
self.Health.bg:SetVertexColor(unpack(C.unitframe.uf_color_bg))
else
self.Health.bg.multiplier = 0.2
end
self.Health.value = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
if unit == "player" or unit == "pet" or unit == "focus" then
self.Health.value:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
self.Health.value:SetJustifyH("RIGHT")
elseif unit == "arena" then
if C.unitframe.arena_on_right == true then
self.Health.value:SetPoint("LEFT", self.Health, "LEFT", 2, 0)
self.Health.value:SetJustifyH("LEFT")
else
self.Health.value:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
self.Health.value:SetJustifyH("RIGHT")
end
elseif unit == "boss" then
if C.unitframe.boss_on_right == true then
self.Health.value:SetPoint("LEFT", self.Health, "LEFT", 2, 0)
self.Health.value:SetJustifyH("LEFT")
else
self.Health.value:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
self.Health.value:SetJustifyH("RIGHT")
end
elseif unit == "arenatarget" then
self.Health.value:Hide()
else
self.Health.value:SetPoint("LEFT", self.Health, "LEFT", 2, 0)
self.Health.value:SetJustifyH("LEFT")
end
-- Power bar
self.Power = CreateFrame("StatusBar", self:GetName().."_Power", self)
if unit == "player" or unit == "target" or unit == "arena" or unit == "boss" then
self.Power:SetHeight(5 + C.unitframe.extra_power_height)
elseif unit == "arenatarget" then
self.Power:SetHeight(0)
else
self.Power:SetHeight(2)
end
self.Power:SetPoint("TOPLEFT", self.Health, "BOTTOMLEFT", 0, -1)
self.Power:SetPoint("TOPRIGHT", self.Health, "BOTTOMRIGHT", 0, -1)
self.Power:SetStatusBarTexture(C.media.texture)
self.Power.frequentUpdates = true
self.Power.colorDisconnected = true
self.Power.colorTapping = true
if C.unitframe.own_color == true then
self.Power.colorClass = true
else
self.Power.colorPower = true
end
if C.unitframe.plugins_smooth_bar == true then
self.Power.Smooth = true
end
self.Power.PreUpdate = T.PreUpdatePower
self.Power.PostUpdate = T.PostUpdatePower
self.Power.bg = self.Power:CreateTexture(nil, "BORDER")
self.Power.bg:SetAllPoints()
self.Power.bg:SetTexture(C.media.texture)
if C.unitframe.own_color == true and unit == "pet" then
self.Power.bg:SetVertexColor(C.unitframe.uf_color[1], C.unitframe.uf_color[2], C.unitframe.uf_color[3], 0.2)
else
self.Power.bg.multiplier = 0.2
end
self.Power.value = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
if unit == "player" then
self.Power.value:SetPoint("RIGHT", self.Power, "RIGHT", 0, 0)
self.Power.value:SetJustifyH("RIGHT")
elseif unit == "arena" then
if C.unitframe.arena_on_right == true then
self.Power.value:SetPoint("LEFT", self.Power, "LEFT", 2, 0)
self.Power.value:SetJustifyH("LEFT")
else
self.Power.value:SetPoint("RIGHT", self.Power, "RIGHT", 0, 0)
self.Power.value:SetJustifyH("RIGHT")
end
elseif unit == "boss" then
if C.unitframe.boss_on_right == true then
self.Power.value:SetPoint("LEFT", self.Power, "LEFT", 2, 0)
self.Power.value:SetJustifyH("LEFT")
else
self.Power.value:SetPoint("RIGHT", self.Power, "RIGHT", 0, 0)
self.Power.value:SetJustifyH("RIGHT")
end
elseif unit == "pet" or unit == "focus" or unit == "focustarget" or unit == "targettarget" then
self.Power.value:Hide()
else
self.Power.value:SetPoint("LEFT", self.Power, "LEFT", 2, 0)
self.Power.value:SetJustifyH("LEFT")
end
-- Names
if unit ~= "player" then
self.Info = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Info:SetWordWrap(false)
if unit ~= "arenatarget" then
self.Level = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
end
if unit == "target" then
self.Info:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
self.Info:SetPoint("LEFT", self.Health.value, "RIGHT", 0, 0)
self.Info:SetJustifyH("RIGHT")
self:Tag(self.Info, "[GetNameColor][NameLong]")
self.Level:SetPoint("RIGHT", self.Power, "RIGHT", 0, 0)
self:Tag(self.Level, "[cpoints] [Threat] [DiffColor][level][shortclassification]")
elseif unit == "focus" or unit == "pet" then
self.Info:SetPoint("LEFT", self.Health, "LEFT", 2, 0)
self.Info:SetPoint("RIGHT", self.Health.value, "LEFT", 0, 0)
self.Info:SetJustifyH("LEFT")
if unit == "pet" then
self:Tag(self.Info, "[PetNameColor][NameMedium]")
else
self:Tag(self.Info, "[GetNameColor][NameMedium]")
end
elseif unit == "arenatarget" then
self.Info:SetPoint("CENTER", self.Health, "CENTER", 1, 0)
self:Tag(self.Info, "[GetNameColor][NameArena]")
elseif unit == "arena" then
if C.unitframe.arena_on_right == true then
self.Info:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
self.Info:SetPoint("LEFT", self.Health.value, "RIGHT", 0, 0)
self.Info:SetJustifyH("RIGHT")
else
self.Info:SetPoint("LEFT", self.Health, "LEFT", 2, 0)
self.Info:SetPoint("RIGHT", self.Health.value, "LEFT", 0, 0)
self.Info:SetJustifyH("LEFT")
end
self:Tag(self.Info, "[GetNameColor][NameMedium]")
elseif unit == "boss" then
if C.unitframe.boss_on_right == true then
self.Info:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
self.Info:SetPoint("LEFT", self.Health.value, "RIGHT", 0, 0)
self.Info:SetJustifyH("RIGHT")
else
self.Info:SetPoint("LEFT", self.Health, "LEFT", 2, 0)
self.Info:SetPoint("RIGHT", self.Health.value, "LEFT", 0, 0)
self.Info:SetJustifyH("LEFT")
end
self:Tag(self.Info, "[GetNameColor][NameMedium]")
else
self.Info:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
self.Info:SetPoint("LEFT", self.Health.value, "RIGHT", 0, 0)
self.Info:SetJustifyH("RIGHT")
self:Tag(self.Info, "[GetNameColor][NameMedium]")
end
end
if unit == "player" then
self.FlashInfo = CreateFrame("Frame", "FlashInfo", self)
self.FlashInfo:SetScript("OnUpdate", T.UpdateManaLevel)
self.FlashInfo:SetFrameLevel(self.Health:GetFrameLevel() + 1)
self.FlashInfo:SetAllPoints(self.Health)
self.FlashInfo.ManaLevel = T.SetFontString(self.FlashInfo, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.FlashInfo.ManaLevel:SetPoint("CENTER", 0, 0)
-- Combat icon
if C.unitframe.icons_combat == true then
self.CombatIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.CombatIndicator:SetSize(18, 18)
self.CombatIndicator:SetPoint("TOPRIGHT", 4, 8)
end
-- Resting icon
if C.unitframe.icons_resting == true then
self.RestingIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.RestingIndicator:SetSize(18, 18)
self.RestingIndicator:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", -8, -8)
end
-- Leader/Assistant icons
if C.raidframe.icons_leader == true then
-- Leader icon
self.LeaderIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.LeaderIndicator:SetSize(14, 14)
self.LeaderIndicator:SetPoint("TOPLEFT", -3, 9)
-- Assistant icon
self.AssistantIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.AssistantIndicator:SetSize(12, 12)
self.AssistantIndicator:SetPoint("TOPLEFT", -3, 8)
end
-- LFD role icons
if C.raidframe.icons_role == true then
self.GroupRoleIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.GroupRoleIndicator:SetSize(12, 12)
self.GroupRoleIndicator:SetPoint("TOPLEFT", 10, 8)
end
-- Rune bar
if C.unitframe_class_bar.rune == true and T.class == "DEATHKNIGHT" then
self.Runes = CreateFrame("Frame", self:GetName().."_RuneBar", self)
self.Runes:CreateBackdrop("Default")
self.Runes:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.Runes:SetSize(player_width, 7)
self.Runes.colorSpec = true
self.Runes.sortOrder = "asc"
for i = 1, 6 do
self.Runes[i] = CreateFrame("StatusBar", self:GetName().."_Rune"..i, self.Runes)
self.Runes[i]:SetSize((player_width - 5) / 6, 7)
if i == 1 then
self.Runes[i]:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
else
self.Runes[i]:SetPoint("TOPLEFT", self.Runes[i-1], "TOPRIGHT", 1, 0)
end
self.Runes[i]:SetStatusBarTexture(C.media.texture)
self.Runes[i].bg = self.Runes[i]:CreateTexture(nil, "BORDER")
self.Runes[i].bg:SetAllPoints()
self.Runes[i].bg:SetTexture(C.media.texture)
self.Runes[i].bg.multiplier = 0.2
end
end
if T.class == "MAGE" then
-- Arcane Charge bar
if C.unitframe_class_bar.arcane == true then
self.ArcaneCharge = CreateFrame("Frame", self:GetName().."_ArcaneChargeBar", self)
self.ArcaneCharge:CreateBackdrop("Default")
self.ArcaneCharge:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.ArcaneCharge:SetSize(player_width, 7)
for i = 1, 4 do
self.ArcaneCharge[i] = CreateFrame("StatusBar", self:GetName().."_ArcaneCharge"..i, self.ArcaneCharge)
self.ArcaneCharge[i]:SetSize((player_width - 3) / 4, 7)
if i == 1 then
self.ArcaneCharge[i]:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
else
self.ArcaneCharge[i]:SetPoint("TOPLEFT", self.ArcaneCharge[i-1], "TOPRIGHT", 1, 0)
end
self.ArcaneCharge[i]:SetStatusBarTexture(C.media.texture)
self.ArcaneCharge[i]:SetStatusBarColor(0.4, 0.8, 1)
self.ArcaneCharge[i].bg = self.ArcaneCharge[i]:CreateTexture(nil, "BORDER")
self.ArcaneCharge[i].bg:SetAllPoints()
self.ArcaneCharge[i].bg:SetTexture(C.media.texture)
self.ArcaneCharge[i].bg:SetVertexColor(0.4, 0.8, 1, 0.2)
end
end
end
if T.class == "MONK" then
-- Chi bar
if C.unitframe_class_bar.chi == true then
self.HarmonyBar = CreateFrame("Frame", self:GetName().."_HarmonyBar", self)
self.HarmonyBar:CreateBackdrop("Default")
self.HarmonyBar:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.HarmonyBar:SetSize(player_width, 7)
for i = 1, 6 do
self.HarmonyBar[i] = CreateFrame("StatusBar", self:GetName().."_Harmony"..i, self.HarmonyBar)
self.HarmonyBar[i]:SetSize((player_width - 5) / 6, 7)
if i == 1 then
self.HarmonyBar[i]:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
else
self.HarmonyBar[i]:SetPoint("TOPLEFT", self.HarmonyBar[i-1], "TOPRIGHT", 1, 0)
end
self.HarmonyBar[i]:SetStatusBarTexture(C.media.texture)
self.HarmonyBar[i]:SetStatusBarColor(0.33, 0.63, 0.33)
self.HarmonyBar[i].bg = self.HarmonyBar[i]:CreateTexture(nil, "BORDER")
self.HarmonyBar[i].bg:SetAllPoints()
self.HarmonyBar[i].bg:SetTexture(C.media.texture)
self.HarmonyBar[i].bg:SetVertexColor(0.33, 0.63, 0.33, 0.2)
end
end
-- Stagger bar
if C.unitframe_class_bar.stagger == true then
self.Stagger = CreateFrame("StatusBar", self:GetName().."_Stagger", self)
self.Stagger:CreateBackdrop("Default")
self.Stagger:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.Stagger:SetSize(player_width, 7)
self.Stagger:SetStatusBarTexture(C.media.texture)
self.Stagger.bg = self.Stagger:CreateTexture(nil, "BORDER")
self.Stagger.bg:SetAllPoints()
self.Stagger.bg:SetTexture(C.media.texture)
self.Stagger.bg.multiplier = 0.2
self.Stagger.Text = T.SetFontString(self.Stagger, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Stagger.Text:SetPoint("CENTER", self.Stagger, "CENTER", 0, 0)
end
end
-- Holy Power bar
if C.unitframe_class_bar.holy == true and T.class == "PALADIN" then
self.HolyPower = CreateFrame("Frame", self:GetName().."_HolyPowerBar", self)
self.HolyPower:CreateBackdrop("Default")
self.HolyPower:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.HolyPower:SetSize(player_width, 7)
for i = 1, 5 do
self.HolyPower[i] = CreateFrame("StatusBar", self:GetName().."_HolyPower"..i, self.HolyPower)
self.HolyPower[i]:SetSize((player_width - 4) / 5, 7)
if i == 1 then
self.HolyPower[i]:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
else
self.HolyPower[i]:SetPoint("TOPLEFT", self.HolyPower[i-1], "TOPRIGHT", 1, 0)
end
self.HolyPower[i]:SetStatusBarTexture(C.media.texture)
self.HolyPower[i]:SetStatusBarColor(0.89, 0.88, 0.1)
self.HolyPower[i].bg = self.HolyPower[i]:CreateTexture(nil, "BORDER")
self.HolyPower[i].bg:SetAllPoints()
self.HolyPower[i].bg:SetTexture(C.media.texture)
self.HolyPower[i].bg:SetVertexColor(0.89, 0.88, 0.1, 0.2)
end
end
-- Soul Shards bar
if C.unitframe_class_bar.shard == true and T.class == "WARLOCK" then
self.SoulShards = CreateFrame("Frame", self:GetName().."_SoulShardsBar", self)
self.SoulShards:CreateBackdrop("Default")
self.SoulShards:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.SoulShards:SetSize(player_width, 7)
for i = 1, 5 do
self.SoulShards[i] = CreateFrame("StatusBar", self:GetName().."_SoulShards"..i, self.SoulShards)
self.SoulShards[i]:SetSize((player_width - 4) / 5, 7)
if i == 1 then
self.SoulShards[i]:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
else
self.SoulShards[i]:SetPoint("TOPLEFT", self.SoulShards[i-1], "TOPRIGHT", 1, 0)
end
self.SoulShards[i]:SetStatusBarTexture(C.media.texture)
self.SoulShards[i]:SetStatusBarColor(0.9, 0.37, 0.37)
self.SoulShards[i].bg = self.SoulShards[i]:CreateTexture(nil, "BORDER")
self.SoulShards[i].bg:SetAllPoints()
self.SoulShards[i].bg:SetTexture(C.media.texture)
self.SoulShards[i].bg:SetVertexColor(0.9, 0.37, 0.37, 0.2)
end
end
-- Essence bar
if C.unitframe_class_bar.essence == true and T.class == "EVOKER" then
self.Essence = CreateFrame("Frame", self:GetName().."_Essence", self, "BackdropTemplate", "BackdropTemplate")
local maxEssence = UnitPowerMax(self.unit, Enum.PowerType.Essence)
self.Essence:CreateBackdrop("Default")
self.Essence:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.Essence:SetSize(player_width, 7)
for i = 1, 6 do
self.Essence[i] = CreateFrame("StatusBar", self:GetName().."_Essence"..i, self.Essence, "BackdropTemplate")
self.Essence[i]:SetSize((player_width - 5) / 6, 7)
if i == 1 then
self.Essence[i]:SetPoint("LEFT", self.Essence)
else
self.Essence[i]:SetPoint("TOPLEFT", self.Essence[i-1], "TOPRIGHT", 1, 0)
end
self.Essence[i]:SetStatusBarTexture(C.media.texture)
self.Essence[i]:SetStatusBarColor(0.2, 0.58, 0.5)
self.Essence[i].bg = self.Essence[i]:CreateTexture(nil, "BORDER")
self.Essence[i].bg:SetAllPoints()
self.Essence[i].bg:SetTexture(C.media.texture)
self.Essence[i].bg:SetVertexColor(0.2, 0.58, 0.5, 0.2)
end
end
-- Rogue/Druid Combo bar
if C.unitframe_class_bar.combo == true and C.unitframe_class_bar.combo_old ~= true and (T.class == "ROGUE" or T.class == "DRUID") then
self.ComboPoints = CreateFrame("Frame", self:GetName().."_ComboBar", self)
self.ComboPoints:CreateBackdrop("Default")
self.ComboPoints:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.ComboPoints:SetSize(player_width, 7)
for i = 1, 7 do
self.ComboPoints[i] = CreateFrame("StatusBar", self:GetName().."_Combo"..i, self.ComboPoints)
self.ComboPoints[i]:SetSize((player_width - 5) / 7, 7)
if i == 1 then
self.ComboPoints[i]:SetPoint("LEFT", self.ComboPoints)
else
self.ComboPoints[i]:SetPoint("LEFT", self.ComboPoints[i-1], "RIGHT", 1, 0)
end
self.ComboPoints[i]:SetStatusBarTexture(C.media.texture)
end
end
-- Totem bar for Shaman
if C.unitframe_class_bar.totem == true and T.class == "SHAMAN" then
self.TotemBar = CreateFrame("Frame", self:GetName().."_TotemBar", self)
self.TotemBar:CreateBackdrop("Default")
self.TotemBar:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.TotemBar:SetSize(player_width, 7)
self.TotemBar.Destroy = true
for i = 1, 4 do
self.TotemBar[i] = CreateFrame("StatusBar", self:GetName().."_Totem"..i, self.TotemBar)
self.TotemBar[i]:SetSize((player_width - 3) / 4, 7)
if i == 1 then
self.TotemBar[i]:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
else
self.TotemBar[i]:SetPoint("TOPLEFT", self.TotemBar[i-1], "TOPRIGHT", 1, 0)
end
self.TotemBar[i]:SetStatusBarTexture(C.media.texture)
self.TotemBar[i]:SetMinMaxValues(0, 1)
self.TotemBar[i].bg = self.TotemBar[i]:CreateTexture(nil, "BORDER")
self.TotemBar[i].bg:SetAllPoints()
self.TotemBar[i].bg:SetTexture(C.media.texture)
self.TotemBar[i].bg.multiplier = 0.2
end
end
-- Totem bar for other classes
if C.unitframe_class_bar.totem == true and C.unitframe_class_bar.totem_other == true and T.class ~= "SHAMAN" then
self.TotemBar = CreateFrame("Frame", self:GetName().."_TotemBar", self)
self.TotemBar:SetFrameLevel(self.Health:GetFrameLevel() + 2)
self.TotemBar:SetPoint("TOPLEFT", self, "TOPLEFT", 0, 0)
self.TotemBar:SetSize(140, 7)
self.TotemBar.Destroy = true
for i = 1, 4 do
self.TotemBar[i] = CreateFrame("StatusBar", self:GetName().."_Totem"..i, self.TotemBar)
self.TotemBar[i]:SetSize(140 / 4, 7)
if i == 1 then
self.TotemBar[i]:SetPoint("TOPLEFT", self, "TOPLEFT", 0, 0)
else
self.TotemBar[i]:SetPoint("TOPLEFT", self.TotemBar[i-1], "TOPRIGHT", 0, 0)
end
self.TotemBar[i]:SetStatusBarTexture(C.media.texture)
self.TotemBar[i]:SetMinMaxValues(0, 1)
self.TotemBar[i]:CreateBorder(false, true)
self.TotemBar[i].bg = self.TotemBar[i]:CreateTexture(nil, "BORDER")
self.TotemBar[i].bg:SetAllPoints()
self.TotemBar[i].bg:SetTexture(C.media.texture)
self.TotemBar[i].bg.multiplier = 0.2
end
end
-- Additional mana
if T.class == "DRUID" or T.class == "PRIEST" or T.class == "SHAMAN" then
CreateFrame("Frame"):SetScript("OnUpdate", function() T.UpdateClassMana(self) end)
self.ClassMana = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.ClassMana:SetTextColor(1, 0.49, 0.04)
end
-- Experience bar
if C.unitframe.plugins_experience_bar == true then
self.Experience = CreateFrame("StatusBar", self:GetName().."_Experience", self)
self.Experience:CreateBackdrop("Default")
self.Experience:EnableMouse(true)
if C.unitframe.portrait_enable == true then
self.Experience:SetPoint("TOPLEFT", self, "TOPLEFT", -25 - C.unitframe.portrait_width, 28)
else
self.Experience:SetPoint("TOPLEFT", self, "TOPLEFT", -18, 28)
end
self.Experience:SetSize(7, 94 + T.extraHeight + (C.unitframe.extra_health_height / 2))
self.Experience:SetOrientation("Vertical")
self.Experience:SetStatusBarTexture(C.media.texture)
self.Experience.bg = self.Experience:CreateTexture(nil, "BORDER")
self.Experience.bg:SetAllPoints()
self.Experience.bg:SetTexture(C.media.texture)
self.Experience.Rested = CreateFrame("StatusBar", nil, self.Experience)
self.Experience.Rested:SetOrientation("Vertical")
self.Experience.Rested:SetAllPoints()
self.Experience.Rested:SetStatusBarTexture(C.media.texture)
self.Experience.inAlpha = 1
self.Experience.outAlpha = 0
end
-- Reputation bar
if C.unitframe.plugins_reputation_bar == true then
self.Reputation = CreateFrame("StatusBar", self:GetName().."_Reputation", self)
self.Reputation:CreateBackdrop("Default")
self.Reputation:EnableMouse(true)
if C.unitframe.portrait_enable == true then
if self.Experience and self.Experience:IsShown() then
self.Reputation:SetPoint("TOPLEFT", self, "TOPLEFT", -39 - C.unitframe.portrait_width, 28)
else
self.Reputation:SetPoint("TOPLEFT", self, "TOPLEFT", -25 - C.unitframe.portrait_width, 28)
end
else
if self.Experience and self.Experience:IsShown() then
self.Reputation:SetPoint("TOPLEFT", self, "TOPLEFT", -32, 28)
else
self.Reputation:SetPoint("TOPLEFT", self, "TOPLEFT", -18, 28)
end
end
self.Reputation:SetSize(7, 94 + T.extraHeight + (C.unitframe.extra_health_height / 2))
self.Reputation:SetOrientation("Vertical")
self.Reputation:SetStatusBarTexture(C.media.texture)
self.Reputation.bg = self.Reputation:CreateTexture(nil, "BORDER")
self.Reputation.bg:SetAllPoints()
self.Reputation.bg:SetTexture(C.media.texture)
self.Reputation.inAlpha = 1
self.Reputation.outAlpha = 0
self.Reputation.colorStanding = true
end
-- GCD spark
if C.unitframe.plugins_gcd == true then
self.GCD = CreateFrame("Frame", self:GetName().."_GCD", self)
self.GCD:SetWidth(player_width + 3)
self.GCD:SetHeight(3)
self.GCD:SetFrameStrata("HIGH")
self.GCD:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 0)
self.GCD.Color = {1, 1, 1}
self.GCD.Height = T.Scale(3)
self.GCD.Width = T.Scale(4)
end
-- Absorbs value
if C.unitframe.plugins_absorbs == true then
self.Absorbs = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Absorbs:SetPoint("LEFT", self.Health, "LEFT", 4, 0)
self:Tag(self.Absorbs, "[Absorbs]")
end
end
-- Counter bar (Darkmoon Fair)
if unit == "player" or unit == "pet" then
self.CounterBar = CreateFrame("StatusBar", self:GetName().."_CounterBar", self)
self.CounterBar:CreateBackdrop("Default")
self.CounterBar:SetWidth(221)
self.CounterBar:SetHeight(20)
self.CounterBar:SetStatusBarTexture(C.media.texture)
self.CounterBar:SetPoint("TOP", UIParent, "TOP", 0, -102)
self.CounterBar.bg = self.CounterBar:CreateTexture(nil, "BORDER")
self.CounterBar.bg:SetAllPoints()
self.CounterBar.bg:SetTexture(C.media.texture)
self.CounterBar.Text = T.SetFontString(self.CounterBar, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.CounterBar.Text:SetPoint("CENTER")
self.CounterBar:SetScript("OnValueChanged", function(_, value)
local _, max = self.CounterBar:GetMinMaxValues()
local r, g, b = oUF:ColorGradient(value, max, 0.8, 0, 0, 0.8, 0.8, 0, 0, 0.8, 0)
self.CounterBar:SetStatusBarColor(r, g, b)
self.CounterBar.bg:SetVertexColor(r, g, b, 0.2)
self.CounterBar.Text:SetText(floor(value))
end)
end
if unit == "pet" or unit == "targettarget" or unit == "focus" or unit == "focustarget" then
self.Debuffs = CreateFrame("Frame", self:GetName().."_Debuffs", self)
self.Debuffs:SetHeight(25)
self.Debuffs:SetWidth(pet_width + 4)
self.Debuffs.size = T.Scale(C.aura.debuff_size)
self.Debuffs.spacing = T.Scale(3)
self.Debuffs.num = 4
self.Debuffs["growth-y"] = "DOWN"
if unit == "pet" or unit == "focus" then
self.Debuffs:SetPoint("TOPRIGHT", self, "BOTTOMRIGHT", 2, -17)
self.Debuffs.initialAnchor = "TOPRIGHT"
self.Debuffs["growth-x"] = "LEFT"
else
self.Debuffs:SetPoint("TOPLEFT", self, "BOTTOMLEFT", -2, -17)
self.Debuffs.initialAnchor = "TOPLEFT"
self.Debuffs["growth-x"] = "RIGHT"
end
self.Debuffs.PostCreateButton = T.PostCreateIcon
self.Debuffs.PostUpdateButton = T.PostUpdateIcon
self.Debuffs.FilterAura = T.CustomFilter
if unit == "pet" then
self:RegisterEvent("UNIT_PET", T.UpdateAllElements)
end
end
if unit == "player" or unit == "target" then
if C.unitframe.portrait_enable == true then
if C.unitframe.portrait_type == "3D" or C.unitframe.portrait_type == "OVERLAY" then
self.Portrait = CreateFrame("PlayerModel", self:GetName().."_Portrait", self)
else
self.Portrait = CreateFrame("Frame", self:GetName().."_Portrait", self)
end
self.Portrait:SetHeight(C.unitframe.portrait_height)
self.Portrait:SetWidth(C.unitframe.portrait_width)
if unit == "player" then
self.Portrait:SetPoint(unpack(C.position.unitframes.player_portrait))
elseif unit == "target" then
self.Portrait:SetPoint(unpack(C.position.unitframes.target_portrait))
end
self.Portrait.Icon = self.Portrait:CreateTexture(nil, "ARTWORK")
self.Portrait.Icon:SetAllPoints()
if C.unitframe.portrait_type == "ICONS" then
self.Portrait.classIcons = true
end
self.Portrait:CreateBackdrop("Transparent")
self.Portrait.backdrop:SetPoint("TOPLEFT", -2 - T.mult, 2 + T.mult)
self.Portrait.backdrop:SetPoint("BOTTOMRIGHT", 2 + T.mult, -2 - T.mult)
if C.unitframe.portrait_classcolor_border == true then
if unit == "player" then
self.Portrait.backdrop:SetBackdropBorderColor(T.color.r, T.color.g, T.color.b)
elseif unit == "target" then
self.Portrait.backdrop:RegisterEvent("PLAYER_TARGET_CHANGED")
self.Portrait.backdrop:SetScript("OnEvent", function()
local _, class = UnitClass("target")
local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]
if color then
self.Portrait.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)
else
self.Portrait.backdrop:SetBackdropBorderColor(unpack(C.media.border_color))
end
end)
end
end
if C.unitframe.portrait_type == "OVERLAY" then
local healthTex = self.Health:GetStatusBarTexture()
self.Portrait:ClearAllPoints()
self.Portrait:SetPoint("TOPLEFT", healthTex, "TOPLEFT", 0, 0)
self.Portrait:SetPoint("BOTTOMRIGHT", healthTex, "BOTTOMRIGHT", 0, 1)
self.Portrait:SetFrameLevel(self.Health:GetFrameLevel())
self.Portrait.backdrop:Hide()
self.Portrait:SetAlpha(0.5)
if C.filger.enable then
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function()
T_DE_BUFF_BAR_Anchor:ClearAllPoints()
T_DE_BUFF_BAR_Anchor:SetPoint(C.position.filger.target_bar[1], C.position.filger.target_bar[2], C.position.filger.target_bar[3], C.position.filger.target_bar[4], C.position.filger.target_bar[5])
end)
end
end
end
if unit == "player" then
self.Debuffs = CreateFrame("Frame", self:GetName().."_Debuffs", self)
self.Debuffs:SetHeight(165)
self.Debuffs:SetWidth(player_width + 4)
self.Debuffs.size = T.Scale(C.aura.debuff_size)
self.Debuffs.spacing = T.Scale(3)
self.Debuffs.initialAnchor = "BOTTOMRIGHT"
self.Debuffs["growth-y"] = "UP"
self.Debuffs["growth-x"] = "LEFT"
if (T.class == "DEATHKNIGHT" and C.unitframe_class_bar.rune == true)
or ((T.class == "DRUID" or T.class == "ROGUE") and C.unitframe_class_bar.combo == true and C.unitframe_class_bar.combo_old ~= true)
or (T.class == "SHAMAN" and C.unitframe_class_bar.totem == true)
or (T.class == "WARLOCK" and C.unitframe_class_bar.shard == true) then
self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 19)
else
self.Debuffs:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 2, 5)
end
self.Debuffs.PostCreateButton = T.PostCreateIcon
self.Debuffs.PostUpdateButton = T.PostUpdateIcon
end
if unit == "target" then
self.Auras = CreateFrame("Frame", self:GetName().."_Auras", self)
self.Auras:SetPoint("BOTTOMLEFT", self, "TOPLEFT", -2, 5)
self.Auras.initialAnchor = "BOTTOMLEFT"
self.Auras["growth-x"] = "RIGHT"
self.Auras["growth-y"] = "UP"
self.Auras.numDebuffs = 16
self.Auras.numBuffs = 32
self.Auras:SetHeight(165)
self.Auras:SetWidth(player_width + 4)
self.Auras.spacing = T.Scale(3)
self.Auras.size = T.Scale(C.aura.debuff_size)
self.Auras.gap = true
self.Auras.PostCreateButton = T.PostCreateIcon
self.Auras.PostUpdateButton = T.PostUpdateIcon
self.Auras.FilterAura = T.CustomFilter
-- Rogue/Druid Combo bar
if C.unitframe_class_bar.combo == true and (C.unitframe_class_bar.combo_old == true or (T.class ~= "DRUID" and T.class ~= "ROGUE")) then
self.ComboPoints = CreateFrame("Frame", self:GetName().."_ComboBar", self)
self.ComboPoints:CreateBackdrop("Default")
self.ComboPoints:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 7)
self.ComboPoints:SetSize(player_width, 7)
for i = 1, 7 do
self.ComboPoints[i] = CreateFrame("StatusBar", self:GetName().."_Combo"..i, self.ComboPoints)
self.ComboPoints[i]:SetSize((player_width - 5) / 7, 7)
if i == 1 then
self.ComboPoints[i]:SetPoint("LEFT", self.ComboPoints)
else
self.ComboPoints[i]:SetPoint("LEFT", self.ComboPoints[i-1], "RIGHT", 1, 0)
end
self.ComboPoints[i]:SetStatusBarTexture(C.media.texture)
end
end
-- Enemy specialization
if C.unitframe.plugins_enemy_spec == true then
self.EnemySpec = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.EnemySpec:SetTextColor(1, 0, 0)
self.EnemySpec:SetPoint("BOTTOM", self.Power, "BOTTOM", 0, -1)
end
-- Quest icon
self.QuestIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.QuestIndicator:SetSize(20, 20)
self.QuestIndicator:SetPoint("CENTER", self.Health, "CENTER", -20, 0)
end
if C.unitframe.plugins_combat_feedback == true then
self.CombatFeedbackText = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)
if C.unitframe.portrait_enable == true then
self.CombatFeedbackText:SetPoint("BOTTOM", self.Portrait, "BOTTOM", 0, 0)
self.CombatFeedbackText:SetParent(self.Portrait)
else
self.CombatFeedbackText:SetPoint("CENTER", 0, 1)
end
end
if C.unitframe.icons_pvp == true then
self.Status = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Status:SetPoint("CENTER", self.Health, "CENTER", 0, 0)
self.Status:SetTextColor(0.69, 0.31, 0.31)
self.Status:Hide()
self.Status.Override = T.dummy
self:SetScript("OnEnter", function(self) FlashInfo.ManaLevel:Hide() T.UpdatePvPStatus(self) self.Status:Show() UnitFrame_OnEnter(self) end)
self:SetScript("OnLeave", function(self) FlashInfo.ManaLevel:Show() self.Status:Hide() UnitFrame_OnLeave(self) end)
end
end
if C.unitframe.unit_castbar == true and not unit:match('%wtarget$') then
self.Castbar = CreateFrame("StatusBar", self:GetName().."_Castbar", self)
self.Castbar:SetStatusBarTexture(C.media.texture, "ARTWORK")
self.Castbar.bg = self.Castbar:CreateTexture(nil, "BORDER")
self.Castbar.bg:SetAllPoints()
self.Castbar.bg:SetTexture(C.media.texture)
self.Castbar.Overlay = CreateFrame("Frame", nil, self.Castbar)
self.Castbar.Overlay:SetTemplate("Default")
self.Castbar.Overlay:SetFrameStrata("BACKGROUND")
self.Castbar.Overlay:SetFrameLevel(3)
self.Castbar.Overlay:SetPoint("TOPLEFT", -2, 2)
self.Castbar.Overlay:SetPoint("BOTTOMRIGHT", 2, -2)
self.Castbar.PostCastStart = T.PostCastStart
if unit == "player" then
if C.unitframe.castbar_icon == true then
self.Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4] + ((C.unitframe.castbar_height + 7) / 2) , C.position.unitframes.player_castbar[5])
self.Castbar:SetWidth(C.unitframe.castbar_width)
else
self.Castbar:SetPoint(unpack(C.position.unitframes.player_castbar))
self.Castbar:SetWidth(C.unitframe.castbar_width + C.unitframe.castbar_height + 7)
end
self.Castbar:SetHeight(C.unitframe.castbar_height)
elseif unit == "target" then
if C.unitframe.castbar_icon == true then
if C.unitframe.plugins_swing == true then
self.Castbar:SetPoint(C.position.unitframes.target_castbar[1], C.position.unitframes.target_castbar[2], C.position.unitframes.target_castbar[3], C.position.unitframes.target_castbar[4] - C.unitframe.castbar_height - 7, C.position.unitframes.target_castbar[5] + 12)
else
self.Castbar:SetPoint(C.position.unitframes.target_castbar[1], C.position.unitframes.target_castbar[2], C.position.unitframes.target_castbar[3], C.position.unitframes.target_castbar[4] - C.unitframe.castbar_height - 7, C.position.unitframes.target_castbar[5])
end
self.Castbar:SetWidth(C.unitframe.castbar_width)
else
if C.unitframe.plugins_swing == true then
self.Castbar:SetPoint(C.position.unitframes.target_castbar[1], C.position.unitframes.target_castbar[2], C.position.unitframes.target_castbar[3], C.position.unitframes.target_castbar[4], C.position.unitframes.target_castbar[5] + 12)
else
self.Castbar:SetPoint(unpack(C.position.unitframes.target_castbar))
end
self.Castbar:SetWidth(C.unitframe.castbar_width + C.unitframe.castbar_height + 7)
end
self.Castbar:SetHeight(C.unitframe.castbar_height)
elseif unit == "arena" or unit == "boss" then
self.Castbar:SetPoint("TOPLEFT", self, "BOTTOMLEFT", 0, -7)
self.Castbar:SetWidth(boss_width)
self.Castbar:SetHeight(16)
else
self.Castbar:SetPoint("TOPLEFT", self, "BOTTOMLEFT", 0, -7)
self.Castbar:SetWidth(pet_width)
self.Castbar:SetHeight(5)
end
if unit == "player" or unit == "target" or unit == "arena" or unit == "boss" then
self.Castbar.Time = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Castbar.Time:SetPoint("RIGHT", self.Castbar, "RIGHT", 0, 0)
self.Castbar.Time:SetTextColor(1, 1, 1)
self.Castbar.Time:SetJustifyH("RIGHT")
self.Castbar.CustomTimeText = T.CustomCastTimeText
self.Castbar.CustomDelayText = T.CustomCastDelayText
self.Castbar.Text = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Castbar.Text:SetPoint("LEFT", self.Castbar, "LEFT", 2, 0)
self.Castbar.Text:SetTextColor(1, 1, 1)
self.Castbar.Text:SetJustifyH("LEFT")
self.Castbar.Text:SetWordWrap(false)
self.Castbar.Text:SetWidth(self.Castbar:GetWidth() - 50)
if (C.unitframe.castbar_icon == true and (unit == "player" or unit == "target")) or unit == "arena" or unit == "boss" then
self.Castbar.Button = CreateFrame("Frame", nil, self.Castbar)
self.Castbar.Button:SetSize(self.Castbar:GetHeight() + 4, self.Castbar:GetHeight() + 4)
self.Castbar.Button:SetTemplate("Default")
self.Castbar.Icon = self.Castbar.Button:CreateTexture(nil, "ARTWORK")
self.Castbar.Icon:SetPoint("TOPLEFT", self.Castbar.Button, 2, -2)
self.Castbar.Icon:SetPoint("BOTTOMRIGHT", self.Castbar.Button, -2, 2)
self.Castbar.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
if unit == "player" then
self.Castbar.Button:SetPoint("RIGHT", self.Castbar, "LEFT", -5, 0)
elseif unit == "target" then
self.Castbar.Button:SetPoint("LEFT", self.Castbar, "RIGHT", 5, 0)
elseif unit == "boss" then
if C.unitframe.boss_on_right == true then
self.Castbar.Button:SetPoint("TOPRIGHT", self.Castbar, "TOPLEFT", -5, 2)
else
self.Castbar.Button:SetPoint("TOPLEFT", self.Castbar, "TOPRIGHT", 5, 2)
end
elseif unit == "arena" then
if C.unitframe.arena_on_right == true then
self.Castbar.Button:SetPoint("TOPRIGHT", self.Castbar, "TOPLEFT", -5, 2)
else
self.Castbar.Button:SetPoint("TOPLEFT", self.Castbar, "TOPRIGHT", 5, 2)
end
end
end
if unit == "player" and C.unitframe.castbar_latency == true then
self.Castbar.SafeZone = self.Castbar:CreateTexture(nil, "BORDER", nil, 1)
self.Castbar.SafeZone:SetTexture(C.media.texture)
self.Castbar.SafeZone:SetVertexColor(0.85, 0.27, 0.27)
self.Castbar.Latency = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Castbar.Latency:SetTextColor(1, 1, 1)
self.Castbar.Latency:SetPoint("TOPRIGHT", self.Castbar.Time, "BOTTOMRIGHT", 0, 0)
self.Castbar.Latency:SetJustifyH("RIGHT")
end
end
if unit == "focus" then
self.Castbar.Button = CreateFrame("Frame", nil, self.Castbar)
self.Castbar.Button:SetSize(65, 65)
self.Castbar.Button:SetPoint(unpack(C.position.unitframes.focus_castbar))
self.Castbar.Button:SetTemplate("Default")
self.Castbar.Icon = self.Castbar.Button:CreateTexture(nil, "ARTWORK")
self.Castbar.Icon:SetPoint("TOPLEFT", self.Castbar.Button, 2, -2)
self.Castbar.Icon:SetPoint("BOTTOMRIGHT", self.Castbar.Button, -2, 2)
self.Castbar.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.Castbar.Time = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)
self.Castbar.Time:SetParent(self.Castbar.Button)
self.Castbar.Time:SetPoint("CENTER", self.Castbar.Icon, "CENTER", 0, 10)
self.Castbar.Time:SetTextColor(1, 1, 1)
self.Castbar.Time2 = T.SetFontString(self.Castbar, C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)
self.Castbar.Time2:SetParent(self.Castbar.Button)
self.Castbar.Time2:SetPoint("CENTER", self.Castbar.Icon, "CENTER", 0, -10)
self.Castbar.Time2:SetTextColor(1, 1, 1)
self.Castbar.CustomTimeText = function(self, duration)
self.Time:SetText(("%.1f"):format(self.max))
self.Time2:SetText(("%.1f"):format(self.channeling and duration or self.max - duration))
end
self.Castbar.CustomDelayText = function(self)
self.Time:SetText(("|cffaf5050%s %.1f|r"):format(self.channeling and "-" or "+", abs(self.delay)))
end
end
end
-- Swing bar
if C.unitframe.plugins_swing == true and unit == "player" then
self.Swing = CreateFrame("StatusBar", self:GetName().."_Swing", self)
self.Swing:CreateBackdrop("Default")
if C.unitframe.unit_castbar then
self.Swing:SetPoint("BOTTOMRIGHT", "oUF_Player_Castbar", "TOPRIGHT", 0, 7)
else
self.Swing:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4], C.position.unitframes.player_castbar[5] + 23)
end
self.Swing:SetSize(281, 5)
self.Swing:SetStatusBarTexture(C.media.texture)
if C.unitframe.own_color == true then
self.Swing:SetStatusBarColor(unpack(C.unitframe.uf_color))
else
self.Swing:SetStatusBarColor(T.color.r, T.color.g, T.color.b)
end
self.Swing.bg = self.Swing:CreateTexture(nil, "BORDER")
self.Swing.bg:SetAllPoints(self.Swing)
self.Swing.bg:SetTexture(C.media.texture)
if C.unitframe.own_color == true then
self.Swing.bg:SetVertexColor(unpack(C.unitframe.uf_color_bg))
else
self.Swing.bg:SetVertexColor(T.color.r, T.color.g, T.color.b, 0.2)
end
self.Swing.Text = T.SetFontString(self.Swing, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Swing.Text:SetPoint("CENTER", 0, 0)
self.Swing.Text:SetTextColor(1, 1, 1)
end
if C.unitframe.show_arena and unit == "arena" then
self.Trinket = CreateFrame("Frame", self:GetName().."_Trinket", self)
self.Trinket:SetSize(31 + T.extraHeight, 31 + T.extraHeight)
self.Trinket:SetTemplate("Default")
if C.unitframe.arena_on_right == true then
self.Trinket:SetPoint("TOPRIGHT", self, "TOPLEFT", -5, 2)
else
self.Trinket:SetPoint("TOPLEFT", self, "TOPRIGHT", 5, 2)
end
self.FactionIcon = self.Health:CreateTexture(nil, "OVERLAY")
self.FactionIcon:SetSize(16, 16)
self.FactionIcon:SetPoint("TOP", 0, 0)
self.AuraTracker = CreateFrame("Frame", self:GetName().."_AuraTracker", self)
self.AuraTracker:SetWidth(self.Trinket:GetWidth())
self.AuraTracker:SetHeight(self.Trinket:GetHeight())
self.AuraTracker:SetPoint("CENTER", self.Trinket, "CENTER")
self.AuraTracker:SetFrameStrata("HIGH")
self.AuraTracker.icon = self.AuraTracker:CreateTexture(nil, "ARTWORK")
self.AuraTracker.icon:SetWidth(self.Trinket:GetWidth())
self.AuraTracker.icon:SetHeight(self.Trinket:GetHeight())
self.AuraTracker.icon:SetPoint("TOPLEFT", self.Trinket, 2, -2)
self.AuraTracker.icon:SetPoint("BOTTOMRIGHT", self.Trinket, -2, 2)
self.AuraTracker.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.AuraTracker.text = T.SetFontString(self.AuraTracker, C.font.unit_frames_font, C.font.unit_frames_font_size * 2, C.font.unit_frames_font_style)
self.AuraTracker.text:SetPoint("CENTER", self.AuraTracker, 0, 0)
self.AuraTracker:SetScript("OnUpdate", T.AuraTrackerTime)
if C.unitframe.plugins_enemy_spec == true then
self.EnemySpec = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.EnemySpec:SetTextColor(1, 0, 0)
if C.unitframe.arena_on_right == true then
self.EnemySpec:SetPoint("RIGHT", self.Power, "RIGHT", 0, 0)
self.EnemySpec:SetJustifyH("LEFT")
else
self.EnemySpec:SetPoint("LEFT", self.Power, "LEFT", 2, 0)
self.EnemySpec:SetJustifyH("RIGHT")
end
end
end
if C.unitframe.show_boss and unit == "boss" then
self.AlternativePower = CreateFrame("StatusBar", nil, self.Health, "BackdropTemplate")
self.AlternativePower:SetFrameLevel(self.Health:GetFrameLevel() + 1)
self.AlternativePower:SetHeight(5)
self.AlternativePower:SetStatusBarTexture(C.media.texture)
self.AlternativePower:SetStatusBarColor(0.9, 0, 0)
self.AlternativePower:SetPoint("LEFT")
self.AlternativePower:SetPoint("RIGHT")
self.AlternativePower:SetPoint("TOP", self.Health, "TOP")
self.AlternativePower:SetBackdrop({
bgFile = C.media.blank,
edgeFile = C.media.blank,
tile = false, tileSize = 0, edgeSize = T.Scale(1),
insets = {left = 0, right = 0, top = 0, bottom = T.Scale(-1)}
})
self.AlternativePower:SetBackdropColor(0, 0, 0)
self.AlternativePower:SetBackdropBorderColor(0, 0, 0)
self.AlternativePower.text = T.SetFontString(self.AlternativePower, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.AlternativePower.text:SetPoint("CENTER", self.AlternativePower, "CENTER", 0, 0)
self:Tag(self.AlternativePower.text, "[AltPower]")
if C.aura.boss_auras == true then
self.Auras = CreateFrame("Frame", self:GetName().."_Auras", self)
if C.unitframe.boss_on_right == true then
self.Auras:SetPoint("RIGHT", self, "LEFT", -5, 0)
self.Auras.initialAnchor = "RIGHT"
self.Auras["growth-x"] = "LEFT"
else
self.Auras:SetPoint("LEFT", self, "RIGHT", 5, 0)
self.Auras.initialAnchor = "LEFT"
self.Auras["growth-x"] = "RIGHT"
end
self.Auras.numDebuffs = C.aura.boss_debuffs
self.Auras.numBuffs = C.aura.boss_buffs
self.Auras:SetHeight(31 + T.extraHeight)
self.Auras:SetWidth((34 + T.extraHeight) * (C.aura.boss_debuffs + C.aura.boss_buffs + 1))
self.Auras.spacing = T.Scale(3)
self.Auras.size = T.Scale(31 + T.extraHeight)
self.Auras.gap = true
self.Auras.PostCreateButton = T.PostCreateIcon
self.Auras.PostUpdateButton = T.PostUpdateIcon
self.Auras.FilterAura = T.CustomFilterBoss
end
self:HookScript("OnShow", T.UpdateAllElements)
end
-- Aggro border
if C.raidframe.aggro_border == true and unit ~= "arenatarget" then
self.ThreatIndicator = CreateFrame("Frame", nil, self)
self.ThreatIndicator.PostUpdate = T.UpdateThreat
end
-- Raid marks
if C.raidframe.icons_raid_mark == true then
self.RaidTargetIndicator = self:CreateTexture(nil, "OVERLAY")
self.RaidTargetIndicator:SetParent(self.Health)
self.RaidTargetIndicator:SetSize((unit == "player" or unit == "target") and 15 or 12, (unit == "player" or unit == "target") and 15 or 12)
self.RaidTargetIndicator:SetPoint("TOP", self.Health, 0, 0)
end
-- Debuff highlight
if unit ~= "arenatarget" then
self.DebuffHighlight = self.Health:CreateTexture(nil, "OVERLAY")
self.DebuffHighlight:SetAllPoints(self.Health)
self.DebuffHighlight:SetTexture(C.media.highlight)
self.DebuffHighlight:SetVertexColor(0, 0, 0, 0)
self.DebuffHighlight:SetBlendMode("ADD")
self.DebuffHighlightAlpha = 1
self.DebuffHighlightFilter = true
end
-- Incoming heals and heal/damage absorbs
if C.raidframe.plugins_healcomm == true then
T.CreateHealthPrediction(self)
end
-- Power Prediction bar
if C.unitframe.plugins_power_prediction == true and unit == "player" then
local mainBar = CreateFrame("StatusBar", self:GetName().."_PowerPrediction", self.Power)
mainBar:SetReverseFill(true)
mainBar:SetPoint("TOP")
mainBar:SetPoint("BOTTOM")
mainBar:SetPoint("RIGHT", self.Power:GetStatusBarTexture(), "RIGHT")
mainBar:SetStatusBarTexture(C.media.texture)
mainBar:SetStatusBarColor(1, 1, 1, 0.5)
mainBar:SetWidth(player_width)
self.PowerPrediction = {
mainBar = mainBar
}
end
-- Fader
if C.unitframe.plugins_fader == true then
if unit ~= "arena" or unit ~= "arenatarget" or unit ~= "boss" then
self.Fader = {
[1] = {Combat = 1, Arena = 1, Instance = 1},
[2] = {PlayerTarget = 1, PlayerNotMaxHealth = 1, PlayerNotMaxMana = 1, Casting = 1},
[3] = {Stealth = 0.5},
[4] = {notCombat = 0, PlayerTaxi = 0},
}
end
self.NormalAlpha = 1
end
T.HideAuraFrame(self)
if T.PostCreateUnitFrames then
T.PostCreateUnitFrames(self, unit)
end
return self
end
----------------------------------------------------------------------------------------
-- Default position of ShestakUI unitframes
----------------------------------------------------------------------------------------
oUF:RegisterStyle("Shestak", Shared)
local player = oUF:Spawn("player", "oUF_Player")
player:SetPoint(unpack(C.position.unitframes.player))
player:SetSize(player_width, 27 + T.extraHeight)
local target = oUF:Spawn("target", "oUF_Target")
target:SetPoint(unpack(C.position.unitframes.target))
target:SetSize(player_width, 27 + T.extraHeight)
if C.unitframe.show_pet == true then
local pet = oUF:Spawn("pet", "oUF_Pet")
pet:SetPoint(unpack(C.position.unitframes.pet))
pet:SetSize(pet_width, 16 + (C.unitframe.extra_health_height / 2))
end
if C.unitframe.show_focus == true then
local focus = oUF:Spawn("focus", "oUF_Focus")
focus:SetPoint(unpack(C.position.unitframes.focus))
focus:SetSize(pet_width, 16 + (C.unitframe.extra_health_height / 2))
local focustarget = oUF:Spawn("focustarget", "oUF_FocusTarget")
focustarget:SetPoint(unpack(C.position.unitframes.focus_target))
focustarget:SetSize(pet_width, 16 + (C.unitframe.extra_health_height / 2))
end
if C.unitframe.show_target_target == true then
local targettarget = oUF:Spawn("targettarget", "oUF_TargetTarget")
targettarget:SetPoint(unpack(C.position.unitframes.target_target))
targettarget:SetSize(pet_width, 16 + (C.unitframe.extra_health_height / 2))
end
if C.unitframe.show_boss == true then
local boss = {}
for i = 1, 8 do
boss[i] = oUF:Spawn("boss"..i, "oUF_Boss"..i)
if i == 1 then
if C.unitframe.boss_on_right == true then
boss[i]:SetPoint(unpack(C.position.unitframes.boss))
else
boss[i]:SetPoint("BOTTOMLEFT", C.position.unitframes.boss[2], "LEFT", C.position.unitframes.boss[4] + 46, C.position.unitframes.boss[5])
end
else
boss[i]:SetPoint("BOTTOM", boss[i-1], "TOP", 0, 30)
end
boss[i]:SetSize(boss_width, 27 + T.extraHeight)
end
end
if C.unitframe.show_arena == true then
local arena = {}
for i = 1, 5 do
arena[i] = oUF:Spawn("arena"..i, "oUF_Arena"..i)
if i == 1 then
if C.unitframe.arena_on_right == true then
arena[i]:SetPoint(unpack(C.position.unitframes.arena))
else
arena[i]:SetPoint("BOTTOMLEFT", C.position.unitframes.arena[2], "LEFT", C.position.unitframes.arena[4] + 120, C.position.unitframes.arena[5])
end
else
arena[i]:SetPoint("BOTTOM", arena[i-1], "TOP", 0, 30)
end
arena[i]:SetSize(boss_width, 27 + T.extraHeight)
end
local arenatarget = {}
for i = 1, 5 do
arenatarget[i] = oUF:Spawn("arena"..i.."target", "oUF_Arena"..i.."Target")
if i == 1 then
if C.unitframe.arena_on_right == true then
arenatarget[i]:SetPoint("TOPLEFT", arena[i], "TOPRIGHT", 7, 0)
else
arenatarget[i]:SetPoint("TOPRIGHT", arena[i], "TOPLEFT", -7, 0)
end
else
arenatarget[i]:SetPoint("BOTTOM", arenatarget[i-1], "TOP", 0, 30)
end
arenatarget[i]:SetSize(30 + T.extraHeight, 27 + T.extraHeight)
end
end
----------------------------------------------------------------------------------------
-- Arena preparation(by Blizzard)(../Blizzard_ArenaUI/Blizzard_ArenaUI.lua)
----------------------------------------------------------------------------------------
if C.unitframe.show_arena == true then
local arenaprep = {}
for i = 1, 5 do
arenaprep[i] = CreateFrame("Frame", "oUF_ArenaPrep"..i, UIParent)
arenaprep[i]:SetAllPoints(_G["oUF_Arena"..i])
arenaprep[i]:CreateBackdrop("Default")
arenaprep[i]:SetFrameStrata("BACKGROUND")
arenaprep[i].Health = CreateFrame("StatusBar", nil, arenaprep[i])
arenaprep[i].Health:SetAllPoints()
arenaprep[i].Health:SetStatusBarTexture(C.media.texture)
arenaprep[i].Spec = T.SetFontString(arenaprep[i].Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
arenaprep[i].Spec:SetPoint("CENTER")
arenaprep[i]:Hide()
end
local arenaprepupdate = CreateFrame("Frame")
arenaprepupdate:RegisterEvent("PLAYER_LOGIN")
arenaprepupdate:RegisterEvent("PLAYER_ENTERING_WORLD")
arenaprepupdate:RegisterEvent("ARENA_OPPONENT_UPDATE")
arenaprepupdate:RegisterEvent("ARENA_PREP_OPPONENT_SPECIALIZATIONS")
arenaprepupdate:SetScript("OnEvent", function(_, event)
if event == "PLAYER_LOGIN" then
for i = 1, 5 do
arenaprep[i]:SetAllPoints(_G["oUF_Arena"..i])
end
elseif event == "ARENA_OPPONENT_UPDATE" then
for i = 1, 5 do
arenaprep[i]:Hide()
end
else
local numOpps = GetNumArenaOpponentSpecs()
if numOpps > 0 then
for i = 1, 5 do
local f = arenaprep[i]
if i <= numOpps then
local s = GetArenaOpponentSpec(i)
local _, spec, class = nil, "UNKNOWN", "UNKNOWN"
if s and s > 0 then
_, spec, _, _, _, class = GetSpecializationInfoByID(s)
end
if class and spec then
local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]
if C.unitframe.own_color == true then
f.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))
f.Spec:SetText(spec)
f.Spec:SetTextColor(color.r, color.g, color.b)
else
if color then
f.Health:SetStatusBarColor(color.r, color.g, color.b)
else
f.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))
end
f.Spec:SetText(spec)
end
f:Show()
end
else
f:Hide()
end
end
else
for i = 1, 5 do
arenaprep[i]:Hide()
end
end
end
end)
end
----------------------------------------------------------------------------------------
-- Test UnitFrames(by community)
----------------------------------------------------------------------------------------
local moving = false
SlashCmdList.TEST_UF = function()
if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end
if not moving then
for _, frames in pairs({"oUF_Target", "oUF_TargetTarget", "oUF_Pet", "oUF_Focus", "oUF_FocusTarget"}) do
if _G[frames] then
_G[frames].oldunit = _G[frames].unit
_G[frames]:SetAttribute("unit", "player")
end
end
-- if C.unitframe.show_arena == true then
-- for i = 1, 5 do
-- _G["oUF_Arena"..i].oldunit = _G["oUF_Arena"..i].unit
-- _G["oUF_Arena"..i].Trinket.Hide = T.dummy
-- _G["oUF_Arena"..i].Trinket.Icon:SetTexture("Interface\\Icons\\INV_Jewelry_Necklace_37")
-- _G["oUF_Arena"..i]:SetAttribute("unit", "player")
-- _G["oUF_Arena"..i.."Target"].oldunit = _G["oUF_Arena"..i.."Target"].unit
-- _G["oUF_Arena"..i.."Target"]:SetAttribute("unit", "player")
-- if C.unitframe.plugins_enemy_spec == true then
-- _G["oUF_Arena"..i].EnemySpec:SetText(SPECIALIZATION)
-- end
-- if C.unitframe.plugins_diminishing == true then
-- SlashCmdList.DIMINISHINGCD()
-- end
-- end
-- end
if C.unitframe.show_boss == true then
for i = 1, 8 do
_G["oUF_Boss"..i].oldunit = _G["oUF_Boss"..i].unit
_G["oUF_Boss"..i]:SetAttribute("unit", "player")
end
end
moving = true
else
for _, frames in pairs({"oUF_Target", "oUF_TargetTarget", "oUF_Pet", "oUF_Focus", "oUF_FocusTarget"}) do
if _G[frames] then
_G[frames].unit = _G[frames].oldunit
_G[frames]:SetAttribute("unit", _G[frames].unit)
end
end
-- if C.unitframe.show_arena == true then
-- for i = 1, 5 do
-- _G["oUF_Arena"..i].Trinket.Hide = nil
-- _G["oUF_Arena"..i]:SetAttribute("unit", _G["oUF_Arena"..i].oldunit)
-- _G["oUF_Arena"..i.."Target"]:SetAttribute("unit", _G["oUF_Arena"..i.."Target"].oldunit)
-- end
-- end
if C.unitframe.show_boss == true then
for i = 1, 8 do
_G["oUF_Boss"..i].unit = _G["oUF_Boss"..i].oldunit
_G["oUF_Boss"..i]:SetAttribute("unit", _G["oUF_Boss"..i].unit)
end
end
moving = false
end
end
SLASH_TEST_UF1 = "/testui"
SLASH_TEST_UF2 = "/еуыегш"
SLASH_TEST_UF3 = "/testuf"
SLASH_TEST_UF4 = "/еуыега"
----------------------------------------------------------------------------------------
-- Player line
----------------------------------------------------------------------------------------
if C.unitframe.lines == true then
local HorizontalPlayerLine = CreateFrame("Frame", "HorizontalPlayerLine", oUF_Player)
HorizontalPlayerLine:CreatePanel("ClassColor", player_width + 11, 1, "TOPLEFT", "oUF_Player", "BOTTOMLEFT", -5, -5)
HorizontalPlayerLine:SetBackdropBorderColor(T.color.r, T.color.g, T.color.b)
local VerticalPlayerLine = CreateFrame("Frame", "VerticalPlayerLine", oUF_Player)
VerticalPlayerLine:CreatePanel("ClassColor", 1, 98 + T.extraHeight + (C.unitframe.extra_health_height / 2), "TOPRIGHT", "oUF_Player", "TOPLEFT", -5, 30)
VerticalPlayerLine:SetBackdropBorderColor(T.color.r, T.color.g, T.color.b)
end
----------------------------------------------------------------------------------------
-- Target line
----------------------------------------------------------------------------------------
if C.unitframe.lines == true then
local HorizontalTargetLine = CreateFrame("Frame", "HorizontalTargetLine", oUF_Target)
HorizontalTargetLine:CreatePanel("ClassColor", player_width + 11, 1, "TOPRIGHT", "oUF_Target", "BOTTOMRIGHT", 5, -5)
HorizontalTargetLine:RegisterEvent("PLAYER_TARGET_CHANGED")
HorizontalTargetLine:SetScript("OnEvent", function(self)
local _, class = UnitClass("target")
local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]
if color then
self:SetBackdropBorderColor(color.r, color.g, color.b)
else
self:SetBackdropBorderColor(unpack(C.media.border_color))
end
end)
local VerticalTargetLine = CreateFrame("Frame", "VerticalTargetLine", oUF_Target)
VerticalTargetLine:CreatePanel("ClassColor", 1, 98 + T.extraHeight + (C.unitframe.extra_health_height / 2), "TOPLEFT", "oUF_Target", "TOPRIGHT", 5, 30)
VerticalTargetLine:RegisterEvent("PLAYER_TARGET_CHANGED")
VerticalTargetLine:SetScript("OnEvent", function(self)
local _, class = UnitClass("target")
local color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class]
if color then
self:SetBackdropBorderColor(color.r, color.g, color.b)
else
self:SetBackdropBorderColor(unpack(C.media.border_color))
end
end)
end
----------------------------------------------------------------------------------------
-- Auto reposition heal raid frame
----------------------------------------------------------------------------------------
if C.raidframe.auto_position == "DYNAMIC" then
local prevNum = 5
local function Reposition(self, event)
if (C.raidframe.layout == "HEAL" or C.raidframe.layout == "AUTO") and not C.raidframe.raid_groups_vertical and C.raidframe.raid_groups > 5 then
if InCombatLockdown() then
self:RegisterEvent("PLAYER_REGEN_ENABLED")
return
end
local maxGroup = 5
local num = GetNumGroupMembers()
if num > 5 then
local _, _, subgroup = GetRaidRosterInfo(num)
if subgroup and subgroup > maxGroup then
maxGroup = subgroup
end
end
if maxGroup >= C.raidframe.raid_groups then
maxGroup = C.raidframe.raid_groups
end
if C.raidframe.layout == "AUTO" and not T.IsHealerSpec() then maxGroup = 5 end
if prevNum ~= maxGroup then
-- local offset = (maxGroup - 5) * (C.raidframe.heal_raid_height + 7) + ((maxGroup - ((maxGroup - 5))) * (C.raidframe.heal_raid_height - 26))
local offset = (maxGroup - 5) * (C.raidframe.heal_raid_height + 7)
if C.raidframe.layout == "AUTO" and not T.IsHealerSpec() then offset = 0 end
if C.unitframe.castbar_icon == true then
oUF_Player_Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4] + 11, C.position.unitframes.player_castbar[5] + offset)
else
oUF_Player_Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4], C.position.unitframes.player_castbar[5] + offset)
end
player:SetPoint(C.position.unitframes.player[1], C.position.unitframes.player[2], C.position.unitframes.player[3], C.position.unitframes.player[4], C.position.unitframes.player[5] + offset)
target:SetPoint(C.position.unitframes.target[1], C.position.unitframes.target[2], C.position.unitframes.target[3], C.position.unitframes.target[4], C.position.unitframes.target[5] + offset)
prevNum = maxGroup
end
if event == "PLAYER_REGEN_ENABLED" then
self:UnregisterEvent("PLAYER_REGEN_ENABLED")
end
else
self:UnregisterAllEvents()
end
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:RegisterEvent("GROUP_ROSTER_UPDATE")
if C.raidframe.layout == "AUTO" then
frame:RegisterUnitEvent("PLAYER_SPECIALIZATION_CHANGED", "player")
end
frame:SetScript("OnEvent", Reposition)
elseif C.raidframe.auto_position == "STATIC" then
local function Reposition(self)
if (C.raidframe.layout == "HEAL" or C.raidframe.layout == "AUTO") and not C.raidframe.raid_groups_vertical and C.raidframe.raid_groups > 5 then
-- local offset = (C.raidframe.raid_groups - 5) * (C.raidframe.heal_raid_height + 7) + ((C.raidframe.raid_groups - ((C.raidframe.raid_groups - 5))) * (C.raidframe.heal_raid_height - 26))
local offset = (C.raidframe.raid_groups - 5) * (C.raidframe.heal_raid_height + 7)
if C.raidframe.layout == "AUTO" and not T.IsHealerSpec() then offset = 0 end
if C.unitframe.castbar_icon == true then
oUF_Player_Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4] + 11, C.position.unitframes.player_castbar[5] + offset)
else
oUF_Player_Castbar:SetPoint(C.position.unitframes.player_castbar[1], C.position.unitframes.player_castbar[2], C.position.unitframes.player_castbar[3], C.position.unitframes.player_castbar[4], C.position.unitframes.player_castbar[5] + offset)
end
player:SetPoint(C.position.unitframes.player[1], C.position.unitframes.player[2], C.position.unitframes.player[3], C.position.unitframes.player[4], C.position.unitframes.player[5] + offset)
target:SetPoint(C.position.unitframes.target[1], C.position.unitframes.target[2], C.position.unitframes.target[3], C.position.unitframes.target[4], C.position.unitframes.target[5] + offset)
else
self:UnregisterAllEvents()
end
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
if C.raidframe.layout == "AUTO" then
frame:RegisterUnitEvent("PLAYER_SPECIALIZATION_CHANGED", "player")
end
frame:SetScript("OnEvent", Reposition)
end
================================================
FILE: ShestakUI/Modules/UnitFrames/Nameplates.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.nameplate.enable ~= true then return end
----------------------------------------------------------------------------------------
-- oUF nameplates
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
local frame = CreateFrame("Frame")
frame:SetScript("OnEvent", function(self, event, ...) self[event](self, ...) end)
if C.nameplate.combat == true then
frame:RegisterEvent("PLAYER_REGEN_ENABLED")
frame:RegisterEvent("PLAYER_REGEN_DISABLED")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
function frame:PLAYER_REGEN_ENABLED()
SetCVar("nameplateShowEnemies", 0)
end
function frame:PLAYER_REGEN_DISABLED()
SetCVar("nameplateShowEnemies", 1)
end
function frame:PLAYER_ENTERING_WORLD()
if InCombatLockdown() then
SetCVar("nameplateShowEnemies", 1)
else
SetCVar("nameplateShowEnemies", 0)
end
end
end
frame:RegisterEvent("PLAYER_LOGIN")
function frame:PLAYER_LOGIN()
if C.nameplate.enhance_threat == true then
SetCVar("threatWarning", 3)
end
SetCVar("nameplateGlobalScale", 1)
SetCVar("namePlateMinScale", 1)
SetCVar("namePlateMaxScale", 1)
SetCVar("nameplateLargerScale", 1)
SetCVar("nameplateSelectedScale", 1)
SetCVar("nameplateMinAlpha", 1)
SetCVar("nameplateMaxAlpha", 1)
SetCVar("nameplateSelectedAlpha", 1)
SetCVar("nameplateNotSelectedAlpha", 1)
SetCVar("nameplateLargeTopInset", 0.08)
SetCVar("nameplateOtherTopInset", C.nameplate.clamp and 0.08 or -1)
SetCVar("nameplateOtherBottomInset", C.nameplate.clamp and 0.1 or -1)
SetCVar("clampTargetNameplateToScreen", C.nameplate.clamp and "1" or "0")
if C.nameplate.only_name then
SetCVar("nameplateShowOnlyNames", 1)
end
local function changeFont(self, size)
local mult = size or 1
self:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * mult * T.noscalemult, C.font.nameplates_font_style)
self:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)
end
changeFont(SystemFont_NamePlateFixed)
changeFont(SystemFont_LargeNamePlateFixed, 2)
end
local healList, exClass, healerSpecs = {}, {}, {}
exClass.DEATHKNIGHT = true
exClass.DEMONHUNTER = true
exClass.HUNTER = true
exClass.MAGE = true
exClass.ROGUE = true
exClass.WARLOCK = true
exClass.WARRIOR = true
if C.nameplate.healer_icon == true then
local t = CreateFrame("Frame")
t.factions = {
["Horde"] = 1,
["Alliance"] = 0,
}
local healerSpecIDs = {
105, -- Druid Restoration
1468, -- Evoker Preservation
270, -- Monk Mistweaver
65, -- Paladin Holy
256, -- Priest Discipline
257, -- Priest Holy
264, -- Shaman Restoration
}
for _, specID in pairs(healerSpecIDs) do
local _, name = GetSpecializationInfoByID(specID)
if name and not healerSpecs[name] then
healerSpecs[name] = true
end
end
local lastCheck = 20
local function CheckHealers(_, elapsed)
lastCheck = lastCheck + elapsed
if lastCheck > 25 then
lastCheck = 0
healList = {}
for i = 1, GetNumBattlefieldScores() do
local name, _, _, _, _, faction, _, _, _, _, _, _, _, _, _, talentSpec = GetBattlefieldScore(i)
if name and healerSpecs[talentSpec] and t.factions[UnitFactionGroup("player")] == faction then
name = name:match("(.+)%-.+") or name
healList[name] = talentSpec
end
end
end
end
local function CheckArenaHealers(_, elapsed)
lastCheck = lastCheck + elapsed
if lastCheck > 10 then
lastCheck = 0
healList = {}
for i = 1, 5 do
local specID = GetArenaOpponentSpec(i)
if specID and specID > 0 then
local name = UnitName(format("arena%d", i))
local _, talentSpec = GetSpecializationInfoByID(specID)
if name and healerSpecs[talentSpec] then
healList[name] = talentSpec
local nameplate = C_NamePlate.GetNamePlateForUnit(format("arena%d", i))
if nameplate then
nameplate.unitFrame:UpdateAllElements("UNIT_NAME_UPDATE")
end
end
end
end
end
end
local function CheckLoc(_, event)
if event == "PLAYER_ENTERING_WORLD" then
local _, instanceType = IsInInstance()
if instanceType == "pvp" then
t:SetScript("OnUpdate", CheckHealers)
elseif instanceType == "arena" then
t:SetScript("OnUpdate", CheckArenaHealers)
else
healList = {}
t:SetScript("OnUpdate", nil)
end
end
end
t:RegisterEvent("PLAYER_ENTERING_WORLD")
t:SetScript("OnEvent", CheckLoc)
end
local totemData = {
[GetSpellInfo(192058)] = 136013, -- Capacitor Totem
[GetSpellInfo(98008)] = 237586, -- Spirit Link Totem
[GetSpellInfo(192077)] = 538576, -- Wind Rush Totem
[GetSpellInfo(204331)] = 511726, -- Counterstrike Totem
[GetSpellInfo(204332)] = 136114, -- Windfury Totem
[GetSpellInfo(204336)] = 136039, -- Grounding Totem
[GetSpellInfo(157153)] = 971076, -- Cloudburst Totem
[GetSpellInfo(5394)] = 135127, -- Healing Stream Totem
[GetSpellInfo(108280)] = 538569, -- Healing Tide Totem
[GetSpellInfo(207399)] = 136080, -- Ancestral Protection Totem
[GetSpellInfo(198838)] = 136098, -- Earthen Wall Totem
[GetSpellInfo(51485)] = 136100, -- Earthgrab Totem
[GetSpellInfo(196932)] = 136232, -- Voodoo Totem
[GetSpellInfo(192222)] = 971079, -- Liquid Magma Totem
[GetSpellInfo(204330)] = 135829, -- Skyfury Totem
}
local function CreateBorderFrame(frame, point)
if point == nil then point = frame end
if point.backdrop then return end
frame.backdrop = frame:CreateTexture(nil, "BORDER")
frame.backdrop:SetDrawLayer("BORDER", -8)
frame.backdrop:SetPoint("TOPLEFT", point, "TOPLEFT", -T.noscalemult * 3, T.noscalemult * 3)
frame.backdrop:SetPoint("BOTTOMRIGHT", point, "BOTTOMRIGHT", T.noscalemult * 3, -T.noscalemult * 3)
frame.backdrop:SetColorTexture(unpack(C.media.backdrop_color))
frame.bordertop = frame:CreateTexture(nil, "BORDER")
frame.bordertop:SetPoint("TOPLEFT", point, "TOPLEFT", -T.noscalemult * 2, T.noscalemult * 2)
frame.bordertop:SetPoint("TOPRIGHT", point, "TOPRIGHT", T.noscalemult * 2, T.noscalemult * 2)
frame.bordertop:SetHeight(T.noscalemult)
frame.bordertop:SetColorTexture(unpack(C.media.border_color))
frame.bordertop:SetDrawLayer("BORDER", -7)
frame.borderbottom = frame:CreateTexture(nil, "BORDER")
frame.borderbottom:SetPoint("BOTTOMLEFT", point, "BOTTOMLEFT", -T.noscalemult * 2, -T.noscalemult * 2)
frame.borderbottom:SetPoint("BOTTOMRIGHT", point, "BOTTOMRIGHT", T.noscalemult * 2, -T.noscalemult * 2)
frame.borderbottom:SetHeight(T.noscalemult)
frame.borderbottom:SetColorTexture(unpack(C.media.border_color))
frame.borderbottom:SetDrawLayer("BORDER", -7)
frame.borderleft = frame:CreateTexture(nil, "BORDER")
frame.borderleft:SetPoint("TOPLEFT", point, "TOPLEFT", -T.noscalemult * 2, T.noscalemult * 2)
frame.borderleft:SetPoint("BOTTOMLEFT", point, "BOTTOMLEFT", T.noscalemult * 2, -T.noscalemult * 2)
frame.borderleft:SetWidth(T.noscalemult)
frame.borderleft:SetColorTexture(unpack(C.media.border_color))
frame.borderleft:SetDrawLayer("BORDER", -7)
frame.borderright = frame:CreateTexture(nil, "BORDER")
frame.borderright:SetPoint("TOPRIGHT", point, "TOPRIGHT", T.noscalemult * 2, T.noscalemult * 2)
frame.borderright:SetPoint("BOTTOMRIGHT", point, "BOTTOMRIGHT", -T.noscalemult * 2, -T.noscalemult * 2)
frame.borderright:SetWidth(T.noscalemult)
frame.borderright:SetColorTexture(unpack(C.media.border_color))
frame.borderright:SetDrawLayer("BORDER", -7)
end
local function SetColorBorder(frame, r, g, b)
frame.bordertop:SetColorTexture(r, g, b)
frame.borderbottom:SetColorTexture(r, g, b)
frame.borderleft:SetColorTexture(r, g, b)
frame.borderright:SetColorTexture(r, g, b)
end
-- Auras functions
local AurasCustomFilter = function(element, unit, data)
local allow = false
if not UnitIsFriend("player", unit) then
if data.isHarmful then
if C.nameplate.track_debuffs and data.isPlayerAura or data.sourceUnit == "pet" then
if ((data.nameplateShowAll or data.nameplateShowPersonal) and not T.DebuffBlackList[data.name]) then
allow = true
elseif T.DebuffWhiteList[data.name] then
allow = true
end
end
else
if T.BuffWhiteList[data.name] then
allow = true
elseif data.isStealable then
allow = true
end
end
end
return allow
end
local Mult = 1
if T.screenHeight > 1200 then
Mult = T.mult
end
local AurasPostCreateIcon = function(element, button)
CreateBorderFrame(button)
button.remaining = T.SetFontString(button, C.font.auras_font, C.font.auras_font_size * T.noscalemult / Mult, C.font.auras_font_style)
button.remaining:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)
button.remaining:SetPoint("CENTER", button, "CENTER", 1, 0)
button.remaining:SetJustifyH("CENTER")
button.Cooldown.noCooldownCount = true
button.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
button.Count:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", 1, 0)
button.Count:SetJustifyH("RIGHT")
button.Count:SetFont(C.font.auras_font, C.font.auras_font_size * T.noscalemult / Mult, C.font.auras_font_style)
button.Count:SetShadowOffset(C.font.auras_font_shadow and 1 or 0, C.font.auras_font_shadow and -1 or 0)
if C.aura.show_spiral == true then
element.disableCooldown = false
button.Cooldown:SetReverse(true)
button.parent = CreateFrame("Frame", nil, button)
button.parent:SetFrameLevel(button.Cooldown:GetFrameLevel() + 1)
button.Count:SetParent(button.parent)
button.remaining:SetParent(button.parent)
else
element.disableCooldown = true
end
end
local AurasPostUpdateIcon = function(_, button, unit, data)
if not UnitIsFriend("player", unit) then
if data.isHarmful then
if C.nameplate.track_debuffs and data.isPlayerAura or data.sourceUnit == "pet" then
if C.nameplate.track_buffs then
SetColorBorder(button, unpack(C.media.border_color))
end
end
else
if T.BuffWhiteList[data.name] then
SetColorBorder(button, 0, 0.5, 0)
elseif data.isStealable then
SetColorBorder(button, 1, 0.85, 0)
end
end
end
if data.duration and data.duration > 0 and C.aura.show_timer == true then
button.remaining:Show()
button.timeLeft = data.expirationTime
button:SetScript("OnUpdate", T.CreateAuraTimer)
else
button.remaining:Hide()
button.timeLeft = math.huge
button:SetScript("OnUpdate", nil)
end
button.first = true
end
local function UpdateTarget(self)
local isTarget = UnitIsUnit(self.unit, "target")
local isMe = UnitIsUnit(self.unit, "player")
if isTarget and not isMe then
if C.nameplate.ad_height > 0 or C.nameplate.ad_width > 0 then
self:SetSize((C.nameplate.width + C.nameplate.ad_width) * T.noscalemult, (C.nameplate.height + C.nameplate.ad_height) * T.noscalemult)
self.Castbar:SetPoint("BOTTOMLEFT", self.Health, "BOTTOMLEFT", 0, -8-((C.nameplate.height + C.nameplate.ad_height) * T.noscalemult))
self.Castbar.Icon:SetSize(((C.nameplate.height + C.nameplate.ad_height) * 2 * T.noscalemult) + 8, ((C.nameplate.height + C.nameplate.ad_height) * 2 * T.noscalemult) + 8)
if C.nameplate.class_icons == true then
self.Class.Icon:SetSize(((C.nameplate.height + C.nameplate.ad_height) * 2 * T.noscalemult) + 8, ((C.nameplate.height + C.nameplate.ad_height) * 2 * T.noscalemult) + 8)
end
end
if C.nameplate.target_glow then
self.Glow:Show()
end
self:SetAlpha(1)
else
if C.nameplate.ad_height > 0 or C.nameplate.ad_width > 0 then
self:SetSize(C.nameplate.width * T.noscalemult, C.nameplate.height * T.noscalemult)
self.Castbar:SetPoint("BOTTOMLEFT", self.Health, "BOTTOMLEFT", 0, -8-(C.nameplate.height * T.noscalemult))
self.Castbar.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)
if C.nameplate.class_icons == true then
self.Class.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)
end
end
if C.nameplate.target_glow then
self.Glow:Hide()
end
if not UnitExists("target") or isMe then
self:SetAlpha(1)
else
self:SetAlpha(C.nameplate.alpha)
end
end
end
local function UpdateName(self)
if C.nameplate.healer_icon == true then
local name = self.unitName
if name then
if healList[name] then
if exClass[healList[name]] then
self.HealerIcon:Hide()
else
self.HealerIcon:Show()
end
else
self.HealerIcon:Hide()
end
end
end
if C.nameplate.class_icons == true then
local reaction = UnitReaction(self.unit, "player")
if UnitIsPlayer(self.unit) and (reaction and reaction <= 4) then
local _, class = UnitClass(self.unit)
local texcoord = CLASS_ICON_TCOORDS[class]
self.Class.Icon:SetTexCoord(texcoord[1] + 0.015, texcoord[2] - 0.02, texcoord[3] + 0.018, texcoord[4] - 0.02)
self.Class:Show()
self.Level:SetPoint("RIGHT", self.Name, "LEFT", -2, 0)
else
self.Class.Icon:SetTexCoord(0, 0, 0, 0)
self.Class:Hide()
self.Level:SetPoint("RIGHT", self.Health, "LEFT", -2, 0)
end
end
if C.nameplate.totem_icons == true then
local name = self.unitName
if name then
if totemData[name] then
self.Totem.Icon:SetTexture(totemData[name])
self.Totem:Show()
else
self.Totem:Hide()
end
end
end
end
local kickID = 0
if C.nameplate.kick_color then
if T.class == "DEATHKNIGHT" then
kickID = 47528
elseif T.class == "DEMONHUNTER" then
kickID = 183752
elseif T.class == "DRUID" then
kickID = 106839
elseif T.class == "EVOKER" then
kickID = 351338
elseif T.class == "HUNTER" then
kickID = GetSpecialization() == 3 and 187707 or 147362
elseif T.class == "MAGE" then
kickID = 2139
elseif T.class == "MONK" then
kickID = 116705
elseif T.class == "PALADIN" then
kickID = 96231
elseif T.class == "PRIEST" then
kickID = 15487
elseif T.class == "ROGUE" then
kickID = 1766
elseif T.class == "SHAMAN" then
kickID = 57994
elseif T.class == "WARLOCK" then
kickID = 119910
elseif T.class == "WARRIOR" then
kickID = 6552
end
end
-- Cast color
local function castColor(self)
if self.notInterruptible then
self:SetStatusBarColor(0.78, 0.25, 0.25)
self.bg:SetColorTexture(0.78, 0.25, 0.25, 0.2)
else
if C.nameplate.kick_color then
local start = GetSpellCooldown(kickID)
if start ~= 0 then
self:SetStatusBarColor(1, 0.5, 0)
self.bg:SetColorTexture(1, 0.5, 0, 0.2)
else
self:SetStatusBarColor(1, 0.8, 0)
self.bg:SetColorTexture(1, 0.8, 0, 0.2)
end
else
self:SetStatusBarColor(1, 0.8, 0)
self.bg:SetColorTexture(1, 0.8, 0, 0.2)
end
end
if C.nameplate.cast_color then
if T.InterruptCast[self.spellID] then
SetColorBorder(self, 1, 0.8, 0)
elseif T.ImportantCast[self.spellID] then
SetColorBorder(self, 1, 0, 0)
else
SetColorBorder(self, unpack(C.media.border_color))
end
end
end
-- Health color
local function threatColor(self, forced)
if UnitIsPlayer(self.unit) then return end
if C.nameplate.enhance_threat ~= true then
SetColorBorder(self.Health, unpack(C.media.border_color))
end
if UnitIsTapDenied(self.unit) then
self.Health:SetStatusBarColor(0.6, 0.6, 0.6)
elseif UnitAffectingCombat("player") then
local threatStatus = UnitThreatSituation("player", self.unit)
if self.npcID == "120651" then -- Explosives affix
self.Health:SetStatusBarColor(unpack(C.nameplate.extra_color))
elseif self.npcID == "174773" then -- Spiteful Shade affix
if threatStatus == 3 then
self.Health:SetStatusBarColor(unpack(C.nameplate.extra_color))
else
self.Health:SetStatusBarColor(unpack(C.nameplate.good_color))
end
elseif threatStatus == 3 then -- securely tanking, highest threat
if T.Role == "Tank" then
if C.nameplate.enhance_threat == true then
if C.nameplate.mob_color_enable and T.ColorPlate[self.npcID] then
self.Health:SetStatusBarColor(unpack(T.ColorPlate[self.npcID]))
else
self.Health:SetStatusBarColor(unpack(C.nameplate.good_color))
end
else
SetColorBorder(self.Health, unpack(C.nameplate.bad_color))
end
else
if C.nameplate.enhance_threat == true then
self.Health:SetStatusBarColor(unpack(C.nameplate.bad_color))
else
SetColorBorder(self.Health, unpack(C.nameplate.bad_color))
end
end
elseif threatStatus == 2 then -- insecurely tanking, another unit have higher threat but not tanking
if C.nameplate.enhance_threat == true then
self.Health:SetStatusBarColor(unpack(C.nameplate.near_color))
else
SetColorBorder(self.Health, unpack(C.nameplate.near_color))
end
elseif threatStatus == 1 then -- not tanking, higher threat than tank
if C.nameplate.enhance_threat == true then
self.Health:SetStatusBarColor(unpack(C.nameplate.near_color))
else
SetColorBorder(self.Health, unpack(C.nameplate.near_color))
end
elseif threatStatus == 0 then -- not tanking, lower threat than tank
if C.nameplate.enhance_threat == true then
if T.Role == "Tank" then
local offTank = false
if IsInRaid() then
for i = 1, GetNumGroupMembers() do
if UnitExists("raid"..i) and not UnitIsUnit("raid"..i, "player") and UnitGroupRolesAssigned("raid"..i) == "TANK" then
local isTanking = UnitDetailedThreatSituation("raid"..i, self.unit)
if isTanking then
offTank = true
break
end
end
end
end
if offTank then
self.Health:SetStatusBarColor(unpack(C.nameplate.offtank_color))
else
self.Health:SetStatusBarColor(unpack(C.nameplate.bad_color))
end
else
if C.nameplate.mob_color_enable and T.ColorPlate[self.npcID] then
self.Health:SetStatusBarColor(unpack(T.ColorPlate[self.npcID]))
else
self.Health:SetStatusBarColor(unpack(C.nameplate.good_color))
end
end
end
end
elseif not forced then
self.Health:ForceUpdate()
end
end
local function HealthPostUpdate(self, unit, cur, max)
local main = self:GetParent()
local perc = 0
if max and max > 0 then
perc = cur / max
end
local r, g, b
local mu = self.bg.multiplier
local isPlayer = UnitIsPlayer(unit)
local unitReaction = UnitReaction(unit, "player")
if not UnitIsUnit("player", unit) and isPlayer and (unitReaction and unitReaction >= 5) then
r, g, b = unpack(T.oUF_colors.power["MANA"])
self:SetStatusBarColor(r, g, b)
self.bg:SetVertexColor(r * mu, g * mu, b * mu)
elseif not UnitIsTapDenied(unit) and not isPlayer then
if C.nameplate.mob_color_enable and T.ColorPlate[main.npcID] then
r, g, b = unpack(T.ColorPlate[main.npcID])
else
local reaction = T.oUF_colors.reaction[unitReaction]
if reaction then
r, g, b = reaction[1], reaction[2], reaction[3]
else
r, g, b = UnitSelectionColor(unit, true)
end
end
self:SetStatusBarColor(r, g, b)
self.bg:SetVertexColor(r * mu, g * mu, b * mu)
end
if isPlayer then
if perc <= 0.5 and perc >= 0.2 then
SetColorBorder(self, 1, 1, 0)
elseif perc < 0.2 then
SetColorBorder(self, 1, 0, 0)
else
SetColorBorder(self, unpack(C.media.border_color))
end
elseif not isPlayer and C.nameplate.enhance_threat == true then
if C.nameplate.low_health then
if perc < C.nameplate.low_health_value then
SetColorBorder(self, unpack(C.nameplate.low_health_color))
else
SetColorBorder(self, unpack(C.media.border_color))
end
else
SetColorBorder(self, unpack(C.media.border_color))
end
end
threatColor(main, true)
end
local function callback(self, event, unit)
if not self then return end
if unit then
local unitGUID = UnitGUID(unit)
self.npcID = unitGUID and select(6, strsplit('-', unitGUID))
self.unitName = UnitName(unit)
self.widgetsOnly = UnitNameplateShowsWidgetsOnly(unit)
if self.npcID and T.PlateBlacklist[self.npcID] then
self:Hide()
else
self:Show()
end
if UnitIsUnit(unit, "player") then
self.Power:Show()
self.Name:Hide()
self.Castbar:SetAlpha(0)
self.RaidTargetIndicator:SetAlpha(0)
else
self.Power:Hide()
self.Name:Show()
self.Castbar:SetAlpha(1)
self.RaidTargetIndicator:SetAlpha(1)
if self.widgetsOnly or (UnitWidgetSet(unit) and UnitIsOwnerOrControllerOfUnit("player", unit)) then
self.Health:SetAlpha(0)
self.Level:SetAlpha(0)
self.Name:SetAlpha(0)
self.Castbar:SetAlpha(0)
else
self.Health:SetAlpha(1)
self.Level:SetAlpha(1)
self.Name:SetAlpha(1)
self.Castbar:SetAlpha(1)
end
local nameplate = C_NamePlate.GetNamePlateForUnit(unit)
if nameplate.UnitFrame then
if nameplate.UnitFrame.WidgetContainer then
nameplate.UnitFrame.WidgetContainer:SetParent(nameplate)
end
end
if C.nameplate.only_name then
if UnitIsFriend("player", unit) then
self.Health:SetAlpha(0)
self.Name:ClearAllPoints()
self.Name:SetPoint("CENTER", self, "CENTER", 0, 0)
self.Level:SetAlpha(0)
self.Castbar:SetAlpha(0)
if C.nameplate.target_glow then
self.Glow:SetAlpha(0)
end
else
self.Health:SetAlpha(1)
self.Name:ClearAllPoints()
self.Name:SetPoint("BOTTOMLEFT", self, "TOPLEFT", -3, 4)
self.Name:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 3, 4)
self.Level:SetAlpha(1)
self.Castbar:SetAlpha(1)
if C.nameplate.target_glow then
self.Glow:SetAlpha(1)
end
end
end
end
end
end
local function style(self, unit)
local nameplate = C_NamePlate.GetNamePlateForUnit(unit)
local main = self
self.unit = unit
self:SetPoint("CENTER", nameplate, "CENTER")
self:SetSize(C.nameplate.width * T.noscalemult, C.nameplate.height * T.noscalemult)
-- Health Bar
self.Health = CreateFrame("StatusBar", nil, self)
self.Health:SetAllPoints(self)
self.Health:SetStatusBarTexture(C.media.texture)
self.Health.colorTapping = true
self.Health.colorDisconnected = true
self.Health.colorClass = true
self.Health.colorReaction = true
self.Health.colorHealth = true
CreateBorderFrame(self.Health)
self.Health.bg = self.Health:CreateTexture(nil, "BORDER")
self.Health.bg:SetAllPoints()
self.Health.bg:SetTexture(C.media.texture)
self.Health.bg.multiplier = 0.2
-- Health Text
if C.nameplate.health_value == true then
self.Health.value = self.Health:CreateFontString(nil, "OVERLAY")
self.Health.value:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)
self.Health.value:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)
self.Health.value:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
self:Tag(self.Health.value, "[NameplateHealth]")
end
-- Player Power Bar
self.Power = CreateFrame("StatusBar", nil, self)
self.Power:SetStatusBarTexture(C.media.texture)
self.Power:SetPoint("TOPLEFT", self.Health, "BOTTOMLEFT", 0, -6)
self.Power:SetPoint("BOTTOMRIGHT", self.Health, "BOTTOMRIGHT", 0, -6-(C.nameplate.height * T.noscalemult / 2))
self.Power.frequentUpdates = true
self.Power.colorPower = true
self.Power.PostUpdate = T.PreUpdatePower
CreateBorderFrame(self.Power)
self.Power.bg = self.Power:CreateTexture(nil, "BORDER")
self.Power.bg:SetAllPoints()
self.Power.bg:SetTexture(C.media.texture)
self.Power.bg.multiplier = 0.2
-- Hide Blizzard Power Bar
hooksecurefunc(_G.NamePlateDriverFrame, "SetupClassNameplateBars", function(frame)
if not frame or frame:IsForbidden() then
return
end
if frame.classNamePlatePowerBar then
frame.classNamePlatePowerBar:Hide()
frame.classNamePlatePowerBar:UnregisterAllEvents()
end
end)
-- Name Text
self.Name = self:CreateFontString(nil, "OVERLAY")
self.Name:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)
self.Name:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)
self.Name:SetPoint("BOTTOMLEFT", self, "TOPLEFT", -3, 4)
self.Name:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 3, 4)
self.Name:SetWordWrap(false)
if C.nameplate.name_abbrev then
self:Tag(self.Name, "[NameplateNameColor][NameLongAbbrev]")
elseif C.nameplate.short_name then
self:Tag(self.Name, "[NameplateNameColor][NameplateNameShort]")
else
self:Tag(self.Name, "[NameplateNameColor][NameLong]")
end
-- Target Glow
if C.nameplate.target_glow then
self.Glow = CreateFrame("Frame", nil, self, "BackdropTemplate")
self.Glow:SetBackdrop({edgeFile = [[Interface\AddOns\ShestakUI\Media\Textures\Glow.tga]], edgeSize = 4 * T.noscalemult})
self.Glow:SetPoint("TOPLEFT", -7 * T.noscalemult, 7 * T.noscalemult)
self.Glow:SetPoint("BOTTOMRIGHT", 7 * T.noscalemult, -7 * T.noscalemult)
self.Glow:SetBackdropBorderColor(0.8, 0.8, 0.8)
self.Glow:SetFrameLevel(0)
self.Glow:Hide()
end
-- Level Text
self.Level = self:CreateFontString(nil, "ARTWORK")
self.Level:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)
self.Level:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)
self.Level:SetPoint("RIGHT", self.Health, "LEFT", -2, 0)
self:Tag(self.Level, "[DiffColor][NameplateLevel][shortclassification]")
-- Cast Bar
self.Castbar = CreateFrame("StatusBar", nil, self)
self.Castbar:SetFrameLevel(3)
self.Castbar:SetStatusBarTexture(C.media.texture)
self.Castbar:SetStatusBarColor(1, 0.8, 0)
self.Castbar:SetPoint("TOPLEFT", self.Health, "BOTTOMLEFT", 0, -8)
self.Castbar:SetPoint("BOTTOMRIGHT", self.Health, "BOTTOMRIGHT", 0, -8-(C.nameplate.height * T.noscalemult))
CreateBorderFrame(self.Castbar)
self.Castbar.bg = self.Castbar:CreateTexture(nil, "BORDER")
self.Castbar.bg:SetAllPoints()
self.Castbar.bg:SetTexture(C.media.texture)
self.Castbar.bg:SetColorTexture(1, 0.8, 0, 0.2)
self.Castbar.PostCastStart = castColor
self.Castbar.PostCastInterruptible = castColor
-- Cast Time Text
self.Castbar.Time = self.Castbar:CreateFontString(nil, "ARTWORK")
self.Castbar.Time:SetPoint("RIGHT", self.Castbar, "RIGHT", 0, 0)
self.Castbar.Time:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)
self.Castbar.Time:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)
self.Castbar.CustomTimeText = function(self, duration)
self.Time:SetText(("%.1f"):format(self.channeling and duration or self.max - duration))
end
-- Cast Name Text
if C.nameplate.show_castbar_name == true then
self.Castbar.Text = self.Castbar:CreateFontString(nil, "OVERLAY")
self.Castbar.Text:SetPoint("LEFT", self.Castbar, "LEFT", 3, 0)
self.Castbar.Text:SetPoint("RIGHT", self.Castbar.Time, "LEFT", -1, 0)
self.Castbar.Text:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult, C.font.nameplates_font_style)
self.Castbar.Text:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)
self.Castbar.Text:SetHeight(C.font.nameplates_font_size)
self.Castbar.Text:SetJustifyH("LEFT")
end
-- Cast Bar Icon
self.CastbarIcon = CreateFrame("Frame", nil, self.Castbar)
self.Castbar.Icon = self.CastbarIcon:CreateTexture(nil, "OVERLAY")
self.Castbar.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.Castbar.Icon:SetDrawLayer("ARTWORK")
self.Castbar.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)
self.Castbar.Icon:SetPoint("TOPLEFT", self.Health, "TOPRIGHT", 8, 0)
CreateBorderFrame(self.CastbarIcon, self.Castbar.Icon)
-- Raid Icon
self.RaidTargetIndicator = self:CreateTexture(nil, "OVERLAY", nil, 7)
self.RaidTargetIndicator:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)
self.RaidTargetIndicator:SetPoint("BOTTOM", self.Health, "TOP", 0, C.nameplate.track_debuffs == true and 38 or 16)
-- Class Icon
if C.nameplate.class_icons == true then
self.Class = CreateFrame("Frame", nil, self)
self.Class.Icon = self.Class:CreateTexture(nil, "OVERLAY")
self.Class.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)
self.Class.Icon:SetPoint("TOPRIGHT", self.Health, "TOPLEFT", -8, 0)
self.Class.Icon:SetTexture("Interface\\WorldStateFrame\\Icons-Classes")
self.Class.Icon:SetTexCoord(0, 0, 0, 0)
CreateBorderFrame(self.Class, self.Class.Icon)
end
-- Totem Icon
if C.nameplate.totem_icons == true then
self.Totem = CreateFrame("Frame", nil, self)
self.Totem.Icon = self.Totem:CreateTexture(nil, "OVERLAY")
self.Totem.Icon:SetSize((C.nameplate.height * 2 * T.noscalemult) + 8, (C.nameplate.height * 2 * T.noscalemult) + 8)
self.Totem.Icon:SetPoint("BOTTOM", self.Health, "TOP", 0, 16)
self.Totem.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
CreateBorderFrame(self.Totem, self.Totem.Icon)
end
-- Healer Icon
if C.nameplate.healer_icon == true then
self.HealerIcon = self.Health:CreateFontString(nil, "OVERLAY")
self.HealerIcon:SetFont(C.font.nameplates_font, 32, C.font.nameplates_font_style)
self.HealerIcon:SetText("|cFFD53333+|r")
self.HealerIcon:SetPoint("BOTTOM", self.Name, "TOP", 0, C.nameplate.track_debuffs == true and 13 or 0)
end
-- Quest Icon
if C.nameplate.quests then
self.QuestIcon = self:CreateTexture(nil, "OVERLAY", nil, 7)
self.QuestIcon:SetSize((C.nameplate.height * 2 * T.noscalemult), (C.nameplate.height * 2 * T.noscalemult))
self.QuestIcon:SetPoint("RIGHT", self.Health, "LEFT", -5, 0)
self.QuestIcon:Hide()
self.QuestIcon.Text = self:CreateFontString(nil, "OVERLAY")
self.QuestIcon.Text:SetPoint("RIGHT", self.QuestIcon, "LEFT", -1, 0)
self.QuestIcon.Text:SetFont(C.font.nameplates_font, C.font.nameplates_font_size * T.noscalemult * 2, C.font.nameplates_font_style)
self.QuestIcon.Text:SetShadowOffset(C.font.nameplates_font_shadow and 1 or 0, C.font.nameplates_font_shadow and -1 or 0)
self.QuestIcon.Item = self:CreateTexture(nil, "OVERLAY")
self.QuestIcon.Item:SetSize((C.nameplate.height * 2 * T.noscalemult) - 2, (C.nameplate.height * 2 * T.noscalemult) - 2)
self.QuestIcon.Item:SetPoint("RIGHT", self.QuestIcon.Text, "LEFT", -2, 0)
self.QuestIcon.Item:SetTexCoord(0.1, 0.9, 0.1, 0.9)
end
-- Aura tracking
if C.nameplate.track_debuffs == true or C.nameplate.track_buffs == true then
self.Auras = CreateFrame("Frame", nil, self)
self.Auras:SetPoint("BOTTOMRIGHT", self.Health, "TOPRIGHT", 0, C.font.nameplates_font_size + 7)
self.Auras.initialAnchor = "BOTTOMRIGHT"
self.Auras["growth-y"] = "UP"
self.Auras["growth-x"] = "LEFT"
self.Auras.numDebuffs = C.nameplate.track_debuffs and 6 or 0
self.Auras.numBuffs = C.nameplate.track_buffs and 4 or 0
self.Auras:SetSize(20 + C.nameplate.width, C.nameplate.auras_size)
self.Auras.spacing = 5 * T.noscalemult
self.Auras.size = C.nameplate.auras_size * T.noscalemult - 3
self.Auras.disableMouse = true
self.Auras.FilterAura = AurasCustomFilter
self.Auras.PostCreateButton = AurasPostCreateIcon
self.Auras.PostUpdateButton = AurasPostUpdateIcon
end
-- Health color
self.Health:RegisterEvent("PLAYER_REGEN_DISABLED")
self.Health:RegisterEvent("PLAYER_REGEN_ENABLED")
self.Health:RegisterEvent("UNIT_THREAT_SITUATION_UPDATE")
self.Health:RegisterEvent("UNIT_THREAT_LIST_UPDATE")
self.Health:SetScript("OnEvent", function()
threatColor(main)
end)
self.Health.PostUpdate = HealthPostUpdate
-- Absorb
if C.raidframe.plugins_healcomm == true then
local ahpb = self.Health:CreateTexture(nil, "ARTWORK")
ahpb:SetTexture(C.media.texture)
ahpb:SetVertexColor(1, 1, 0, 1)
self.HealthPrediction = {
absorbBar = ahpb
}
end
-- Every event should be register with this
table.insert(self.__elements, UpdateName)
self:RegisterEvent("UNIT_NAME_UPDATE", UpdateName)
table.insert(self.__elements, UpdateTarget)
self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTarget, true)
-- Disable movement via /moveui
self.disableMovement = true
if T.PostCreateNameplates then
T.PostCreateNameplates(self, unit)
end
end
oUF:RegisterStyle("ShestakNameplates", style)
oUF:SetActiveStyle("ShestakNameplates")
oUF:SpawnNamePlates("ShestakNameplates", callback)
================================================
FILE: ShestakUI/Modules/UnitFrames/RaidDPS.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.unitframe.enable ~= true then return end
----------------------------------------------------------------------------------------
-- UnitFrames based on oUF_Caellian(by Caellian)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
-- Party size
local party_width = C.raidframe.dps_party_width
local party_height = C.raidframe.dps_party_height + T.extraHeight
local party_power_height = C.raidframe.dps_party_power_height + C.unitframe.extra_power_height
local partytarget_width = party_height + 3
local partytarget_height = party_height
-- Raid size
local raid_width = C.raidframe.dps_raid_width
local raid_height = C.raidframe.dps_raid_height
local raid_power_height = C.raidframe.dps_raid_power_height
local tank_width = C.raidframe.heal_raid_width
local tank_height = C.raidframe.heal_raid_height
-- Create layout
local function Shared(self, unit)
local unit = (self:GetParent():GetName():match("oUF_PartyDPS")) and "party"
or (self:GetParent():GetName():match("oUF_RaidDPS")) and "raid"
or (self:GetParent():GetName():match("oUF_MainTank")) and "tank" or unit
local suffix = self:GetAttribute("unitsuffix")
-- Set our own colors
self.colors = T.oUF_colors
-- Register click
self:RegisterForClicks("AnyUp")
self:SetScript("OnEnter", UnitFrame_OnEnter)
self:SetScript("OnLeave", UnitFrame_OnLeave)
-- Backdrop for every units
self:CreateBackdrop("Default")
-- Health bar
self.Health = CreateFrame("StatusBar", nil, self)
self.Health:SetPoint("TOPLEFT", self, "TOPLEFT", 0, 0)
self.Health:SetPoint("TOPRIGHT", self, "TOPRIGHT", 0, 0)
if (suffix == "pet" or suffix == "target") and unit ~= "tank" then
self.Health:SetHeight(party_height)
elseif unit == "tank" then
self.Health:SetHeight(tank_height - 3)
elseif unit == "raid" then
self.Health:SetHeight(raid_height - raid_power_height - (raid_power_height > 0 and 1 or 0))
elseif unit == "party" then
self.Health:SetHeight(party_height - party_power_height - (party_power_height > 0 and 1 or 0))
else
self.Health:SetHeight(17)
end
self.Health:SetStatusBarTexture(C.media.texture)
self.Health.PostUpdate = function(health, unit)
if not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then
health:SetValue(0)
end
end
self.Health.colorTapping = true
self.Health.colorDisconnected = true
self.Health.colorClassPet = false
if C.unitframe.own_color == true then
self.Health.colorReaction = false
self.Health.colorClass = false
self.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))
else
self.Health.colorReaction = true
self.Health.colorClass = true
end
-- Health bar background
self.Health.bg = self.Health:CreateTexture(nil, "BORDER")
self.Health.bg:SetAllPoints(self.Health)
self.Health.bg:SetTexture(C.media.texture)
if C.unitframe.own_color == true then
self.Health.bg:SetVertexColor(unpack(C.unitframe.uf_color_bg))
else
self.Health.bg.multiplier = 0.2
end
if not (suffix == "pet" or (suffix == "target" and unit ~= "tank")) then
self.Health.value = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
if unit == "tank" then
self.Health.value:SetPoint("CENTER", self.Health, "CENTER", 0, -5)
else
self.Health.value:SetPoint("RIGHT", self.Health, "RIGHT", 1, 0)
end
self.Health.value:SetTextColor(1, 1, 1)
if unit == "raid" and C.raidframe.hide_health_value then
self.Health.value:SetAlpha(0)
end
self.Health.PostUpdate = T.PostUpdateRaidHealth
-- Power bar
self.Power = CreateFrame("StatusBar", nil, self)
if unit == "raid" then
self.Power:SetHeight(raid_power_height)
elseif unit == "party" then
self.Power:SetHeight(party_power_height)
else
self.Power:SetHeight(2)
end
self.Power:SetPoint("TOPLEFT", self.Health, "BOTTOMLEFT", 0, -1)
self.Power:SetPoint("TOPRIGHT", self.Health, "BOTTOMRIGHT", 0, -1)
self.Power:SetStatusBarTexture(C.media.texture)
self.Power.frequentUpdates = true
self.Power.colorDisconnected = true
if C.unitframe.own_color == true then
self.Power.colorClass = true
else
self.Power.colorPower = true
end
self.Power.PreUpdate = T.PreUpdatePower
self.Power.PostUpdate = T.PostUpdatePower
-- Power bar background
self.Power.bg = self.Power:CreateTexture(nil, "BORDER")
self.Power.bg:SetAllPoints(self.Power)
self.Power.bg:SetTexture(C.media.texture)
self.Power.bg:SetAlpha(1)
self.Power.bg.multiplier = 0.2
self.Power.value = T.SetFontString(self.Power, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
if not (suffix == "pet" or suffix == "target") and unit ~= "tank" then
self.Power.value:SetPoint("RIGHT", self.Power, "RIGHT", 0, 0)
self.Power.value:SetJustifyH("RIGHT")
end
end
-- Names
self.Info = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
if (suffix == "pet" or suffix == "target") and unit ~= "tank" then
self.Info:SetPoint("CENTER", self.Health, "CENTER", 2, 0)
elseif unit == "tank" then
self.Info:SetPoint("CENTER", self.Health, "CENTER", 0, 4)
else
self.Info:SetPoint("LEFT", self.Health, "LEFT", 3, 0)
self.Info:SetPoint("RIGHT", self.Health.value, "LEFT", 0, 0)
self.Info:SetJustifyH("LEFT")
end
if suffix == "pet" or (suffix == "target" and unit ~= "tank") then
self:Tag(self.Info, "[GetNameColor][NameArena]")
else
if unit == "party" and C.raidframe.icons_role ~= true then
self:Tag(self.Info, "[LFD] [GetNameColor][NameShort]")
else
self:Tag(self.Info, "[GetNameColor][NameShort]")
end
end
-- LFD role icons
if C.raidframe.icons_role == true and not (suffix == "pet" or suffix == "target") then
self.GroupRoleIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.GroupRoleIndicator:SetSize(12, 12)
self.GroupRoleIndicator:SetPoint("TOPRIGHT", self.Health, 2, 5)
end
-- Leader/Assistant icons
if C.raidframe.icons_leader == true and not (suffix == "target") then
-- Leader icon
self.LeaderIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.LeaderIndicator:SetSize(12, 12)
self.LeaderIndicator:SetPoint("TOPLEFT", self.Health, -3, 8)
-- Assistant icon
self.AssistantIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.AssistantIndicator:SetSize(12, 12)
self.AssistantIndicator:SetPoint("TOPLEFT", self.Health, -3, 8)
end
-- Aggro border
if C.raidframe.aggro_border == true then
self.ThreatIndicator = CreateFrame("Frame", nil, self)
self.ThreatIndicator.PostUpdate = T.UpdateThreat
end
-- Raid marks
if C.raidframe.icons_raid_mark == true then
self.RaidTargetIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.RaidTargetIndicator:SetSize(12, 12)
self.RaidTargetIndicator:SetPoint("CENTER", self.Health, "TOP")
end
-- Ready check icons
if C.raidframe.icons_ready_check == true and not (suffix == "target") then
self.ReadyCheckIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.ReadyCheckIndicator:SetSize(12, 12)
self.ReadyCheckIndicator:SetPoint("BOTTOMRIGHT", self.Health, 2, -1)
end
-- Phase icons
if C.raidframe.icons_phase == true and not (suffix == "target") then
self.PhaseIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.PhaseIndicator:SetSize(18, 18)
self.PhaseIndicator:SetPoint("BOTTOMLEFT", self.Health, -5, -10)
end
-- Summon icons
if C.raidframe.icons_sumon == true and not (suffix == "target") then
self.SummonIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.SummonIndicator:SetSize(24, 24)
self.SummonIndicator:SetPoint("BOTTOMRIGHT", self.Health, 6, -5)
end
if unit == "party" and (not (suffix == "target")) and (not (suffix == "pet")) then
self.Debuffs = CreateFrame("Frame", self:GetName().."Debuffs", self)
self.Debuffs:SetPoint("TOPLEFT", self, "BOTTOMLEFT", -2, -5)
self.Debuffs:SetHeight(18)
self.Debuffs:SetWidth(144)
self.Debuffs.size = T.Scale(18)
self.Debuffs.spacing = T.Scale(3)
self.Debuffs.initialAnchor = "LEFT"
self.Debuffs.num = 7
self.Debuffs["growth-y"] = "DOWN"
self.Debuffs["growth-x"] = "RIGHT"
self.Debuffs.PostCreateButton = T.PostCreateIcon
self.Debuffs.PostUpdateButton = T.PostUpdateIcon
end
-- Debuff highlight
self.DebuffHighlight = self.Health:CreateTexture(nil, "OVERLAY")
self.DebuffHighlight:SetAllPoints(self.Health)
self.DebuffHighlight:SetTexture(C.media.highlight)
self.DebuffHighlight:SetVertexColor(0, 0, 0, 0)
self.DebuffHighlight:SetBlendMode("ADD")
self.DebuffHighlightAlpha = 1
self.DebuffHighlightFilter = true
-- Incoming heals and heal/damage absorbs
if C.raidframe.plugins_healcomm == true then
T.CreateHealthPrediction(self)
end
-- Range alpha
if C.raidframe.show_range == true and (not (suffix == "target")) then
self.Range = {insideAlpha = 1, outsideAlpha = C.raidframe.range_alpha}
end
-- Smooth bars
if C.unitframe.plugins_smooth_bar == true then
self.Health.Smooth = true
if not (suffix == "pet" or suffix == "target") then
self.Power.Smooth = true
end
end
if T.PostCreateDPSRaidFrames then
T.PostCreateDPSRaidFrames(self, unit)
end
return self
end
----------------------------------------------------------------------------------------
-- Default position of ShestakUI unitframes
----------------------------------------------------------------------------------------
oUF:Factory(function(self)
if C.raidframe.layout ~= "DPS" and C.raidframe.layout ~= "AUTO" then return end
oUF:RegisterStyle("ShestakDPS", Shared)
oUF:SetActiveStyle("ShestakDPS")
if C.raidframe.show_party == true then
-- Party
local party = self:SpawnHeader("oUF_PartyDPS", nil, "custom [@raid6,exists] hide;show",
"oUF-initialConfigFunction", [[
local header = self:GetParent()
self:SetWidth(header:GetAttribute("initial-width"))
self:SetHeight(header:GetAttribute("initial-height"))
]],
"initial-width", T.Scale(party_width),
"initial-height", T.Scale(party_height),
"showSolo", C.raidframe.solo_mode,
"showPlayer", C.raidframe.player_in_party,
"groupBy", C.raidframe.by_role and "ASSIGNEDROLE",
"groupingOrder", C.raidframe.by_role and "TANK,HEALER,DAMAGER,NONE",
"sortMethod", C.raidframe.by_role and "NAME",
"showParty", true,
"showRaid", true,
"yOffset", T.Scale(28),
"point", "BOTTOM"
)
_G["PartyDPSAnchor"]:SetSize(T.Scale(party_width), T.Scale(party_height) * 5 + T.Scale(28) * 4)
party:SetPoint("BOTTOMLEFT", _G["PartyDPSAnchor"])
-- Party targets
if C.raidframe.show_target then
local partytarget = self:SpawnHeader("oUF_PartyTargetDPS", nil, "custom [@raid6,exists] hide;show",
"oUF-initialConfigFunction", [[
local header = self:GetParent()
self:SetWidth(header:GetAttribute("initial-width"))
self:SetHeight(header:GetAttribute("initial-height"))
self:SetAttribute("unitsuffix", "target")
]],
"initial-width", T.Scale(partytarget_width),
"initial-height", T.Scale(partytarget_height),
"showSolo", C.raidframe.solo_mode,
"showPlayer", C.raidframe.player_in_party,
"groupBy", C.raidframe.by_role and "ASSIGNEDROLE",
"groupingOrder", C.raidframe.by_role and "TANK,HEALER,DAMAGER,NONE",
"sortMethod", C.raidframe.by_role and "NAME",
"showParty", true,
"showRaid", true,
"yOffset", T.Scale(28),
"point", "BOTTOM"
)
_G["PartyTargetDPSAnchor"]:SetSize(T.Scale(partytarget_width), T.Scale(partytarget_height) * 5 + T.Scale(28) * 4)
partytarget:SetPoint("BOTTOMLEFT", _G["PartyTargetDPSAnchor"])
end
-- Party pets
if C.raidframe.show_pet then
local partypet = self:SpawnHeader("oUF_PartyPetDPS", nil, "custom [@raid6,exists] hide;show",
"oUF-initialConfigFunction", [[
local header = self:GetParent()
self:SetWidth(header:GetAttribute("initial-width"))
self:SetHeight(header:GetAttribute("initial-height"))
self:SetAttribute("useOwnerUnit", "true")
self:SetAttribute("unitsuffix", "pet")
]],
"initial-width", T.Scale(partytarget_width),
"initial-height", T.Scale(partytarget_height),
"showSolo", C.raidframe.solo_mode,
"showPlayer", C.raidframe.player_in_party,
"groupBy", C.raidframe.by_role and "ASSIGNEDROLE",
"groupingOrder", C.raidframe.by_role and "TANK,HEALER,DAMAGER,NONE",
"sortMethod", C.raidframe.by_role and "NAME",
"showParty", true,
"showRaid", true,
"yOffset", T.Scale(28),
"point", "BOTTOM"
)
_G["PartyPetDPSAnchor"]:SetSize(T.Scale(partytarget_width), T.Scale(partytarget_height) * 5 + T.Scale(28) * 4)
partypet:SetPoint("BOTTOMLEFT", _G["PartyPetDPSAnchor"])
end
end
if C.raidframe.show_raid == true then
-- Raid
local raid = {}
for i = 1, C.raidframe.raid_groups do
local raidgroup = self:SpawnHeader("oUF_RaidDPS"..i, nil, "custom [@raid6,exists] show;hide",
"oUF-initialConfigFunction", [[
local header = self:GetParent()
self:SetWidth(header:GetAttribute("initial-width"))
self:SetHeight(header:GetAttribute("initial-height"))
]],
"initial-width", T.Scale(raid_width),
"initial-height", T.Scale(raid_height),
"showRaid", true,
"yOffset", T.Scale(-7),
"point", "TOPLEFT",
"groupFilter", tostring(i),
"groupBy", C.raidframe.by_role and "ASSIGNEDROLE",
"groupingOrder", C.raidframe.by_role and "TANK,HEALER,DAMAGER,NONE",
"sortMethod", C.raidframe.by_role and "NAME",
"maxColumns", 5,
"unitsPerColumn", 1,
"columnSpacing", T.Scale(7),
"columnAnchorPoint", "TOP"
)
if i == 1 then
_G["RaidDPSAnchor"..i]:SetPoint(unpack(C.position.unitframes.raid_dps))
raidgroup:SetPoint("TOPLEFT", _G["RaidDPSAnchor"..i])
elseif i == 5 then
_G["RaidDPSAnchor"..i]:SetPoint("TOPLEFT", _G["RaidDPSAnchor1"], "TOPRIGHT", 7, 0)
raidgroup:SetPoint("TOPLEFT", _G["RaidDPSAnchor"..i])
else
_G["RaidDPSAnchor"..i]:SetPoint("TOPLEFT", _G["RaidDPSAnchor"..i-1], "BOTTOMLEFT", 0, -7)
raidgroup:SetPoint("TOPLEFT", _G["RaidDPSAnchor"..i])
end
raid[i] = raidgroup
end
end
if C.raidframe.raid_tanks == true then
-- Tanks
local raidtank = self:SpawnHeader("oUF_MainTankDPS", nil, "raid",
"oUF-initialConfigFunction", ([[
self:SetWidth(%d)
self:SetHeight(%d)
]]):format(tank_width, tank_height),
"showRaid", true,
"yOffset", T.Scale(-7),
"groupFilter", "MAINTANK",
"template", C.raidframe.raid_tanks_tt and "oUF_MainTankTT" or "oUF_MainTank"
)
_G["RaidTankDPSAnchor"]:SetSize(tank_width, tank_height)
raidtank:SetPoint("BOTTOMLEFT", _G["RaidTankDPSAnchor"])
end
end)
-- Create anchors
for i = 1, C.raidframe.raid_groups do
local raid = CreateFrame("Frame", "RaidDPSAnchor"..i, UIParent)
raid:SetSize(raid_width, T.Scale(raid_height) * 5 + T.Scale(7) * 4)
end
local party = CreateFrame("Frame", "PartyDPSAnchor", UIParent)
party:SetPoint(unpack(C.position.unitframes.party_dps))
local party_target = CreateFrame("Frame", "PartyTargetDPSAnchor", UIParent)
party_target:SetPoint("TOPLEFT", party, "TOPRIGHT", 7, 0)
local party_pet = CreateFrame("Frame", "PartyPetDPSAnchor", UIParent)
party_pet:SetPoint("BOTTOMLEFT", party, "BOTTOMRIGHT", partytarget_width + 14, 0)
local raidtank = CreateFrame("Frame", "RaidTankDPSAnchor", UIParent)
if C.threat.enable then
raidtank:SetPoint(C.position.unitframes.tank[1], C.position.unitframes.tank[2], C.position.unitframes.tank[3], C.position.unitframes.tank[4] + C.threat.width + 6, C.position.unitframes.tank[5])
else
if C.actionbar.split_bars then
raidtank:SetPoint(C.position.unitframes.tank[1], SplitBarRight, C.position.unitframes.tank[3], C.position.unitframes.tank[4], C.position.unitframes.tank[5])
else
raidtank:SetPoint(unpack(C.position.unitframes.tank))
end
end
----------------------------------------------------------------------------------------
-- Auto change raid frame layout
----------------------------------------------------------------------------------------
if C.raidframe.layout == "AUTO" then
local function CheckSpec(self, event, unit)
if T.IsHealerSpec() then
-- Disable DPS
for _, party in pairs({oUF_PartyDPS, oUF_PartyTargetDPS, oUF_PartyPetDPS}) do
party:SetAttribute("showSolo", false)
party:SetAttribute("showParty", false)
party:SetAttribute("showRaid", false)
end
for i = 1, C.raidframe.raid_groups do
if _G["oUF_RaidDPS"..i] then
_G["oUF_RaidDPS"..i]:SetAttribute("showRaid", false)
end
end
if oUF_MainTankDPS then
oUF_MainTankDPS:SetAttribute("showRaid", false)
end
-- Enable Heal
for _, party in pairs({oUF_Party, oUF_PartyTarget, oUF_PartyPet}) do
party:SetAttribute("showSolo", C.raidframe.solo_mode)
party:SetAttribute("showParty", true)
party:SetAttribute("showRaid", true)
end
for i = 1, C.raidframe.raid_groups do
if _G["oUF_RaidHeal"..i] then
_G["oUF_RaidHeal"..i]:SetAttribute("showRaid", true)
end
end
if oUF_MainTank then
oUF_MainTank:SetAttribute("showRaid", true)
end
else
-- Enable DPS
for _, party in pairs({oUF_PartyDPS, oUF_PartyTargetDPS, oUF_PartyPetDPS}) do
party:SetAttribute("showSolo", C.raidframe.solo_mode)
party:SetAttribute("showParty", true)
party:SetAttribute("showRaid", true)
end
for i = 1, C.raidframe.raid_groups do
if _G["oUF_RaidDPS"..i] then
_G["oUF_RaidDPS"..i]:SetAttribute("showRaid", true)
end
end
if oUF_MainTankDPS then
oUF_MainTankDPS:SetAttribute("showRaid", true)
end
-- Disable Heal
for _, party in pairs({oUF_Party, oUF_PartyTarget, oUF_PartyPet}) do
party:SetAttribute("showSolo", false)
party:SetAttribute("showParty", false)
party:SetAttribute("showRaid", false)
end
for i = 1, C.raidframe.raid_groups do
if _G["oUF_RaidHeal"..i] then
_G["oUF_RaidHeal"..i]:SetAttribute("showRaid", false)
end
end
if oUF_MainTank then
oUF_MainTank:SetAttribute("showRaid", false)
end
end
self:UnregisterEvent("PLAYER_ENTERING_WORLD")
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterUnitEvent("PLAYER_SPECIALIZATION_CHANGED", "player")
frame:SetScript("OnEvent", CheckSpec)
end
----------------------------------------------------------------------------------------
-- Test RaidFrames
----------------------------------------------------------------------------------------
do
local frames = {}
local moving = false
SlashCmdList.TEST_RAID_DPS = function()
if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end
if not moving then
oUF_RaidDPS1:Show()
local raid = {}
local raid_j = {}
if #frames == 0 then
for j = 1, C.raidframe.raid_groups do
for i = 1, 5 do
local frame = CreateFrame("Frame", nil, UIParent)
frame:SetSize(raid_width, raid_height)
if j == 1 then
if i == 1 then
frame:SetPoint("TOPLEFT", oUF_RaidDPS1, "TOPLEFT", 0, 0)
else
frame:SetPoint("TOP", raid[i-1], "BOTTOM", 0, -7)
end
elseif j == 5 then
if i == 1 then
frame:SetPoint("TOPLEFT", oUF_RaidDPS1, "TOPRIGHT", 7, 0)
else
frame:SetPoint("TOP", raid[i-1], "BOTTOM", 0, -7)
end
else
if i == 1 then
frame:SetPoint("TOPLEFT", raid_j[j-1], "BOTTOMLEFT", 0, -7)
else
frame:SetPoint("TOP", raid[i-1], "BOTTOM", 0, -7)
end
end
if i == 5 then
raid_j[j] = frame
end
frame:CreateBackdrop("Overlay")
frame.backdrop.overlay:SetVertexColor(0.1, 0.9 - (j * 0.08) , 0.1)
raid[i] = frame
table.insert(frames, frame)
end
end
else
for _, frame in pairs(frames) do
frame:Show()
end
end
moving = true
else
for _, frame in pairs(frames) do
frame:Hide()
end
moving = false
end
end
SLASH_TEST_RAID_DPS1 = "/testraiddps"
SLASH_TEST_RAID_DPS2 = "/еуыекфшввзы"
SLASH_TEST_RAID_DPS3 = "/raiddpstest"
SLASH_TEST_RAID_DPS4 = "/кфшввзыеуые"
end
================================================
FILE: ShestakUI/Modules/UnitFrames/RaidHeal.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.unitframe.enable ~= true then return end
----------------------------------------------------------------------------------------
-- UnitFrames based on oUF_Caellian(by Caellian)
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
-- Party size
local party_width = C.raidframe.heal_party_width
local party_height = C.raidframe.heal_party_height
local party_power_height = C.raidframe.heal_party_power_height
C.raidframe.icon_multiplier = C.raidframe.heal_party_height / 26
-- Raid size
local raid_width = C.raidframe.heal_raid_width
local raid_height = C.raidframe.heal_raid_height
local raid_power_height = C.raidframe.heal_raid_power_height
-- Create layout
local function Shared(self, unit)
local unit = (self:GetParent():GetName():match("oUF_Party")) and "party"
or (self:GetParent():GetName():match("oUF_RaidHeal")) and "raid"
or (self:GetParent():GetName():match("oUF_MainTank")) and "tank" or unit
local suffix = self:GetAttribute("unitsuffix")
if unit == "party" then
C.raidframe.icon_multiplier = C.raidframe.heal_party_height / 26
elseif unit == "raid" then
C.raidframe.icon_multiplier = C.raidframe.heal_raid_height / 26
end
-- Set our own colors
self.colors = T.oUF_colors
-- Register click
self:RegisterForClicks("AnyUp")
self:SetScript("OnEnter", UnitFrame_OnEnter)
self:SetScript("OnLeave", UnitFrame_OnLeave)
-- Backdrop for every units
self:CreateBackdrop("Default")
-- Health bar
self.Health = CreateFrame("StatusBar", nil, self)
self.Health:SetPoint("TOPLEFT")
self.Health:SetPoint("TOPRIGHT")
if (suffix == "pet" or suffix == "target") and unit ~= "tank" then
self.Health:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 0, 0)
self.Health:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, 0)
elseif unit == "party" then
self.Health:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 0, party_power_height > 0 and party_power_height + 1 or 0)
self.Health:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, party_power_height > 0 and party_power_height + 1 or 0)
else
self.Health:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 0, raid_power_height > 0 and raid_power_height + 1 or 0)
self.Health:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, raid_power_height > 0 and raid_power_height + 1 or 0)
end
self.Health:SetStatusBarTexture(C.media.texture)
if C.raidframe.vertical_health == true then
self.Health:SetOrientation("VERTICAL")
end
self.Health.PostUpdate = function(health, unit)
if not UnitIsConnected(unit) or UnitIsDead(unit) or UnitIsGhost(unit) then
health:SetValue(0)
end
end
if C.unitframe.own_color == true then
self.Health.colorDisconnected = false
self.Health.colorReaction = false
self.Health.colorClass = false
self.Health:SetStatusBarColor(unpack(C.unitframe.uf_color))
else
self.Health.colorDisconnected = true
self.Health.colorReaction = true
self.Health.colorClass = true
end
-- Health bar background
self.Health.bg = self.Health:CreateTexture(nil, "BORDER")
self.Health.bg:SetAllPoints(self.Health)
self.Health.bg:SetTexture(C.media.texture)
if C.unitframe.own_color == true then
self.Health.bg:SetVertexColor(unpack(C.unitframe.uf_color_bg))
else
self.Health.bg.multiplier = 0.2
end
-- Names
self.Info = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Info:SetWordWrap(false)
if (suffix == "pet" or suffix == "target") and unit ~= "tank" then
self.Info:SetPoint("LEFT", self.Health, "LEFT", 0, 0)
self.Info:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
elseif unit == "party" then
if C.raidframe.hide_health_value then
self.Info:SetPoint("LEFT", self.Health, "LEFT", 0, 0)
self.Info:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
else
local center = (party_height - (C.font.unit_frames_font_size * 2 + 2)) / 2
self.Info:SetPoint("TOPLEFT", self.Health, "TOPLEFT", 0, -center)
self.Info:SetPoint("TOPRIGHT", self.Health, "TOPRIGHT", 0, -center)
end
else
if C.raidframe.hide_health_value then
self.Info:SetPoint("LEFT", self.Health, "LEFT", 0, 0)
self.Info:SetPoint("RIGHT", self.Health, "RIGHT", 0, 0)
else
local center = (raid_height - (C.font.unit_frames_font_size * 2 + 2)) / 2
self.Info:SetPoint("TOPLEFT", self.Health, "TOPLEFT", 0, -center)
self.Info:SetPoint("TOPRIGHT", self.Health, "TOPRIGHT", 0, -center)
end
end
self:Tag(self.Info, "[GetNameColor][NameShort]")
if not (suffix == "pet" or (suffix == "target" and unit ~= "tank")) then
self.Health.value = T.SetFontString(self.Health, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.Health.value:SetPoint("TOP", self.Info, "BOTTOM", 0, -1)
self.Health.value:SetTextColor(1, 1, 1)
if C.raidframe.hide_health_value then
self.Health.value:SetAlpha(0)
end
self.Health.PostUpdate = T.PostUpdateRaidHealth
-- Power bar
self.Power = CreateFrame("StatusBar", nil, self)
self.Power:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 0, 0)
self.Power:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, 0)
self.Power:SetPoint("TOP", self, "BOTTOM", 0, unit == "party" and party_power_height or raid_power_height)
self.Power:SetStatusBarTexture(C.media.texture)
self.Power.PostUpdate = function(power, unit)
if not UnitIsConnected(unit) or UnitIsDeadOrGhost(unit) then
power:SetValue(0)
end
end
self.Power.frequentUpdates = true
self.Power.colorDisconnected = true
if C.unitframe.own_color == true then
self.Power.colorClass = true
else
self.Power.colorPower = true
end
-- Power bar background
self.Power.bg = self.Power:CreateTexture(nil, "BORDER")
self.Power.bg:SetAllPoints(self.Power)
self.Power.bg:SetTexture(C.media.texture)
self.Power.bg:SetAlpha(1)
self.Power.bg.multiplier = 0.2
end
-- Aggro border
if C.raidframe.aggro_border == true then
self.ThreatIndicator = CreateFrame("Frame", nil, self)
self.ThreatIndicator.PostUpdate = T.UpdateThreat
end
-- Raid marks
if C.raidframe.icons_raid_mark == true then
self.RaidTargetIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.RaidTargetIndicator:SetSize(12 * C.raidframe.icon_multiplier, 12 * C.raidframe.icon_multiplier)
self.RaidTargetIndicator:SetPoint("BOTTOMLEFT", self.Health, -2, -5)
end
-- LFD role icons
if C.raidframe.icons_role == true and not (suffix == "target") then
self.GroupRoleIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.GroupRoleIndicator:SetSize(10 * C.raidframe.icon_multiplier, 10 * C.raidframe.icon_multiplier)
self.GroupRoleIndicator:SetPoint("TOP", self.Health, 0, 6)
end
-- Ready check icons
if C.raidframe.icons_ready_check == true and not (suffix == "target" or suffix == "targettarget") then
self.ReadyCheckIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.ReadyCheckIndicator:SetSize(12 * C.raidframe.icon_multiplier, 12 * C.raidframe.icon_multiplier)
self.ReadyCheckIndicator:SetPoint("BOTTOMRIGHT", self.Health, 2, 1)
end
-- Summon icons
if C.raidframe.icons_sumon == true and not (suffix == "target" or suffix == "targettarget") then
self.SummonIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.SummonIndicator:SetSize(24 * C.raidframe.icon_multiplier, 24 * C.raidframe.icon_multiplier)
self.SummonIndicator:SetPoint("BOTTOMRIGHT", self.Health, 7, -11)
end
-- Phase icons
if C.raidframe.icons_phase == true and not (suffix == "target" or suffix == "targettarget") then
self.PhaseIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.PhaseIndicator:SetSize(20 * C.raidframe.icon_multiplier, 20 * C.raidframe.icon_multiplier)
self.PhaseIndicator:SetPoint("TOPRIGHT", self.Health, 5, 5)
end
-- Leader/Assistant icons
if C.raidframe.icons_leader == true and not (suffix == "target" or suffix == "targettarget") then
-- Leader icon
self.LeaderIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.LeaderIndicator:SetSize(12 * C.raidframe.icon_multiplier, 12 * C.raidframe.icon_multiplier)
self.LeaderIndicator:SetPoint("TOPLEFT", self.Health, -3, 8)
-- Assistant icon
self.AssistantIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.AssistantIndicator:SetSize(12 * C.raidframe.icon_multiplier, 12 * C.raidframe.icon_multiplier)
self.AssistantIndicator:SetPoint("TOPLEFT", self.Health, -3, 8)
end
-- Resurrect icon
if not (suffix == "target" or suffix == "targettarget") then
self.ResurrectIndicator = self.Health:CreateTexture(nil, "OVERLAY")
self.ResurrectIndicator:SetSize(13 * C.raidframe.icon_multiplier, 13 * C.raidframe.icon_multiplier)
self.ResurrectIndicator:SetPoint("BOTTOMRIGHT", self.Health, 2, -7)
end
-- Debuff highlight
if not (suffix == "target" or suffix == "targettarget") then
self.DebuffHighlight = self.Health:CreateTexture(nil, "OVERLAY")
self.DebuffHighlight:SetAllPoints(self.Health)
self.DebuffHighlight:SetTexture(C.media.highlight)
self.DebuffHighlight:SetVertexColor(0, 0, 0, 0)
self.DebuffHighlight:SetBlendMode("ADD")
self.DebuffHighlightAlpha = 1
self.DebuffHighlightFilter = true
end
-- Incoming heals and heal/damage absorbs
if C.raidframe.plugins_healcomm == true then
T.CreateHealthPrediction(self)
end
-- Range alpha
if C.raidframe.show_range == true and not (suffix == "target" or suffix == "targettarget") then
self.Range = {insideAlpha = 1, outsideAlpha = C.raidframe.range_alpha}
end
-- Smooth bars
if C.unitframe.plugins_smooth_bar == true then
self.Health.Smooth = true
if not (suffix == "pet" or suffix == "target") then
self.Power.Smooth = true
end
end
if C.raidframe.plugins_aura_watch == true and not (suffix == "pet" or suffix == "target" or suffix == "targettarget") then
-- Classbuffs
T.CreateAuraWatch(self, unit)
-- Raid debuffs
self.RaidDebuffs = CreateFrame("Frame", nil, self)
self.RaidDebuffs:SetSize(19, 19)
self.RaidDebuffs:SetPoint("CENTER", self, 0, 1)
self.RaidDebuffs:SetFrameStrata("MEDIUM")
self.RaidDebuffs:SetFrameLevel(10)
self.RaidDebuffs:SetTemplate("Default")
self.RaidDebuffs.icon = self.RaidDebuffs:CreateTexture(nil, "BORDER")
self.RaidDebuffs.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
self.RaidDebuffs.icon:SetPoint("TOPLEFT", 2, -2)
self.RaidDebuffs.icon:SetPoint("BOTTOMRIGHT", -2, 2)
if C.raidframe.plugins_aura_watch_timer == true then
self.RaidDebuffs.time = T.SetFontString(self.RaidDebuffs, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.RaidDebuffs.time:SetPoint("CENTER", 1, 1)
self.RaidDebuffs.time:SetTextColor(1, 1, 1)
end
self.RaidDebuffs.count = T.SetFontString(self.RaidDebuffs, C.font.unit_frames_font, C.font.unit_frames_font_size, C.font.unit_frames_font_style)
self.RaidDebuffs.count:SetPoint("BOTTOMRIGHT", self.RaidDebuffs, "BOTTOMRIGHT", 3, -1)
self.RaidDebuffs.count:SetTextColor(1, 1, 1)
if C.aura.show_spiral == true then
self.RaidDebuffs.cd = CreateFrame("Cooldown", nil, self.RaidDebuffs, "CooldownFrameTemplate")
self.RaidDebuffs.cd:SetPoint("TOPLEFT", 2, -2)
self.RaidDebuffs.cd:SetPoint("BOTTOMRIGHT", -2, 2)
self.RaidDebuffs.cd:SetReverse(true)
self.RaidDebuffs.cd:SetDrawEdge(false)
self.RaidDebuffs.cd.noCooldownCount = true
self.RaidDebuffs.parent = CreateFrame("Frame", nil, self.RaidDebuffs)
self.RaidDebuffs.parent:SetFrameLevel(self.RaidDebuffs.cd:GetFrameLevel() + 1)
if C.raidframe.plugins_aura_watch_timer == true then
self.RaidDebuffs.time:SetParent(self.RaidDebuffs.parent)
end
self.RaidDebuffs.count:SetParent(self.RaidDebuffs.parent)
end
self.RaidDebuffs.ShowDispellableDebuff = C.raidframe.plugins_debuffhighlight_icon
self.RaidDebuffs.FilterDispellableDebuff = true
self.RaidDebuffs.MatchBySpellName = true
end
if T.PostCreateHealRaidFrames then
T.PostCreateHealRaidFrames(self, unit)
end
return self
end
----------------------------------------------------------------------------------------
-- Default position of ShestakUI unitframes
----------------------------------------------------------------------------------------
oUF:Factory(function(self)
if C.raidframe.layout ~= "HEAL" and C.raidframe.layout ~= "AUTO" then return end
oUF:RegisterStyle("ShestakHeal", Shared)
oUF:SetActiveStyle("ShestakHeal")
if C.raidframe.show_party == true then
local party = self:SpawnHeader("oUF_Party", nil, "custom [@raid6,exists] hide;show",
"oUF-initialConfigFunction", [[
local header = self:GetParent()
self:SetWidth(header:GetAttribute("initial-width"))
self:SetHeight(header:GetAttribute("initial-height"))
]],
"initial-width", party_width,
"initial-height", T.Scale(party_height),
"showSolo", C.raidframe.solo_mode,
"showPlayer", C.raidframe.player_in_party,
"groupBy", C.raidframe.by_role and "ASSIGNEDROLE",
"groupingOrder", C.raidframe.by_role and "TANK,HEALER,DAMAGER,NONE",
"sortMethod", C.raidframe.by_role and "NAME",
"showParty", true,
"showRaid", true,
"xOffset", not C.raidframe.party_vertical and T.Scale(7),
"yOffset", C.raidframe.party_vertical and T.Scale(-7),
"point", C.raidframe.party_vertical and "TOP" or "LEFT"
)
party:SetPoint("TOPLEFT", _G["PartyAnchor"])
if C.raidframe.party_vertical then
_G["PartyAnchor"]:SetSize(party_width, party_height * 5 + T.Scale(7) * 4)
else
_G["PartyAnchor"]:SetSize(party_width * 5 + T.Scale(7) * 4, party_height)
end
-- Party targets
if C.raidframe.show_target then
local partytarget = self:SpawnHeader("oUF_PartyTarget", nil, "custom [@raid6,exists] hide;show",
"oUF-initialConfigFunction", [[
local header = self:GetParent()
self:SetWidth(header:GetAttribute("initial-width"))
self:SetHeight(header:GetAttribute("initial-height"))
self:SetAttribute("unitsuffix", "target")
]],
"initial-width", C.raidframe.party_vertical and T.Scale(party_height) or party_width,
"initial-height", C.raidframe.party_vertical and T.Scale(party_height) or T.Scale(party_height / 2),
"showSolo", C.raidframe.solo_mode,
"showPlayer", C.raidframe.player_in_party,
"groupBy", C.raidframe.by_role and "ASSIGNEDROLE",
"groupingOrder", C.raidframe.by_role and "TANK,HEALER,DAMAGER,NONE",
"sortMethod", C.raidframe.by_role and "NAME",
"showParty", true,
"showRaid", true,
"xOffset", not C.raidframe.party_vertical and T.Scale(7),
"yOffset", C.raidframe.party_vertical and T.Scale(-7),
"point", C.raidframe.party_vertical and "TOP" or "LEFT"
)
partytarget:SetPoint("TOPLEFT", _G["PartyTargetAnchor"])
if C.raidframe.party_vertical then
_G["PartyTargetAnchor"]:SetSize(T.Scale(party_height), T.Scale(party_height) * 5 + T.Scale(7) * 4)
_G["PartyTargetAnchor"]:SetPoint("TOPLEFT", party, "TOPRIGHT", 7, 0)
else
_G["PartyTargetAnchor"]:SetSize(party_width * 5 + T.Scale(7) * 4, T.Scale(party_height / 2))
end
end
-- Party pets
if C.raidframe.show_pet then
local partypet = self:SpawnHeader("oUF_PartyPet", nil, "custom [@raid6,exists] hide;show",
"oUF-initialConfigFunction", [[
local header = self:GetParent()
self:SetWidth(header:GetAttribute("initial-width"))
self:SetHeight(header:GetAttribute("initial-height"))
self:SetAttribute("useOwnerUnit", "true")
self:SetAttribute("unitsuffix", "pet")
]],
"initial-width", C.raidframe.party_vertical and T.Scale(party_height) or party_width,
"initial-height", C.raidframe.party_vertical and T.Scale(party_height) or T.Scale(party_height / 2),
"showSolo", C.raidframe.solo_mode,
"showPlayer", C.raidframe.player_in_party,
"groupBy", C.raidframe.by_role and "ASSIGNEDROLE",
"groupingOrder", C.raidframe.by_role and "TANK,HEALER,DAMAGER,NONE",
"sortMethod", C.raidframe.by_role and "NAME",
"showParty", true,
"showRaid", true,
"xOffset", not C.raidframe.party_vertical and T.Scale(7),
"yOffset", C.raidframe.party_vertical and T.Scale(-7),
"point", C.raidframe.party_vertical and "TOP" or "LEFT"
)
partypet:SetPoint("TOPLEFT", _G["PartyPetAnchor"])
if C.raidframe.party_vertical then
_G["PartyPetAnchor"]:SetSize(T.Scale(party_height), T.Scale(party_height) * 5 + T.Scale(7) * 4)
_G["PartyPetAnchor"]:SetPoint("TOPLEFT", party, "TOPRIGHT", T.Scale(party_height) + 14.5, 0)
else
_G["PartyPetAnchor"]:SetSize(party_width * 5 + T.Scale(7) * 4, T.Scale(party_height / 2))
end
end
end
if C.raidframe.show_raid == true then
local raid = {}
for i = 1, C.raidframe.raid_groups do
local raidgroup = self:SpawnHeader("oUF_RaidHeal"..i, nil, "custom [@raid6,exists] show;hide",
"oUF-initialConfigFunction", [[
local header = self:GetParent()
self:SetWidth(header:GetAttribute("initial-width"))
self:SetHeight(header:GetAttribute("initial-height"))
]],
"initial-width", raid_width,
"initial-height", T.Scale(raid_height),
"showRaid", true,
"groupFilter", tostring(i),
"groupBy", C.raidframe.by_role and "ASSIGNEDROLE",
"groupingOrder", C.raidframe.by_role and "TANK,HEALER,DAMAGER,NONE",
"sortMethod", C.raidframe.by_role and "NAME",
"maxColumns", 5,
"unitsPerColumn", 1,
"columnSpacing", T.Scale(7),
"yOffset", C.raidframe.raid_groups_vertical and T.Scale(-5),
"point", C.raidframe.raid_groups_vertical and "TOPLEFT" or "LEFT",
"columnAnchorPoint", C.raidframe.raid_groups_vertical and "TOP" or "LEFT"
)
raidgroup:SetPoint("TOPLEFT", _G["RaidAnchor"..i])
if C.raidframe.raid_groups_vertical then
_G["RaidAnchor"..i]:SetSize(raid_width, T.Scale(raid_height) * 5 + T.Scale(7) * 4)
if i == 1 then
_G["RaidAnchor"..i]:SetPoint(unpack(C.position.unitframes.raid_heal))
else
_G["RaidAnchor"..i]:SetPoint("TOPLEFT", _G["RaidAnchor"..i-1], "TOPRIGHT", 7, 0)
end
else
_G["RaidAnchor"..i]:SetSize(raid_width * 5 + T.Scale(7) * 4, T.Scale(raid_height))
if i == 1 then
_G["RaidAnchor"..i]:SetPoint(unpack(C.position.unitframes.raid_heal))
else
_G["RaidAnchor"..i]:SetPoint("TOPLEFT", _G["RaidAnchor"..i-1], "BOTTOMLEFT", 0, -7)
end
end
raid[i] = raidgroup
end
if C.raidframe.raid_tanks == true then
-- Tanks
local raidtank = self:SpawnHeader("oUF_MainTank", nil, "raid",
"oUF-initialConfigFunction", ([[
self:SetWidth(%d)
self:SetHeight(%d)
]]):format(raid_width, raid_height),
"showRaid", true,
"yOffset", T.Scale(-7),
"groupFilter", "MAINTANK",
"template", C.raidframe.raid_tanks_tt and "oUF_MainTankTT" or "oUF_MainTank"
)
_G["RaidTankAnchor"]:SetSize(raid_width, raid_height)
raidtank:SetPoint("BOTTOMLEFT", _G["RaidTankAnchor"])
end
end
end)
-- Create anchors
for i = 1, C.raidframe.raid_groups do
local raid = CreateFrame("Frame", "RaidAnchor"..i, UIParent)
end
local party = CreateFrame("Frame", "PartyAnchor", UIParent)
if C.raidframe.player_in_party == true then
party:SetPoint(unpack(C.position.unitframes.party_heal))
else
party:SetPoint(C.position.unitframes.party_heal[1], C.position.unitframes.party_heal[2], C.position.unitframes.party_heal[3], C.position.unitframes.party_heal[4] + 32, C.position.unitframes.party_heal[5])
end
local party_target = CreateFrame("Frame", "PartyTargetAnchor", UIParent)
party_target:SetPoint("TOPLEFT", party, "BOTTOMLEFT", 0, -7)
local party_pet = CreateFrame("Frame", "PartyPetAnchor", UIParent)
party_pet:SetPoint("TOPLEFT", party, "BOTTOMLEFT", 0, -((party_height / 2) + 14.5))
local raidtank = CreateFrame("Frame", "RaidTankAnchor", UIParent)
if C.threat.enable then
raidtank:SetPoint(C.position.unitframes.tank[1], C.position.unitframes.tank[2], C.position.unitframes.tank[3], C.position.unitframes.tank[4] + C.threat.width + 6, C.position.unitframes.tank[5])
else
if C.actionbar.split_bars then
raidtank:SetPoint(C.position.unitframes.tank[1], SplitBarRight, C.position.unitframes.tank[3], C.position.unitframes.tank[4], C.position.unitframes.tank[5])
else
raidtank:SetPoint(unpack(C.position.unitframes.tank))
end
end
----------------------------------------------------------------------------------------
-- Test RaidFrames
----------------------------------------------------------------------------------------
do
local frames = {}
local moving = false
SlashCmdList.TEST_RAID = function()
if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end
if not moving then
oUF_RaidHeal1:Show()
local raid = {}
local raid_j = {}
if #frames == 0 then
for j = 1, C.raidframe.raid_groups do
for i = 1, 5 do
local frame = CreateFrame("Frame", nil, UIParent)
frame:SetSize(raid_width, raid_height)
if j == 1 then
if i == 1 then
frame:SetPoint("TOPLEFT", oUF_RaidHeal1, "TOPLEFT", 0, 0)
raid_j[j] = frame
else
frame:SetPoint("TOPLEFT", raid[i-1], "TOPRIGHT", 7, 0)
end
else
if i == 1 then
frame:SetPoint("TOPLEFT", raid_j[j-1], "TOPLEFT", 0, -raid_height - 7)
raid_j[j] = frame
else
frame:SetPoint("TOPLEFT", raid[i-1], "TOPRIGHT", 7, 0)
end
end
frame:CreateBackdrop("Overlay")
frame.backdrop.overlay:SetVertexColor(0.1, 0.9 - (j * 0.08) , 0.1)
raid[i] = frame
table.insert(frames, frame)
end
end
else
for _, frame in pairs(frames) do
frame:Show()
end
end
moving = true
else
for _, frame in pairs(frames) do
frame:Hide()
end
moving = false
end
end
SLASH_TEST_RAID1 = "/testraid"
SLASH_TEST_RAID2 = "/еуыекфшв"
SLASH_TEST_RAID3 = "/raidtest"
SLASH_TEST_RAID4 = "/кфшвеуые"
end
do
local frames = {}
local moving = false
SlashCmdList.TEST_PARTY = function()
if InCombatLockdown() then print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return end
if not moving then
oUF_PartyUnitButton1:Show()
local raid = {}
if #frames == 0 then
for i = 1, 5 do
local frame = CreateFrame("Frame", nil, UIParent)
frame:SetSize(party_width, party_height)
if i == 1 then
frame:SetPoint("TOPLEFT", oUF_PartyUnitButton1, "TOPLEFT", 0, 0)
else
if C.raidframe.party_vertical then
frame:SetPoint("TOP", raid[i-1], "BOTTOM", 0, -7)
else
frame:SetPoint("TOPLEFT", raid[i-1], "TOPRIGHT", 7, 0)
end
end
frame:CreateBackdrop("Overlay")
frame.backdrop.overlay:SetVertexColor(random(255) / 255, random(255) / 255, random(255) / 255)
raid[i] = frame
table.insert(frames, frame)
end
else
for _, frame in pairs(frames) do
frame:Show()
end
end
moving = true
else
for _, frame in pairs(frames) do
frame:Hide()
end
moving = false
end
end
SLASH_TEST_PARTY1 = "/testparty"
SLASH_TEST_PARTY2 = "/еуыезфкен"
SLASH_TEST_PARTY3 = "/partytest"
SLASH_TEST_PARTY4 = "/зфкенеуые"
end
================================================
FILE: ShestakUI/Modules/UnitFrames/Tags.lua
================================================
local T, C, L, _ = unpack(select(2, ...))
if C.unitframe.enable ~= true and C.nameplate.enable ~= true then return end
----------------------------------------------------------------------------------------
-- Tags
----------------------------------------------------------------------------------------
local _, ns = ...
local oUF = ns.oUF
oUF.Tags.Methods["Threat"] = function()
local _, status, percent = UnitDetailedThreatSituation("player", "target")
if percent and percent > 0 then
return ("%s%d%%|r"):format(Hex(GetThreatStatusColor(status)), percent)
end
end
oUF.Tags.Events["Threat"] = "UNIT_THREAT_LIST_UPDATE"
oUF.Tags.Methods["DiffColor"] = function(unit)
local r, g, b
local level = UnitLevel(unit)
if level < 1 then
r, g, b = 0.69, 0.31, 0.31
else
local DiffColor = UnitLevel(unit) - UnitLevel("player")
if DiffColor >= 5 then
r, g, b = 0.69, 0.31, 0.31
elseif DiffColor >= 3 then
r, g, b = 0.71, 0.43, 0.27
elseif DiffColor >= -2 then
r, g, b = 0.84, 0.75, 0.65
elseif -DiffColor <= 5 then
r, g, b = 0.33, 0.59, 0.33
else
r, g, b = 0.55, 0.57, 0.61
end
end
return string.format("|cff%02x%02x%02x", r * 255, g * 255, b * 255)
end
oUF.Tags.Events["DiffColor"] = "UNIT_LEVEL"
oUF.Tags.Methods["PetNameColor"] = function()
return string.format("|cff%02x%02x%02x", T.color.r * 255, T.color.g * 255, T.color.b * 255)
end
oUF.Tags.Events["PetNameColor"] = "UNIT_POWER_UPDATE"
oUF.Tags.Methods["GetNameColor"] = function(unit)
local reaction = UnitReaction(unit, "player")
if UnitIsPlayer(unit) then
return _TAGS["raidcolor"](unit)
elseif reaction then
local c = T.oUF_colors.reaction[reaction]
return string.format("|cff%02x%02x%02x", c[1] * 255, c[2] * 255, c[3] * 255)
else
local r, g, b = 0.33, 0.59, 0.33
return string.format("|cff%02x%02x%02x", r * 255, g * 255, b * 255)
end
end
oUF.Tags.Events["GetNameColor"] = "UNIT_POWER_UPDATE UNIT_FLAGS"
oUF.Tags.Methods["NameArena"] = function(unit)
local name = UnitName(unit)
return T.UTF(name, 4, false)
end
oUF.Tags.Events["NameArena"] = "UNIT_NAME_UPDATE"
oUF.Tags.Methods["NameShort"] = function(unit)
local name = UnitName(unit)
return T.UTF(name, 8, false)
end
oUF.Tags.Events["NameShort"] = "UNIT_NAME_UPDATE"
oUF.Tags.Methods["NameMedium"] = function(unit)
local name = UnitName(unit)
return T.UTF(name, 11, true)
end
oUF.Tags.Events["NameMedium"] = "UNIT_NAME_UPDATE"
oUF.Tags.Methods["NameLong"] = function(unit)
local name = UnitName(unit)
return T.UTF(name, 18, true)
end
oUF.Tags.Events["NameLong"] = "UNIT_NAME_UPDATE"
oUF.Tags.Methods["NameLongAbbrev"] = function(unit)
local name = UnitName(unit)
if string.len(name) > 18 then
name = string.gsub(name, "-", "")
name = string.gsub(name, "%s?(.[\128-\191]*)%S+%s", "%1. ")
end
return T.UTF(name, 18, false)
end
oUF.Tags.Events["NameLongAbbrev"] = "UNIT_NAME_UPDATE"
oUF.Tags.Methods["LFD"] = function(unit)
local role = UnitGroupRolesAssigned(unit)
if role == "TANK" then
return "|cff0070DE[T]|r"
elseif role == "HEALER" then
return "|cff00CC12[H]|r"
elseif role == "DAMAGER" then
return "|cffFF3030[D]|r"
end
end
oUF.Tags.Events["LFD"] = "PLAYER_ROLES_ASSIGNED GROUP_ROSTER_UPDATE"
oUF.Tags.Methods["AltPower"] = function(unit)
local min = UnitPower(unit, ALTERNATE_POWER_INDEX)
local max = UnitPowerMax(unit, ALTERNATE_POWER_INDEX)
if max > 0 and not UnitIsDeadOrGhost(unit) then
return ("%s%%"):format(math.floor(min / max * 100 + 0.5))
end
end
oUF.Tags.Events["AltPower"] = "UNIT_POWER_UPDATE"
oUF.Tags.Methods["NameplateLevel"] = function(unit)
local level = UnitLevel(unit)
local c = UnitClassification(unit)
if UnitIsWildBattlePet(unit) or UnitIsBattlePetCompanion(unit) then
level = UnitBattlePetLevel(unit)
end
if level == T.level and c == "normal" then return end
if level > 0 then
return level
else
return "??"
end
end
oUF.Tags.Events["NameplateLevel"] = "UNIT_LEVEL PLAYER_LEVEL_UP"
oUF.Tags.Methods["NameplateNameColor"] = function(unit)
local reaction = UnitReaction(unit, "player")
if not UnitIsUnit("player", unit) and UnitIsPlayer(unit) and (reaction and reaction >= 5) then
if C.nameplate.only_name then
return _TAGS["raidcolor"](unit)
else
local c = T.oUF_colors.power["MANA"]
return string.format("|cff%02x%02x%02x", c[1] * 255, c[2] * 255, c[3] * 255)
end
elseif UnitIsPlayer(unit) then
return _TAGS["raidcolor"](unit)
elseif reaction then
local c = T.oUF_colors.reaction[reaction]
return string.format("|cff%02x%02x%02x", c[1] * 255, c[2] * 255, c[3] * 255)
else
local r, g, b = 0.33, 0.59, 0.33
return string.format("|cff%02x%02x%02x", r * 255, g * 255, b * 255)
end
end
oUF.Tags.Events["NameplateNameColor"] = "UNIT_POWER_UPDATE UNIT_FLAGS"
oUF.Tags.Methods["NameplateNameShort"] = function(unit)
local name = UnitName(unit)
name = T.ShortNames[name] or name
return T.UTF(name, 18, true)
end
oUF.Tags.Events["NameplateNameShort"] = "UNIT_NAME_UPDATE"
oUF.Tags.Methods["NameplateHealth"] = function(unit)
local hp = UnitHealth(unit)
local maxhp = UnitHealthMax(unit)
if maxhp == 0 then
return 0
else
return ("%s - %d%%"):format(T.ShortValue(hp), hp / maxhp * 100 + 0.5)
end
end
oUF.Tags.Events["NameplateHealth"] = "UNIT_HEALTH UNIT_MAXHEALTH NAME_PLATE_UNIT_ADDED"
oUF.Tags.Methods["Absorbs"] = function(unit)
local absorb = UnitGetTotalAbsorbs(unit)
if absorb and absorb > 0 then
return T.ShortValue(absorb)
end
end
oUF.Tags.Events["Absorbs"] = "UNIT_ABSORB_AMOUNT_CHANGED"
================================================
FILE: ShestakUI/ShestakUI.toc
================================================
## Interface: 100005
## Title: ShestakUI
## Notes: A total UI overhaul for World of Warcraft
## Author: Shestak
## Version: 9.20
## OptionalDeps: Blizzard_CombatText, ShestakUI_Config, ShestakUI_Profile, AtlasLoot, cargBags, Clique, epgp, Grid, Grid2, ls_Toasts, Mapster, Omen, OPie, PitBull4, Postal, Prat-3.0, Quartz, Recount, Rematch, ShadowedUnitFrames, TidyPlates, TipTac, TipTacTalents, tullaCC, VuhDo, WeakAuras
## SavedVariables: ShestakUISettings, ShestakUIStats, ShestakUIBindings, ShestakUICurrency, ShestakUIPositions
## SavedVariablesPerCharacter: ShestakUISettingsPerChar, ShestakUIChatHistory, ShestakUIPositionsPerChar
## X-Website: http://shestak.org
## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Chiril, CrusaderHeimdall, Cybey, Dawn, Dencer, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, Wrug, Xuerian, Yleaf, Zork
## X-Translation: Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius
## X-Thanks: Akimba, Antthemage, Crunching, Dandruff, DesFolk, Elfrey, Ente, Erratic, Falchior, Gromcha, Halogen, Homicidal Retribution, ILF7, Illusion, Ipton, k07n, Kazarl, Lanseb, Leots, m2jest1c, MoLLIa, Nefrit, Noobolov, Obakol, Oz, PterOs, Sart, Scorpions, Sitatunga, Sw2rT1, Tryllemann, Wetxius, Yakodzuna, UI Users and Russian Community
## X-oUF: oUFShestakUI
## X-Curse-Project-ID: 27854
## X-WoWI-ID: 19033
ShestakUI.xml
================================================
FILE: ShestakUI/ShestakUI.xml
================================================
================================================
FILE: ShestakUI_Config/Core.lua
================================================
local T, C
local _, ns = ...
local L = ns
----------------------------------------------------------------------------------------
-- GUI for ShestakUI(by Haleth, Solor)
----------------------------------------------------------------------------------------
local realm = GetRealmName()
local name = UnitName("player")
-- [[ Variables ]]
ns.buttons = {}
ns.NextPrevButtons = {}
local checkboxes = {}
local sliders = {}
local editboxes = {}
local dropdowns = {}
local colourpickers = {}
local panels = {}
-- cache old values to check whether UI needs to be reloaded
local old = {}
local oldColours = {}
local userChangedSlider = true -- to use SetValue without triggering OnValueChanged
local baseName = "ShestakUIOptionsPanel"
-- [[ Functions ]]
-- when an option needs a reload
local function setReloadNeeded(isNeeded)
ShestakUIOptionsPanel.reloadText:SetShown(isNeeded)
ns.needReload = isNeeded -- for the popup when clicking okay
if isNeeded then
ShestakUIOptionsPanelOkayButton:Enable()
else
ShestakUIOptionsPanelOkayButton:Disable()
end
end
ns.setReloadNeeded = setReloadNeeded
-- check if a reload is needed
local function checkIsReloadNeeded()
for frame, value in pairs(old) do
if C[frame.group][frame.option] ~= value then
setReloadNeeded(true)
return
end
end
for colourOption, oldTable in pairs(oldColours) do
local savedTable = C[colourOption.group][colourOption.option]
if savedTable[1] ~= oldTable[1] or savedTable[2] ~= oldTable[2] or savedTable[3] ~= oldTable[3] then
setReloadNeeded(true)
return
end
end
-- if the tables were empty, or all of the old values match their current ones
setReloadNeeded(false)
end
-- Called by every widget to save a value
local function SaveValue(f, value)
if not C.options[f.group] then C.options[f.group] = {} end
if not C.options[f.group][f.option] then C.options[f.group][f.option] = {} end
C.options[f.group][f.option] = value -- these are the saved variables
C[f.group][f.option] = value -- and this is from the lua options
end
-- [[ Widgets ]]
-- Check boxes
local function toggleChildren(self, checked)
local tR, tG, tB
if checked then
tR, tG, tB = 1, 1, 1
else
tR, tG, tB = .3, .3, .3
end
for _, child in next, self.children do
child:SetEnabled(checked)
child.Text:SetTextColor(tR, tG, tB)
end
end
local function toggle(self)
local checked = self:GetChecked()
if checked then
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
else
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF)
end
SaveValue(self, checked)
if self.children then toggleChildren(self, checked) end
if self.needsReload then
if old[self] == nil then
old[self] = not checked
end
checkIsReloadNeeded()
end
end
ns.CreateCheckBox = function(parent, option, text, textDesc)
local f = CreateFrame("CheckButton", nil, parent)
f:SetSize(26, 26)
f.Text = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
f.Text:SetJustifyH("LEFT")
f.Text:SetTextColor(1, 1, 1)
f.Text:SetPoint("LEFT", f, "RIGHT", 3, 0)
f.group = parent.tag
f.option = option
if text then
f.Text:SetText(text)
else
f.Text:SetText(ns[parent.tag.."_"..option])
end
f.Text:SetWidth(540)
f.tooltipText = ns[parent.tag.."_"..option.."_desc"] or textDesc or ns[parent.tag.."_"..option] or text
f:SetScript("OnEnter", function()
GameTooltip:SetOwner(f, "ANCHOR_RIGHT", 0, 0)
GameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)
end)
f:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
f.needsReload = true
f:SetScript("OnClick", toggle)
parent[option] = f
tinsert(checkboxes, f)
return f
end
-- Sliders
local function onValueChanged(self, value)
if self.step < 1 then
if self.option == "uiscale" then
value = tonumber(string.format("%.3f", value))
else
value = tonumber(string.format("%.2f", value))
end
else
value = floor(value + 0.5)
end
if self.textInput then
self.textInput:SetText(value)
end
if userChangedSlider then
SaveValue(self, value)
if self.needsReload then
if self.step < 1 then
self.oldValue = tonumber(string.format("%.2f", self.oldValue))
end
old[self] = self.oldValue
checkIsReloadNeeded()
end
end
end
local function onMouseWheel(self, delta)
if not IsControlKeyDown() and not IsShiftKeyDown() then
local script = self.parent:GetScript("OnMouseWheel")
if script then
script(self.parent, delta)
end
return
end
value = self.textInput:GetText()
local step = self.step
if IsControlKeyDown() then
step = self.step * 5
elseif IsShiftKeyDown() then
step = self.step
end
if delta < 0 then
value = value + step
else
value = value - step
end
if self.step < 1 then
if self.option == "uiscale" then
value = tonumber(string.format("%.3f", value))
else
value = tonumber(string.format("%.2f", value))
end
else
value = floor(value + 0.5)
end
if value < self.min then
value = self.min
elseif value > self.max then
value = self.max
end
if self.textInput then
self.textInput:SetText(value)
end
self:SetValue(value)
if userChangedSlider then
SaveValue(self, value)
if self.needsReload then
if self.step < 1 then
self.oldValue = tonumber(string.format("%.2f", self.oldValue))
end
old[self] = self.oldValue
checkIsReloadNeeded()
end
end
end
local function createSlider(parent, option, lowText, highText, low, high, step, needsReload, text, textDesc)
local sliderName = parent:GetName()..option
local f = CreateFrame("Slider", sliderName, parent, "OptionsSliderTemplate")
f.group = parent.tag
f.option = option
_G[sliderName.."Text"]:SetFontObject(GameFontHighlightSmall)
_G[sliderName.."Text"]:SetSize(150, 20)
if text then
_G[sliderName.."Text"]:SetText(text)
else
_G[sliderName.."Text"]:SetText(ns[parent.tag.."_"..option])
end
_G[sliderName.."Low"]:SetText(lowText)
_G[sliderName.."High"]:SetText(highText)
f:SetMinMaxValues(low, high)
f:SetObeyStepOnDrag(true)
f:SetValueStep(step)
f:SetWidth(150)
f.tooltipText = ns[parent.tag.."_"..option.."_desc"] or textDesc or ns[parent.tag.."_"..option] or text
f:SetScript("OnEnter", function()
GameTooltip:SetOwner(f, "ANCHOR_RIGHT", 0, 0)
GameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)
end)
f:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
f.needsReload = needsReload
f.step = step
f.min = low
f.max = high
f.parent = parent
f:SetScript("OnValueChanged", onValueChanged)
f:SetScript("OnMouseWheel", onMouseWheel)
parent[option] = f
tinsert(sliders, f)
return f
end
local function onSliderEscapePressed(self)
self:ClearFocus()
end
local function onSliderEnterPressed(self)
local slider = self:GetParent()
local min, max = slider:GetMinMaxValues()
local value = tonumber(self:GetText())
if value and value >= floor(min) and value <= floor(max) then
if slider.option == "uiscale" then
slider:SetValueStep(0.001)
end
slider:SetValue(value)
else
self:SetText(floor(slider:GetValue()*1000)/1000)
end
self:ClearFocus()
end
ns.CreateNumberSlider = function(parent, option, lowText, highText, low, high, step, needsReload, text, textDesc)
local slider = createSlider(parent, option, lowText, highText, low, high, step, needsReload, text, textDesc)
local f = CreateFrame("EditBox", parent:GetName()..option.."TextInput", slider, "InputBoxTemplate")
f:SetAutoFocus(false)
f:SetWidth(50)
f:SetHeight(18)
f:SetMaxLetters(8)
f:SetFontObject(GameFontHighlight)
f:SetPoint("LEFT", slider, "RIGHT", 10, 0)
f:SetScript("OnEscapePressed", onSliderEscapePressed)
f:SetScript("OnEnterPressed", onSliderEnterPressed)
f:SetScript("OnEditFocusGained", nil)
f:SetScript("OnEditFocusLost", onSliderEnterPressed)
slider.textInput = f
return slider
end
-- EditBox
local function onEnterPressed(self)
local value = self.valueNumber and tonumber(self:GetText()) or tostring(self:GetText())
SaveValue(self, value)
self:ClearFocus()
old[self] = self.oldValue
checkIsReloadNeeded()
end
ns.CreateEditBox = function(parent, option, needsReload, text, number)
local f = CreateFrame("EditBox", parent:GetName()..option.."TextInput", parent, "InputBoxTemplate")
f:SetAutoFocus(false)
f:SetWidth(60)
f:SetHeight(18)
f:SetMaxLetters(8)
f:SetFontObject(GameFontHighlight)
f:SetPoint("LEFT", 40, 0)
f.value = ""
f.valueNumber = number and true or false
f:SetScript("OnEscapePressed", function(self) self:ClearFocus() self:SetText(f.value) end)
f:SetScript("OnEnterPressed", onEnterPressed)
f:SetScript("OnEditFocusGained", function() f.value = f:GetText() end)
f:SetScript("OnEditFocusLost", onEnterPressed)
local label = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
label:SetWidth(440)
label:SetHeight(20)
label:SetJustifyH("LEFT")
label:SetPoint("LEFT", f, "RIGHT", 10, 0)
if text then
label:SetText(text)
else
label:SetText(ns[parent.tag.."_"..option])
end
f.label = label
f.tooltipText = ns[parent.tag.."_"..option.."_desc"] or text
f:SetScript("OnEnter", function()
GameTooltip:SetOwner(f, "ANCHOR_RIGHT", 5, 5)
GameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)
end)
f:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
f.group = parent.tag
f.option = option
f.needsReload = needsReload
parent[option] = f
tinsert(editboxes, f)
return f
end
-- Colour pickers
-- we update this in onColourSwatchClicked, need it for setColour / resetColour
-- because it can't be passed as parameter
local currentColourOption
local function round(x)
return floor((x * 100) + .5) / 100
end
local function setColour()
local newR, newG, newB = ColorPickerFrame:GetColorRGB()
newR, newG, newB = round(newR), round(newG), round(newB)
currentColourOption:SetBackdropBorderColor(newR, newG, newB)
currentColourOption:SetBackdropColor(newR, newG, newB, 0.3)
SaveValue(currentColourOption, {newR, newG, newB})
checkIsReloadNeeded()
end
local function resetColour(previousValues)
local oldR, oldG, oldB = unpack(previousValues)
currentColourOption:SetBackdropBorderColor(oldR, oldG, oldB)
currentColourOption:SetBackdropColor(oldR, oldG, oldB, 0.3)
SaveValue(currentColourOption, {oldR, oldG, oldB})
checkIsReloadNeeded()
end
local function onColourSwatchClicked(self, button)
if button == "RightButton" then
C.options[self.group][self.option] = nil
setReloadNeeded(true)
return
end
local colourTable = C[self.group][self.option]
local r, g, b = unpack(colourTable)
r, g, b = round(r), round(g), round(b)
local originalR, originalG, originalB = r, g, b
currentColourOption = self
if self.needsReload and oldColours[self] == nil then
oldColours[self] = {r, g, b}
end
ColorPickerFrame:SetColorRGB(r, g, b)
ColorPickerFrame.previousValues = {originalR, originalG, originalB}
ColorPickerFrame.func = setColour
ColorPickerFrame.cancelFunc = resetColour
ColorPickerFrame:Hide()
ColorPickerFrame:Show()
end
ns.CreateColourPicker = function(parent, option, needsReload, text)
local f = CreateFrame("Button", nil, parent)
f:SetSize(40, 20)
local colortext = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
colortext:SetText(COLOR)
colortext:SetPoint("CENTER")
colortext:SetJustifyH("CENTER")
f:SetWidth(colortext:GetWidth() + 5)
local label = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
if text then
label:SetText(text)
else
label:SetText(ns[parent.tag.."_"..option])
end
label:SetWidth(440)
label:SetHeight(20)
label:SetJustifyH("LEFT")
label:SetPoint("LEFT", 50, 0)
f.group = parent.tag
f.option = option
f.needsReload = needsReload
f:SetScript("OnMouseUp", onColourSwatchClicked)
parent[option] = f
tinsert(colourpickers, f)
return f
end
-- DropDown
local DropDownText = {
["Interface\\AddOns\\ShestakUI\\Media\\Textures\\Texture.tga"] = "Normal texture",
["Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Normal.ttf"] = "Normal font",
["Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Pixel.ttf"] = "Pixel Font",
[STANDARD_TEXT_FONT] = "Blizzard font",
["BLACKLIST"] = L.general_error_blacklist,
["WHITELIST"] = L.general_error_whitelist,
["COMBAT"] = L.general_error_combat,
["NONE"] = L.general_error_none,
["RAID"] = L.automation_auto_collapse_raid,
["RELOAD"] = L.automation_auto_collapse_reload,
["SCENARIO"] = L.automation_auto_collapse_scenario,
["DYNAMIC"] = L.raidframe_auto_position_dynamic,
["STATIC"] = L.raidframe_auto_position_static,
["HEAL"] = L.raidframe_heal_layout,
["DPS"] = L.raidframe_dps_layout,
["AUTO"] = L.raidframe_auto_layout,
["BLIZZARD"] = "Blizzard",
["ICONS"] = L.unitframe_portrait_type_icons,
["OVERLAY"] = L.unitframe_portrait_type_overlay,
}
ns.CreateDropDown = function(parent, option, needsReload, text, tableValue, LSM, isFont)
local f = CreateFrame("Frame", parent:GetName()..option.."DropDown", parent, "UIDropDownMenuTemplate")
UIDropDownMenu_SetWidth(f, 110)
UIDropDownMenu_Initialize(f, function(self)
local info = UIDropDownMenu_CreateInfo()
info.func = self.SetValue
for key, value in pairs(tableValue) do
info.text = LSM and (DropDownText[value] or key) or DropDownText[value] or value
info.arg1 = value
info.arg2 = key
info.checked = value == f.selectedValue
if isFont then
local fObject = CreateFont(info.text)
fObject:SetFont(value, 12, "")
info.fontObject = fObject
end
UIDropDownMenu_AddButton(info)
end
end)
function f:SetValue(newValue, newkey)
f.selectedValue = newValue
local text = LSM and (DropDownText[newValue] or newkey) or DropDownText[newValue] or newValue
UIDropDownMenu_SetText(f, text)
SaveValue(f, newValue)
old[f] = f.oldValue
checkIsReloadNeeded()
CloseDropDownMenus()
end
local label = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
if text then
label:SetText(text)
else
label:SetText(ns[parent.tag.."_"..option])
end
-- label:SetWidth(440)
label:SetHeight(20)
label:SetJustifyH("LEFT")
label:SetPoint("LEFT", 160, 4)
f.label = label
f.tooltipText = ns[parent.tag.."_"..option.."_desc"]
if f.tooltipText then
f:SetScript("OnEnter", function()
GameTooltip:SetOwner(f, "ANCHOR_RIGHT", 0, 0)
GameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)
end)
f:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
end
f.group = parent.tag
f.option = option
f.needsReload = needsReload
parent[option] = f
tinsert(dropdowns, f)
return f
end
-- [[ Categories and tabs ]]
local offset = 50
local activeTab = nil
local function setActiveTab(tab)
activeTab = tab
activeTab.panel.tab.Text:SetTextColor(1, 1, 1)
activeTab.panel:Show()
if activeTab.panel_2 then
activeTab.panel.PrevPageButton:Show()
activeTab.panel.PrevPageButton:Disable()
activeTab.panel.NextPageButton:Enable()
activeTab.panel.pageText:SetFormattedText(COLLECTION_PAGE_NUMBER, 1, activeTab.panel.maxPages)
activeTab.panel.currentPage = 1
activeTab.panel_2:Hide()
end
C.category = tab.panel.tag
end
local onTabClick = function(tab)
activeTab.panel:Hide()
activeTab.panel.tab.Text:SetTextColor(1, 0.82, 0)
if activeTab.panel_2 then
activeTab.panel.PrevPageButton:Hide()
activeTab.panel_2:Hide()
end
if activeTab.panel_3 then
activeTab.panel_3:Hide()
end
if activeTab.panel_4 then
activeTab.panel_4:Hide()
end
setActiveTab(tab)
ns.HideSpellList()
end
local function CreateOptionPanel(name, text, subText)
local panel = CreateFrame("Frame", name, ShestakUIOptionsPanel)
panel:SetSize(600, 670)
panel:SetPoint("RIGHT", 0, 10)
panel:EnableMouseWheel(true)
panel:Hide()
panel.Title = panel:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
panel.Title:SetPoint("TOPLEFT", 8, -16)
panel.Title:SetText(text)
panel.subText = panel:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
panel.subText:SetPoint("TOPLEFT", panel.Title, "BOTTOMLEFT", 0, -8)
panel.subText:SetJustifyH("LEFT")
panel.subText:SetJustifyV("TOP")
panel.subText:SetSize(570, 30)
panel.subText:SetText(subText)
return panel
end
ns.addCategory = function(name, text, subText, num)
local tab = CreateFrame("Button", nil, ShestakUIOptionsPanel)
tab:SetPoint("TOPLEFT", 11, -offset)
tab:SetSize(168, 22)
tab.Text = tab:CreateFontString(nil, "ARTWORK", "GameFontNormal")
tab.Text:SetPoint("LEFT", tab, 8, 0)
tab.Text:SetText(text)
tab.Text:SetSize(160, 20)
tab.Text:SetJustifyH("LEFT")
tab:SetScript("OnMouseUp", onTabClick)
offset = (offset + 24)
local tag = strlower(name)
local panel = CreateOptionPanel(baseName..name, text, subText)
panel[1] = panel
tinsert(panels, panel)
tab.panel = panel
panel.tab = tab
panel.tag = tag
ShestakUIOptionsPanel[tag] = panel
local numPages = num or 1
if numPages > 1 then
local name2 = name.."2"
local tag2 = strlower(name2)
local panel_2 = CreateOptionPanel(baseName..name2, text, subText)
panel[2] = panel_2
tinsert(panels, panel_2)
if name == "general" then
panel_2.tag = "media"
else
panel_2.tag = tag
end
ShestakUIOptionsPanel[tag2] = panel_2
tab.panel_2 = panel_2
local PrevPageButton = CreateFrame("Button", baseName..name.."PrevButton", ShestakUIOptionsPanel)
PrevPageButton:SetPoint("TOPRIGHT", -45, -44)
PrevPageButton:SetSize(28, 28)
PrevPageButton:SetHighlightTexture("Interface\Buttons\UI-Common-MouseHilight")
PrevPageButton:Hide()
PrevPageButton:Disable()
local pageText = PrevPageButton:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
pageText:SetPoint("RIGHT", PrevPageButton, "LEFT", -5, 0)
panel.pageText = pageText
local NextPageButton = CreateFrame("Button", baseName..name.."NextButton", PrevPageButton)
NextPageButton:SetPoint("LEFT", PrevPageButton, "RIGHT", 5, 0)
NextPageButton:SetSize(28, 28)
NextPageButton:SetHighlightTexture("Interface\Buttons\UI-Common-MouseHilight")
panel.currentPage = 1
panel.maxPages = numPages
local function SetPage(prev)
panel.currentPage = panel.currentPage + (prev and - 1 or 1)
pageText:SetFormattedText(COLLECTION_PAGE_NUMBER, panel.currentPage, panel.maxPages)
for i = 1, numPages do
panel[i]:Hide()
end
if panel.currentPage == 1 then
PrevPageButton:Disable()
NextPageButton:Enable()
panel[1]:Show()
elseif panel.currentPage == 2 then
PrevPageButton:Enable()
if numPages > 2 then
NextPageButton:Enable()
else
NextPageButton:Disable()
end
panel[2]:Show()
elseif panel.currentPage == 3 then
PrevPageButton:Enable()
if numPages > 3 then
NextPageButton:Enable()
else
NextPageButton:Disable()
end
panel[3]:Show()
elseif panel.currentPage == 4 then
PrevPageButton:Enable()
NextPageButton:Disable()
panel[4]:Show()
end
end
PrevPageButton:SetScript("OnClick", function()
SetPage(true)
end)
NextPageButton:SetScript("OnClick", function()
SetPage(false)
end)
tinsert(ns.NextPrevButtons, PrevPageButton)
tinsert(ns.NextPrevButtons, NextPageButton)
panel.PrevPageButton = PrevPageButton
panel.NextPageButton = NextPageButton
panel:SetScript("OnMouseWheel", function(_, delta)
if delta < 0 then
NextPageButton:Click()
end
end)
panel_2:SetScript("OnMouseWheel", function(_, delta)
if delta > 0 then
PrevPageButton:Click()
end
end)
if numPages > 2 then
local name3 = name.."3"
local tag3 = strlower(name3)
local panel_3 = CreateOptionPanel(baseName..name3, text, subText)
panel[3] = panel_3
tinsert(panels, panel_3)
tab.panel_3 = panel_3
panel_3.tag = tag
ShestakUIOptionsPanel[tag3] = panel_3
panel_2:SetScript("OnMouseWheel", function(_, delta)
if delta > 0 then
PrevPageButton:Click()
elseif delta < 0 then
NextPageButton:Click()
end
end)
panel_3:SetScript("OnMouseWheel", function(_, delta)
if delta > 0 then
PrevPageButton:Click()
end
end)
if numPages > 3 then
local name4 = name.."4"
local tag4 = strlower(name4)
local panel_4 = CreateOptionPanel(baseName..name4, text, subText)
panel[4] = panel_4
tinsert(panels, panel_4)
tab.panel_4 = panel_4
panel_4.tag = tag
ShestakUIOptionsPanel[tag4] = panel_4
panel_3:SetScript("OnMouseWheel", function(_, delta)
if delta > 0 then
PrevPageButton:Click()
elseif delta < 0 then
NextPageButton:Click()
end
end)
panel_4:SetScript("OnMouseWheel", function(_, delta)
if delta > 0 then
PrevPageButton:Click()
end
end)
end
end
end
end
ns.addSubCategory = function(category, name)
local header = category:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
header:SetText(name)
header:SetTextColor(179/255, 211/255, 243/255)
local line = category:CreateTexture(nil, "ARTWORK")
line:SetSize(500, 1)
line:SetPoint("TOPLEFT", header, "BOTTOMLEFT", 0, -4)
line:SetColorTexture(0.37, 0.3, 0.3, 1)
return header, line
end
-- [[ Init ]]
local function changeProfile()
local profile
if ShestakUIOptionsGlobal[realm][name] == true then
if ShestakUIOptionsPerChar == nil then
ShestakUIOptionsPerChar = {}
end
profile = ShestakUIOptionsPerChar
else
profile = ShestakUIOptions
end
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
profile[group][option] = nil
else
C[group][option] = value
end
end
else
profile[group] = nil
end
end
C.options = profile
end
local function displaySettings()
for _, box in pairs(checkboxes) do
box:SetChecked(C[box.group][box.option])
if box.children then toggleChildren(box, box:GetChecked()) end
end
userChangedSlider = false
for _, slider in pairs(sliders) do
local value = C[slider.group][slider.option]
if T.screenHeight > 1200 and slider.group == "font" and slider.option ~= "nameplates_font_size" then
value = value / T.mult
end
slider:SetValue(value)
slider.textInput:SetText(floor(value * 1000) / 1000)
slider.textInput:SetCursorPosition(0)
slider.oldValue = value
end
userChangedSlider = true
for _, editbox in pairs(editboxes) do
editbox:SetText(C[editbox.group][editbox.option])
editbox:SetCursorPosition(0)
editbox.oldValue = C[editbox.group][editbox.option]
end
for _, dropdown in pairs(dropdowns) do
local text = DropDownText[C[dropdown.group][dropdown.option]] or C[dropdown.group][dropdown.option] or ""
UIDropDownMenu_SetText(dropdown, text)
dropdown.selectedValue = C[dropdown.group][dropdown.option]
dropdown.oldValue = C[dropdown.group][dropdown.option]
end
end
local init = CreateFrame("Frame")
init:RegisterEvent("PLAYER_LOGIN")
init:SetScript("OnEvent", function()
if not ShestakUI then return end
T, C = unpack(ShestakUI)
local ShestakUIOptionsPanel = ShestakUIOptionsPanel
StaticPopupDialogs.PERCHAR = {
text = L_GUI_PER_CHAR,
OnAccept = function()
if ShestakUIOptionsPanel.ProfileBox:GetChecked() then
ShestakUIOptionsGlobal[realm][name] = true
else
ShestakUIOptionsGlobal[realm][name] = false
end
-- changeProfile()
ReloadUI()
end,
OnCancel = function()
if ShestakUIOptionsPanel.ProfileBox:GetChecked() then
ShestakUIOptionsPanel.ProfileBox:SetChecked(false)
else
ShestakUIOptionsPanel.ProfileBox:SetChecked(true)
end
end,
button1 = ACCEPT,
button2 = CANCEL,
timeout = 0,
whileDead = 1,
preferredIndex = 5,
}
ShestakUIOptionsPanel.ProfileBox:SetChecked(ShestakUIOptionsGlobal[realm][name])
ShestakUIOptionsPanel.ProfileBox:SetScript("OnClick", function()
StaticPopup_Show("PERCHAR")
end)
ShestakUIOptionsPanel:SetTemplate("Transparent")
local sunFrame = CreateFrame("Frame", nil, ShestakUIOptionsPanel)
sunFrame:SetPoint("LEFT", 10, 9)
sunFrame:SetSize(175, 670)
sunFrame:CreateBackdrop("Overlay")
sunFrame.backdrop:SetPoint("TOPLEFT", 0, 3)
sunFrame.backdrop:SetPoint("BOTTOMRIGHT", -2, -4)
T.SkinCheckBox(ShestakUIOptionsPanel.ProfileBox)
for _, panel in pairs(panels) do
panel:CreateBackdrop("Overlay")
panel.backdrop:SetPoint("TOPLEFT", -10, 2)
panel.backdrop:SetPoint("BOTTOMRIGHT", -10, -5)
end
for _, button in pairs(ns.buttons) do
button:SkinButton()
end
for _, button in pairs(ns.NextPrevButtons) do
T.SkinNextPrevButton(button, nil, "Any")
end
for _, box in pairs(checkboxes) do
T.SkinCheckBox(box)
end
for _, slider in pairs(sliders) do
T.SkinSlider(slider)
T.SkinEditBox(slider.textInput)
end
for _, picker in pairs(colourpickers) do
local value = C[picker.group][picker.option]
picker:SetTemplate("Transparent")
picker:SetBackdropBorderColor(unpack(value))
picker:SetBackdropColor(value[1], value[2], value[3], 0.3)
end
for _, editbox in pairs(editboxes) do
T.SkinEditBox(editbox)
end
for _, dropdown in pairs(dropdowns) do
T.SkinDropDownBox(dropdown)
end
local title = ShestakUIOptionsPanel:CreateFontString("UIConfigTitleVer", "OVERLAY", "GameFontNormal")
title:SetPoint("TOP", 0, -10)
title:SetText("ShestakUI "..T.version)
setActiveTab(ShestakUIOptionsPanel.general.tab)
displaySettings()
end)
================================================
FILE: ShestakUI_Config/Locales/Chinese.lua
================================================
local _, L = ...
if GetLocale() ~= "zhCN" then return end
----------------------------------------------------------------------------------------
-- Localization for zhCN client
-- Translation: Mania, Tat2dawn, Sakaras, Joe
----------------------------------------------------------------------------------------
L_GUI_SET_SAVED_SETTTINGS = "角色专用设定"
L_GUI_SET_SAVED_SETTTINGS_DESC = "在 一般设定 与 角色专用设定 之间切换。"
L_GUI_RESET_CHAR = "确定要重置你所有角色的 ShestakUI 设定?"
L_GUI_RESET_ALL = "确定要重置全部 ShestakUI 到预设值?"
L_GUI_PER_CHAR = "确定要设定/取消 角色专用设定 模式?"
L_GUI_RESET_CAT = "确定要重置当前分类到预设值?"
L_GUI_RESET_CAT_DESC = "左键重置当前分类到预设值。\nCTRL+左键重置全部到预设值。"
L_GUI_NEED_RELOAD = "请点击套用以重载当前改动。"
L_GUI_LAYOUT = "布局切换"
L_GUI_SPELL_LIST = "法术列表"
L_GUI_SPELL_INPUT = "法术ID"
L_GUI_TIME_INPUT = "时间"
L_GUI_EXPERT_MODE = "专家模式"
L_GUI_EXPERT_MODE_DESC = "编写你的插件代码"
L_GUI_RESET_SPELLS_DESC = "Ctrl+左键重置列表"
-- Profile
L.profile = "Profile" -- Need review
L.profile_title = "Profile options" -- Need review
L.profile_choose = "Choose profile" -- Need review
L.profile_options = "Settings" -- Need review
L.profile_movers = "Moving elements" -- Need review
L.profile_export = "Export" -- Need review
L.profile_import = "Import" -- Need review
L.profile_error_lib = "To enable export and import - install WeakAuras" -- Need review
L.profile_error_code = "Error in imported code!" -- Need review
-- General options
L_GUI_GENERAL_SUBTEXT = "一般用戶界面设置,键入 /uihelp 获取更多可用命令。"
L_GUI_GENERAL_WELCOME_MESSAGE = "欢迎信息"
L_GUI_GENERAL_AUTOSCALE = "自动UI缩放"
L_GUI_GENERAL_UISCALE = "自定义UI缩放"
L.general_subheader_blizzard = "暴雪插件"
L.general_error_filter = "红字错误过滤"
L.general_error_blacklist = "黑名单"
L.general_error_whitelist = "白名单"
L.general_error_combat = "战斗中"
L.general_error_none = "不过滤"
L.general_vehicle_mouseover = "驾驶框架解锁"
L.general_move_blizzard = "移动暴雪界面框架"
L.general_color_picker = "改进型颜色选择器"
L.general_color_picker_desc = "增加按鈕:复制/粘上/职业 输入框:RGB/色值/透明度"
L.general_minimize_mouseover = "任务栏最小化按钮鼠标悬停显示"
L.general_hide_banner = "自动隐藏Boss额外拾取提示"
L.general_hide_talking_head = "自动隐藏任务对话框"
L.general_hide_maw_buffs = "隐藏心能之力框架"
-- Media options
L.media_border_color = "背景颜色"
L.media_classborder_color = "边框按职业着色"
L.media_backdrop_color = "边框背景颜色"
L.media_backdrop_alpha = "透明背景"
L.media_texture = "主要材质"
L.media_subheader_normal = "通用字体"
L.media_subheader_pixel = "像素字体"
-- Font options
L.font = "字体设置"
L.font_subtext = "自定义字体格式"
L.font_stats_font = "字体"
L.font_stats_font_style = "描边"
L.font_stats_font_shadow = "阴影"
L.font_subheader_stats = "信息条"
L.font_subheader_combat = "战斗资讯(xCT)"
L.font_subheader_chat = "聊天信息"
L.font_subheader_chat_tabs = "聊天频道标签"
L.font_subheader_action = "动作条"
L.font_subheader_threat = "仇恨条"
L.font_subheader_raidcd = "团队冷却"
L.font_subheader_cooldown = "冷却时间"
L.font_subheader_loot = "拾取框"
L.font_subheader_nameplates = "单位姓名板"
L.font_subheader_unit = "单位框架"
L.font_subheader_aura = "增益減益"
L.font_subheader_filger = "法术监视(Filger)"
L.font_subheader_style = "界面美化"
L.font_subheader_bag = "背包"
L.font_subheader_blizzard = "系统"
L.font_tooltip_header_font_size = "鼠标提示标题"
L.font_tooltip_font_size = "鼠标提示信息"
L.font_global_font = "禁用像素字体"
-- Skins options
L_GUI_SKINS = "界面美化"
L_GUI_SKINS_SUBTEXT = "对游戏默认界面和单体插件界面进行美化"
L_GUI_SKINS_BLIZZARD = "美化暴雪默认界面"
L_GUI_SKINS_MINIMAP_BUTTONS = "小地图插件图标"
L_GUI_SKINS_SUBHEADER = "单体插件"
L.skins_minimap_buttons_mouseover = "鼠标悬停显示插件图标"
L.skins_bubbles = "美化聊天泡泡"
-- Unit Frames options
L_GUI_UF_SUBTEXT = "定制玩家/目标框架/其他框架"
L_GUI_UF_ENABLE = "单位框架增强"
L_GUI_UF_OWN_COLOR = "自定义颜色"
L_GUI_UF_UF_COLOR = "生命条颜色"
L.unitframe_uf_color_bg = "背景颜色"
L.unitframe_enemy_health_color = "敌对目标生命条以红色着色"
L_GUI_UF_TOTAL_VALUE = "玩家/目标框架显示详细的文字变化"
L_GUI_UF_COLOR_VALUE = "生命值/魔法值按职业着色"
L_GUI_UF_BAR_COLOR_VALUE = "生命值按剩余血量着色"
L_GUI_UF_LINES = "玩家/目标框架显示划线"
L_GUI_UF_SUBHEADER_CAST = "施法条"
L_GUI_UF_UNIT_CASTBAR = "施法条增强"
L_GUI_UF_CASTBAR_ICON = "法术图标"
L_GUI_UF_CASTBAR_LATENCY = "施法延迟"
L_GUI_UF_CASTBAR_TICKS = "施法跳数"
L_GUI_UF_SUBHEADER_FRAMES = "其他框架"
L_GUI_UF_SHOW_PET = "宠物框架"
L_GUI_UF_SHOW_FOCUS = "焦点框架"
L_GUI_UF_SHOW_TOT = "目标的目标框架"
L_GUI_UF_SHOW_BOSS = "Boss框架"
L_GUI_UF_BOSS_RIGHT = "右侧显示Boss框架"
L_GUI_UF_SHOW_ARENA = "竞技场框架"
L_GUI_UF_ARENA_RIGHT = "右侧显示竞技场框架"
L_GUI_UF_BOSS_DEBUFFS = "DeBuff数量"
L_GUI_UF_BOSS_DEBUFFS_DESC = "Boss框架DeBuff数量"
L_GUI_UF_BOSS_BUFFS = "Buff数量"
L_GUI_UF_BOSS_BUFFS_DESC = "Boss框架Buff数量"
L.unitframe_icons_pvp = "PvP状态"
L.unitframe_icons_pvp_desc = "PvP状态(鼠标悬停显示)"
L_GUI_UF_ICONS_COMBAT = "战斗标记"
L_GUI_UF_ICONS_RESTING = "休息标记"
L_GUI_UF_SUBHEADER_PORTRAIT = "3D头像"
L_GUI_UF_PORTRAIT_ENABLE = "玩家/目标头像"
L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = "头像边框按职业着色"
L.unitframe_portrait_type = "头像类型"
L.unitframe_portrait_type_icons = "职业图标"
L.unitframe_portrait_type_overlay = "生命条显示"
L_GUI_UF_PORTRAIT_HEIGHT = "头像高度"
L_GUI_UF_PORTRAIT_WIDTH = "头像宽度"
L_GUI_UF_SUBHEADER_PLUGINS = "辅助功能"
L_GUI_UF_PLUGINS_GCD = "公共CD计时条"
L_GUI_UF_PLUGINS_SWING = "普通攻击计时条"
L.unitframe_plugins_reputation_bar = "声望条"
L.unitframe_plugins_reputation_bar_desc = "在玩家框架左侧鼠标悬停显示,中键锁定显示。"
L.unitframe_plugins_experience_bar = "经验条"
L.unitframe_plugins_experience_bar_desc = "在玩家框架左侧鼠标悬停显示,中键锁定显示。"
L_GUI_UF_PLUGINS_SMOOTH_BAR = "平滑条"
L_GUI_UF_PLUGINS_ENEMY_SPEC = "敌对玩家天赋"
L_GUI_UF_PLUGINS_COMBAT_FEEDBACK = "玩家/目标框架显示战斗文字"
L_GUI_UF_PLUGINS_FADER = "自动隐藏玩家框架"
L_GUI_UF_PLUGINS_DIMINISHING = "竞技场框架显示技能递减"
L_GUI_UF_PLUGINS_POWER_PREDICTION = "即将获得的资源"
L.unitframe_plugins_absorbs = "吸收量"
L.unitframe_subheader_player_width = "玩家/目标框架大小"
L.unitframe_player_width = "宽度"
L.unitframe_subheader_boss_width = "Boss框架与竞技场框架大小"
L.unitframe_extra_height_auto = "血量/能量框架自动增高"
L.unitframe_extra_height_auto_desc = "按字体大小智能调节框架高度"
L.unitframe_extra_health_height = "血量框架额外增高"
L.unitframe_extra_power_height = "能量框架额外增高"
L.unitframe_subheader_castbar = "玩家/目标施法条大小"
L.unitframe_castbar_height = "高度"
-- Unit Frames Class bar options
L_GUI_UF_PLUGINS_CLASS_BAR = "职业资源栏"
L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = "显示职业的特殊资源"
L_GUI_UF_PLUGINS_COMBO_BAR = "连击点"
L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = "总是显示德鲁伊连击点"
L_GUI_UF_PLUGINS_COMBO_BAR_OLD = "目标框架显示连击点"
L_GUI_UF_PLUGINS_ARCANE_BAR = "奥术充能"
L_GUI_UF_PLUGINS_CHI_BAR = "真气"
L_GUI_UF_PLUGINS_STAGGER_BAR = "醉拳池(酒仙武僧)"
L_GUI_UF_PLUGINS_HOLY_BAR = "圣光能量"
L_GUI_UF_PLUGINS_SHARD_BAR = "灵魂碎片"
L_GUI_UF_PLUGINS_RUNE_BAR = "符文"
L_GUI_UF_PLUGINS_TOTEM_BAR = "图腾"
L.unitframe_class_bar_totem_other = "其他职业图腾"
L.unitframe_class_bar_essence = "Enable Essence bar for Evoker" -- Need review
-- Raid Frames options
L_GUI_UF_RAIDFRAMES_SUBTEXT = "定制队伍/团队框架"
L_GUI_UF_BY_ROLE = "按职责排序"
L_GUI_UF_AGGRO_BORDER = "边框按仇恨值着色"
L_GUI_UF_DEFICIT_HEALTH = "团队生命值亏减模式"
L_GUI_UF_SHOW_PARTY = "队伍框架"
L_GUI_UF_SHOW_RAID = "团队框架"
L.raidframe_layout = "团队布局"
L.raidframe_heal_layout = "治疗"
L.raidframe_dps_layout = "输出"
L.raidframe_auto_layout = "自动"
L.raidframe_show_target = "目标框架"
L.raidframe_show_pet = "宠物框架"
L.raidframe_vertical_health = "垂直显示团队框架生命值"
L.raidframe_vertical_health_desc = "仅限治疗布局中生效"
L_GUI_UF_ALPHA_HEALTH = "满血时淡化单位框架"
L_GUI_UF_SHOW_RANGE = "单位框架按距离变化设定透明度"
L_GUI_UF_RANGE_ALPHA = "透明度"
L_GUI_UF_RANGE_ALPHA_DESC = "单位框架超出距离的透明度"
L_GUI_UF_SUBHEADER_RAIDFRAMES = "其他框架"
L_GUI_UF_SOLO_MODE = "总是显示玩家框架"
L_GUI_UF_PLAYER_PARTY = "队伍中显示玩家框架"
L_GUI_UF_SHOW_TANK = "团队主坦克框架"
L_GUI_UF_SHOW_TANK_TT = "坦克目标的目标"
L_GUI_UF_RAID_GROUP = "小队数目"
L.raidframe_party_vertical = "竖向排列队伍"
L.raidframe_raid_groups_vertical = "竖向排列团队队伍"
L.raidframe_raid_groups_vertical_desc = "仅限治疗布局中生效"
L_GUI_UF_SUBHEADER_ICONS = "标记"
L_GUI_UF_ICONS_ROLE = "角色类型标记"
L_GUI_UF_ICONS_RAID_MARK = "团队标记"
L_GUI_UF_ICONS_READY_CHECK = "就绪确认标记"
L_GUI_UF_ICONS_LEADER = "队长/助手标记"
L_GUI_UF_ICONS_SUMON = "召唤标记"
L.raidframe_icons_phase = "相位标记"
L.raidframe_plugins_debuffhighlight_icon = "高亮DeBuff图标"
L.raidframe_plugins_aura_watch = "团队法术监视"
L.raidframe_plugins_aura_watch_timer = "团队减益时间"
L.raidframe_plugins_pvp_debuffs = "PvP DeBuff图标"
L_GUI_UF_PLUGINS_HEALCOMM = "即将受到的治疗"
L.raidframe_plugins_over_absorb = "显示吸收条"
L.raidframe_plugins_over_heal_absorb = "显示过量治疗吸收条"
L.raidframe_plugins_auto_resurrection = "中键施放复活技能"
L.raidframe_plugins_auto_resurrection_desc = "鼠标中键点击已死亡角色时施放复活技能(Clique启用时无效)"
L.raidframe_hide_health_value = "隐藏血量"
L.raidframe_auto_position = "玩家/目标框架自动定位"
L.raidframe_auto_position_desc = "动态: 当小队数目大于5,框架位置按小队数目调整\n仅限治疗布局非竖向排列时生效"
L.raidframe_auto_position_dynamic = "动态"
L.raidframe_auto_position_static = "静态"
L.raidframe_subheader_heal_size = "治疗布局框架大小"
L.raidframe_heal_width = "框架宽度"
L.raidframe_heal_height = "框架高度"
L.raidframe_heal_power_height = "能量框架高度"
L.raidframe_subheader_dps_size = "输出布局框架大小"
L.raidframe_dps_party_width = "队伍框架宽度"
L.raidframe_dps_party_height = "队伍框架高度"
L.raidframe_dps_raid_width = "框架宽度"
L.raidframe_dps_raid_height = "框架高度"
L.raidframe_dps_party_power_height = "队伍能量框架高度"
L.raidframe_dps_raid_power_height = "能量框架高度"
-- ActionBar options
L_GUI_ACTIONBAR = "动作条"
L_GUI_ACTIONBAR_ENABLE = "动作条增强"
L_GUI_ACTIONBAR_HOTKEY = "按键键名"
L_GUI_ACTIONBAR_MACRO = "宏名称"
L_GUI_ACTIONBAR_GRID = "动作条显示空白快捷键"
L_GUI_ACTIONBAR_BUTTON_SIZE = "快捷键大小"
L_GUI_ACTIONBAR_BUTTON_SPACE = "快捷键间距"
L_GUI_ACTIONBAR_SPLIT_BARS = "#5动作条分段(2*6; 该选项开启后将激活所有动作条)"
L_GUI_ACTIONBAR_CLASSCOLOR_BORDER = "动作条边框按职业着色"
L.actionbar_toggle_mode = "自由折叠"
L.actionbar_toggle_mode_desc = "可随时调节动作条显示数目。按钮位于底部动作条上方及右側动作条下方,鼠标悬停显示。"
L_GUI_ACTIONBAR_HIDE_HIGHLIGHT = "关闭动作条技能特效高亮"
L_GUI_ACTIONBAR_BOTTOMBARS = "底部动作条数目"
L_GUI_ACTIONBAR_RIGHTBARS = "右侧动作条数目"
L.actionbar_bottombars_mouseover = "底部动作条鼠标悬停显示"
L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = "右侧动作条鼠标悬停显示"
L_GUI_ACTIONBAR_PETBAR_HIDE = "隐藏宠物动作条"
L_GUI_ACTIONBAR_PETBAR_HORIZONTAL = "宠物动作条横向排列"
L_GUI_ACTIONBAR_PETBAR_MOUSEOVER = "鼠标悬停显示"
L_GUI_ACTIONBAR_STANCEBAR_HIDE = "隐藏变身/姿态动作条"
L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = "变身/姿态动作条横向排列"
L.actionbar_stancebar_horizontal_desc = "位于玩家框架下方"
L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = "鼠标悬停显示"
L_GUI_ACTIONBAR_MICROMENU = "微型菜单"
L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = "鼠标悬停显示"
L.actionbar_editor = "动作条布局"
L.actionbar_editor_desc = "允许动作条独立移动和更改"
L.actionbar_bar1_num = "快捷键数"
L.actionbar_bar1_row = "每行快捷键数"
L.actionbar_bar1_mouseover = "鼠标悬停显示"
-- Tooltip options
L.tooltip = "鼠标提示"
L.tooltip_subtext = "设置鼠标提示"
L.tooltip_enable = "鼠标提示增强"
L.tooltip_shift_modifer = "按下Shift时显示提示"
L.tooltip_cursor = "提示跟随鼠标"
L.tooltip_item_icon = "物品图标"
L.tooltip_health_value = "生命值以百分比显示"
L.tooltip_hidebuttons = "隐藏动作条提示"
L.tooltip_hide_combat = "战斗中隐藏提示"
L.tooltip_subheader = "辅助功能"
L.tooltip_talents = "天赋"
L.tooltip_show_shift = "按下Shift时显示"
L.tooltip_show_shift_desc = "按下Shift时显示天赋/平均装等"
L.tooltip_achievements = "成就比较"
L.tooltip_target = "目标的目标"
L.tooltip_title = "头衔"
L.tooltip_realm = "服务器"
L.tooltip_rank = "公会会阶"
L.tooltip_spell_id = "法术ID"
L.tooltip_average_lvl_desc = "平均装等"
L.tooltip_raid_icon = "团队标记"
L.tooltip_who_targetting = "关注成员(在队伍/团队中谁以目标為目标)"
L.tooltip_item_count = "物品的简易统计"
L.tooltip_unit_role = "角色类型"
L.tooltip_instance_lock = "副本进度比较"
L.tooltip_mount = "坐骑来源"
-- Chat options
L.chat_subtext = "这里可以设置你的聊天框"
L.chat_enable = "聊天框增强"
L.chat_background = "聊天框背景"
L.chat_background_alpha = "聊天框背景透明度"
L.chat_filter = "屏蔽无用系统信息"
L.chat_filter_desc = "决斗, 切换专精, 城中NPC对话"
L.chat_spam = "屏蔽玩家垃圾信息"
L.chat_spam_list = "过滤词列表"
L.chat_spam_list_desc = "添加过滤词 (中文词用空格分隔,英文词用小写分隔)"
L.chat_width = "聊天框宽度"
L.chat_height = "聊天框高度"
L.chat_chat_bar = "聊天频道快捷键"
L.chat_chat_bar_mouseover = "鼠标悬停显示聊天频道快捷键"
L.chat_whisp_sound = "接受密语时声音提示"
L.chat_combatlog = "战斗记录标签"
L.chat_tabs_mouseover = "鼠标悬停显示频道标签"
L.chat_sticky = "记住上一次使用的频道"
L.chat_damage_meter_spam = "在链接中合并垃圾邮件"
L.chat_loot_icons = "拾取信息带图标"
L.chat_hide_combat = "战斗中隐藏"
L.chat_custom_time_color = "自定义时间标签颜色"
L.chat_time_color = "时间标签颜色"
-- Nameplate options
L_GUI_NAMEPLATE_SUBTEXT = "单位姓名板设置"
L_GUI_NAMEPLATE_ENABLE = "单位姓名板增强"
L_GUI_NAMEPLATE_COMBAT = "战斗中自动显示单位姓名板"
L_GUI_NAMEPLATE_HEALTH = "生命值以百分比显示"
L_GUI_NAMEPLATE_HEIGHT = "高度"
L_GUI_NAMEPLATE_WIDTH = "宽度"
L.nameplate_alpha = "透明度"
L.nameplate_alpha_desc = "非当前目标的单位姓名板透明度"
L.nameplate_ad_height = "额外高度"
L.nameplate_ad_width = "额外宽度"
L.nameplate_ad_height_desc = "目标的单位姓名板额外高度"
L.nameplate_ad_width_desc = "目标的单位姓名板额外宽度"
L_GUI_NAMEPLATE_CASTBAR_NAME = "法术名称"
L_GUI_NAMEPLATE_CLASS_ICON = "PvP时显示职业图标"
L_GUI_NAMEPLATE_NAME_ABBREV = "名字缩写"
L.nameplate_short_name = "替换名称"
L.nameplate_clamp = "贴边显示"
L.nameplate_clamp_desc = "当单位姓名板超出屏幕时仍贴边显示"
L_GUI_NAMEPLATE_SHOW_DEBUFFS = "显示DeBuff(需要关闭名字缩写)"
L_GUI_NAMEPLATE_SHOW_BUFFS = "显示可进攻驱散"
L_GUI_NAMEPLATE_DEBUFFS_SIZE = "图标大小"
L_GUI_NAMEPLATE_HEALER_ICON = "战场中显示治疗职业图标"
L_GUI_NAMEPLATE_TOTEM_ICONS = "显示敌对图腾图标"
L.nameplate_target_glow = "目标边框高亮"
L.nameplate_only_name = "友方玩家只显示名称"
L.nameplate_quests = "任务图标"
L.nameplate_cast_color = "重要法术施法条边框高亮"
L.nameplate_kick_color = "当断法技能冷却中则施法条变色"
L.nameplate_low_health_value = "斩杀线阈值"
L.nameplate_low_health = "斩杀边框高亮"
L_GUI_NAMEPLATE_THREAT = "仇恨情况"
L_GUI_NAMEPLATE_GOOD_COLOR = "安全仇恨颜色"
L_GUI_NAMEPLATE_NEAR_COLOR = "临界仇恨颜色"
L_GUI_NAMEPLATE_BAD_COLOR = "危险仇恨颜色"
L_GUI_NAMEPLATE_OFFTANK_COLOR = "副坦仇恨颜色"
L.nameplate_extra_color = "易爆/怨毒词缀颜色"
L.nameplate_mob_color_enable = "副本中重要小怪着色"
L.nameplate_mob_color = "小怪颜色"
-- Combat text options
L_GUI_COMBATTEXT = "战斗文字"
L_GUI_COMBATTEXT_SUBTEXT = "键入 /xct 获取更多可用命令"
L_GUI_COMBATTEXT_ENABLE = "启用xCT战斗信息"
L.combattext_blizz_head_numbers = "启用暴雪默认战斗信息"
L.combattext_blizz_head_numbers_desc = "暴雪默认伤害/治疗模式(需关闭xCT战斗信息)"
L.combattext_damage_style = "改变默认的显示风格"
L.combattext_damage_style_desc = "改变模型顶部/玩家头像的伤害/治疗字体"
L_GUI_COMBATTEXT_DAMAGE = "独立显示伤害输出"
L_GUI_COMBATTEXT_HEALING = "独立显示治疗输出"
L.combattext_incoming = "滚动战斗记录"
L_GUI_COMBATTEXT_HOTS = "Hot造成的治疗"
L_GUI_COMBATTEXT_OVERHEALING = "过量治疗输出"
L_GUI_COMBATTEXT_PET_DAMAGE = "宠物伤害输出"
L_GUI_COMBATTEXT_DOT_DAMAGE = "Dot造成的伤害"
L_GUI_COMBATTEXT_DAMAGE_COLOR = "伤害文字按法术类型着色"
L_GUI_COMBATTEXT_CRIT_PREFIX = "暴击时文本左侧修饰符号"
L_GUI_COMBATTEXT_CRIT_POSTFIX = "暴击时文本右侧修饰符号"
L_GUI_COMBATTEXT_ICONS = "伤害输出技能图标"
L_GUI_COMBATTEXT_ICON_SIZE = "图标大小"
L_GUI_COMBATTEXT_ICON_SIZE_DESC = "伤害输出图标大小"
L_GUI_COMBATTEXT_TRESHOLD = "伤害输出最小阈值"
L_GUI_COMBATTEXT_HEAL_TRESHOLD = "承受/输出治疗最小阈值"
L_GUI_COMBATTEXT_SCROLLABLE = "允许使用鼠标滚轮滚动区域"
L_GUI_COMBATTEXT_MAX_LINES = "最大行数"
L_GUI_COMBATTEXT_MAX_LINES_DESC = "滚动区域显示最大行数"
L_GUI_COMBATTEXT_TIME_VISIBLE = "时间"
L_GUI_COMBATTEXT_TIME_VISIBLE_DESC = "信息保留时间(秒)"
L_GUI_COMBATTEXT_DK_RUNES = "死亡骑士符文恢复"
L_GUI_COMBATTEXT_KILLINGBLOW = "击杀信息"
L.combattext_merge_aoe_spam = "将AOE伤害合并为一条信息"
L.combattext_merge_aoe_spam_desc = "将AOE伤害合并为一条信息"
L_GUI_COMBATTEXT_MERGE_MELEE = "将多个自动攻击伤害合并为一条信息"
L.combattext_merge_all = "Merges all spells" -- Needs review
L_GUI_COMBATTEXT_DISPEL = "当你驱散成功时提示"
L_GUI_COMBATTEXT_INTERRUPT = "当你打断成功时提示"
L_GUI_COMBATTEXT_DIRECTION = "滚动方向从下向上"
L_GUI_COMBATTEXT_SHORT_NUMBERS = "数值以K为单位显示"
-- Auras/Buffs/Debuffs
L_GUI_AURA_PLAYER_BUFF_SIZE = "Buff大小"
L_GUI_AURA_PLAYER_BUFF_SIZE_DESC = "玩家Buff图标大小"
L.aura_debuff_size = "DeBuffs大小"
L_GUI_AURA_SHOW_SPIRAL = "漩涡冷却样式"
L_GUI_AURA_SHOW_TIMER = "层数堆叠"
L_GUI_AURA_PLAYER_AURAS = "玩家显示法术效果"
L_GUI_AURA_TARGET_AURAS = "目标显示法术效果"
L_GUI_AURA_FOCUS_DEBUFFS = "焦点显示DeBuff"
L_GUI_AURA_FOT_DEBUFFS = "焦点的目标显示DeBuff"
L_GUI_AURA_PET_DEBUFFS = "宠物显示DeBuff"
L_GUI_AURA_TOT_DEBUFFS = "目标的目标显示DeBuff"
L.aura_subheader_boss = "Boss显示Buff/DeBuff"
L_GUI_AURA_PLAYER_AURA_ONLY = "目标只显示自身施放的DeBuff"
L_GUI_AURA_DEBUFF_COLOR_TYPE = "DeBuff按法术类型着色"
L_GUI_AURA_CAST_BY = "提示Buff/DeBuff提供者"
L_GUI_AURA_CLASSCOLOR_BORDER = "自身Buff图标边框按职业着色"
L.aura_subheader_buffs = "玩家Buff"
L.aura_subheader_debuffs = "Debuffs"
-- Bag options
L_GUI_BAGS = "背包"
L_GUI_BAGS_SUBTEXT = "背包的关闭按钮另有菜单按右键开启。按住Shift+左键可拖动。"
L_GUI_BAGS_ENABLE = "背包增强"
L_GUI_BAGS_ILVL = "显示物品等级"
L.bag_new_items = "新物品闪动显示"
L.bag_filter = "Always show filter buttons" -- Need review
L_GUI_BAGS_BUTTON_SIZE = "格子大小"
L_GUI_BAGS_BUTTON_SPACE = "格子间距"
L_GUI_BAGS_BANK = "银行每行格数"
L_GUI_BAGS_BAG = "背包每行格数"
-- Minimap options
L_GUI_MINIMAP_SUBTEXT = "小地图设置"
L_GUI_MINIMAP_ENABLE = "小地图增强"
L.minimap_on_top = "小地图定位到右上角"
L_GUI_MINIMAP_ICON = "追踪菜单"
L_GUI_GARRISON_ICON = "圣所报告图标"
L_GUI_MINIMAP_SIZE = "小地图大小"
L_GUI_MINIMAP_HIDE_COMBAT = "战斗中隐藏小地图"
L_GUI_MINIMAP_TOGGLE_MENU = "小地图顶部快捷菜单"
L.minimap_bg_map_stylization = "战场地图增强"
L.minimap_fog_of_war = "地图全亮"
-- Loot options
L_GUI_LOOT_SUBTEXT = "拾取框架设置"
L_GUI_LOOT_ENABLE = "拾取增强"
L_GUI_LOOT_ROLL_ENABLE = "团队拾取框架增强"
L_GUI_LOOT_ICON_SIZE = "拾取框架图标大小"
L_GUI_LOOT_WIDTH = "拾取框架宽度"
L_GUI_LOOT_AUTOGREED = "满级后自动贪婪绿色物品"
L_GUI_LOOT_AUTODE = "自动选择分解"
L.loot_faster_loot = "快速拾取"
L.loot_faster_loot_desc = "仅在自动拾取模式中生效"
-- Filger
L_GUI_FILGER = "法术监视"
L_GUI_FILGER_SUBTEXT = "Filger - 类似WeakAuras,更简单易用,可选择图标和计时条形式显示你的增益减益和计时。"
L_GUI_FILGER_ENABLE = "法术监视"
L_GUI_FILGER_TEST_MODE = "调试模式"
L_GUI_FILGER_MAX_TEST_ICON = "调试模式图标数量"
L_GUI_FILGER_SHOW_TOOLTIP = "鼠标指向提示"
L.filger_subheader_elements = "分组显示"
L.filger_show_buff = "玩家Buff"
L.filger_show_proc = "玩家Procs Buff"
L.filger_show_debuff = "目标DeBuff"
L.filger_show_aura_bar = "目标Buff计时条"
L.filger_show_special = "玩家Special Buff"
L.filger_show_pvp_player = "玩家PvP DeBuff"
L.filger_show_pvp_target = "目标PvP DeBuff"
L.filger_show_cd = "技能冷却"
L.filger_subheader_size = "图标大小"
L.filger_subheader_test = "调试模式"
L_GUI_FILGER_EXPIRATION = "按冷却时间排序"
L_GUI_FILGER_BUFFS_SIZE = "Buff图标大小"
L_GUI_FILGER_COOLDOWN_SIZE = "技能冷却图标大小"
L_GUI_FILGER_PVP_SIZE = "PvP DeBuff图标大小"
L.filger_buffs_space = "图标间距"
L.filger_pvp_space = "图标间距"
L.filger_cooldown_space = "图标间距"
L.filger_subheader_spells = "添加法术"
L.filger_category_list = "分组"
-- Announcements options
L_GUI_ANNOUNCEMENTS = "通告预警"
L_GUI_ANNOUNCEMENTS_SUBTEXT = "添加特定事件進行通报"
L.announcements_drinking = "当敌人进食时在聊天框进行通告"
L.announcements_interrupts = "断法"
L.announcements_interrupts_desc = "当你打断成功时在队伍/团队中进行通告"
L.announcements_spells = "施法"
L.announcements_spells_desc = "当你施放指定法术时在队伍/团队中进行通告"
L.announcements_spells_from_all = "检查所有队员"
L.announcements_spells_from_all_desc = "检查来源包括所有队员"
L.announcements_toys = "使用玩具火车/烈酒的遥控器时进行通告"
L.announcements_pull_countdown = "倒计时通告"
L.announcements_pull_countdown_desc = "倒计时通告(/pc #)"
L.announcements_flask_food = "食物和合剂"
L.announcements_flask_food_desc = "通告食物和合剂的使用情況(/ffcheck)"
L.announcements_flask_food_raid = "在团队频道通告"
L.announcements_flask_food_auto = "当团队就位确认时进行检查"
L.announcements_feasts = "放置食物/大锅/灵魂井/修理机器人时进行通告"
L.announcements_portals = "开启传送门/召唤仪式时进行通告"
L.announcements_subheader_self = "个人通告"
L.announcements_bad_gear = "检查装备"
L.announcements_bad_gear_desc = "进入副本时提醒非副本装备(鱼竿等装备)"
L.announcements_safari_hat = "狩猎帽"
L.announcements_safari_hat_desc = "检查'狩猎帽'使用情况"
-- Automation options
L_GUI_AUTOMATION = "自动设定"
L_GUI_AUTOMATION_SUBTEXT = "一些自动化的设置"
L.automation_release = "战场中自动释放灵魂"
L.automation_screenshot = "获得成就时自动截屏"
L.automation_solve_artifact = "自动辨识考古文物"
L.automation_solve_artifact_desc = "当有足夠碎片时自动弹出辨识窗口并插上符文石"
L.automation_accept_invite = "自动接受好友/公会成员的组队邀请"
L.automation_decline_duel = "自动取消决斗"
L.automation_accept_quest = "自动交接任务(按住Shift临时停用)"
L.automation_auto_collapse = "自动折叠任务追踪框架"
L.automation_auto_collapse_raid = "副本中"
L.automation_auto_collapse_reload = "重载后"
L.automation_auto_collapse_scenario = "场景战役"
L.automation_skip_cinematic = "自动跳过过场动画(按住Ctrl临时停用)"
L.automation_auto_role = "自动设定角色类型"
L.automation_cancel_bad_buffs = "自动取消非增益性质的Buff"
L.automation_tab_binder = "Tab键只选定玩家"
L.automation_tab_binder_desc = "在PvP区域按Tab键只选取敌对玩家目标,忽略宠物图腾等次要目标。"
L.automation_logging_combat = "团队副本时自动开启战斗记录"
L.automation_buff_on_scroll = "使用鼠标滚轮施放Buff"
L.automation_buff_on_scroll_desc = "指定Buff缺失时使用鼠标滚轮施放"
L.automation_open_items = "自动打开背包中的封装物品"
L.automation_resurrection = "自动确认复活"
L.automation_summon = "自动确认召唤"
L.automation_whisper_invite = "密语自动邀请"
L.automation_invite_keyword = "添加关键词(需加空隔键)"
L.automation_invite_keyword_desc = "通过关键词自动邀请对方进组"
-- Buffs reminder options
L_GUI_REMINDER = "Buff提示"
L_GUI_REMINDER_SUBTEXT = "提示缺失的Buff"
L_GUI_REMINDER_SOLO_ENABLE = "自身Buff缺失时图标提示"
L_GUI_REMINDER_SOLO_SOUND = "自身Buff缺失时声音提示"
L_GUI_REMINDER_SOLO_SIZE = "图标大小"
L_GUI_REMINDER_SOLO_SIZE_DESC = "自身Buff提示图标大小"
L_GUI_REMINDER_SUBHEADER = "团队Buff"
L_GUI_REMINDER_RAID_ENABLE = "团队Buff缺失时图标提示"
L_GUI_REMINDER_RAID_ALWAYS = "总是显示Buff提示"
L_GUI_REMINDER_RAID_SIZE = "图标大小"
L_GUI_REMINDER_RAID_SIZE_DESC = "团队Buff提示图标大小"
L_GUI_REMINDER_RAID_ALPHA = "透明度"
L_GUI_REMINDER_RAID_ALPHA_DESC = "当团队Buff存在时图标透明度"
-- Raid cooldowns options
L_GUI_COOLDOWN_RAID = "团队技能冷却"
L_GUI_COOLDOWN_RAID_SUBTEXT = "显示在屏幕左上方"
L_GUI_COOLDOWN_RAID_ENABLE = "团队技能冷却"
L_GUI_COOLDOWN_RAID_HEIGHT = "计量条高度"
L_GUI_COOLDOWN_RAID_WIDTH = "计量条宽度"
L_GUI_COOLDOWN_RAID_SORT = "团队技能冷却向上延伸"
L_GUI_COOLDOWN_RAID_EXPIRATION = "按冷却时间排序"
L_GUI_COOLDOWN_RAID_SHOW_SELF = "自身团队技能"
L_GUI_COOLDOWN_RAID_ICONS = "团队技能冷却图标"
L_GUI_COOLDOWN_RAID_IN_RAID = "团队中显示团队技能冷却"
L_GUI_COOLDOWN_RAID_IN_PARTY = "队伍中显示团队技能冷却"
L_GUI_COOLDOWN_RAID_IN_ARENA = "竞技场中显示团队技能冷却"
-- Enemy cooldowns options
L_GUI_COOLDOWN_ENEMY = "敌对技能冷却"
L_GUI_COOLDOWN_ENEMY_SUBTEXT = "显示在你的施法条上方"
L_GUI_COOLDOWN_ENEMY_ENABLE = "敌对技能冷却"
L_GUI_COOLDOWN_ENEMY_SIZE = "敌对技能冷却图标大小"
L_GUI_COOLDOWN_ENEMY_DIRECTION = "敌对技能冷却图标方向"
L_GUI_COOLDOWN_ENEMY_EVERYWHERE = "始终显示敌对技能冷却"
L_GUI_COOLDOWN_ENEMY_IN_BG = "战场中显示敌对技能冷却"
L_GUI_COOLDOWN_ENEMY_IN_ARENA = "竞技场中显示敌对技能冷却"
L.enemycooldown_show_inparty = "组队时显示敌对技能冷却"
L.enemycooldown_class_color = "按职业着色"
-- Pulse cooldowns options
L_GUI_COOLDOWN_PULSE = "技能冷却闪烁"
L_GUI_COOLDOWN_PULSE_SUBTEXT = "显示在屏幕中央"
L_GUI_COOLDOWN_PULSE_ENABLE = "技能冷却闪烁提示"
L_GUI_COOLDOWN_PULSE_SIZE = "技能冷却闪烁大小"
L_GUI_COOLDOWN_PULSE_SOUND = "播放声音提醒"
L_GUI_COOLDOWN_PULSE_ANIM_SCALE = "动画缩放"
L_GUI_COOLDOWN_PULSE_HOLD_TIME = "持续时间"
L_GUI_COOLDOWN_PULSE_THRESHOLD = "持续时间最小阈值"
L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = "持续时间最小阈值"
-- Threat options
L_GUI_THREAT = "仇恨栏"
L_GUI_THREAT_SUBTEXT = "仇恨威胁值统计(类似Omen)"
L_GUI_THREAT_ENABLE = "仇恨栏"
L_GUI_THREAT_HEIGHT = "仇恨栏高度"
L_GUI_THREAT_WIDTH = "仇恨栏宽度"
L_GUI_THREAT_ROWS = "仇恨栏数目"
L_GUI_THREAT_HIDE_SOLO = "仅在队伍/团队中开启"
-- Top panel options
L_GUI_TOP_PANEL = "顶部信息条"
L_GUI_TOP_PANEL_SUBTEXT = "管理顶部信息条"
L_GUI_TOP_PANEL_ENABLE = "顶部信息条"
L_GUI_TOP_PANEL_MOUSE = "鼠标悬停时显示顶部信息条"
L_GUI_TOP_PANEL_WIDTH = "信息条宽度"
L_GUI_TOP_PANEL_HEIGHT = "信息条高度"
-- Stats options
L_GUI_STATS = "信息条"
L_GUI_STATS_SUBTEXT = "位于屏幕底部的信息条,键入 /ls 获取更多资讯。"
L_GUI_STATS_CLOCK = "时钟"
L_GUI_STATS_LATENCY = "延迟"
L_GUI_STATS_FPS = "帧数"
L_GUI_STATS_EXPERIENCE = "经验"
L_GUI_STATS_TALENTS_DESC = "左键专精选单/右键拾取专精选单"
L_GUI_STATS_COORDS = "坐标"
L_GUI_STATS_LOCATION = "位置"
L_GUI_STATS_BG = "战场分数"
L.stats_bottom_line = "底部职业着色划线"
L_GUI_STATS_SUBHEADER_CURRENCY = "货币(金币信息中显示)"
L_GUI_STATS_CURRENCY_ARCHAEOLOGY = "考古"
L_GUI_STATS_CURRENCY_COOKING = "烹饪"
L_GUI_STATS_CURRENCY_RAID = "副本徽记"
-- Trade options
L_GUI_TRADE = "商业"
L_GUI_TRADE_SUBTEXT = "专业和商业设罝"
L.trade_profession_tabs = "专业介面快捷按鈕"
L.trade_profession_tabs_desc = "专业/商业介面显示快捷按鈕"
L.trade_already_known = "彩色显示已学会的"
L.trade_already_known_desc = "彩色显示已学会的食谱/图纸/坐骑/宠物"
L.trade_disenchanting = "快捷研磨"
L.trade_disenchanting_desc = "Alt+左键包里物品即可快捷研磨/选矿/分解/开锁"
L.trade_sum_buyouts = "总结拍卖物品的总金额"
L.trade_sum_buyouts_desc = "拍卖界面显示拍卖物品的总金额"
L.trade_enchantment_scroll = "附魔界面显示附魔卷轴数量"
L.trade_archaeology = "考古学小助手"
L.trade_archaeology_desc = "显示考古学各类文物的进度及符文石数量(键入 /arch 或点击小地图隐藏按键打开界面)"
L.trade_merchant_itemlevel = "商人界面显示物品等级"
L.trade_merchant_itemlevel_desc = "在商人界面显示武器装备的物品等级"
-- Miscellaneous options
L_GUI_MISC_SUBTEXT = "一些便捷的功能设置"
L.misc_shift_marking = "鼠标目标标记"
L.misc_shift_marking_desc = "鼠标指向目标Shift+左键显示团队标记菜单(仅限队伍/团队)"
L.misc_afk_spin_camera = "AFK时旋转镜头"
L.misc_quest_auto_button = "任务/道具自动按钮"
L.misc_quest_auto_button_desc = "任务/道具自动按钮"
L.misc_raid_tools = "团队工具"
L.misc_raid_tools_desc = "团队管理便捷功能: 右键就位确认,中键角色检查,左键展开更多功能(仅限队长/助手)"
L.misc_item_level = "角色界面显示物品等级"
L.misc_item_level_desc = "角色界面显示武器装备的物品等级"
L.misc_click_cast = "简单的点击施法绑定"
L.misc_click_cast_desc = "开启后法术书有鼠标绑定界面可以进行设置"
L.misc_click_cast_filter = "忽略玩家/目标框架点击施法"
L.misc_chars_currency = "追踪所有角色的货币"
L.misc_chars_currency_desc = "在货币界面中追踪所有角色的货币"
L.misc_hide_raid_button = "输出布局最小化按钮"
L.misc_hide_raid_button_desc = "按钮在团队框架左上方鼠标悬停显示"
================================================
FILE: ShestakUI_Config/Locales/English.lua
================================================
local _, L = ...
----------------------------------------------------------------------------------------
-- Localization for enUS and enGB client
----------------------------------------------------------------------------------------
L_GUI_SET_SAVED_SETTTINGS = "Set settings Per-Character"
L_GUI_SET_SAVED_SETTTINGS_DESC = "Switch between a profile that applies to all characters and one that is unique to this character."
L_GUI_RESET_CHAR = "Are you sure you want to reset your character's settings for ShestakUI?"
L_GUI_RESET_ALL = "Are you sure you want to reset all settings for ShestakUI"
L_GUI_PER_CHAR = "Are you sure you want to change to or from 'Per Char Settings'?"
L_GUI_RESET_CAT = "Are you sure you want to reset category's settings?"
L_GUI_RESET_CAT_DESC = "Reset category's settings. \nCTRL-click to reset all"
L_GUI_NEED_RELOAD = "You need to reload the UI to apply your changes."
L_GUI_LAYOUT = "Change layout"
L_GUI_SPELL_LIST = "List of spells"
L_GUI_SPELL_INPUT = "Spell ID"
L_GUI_TIME_INPUT = "Time"
L_GUI_EXPERT_MODE = "Expert mode"
L_GUI_EXPERT_MODE_DESC = "Custom editing of Lua profile"
L_GUI_RESET_SPELLS_DESC = "CTRL-click to reset list"
L_GUI_INFO = "Info & Help"
L_GUI_WIKI_URL = "https://github.com/Wetxius/ShestakUI_Help/wiki/English"
-- Profile
L.profile = "Profile"
L.profile_title = "Profile options"
L.profile_choose = "Choose profile"
L.profile_options = "Settings"
L.profile_movers = "Moving elements"
L.profile_export = "Export"
L.profile_import = "Import"
L.profile_error_lib = "To enable export and import - install WeakAuras"
L.profile_error_code = "Error in imported code!"
-- General options
L_GUI_GENERAL_SUBTEXT = "These settings control the general user interface settings. Type in chat '/uihelp' for help."
L_GUI_GENERAL_WELCOME_MESSAGE = "Welcome message in chat"
L_GUI_GENERAL_AUTOSCALE = "Auto UI Scale"
L_GUI_GENERAL_UISCALE = "UI Scale (if auto-scale is disabled)"
L.general_subheader_blizzard = "Blizzard UI elements"
L.general_error_filter = "Error filtering"
L.general_error_blacklist = "Blacklist"
L.general_error_whitelist = "Whitelist"
L.general_error_combat = "In combat"
L.general_error_none = "None"
L.general_vehicle_mouseover = "Vehicle frame on mouseover"
L.general_move_blizzard = "Move some Blizzard frames"
L.general_color_picker = "Improved ColorPicker"
L.general_color_picker_desc = "Add copy/paste buttons and digit text entry for Blizzard color picker frame"
L.general_minimize_mouseover = "Mouseover for quest minimize button"
L.general_hide_banner = "Hide Boss Banner Loot Frame"
L.general_hide_talking_head = "Hide Talking Head Frame"
L.general_hide_maw_buffs = "Hide Maw Buffs frame in instances"
-- Media options
L.media_border_color = "Color for borders"
L.media_classborder_color = "Color for class borders"
L.media_backdrop_color = "Color for borders backdrop"
L.media_backdrop_alpha = "Alpha for transparent backdrop"
L.media_texture = "Main texture"
L.media_subheader_normal = "Change general font"
L.media_subheader_pixel = "Change secondary font"
-- Font options
L.font = "Fonts"
L.font_subtext = "Customize individual fonts for elements. 'MONOCHROMEOUTLINE' for pixel fonts only."
L.font_stats_font = "Select font"
L.font_stats_font_style = "Font flag"
L.font_stats_font_shadow = "Font shadow"
L.font_subheader_stats = "Stats font"
L.font_subheader_combat = "Combat text font"
L.font_subheader_chat = "Chat font"
L.font_subheader_chat_tabs = "Chat tabs font"
L.font_subheader_action = "Action bars font"
L.font_subheader_threat = "Threat meter font"
L.font_subheader_raidcd = "Raid cooldowns font"
L.font_subheader_cooldown = "Cooldowns timer font"
L.font_subheader_loot = "Loot font"
L.font_subheader_nameplates = "Nameplates font"
L.font_subheader_unit = "Unit frames font"
L.font_subheader_aura = "Auras font"
L.font_subheader_filger = "Filger bar font"
L.font_subheader_style = "Stylization font"
L.font_subheader_bag = "Bags font"
L.font_subheader_blizzard = "System font size"
L.font_tooltip_header_font_size = "Tooltip header"
L.font_tooltip_font_size = "Tooltip text"
L.font_global_font = "Disable Pixel font"
-- Skins options
L_GUI_SKINS = "Stylization"
L_GUI_SKINS_SUBTEXT = "Change the appearance of the standard interface."
L_GUI_SKINS_BLIZZARD = "Enable styling Blizzard frames"
L_GUI_SKINS_MINIMAP_BUTTONS = "Enable styling addons icons on minimap"
L_GUI_SKINS_SUBHEADER = "Stylization of addons"
L.skins_ace3 = "Ace3"
L.skins_atlasloot = "AtlasLoot"
L.skins_bigwigs = "BigWigs"
L.skins_blood_shield_tracker = "BloodShieldTracker"
L.skins_capping = "Capping"
L.skins_clique = "Clique"
L.skins_cool_line = "CoolLine"
L.skins_dbm = "DBM"
L.skins_details = "Details"
L.skins_dominos = "Dominos"
L.skins_flyout_button = "FlyoutButtonCustom"
L.skins_ls_toasts = "ls: Toasts"
L.skins_mage_nuggets = "MageNuggets"
L.skins_my_role_play = "MyRolePlay"
L.skins_npcscan = "NPCScan"
L.skins_nug_running = "NugRunning"
L.skins_omen = "Omen"
L.skins_opie = "OPie"
L.skins_ovale = "OvaleSpellPriority"
L.skins_postal = "Postal"
L.skins_recount = "Recount"
L.skins_rematch = "Rematch"
L.skins_skada = "Skada"
L.skins_tiny_dps = "TinyDPS"
L.skins_vanaskos = "VanasKoS"
L.skins_weak_auras = "WeakAuras"
L.skins_minimap_buttons_mouseover = "Addons icons on mouseover"
L.skins_bubbles = "Skin Blizzard chat bubbles"
-- Unit Frames options
L_GUI_UF_SUBTEXT = "Customize player, target frames and etc."
L_GUI_UF_ENABLE = "Enable unit frames"
L_GUI_UF_OWN_COLOR = "Set your color for health bars"
L_GUI_UF_UF_COLOR = "Color of health bars"
L.unitframe_uf_color_bg = "Color of health background"
L.unitframe_enemy_health_color = "Enemy target healthbar is red"
L_GUI_UF_TOTAL_VALUE = "Display of info text on player and target with XXXX/Total"
L_GUI_UF_COLOR_VALUE = "Health/mana value is colored"
L_GUI_UF_BAR_COLOR_VALUE = "Health bar color by current health remaining"
L_GUI_UF_LINES = "Show Player and Target lines"
L_GUI_UF_SUBHEADER_CAST = "Castbars"
L_GUI_UF_UNIT_CASTBAR = "Show castbars"
L_GUI_UF_CASTBAR_ICON = "Show castbar icons"
L_GUI_UF_CASTBAR_LATENCY = "Castbar latency"
L_GUI_UF_CASTBAR_TICKS = "Castbar ticks"
L_GUI_UF_SUBHEADER_FRAMES = "Frames"
L_GUI_UF_SHOW_PET = "Pet"
L_GUI_UF_SHOW_FOCUS = "Focus"
L_GUI_UF_SHOW_TOT = "Target of target"
L_GUI_UF_SHOW_BOSS = "Bosses"
L_GUI_UF_BOSS_RIGHT = "Boss frames on the right"
L_GUI_UF_SHOW_ARENA = "Arena"
L_GUI_UF_ARENA_RIGHT = "Arena frames on the right"
L_GUI_UF_BOSS_DEBUFFS = "Number of debuffs"
L_GUI_UF_BOSS_DEBUFFS_DESC = "Number of debuffs on the boss frames"
L_GUI_UF_BOSS_BUFFS = "Number of buffs"
L_GUI_UF_BOSS_BUFFS_DESC = "Number of buffs on the boss frames"
L.unitframe_icons_pvp = "PvP status text"
L.unitframe_icons_pvp_desc = "Mouseover PvP text(not icons) on player and target frames"
L_GUI_UF_ICONS_COMBAT = "Combat icon"
L_GUI_UF_ICONS_RESTING = "Resting icon"
L_GUI_UF_SUBHEADER_PORTRAIT = "3D Portraits"
L_GUI_UF_PORTRAIT_ENABLE = "Enable player/target 3D portraits"
L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = "Classcolor border for portraits"
L.unitframe_portrait_type = "Type of portraits"
L.unitframe_portrait_type_icons = "Class Icons"
L.unitframe_portrait_type_overlay = "Overlay"
L_GUI_UF_PORTRAIT_HEIGHT = "Portrait height"
L_GUI_UF_PORTRAIT_WIDTH = "Portrait width"
L_GUI_UF_SUBHEADER_PLUGINS = "Plugins"
L_GUI_UF_PLUGINS_GCD = "Global cooldown spark on player frame"
L_GUI_UF_PLUGINS_SWING = "Enable swing bar"
L.unitframe_plugins_reputation_bar = "Reputation bar"
L.unitframe_plugins_reputation_bar_desc = "Enable Reputation bar (left from player frame by mouseover, Middle-Click to lock visibility)"
L.unitframe_plugins_experience_bar = "Experience bar"
L.unitframe_plugins_experience_bar_desc = "Enable Experience bar (left from player frame by mouseover, Middle-Click to lock visibility)"
L_GUI_UF_PLUGINS_SMOOTH_BAR = "Smooth bar"
L_GUI_UF_PLUGINS_ENEMY_SPEC = "Show enemy talent spec in BG and Arena"
L_GUI_UF_PLUGINS_COMBAT_FEEDBACK = "Combat text on player/target frame"
L_GUI_UF_PLUGINS_FADER = "Fade unit frames"
L_GUI_UF_PLUGINS_DIMINISHING = "Diminishing Returns icons on arena frames"
L_GUI_UF_PLUGINS_POWER_PREDICTION = "Power cost prediction bar on player frame"
L.unitframe_plugins_absorbs = "Absorbs value on player frame"
L.unitframe_subheader_player_width = "Player and target frame size"
L.unitframe_player_width = "Width"
L.unitframe_subheader_boss_width = "Boss and arena frame size"
L.unitframe_extra_height_auto = "Auto height for health/power"
L.unitframe_extra_height_auto_desc = "Smart adjust depending on font size"
L.unitframe_extra_health_height = "Additional height for health"
L.unitframe_extra_power_height = "Additional height for power"
L.unitframe_subheader_castbar = "Size of player and target castbar"
L.unitframe_castbar_height = "Height"
-- Unit Frames Class bar options
L_GUI_UF_PLUGINS_CLASS_BAR = "Class Power Bars"
L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = "Control of special class resources."
L_GUI_UF_PLUGINS_COMBO_BAR = "Enable Rogue/Druid Combo bar"
L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = "Always show Combo bar for Druid"
L_GUI_UF_PLUGINS_COMBO_BAR_OLD = "Show combo point on the target"
L_GUI_UF_PLUGINS_ARCANE_BAR = "Enable Arcane Charge bar"
L_GUI_UF_PLUGINS_CHI_BAR = "Enable Chi bar"
L_GUI_UF_PLUGINS_STAGGER_BAR = "Enable Stagger bar (for Monk Tanks)"
L_GUI_UF_PLUGINS_HOLY_BAR = "Enable Holy Power bar"
L_GUI_UF_PLUGINS_SHARD_BAR = "Enable Shards bar"
L_GUI_UF_PLUGINS_RUNE_BAR = "Enable Rune bar"
L_GUI_UF_PLUGINS_TOTEM_BAR = "Enable Totem bar for Shaman"
L.unitframe_class_bar_totem_other = "Enable Totem bar for other classes"
L.unitframe_class_bar_essence = "Enable Essence bar for Evoker"
-- Raid Frames options
L_GUI_UF_RAIDFRAMES_SUBTEXT = "Customize the appearance of the raid frames."
L_GUI_UF_BY_ROLE = "Sorting players in group by role"
L_GUI_UF_AGGRO_BORDER = "Aggro border"
L_GUI_UF_DEFICIT_HEALTH = "Raid deficit health"
L_GUI_UF_SHOW_PARTY = "Show party frames"
L_GUI_UF_SHOW_RAID = "Show raid frames"
L.raidframe_layout = "Raid layout"
L.raidframe_heal_layout = "Heal"
L.raidframe_dps_layout = "DPS"
L.raidframe_auto_layout = "Auto"
L.raidframe_show_target = "Show target frames"
L.raidframe_show_pet = "Show pet frames"
L.raidframe_vertical_health = "Vertical orientation of health"
L.raidframe_vertical_health_desc = "Only for heal layout"
L_GUI_UF_ALPHA_HEALTH = "Alpha of healthbars when 100%hp"
L_GUI_UF_SHOW_RANGE = "Show range opacity for raidframes"
L_GUI_UF_RANGE_ALPHA = "Alpha"
L_GUI_UF_RANGE_ALPHA_DESC = "Alpha of unitframes when unit is out of range"
L_GUI_UF_SUBHEADER_RAIDFRAMES = "Frames"
L_GUI_UF_SOLO_MODE = "Show frames when solo"
L_GUI_UF_PLAYER_PARTY = "Show player frame in party"
L_GUI_UF_SHOW_TANK = "Show raid tanks"
L_GUI_UF_SHOW_TANK_TT = "Show raid tanks target target"
L_GUI_UF_RAID_GROUP = "Number of groups in raid"
L.raidframe_party_vertical = "Vertical party frames"
L.raidframe_raid_groups_vertical = "Vertical raid groups"
L.raidframe_raid_groups_vertical_desc = "Only for heal layout"
L_GUI_UF_SUBHEADER_ICONS = "Icons"
L_GUI_UF_ICONS_ROLE = "Roles"
L_GUI_UF_ICONS_RAID_MARK = "Raid marks"
L_GUI_UF_ICONS_READY_CHECK = "Ready check"
L_GUI_UF_ICONS_LEADER = "Leader and assistant"
L_GUI_UF_ICONS_SUMON = "Summon icons"
L.raidframe_icons_phase = "Phase"
L.raidframe_plugins_debuffhighlight_icon = "Show dispellable debuff icon"
L.raidframe_plugins_aura_watch = "Raid debuff icons (from the list)"
L.raidframe_plugins_aura_watch_timer = "Timer on raid debuff icons"
L.raidframe_plugins_pvp_debuffs = "Show PvP debuff icons (from the list)"
L_GUI_UF_PLUGINS_HEALCOMM = "Show incoming heal on frame"
L.raidframe_plugins_over_absorb = "Show over absorb bar on frame"
L.raidframe_plugins_over_heal_absorb = "Show over heal absorb on frame"
L.raidframe_plugins_auto_resurrection = "Auto cast resurrection"
L.raidframe_plugins_auto_resurrection_desc = "Auto cast resurrection on middle-click (doesn't work with Clique)"
L.raidframe_hide_health_value = "Hide raid health value"
L.raidframe_auto_position = "Auto reposition raid frame"
L.raidframe_auto_position_desc = "If there are more than 5 groups, the frame points changes. \nOnly for heal layout"
L.raidframe_auto_position_dynamic = "Dynamic"
L.raidframe_auto_position_static = "Static"
L.raidframe_subheader_heal_size = "Size for heal layout"
L.raidframe_heal_width = "Frame width"
L.raidframe_heal_height = "Frame height"
L.raidframe_heal_power_height = "Power height"
L.raidframe_subheader_dps_size = "Size for dps layout"
L.raidframe_dps_party_width = "Party width"
L.raidframe_dps_party_height = "Party height"
L.raidframe_dps_raid_width = "Raid width"
L.raidframe_dps_raid_height = "Raid height"
L.raidframe_dps_party_power_height = "Party power height"
L.raidframe_dps_raid_power_height = "Raid power height"
-- ActionBar options
L_GUI_ACTIONBAR = "Action Bars"
L_GUI_ACTIONBAR_ENABLE = "Enable action bars"
L_GUI_ACTIONBAR_HOTKEY = "Show hotkey on buttons"
L_GUI_ACTIONBAR_MACRO = "Show macro name on buttons"
L_GUI_ACTIONBAR_GRID = "Show empty action bar buttons"
L_GUI_ACTIONBAR_BUTTON_SIZE = "Buttons size"
L_GUI_ACTIONBAR_BUTTON_SPACE = "Buttons space"
L_GUI_ACTIONBAR_SPLIT_BARS = "Split the fifth bar on two bars on 6 buttons"
L_GUI_ACTIONBAR_CLASSCOLOR_BORDER = "Enable classcolor border for buttons"
L.actionbar_toggle_mode = "Enable toggle mode"
L.actionbar_toggle_mode_desc = "The quick change in the number of panels. For the lower panels, hover the mouse over the hidden area above the panels. For right panels, hover the mouse over the area below the panels."
L_GUI_ACTIONBAR_HIDE_HIGHLIGHT = "Hide proc highlight"
L_GUI_ACTIONBAR_BOTTOMBARS = "Number of action bars on the bottom"
L_GUI_ACTIONBAR_RIGHTBARS = "Number of action bars on right"
L.actionbar_bottombars_mouseover = "Bottom bars on mouseover"
L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = "Right bars on mouseover"
L_GUI_ACTIONBAR_PETBAR_HIDE = "Hide pet bar"
L_GUI_ACTIONBAR_PETBAR_HORIZONTAL = "Enable horizontal pet bar"
L_GUI_ACTIONBAR_PETBAR_MOUSEOVER = "Petbar on mouseover"
L_GUI_ACTIONBAR_STANCEBAR_HIDE = "Hide stance bar"
L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = "Enable horizontal stance bar"
L.actionbar_stancebar_horizontal_desc = "Located below the player's frame"
L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = "Stance bar on mouseover"
L_GUI_ACTIONBAR_MICROMENU = "Enable micro menu"
L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = "Micro menu on mouseover"
L.actionbar_editor = "Bars editor"
L.actionbar_editor_desc = "Allow to move and change each panel individually"
L.actionbar_bar1_num = "Number of buttons"
L.actionbar_bar1_row = "Buttons per row"
L.actionbar_bar1_mouseover = "Bar on mouseover"
-- Tooltip options
L.tooltip = "Tooltip"
L.tooltip_subtext = "In this block, you can change the standard tips when mouseovering."
L.tooltip_enable = "Enable tooltip"
L.tooltip_shift_modifer = "Show tooltip when Shift is pushed"
L.tooltip_cursor = "Tooltip above cursor"
L.tooltip_item_icon = "Item icon in tooltip"
L.tooltip_health_value = "Numeral health value"
L.tooltip_hidebuttons = "Hide tooltips for actions bars"
L.tooltip_hide_combat = "Hide tooltip in combat"
L.tooltip_subheader = "Plugins"
L.tooltip_talents = "Show tooltip talents"
L.tooltip_show_shift = "Show when Shift is pushed"
L.tooltip_show_shift_desc = "Show items level and spec when Shift is pushed"
L.tooltip_achievements = "Comparing achievements in tooltip"
L.tooltip_target = "Target player in tooltip"
L.tooltip_title = "Player title in tooltip"
L.tooltip_realm = "Player realm name in tooltip"
L.tooltip_rank = "Player guild-rank in tooltip"
L.tooltip_spell_id = "Spell ID"
L.tooltip_average_lvl_desc = "The average item level"
L.tooltip_raid_icon = "Raid icon"
L.tooltip_who_targetting = "Display who is targeting the unit that is in your party/raid"
L.tooltip_item_count = "Item count in bags and bank"
L.tooltip_unit_role = "Unit role"
L.tooltip_instance_lock = "Your instance lock status in tooltip"
L.tooltip_mount = "Source of mount"
-- Chat options
L.chat_subtext = "Here you can change the settings of the chat window."
L.chat_enable = "Enable chat"
L.chat_background = "Enable chat background"
L.chat_background_alpha = "Alpha of chat background"
L.chat_filter = "Removing some systems spam"
L.chat_filter_desc = "Duels, change talents, NPC dialogue in city"
L.chat_spam = "Removing some players spam"
L.chat_spam_list = "Black list"
L.chat_spam_list_desc = "List of words (separated by space, lowercase letters) to hide messages"
L.chat_width = "Chat width"
L.chat_height = "Chat height"
L.chat_chat_bar = "Lite Button Bar for switch chat channel"
L.chat_chat_bar_mouseover = "Lite Button Bar on mouseover"
L.chat_whisp_sound = "Sound when whisper"
L.chat_combatlog = "Show Combat Log tab"
L.chat_tabs_mouseover = "Chat tabs on mouseover"
L.chat_sticky = "Remember last channel"
L.chat_damage_meter_spam = "Merge damage meter spam in one line-link"
L.chat_loot_icons = "Icons for loot"
L.chat_hide_combat = "Hide chat in combat"
L.chat_custom_time_color = "Enable custom timestamp coloring"
L.chat_time_color = "Timestamp coloring"
-- Nameplate options
L_GUI_NAMEPLATE_SUBTEXT = "Nameplate settings"
L_GUI_NAMEPLATE_ENABLE = "Enable nameplates"
L_GUI_NAMEPLATE_COMBAT = "Automatically show nameplates in combat"
L_GUI_NAMEPLATE_HEALTH = "Numeral health value"
L_GUI_NAMEPLATE_HEIGHT = "Nameplate height"
L_GUI_NAMEPLATE_WIDTH = "Nameplate width"
L.nameplate_alpha = "Alpha"
L.nameplate_alpha_desc = "Non-target nameplate alpha"
L.nameplate_ad_height = "Additional height"
L.nameplate_ad_width = "Additional width"
L.nameplate_ad_height_desc = "Additional height for selected nameplate"
L.nameplate_ad_width_desc = "Additional width for selected nameplate"
L_GUI_NAMEPLATE_CASTBAR_NAME = "Show castbar name"
L_GUI_NAMEPLATE_CLASS_ICON = "Class icons in PvP"
L_GUI_NAMEPLATE_NAME_ABBREV = "Display abbreviated names"
L.nameplate_short_name = "Replace names with short ones"
L.nameplate_clamp = "Clamp nameplates"
L.nameplate_clamp_desc = "Clamp nameplates to the top of the screen when outside of view"
L_GUI_NAMEPLATE_SHOW_DEBUFFS = "Show your debuffs (from the list)"
L_GUI_NAMEPLATE_SHOW_BUFFS = "Show dispellable enemy buffs and buffs from the list"
L_GUI_NAMEPLATE_DEBUFFS_SIZE = "Auras size"
L_GUI_NAMEPLATE_HEALER_ICON = "Show icon above enemy healers"
L_GUI_NAMEPLATE_TOTEM_ICONS = "Show totems icon"
L.nameplate_target_glow = "Show glow texture for target"
L.nameplate_only_name = "Show only name for friendly units"
L.nameplate_quests = "Show quest icon"
L.nameplate_cast_color = "Show color border for casting important spells"
L.nameplate_kick_color = "Change cast color if interrupt on cd"
L.nameplate_low_health_value = "Health value"
L.nameplate_low_health = "Low health highlight"
L_GUI_NAMEPLATE_THREAT = "Enable threat feature, automatically changes by your role"
L_GUI_NAMEPLATE_GOOD_COLOR = "Good threat color, varies depending if your a tank or dps/heal"
L_GUI_NAMEPLATE_NEAR_COLOR = "Losing/Gaining threat color"
L_GUI_NAMEPLATE_BAD_COLOR = "Bad threat color, varies depending if your a tank or dps/heal"
L_GUI_NAMEPLATE_OFFTANK_COLOR = "Offtank threat color"
L.nameplate_extra_color = "Explosive and Spiteful affix color"
L.nameplate_mob_color_enable = "Change color for important mobs in dungeons"
L.nameplate_mob_color = "Color for mobs"
-- Combat text options
L_GUI_COMBATTEXT = "Combat Text"
L_GUI_COMBATTEXT_SUBTEXT = "For moving type in the chat '/xct'"
L_GUI_COMBATTEXT_ENABLE = "Enable Combat Text"
L.combattext_blizz_head_numbers = "Enable Blizzard combat text"
L.combattext_blizz_head_numbers_desc = "Use Blizzard damage/healing output (above mob/player head)"
L.combattext_damage_style = "Change default combat font"
L.combattext_damage_style_desc = "Change default combat font above heads (you need to restart WoW to see changes)"
L_GUI_COMBATTEXT_DAMAGE = "Show outgoing damage"
L_GUI_COMBATTEXT_HEALING = "Show outgoing healing"
L.combattext_incoming = "Show incoming damage and healing"
L_GUI_COMBATTEXT_HOTS = "Show periodic healing effects in healing frame"
L_GUI_COMBATTEXT_OVERHEALING = "Show outgoing overhealing"
L_GUI_COMBATTEXT_PET_DAMAGE = "Show your pet damage"
L_GUI_COMBATTEXT_DOT_DAMAGE = "Show damage from your dots"
L_GUI_COMBATTEXT_DAMAGE_COLOR = "Display damage numbers depending on school of magic"
L_GUI_COMBATTEXT_CRIT_PREFIX = "Symbol that will be added before crit"
L_GUI_COMBATTEXT_CRIT_POSTFIX = "Symbol that will be added after crit"
L_GUI_COMBATTEXT_ICONS = "Show outgoing damage icons"
L_GUI_COMBATTEXT_ICON_SIZE = "Icon size"
L_GUI_COMBATTEXT_ICON_SIZE_DESC = "Icon size of spells in outgoing damage frame, also has effect on dmg font size"
L_GUI_COMBATTEXT_TRESHOLD = "Minimum damage to show in damage frame"
L_GUI_COMBATTEXT_HEAL_TRESHOLD = "Minimum healing to show in incoming/outgoing healing messages"
L_GUI_COMBATTEXT_SCROLLABLE = "Allows you to scroll frame lines with mousewheel"
L_GUI_COMBATTEXT_MAX_LINES = "Max lines"
L_GUI_COMBATTEXT_MAX_LINES_DESC = "Max lines to keep in scrollable mode (more lines = more memory)"
L_GUI_COMBATTEXT_TIME_VISIBLE = "Time"
L_GUI_COMBATTEXT_TIME_VISIBLE_DESC = "Time(seconds) a single message will be visible"
L_GUI_COMBATTEXT_DK_RUNES = "Show Death knight's rune recharge"
L_GUI_COMBATTEXT_KILLINGBLOW = "Tells you about your killing blows"
L.combattext_merge_aoe_spam = "Merges spell spam into single message"
L.combattext_merge_aoe_spam_desc = "Merges multiple AoE damage/heal spam into single message"
L_GUI_COMBATTEXT_MERGE_MELEE = "Merges multiple auto attack damage spam"
L.combattext_merge_all = "Merges all spells"
L_GUI_COMBATTEXT_DISPEL = "Tells you about your dispels"
L_GUI_COMBATTEXT_INTERRUPT = "Tells you about your interrupts"
L_GUI_COMBATTEXT_DIRECTION = "Change scrolling direction from bottom to top"
L_GUI_COMBATTEXT_SHORT_NUMBERS = "Use short numbers ('25.3k' instead of '25342')"
-- Auras/Buffs/Debuffs
L_GUI_AURA_PLAYER_BUFF_SIZE = "Buffs size"
L_GUI_AURA_PLAYER_BUFF_SIZE_DESC = "Player buffs size"
L.aura_debuff_size = "Debuffs size"
L_GUI_AURA_SHOW_SPIRAL = "Spiral on aura icons"
L_GUI_AURA_SHOW_TIMER = "Show cooldown timer on aura icons"
L_GUI_AURA_PLAYER_AURAS = "Auras on player frame"
L_GUI_AURA_TARGET_AURAS = "Auras on target frame"
L_GUI_AURA_FOCUS_DEBUFFS = "DeBuffs on focus frame"
L_GUI_AURA_FOT_DEBUFFS = "DeBuffs on focus target frame"
L_GUI_AURA_PET_DEBUFFS = "DeBuffs on pet frame"
L_GUI_AURA_TOT_DEBUFFS = "DeBuffs on targettarget frame"
L.aura_subheader_boss = "Auras on boss frame"
L_GUI_AURA_PLAYER_AURA_ONLY = "Only your debuff on target frame"
L_GUI_AURA_DEBUFF_COLOR_TYPE = "Color debuff by type"
L_GUI_AURA_CAST_BY = "Show who cast a buff/debuff in its tooltip"
L_GUI_AURA_CLASSCOLOR_BORDER = "Enable classcolor border for player buffs"
L.aura_subheader_buffs = "Player buffs"
L.aura_subheader_debuffs = "Debuffs"
-- Bag options
L_GUI_BAGS = "Bags"
L_GUI_BAGS_SUBTEXT = "Right click on the close button to open the menu. To move the bags, hold down Shift - click."
L_GUI_BAGS_ENABLE = "Enable bags"
L_GUI_BAGS_ILVL = "Show item level for weapons and armor"
L.bag_new_items = "Show animation for new items"
L.bag_filter = "Always show filter buttons"
L_GUI_BAGS_BUTTON_SIZE = "Buttons size"
L_GUI_BAGS_BUTTON_SPACE = "Buttons space"
L_GUI_BAGS_BANK = "Number of columns in bank"
L_GUI_BAGS_BAG = "Number of columns in main bag"
-- Minimap options
L_GUI_MINIMAP_SUBTEXT = "Minimap settings."
L_GUI_MINIMAP_ENABLE = "Enable minimap"
L.minimap_on_top = "Move minimap on top right corner"
L_GUI_MINIMAP_ICON = "Tracking icon"
L_GUI_GARRISON_ICON = "Covenant icon"
L_GUI_MINIMAP_SIZE = "Map size"
L_GUI_MINIMAP_HIDE_COMBAT = "Hide minimap in combat"
L_GUI_MINIMAP_TOGGLE_MENU = "Show toggle menu"
L.minimap_bg_map_stylization = "BG map stylization"
L.minimap_fog_of_war = "Remove fog of war on World Map"
-- Loot options
L_GUI_LOOT_SUBTEXT = "Settings for loot frame."
L_GUI_LOOT_ENABLE = "Enable loot frame"
L_GUI_LOOT_ROLL_ENABLE = "Enable group loot frame"
L_GUI_LOOT_ICON_SIZE = "Icon size"
L_GUI_LOOT_WIDTH = "Loot frame width"
L_GUI_LOOT_AUTOGREED = "Enable auto-greed/disenchant for green item at max level"
L_GUI_LOOT_AUTODE = "Auto confirm disenchant"
L.loot_faster_loot = "Faster looting"
L.loot_faster_loot_desc = "Works only if enabled auto loot"
-- Filger
L_GUI_FILGER = "Timers (Filger)"
L_GUI_FILGER_SUBTEXT = "Filger - analogue WeakAuras, but more simple and easy. Allows you to display in the form of icons and bars your auras and timers."
L_GUI_FILGER_ENABLE = "Enable Filger"
L_GUI_FILGER_TEST_MODE = "Test icon mode"
L_GUI_FILGER_MAX_TEST_ICON = "Number of icons in test mode"
L_GUI_FILGER_SHOW_TOOLTIP = "Show tooltip"
L.filger_subheader_elements = "Showing elements"
L.filger_show_buff = "Player buffs"
L.filger_show_proc = "Player procs"
L.filger_show_debuff = "Debuffs on target"
L.filger_show_aura_bar = "Aura bars on target"
L.filger_show_special = "Special buffs on player"
L.filger_show_pvp_player = "SPvP debuffs on player"
L.filger_show_pvp_target = "PvP auras on target"
L.filger_show_cd = "Cooldowns"
L.filger_subheader_size = "Icons size"
L.filger_subheader_test = "Test mode"
L_GUI_FILGER_EXPIRATION = "Sort cooldowns by expiration time"
L_GUI_FILGER_BUFFS_SIZE = "Buffs size"
L_GUI_FILGER_COOLDOWN_SIZE = "Cooldowns size"
L_GUI_FILGER_PVP_SIZE = "PvP auras size"
L.filger_buffs_space = "Buffs space"
L.filger_pvp_space = "PvP auras space"
L.filger_cooldown_space = "Cooldowns space"
L.filger_subheader_spells = "Adding new spells"
L.filger_category_list = "Spell list category"
-- Announcements options
L_GUI_ANNOUNCEMENTS = "Announcements"
L_GUI_ANNOUNCEMENTS_SUBTEXT = "Settings that add chat announcements about spells or items."
L.announcements_drinking = "Arena enemy is drinking"
L.announcements_interrupts = "Interrupts"
L.announcements_interrupts_desc = "Announce in party/raid when you interrupt"
L.announcements_spells = "Cast spells"
L.announcements_spells_desc = "Announce in party/raid when you cast some spell (from the list)"
L.announcements_spells_from_all = "From all members"
L.announcements_spells_from_all_desc = "Check spells cast from all members"
L.announcements_toys = "Cast some annoying toys"
L.announcements_pull_countdown = "Pull countdown"
L.announcements_pull_countdown_desc = "Pull countdown announce (/pc #)"
L.announcements_flask_food = "Usage of flasks and food"
L.announcements_flask_food_desc = "Announce the usage of flasks and food (/ffcheck)"
L.announcements_flask_food_raid = "Announce to raid channel"
L.announcements_flask_food_auto = "Auto check when ReadyCheck"
L.announcements_feasts = "Feasts/Souls/Repair Bots"
L.announcements_portals = "Portals/Ritual of Summoning"
L.announcements_subheader_self = "Self announce"
L.announcements_bad_gear = "Check your bad gear"
L.announcements_bad_gear_desc = "Check your bad gear in instance (fishing pole, from the list)"
L.announcements_safari_hat = "Safari Hat"
L.announcements_safari_hat_desc_desc = "Check Safari Hat when starting Pet Battle"
-- Automation options
L_GUI_AUTOMATION = "Automation"
L_GUI_AUTOMATION_SUBTEXT = "This block contains settings that facilitate the routine."
L.automation_release = "Auto release the spirit in battlegrounds"
L.automation_screenshot = "Take screenshot when player get achievement"
L.automation_solve_artifact = "Auto popup for solve artifact"
L.automation_solve_artifact_desc = "If there are enough fragments for an artifact, a popup will appear to solve it."
L.automation_accept_invite = "Auto accept invite"
L.automation_decline_duel = "Auto decline duel (/disduel to temporarily disable)"
L.automation_accept_quest = "Auto accept quest (disabled if hold Shift)"
L.automation_auto_collapse = "Auto collapse Objective Tracker"
L.automation_auto_collapse_raid = "In Instance"
L.automation_auto_collapse_reload = "After reload"
L.automation_auto_collapse_scenario = "Partially"
L.automation_skip_cinematic = "Auto skip cinematics/movies (disabled if hold Ctrl)"
L.automation_auto_role = "Auto set your role"
L.automation_cancel_bad_buffs = "Auto cancel annoying holiday buffs (from the list)"
L.automation_tab_binder = "Auto change 'Tab' key binding in PvP"
L.automation_tab_binder_desc = "'Tab' key target only enemy players when in PvP zones, ignores pets and mobs"
L.automation_logging_combat = "Auto enables combat log text file in raid instances"
L.automation_buff_on_scroll = "Cast buff on mouse scroll (from the list)"
L.automation_buff_on_scroll_desc = "If the buff from the list is not applied to the player, it will cast by the mouse scroll"
L.automation_open_items = "Auto opening of items in bag"
L.automation_resurrection = "Confirm resurrection"
L.automation_summon = "Confirm summon"
L.automation_whisper_invite = "Auto invite when whisper keyword"
L.automation_invite_keyword = "List of keyword (separated by space)"
L.automation_invite_keyword_desc = "When player whisper you keyword he will be invited in your group"
-- Buffs reminder options
L_GUI_REMINDER = "Buffs Reminder"
L_GUI_REMINDER_SUBTEXT = "Display of missed auras."
L_GUI_REMINDER_SOLO_ENABLE = "Show missing self buffs"
L_GUI_REMINDER_SOLO_SOUND = "Warning sound notification for self buffs reminder"
L_GUI_REMINDER_SOLO_SIZE = "Icon size"
L_GUI_REMINDER_SOLO_SIZE_DESC = "Self buffs icon size"
L_GUI_REMINDER_SUBHEADER = "Raid buffs"
L_GUI_REMINDER_RAID_ENABLE = "Show missing raid buffs"
L_GUI_REMINDER_RAID_ALWAYS = "Show buffs reminder always (default show only in raid)"
L_GUI_REMINDER_RAID_SIZE = "Icon size"
L_GUI_REMINDER_RAID_SIZE_DESC = "Raid buffs icon size"
L_GUI_REMINDER_RAID_ALPHA = "Transparent"
L_GUI_REMINDER_RAID_ALPHA_DESC = "Transparent icons when the buffs is present"
-- Raid cooldowns options
L_GUI_COOLDOWN_RAID = "Raid Cooldowns"
L_GUI_COOLDOWN_RAID_SUBTEXT = "Tracking raid abilities in the upper left corner."
L_GUI_COOLDOWN_RAID_ENABLE = "Enable raid cooldowns"
L_GUI_COOLDOWN_RAID_HEIGHT = "Bars height"
L_GUI_COOLDOWN_RAID_WIDTH = "Bars width"
L_GUI_COOLDOWN_RAID_SORT = "Raid cooldowns sort upwards bars"
L_GUI_COOLDOWN_RAID_EXPIRATION = "Sort by expiration time"
L_GUI_COOLDOWN_RAID_SHOW_SELF = "Show self cooldowns"
L_GUI_COOLDOWN_RAID_ICONS = "Raid cooldowns icons"
L_GUI_COOLDOWN_RAID_IN_RAID = "Show raid cooldowns in raid zone"
L_GUI_COOLDOWN_RAID_IN_PARTY = "Show raid cooldowns in party zone"
L_GUI_COOLDOWN_RAID_IN_ARENA = "Show raid cooldowns in arena zone"
-- Enemy cooldowns options
L_GUI_COOLDOWN_ENEMY = "Enemy Cooldowns"
L_GUI_COOLDOWN_ENEMY_SUBTEXT = "Tracking enemy abilities as icons above your spell casting bar."
L_GUI_COOLDOWN_ENEMY_ENABLE = "Enable enemy cooldowns"
L_GUI_COOLDOWN_ENEMY_SIZE = "Enemy cooldowns icon size"
L_GUI_COOLDOWN_ENEMY_DIRECTION = "Enemy cooldowns icon direction"
L_GUI_COOLDOWN_ENEMY_EVERYWHERE = "Show everywhere enemy cooldowns"
L_GUI_COOLDOWN_ENEMY_IN_BG = "Show enemy cooldowns in bg zone"
L_GUI_COOLDOWN_ENEMY_IN_ARENA = "Show enemy cooldowns in arena zone"
L.enemycooldown_show_inparty = "Show in party zone for allies"
L.enemycooldown_class_color = "Enable classcolor border"
-- Pulse cooldowns options
L_GUI_COOLDOWN_PULSE = "Pulse Cooldowns"
L_GUI_COOLDOWN_PULSE_SUBTEXT = "Track your cd using a pulse icon in the center of the screen."
L_GUI_COOLDOWN_PULSE_ENABLE = "Show cooldowns pulse"
L_GUI_COOLDOWN_PULSE_SIZE = "Cooldowns pulse icon size"
L_GUI_COOLDOWN_PULSE_SOUND = "Warning sound notification"
L_GUI_COOLDOWN_PULSE_ANIM_SCALE = "Animation scaling"
L_GUI_COOLDOWN_PULSE_HOLD_TIME = "Max opacity hold time"
L_GUI_COOLDOWN_PULSE_THRESHOLD = "Threshold time"
L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = "Minimal threshold time"
-- Threat options
L_GUI_THREAT = "Threat Bars"
L_GUI_THREAT_SUBTEXT = "Display of the threat list (a simple analogue of Omen)."
L_GUI_THREAT_ENABLE = "Enable threat bars"
L_GUI_THREAT_HEIGHT = "Threat bars height"
L_GUI_THREAT_WIDTH = "Threat bars width"
L_GUI_THREAT_ROWS = "Number of threat bars"
L_GUI_THREAT_HIDE_SOLO = "Show only in party/raid"
-- Top panel options
L_GUI_TOP_PANEL = "Top Panel"
L_GUI_TOP_PANEL_SUBTEXT = "Manage built-in top panel with information."
L_GUI_TOP_PANEL_ENABLE = "Enable top panel"
L_GUI_TOP_PANEL_MOUSE = "Top panel on mouseover"
L_GUI_TOP_PANEL_WIDTH = "Panel width"
L_GUI_TOP_PANEL_HEIGHT = "Panel height"
-- Stats options
L_GUI_STATS = "Stats"
L_GUI_STATS_SUBTEXT = "Statistics blocks located at the bottom of the screen. Type in the chat '/ls' for info."
L_GUI_STATS_CLOCK = "Clock"
L_GUI_STATS_LATENCY = "Latency"
L_GUI_STATS_FPS = "FPS"
L_GUI_STATS_EXPERIENCE = "Experience"
L_GUI_STATS_TALENTS_DESC = "Date-text allows you to change the spec and loot on click"
L_GUI_STATS_COORDS = "Coords"
L_GUI_STATS_LOCATION = "Location"
L_GUI_STATS_BG = "Battleground"
L.stats_bottom_line = "Bottom classcolor line"
L_GUI_STATS_SUBHEADER_CURRENCY = "Currency (displayed in gold data text)"
L_GUI_STATS_CURRENCY_ARCHAEOLOGY = "Archaeology Fragments"
L_GUI_STATS_CURRENCY_COOKING = "Cooking Awards"
L_GUI_STATS_CURRENCY_RAID = "Raid Seals"
-- Trade options
L_GUI_TRADE = "Trade"
L_GUI_TRADE_SUBTEXT = "Settings related to professions and trade"
L.trade_profession_tabs = "Professions tabs"
L.trade_profession_tabs_desc = "Professions tabs on tradeskill/trade frames"
L.trade_already_known = "Colorizes already known items"
L.trade_already_known_desc = "Colorizes recipes/mounts/pets/toys that is already known"
L.trade_disenchanting = "Quick Disenchanting"
L.trade_disenchanting_desc = "Milling, Prospecting and Disenchanting by Alt + click"
L.trade_sum_buyouts = "Sum up all current auctions"
L.trade_sum_buyouts_desc = "At auctions tab shows sum up all current auctions"
L.trade_enchantment_scroll = "Enchantment scroll on TradeSkill frame"
L.trade_archaeology = "Archaeology tracker"
L.trade_archaeology_desc = "Archaeology tracker ('/arch' or right mouseover minimap button to show)"
L.trade_merchant_itemlevel = "Item level in merchant"
L.trade_merchant_itemlevel_desc = "Show item level for weapons and armor in merchant"
-- Miscellaneous options
L_GUI_MISC_SUBTEXT = "Other settings that add interesting features."
L.misc_shift_marking = "Marks mouseover target"
L.misc_shift_marking_desc = "Marks mouseover target when you push Shift (only in group)"
L.misc_afk_spin_camera = "Spin camera while afk"
L.misc_quest_auto_button = "Quest items auto button"
L.misc_quest_auto_button_desc = "The button for quest items above the minimap (from the list)"
L.misc_item_level = "Item level on slot buttons"
L.misc_item_level_desc = "Item level on character/inspect slot buttons"
L.misc_raid_tools = "Raid tools"
L.misc_raid_tools_desc = "Button at the top of the screen for ready check (Left-click), checking roles (Middle-click), setting marks, etc. (for leader and assistants)"
L.misc_click_cast = "Simple click2cast spell binder"
L.misc_click_cast_desc = "Allows you to assign spells (analog Clique) to the mouse buttons. Setup through the side bookmark in the spell book"
L.misc_click_cast_filter = "Ignore Player and Target frames"
L.misc_chars_currency = "Tracks your currency tokens across multiple characters"
L.misc_chars_currency_desc = "Hover over the icon of the required currency in the character window to display information in the tooltip"
L.misc_hide_raid_button = "Button to hide raid frames in dps layout"
L.misc_hide_raid_button_desc = "The button is displayed by hovering the mouse in the upper left corner"
================================================
FILE: ShestakUI_Config/Locales/French.lua
================================================
local _, L = ...
if GetLocale() ~= "frFR" then return end
----------------------------------------------------------------------------------------
-- Localization for frFR client
-- Translation: Cranan, Puree, AlbertDuval, Skyzo-be
----------------------------------------------------------------------------------------
L_GUI_SET_SAVED_SETTTINGS = "Définir les paramètres par personnage"
L_GUI_SET_SAVED_SETTTINGS_DESC = "Basculez entre un profil qui s’applique à tous les personnages et un profil qui est unique à ce personnage."
L_GUI_RESET_CHAR = "Êtes-vous sûr de vouloir réinitialiser les paramètres de votre personnage pour ShestakUI ?"
L_GUI_RESET_ALL = "Voulez-vous vraiment réinitialiser tous les paramètres de ShestakUI"
L_GUI_PER_CHAR = "Modifier la configuration du personnage ?"
L_GUI_RESET_CAT = "Êtes-vous sûr de vouloir réinitialiser les paramètres de la catégorie ?"
L_GUI_RESET_CAT_DESC = "Clique pour réinitialiser les paramètres de la catégorie ou \nCTRL+clique pour réinitialiser les paramètres de votre personnage."
L_GUI_NEED_RELOAD = "Vous devez recharger l'Interface pour appliquer vos changements."
L_GUI_LAYOUT = "Changé la disposition"
L_GUI_SPELL_LIST = "Liste des sorts"
L_GUI_SPELL_INPUT = "ID du sort"
L_GUI_TIME_INPUT = "Temps"
L_GUI_EXPERT_MODE = "Mode expert"
L_GUI_EXPERT_MODE_DESC = "Modification personnalisée du profil Lua"
L_GUI_RESET_SPELLS_DESC = "CTRL+Click pour réinitialiser la liste"
-- Profile
L.profile = "Profile" -- Need review
L.profile_title = "Profile options" -- Need review
L.profile_choose = "Choose profile" -- Need review
L.profile_options = "Settings" -- Need review
L.profile_movers = "Moving elements" -- Need review
L.profile_export = "Export" -- Need review
L.profile_import = "Import" -- Need review
L.profile_error_lib = "To enable export and import - install WeakAuras" -- Need review
L.profile_error_code = "Error in imported code!" -- Need review
-- General options
L_GUI_GENERAL_SUBTEXT = "Ces paramètres contrôlent les paramètres généraux de l’interface utilisateur. \nTapez '/uihelp' dans le chat pour obtenir de l’aide."
L_GUI_GENERAL_WELCOME_MESSAGE = "Message de bienvenue dans le chat"
L_GUI_GENERAL_AUTOSCALE = "Mise à l'échelle automatique de l’interface utilisateur"
L_GUI_GENERAL_UISCALE = "Mettre l'interface à l'échelle \n(si 'Mise à l'échelle automatique de l’interface utilisateur' est désactivée)"
L.general_subheader_blizzard = "Éléments de l’interface utilisateur Blizzard"
L.general_error_filter = "Filtrage des erreurs"
L.general_error_blacklist = "Liste noire"
L.general_error_whitelist = "Liste blanche"
L.general_error_combat = "En combat"
L.general_error_none = "Aucun"
L.general_vehicle_mouseover = "Cadre de véhicule au survol de la souris"
L.general_move_blizzard = "Autorise le déplacement de certains fenêtres de l'interface Blizzard"
L.general_color_picker = "Amélioration du sélecteur de couleurs"
L.general_color_picker_desc = "Ajoute des boutons de copier/coller et une entrée de texte numérique pour le cadre du sélecteur de couleur Blizzard"
L.general_minimize_mouseover = "Bouton pour réduire la fenêtre de quête au survol de la souris"
L.general_hide_banner = "Masquer la bannière du cadre de butin de Boss"
L.general_hide_talking_head = "Masquer la fenêtre de dialogue des PNJ's"
L.general_hide_maw_buffs = "Masquer le cadre des buffs de l'antre en instance"
-- Media options
L.media_border_color = " Couleur des bordures"
L.media_classborder_color = " Couleur pour les bordures de classe"
L.media_backdrop_color = " Couleur pour le fond des bordures"
L.media_backdrop_alpha = "Transparence du fond des bordures"
L.media_texture = "Texture principale"
L.media_subheader_normal = "Modifier la police principale"
L.media_subheader_pixel = "Modifier la police secondaire"
-- Font options
L.font = "Polices"
L.font_subtext = "Personnalisez la police pour chaque élément. \nAttention 'MONOCHROMEOUTLINE' ne fonctionne que pour 'Pixel Font'"
L.font_stats_font = "Selectionner la police"
L.font_stats_font_style = "Contour de la police"
L.font_stats_font_shadow = "Activer l'ombre"
L.font_subheader_stats = "Police des Statistiques"
L.font_subheader_combat = "Police des Textes de Combat"
L.font_subheader_chat = "Police du chat"
L.font_subheader_chat_tabs = "Police des onglets du chat"
L.font_subheader_action = "Police des Barres d'Actions"
L.font_subheader_threat = "Police de l'indicateur de menace"
L.font_subheader_raidcd = "Police des temps de recharde du Raid"
L.font_subheader_cooldown = "Police des temps de recharge"
L.font_subheader_loot = "Police du Butin"
L.font_subheader_nameplates = "Police des Barres de Noms"
L.font_subheader_unit = "Police des Barres de vie"
L.font_subheader_aura = "Police des Auras"
L.font_subheader_filger = "Police de Filger"
L.font_subheader_style = "Police de la stylisation"
L.font_subheader_bag = "Police des Sacs"
L.font_subheader_blizzard = "Taille de la police de l’infobulle"
L.font_tooltip_header_font_size = "En-tête de l’infobulle"
L.font_tooltip_font_size = "Texte de l’infobulle"
L.font_global_font = "Désactiver Pixel Font"
-- Skins options
L_GUI_SKINS = "Personnalisation"
L_GUI_SKINS_SUBTEXT = "Change l’apparence de l’interface standard."
L_GUI_SKINS_BLIZZARD = "Activer la personnalisation des fenêtres Blizzard"
L_GUI_SKINS_MINIMAP_BUTTONS = "Activer la personnalisation des icônes de la minimap"
L_GUI_SKINS_SUBHEADER = "Change l’apparence des addons"
L.skins_minimap_buttons_mouseover = "Icônes de la minimap au survol de la souris"
L.skins_bubbles = "Skin de l'infobulle"
-- Unit Frames options
L_GUI_UF_SUBTEXT = "Personnalisez le cadre du joueur, de la cible, etc..."
L_GUI_UF_ENABLE = "Activer les cadres d'unité"
L_GUI_UF_OWN_COLOR = "Définissez votre couleur pour les barres de santé"
L_GUI_UF_UF_COLOR = " Couleur de la barre"
L.unitframe_uf_color_bg = " Couleur du fond"
L.unitframe_enemy_health_color = "La barre de santé de la cible ennemie est rouge"
L_GUI_UF_TOTAL_VALUE = "Afficher le texte de la vie des joueur/cible avec XXXX/Total"
L_GUI_UF_COLOR_VALUE = "La valeur santé/mana est colorée"
L_GUI_UF_BAR_COLOR_VALUE = "Couleur de la barre de santé selon la santé actuelle restante"
L_GUI_UF_LINES = "Afficher les lignes autour du cadre du joueur et de la cible"
L_GUI_UF_SUBHEADER_CAST = "Barre d'incantation"
L_GUI_UF_UNIT_CASTBAR = "Activer la barre d'incantation"
L_GUI_UF_CASTBAR_ICON = "Voir l'icone de sort sur la barre d'incantation"
L_GUI_UF_CASTBAR_LATENCY = "Voir la latence sur la barre d'incantation"
L_GUI_UF_CASTBAR_TICKS = "Affiche les ticks des sorts sur la barre d'incantation"
L_GUI_UF_SUBHEADER_FRAMES = "Cadres d'unités"
L_GUI_UF_SHOW_PET = "Afficher le cadre du familier"
L_GUI_UF_SHOW_FOCUS = "Afficher le cadre du focus"
L_GUI_UF_SHOW_TOT = "Afficher le cadre de la cible de la cible"
L_GUI_UF_SHOW_BOSS = "Afficher le cadre de boss"
L_GUI_UF_BOSS_RIGHT = "Afficher le cadre de boss à droite"
L_GUI_UF_SHOW_ARENA = "Afficher le cadre d'arène"
L_GUI_UF_ARENA_RIGHT = "Afficher le cadre d'arène sur la droite"
L_GUI_UF_BOSS_DEBUFFS = "Nombre d'affaiblissement"
L_GUI_UF_BOSS_DEBUFFS_DESC = "Afficher le nombre d'affaiblissement sur le cadre des boss"
L_GUI_UF_BOSS_BUFFS = "Nombre de buff"
L_GUI_UF_BOSS_BUFFS_DESC = "Afficher le nombre de buff sur le cadre de boss"
L.unitframe_icons_pvp = "Texte d’état de JcJ"
L.unitframe_icons_pvp_desc = "Texte JcJ au survol de la souris pour le cadre du joueur et de la cible"
L_GUI_UF_ICONS_COMBAT = "Icône de combat"
L_GUI_UF_ICONS_RESTING = "Icône de repos"
L_GUI_UF_SUBHEADER_PORTRAIT = "Portraits"
L_GUI_UF_PORTRAIT_ENABLE = "Activer les portraits du joueur et de la cible"
L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = "Activer la bordure aux couleurs de la classe"
L.unitframe_portrait_type = "Type de portraits"
L.unitframe_portrait_type_icons = "Icônes de classe"
L.unitframe_portrait_type_overlay = "Overlay"
L_GUI_UF_PORTRAIT_HEIGHT = "Hauteur des portraits"
L_GUI_UF_PORTRAIT_WIDTH = "Largeur des portraits"
L_GUI_UF_SUBHEADER_PLUGINS = "Plugins"
L_GUI_UF_PLUGINS_GCD = "Scintillement du cooldown global sur le cadre du joueur"
L_GUI_UF_PLUGINS_SWING = "Barre d'attaque automatique / tir automatique"
L.unitframe_plugins_reputation_bar = "Barre de réputation"
L.unitframe_plugins_reputation_bar_desc = "Activer la barre de réputation (à gauche du cadre du joueur au survol de la souris, clic du milieu pour verrouiller la visibilité)"
L.unitframe_plugins_experience_bar = "Barre d'expérience"
L.unitframe_plugins_experience_bar_desc = "Activer la barre d'expérience (à gauche du cadre du joueur au survol de la souris, clic du milieu pour verrouiller la visibilité)"
L_GUI_UF_PLUGINS_SMOOTH_BAR = "Lissage des barres"
L_GUI_UF_PLUGINS_ENEMY_SPEC = "Afficher la spécialisation de l’ennemi dans les champs de bataille et en arène"
L_GUI_UF_PLUGINS_COMBAT_FEEDBACK = "Texte de combat sur le cadre joueur/cible"
L_GUI_UF_PLUGINS_FADER = "Disparition des cadres d'unités"
L_GUI_UF_PLUGINS_DIMINISHING = "Icône de rendement décroissants sur les cadres d'arène"
L_GUI_UF_PLUGINS_POWER_PREDICTION = "Prédiction du coût des sorts sur le cadre du joueur"
L.unitframe_plugins_absorbs = "Valeur d'absorption sur le cadre du joueur"
L.unitframe_subheader_player_width = "Taille du cadre du joueur et de la cible"
L.unitframe_player_width = "Largeur"
L.unitframe_subheader_boss_width = "Taille du cadre du boss et de l’aréne"
L.unitframe_extra_height_auto = "Hauteur automatique pour la santé/puissance"
L.unitframe_extra_height_auto_desc = "Ajustement intelligent en fonction de la taille de la police"
L.unitframe_extra_health_height = "Hauteur supplémentaire pour la santé"
L.unitframe_extra_power_height = "Hauteur supplémentaire pour la puissance"
L.unitframe_subheader_castbar = "Taille de la barre d'incantation du joueur et de la cible"
L.unitframe_castbar_height = "Hauteur"
-- Unit Frames Class bar options
L_GUI_UF_PLUGINS_CLASS_BAR = "Barres de classe"
L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = "Contrôle des ressources spéciales des classes."
L_GUI_UF_PLUGINS_COMBO_BAR = "Afficher la barre des points de combo pour les Voleurs/Druides"
L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = "Toujours montrer la barre des points de combo pour la classe Druide"
L_GUI_UF_PLUGINS_COMBO_BAR_OLD = "Activer les points de Combo sur la cible"
L_GUI_UF_PLUGINS_ARCANE_BAR = "Activer la barre de charge Arcanique"
L_GUI_UF_PLUGINS_CHI_BAR = "Activer la barre de Chi"
L_GUI_UF_PLUGINS_STAGGER_BAR = "Activer la barre de chancelement (pour les Tanks Monk)"
L_GUI_UF_PLUGINS_HOLY_BAR = "Activer la barre de Puissance sacrée"
L_GUI_UF_PLUGINS_SHARD_BAR = "Activier la barre de Fragment d'âme"
L_GUI_UF_PLUGINS_RUNE_BAR = "Activer la barre de Rune"
L_GUI_UF_PLUGINS_TOTEM_BAR = "Activer la barre totem pour Shaman"
L.unitframe_class_bar_totem_other = "Activer la barre totem pour les autres classes"
L.unitframe_class_bar_essence = "Enable Essence bar for Evoker" -- Need review
-- Raid Frames options
L_GUI_UF_RAIDFRAMES_SUBTEXT = "Personnalisez l’apparence des cadres de raid."
L_GUI_UF_BY_ROLE = "Trier les joueurs par rôle dans les groupes"
L_GUI_UF_AGGRO_BORDER = "Aggro signalée en bordure"
L_GUI_UF_DEFICIT_HEALTH = "Déficit en vie du raid"
L_GUI_UF_SHOW_PARTY = "Afficher les cadres du groupe"
L_GUI_UF_SHOW_RAID = "Afficher les cadres de raid"
L.raidframe_layout = "Disposition du raid"
L.raidframe_heal_layout = "Heal"
L.raidframe_dps_layout = "DPS"
L.raidframe_auto_layout = "Auto"
L.raidframe_show_target = "Afficher les cadres de cible"
L.raidframe_show_pet = "Afficher les cadres de familier"
L.raidframe_vertical_health = "Orientation verticale de la santé"
L.raidframe_vertical_health_desc = "Uniquement pour la disposition de raid 'Heal'"
L_GUI_UF_ALPHA_HEALTH = "Opacité des barres de vie quand 100%hp"
L_GUI_UF_SHOW_RANGE = "Afficher l’opacité de portée pour les cadres de raid"
L_GUI_UF_RANGE_ALPHA = "Opacité"
L_GUI_UF_RANGE_ALPHA_DESC = "Opacité de la barre vie quand hors de portée"
L_GUI_UF_SUBHEADER_RAIDFRAMES = "Cadres"
L_GUI_UF_SOLO_MODE = "Afficher le cadre du joueur en solo"
L_GUI_UF_PLAYER_PARTY = "Afficher le cadre du joueur en groupe"
L_GUI_UF_SHOW_TANK = "Afficher les tanks de raid"
L_GUI_UF_SHOW_TANK_TT = "Afficher la cible de la cible des tanks"
L_GUI_UF_RAID_GROUP = "Nombre de groupe dans le raid"
L.raidframe_party_vertical = "Cadres de groupe verticaux"
L.raidframe_raid_groups_vertical = "Groupes de raid vertical"
L.raidframe_raid_groups_vertical_desc = "Uniquement pour la disposition du raid 'Heal'"
L_GUI_UF_SUBHEADER_ICONS = "Icônes"
L_GUI_UF_ICONS_ROLE = "Icône de rôle"
L_GUI_UF_ICONS_RAID_MARK = "Icône de marques de raid"
L_GUI_UF_ICONS_READY_CHECK = "Icône d'appel"
L_GUI_UF_ICONS_LEADER = "Icône de Chef de raid et assistant"
L_GUI_UF_ICONS_SUMON = "Icône d’invocation"
L.raidframe_icons_phase = "Icône de Phase"
L.raidframe_plugins_debuffhighlight_icon = "Afficher l’icône d'affaiblissement dispellable"
L.raidframe_plugins_aura_watch = "Icônes d'affaiblissement de raid (de la liste)"
L.raidframe_plugins_aura_watch_timer = "Durée sur les icônes d'affaiblissement du raid"
L.raidframe_plugins_pvp_debuffs = "Afficher les icônes d'affaiblissement JcJ (de la liste)"
L_GUI_UF_PLUGINS_HEALCOMM = "Afficher l'estimation des soins entrant sur le cadre"
L.raidframe_plugins_over_absorb = "Montrer la barre d'absorption sur le cadre"
L.raidframe_plugins_over_heal_absorb = "Montrer l'excédent de soin absorber sur le cadre"
L.raidframe_plugins_auto_resurrection = "Incantation automatique de résurrection"
L.raidframe_plugins_auto_resurrection_desc = "Lance résurrection avec le clic du milieu de la souris (ne fonctionne pas avec l'addon Clique activé)"
L.raidframe_hide_health_value = "Masquer la valeur de santé du raid"
L.raidframe_auto_position = "Repositionnement automatique des cadres de raid"
L.raidframe_auto_position_desc = "S’il y a plus de 5 groupes, les points d'ancrage des cadres de raid changent. \nSeulement pour la disposition de raid 'Heal'"
L.raidframe_auto_position_dynamic = "Dynamique"
L.raidframe_auto_position_static = "Statique"
L.raidframe_subheader_heal_size = "Taille pour la disposition 'Heal'"
L.raidframe_heal_width = "Largeur du cadre"
L.raidframe_heal_height = "Hauteur du cadre"
L.raidframe_heal_power_height = "Hauteur de la barre de puissance"
L.raidframe_subheader_dps_size = "Taille pour la disposition 'DPS'"
L.raidframe_dps_party_width = "Largeur du groupe"
L.raidframe_dps_party_height = "Hauteur du groupe"
L.raidframe_dps_raid_width = "Largeur du raid"
L.raidframe_dps_raid_height = "Hauteur du raid"
L.raidframe_dps_party_power_height = "Hauteur de la barre de puissance du groupe"
L.raidframe_dps_raid_power_height = "Hauteur de la barre de puissance du raid"
-- ActionBar options
L_GUI_ACTIONBAR = "Barres d'action"
L_GUI_ACTIONBAR_ENABLE = "Activer les barres d'action"
L_GUI_ACTIONBAR_HOTKEY = "Afficher les raccourcis clavier sur les boutons"
L_GUI_ACTIONBAR_MACRO = "Afficher le nom de la macro sur les boutons"
L_GUI_ACTIONBAR_GRID = "Afficher les boutons vide de la barre d’action"
L_GUI_ACTIONBAR_BUTTON_SIZE = "Taille des boutons"
L_GUI_ACTIONBAR_BUTTON_SPACE = "Espacement des boutons"
L_GUI_ACTIONBAR_SPLIT_BARS = "Séparation de la 5ème barre en 2 barres de 6 boutons de chaque côté"
L_GUI_ACTIONBAR_CLASSCOLOR_BORDER = "Active la couleur de votre classe pour la bordure de boutons"
L.actionbar_toggle_mode = "Activer le mode d'extension des barres d'action"
L.actionbar_toggle_mode_desc = "Changement rapide du nombre de barre d'action. Pour les barres inférieurs, passez la souris sur la zone cachée au-dessus des barres. Pour les panneaux de droite, placez le curseur de la souris sur la zone située sous les barres."
L_GUI_ACTIONBAR_HIDE_HIGHLIGHT = "Cache la surbrillance des effets à déclenchement"
L_GUI_ACTIONBAR_BOTTOMBARS = "Nombre de barres d'action en bas"
L_GUI_ACTIONBAR_RIGHTBARS = "Nombre de barres d'action à droite"
L.actionbar_bottombars_mouseover = "Barres du bas au survol de la souris"
L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = "Barres de droite au survol de la souris"
L_GUI_ACTIONBAR_PETBAR_HIDE = "Cacher la barre du familier"
L_GUI_ACTIONBAR_PETBAR_HORIZONTAL = "Activer la barre du familier horizontale"
L_GUI_ACTIONBAR_PETBAR_MOUSEOVER = "Barre du familier au survol de la souris(uniquement pour la barre horizontale)"
L_GUI_ACTIONBAR_STANCEBAR_HIDE = "Cacher changeforme"
L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = "Activer la barre de posture horizontale"
L.actionbar_stancebar_horizontal_desc = "Situé sous le cadre du joueur"
L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = "Barre de posture au survol de la souris"
L_GUI_ACTIONBAR_MICROMENU = "Active le Micro menu"
L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = "Affiche le Micro menu au survol de la souris"
L.actionbar_editor = "Éditeur de barres"
L.actionbar_editor_desc = "Permettre de déplacer et de changer chaque panneau individuellement"
L.actionbar_bar1_num = "Nombre de boutons"
L.actionbar_bar1_row = "Boutons par ligne"
L.actionbar_bar1_mouseover = "Afficher au survol de la souris"
-- Tooltip options
L.tooltip = "Tooltip"
L.tooltip_subtext = "Dans ce bloc, vous pouvez changer les informations du tooltip."
L.tooltip_enable = "Activer le tooltip"
L.tooltip_shift_modifer = "Afficher le tooltip quand la touche 'MAJ' est appuyée"
L.tooltip_cursor = "Afficher le Tooltip sous le curseur"
L.tooltip_item_icon = "Afficher l'îcone de l'objet"
L.tooltip_health_value = "Afficher les points de vie"
L.tooltip_hidebuttons = "Cacher le tooltip pour les barres d'action"
L.tooltip_hide_combat = "Cacher le tooltips en combat"
L.tooltip_subheader = "Plugins"
L.tooltip_talents = "Afficher les talents"
L.tooltip_show_shift = "Afficher lorsque Shift est maintenu"
L.tooltip_show_shift_desc = "Afficher le niveau et la spécialisation lorsque Shift est maintenu"
L.tooltip_achievements = "Comparaison des Hauts Faits"
L.tooltip_target = "Afficher la cible"
L.tooltip_title = "Afficher les titres"
L.tooltip_realm = "Affiche le royaume du joueur"
L.tooltip_rank = "Afficher le rang de guilde"
L.tooltip_spell_id = "Afficher l'ID du sort"
L.tooltip_average_lvl_desc = "Afficher l'ilevel moyen"
L.tooltip_raid_icon = "Afficher l'îcone de raid"
L.tooltip_who_targetting = "Afficher qui cible actuellement l'unité qui est dans votre groupe/raid"
L.tooltip_item_count = "Afficher le nombre d'objets possédés dans les sacs et à la banque"
L.tooltip_unit_role = "Afficher les rôles"
L.tooltip_instance_lock = "Afficher le verrouillage de votre instance"
L.tooltip_mount = "Source de la monture"
-- Chat options
L.chat_subtext = "Ici vous pouvez modifier les paramètres de la fenêtre de chat."
L.chat_enable = "Activer le chat"
L.chat_background = "Activer l'arrière plan"
L.chat_background_alpha = "Transparence de l'arrière plan"
L.chat_filter = "Suppression de certains spams du système"
L.chat_filter_desc = "Duels, changement de talents, dialogue PNJ en ville"
L.chat_spam = "Suppression du spam des joueurs (de la liste noire)"
L.chat_spam_list = "Liste noire"
L.chat_spam_list_desc = "Liste de mots (séparés par des espaces, lettres minuscules) pour masquer les messages"
L.chat_width = "Largeur de la fenêtre"
L.chat_height = "Hauteur de la fenêtre"
L.chat_chat_bar = "Barre de boutons pour changer de canal de chat"
L.chat_chat_bar_mouseover = "Affiche les boutons pour changer de canal au survol de la souris"
L.chat_whisp_sound = "Alerte sonore quand murmure"
L.chat_combatlog = "Afficher l'onglet du journal de combat"
L.chat_tabs_mouseover = "Affiche les onglets de discussion au survol de la souris"
L.chat_sticky = "Active le dernier canal utilisé(canal persistant)"
L.chat_damage_meter_spam = "Fusionnez le spam de compteur de dégâts dans un seul lien/ligne"
L.chat_loot_icons = "Affiche une icône à côté du butin dans le chat"
L.chat_hide_combat = "Cacher le chat en combat"
L.chat_custom_time_color = "Activer la coloration personnalisée de l'heure"
L.chat_time_color = " Couleur de l'heure"
-- Nameplate options
L_GUI_NAMEPLATE_SUBTEXT = "Paramètres des barres de noms"
L_GUI_NAMEPLATE_ENABLE = "Activer les barres de noms"
L_GUI_NAMEPLATE_COMBAT = "Afficher automatiquement les barres de noms en combat"
L_GUI_NAMEPLATE_HEALTH = "Valeur de points de vie"
L_GUI_NAMEPLATE_HEIGHT = "Hauteur des barres de noms"
L_GUI_NAMEPLATE_WIDTH = "Largeur des barres de noms"
L.nameplate_alpha = "Transparence"
L.nameplate_alpha_desc = "Transparence des barres de noms autres que la Cible"
L.nameplate_ad_height = "Epaisseur additionnelle"
L.nameplate_ad_width = "Largeur additionnelle"
L.nameplate_ad_height_desc = "Epaisseur additionnelle pour la barre de Noms de la cible"
L.nameplate_ad_width_desc = "LArgeur additionnelle pour la barre de Noms de la cible"
L_GUI_NAMEPLATE_CASTBAR_NAME = "Afficher le nom du sort"
L_GUI_NAMEPLATE_CLASS_ICON = "Icône de classe en JcJ"
L_GUI_NAMEPLATE_NAME_ABBREV = "Afficher les noms abrégés"
L.nameplate_short_name = "Remplacer les noms par des noms courts"
L.nameplate_clamp = "Afficher les barres en haut de l'écran quand celles-ci sont hors champs"
L.nameplate_clamp_desc = "Afficher les barres en haut de l'écran quand celles-ci sont hors champs"
L_GUI_NAMEPLATE_SHOW_DEBUFFS = "Afficher vos debuffs (de la liste)"
L_GUI_NAMEPLATE_SHOW_BUFFS = "Afficher les buffs et debuffs ennemis dissipables (de la liste)"
L_GUI_NAMEPLATE_DEBUFFS_SIZE = "Taille des debuffs"
L_GUI_NAMEPLATE_HEALER_ICON = "Affiche une icône de soigneur sur les barres ennemis dans les champs de bataille"
L_GUI_NAMEPLATE_TOTEM_ICONS = "Afficher l’icône des totems"
L.nameplate_target_glow = "Montrer une lueur sur la texture pour la cible sélectionner"
L.nameplate_only_name = "Afficher uniquement le nom (san les barres) pour les unités amies"
L.nameplate_quests = "Afficher l’icône de quête"
L.nameplate_cast_color = "Afficher la bordure de couleur pour certains sorts importants"
L.nameplate_kick_color = "Changer la couleur de cast pour le cooldown d’interruption"
L.nameplate_low_health_value = "Valeur des points de vie"
L.nameplate_low_health = "Mise en évidence pour les points de vie faible"
L_GUI_NAMEPLATE_THREAT = "Activer la gestion de la menace, change automatiquement selon votre rôle"
L_GUI_NAMEPLATE_GOOD_COLOR = " Bonne couleur de menace, dépend de si vous êtes un tank ou dps/heal"
L_GUI_NAMEPLATE_NEAR_COLOR = " Perte/Gain de couleur de menace"
L_GUI_NAMEPLATE_BAD_COLOR = " Mauvaise couleur de menace, dépend de si vous êtes un tank ou dps/heal"
L_GUI_NAMEPLATE_OFFTANK_COLOR = " Coloration de la menace du tank secondaire"
L.nameplate_extra_color = " Couleur d'affix pour explosif et méchant"
L.nameplate_mob_color_enable = "Changer de couleur pour les mobs importants dans les donjons"
L.nameplate_mob_color = " Couleur pour les mobs"
-- Combat text options
L_GUI_COMBATTEXT = "Texte de combat"
L_GUI_COMBATTEXT_SUBTEXT = "Pour déplacer écrivez /xct dans le chat"
L_GUI_COMBATTEXT_ENABLE = "Activer les textes de combat"
L.combattext_blizz_head_numbers = "Activer les textes de combat Blizzard"
L.combattext_blizz_head_numbers_desc = "Utiliser la sortie des dégâts/soins Blizzard (au-dessus de la tête du mob/joueur)"
L.combattext_damage_style = "Changer la police par défautt"
L.combattext_damage_style_desc = "Change la police par défaut des dégâts/soins au dessus de la tête de la cible (Vous devez redémarrer WoW pour valider le changement)"
L_GUI_COMBATTEXT_DAMAGE = "Montrer les dommages sortants"
L_GUI_COMBATTEXT_HEALING = "Montrer les soins sortants"
L.combattext_incoming = "Montrer les dommages et les soins entrants"
L_GUI_COMBATTEXT_HOTS = "Afficher les effets des soins périodiques dans la fenêtre de soin"
L_GUI_COMBATTEXT_OVERHEALING = "Afficher les excès de soins sortants"
L_GUI_COMBATTEXT_PET_DAMAGE = "Afficher les dégâts du familier"
L_GUI_COMBATTEXT_DOT_DAMAGE = "Afficher les dégâts des dots"
L_GUI_COMBATTEXT_DAMAGE_COLOR = "Afficher les dégâts en fonction de l'école de magie"
L_GUI_COMBATTEXT_CRIT_PREFIX = "Caractère à afficher avant le montant d'un critique"
L_GUI_COMBATTEXT_CRIT_POSTFIX = "Caractère à afficher après le montant d'un critique"
L_GUI_COMBATTEXT_ICONS = "Afficher l'icône du sort"
L_GUI_COMBATTEXT_ICON_SIZE = "Taille de l'icône"
L_GUI_COMBATTEXT_ICON_SIZE_DESC = "Taille de l'icône du sort"
L_GUI_COMBATTEXT_TRESHOLD = "Dégâts minimum pour afficher dans la fenêtre de dégâts"
L_GUI_COMBATTEXT_HEAL_TRESHOLD = "Soins minimum pour afficher dans la fenêtre de dégâts"
L_GUI_COMBATTEXT_SCROLLABLE = "Autoriser le défilement avec la molette dans la fenêtre de dégâts/soins"
L_GUI_COMBATTEXT_MAX_LINES = "Lignes maximum"
L_GUI_COMBATTEXT_MAX_LINES_DESC = "Nombre de lignes maximum à conserver si l'option de défilement est activée (plus de ligne = plus de mémoire utilisée)"
L_GUI_COMBATTEXT_TIME_VISIBLE = "Temps"
L_GUI_COMBATTEXT_TIME_VISIBLE_DESC = "Temps en seconde durant lequel un message est affiché"
L_GUI_COMBATTEXT_DK_RUNES = "Afficher le rechargement des runes du chevalier de la mort"
L_GUI_COMBATTEXT_KILLINGBLOW = "Afficher les coups fatals"
L.combattext_merge_aoe_spam = "Merges spell spam into single message" -- Needs review
L.combattext_merge_aoe_spam_desc = "Rassembler tous les dégâts d'un aoe en un seul message"
L_GUI_COMBATTEXT_MERGE_MELEE = "Rassemble les dégâts multiples en auto attaque"
L.combattext_merge_all = "Merges all spells" -- Needs review
L_GUI_COMBATTEXT_DISPEL = "Affiche les sorts que vous avez dissipé"
L_GUI_COMBATTEXT_INTERRUPT = "Affiche les sorts que vous avez interrompu"
L_GUI_COMBATTEXT_DIRECTION = "Changer la direction de défilement de bas en haut"
L_GUI_COMBATTEXT_SHORT_NUMBERS = "Rendre plus lisible les nombres ('25.3k' au lieu de '25342')"
-- Auras/Buffs/Debuffs
L_GUI_AURA_PLAYER_BUFF_SIZE = "Taille des buffs"
L_GUI_AURA_PLAYER_BUFF_SIZE_DESC = "Taille des buffs du joueur"
L.aura_debuff_size = "Taille des debuffs"
L_GUI_AURA_SHOW_SPIRAL = "Spirale sur les icones de buff"
L_GUI_AURA_SHOW_TIMER = "Afficher le cooldown sur les icônes de buff"
L_GUI_AURA_PLAYER_AURAS = "Afficher les buffs du joueur"
L_GUI_AURA_TARGET_AURAS = "Afficher les buffs de la cible"
L_GUI_AURA_FOCUS_DEBUFFS = "Afficher les debuffs du focus"
L_GUI_AURA_FOT_DEBUFFS = "Afficher les debuffs de la cible du focus"
L_GUI_AURA_PET_DEBUFFS = "Afficher les debuffs du pet"
L_GUI_AURA_TOT_DEBUFFS = "Afficher les debuffs de la cible de la cible"
L.aura_subheader_boss = "Afficher les buffs du Boss"
L_GUI_AURA_PLAYER_AURA_ONLY = "Afficher seulement ses propres debuffs sur la cible"
L_GUI_AURA_DEBUFF_COLOR_TYPE = "Couleur de debuff par type"
L_GUI_AURA_CAST_BY = "Montrer qui a lancé un buff/debuff dans son tooltip"
L_GUI_AURA_CLASSCOLOR_BORDER = "Activer la couleur de votre classe pour la bordure de vos buffs"
L.aura_subheader_buffs = "Les buffs des joueurs"
L.aura_subheader_debuffs = "Les Débuffs des joueurs"
-- Bag options
L_GUI_BAGS = "Sacs"
L_GUI_BAGS_SUBTEXT = "Cliquez avec le bouton droit de la souris sur le bouton de fermeture pour ouvrir le menu. Pour déplacer les sacs, maintenez la touche Maj enfoncée - cliquez."
L_GUI_BAGS_ENABLE = "Activer les sacs"
L_GUI_BAGS_ILVL = "Afficher le niveau d'objet des armes et armures"
L.bag_new_items = "Afficher l’animation pour les nouveaux objets"
L.bag_filter = "Always show filter buttons" -- Need review
L_GUI_BAGS_BUTTON_SIZE = "Taille des boutons"
L_GUI_BAGS_BUTTON_SPACE = "Espacement des boutons"
L_GUI_BAGS_BANK = "Nombre de colonne pour la banque"
L_GUI_BAGS_BAG = "Nombre de colonne pour les sacs"
-- Minimap options
L_GUI_MINIMAP_SUBTEXT = "Paramètres de la minimap"
L_GUI_MINIMAP_ENABLE = "Activer minimap"
L.minimap_on_top = "Move minimap on top right corner" -- Need review
L_GUI_MINIMAP_ICON = "Icone de pistage"
L_GUI_GARRISON_ICON = "Icône de Covenant"
L_GUI_MINIMAP_SIZE = "Taille de la minicarte"
L_GUI_MINIMAP_HIDE_COMBAT = "Cacher la minimap en combat"
L_GUI_MINIMAP_TOGGLE_MENU = "Montre le menu déroulant"
L.minimap_bg_map_stylization = "Personnalisation de l'arrière plan de la carte du monde"
L.minimap_fog_of_war = "Retire le brouillard des zones non explorées sur la carte du monde"
-- Loot options
L_GUI_LOOT_SUBTEXT = "Paramètres pour le cadre de butin."
L_GUI_LOOT_ENABLE = "Activer le cadre de butin"
L_GUI_LOOT_ROLL_ENABLE = "Activer le cadre de butin de groupe"
L_GUI_LOOT_ICON_SIZE = "Taille de l'icône"
L_GUI_LOOT_WIDTH = "Largeur du cadre de butin"
L_GUI_LOOT_AUTOGREED = "Activer désenchantement automatique pour les objets verts au niveau maximum"
L_GUI_LOOT_AUTODE = "Confirmation automatique pour le désenchantement"
L.loot_faster_loot = "Pillage plus rapide"
L.loot_faster_loot_desc = "Fonctionne uniquement si le butin automatique est activé"
-- Filger
L_GUI_FILGER = "Temps de recharge (Filger)"
L_GUI_FILGER_SUBTEXT = "Filger - Un analogue de WeakAuras, mais plus simple à utiliser. Vous permet d’afficher sous la forme d’icônes et de barres vos auras et chronomètres."
L_GUI_FILGER_ENABLE = "Activer Filger"
L_GUI_FILGER_TEST_MODE = "Activer le mode test"
L_GUI_FILGER_MAX_TEST_ICON = "Nombre d'icône pour le mode Test"
L_GUI_FILGER_SHOW_TOOLTIP = "Afficher l'infobulle"
L.filger_subheader_elements = "Affichage des éléments"
L.filger_show_buff = "Buffs du joueur"
L.filger_show_proc = "Procs du joueur"
L.filger_show_debuff = "Debuffs sur la cible"
L.filger_show_aura_bar = "Barre d'aura sur la cible"
L.filger_show_special = "Buffs spéciaux sur le joueur"
L.filger_show_pvp_player = "Debuffs JcJ sur le joueur"
L.filger_show_pvp_target = "Auras JcJ sur la cible"
L.filger_show_cd = "Temps de recharge"
L.filger_subheader_size = "Taille des icônes"
L.filger_subheader_test = "Mode test"
L_GUI_FILGER_EXPIRATION = "Organiser les temps de recharge par temps d'expiration"
L_GUI_FILGER_BUFFS_SIZE = "Taille des buffs"
L_GUI_FILGER_COOLDOWN_SIZE = "Taille des temps de recharge"
L_GUI_FILGER_PVP_SIZE = "Taille des debuffs JcJ"
L.filger_buffs_space = "Espacement des buffs"
L.filger_pvp_space = "Espacements des auras JcJ"
L.filger_cooldown_space = "Espacement des temps de recharge"
L.filger_subheader_spells = "Ajout de nouveaux sorts"
L.filger_category_list = "Catégorie de la liste de sorts"
-- Announcements options
L_GUI_ANNOUNCEMENTS = "Annonces"
L_GUI_ANNOUNCEMENTS_SUBTEXT = "Paramètres qui ajoutent des annonces de chat pour les sorts ou les objets."
L.announcements_drinking = "Un ennemi de l’arène est entrain de boire"
L.announcements_interrupts = "Interruptions"
L.announcements_interrupts_desc = "Annonce dans le groupe/raid lorsque vous interrompez un sort"
L.announcements_spells = "Lancement de certains sorts"
L.announcements_spells_desc = "Annonce dans le groupe/raid quand vous lancez un sort (dans la liste)"
L.announcements_spells_from_all = "De tous les membres"
L.announcements_spells_from_all_desc = "Annonce dans le groupe/raid quand un des membres du groupe/raid lance un sort"
L.announcements_toys = "Annonce le lancement de certains jouets"
L.announcements_pull_countdown = "Compte à rebours"
L.announcements_pull_countdown_desc = "Annonce le compte à rebours pou Pull '/pc #'"
L.announcements_flask_food = "Utilisation de flacons et de nourritures"
L.announcements_flask_food_desc = "Annonce l'usage de flacon et nourriture (/ffcheck)"
L.announcements_flask_food_raid = "Annoncer sur le canal de raid"
L.announcements_flask_food_auto = "Vérification automatique après un appel de raid"
L.announcements_feasts = "Annonce la pose de Festins/Pierre de soins/Robots de réparation"
L.announcements_portals = "Annonce le lancement de Portails/Pierre de téléportation"
L.announcements_subheader_self = "Annonces personnelles"
L.announcements_bad_gear = "Vérifiez le mauvais équipement"
L.announcements_bad_gear_desc = "Vérifie si un mauvais équipement est porté en instance (dans la liste)"
L.announcements_safari_hat = "Chapeau de safari"
L.announcements_safari_hat_desc = "Vérifie si le chapeau de safari est activé lors du démarrage d'un combat de pet"
-- Automation options
L_GUI_AUTOMATION = "Automatisation"
L_GUI_AUTOMATION_SUBTEXT = "Ce bloc contient des paramètres qui facilitent la routine."
L.automation_release = "Libération automatique de l'esprit dans les champs de bataille"
L.automation_screenshot = "Faire une capture d’écran lorsque le joueur obtient un haut-fait"
L.automation_solve_artifact = "Affiche automatiquement une fenêtre pour la résolution d'artéfact"
L.automation_solve_artifact_desc = "S’il y a suffisamment de fragments pour un artefact, une fenêtre apparaît pour le résoudre."
L.automation_accept_invite = "Accepter automatiquement les invitations"
L.automation_decline_duel = "Décliner les duels automatiquement (/disduel pour désactiver temporairement)"
L.automation_accept_quest = "Accepter les quêtes automatiquement (désactivée si vous maintenez Shift)"
L.automation_auto_collapse = "Réduire automatiquement la fenêtre de quête"
L.automation_auto_collapse_raid = "En instance"
L.automation_auto_collapse_reload = "Après un (/reload)"
L.automation_auto_collapse_scenario = "Partiellement"
L.automation_skip_cinematic = "Désactive automatiquement les cinématiques/film (inactif si vous maintenez Ctrl)"
L.automation_auto_role = "Active automatiquement l'affichage de votre rôle"
L.automation_cancel_bad_buffs = "Annulation automatique des buffs de fêtes (de la liste)"
L.automation_tab_binder = "Changement automatique de la touche 'Tab' dans les zones JcJ"
L.automation_tab_binder_desc = "La touche 'Tab' cible uniquement les joueurs ennemis dans les zones JcJ, ignore les animaux de compagnie et les mobs"
L.automation_logging_combat = "Active automatiquement l'enregistrement du journal de combat en raid"
L.automation_buff_on_scroll = "Lancement de sort via la molette souris (dans la liste)"
L.automation_buff_on_scroll_desc = "Si le buff de la liste n’est pas appliqué sur le joueur, il sera lancé par le défilement de la souris"
L.automation_open_items = "Ouverture automatique des objets dans les sacs"
L.automation_resurrection = "Accepter la résurrection"
L.automation_summon = "Accepter l'invocation"
L.automation_whisper_invite = "Invitation automatique par mot-clé"
L.automation_invite_keyword = "Liste des mots-clés (séparés par un espace)"
L.automation_invite_keyword_desc = "Lorsque le joueur vous chuchote un des mot-clés, il sera invité dans votre groupe"
-- Buffs reminder options
L_GUI_REMINDER = "Contrôle des buffs"
L_GUI_REMINDER_SUBTEXT = "Affichage des buffs manquants."
L_GUI_REMINDER_SOLO_ENABLE = "Afficher les buffs personnelles manquants"
L_GUI_REMINDER_SOLO_SOUND = "Notification sonore pour les buffs personnelles manquants"
L_GUI_REMINDER_SOLO_SIZE = "Taille de l'icône"
L_GUI_REMINDER_SOLO_SIZE_DESC = "Taille de l'icône pour les buffs personnelles"
L_GUI_REMINDER_SUBHEADER = "Buffs de raid"
L_GUI_REMINDER_RAID_ENABLE = "Voir les buffs de raid manquants"
L_GUI_REMINDER_RAID_ALWAYS = "Toujours voir les buffs manquants"
L_GUI_REMINDER_RAID_SIZE = "Taille de l'icône"
L_GUI_REMINDER_RAID_SIZE_DESC = "Taille de l'icône pour les buffs de raid"
L_GUI_REMINDER_RAID_ALPHA = "Opacité"
L_GUI_REMINDER_RAID_ALPHA_DESC = "Icônes transparentes lorsque les buffs sont présents"
-- Raid cooldowns options
L_GUI_COOLDOWN_RAID = "Temps de recharge du raid"
L_GUI_COOLDOWN_RAID_SUBTEXT = "Suivi des temps de recharge du raid dans le coin supérieur gauche."
L_GUI_COOLDOWN_RAID_ENABLE = "Activer les CD de raid"
L_GUI_COOLDOWN_RAID_HEIGHT = "Hauteur des barres"
L_GUI_COOLDOWN_RAID_WIDTH = "Largeur des barres"
L_GUI_COOLDOWN_RAID_SORT = "Nouvelle barre vers le haut"
L_GUI_COOLDOWN_RAID_EXPIRATION = "Tri par temps d'expiration"
L_GUI_COOLDOWN_RAID_SHOW_SELF = "Montrer mes temps de recharge"
L_GUI_COOLDOWN_RAID_ICONS = "Icônes des temps de recharge de raid"
L_GUI_COOLDOWN_RAID_IN_RAID = "Voir les temps de recharge alliés en raid"
L_GUI_COOLDOWN_RAID_IN_PARTY = "Voir les temps de recharge alliés en groupe"
L_GUI_COOLDOWN_RAID_IN_ARENA = "Voir les temps de recharge alliés en arène"
-- Enemy cooldowns options
L_GUI_COOLDOWN_ENEMY = "Temps de recharge des ennemis"
L_GUI_COOLDOWN_ENEMY_SUBTEXT = "Afficher les capacités ennemies en tant qu’icônes au-dessus de votre barre d'incantation."
L_GUI_COOLDOWN_ENEMY_ENABLE = "Activer les temps de recharge ennemis"
L_GUI_COOLDOWN_ENEMY_SIZE = "Taille de l'icône des temps de recharge ennemis"
L_GUI_COOLDOWN_ENEMY_DIRECTION = "Direction des icônes du temps de recharge ennemis"
L_GUI_COOLDOWN_ENEMY_EVERYWHERE = "Voir les temps de recharge ennemis partout"
L_GUI_COOLDOWN_ENEMY_IN_BG = "Voir les temps de recharge ennemis dans les champs de bataille"
L_GUI_COOLDOWN_ENEMY_IN_ARENA = "Voir les temps de recharge ennemis en arène"
L.enemycooldown_show_inparty = "Afficher sur le cadre du groupe pour les alliés"
L.enemycooldown_class_color = "Active la couleur de classe pour la bordure des icônes"
-- Pulse cooldowns options
L_GUI_COOLDOWN_PULSE = "Temps de recharge par îcone d'impulsion"
L_GUI_COOLDOWN_PULSE_SUBTEXT = "Suivez vos temp de recharge à l’aide d’une icône d’impulsion au centre de l’écran."
L_GUI_COOLDOWN_PULSE_ENABLE = "Activation de l'îcone d'impulsion"
L_GUI_COOLDOWN_PULSE_SIZE = "Taille de l'îcone d'impulsion"
L_GUI_COOLDOWN_PULSE_SOUND = "Avertissement sonore"
L_GUI_COOLDOWN_PULSE_ANIM_SCALE = "Mise à l'échelle des animations"
L_GUI_COOLDOWN_PULSE_HOLD_TIME = "Temps maximum pour la rémanence de l'îcone"
L_GUI_COOLDOWN_PULSE_THRESHOLD = "Temps de déclenchement"
L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = "Temps minimum de déclenchement"
-- Threat options
L_GUI_THREAT = "Barre de menace"
L_GUI_THREAT_SUBTEXT = "Affichage de la liste des menaces (un simple analogue d’Omen)."
L_GUI_THREAT_ENABLE = "Activer les barres de menace"
L_GUI_THREAT_HEIGHT = "Hauteur des barres de menace"
L_GUI_THREAT_WIDTH = "Largeur des barres de menace"
L_GUI_THREAT_ROWS = "Nombre de barres de menace"
L_GUI_THREAT_HIDE_SOLO = "Afficher uniquement en groupe/raid"
-- Top panel options
L_GUI_TOP_PANEL = "Panneau supérieur"
L_GUI_TOP_PANEL_SUBTEXT = "Gérer les options du panneau supérieur."
L_GUI_TOP_PANEL_ENABLE = "Activer le panneau supérieur"
L_GUI_TOP_PANEL_MOUSE = "Panneau supérieur au survol de la souris"
L_GUI_TOP_PANEL_WIDTH = "Largeur du panneau"
L_GUI_TOP_PANEL_HEIGHT = "Hauteur du panneau"
-- Stats options
L_GUI_STATS = "Statistiques"
L_GUI_STATS_SUBTEXT = "Blocs statistiques situés au bas de l’écran. Tapez '/ls' dans le chat pour info."
L_GUI_STATS_CLOCK = "Horloge"
L_GUI_STATS_LATENCY = "Latence"
L_GUI_STATS_FPS = "FPS"
L_GUI_STATS_EXPERIENCE = "Expérience"
L_GUI_STATS_TALENTS_DESC = "En cliquant sur Le texte cela vous permet de modifier la spécialisation et le type de butin"
L_GUI_STATS_COORDS = "Coordonnées"
L_GUI_STATS_LOCATION = "Lieu actuel"
L_GUI_STATS_BG = "Champ de bataille"
L.stats_bottom_line = "Ligne de couleur de classe en bas de l'écran"
L_GUI_STATS_SUBHEADER_CURRENCY = "Devise (afficher au survol de la souris du texte d'information sur l'or)"
L_GUI_STATS_CURRENCY_ARCHAEOLOGY = "Fragments archéologiques dans devise"
L_GUI_STATS_CURRENCY_COOKING = "Prix de cuisine dans devise"
L_GUI_STATS_CURRENCY_RAID = "Sceaux de raid dans devise"
-- Trade options
L_GUI_TRADE = "Métier"
L_GUI_TRADE_SUBTEXT = "Paramètres liés aux professions et aux métiers"
L.trade_profession_tabs = "Onglet des Professions"
L.trade_profession_tabs_desc = "Onglet des professions sur les fenêtres de métiers et de craft"
L.trade_already_known = "Colore les éléments déjà connus"
L.trade_already_known_desc = "Colore les recettes/supports/animaux/jouets déjà connus"
L.trade_disenchanting = "Désenchantement rapide"
L.trade_disenchanting_desc = "Mouture, Prospection et Désenchantement avec Alt+clique"
L.trade_sum_buyouts = "Somme totale de toutes les ventes aux enchères en cours"
L.trade_sum_buyouts_desc = "À l’onglet Ventes aux enchères, affiche la somme totale de toutes les ventes aux enchères en cours."
L.trade_enchantment_scroll = "Onglet : parchemin d'enchantement sur la fenêtre de métier"
L.trade_archaeology = "Traqueur d’archéologie"
L.trade_archaeology_desc = "Traqueur d’archéologie ('/arch' ou bouton à droite de la minimap au survol de la souris"
L.trade_merchant_itemlevel = "Niveau d’objet chez le marchand"
L.trade_merchant_itemlevel_desc = "Montrer le niveau d'objet des armes et amures chez le marchand"
-- Miscellaneous options
L_GUI_MISC_SUBTEXT = "Paramètres qui ajoutent des fonctionnalités intéressantes."
L.misc_shift_marking = "Marques de raid au survol de la souris"
L.misc_shift_marking_desc = "Menu de marques de raid quand vous faite un Shift+Clique sur la cible (Fonctionne uniquement en groupe)"
L.misc_afk_spin_camera = "Faire tourner la caméra quand absent"
L.misc_quest_auto_button = "Bouton automatique des objets de quête"
L.misc_quest_auto_button_desc = "Affiche un bouton pour les objets de quête au-dessus de la minimap (de la liste)"
L.misc_raid_tools = "Outils de raid"
L.misc_raid_tools_desc = "Bouton en haut de l’écran pour la vérification de la disponibilité (clic gauche), vérification des rôles (clic du milieu), établissement des marques, etc. (pour le leader et les adjoints)"
L.misc_item_level = "Niveau d'objet sur les icônes de la fiche de personnage"
L.misc_item_level_desc = "Affiche le niveau d'objet sur les icônes d'équipement dans la fiche de personnage"
L.misc_click_cast = "Simple addon d'assignation de sorts : click2cast"
L.misc_click_cast_desc = "Vous permet d’assigner des sorts aux boutons de la souris. Configuration dans le livre de sorts"
L.misc_click_cast_filter = "Ignore les cadres Joueur et Cible pour l'addon click2cast"
L.misc_chars_currency = "Affiche les jetons et autres monnaies de vos différents personnages"
L.misc_chars_currency_desc = "Passez la souris sur l’icône de la devise requise dans la fenêtre de caractères pour afficher des informations dans l’infobulle"
L.misc_hide_raid_button = "Bouton pour masquer les cadres de raid dans la disposition 'DPS'"
L.misc_hide_raid_button_desc = "Le bouton s’affiche en plaçant la souris dans le coin en haut à gauche"
================================================
FILE: ShestakUI_Config/Locales/German.lua
================================================
local _, L = ...
if GetLocale() ~= "deDE" then return end
----------------------------------------------------------------------------------------
-- Localization for deDE client
-- Translation: Alwa, Baine, Chubidu, F5Hellbound, Vienchen
----------------------------------------------------------------------------------------
L_GUI_SET_SAVED_SETTTINGS = "Einstellungen für jeden Charakter einzeln vornehmen"
L_GUI_SET_SAVED_SETTTINGS_DESC = "Umschalten zwischen einem Profil, das für alle Chars gilt, und einem Profil, das für diesen Chars gilt."
L_GUI_RESET_CHAR = "Bist du sicher, dass du die Charaktereinstellungen für ShestakUI zurücksetzen willst?"
L_GUI_RESET_ALL = "Bist du sicher, dass du alle Einstellungen von ShestakUI zurücksetzen willst?"
L_GUI_PER_CHAR = "Bist du sicher, dass du 'Einzelne Einstellungen für jeden Charakter' ein oder ausschalten möchtest?"
L_GUI_RESET_CAT = "Bist Du sicher, dass Du die Einstellungen der Kategorie zurücksetzen möchtest?"
L_GUI_RESET_CAT_DESC = "Einstellungen der Kategorie zurücksetzen. \nCTRL-Klick zum Zurücksetzen aller"
L_GUI_NEED_RELOAD = "Benutzeroberfläche erneut laden, um Ihre Änderungen zu übernehmen."
L_GUI_LAYOUT = "Layout ändern"
L_GUI_SPELL_LIST = "Liste der Zauber"
L_GUI_SPELL_INPUT = "Zauber ID"
L_GUI_TIME_INPUT = "Zeit"
L_GUI_EXPERT_MODE = "Expert mode" -- Need review
L_GUI_EXPERT_MODE_DESC = "Custom editing of Lua profile" -- Need review
L_GUI_RESET_SPELLS_DESC = "CTRL-click to reset list" -- Need review
-- Profile
L.profile = "Profile" -- Need review
L.profile_title = "Profile options" -- Need review
L.profile_choose = "Choose profile" -- Need review
L.profile_options = "Settings" -- Need review
L.profile_movers = "Moving elements" -- Need review
L.profile_export = "Export" -- Need review
L.profile_import = "Import" -- Need review
L.profile_error_lib = "To enable export and import - install WeakAuras" -- Need review
L.profile_error_code = "Error in imported code!" -- Need review
-- General options
L_GUI_GENERAL_SUBTEXT = "Diese Einstellungen steuern die allgemeinen Einstellungen der Benutzeroberfläche. Geben Sie im Chat '/uihelp ein, um Hilfe zu erhalten."
L_GUI_GENERAL_WELCOME_MESSAGE = "Welcome message in chat"
L_GUI_GENERAL_AUTOSCALE = "Automatisch UI skalieren"
L_GUI_GENERAL_UISCALE = "UI Skalierung (falls automatische Skalierung deaktiviert)"
L.general_subheader_blizzard = "Blizzard UI Elemente"
L.general_error_filter = "Fehlerfilterung"
L.general_error_blacklist = "Blacklist"
L.general_error_whitelist = "Whitelist"
L.general_error_combat = "Im Kampf"
L.general_error_none = "Nichts"
L.general_vehicle_mouseover = "Fahrzeugfenster bei mouseover anzeigen"
L.general_move_blizzard = "Einige Blizzardfenster frei bewegbar machen"
L.general_color_picker = "Verbesserte Farbauswahl"
L.general_color_picker_desc = "Hinzufügen von Kopieren/Einfügen-Schaltflächen und Eingabe von Zifferntext für Blizzard-Farbauswahlrahmen"
L.general_minimize_mouseover = "Mouseover für Quest minimieren Taste"
L.general_hide_banner = "Autoverstecken des Boss Loot Frame"
L.general_hide_talking_head = "Verstecke Talking Head Frame"
L.general_hide_maw_buffs = "Hide Maw Buffs frame in instances" -- Need review
-- Media options
L.media_border_color = "Farbe für Rahmen"
L.media_classborder_color = "Farbe für Klassenrahmen"
L.media_backdrop_color = "Farbe für Rahmen-Hintergrund"
L.media_backdrop_alpha = "Alpha für transparenten Hintergrund"
L.media_texture = "Haupttextur"
L.media_subheader_normal = "Change general font" -- Need review
L.media_subheader_pixel = "Ändere Pixel Schriftart" -- Need review
-- Font options
L.font = "Schriftart"
L.font_subtext = "Anpassen der einzelne Schriftarten für Elemente."
L.font_stats_font = "Schriftart auswählen"
L.font_stats_font_style = "Schriftart Flag"
L.font_stats_font_shadow = "Schriftart Schatten"
L.font_subheader_stats = "Stats Schriftart"
L.font_subheader_combat = "Combat Text Schriftart"
L.font_subheader_chat = "Chat Text Schriftart"
L.font_subheader_chat_tabs = "Chat Tabs Schriftart"
L.font_subheader_action = "Actionbars Schriftart"
L.font_subheader_threat = "Threatmeter Schriftart"
L.font_subheader_raidcd = "Raid Cooldowns Schriftart"
L.font_subheader_cooldown = "Cooldowns Timer Schriftart"
L.font_subheader_loot = "Loot Schriftart"
L.font_subheader_nameplates = "Nameplates Schriftart"
L.font_subheader_unit = "Unit Frames Schriftart"
L.font_subheader_aura = "Auras Schriftart"
L.font_subheader_filger = "Filger Schriftart"
L.font_subheader_style = "Design Schriftart"
L.font_subheader_bag = "Taschen Schriftart"
L.font_subheader_blizzard = "System font size" -- Need review
L.font_tooltip_header_font_size = "Tooltip header" -- Need review
L.font_tooltip_font_size = "Tooltip text" -- Need review
L.font_global_font = "Disable Pixel font" -- Need review
-- Skins options
L_GUI_SKINS = "Design/Skins"
L_GUI_SKINS_SUBTEXT = "Ändert das Erscheinungsbild der Standard UI."
L_GUI_SKINS_BLIZZARD = "Aktiviere Styles für Blizzardfenster"
L_GUI_SKINS_MINIMAP_BUTTONS = "Aktiviere styling Addonincons an der Minimap"
L_GUI_SKINS_SUBHEADER = "Design/Skins für Addons"
L.skins_minimap_buttons_mouseover = "Addons-Symbole bei Mouseover"
L.skins_bubbles = "Blizzard Chat Blasen verändern"
-- Unit Frames options
L_GUI_UF_SUBTEXT = "Anpassen von Player, Zielframes usw."
L_GUI_UF_ENABLE = "Unitframes aktivieren"
L_GUI_UF_OWN_COLOR = "Farbe für die Lebensleiste festlegen"
L_GUI_UF_UF_COLOR = "Farbe der Lebensleiste (falls eigene Farbe verwender wird)"
L.unitframe_uf_color_bg = "Color of health background" -- Need review
L.unitframe_enemy_health_color = "Lebensleiste eines gegnerischen Ziels ist rot"
L_GUI_UF_TOTAL_VALUE = "Zeige Infotext auf Spieler und Ziel mit XXX/Gesamt"
L_GUI_UF_COLOR_VALUE = "Lebens/Mana Werte einfärben"
L_GUI_UF_BAR_COLOR_VALUE = "Lebensbalken nach vorhandenem Leben einfärben"
L_GUI_UF_LINES = "Zeige Spieler & Ziel Extra Linien an"
L_GUI_UF_SUBHEADER_CAST = "Zauberleiste"
L_GUI_UF_UNIT_CASTBAR = "Zeige Zauberleisten"
L_GUI_UF_CASTBAR_ICON = "Zeige Symbole der Zauberleisten an"
L_GUI_UF_CASTBAR_LATENCY = "Latenz in Zauberleiste anzeigen"
L_GUI_UF_CASTBAR_TICKS = "Castbar Ticks"
L_GUI_UF_SUBHEADER_FRAMES = "Frames/Einheitenfenster"
L_GUI_UF_SHOW_PET = "Zeige Begleiterfenster an"
L_GUI_UF_SHOW_FOCUS = "Zeige Fokusfenster an"
L_GUI_UF_SHOW_TOT = "Zeige 'Ziel des Ziels' Fenster an"
L_GUI_UF_SHOW_BOSS = "Zeige Bossfenster"
L_GUI_UF_BOSS_RIGHT = "Bossfenster rechts"
L_GUI_UF_SHOW_ARENA = "Zeige Arenafenster"
L_GUI_UF_ARENA_RIGHT = "Arenafenster Rechts"
L_GUI_UF_BOSS_DEBUFFS = "Anzahl der Debuffs"
L_GUI_UF_BOSS_DEBUFFS_DESC = "Anzahl der Debuffs am Boss Frames"
L_GUI_UF_BOSS_BUFFS = "Anzahl der Buffs"
L_GUI_UF_BOSS_BUFFS_DESC = "Anzahl der Buffs am Boss Frames"
L.unitframe_icons_pvp = "PvP-Status-Text"
L.unitframe_icons_pvp_desc = "Zeige PvP Text (keine Symbole) bei Mouseover (Spieler+Ziel)"
L_GUI_UF_ICONS_COMBAT = "Kampfsymbol"
L_GUI_UF_ICONS_RESTING = "Ausruhensymbol für low-lvl Chars"
L_GUI_UF_SUBHEADER_PORTRAIT = "Portraits"
L_GUI_UF_PORTRAIT_ENABLE = "Aktiviere Spieler/Ziel Portraits"
L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = "Aktiviere Rahmen in Klassenfarbe"
L.unitframe_portrait_type = "Type of portraits" -- Need review
L.unitframe_portrait_type_icons = "Class Icons" -- Need review
L.unitframe_portrait_type_overlay = "Overlay" -- Need review
L_GUI_UF_PORTRAIT_HEIGHT = "Portraithöhe"
L_GUI_UF_PORTRAIT_WIDTH = "Portraitbreite"
L_GUI_UF_SUBHEADER_PLUGINS = "Plugins"
L_GUI_UF_PLUGINS_GCD = "Blitz für globalen Cooldown"
L_GUI_UF_PLUGINS_SWING = "Swingleiste"
L.unitframe_plugins_reputation_bar = "Rufleiste"
L.unitframe_plugins_reputation_bar_desc = "Rufleiste"
L.unitframe_plugins_experience_bar = "Erfahrungsleiste"
L.unitframe_plugins_experience_bar_desc = "Erfahrungsleiste"
L_GUI_UF_PLUGINS_SMOOTH_BAR = "Weichgezeichnete Leisten"
L_GUI_UF_PLUGINS_ENEMY_SPEC = "Zeige gegnerische Talente"
L_GUI_UF_PLUGINS_COMBAT_FEEDBACK = "Kampftexts auf Spieler/Zielfenster"
L_GUI_UF_PLUGINS_FADER = "Blende Einheitenfenster aus"
L_GUI_UF_PLUGINS_DIMINISHING = "Diminishing Returns Symbole auf Arena Fenstern"
L_GUI_UF_PLUGINS_POWER_PREDICTION = "Balken der Energiekosten auf dem Spielerframe"
L.unitframe_plugins_absorbs = "Absorbiert den Wert auf dem Spielerframe"
L.unitframe_subheader_player_width = "Spieler- und Ziel-Frame-Größe"
L.unitframe_player_width = "Breite"
L.unitframe_subheader_boss_width = "Boss and arena frame size" -- Need review
L.unitframe_extra_height_auto = "Automatische Höhe für Gesundheit/Kraft"
L.unitframe_extra_height_auto_desc = "Intelligente Anpassung je nach Schriftgröße"
L.unitframe_extra_health_height = "Zusätzliche Höhe für die Gesundheit"
L.unitframe_extra_power_height = "Zusätzliche Höhe für Power/Energie"
L.unitframe_subheader_castbar = "Size of player and target castbar" -- Need review
L.unitframe_castbar_height = "Height" -- Need review
-- Unit Frames Class bar options
L_GUI_UF_PLUGINS_CLASS_BAR = "Unit Frames Klassenleisten"
L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = "Kontrolle von Ressourcen der Sonderklasse."
L_GUI_UF_PLUGINS_COMBO_BAR = "Symbole für Schurke/Druide Combopunkte"
L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = "Zeige immer die Combo Leiste für Druiden"
L_GUI_UF_PLUGINS_COMBO_BAR_OLD = "Zeige Combopunkte auf dem Ziel"
L_GUI_UF_PLUGINS_ARCANE_BAR = "Aktiviere Arcane Charge Leiste"
L_GUI_UF_PLUGINS_CHI_BAR = "Ativiere Chi Leiste"
L_GUI_UF_PLUGINS_STAGGER_BAR = "Aktiviere Stagger Leiste (für Monk Tanks)"
L_GUI_UF_PLUGINS_HOLY_BAR = "Aktivere Heilige Kraft Leiste"
L_GUI_UF_PLUGINS_SHARD_BAR = "Aktiviere Splitter Leiste"
L_GUI_UF_PLUGINS_RUNE_BAR = "Runenleiste"
L_GUI_UF_PLUGINS_TOTEM_BAR = "Totemleiste"
L.unitframe_class_bar_totem_other = "Enable Totem bar for other classes" -- Need review
L.unitframe_class_bar_essence = "Enable Essence bar for Evoker" -- Need review
-- Raid Frames options
L_GUI_UF_RAIDFRAMES_SUBTEXT = "Anpassen des Aussehens der Raid Frames."
L_GUI_UF_BY_ROLE = "Sortierung der Gruppenspieler nach Rolle"
L_GUI_UF_AGGRO_BORDER = "Rahmen bei Bedrohung"
L_GUI_UF_DEFICIT_HEALTH = "Fehlendes Leben im Raid"
L_GUI_UF_SHOW_PARTY = "Zeige Gruppenfenster"
L_GUI_UF_SHOW_RAID = "Zeige Raidfenster"
L.raidframe_layout = "Raid layout" -- Needs review
L.raidframe_heal_layout = "Heal" -- Needs review
L.raidframe_dps_layout = "DPS" -- Needs review
L.raidframe_auto_layout = "Auto" -- Needs review
L.raidframe_show_target = "Show target frames" -- Needs review
L.raidframe_show_pet = "Show pet frames" -- Needs review
L.raidframe_vertical_health = "Vertikale Orientierung für Lebensbalken"
L.raidframe_vertical_health_desc = "Only for heal layout" -- Needs review
L_GUI_UF_ALPHA_HEALTH = "Transparenz der Lebensbalken wenn 100% Leben"
L_GUI_UF_SHOW_RANGE = "Raidframes durchsichtig abhängig von der Entfernung"
L_GUI_UF_RANGE_ALPHA = "Alpha"
L_GUI_UF_RANGE_ALPHA_DESC = "Einheitenfenster zu diesem Maß ausblenden wenn außer Reichweite"
L_GUI_UF_SUBHEADER_RAIDFRAMES = "Frames"
L_GUI_UF_SOLO_MODE = "Spielerfenster immer Anzeigen"
L_GUI_UF_PLAYER_PARTY = "Spielerfenster in der Gruppe anzeigen"
L_GUI_UF_SHOW_TANK = "Zeige Raid Tanks an"
L_GUI_UF_SHOW_TANK_TT = "Zeige Ziel des Raid Tank Ziels (Ziel des Ziels)"
L_GUI_UF_RAID_GROUP = "Anzahl der Gruppen im Raid"
L.raidframe_party_vertical = "Vertical party frames" -- Needs review
L.raidframe_raid_groups_vertical = "Vertikale Raidgruppen" -- Needs review
L.raidframe_raid_groups_vertical_desc = "Heiler Layout" -- Needs review
L_GUI_UF_SUBHEADER_ICONS = "Icons"
L_GUI_UF_ICONS_ROLE = "Rollensymbol auf den Unit Frames"
L_GUI_UF_ICONS_RAID_MARK = "Raidsymbole"
L_GUI_UF_ICONS_READY_CHECK = "Bereitschaftschecksymbole"
L_GUI_UF_ICONS_LEADER = "Anführer/Assistent an den Fenstern anzeigen"
L_GUI_UF_ICONS_SUMON = "Sumon-Symbole"
L.raidframe_icons_phase = "Phase"
L.raidframe_plugins_debuffhighlight_icon = "Debufftextur und Symbol hervorheben" -- Need review
L.raidframe_plugins_aura_watch = "'RAID' Buffüberwachung"
L.raidframe_plugins_aura_watch_timer = "Timer auf Schlachtzugsdebuff Icons"
L.raidframe_plugins_pvp_debuffs = "Zeige ebenfalls PvP Debuff Symbol (aus der Liste)"
L_GUI_UF_PLUGINS_HEALCOMM = "Leiste für Eingehende Heilung"
L.raidframe_plugins_over_absorb = "Show over absorb bar on frame" -- Need review
L.raidframe_plugins_over_heal_absorb = "Show over heal absorb on frame" -- Need review
L.raidframe_plugins_auto_resurrection = "Automatische Wiederbelebung"
L.raidframe_plugins_auto_resurrection_desc = "Mittel-Klick um automatisch Auferstehung zu zauber wenn das Ziel tot ist (funktioniert nicht wenn Clique installiert ist)"
L.raidframe_hide_health_value = "Gesundheitswert ausblenden" -- Needs review
L.raidframe_auto_position = "Automatische Neupositionierung der Raid-Frames"
L.raidframe_auto_position_desc = "Wenn es mehr als 5 Gruppen gibt, ändern sich die Frames" -- Need review
L.raidframe_auto_position_dynamic = "Dynamic" -- Need review
L.raidframe_auto_position_static = "Static" -- Need review
L.raidframe_subheader_heal_size = "Größe für Heal-Layout"
L.raidframe_heal_width = "Frame Breite"
L.raidframe_heal_height = "Frame Höhe"
L.raidframe_heal_power_height = "Power Höhe"
L.raidframe_subheader_dps_size = "Größe für DPS-Layout"
L.raidframe_dps_party_width = "Party Breite"
L.raidframe_dps_party_height = "Party Höhe"
L.raidframe_dps_raid_width = "Raid Breite"
L.raidframe_dps_raid_height = "Raid Höhe"
L.raidframe_dps_party_power_height = "Party Power Höhe"
L.raidframe_dps_raid_power_height = "Raid Power Höhe"
-- ActionBar options
L_GUI_ACTIONBAR = "Aktionsleisten"
L_GUI_ACTIONBAR_ENABLE = "Aktionsleisten aktivieren"
L_GUI_ACTIONBAR_HOTKEY = "Zeige Hotkey-Text an"
L_GUI_ACTIONBAR_MACRO = "Zeige Makronamen auf den Buttons"
L_GUI_ACTIONBAR_GRID = "Zeige die leeren Knöpfe der Aktionsleisten an"
L_GUI_ACTIONBAR_BUTTON_SIZE = "Knopfgröße"
L_GUI_ACTIONBAR_BUTTON_SPACE = "Buttonabstand"
L_GUI_ACTIONBAR_SPLIT_BARS = "Splitte die Fünfte Aktionsleiste im zwei 6 Knöpfe Leisten"
L_GUI_ACTIONBAR_CLASSCOLOR_BORDER = "Aktiviere Klassenfarbe für Aktionsleisten"
L.actionbar_toggle_mode = "Aktiviere 'toggle mode'"
L.actionbar_toggle_mode_desc = "The quick change in the number of panels. For the lower panels, hover the mouse over the hidden area above the panels. For right panels, hover the mouse over the area below the panels." -- Need review
L_GUI_ACTIONBAR_HIDE_HIGHLIGHT = "hebe keine Procs hervor"
L_GUI_ACTIONBAR_BOTTOMBARS = "Anzahl der Aktionsleisten an der unteren Seite"
L_GUI_ACTIONBAR_RIGHTBARS = "Anzahl der Aktionsleisten an der rechten Seite"
L.actionbar_bottombars_mouseover = "Bottom bars on mouseover" -- Needs review
L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = "Zeige die rechten Leisten nur bei Mouseover"
L_GUI_ACTIONBAR_PETBAR_HIDE = "Verstecke Begleiterleiste"
L_GUI_ACTIONBAR_PETBAR_HORIZONTAL = "Aktiviere horizontale Begleiterleiste"
L_GUI_ACTIONBAR_PETBAR_MOUSEOVER = "Zeige die Begleiterleiste nur bei Mouseover(nur für horizontale Begleiterleiste)"
L_GUI_ACTIONBAR_STANCEBAR_HIDE = "Gestaltenleiste verstecken"
L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = "Horizontale Haltungsleiste aktivieren"
L.actionbar_stancebar_horizontal_desc = "Befindet sich unter dem Rahmen des Spielers"
L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = "Zeige Haltungsleiste/Gestaltenleiste nur bei Mouseover"
L_GUI_ACTIONBAR_MICROMENU = "Zeige Micromenü"
L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = "Micromenü bei MouseOver"
L.actionbar_editor = "Bars editor" -- Needs review
L.actionbar_editor_desc = "Allow to move and change each panel individually" -- Needs review
L.actionbar_bar1_num = "Number of buttons" -- Needs review
L.actionbar_bar1_row = "Buttons per row" -- Needs review
L.actionbar_bar1_mouseover = "Bar on mouseover" -- Needs review
-- Tooltip options
L.tooltip = "Tooltip"
L.tooltip_subtext = "Hier kannst Du die Standard Tips beim Mouseover ändern."
L.tooltip_enable = "Aktiviere Tooltip"
L.tooltip_shift_modifer = "Tooltip anzeigen wenn 'Umschalttaste' gedrückt wird"
L.tooltip_cursor = "Tooltip unter dem Mauszeiger öffnen"
L.tooltip_item_icon = "Symbol der Gegenstände im Tooltip anzeigen"
L.tooltip_health_value = "Numerischer Wert der Lebenspunkte"
L.tooltip_hidebuttons = "Tooltips für Aktionsleisten verstecken"
L.tooltip_hide_combat = "Verstecke Tooltip im Kampf"
L.tooltip_subheader = "Plugins"
L.tooltip_talents = "Zeige die Talente im Tooltip an"
L.tooltip_show_shift = "Anzeigen, wenn Shift gedrückt wird"
L.tooltip_show_shift_desc = "Zeige Item-Level und Spezifikationen, wenn die Umschalttaste gedrückt wird"
L.tooltip_achievements = "Verlgeichen von Erfolgen in Tooltips"
L.tooltip_target = "Ziel des Spielers im Tooltip anzeigen"
L.tooltip_title = "Spieler Title im Tooltip"
L.tooltip_realm = "Spieler Realm Name im Tooltip"
L.tooltip_rank = "Gildenrank im Tooltip anzeigen"
L.tooltip_spell_id = "Zauber ID"
L.tooltip_average_lvl_desc = "Der durchschnittliche Item Level (GS)"
L.tooltip_raid_icon = "Raidsymbol"
L.tooltip_who_targetting = "Zeige an, wer die Eihneit, die in deiner Gruppe/Raid ist, ins Ziel nimmt"
L.tooltip_item_count = "Gegenstandsanzahl"
L.tooltip_unit_role = "Klassenrolle (Tank/Schaden/Heiler)"
L.tooltip_instance_lock = "Deine abgeschlossenen Instanzen im Tooltip"
L.tooltip_mount = "Source of mount" -- Needs review
-- Chat options
L.chat_subtext = "Hier Einstellungen des Chat-Fensters ändern."
L.chat_enable = "Chat aktivieren"
L.chat_background = "Chathintergrund aktivieren"
L.chat_background_alpha = "Transparenz des Hintergrunds"
L.chat_filter = "Entferne Systemspam"
L.chat_filter_desc = "Duels, change talents, NPC dialogue in city" -- Need review
L.chat_spam = "Entferne einigen Spam vom Server"
L.chat_spam_list = "Black list" -- Need review
L.chat_spam_list_desc = "List of words (separated by space, lowercase letters) to hide messages" -- Need review
L.chat_width = "Breite des Chatfensters"
L.chat_height = "Höhe desChatfensters"
L.chat_chat_bar = "Kleine Leiste um den Chatchannel zu wechseln"
L.chat_chat_bar_mouseover = "Aktionsleiste bei Mousover hervorheben"
L.chat_whisp_sound = "Geräusch abspielen wenn eine private Nachricht empfangen wird"
L.chat_combatlog = "Kampflog Reiter anzeigen"
L.chat_tabs_mouseover = "Zeige Chat-Reiter bei Mouseover"
L.chat_sticky = "Behalte den letzen Channel"
L.chat_damage_meter_spam = "Fasse DMG-Meterspam in einer Zeile zusammen"
L.chat_loot_icons = "Symbole für Beute"
L.chat_hide_combat = "Hide chat in combat" -- Needs review
L.chat_custom_time_color = "Aktivieren der benutzerdefinierten Zeitstempelfärbung"
L.chat_time_color = "Farbe des Zeitstempels"
-- Nameplate options
L_GUI_NAMEPLATE_SUBTEXT = "Nameplates Einstellung"
L_GUI_NAMEPLATE_ENABLE = "Namensplaketten aktivieren"
L_GUI_NAMEPLATE_COMBAT = "Namensplaketten automatisch im Kampf anzeigen"
L_GUI_NAMEPLATE_HEALTH = "Numerischer Wert der Lebenspunkte"
L_GUI_NAMEPLATE_HEIGHT = "Höhe der Namensplakette"
L_GUI_NAMEPLATE_WIDTH = "Breite der Namensplakette"
L.nameplate_alpha = "Alpha"
L.nameplate_alpha_desc = "Kein-Ziel Nameplate Alpha"
L.nameplate_ad_height = "Zusätzliche Höhe"
L.nameplate_ad_width = "Zusätzliche Breite"
L.nameplate_ad_height_desc = "Zusätzliche Höhe für ausgewähltes Nameplate"
L.nameplate_ad_width_desc = "Zusätzliche Breite für ausgewählte Nameplate"
L_GUI_NAMEPLATE_CASTBAR_NAME = "Zeige den Namen in der Zauberleiste"
L_GUI_NAMEPLATE_CLASS_ICON = "Zeige Klassensymbole an (PvP)"
L_GUI_NAMEPLATE_NAME_ABBREV = "Namen abgekürzt anzeigen"
L.nameplate_short_name = "Replace names with short ones" -- Need review
L.nameplate_clamp = "Namensschilder am oberen Rand des Bildschirms, wenn außerhalb der Sichtweite." -- Need review
L.nameplate_clamp_desc = "Namensschilder am oberen Rand des Bildschirms, wenn außerhalb der Sichtweite."
L_GUI_NAMEPLATE_SHOW_DEBUFFS = "Zeige Schwächungszauber (Abgekürzte Namen müssen deaktiviert sein)"
L_GUI_NAMEPLATE_SHOW_BUFFS = "Show dispellable enemy buffs and buffs from the list" -- Need review
L_GUI_NAMEPLATE_DEBUFFS_SIZE = "Größe der Debuffs" -- Need review
L_GUI_NAMEPLATE_HEALER_ICON = "Zeige Heilersymbol auf allen gegnerischen Heiler-Nameplates im BG"
L_GUI_NAMEPLATE_TOTEM_ICONS = "Symbol über dem Namensschild des feindlichen Totems anzeigen"
L.nameplate_target_glow = "Show glow texture for target" -- Need review
L.nameplate_only_name = "Show only name for friendly units" -- Need review
L.nameplate_quests = "Show quest icon" -- Need review
L.nameplate_cast_color = "Show color border for casting important spells" -- Need review
L.nameplate_kick_color = "Change cast color if interrupt on cd" -- Need review
L.nameplate_low_health_value = "Health value" -- Need review
L.nameplate_low_health = "Low health highlight" -- Need review
L_GUI_NAMEPLATE_THREAT = "Aktiviere Bedrohungsanzeige, ändert sich automatisch je nach deiner Rolle"
L_GUI_NAMEPLATE_GOOD_COLOR = "Positive Bedrohungsfarbe. Variiert abhängig ob Tank oder dps/heal"
L_GUI_NAMEPLATE_NEAR_COLOR = "Verlust oder Zuwachs der Bedrohung farbig kennzeichen"
L_GUI_NAMEPLATE_BAD_COLOR = "Negative Bedrohungsfarbe. Variiert abhängig ob Tank oder dps/heal"
L_GUI_NAMEPLATE_OFFTANK_COLOR = "Farbe der Offtank-Bedrohung"
L.nameplate_extra_color = "Explosive and Spiteful affix color" -- Need review
L.nameplate_mob_color_enable = "Change color for important mobs in dungeons" -- Need review
L.nameplate_mob_color = "Color for mobs" -- Need review
-- Combat text options
L_GUI_COMBATTEXT = "Kampftext"
L_GUI_COMBATTEXT_SUBTEXT = "Zum Verschieben tippe im Chat '/xct' ein"
L_GUI_COMBATTEXT_ENABLE = "Kampftext aktivieren"
L.combattext_blizz_head_numbers = "Aktiviere Blizzard Kampftext"
L.combattext_blizz_head_numbers_desc = "Blizzard Schaden-/Heilausgabe benutzen (über Spieler/Kreaturen Kopf)"
L.combattext_damage_style = "Ändert die Standardkampfschriftart"
L.combattext_damage_style_desc = "Standard Schaden/Heilung Schriftart über Kreaturen/Spieler Köpfen ändern (Neustart von WoW erforderlich um Änderungen zu sehen)"
L_GUI_COMBATTEXT_DAMAGE = "Zeige ausgehenden Schaden in einem eigenen Fenster"
L_GUI_COMBATTEXT_HEALING = "Zeige ausgehende Heilung in einem eigenen Fenster"
L.combattext_incoming = "Show incoming damage and healing" -- Need review
L_GUI_COMBATTEXT_HOTS = "Zeige peroidische Heilungseffekte im Heilungsfenster"
L_GUI_COMBATTEXT_OVERHEALING = "Zeige ausgehende Überheilung an"
L_GUI_COMBATTEXT_PET_DAMAGE = "Zeige Begleiterschaden"
L_GUI_COMBATTEXT_DOT_DAMAGE = "Zeige Schaden von Schaden über Zeit"
L_GUI_COMBATTEXT_DAMAGE_COLOR = "Zeige Schadensnummern in Abhängigkeit von der Art des Zaubers"
L_GUI_COMBATTEXT_CRIT_PREFIX = "Symbol vor einem kritischen Treffer"
L_GUI_COMBATTEXT_CRIT_POSTFIX = "Symbol hinter einem kritischen Treffer"
L_GUI_COMBATTEXT_ICONS = "Zeige Symbole für ausgehenden Schaden"
L_GUI_COMBATTEXT_ICON_SIZE = "Icon größe"
L_GUI_COMBATTEXT_ICON_SIZE_DESC = "Symbolgröße der Zauber im Fenster für ausgehenden Schaden. Nimmt auch Einfluss auf die Schriftgröße"
L_GUI_COMBATTEXT_TRESHOLD = "Ab welcher Größe soll der Schaden angezeigt werden"
L_GUI_COMBATTEXT_HEAL_TRESHOLD = "Ab welche Größe soll ein-/ausgehende Heilung angezeigt werden"
L_GUI_COMBATTEXT_SCROLLABLE = "Erlaubt es dir mit dem Mausrad durch die letzten Zeilen zu scrollen"
L_GUI_COMBATTEXT_MAX_LINES = "Max. Zeilen"
L_GUI_COMBATTEXT_MAX_LINES_DESC = "Maximale Zeilen, die behalten werden sollen im Scrollmodus (mehr Zeilen = mehr Speicherverbrauch)"
L_GUI_COMBATTEXT_TIME_VISIBLE = "Zeit"
L_GUI_COMBATTEXT_TIME_VISIBLE_DESC = "Zeit(Sekunden) wielange eine einzelne Nachricht angezeigt wird"
L_GUI_COMBATTEXT_DK_RUNES = "Zeige Runenaufladung vom Todesritter"
L_GUI_COMBATTEXT_KILLINGBLOW = "Teilt dir mit ob du den Todesstoß bei einer Kreatur/einem Spieler hattest"
L.combattext_merge_aoe_spam = "Merges spell spam into single message" -- Needs review
L.combattext_merge_aoe_spam_desc = "Vereint mehrfachen Flächenschaden in eine einzige Nachricht"
L_GUI_COMBATTEXT_MERGE_MELEE = "Fügt mehrfachen automatischen Angriffsschaden-Spam zusammen"
L.combattext_merge_all = "Merges all spells" -- Needs review
L_GUI_COMBATTEXT_DISPEL = "Informiert dich über deine Bannungen"
L_GUI_COMBATTEXT_INTERRUPT = "Informiert dich über deine Unterbrechungen"
L_GUI_COMBATTEXT_DIRECTION = "Ändert die Bildlaufrichtung von unten nach oben"
L_GUI_COMBATTEXT_SHORT_NUMBERS = "Zeige kurze Zahlen an ('25.3k' statt '25342')"
-- Auras/Buffs/Debuffs
L_GUI_AURA_PLAYER_BUFF_SIZE = "Buff größe"
L_GUI_AURA_PLAYER_BUFF_SIZE_DESC = "Größe der Spielerbuffs"
L.aura_debuff_size = "Debuff größe"
L_GUI_AURA_SHOW_SPIRAL = "Spirale auf Buffsymbolen"
L_GUI_AURA_SHOW_TIMER = "Zeige Abklingzeit für Buffs"
L_GUI_AURA_PLAYER_AURAS = "Buffs auf dem Spielerfenster"
L_GUI_AURA_TARGET_AURAS = "Buffs auf dem Zielfenster"
L_GUI_AURA_FOCUS_DEBUFFS = "Debuffs auf dem Fokusfenster"
L_GUI_AURA_FOT_DEBUFFS = "Debuffs auf dem Fokusziel"
L_GUI_AURA_PET_DEBUFFS = "Debuffs auf dem Begleiterfenster"
L_GUI_AURA_TOT_DEBUFFS = "Debuffs bei Ziel des Ziels anzeigen"
L.aura_subheader_boss = "Stärkungszauber auf dem Bossframe anzeigen." -- Need review
L_GUI_AURA_PLAYER_AURA_ONLY = "Nur eigenen Debuffs bei dem Zielfenster anzeigen"
L_GUI_AURA_DEBUFF_COLOR_TYPE = "Debuffs nach Art einfärben"
L_GUI_AURA_CAST_BY = "Zeige im Tooltip an von wem ein Buff- bzw. Debuff gewirkt wurde"
L_GUI_AURA_CLASSCOLOR_BORDER = "Aktiviere Klassenfarbe für Spielerbuffs"
L.aura_subheader_buffs = "Player buffs" -- Need review
L.aura_subheader_debuffs = "Debuffs" -- Need review
-- Bag options
L_GUI_BAGS = "Taschen"
L_GUI_BAGS_SUBTEXT = "Klicke mit der rechten Maustaste auf die Schaltfläche Schließen, um das Menü zu öffnen. Um die Beutel zu bewegen, halte die Umschalttaste gedrückt."
L_GUI_BAGS_ENABLE = "Taschen aktivieren"
L_GUI_BAGS_ILVL = "Zeigt Itemlevel der Waffen & Rüstung"
L.bag_new_items = "Show animation for new items" -- Need review
L.bag_filter = "Always show filter buttons" -- Need review
L_GUI_BAGS_BUTTON_SIZE = "Buttongröße"
L_GUI_BAGS_BUTTON_SPACE = "Buttonabstand"
L_GUI_BAGS_BANK = "Anzahl der Spalten in der Bank"
L_GUI_BAGS_BAG = "Anzahl der Spalten in der Tasche"
-- Minimap options
L_GUI_MINIMAP_SUBTEXT = "Minimap Einstellungen."
L_GUI_MINIMAP_ENABLE = "Minimap aktivieren"
L.minimap_on_top = "Move minimap on top right corner" -- Need review
L_GUI_MINIMAP_ICON = "Aufspüren Symbol"
L_GUI_GARRISON_ICON = "Garrisons Symbol" -- Need review
L_GUI_MINIMAP_SIZE = "Minimap-Größe"
L_GUI_MINIMAP_HIDE_COMBAT = "Minimap im Kampf verstecken"
L_GUI_MINIMAP_TOGGLE_MENU = "Zeige Toggle Menü"
L.minimap_bg_map_stylization = "Schlachtfeldkarte Aussehn"
L.minimap_fog_of_war = "Nebel des Krieges auf der Weltkarte"
-- Loot options
L_GUI_LOOT_SUBTEXT = "Einstellungen für den Beuterahmen."
L_GUI_LOOT_ENABLE = "Plünderfenster aktivieren"
L_GUI_LOOT_ROLL_ENABLE = "Gruppenplünderfenster aktivieren"
L_GUI_LOOT_ICON_SIZE = "Symbolgröße"
L_GUI_LOOT_WIDTH = "Breite des Plünderfensters"
L_GUI_LOOT_AUTOGREED = "Aktiviere automatisches Würfeln (Gier) für Gegenstände, falls das höchste Level erreicht wurde."
L_GUI_LOOT_AUTODE = "Entzauberung automatisch bestätigen"
L.loot_faster_loot = "Schnelleres Plündern"
L.loot_faster_loot_desc = "Funktioniert nur, wenn die automatische Beute aktiviert ist"
-- Filger
L_GUI_FILGER = "Timers (Filger)"
L_GUI_FILGER_SUBTEXT = "Filger - analog WeakAuras, aber einfacher und leichter. Ermöglicht es die, Auren und Timer in Form von Symbolen und Balken anzuzeigen."
L_GUI_FILGER_ENABLE = "Aktiviere Filger"
L_GUI_FILGER_TEST_MODE = "Test Icon Mode"
L_GUI_FILGER_MAX_TEST_ICON = "Anzahl der Icons im Test Mode"
L_GUI_FILGER_SHOW_TOOLTIP = "Zeige Tooltips"
L.filger_subheader_elements = "Zeige Elemente"
L.filger_show_buff = "Spieler Buffs"
L.filger_show_proc = "Spieler Procs"
L.filger_show_debuff = "Debuffs auf Ziel"
L.filger_show_aura_bar = "Aurabalken auf Ziel"
L.filger_show_special = "Besondere Buffs auf Spieler"
L.filger_show_pvp_player = "PvP-Debuffs auf Spieler"
L.filger_show_pvp_target = "PvP-Auren auf Spieler"
L.filger_show_cd = "Cooldowns"
L.filger_subheader_size = "Icons größe"
L.filger_subheader_test = "Test Modus"
L_GUI_FILGER_EXPIRATION = "Abklingzeiten nach ablaufzeit sortieren"
L_GUI_FILGER_BUFFS_SIZE = "Buff größe ändern"
L_GUI_FILGER_COOLDOWN_SIZE = "Cooldowns größe ändern"
L_GUI_FILGER_PVP_SIZE = "PvP Debuffs größe ändern"
L.filger_buffs_space = "Buffs space"
L.filger_pvp_space = "PvP Auren space"
L.filger_cooldown_space = "Cooldowns space"
L.filger_subheader_spells = "Hinzufügen neuer Zaubersprüche"
L.filger_category_list = "Kategorie der Zauberliste"
-- Announcements options
L_GUI_ANNOUNCEMENTS = "Benachrichtigungen"
L_GUI_ANNOUNCEMENTS_SUBTEXT = "Einstellungen, die Chat-Ankündigungen über Zaubersprüche oder Gegenstände hinzufügen."
L.announcements_drinking = "Sage im Chat an wenn ein Arenagegener trinkt"
L.announcements_interrupts = "Interrupts" -- Need review
L.announcements_interrupts_desc = "Sage deine Unterbrechungen im Raid oder Schlachtzugschat an"
L.announcements_spells = "Cast spells" -- Needs review
L.announcements_spells_desc = "Sage im Raid/Schachtzugschat an, wenn du den selben Zauber castest"
L.announcements_spells_from_all = "From all members" -- Needs review
L.announcements_spells_from_all_desc = "Prüfe Zauber von allen Spielern"
L.announcements_toys = "Benachrichtigung über Spielzeugzug oder Düsterbräu's Fernbedienung"
L.announcements_pull_countdown = "Pull countdown" -- Needs review
L.announcements_pull_countdown_desc = "Pull cuntdown Benachrichtigung '/pc #'"
L.announcements_flask_food = "Usage of flasks and food" -- Needs review
L.announcements_flask_food_desc = "Benachrichtigung über Fläschchen und Bufffood (/ffcheck)"
L.announcements_flask_food_raid = "Benachrichtigung in den Raid Channel"
L.announcements_flask_food_auto = "Automatische Benachrichtigung beim ReadyCheck" -- Needs review
L.announcements_feasts = "Benachrichtigung wenn Festmahl/Kessel/Seelensteine/Reparatur Bots aufgestellt wurden"
L.announcements_portals = "Benachrichtigung über Portale/Ritual der Beschwörung"
L.announcements_subheader_self = "Self announce" -- Needs review
L.announcements_bad_gear = "Überprüfe Deine schlechte Ausrüstung"
L.announcements_bad_gear_desc = "Überprüfe auf schlechte Ausrüstung in Instanzen"
L.announcements_safari_hat = "Safari Hat" -- Needs review
L.announcements_safari_hat_desc = "Überprüfe Safari Hat"
-- Automation options
L_GUI_AUTOMATION = "Automatisierung"
L_GUI_AUTOMATION_SUBTEXT = "Dieser Block enthält Einstellungen, die die Routine erleichtern."
L.automation_release = "Automatisch im Schlachtfeld wiederbeleben"
L.automation_screenshot = "Speicher einen Screenshot wenn ein Achivment errungen wird"
L.automation_solve_artifact = "Auto Popup für gelöste Artefakte"
L.automation_solve_artifact_desc = "Wenn es genug Fragmente für ein Artefakt gibt, erscheint ein Popup-Fenster, um es zu lösen."
L.automation_accept_invite = "Einladungen automatisch annehmen"
L.automation_decline_duel = "Duell automatisch ablehnen"
L.automation_accept_quest = "Quests automatisch annehmen"
L.automation_auto_collapse = "Automatisches Zusammenklappen des Objective Tracker"
L.automation_auto_collapse_raid = "In Instanzen"
L.automation_auto_collapse_reload = "Nach dem Reload"
L.automation_auto_collapse_scenario = "Partially" -- Need review
L.automation_skip_cinematic = "Auto Cinematics/Filme überspringen"
L.automation_auto_role = "Automatisch die eigene Rolle wählen"
L.automation_cancel_bad_buffs = "Automatisch einige Buffs abbrechen"
L.automation_tab_binder = "Automatisch nur feindliche Spieler mit der TAB Taste anvisieren"
L.automation_tab_binder_desc = "'Tab' zielt nur auf feindliche Spieler in PvP-Zonen, ignoriert Haustiere und Mobs"
L.automation_logging_combat = "Automatisch Kampflog in Raids als Textdatei mitschreiben"
L.automation_buff_on_scroll = "Wirke Stärkungszauber mit Mausrad"
L.automation_buff_on_scroll_desc = "Wenn der Stärkungszauber aus der Liste nicht auf den Spieler angewendet wird.(Maus-Rad Scroll)."
L.automation_open_items = "Öffnet Automatisch Items in der Tasche"
L.automation_resurrection = "Auferstehung bestätigen"
L.automation_summon = "Bestätige Summon"
L.automation_whisper_invite = "Auto invite when whisper keyword" -- Needs review
L.automation_invite_keyword = "List of keyword (separated by space)" -- Needs review
L.automation_invite_keyword_desc = "When player whisper you keyword he will be invited in your group" -- Needs review
-- Buffs reminder options
L_GUI_REMINDER = "Erinnerungen für Buffs"
L_GUI_REMINDER_SUBTEXT = "Anzeige der vermissten Auren."
L_GUI_REMINDER_SOLO_ENABLE = "Zeige fehlende Eigenbuffs"
L_GUI_REMINDER_SOLO_SOUND = "Spiele Warngeräusch ab bei fehlenden Eigenbuffs"
L_GUI_REMINDER_SOLO_SIZE = "Solo Icon größe"
L_GUI_REMINDER_SOLO_SIZE_DESC = "Eigener buff Icon größe"
L_GUI_REMINDER_SUBHEADER = "Raidbuffs"
L_GUI_REMINDER_RAID_ENABLE = "Zeige fehlende Raidbuffs an"
L_GUI_REMINDER_RAID_ALWAYS = "Zeige Bufferinnerungen immer an"
L_GUI_REMINDER_RAID_SIZE = "Raid Icon größe"
L_GUI_REMINDER_RAID_SIZE_DESC = "Symbolgröße für Raidbuffs"
L_GUI_REMINDER_RAID_ALPHA = "Transparent"
L_GUI_REMINDER_RAID_ALPHA_DESC = "Transparente Symbole wenn der Buff vorhanden ist"
-- Raid cooldowns options
L_GUI_COOLDOWN_RAID = "Schlachtzugs Cooldowns"
L_GUI_COOLDOWN_RAID_SUBTEXT = "Verfolgen von Raid-Cooldowns in der linken oberen Ecke."
L_GUI_COOLDOWN_RAID_ENABLE = "Abklingzeiten des Raids aktivieren"
L_GUI_COOLDOWN_RAID_HEIGHT = "Bars Höhe"
L_GUI_COOLDOWN_RAID_WIDTH = "Bars Breite"
L_GUI_COOLDOWN_RAID_SORT = "Leisten für Raidabklingzeiten wachsen nach oben"
L_GUI_COOLDOWN_RAID_EXPIRATION = "Sortieren nach Abklingzeit"
L_GUI_COOLDOWN_RAID_SHOW_SELF = "Zeige deine Cooldowns"
L_GUI_COOLDOWN_RAID_ICONS = "Symbole für Raidabklingzeiten"
L_GUI_COOLDOWN_RAID_IN_RAID = "Zeige Raidabklingzeiten in Raidgebieten"
L_GUI_COOLDOWN_RAID_IN_PARTY = "Zeige Raidabklingzeiten in Gruppengebieten"
L_GUI_COOLDOWN_RAID_IN_ARENA = "Zeige Raidabklingzeiten in der Arena"
-- Enemy cooldowns options
L_GUI_COOLDOWN_ENEMY = "Gegner Cooldowns"
L_GUI_COOLDOWN_ENEMY_SUBTEXT = "Verfolgen feindlicher Fähigkeiten als Symbole über der Zauberleiste."
L_GUI_COOLDOWN_ENEMY_ENABLE = "Aktiviere gegnerische Abklingzeiten"
L_GUI_COOLDOWN_ENEMY_SIZE = "Symbolgröße für gegnerische Abklingzeiten"
L_GUI_COOLDOWN_ENEMY_DIRECTION = "Gegner Cooldowns Symbol ausrichtung"
L_GUI_COOLDOWN_ENEMY_EVERYWHERE = "Zeige gegnerische Abklingzeiten überall"
L_GUI_COOLDOWN_ENEMY_IN_BG = "Zeige gegnerische Abklingzeiten in Schlachtfeldern"
L_GUI_COOLDOWN_ENEMY_IN_ARENA = "Zeige gegnerische Abklingzeiten in der Arena"
L.enemycooldown_show_inparty = "Anzeigen in der Partyzone für Allies"
L.enemycooldown_class_color = "Klassenfarbige Umrandung aktivieren"
-- Pulse cooldowns options
L_GUI_COOLDOWN_PULSE = "Pulse Cooldowns"
L_GUI_COOLDOWN_PULSE_SUBTEXT = "Verfolge CD mit einem Puls-Symbol in der Mitte des Bildschirms."
L_GUI_COOLDOWN_PULSE_ENABLE = "Zeige Abklingzeitimpuls"
L_GUI_COOLDOWN_PULSE_SIZE = "Abklingzeitimpuls Symbolgröße"
L_GUI_COOLDOWN_PULSE_SOUND = "Akustische Warnungen"
L_GUI_COOLDOWN_PULSE_ANIM_SCALE = "Animationen Skalieren"
L_GUI_COOLDOWN_PULSE_HOLD_TIME = "Maximale Zeit in der die Anzeige aktiv ist"
L_GUI_COOLDOWN_PULSE_THRESHOLD = "Threshold time" -- Need review
L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = "Minimale Zeitschwälle"
-- Threat options
L_GUI_THREAT = "Bedrohungsleisten"
L_GUI_THREAT_SUBTEXT = "Display of the threat list (a simple analogue of Omen)." -- Need review
L_GUI_THREAT_ENABLE = "Aktiviere Bedrohungsleisten"
L_GUI_THREAT_HEIGHT = "Höhe der Bedrohungsleisten"
L_GUI_THREAT_WIDTH = "Breite der Bedrohungsleisten"
L_GUI_THREAT_ROWS = "Anzahl der Bedrohungsleisten"
L_GUI_THREAT_HIDE_SOLO = "Nur in Gruppen oder Schlachtzügen anzeigen"
-- Top panel options
L_GUI_TOP_PANEL = "Oberes Panel"
L_GUI_TOP_PANEL_SUBTEXT = "Eingebautes oberes Bedienfeld mit Informationen verwalten."
L_GUI_TOP_PANEL_ENABLE = "Aktiviere oberes Panel"
L_GUI_TOP_PANEL_MOUSE = "Oberes Panel nur bei Mouseover anzeigen"
L_GUI_TOP_PANEL_WIDTH = "Breite des Panels"
L_GUI_TOP_PANEL_HEIGHT = "Höhe des Panels"
-- Stats options
L_GUI_STATS = "Statistiken"
L_GUI_STATS_SUBTEXT = "Statistik-Anzeige am unteren Bildschirmrand. Im Chat '/ls' für Info."
L_GUI_STATS_CLOCK = "Uhr"
L_GUI_STATS_LATENCY = "Latenz"
L_GUI_STATS_FPS = "BPS"
L_GUI_STATS_EXPERIENCE = "Erfahrung"
L_GUI_STATS_TALENTS_DESC = "Wechselt bei Klick die Beute und Spec"
L_GUI_STATS_COORDS = "Koordinaten"
L_GUI_STATS_LOCATION = "Ort"
L_GUI_STATS_BG = "Schlachtfeld"
L.stats_bottom_line = "Bottom classcolor line" -- Need review
L_GUI_STATS_SUBHEADER_CURRENCY = "Currency/Abzeichen (Anzeige im Gold Data Text)"
L_GUI_STATS_CURRENCY_ARCHAEOLOGY = "Zeige Archäologie Fragmente"
L_GUI_STATS_CURRENCY_COOKING = "Zeige Kochpreise/Marken"
L_GUI_STATS_CURRENCY_RAID = "Zeige Schlatzugs Siegel/Bonuswürffe"
-- Trade options
L_GUI_TRADE = "Handel"
L_GUI_TRADE_SUBTEXT = "Einstellungen für Handel und Berufe"
L.trade_profession_tabs = "Berufereiter/Tabs"
L.trade_profession_tabs_desc = "Berufereiter an Handelsfähigkeiten und Handelsfenstern anzeigen"
L.trade_already_known = "Färbt bereits bekannte Elemente ein"
L.trade_already_known_desc = "Bekannte Rezepte/Reittiere/Begleiter farblich hervorheben"
L.trade_disenchanting = "Schnelle Entzauberung"
L.trade_disenchanting_desc = "Sondieren, Mahlen and Entzaubern mit einem Klick"
L.trade_sum_buyouts = "Alle Auktionen aufsummieren"
L.trade_sum_buyouts_desc = "zeigt eine Zusammenfassung aller laufenden Auktionen"
L.trade_enchantment_scroll = "Verzauberung auf Rolle im Beruffenster"
L.trade_archaeology = "Archäologie Artifakte und Abklingzeit"
L.trade_archaeology_desc = "Archäologie-Tracker ('/arch' oder rechte Maustaste auf Minimap-Taste zum Anzeigen)"
L.trade_merchant_itemlevel = "Item level beim Händler"
L.trade_merchant_itemlevel_desc = "Zeige Itemlevel für Waffen & Rüstung bei Händler"
-- Miscellaneous options
L_GUI_MISC_SUBTEXT = "Andere Einstellungen, die interessante Funktionen hinzufügen."
L.misc_shift_marking = "Markiert Mouseover-Ziel"
L.misc_shift_marking_desc = "Markiert das Mouseover-Ziel, beim drücken der Umschalttaste (nur in der Gruppe)"
L.misc_afk_spin_camera = "Kamera drehen während du AFK bist"
L.misc_quest_auto_button = "Quest items auto Taste"
L.misc_quest_auto_button_desc = "Quest/Gegenstand auto Taste"
L.misc_raid_tools = "Raid Hilfsmittel"
L.misc_raid_tools_desc = "Button at the top of the screen for ready check (Left-click), checking roles (Middle-click), setting marks, etc. (for leader and assistants)" -- Need review
L.misc_item_level = "Item level on slot buttons" -- Need review
L.misc_item_level_desc = "Itemlevel im Charakterfenster auf Items anzeigen"
L.misc_click_cast = "Simpler 'click2cast' spell binder"
L.misc_click_cast_desc = "Allows you to assign spells (analog Clique) to the mouse buttons. Setup through the side bookmark in the spell book" -- Need review
L.misc_click_cast_filter = "Ignoriere Spieler- und Zielfenster für click2cast"
L.misc_chars_currency = "Zeige deine Währungstoken über diverse Karaktere"
L.misc_chars_currency_desc = "Hover over the icon of the required currency in the character window to display information in the tooltip" -- Need review
L.misc_hide_raid_button = "Verstecke oUF_RaidDPS Knopf"
L.misc_hide_raid_button_desc = "The button is displayed by hovering the mouse in the upper left corner" -- Need review
================================================
FILE: ShestakUI_Config/Locales/Italian.lua
================================================
local _, L = ...
if GetLocale() ~= "itIT" then return end
----------------------------------------------------------------------------------------
-- Localization for itIT client
-- Translation: Oz
----------------------------------------------------------------------------------------
L_GUI_SET_SAVED_SETTTINGS = "Imposta le impostazioni 'Per-Personaggio'"
L_GUI_SET_SAVED_SETTTINGS_DESC = "Switch between a profile that applies to all characters and one that is unique to this character." -- Need review
L_GUI_RESET_CHAR = "Vuoi davvero ripristinare le impostazioni iniziali della ShestakUI per questo personaggio?"
L_GUI_RESET_ALL = "Vuoi davvero ripristinate tutte le impostazioni iniziali della ShestakUI?"
L_GUI_PER_CHAR = "Vuoi davvero modificare questa impostazione (attivazione/disattivazione salvataggio impostazioni 'Per-Personaggio')?"
L_GUI_RESET_CAT = "Are you sure you want to reset category's settings?" -- Need review
L_GUI_RESET_CAT_DESC = "Reset category's settings. \nCTRL-click to reset all" -- Need review
L_GUI_NEED_RELOAD = "You need to reload the UI to apply your changes." -- Need review
L_GUI_LAYOUT = "Change layout" -- Need review
L_GUI_SPELL_LIST = "List of spells" -- Need review
L_GUI_SPELL_INPUT = "Spell ID" -- Need review
L_GUI_TIME_INPUT = "Time" -- Need review
L_GUI_EXPERT_MODE = "Expert mode" -- Need review
L_GUI_EXPERT_MODE_DESC = "Custom editing of Lua profile" -- Need review
L_GUI_RESET_SPELLS_DESC = "CTRL-click to reset list" -- Need review
-- Profile
L.profile = "Profile" -- Need review
L.profile_title = "Profile options" -- Need review
L.profile_choose = "Choose profile" -- Need review
L.profile_options = "Settings" -- Need review
L.profile_movers = "Moving elements" -- Need review
L.profile_export = "Export" -- Need review
L.profile_import = "Import" -- Need review
L.profile_error_lib = "To enable export and import - install WeakAuras" -- Need review
L.profile_error_code = "Error in imported code!" -- Need review
-- General options
L_GUI_GENERAL_SUBTEXT = "These settings control the general user interface settings. Type in chat '/uihelp' for help." -- Need review
L_GUI_GENERAL_WELCOME_MESSAGE = "Messaggio di benvenuto in chat"
L_GUI_GENERAL_AUTOSCALE = "Ridimensionamento automatico dell'interfaccia"
L_GUI_GENERAL_UISCALE = "Scala dell'interfaccia (se il ridimensionamento automatico è disabilitato)"
L.general_subheader_blizzard = "Blizzard UI elements" -- Need review
L.general_error_filter = "Error filtering" -- Need review
L.general_error_blacklist = "Blacklist" -- Need review
L.general_error_whitelist = "Whitelist" -- Need review
L.general_error_combat = "In combat" -- Need review
L.general_error_none = "None" -- Need review
L.general_vehicle_mouseover = "Riquadro veicolo al passaggio del mouse"
L.general_move_blizzard = "Consenti di muovere alcuni riquadri dell'interfaccia Blizzard"
L.general_color_picker = "Selezionatore colore migliorato"
L.general_color_picker_desc = "Add copy/paste buttons and digit text entry for Blizzard color picker frame" -- Need review
L.general_minimize_mouseover = "Pulsante per minimizzare le missioni al passaggio del mouse"
L.general_hide_banner = "Nascondi il Boss Banner Loot Frame"
L.general_hide_talking_head = "Nascondi il Talking Head Frame"
L.general_hide_maw_buffs = "Hide Maw Buffs frame in instances" -- Need review
-- Media options
L.media_border_color = "Color for borders" -- Need review
L.media_classborder_color = "Color for class borders" -- Need review
L.media_backdrop_color = "Color for borders backdrop" -- Need review
L.media_backdrop_alpha = "Alpha for transparent backdrop" -- Need review
L.media_texture = "Main texture" -- Need review
L.media_subheader_normal = "Change general font" -- Need review
L.media_subheader_pixel = "Change secondary font" -- Need review
-- Font options
L.font = "Fonts" -- Need review
L.font_subtext = "Customize individual fonts for elements." -- Need review
L.font_stats_font = "Select font" -- Need review
L.font_stats_font_style = "Font flag" -- Need review
L.font_stats_font_shadow = "Font shadow" -- Need review
L.font_subheader_stats = "Stats font" -- Need review
L.font_subheader_combat = "Combat text font" -- Need review
L.font_subheader_chat = "Chat font" -- Need review
L.font_subheader_chat_tabs = "Chat tabs font" -- Need review
L.font_subheader_action = "Action bars font" -- Need review
L.font_subheader_threat = "Threat meter font" -- Need review
L.font_subheader_raidcd = "Raid cooldowns font" -- Need review
L.font_subheader_cooldown = "Cooldowns timer font" -- Need review
L.font_subheader_loot = "Loot font" -- Need review
L.font_subheader_nameplates = "Nameplates font" -- Need review
L.font_subheader_unit = "Unit frames font" -- Need review
L.font_subheader_aura = "Auras font" -- Need review
L.font_subheader_filger = "Filger font" -- Need review
L.font_subheader_style = "Stylization font" -- Need review
L.font_subheader_bag = "Bags font" -- Need review
L.font_subheader_blizzard = "System font size" -- Need review
L.font_tooltip_header_font_size = "Tooltip header" -- Need review
L.font_tooltip_font_size = "Tooltip text" -- Need review
L.font_global_font = "Disable Pixel font" -- Need review
-- Skins options
L_GUI_SKINS = "Restyling"
L_GUI_SKINS_SUBTEXT = "Change the appearance of the standard interface." -- Need review
L_GUI_SKINS_BLIZZARD = "Attiva il restyling dei riquadri Blizzard"
L_GUI_SKINS_MINIMAP_BUTTONS = "Attiva il restyling dei pulsanti delle AddOns sulla minimappa"
L_GUI_SKINS_SUBHEADER = "Stylization of addons" -- Need review
L.skins_minimap_buttons_mouseover = "Addons icons on mouseover" -- Need review
L.skins_bubbles = "Restyling dei fumetti delle chats"
-- Unit Frames options
L_GUI_UF_SUBTEXT = "Customize player, target frames and etc." -- Need review
L_GUI_UF_ENABLE = "Abilita i riquadri delle unità"
L_GUI_UF_OWN_COLOR = "Scegli il colore per la tua barra della salute"
L_GUI_UF_UF_COLOR = "Colore barre salute (se è attivo il colore per la tua barra della salute)"
L.unitframe_uf_color_bg = "Color of health background" -- Need review
L.unitframe_enemy_health_color = "Colora di rosso la barra della salute dei nemici"
L_GUI_UF_TOTAL_VALUE = "Visualizza un testo sui riquadri di giocatore e bersaglio con i valori XXXX/Totale"
L_GUI_UF_COLOR_VALUE = "Valori di salute e mana colorati"
L_GUI_UF_BAR_COLOR_VALUE = "Barra della salute colorata in base alla salute restante"
L_GUI_UF_LINES = "Mostra le linee per giocatore e bersaglio"
L_GUI_UF_SUBHEADER_CAST = "Castbars" -- Need review
L_GUI_UF_UNIT_CASTBAR = "Mostra le barre incantesimi"
L_GUI_UF_CASTBAR_ICON = "Mostra le icone della barra incantesimi"
L_GUI_UF_CASTBAR_LATENCY = "Latenza della barra incantesimi"
L_GUI_UF_CASTBAR_TICKS = "Mostra le tacchette (ticks) sulla barra incantesimi"
L_GUI_UF_SUBHEADER_FRAMES = "Frames" -- Need review
L_GUI_UF_SHOW_PET = "Mostra il riquadro per il famiglio"
L_GUI_UF_SHOW_FOCUS = "Mostra il riquadro per il focus"
L_GUI_UF_SHOW_TOT = "Mostra il riquadro per il bersaglio del bersaglio"
L_GUI_UF_SHOW_BOSS = "Mostra i riquadri per i bosses"
L_GUI_UF_BOSS_RIGHT = "Riquadri per i bosses sulla destra"
L_GUI_UF_SHOW_ARENA = "Mostra i riquadri per l'arena"
L_GUI_UF_ARENA_RIGHT = "Riquadri per l'arena sulla destra"
L_GUI_UF_BOSS_DEBUFFS = "Number of debuffs" -- Need review
L_GUI_UF_BOSS_DEBUFFS_DESC = "Numero di penalità sui riquadri dei bosses"
L_GUI_UF_BOSS_BUFFS = "Number of buffs" -- Need review
L_GUI_UF_BOSS_BUFFS_DESC = "Numero di benefici sui riquadri dei bosses"
L.unitframe_icons_pvp = "PvP status text" -- Need review
L.unitframe_icons_pvp_desc = "Testo PvP (senza icona) al passaggio del mouse sui riquadri di giocatore e bersaglio"
L_GUI_UF_ICONS_COMBAT = "Icona di status 'in combattimento'"
L_GUI_UF_ICONS_RESTING = "Icona 'Riposato' per personaggi di basso livello"
L_GUI_UF_SUBHEADER_PORTRAIT = "Portraits" -- Need review
L_GUI_UF_PORTRAIT_ENABLE = "Attiva ritratti per giocatore e bersaglio"
L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = "Bordi dei ritratti colorati in base alla classe"
L.unitframe_portrait_type = "Type of portraits" -- Need review
L.unitframe_portrait_type_icons = "Class Icons" -- Need review
L.unitframe_portrait_type_overlay = "Overlay" -- Need review
L_GUI_UF_PORTRAIT_HEIGHT = "Altezza del ritratto"
L_GUI_UF_PORTRAIT_WIDTH = "Larghezza del ritratto"
L_GUI_UF_SUBHEADER_PLUGINS = "Plugins" -- Need review
L_GUI_UF_PLUGINS_GCD = "Scintilla del recupero globale"
L_GUI_UF_PLUGINS_SWING = "Attiva la barra dei fendenti"
L.unitframe_plugins_reputation_bar = "Reputation bar" -- Need review
L.unitframe_plugins_reputation_bar_desc = "Attiva la barra reputazioni" -- Need review
L.unitframe_plugins_experience_bar = "Experience bar" -- Need review
L.unitframe_plugins_experience_bar_desc = "Attiva la barra esperienza" -- Need review
L_GUI_UF_PLUGINS_SMOOTH_BAR = "Barra a cambiamento graduale"
L_GUI_UF_PLUGINS_ENEMY_SPEC = "Mostra la specializzazione dei talenti del nemico"
L_GUI_UF_PLUGINS_COMBAT_FEEDBACK = "Testo di combattimento sul riquadro del giocatore/bersaglio"
L_GUI_UF_PLUGINS_FADER = "Sfuma i riquadri delle unità"
L_GUI_UF_PLUGINS_DIMINISHING = "Diminuzione dell'effetto (diminishing return) sulle icone dei riquadri d'arena"
L_GUI_UF_PLUGINS_POWER_PREDICTION = "Previsione del costo in potere sulla barra del riquadro del giocatore"
L.unitframe_plugins_absorbs = "Absorbs value on player frame" -- Need review
L.unitframe_subheader_player_width = "Player and target frame size" -- Need review
L.unitframe_player_width = "Width" -- Need review
L.unitframe_subheader_boss_width = "Boss and arena frame size" -- Need review
L.unitframe_extra_height_auto = "Auto height for health/power" -- Need review
L.unitframe_extra_height_auto_desc = "Smart adjust depending on font size" -- Need review
L.unitframe_extra_health_height = "Additional height for health" -- Need review
L.unitframe_extra_power_height = "Additional height for power" -- Need review
L.unitframe_subheader_castbar = "Size of player and target castbar" -- Need review
L.unitframe_castbar_height = "Height" -- Need review
-- Unit Frames Class bar options
L_GUI_UF_PLUGINS_CLASS_BAR = "Barre di classe"
L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = "Control of special class resources." -- Need review
L_GUI_UF_PLUGINS_COMBO_BAR = "Icone punti combo per druido e ladro"
L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = "Mostra sempre la barra combo per il druido"
L_GUI_UF_PLUGINS_COMBO_BAR_OLD = "Mostra i punti combo sul bersaglio"
L_GUI_UF_PLUGINS_ARCANE_BAR = "Attiva la barra carica arcana"
L_GUI_UF_PLUGINS_CHI_BAR = "Attiva la barra di classe del monaco"
L_GUI_UF_PLUGINS_STAGGER_BAR = "Attiva la barra noncuranza (per i monaci difensori)"
L_GUI_UF_PLUGINS_HOLY_BAR = "Attiva la barra di classe del paladino"
L_GUI_UF_PLUGINS_SHARD_BAR = "Attiva la barra di classe dello stregone"
L_GUI_UF_PLUGINS_RUNE_BAR = "Attiva la barra di classe del cavaliere della morte"
L_GUI_UF_PLUGINS_TOTEM_BAR = "Attiva la barra dei totems dello sciamano"
L.unitframe_class_bar_totem_other = "Enable Totem bar for other classes" -- Need review
L.unitframe_class_bar_essence = "Enable Essence bar for Evoker" -- Need review
-- Raid Frames options
L_GUI_UF_RAIDFRAMES_SUBTEXT = "Customize the appearance of the raid frames." -- Need review
L_GUI_UF_BY_ROLE = "Suddividi i giocatori in gruppo a seconda del ruolo"
L_GUI_UF_AGGRO_BORDER = "Cambio di colore dei bordi in base al grado di aggressione"
L_GUI_UF_DEFICIT_HEALTH = "Deficit salute in incursione"
L_GUI_UF_SHOW_PARTY = "Mostra i riquadri del gruppo"
L_GUI_UF_SHOW_RAID = "Mostra i riquadri d'incursione"
L.raidframe_layout = "Raid layout" -- Needs review
L.raidframe_heal_layout = "Heal" -- Needs review
L.raidframe_dps_layout = "DPS" -- Needs review
L.raidframe_auto_layout = "Auto" -- Needs review
L.raidframe_show_target = "Show target frames" -- Needs review
L.raidframe_show_pet = "Show pet frames" -- Needs review
L.raidframe_vertical_health = "Orientamento verticale della salute"
L.raidframe_vertical_health_desc = "Only for heal layout" -- Needs review
L_GUI_UF_ALPHA_HEALTH = "Trasparenza delle barre della salute quando i punti sono al 100%"
L_GUI_UF_SHOW_RANGE = "Abilita l'opacità dei riquadri d'incursione in base alla distanza"
L_GUI_UF_RANGE_ALPHA = "Alpha" -- Need review
L_GUI_UF_RANGE_ALPHA_DESC = "Trasparenza dei riquadri delle unità quando un'unità è fuori portata"
L_GUI_UF_SUBHEADER_RAIDFRAMES = "Frames" -- Need review
L_GUI_UF_SOLO_MODE = "Mostra sempre il riquadro del giocatore"
L_GUI_UF_PLAYER_PARTY = "Mostra il riquadro del giocatore in gruppo"
L_GUI_UF_SHOW_TANK = "Mostra i difensori dell'incursione"
L_GUI_UF_SHOW_TANK_TT = "Mostra il bersaglio del bersaglio dei difensori dell'incursione"
L_GUI_UF_RAID_GROUP = "Numero dei gruppi nell'incursione"
L.raidframe_party_vertical = "Vertical party frames" -- Needs review
L.raidframe_raid_groups_vertical = "Gruppi dell'incursione verticali" -- Needs review
L.raidframe_raid_groups_vertical_desc = "Gruppi dell'incursione verticali (solo per la Disposizione da Guaritore)" -- Needs review
L_GUI_UF_SUBHEADER_ICONS = "Icons" -- Need review
L_GUI_UF_ICONS_ROLE = "Icona del ruolo sui riquadri"
L_GUI_UF_ICONS_RAID_MARK = "Marchi d'incursione"
L_GUI_UF_ICONS_READY_CHECK = "Icone dell'appello"
L_GUI_UF_ICONS_LEADER = "Icona del capoincursione, dell'assistente"
L_GUI_UF_ICONS_SUMON = "Icone d’evocazione sui riquadri"
L.raidframe_icons_phase = "Phase" -- Need review
L.raidframe_plugins_debuffhighlight_icon = "Evidenzia texture + icona delle penalità" -- Need review
L.raidframe_plugins_aura_watch = "Icone delle penalità d'incursione"
L.raidframe_plugins_aura_watch_timer = "Timer sulle icone delle penalità d'incursione"
L.raidframe_plugins_pvp_debuffs = "Mostra anche un’icona per le penalità PvP (dall’elenco)"
L_GUI_UF_PLUGINS_HEALCOMM = "Mostra le cure in arrivo sul riquadro"
L.raidframe_plugins_over_absorb = "Show over absorb bar on frame" -- Need review
L.raidframe_plugins_over_heal_absorb = "Show over heal absorb on frame" -- Need review
L.raidframe_plugins_auto_resurrection = "Auto cast resurrection" -- Need review
L.raidframe_plugins_auto_resurrection_desc = "'Auto-lancia' resurrezione col tasto centrale quando l'unità è morta (non funziona con Clique attiva)"
L.raidframe_hide_health_value = "Hide raid health value" -- Needs review
L.raidframe_auto_position = "Auto reposition raid frame" -- Need review
L.raidframe_auto_position_desc = "If there are more than 5 groups, the frame points changes. \nOnly for heal layout" -- Need review
L.raidframe_auto_position_dynamic = "Dynamic" -- Need review
L.raidframe_auto_position_static = "Static" -- Need review
L.raidframe_subheader_heal_size = "Size for heal layout" -- Need review
L.raidframe_heal_width = "Frame width" -- Need review
L.raidframe_heal_height = "Frame height" -- Need review
L.raidframe_heal_power_height = "Power height" -- Need review
L.raidframe_subheader_dps_size = "Size for dps layout" -- Need review
L.raidframe_dps_party_width = "Party width" -- Need review
L.raidframe_dps_party_height = "Party height" -- Need review
L.raidframe_dps_raid_width = "Raid width" -- Need review
L.raidframe_dps_raid_height = "Raid height" -- Need review
L.raidframe_dps_party_power_height = "Party power height" -- Need review
L.raidframe_dps_raid_power_height = "Raid power height" -- Need review
-- ActionBar options
L_GUI_ACTIONBAR = "Barre delle azioni"
L_GUI_ACTIONBAR_ENABLE = "Attiva le barre delle azioni"
L_GUI_ACTIONBAR_HOTKEY = "Mostra i nomi dei tasti di scelta rapida sugli scomparti"
L_GUI_ACTIONBAR_MACRO = "Mostra i nomi delle macro sugli scomparti"
L_GUI_ACTIONBAR_GRID = "Mostra lo sfondo degli scomparti vuoti sulle barre delle azioni"
L_GUI_ACTIONBAR_BUTTON_SIZE = "Dimensioni degli scomparti"
L_GUI_ACTIONBAR_BUTTON_SPACE = "Spazio tra gli scomparti"
L_GUI_ACTIONBAR_SPLIT_BARS = "Dividi la quinta barra in 2 barre da 6 scomparti ciascuna"
L_GUI_ACTIONBAR_CLASSCOLOR_BORDER = "Colora i bordi degli scomparti con i colori delle classi"
L.actionbar_toggle_mode = "Attiva la modalità a scomparsa"
L.actionbar_toggle_mode_desc = "The quick change in the number of panels. For the lower panels, hover the mouse over the hidden area above the panels. For right panels, hover the mouse over the area below the panels." -- Need review
L_GUI_ACTIONBAR_HIDE_HIGHLIGHT = "Nascondi il lumeggiare (highlight) di un proc."
L_GUI_ACTIONBAR_BOTTOMBARS = "Numero delle barre delle azioni in basso"
L_GUI_ACTIONBAR_RIGHTBARS = "Numero di barre delle azioni sulla destra"
L.actionbar_bottombars_mouseover = "Bottom bars on mouseover" -- Needs review
L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = "Barre sulla destra al passaggio del mouse"
L_GUI_ACTIONBAR_PETBAR_HIDE = "Nascondi la barra famiglio"
L_GUI_ACTIONBAR_PETBAR_HORIZONTAL = "Rendi orizzontale la barra famiglio"
L_GUI_ACTIONBAR_PETBAR_MOUSEOVER = "Barra famiglio al passaggio del mouse (solo con la barra famiglio orizzontale)"
L_GUI_ACTIONBAR_STANCEBAR_HIDE = "Nascondi barra postura"
L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = "Rendi orizzontale la barra postura"
L.actionbar_stancebar_horizontal_desc = "Located below the player's frame" -- Needs review
L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = "Barra postura al passaggio del mouse"
L_GUI_ACTIONBAR_MICROMENU = "Attiva il micromenu"
L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = "Micromenu al passaggio del mouse"
L.actionbar_editor = "Bars editor" -- Needs review
L.actionbar_editor_desc = "Allow to move and change each panel individually" -- Needs review
L.actionbar_bar1_num = "Number of buttons" -- Needs review
L.actionbar_bar1_row = "Buttons per row" -- Needs review
L.actionbar_bar1_mouseover = "Bar on mouseover" -- Needs review
-- Tooltip options
L.tooltip = "Suggerimenti"
L.tooltip_subtext = "In this block, you can change the standard tips when mouseovering." -- Need review
L.tooltip_enable = "Attiva i suggerimenti"
L.tooltip_shift_modifer = "Mostra i suggerimenti quando è premuto il tasto Shift"
L.tooltip_cursor = "Suggerimenti sopra il cursore"
L.tooltip_item_icon = "Icone degli oggetti nei suggerimenti"
L.tooltip_health_value = "Valore numerico della salute"
L.tooltip_hidebuttons = "Nascondi i suggerimenti relativi alle barre delle azioni"
L.tooltip_hide_combat = "Nascondi i suggerimenti in combattimento"
L.tooltip_subheader = "Plugins" -- Need review
L.tooltip_talents = "Mostra i talenti nei suggerimenti"
L.tooltip_show_shift = "Show when Shift is pushed" -- Need review
L.tooltip_show_shift_desc = "Show items level and spec when Shift is pushed" -- Need review
L.tooltip_achievements = "Mostra il paragone delle imprese nei suggerimenti"
L.tooltip_target = "Mostra nei suggerimenti chi ha il giocatore come bersaglio"
L.tooltip_title = "Titolo del giocatore nei suggerimenti"
L.tooltip_realm = "Reame del giocatore nei suggerimenti"
L.tooltip_rank = "Rango in gilda nei suggerimenti"
L.tooltip_spell_id = "ID Incantesimo/Abilità"
L.tooltip_average_lvl_desc = "The average item level" -- Need review
L.tooltip_raid_icon = "Visualizza i marchi d'incursione nei suggerimenti"
L.tooltip_who_targetting = "Visualizza chi ha in bersaglio l'unità che è nel tuo gruppo/incursione"
L.tooltip_item_count = "Conteggio oggetti"
L.tooltip_unit_role = "Ruolo dell'unità"
L.tooltip_instance_lock = "Info incursione nei suggerimenti"
L.tooltip_mount = "Source of mount" -- Needs review
-- Chat options
L.chat_subtext = "Here you can change the settings of the chat window." -- Need review
L.chat_enable = "Attiva chat"
L.chat_background = "Attiva lo sfondo della chat"
L.chat_background_alpha = "Trasparenza sfondo della chat"
L.chat_filter = "Rimozione di un po' di spam di sistema"
L.chat_filter_desc = "Duels, change talents, NPC dialogue in city" -- Need review
L.chat_spam = "Rimozione di un po' di spam degli altri giocatori"
L.chat_spam_list = "Black list" -- Need review
L.chat_spam_list_desc = "List of words (separated by space, lowercase letters) to hide messages" -- Need review
L.chat_width = "Larghezza chat"
L.chat_height = "Altezza chat"
L.chat_chat_bar = "Barra con pulsanti per passare velocemente da un canale all'altro della chat"
L.chat_chat_bar_mouseover = "Barra canali chat al passaggio del mouse"
L.chat_whisp_sound = "Suono quando ricevi un sussurro"
L.chat_combatlog = "Mostra la linguetta del Registro di combattimento"
L.chat_tabs_mouseover = "Linguette delle chats al passaggio del mouse"
L.chat_sticky = "Ricorda l'ultimo canale"
L.chat_damage_meter_spam = "Riunisce lo spam di un contatore dei danni in un singolo link"
L.chat_loot_icons = "Icons for loot" -- Needs review
L.chat_hide_combat = "Hide chat in combat" -- Needs review
L.chat_custom_time_color = "Enable custom timestamp coloring" -- Needs review
L.chat_time_color = "Colorazione orario dei messaggi"
-- Nameplate options
L_GUI_NAMEPLATE_SUBTEXT = "Nameplate settings" -- Need review
L_GUI_NAMEPLATE_ENABLE = "Attiva le barre delle unità"
L_GUI_NAMEPLATE_COMBAT = "Mostra automaticamente le barre delle unità in combattimento"
L_GUI_NAMEPLATE_HEALTH = "Valore numerico della salute"
L_GUI_NAMEPLATE_HEIGHT = "Altezza delle barre delle unità"
L_GUI_NAMEPLATE_WIDTH = "Larghezza delle barre delle unità"
L.nameplate_alpha = "Alpha" -- Needs review
L.nameplate_alpha_desc = "Non-target nameplate alpha" -- Needs review
L.nameplate_ad_height = "Additional height" -- Need review
L.nameplate_ad_width = "Additional width" -- Need review
L.nameplate_ad_height_desc = "Additional height for selected nameplate" -- Needs review
L.nameplate_ad_width_desc = "Additional width for selected nameplate" -- Needs review
L_GUI_NAMEPLATE_CASTBAR_NAME = "Mostra il nome di incantesimi/abilità sulle barre incantesimi"
L_GUI_NAMEPLATE_CLASS_ICON = "Icone delle classi in PvP"
L_GUI_NAMEPLATE_NAME_ABBREV = "Mostra nomi abbreviati"
L.nameplate_short_name = "Replace names with short ones" -- Need review
L.nameplate_clamp = "Aggancia le barre delle unità in cima allo schermo quando sono fuori portata visiva" -- Need review
L.nameplate_clamp_desc = "Aggancia le barre delle unità in cima allo schermo quando sono fuori portata visiva"
L_GUI_NAMEPLATE_SHOW_DEBUFFS = "Mostra le penalità sulle barre delle unità (l'ozpione 'Mostra nomi abbreviati' deve essere disabilitata)"
L_GUI_NAMEPLATE_SHOW_BUFFS = "Show dispellable enemy buffs and buffs from the list" -- Need review
L_GUI_NAMEPLATE_DEBUFFS_SIZE = "Dimensioni delle penalità sulle barre delle unità" -- Need review
L_GUI_NAMEPLATE_HEALER_ICON = "Nei Campi di Battaglia, mostra un'icona 'guaritore' accanto alle barre delle unità di tutti i guaritori nemici"
L_GUI_NAMEPLATE_TOTEM_ICONS = "Mostra un’icona sopra la barra dei totem nemici"
L.nameplate_target_glow = "Show glow texture for target" -- Need review
L.nameplate_only_name = "Show only name for friendly units" -- Need review
L.nameplate_quests = "Show quest icon" -- Need review
L.nameplate_cast_color = "Show color border for casting important spells" -- Need review
L.nameplate_kick_color = "Change cast color if interrupt on cd" -- Need review
L.nameplate_low_health_value = "Health value" -- Need review
L.nameplate_low_health = "Low health highlight" -- Need review
L_GUI_NAMEPLATE_THREAT = "Attiva il sensore di rilevamento minaccia (si adatta automaticamente al tuo ruolo)"
L_GUI_NAMEPLATE_GOOD_COLOR = "Colore se il PG è minacciato (in base a difensore o assaltatore/guaritore)"
L_GUI_NAMEPLATE_NEAR_COLOR = "Colore per perdita/guadagno minaccia"
L_GUI_NAMEPLATE_BAD_COLOR = "Colore se il PG non è minacciato (se difensore o assaltatore/guaritore)"
L_GUI_NAMEPLATE_OFFTANK_COLOR = "Colore della minaccia per il difensore secondario"
L.nameplate_extra_color = "Explosive and Spiteful affix color" -- Need review
L.nameplate_mob_color_enable = "Change color for important mobs in dungeons" -- Need review
L.nameplate_mob_color = "Color for mobs" -- Need review
-- Combat text options
L_GUI_COMBATTEXT = "Testo di combattimento"
L_GUI_COMBATTEXT_SUBTEXT = "For moving type in the chat '/xct'" -- Need review
L_GUI_COMBATTEXT_ENABLE = "Attiva il testo di combattimento"
L.combattext_blizz_head_numbers = "Enable Blizzard combat text" -- Need review
L.combattext_blizz_head_numbers_desc = "Usa il testo di combattimento della Blizzard per danni/cure"
L.combattext_damage_style = "Change default combat font" -- Need review
L.combattext_damage_style_desc = "Cambia il carattere di base per danni/cure (è necessario riavviare il gioco)"
L_GUI_COMBATTEXT_DAMAGE = "Mostra i danni in un proprio riquadro dedicato"
L_GUI_COMBATTEXT_HEALING = "Mostra le cure in un proprio riquadro dedicato"
L.combattext_incoming = "Show incoming damage and healing" -- Need review
L_GUI_COMBATTEXT_HOTS = "Mostra gli effetti delle cure periodiche nel riquadro delle cure"
L_GUI_COMBATTEXT_OVERHEALING = "Mostra le cure in eccesso"
L_GUI_COMBATTEXT_PET_DAMAGE = "Mostra i danni del tuo famiglio"
L_GUI_COMBATTEXT_DOT_DAMAGE = "Mostra i tuoi danni nel tempo"
L_GUI_COMBATTEXT_DAMAGE_COLOR = "Colora i numeri dei danni in base alla scuola di magia"
L_GUI_COMBATTEXT_CRIT_PREFIX = "Simbolo che sarà aggiunto prima dei critici"
L_GUI_COMBATTEXT_CRIT_POSTFIX = "Simbolo che sarà aggiunto dopo i critici"
L_GUI_COMBATTEXT_ICONS = "Mostra le icone dei danni"
L_GUI_COMBATTEXT_ICON_SIZE = "Icon size" -- Need review
L_GUI_COMBATTEXT_ICON_SIZE_DESC = "Dimensioni icone danni (influenza anche le dimensioni del carattere dei danni)"
L_GUI_COMBATTEXT_TRESHOLD = "Danno minimo da mostrare nel riquadro dei danni"
L_GUI_COMBATTEXT_HEAL_TRESHOLD = "Cure minime da mostrare nei messaggi delle cure"
L_GUI_COMBATTEXT_SCROLLABLE = "Attiva la 'modalità scorrimento': consente di scorrere tra le righe dei riquadri con la rotellina del mouse"
L_GUI_COMBATTEXT_MAX_LINES = "Max lines" -- Need review
L_GUI_COMBATTEXT_MAX_LINES_DESC = "Massimo numero righe da ricordare in 'scorrimento' (più righe = più memoria)"
L_GUI_COMBATTEXT_TIME_VISIBLE = "Time" -- Need review
L_GUI_COMBATTEXT_TIME_VISIBLE_DESC = "Tempo (in secondi) in cui un singolo messaggio sarà visibile"
L_GUI_COMBATTEXT_DK_RUNES = "Mostra la ricarica delle rune dei cavalieri della morte"
L_GUI_COMBATTEXT_KILLINGBLOW = "Comunica i tuoi colpi di grazia"
L.combattext_merge_aoe_spam = "Merges spell spam into single message" -- Needs review
L.combattext_merge_aoe_spam_desc = "Unisci lo spam per danni multipli a più bersagli in un singolo messaggio"
L_GUI_COMBATTEXT_MERGE_MELEE = "Unifica lo spam di attacchi automatici multipli"
L.combattext_merge_all = "Merges all spells" -- Needs review
L_GUI_COMBATTEXT_DISPEL = "Comunica le tue dissoluzioni (dispels)"
L_GUI_COMBATTEXT_INTERRUPT = "Comunica le tue interruzioni (interrupts)"
L_GUI_COMBATTEXT_DIRECTION = "Change scrolling direction from bottom to top" -- Need review
L_GUI_COMBATTEXT_SHORT_NUMBERS = "Usa abbreviazioni numeriche ('25.3k' invece di '25342')"
-- Auras/Buffs/Debuffs
L_GUI_AURA_PLAYER_BUFF_SIZE = "Buffs size" -- Need review
L_GUI_AURA_PLAYER_BUFF_SIZE_DESC = "Dimensione benefici giocatore"
L.aura_debuff_size = "Debuffs size" -- Need review
L_GUI_AURA_SHOW_SPIRAL = "Spirale trascorrere tempo sulle icone delle auree"
L_GUI_AURA_SHOW_TIMER = "Mostra il timer del recupero sulle icone delle auree"
L_GUI_AURA_PLAYER_AURAS = "Auree sul riquadro del giocatore"
L_GUI_AURA_TARGET_AURAS = "Auree sul riquadro del bersaglio"
L_GUI_AURA_FOCUS_DEBUFFS = "Penalità sul riquadro del focus"
L_GUI_AURA_FOT_DEBUFFS = "Penalità sul riquadro del bersaglio del focus"
L_GUI_AURA_PET_DEBUFFS = "Penalità sul riquadro del famiglio"
L_GUI_AURA_TOT_DEBUFFS = "Penalità sul riquadro del bersaglio del bersaglio"
L.aura_subheader_boss = "Benefici sul riquadro del boss" -- Need review
L_GUI_AURA_PLAYER_AURA_ONLY = "Mostra solo le tue penalità sul riquadro del bersaglio"
L_GUI_AURA_DEBUFF_COLOR_TYPE = "Colora le penalità a seconda del tipo"
L_GUI_AURA_CAST_BY = "Mostra chi ha lanciato un beneficio o una penalità nei suggerimenti"
L_GUI_AURA_CLASSCOLOR_BORDER = "Colora i bordi dei benefici del giocatore in base al colore della classi"
L.aura_subheader_buffs = "Player buffs" -- Need review
L.aura_subheader_debuffs = "Debuffs" -- Need review
-- Bag options
L_GUI_BAGS = "Sacche"
L_GUI_BAGS_SUBTEXT = "Right click on the close button to open the menu. To move the bags, hold down Shift - click." -- Need review
L_GUI_BAGS_ENABLE = "Attiva le sacche"
L_GUI_BAGS_ILVL = "Mostra il livello oggetto di armi e armature"
L.bag_new_items = "Show animation for new items" -- Need review
L.bag_filter = "Always show filter buttons" -- Need review
L_GUI_BAGS_BUTTON_SIZE = "Dimensioni degli scomparti"
L_GUI_BAGS_BUTTON_SPACE = "Spazio tra gli scomparti"
L_GUI_BAGS_BANK = "Numero di colonne in banca"
L_GUI_BAGS_BAG = "Numero di colonne nella sacca principale"
-- Minimap options
L_GUI_MINIMAP_SUBTEXT = "Minimap settings." -- Need review
L_GUI_MINIMAP_ENABLE = "Attiva la minimappa"
L.minimap_on_top = "Move minimap on top right corner" -- Need review
L_GUI_MINIMAP_ICON = "Icona tracciamento"
L_GUI_GARRISON_ICON = "Icona della guarnigione" -- Need review
L_GUI_MINIMAP_SIZE = "Dimensioni della minimappa"
L_GUI_MINIMAP_HIDE_COMBAT = "Nascondi la minimappa in combattimento"
L_GUI_MINIMAP_TOGGLE_MENU = "Mostra il menu a scomparsa"
L.minimap_bg_map_stylization = "Restyling della mappa dei Campi di Battaglia"
L.minimap_fog_of_war = "Nebbia della guerra sulla mappa del mondo"
-- Loot options
L_GUI_LOOT_SUBTEXT = "Settings for loot frame." -- Need review
L_GUI_LOOT_ENABLE = "Attiva il riquadro bottino"
L_GUI_LOOT_ROLL_ENABLE = "Attiva il riquadro del bottino di gruppo"
L_GUI_LOOT_ICON_SIZE = "Dimensioni delle icone"
L_GUI_LOOT_WIDTH = "Larghezza del riquadro bottino"
L_GUI_LOOT_AUTOGREED = "A livello massimo, attiva automaticamente la bramosia per gli oggetti verdi"
L_GUI_LOOT_AUTODE = "'Auto-conferma' il disincantamento degli oggetti"
L.loot_faster_loot = "Faster looting" -- Need review
L.loot_faster_loot_desc = "Works only if enabled auto loot" -- Need review
-- Filger
L_GUI_FILGER = "Timers (Filger)"
L_GUI_FILGER_SUBTEXT = "Filger - analogue WeakAuras, but more simple and easy. Allows you to display in the form of icons and bars your auras and timers." -- Need review
L_GUI_FILGER_ENABLE = "Attiva Filger"
L_GUI_FILGER_TEST_MODE = "Modalità di prova delle icone"
L_GUI_FILGER_MAX_TEST_ICON = "Il numero di icone da sottoporre alla prova"
L_GUI_FILGER_SHOW_TOOLTIP = "Mostra suggerimenti"
L.filger_subheader_elements = "Showing elements" -- Need review
L.filger_show_buff = "Player buffs" -- Need review
L.filger_show_proc = "Player procs" -- Need review
L.filger_show_debuff = "Debuffs on target" -- Need review
L.filger_show_aura_bar = "Aura bars on target" -- Need review
L.filger_show_special = "Special buffs on player" -- Need review
L.filger_show_pvp_player = "SPvP debuffs on player" -- Need review
L.filger_show_pvp_target = "PvP auras on target" -- Need review
L.filger_show_cd = "Cooldowns" -- Need review
L.filger_subheader_size = "Icons size" -- Need review
L.filger_subheader_test = "Test mode" -- Need review
L_GUI_FILGER_EXPIRATION = "Sort cooldowns by expiration time" -- Need review
L_GUI_FILGER_BUFFS_SIZE = "Dimensione dei benefici"
L_GUI_FILGER_COOLDOWN_SIZE = "Dimensione dei recuperi"
L_GUI_FILGER_PVP_SIZE = "Dimensione delle penalità PvP"
L.filger_buffs_space = "Buffs space" -- Need review
L.filger_pvp_space = "PvP auras space" -- Need review
L.filger_cooldown_space = "Cooldowns space" -- Need review
L.filger_subheader_spells = "Adding new spells" -- Need review
L.filger_category_list = "Spell list category" -- Need review
-- Announcements options
L_GUI_ANNOUNCEMENTS = "Annunci"
L_GUI_ANNOUNCEMENTS_SUBTEXT = "Settings that add chat announcements about spells or items." -- Need review
L.announcements_drinking = "Annuncia in chat quando un nemico in arena sta bevendo"
L.announcements_interrupts = "Interrupts" -- Need review
L.announcements_interrupts_desc = "Annuncia in gruppo/incursione quando tu interrompi un incantesimo/abilità"
L.announcements_spells = "Cast spells" -- Needs review
L.announcements_spells_desc = "Annuncia in gruppo/incursione quando usi alcuni incantesimi/abilità"
L.announcements_spells_from_all = "From all members" -- Needs review
L.announcements_spells_from_all_desc = "Controlla incantesimi/abilità lanciati da tutti i compagni di gruppo/incursione"
L.announcements_toys = "Annuncia l'uso del Trenino Giocattolo o del Telecomando di Birranera"
L.announcements_pull_countdown = "Pull countdown" -- Needs review
L.announcements_pull_countdown_desc = "Annuncia il conto alla rovescia di avvio incontro '/pc #'"
L.announcements_flask_food = "Usage of flasks and food" -- Needs review
L.announcements_flask_food_desc = "Annuncia l'uso di tonici e cibo (/ffcheck)"
L.announcements_flask_food_raid = "Annuncia l'uso di cibi e tonici nel canale incursione"
L.announcements_flask_food_auto = "Annuncia automaticamente l'uso di cibi e tonici all'appello" -- Needs review
L.announcements_feasts = "Annuncia l'uso di tripudi/calderoni/anime/robots per le riparazioni"
L.announcements_portals = "Annuncia l'uso di un portale/Rituale d'Evocazione"
L.announcements_subheader_self = "Self announce" -- Needs review
L.announcements_bad_gear = "Check your bad gear" -- Need review
L.announcements_bad_gear_desc = "Controlla l'equip. non idoneo in instance"
L.announcements_safari_hat = "Safari Hat" -- Needs review
L.announcements_safari_hat_desc = "Controlla se il Cappello da Safari sia indossato o meno"
-- Automation options
L_GUI_AUTOMATION = "Automatismi"
L_GUI_AUTOMATION_SUBTEXT = "This block contains settings that facilitate the routine." -- Need review
L.automation_release = "'Auto-risorgi' nei Campi di Battaglia"
L.automation_screenshot = "Cattura una schermata quando completi un'impresa"
L.automation_solve_artifact = "Popup automatico restauro manufatto"
L.automation_solve_artifact_desc = "If there are enough fragments for an artifact, a popup will appear to solve it." -- Need review
L.automation_accept_invite = "'Auto-accetta' gli inviti"
L.automation_decline_duel = "'Auto-declina' i duelli"
L.automation_accept_quest = "'Auto-accetta' le missioni"
L.automation_auto_collapse = "Auto collapse Objective Tracker" -- Need review
L.automation_auto_collapse_raid = "In Instance" -- Need review
L.automation_auto_collapse_reload = "After reload" -- Need review
L.automation_auto_collapse_scenario = "Partially" -- Need review
L.automation_skip_cinematic = "'Auto-salta' i filmati"
L.automation_auto_role = "'Auto-imposta' il tuo ruolo"
L.automation_cancel_bad_buffs = "'Auto-cancella' alcuni benefici"
L.automation_tab_binder = "Usando il tasto TAB, consente di prendere come bersaglio soltanto nemici controllati da altri giocatori (se presenti)"
L.automation_tab_binder_desc = "'Tab' key target only enemy players when in PvP zones, ignores pets and mobs" -- Need review
L.automation_logging_combat = "In instances da incursione, 'auto-attiva' la registrazione del Registro di combattimento in un file di testo"
L.automation_buff_on_scroll = "Lancia benefici con la rotellina del mouse"
L.automation_buff_on_scroll_desc = "If the buff from the list is not applied to the player, it will cast by the mouse scroll" -- Need review
L.automation_open_items = "Apertura automatica degli oggetti nelle sacche"
L.automation_resurrection = "Confirm resurrection" -- Needs review
L.automation_summon = "Confirm summon" -- Needs review
L.automation_whisper_invite = "Auto invite when whisper keyword" -- Needs review
L.automation_invite_keyword = "List of keyword (separated by space)" -- Needs review
L.automation_invite_keyword_desc = "When player whisper you keyword he will be invited in your group" -- Needs revieww
-- Buffs reminder options
L_GUI_REMINDER = "Promemoria benefici"
L_GUI_REMINDER_SUBTEXT = "Display of missed auras." -- Need review
L_GUI_REMINDER_SOLO_ENABLE = "Mostra i propri benefici mancanti"
L_GUI_REMINDER_SOLO_SOUND = "Attiva un suono d'avviso per il promemoria dei propri benefici mancanti"
L_GUI_REMINDER_SOLO_SIZE = "Icon size" -- Need review
L_GUI_REMINDER_SOLO_SIZE_DESC = "Dimensione dell'icona dei propri benefici"
L_GUI_REMINDER_SUBHEADER = "Raid buffs" -- Need review
L_GUI_REMINDER_RAID_ENABLE = "Mostra i benefici d'incursione mancanti"
L_GUI_REMINDER_RAID_ALWAYS = "Mostra sempre il promemoria benefici"
L_GUI_REMINDER_RAID_SIZE = "Icon size" -- Need review
L_GUI_REMINDER_RAID_SIZE_DESC = "Dimensioni delle icone del promemoria benefici d'incursione"
L_GUI_REMINDER_RAID_ALPHA = "Transparent" -- Need review
L_GUI_REMINDER_RAID_ALPHA_DESC = "Trasparenza icona quando il beneficio è presente"
-- Raid cooldowns options
L_GUI_COOLDOWN_RAID = "Recuperi d'incursione"
L_GUI_COOLDOWN_RAID_SUBTEXT = "Tracking raid abilities in the upper left corner." -- Need review
L_GUI_COOLDOWN_RAID_ENABLE = "Visualizza i recuperi d'incursione"
L_GUI_COOLDOWN_RAID_HEIGHT = "Bars height" -- Need review
L_GUI_COOLDOWN_RAID_WIDTH = "Bars width" -- Need review
L_GUI_COOLDOWN_RAID_SORT = "Disposizione verso l'alto delle barre dei recuperi d'incursione"
L_GUI_COOLDOWN_RAID_EXPIRATION = "Ordina in base al tempo di scadenza"
L_GUI_COOLDOWN_RAID_SHOW_SELF = "Mostra i miei recuperi"
L_GUI_COOLDOWN_RAID_ICONS = "Icone dei recuperi d'incursione"
L_GUI_COOLDOWN_RAID_IN_RAID = "Mostra i recuperi d'incursione nelle aree da incursione"
L_GUI_COOLDOWN_RAID_IN_PARTY = "Mostra i recuperi d'incursione nelle aree da gruppo"
L_GUI_COOLDOWN_RAID_IN_ARENA = "Mostra i recuperi d'incursione nelle aree da arena"
-- Enemy cooldowns options
L_GUI_COOLDOWN_ENEMY = "Recuperi del nemico"
L_GUI_COOLDOWN_ENEMY_SUBTEXT = "Tracking enemy abilities as icons above your spell casting bar." -- Need review
L_GUI_COOLDOWN_ENEMY_ENABLE = "Visualizza i recuperi del nemico"
L_GUI_COOLDOWN_ENEMY_SIZE = "Dimensioni delle icone dei recuperi del nemico"
L_GUI_COOLDOWN_ENEMY_DIRECTION = "Direzione icone recuperi del nemico"
L_GUI_COOLDOWN_ENEMY_EVERYWHERE = "Mostra i recuperi del nemico in qualsiasi area"
L_GUI_COOLDOWN_ENEMY_IN_BG = "Mostra i recuperi del nemico nelle aree da Campo di Battaglia"
L_GUI_COOLDOWN_ENEMY_IN_ARENA = "Mostra i recuperi del nemico nelle aree da arena"
L.enemycooldown_show_inparty = "Show in party zone for allies" -- Need review
L.enemycooldown_class_color = "Enable classcolor border" -- Need review
-- Pulse cooldowns options
L_GUI_COOLDOWN_PULSE = "Recuperi effetto 'pulse'"
L_GUI_COOLDOWN_PULSE_SUBTEXT = "Track your cd using a pulse icon in the center of the screen." -- Need review
L_GUI_COOLDOWN_PULSE_ENABLE = "Mostra i recuperi con effetto 'pulse'"
L_GUI_COOLDOWN_PULSE_SIZE = "Dimensione dell'icona dei recuperi con effetto 'pulse'"
L_GUI_COOLDOWN_PULSE_SOUND = "Attiva un suono di avviso"
L_GUI_COOLDOWN_PULSE_ANIM_SCALE = "Regolazione dell'animazione"
L_GUI_COOLDOWN_PULSE_HOLD_TIME = "Opacità del tempo d'attesa massimo"
L_GUI_COOLDOWN_PULSE_THRESHOLD = "Threshold time" -- Need review
L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = "Soglia di tempo minimo"
-- Threat options
L_GUI_THREAT = "Barre di minaccia"
L_GUI_THREAT_SUBTEXT = "Display of the threat list (a simple analogue of Omen)." -- Need review
L_GUI_THREAT_ENABLE = "Attiva le barre di minaccia"
L_GUI_THREAT_HEIGHT = "Altezza delle barre di minaccia"
L_GUI_THREAT_WIDTH = "Larghezza delle barre di minaccia"
L_GUI_THREAT_ROWS = "Numero delle barre di minaccia"
L_GUI_THREAT_HIDE_SOLO = "Mostra soltanto in gruppo/incursione"
-- Top panel options
L_GUI_TOP_PANEL = "Pannello superiore"
L_GUI_TOP_PANEL_SUBTEXT = "Manage built-in top panel with information." -- Need review
L_GUI_TOP_PANEL_ENABLE = "Attiva il pannello superiore"
L_GUI_TOP_PANEL_MOUSE = "Pannello superiore al passaggio del mouse"
L_GUI_TOP_PANEL_WIDTH = "Larghezza pannello"
L_GUI_TOP_PANEL_HEIGHT = "Altezza pannello"
-- Stats options
L_GUI_STATS = "Stats"
L_GUI_STATS_SUBTEXT = "Statistics blocks located at the bottom of the screen. Type in the chat '/ls' for info." -- Need review
L_GUI_STATS_CLOCK = "Orologio"
L_GUI_STATS_LATENCY = "Latenza"
L_GUI_STATS_FPS = "Frames Per Seconds"
L_GUI_STATS_EXPERIENCE = "Esperienza"
L_GUI_STATS_TALENTS_DESC = "Date-text allows you to change the spec and loot on click" -- Need review
L_GUI_STATS_COORDS = "Coordinate"
L_GUI_STATS_LOCATION = "Località"
L_GUI_STATS_BG = "Campi di Battaglia"
L.stats_bottom_line = "Bottom classcolor line" -- Need review
L_GUI_STATS_SUBHEADER_CURRENCY = "Currency (displayed in gold data text)" -- Need review
L_GUI_STATS_CURRENCY_ARCHAEOLOGY = "Mostra i frammenti di archeologia sotto la linguetta della valuta"
L_GUI_STATS_CURRENCY_COOKING = "Mostra le ricompense di cucina sotto la linguetta della valuta"
L_GUI_STATS_CURRENCY_RAID = "Mostra i sigilli delle incursioni"
-- Trade options
L_GUI_TRADE = "Trade" -- Need review
L_GUI_TRADE_SUBTEXT = "Settings related to professions and trade" -- Need review"
L.trade_profession_tabs = "Professions tabs" -- Need review
L.trade_profession_tabs_desc = "Visualizza la linguetta delle professioni sul riquadro abilità di commercio/commercio"
L.trade_already_known = "Colorizes already known items" -- Need review
L.trade_already_known_desc = "Colora ricette/cavalcature/mascottes possedute"
L.trade_disenchanting = "Quick Disenchanting" -- Need review
L.trade_disenchanting_desc = "Disincantamento, Pestatura e Prospezione in un solo click"
L.trade_sum_buyouts = "Somma assieme tutte le aste correnti"
L.trade_sum_buyouts_desc = "At auctions tab shows sum up all current auctions" -- Need review
L.trade_enchantment_scroll = "Pergamena Incantamento sul riquadro sul riquadro abilità di commercio"
L.trade_archaeology = "Archeologia: reliquie e recuperi"
L.trade_archaeology_desc = "Archaeology tracker ('/arch' or right mouseover minimap button to show)" -- Need review
L.trade_merchant_itemlevel = "Item level in merchant" -- Need review
L.trade_merchant_itemlevel_desc = "Mostra il livello dell’oggetto di armi e armature in vendita"
-- Miscellaneous options
L_GUI_MISC_SUBTEXT = "Other settings that add interesting features." -- Need review
L.misc_shift_marking = "Marks mouseover target" -- Need review
L.misc_shift_marking_desc = "Marks mouseover target when you push Shift (only in group)" -- Need review
L.misc_afk_spin_camera = "Ruota la camera mentre sei assente"
L.misc_quest_auto_button = "Quest items auto button" -- Need review
L.misc_quest_auto_button_desc = "Pulsante automatico missione/oggetto" -- Need review
L.misc_raid_tools = "Strumenti per le incursioni"
L.misc_raid_tools_desc = "Button at the top of the screen for ready check (Left-click), checking roles (Middle-click), setting marks, etc. (for leader and assistants)" -- Need review
L.misc_item_level = "Item level on slot buttons" -- Need review
L.misc_item_level_desc = "Livello oggetto sugli scomparti della schermata Personaggio"
L.misc_click_cast = "Scorciatoie da mouse (Click2Cast)"
L.misc_click_cast_desc = "Allows you to assign spells (analog Clique) to the mouse buttons. Setup through the side bookmark in the spell book" -- Need review
L.misc_click_cast_filter = "Ignora i riquadri di giocatore e bersaglio con Click2Cast"
L.misc_chars_currency = "Traccia la valuta complessiva posseduta dai tuoi personaggi"
L.misc_chars_currency_desc = "Hover over the icon of the required currency in the character window to display information in the tooltip" -- Need review
L.misc_hide_raid_button = "Nascondi il pulsante di oUF_RaidDPS"
L.misc_hide_raid_button_desc = "The button is displayed by hovering the mouse in the upper left corner" -- Need review
================================================
FILE: ShestakUI_Config/Locales/Russian.lua
================================================
local _, L = ...
if GetLocale() ~= "ruRU" then return end
----------------------------------------------------------------------------------------
-- Localization for ruRU client
-- Translation: Shestak, Wetxius
----------------------------------------------------------------------------------------
L_GUI_SET_SAVED_SETTTINGS = "Персональный профиль"
L_GUI_SET_SAVED_SETTTINGS_DESC = "Переключение между профилем, который применяется ко всем персонажам, и профилем, уникальным для этого персонажа."
L_GUI_RESET_CHAR = "Вы уверены, что хотите сбросить все настройки ShestakUI для этого персонажа?"
L_GUI_RESET_ALL = "Вы уверены, что хотите сбросить все настройки ShestakUI?"
L_GUI_PER_CHAR = "Вы уверены, что хотите сменить режим сохранения настроек?"
L_GUI_RESET_CAT = "Вы уверены, что хотите сбросить настройки этого раздела?"
L_GUI_RESET_CAT_DESC = "Сбрасывает настройки раздела. \nCTRL-клик, чтобы сбросить всё"
L_GUI_NEED_RELOAD = "Для активации настроек нужна перезагрузка."
L_GUI_LAYOUT = "Смена раскладки"
L_GUI_SPELL_LIST = "Список заклинаний"
L_GUI_SPELL_INPUT = "Номер заклинания"
L_GUI_TIME_INPUT = "Время"
L_GUI_EXPERT_MODE = "Режим эксперта"
L_GUI_EXPERT_MODE_DESC = "Редактирование профиля Lua"
L_GUI_RESET_SPELLS_DESC = "CTRL-клик, чтобы сбросить список"
L_GUI_INFO = "Помощь"
L_GUI_WIKI_URL = "https://github.com/Wetxius/ShestakUI_Help/wiki/Русский"
-- Profile
L.profile = "Профиль"
L.profile_title = "Настройка профиля"
L.profile_choose = "Выбор профиля"
L.profile_options = "Настройки"
L.profile_movers = "Перемещение элементов"
L.profile_export = "Экспорт"
L.profile_import = "Импорт"
L.profile_error_lib = "Для включения импорта и экспорта - установите WeakAuras"
L.profile_error_code = "Ошибка в импортируемом коде!"
-- General options
L_GUI_GENERAL_SUBTEXT = "Эти настройки контролируют общие параметры UI. Наберите в чат '/uihelp' для помощи."
L_GUI_GENERAL_WELCOME_MESSAGE = "Приветственное сообщение в чате"
L_GUI_GENERAL_AUTOSCALE = "Автоматически масштабировать интерфейс"
L_GUI_GENERAL_UISCALE = "Масштаб интерфейса"
L.general_subheader_blizzard = "Элементы стандартного интерфейса"
L.general_error_filter = "Фильтрация ошибок"
L.general_error_blacklist = "Черный список"
L.general_error_whitelist = "Белый список"
L.general_error_combat = "В бою"
L.general_error_none = "Отключено"
L.general_vehicle_mouseover = "Индикатор транспорта по наведению курсора"
L.general_move_blizzard = "Перемещение рамок Blizzard"
L.general_color_picker = "Улучшенный подбор цвета"
L.general_color_picker_desc = "В стандартное окно подбора цвета добавляются кнопки копировать/вставить, а так же поля для цифрового выставления цвета"
L.general_minimize_mouseover = "Кнопка сворачивания квестов по наведению курсора"
L.general_hide_banner = "Скрыть подсказку добычи после победы над боссом"
L.general_hide_talking_head = "Скрыть рамку говорящей головы"
L.general_hide_maw_buffs = "Скрыть Силу Анимы в подземельях"
-- Media options
L.media_border_color = "Цвет для окантовки"
L.media_classborder_color = "Цвет для классовых окантовок"
L.media_backdrop_color = "Цвет для фона"
L.media_backdrop_alpha = "Прозрачность фона"
L.media_texture = "Основная текстура"
L.media_subheader_normal = "Изменение основного шрифта"
L.media_subheader_pixel = "Изменение дополнительного шрифта"
-- Font options
L.font = "Шрифты"
L.font_subtext = "Настройка шрифтов для элементов. 'MONOCHROMEOUTLINE' только для пиксельных шрифтов."
L.font_stats_font = "Выбор шрифта"
L.font_stats_font_style = "Стиль шрифта"
L.font_stats_font_shadow = "Тень для шрифта"
L.font_subheader_stats = "Шрифт статистики"
L.font_subheader_combat = "Шрифт текста боя"
L.font_subheader_chat = "Шрифт чата"
L.font_subheader_chat_tabs = "Шрифт вкладок чата"
L.font_subheader_action = "Шрифт панелей команд"
L.font_subheader_threat = "Шрифт списка угрозы"
L.font_subheader_raidcd = "Шрифт рейдовых перезарядок"
L.font_subheader_cooldown = "Шрифт перезарядок на панелях команд"
L.font_subheader_loot = "Шрифт добычи"
L.font_subheader_nameplates = "Шрифт индикаторов здоровья"
L.font_subheader_unit = "Шрифт рамок портретов"
L.font_subheader_aura = "Шрифт аур"
L.font_subheader_filger = "Шрифт полос Filger"
L.font_subheader_style = "Шрифт стилизаций"
L.font_subheader_bag = "Шрифт сумок"
L.font_subheader_blizzard = "Размер системных шрифтов"
L.font_tooltip_header_font_size = "Заголовок подсказки"
L.font_tooltip_font_size = "Текст подсказки"
L.font_global_font = "Отключить пиксельный шрифт"
-- Skins options
L_GUI_SKINS = "Стилизация"
L_GUI_SKINS_SUBTEXT = "Изменение внешнего вида стандартного интерфейса."
L_GUI_SKINS_BLIZZARD = "Стилизация элементов интерфейса Blizzard"
L_GUI_SKINS_MINIMAP_BUTTONS = "Стилизация кнопок модификаций у миникарты"
L_GUI_SKINS_SUBHEADER = "Стилизация сторонних модификаций"
L.skins_minimap_buttons_mouseover = "Кнопки по наведению курсора"
L.skins_bubbles = "Стилизация облачков чата"
-- Unit Frames options
L_GUI_UF_SUBTEXT = "Настройка рамок игрока, цели и т.д."
L_GUI_UF_ENABLE = "Включить рамки портретов"
L_GUI_UF_OWN_COLOR = "Использовать свой цвет для полос здоровья"
L_GUI_UF_UF_COLOR = "Цвет полос здоровья"
L.unitframe_uf_color_bg = "Цвет фона"
L.unitframe_enemy_health_color = "Красный цвет для врагов"
L.unitframe_enemy_health_color_desc = "Окрашивать полосу здоровья вражеского игрока в красный"
L_GUI_UF_TOTAL_VALUE = "Отображать общее здоровье/энергию"
L_GUI_UF_COLOR_VALUE = "Цветное значение здоровья/энергии"
L_GUI_UF_BAR_COLOR_VALUE = "Цвет полосы здоровья по его значению"
L_GUI_UF_LINES = "Отображать линии игрока и цели"
L_GUI_UF_SUBHEADER_CAST = "Полоса чтения заклинаний"
L_GUI_UF_UNIT_CASTBAR = "Отображать полосу чтения заклинаний"
L_GUI_UF_CASTBAR_ICON = "Иконка заклинания на полосе чтения"
L_GUI_UF_CASTBAR_LATENCY = "Задержка заклинания на полосе"
L_GUI_UF_CASTBAR_TICKS = "Отображать такты заклинания на полосе"
L_GUI_UF_SUBHEADER_FRAMES = "Отображение рамок"
L_GUI_UF_SHOW_PET = "Питомец"
L_GUI_UF_SHOW_FOCUS = "Фокус"
L_GUI_UF_SHOW_TOT = "Цель цели"
L_GUI_UF_SHOW_BOSS = "Боссы"
L_GUI_UF_BOSS_RIGHT = "Рамки боссов справа"
L_GUI_UF_SHOW_ARENA = "Арена"
L_GUI_UF_ARENA_RIGHT = "Рамки арены справа"
L_GUI_UF_BOSS_DEBUFFS = "Количество дебаффов"
L_GUI_UF_BOSS_DEBUFFS_DESC = "Количество дебаффов на рамке босса"
L_GUI_UF_BOSS_BUFFS = "Количество баффов"
L_GUI_UF_BOSS_BUFFS_DESC = "Количество баффов на рамке босса"
L.unitframe_icons_pvp = "PvP статус"
L.unitframe_icons_pvp_desc = "Отображается при наведении курсора на рамки игрока и цели"
L_GUI_UF_ICONS_COMBAT = "Отображать иконку боя на рамке игрока"
L_GUI_UF_ICONS_RESTING = "Отображать иконку отдыха на рамке игрока"
L_GUI_UF_SUBHEADER_PORTRAIT = "3D Портреты"
L_GUI_UF_PORTRAIT_ENABLE = "Отображать 3D портреты игрока и цели"
L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = "Окрашивать края портретов по цвету класса"
L.unitframe_portrait_type = "Тип портретов"
L.unitframe_portrait_type_icons = "Иконка класса"
L.unitframe_portrait_type_overlay = "Наложение"
L_GUI_UF_PORTRAIT_HEIGHT = "Высота портретов"
L_GUI_UF_PORTRAIT_WIDTH = "Ширина портретов"
L_GUI_UF_SUBHEADER_PLUGINS = "Плагины"
L_GUI_UF_PLUGINS_GCD = "Полоса глобальной перезарядки на рамке игрока"
L_GUI_UF_PLUGINS_SWING = "Индикатор автоматической атаки"
L.unitframe_plugins_reputation_bar = "Индикатор репутации"
L.unitframe_plugins_reputation_bar_desc = "Включить индикатор репутации (слева от игрока по наведению курсора, СКМ - фиксация видимости)"
L.unitframe_plugins_experience_bar = "Индикатор опыта"
L.unitframe_plugins_experience_bar_desc = "Включить индикатор опыта (слева от игрока по наведению курсора, СКМ - фиксация видимости)"
L_GUI_UF_PLUGINS_SMOOTH_BAR = "Плавное изменение полос"
L_GUI_UF_PLUGINS_ENEMY_SPEC = "Специализация врага на полях боя и Арене"
L_GUI_UF_PLUGINS_COMBAT_FEEDBACK = "Текст боя на рамках игрока и цели"
L_GUI_UF_PLUGINS_FADER = "Скрывать рамки вне боя"
L_GUI_UF_PLUGINS_DIMINISHING = "Иконка диминишинга на рамках арены"
L_GUI_UF_PLUGINS_POWER_PREDICTION = "Полоса прогноза использования маны/энергии"
L.unitframe_plugins_absorbs = "Количество поглощения на рамке игрока"
L.unitframe_subheader_player_width = "Размеры рамок игрока и цели"
L.unitframe_player_width = "Ширина"
L.unitframe_subheader_boss_width = "Размеры рамок босса и арены"
L.unitframe_extra_height_auto = "Авто высота здоровья и энергии"
L.unitframe_extra_height_auto_desc = "Умное увеличение в зависимости от размера шрифта"
L.unitframe_extra_health_height = "Доп. высота для здоровья"
L.unitframe_extra_power_height = "Доп. высота для энергии"
L.unitframe_subheader_castbar = "Размер кастбара игрока и цели"
L.unitframe_castbar_height = "Высота"
-- Unit Frames Class bar options
L_GUI_UF_PLUGINS_CLASS_BAR = "Классовые панели"
L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = "Управление особыми классовые ресурсами."
L_GUI_UF_PLUGINS_COMBO_BAR = "Индикатор серии приемов"
L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = "Всегда показывать индикатор серии приемов (для друидов)"
L_GUI_UF_PLUGINS_COMBO_BAR_OLD = "Отображать индикатор серии приемов на цели"
L_GUI_UF_PLUGINS_ARCANE_BAR = "Индикатор чародейского заряда"
L_GUI_UF_PLUGINS_CHI_BAR = "Индикатор ци"
L_GUI_UF_PLUGINS_STAGGER_BAR = "Индикатор пошатывания (для танков монахов)"
L_GUI_UF_PLUGINS_HOLY_BAR = "Индикатор энергии света"
L_GUI_UF_PLUGINS_SHARD_BAR = "Индикатор осколков душ"
L_GUI_UF_PLUGINS_RUNE_BAR = "Индикатор рун"
L_GUI_UF_PLUGINS_TOTEM_BAR = "Индикатор тотемов для шаманов"
L.unitframe_class_bar_totem_other = "Индикатор 'тотемов' для других классов"
L.unitframe_class_bar_essence = "Индикатор сущности"
-- Raid Frames options
L_GUI_UF_RAIDFRAMES_SUBTEXT = "Настройка внешнего вида рейдовых рамок."
L_GUI_UF_BY_ROLE = "Сортировка игроков в группе по ролям"
L_GUI_UF_AGGRO_BORDER = "Отображение угрозы"
L_GUI_UF_DEFICIT_HEALTH = "Значение здоровья по дефициту"
L.raidframe_vertical_health = "Вертикальное направление полосы здоровья"
L.raidframe_vertical_health_desc = "Только для раскладки 'Лекарь'"
L_GUI_UF_ALPHA_HEALTH = "Прозрачность рамок при полном здоровье"
L_GUI_UF_SHOW_RANGE = "Прозрачность рамок вне зоны досягаемости"
L_GUI_UF_RANGE_ALPHA = "Прозрачность"
L_GUI_UF_RANGE_ALPHA_DESC = "Значение для прозрачности рамок вне зоны досягаемости"
L_GUI_UF_SUBHEADER_RAIDFRAMES = "Рамки"
L_GUI_UF_SHOW_PARTY = "Рамки группы"
L_GUI_UF_SHOW_RAID = "Рамки рейда"
L.raidframe_layout = "Рейдовая раскладка"
L.raidframe_heal_layout = "Лекарь"
L.raidframe_dps_layout = "Боец"
L.raidframe_auto_layout = "Авто"
L.raidframe_show_target = "Рамки целей"
L.raidframe_show_pet = "Рамки питомцев"
L_GUI_UF_SOLO_MODE = "Отображать в соло"
L_GUI_UF_PLAYER_PARTY = "Отображать рамку игрока в группе"
L_GUI_UF_SHOW_TANK = "Рамки танков рейда"
L_GUI_UF_SHOW_TANK_TT = "Рамки целей цели танков"
L_GUI_UF_RAID_GROUP = "Количество групп в рейде"
L.raidframe_party_vertical = "Расположить рамки группы вертикально"
L.raidframe_raid_groups_vertical = "Расположить рамки рейда вертикально"
L.raidframe_raid_groups_vertical_desc = "Только для раскладки 'Лекарь'"
L_GUI_UF_SUBHEADER_ICONS = "Отображение иконок"
L_GUI_UF_ICONS_ROLE = "Роль"
L_GUI_UF_ICONS_RAID_MARK = "Рейдовые метки"
L_GUI_UF_ICONS_READY_CHECK = "Готовность"
L_GUI_UF_ICONS_LEADER = "Лидер и помощник"
L_GUI_UF_ICONS_SUMON = "Призыв"
L.raidframe_icons_phase = "Фаза"
L.raidframe_plugins_debuffhighlight_icon = "Отображать снимаемые дебаффы"
L.raidframe_plugins_aura_watch = "Отображать рейдовые дебаффы (из списка)"
L.raidframe_plugins_aura_watch_timer = "Включить цифровой таймер"
L.raidframe_plugins_pvp_debuffs = "Отображать PvP дебаффы (из списка)"
L_GUI_UF_PLUGINS_HEALCOMM = "Отображать поступающее лечение"
L.raidframe_plugins_over_absorb = "Избыточное поглощение"
L.raidframe_plugins_over_heal_absorb = "Избыточное поглощение исцеления"
L.raidframe_plugins_auto_resurrection = "Автокаст воскрешения"
L.raidframe_plugins_auto_resurrection_desc = "Автокаст воскрешения средней кнопкой мыши (не работает с Clique)"
L.raidframe_hide_health_value = "Скрыть значение здоровья для рейда"
L.raidframe_auto_position = "Авто крепление рейда"
L.raidframe_auto_position_desc = "Если групп больше 5 - меняются крепления рамок. \nТолько для раскладки 'Лекарь' "
L.raidframe_auto_position_dynamic = "Динамическое"
L.raidframe_auto_position_static = "Статическое"
L.raidframe_subheader_heal_size = "Размеры для раскладки 'Лекарь'"
L.raidframe_heal_width = "Ширина рамок"
L.raidframe_heal_height = "Высота рамок"
L.raidframe_heal_power_height = "Высота энергии"
L.raidframe_subheader_dps_size = "Размеры для раскладки 'Боец'"
L.raidframe_dps_party_width = "Ширина группы"
L.raidframe_dps_party_height = "Высота группы"
L.raidframe_dps_raid_width = "Ширина рейда"
L.raidframe_dps_raid_height = "Высота рейда"
L.raidframe_dps_party_power_height = "Высота энергии группы"
L.raidframe_dps_raid_power_height = "Высота энергии рейда"
-- ActionBar options
L_GUI_ACTIONBAR = "Панели команд"
L_GUI_ACTIONBAR_ENABLE = "Включить панели команд"
L_GUI_ACTIONBAR_HOTKEY = "Отображать назначения клавиш"
L_GUI_ACTIONBAR_MACRO = "Отображать имена макросов"
L_GUI_ACTIONBAR_GRID = "Отображать пустые кнопки панелей команд"
L_GUI_ACTIONBAR_BUTTON_SIZE = "Размер кнопок"
L_GUI_ACTIONBAR_BUTTON_SPACE = "Промежуток"
L_GUI_ACTIONBAR_SPLIT_BARS = "Разделить пятую панель на две панели по 6 кнопок"
L_GUI_ACTIONBAR_CLASSCOLOR_BORDER = "Окрашивать края кнопок в цвет класса"
L.actionbar_toggle_mode = "Включить режим переключения панелей"
L.actionbar_toggle_mode_desc = "Быстрое изменение количества панелей. Для нижних панелей - навести мышкой на скрытую область выше панелей. Для правых панелей - навести на область ниже панелей."
L_GUI_ACTIONBAR_HIDE_HIGHLIGHT = "Скрывать подсветку кнопок"
L_GUI_ACTIONBAR_BOTTOMBARS = "Количество нижних панелей"
L_GUI_ACTIONBAR_RIGHTBARS = "Количество правых панелей"
L.actionbar_bottombars_mouseover = "Нижние панели команд по наведению курсора"
L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = "Правые панели команд по наведению курсора"
L_GUI_ACTIONBAR_PETBAR_HIDE = "Скрыть панель питомца"
L_GUI_ACTIONBAR_PETBAR_HORIZONTAL = "Горизонтальная панель питомца"
L_GUI_ACTIONBAR_PETBAR_MOUSEOVER = "По наведению курсора"
L_GUI_ACTIONBAR_STANCEBAR_HIDE = "Скрыть панель стоек"
L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = "Горизонтальная панель стоек"
L.actionbar_stancebar_horizontal_desc = "Расположена снизу от фрейма игрока"
L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = "По наведению курсора"
L_GUI_ACTIONBAR_MICROMENU = "Включить микроменю"
L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = "Микроменю по наведению курсора"
L.actionbar_editor = "Редактор панелей"
L.actionbar_editor_desc = "Разблокировать настройку и перемещение каждой панели в отдельности"
L.actionbar_bar1_num = "Количество кнопок"
L.actionbar_bar1_row = "Кнопок в ряду"
L.actionbar_bar1_mouseover = "По наведению курсора"
-- Tooltip options
L.tooltip = "Подсказки"
L.tooltip_subtext = "В этом блоке можно изменить стандартные подсказки при наведении курсора."
L.tooltip_enable = "Включить подсказки"
L.tooltip_shift_modifer = "Показывать подсказку при зажатой кнопке Shift"
L.tooltip_cursor = "Подсказка над указателем мыши"
L.tooltip_item_icon = "Иконка заклинания/предмета в подсказке"
L.tooltip_health_value = "Цифровое значение здоровья в подсказке"
L.tooltip_hidebuttons = "Прятать подсказку для кнопок панели команд"
L.tooltip_hide_combat = "Прятать подсказку в бою"
L.tooltip_subheader = "Плагины"
L.tooltip_talents = "Специализация цели в подсказке"
L.tooltip_show_shift = "Только при зажатой кнопке Shift"
L.tooltip_show_shift_desc = "Специализация и уровень предметов отображаются, если зажата кнопка Shift"
L.tooltip_achievements = "Сравнивать достижения в чате с вашими"
L.tooltip_target = "Цель цели в подсказке"
L.tooltip_title = "Звание игрока"
L.tooltip_realm = "Игровой мир игрока"
L.tooltip_rank = "Ранг в гильдии"
L.tooltip_spell_id = "Номер заклинания/предмета"
L.tooltip_average_lvl_desc = "Средний уровень предметов игроков"
L.tooltip_raid_icon = "Рейдовые метки"
L.tooltip_who_targetting = "Показать, кто выбрал целью данного персонажа"
L.tooltip_item_count = "Количество предметов в сумках и банке"
L.tooltip_unit_role = "Роль игрока"
L.tooltip_instance_lock = "Ваш статус прохождения подземелий в подсказке"
L.tooltip_mount = "Источник средства передвижения"
-- Chat options
L.chat_subtext = "Здесь можно изменить настройки окна чата."
L.chat_enable = "Включить чат"
L.chat_background = "Включить фон чата"
L.chat_background_alpha = "Прозрачность фона"
L.chat_filter = "Удаление системных сообщений"
L.chat_filter_desc = "Дуэли, смена талантов, диалоги NPC в городах"
L.chat_spam = "Удаление спама от игроков"
L.chat_spam_list = "Черный список"
L.chat_spam_list_desc = "Список слов (через пробел, строчными буквами) для скрытия сообщений"
L.chat_width = "Ширина чата"
L.chat_height = "Высота чата"
L.chat_chat_bar = "Панель кнопок каналов"
L.chat_chat_bar_mouseover = "Панель по наведению курсора"
L.chat_whisp_sound = "Звуковое оповещение во время шепота"
L.chat_combatlog = "Показывать вкладку журнала боя"
L.chat_tabs_mouseover = "Вкладки чата по наведению курсора"
L.chat_sticky = "Запоминать последний канал чата"
L.chat_damage_meter_spam = "Объединять спам измерителей урона в одну строку"
L.chat_loot_icons = "Иконки для добычи"
L.chat_hide_combat = "Скрывать чат в бою"
L.chat_custom_time_color = "Задать свой цвет времени"
L.chat_time_color = "Цвет времени чата"
-- Nameplate options
L_GUI_NAMEPLATE_SUBTEXT = "Изменение индикаторов здоровья."
L_GUI_NAMEPLATE_ENABLE = "Включить индикаторы здоровья"
L_GUI_NAMEPLATE_COMBAT = "Автоматически показывать индикаторы во время боя"
L_GUI_NAMEPLATE_HEALTH = "Цифровое значение здоровья"
L_GUI_NAMEPLATE_HEIGHT = "Высота индикатора"
L_GUI_NAMEPLATE_WIDTH = "Ширина индикатора"
L.nameplate_alpha = "Прозрачность"
L.nameplate_alpha_desc = "Прозрачность индикаторов, которые не являются выбранной целью"
L.nameplate_ad_height = "Дополнительная высота"
L.nameplate_ad_width = "Дополнительная ширина"
L.nameplate_ad_height_desc = "Дополнительная высота выбранного индикатора"
L.nameplate_ad_width_desc = "Дополнительная ширина выбранного индикатора"
L_GUI_NAMEPLATE_CASTBAR_NAME = "Название заклинания"
L_GUI_NAMEPLATE_CLASS_ICON = "Иконки классов в PvP"
L_GUI_NAMEPLATE_NAME_ABBREV = "Сокращение имен"
L.nameplate_short_name = "Заменить имена на короткие"
L.nameplate_clamp = "Прикреплять индикаторы"
L.nameplate_clamp_desc = "Прикреплять к верху экрана, когда цели пропадают из прямой видимости"
L_GUI_NAMEPLATE_SHOW_DEBUFFS = "Отображать ваши отрицательные эффекты (из списка)"
L_GUI_NAMEPLATE_SHOW_BUFFS = "Отображать снимаемые баффы + из списка"
L_GUI_NAMEPLATE_DEBUFFS_SIZE = "Размер иконок аур"
L_GUI_NAMEPLATE_HEALER_ICON = "Иконка над вражескими целителями"
L_GUI_NAMEPLATE_TOTEM_ICONS = "Иконка тотемов"
L.nameplate_target_glow = "Выделять текущую цель"
L.nameplate_only_name = "Отображать только имя для союзников"
L.nameplate_quests = "Иконка квестов"
L.nameplate_cast_color = "Выделить цветом чтение важных заклинаний"
L.nameplate_kick_color = "Изменить цвет чтения заклинания, если ваше прерывание на кд"
L.nameplate_low_health_value = "Уровень здоровья"
L.nameplate_low_health = "Подсветка низкого здоровья"
L_GUI_NAMEPLATE_THREAT = "Цветовое обозначение угрозы (зависит от роли)"
L_GUI_NAMEPLATE_GOOD_COLOR = "Цвет наименьшей угрозы (для танка наивысшей)"
L_GUI_NAMEPLATE_NEAR_COLOR = "Цвет получения/сброса угрозы"
L_GUI_NAMEPLATE_BAD_COLOR = "Цвет наивысшей угрозы (для танка наименьшей)"
L_GUI_NAMEPLATE_OFFTANK_COLOR = "Цвет угрозы для оффтанка (если вы танк)"
L.nameplate_extra_color = "Цвет сфер и теней (аффиксы)"
L.nameplate_mob_color_enable = "Изменить цвет важных противников в подземельях"
L.nameplate_mob_color = "Цвет для противников"
-- Combat text options
L_GUI_COMBATTEXT = "Текст боя"
L_GUI_COMBATTEXT_SUBTEXT = "Для перемещения набрать в чате '/xct'"
L_GUI_COMBATTEXT_ENABLE = "Включить текст боя"
L.combattext_blizz_head_numbers = "Задействовать текст боя Blizzard"
L.combattext_blizz_head_numbers_desc = "Включить исходящий текст боя Blizzard (над головами)"
L.combattext_damage_style = "Смена шрифта текста боя"
L.combattext_damage_style_desc = "Использовать пиксельный шрифт текста боя над головами (требуется рестарт WoW)"
L_GUI_COMBATTEXT_DAMAGE = "Отображать исходящий урон"
L_GUI_COMBATTEXT_HEALING = "Отображать исходящее лечение"
L.combattext_incoming = "Отображать входящий урон и лечение"
L_GUI_COMBATTEXT_HOTS = "Отображать лечение ваших периодических заклинаний"
L_GUI_COMBATTEXT_OVERHEALING = "Отображать исходящее избыточное лечение"
L_GUI_COMBATTEXT_PET_DAMAGE = "Отображать урон вашего питомца"
L_GUI_COMBATTEXT_DOT_DAMAGE = "Отображать урон ваших периодических заклинаний"
L_GUI_COMBATTEXT_DAMAGE_COLOR = "Окрашивать значения урона в цвет магии"
L_GUI_COMBATTEXT_CRIT_PREFIX = "Символ, добавляемый перед критическими значениями"
L_GUI_COMBATTEXT_CRIT_POSTFIX = "Символ, добавляемый после критических значений"
L_GUI_COMBATTEXT_ICONS = "Отображать иконки исходящего лечения и урона"
L_GUI_COMBATTEXT_ICON_SIZE = "Размер иконок"
L_GUI_COMBATTEXT_ICON_SIZE_DESC = "Размер иконок в блоке исходящего лечения и урона"
L_GUI_COMBATTEXT_TRESHOLD = "Минимально отображаемое значение урона"
L_GUI_COMBATTEXT_HEAL_TRESHOLD = "Минимально отображаемое значение лечения"
L_GUI_COMBATTEXT_SCROLLABLE = "Включить прокручивание текста в блоках колесом мыши"
L_GUI_COMBATTEXT_MAX_LINES = "Количество линий"
L_GUI_COMBATTEXT_MAX_LINES_DESC = "Максимальное количество строк (больше строк = больше памяти)"
L_GUI_COMBATTEXT_TIME_VISIBLE = "Время"
L_GUI_COMBATTEXT_TIME_VISIBLE_DESC = "Время (в секундах) до исчезновения текста"
L_GUI_COMBATTEXT_DK_RUNES = "Отображать перезарядку рун Рыцарей Смерти"
L_GUI_COMBATTEXT_KILLINGBLOW = "Отображать Победный удар"
L.combattext_merge_aoe_spam = "Объединять заклинания в одно сообщение"
L.combattext_merge_aoe_spam_desc = "Объединять многократные значения урона и лечения в одно сообщение"
L_GUI_COMBATTEXT_MERGE_MELEE = "Объединять автоатаки"
L.combattext_merge_all = "Объединять все способности"
L_GUI_COMBATTEXT_DISPEL = "Отображать ваши рассеивания"
L_GUI_COMBATTEXT_INTERRUPT = "Отображать ваши прерывания"
L_GUI_COMBATTEXT_DIRECTION = "Сменить направление прокрутки текста боя"
L_GUI_COMBATTEXT_SHORT_NUMBERS = "Сокращать цифры ('25.3k' вместо '25342')"
-- Auras/Buffs/Debuffs
L_GUI_AURA_PLAYER_BUFF_SIZE = "Размер аур"
L_GUI_AURA_PLAYER_BUFF_SIZE_DESC = "Размер положительных эффектов игрока"
L.aura_debuff_size = "Размер дебаффов"
L_GUI_AURA_SHOW_SPIRAL = "Спираль перезарядки на аурах"
L_GUI_AURA_SHOW_TIMER = "Отображать таймер перезарядки аур"
L_GUI_AURA_PLAYER_AURAS = "Ауры игрока"
L_GUI_AURA_TARGET_AURAS = "Цель"
L_GUI_AURA_FOCUS_DEBUFFS = "Фокус"
L_GUI_AURA_FOT_DEBUFFS = "Цель фокуса"
L_GUI_AURA_PET_DEBUFFS = "Питомец"
L_GUI_AURA_TOT_DEBUFFS = "Цель цели"
L_GUI_AURA_PLAYER_AURA_ONLY = "Только ваши отрицательные эффекты на цели"
L_GUI_AURA_DEBUFF_COLOR_TYPE = "Окрашивать края по их типу"
L_GUI_AURA_CAST_BY = "Отображать имя того, кто применил эффект"
L_GUI_AURA_CLASSCOLOR_BORDER = "Окрашивать края в цвет класса"
L.aura_subheader_buffs = "Положительные эффекты игрока"
L.aura_subheader_debuffs = "Отрцательные эффекты"
L.aura_subheader_boss = "Ауры босса"
-- Bag options
L_GUI_BAGS = "Сумки"
L_GUI_BAGS_SUBTEXT = "Правый клик по кнопке закрытия, чтобы открыть меню. Для перемещения сумок зажать Shift - клик."
L_GUI_BAGS_ENABLE = "Включить сумки"
L_GUI_BAGS_ILVL = "Показывать уровень предметов для оружия и брони"
L.bag_new_items = "Анимация для новых предметов"
L.bag_filter = "Всегда отображать панель фильтров"
L_GUI_BAGS_BUTTON_SIZE = "Размер ячеек"
L_GUI_BAGS_BUTTON_SPACE = "Промежуток"
L_GUI_BAGS_BANK = "Cтолбцов в банке"
L_GUI_BAGS_BAG = "Cтолбцов в сумках"
-- Minimap options
L_GUI_MINIMAP_SUBTEXT = "Настройка миникарты."
L_GUI_MINIMAP_ENABLE = "Включить миникарту"
L.minimap_on_top = "Переместить в правый верхний угол"
L_GUI_MINIMAP_ICON = "Иконка отслеживания объектов"
L_GUI_GARRISON_ICON = "Иконка ковенанта"
L_GUI_MINIMAP_SIZE = "Размер миникарты"
L_GUI_MINIMAP_HIDE_COMBAT = "Скрыть миникарту в бою"
L_GUI_MINIMAP_TOGGLE_MENU = "Отображать меню над миникартой"
L.minimap_bg_map_stylization = "Стилизация карты полей боя"
L.minimap_fog_of_war = "Убрать туман войны с глобальной карты"
-- Loot options
L_GUI_LOOT_SUBTEXT = "Настройка окна добычи."
L_GUI_LOOT_ENABLE = "Включить окно добычи"
L_GUI_LOOT_ROLL_ENABLE = "Включить групповое окно добычи"
L_GUI_LOOT_ICON_SIZE = "Размер иконки"
L_GUI_LOOT_WIDTH = "Ширина окна добычи"
L_GUI_LOOT_AUTOGREED = "Авто не откажусь/распылить для зеленых предметов на макс. уровне"
L_GUI_LOOT_AUTODE = "Убрать запрос о распылении предмета"
L.loot_faster_loot = "Ускорить взятие добычи"
L.loot_faster_loot_desc = "Работает, если включен автоматический сбор добычи"
-- Filger
L_GUI_FILGER = "Таймеры (Filger)"
L_GUI_FILGER_SUBTEXT = "Filger - аналог WeakAuras, но более простой и легкий. Позволяет выводить в виде иконок и полос ваши ауры и таймеры."
L_GUI_FILGER_ENABLE = "Включить Filger"
L_GUI_FILGER_TEST_MODE = "Тестирование иконок"
L_GUI_FILGER_MAX_TEST_ICON = "Иконок для теста"
L_GUI_FILGER_SHOW_TOOLTIP = "Показывать подсказку для иконок"
L.filger_subheader_elements = "Отображение элементов"
L.filger_show_buff = "Баффы игрока"
L.filger_show_proc = "Проки игрока"
L.filger_show_debuff = "Дебаффы на цели"
L.filger_show_aura_bar = "Полосы аур на цели"
L.filger_show_special = "Особые баффы на игроке"
L.filger_show_pvp_player = "PvP дебаффы на игроке"
L.filger_show_pvp_target = "PvP ауры на цели"
L.filger_show_cd = "Перезарядки"
L.filger_subheader_size = "Размеры иконок"
L.filger_subheader_test = "Режим тестирования"
L_GUI_FILGER_EXPIRATION = "Сортировать перезарядки по времени"
L_GUI_FILGER_BUFFS_SIZE = "Размер баффов и проков"
L_GUI_FILGER_COOLDOWN_SIZE = "Размер перезарядок"
L_GUI_FILGER_PVP_SIZE = "Размер PvP аур"
L.filger_buffs_space = "Промежуток"
L.filger_pvp_space = "Промежуток"
L.filger_cooldown_space = "Промежуток"
L.filger_subheader_spells = "Добавление новых заклинаний"
L.filger_category_list = "Выбор списка"
-- Announcements options
L_GUI_ANNOUNCEMENTS = "Объявления"
L_GUI_ANNOUNCEMENTS_SUBTEXT = "Здесь можно включить оповещения в чат о заклинаниях и предметах."
L.announcements_drinking = "Враг пьет на арене"
L.announcements_interrupts = "Прерывание заклинания"
L.announcements_interrupts_desc = "Сообщать о вашем прерывании заклинания"
L.announcements_spells = "Использование заклинаний"
L.announcements_spells_desc = "Сообщать, когда вы применили заклинание (из списка)"
L.announcements_spells_from_all = "Включая других игроков"
L.announcements_spells_from_all_desc = "Сообщать, когда применил участник группы/рейда"
L.announcements_toys = "Применение назойливых игрушек"
L.announcements_pull_countdown = "Отсчёт до атаки"
L.announcements_pull_countdown_desc = "Команда для отсчета времени до атаки (/pc #)"
L.announcements_flask_food = "Отсутствующие настои и еда"
L.announcements_flask_food_desc = "Сообщать об отсутствующих настоях и еде (/ffcheck)"
L.announcements_flask_food_raid = "Сообщать в рейдовый канал"
L.announcements_flask_food_auto = "Сообщать при проверке готовности"
L.announcements_feasts = "Пир, почта, ремонт и кодекс"
L.announcements_portals = "Порталы и ритуал призыва"
L.announcements_subheader_self = "Локальное оповещение"
L.announcements_bad_gear = "'Плохое' снаряжение"
L.announcements_bad_gear_desc = "Проверять ваше 'плохое' снаряжение в подземельях (удочки и прочее из списка)"
L.announcements_safari_hat = "Шляпа для сафари"
L.announcements_safari_hat_desc = "Проверять Шляпу для сафари в начале битвы петов"
-- Automation options
L_GUI_AUTOMATION = "Автоматизация"
L_GUI_AUTOMATION_SUBTEXT = "В этом блоке расположены настройки, которые облегчают рутину."
L.automation_release = "Покидать тело на полях боя"
L.automation_screenshot = "Сохранять скриншот, если получено достижение"
L.automation_solve_artifact = "Предлагать собрать артефакт для Археологии"
L.automation_solve_artifact_desc = "Если хватает фрагментов для артефакта, появится окно для его сборки"
L.automation_accept_invite = "Принятие приглашений от друзей и гильдии"
L.automation_decline_duel = "Отмена дуэлей (/disduel, чтобы временно отключить)"
L.automation_accept_quest = "Принятие заданий (если зажат Shift - не работает)"
L.automation_auto_collapse = "Сворачивать отслеживание заданий"
L.automation_auto_collapse_raid = "В подземельях"
L.automation_auto_collapse_reload = "При загрузке"
L.automation_auto_collapse_scenario = "Частично"
L.automation_skip_cinematic = "Пропуск видеороликов (если зажат Ctrl - не работает)"
L.automation_auto_role = "Выбор вашей роли (в группе/рейде)"
L.automation_cancel_bad_buffs = "Снимать назойливые праздничные баффы (из списка)"
L.automation_tab_binder = "Менять поведение клавиши 'Tab' в PvP"
L.automation_tab_binder_desc = "Клавиша 'Tab' будет выбирать только вражеских игроков, игнорируя петов и мобов"
L.automation_logging_combat = "Включать запись журнала боя в рейде"
L.automation_buff_on_scroll = "Накладывать баффы на себя прокруткой колеса мыши (из списка)"
L.automation_buff_on_scroll_desc = "Если бафф из списка не висит на игроке, прокрутив колесо он применится"
L.automation_open_items = "Открывать сундуки и ящики в вашей сумке"
L.automation_resurrection = "Принятие воскрешений"
L.automation_summon = "Принятие призыва"
L.automation_summon_desc = "Суммон от игроков"
L.automation_whisper_invite = "Авто приглашение по ключевым словам"
L.automation_invite_keyword = "Список слов (через пробел)"
L.automation_invite_keyword_desc = "Если вам напишут в личку ключевое слово, то сработает приглашение в группу"
-- Buffs reminder options
L_GUI_REMINDER = "Напоминания"
L_GUI_REMINDER_SUBTEXT = "Отображение пропущенных аур."
L_GUI_REMINDER_SOLO_ENABLE = "Показать пропущенные ауры игрока"
L_GUI_REMINDER_SOLO_SOUND = "Дополнительное звуковое предупреждение"
L_GUI_REMINDER_SOLO_SIZE = "Размер иконки"
L_GUI_REMINDER_SOLO_SIZE_DESC = "Размер иконки ауры игрока"
L_GUI_REMINDER_SUBHEADER = "Рейдовые ауры"
L_GUI_REMINDER_RAID_ENABLE = "Включить отображение пропущенных аур"
L_GUI_REMINDER_RAID_ALWAYS = "Всегда показывать иконки (по умолчанию только в рейде)"
L_GUI_REMINDER_RAID_SIZE = "Размер иконок"
L_GUI_REMINDER_RAID_SIZE_DESC = "Размер иконок рейдовых аур"
L_GUI_REMINDER_RAID_ALPHA = "Прозрачность"
L_GUI_REMINDER_RAID_ALPHA_DESC = "Прозрачность иконок рейдовых аур"
-- Raid cooldowns options
L_GUI_COOLDOWN_RAID = "Перезарядки рейда"
L_GUI_COOLDOWN_RAID_SUBTEXT = "Отслеживание рейдовых способностей в виде полос в левом верхнем углу."
L_GUI_COOLDOWN_RAID_ENABLE = "Включить рейдовые перезарядки"
L_GUI_COOLDOWN_RAID_HEIGHT = "Высота индикаторов"
L_GUI_COOLDOWN_RAID_WIDTH = "Ширина индикаторов"
L_GUI_COOLDOWN_RAID_SORT = "Сделать сортировку вверх"
L_GUI_COOLDOWN_RAID_EXPIRATION = "Сортировка по времени"
L_GUI_COOLDOWN_RAID_SHOW_SELF = "Отображать свои перезарядки"
L_GUI_COOLDOWN_RAID_ICONS = "Отображать иконки рейдовых перезарядок"
L_GUI_COOLDOWN_RAID_IN_RAID = "Отображать в рейде"
L_GUI_COOLDOWN_RAID_IN_PARTY = "Отображать в группе"
L_GUI_COOLDOWN_RAID_IN_ARENA = "Отображать на арене"
-- Enemy cooldowns options
L_GUI_COOLDOWN_ENEMY = "Перезарядки врагов"
L_GUI_COOLDOWN_ENEMY_SUBTEXT = "Отслеживание способностей врагов в виде иконок над вашей полосой чтения заклинаний."
L_GUI_COOLDOWN_ENEMY_ENABLE = "Включить вражеские перезарядки"
L_GUI_COOLDOWN_ENEMY_SIZE = "Размер иконок"
L_GUI_COOLDOWN_ENEMY_DIRECTION = "Направление иконок"
L_GUI_COOLDOWN_ENEMY_EVERYWHERE = "Отображать везде"
L_GUI_COOLDOWN_ENEMY_IN_BG = "Отображать на полях боя"
L_GUI_COOLDOWN_ENEMY_IN_ARENA = "Отображать на арене"
L.enemycooldown_show_inparty = "Отображать в группе для союзников"
L.enemycooldown_class_color = "Окрашивать края в цвет класса"
-- Pulse cooldowns options
L_GUI_COOLDOWN_PULSE = "Свои перезарядки"
L_GUI_COOLDOWN_PULSE_SUBTEXT = "Отслеживание ваших перезарядок с помощью всплывающей иконки в центре экрана."
L_GUI_COOLDOWN_PULSE_ENABLE = "Отображать иконку окончания перезарядки"
L_GUI_COOLDOWN_PULSE_SIZE = "Размер иконки окончания перезарядки"
L_GUI_COOLDOWN_PULSE_SOUND = "Включить звуковое предупреждение"
L_GUI_COOLDOWN_PULSE_ANIM_SCALE = "Масштаб анимации"
L_GUI_COOLDOWN_PULSE_HOLD_TIME = "Время до исчезновения"
L_GUI_COOLDOWN_PULSE_THRESHOLD = "Порог времени"
L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = "Минимальный порог времени"
-- Threat options
L_GUI_THREAT = "Список угрозы"
L_GUI_THREAT_SUBTEXT = "Отображение списка угрозы в виде полос (простой аналог Omen)."
L_GUI_THREAT_ENABLE = "Включить список угрозы"
L_GUI_THREAT_HEIGHT = "Высота полос"
L_GUI_THREAT_WIDTH = "Ширина полос"
L_GUI_THREAT_ROWS = "Количество полос"
L_GUI_THREAT_HIDE_SOLO = "Отображать только в группе/рейде"
-- Top panel options
L_GUI_TOP_PANEL = "Верхняя панель"
L_GUI_TOP_PANEL_SUBTEXT = "Управление встроенной верхней панелью с информацией."
L_GUI_TOP_PANEL_ENABLE = "Включить верхнюю панель"
L_GUI_TOP_PANEL_MOUSE = "Панель по наведению курсора"
L_GUI_TOP_PANEL_HEIGHT = "Высота панели"
L_GUI_TOP_PANEL_WIDTH = "Ширина панели"
-- Stats options
L_GUI_STATS = "Статистика"
L_GUI_STATS_SUBTEXT = "Блоки статистики, которые расположены внизу экрана. Набрать в чате '/ls' для полезной информации"
L_GUI_STATS_CLOCK = "Часы"
L_GUI_STATS_LATENCY = "Задержка"
L_GUI_STATS_FPS = "Кадры в секунду"
L_GUI_STATS_EXPERIENCE = "Опыт"
L_GUI_STATS_TALENTS_DESC = "Дата-текст позволяет менять спек и лут по клику"
L_GUI_STATS_COORDS = "Координаты"
L_GUI_STATS_LOCATION = "Зона"
L_GUI_STATS_BG = "Поле боя"
L.stats_bottom_line = "Цветная полоса снизу"
L_GUI_STATS_SUBHEADER_CURRENCY = "Валюта (отображается в дата-тексте золота)"
L_GUI_STATS_CURRENCY_ARCHAEOLOGY = "Фрагменты археологии"
L_GUI_STATS_CURRENCY_COOKING = "Кулинарные награды"
L_GUI_STATS_CURRENCY_RAID = "Рейдовые печати"
-- Trade options
L_GUI_TRADE = "Торговля"
L_GUI_TRADE_SUBTEXT = "Настройки связанные с профессиями и торговлей"
L.trade_profession_tabs = "Вкладки профессий"
L.trade_profession_tabs_desc = "Вкладки ваших профессий у окна торговли/профессии"
L.trade_already_known = "Изученные предметы"
L.trade_already_known_desc = "Помечать цветом известные рецепты/спутников/игрушки"
L.trade_disenchanting = "Быстрое распыление"
L.trade_disenchanting_desc = "Распылять, просеивать и т.д. предметы, нажимая Alt + кнопка мыши"
L.trade_sum_buyouts = "Отображать сумму ваших аукционов"
L.trade_sum_buyouts_desc = "Во вкладе лоты аукциона будет выводиться сумма ваших аукционов"
L.trade_enchantment_scroll = "Свиток наложения чар в окне профессии"
L.trade_archaeology = "Панель археологии"
L.trade_archaeology_desc = "Отслеживание раскопок артефактов (для показа нажмите скрытую кнопку справа от миникарты или введите '/arch')"
L.trade_merchant_itemlevel = "Уровень предметов у торговца"
L.trade_merchant_itemlevel_desc = "Отображать уровень предметов для оружия и брони в окне торговца"
-- Miscellaneous options
L_GUI_MISC_SUBTEXT = "Прочие настройки, которые добавляют интересные возможности."
L.misc_shift_marking = "Меню с метками цели"
L.misc_shift_marking_desc = "Shift-клик по врагу вызывает меню с метками (работает только в группе)"
L.misc_afk_spin_camera = "Вращать камеру во время афк"
L.misc_quest_auto_button = "Кнопка квестовых предметов"
L.misc_quest_auto_button_desc = "Кнопка квестовых предметов над миникартой (берется из списка)"
L.misc_item_level = "Уровень предметов"
L.misc_item_level_desc = "Отображать уровень предметов на экранах персонажа и осмотра"
L.misc_raid_tools = "Инструменты рейда"
L.misc_raid_tools_desc = "Кнопка вверху экрана для проверки готовности (ПКМ), проверки ролей (СКМ), установки меток и прочее (для лидера и помощников)"
L.misc_click_cast = "Назначение клавиш мыши"
L.misc_click_cast_desc = "Позволяет назначить на клавиши мыши заклинания (аналог Clique). Настройка через боковую вкладку в книге заклинаний"
L.misc_click_cast_filter = "Игнорировать рамки игрока и цели"
L.misc_chars_currency = "Отслеживать валюту на других персонажах"
L.misc_chars_currency_desc = "Наведите на иконку необходимой валюты в окне персонажа для вывода информации в подсказке"
L.misc_hide_raid_button = "Кнопка для скрытия рейда в раскладке 'Боец'"
L.misc_hide_raid_button_desc = "Кнопка отображается по наведению мыши в верхнем левом углу"
================================================
FILE: ShestakUI_Config/Locales/Spanish.lua
================================================
local _, L = ...
if GetLocale() ~= "esES" and GetLocale() ~= "esMX" then return end
----------------------------------------------------------------------------------------
-- Localization for esES and esMX client
-- Translation: eXecrate
----------------------------------------------------------------------------------------
L_GUI_SET_SAVED_SETTTINGS = "Cambios aplicables sólo a este PJ"
L_GUI_SET_SAVED_SETTTINGS_DESC = "Switch between a profile that applies to all characters and one that is unique to this character." -- Need review
L_GUI_RESET_CHAR = "¿Estás seguro de que quieres reiniciar tus preferencias de ShestakUI para este PJ?"
L_GUI_RESET_ALL = "¿Estás seguro de que quieres reiniciar tus preferencias de ShestakUI para todos los PJs?"
L_GUI_PER_CHAR = "¿Estás segudo de que quieres cambiar a o desde 'Cambios sólo a este PJ'?"
L_GUI_RESET_CAT = "Are you sure you want to reset category's settings?" -- Need review
L_GUI_RESET_CAT_DESC = "Reset category's settings. \nCTRL-click to reset all" -- Need review
L_GUI_NEED_RELOAD = "You need to reload the UI to apply your changes." -- Need review
L_GUI_LAYOUT = "Change layout" -- Need review
L_GUI_SPELL_LIST = "List of spells" -- Need review
L_GUI_SPELL_INPUT = "Spell ID" -- Need review
L_GUI_TIME_INPUT = "Time" -- Need review
L_GUI_EXPERT_MODE = "Expert mode" -- Need review
L_GUI_EXPERT_MODE_DESC = "Custom editing of Lua profile" -- Need review
L_GUI_RESET_SPELLS_DESC = "CTRL-click to reset list" -- Need review
-- Profile
L.profile = "Profile" -- Need review
L.profile_title = "Profile options" -- Need review
L.profile_choose = "Choose profile" -- Need review
L.profile_options = "Settings" -- Need review
L.profile_movers = "Moving elements" -- Need review
L.profile_export = "Export" -- Need review
L.profile_import = "Import" -- Need review
L.profile_error_lib = "To enable export and import - install WeakAuras" -- Need review
L.profile_error_code = "Error in imported code!" -- Need review
-- General options
L_GUI_GENERAL_SUBTEXT = "These settings control the general user interface settings. Type in chat '/uihelp' for help." -- Need review
L_GUI_GENERAL_WELCOME_MESSAGE = "Mensaje de bienvenida en el chat"
L_GUI_GENERAL_AUTOSCALE = "Auto escalado de la UI"
L_GUI_GENERAL_UISCALE = "Escalado de la UI (si auto escalado está desactivado)"
L.general_subheader_blizzard = "Blizzard UI elements" -- Need review
L.general_error_filter = "Error filtering" -- Need review
L.general_error_blacklist = "Blacklist" -- Need review
L.general_error_whitelist = "Whitelist" -- Need review
L.general_error_combat = "In combat" -- Need review
L.general_error_none = "None" -- Need review
L.general_vehicle_mouseover = "Marco del Vehículo al pasar el ratón por encima"
L.general_move_blizzard = "Move some Blizzard frames" -- Needs review
L.general_color_picker = "Improved ColorPicker" -- Needs review
L.general_color_picker_desc = "Add copy/paste buttons and digit text entry for Blizzard color picker frame" -- Need review
L.general_minimize_mouseover = "Mouseover for quest minimize button" -- Need review
L.general_hide_banner = "Hide Boss Banner Loot Frame" -- Need review
L.general_hide_talking_head = "Hide Talking Head Frame" -- Need review
L.general_hide_maw_buffs = "Hide Maw Buffs frame in instances" -- Need review
-- Media options
L.media_border_color = "Color for borders" -- Need review
L.media_classborder_color = "Color for class borders" -- Need review
L.media_backdrop_color = "Color for borders backdrop" -- Need review
L.media_backdrop_alpha = "Alpha for transparent backdrop" -- Need review
L.media_texture = "Main texture" -- Need review
L.media_subheader_normal = "Change general font" -- Need review
L.media_subheader_pixel = "Change secondary font" -- Need review
-- Font options
L.font = "Fonts" -- Need review
L.font_subtext = "Customize individual fonts for elements." -- Need review
L.font_stats_font = "Select font" -- Need review
L.font_stats_font_style = "Font flag" -- Need review
L.font_stats_font_shadow = "Font shadow" -- Need review
L.font_subheader_stats = "Stats font" -- Need review
L.font_subheader_combat = "Combat text font" -- Need review
L.font_subheader_chat = "Chat font" -- Need review
L.font_subheader_chat_tabs = "Chat tabs font" -- Need review
L.font_subheader_action = "Action bars font" -- Need review
L.font_subheader_threat = "Threat meter font" -- Need review
L.font_subheader_raidcd = "Raid cooldowns font" -- Need review
L.font_subheader_cooldown = "Cooldowns timer font" -- Need review
L.font_subheader_loot = "Loot font" -- Need review
L.font_subheader_nameplates = "Nameplates font" -- Need review
L.font_subheader_unit = "Unit frames font" -- Need review
L.font_subheader_aura = "Auras font" -- Need review
L.font_subheader_filger = "Filger font" -- Need review
L.font_subheader_style = "Stylization font" -- Need review
L.font_subheader_bag = "Bags font" -- Need review
L.font_subheader_blizzard = "System font size" -- Need review
L.font_tooltip_header_font_size = "Tooltip header" -- Need review
L.font_tooltip_font_size = "Tooltip text" -- Need review
L.font_global_font = "Disable Pixel font" -- Need review
-- Skins options
L_GUI_SKINS = "Estilización"
L_GUI_SKINS_SUBTEXT = "Change the appearance of the standard interface." -- Need review
L_GUI_SKINS_BLIZZARD = "Activar estilizado de marcos de Blizzard"
L_GUI_SKINS_MINIMAP_BUTTONS = "Activar estilizado de los iconos de los addons en el minimapa"
L_GUI_SKINS_SUBHEADER = "Stylization of addons" -- Need review
L.skins_minimap_buttons_mouseover = "Addons icons on mouseover" -- Need review
L.skins_bubbles = "Estilizar las burbujas de chat"
-- Unit Frames options
L_GUI_UF_SUBTEXT = "Customize player, target frames and etc." -- Need review
L_GUI_UF_ENABLE = "Activar marcos de unidades"
L_GUI_UF_OWN_COLOR = "Color para las barras de vida"
L_GUI_UF_UF_COLOR = "Color de las Barras de vida (si color para las barras de vida está activo)"
L.unitframe_uf_color_bg = "Color of health background" -- Need review
L.unitframe_enemy_health_color = "Barra de vida del enemigo objetivo en rojo"
L_GUI_UF_TOTAL_VALUE = "Mostrar vida restante en jugador y objetivo con XXXX/Total"
L_GUI_UF_COLOR_VALUE = "Colorear valor de Vida/Maná"
L_GUI_UF_BAR_COLOR_VALUE = "Color de la barra de vida dependiendo de la vida restante"
L_GUI_UF_LINES = "Show Player and Target lines" -- Need review
L_GUI_UF_SUBHEADER_CAST = "Castbars" -- Need review
L_GUI_UF_UNIT_CASTBAR = "Mostrar barras de lanzamiento"
L_GUI_UF_CASTBAR_ICON = "Mostrar iconos en las barras de lanzamiento"
L_GUI_UF_CASTBAR_LATENCY = "Latencia en la barra de lanzamiento"
L_GUI_UF_CASTBAR_TICKS = "Castbar ticks" -- Needs review
L_GUI_UF_SUBHEADER_FRAMES = "Frames" -- Need review
L_GUI_UF_SHOW_PET = "Mostrar marco de la mascota"
L_GUI_UF_SHOW_FOCUS = "Mostrar marco del foco"
L_GUI_UF_SHOW_TOT = "Mostrar marco del objetivo del objetivo"
L_GUI_UF_SHOW_BOSS = "Mostrar marco del jefe"
L_GUI_UF_BOSS_RIGHT = "Marco/Marcos del/de los jefe/jefes en la derecha"
L_GUI_UF_SHOW_ARENA = "Mostrar marcos de arena"
L_GUI_UF_ARENA_RIGHT = "Marcos de arena en la derecha"
L_GUI_UF_BOSS_DEBUFFS = "Number of debuffs" -- Need review
L_GUI_UF_BOSS_DEBUFFS_DESC = "Number of debuffs on the boss frames" -- Need review
L_GUI_UF_BOSS_BUFFS = "Number of buffs" -- Need review
L_GUI_UF_BOSS_BUFFS_DESC = "Number of buffs on the boss frames" -- Need review
L.unitframe_icons_pvp = "PvP status text" -- Need review
L.unitframe_icons_pvp_desc = "Texto JcJ (iconos no) al pasar el ratón sobre los marcos del jugador y objetivo"
L_GUI_UF_ICONS_COMBAT = "Icono de combate"
L_GUI_UF_ICONS_RESTING = "Icono de descansado para pjs con nivel bajo"
L_GUI_UF_SUBHEADER_PORTRAIT = "Portraits" -- Need review
L_GUI_UF_PORTRAIT_ENABLE = "Activar retratos del jugador/objetivo"
L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = "Borde de color de clase para los retratos"
L.unitframe_portrait_type = "Type of portraits" -- Need review
L.unitframe_portrait_type_icons = "Class Icons" -- Need review
L.unitframe_portrait_type_overlay = "Overlay" -- Need review
L_GUI_UF_PORTRAIT_HEIGHT = "Altura del retrato"
L_GUI_UF_PORTRAIT_WIDTH = "Anchura del retrato"
L_GUI_UF_SUBHEADER_PLUGINS = "Plugins" -- Need review
L_GUI_UF_PLUGINS_GCD = "Brillo de tiempo de reutilización global"
L_GUI_UF_PLUGINS_SWING = "Activar barra de oscilación"
L.unitframe_plugins_reputation_bar = "Reputation bar" -- Need review
L.unitframe_plugins_reputation_bar_desc = "Activar barra de reputación" -- Need review
L.unitframe_plugins_experience_bar = "Experience bar" -- Need review
L.unitframe_plugins_experience_bar_desc = "Activar barra de experiencia" -- Need review
L_GUI_UF_PLUGINS_SMOOTH_BAR = "Activar barra de suavizado"
L_GUI_UF_PLUGINS_ENEMY_SPEC = "Mostrar configuración de los talentos del enemigo"
L_GUI_UF_PLUGINS_COMBAT_FEEDBACK = "Texto de combate en el marco del jugador/objetivo"
L_GUI_UF_PLUGINS_FADER = "Desvanecer marcos de unidades"
L_GUI_UF_PLUGINS_DIMINISHING = "Diminishing Returns icons on arena frames" -- Needs review
L_GUI_UF_PLUGINS_POWER_PREDICTION = "Power cost prediction bar on player frame" -- Need review
L.unitframe_plugins_absorbs = "Absorbs value on player frame" -- Need review
L.unitframe_subheader_player_width = "Player and target frame size" -- Need review
L.unitframe_player_width = "Width" -- Need review
L.unitframe_subheader_boss_width = "Boss and arena frame size" -- Need review
L.unitframe_extra_height_auto = "Auto height for health/power" -- Need review
L.unitframe_extra_height_auto_desc = "Smart adjust depending on font size" -- Need review
L.unitframe_extra_health_height = "Additional height for health" -- Need review
L.unitframe_extra_power_height = "Additional height for power" -- Need review
L.unitframe_subheader_castbar = "Size of player and target castbar" -- Need review
L.unitframe_castbar_height = "Height" -- Need review
-- Unit Frames Class bar options
L_GUI_UF_PLUGINS_CLASS_BAR = "Unit Frames Class bars" -- Needs review
L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = "Control of special class resources." -- Need review
L_GUI_UF_PLUGINS_COMBO_BAR = "Iconos de puntos de combo de Pícaros/Druidas"
L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = "Always show Combo bar for Druid" -- Need review
L_GUI_UF_PLUGINS_COMBO_BAR_OLD = "Show combo point on the target" -- Need review
L_GUI_UF_PLUGINS_ARCANE_BAR = "Enable Arcane Charge bar" -- Need review
L_GUI_UF_PLUGINS_CHI_BAR = "Enable Chi bar" -- Needs review
L_GUI_UF_PLUGINS_STAGGER_BAR = "Enable Stagger bar (for Monk Tanks)" -- Need review
L_GUI_UF_PLUGINS_HOLY_BAR = "Activar barra de poder sagrado"
L_GUI_UF_PLUGINS_SHARD_BAR = "Activar barra de fragmentos"
L_GUI_UF_PLUGINS_RUNE_BAR = "Activar barra de Runas"
L_GUI_UF_PLUGINS_TOTEM_BAR = "Activar barra de totems"
L.unitframe_class_bar_totem_other = "Enable Totem bar for other classes" -- Need review
L.unitframe_class_bar_essence = "Enable Essence bar for Evoker" -- Need review
-- Raid Frames options
L_GUI_UF_RAIDFRAMES_SUBTEXT = "Customize the appearance of the raid frames." -- Need review
L_GUI_UF_BY_ROLE = "Sorting players in group by role" -- Needs review
L_GUI_UF_AGGRO_BORDER = "Borde de aggro"
L_GUI_UF_DEFICIT_HEALTH = "Déficit de vida de la banda"
L_GUI_UF_SHOW_PARTY = "Mostrar marcos de grupo en la banda"
L_GUI_UF_SHOW_RAID = "Mostrar marcos de banda"
L.raidframe_layout = "Raid layout" -- Needs review
L.raidframe_heal_layout = "Heal" -- Needs review
L.raidframe_dps_layout = "DPS" -- Needs review
L.raidframe_auto_layout = "Auto" -- Needs review
L.raidframe_show_target = "Show target frames" -- Needs review
L.raidframe_show_pet = "Show pet frames" -- Needs review
L.raidframe_vertical_health = "Orientación vertical de la vida"
L.raidframe_vertical_health_desc = "Only for heal layout" -- Needs review
L_GUI_UF_ALPHA_HEALTH = "Opacidad de las barras de vida cuando están al 100%"
L_GUI_UF_SHOW_RANGE = "Mostrar rango de opacidad para los marcos de banda"
L_GUI_UF_RANGE_ALPHA = "Alpha" -- Need review
L_GUI_UF_RANGE_ALPHA_DESC = "Opacidad de los marcos de unidades cuando están fuera de rango"
L_GUI_UF_SUBHEADER_RAIDFRAMES = "Frames" -- Need review
L_GUI_UF_SOLO_MODE = "Mostrar marco del jugador siempre"
L_GUI_UF_PLAYER_PARTY = "Mostrar marco del jugador en grupo"
L_GUI_UF_SHOW_TANK = "Mostrar tanques de la banda"
L_GUI_UF_SHOW_TANK_TT = "Mostrar el objetivo del objetivo de los tanques de la banda"
L_GUI_UF_RAID_GROUP = "Número de grupos en la banda"
L.raidframe_party_vertical = "Vertical party frames" -- Needs review
L.raidframe_raid_groups_vertical = "Grupos de la banda en vertical" -- Needs review
L.raidframe_raid_groups_vertical_desc = "Only for heal layout" -- Needs review
L_GUI_UF_SUBHEADER_ICONS = "Icons" -- Need review
L_GUI_UF_ICONS_ROLE = "Role icon on frames" -- Needs review
L_GUI_UF_ICONS_RAID_MARK = "Marcas de banda"
L_GUI_UF_ICONS_READY_CHECK = "Iconos de comprobación"
L_GUI_UF_ICONS_LEADER = "Iconos de líder, ayudantes en los marcos"
L_GUI_UF_ICONS_SUMON = "Sumon icons" -- Need review
L.raidframe_icons_phase = "Phase" -- Need review
L.raidframe_plugins_debuffhighlight_icon = "Remarcar textura de desventajas + icono" -- Need review
L.raidframe_plugins_aura_watch = "'BANDA' Ver las auras"
L.raidframe_plugins_aura_watch_timer = "Temporizador en los iconos de perjuicios de la banda"
L.raidframe_plugins_pvp_debuffs = "Show PvP debuff icons (from the list)" -- Need review
L_GUI_UF_PLUGINS_HEALCOMM = "Barra de sanación entrante"
L.raidframe_plugins_over_absorb = "Show over absorb bar on frame" -- Need review
L.raidframe_plugins_over_heal_absorb = "Show over heal absorb on frame" -- Need review
L.raidframe_plugins_auto_resurrection = "Auto cast resurrection" -- Need review
L.raidframe_plugins_auto_resurrection_desc = "Auto lanzar resurreción con click central cuando la unidad este muerta (no funciona cuando Clique está activado)"
L.raidframe_hide_health_value = "Hide raid health value" -- Needs review
L.raidframe_auto_position = "Auto reposition raid frame" -- Need review
L.raidframe_auto_position_desc = "If there are more than 5 groups, the frame points changes. \nOnly for heal layout" -- Need review
L.raidframe_auto_position_dynamic = "Dynamic" -- Need review
L.raidframe_auto_position_static = "Static" -- Need review
L.raidframe_subheader_heal_size = "Size for heal layout" -- Need review
L.raidframe_heal_width = "Frame width" -- Need review
L.raidframe_heal_height = "Frame height" -- Need review
L.raidframe_heal_power_height = "Power height" -- Need review
L.raidframe_subheader_dps_size = "Size for dps layout" -- Need review
L.raidframe_dps_party_width = "Party width" -- Need review
L.raidframe_dps_party_height = "Party height" -- Need review
L.raidframe_dps_raid_width = "Raid width" -- Need review
L.raidframe_dps_raid_height = "Raid height" -- Need review
L.raidframe_dps_party_power_height = "Party power height" -- Need review
L.raidframe_dps_raid_power_height = "Raid power height" -- Need review
-- ActionBar options
L_GUI_ACTIONBAR = "Action Bars" -- Need review
L_GUI_ACTIONBAR_ENABLE = "Activar barras de acción"
L_GUI_ACTIONBAR_HOTKEY = "Mostrar texto los atajos de teclado"
L_GUI_ACTIONBAR_MACRO = "Mostrar nombre de la macro en los botones"
L_GUI_ACTIONBAR_GRID = "Mostrar botones de la barra de acción vacíos"
L_GUI_ACTIONBAR_BUTTON_SIZE = "Tamaño de los botones"
L_GUI_ACTIONBAR_BUTTON_SPACE = "Espacio entre botones"
L_GUI_ACTIONBAR_SPLIT_BARS = "Dividir la quinta barra en dos de 6 botones cada una"
L_GUI_ACTIONBAR_CLASSCOLOR_BORDER = "Activar borde por color de clase para los botones"
L.actionbar_toggle_mode = "Activar modo cambiar"
L.actionbar_toggle_mode_desc = "The quick change in the number of panels. For the lower panels, hover the mouse over the hidden area above the panels. For right panels, hover the mouse over the area below the panels." -- Need review
L_GUI_ACTIONBAR_HIDE_HIGHLIGHT = "Hide proc highlight" -- Needs review
L_GUI_ACTIONBAR_BOTTOMBARS = "Número de barras de acción abajo"
L_GUI_ACTIONBAR_RIGHTBARS = "Número de barras de acción en la derecha"
L.actionbar_bottombars_mouseover = "Bottom bars on mouseover" -- Needs review
L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = "Barras de la derecha se muestran al pasar el ratón"
L_GUI_ACTIONBAR_PETBAR_HIDE = "Ocultar barra de mascota"
L_GUI_ACTIONBAR_PETBAR_HORIZONTAL = "Activar barra de mascota horizontal"
L_GUI_ACTIONBAR_PETBAR_MOUSEOVER = "Barra de mascota al pasar el ratón (sólo para la barra de mascota horizontal)"
L_GUI_ACTIONBAR_STANCEBAR_HIDE = "Ocultar cambio de forma"
L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = "Activar barra de estancia horizontal"
L.actionbar_stancebar_horizontal_desc = "Located below the player's frame" -- Needs review
L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = "Barras de Cambios de forma/Estancias al pasar el ratón" -- Needs review
L_GUI_ACTIONBAR_MICROMENU = "Enable micro menu" -- Needs review
L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = "Micro menu on mouseover" -- Needs review
L.actionbar_editor = "Bars editor" -- Needs review
L.actionbar_editor_desc = "Allow to move and change each panel individually" -- Needs review
L.actionbar_bar1_num = "Number of buttons" -- Needs review
L.actionbar_bar1_row = "Buttons per row" -- Needs review
L.actionbar_bar1_mouseover = "Bar on mouseover" -- Needs review
-- Tooltip options
L.tooltip = "Descripciones"
L.tooltip_subtext = "In this block, you can change the standard tips when mouseovering." -- Need review
L.tooltip_enable = "Activar descripciones"
L.tooltip_shift_modifer = "Mostrar descripción mientras Shift está pulsado"
L.tooltip_cursor = "Descripción bajo el cursos"
L.tooltip_item_icon = "Icono del objeto en la descripción"
L.tooltip_health_value = "Valor de la vida en números"
L.tooltip_hidebuttons = "Ocultar descripciones de las barras de acción"
L.tooltip_hide_combat = "Ocultar descripción en combate"
L.tooltip_subheader = "Plugins" -- Need review
L.tooltip_talents = "Mostrar descripción de los talentos"
L.tooltip_show_shift = "Show when Shift is pushed" -- Need review
L.tooltip_show_shift_desc = "Show items level and spec when Shift is pushed" -- Need review
L.tooltip_achievements = "Comparar logros en la descripción"
L.tooltip_target = "Jugador objetivo en la descripción"
L.tooltip_title = "Player title in tooltip" -- Need review
L.tooltip_realm = "Player realm name in tooltip" -- Need review
L.tooltip_rank = "Rango del jugador en la hermandad en la descripción"
L.tooltip_spell_id = "ID del hechizo"
L.tooltip_average_lvl_desc = "The average item level" -- Need review
L.tooltip_raid_icon = "Icono de banda"
L.tooltip_who_targetting = "Muestra quien está marcando la unidad que está en tu grupo/banda"
L.tooltip_item_count = "Contador del objeto"
L.tooltip_unit_role = "Unit role" -- Needs review
L.tooltip_instance_lock = "Your instance lock status in tooltip" -- Needs review
L.tooltip_mount = "Source of mount" -- Needs review
-- Chat options
L.chat_subtext = "Here you can change the settings of the chat window." -- Need review
L.chat_enable = "Activar chat"
L.chat_background = "Activar fondo del chat"
L.chat_background_alpha = "Opacidad del fondo del chat"
L.chat_filter = "Remover ciertos mensajes de spam"
L.chat_filter_desc = "Duels, change talents, NPC dialogue in city" -- Need review
L.chat_spam = "Remover spam del algunos jugadores (Vendedores de oro)"
L.chat_spam_list = "Black list" -- Need review
L.chat_spam_list_desc = "List of words (separated by space, lowercase letters) to hide messages" -- Need review
L.chat_width = "Anchura del chat"
L.chat_height = "Altura del chat"
L.chat_chat_bar = "Pequeña barra de botones para cambiar de canal en el chat"
L.chat_chat_bar_mouseover = "Lite Button Bar on mouseover" -- Needs review
L.chat_whisp_sound = "Sonido cuando te susurran"
L.chat_combatlog = "Mostrar la pestaña del Registro de Combate"
L.chat_tabs_mouseover = "Chat tabs on mouseover" -- Needs review
L.chat_sticky = "Recordar último canal"
L.chat_damage_meter_spam = "Merge damage meter spam in one line-link" -- Needs review
L.chat_loot_icons = "Icons for loot" -- Needs review
L.chat_hide_combat = "Hide chat in combat" -- Needs review
L.chat_custom_time_color = "Enable custom timestamp coloring" -- Needs review
L.chat_time_color = "Color de la marca de tiempo"
-- Nameplate options
L_GUI_NAMEPLATE_SUBTEXT = "Nameplate settings" -- Need review
L_GUI_NAMEPLATE_ENABLE = "Activar placas de nombre"
L_GUI_NAMEPLATE_COMBAT = "Mostrar automáticamente placa de nombre en combate"
L_GUI_NAMEPLATE_HEALTH = "Valor de la vida en números"
L_GUI_NAMEPLATE_HEIGHT = "Altura de la placa de nombre"
L_GUI_NAMEPLATE_WIDTH = "Anchura de la placa de nombre"
L.nameplate_alpha = "Alpha" -- Needs review
L.nameplate_alpha_desc = "Non-target nameplate alpha" -- Needs review
L.nameplate_ad_height = "Additional height" -- Need review
L.nameplate_ad_width = "Additional width" -- Need review
L.nameplate_ad_height_desc = "Additional height for selected nameplate" -- Needs review
L.nameplate_ad_width_desc = "Additional width for selected nameplate" -- Needs review
L_GUI_NAMEPLATE_CASTBAR_NAME = "Mostrar nombre del hechizo en la barra de lanzamiento"
L_GUI_NAMEPLATE_CLASS_ICON = "Iconos de clase en JcJ"
L_GUI_NAMEPLATE_NAME_ABBREV = "Mostrar los nombres abreviados"
L.nameplate_short_name = "Replace names with short ones" -- Need review
L.nameplate_clamp = "Clamp nameplates to the top of the screen when outside of view" -- Need review
L.nameplate_clamp_desc = "Clamp nameplates to the top of the screen when outside of view" -- Need review
L_GUI_NAMEPLATE_SHOW_DEBUFFS = "Mostrar perjuicios (Nombres abreviados debe ser desactivado)"
L_GUI_NAMEPLATE_SHOW_BUFFS = "Show dispellable enemy buffs and buffs from the list" -- Need review
L_GUI_NAMEPLATE_DEBUFFS_SIZE = "Tamaño de los perjuicios" -- Need review
L_GUI_NAMEPLATE_HEALER_ICON = "Show icon above enemy healers nameplate in battlegrounds" -- Needs review
L_GUI_NAMEPLATE_TOTEM_ICONS = "Show icon above enemy totems nameplate" -- Need review
L.nameplate_target_glow = "Show glow texture for target" -- Need review
L.nameplate_only_name = "Show only name for friendly units" -- Need review
L.nameplate_quests = "Show quest icon" -- Need review
L.nameplate_cast_color = "Show color border for casting important spells" -- Need review
L.nameplate_kick_color = "Change cast color if interrupt on cd" -- Need review
L.nameplate_low_health_value = "Health value" -- Need review
L.nameplate_low_health = "Low health highlight" -- Need review
L_GUI_NAMEPLATE_THREAT = "Activar visor de amenaza, cambia automáticamente según tu rol"
L_GUI_NAMEPLATE_GOOD_COLOR = "Color de alta amenaza, varía dependiendo si eres tanque o dps/sanador"
L_GUI_NAMEPLATE_NEAR_COLOR = "Color de perdiendo/ganando amenaza"
L_GUI_NAMEPLATE_BAD_COLOR = "Color de baja amenaza, varía dependiendo si eres tanque o dps/sanador"
L_GUI_NAMEPLATE_OFFTANK_COLOR = "Offtank threat color" -- Need review
L.nameplate_extra_color = "Explosive and Spiteful affix color" -- Need review
L.nameplate_mob_color_enable = "Change color for important mobs in dungeons" -- Need review
L.nameplate_mob_color = "Color for mobs" -- Need review
-- Combat text options
L_GUI_COMBATTEXT = "Texto de Combate"
L_GUI_COMBATTEXT_SUBTEXT = "For moving type in the chat '/xct'" -- Need review
L_GUI_COMBATTEXT_ENABLE = "Activar Texto de Combate"
L.combattext_blizz_head_numbers = "Enable Blizzard combat text" -- Need review
L.combattext_blizz_head_numbers_desc = "Usar la salida de daño/curación de Blizzard (sobre la cabeza del monstruo/jugador)"
L.combattext_damage_style = "Change default combat font" -- Need review
L.combattext_damage_style_desc = "Cambiar la fuente de daño/sanación por defecto de encima de los monstruos/jugadores (tendrás que reiniciar WoW para ver los cambios)"
L_GUI_COMBATTEXT_DAMAGE = "Mostrar daño saliente en su propio marco"
L_GUI_COMBATTEXT_HEALING = "Mostrar sanación saliente en su propio marco"
L.combattext_incoming = "Show incoming damage and healing" -- Need review
L_GUI_COMBATTEXT_HOTS = "Mostrar efectos de cura periódicos en el marco de curas"
L_GUI_COMBATTEXT_OVERHEALING = "Mostrar la sobrecuracion saliente"
L_GUI_COMBATTEXT_PET_DAMAGE = "Mostrar el daño de tu mascota"
L_GUI_COMBATTEXT_DOT_DAMAGE = "Mostrar el daño de tus dots (Daño periodico)"
L_GUI_COMBATTEXT_DAMAGE_COLOR = "Mostrar números de daño dependiendo de la escuela de magia"
L_GUI_COMBATTEXT_CRIT_PREFIX = "Símbolo que se añadirá antes de un crítico"
L_GUI_COMBATTEXT_CRIT_POSTFIX = "Símbolo que se añadirá después de un crítico"
L_GUI_COMBATTEXT_ICONS = "Mostrar iconos de daño saliente"
L_GUI_COMBATTEXT_ICON_SIZE = "Icon size" -- Need review
L_GUI_COMBATTEXT_ICON_SIZE_DESC = "Tamaño de los iconos de los hechizos en el marco de daño saliente, también tiene efecto sobre el tamaño de la fuente de daño"
L_GUI_COMBATTEXT_TRESHOLD = "Daño mínimo que se mostrar en el marco de daño"
L_GUI_COMBATTEXT_HEAL_TRESHOLD = "Sanación mínima que se mostrar en los mensajes de sanación entrante/saliente"
L_GUI_COMBATTEXT_SCROLLABLE = "Permitir usar la rueda del ratón para desplazar las líneas de los marcos"
L_GUI_COMBATTEXT_MAX_LINES = "Max lines" -- Need review
L_GUI_COMBATTEXT_MAX_LINES_DESC = "Máx de líneas para mantener desplazables (a más lineas, más memoria requerida)"
L_GUI_COMBATTEXT_TIME_VISIBLE = "Time" -- Need review
L_GUI_COMBATTEXT_TIME_VISIBLE_DESC = "Tiempo (segundos) en que un mensaje es visible"
L_GUI_COMBATTEXT_DK_RUNES = "Mostrar recarga de runas de los Caballeros de la Muerte"
L_GUI_COMBATTEXT_KILLINGBLOW = "Mostrar tus golpes de gracia"
L.combattext_merge_aoe_spam = "Merges spell spam into single message" -- Needs review
L.combattext_merge_aoe_spam_desc = "Unir el spam de daño de area en un solo mensaje"
L_GUI_COMBATTEXT_MERGE_MELEE = "Merges multiple auto attack damage spam" -- Needs review
L.combattext_merge_all = "Merges all spells" -- Needs review
L_GUI_COMBATTEXT_DISPEL = "Mostrar tus disipaciones"
L_GUI_COMBATTEXT_INTERRUPT = "Mostrar tus interrupciones"
L_GUI_COMBATTEXT_DIRECTION = "Change scrolling direction from bottom to top" -- Need review
L_GUI_COMBATTEXT_SHORT_NUMBERS = "Use short numbers ('25.3k' instead of '25342')" -- Need review
-- Auras/Buffs/Debuffs
L_GUI_AURA_PLAYER_BUFF_SIZE = "Buffs size" -- Need review
L_GUI_AURA_PLAYER_BUFF_SIZE_DESC = "Tamaño de las beneficios del jugador"
L.aura_debuff_size = "Debuffs size" -- Need review
L_GUI_AURA_SHOW_SPIRAL = "Espiral en los iconos de las auras"
L_GUI_AURA_SHOW_TIMER = "Mostrar tiempo de reutilización en los iconos de las auras"
L_GUI_AURA_PLAYER_AURAS = "Auras en el marco del jugador"
L_GUI_AURA_TARGET_AURAS = "Auras en el marco del objetivo"
L_GUI_AURA_FOCUS_DEBUFFS = "Perjuicios en el marco del foco"
L_GUI_AURA_FOT_DEBUFFS = "Perjuicios en el marco del objetivo del foco"
L_GUI_AURA_PET_DEBUFFS = "Perjuicios en el marco de la mascota"
L_GUI_AURA_TOT_DEBUFFS = "Perjuicios en el marco del objetivo del objetivo"
L.aura_subheader_boss = "Beneficios en el marco del jefe" -- Need review
L_GUI_AURA_PLAYER_AURA_ONLY = "Solo tus perjuicios en el marco del objetivo"
L_GUI_AURA_DEBUFF_COLOR_TYPE = "Color de los perjuicios por tipo"
L_GUI_AURA_CAST_BY = "Mostrar quién lanza un beneficio/perjuicio en su descripción"
L_GUI_AURA_CLASSCOLOR_BORDER = "Activar borde por color de clase para los beneficios del jugador"
L.aura_subheader_buffs = "Player buffs" -- Need review
L.aura_subheader_debuffs = "Debuffs" -- Need review
-- Bag options
L_GUI_BAGS = "Bolsas"
L_GUI_BAGS_SUBTEXT = "Right click on the close button to open the menu. To move the bags, hold down Shift - click." -- Need review
L_GUI_BAGS_ENABLE = "Activar bolsas"
L_GUI_BAGS_ILVL = "Show item level for weapons and armor" -- Need review
L.bag_new_items = "Show animation for new items" -- Need review
L.bag_filter = "Always show filter buttons" -- Need review
L_GUI_BAGS_BUTTON_SIZE = "Tamaño de los huecos"
L_GUI_BAGS_BUTTON_SPACE = "Espacio entre huecos"
L_GUI_BAGS_BANK = "Número de columnas en el banco"
L_GUI_BAGS_BAG = "Número de columnas en la bolsa principal"
-- Minimap options
L_GUI_MINIMAP_SUBTEXT = "Minimap settings." -- Need review
L_GUI_MINIMAP_ENABLE = "Activar minimapa"
L.minimap_on_top = "Move minimap on top right corner" -- Need review
L_GUI_MINIMAP_ICON = "Icono de seguimiento"
L_GUI_GARRISON_ICON = "Covenant icon" -- Need review
L_GUI_MINIMAP_SIZE = "Tamaño del minimapa"
L_GUI_MINIMAP_HIDE_COMBAT = "Ocultar minimapa en combate"
L_GUI_MINIMAP_TOGGLE_MENU = "Show toggle menu" -- Needs review
L.minimap_bg_map_stylization = "Estilizado del mapa de CB"
L.minimap_fog_of_war = "Remove fog of war on World Map" -- Needs review
-- Loot options
L_GUI_LOOT_SUBTEXT = "Settings for loot frame." -- Need review
L_GUI_LOOT_ENABLE = "Activar el marco de botín"
L_GUI_LOOT_ROLL_ENABLE = "Activar el marco de botín de grupo"
L_GUI_LOOT_ICON_SIZE = "Tamaño de los iconos"
L_GUI_LOOT_WIDTH = "Anchura del marco de botín"
L_GUI_LOOT_AUTOGREED = "Activar auto-codicia para objetos verdes cuando eres nivel máx"
L_GUI_LOOT_AUTODE = "Auto confirmar desencantar"
L.loot_faster_loot = "Faster looting" -- Need review
L.loot_faster_loot_desc = "Works only if enabled auto loot" -- Need review
-- Filger
L_GUI_FILGER = "Timers (Filger)" -- Need review
L_GUI_FILGER_SUBTEXT = "Filger - analogue WeakAuras, but more simple and easy. Allows you to display in the form of icons and bars your auras and timers." -- Need review
L_GUI_FILGER_ENABLE = "Enable Filger" -- Need review
L_GUI_FILGER_TEST_MODE = "Test icon mode" -- Need review
L_GUI_FILGER_MAX_TEST_ICON = "The number of icons to the test" -- Need review
L_GUI_FILGER_SHOW_TOOLTIP = "Show tooltip" -- Need review
L.filger_subheader_elements = "Showing elements" -- Need review
L.filger_show_buff = "Player buffs" -- Need review
L.filger_show_proc = "Player procs" -- Need review
L.filger_show_debuff = "Debuffs on target" -- Need review
L.filger_show_aura_bar = "Aura bars on target" -- Need review
L.filger_show_special = "Special buffs on player" -- Need review
L.filger_show_pvp_player = "SPvP debuffs on player" -- Need review
L.filger_show_pvp_target = "PvP auras on target" -- Need review
L.filger_show_cd = "Cooldowns" -- Need review
L.filger_subheader_size = "Icons size" -- Need review
L.filger_subheader_test = "Test mode" -- Need review
L_GUI_FILGER_EXPIRATION = "Sort cooldowns by expiration time" -- Need review
L_GUI_FILGER_BUFFS_SIZE = "Buffs size" -- Need review
L_GUI_FILGER_COOLDOWN_SIZE = "Cooldowns size" -- Need review
L_GUI_FILGER_PVP_SIZE = "PvP debuffs size" -- Need review
L.filger_buffs_space = "Buffs space" -- Need review
L.filger_pvp_space = "PvP auras space" -- Need review
L.filger_cooldown_space = "Cooldowns space" -- Need review
L.filger_subheader_spells = "Adding new spells" -- Need review
L.filger_category_list = "Spell list category" -- Need review
-- Announcements options
L_GUI_ANNOUNCEMENTS = "Anuncios"
L_GUI_ANNOUNCEMENTS_SUBTEXT = "Settings that add chat announcements about spells or items." -- Need review
L.announcements_drinking = "Anunciar en el chat cuando un enemigo en la arena beba"
L.announcements_interrupts = "Interrupts" -- Need review
L.announcements_interrupts_desc = "Anunciar en el grupo/banda cuando interrumpes"
L.announcements_spells = "Cast spells" -- Needs review
L.announcements_spells_desc = "Anunciar en grupo/banda cuando lanzas el mismo hechizo que otro"
L.announcements_spells_from_all = "From all members" -- Needs review
L.announcements_spells_from_all_desc = "Comprueba los lanzamientos de hechizo de todos los miembros"
L.announcements_toys = "Cast some annoying toys" -- Needs review
L.announcements_pull_countdown = "Pull countdown" -- Needs review
L.announcements_pull_countdown_desc = "Pull countdown announce (/pc #)" -- Needs review
L.announcements_flask_food = "Usage of flasks and food" -- Needs review
L.announcements_flask_food_desc = "Announce the usage of flasks and food (/ffcheck)" -- Needs review
L.announcements_flask_food_raid = "Announce to raid channel" -- Needs review
L.announcements_flask_food_auto = "Auto check when ReadyCheck" -- Needs review
L.announcements_feasts = "Feasts/Souls/Repair Bots" -- Needs review
L.announcements_portals = "Portals/Ritual of Summoning" -- Needs review
L.announcements_subheader_self = "Self announce" -- Needs review
L.announcements_bad_gear = "Check your bad gear" -- Need review
L.announcements_bad_gear_desc = "Check your bad gear in instance (fishing pole, from the list)" -- Needs review
L.announcements_safari_hat = "Safari Hat" -- Needs review
L.announcements_safari_hat_desc = "Check Safari Hat when starting Pet Battle" -- Needs review
-- Automation options
L_GUI_AUTOMATION = "Automation" -- Needs review
L_GUI_AUTOMATION_SUBTEXT = "This block contains settings that facilitate the routine." -- Need review
L.automation_release = "Auto resurrección en los Campos de Batalla" -- Need review
L.automation_screenshot = "Tomar una captura de pantalla cuando consigas un logro"
L.automation_solve_artifact = "Auto popup for solve artifact" -- Needs review
L.automation_solve_artifact_desc = "If there are enough fragments for an artifact, a popup will appear to solve it." -- Need review
L.automation_accept_invite = "Auto aceptar invitaciones"
L.automation_decline_duel = "Auto rechazar duelos"
L.automation_accept_quest = "Auto aceptar misiones"
L.automation_auto_collapse = "Auto collapse Objective Tracker" -- Need review
L.automation_auto_collapse_raid = "In Instance" -- Need review
L.automation_auto_collapse_reload = "After reload" -- Need review
L.automation_auto_collapse_scenario = "Partially" -- Need review
L.automation_skip_cinematic = "Auto skip cinematics/movies (disabled if hold Ctrl)" -- Needs review
L.automation_auto_role = "Auto set your role" -- Needs review
L.automation_cancel_bad_buffs = "Auto cancel annoying holiday buffs (from the list)" -- Needs review
L.automation_tab_binder = "Auto change 'Tab' key binding in PvP" -- Needs review
L.automation_tab_binder_desc = "'Tab' key target only enemy players when in PvP zones, ignores pets and mobs" -- Need review
L.automation_logging_combat = "Auto enables combat log text file in raid instances" -- Needs review
L.automation_buff_on_scroll = "Cast buff on mouse scroll (from the list)" -- Needs review
L.automation_buff_on_scroll_desc = "If the buff from the list is not applied to the player, it will cast by the mouse scroll" -- Need review
L.automation_open_items = "Auto opening of items in bag" -- Needs review
L.automation_resurrection = "Confirm resurrection" -- Needs review
L.automation_summon = "Confirm summon" -- Needs review
L.automation_whisper_invite = "Auto invite when whisper keyword" -- Needs review
L.automation_invite_keyword = "List of keyword (separated by space)" -- Needs review
L.automation_invite_keyword_desc = "When player whisper you keyword he will be invited in your group" -- Needs review
-- Buffs reminder options
L_GUI_REMINDER = "Recordatorio de Ventajas"
L_GUI_REMINDER_SUBTEXT = "Display of missed auras." -- Need review
L_GUI_REMINDER_SOLO_ENABLE = "Mostrar ventajas propias que faltan"
L_GUI_REMINDER_SOLO_SOUND = "Alerta sonora para avisar de ventajas propias"
L_GUI_REMINDER_SOLO_SIZE = "Icon size" -- Need review
L_GUI_REMINDER_SOLO_SIZE_DESC = "Tamaño de los iconos de las ventajas propias"
L_GUI_REMINDER_SUBHEADER = "Raid buffs" -- Need review
L_GUI_REMINDER_RAID_ENABLE = "Mostrar ventajas que faltan en la Banda"
L_GUI_REMINDER_RAID_ALWAYS = "Mostrar Recordatorio de Ventajas siempre"
L_GUI_REMINDER_RAID_SIZE = "Icon size" -- Need review
L_GUI_REMINDER_RAID_SIZE_DESC = "Tamaño de los iconos de las ventajas de la Banda"
L_GUI_REMINDER_RAID_ALPHA = "Transparent" -- Need review
L_GUI_REMINDER_RAID_ALPHA_DESC = "Icono transparente cuando la ventaja está presente"
-- Raid cooldowns options
L_GUI_COOLDOWN_RAID = "Tiempos de reutilización de la Banda"
L_GUI_COOLDOWN_RAID_SUBTEXT = "Tracking raid abilities in the upper left corner." -- Need review
L_GUI_COOLDOWN_RAID_ENABLE = "Mostrar tiempos de reutilización de la Banda"
L_GUI_COOLDOWN_RAID_HEIGHT = "Bars height" -- Need review
L_GUI_COOLDOWN_RAID_WIDTH = "Bars width" -- Need review
L_GUI_COOLDOWN_RAID_SORT = "Barras de tiempos de reutilización de la Banda ordenadas hacia arriba"
L_GUI_COOLDOWN_RAID_EXPIRATION = "Sort by expiration time" -- Needs review
L_GUI_COOLDOWN_RAID_SHOW_SELF = "Show self cooldowns" -- Needs review
L_GUI_COOLDOWN_RAID_ICONS = "Iconos de tiempos de reutilización de la Banda"
L_GUI_COOLDOWN_RAID_IN_RAID = "Mostrar tiempos de reutilización de la Banda en zona de Banda"
L_GUI_COOLDOWN_RAID_IN_PARTY = "Mostrar tiempos de reutilización de la Banda en zona de Grupo"
L_GUI_COOLDOWN_RAID_IN_ARENA = "Mostrar tiempos de reutilización de la Banda en zona de Arena"
-- Enemy cooldowns options
L_GUI_COOLDOWN_ENEMY = "Tiempos de reutilización del enemigo"
L_GUI_COOLDOWN_ENEMY_SUBTEXT = "Tracking enemy abilities as icons above your spell casting bar." -- Need review
L_GUI_COOLDOWN_ENEMY_ENABLE = "Activar tiempos de reutilización del enemigo"
L_GUI_COOLDOWN_ENEMY_SIZE = "Tamaño del icono de tiempos de reutilización del enemigo"
L_GUI_COOLDOWN_ENEMY_DIRECTION = "Icono de dirección de tiempos de reutilización del enemigo"
L_GUI_COOLDOWN_ENEMY_EVERYWHERE = "Mostrar tiempos de reutilización del enemigo siempre"
L_GUI_COOLDOWN_ENEMY_IN_BG = "Mostrar tiempos de reutilización del enemigo en zona de CB"
L_GUI_COOLDOWN_ENEMY_IN_ARENA = "Mostrar tiempos de reutilización del enemigo en zona de Arena"
L.enemycooldown_show_inparty = "Show in party zone for allies" -- Need review
L.enemycooldown_class_color = "Enable classcolor border" -- Need review
-- Pulse cooldowns options
L_GUI_COOLDOWN_PULSE = "Cuenta atrás de tiempos de reutilización"
L_GUI_COOLDOWN_PULSE_SUBTEXT = "Track your cd using a pulse icon in the center of the screen." -- Need review
L_GUI_COOLDOWN_PULSE_ENABLE = "Mostrar cuentas atrás de tiempos de reutilización"
L_GUI_COOLDOWN_PULSE_SIZE = "Tamaño de los icono de las cuentas atras de tiempos de reutilización"
L_GUI_COOLDOWN_PULSE_SOUND = "Aviso sonoro"
L_GUI_COOLDOWN_PULSE_ANIM_SCALE = "Escalado animado"
L_GUI_COOLDOWN_PULSE_HOLD_TIME = "Opacidad máxima del tiempo de espera"
L_GUI_COOLDOWN_PULSE_THRESHOLD = "Threshold time" -- Need review
L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = "Umbral de tiempo mínimo"
-- Threat options
L_GUI_THREAT = "Barras de Amenaza"
L_GUI_THREAT_SUBTEXT = "Display of the threat list (a simple analogue of Omen)." -- Need review
L_GUI_THREAT_ENABLE = "Activar Barras de Amenaza"
L_GUI_THREAT_HEIGHT = "Altura de las barras de amenaza"
L_GUI_THREAT_WIDTH = "Anchura de las barras de amenaza"
L_GUI_THREAT_ROWS = "Número de barras de amenaza"
L_GUI_THREAT_HIDE_SOLO = "Mostrar solo en grupo/raid"
-- Top panel options
L_GUI_TOP_PANEL = "Panel superior"
L_GUI_TOP_PANEL_SUBTEXT = "Manage built-in top panel with information." -- Need review
L_GUI_TOP_PANEL_ENABLE = "Activar panel superior"
L_GUI_TOP_PANEL_MOUSE = "Panel superior al pasar el ratón"
L_GUI_TOP_PANEL_WIDTH = "Anchura del panel"
L_GUI_TOP_PANEL_HEIGHT = "Altura del panel"
-- Stats options
L_GUI_STATS = "Estadísticas"
L_GUI_STATS_SUBTEXT = "Statistics blocks located at the bottom of the screen. Type in the chat '/ls' for info." -- Need review
L_GUI_STATS_CLOCK = "Reloj"
L_GUI_STATS_LATENCY = "Latencia"
L_GUI_STATS_FPS = "FPS (Marcos por segundo)"
L_GUI_STATS_EXPERIENCE = "Experiencia"
L_GUI_STATS_TALENTS_DESC = "Date-text allows you to change the spec and loot on click" -- Need review
L_GUI_STATS_COORDS = "Coordenadas"
L_GUI_STATS_LOCATION = "Localización"
L_GUI_STATS_BG = "Campo de Batalla"
L.stats_bottom_line = "Bottom classcolor line" -- Need review
L_GUI_STATS_SUBHEADER_CURRENCY = "Currency (displayed in gold data text)" -- Need review
L_GUI_STATS_CURRENCY_ARCHAEOLOGY = "Show Archaeology Fragments" -- Needs review
L_GUI_STATS_CURRENCY_COOKING = "Show Cooking Awards" -- Needs review
L_GUI_STATS_CURRENCY_RAID = "Show Raid Seals" -- Needs review
-- Trade options
L_GUI_TRADE = "Trade" -- Need review
L_GUI_TRADE_SUBTEXT = "Settings related to professions and trade" -- Need review
L.trade_profession_tabs = "Professions tabs" -- Need review
L.trade_profession_tabs_desc = "Pestanas de profesiones de artesania y marcos de comercio"
L.trade_already_known = "Colorizes already known items" -- Need review
L.trade_already_known_desc = "Colorizes recipes/mounts/pets/toys that is already known" -- Needs review
L.trade_disenchanting = "Quick Disenchanting" -- Need review
L.trade_disenchanting_desc = "Milling, Prospecting and Disenchanting by Alt + click" -- Needs review
L.trade_sum_buyouts = "Sum up all current auctions" -- Needs review
L.trade_sum_buyouts_desc = "At auctions tab shows sum up all current auctions" -- Need review
L.trade_enchantment_scroll = "Enchantment scroll on TradeSkill frame" -- Needs review
L.trade_archaeology = "Archaeology tracker" -- Needs review
L.trade_archaeology_desc = "Archaeology tracker ('/arch' or right mouseover minimap button to show)" -- Need review
L.trade_merchant_itemlevel = "Item level in merchant" -- Need review
L.trade_merchant_itemlevel_desc = "Show item level for weapons and armor in merchant" -- Need review
-- Miscellaneous options
L_GUI_MISC_SUBTEXT = "Other settings that add interesting features." -- Need review
L.misc_shift_marking = "Marks mouseover target" -- Need review
L.misc_shift_marking_desc = "Marks mouseover target when you push Shift (only in group)" -- Need review
L.misc_afk_spin_camera = "Rotar cámara mientras estás ausente"
L.misc_quest_auto_button = "Quest items auto button" -- Need review
L.misc_quest_auto_button_desc = "Auto botón misión/objeto" -- Need review
L.misc_raid_tools = "Herramientas de Raid"
L.misc_raid_tools_desc = "Button at the top of the screen for ready check (Left-click), checking roles (Middle-click), setting marks, etc. (for leader and assistants)" -- Need review
L.misc_item_level = "Item level on slot buttons" -- Need review
L.misc_item_level_desc = "Item level on character slot buttons" -- Needs review
L.misc_click_cast = "Simple click2cast spell binder" -- Needs review
L.misc_click_cast_desc = "Allows you to assign spells (analog Clique) to the mouse buttons. Setup through the side bookmark in the spell book" -- Need review
L.misc_click_cast_filter = "Ignore Player and Target frames for click2cast" -- Needs review
L.misc_chars_currency = "Tracks your currency tokens across multiple characters" -- Needs review
L.misc_chars_currency_desc = "Hover over the icon of the required currency in the character window to display information in the tooltip" -- Need review
L.misc_hide_raid_button = "Button to hide raid frames in dps layout" -- Need review
L.misc_hide_raid_button_desc = "The button is displayed by hovering the mouse in the upper left corner" -- Need review
================================================
FILE: ShestakUI_Config/Locales/Taiwan.lua
================================================
local _, L = ...
if GetLocale() ~= "zhTW" then return end
----------------------------------------------------------------------------------------
-- Localization for zhTW client
-- Translation: Leg883, Mania, Tat2dawn, Tibles, Sakaras, Joe
----------------------------------------------------------------------------------------
L_GUI_SET_SAVED_SETTTINGS = "角色專用設定"
L_GUI_SET_SAVED_SETTTINGS_DESC = "在 一般設定 與 角色專用設定 之間切換。"
L_GUI_RESET_CHAR = "確定要重置你所有角色的 ShestakUI 設定?"
L_GUI_RESET_ALL = "確定要重置全部 ShestakUI 到預設值?"
L_GUI_PER_CHAR = "確定要設定/取消 角色專用設定 模式?"
L_GUI_RESET_CAT = "確定要重置當前分類到預設值?"
L_GUI_RESET_CAT_DESC = "左鍵重置當前分類到預設值。\nCTRL+左鍵重置全部到預設值。"
L_GUI_NEED_RELOAD = "請點擊套用以重載當前改動。"
L_GUI_LAYOUT = "佈局切換"
L_GUI_SPELL_LIST = "法術列表"
L_GUI_SPELL_INPUT = "法術ID"
L_GUI_TIME_INPUT = "時間"
L_GUI_EXPERT_MODE = "專家模式"
L_GUI_EXPERT_MODE_DESC = "編寫你的插件代碼"
L_GUI_RESET_SPELLS_DESC = "Ctrl+左鍵重置列表"
-- Profile
L.profile = "Profile" -- Need review
L.profile_title = "Profile options" -- Need review
L.profile_choose = "Choose profile" -- Need review
L.profile_options = "Settings" -- Need review
L.profile_movers = "Moving elements" -- Need review
L.profile_export = "Export" -- Need review
L.profile_import = "Import" -- Need review
L.profile_error_lib = "To enable export and import - install WeakAuras" -- Need review
L.profile_error_code = "Error in imported code!" -- Need review
-- General options
L_GUI_GENERAL_SUBTEXT = "一般用戶界面設置,鍵入 /uihelp 獲取更多可用命令。"
L_GUI_GENERAL_WELCOME_MESSAGE = "歡迎信息"
L_GUI_GENERAL_AUTOSCALE = "自動UI縮放"
L_GUI_GENERAL_UISCALE = "自定義UI縮放"
L.general_subheader_blizzard = "暴雪插件"
L.general_error_filter = "紅字錯誤過濾"
L.general_error_blacklist = "黑名單"
L.general_error_whitelist = "白名單"
L.general_error_combat = "戰鬥中"
L.general_error_none = "不過濾"
L.general_vehicle_mouseover = "駕駛框架解鎖"
L.general_move_blizzard = "移動暴雪界面框架"
L.general_color_picker = "改進型顏色選擇器"
L.general_color_picker_desc = "增加按鈕:複製/貼上/職業 輸入框:RGB/色值/透明度"
L.general_minimize_mouseover = "任務欄最小化按鈕滑鼠懸停顯示"
L.general_hide_banner = "自動隱藏Boss額外拾取提示"
L.general_hide_talking_head = "自動隱藏任務對話框"
L.general_hide_maw_buffs = "隱藏靈魄能力框架"
-- Media options
L.media_border_color = "背景顏色"
L.media_classborder_color = "邊框按職業著色"
L.media_backdrop_color = "邊框背景顏色"
L.media_backdrop_alpha = "透明背景"
L.media_texture = "主要材質"
L.media_subheader_normal = "通用字體"
L.media_subheader_pixel = "像素字體"
-- Font options
L.font = "字體設置"
L.font_subtext = "自定義字體格式"
L.font_stats_font = "字體"
L.font_stats_font_style = "描邊"
L.font_stats_font_shadow = "陰影"
L.font_subheader_stats = "信息條"
L.font_subheader_combat = "戰鬥資訊(xCT)"
L.font_subheader_chat = "聊天信息"
L.font_subheader_chat_tabs = "聊天頻道標籤"
L.font_subheader_action = "快捷列"
L.font_subheader_threat = "仇恨條"
L.font_subheader_raidcd = "團隊冷卻"
L.font_subheader_cooldown = "冷卻時間"
L.font_subheader_loot = "拾取框"
L.font_subheader_nameplates = "單位名條"
L.font_subheader_unit = "單位框架"
L.font_subheader_aura = "增益減益"
L.font_subheader_filger = "法術監視(Filger)"
L.font_subheader_style = "界面美化"
L.font_subheader_bag = "背包"
L.font_subheader_blizzard = "系統"
L.font_tooltip_header_font_size = "滑鼠提示標題"
L.font_tooltip_font_size = "滑鼠提示信息"
L.font_global_font = "禁用像素字體"
-- Skins options
L_GUI_SKINS = "界面美化"
L_GUI_SKINS_SUBTEXT = "對遊戲默認界面和單體插件界面進行美化"
L_GUI_SKINS_BLIZZARD = "美化暴雪默認界面"
L_GUI_SKINS_MINIMAP_BUTTONS = "小地圖插件圖標"
L_GUI_SKINS_SUBHEADER = "單體插件"
L.skins_minimap_buttons_mouseover = "滑鼠懸停顯示"
L.skins_bubbles = "美化聊天泡泡"
-- Unit Frames options
L_GUI_UF_SUBTEXT = "定制玩家/目標框架/其他框架"
L_GUI_UF_ENABLE = "單位框架增強"
L_GUI_UF_OWN_COLOR = "自定義顏色"
L_GUI_UF_UF_COLOR = "生命條顏色"
L.unitframe_uf_color_bg = "背景顏色"
L.unitframe_enemy_health_color = "敵對目標生命條以紅色著色"
L_GUI_UF_TOTAL_VALUE = "玩家/目標框架顯示詳細的文字變化"
L_GUI_UF_COLOR_VALUE = "生命值/魔法值按職業著色"
L_GUI_UF_BAR_COLOR_VALUE = "生命值按剩餘血量著色"
L_GUI_UF_LINES = "玩家/目標框架顯示劃線"
L_GUI_UF_SUBHEADER_CAST = "施法條"
L_GUI_UF_UNIT_CASTBAR = "施法條增強"
L_GUI_UF_CASTBAR_ICON = "法術圖標"
L_GUI_UF_CASTBAR_LATENCY = "施法延遲"
L_GUI_UF_CASTBAR_TICKS = "施法跳數"
L_GUI_UF_SUBHEADER_FRAMES = "其他框架"
L_GUI_UF_SHOW_PET = "寵物框架"
L_GUI_UF_SHOW_FOCUS = "焦點框架"
L_GUI_UF_SHOW_TOT = "目標的目標框架"
L_GUI_UF_SHOW_BOSS = "Boss框架"
L_GUI_UF_BOSS_RIGHT = "右側顯示Boss框架"
L_GUI_UF_SHOW_ARENA = "競技場框架"
L_GUI_UF_ARENA_RIGHT = "右側顯示競技場框架"
L_GUI_UF_BOSS_DEBUFFS = "DeBuff數量"
L_GUI_UF_BOSS_DEBUFFS_DESC = "Boss框架DeBuff數量"
L_GUI_UF_BOSS_BUFFS = "Buff數量"
L_GUI_UF_BOSS_BUFFS_DESC = "Boss框架Buff數量"
L.unitframe_icons_pvp = "PvP狀態"
L.unitframe_icons_pvp_desc = "PvP狀態(滑鼠懸停顯示)"
L_GUI_UF_ICONS_COMBAT = "戰鬥標記"
L_GUI_UF_ICONS_RESTING = "休息標記"
L_GUI_UF_SUBHEADER_PORTRAIT = "3D頭像"
L_GUI_UF_PORTRAIT_ENABLE = "玩家/目標頭像"
L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER = "頭像邊框按職業著色"
L.unitframe_portrait_type = "頭像類型"
L.unitframe_portrait_type_icons = "職業圖標"
L.unitframe_portrait_type_overlay = "生命條顯示"
L_GUI_UF_PORTRAIT_HEIGHT = "頭像高度"
L_GUI_UF_PORTRAIT_WIDTH = "頭像寬度"
L_GUI_UF_SUBHEADER_PLUGINS = "輔助功能"
L_GUI_UF_PLUGINS_GCD = "公共CD計時條"
L_GUI_UF_PLUGINS_SWING = "普通攻擊計時條"
L.unitframe_plugins_reputation_bar = "聲望條"
L.unitframe_plugins_reputation_bar_desc = "在玩家框架左側滑鼠懸停顯示,中鍵鎖定顯示。"
L.unitframe_plugins_experience_bar = "經驗條"
L.unitframe_plugins_experience_bar_desc = "在玩家框架左側滑鼠懸停顯示,中鍵鎖定顯示。"
L_GUI_UF_PLUGINS_SMOOTH_BAR = "平滑條"
L_GUI_UF_PLUGINS_ENEMY_SPEC = "敵對玩家天賦"
L_GUI_UF_PLUGINS_COMBAT_FEEDBACK = "玩家/目標框架顯示戰鬥文字"
L_GUI_UF_PLUGINS_FADER = "自動隱藏玩家框架"
L_GUI_UF_PLUGINS_DIMINISHING = "競技場框架顯示技能遞減"
L_GUI_UF_PLUGINS_POWER_PREDICTION = "即將獲得的資源"
L.unitframe_plugins_absorbs = "吸收量"
L.unitframe_subheader_player_width = "玩家/目標框架大小"
L.unitframe_player_width = "寬度"
L.unitframe_subheader_boss_width = "Boss框架與競技場框架大小"
L.unitframe_extra_height_auto = "血量/能量框架自動增高"
L.unitframe_extra_height_auto_desc = "按字體大小智能調節框架高度"
L.unitframe_extra_health_height = "血量框架額外增高"
L.unitframe_extra_power_height = "能量框架額外增高"
L.unitframe_subheader_castbar = "玩家/目標施法條大小"
L.unitframe_castbar_height = "高度"
-- Unit Frames Class bar options
L_GUI_UF_PLUGINS_CLASS_BAR = "職業資源欄"
L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT = "顯示職業的特殊資源"
L_GUI_UF_PLUGINS_COMBO_BAR = "連擊點"
L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS = "總是顯示德魯伊連擊點"
L_GUI_UF_PLUGINS_COMBO_BAR_OLD = "目標框架顯示連擊點"
L_GUI_UF_PLUGINS_ARCANE_BAR = "秘法充能"
L_GUI_UF_PLUGINS_CHI_BAR = "真氣"
L_GUI_UF_PLUGINS_STAGGER_BAR = "醉拳池(酒仙武僧)"
L_GUI_UF_PLUGINS_HOLY_BAR = "聖光能量"
L_GUI_UF_PLUGINS_SHARD_BAR = "靈魂碎片"
L_GUI_UF_PLUGINS_RUNE_BAR = "符文"
L_GUI_UF_PLUGINS_TOTEM_BAR = "圖騰"
L.unitframe_class_bar_totem_other = "其他職業圖騰"
L.unitframe_class_bar_essence = "Enable Essence bar for Evoker" -- Need review
-- Raid Frames options
L_GUI_UF_RAIDFRAMES_SUBTEXT = "定制隊伍/團隊框架"
L_GUI_UF_BY_ROLE = "按職責排序"
L_GUI_UF_AGGRO_BORDER = "邊框按仇恨值著色"
L_GUI_UF_DEFICIT_HEALTH = "團隊生命值虧減模式"
L_GUI_UF_SHOW_PARTY = "隊伍框架"
L_GUI_UF_SHOW_RAID = "團隊框架"
L.raidframe_layout = "團隊佈局"
L.raidframe_heal_layout = "治療"
L.raidframe_dps_layout = "輸出"
L.raidframe_auto_layout = "自動"
L.raidframe_show_target = "目標框架"
L.raidframe_show_pet = "寵物框架"
L.raidframe_vertical_health = "垂直顯示團隊框架生命值"
L.raidframe_vertical_health_desc = "僅限治療佈局中生效"
L_GUI_UF_ALPHA_HEALTH = "滿血時淡化單位框架"
L_GUI_UF_SHOW_RANGE = "單位框架按距離變化設定透明度"
L_GUI_UF_RANGE_ALPHA = "透明度"
L_GUI_UF_RANGE_ALPHA_DESC = "單位框架超出距離的透明度"
L_GUI_UF_SUBHEADER_RAIDFRAMES = "其他框架"
L_GUI_UF_SOLO_MODE = "總是顯示玩家框架"
L_GUI_UF_PLAYER_PARTY = "隊伍中顯示玩家框架"
L_GUI_UF_SHOW_TANK = "團隊主坦克框架"
L_GUI_UF_SHOW_TANK_TT = "坦克目標的目標"
L_GUI_UF_RAID_GROUP = "小隊數目"
L.raidframe_party_vertical = "竪向排列隊伍"
L.raidframe_raid_groups_vertical = "竪向排列團隊隊伍"
L.raidframe_raid_groups_vertical_desc = "僅限治療佈局中生效"
L_GUI_UF_SUBHEADER_ICONS = "標記"
L_GUI_UF_ICONS_ROLE = "角色類型標記"
L_GUI_UF_ICONS_RAID_MARK = "團隊標記"
L_GUI_UF_ICONS_READY_CHECK = "就緒確認標記"
L_GUI_UF_ICONS_LEADER = "隊長/助手標記"
L_GUI_UF_ICONS_SUMON = "召喚標記"
L.raidframe_icons_phase = "相位標記"
L.raidframe_plugins_debuffhighlight_icon = "高亮DeBuff圖標"
L.raidframe_plugins_aura_watch = "團隊法術監視"
L.raidframe_plugins_aura_watch_timer = "團隊減益時間"
L.raidframe_plugins_pvp_debuffs = "PvP DeBuff圖標"
L_GUI_UF_PLUGINS_HEALCOMM = "即將受到的治療"
L.raidframe_plugins_over_absorb = "顯示吸收條"
L.raidframe_plugins_over_heal_absorb = "顯示過量治療吸收條"
L.raidframe_plugins_auto_resurrection = "中鍵施放復活技能"
L.raidframe_plugins_auto_resurrection_desc = "滑鼠中鍵點擊已死亡角色時施放復活技能(Clique啟用時無效)"
L.raidframe_hide_health_value = "隱藏血量"
L.raidframe_auto_position = "玩家/目標框架自動定位"
L.raidframe_auto_position_desc = "動態: 當小隊數目大於5,框架位置按小隊數目調整\n僅限治療佈局非竪向排列時生效"
L.raidframe_auto_position_dynamic = "動態"
L.raidframe_auto_position_static = "靜態"
L.raidframe_subheader_heal_size = "治療佈局框架大小"
L.raidframe_heal_width = "框架寬度"
L.raidframe_heal_height = "框架高度"
L.raidframe_heal_power_height = "能量框架高度"
L.raidframe_subheader_dps_size = "輸出佈局框架大小"
L.raidframe_dps_party_width = "隊伍框架寬度"
L.raidframe_dps_party_height = "隊伍框架高度"
L.raidframe_dps_raid_width = "框架寬度"
L.raidframe_dps_raid_height = "框架高度"
L.raidframe_dps_party_power_height = "隊伍能量框架高度"
L.raidframe_dps_raid_power_height = "能量框架高度"
-- ActionBar options
L_GUI_ACTIONBAR = "快捷列"
L_GUI_ACTIONBAR_ENABLE = "快捷列增強"
L_GUI_ACTIONBAR_HOTKEY = "按鍵鍵名"
L_GUI_ACTIONBAR_MACRO = "巨集名稱"
L_GUI_ACTIONBAR_GRID = "快捷列顯示空白快捷鍵"
L_GUI_ACTIONBAR_BUTTON_SIZE = "快捷鍵大小"
L_GUI_ACTIONBAR_BUTTON_SPACE = "快捷鍵間隔"
L_GUI_ACTIONBAR_SPLIT_BARS = "#5快捷列分段(2*6; 該選項開啟後將激活所有快捷列)"
L_GUI_ACTIONBAR_CLASSCOLOR_BORDER = "快捷列邊框按職業著色"
L.actionbar_toggle_mode = "自由折疊"
L.actionbar_toggle_mode_desc = "可隨時調節快捷列顯示數目。按鈕位於底部快捷列上方及右側快捷列下方,滑鼠懸停顯示。"
L_GUI_ACTIONBAR_HIDE_HIGHLIGHT = "關閉快捷列技能特效高亮"
L_GUI_ACTIONBAR_BOTTOMBARS = "底部快捷列數目"
L_GUI_ACTIONBAR_RIGHTBARS = "右側快捷列數目"
L.actionbar_bottombars_mouseover = "底部快捷列滑鼠懸停顯示"
L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER = "右側快捷列滑鼠懸停顯示"
L_GUI_ACTIONBAR_PETBAR_HIDE = "隱藏寵物快捷列"
L_GUI_ACTIONBAR_PETBAR_HORIZONTAL = "寵物快捷列橫向排列"
L_GUI_ACTIONBAR_PETBAR_MOUSEOVER = "滑鼠懸停顯示"
L_GUI_ACTIONBAR_STANCEBAR_HIDE = "隱藏變身/姿態快捷列"
L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL = "變身/姿態快捷列橫向排列"
L.actionbar_stancebar_horizontal_desc = "位於玩家框架下方"
L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER = "滑鼠懸停顯示"
L_GUI_ACTIONBAR_MICROMENU = "微型菜單"
L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER = "滑鼠懸停顯示"
L.actionbar_editor = "快捷列佈局"
L.actionbar_editor_desc = "允許快捷列獨立移動和更改"
L.actionbar_bar1_num = "快捷鍵數"
L.actionbar_bar1_row = "每行快捷鍵數"
L.actionbar_bar1_mouseover = "滑鼠懸停顯示"
-- Tooltip options
L.tooltip = "滑鼠提示"
L.tooltip_subtext = "設置滑鼠提示"
L.tooltip_enable = "滑鼠提示增強"
L.tooltip_shift_modifer = "按下Shift時顯示提示"
L.tooltip_cursor = "提示跟隨滑鼠"
L.tooltip_item_icon = "物品圖標"
L.tooltip_health_value = "生命值以百分比顯示"
L.tooltip_hidebuttons = "隱藏快捷列提示"
L.tooltip_hide_combat = "戰鬥中隱藏提示"
L.tooltip_subheader = "輔助功能"
L.tooltip_talents = "天賦"
L.tooltip_show_shift = "按下Shift時顯示"
L.tooltip_show_shift_desc = "按下Shift時顯示天賦/平均裝等"
L.tooltip_achievements = "成就比較"
L.tooltip_target = "目標的目標"
L.tooltip_title = "頭銜"
L.tooltip_realm = "伺服器"
L.tooltip_rank = "公會階級"
L.tooltip_spell_id = "法術ID"
L.tooltip_average_lvl_desc = "平均裝等"
L.tooltip_raid_icon = "團隊標記"
L.tooltip_who_targetting = "關注成員(在隊伍/團隊中誰以目標為目標)"
L.tooltip_item_count = "物品的簡易統計"
L.tooltip_unit_role = "角色類型"
L.tooltip_instance_lock = "副本進度比較"
L.tooltip_mount = "坐騎來源"
-- Chat options
L.chat_subtext = "這裡可以設置你的聊天框"
L.chat_enable = "聊天框增強"
L.chat_background = "聊天框背景"
L.chat_background_alpha = "聊天框背景透明度"
L.chat_filter = "屏蔽無用系統信息"
L.chat_filter_desc = "決鬥, 切換專精, 城中NPC對話"
L.chat_spam = "屏蔽玩家垃圾信息"
L.chat_spam_list = "過濾詞列表"
L.chat_spam_list_desc = "添加過濾詞(中文詞用空格分隔,英文詞用小寫分隔)"
L.chat_width = "聊天框寬度"
L.chat_height = "聊天框高度"
L.chat_chat_bar = "聊天頻道快捷鍵"
L.chat_chat_bar_mouseover = "滑鼠懸停顯示聊天頻道快捷鍵"
L.chat_whisp_sound = "接受密語時聲音提示"
L.chat_combatlog = "戰鬥記錄標籤"
L.chat_tabs_mouseover = "滑鼠懸停顯示頻道標籤"
L.chat_sticky = "記住上一次使用的頻道"
L.chat_damage_meter_spam = "在鏈接中合併垃圾郵件"
L.chat_loot_icons = "拾取信息帶圖標"
L.chat_hide_combat = "戰鬥中隱藏"
L.chat_custom_time_color = "自定義時間標籤顏色"
L.chat_time_color = "時間標籤顏色"
-- Nameplate options
L_GUI_NAMEPLATE_SUBTEXT = "單位名條設置"
L_GUI_NAMEPLATE_ENABLE = "單位名條增強"
L_GUI_NAMEPLATE_COMBAT = "戰鬥中自動顯示單位名條"
L_GUI_NAMEPLATE_HEALTH = "生命值以百分比顯示"
L_GUI_NAMEPLATE_HEIGHT = "高度"
L_GUI_NAMEPLATE_WIDTH = "寬度"
L.nameplate_alpha = "透明度"
L.nameplate_alpha_desc = "非當前目標的單位名條透明度"
L.nameplate_ad_height = "額外高度"
L.nameplate_ad_width = "額外寬度"
L.nameplate_ad_height_desc = "目標的單位名條額外高度"
L.nameplate_ad_width_desc = "目標的單位名條額外寬度"
L_GUI_NAMEPLATE_CASTBAR_NAME = "法術名稱"
L_GUI_NAMEPLATE_CLASS_ICON = "PvP時顯示職業圖標"
L_GUI_NAMEPLATE_NAME_ABBREV = "名字縮寫"
L.nameplate_short_name = "替換名稱"
L.nameplate_clamp = "貼邊顯示"
L.nameplate_clamp_desc = "當單位名條超出屏幕時仍貼邊顯示"
L_GUI_NAMEPLATE_SHOW_DEBUFFS = "顯示DeBuff(需要關閉名字縮寫)"
L_GUI_NAMEPLATE_SHOW_BUFFS = "顯示可進攻駆散"
L_GUI_NAMEPLATE_DEBUFFS_SIZE = "圖標大小"
L_GUI_NAMEPLATE_HEALER_ICON = "戰場中顯示治療職業圖標"
L_GUI_NAMEPLATE_TOTEM_ICONS = "顯示敵對圖騰圖標"
L.nameplate_target_glow = "目標邊框高亮"
L.nameplate_only_name = "友方玩家只顯示名稱"
L.nameplate_quests = "任務圖標"
L.nameplate_cast_color = "重要法術施法條邊框高亮"
L.nameplate_kick_color = "當斷法技能在冷卻中則施法條變色"
L.nameplate_low_health_value = "斬殺線閾值"
L.nameplate_low_health = "斬殺邊框高亮"
L_GUI_NAMEPLATE_THREAT = "仇恨情況"
L_GUI_NAMEPLATE_GOOD_COLOR = "安全仇恨顏色"
L_GUI_NAMEPLATE_NEAR_COLOR = "臨界仇恨顏色"
L_GUI_NAMEPLATE_BAD_COLOR = "危險仇恨顏色"
L_GUI_NAMEPLATE_OFFTANK_COLOR = "副坦仇恨顏色"
L.nameplate_extra_color = "炸藥/惡意詞綴顏色"
L.nameplate_mob_color_enable = "副本中重要小怪著色"
L.nameplate_mob_color = "小怪顏色"
-- Combat text options
L_GUI_COMBATTEXT = "戰鬥文字"
L_GUI_COMBATTEXT_SUBTEXT = "鍵入 /xct 獲取更多可用命令"
L_GUI_COMBATTEXT_ENABLE = "開啟xCT戰鬥信息"
L.combattext_blizz_head_numbers = "開啟暴雪默認戰鬥信息"
L.combattext_blizz_head_numbers_desc = "暴雪默認傷害/治療模式(需關閉xCT戰鬥信息)"
L.combattext_damage_style = "改變默認的顯示風格"
L.combattext_damage_style_desc = "改變模型頂部/玩家頭像的傷害/治療字體"
L_GUI_COMBATTEXT_DAMAGE = "獨立顯示傷害輸出"
L_GUI_COMBATTEXT_HEALING = "獨立顯示治療輸出"
L.combattext_incoming = "自己的戰鬥文字捲動"
L_GUI_COMBATTEXT_HOTS = "Hot造成的治療"
L_GUI_COMBATTEXT_OVERHEALING = "過量治療輸出"
L_GUI_COMBATTEXT_PET_DAMAGE = "寵物傷害輸出"
L_GUI_COMBATTEXT_DOT_DAMAGE = "Dot造成的傷害"
L_GUI_COMBATTEXT_DAMAGE_COLOR = "傷害文字按法術類型著色"
L_GUI_COMBATTEXT_CRIT_PREFIX = "暴擊時文本左側修飾符號"
L_GUI_COMBATTEXT_CRIT_POSTFIX = "暴擊時文本右側修飾符號"
L_GUI_COMBATTEXT_ICONS = "傷害輸出技能圖標"
L_GUI_COMBATTEXT_ICON_SIZE = "圖標大小"
L_GUI_COMBATTEXT_ICON_SIZE_DESC = "傷害輸出圖標大小"
L_GUI_COMBATTEXT_TRESHOLD = "傷害輸出最小閾值"
L_GUI_COMBATTEXT_HEAL_TRESHOLD = "承受/輸出治療最小閾值"
L_GUI_COMBATTEXT_SCROLLABLE = "允許使用滑鼠滾輪滾動區域"
L_GUI_COMBATTEXT_MAX_LINES = "最大行數"
L_GUI_COMBATTEXT_MAX_LINES_DESC = "滾動區域顯示最大行數"
L_GUI_COMBATTEXT_TIME_VISIBLE = "時間"
L_GUI_COMBATTEXT_TIME_VISIBLE_DESC = "信息保留時間(秒)"
L_GUI_COMBATTEXT_DK_RUNES = "死亡騎士符文恢復"
L_GUI_COMBATTEXT_KILLINGBLOW = "擊殺信息"
L.combattext_merge_aoe_spam = "將AOE傷害合併為一條信息"
L.combattext_merge_aoe_spam_desc = "將AOE傷害合併為一條信息"
L_GUI_COMBATTEXT_MERGE_MELEE = "將多個自動攻擊傷害合併為一條信息"
L.combattext_merge_all = "Merges all spells" -- Needs review
L_GUI_COMBATTEXT_DISPEL = "當你驅散成功時提示"
L_GUI_COMBATTEXT_INTERRUPT = "當你斷法成功時提示"
L_GUI_COMBATTEXT_DIRECTION = "滾動方向從下向上"
L_GUI_COMBATTEXT_SHORT_NUMBERS = "數值以K為單位顯示"
-- Auras/Buffs/Debuffs
L_GUI_AURA_PLAYER_BUFF_SIZE = "Buff大小"
L_GUI_AURA_PLAYER_BUFF_SIZE_DESC = "玩家Buff圖標大小"
L.aura_debuff_size = "DeBuffs大小"
L_GUI_AURA_SHOW_SPIRAL = "漩渦冷卻樣式"
L_GUI_AURA_SHOW_TIMER = "層數堆疊"
L_GUI_AURA_PLAYER_AURAS = "玩家顯示法術效果"
L_GUI_AURA_TARGET_AURAS = "目標顯示法術效果"
L_GUI_AURA_FOCUS_DEBUFFS = "焦點顯示DeBuff"
L_GUI_AURA_FOT_DEBUFFS = "焦點的目標顯示DeBuff"
L_GUI_AURA_PET_DEBUFFS = "寵物顯示DeBuff"
L_GUI_AURA_TOT_DEBUFFS = "目標的目標顯示DeBuff"
L.aura_subheader_boss = "Boss顯示Buff/DeBuff"
L_GUI_AURA_PLAYER_AURA_ONLY = "目標只顯示自身施放的DeBuff"
L_GUI_AURA_DEBUFF_COLOR_TYPE = "DeBuff按法術類型著色"
L_GUI_AURA_CAST_BY = "提示Buff/DeBuff提供者"
L_GUI_AURA_CLASSCOLOR_BORDER = "自身Buff圖標邊框按職業著色"
L.aura_subheader_buffs = "玩家Buff"
L.aura_subheader_debuffs = "DeBuff"
-- Bag options
L_GUI_BAGS = "背包"
L_GUI_BAGS_SUBTEXT = "背包的關閉按鈕另有菜單按右鍵開啓。按住Shift+左鍵可拖動。"
L_GUI_BAGS_ENABLE = "背包增強"
L_GUI_BAGS_ILVL = "顯示物品等級"
L.bag_new_items = "新物品閃動顯示"
L.bag_filter = "Always show filter buttons" -- Need review
L_GUI_BAGS_BUTTON_SIZE = "格子大小"
L_GUI_BAGS_BUTTON_SPACE = "格子間隔"
L_GUI_BAGS_BANK = "銀行每行格數"
L_GUI_BAGS_BAG = "背包每行格數"
-- Minimap options
L_GUI_MINIMAP_SUBTEXT = "小地圖設置"
L_GUI_MINIMAP_ENABLE = "小地圖增強"
L.minimap_on_top = "小地圖定位到右上角"
L_GUI_MINIMAP_ICON = "追蹤菜單"
L_GUI_GARRISON_ICON = "聖所報告圖標"
L_GUI_MINIMAP_SIZE = "小地圖大小"
L_GUI_MINIMAP_HIDE_COMBAT = "戰鬥中隱藏小地圖"
L_GUI_MINIMAP_TOGGLE_MENU = "小地圖頂部快捷菜單"
L.minimap_bg_map_stylization = "戰場地圖增強"
L.minimap_fog_of_war = "地圖全亮"
-- Loot options
L_GUI_LOOT_SUBTEXT = "拾取框架設置"
L_GUI_LOOT_ENABLE = "拾取增強"
L_GUI_LOOT_ROLL_ENABLE = "團隊拾取框架增強"
L_GUI_LOOT_ICON_SIZE = "拾取框架圖標大小"
L_GUI_LOOT_WIDTH = "拾取框架寬度"
L_GUI_LOOT_AUTOGREED = "滿級後自動貪婪綠色物品"
L_GUI_LOOT_AUTODE = "自動選擇分解"
L.loot_faster_loot = "快速拾取"
L.loot_faster_loot_desc = "僅在自動拾取模式中生效"
-- Filger
L_GUI_FILGER = "法術監視"
L_GUI_FILGER_SUBTEXT = "Filger - 類似WeakAuras,更簡單易用,可選擇圖標和計時條形式顯示你的增益減益和計時。"
L_GUI_FILGER_ENABLE = "法術監視"
L_GUI_FILGER_TEST_MODE = "調試模式"
L_GUI_FILGER_MAX_TEST_ICON = "調試模式圖標數量"
L_GUI_FILGER_SHOW_TOOLTIP = "滑鼠指向提示"
L.filger_subheader_elements = "分組顯示"
L.filger_show_buff = "玩家Buff"
L.filger_show_proc = "玩家Procs Buff"
L.filger_show_debuff = "目標DeBuff"
L.filger_show_aura_bar = "目標Buff計時條"
L.filger_show_special = "玩家Special Buff"
L.filger_show_pvp_player = "玩家PvP DeBuff"
L.filger_show_pvp_target = "目標PvP DeBuff"
L.filger_show_cd = "技能冷卻"
L.filger_subheader_size = "圖標大小"
L.filger_subheader_test = "調試模式"
L_GUI_FILGER_EXPIRATION = "按冷卻時間排序"
L_GUI_FILGER_BUFFS_SIZE = "Buff圖標大小"
L_GUI_FILGER_COOLDOWN_SIZE = "技能冷卻圖標大小"
L_GUI_FILGER_PVP_SIZE = "PvP DeBuff圖標大小"
L.filger_buffs_space = "圖標間距"
L.filger_pvp_space = "圖標間距"
L.filger_cooldown_space = "圖標間距"
L.filger_subheader_spells = "添加法術"
L.filger_category_list = "分組"
-- Announcements options
L_GUI_ANNOUNCEMENTS = "通告預警"
L_GUI_ANNOUNCEMENTS_SUBTEXT = "添加特定事件進行通報"
L.announcements_drinking = "當敵人進食時在聊天框進行通告"
L.announcements_interrupts = "斷法"
L.announcements_interrupts_desc = "當你斷法成功時在隊伍/團隊中進行通告"
L.announcements_spells = "施法"
L.announcements_spells_desc = "當你施放指定法術時在隊伍/團隊中進行通告"
L.announcements_spells_from_all = "檢查所有隊員"
L.announcements_spells_from_all_desc = "檢查來源包括所有隊員"
L.announcements_toys = "使用玩具火車/烈酒的遙控器時進行通告"
L.announcements_pull_countdown = "倒計時通告"
L.announcements_pull_countdown_desc = "倒計時通告(/pc #)"
L.announcements_flask_food = "食物和精煉"
L.announcements_flask_food_desc = "通告食物和精煉的使用情況(/ffcheck)"
L.announcements_flask_food_raid = "在團隊頻道通告"
L.announcements_flask_food_auto = "當團隊凖備確認時進行檢查"
L.announcements_feasts = "放置食物/大鍋/靈魂井/修理機器人時進行通告"
L.announcements_portals = "開啟傳送門/召喚儀式時進行通告"
L.announcements_subheader_self = "個人通告"
L.announcements_bad_gear = "檢查裝備"
L.announcements_bad_gear_desc = "進入副本時提醒非副本裝備(魚竿等裝備)"
L.announcements_safari_hat = "狩旅團之帽"
L.announcements_safari_hat_desc = "檢查'狩旅團之帽'使用情況"
-- Automation options
L_GUI_AUTOMATION = "自動設定"
L_GUI_AUTOMATION_SUBTEXT = "一些自動化的設置"
L.automation_release = "戰場中自動釋放靈魂"
L.automation_screenshot = "獲得成就時自動截屏"
L.automation_solve_artifact = "自動辨識考古文物"
L.automation_solve_artifact_desc = "當有足夠碎片時自動彈出辨識窗口並插上符文石"
L.automation_accept_invite = "自動接受好友/公會成員的組隊邀請"
L.automation_decline_duel = "自動取消决鬥"
L.automation_accept_quest = "自動交接任務(按住Shift臨時停用)"
L.automation_auto_collapse = "自動折疊任務追蹤框架"
L.automation_auto_collapse_raid = "副本中"
L.automation_auto_collapse_reload = "重載後"
L.automation_auto_collapse_scenario = "場景戰役"
L.automation_skip_cinematic = "自動跳過過場動畫(按住Ctrl臨時停用)"
L.automation_auto_role = "自動設定角色類型"
L.automation_cancel_bad_buffs = "自動取消非增益性質的Buff"
L.automation_tab_binder = "Tab鍵只選定玩家"
L.automation_tab_binder_desc = "在PvP區域按Tab鍵只選取對敵玩家目標,忽略寵物圖騰等次要目標。"
L.automation_logging_combat = "團隊副本時自動開啟戰鬥記錄"
L.automation_buff_on_scroll = "使用滑鼠滾輪施放Buff"
L.automation_buff_on_scroll_desc = "指定Buff缺失時使用滑鼠滾輪施放"
L.automation_open_items = "自動打開背包中的封裝物品"
L.automation_resurrection = "自動確認復活"
L.automation_summon = "自動確認召喚"
L.automation_whisper_invite = "密語自動邀請"
L.automation_invite_keyword = "添加關鍵詞(需加空隔鍵)"
L.automation_invite_keyword_desc = "通過關鍵詞自動邀請對方進組"
-- Buffs reminder options
L_GUI_REMINDER = "Buff提示"
L_GUI_REMINDER_SUBTEXT = "提示缺失的Buff"
L_GUI_REMINDER_SOLO_ENABLE = "自身Buff缺失時圖標提示"
L_GUI_REMINDER_SOLO_SOUND = "自身Buff缺失時聲音提示"
L_GUI_REMINDER_SOLO_SIZE = "圖標大小"
L_GUI_REMINDER_SOLO_SIZE_DESC = "自身Buff提示圖標大小"
L_GUI_REMINDER_SUBHEADER = "團隊Buff"
L_GUI_REMINDER_RAID_ENABLE = "團隊Buff缺失時圖標提示"
L_GUI_REMINDER_RAID_ALWAYS = "總是顯示Buff提示"
L_GUI_REMINDER_RAID_SIZE = "圖標大小"
L_GUI_REMINDER_RAID_SIZE_DESC = "團隊Buff提示圖標大小"
L_GUI_REMINDER_RAID_ALPHA = "透明度"
L_GUI_REMINDER_RAID_ALPHA_DESC = "當團隊Buff存在時圖標透明度"
-- Raid cooldowns options
L_GUI_COOLDOWN_RAID = "團隊技能冷卻"
L_GUI_COOLDOWN_RAID_SUBTEXT = "顯示在屏幕左上方"
L_GUI_COOLDOWN_RAID_ENABLE = "團隊技能冷卻"
L_GUI_COOLDOWN_RAID_HEIGHT = "計量條高度"
L_GUI_COOLDOWN_RAID_WIDTH = "計量條寬度"
L_GUI_COOLDOWN_RAID_SORT = "團隊技能冷卻向上延伸"
L_GUI_COOLDOWN_RAID_EXPIRATION = "按冷卻時間排序"
L_GUI_COOLDOWN_RAID_SHOW_SELF = "自身團隊技能"
L_GUI_COOLDOWN_RAID_ICONS = "團隊技能冷卻圖標"
L_GUI_COOLDOWN_RAID_IN_RAID = "團隊中顯示團隊技能冷卻"
L_GUI_COOLDOWN_RAID_IN_PARTY = "隊伍中顯示團隊技能冷卻"
L_GUI_COOLDOWN_RAID_IN_ARENA = "競技場中顯示團隊技能冷卻"
-- Enemy cooldowns options
L_GUI_COOLDOWN_ENEMY = "敵對技能冷卻"
L_GUI_COOLDOWN_ENEMY_SUBTEXT = "顯示在你的施法條上方"
L_GUI_COOLDOWN_ENEMY_ENABLE = "敵對技能冷卻"
L_GUI_COOLDOWN_ENEMY_SIZE = "敵對技能冷卻圖標大小"
L_GUI_COOLDOWN_ENEMY_DIRECTION = "敵對技能冷卻圖標方向"
L_GUI_COOLDOWN_ENEMY_EVERYWHERE = "始終顯示敵對技能冷卻"
L_GUI_COOLDOWN_ENEMY_IN_BG = "戰場中顯示敵對技能冷卻"
L_GUI_COOLDOWN_ENEMY_IN_ARENA = "競技場中顯示敵對技能冷卻"
L.enemycooldown_show_inparty = "組隊時顯示敵對技能冷卻"
L.enemycooldown_class_color = "按職業著色"
-- Pulse cooldowns options
L_GUI_COOLDOWN_PULSE = "技能冷卻閃爍"
L_GUI_COOLDOWN_PULSE_SUBTEXT = "顯示在屏幕中央"
L_GUI_COOLDOWN_PULSE_ENABLE = "技能冷卻閃爍提示"
L_GUI_COOLDOWN_PULSE_SIZE = "冷卻閃爍提示大小"
L_GUI_COOLDOWN_PULSE_SOUND = "播放聲音提醒"
L_GUI_COOLDOWN_PULSE_ANIM_SCALE = "動畫縮放"
L_GUI_COOLDOWN_PULSE_HOLD_TIME = "持續時間"
L_GUI_COOLDOWN_PULSE_THRESHOLD = "持續時間最小閾值"
L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC = "持續時間最小閾值"
-- Threat options
L_GUI_THREAT = "仇恨欄"
L_GUI_THREAT_SUBTEXT = "仇恨威脅值統計(類似Omen)"
L_GUI_THREAT_ENABLE = "仇恨欄"
L_GUI_THREAT_HEIGHT = "仇恨欄高度"
L_GUI_THREAT_WIDTH = "仇恨欄寬度"
L_GUI_THREAT_ROWS = "仇恨欄數目"
L_GUI_THREAT_HIDE_SOLO = "僅在隊伍/團隊中開啟"
-- Top panel options
L_GUI_TOP_PANEL = "頂部信息條"
L_GUI_TOP_PANEL_SUBTEXT = "管理頂部信息條"
L_GUI_TOP_PANEL_ENABLE = "頂部信息條"
L_GUI_TOP_PANEL_MOUSE = "滑鼠懸停時顯示頂部信息條"
L_GUI_TOP_PANEL_WIDTH = "信息條寬度"
L_GUI_TOP_PANEL_HEIGHT = "信息條高度"
-- Stats options
L_GUI_STATS = "信息條"
L_GUI_STATS_SUBTEXT = "位于屏幕底部的信息條,鍵入 /ls 獲取更多資訊。"
L_GUI_STATS_CLOCK = "時鐘"
L_GUI_STATS_LATENCY = "延遲"
L_GUI_STATS_FPS = "幀數"
L_GUI_STATS_EXPERIENCE = "經驗"
L_GUI_STATS_TALENTS_DESC = "左鍵專精選單/右鍵拾取專精選單"
L_GUI_STATS_COORDS = "座標"
L_GUI_STATS_LOCATION = "位置"
L_GUI_STATS_BG = "戰場分數"
L.stats_bottom_line = "底部職業著色劃線"
L_GUI_STATS_SUBHEADER_CURRENCY = "兌換通貨(金幣信息中顯示)"
L_GUI_STATS_CURRENCY_ARCHAEOLOGY = "考古學"
L_GUI_STATS_CURRENCY_COOKING = "烹飪"
L_GUI_STATS_CURRENCY_RAID = "副本徽印"
-- Trade options
L_GUI_TRADE = "商業"
L_GUI_TRADE_SUBTEXT = "專業和商業設置"
L.trade_profession_tabs = "專業界面快捷按鈕"
L.trade_profession_tabs_desc = "專業/商業界面顯示快捷按鈕"
L.trade_already_known = "彩色顯示已學會的"
L.trade_already_known_desc = "彩色顯示已學會的食譜/圖紙/坐騎/寵物"
L.trade_disenchanting = "快捷研磨"
L.trade_disenchanting_desc = "Alt+左鍵包裡物品即可快捷研磨/選礦/分解/開鎖"
L.trade_sum_buyouts = "結算拍賣物品的總金額"
L.trade_sum_buyouts_desc = "拍賣界面顯示拍賣物品的總金額"
L.trade_enchantment_scroll = "附魔界面顯示附魔卷軸數量"
L.trade_archaeology = "考古學小助手"
L.trade_archaeology_desc = "顯示考古學各類文物的進度及符文石數量(鍵入 /arch 或點擊小地圖隱藏按鈕打開界面)"
L.trade_merchant_itemlevel = "商人界面顯示物品等級"
L.trade_merchant_itemlevel_desc = "在商人界面顯示武器裝備的物品等級"
-- Miscellaneous options
L_GUI_MISC_SUBTEXT = "一些便捷的功能設置"
L.misc_shift_marking = "滑鼠目標標記"
L.misc_shift_marking_desc = "滑鼠指向目標Shift+左鍵顯示團隊標記菜單(僅限隊伍/團隊)"
L.misc_afk_spin_camera = "AFK時旋轉鏡頭"
L.misc_quest_auto_button = "任務/道具自動按鈕"
L.misc_quest_auto_button_desc = "任務/道具自動按鈕"
L.misc_raid_tools = "團隊工具"
L.misc_raid_tools_desc = "團隊管理便捷功能: 右鍵就位確認,中鍵角色檢查,左鍵展開更多功能(僅限隊長/助手)"
L.misc_item_level = "人物界面顯示物品等級"
L.misc_item_level_desc = "人物界面顯示武器裝備的物品等級"
L.misc_click_cast = "簡單的點擊施法綁定"
L.misc_click_cast_desc = "開啟後法術書有滑鼠綁定界面可以進行設置"
L.misc_click_cast_filter = "忽略玩家/目標框架點擊施法"
L.misc_chars_currency = "追蹤所有角色的兌換通貨"
L.misc_chars_currency_desc = "在兌換通貨界面中追蹤所有角色的兌換通貨"
L.misc_hide_raid_button = "輸出佈局最小化按鈕"
L.misc_hide_raid_button_desc = "按鈕在團隊框架左上方滑鼠懸停顯示"
================================================
FILE: ShestakUI_Config/Options.lua
================================================
local T, C
local _, ns = ...
local L = ns
----------------------------------------------------------------------------------------
-- GUI for ShestakUI(by Haleth, Solor)
----------------------------------------------------------------------------------------
local realm = GetRealmName()
local name = UnitName("player")
-- Main window
local options = CreateFrame("Frame", "ShestakUIOptionsPanel", UIParent)
options:SetSize(800, 770)
options:SetPoint("CENTER")
options:SetFrameStrata("HIGH")
options:EnableMouse(true)
tinsert(UISpecialFrames, options:GetName())
local CloseButton = CreateFrame("Button", nil, options, "UIPanelButtonTemplate")
CloseButton:SetPoint("TOPRIGHT", options, "BOTTOMRIGHT", -10, 30)
CloseButton:SetSize(100, 23)
CloseButton:SetText(CLOSE)
CloseButton:SetScript("OnClick", function()
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION)
options:Hide()
end)
local OkayButton = CreateFrame("Button", "ShestakUIOptionsPanelOkayButton", options, "UIPanelButtonTemplate")
OkayButton:SetPoint("RIGHT", CloseButton, "LEFT", -4, 0)
OkayButton:SetSize(100, 23)
OkayButton:SetText(APPLY)
OkayButton:SetScript("OnClick", function()
ReloadUI()
end)
OkayButton:Disable()
tinsert(ns.buttons, CloseButton)
tinsert(ns.buttons, OkayButton)
local reloadText = options:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
reloadText:SetPoint("BOTTOM", 0, 11)
reloadText:SetText("|cffff2735"..L_GUI_NEED_RELOAD.."|r")
reloadText:Hide()
options.reloadText = reloadText
StaticPopupDialogs.SHESTAKUI_RESET_PERCHAR = {
text = L_GUI_RESET_CHAR,
button1 = ACCEPT,
button2 = CANCEL,
OnAccept = function()
local i = tostring(ShestakUIOptionsGlobal[realm]["Current_Profile"][name])
ShestakUIOptionsPerChar[i] = {}
C.options = ShestakUIOptionsPerChar[i]
ReloadUI()
end,
whileDead = true,
hideOnEscape = true,
showAlert = true,
}
StaticPopupDialogs.SHESTAKUI_RESET = {
text = L_GUI_RESET_ALL,
button1 = ACCEPT,
button2 = CANCEL,
OnAccept = function()
local i = tostring(ShestakUIOptionsGlobal["Current_Profile"])
ShestakUIOptions[i] = {}
C.options = ShestakUIOptions[i]
ReloadUI()
end,
whileDead = true,
hideOnEscape = true,
showAlert = true,
}
StaticPopupDialogs.SHESTAKUI_RESET_CATEGORY = {
text = L_GUI_RESET_CAT,
button1 = ACCEPT,
button2 = CANCEL,
OnAccept = function()
if ShestakUIOptionsPanelgeneral2:IsShown() then
C.options.media = {}
C.options.media.profile = C.media.profile
else
C.options[C.category] = {}
end
ReloadUI()
end,
whileDead = true,
hideOnEscape = true,
}
local ResetButton = CreateFrame("Button", nil, options, "UIPanelButtonTemplate")
ResetButton:SetSize(100, 23)
ResetButton:SetText(DEFAULT)
ResetButton.tooltipText = "|cffFFD100"..L_GUI_RESET_CAT_DESC.."|r"
ResetButton:SetPoint("BOTTOMLEFT", ShestakUIOptionsPanel, "BOTTOMLEFT", 10, 7)
ResetButton:SetScript("OnClick", function()
if IsModifiedClick() then
if ShestakUIOptionsGlobal[realm][name] == true then
StaticPopup_Show("SHESTAKUI_RESET_PERCHAR")
else
StaticPopup_Show("SHESTAKUI_RESET")
end
else
StaticPopup_Show("SHESTAKUI_RESET_CATEGORY")
end
end)
tinsert(ns.buttons, ResetButton)
-- Tables
local FontTable
local LSM = LibStub and LibStub:GetLibrary("LibSharedMedia-3.0", true)
if LSM then
FontTable = LSM:HashTable("font")
else
FontTable = {
"Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Normal.ttf",
"Interface\\AddOns\\ShestakUI\\Media\\Fonts\\Pixel.ttf",
STANDARD_TEXT_FONT
}
end
local FlagsTable = {
"OUTLINE",
"MONOCHROMEOUTLINE",
""
}
local ErrorTable = {
"BLACKLIST",
"WHITELIST",
"COMBAT",
"NONE"
}
local CollapseTable = {
"RAID",
"RELOAD",
"SCENARIO",
"NONE"
}
local RaidTable = {
"HEAL",
"DPS",
"AUTO",
"BLIZZARD"
}
local PortraitTable = {
"3D",
"2D",
"ICONS",
"OVERLAY"
}
local TextureTable
if LSM then
TextureTable = LSM:HashTable("statusbar")
else
TextureTable = {
"Interface\\AddOns\\ShestakUI\\Media\\Textures\\Texture.tga"
}
end
local FilgerTable = {
L.filger_show_buff,
L.filger_show_proc,
L.filger_show_debuff,
L.filger_show_aura_bar,
L.filger_show_cd,
IGNORE
}
local FilgerDropDownText = {
[L.filger_show_buff] = "buff_spells_list",
[L.filger_show_proc] = "proc_spells_list",
[L.filger_show_debuff] = "debuff_spells_list",
[L.filger_show_aura_bar] = "aura_bar_spells_list",
[L.filger_show_cd] = "cd_spells_list",
[IGNORE] = "ignore_spells_list",
}
-- Spell list frame
local SpellList = CreateFrame("Frame", "SpellList", ShestakUIOptionsPanel, "ButtonFrameTemplate")
SpellList:SetPoint("TOPLEFT", ShestakUIOptionsPanel, "TOPRIGHT", 22, 0)
SpellList:SetSize(290, 420)
SpellList:Hide()
SpellListPortrait:SetAlpha(0)
SpellList.title = _G["SpellListTitle"] or SpellList:CreateFontString("SpellListTitle", "OVERLAY", "GameFontNormal")
SpellList.title:SetPoint("TOP", _G["SpellList"], "TOP", 0, -5)
SpellList.title:SetText(L_GUI_SPELL_LIST)
local ScrollSpells = CreateFrame("ScrollFrame", "SpellListScrollFrameSpellList", _G["SpellListInset"], "UIPanelScrollFrameTemplate")
ScrollSpells:SetPoint("TOPLEFT", _G["SpellListInset"], "TOPLEFT", -10, 19)
ScrollSpells:SetPoint("BOTTOMRIGHT", _G["SpellListInset"], "BOTTOMRIGHT", -30, 40)
ScrollSpells.child = CreateFrame("Frame", "SpellListScrollFrameSpellListChild", ScrollSpells)
ScrollSpells.child:SetSize(270, 290)
ScrollSpells:SetScrollChild(ScrollSpells.child)
local isFilger = false
local doubleInput = false
SpellList.makeSpellsList = function(_, db, double)
local oldb
local scroll = SpellListScrollFrameSpellListChild
local i = 1
while _G["SpellList"..i.."_cbs"] do
_G["SpellList"..i.."_fs"]:SetText("")
_G["SpellList"..i.."_fs2"]:SetText("")
_G["SpellList"..i.."_texture"]:SetTexture(nil)
_G["SpellList"..i.."_cbs"]:ClearAllPoints()
_G["SpellList"..i.."_cbs"]:Hide()
i = i + 1
end
local i = 1
for k, spell in pairs(db) do
if spell then
if not isFilger or isFilger and spell[2] == T.class then
local sp = (double or ShestakUIOptionsPanelfilger:IsShown()) and spell[1] or spell
local name, _, icon = GetSpellInfo(sp)
local bf = _G["SpellList"..i.."_cbs"] or CreateFrame("Button", "SpellList"..i.."_cbs", scroll, "BackdropTemplate")
if i == 1 then
bf:SetPoint("TOPLEFT", scroll, "TOPLEFT", 10, -5)
bf:SetPoint("BOTTOMRIGHT", scroll, "TOPRIGHT", -10, -29)
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("SpellList"..i.."_texture", "OVERLAY")
bf.tex:SetSize(22, 22)
bf.tex:SetPoint("LEFT")
bf.tex:SetTexture(icon)
bf.tex:SetTexCoord(0.1, 0.9, 0.1, 0.9)
bf.delete = bf.delete or CreateFrame("Button", "SpellList"..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()
tremove(db, k)
SpellList:makeSpellsList(db, double)
ns.setReloadNeeded(true)
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)
GameTooltip:SetOwner(bf, "ANCHOR_TOP", 5, 5)
GameTooltip:SetHyperlink(format("spell:%s", sp))
end)
bf:SetScript("OnLeave", function(self)
bf.delete:GetNormalTexture():SetVertexColor(0.8, 0, 0)
self:SetBackdrop(nil)
GameTooltip:Hide()
end)
bf.fs = bf.fs or bf:CreateFontString("SpellList"..i.."_fs", "OVERLAY", "GameFontNormal")
bf.fs:SetText(name)
bf.fs:SetPoint("RIGHT", bf.delete, "LEFT", -4, 0)
bf.fs:SetPoint("LEFT", bf.tex, "RIGHT", 5, 0)
bf.fs:SetWordWrap(false)
bf.fs:SetJustifyH("RIGHT")
bf.fs2 = bf.fs2 or bf:CreateFontString("SpellList"..i.."_fs2", "OVERLAY", "GameFontNormal")
bf.fs2:SetPoint("RIGHT", bf.delete, "LEFT", -4, 0)
bf.fs2:SetWordWrap(false)
bf.fs2:SetJustifyH("RIGHT")
if double and spell[2] and tonumber(spell[2]) > 0 then
bf.fs2:SetText(format(GARRISON_DURATION_SECONDS, spell[2]))
bf.fs:SetPoint("RIGHT", bf.fs2, "LEFT", -4, 0)
end
bf:Show()
oldb = bf
i = i + 1
-- Remove outdated spells
if not name then
tremove(db, k)
SpellList:makeSpellsList(db, double)
end
end
end
end
SpellList:Show()
if double then
SpellListTextInput2:Show()
else
SpellListTextInput2:Hide()
end
end
local function onEnterPressed(self)
local value = tonumber(self:GetText())
AddSpellButton:Disable()
if value and value > 0 then
local name = GetSpellInfo(value)
if name then
self:SetText(name)
self:SetCursorPosition(0)
self:ClearFocus()
self.value = value
if not SpellListTextInput2:IsShown() or SpellListTextInput2:GetText() ~= "" then
AddSpellButton:Enable()
end
else
self:SetText(UNKNOWN)
self.value = value
end
else
self.value = ""
end
end
local InputSpell = CreateFrame("EditBox", SpellList:GetName().."TextInput", SpellList, "InputBoxTemplate")
InputSpell:SetAutoFocus(false)
InputSpell:SetWidth(150)
InputSpell:SetHeight(18)
InputSpell:SetMaxLetters(99)
InputSpell:SetFontObject(GameFontHighlight)
InputSpell:SetPoint("TOPLEFT", SpellList, "BOTTOMLEFT", -2, 37)
InputSpell.value = ""
InputSpell:SetScript("OnEscapePressed", function(self) self:ClearFocus() self:SetText(InputSpell.value) end)
InputSpell:SetScript("OnEnterPressed", onEnterPressed)
InputSpell:SetScript("OnEditFocusGained", function() InputSpell:SetText(InputSpell.value) end)
InputSpell:SetScript("OnEditFocusLost", onEnterPressed)
local label = InputSpell:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
label:SetWidth(440)
label:SetHeight(20)
label:SetJustifyH("LEFT")
label:SetPoint("BOTTOMLEFT", InputSpell, "TOPLEFT", -2, 2)
label:SetText(L_GUI_SPELL_INPUT)
local function onEnterPressed(self)
local value = tonumber(self:GetText())
AddSpellButton:Disable()
if value and value > 0 then
self:ClearFocus()
self.value = value
if InputSpell.value ~= "" then
AddSpellButton:Enable()
end
end
end
local InputArg = CreateFrame("EditBox", SpellList:GetName().."TextInput2", SpellList, "InputBoxTemplate")
InputArg:SetAutoFocus(false)
InputArg:SetWidth(40)
InputArg:SetHeight(18)
InputArg:SetMaxLetters(4)
InputArg:SetFontObject(GameFontHighlight)
InputArg:SetPoint("LEFT", InputSpell, "RIGHT", 10, 0)
InputArg:SetScript("OnEscapePressed", function(self) self:ClearFocus() self:SetText(InputArg.value) end)
InputArg:SetScript("OnEnterPressed", onEnterPressed)
InputArg:SetScript("OnEditFocusGained", function() InputArg.value = InputArg:GetText() end)
InputArg:SetScript("OnEditFocusLost", onEnterPressed)
local label = InputArg:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
label:SetWidth(440)
label:SetHeight(20)
label:SetJustifyH("LEFT")
label:SetPoint("BOTTOMLEFT", InputArg, "TOPLEFT", -2, 2)
label:SetText(L_GUI_TIME_INPUT)
InputArg:Hide()
local curOption
local function BuildSpellList(option, double, hiding)
if ProfileList:IsVisible() then ProfileList:Hide() end
if not hiding and SpellList:IsVisible() then SpellList:Hide() return end
curOption = option
doubleInput = double
isFilger = hiding
SpellList:makeSpellsList(option, double)
end
ns.HideSpellList = function()
InputSpell:SetText("")
InputSpell.value = ""
InputArg:SetText("")
UIDropDownMenu_SetText(ShestakUIOptionsPanelfilgercategory_listDropDown, "")
ShestakUIOptionsPanelfilgercategory_listDropDown.selectedValue = nil
AddSpellButton:Disable()
SpellList:Hide()
end
local AddSpellButton = CreateFrame("Button", "AddSpellButton", SpellList, "UIPanelButtonTemplate")
AddSpellButton:SetPoint("TOPRIGHT", SpellList, "BOTTOMRIGHT", -10, 40)
AddSpellButton:SetSize(100, 23)
AddSpellButton:SetText(ADD)
AddSpellButton:SetWidth(AddSpellButton.Text:GetWidth() + 15)
AddSpellButton:SetScript("OnClick", function()
if doubleInput then
tinsert(curOption, {InputSpell.value, InputArg.value})
else
if isFilger then
tinsert(curOption, {InputSpell.value, T.class})
else
tinsert(curOption, InputSpell.value)
end
end
InputSpell:SetText("")
InputSpell.value = ""
InputArg:SetText("")
AddSpellButton:Disable()
ns.setReloadNeeded(true)
SpellList:makeSpellsList(curOption, doubleInput)
end)
AddSpellButton:SetScript("OnEnter", function()
GameTooltip:SetOwner(AddSpellButton, "ANCHOR_RIGHT", 5, 5)
GameTooltip:SetHyperlink(format("spell:%s", InputSpell.value))
end)
AddSpellButton:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
AddSpellButton:Disable()
tinsert(ns.buttons, AddSpellButton)
-- Info frame
do
local frame = CreateFrame("Frame", "ShestakUIInfoFrame", UIParent)
frame:SetWidth(800)
frame:SetHeight(770)
frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
frame:SetFrameStrata("DIALOG")
tinsert(UISpecialFrames, "ShestakUIInfoFrame")
frame:Hide()
frame:EnableMouse(true)
local title = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
title:SetPoint("TOPLEFT", 26, -26)
title:SetText("Links:")
local HelpButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
HelpButton:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -20)
HelpButton:SetSize(100, 23)
HelpButton:SetText("Wiki page")
HelpButton:SetWidth(HelpButton.Text:GetWidth() + 15)
local url = L_GUI_WIKI_URL
HelpButton:SetScript("OnClick", function()
StaticPopup_Show("LINK_URL", _, _, url)
end)
local DiscordButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
DiscordButton:SetPoint("LEFT", HelpButton, "RIGHT", 10, 0)
DiscordButton:SetSize(100, 23)
DiscordButton:SetText("Discord")
DiscordButton:SetWidth(DiscordButton.Text:GetWidth() + 15)
local url = "https://discord.gg/vwHwnTt"
DiscordButton:SetScript("OnClick", function()
StaticPopup_Show("LINK_URL", _, _, url)
end)
local GithubButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
GithubButton:SetPoint("LEFT", DiscordButton, "RIGHT", 10, 0)
GithubButton:SetSize(100, 23)
GithubButton:SetText("Github")
GithubButton:SetWidth(GithubButton.Text:GetWidth() + 15)
local url = "https://github.com/Shestak/ShestakUI"
GithubButton:SetScript("OnClick", function()
StaticPopup_Show("LINK_URL", _, _, url)
end)
tinsert(ns.buttons, DiscordButton)
tinsert(ns.buttons, HelpButton)
tinsert(ns.buttons, GithubButton)
local title2 = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
title2:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -66)
title2:SetText("Credits:")
local subtitle2 = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
subtitle2:SetWidth(750)
subtitle2:SetPoint("TOPLEFT", title2, "BOTTOMLEFT", 0, -8)
subtitle2:SetJustifyH("LEFT")
subtitle2:SetText(GetAddOnMetadata("ShestakUI", "X-Credits"))
local title3 = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
title3:SetPoint("TOPLEFT", subtitle2, "BOTTOMLEFT", 0, -16)
title3:SetText("Translation:")
local subtitle3 = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
subtitle3:SetWidth(750)
subtitle3:SetPoint("TOPLEFT", title3, "BOTTOMLEFT", 0, -8)
subtitle3:SetJustifyH("LEFT")
subtitle3:SetText(GetAddOnMetadata("ShestakUI", "X-Translation"))
local title4 = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
title4:SetPoint("TOPLEFT", subtitle3, "BOTTOMLEFT", 0, -16)
title4:SetText("Thanks:")
local subtitle4 = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
subtitle4:SetWidth(750)
subtitle4:SetPoint("TOPLEFT", title4, "BOTTOMLEFT", 0, -8)
subtitle4:SetJustifyH("LEFT")
subtitle4:SetText(GetAddOnMetadata("ShestakUI", "X-Thanks"))
local CancelButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
CancelButton:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 10)
CancelButton:SetSize(100, 23)
CancelButton:SetText(CLOSE)
CancelButton:SetWidth(CancelButton.Text:GetWidth() + 15)
CancelButton:SetScript("OnClick", function()
frame:Hide()
end)
tinsert(ns.buttons, CancelButton)
StaticPopupDialogs.LINK_URL = {
text = "Help",
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,
}
end
-- Expert mode
do
local frame = CreateFrame("Frame", "ShestakUIProfileFrame", UIParent)
frame:SetWidth(650)
frame:SetHeight(520)
frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
frame:SetFrameStrata("DIALOG")
tinsert(UISpecialFrames, "ShestakUIProfileFrame")
frame:Hide()
frame:EnableMouse(true)
local editBox = CreateFrame("EditBox", "ShestakUIProfileFrameEditBox", frame)
editBox:SetMultiLine(true)
editBox:SetMaxLetters(99999)
editBox:SetAutoFocus(true)
editBox:SetFontObject(ChatFontNormal)
editBox:SetWidth(620)
editBox:SetHeight(500)
editBox:SetScript("OnEscapePressed", function() frame:Hide() end)
local scrollArea = CreateFrame("ScrollFrame", "ShestakUIProfileFrameScroll", frame, "UIPanelScrollFrameTemplate")
scrollArea:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -10)
scrollArea:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -29, 34)
scrollArea:SetScrollChild(editBox)
ShestakUIProfileFrameScrollScrollBar:SetPoint("TOPLEFT", ShestakUIProfileFrameScroll, "TOPRIGHT", 8, -12)
ShestakUIProfileFrameScrollScrollBar:SetPoint("BOTTOMLEFT", ShestakUIProfileFrameScroll, "BOTTOMRIGHT", 8, 12)
local CancelButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
CancelButton:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -4, 4)
CancelButton:SetSize(100, 23)
CancelButton:SetText(CLOSE)
CancelButton:SetWidth(CancelButton.Text:GetWidth() + 15)
CancelButton:SetScript("OnClick", function()
frame:Hide()
end)
tinsert(ns.buttons, CancelButton)
local SaveButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
SaveButton:SetPoint("BOTTOMRIGHT", CancelButton, "BOTTOMLEFT", -4, 0)
SaveButton:SetSize(100, 23)
SaveButton:SetText(SAVE)
SaveButton:SetWidth(SaveButton.Text:GetWidth() + 15)
SaveButton:SetScript("OnClick", function()
local _, output = loadstring(editBox:GetText())
if output then
print("|cffFF0000"..output.."|r")
else
C.options.media = C.options.media or {}
C.options.media.profile = editBox:GetText()
frame:Hide()
ns.setReloadNeeded(true)
end
end)
tinsert(ns.buttons, SaveButton)
end
-- Category
ns.addCategory("general", GENERAL_LABEL, L_GUI_GENERAL_SUBTEXT, 2)
ns.addCategory("font", L.font, L.font_subtext, 4)
ns.addCategory("skins", L_GUI_SKINS, L_GUI_SKINS_SUBTEXT)
ns.addCategory("unitframe", UNITFRAME_LABEL, L_GUI_UF_SUBTEXT, 3)
ns.addCategory("unitframe_class_bar", L_GUI_UF_PLUGINS_CLASS_BAR, L_GUI_UF_PLUGINS_CLASS_BAR_SUBTEXT)
ns.addCategory("raidframe", RAID_FRAMES_LABEL, L_GUI_UF_RAIDFRAMES_SUBTEXT, 2)
ns.addCategory("aura", BUFFOPTIONS_LABEL, BUFFOPTIONS_SUBTEXT)
ns.addCategory("actionbar", L_GUI_ACTIONBAR, ACTIONBARS_SUBTEXT, 3)
ns.addCategory("tooltip", L.tooltip, L.tooltip_subtext)
ns.addCategory("chat", SOCIALS, L.chat_subtext)
ns.addCategory("nameplate", UNIT_NAMEPLATES, L_GUI_NAMEPLATE_SUBTEXT, 2)
ns.addCategory("combattext", L_GUI_COMBATTEXT, COMBATTEXT_SUBTEXT.." "..L_GUI_COMBATTEXT_SUBTEXT, 2)
ns.addCategory("bag", L_GUI_BAGS, L_GUI_BAGS_SUBTEXT)
ns.addCategory("minimap", MINIMAP_LABEL, L_GUI_MINIMAP_SUBTEXT)
ns.addCategory("loot", LOOT, L_GUI_LOOT_SUBTEXT)
ns.addCategory("filger", L_GUI_FILGER, L_GUI_FILGER_SUBTEXT)
ns.addCategory("announcements", L_GUI_ANNOUNCEMENTS, L_GUI_ANNOUNCEMENTS_SUBTEXT)
ns.addCategory("automation", L_GUI_AUTOMATION, L_GUI_AUTOMATION_SUBTEXT)
ns.addCategory("reminder", L_GUI_REMINDER, L_GUI_REMINDER_SUBTEXT)
ns.addCategory("raidcooldown", L_GUI_COOLDOWN_RAID, L_GUI_COOLDOWN_RAID_SUBTEXT)
ns.addCategory("enemycooldown", L_GUI_COOLDOWN_ENEMY, L_GUI_COOLDOWN_ENEMY_SUBTEXT)
ns.addCategory("pulsecooldown", L_GUI_COOLDOWN_PULSE, L_GUI_COOLDOWN_PULSE_SUBTEXT)
ns.addCategory("threat", L_GUI_THREAT, L_GUI_THREAT_SUBTEXT)
ns.addCategory("toppanel", L_GUI_TOP_PANEL, L_GUI_TOP_PANEL_SUBTEXT)
ns.addCategory("stats", L_GUI_STATS, L_GUI_STATS_SUBTEXT)
ns.addCategory("trade", L_GUI_TRADE, L_GUI_TRADE_SUBTEXT)
ns.addCategory("misc", OTHER, L_GUI_MISC_SUBTEXT)
-- General
do
local parent = ShestakUIOptionsPanel.general
local welcome_message = ns.CreateCheckBox(parent, "welcome_message", L_GUI_GENERAL_WELCOME_MESSAGE)
welcome_message:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local auto_scale = ns.CreateCheckBox(parent, "auto_scale", L_GUI_GENERAL_AUTOSCALE)
auto_scale:SetPoint("TOPLEFT", welcome_message, "BOTTOMLEFT", 0, 0)
local uiscale = ns.CreateNumberSlider(parent, "uiscale", nil, nil, 0.4, 1.1, 0.01, true, L_GUI_GENERAL_UISCALE)
uiscale:SetPoint("TOPLEFT", auto_scale, "BOTTOMLEFT", 0, -20)
local function toggleUIScaleOptions()
local shown = not auto_scale:GetChecked()
uiscale:SetShown(shown)
end
auto_scale:HookScript("OnClick", toggleUIScaleOptions)
uiscale:HookScript("OnShow", toggleUIScaleOptions)
-- Blizzard UI
local subheader = ns.addSubCategory(parent, L.general_subheader_blizzard)
subheader:SetPoint("TOPLEFT", uiscale, "BOTTOMLEFT", 0, -10)
local error_filter = ns.CreateDropDown(parent, "error_filter", true, nil, ErrorTable)
error_filter:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local vehicle_mouseover = ns.CreateCheckBox(parent, "vehicle_mouseover")
vehicle_mouseover:SetPoint("TOPLEFT", error_filter, "BOTTOMLEFT", 16, 0)
local move_blizzard = ns.CreateCheckBox(parent, "move_blizzard")
move_blizzard:SetPoint("TOPLEFT", vehicle_mouseover, "BOTTOMLEFT", 0, 0)
local color_picker = ns.CreateCheckBox(parent, "color_picker")
color_picker:SetPoint("TOPLEFT", move_blizzard, "BOTTOMLEFT", 0, 0)
local minimize_mouseover = ns.CreateCheckBox(parent, "minimize_mouseover")
minimize_mouseover:SetPoint("TOPLEFT", color_picker, "BOTTOMLEFT", 0, 0)
local hide_banner = ns.CreateCheckBox(parent, "hide_banner")
hide_banner:SetPoint("TOPLEFT", minimize_mouseover, "BOTTOMLEFT", 0, 0)
local hide_talking_head = ns.CreateCheckBox(parent, "hide_talking_head")
hide_talking_head:SetPoint("TOPLEFT", hide_banner, "BOTTOMLEFT", 0, 0)
local hide_maw_buffs = ns.CreateCheckBox(parent, "hide_maw_buffs")
hide_maw_buffs:SetPoint("TOPLEFT", hide_talking_head, "BOTTOMLEFT", 0, 0)
local InfoButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
InfoButton:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT", -20, 5)
InfoButton:SetSize(100, 23)
InfoButton:SetText(L_GUI_INFO)
InfoButton:SetWidth(InfoButton.Text:GetWidth() + 15)
InfoButton:SetScript("OnClick", function()
ShestakUIInfoFrame:Show()
end)
tinsert(ns.buttons, InfoButton)
-- Panel 2
local parent = ShestakUIOptionsPanel.general2
local border_color = ns.CreateColourPicker(parent, "border_color", true)
border_color:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 4, 0)
local classborder_color = ns.CreateColourPicker(parent, "classborder_color", true)
classborder_color:SetPoint("TOPLEFT", border_color, "BOTTOMLEFT", 0, -8)
local backdrop_color = ns.CreateColourPicker(parent, "backdrop_color", true)
backdrop_color:SetPoint("TOPLEFT", classborder_color, "BOTTOMLEFT", 0, -8)
local backdrop_alpha = ns.CreateNumberSlider(parent, "backdrop_alpha", nil, nil, 0, 1, 0.05, true)
backdrop_alpha:SetPoint("TOPLEFT", backdrop_color, "BOTTOMLEFT", 0, -28)
local texture = ns.CreateDropDown(parent, "texture", true, nil, TextureTable, LSM and true)
texture:SetPoint("TOPLEFT", backdrop_alpha, "BOTTOMLEFT", -20, -15)
local texturePreview = CreateFrame("Frame", nil, parent)
texturePreview:SetSize(100, 30)
texturePreview:SetPoint("LEFT", texture.label, "RIGHT", 10, 0)
texturePreview:Hide()
texturePreview.tex = texturePreview:CreateTexture(nil, "OVERLAY")
texturePreview.tex:SetPoint("CENTER")
texturePreview.tex:SetSize(100, 30)
hooksecurefunc(texture, "SetValue", function()
texturePreview:Show()
texturePreview.tex:SetTexture(C.options.media.texture)
texturePreview.tex:SetVertexColor(unpack(C.media.classborder_color))
end)
-- Normal Font
local subheader = ns.addSubCategory(parent, L.media_subheader_normal)
subheader:SetPoint("TOPLEFT", texture, "BOTTOMLEFT", 16, -10)
local normal_font = ns.CreateDropDown(parent, "normal_font", true, L.font_stats_font, FontTable, LSM and true, true)
normal_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
-- Pixel Font
local subheader = ns.addSubCategory(parent, L.media_subheader_pixel)
subheader:SetPoint("TOPLEFT", normal_font, "BOTTOMLEFT", 16, -10)
local pixel_font = ns.CreateDropDown(parent, "pixel_font", true, L.font_stats_font, FontTable, LSM and true, true)
pixel_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local pixel_font_style = ns.CreateDropDown(parent, "pixel_font_style", true, L.font_stats_font_style, FlagsTable)
pixel_font_style:SetPoint("LEFT", pixel_font, "RIGHT", 150, 0)
local pixel_font_size = ns.CreateNumberSlider(parent, "pixel_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
pixel_font_size:SetPoint("TOPLEFT", pixel_font, "BOTTOMLEFT", 16, -16)
local LuaButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
LuaButton:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT", -20, 5)
LuaButton:SetSize(100, 23)
LuaButton:SetText(L_GUI_EXPERT_MODE)
LuaButton:SetWidth(LuaButton.Text:GetWidth() + 15)
LuaButton:SetScript("OnClick", function()
ShestakUIProfileFrameEditBox:SetText(C.media.profile)
C_Timer.After(0.01, function()
local _, max = ShestakUIProfileFrameScrollScrollBar:GetMinMaxValues()
for _ = 1, max do
ScrollFrameTemplate_OnMouseWheel(ShestakUIProfileFrameScroll, -1)
end
end)
ShestakUIProfileFrame:Show()
end)
LuaButton:SetScript("OnEnter", function()
GameTooltip:SetOwner(LuaButton, "ANCHOR_RIGHT", 5, 5)
GameTooltip:SetText(L_GUI_EXPERT_MODE_DESC, nil, nil, nil, nil, true)
end)
LuaButton:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
tinsert(ns.buttons, LuaButton)
-- Profile list frame
local ProfileList = CreateFrame("Frame", "ProfileList", ShestakUIOptionsPanel, "ButtonFrameTemplate")
ProfileList:SetPoint("TOPLEFT", ShestakUIOptionsPanel, "TOPRIGHT", 22, 0)
ProfileList:SetSize(290, 420)
ProfileList:Hide()
ProfileListPortrait:SetAlpha(0)
ProfileList.title = ProfileList:CreateFontString("ProfileListTitle", "OVERLAY", "GameFontNormal")
ProfileList.title:SetPoint("TOP", _G["ProfileList"], "TOP", 0, -5)
ProfileList.title:SetText(L.profile_title)
local ProfileButton = CreateFrame("Button", "ShestakUIOptionsPanelProfileButton", options, "UIPanelButtonTemplate")
ProfileButton:SetPoint("TOPRIGHT", -10, -8)
ProfileButton:SetSize(100, 23)
ProfileButton:SetText(L.profile)
ProfileButton:SetScript("OnClick", function()
if SpellList:IsVisible() then SpellList:Hide() end
if ProfileList:IsVisible() then ProfileList:Hide() return end
ProfileList:Show()
end)
tinsert(ns.buttons, ProfileButton)
local ProfileListPanel = CreateFrame("Frame", "ProfileListPanel", _G["ProfileListInset"])
ProfileListPanel:SetPoint("TOPLEFT", _G["ProfileListInset"], "TOPLEFT", -10, 20)
ProfileListPanel:SetPoint("BOTTOMRIGHT", _G["ProfileListInset"], "BOTTOMRIGHT", -6, -5)
local ProfileBox = CreateFrame("CheckButton", nil, ProfileList, "InterfaceOptionsCheckButtonTemplate")
ProfileBox:SetPoint("TOPLEFT", ProfileList, "TOPLEFT", 1, -78)
ProfileBox.tooltipText = L_GUI_SET_SAVED_SETTTINGS_DESC
ProfileBox:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", 0, 0)
GameTooltip:SetText(self.tooltipText, nil, nil, nil, nil, true)
end)
ProfileBox:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
options.ProfileBox = ProfileBox
local label = ProfileBox:CreateFontString(nil, "OVERLAY", "GameFontNormal")
label:SetText(L_GUI_SET_SAVED_SETTTINGS)
label:SetTextColor(1, 1, 1)
label:SetPoint("LEFT", ProfileBox, "RIGHT", 10, 0)
local profileName
StaticPopupDialogs.SHESTAKUI_RENAME_PROFILE = {
text = PET_RENAME.." "..strlower(L.profile),
button1 = ACCEPT,
button2 = CANCEL,
hasEditBox = true,
editBoxWidth = 350,
OnShow = function(self, text)
self.editBox:SetMaxLetters(0)
self.editBox:SetText(text)
self.editBox:HighlightText()
profileName = text
end,
EditBoxOnEscapePressed = function(self) self:GetParent():Hide() end,
EditBoxOnTextChanged = function(self)
profileName = self:GetText()
end,
OnAccept = function()
if not profileName or profileName == "" then return end
if ShestakUIOptionsGlobal[realm][name] then
local i = tostring(ShestakUIOptionsGlobal[realm]["Current_Profile"][name])
if ShestakUIOptionsPerChar[i] then
if not ShestakUIOptionsPerChar[i]["general"] then
ShestakUIOptionsPerChar[i]["general"] = {}
end
ShestakUIOptionsPerChar[i]["general"]["profile_name"] = profileName
end
else
local i = tostring(ShestakUIOptionsGlobal["Current_Profile"])
if ShestakUIOptions[i] then
if not ShestakUIOptions[i]["general"] then
ShestakUIOptions[i]["general"] = {}
end
ShestakUIOptions[i]["general"]["profile_name"] = profileName
end
end
UIDropDownMenu_SetText(ShestakUIOptionsPanelgeneralchoose_profileDropDown, profileName)
end,
whileDead = true,
hideOnEscape = true,
}
local RenameButton = CreateFrame("Button", "ProfileListPaneRenameButton", ProfileList, "UIPanelButtonTemplate")
RenameButton:SetPoint("TOPLEFT", ProfileBox, "TOPLEFT", 4, -34)
RenameButton:SetSize(100, 23)
RenameButton:SetText(PET_RENAME)
RenameButton:SetWidth(RenameButton.Text:GetWidth() + 15)
RenameButton:SetScript("OnClick", function()
if ShestakUIOptionsGlobal then
if ShestakUIOptionsGlobal[realm][name] then
local i = tostring(ShestakUIOptionsGlobal[realm]["Current_Profile"][name])
profileName = ShestakUIOptionsPerChar[i] and ShestakUIOptionsPerChar[i]["general"] and ShestakUIOptionsPerChar[i]["general"]["profile_name"] or i
else
local i = tostring(ShestakUIOptionsGlobal["Current_Profile"])
profileName = ShestakUIOptions[i] and ShestakUIOptions[i]["general"] and ShestakUIOptions[i]["general"]["profile_name"] or i
end
StaticPopup_Show("SHESTAKUI_RENAME_PROFILE", _, _, profileName)
end
end)
tinsert(ns.buttons, RenameButton)
local status = ProfileListPanel:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
status:SetPoint("BOTTOM", ProfileListPanel, "BOTTOM", 0, 35)
status:SetWidth(200)
status:SetTextColor(0.8, 0.2, 0)
local selfTextExport
StaticPopupDialogs.SHESTAKUI_EXPORT_PROFILE = {
text = L.profile_export,
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()
selfTextExport = 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(selfTextExport)
self:HighlightText()
end
end,
preferredIndex = 5,
}
local profileVar = "General"
local function startExport()
local Prefix = "ShestakUI:Profile:"
local LibDeflate = LibStub:GetLibrary("LibDeflate")
local LibSerialize = LibStub("LibSerialize")
local Serialized
if profileVar == "General" then
local i = tostring(ShestakUIOptionsGlobal["Current_Profile"])
Serialized = LibSerialize:Serialize(ShestakUIOptions[i])
elseif profileVar == "Personal" then
local i = tostring(ShestakUIOptionsGlobal[realm]["Current_Profile"][name])
Serialized = LibSerialize:Serialize(ShestakUIOptionsPerChar[i])
elseif profileVar == "Mover" then
local i = tostring(ShestakUIOptionsGlobal["Current_Profile"])
Serialized = LibSerialize:Serialize(ShestakUIPositions[i])
elseif profileVar == "Mover_Personal" then
local i = tostring(ShestakUIOptionsGlobal[realm]["Current_Profile"][name])
Serialized = LibSerialize:Serialize(ShestakUIPositionsPerChar[i])
end
local Compressed = LibDeflate:CompressDeflate(Serialized)
local Encoded = LibDeflate:EncodeForPrint(Compressed)
local Result = Prefix..Encoded
StaticPopup_Show("SHESTAKUI_EXPORT_PROFILE", _, _, Result)
end
local selfTextImport
local importVar = "General"
StaticPopupDialogs.SHESTAKUI_IMPORT_PROFILE = {
text = L.profile_import,
button1 = ACCEPT,
button2 = CANCEL,
timeout = 0,
whileDead = true,
hasEditBox = true,
editBoxWidth = 350,
EditBoxOnEscapePressed = function(self) self:GetParent():Hide() end,
EditBoxOnTextChanged = function(self)
selfTextImport = self:GetText()
end,
OnAccept = function(self)
local Code = selfTextImport
local Prefix = "ShestakUI:Profile:"
local LibDeflate = LibStub:GetLibrary("LibDeflate")
local LibSerialize = LibStub("LibSerialize")
local LibCode = string.gsub(Code, Prefix, "")
local Decoded = LibDeflate:DecodeForPrint(LibCode)
if Decoded then
local Decompressed = LibDeflate:DecompressDeflate(Decoded)
local Success, Table = LibSerialize:Deserialize(Decompressed)
if Success then
if profileVar == "General" then
local i = tostring(ShestakUIOptionsGlobal["Current_Profile"])
ShestakUIOptions[i] = Table
elseif profileVar == "Personal" then
local i = tostring(ShestakUIOptionsGlobal[realm]["Current_Profile"][name])
ShestakUIOptionsPerChar[i] = Table
elseif profileVar == "Mover" then
local i = tostring(ShestakUIOptionsGlobal["Current_Profile"])
ShestakUIPositions[i] = Table
elseif profileVar == "Mover_Personal" then
local i = tostring(ShestakUIOptionsGlobal[realm]["Current_Profile"][name])
ShestakUIPositionsPerChar[i] = Table
end
ReloadUI()
else
status:SetText(L.profile_error_code)
end
else
status:SetText(L.profile_error_code)
end
end,
preferredIndex = 5,
}
local subheader = ProfileListPanel:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
subheader:SetPoint("TOPLEFT", RenameButton, 15, -40)
subheader:SetText(L.profile_options)
subheader:SetTextColor(179/255, 211/255, 243/255)
local ExportButton = CreateFrame("Button", "ProfileListPanelExportButton", ProfileList, "UIPanelButtonTemplate")
ExportButton:SetPoint("TOPLEFT", subheader, 10, -20)
ExportButton:SetSize(100, 23)
ExportButton:SetText(L.profile_export)
ExportButton:SetScript("OnClick", function()
profileVar = ShestakUIOptionsGlobal[realm][name] and "Personal" or "General"
startExport()
end)
tinsert(ns.buttons, ExportButton)
local ImportButton = CreateFrame("Button", "ProfileListPaneImportButton", ProfileList, "UIPanelButtonTemplate")
ImportButton:SetPoint("LEFT", ExportButton, "RIGHT", 10, 0)
ImportButton:SetSize(100, 23)
ImportButton:SetText(L.profile_import)
ImportButton:SetScript("OnClick", function()
profileVar = ShestakUIOptionsGlobal[realm][name] and "Personal" or "General"
StaticPopup_Show("SHESTAKUI_IMPORT_PROFILE")
end)
tinsert(ns.buttons, ImportButton)
local subheader = ProfileListPanel:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
subheader:SetPoint("TOPLEFT", ExportButton, -10, -35)
subheader:SetText(L.profile_movers)
subheader:SetTextColor(179/255, 211/255, 243/255)
local ExportMoveButton = CreateFrame("Button", "ProfileListPanelExportMoveButton", ProfileList, "UIPanelButtonTemplate")
ExportMoveButton:SetPoint("TOPLEFT", subheader, 10, -20)
ExportMoveButton:SetSize(100, 23)
ExportMoveButton:SetText(L.profile_export)
ExportMoveButton:SetScript("OnClick", function()
profileVar = ShestakUIOptionsGlobal[realm][name] and "Mover_Personal" or "Mover"
startExport()
end)
tinsert(ns.buttons, ExportMoveButton)
local ImportMoveButton = CreateFrame("Button", "ProfileListPaneImportMoveButton", ProfileList, "UIPanelButtonTemplate")
ImportMoveButton:SetPoint("LEFT", ExportMoveButton, "RIGHT", 10, 0)
ImportMoveButton:SetSize(100, 23)
ImportMoveButton:SetText(L.profile_import)
ImportMoveButton:SetScript("OnClick", function()
profileVar = ShestakUIOptionsGlobal[realm][name] and "Mover_Personal" or "Mover"
StaticPopup_Show("SHESTAKUI_IMPORT_PROFILE")
end)
tinsert(ns.buttons, ImportMoveButton)
C_Timer.After(0.3, function() -- need to grab SavedVariables and loaded libraries
local LibDeflate = LibStub and LibStub:GetLibrary("LibDeflate", true)
local LibSerialize = LibStub and LibStub:GetLibrary("LibSerialize", true)
local LibsExist = LibDeflate and LibSerialize
if not LibsExist then
ExportButton:Disable()
ImportButton:Disable()
ExportMoveButton:Disable()
ImportMoveButton:Disable()
status:SetText(L.profile_error_lib)
end
-- Use existing function in Core.lua to create dropdown with name via SavedVariables
local function SaveValue(f, value)
if not C.options[f.group] then C.options[f.group] = {} end
if not C.options[f.group][f.option] then C.options[f.group][f.option] = {} end
C.options[f.group][f.option] = value -- these are the saved variables
C[f.group][f.option] = value -- and this is from the lua options
end
local old = {}
local function checkIsReloadNeeded()
for frame, value in pairs(old) do
if C[frame.group][frame.option] ~= value then
ns.setReloadNeeded(true)
return
end
end
ns.setReloadNeeded(false)
end
local function GetProfileName(key)
if ShestakUIOptionsGlobal[realm][name] then
local i = tostring(key)
if ShestakUIOptionsPerChar[i] and ShestakUIOptionsPerChar[i]["general"] and ShestakUIOptionsPerChar[i]["general"]["profile_name"] then
return ShestakUIOptionsPerChar[i]["general"]["profile_name"]
end
else
local i = tostring(key)
if ShestakUIOptions[i] and ShestakUIOptions[i]["general"] and ShestakUIOptions[i]["general"]["profile_name"] then
return ShestakUIOptions[i]["general"]["profile_name"]
end
end
end
local CreateDropDown = function(parent, option, needsReload, text, tableValue)
local f = CreateFrame("Frame", parent:GetName()..option.."DropDown", parent, "UIDropDownMenuTemplate")
UIDropDownMenu_SetWidth(f, 110)
UIDropDownMenu_Initialize(f, function(self)
local info = UIDropDownMenu_CreateInfo()
info.func = self.SetValue
for key, value in pairs(tableValue) do
info.text = GetProfileName(key) or value
info.arg1 = value
info.arg2 = key
info.checked = value == f.selectedValue
if isFont then
local fObject = CreateFont(info.text)
fObject:SetFont(value, 12, "")
info.fontObject = fObject
end
UIDropDownMenu_AddButton(info)
end
end)
function f:SetValue(newValue, newkey)
f.selectedValue = newValue
local text = GetProfileName(newkey) or newValue
UIDropDownMenu_SetText(f, text)
if ShestakUIOptionsGlobal[realm][name] then
ShestakUIOptionsGlobal[realm]["Current_Profile"][name] = newValue
else
ShestakUIOptionsGlobal["Current_Profile"] = newValue
end
SaveValue(f, newValue)
old[f] = f.oldValue
checkIsReloadNeeded()
CloseDropDownMenus()
end
local label = f:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
if text then
label:SetText(text)
else
label:SetText(ns[parent.tag.."_"..option])
end
label:SetHeight(20)
label:SetJustifyH("LEFT")
label:SetPoint("LEFT", 160, 4)
f.label = label
f.tooltipText = ns[parent.tag.."_"..option.."_desc"]
if f.tooltipText then
f:SetScript("OnEnter", function()
GameTooltip:SetOwner(f, "ANCHOR_RIGHT", 0, 0)
GameTooltip:SetText(f.tooltipText, nil, nil, nil, nil, true)
end)
f:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
end
f.group = parent.tag
f.option = option
f.needsReload = needsReload
parent[option] = f
return f
end
local choose_profile = CreateDropDown(ShestakUIOptionsPanel.general, "choose_profile", true, L.profile_choose, {1, 2, 3})
choose_profile:SetPoint("TOPLEFT", ProfileList, "TOPLEFT", -15, -46)
choose_profile:SetParent(ProfileListPanel)
local value = ShestakUIOptionsGlobal[realm][name] and ShestakUIOptionsGlobal[realm]["Current_Profile"][name] or ShestakUIOptionsGlobal["Current_Profile"]
choose_profile.selectedValue = value
choose_profile.oldValue = value
local text
if ShestakUIOptionsGlobal[realm][name] then
local i = tostring(ShestakUIOptionsGlobal[realm]["Current_Profile"][name])
text = ShestakUIOptionsPerChar[i] and ShestakUIOptionsPerChar[i]["general"] and ShestakUIOptionsPerChar[i]["general"]["profile_name"]
else
local i = tostring(ShestakUIOptionsGlobal["Current_Profile"])
text = ShestakUIOptions[i] and ShestakUIOptions[i]["general"] and ShestakUIOptions[i]["general"]["profile_name"]
end
text = text or value
UIDropDownMenu_SetText(choose_profile, text)
end)
end
-- Font
do
local parent = ShestakUIOptionsPanel.font
local subheader = ns.addSubCategory(parent, L.font_subheader_unit)
subheader:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local unit_frames_font = ns.CreateDropDown(parent, "unit_frames_font", true, L.font_stats_font, FontTable, LSM and true, true)
unit_frames_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local unit_frames_font_style = ns.CreateDropDown(parent, "unit_frames_font_style", true, L.font_stats_font_style, FlagsTable)
unit_frames_font_style:SetPoint("LEFT", unit_frames_font, "RIGHT", 150, 0)
local unit_frames_font_size = ns.CreateNumberSlider(parent, "unit_frames_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
unit_frames_font_size:SetPoint("TOPLEFT", unit_frames_font, "BOTTOMLEFT", 16, -16)
local unit_frames_font_shadow = ns.CreateCheckBox(parent, "unit_frames_font_shadow", L.font_stats_font_shadow)
unit_frames_font_shadow:SetPoint("LEFT", unit_frames_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_aura)
subheader:SetPoint("TOPLEFT", unit_frames_font_size, "BOTTOMLEFT", 0, -10)
local auras_font = ns.CreateDropDown(parent, "auras_font", true, L.font_stats_font, FontTable, LSM and true, true)
auras_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local auras_font_style = ns.CreateDropDown(parent, "auras_font_style", true, L.font_stats_font_style, FlagsTable)
auras_font_style:SetPoint("LEFT", auras_font, "RIGHT", 150, 0)
local auras_font_size = ns.CreateNumberSlider(parent, "auras_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
auras_font_size:SetPoint("TOPLEFT", auras_font, "BOTTOMLEFT", 16, -16)
local auras_font_shadow = ns.CreateCheckBox(parent, "auras_font_shadow", L.font_stats_font_shadow)
auras_font_shadow:SetPoint("LEFT", auras_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_nameplates)
subheader:SetPoint("TOPLEFT", auras_font_size, "BOTTOMLEFT", 0, -10)
local nameplates_font = ns.CreateDropDown(parent, "nameplates_font", true, L.font_stats_font, FontTable, LSM and true, true)
nameplates_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local nameplates_font_style = ns.CreateDropDown(parent, "nameplates_font_style", true, L.font_stats_font_style, FlagsTable)
nameplates_font_style:SetPoint("LEFT", nameplates_font, "RIGHT", 150, 0)
local nameplates_font_size = ns.CreateNumberSlider(parent, "nameplates_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
nameplates_font_size:SetPoint("TOPLEFT", nameplates_font, "BOTTOMLEFT", 16, -16)
local nameplates_font_shadow = ns.CreateCheckBox(parent, "nameplates_font_shadow", L.font_stats_font_shadow)
nameplates_font_shadow:SetPoint("LEFT", nameplates_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_action)
subheader:SetPoint("TOPLEFT", nameplates_font_size, "BOTTOMLEFT", 0, -10)
local action_bars_font = ns.CreateDropDown(parent, "action_bars_font", true, L.font_stats_font, FontTable, LSM and true, true)
action_bars_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local action_bars_font_style = ns.CreateDropDown(parent, "action_bars_font_style", true, L.font_stats_font_style, FlagsTable)
action_bars_font_style:SetPoint("LEFT", action_bars_font, "RIGHT", 150, 0)
local action_bars_font_size = ns.CreateNumberSlider(parent, "action_bars_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
action_bars_font_size:SetPoint("TOPLEFT", action_bars_font, "BOTTOMLEFT", 16, -16)
local action_bars_font_shadow = ns.CreateCheckBox(parent, "action_bars_font_shadow", L.font_stats_font_shadow)
action_bars_font_shadow:SetPoint("LEFT", action_bars_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_cooldown)
subheader:SetPoint("TOPLEFT", action_bars_font_size, "BOTTOMLEFT", 0, -10)
local cooldown_timers_font = ns.CreateDropDown(parent, "cooldown_timers_font", true, L.font_stats_font, FontTable, LSM and true, true)
cooldown_timers_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local cooldown_timers_font_style = ns.CreateDropDown(parent, "cooldown_timers_font_style", true, L.font_stats_font_style, FlagsTable)
cooldown_timers_font_style:SetPoint("LEFT", cooldown_timers_font, "RIGHT", 150, 0)
local cooldown_timers_font_size = ns.CreateNumberSlider(parent, "cooldown_timers_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
cooldown_timers_font_size:SetPoint("TOPLEFT", cooldown_timers_font, "BOTTOMLEFT", 16, -16)
local cooldown_timers_font_shadow = ns.CreateCheckBox(parent, "cooldown_timers_font_shadow", L.font_stats_font_shadow)
cooldown_timers_font_shadow:SetPoint("LEFT", cooldown_timers_font_size, "RIGHT", 160, 0)
local global_font = ns.CreateCheckBox(parent, "global_font")
global_font:SetPoint("TOPLEFT", cooldown_timers_font_size, "BOTTOMLEFT", 0, -30)
-- Panel 2
local parent = ShestakUIOptionsPanel.font2
local subheader = ns.addSubCategory(parent, L.font_subheader_combat)
subheader:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local combat_text_font = ns.CreateDropDown(parent, "combat_text_font", true, L.font_stats_font, FontTable, LSM and true, true)
combat_text_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local combat_text_font_style = ns.CreateDropDown(parent, "combat_text_font_style", true, L.font_stats_font_style, FlagsTable)
combat_text_font_style:SetPoint("LEFT", combat_text_font, "RIGHT", 150, 0)
local combat_text_font_size = ns.CreateNumberSlider(parent, "combat_text_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
combat_text_font_size:SetPoint("TOPLEFT", combat_text_font, "BOTTOMLEFT", 16, -16)
local combat_text_font_shadow = ns.CreateCheckBox(parent, "combat_text_font_shadow", L.font_stats_font_shadow)
combat_text_font_shadow:SetPoint("LEFT", combat_text_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_filger)
subheader:SetPoint("TOPLEFT", combat_text_font_size, "BOTTOMLEFT", 0, -10)
local filger_font = ns.CreateDropDown(parent, "filger_font", true, L.font_stats_font, FontTable, LSM and true, true)
filger_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local filger_font_style = ns.CreateDropDown(parent, "filger_font_style", true, L.font_stats_font_style, FlagsTable)
filger_font_style:SetPoint("LEFT", filger_font, "RIGHT", 150, 0)
local filger_font_size = ns.CreateNumberSlider(parent, "filger_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
filger_font_size:SetPoint("TOPLEFT", filger_font, "BOTTOMLEFT", 16, -16)
local filger_font_shadow = ns.CreateCheckBox(parent, "filger_font_shadow", L.font_stats_font_shadow)
filger_font_shadow:SetPoint("LEFT", filger_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_threat)
subheader:SetPoint("TOPLEFT", filger_font_size, "BOTTOMLEFT", 0, -10)
local threat_meter_font = ns.CreateDropDown(parent, "threat_meter_font", true, L.font_stats_font, FontTable, LSM and true, true)
threat_meter_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local threat_meter_font_style = ns.CreateDropDown(parent, "threat_meter_font_style", true, L.font_stats_font_style, FlagsTable)
threat_meter_font_style:SetPoint("LEFT", threat_meter_font, "RIGHT", 150, 0)
local threat_meter_font_size = ns.CreateNumberSlider(parent, "threat_meter_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
threat_meter_font_size:SetPoint("TOPLEFT", threat_meter_font, "BOTTOMLEFT", 16, -16)
local threat_meter_font_shadow = ns.CreateCheckBox(parent, "threat_meter_font_shadow", L.font_stats_font_shadow)
threat_meter_font_shadow:SetPoint("LEFT", threat_meter_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_raidcd)
subheader:SetPoint("TOPLEFT", threat_meter_font_size, "BOTTOMLEFT", 0, -10)
local raid_cooldowns_font = ns.CreateDropDown(parent, "raid_cooldowns_font", true, L.font_stats_font, FontTable, LSM and true, true)
raid_cooldowns_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local raid_cooldowns_font_style = ns.CreateDropDown(parent, "raid_cooldowns_font_style", true, L.font_stats_font_style, FlagsTable)
raid_cooldowns_font_style:SetPoint("LEFT", raid_cooldowns_font, "RIGHT", 150, 0)
local raid_cooldowns_font_size = ns.CreateNumberSlider(parent, "raid_cooldowns_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
raid_cooldowns_font_size:SetPoint("TOPLEFT", raid_cooldowns_font, "BOTTOMLEFT", 16, -16)
local raid_cooldowns_font_shadow = ns.CreateCheckBox(parent, "raid_cooldowns_font_shadow", L.font_stats_font_shadow)
raid_cooldowns_font_shadow:SetPoint("LEFT", raid_cooldowns_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_loot)
subheader:SetPoint("TOPLEFT", raid_cooldowns_font_size, "BOTTOMLEFT", 0, -10)
local loot_font = ns.CreateDropDown(parent, "loot_font", true, L.font_stats_font, FontTable, LSM and true, true)
loot_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local loot_font_style = ns.CreateDropDown(parent, "loot_font_style", true, L.font_stats_font_style, FlagsTable)
loot_font_style:SetPoint("LEFT", loot_font, "RIGHT", 150, 0)
local loot_font_size = ns.CreateNumberSlider(parent, "loot_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
loot_font_size:SetPoint("TOPLEFT", loot_font, "BOTTOMLEFT", 16, -16)
local loot_font_shadow = ns.CreateCheckBox(parent, "loot_font_shadow", L.font_stats_font_shadow)
loot_font_shadow:SetPoint("LEFT", loot_font_size, "RIGHT", 160, 0)
-- Panel 3
local parent = ShestakUIOptionsPanel.font3
local subheader = ns.addSubCategory(parent, L.font_subheader_bag)
subheader:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local bags_font = ns.CreateDropDown(parent, "bags_font", true, L.font_stats_font, FontTable, LSM and true, true)
bags_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local bags_font_style = ns.CreateDropDown(parent, "bags_font_style", true, L.font_stats_font_style, FlagsTable)
bags_font_style:SetPoint("LEFT", bags_font, "RIGHT", 150, 0)
local bags_font_size = ns.CreateNumberSlider(parent, "bags_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
bags_font_size:SetPoint("TOPLEFT", bags_font, "BOTTOMLEFT", 16, -16)
local bags_font_shadow = ns.CreateCheckBox(parent, "bags_font_shadow", L.font_stats_font_shadow)
bags_font_shadow:SetPoint("LEFT", bags_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_chat)
subheader:SetPoint("TOPLEFT", bags_font_size, "BOTTOMLEFT", 0, -10)
local chat_font = ns.CreateDropDown(parent, "chat_font", true, L.font_stats_font, FontTable, LSM and true, true)
chat_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local chat_font_style = ns.CreateDropDown(parent, "chat_font_style", true, L.font_stats_font_style, FlagsTable)
chat_font_style:SetPoint("LEFT", chat_font, "RIGHT", 150, 0)
local chat_font_shadow = ns.CreateCheckBox(parent, "chat_font_shadow", L.font_stats_font_shadow)
chat_font_shadow:SetPoint("TOPLEFT", chat_font, "BOTTOMLEFT", 16, -7)
local subheader = ns.addSubCategory(parent, L.font_subheader_chat_tabs)
subheader:SetPoint("TOPLEFT", chat_font_shadow, "BOTTOMLEFT", 0, -10)
local chat_tabs_font = ns.CreateDropDown(parent, "chat_tabs_font", true, L.font_stats_font, FontTable, LSM and true, true)
chat_tabs_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local chat_tabs_font_style = ns.CreateDropDown(parent, "chat_tabs_font_style", true, L.font_stats_font_style, FlagsTable)
chat_tabs_font_style:SetPoint("LEFT", chat_tabs_font, "RIGHT", 150, 0)
local chat_tabs_font_size = ns.CreateNumberSlider(parent, "chat_tabs_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
chat_tabs_font_size:SetPoint("TOPLEFT", chat_tabs_font, "BOTTOMLEFT", 16, -16)
local chat_tabs_font_shadow = ns.CreateCheckBox(parent, "chat_tabs_font_shadow", L.font_stats_font_shadow)
chat_tabs_font_shadow:SetPoint("LEFT", chat_tabs_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_style)
subheader:SetPoint("TOPLEFT", chat_tabs_font_size, "BOTTOMLEFT", 0, -10)
local stylization_font = ns.CreateDropDown(parent, "stylization_font", true, L.font_stats_font, FontTable, LSM and true, true)
stylization_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local stylization_font_style = ns.CreateDropDown(parent, "stylization_font_style", true, L.font_stats_font_style, FlagsTable)
stylization_font_style:SetPoint("LEFT", stylization_font, "RIGHT", 150, 0)
local stylization_font_size = ns.CreateNumberSlider(parent, "stylization_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
stylization_font_size:SetPoint("TOPLEFT", stylization_font, "BOTTOMLEFT", 16, -16)
local stylization_font_shadow = ns.CreateCheckBox(parent, "stylization_font_shadow", L.font_stats_font_shadow)
stylization_font_shadow:SetPoint("LEFT", stylization_font_size, "RIGHT", 160, 0)
local subheader = ns.addSubCategory(parent, L.font_subheader_stats)
subheader:SetPoint("TOPLEFT", stylization_font_size, "BOTTOMLEFT", 0, -10)
local stats_font = ns.CreateDropDown(parent, "stats_font", true, nil, FontTable, LSM and true, true)
stats_font:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
local stats_font_style = ns.CreateDropDown(parent, "stats_font_style", true, nil, FlagsTable)
stats_font_style:SetPoint("LEFT", stats_font, "RIGHT", 150, 0)
local stats_font_size = ns.CreateNumberSlider(parent, "stats_font_size", nil, nil, 8, 48, 1, true, FONT_SIZE)
stats_font_size:SetPoint("TOPLEFT", stats_font, "BOTTOMLEFT", 16, -16)
local stats_font_shadow = ns.CreateCheckBox(parent, "stats_font_shadow")
stats_font_shadow:SetPoint("LEFT", stats_font_size, "RIGHT", 160, 0)
-- Panel 3
local parent = ShestakUIOptionsPanel.font4
local subheader = ns.addSubCategory(parent, L.font_subheader_blizzard)
subheader:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local tooltip_header_font_size = ns.CreateNumberSlider(parent, "tooltip_header_font_size", nil, nil, 10, 22, 1, true)
tooltip_header_font_size:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local tooltip_font_size = ns.CreateNumberSlider(parent, "tooltip_font_size", nil, nil, 10, 22, 1, true)
tooltip_font_size:SetPoint("LEFT", tooltip_header_font_size, "RIGHT", 120, 0)
local bubble_font_size = ns.CreateNumberSlider(parent, "bubble_font_size", nil, nil, 10, 24, 1, true, CHAT_BUBBLES_TEXT)
bubble_font_size:SetPoint("TOPLEFT", tooltip_header_font_size, "BOTTOMLEFT", 0, -20)
end
-- Skins
do
local parent = ShestakUIOptionsPanel.skins
local blizzard_frames = ns.CreateCheckBox(parent, "blizzard_frames", L_GUI_SKINS_BLIZZARD)
blizzard_frames:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local bubbles = ns.CreateCheckBox(parent, "bubbles")
bubbles:SetPoint("TOPLEFT", blizzard_frames, "BOTTOMLEFT", 0, 0)
local minimap_buttons = ns.CreateCheckBox(parent, "minimap_buttons", L_GUI_SKINS_MINIMAP_BUTTONS)
minimap_buttons:SetPoint("TOPLEFT", bubbles, "BOTTOMLEFT", 0, 0)
local minimap_buttons_mouseover = ns.CreateCheckBox(parent, "minimap_buttons_mouseover")
minimap_buttons_mouseover:SetPoint("TOPLEFT", minimap_buttons, "BOTTOMLEFT", 20, 0)
-- Addons
local subheader = ns.addSubCategory(parent, L_GUI_SKINS_SUBHEADER)
subheader:SetPoint("TOPLEFT", minimap_buttons_mouseover, "BOTTOMLEFT", -20, -16)
local ace3 = ns.CreateCheckBox(parent, "ace3")
ace3:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local skinTable = {
{"atlasloot"},
{"bigwigs"},
{"blood_shield_tracker"},
{"capping"},
{"clique"},
{"cool_line"},
{"dbm"},
{"details"},
{"dominos"},
{"flyout_button"},
{"ls_toasts"},
{"mage_nuggets"},
{"my_role_play"},
{"npcscan"},
{"nug_running"},
{"omen"},
{"opie"},
{"ovale"},
{"postal"},
{"recount"},
{"rematch"},
{"skada"},
{"tiny_dps"},
{"vanaskos"},
{"weak_auras"},
}
local last
for i = 1, #skinTable do
local name = tostring(unpack(skinTable[i]))
local addon
if i == 1 then
addon = ns.CreateCheckBox(parent, name)
addon:SetPoint("LEFT", ace3, "RIGHT", 320, 0)
last = ace3
elseif i % 2 == 0 then
addon = ns.CreateCheckBox(parent, name)
addon:SetPoint("TOPLEFT", last, "BOTTOMLEFT", 0, 0)
last = addon
else
addon = ns.CreateCheckBox(parent, name)
addon:SetPoint("LEFT", last, "RIGHT", 320, 0)
end
end
end
-- Unit Frames
do
local parent = ShestakUIOptionsPanel.unitframe
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_UF_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local own_color = ns.CreateCheckBox(parent, "own_color", L_GUI_UF_OWN_COLOR)
own_color:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, 0)
local uf_color = ns.CreateColourPicker(parent, "uf_color", true, L_GUI_UF_UF_COLOR)
uf_color:SetPoint("TOPLEFT", own_color, "BOTTOMLEFT", 24, -4)
local uf_color_bg = ns.CreateColourPicker(parent, "uf_color_bg", true)
uf_color_bg:SetPoint("LEFT", uf_color, "RIGHT", 248, 0)
local enemy_health_color = ns.CreateCheckBox(parent, "enemy_health_color")
enemy_health_color:SetPoint("TOPLEFT", uf_color, "BOTTOMLEFT", -24, -4)
local show_total_value = ns.CreateCheckBox(parent, "show_total_value", L_GUI_UF_TOTAL_VALUE)
show_total_value:SetPoint("TOPLEFT", enemy_health_color, "BOTTOMLEFT", 0, 0)
local color_value = ns.CreateCheckBox(parent, "color_value", L_GUI_UF_COLOR_VALUE)
color_value:SetPoint("TOPLEFT", show_total_value, "BOTTOMLEFT", 0, 0)
local bar_color_value = ns.CreateCheckBox(parent, "bar_color_value", L_GUI_UF_BAR_COLOR_VALUE)
bar_color_value:SetPoint("TOPLEFT", color_value, "BOTTOMLEFT", 0, 0)
local lines = ns.CreateCheckBox(parent, "lines", L_GUI_UF_LINES)
lines:SetPoint("TOPLEFT", bar_color_value, "BOTTOMLEFT", 0, 0)
-- Cast bars
local subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_CAST)
subheader:SetPoint("TOPLEFT", lines, "BOTTOMLEFT", 0, -16)
local unit_castbar = ns.CreateCheckBox(parent, "unit_castbar", L_GUI_UF_UNIT_CASTBAR)
unit_castbar:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local castbar_icon = ns.CreateCheckBox(parent, "castbar_icon", L_GUI_UF_CASTBAR_ICON)
castbar_icon:SetPoint("TOPLEFT", unit_castbar, "BOTTOMLEFT", 0, 0)
local castbar_latency = ns.CreateCheckBox(parent, "castbar_latency", L_GUI_UF_CASTBAR_LATENCY)
castbar_latency:SetPoint("TOPLEFT", castbar_icon, "BOTTOMLEFT", 0, 0)
local castbar_ticks = ns.CreateCheckBox(parent, "castbar_ticks", L_GUI_UF_CASTBAR_TICKS)
castbar_ticks:SetPoint("TOPLEFT", castbar_latency, "BOTTOMLEFT", 0, 0)
-- Frames
local subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_FRAMES)
subheader:SetPoint("TOPLEFT", castbar_ticks, "BOTTOMLEFT", 0, -16)
local show_pet = ns.CreateCheckBox(parent, "show_pet", L_GUI_UF_SHOW_PET)
show_pet:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local show_focus = ns.CreateCheckBox(parent, "show_focus", L_GUI_UF_SHOW_FOCUS)
show_focus:SetPoint("TOPLEFT", show_pet, "BOTTOMLEFT", 0, 0)
local show_target_target = ns.CreateCheckBox(parent, "show_target_target", L_GUI_UF_SHOW_TOT)
show_target_target:SetPoint("LEFT", show_focus, "RIGHT", 248, 0)
local show_boss = ns.CreateCheckBox(parent, "show_boss", L_GUI_UF_SHOW_BOSS)
show_boss:SetPoint("TOPLEFT", show_focus, "BOTTOMLEFT", 0, 0)
local boss_on_right = ns.CreateCheckBox(parent, "boss_on_right", L_GUI_UF_BOSS_RIGHT)
boss_on_right:SetPoint("LEFT", show_boss, "RIGHT", 248, 0)
local show_arena = ns.CreateCheckBox(parent, "show_arena", L_GUI_UF_SHOW_ARENA)
show_arena:SetPoint("TOPLEFT", show_boss, "BOTTOMLEFT", 0, 0)
local arena_on_right = ns.CreateCheckBox(parent, "arena_on_right", L_GUI_UF_ARENA_RIGHT)
arena_on_right:SetPoint("LEFT", show_arena, "RIGHT", 248, 0)
-- Panel 2
local parent = ShestakUIOptionsPanel.unitframe2
local icons_pvp = ns.CreateCheckBox(parent, "icons_pvp")
icons_pvp:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local icons_combat = ns.CreateCheckBox(parent, "icons_combat", L_GUI_UF_ICONS_COMBAT)
icons_combat:SetPoint("TOPLEFT", icons_pvp, "BOTTOMLEFT", 0, 0)
local icons_resting = ns.CreateCheckBox(parent, "icons_resting", L_GUI_UF_ICONS_RESTING)
icons_resting:SetPoint("TOPLEFT", icons_combat, "BOTTOMLEFT", 0, 0)
-- Portraits
local subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_PORTRAIT)
subheader:SetPoint("TOPLEFT", icons_resting, "BOTTOMLEFT", 0, -16)
local portrait_enable = ns.CreateCheckBox(parent, "portrait_enable", L_GUI_UF_PORTRAIT_ENABLE)
portrait_enable:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local portrait_classcolor_border = ns.CreateCheckBox(parent, "portrait_classcolor_border", L_GUI_UF_PORTRAIT_CLASSCOLOR_BORDER)
portrait_classcolor_border:SetPoint("TOPLEFT", portrait_enable, "BOTTOMLEFT", 0, 0)
local portrait_type = ns.CreateDropDown(parent, "portrait_type", true, nil, PortraitTable)
portrait_type:SetPoint("TOPLEFT", portrait_classcolor_border, "BOTTOMLEFT", -16, -10)
local portrait_height = ns.CreateNumberSlider(parent, "portrait_height", nil, nil, 0, 190, 1, true, L_GUI_UF_PORTRAIT_HEIGHT)
portrait_height:SetPoint("TOPLEFT", portrait_type, "BOTTOMLEFT", 16, -16)
local portrait_width = ns.CreateNumberSlider(parent, "portrait_width", nil, nil, 0, 130, 1, true, L_GUI_UF_PORTRAIT_WIDTH)
portrait_width:SetPoint("LEFT", portrait_height, "RIGHT", 120, 0)
-- Plugins
local subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_PLUGINS)
subheader:SetPoint("TOPLEFT", portrait_height, "BOTTOMLEFT", 0, -16)
local plugins_gcd = ns.CreateCheckBox(parent, "plugins_gcd", L_GUI_UF_PLUGINS_GCD)
plugins_gcd:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local plugins_swing = ns.CreateCheckBox(parent, "plugins_swing", L_GUI_UF_PLUGINS_SWING)
plugins_swing:SetPoint("TOPLEFT", plugins_gcd, "BOTTOMLEFT", 0, 0)
local plugins_experience_bar = ns.CreateCheckBox(parent, "plugins_experience_bar")
plugins_experience_bar:SetPoint("TOPLEFT", plugins_swing, "BOTTOMLEFT", 0, 0)
local plugins_reputation_bar = ns.CreateCheckBox(parent, "plugins_reputation_bar")
plugins_reputation_bar:SetPoint("TOPLEFT", plugins_experience_bar, "BOTTOMLEFT", 0, 0)
local plugins_smooth_bar = ns.CreateCheckBox(parent, "plugins_smooth_bar", L_GUI_UF_PLUGINS_SMOOTH_BAR)
plugins_smooth_bar:SetPoint("TOPLEFT", plugins_reputation_bar, "BOTTOMLEFT", 0, 0)
local plugins_enemy_spec = ns.CreateCheckBox(parent, "plugins_enemy_spec", L_GUI_UF_PLUGINS_ENEMY_SPEC)
plugins_enemy_spec:SetPoint("TOPLEFT", plugins_smooth_bar, "BOTTOMLEFT", 0, 0)
local plugins_combat_feedback = ns.CreateCheckBox(parent, "plugins_combat_feedback", L_GUI_UF_PLUGINS_COMBAT_FEEDBACK)
plugins_combat_feedback:SetPoint("TOPLEFT", plugins_enemy_spec, "BOTTOMLEFT", 0, 0)
local plugins_fader = ns.CreateCheckBox(parent, "plugins_fader", L_GUI_UF_PLUGINS_FADER)
plugins_fader:SetPoint("TOPLEFT", plugins_combat_feedback, "BOTTOMLEFT", 0, 0)
local plugins_diminishing = ns.CreateCheckBox(parent, "plugins_diminishing", L_GUI_UF_PLUGINS_DIMINISHING)
plugins_diminishing:SetPoint("TOPLEFT", plugins_fader, "BOTTOMLEFT", 0, 0)
local plugins_power_prediction = ns.CreateCheckBox(parent, "plugins_power_prediction", L_GUI_UF_PLUGINS_POWER_PREDICTION)
plugins_power_prediction:SetPoint("TOPLEFT", plugins_diminishing, "BOTTOMLEFT", 0, 0)
local plugins_absorbs = ns.CreateCheckBox(parent, "plugins_absorbs")
plugins_absorbs:SetPoint("TOPLEFT", plugins_power_prediction, "BOTTOMLEFT", 0, 0)
-- Panel 3
local parent = ShestakUIOptionsPanel.unitframe3
local subheader = ns.addSubCategory(parent, L.unitframe_subheader_player_width)
subheader:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local player_width = ns.CreateNumberSlider(parent, "player_width", nil, nil, 105, 400, 1, true)
player_width:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -28)
local subheader = ns.addSubCategory(parent, L.unitframe_subheader_boss_width)
subheader:SetPoint("TOPLEFT", player_width, "BOTTOMLEFT", 0, -10)
local boss_width = ns.CreateNumberSlider(parent, "boss_width", nil, nil, 105, 300, 1, true, L.unitframe_player_width)
boss_width:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -28)
local extra_height_auto = ns.CreateCheckBox(parent, "extra_height_auto")
extra_height_auto:SetPoint("TOPLEFT", boss_width, "BOTTOMLEFT", 0, -10)
local extra_health_height = ns.CreateNumberSlider(parent, "extra_health_height", nil, nil, 0, 40, 1, true)
extra_health_height:SetPoint("TOPLEFT", extra_height_auto, "BOTTOMLEFT", 0, -20)
local extra_power_height = ns.CreateNumberSlider(parent, "extra_power_height", nil, nil, 0, 20, 1, true)
extra_power_height:SetPoint("LEFT", extra_health_height, "RIGHT", 120, 0)
local subheader = ns.addSubCategory(parent, L.unitframe_subheader_castbar)
subheader:SetPoint("TOPLEFT", extra_health_height, "BOTTOMLEFT", 0, -10)
local castbar_width = ns.CreateNumberSlider(parent, "castbar_width", nil, nil, 190, 450, 1, true, L.unitframe_player_width)
castbar_width:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -28)
local castbar_height = ns.CreateNumberSlider(parent, "castbar_height", nil, nil, 16, 40, 1, true)
castbar_height:SetPoint("LEFT", castbar_width, "RIGHT", 120, 0)
local function toggleOptions()
local shown = not extra_height_auto:GetChecked()
extra_health_height:SetShown(shown)
extra_power_height:SetShown(shown)
end
extra_height_auto:HookScript("OnClick", toggleOptions)
extra_health_height:HookScript("OnShow", toggleOptions)
end
-- Unit Frames Class bar
do
local parent = ShestakUIOptionsPanel.unitframe_class_bar
local combo = ns.CreateCheckBox(parent, "combo", L_GUI_UF_PLUGINS_COMBO_BAR)
combo:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local combo_always = ns.CreateCheckBox(parent, "combo_always", L_GUI_UF_PLUGINS_COMBO_BAR_ALWAYS)
combo_always:SetPoint("TOPLEFT", combo, "BOTTOMLEFT", 20, 0)
local combo_old = ns.CreateCheckBox(parent, "combo_old", L_GUI_UF_PLUGINS_COMBO_BAR_OLD)
combo_old:SetPoint("TOPLEFT", combo_always, "BOTTOMLEFT", 0, 0)
combo.children = {combo_always, combo_old}
local arcane = ns.CreateCheckBox(parent, "arcane", L_GUI_UF_PLUGINS_ARCANE_BAR)
arcane:SetPoint("TOPLEFT", combo_old, "BOTTOMLEFT", -20, 0)
local chi = ns.CreateCheckBox(parent, "chi", L_GUI_UF_PLUGINS_CHI_BAR)
chi:SetPoint("TOPLEFT", arcane, "BOTTOMLEFT", 0, 0)
local essence = ns.CreateCheckBox(parent, "essence")
essence:SetPoint("TOPLEFT", chi, "BOTTOMLEFT", 0, 0)
local stagger = ns.CreateCheckBox(parent, "stagger", L_GUI_UF_PLUGINS_STAGGER_BAR)
stagger:SetPoint("TOPLEFT", essence, "BOTTOMLEFT", 0, 0)
local holy = ns.CreateCheckBox(parent, "holy", L_GUI_UF_PLUGINS_HOLY_BAR)
holy:SetPoint("TOPLEFT", stagger, "BOTTOMLEFT", 0, 0)
local shard = ns.CreateCheckBox(parent, "shard", L_GUI_UF_PLUGINS_SHARD_BAR)
shard:SetPoint("TOPLEFT", holy, "BOTTOMLEFT", 0, 0)
local rune = ns.CreateCheckBox(parent, "rune", L_GUI_UF_PLUGINS_RUNE_BAR)
rune:SetPoint("TOPLEFT", shard, "BOTTOMLEFT", 0, 0)
local totem = ns.CreateCheckBox(parent, "totem", L_GUI_UF_PLUGINS_TOTEM_BAR)
totem:SetPoint("TOPLEFT", rune, "BOTTOMLEFT", 0, 0)
local totem_other = ns.CreateCheckBox(parent, "totem_other")
totem_other:SetPoint("TOPLEFT", totem, "BOTTOMLEFT", 20, 0)
totem.children = {totem_other}
end
-- Raid Frames
do
local parent = ShestakUIOptionsPanel.raidframe
local layout = ns.CreateDropDown(parent, "layout", true, nil, RaidTable)
layout:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", -16, 0)
local show_party = ns.CreateCheckBox(parent, "show_party", L_GUI_UF_SHOW_PARTY)
show_party:SetPoint("TOPLEFT", layout, "BOTTOMLEFT", 16, 0)
local show_raid = ns.CreateCheckBox(parent, "show_raid", L_GUI_UF_SHOW_RAID)
show_raid:SetPoint("LEFT", show_party, "RIGHT", 248, 0)
local show_target = ns.CreateCheckBox(parent, "show_target")
show_target:SetPoint("TOPLEFT", show_party, "BOTTOMLEFT", 0, 0)
local show_pet = ns.CreateCheckBox(parent, "show_pet")
show_pet:SetPoint("LEFT", show_target, "RIGHT", 248, 0)
local raid_tanks = ns.CreateCheckBox(parent, "raid_tanks", L_GUI_UF_SHOW_TANK)
raid_tanks:SetPoint("TOPLEFT", show_target, "BOTTOMLEFT", 0, 0)
local raid_tanks_tt = ns.CreateCheckBox(parent, "raid_tanks_tt", L_GUI_UF_SHOW_TANK_TT)
raid_tanks_tt:SetPoint("LEFT", raid_tanks, "RIGHT", 248, 0)
local solo_mode = ns.CreateCheckBox(parent, "solo_mode", L_GUI_UF_SOLO_MODE)
solo_mode:SetPoint("TOPLEFT", raid_tanks, "BOTTOMLEFT", 0, 0)
local player_in_party = ns.CreateCheckBox(parent, "player_in_party", L_GUI_UF_PLAYER_PARTY)
player_in_party:SetPoint("LEFT", solo_mode, "RIGHT", 248, 0)
local raid_groups = ns.CreateNumberSlider(parent, "raid_groups", nil, nil, 1, 8, 1, true, L_GUI_UF_RAID_GROUP)
raid_groups:SetPoint("TOPLEFT", solo_mode, "BOTTOMLEFT", 0, -20)
local auto_position = ns.CreateDropDown(parent, "auto_position", true, L.raidframe_auto_position, {"DYNAMIC", "STATIC", "NONE"})
auto_position:SetPoint("TOPLEFT", raid_groups, "BOTTOMLEFT", -16, -10)
local party_vertical = ns.CreateCheckBox(parent, "party_vertical", nil, L.raidframe_raid_groups_vertical_desc)
party_vertical:SetPoint("TOPLEFT", auto_position, "BOTTOMLEFT", 16, 0)
local raid_groups_vertical = ns.CreateCheckBox(parent, "raid_groups_vertical")
raid_groups_vertical:SetPoint("TOPLEFT", party_vertical, "BOTTOMLEFT", 0, 0)
local vertical_health = ns.CreateCheckBox(parent, "vertical_health")
vertical_health:SetPoint("TOPLEFT", raid_groups_vertical, "BOTTOMLEFT", 0, 0)
local by_role = ns.CreateCheckBox(parent, "by_role", L_GUI_UF_BY_ROLE)
by_role:SetPoint("TOPLEFT", vertical_health, "BOTTOMLEFT", 0, 0)
local aggro_border = ns.CreateCheckBox(parent, "aggro_border", L_GUI_UF_AGGRO_BORDER)
aggro_border:SetPoint("TOPLEFT", by_role, "BOTTOMLEFT", 0, 0)
local deficit_health = ns.CreateCheckBox(parent, "deficit_health", L_GUI_UF_DEFICIT_HEALTH)
deficit_health:SetPoint("TOPLEFT", aggro_border, "BOTTOMLEFT", 0, 0)
local hide_health_value = ns.CreateCheckBox(parent, "hide_health_value")
hide_health_value:SetPoint("TOPLEFT", deficit_health, "BOTTOMLEFT", 0, 0)
local alpha_health = ns.CreateCheckBox(parent, "alpha_health", L_GUI_UF_ALPHA_HEALTH)
alpha_health:SetPoint("TOPLEFT", hide_health_value, "BOTTOMLEFT", 0, 0)
local show_range = ns.CreateCheckBox(parent, "show_range", L_GUI_UF_SHOW_RANGE)
show_range:SetPoint("TOPLEFT", alpha_health, "BOTTOMLEFT", 0, 0)
local range_alpha = ns.CreateNumberSlider(parent, "range_alpha", nil, nil, 0, 1, 0.05, true, L_GUI_UF_RANGE_ALPHA, L_GUI_UF_RANGE_ALPHA_DESC)
range_alpha:SetPoint("TOPLEFT", show_range, "BOTTOMLEFT", 0, -20)
-- Icons
local subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_ICONS)
subheader:SetPoint("TOPLEFT", range_alpha, "BOTTOMLEFT", 0, -10)
local icons_role = ns.CreateCheckBox(parent, "icons_role", L_GUI_UF_ICONS_ROLE)
icons_role:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local icons_raid_mark = ns.CreateCheckBox(parent, "icons_raid_mark", L_GUI_UF_ICONS_RAID_MARK)
icons_raid_mark:SetPoint("LEFT", icons_role, "RIGHT", 248, 0)
local icons_ready_check = ns.CreateCheckBox(parent, "icons_ready_check", L_GUI_UF_ICONS_READY_CHECK)
icons_ready_check:SetPoint("TOPLEFT", icons_role, "BOTTOMLEFT", 0, 0)
local icons_leader = ns.CreateCheckBox(parent, "icons_leader", L_GUI_UF_ICONS_LEADER)
icons_leader:SetPoint("LEFT", icons_ready_check, "RIGHT", 248, 0)
local icons_sumon = ns.CreateCheckBox(parent, "icons_sumon", L_GUI_UF_ICONS_SUMON)
icons_sumon:SetPoint("TOPLEFT", icons_ready_check, "BOTTOMLEFT", 0, 0)
local icons_phase = ns.CreateCheckBox(parent, "icons_phase")
icons_phase:SetPoint("LEFT", icons_sumon, "RIGHT", 248, 0)
-- Panel 2
local parent = ShestakUIOptionsPanel.raidframe2
local plugins_aura_watch = ns.CreateCheckBox(parent, "plugins_aura_watch")
plugins_aura_watch:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local ListButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
ListButton:SetPoint("LEFT", plugins_aura_watch, "RIGHT", 400, 0)
ListButton:SetSize(100, 23)
ListButton:SetText(ADD)
ListButton:SetWidth(ListButton.Text:GetWidth() + 15)
ListButton:SetScript("OnClick", function()
if not C.options["raidframe"] then
C.options["raidframe"] = {}
end
if not C.options["raidframe"]["plugins_aura_watch_list"] then
C.options["raidframe"]["plugins_aura_watch_list"] = {}
end
BuildSpellList(C.options["raidframe"]["plugins_aura_watch_list"])
end)
tinsert(ns.buttons, ListButton)
local function toggleListButton()
local shown = plugins_aura_watch:GetChecked()
ListButton:SetEnabled(shown)
end
plugins_aura_watch:HookScript("OnClick", toggleListButton)
ListButton:HookScript("OnShow", toggleListButton)
local plugins_aura_watch_timer = ns.CreateCheckBox(parent, "plugins_aura_watch_timer")
plugins_aura_watch_timer:SetPoint("TOPLEFT", plugins_aura_watch, "BOTTOMLEFT", 20, 0)
local plugins_debuffhighlight_icon = ns.CreateCheckBox(parent, "plugins_debuffhighlight_icon")
plugins_debuffhighlight_icon:SetPoint("TOPLEFT", plugins_aura_watch_timer, "BOTTOMLEFT", 0, 0)
local plugins_pvp_debuffs = ns.CreateCheckBox(parent, "plugins_pvp_debuffs")
plugins_pvp_debuffs:SetPoint("TOPLEFT", plugins_debuffhighlight_icon, "BOTTOMLEFT", 0, 0)
plugins_aura_watch.children = {plugins_aura_watch_timer, plugins_debuffhighlight_icon, plugins_pvp_debuffs}
local plugins_healcomm = ns.CreateCheckBox(parent, "plugins_healcomm", L_GUI_UF_PLUGINS_HEALCOMM)
plugins_healcomm:SetPoint("TOPLEFT", plugins_pvp_debuffs, "BOTTOMLEFT", -20, 0)
local plugins_over_absorb = ns.CreateCheckBox(parent, "plugins_over_absorb")
plugins_over_absorb:SetPoint("TOPLEFT", plugins_healcomm, "BOTTOMLEFT", 20, 0)
local plugins_over_heal_absorb = ns.CreateCheckBox(parent, "plugins_over_heal_absorb")
plugins_over_heal_absorb:SetPoint("TOPLEFT", plugins_over_absorb, "BOTTOMLEFT", 0, 0)
local plugins_auto_resurrection = ns.CreateCheckBox(parent, "plugins_auto_resurrection")
plugins_auto_resurrection:SetPoint("TOPLEFT", plugins_over_heal_absorb, "BOTTOMLEFT", -20, 0)
-- Heal layout size
local subheader = ns.addSubCategory(parent, L.raidframe_subheader_heal_size)
subheader:SetPoint("TOPLEFT", plugins_auto_resurrection, "BOTTOMLEFT", 0, -10)
local heal_party_width = ns.CreateNumberSlider(parent, "heal_party_width", nil, nil, 50, 200, 1, true, L.raidframe_dps_party_width)
heal_party_width:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local heal_party_height = ns.CreateNumberSlider(parent, "heal_party_height", nil, nil, 20, 200, 1, true, L.raidframe_dps_party_height)
heal_party_height:SetPoint("LEFT", heal_party_width, "RIGHT", 120, 0)
local heal_raid_width = ns.CreateNumberSlider(parent, "heal_raid_width", nil, nil, 50, 200, 1, true, L.raidframe_dps_raid_width)
heal_raid_width:SetPoint("TOPLEFT", heal_party_width, "BOTTOMLEFT", 0, -20)
local heal_raid_height = ns.CreateNumberSlider(parent, "heal_raid_height", nil, nil, 20, 200, 1, true, L.raidframe_dps_raid_height)
heal_raid_height:SetPoint("LEFT", heal_raid_width, "RIGHT", 120, 0)
local heal_party_power_height = ns.CreateNumberSlider(parent, "heal_party_power_height", nil, nil, 0, 10, 1, true, L.raidframe_dps_party_power_height)
heal_party_power_height:SetPoint("TOPLEFT", heal_raid_width, "BOTTOMLEFT", 0, -20)
local heal_raid_power_height = ns.CreateNumberSlider(parent, "heal_raid_power_height", nil, nil, 0, 10, 1, true, L.raidframe_dps_raid_power_height)
heal_raid_power_height:SetPoint("LEFT", heal_party_power_height, "RIGHT", 120, 0)
-- DPS layout size
local subheader = ns.addSubCategory(parent, L.raidframe_subheader_dps_size)
subheader:SetPoint("TOPLEFT", heal_party_power_height, "BOTTOMLEFT", 0, -10)
local dps_party_width = ns.CreateNumberSlider(parent, "dps_party_width", nil, nil, 80, 300, 1, true)
dps_party_width:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local dps_party_height = ns.CreateNumberSlider(parent, "dps_party_height", nil, nil, 15, 60, 1, true)
dps_party_height:SetPoint("LEFT", dps_party_width, "RIGHT", 120, 0)
local dps_raid_width = ns.CreateNumberSlider(parent, "dps_raid_width", nil, nil, 80, 200, 1, true)
dps_raid_width:SetPoint("TOPLEFT", dps_party_width, "BOTTOMLEFT", 0, -20)
local dps_raid_height = ns.CreateNumberSlider(parent, "dps_raid_height", nil, nil, 15, 40, 1, true)
dps_raid_height:SetPoint("LEFT", dps_raid_width, "RIGHT", 120, 0)
local dps_party_power_height = ns.CreateNumberSlider(parent, "dps_party_power_height", nil, nil, 0, 10, 1, true)
dps_party_power_height:SetPoint("TOPLEFT", dps_raid_width, "BOTTOMLEFT", 0, -20)
local dps_raid_power_height = ns.CreateNumberSlider(parent, "dps_raid_power_height", nil, nil, 0, 10, 1, true)
dps_raid_power_height:SetPoint("LEFT", dps_party_power_height, "RIGHT", 120, 0)
end
-- Auras/Buffs/Debuffs
do
local parent = ShestakUIOptionsPanel.aura
local show_spiral = ns.CreateCheckBox(parent, "show_spiral", L_GUI_AURA_SHOW_SPIRAL)
show_spiral:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local show_timer = ns.CreateCheckBox(parent, "show_timer", L_GUI_AURA_SHOW_TIMER)
show_timer:SetPoint("TOPLEFT", show_spiral, "BOTTOMLEFT", 0, 0)
local cast_by = ns.CreateCheckBox(parent, "cast_by", L_GUI_AURA_CAST_BY)
cast_by:SetPoint("TOPLEFT", show_timer, "BOTTOMLEFT", 0, 0)
-- Buffs
local subheader = ns.addSubCategory(parent, L.aura_subheader_buffs)
subheader:SetPoint("TOPLEFT", cast_by, "BOTTOMLEFT", 0, -10)
local player_auras = ns.CreateCheckBox(parent, "player_auras", L_GUI_AURA_PLAYER_AURAS)
player_auras:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -10)
local classcolor_border = ns.CreateCheckBox(parent, "classcolor_border", L_GUI_AURA_CLASSCOLOR_BORDER)
classcolor_border:SetPoint("TOPLEFT", player_auras, "BOTTOMLEFT", 0, 0)
local player_buff_size = ns.CreateNumberSlider(parent, "player_buff_size", nil, nil, 0, 50, 1, true, L_GUI_AURA_PLAYER_BUFF_SIZE, L_GUI_AURA_PLAYER_BUFF_SIZE_DESC)
player_buff_size:SetPoint("TOPLEFT", classcolor_border, "BOTTOMLEFT", 0, -20)
-- Debuffs
local subheader = ns.addSubCategory(parent, L.aura_subheader_debuffs)
subheader:SetPoint("TOPLEFT", player_buff_size, "BOTTOMLEFT", 0, -10)
local target_auras = ns.CreateCheckBox(parent, "target_auras", L_GUI_AURA_TARGET_AURAS)
target_auras:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -10)
local tot_debuffs = ns.CreateCheckBox(parent, "tot_debuffs", L_GUI_AURA_TOT_DEBUFFS)
tot_debuffs:SetPoint("LEFT", target_auras, "RIGHT", 320, 0)
local focus_debuffs = ns.CreateCheckBox(parent, "focus_debuffs", L_GUI_AURA_FOCUS_DEBUFFS)
focus_debuffs:SetPoint("TOPLEFT", target_auras, "BOTTOMLEFT", 0, 0)
local fot_debuffs = ns.CreateCheckBox(parent, "fot_debuffs", L_GUI_AURA_FOT_DEBUFFS)
fot_debuffs:SetPoint("LEFT", focus_debuffs, "RIGHT", 320, 0)
local pet_debuffs = ns.CreateCheckBox(parent, "pet_debuffs", L_GUI_AURA_PET_DEBUFFS)
pet_debuffs:SetPoint("TOPLEFT", focus_debuffs, "BOTTOMLEFT", 0, 0)
local player_aura_only = ns.CreateCheckBox(parent, "player_aura_only", L_GUI_AURA_PLAYER_AURA_ONLY)
player_aura_only:SetPoint("TOPLEFT", pet_debuffs, "BOTTOMLEFT", 0, 0)
local debuff_color_type = ns.CreateCheckBox(parent, "debuff_color_type", L_GUI_AURA_DEBUFF_COLOR_TYPE)
debuff_color_type:SetPoint("TOPLEFT", player_aura_only, "BOTTOMLEFT", 0, 0)
local debuff_size = ns.CreateNumberSlider(parent, "debuff_size", nil, nil, 0, 50, 1, true)
debuff_size:SetPoint("TOPLEFT", debuff_color_type, "BOTTOMLEFT", 0, -20)
-- Boss auras
local subheader = ns.addSubCategory(parent, L.aura_subheader_boss)
subheader:SetPoint("TOPLEFT", debuff_size, "BOTTOMLEFT", 0, -10)
local boss_auras = ns.CreateCheckBox(parent, "boss_auras", ENABLE)
boss_auras:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -10)
local boss_debuffs = ns.CreateNumberSlider(parent, "boss_debuffs", nil, nil, 0, 5, 1, true, L_GUI_UF_BOSS_DEBUFFS, L_GUI_UF_BOSS_DEBUFFS_DESC)
boss_debuffs:SetPoint("TOPLEFT", boss_auras, "BOTTOMLEFT", 0, -20)
local boss_buffs = ns.CreateNumberSlider(parent, "boss_buffs", nil, nil, 0, 3, 1, true, L_GUI_UF_BOSS_BUFFS, L_GUI_UF_BOSS_BUFFS_DESC)
boss_buffs:SetPoint("LEFT", boss_debuffs, "RIGHT", 120, 0)
end
-- ActionBar
do
local parent = ShestakUIOptionsPanel.actionbar
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_ACTIONBAR_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local hotkey = ns.CreateCheckBox(parent, "hotkey", L_GUI_ACTIONBAR_HOTKEY)
hotkey:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, 0)
local macro = ns.CreateCheckBox(parent, "macro", L_GUI_ACTIONBAR_MACRO)
macro:SetPoint("TOPLEFT", hotkey, "BOTTOMLEFT", 0, 0)
local show_grid = ns.CreateCheckBox(parent, "show_grid", L_GUI_ACTIONBAR_GRID)
show_grid:SetPoint("TOPLEFT", macro, "BOTTOMLEFT", 0, 0)
local button_size = ns.CreateNumberSlider(parent, "button_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
button_size:SetPoint("TOPLEFT", show_grid, "BOTTOMLEFT", 0, -20)
local button_space = ns.CreateNumberSlider(parent, "button_space", nil, nil, 0, 10, 1, true, L_GUI_ACTIONBAR_BUTTON_SPACE)
button_space:SetPoint("LEFT", button_size, "RIGHT", 120, 0)
local split_bars = ns.CreateCheckBox(parent, "split_bars", L_GUI_ACTIONBAR_SPLIT_BARS)
split_bars:SetPoint("TOPLEFT", button_size, "BOTTOMLEFT", 0, -10)
local classcolor_border = ns.CreateCheckBox(parent, "classcolor_border", L_GUI_ACTIONBAR_CLASSCOLOR_BORDER)
classcolor_border:SetPoint("TOPLEFT", split_bars, "BOTTOMLEFT", 0, 0)
local hide_highlight = ns.CreateCheckBox(parent, "hide_highlight", L_GUI_ACTIONBAR_HIDE_HIGHLIGHT)
hide_highlight:SetPoint("TOPLEFT", classcolor_border, "BOTTOMLEFT", 0, 0)
local toggle_mode = ns.CreateCheckBox(parent, "toggle_mode")
toggle_mode:SetPoint("TOPLEFT", hide_highlight, "BOTTOMLEFT", 0, 0)
local bottombars = ns.CreateNumberSlider(parent, "bottombars", nil, nil, 1, 3, 1, true, L_GUI_ACTIONBAR_BOTTOMBARS)
bottombars:SetPoint("TOPLEFT", toggle_mode, "BOTTOMLEFT", 0, -20)
local rightbars = ns.CreateNumberSlider(parent, "rightbars", nil, nil, 0, 3, 1, true, L_GUI_ACTIONBAR_RIGHTBARS)
rightbars:SetPoint("LEFT", bottombars, "RIGHT", 120, 0)
local bottombars_mouseover = ns.CreateCheckBox(parent, "bottombars_mouseover")
bottombars_mouseover:SetPoint("TOPLEFT", bottombars, "BOTTOMLEFT", 0, -10)
local rightbars_mouseover = ns.CreateCheckBox(parent, "rightbars_mouseover", L_GUI_ACTIONBAR_RIGHTBARS_MOUSEOVER)
rightbars_mouseover:SetPoint("TOPLEFT", bottombars_mouseover, "BOTTOMLEFT", 0, 0)
local petbar_hide = ns.CreateCheckBox(parent, "petbar_hide", L_GUI_ACTIONBAR_PETBAR_HIDE)
petbar_hide:SetPoint("TOPLEFT", rightbars_mouseover, "BOTTOMLEFT", 0, 0)
local petbar_horizontal = ns.CreateCheckBox(parent, "petbar_horizontal", L_GUI_ACTIONBAR_PETBAR_HORIZONTAL)
petbar_horizontal:SetPoint("TOPLEFT", petbar_hide, "BOTTOMLEFT", 0, 0)
local petbar_mouseover = ns.CreateCheckBox(parent, "petbar_mouseover", L_GUI_ACTIONBAR_PETBAR_MOUSEOVER)
petbar_mouseover:SetPoint("TOPLEFT", petbar_horizontal, "BOTTOMLEFT", 20, 0)
-- petbar_horizontal.children = {petbar_mouseover}
local stancebar_hide = ns.CreateCheckBox(parent, "stancebar_hide", L_GUI_ACTIONBAR_STANCEBAR_HIDE)
stancebar_hide:SetPoint("TOPLEFT", petbar_mouseover, "BOTTOMLEFT", -20, 0)
local stancebar_horizontal = ns.CreateCheckBox(parent, "stancebar_horizontal", L_GUI_ACTIONBAR_STANCEBAR_HORIZONTAL)
stancebar_horizontal:SetPoint("TOPLEFT", stancebar_hide, "BOTTOMLEFT", 0, 0)
local stancebar_mouseover = ns.CreateCheckBox(parent, "stancebar_mouseover", L_GUI_ACTIONBAR_STANCEBAR_MOUSEOVER)
stancebar_mouseover:SetPoint("TOPLEFT", stancebar_horizontal, "BOTTOMLEFT", 20, 0)
-- stancebar_horizontal.children = {stancebar_mouseover}
local micromenu = ns.CreateCheckBox(parent, "micromenu", L_GUI_ACTIONBAR_MICROMENU)
micromenu:SetPoint("TOPLEFT", stancebar_mouseover, "BOTTOMLEFT", -20, 0)
local micromenu_mouseover = ns.CreateCheckBox(parent, "micromenu_mouseover", L_GUI_ACTIONBAR_MICROMENU_MOUSEOVER)
micromenu_mouseover:SetPoint("TOPLEFT", micromenu, "BOTTOMLEFT", 20, 0)
micromenu.children = {micromenu_mouseover}
-- Panel 2
local parent = ShestakUIOptionsPanel.actionbar2
local editor = ns.CreateCheckBox(parent, "editor")
editor:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
-- Bar 1
local subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR.." 1")
subheader:SetPoint("TOPLEFT", editor, "BOTTOMLEFT", 0, -10)
local bar1_num = ns.CreateNumberSlider(parent, "bar1_num", nil, nil, 0, 12, 1, true)
bar1_num:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local bar1_row = ns.CreateNumberSlider(parent, "bar1_row", nil, nil, 1, 12, 1, true)
bar1_row:SetPoint("LEFT", bar1_num, "RIGHT", 120, 0)
local bar1_size = ns.CreateNumberSlider(parent, "bar1_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
bar1_size:SetPoint("TOPLEFT", bar1_num, "BOTTOMLEFT", 0, -20)
local bar1_mouseover = ns.CreateCheckBox(parent, "bar1_mouseover")
bar1_mouseover:SetPoint("LEFT", bar1_size, "RIGHT", 130, 0)
-- Bar 2
local subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR.." 2")
subheader:SetPoint("TOPLEFT", bar1_size, "BOTTOMLEFT", 0, -10)
local bar2_num = ns.CreateNumberSlider(parent, "bar2_num", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)
bar2_num:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local bar2_row = ns.CreateNumberSlider(parent, "bar2_row", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)
bar2_row:SetPoint("LEFT", bar2_num, "RIGHT", 120, 0)
local bar2_size = ns.CreateNumberSlider(parent, "bar2_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
bar2_size:SetPoint("TOPLEFT", bar2_num, "BOTTOMLEFT", 0, -20)
local bar2_mouseover = ns.CreateCheckBox(parent, "bar2_mouseover", L.actionbar_bar1_mouseover)
bar2_mouseover:SetPoint("LEFT", bar2_size, "RIGHT", 130, 0)
-- Bar 3
local subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR.." 3")
subheader:SetPoint("TOPLEFT", bar2_size, "BOTTOMLEFT", 0, -10)
local bar3_num = ns.CreateNumberSlider(parent, "bar3_num", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)
bar3_num:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local bar3_row = ns.CreateNumberSlider(parent, "bar3_row", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)
bar3_row:SetPoint("LEFT", bar3_num, "RIGHT", 120, 0)
local bar3_size = ns.CreateNumberSlider(parent, "bar3_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
bar3_size:SetPoint("TOPLEFT", bar3_num, "BOTTOMLEFT", 0, -20)
local bar3_mouseover = ns.CreateCheckBox(parent, "bar3_mouseover", L.actionbar_bar1_mouseover)
bar3_mouseover:SetPoint("LEFT", bar3_size, "RIGHT", 130, 0)
-- Bar 4
local subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR.." 4")
subheader:SetPoint("TOPLEFT", bar3_size, "BOTTOMLEFT", 0, -10)
local bar4_num = ns.CreateNumberSlider(parent, "bar4_num", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)
bar4_num:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local bar4_row = ns.CreateNumberSlider(parent, "bar4_row", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)
bar4_row:SetPoint("LEFT", bar4_num, "RIGHT", 120, 0)
local bar4_size = ns.CreateNumberSlider(parent, "bar4_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
bar4_size:SetPoint("TOPLEFT", bar4_num, "BOTTOMLEFT", 0, -20)
local bar4_mouseover = ns.CreateCheckBox(parent, "bar4_mouseover", L.actionbar_bar1_mouseover)
bar4_mouseover:SetPoint("LEFT", bar4_size, "RIGHT", 130, 0)
-- Bar 5
local subheader = ns.addSubCategory(editor, BINDING_HEADER_ACTIONBAR.." 5")
subheader:SetPoint("TOPLEFT", bar4_size, "BOTTOMLEFT", 0, -10)
local bar5_num = ns.CreateNumberSlider(parent, "bar5_num", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)
bar5_num:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local bar5_row = ns.CreateNumberSlider(parent, "bar5_row", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)
bar5_row:SetPoint("LEFT", bar5_num, "RIGHT", 120, 0)
local bar5_size = ns.CreateNumberSlider(parent, "bar5_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
bar5_size:SetPoint("TOPLEFT", bar5_num, "BOTTOMLEFT", 0, -20)
local bar5_mouseover = ns.CreateCheckBox(parent, "bar5_mouseover", L.actionbar_bar1_mouseover)
bar5_mouseover:SetPoint("LEFT", bar5_size, "RIGHT", 130, 0)
-- Panel 2
local parent = ShestakUIOptionsPanel.actionbar3
-- Bar 6
local subheader = ns.addSubCategory(parent, BINDING_HEADER_ACTIONBAR.." 6")
subheader:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, -10)
local bar6_num = ns.CreateNumberSlider(parent, "bar6_num", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)
bar6_num:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local bar6_row = ns.CreateNumberSlider(parent, "bar6_row", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)
bar6_row:SetPoint("LEFT", bar6_num, "RIGHT", 120, 0)
local bar6_size = ns.CreateNumberSlider(parent, "bar6_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
bar6_size:SetPoint("TOPLEFT", bar6_num, "BOTTOMLEFT", 0, -20)
local bar6_mouseover = ns.CreateCheckBox(parent, "bar6_mouseover", L.actionbar_bar1_mouseover)
bar6_mouseover:SetPoint("LEFT", bar6_size, "RIGHT", 130, 0)
-- Bar 7
local subheader = ns.addSubCategory(parent, BINDING_HEADER_ACTIONBAR.." 7")
subheader:SetPoint("TOPLEFT", bar6_size, "BOTTOMLEFT", 0, -10)
local bar7_enable = ns.CreateCheckBox(parent, "bar7_enable", ENABLE)
bar7_enable:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -10)
local bar7_num = ns.CreateNumberSlider(parent, "bar7_num", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)
bar7_num:SetPoint("TOPLEFT", bar7_enable, "BOTTOMLEFT", 0, -20)
local bar7_row = ns.CreateNumberSlider(parent, "bar7_row", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)
bar7_row:SetPoint("LEFT", bar7_num, "RIGHT", 120, 0)
local bar7_size = ns.CreateNumberSlider(parent, "bar7_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
bar7_size:SetPoint("TOPLEFT", bar7_num, "BOTTOMLEFT", 0, -20)
local bar7_mouseover = ns.CreateCheckBox(parent, "bar7_mouseover", L.actionbar_bar1_mouseover)
bar7_mouseover:SetPoint("LEFT", bar7_size, "RIGHT", 130, 0)
-- Bar 8
local subheader = ns.addSubCategory(parent, BINDING_HEADER_ACTIONBAR.." 8")
subheader:SetPoint("TOPLEFT", bar7_size, "BOTTOMLEFT", 0, -10)
local bar8_enable = ns.CreateCheckBox(parent, "bar8_enable", ENABLE)
bar8_enable:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -10)
local bar8_num = ns.CreateNumberSlider(parent, "bar8_num", nil, nil, 0, 12, 1, true, L.actionbar_bar1_num)
bar8_num:SetPoint("TOPLEFT", bar8_enable, "BOTTOMLEFT", 0, -20)
local bar8_row = ns.CreateNumberSlider(parent, "bar8_row", nil, nil, 1, 12, 1, true, L.actionbar_bar1_row)
bar8_row:SetPoint("LEFT", bar8_num, "RIGHT", 120, 0)
local bar8_size = ns.CreateNumberSlider(parent, "bar8_size", nil, nil, 0, 50, 1, true, L_GUI_ACTIONBAR_BUTTON_SIZE)
bar8_size:SetPoint("TOPLEFT", bar8_num, "BOTTOMLEFT", 0, -20)
local bar8_mouseover = ns.CreateCheckBox(parent, "bar8_mouseover", L.actionbar_bar1_mouseover)
bar8_mouseover:SetPoint("LEFT", bar8_size, "RIGHT", 130, 0)
end
-- Tooltip
do
local parent = ShestakUIOptionsPanel.tooltip
local enable = ns.CreateCheckBox(parent, "enable")
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local shift_modifer = ns.CreateCheckBox(parent, "shift_modifer")
shift_modifer:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, 0)
local cursor = ns.CreateCheckBox(parent, "cursor")
cursor:SetPoint("TOPLEFT", shift_modifer, "BOTTOMLEFT", 0, 0)
local item_icon = ns.CreateCheckBox(parent, "item_icon")
item_icon:SetPoint("TOPLEFT", cursor, "BOTTOMLEFT", 0, 0)
local health_value = ns.CreateCheckBox(parent, "health_value")
health_value:SetPoint("TOPLEFT", item_icon, "BOTTOMLEFT", 0, 0)
local hidebuttons = ns.CreateCheckBox(parent, "hidebuttons")
hidebuttons:SetPoint("TOPLEFT", health_value, "BOTTOMLEFT", 0, 0)
local hide_combat = ns.CreateCheckBox(parent, "hide_combat")
hide_combat:SetPoint("TOPLEFT", hidebuttons, "BOTTOMLEFT", 0, 0)
-- Plugins
local subheader = ns.addSubCategory(parent, L_GUI_UF_SUBHEADER_PLUGINS)
subheader:SetPoint("TOPLEFT", hide_combat, "BOTTOMLEFT", 0, -16)
local title = ns.CreateCheckBox(parent, "title")
title:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local realm = ns.CreateCheckBox(parent, "realm")
realm:SetPoint("LEFT", title, "RIGHT", 320, 0)
local target = ns.CreateCheckBox(parent, "target")
target:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, 0)
local rank = ns.CreateCheckBox(parent, "rank")
rank:SetPoint("LEFT", target, "RIGHT", 320, 0)
local talents = ns.CreateCheckBox(parent, "talents")
talents:SetPoint("TOPLEFT", target, "BOTTOMLEFT", 0, 0)
local average_lvl = ns.CreateCheckBox(parent, "average_lvl", STAT_AVERAGE_ITEM_LEVEL)
average_lvl:SetPoint("LEFT", talents, "RIGHT", 320, 0)
local show_shift = ns.CreateCheckBox(parent, "show_shift")
show_shift:SetPoint("TOPLEFT", talents, "BOTTOMLEFT", 20, 0)
local raid_icon = ns.CreateCheckBox(parent, "raid_icon")
raid_icon:SetPoint("TOPLEFT", show_shift, "BOTTOMLEFT", -20, 0)
local unit_role = ns.CreateCheckBox(parent, "unit_role")
unit_role:SetPoint("LEFT", raid_icon, "RIGHT", 320, 0)
local who_targetting = ns.CreateCheckBox(parent, "who_targetting")
who_targetting:SetPoint("TOPLEFT", raid_icon, "BOTTOMLEFT", 0, 0)
local spell_id = ns.CreateCheckBox(parent, "spell_id")
spell_id:SetPoint("TOPLEFT", who_targetting, "BOTTOMLEFT", 0, 0)
local item_count = ns.CreateCheckBox(parent, "item_count")
item_count:SetPoint("TOPLEFT", spell_id, "BOTTOMLEFT", 0, 0)
local achievements = ns.CreateCheckBox(parent, "achievements")
achievements:SetPoint("TOPLEFT", item_count, "BOTTOMLEFT", 0, 0)
local instance_lock = ns.CreateCheckBox(parent, "instance_lock")
instance_lock:SetPoint("TOPLEFT", achievements, "BOTTOMLEFT", 0, 0)
local mount = ns.CreateCheckBox(parent, "mount")
mount:SetPoint("TOPLEFT", instance_lock, "BOTTOMLEFT", 0, 0)
end
-- Chat
do
local parent = ShestakUIOptionsPanel.chat
local enable = ns.CreateCheckBox(parent, "enable")
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local width = ns.CreateNumberSlider(parent, "width", nil, nil, 0, 750, 1, true)
width:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, -20)
local height = ns.CreateNumberSlider(parent, "height", nil, nil, 0, 300, 1, true)
height:SetPoint("LEFT", width, "RIGHT", 120, 0)
local background = ns.CreateCheckBox(parent, "background")
background:SetPoint("TOPLEFT", width, "BOTTOMLEFT", 0, -10)
local background_alpha = ns.CreateNumberSlider(parent, "background_alpha", nil, nil, 0, 1, 0.05, true)
background_alpha:SetPoint("TOPLEFT", background, "BOTTOMLEFT", 0, -20)
local filter = ns.CreateCheckBox(parent, "filter")
filter:SetPoint("TOPLEFT", background_alpha, "BOTTOMLEFT", 0, -10)
local spam = ns.CreateCheckBox(parent, "spam")
spam:SetPoint("TOPLEFT", filter, "BOTTOMLEFT", 0, 0)
local spam_list = ns.CreateEditBox(parent, "spam_list", true)
spam_list:SetPoint("TOPLEFT", spam, "BOTTOMLEFT", 6, -10)
spam_list:SetWidth(200)
spam_list:SetMaxLetters(40)
local chat_bar = ns.CreateCheckBox(parent, "chat_bar")
chat_bar:SetPoint("TOPLEFT", spam_list, "BOTTOMLEFT", -6, -10)
local chat_bar_mouseover = ns.CreateCheckBox(parent, "chat_bar_mouseover")
chat_bar_mouseover:SetPoint("TOPLEFT", chat_bar, "BOTTOMLEFT", 20, 0)
chat_bar.children = {chat_bar_mouseover}
local whisp_sound = ns.CreateCheckBox(parent, "whisp_sound")
whisp_sound:SetPoint("TOPLEFT", chat_bar_mouseover, "BOTTOMLEFT", -20, 0)
local combatlog = ns.CreateCheckBox(parent, "combatlog")
combatlog:SetPoint("TOPLEFT", whisp_sound, "BOTTOMLEFT", 0, 0)
local tabs_mouseover = ns.CreateCheckBox(parent, "tabs_mouseover")
tabs_mouseover:SetPoint("TOPLEFT", combatlog, "BOTTOMLEFT", 0, 0)
local sticky = ns.CreateCheckBox(parent, "sticky")
sticky:SetPoint("TOPLEFT", tabs_mouseover, "BOTTOMLEFT", 0, 0)
local damage_meter_spam = ns.CreateCheckBox(parent, "damage_meter_spam")
damage_meter_spam:SetPoint("TOPLEFT", sticky, "BOTTOMLEFT", 0, 0)
local loot_icons = ns.CreateCheckBox(parent, "loot_icons")
loot_icons:SetPoint("TOPLEFT", damage_meter_spam, "BOTTOMLEFT", 0, 0)
local role_icons = ns.CreateCheckBox(parent, "role_icons", L.tooltip_unit_role)
role_icons:SetPoint("TOPLEFT", loot_icons, "BOTTOMLEFT", 0, 0)
local history = ns.CreateCheckBox(parent, "history", HISTORY)
history:SetPoint("TOPLEFT", role_icons, "BOTTOMLEFT", 0, 0)
local hide_combat = ns.CreateCheckBox(parent, "hide_combat")
hide_combat:SetPoint("TOPLEFT", history, "BOTTOMLEFT", 0, 0)
local custom_time_color = ns.CreateCheckBox(parent, "custom_time_color")
custom_time_color:SetPoint("TOPLEFT", hide_combat, "BOTTOMLEFT", 0, 0)
local time_color = ns.CreateColourPicker(parent, "time_color", true)
time_color:SetPoint("TOPLEFT", custom_time_color, "BOTTOMLEFT", 24, -4)
end
-- Nameplate
do
local parent = ShestakUIOptionsPanel.nameplate
local multScale = 768 / select(2, GetPhysicalScreenSize())
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_NAMEPLATE_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local width = ns.CreateNumberSlider(parent, "width", nil, nil, 0, 150 / multScale, 1, true, L_GUI_NAMEPLATE_WIDTH)
width:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, -20)
local height = ns.CreateNumberSlider(parent, "height", nil, nil, 0, 20 / multScale, 1, true, L_GUI_NAMEPLATE_HEIGHT)
height:SetPoint("LEFT", width, "RIGHT", 120, 0)
local ad_width = ns.CreateNumberSlider(parent, "ad_width", nil, nil, 0, 80 / multScale, 1, true)
ad_width:SetPoint("TOPLEFT", width, "BOTTOMLEFT", 0, -20)
local ad_height = ns.CreateNumberSlider(parent, "ad_height", nil, nil, 0, 15 / multScale, 1, true)
ad_height:SetPoint("LEFT", ad_width, "RIGHT", 120, 0)
local alpha = ns.CreateNumberSlider(parent, "alpha", nil, nil, 0, 1, 0.05, true)
alpha:SetPoint("TOPLEFT", ad_width, "BOTTOMLEFT", 0, -20)
local combat = ns.CreateCheckBox(parent, "combat", L_GUI_NAMEPLATE_COMBAT)
combat:SetPoint("TOPLEFT", alpha, "BOTTOMLEFT", 0, -10)
local health_value = ns.CreateCheckBox(parent, "health_value", L_GUI_NAMEPLATE_HEALTH)
health_value:SetPoint("TOPLEFT", combat, "BOTTOMLEFT", 0, 0)
local show_castbar_name = ns.CreateCheckBox(parent, "show_castbar_name", L_GUI_NAMEPLATE_CASTBAR_NAME)
show_castbar_name:SetPoint("TOPLEFT", health_value, "BOTTOMLEFT", 0, 0)
local class_icons = ns.CreateCheckBox(parent, "class_icons", L_GUI_NAMEPLATE_CLASS_ICON)
class_icons:SetPoint("TOPLEFT", show_castbar_name, "BOTTOMLEFT", 0, 0)
local name_abbrev = ns.CreateCheckBox(parent, "name_abbrev", L_GUI_NAMEPLATE_NAME_ABBREV)
name_abbrev:SetPoint("TOPLEFT", class_icons, "BOTTOMLEFT", 0, 0)
local short_name = ns.CreateCheckBox(parent, "short_name")
short_name:SetPoint("TOPLEFT", name_abbrev, "BOTTOMLEFT", 0, 0)
local clamp = ns.CreateCheckBox(parent, "clamp")
clamp:SetPoint("TOPLEFT", short_name, "BOTTOMLEFT", 0, 0)
local track_debuffs = ns.CreateCheckBox(parent, "track_debuffs", L_GUI_NAMEPLATE_SHOW_DEBUFFS)
track_debuffs:SetPoint("TOPLEFT", clamp, "BOTTOMLEFT", 0, 0)
local ListButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
ListButton:SetPoint("LEFT", track_debuffs, "RIGHT", 400, 0)
ListButton:SetSize(100, 23)
ListButton:SetText(ADD)
ListButton:SetWidth(ListButton.Text:GetWidth() + 15)
ListButton:SetScript("OnClick", function()
if not C.options["nameplate"] then
C.options["nameplate"] = {}
end
if not C.options["nameplate"]["debuffs_list"] then
C.options["nameplate"]["debuffs_list"] = {}
end
BuildSpellList(C.options["nameplate"]["debuffs_list"])
end)
tinsert(ns.buttons, ListButton)
local function toggleListButton()
local shown = track_debuffs:GetChecked()
ListButton:SetEnabled(shown)
end
track_debuffs:HookScript("OnClick", toggleListButton)
ListButton:HookScript("OnShow", toggleListButton)
local track_buffs = ns.CreateCheckBox(parent, "track_buffs", L_GUI_NAMEPLATE_SHOW_BUFFS)
track_buffs:SetPoint("TOPLEFT", track_debuffs, "BOTTOMLEFT", 0, 0)
local ListButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
ListButton:SetPoint("LEFT", track_buffs, "RIGHT", 400, 0)
ListButton:SetSize(100, 23)
ListButton:SetText(ADD)
ListButton:SetWidth(ListButton.Text:GetWidth() + 15)
ListButton:SetScript("OnClick", function()
if not C.options["nameplate"] then
C.options["nameplate"] = {}
end
if not C.options["nameplate"]["buffs_list"] then
C.options["nameplate"]["buffs_list"] = {}
end
BuildSpellList(C.options["nameplate"]["buffs_list"])
end)
tinsert(ns.buttons, ListButton)
local function toggleListButton()
local shown = track_buffs:GetChecked()
ListButton:SetEnabled(shown)
end
track_buffs:HookScript("OnClick", toggleListButton)
ListButton:HookScript("OnShow", toggleListButton)
local auras_size = ns.CreateNumberSlider(parent, "auras_size", nil, nil, 0, 35 / multScale, 1, true, L_GUI_NAMEPLATE_DEBUFFS_SIZE)
auras_size:SetPoint("TOPLEFT", track_buffs, "BOTTOMLEFT", 0, -20)
local healer_icon = ns.CreateCheckBox(parent, "healer_icon", L_GUI_NAMEPLATE_HEALER_ICON)
healer_icon:SetPoint("TOPLEFT", auras_size, "BOTTOMLEFT", 0, -10)
local totem_icons = ns.CreateCheckBox(parent, "totem_icons", L_GUI_NAMEPLATE_TOTEM_ICONS)
totem_icons:SetPoint("TOPLEFT", healer_icon, "BOTTOMLEFT", 0, 0)
local target_glow = ns.CreateCheckBox(parent, "target_glow")
target_glow:SetPoint("TOPLEFT", totem_icons, "BOTTOMLEFT", 0, 0)
local only_name = ns.CreateCheckBox(parent, "only_name")
only_name:SetPoint("TOPLEFT", target_glow, "BOTTOMLEFT", 0, 0)
local quests = ns.CreateCheckBox(parent, "quests")
quests:SetPoint("TOPLEFT", only_name, "BOTTOMLEFT", 0, 0)
-- Panel 2
local parent = ShestakUIOptionsPanel.nameplate2
local low_health_value = ns.CreateNumberSlider(parent, "low_health_value", nil, nil, 0.1, 1, 0.05, true)
low_health_value:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, -20)
local low_health_color = ns.CreateColourPicker(parent, "low_health_color", true)
low_health_color:SetPoint("LEFT", low_health_value, "RIGHT", 85, 0)
local low_health = ns.CreateCheckBox(parent, "low_health")
low_health:SetPoint("LEFT", low_health_color, "RIGHT", 15, 0)
local cast_color = ns.CreateCheckBox(parent, "cast_color")
cast_color:SetPoint("TOPLEFT", low_health_value, "BOTTOMLEFT", 0, -8)
local kick_color = ns.CreateCheckBox(parent, "kick_color")
kick_color:SetPoint("TOPLEFT", cast_color, "BOTTOMLEFT", 0, 0)
local enhance_threat = ns.CreateCheckBox(parent, "enhance_threat", L_GUI_NAMEPLATE_THREAT)
enhance_threat:SetPoint("TOPLEFT", kick_color, "BOTTOMLEFT", 0, 0)
local good_color = ns.CreateColourPicker(parent, "good_color", true, L_GUI_NAMEPLATE_GOOD_COLOR)
good_color:SetPoint("TOPLEFT", enhance_threat, "BOTTOMLEFT", 24, -4)
local near_color = ns.CreateColourPicker(parent, "near_color", true, L_GUI_NAMEPLATE_NEAR_COLOR)
near_color:SetPoint("TOPLEFT", good_color, "BOTTOMLEFT", 0, -8)
local bad_color = ns.CreateColourPicker(parent, "bad_color", true, L_GUI_NAMEPLATE_BAD_COLOR)
bad_color:SetPoint("TOPLEFT", near_color, "BOTTOMLEFT", 0, -8)
local offtank_color = ns.CreateColourPicker(parent, "offtank_color", true, L_GUI_NAMEPLATE_OFFTANK_COLOR)
offtank_color:SetPoint("TOPLEFT", bad_color, "BOTTOMLEFT", 0, -8)
local extra_color = ns.CreateColourPicker(parent, "extra_color", true)
extra_color:SetPoint("TOPLEFT", offtank_color, "BOTTOMLEFT", 0, -8)
local mob_color_enable = ns.CreateCheckBox(parent, "mob_color_enable")
mob_color_enable:SetPoint("TOPLEFT", extra_color, "BOTTOMLEFT", -24, -8)
local mob_color = ns.CreateColourPicker(parent, "mob_color", true)
mob_color:SetPoint("TOPLEFT", mob_color_enable, "BOTTOMLEFT", 24, -4)
end
-- Combat text
do
local parent = ShestakUIOptionsPanel.combattext
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_COMBATTEXT_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local blizz_head_numbers = ns.CreateCheckBox(parent, "blizz_head_numbers")
blizz_head_numbers:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, 0)
local damage_style = ns.CreateCheckBox(parent, "damage_style")
damage_style:SetPoint("TOPLEFT", blizz_head_numbers, "BOTTOMLEFT", 20, 0)
blizz_head_numbers.children = {damage_style}
local damage = ns.CreateCheckBox(parent, "damage", L_GUI_COMBATTEXT_DAMAGE)
damage:SetPoint("TOPLEFT", damage_style, "BOTTOMLEFT", -20, 0)
local pet_damage = ns.CreateCheckBox(parent, "pet_damage", L_GUI_COMBATTEXT_PET_DAMAGE)
pet_damage:SetPoint("TOPLEFT", damage, "BOTTOMLEFT", 20, 0)
local dot_damage = ns.CreateCheckBox(parent, "dot_damage", L_GUI_COMBATTEXT_DOT_DAMAGE)
dot_damage:SetPoint("TOPLEFT", pet_damage, "BOTTOMLEFT", 0, 0)
local healing = ns.CreateCheckBox(parent, "healing", L_GUI_COMBATTEXT_HEALING)
healing:SetPoint("TOPLEFT", dot_damage, "BOTTOMLEFT", -20, 0)
local show_hots = ns.CreateCheckBox(parent, "show_hots", L_GUI_COMBATTEXT_HOTS)
show_hots:SetPoint("TOPLEFT", healing, "BOTTOMLEFT", 20, 0)
local show_overhealing = ns.CreateCheckBox(parent, "show_overhealing", L_GUI_COMBATTEXT_OVERHEALING)
show_overhealing:SetPoint("TOPLEFT", show_hots, "BOTTOMLEFT", 0, 0)
local incoming = ns.CreateCheckBox(parent, "incoming", L.combattext_incoming)
incoming:SetPoint("TOPLEFT", show_overhealing, "BOTTOMLEFT", -20, 0)
local damage_color = ns.CreateCheckBox(parent, "damage_color", L_GUI_COMBATTEXT_DAMAGE_COLOR)
damage_color:SetPoint("TOPLEFT", incoming, "BOTTOMLEFT", 0, 0)
local dispel = ns.CreateCheckBox(parent, "dispel", L_GUI_COMBATTEXT_DISPEL)
dispel:SetPoint("TOPLEFT", damage_color, "BOTTOMLEFT", 0, 0)
local interrupt = ns.CreateCheckBox(parent, "interrupt", L_GUI_COMBATTEXT_INTERRUPT)
interrupt:SetPoint("TOPLEFT", dispel, "BOTTOMLEFT", 0, 0)
local icons = ns.CreateCheckBox(parent, "icons", L_GUI_COMBATTEXT_ICONS)
icons:SetPoint("TOPLEFT", interrupt, "BOTTOMLEFT", 0, 0)
local icon_size = ns.CreateNumberSlider(parent, "icon_size", nil, nil, 0, 40, 1, true, L_GUI_COMBATTEXT_ICON_SIZE, L_GUI_COMBATTEXT_ICON_SIZE_DESC)
icon_size:SetPoint("TOPLEFT", icons, "BOTTOMLEFT", 0, -20)
local max_lines = ns.CreateNumberSlider(parent, "max_lines", nil, nil, 0, 30, 1, true, L_GUI_COMBATTEXT_MAX_LINES, L_GUI_COMBATTEXT_MAX_LINES_DESC)
max_lines:SetPoint("TOPLEFT", icon_size, "BOTTOMLEFT", 0, -20)
local time_visible = ns.CreateNumberSlider(parent, "time_visible", nil, nil, 0, 10, 1, true, L_GUI_COMBATTEXT_TIME_VISIBLE, L_GUI_COMBATTEXT_TIME_VISIBLE_DESC)
time_visible:SetPoint("LEFT", max_lines, "RIGHT", 120, 0)
local short_numbers = ns.CreateCheckBox(parent, "short_numbers", L_GUI_COMBATTEXT_SHORT_NUMBERS)
short_numbers:SetPoint("TOPLEFT", max_lines, "BOTTOMLEFT", 0, -8)
local merge_aoe_spam = ns.CreateCheckBox(parent, "merge_aoe_spam")
merge_aoe_spam:SetPoint("TOPLEFT", short_numbers, "BOTTOMLEFT", 0, 0)
local ListButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
ListButton:SetPoint("LEFT", merge_aoe_spam, "RIGHT", 400, 0)
ListButton:SetSize(100, 23)
ListButton:SetText(ADD)
ListButton:SetWidth(ListButton.Text:GetWidth() + 15)
ListButton:SetScript("OnClick", function()
if not C.options["combattext"] then
C.options["combattext"] = {}
end
if not C.options["combattext"]["spells_list"] then
C.options["combattext"]["spells_list"] = {}
end
BuildSpellList(C.options["combattext"]["spells_list"], true)
end)
tinsert(ns.buttons, ListButton)
local function toggleListButton()
local shown = merge_aoe_spam:GetChecked()
ListButton:SetEnabled(shown)
end
merge_aoe_spam:HookScript("OnClick", toggleListButton)
ListButton:HookScript("OnShow", toggleListButton)
local merge_melee = ns.CreateCheckBox(parent, "merge_melee", L_GUI_COMBATTEXT_MERGE_MELEE)
merge_melee:SetPoint("TOPLEFT", merge_aoe_spam, "BOTTOMLEFT", 20, 0)
local merge_all = ns.CreateCheckBox(parent, "merge_all")
merge_all:SetPoint("TOPLEFT", merge_melee, "BOTTOMLEFT", 0, 0)
local direction = ns.CreateCheckBox(parent, "direction", L_GUI_COMBATTEXT_DIRECTION)
direction:SetPoint("TOPLEFT", merge_all, "BOTTOMLEFT", -20, 0)
-- Panel 2
local parent = ShestakUIOptionsPanel.combattext2
local dk_runes = ns.CreateCheckBox(parent, "dk_runes", L_GUI_COMBATTEXT_DK_RUNES)
dk_runes:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local killingblow = ns.CreateCheckBox(parent, "killingblow", L_GUI_COMBATTEXT_KILLINGBLOW)
killingblow:SetPoint("TOPLEFT", dk_runes, "BOTTOMLEFT", 0, 0)
local scrollable = ns.CreateCheckBox(parent, "scrollable", L_GUI_COMBATTEXT_SCROLLABLE)
scrollable:SetPoint("TOPLEFT", killingblow, "BOTTOMLEFT", 0, 0)
local crit_prefix = ns.CreateEditBox(parent, "crit_prefix", true, L_GUI_COMBATTEXT_CRIT_PREFIX)
crit_prefix:SetPoint("TOPLEFT", scrollable, "BOTTOMLEFT", 6, -8)
local crit_postfix = ns.CreateEditBox(parent, "crit_postfix", true, L_GUI_COMBATTEXT_CRIT_POSTFIX)
crit_postfix:SetPoint("TOPLEFT", crit_prefix, "BOTTOMLEFT", 0, -10)
local treshold = ns.CreateEditBox(parent, "treshold", true, L_GUI_COMBATTEXT_TRESHOLD, true)
treshold:SetPoint("TOPLEFT", crit_postfix, "BOTTOMLEFT", 0, -10)
local heal_treshold = ns.CreateEditBox(parent, "heal_treshold", true, L_GUI_COMBATTEXT_HEAL_TRESHOLD, true)
heal_treshold:SetPoint("TOPLEFT", treshold, "BOTTOMLEFT", 0, -10)
end
-- Bag
do
local parent = ShestakUIOptionsPanel.bag
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_BAGS_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local ilvl = ns.CreateCheckBox(parent, "ilvl", L_GUI_BAGS_ILVL)
ilvl:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, 0)
local new_items = ns.CreateCheckBox(parent, "new_items")
new_items:SetPoint("TOPLEFT", ilvl, "BOTTOMLEFT", 0, 0)
local filter = ns.CreateCheckBox(parent, "filter")
filter:SetPoint("TOPLEFT", new_items, "BOTTOMLEFT", 0, 0)
local button_size = ns.CreateNumberSlider(parent, "button_size", nil, nil, 0, 50, 1, true, L_GUI_BAGS_BUTTON_SIZE)
button_size:SetPoint("TOPLEFT", filter, "BOTTOMLEFT", 0, -20)
local button_space = ns.CreateNumberSlider(parent, "button_space", nil, nil, 0, 10, 1, true, L_GUI_BAGS_BUTTON_SPACE)
button_space:SetPoint("LEFT", button_size, "RIGHT", 120, 0)
local bag_columns = ns.CreateNumberSlider(parent, "bag_columns", nil, nil, 0, 20, 1, true, L_GUI_BAGS_BAG)
bag_columns:SetPoint("TOPLEFT", button_size, "BOTTOMLEFT", 0, -20)
local bank_columns = ns.CreateNumberSlider(parent, "bank_columns", nil, nil, 0, 25, 1, true, L_GUI_BAGS_BANK)
bank_columns:SetPoint("LEFT", bag_columns, "RIGHT", 120, 0)
end
-- Minimap
do
local parent = ShestakUIOptionsPanel.minimap
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_MINIMAP_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local on_top = ns.CreateCheckBox(parent, "on_top")
on_top:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, 0)
local tracking_icon = ns.CreateCheckBox(parent, "tracking_icon", L_GUI_MINIMAP_ICON)
tracking_icon:SetPoint("TOPLEFT", on_top, "BOTTOMLEFT", 0, 0)
local garrison_icon = ns.CreateCheckBox(parent, "garrison_icon", DRAGONFLIGHT_LANDING_PAGE_TITLE)
garrison_icon:SetPoint("TOPLEFT", tracking_icon, "BOTTOMLEFT", 0, 0)
local size = ns.CreateNumberSlider(parent, "size", nil, nil, 0, 300, 1, true, L_GUI_MINIMAP_SIZE)
size:SetPoint("TOPLEFT", garrison_icon, "BOTTOMLEFT", 0, -20)
local hide_combat = ns.CreateCheckBox(parent, "hide_combat", L_GUI_MINIMAP_HIDE_COMBAT)
hide_combat:SetPoint("TOPLEFT", size, "BOTTOMLEFT", 0, -10)
local toggle_menu = ns.CreateCheckBox(parent, "toggle_menu", L_GUI_MINIMAP_TOGGLE_MENU)
toggle_menu:SetPoint("TOPLEFT", hide_combat, "BOTTOMLEFT", 0, 0)
-- Other
local subheader = ns.addSubCategory(parent, OTHER)
subheader:SetPoint("TOPLEFT", toggle_menu, "BOTTOMLEFT", 0, -16)
local bg_map_stylization = ns.CreateCheckBox(parent, "bg_map_stylization")
bg_map_stylization:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local fog_of_war = ns.CreateCheckBox(parent, "fog_of_war")
fog_of_war:SetPoint("TOPLEFT", bg_map_stylization, "BOTTOMLEFT", 0, 0)
end
-- Loot
do
local parent = ShestakUIOptionsPanel.loot
local lootframe = ns.CreateCheckBox(parent, "lootframe", L_GUI_LOOT_ENABLE)
lootframe:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local icon_size = ns.CreateNumberSlider(parent, "icon_size", nil, nil, 0, 50, 1, true, L_GUI_LOOT_ICON_SIZE)
icon_size:SetPoint("TOPLEFT", lootframe, "BOTTOMLEFT", 0, -20)
local width = ns.CreateNumberSlider(parent, "width", nil, nil, 0, 400, 1, true, L_GUI_LOOT_WIDTH)
width:SetPoint("TOPLEFT", icon_size, "BOTTOMLEFT", 0, -20)
local faster_loot = ns.CreateCheckBox(parent, "faster_loot")
faster_loot:SetPoint("TOPLEFT", width, "BOTTOMLEFT", 0, -10)
local rolllootframe = ns.CreateCheckBox(parent, "rolllootframe", L_GUI_LOOT_ROLL_ENABLE)
rolllootframe:SetPoint("TOPLEFT", faster_loot, "BOTTOMLEFT", 0, 0)
local auto_greed = ns.CreateCheckBox(parent, "auto_greed", L_GUI_LOOT_AUTOGREED)
auto_greed:SetPoint("TOPLEFT", rolllootframe, "BOTTOMLEFT", 0, 0)
local auto_confirm_de = ns.CreateCheckBox(parent, "auto_confirm_de", L_GUI_LOOT_AUTODE)
auto_confirm_de:SetPoint("TOPLEFT", auto_greed, "BOTTOMLEFT", 0, 0)
end
-- Filger
do
local parent = ShestakUIOptionsPanel.filger
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_FILGER_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local show_tooltip = ns.CreateCheckBox(parent, "show_tooltip", L_GUI_FILGER_SHOW_TOOLTIP)
show_tooltip:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, 0)
local expiration = ns.CreateCheckBox(parent, "expiration", L_GUI_FILGER_EXPIRATION)
expiration:SetPoint("TOPLEFT", show_tooltip, "BOTTOMLEFT", 0, 0)
-- Elements
local subheader = ns.addSubCategory(parent, L.filger_subheader_elements)
subheader:SetPoint("TOPLEFT", expiration, "BOTTOMLEFT", 0, -10)
local show_buff = ns.CreateCheckBox(parent, "show_buff")
show_buff:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -10)
local show_proc = ns.CreateCheckBox(parent, "show_proc")
show_proc:SetPoint("LEFT", show_buff, "RIGHT", 320, 0)
local show_debuff = ns.CreateCheckBox(parent, "show_debuff")
show_debuff:SetPoint("TOPLEFT", show_buff, "BOTTOMLEFT", 0, 0)
local show_aura_bar = ns.CreateCheckBox(parent, "show_aura_bar")
show_aura_bar:SetPoint("LEFT", show_debuff, "RIGHT", 320, 0)
local show_pvp_player = ns.CreateCheckBox(parent, "show_pvp_player")
show_pvp_player:SetPoint("TOPLEFT", show_debuff, "BOTTOMLEFT", 0, 0)
local show_pvp_target = ns.CreateCheckBox(parent, "show_pvp_target")
show_pvp_target:SetPoint("LEFT", show_pvp_player, "RIGHT", 320, 0)
local show_special = ns.CreateCheckBox(parent, "show_special")
show_special:SetPoint("TOPLEFT", show_pvp_player, "BOTTOMLEFT", 0, 0)
local show_cd = ns.CreateCheckBox(parent, "show_cd")
show_cd:SetPoint("LEFT", show_special, "RIGHT", 320, 0)
-- Size
local subheader = ns.addSubCategory(parent, L.filger_subheader_size)
subheader:SetPoint("TOPLEFT", show_special, "BOTTOMLEFT", 0, -10)
local buffs_size = ns.CreateNumberSlider(parent, "buffs_size", nil, nil, 0, 60, 1, true, L_GUI_FILGER_BUFFS_SIZE)
buffs_size:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -30)
local buffs_space = ns.CreateNumberSlider(parent, "buffs_space", nil, nil, 0, 10, 1, true)
buffs_space:SetPoint("LEFT", buffs_size, "RIGHT", 120, 0)
local pvp_size = ns.CreateNumberSlider(parent, "pvp_size", nil, nil, 0, 90, 1, true, L_GUI_FILGER_PVP_SIZE)
pvp_size:SetPoint("TOPLEFT", buffs_size, "BOTTOMLEFT", 0, -20)
local pvp_space = ns.CreateNumberSlider(parent, "pvp_space", nil, nil, 0, 10, 1, true)
pvp_space:SetPoint("LEFT", pvp_size, "RIGHT", 120, 0)
local cooldown_size = ns.CreateNumberSlider(parent, "cooldown_size", nil, nil, 0, 60, 1, true, L_GUI_FILGER_COOLDOWN_SIZE)
cooldown_size:SetPoint("TOPLEFT", pvp_size, "BOTTOMLEFT", 0, -20)
local cooldown_space = ns.CreateNumberSlider(parent, "cooldown_space", nil, nil, 0, 10, 1, true)
cooldown_space:SetPoint("LEFT", cooldown_size, "RIGHT", 120, 0)
-- Testing
local subheader = ns.addSubCategory(parent, L.filger_subheader_test)
subheader:SetPoint("TOPLEFT", cooldown_size, "BOTTOMLEFT", 0, -10)
local test_mode = ns.CreateCheckBox(parent, "test_mode", L_GUI_FILGER_TEST_MODE)
test_mode:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -10)
local max_test_icon = ns.CreateNumberSlider(parent, "max_test_icon", nil, nil, 0, 10, 1, true, L_GUI_FILGER_MAX_TEST_ICON)
max_test_icon:SetPoint("TOPLEFT", test_mode, "BOTTOMLEFT", 0, -20)
-- Spell List
local subheader = ns.addSubCategory(parent, L.filger_subheader_spells)
subheader:SetPoint("TOPLEFT", max_test_icon, "BOTTOMLEFT", 0, -10)
local category_list = ns.CreateDropDown(parent, "category_list", true, L.filger_category_list, FilgerTable)
category_list:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", -16, -10)
hooksecurefunc(category_list, "SetValue", function()
if not C.options["filger"] then
C.options["filger"] = {}
end
if not C.options["filger"][FilgerDropDownText[category_list.selectedValue]] then
C.options["filger"][FilgerDropDownText[category_list.selectedValue]] = {}
end
BuildSpellList(C.options["filger"][FilgerDropDownText[category_list.selectedValue]], false, true)
end)
end
-- Announcements
do
local parent = ShestakUIOptionsPanel.announcements
local interrupts = ns.CreateCheckBox(parent, "interrupts")
interrupts:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local spells = ns.CreateCheckBox(parent, "spells")
spells:SetPoint("TOPLEFT", interrupts, "BOTTOMLEFT", 0, 0)
local ListButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
ListButton:SetPoint("LEFT", spells, "RIGHT", 400, 0)
ListButton:SetSize(100, 23)
ListButton:SetText(ADD)
ListButton:SetWidth(ListButton.Text:GetWidth() + 15)
ListButton:SetScript("OnClick", function()
if not C.options["announcements"] then
C.options["announcements"] = {}
end
if not C.options["announcements"]["spells_list"] then
C.options["announcements"]["spells_list"] = T.announce_spells
end
BuildSpellList(C.options["announcements"]["spells_list"])
end)
tinsert(ns.buttons, ListButton)
local function toggleListButton()
local shown = spells:GetChecked()
ListButton:SetEnabled(shown)
if not T.announce_spells then
ListButton.tooltipText = "|cffFFD100"..REQUIRES_RELOAD.."|r"
ListButton:SetScript("OnClick", nil)
end
end
spells:HookScript("OnClick", toggleListButton)
ListButton:HookScript("OnShow", toggleListButton)
local spells_from_all = ns.CreateCheckBox(parent, "spells_from_all")
spells_from_all:SetPoint("TOPLEFT", spells, "BOTTOMLEFT", 20, 0)
spells.children = {spells_from_all}
local feasts = ns.CreateCheckBox(parent, "feasts")
feasts:SetPoint("TOPLEFT", spells_from_all, "BOTTOMLEFT", -20, 0)
local portals = ns.CreateCheckBox(parent, "portals")
portals:SetPoint("TOPLEFT", feasts, "BOTTOMLEFT", 0, 0)
local toys = ns.CreateCheckBox(parent, "toys")
toys:SetPoint("TOPLEFT", portals, "BOTTOMLEFT", 0, 0)
local flask_food = ns.CreateCheckBox(parent, "flask_food")
flask_food:SetPoint("TOPLEFT", toys, "BOTTOMLEFT", 0, 0)
local flask_food_raid = ns.CreateCheckBox(parent, "flask_food_raid")
flask_food_raid:SetPoint("TOPLEFT", flask_food, "BOTTOMLEFT", 20, 0)
local flask_food_auto = ns.CreateCheckBox(parent, "flask_food_auto")
flask_food_auto:SetPoint("TOPLEFT", flask_food_raid, "BOTTOMLEFT", 0, 0)
flask_food.children = {flask_food_raid, flask_food_auto}
local drinking = ns.CreateCheckBox(parent, "drinking")
drinking:SetPoint("TOPLEFT", flask_food_auto, "BOTTOMLEFT", -20, 0)
local pull_countdown = ns.CreateCheckBox(parent, "pull_countdown")
pull_countdown:SetPoint("TOPLEFT", drinking, "BOTTOMLEFT", 0, 0)
-- Self announce
local subheader = ns.addSubCategory(parent, L.announcements_subheader_self)
subheader:SetPoint("TOPLEFT", pull_countdown, "BOTTOMLEFT", 0, -10)
local bad_gear = ns.CreateCheckBox(parent, "bad_gear")
bad_gear:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -10)
local safari_hat = ns.CreateCheckBox(parent, "safari_hat")
safari_hat:SetPoint("TOPLEFT", bad_gear, "BOTTOMLEFT", 0, 0)
end
-- Automation
do
local parent = ShestakUIOptionsPanel.automation
local release = ns.CreateCheckBox(parent, "release")
release:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local screenshot = ns.CreateCheckBox(parent, "screenshot")
screenshot:SetPoint("TOPLEFT", release, "BOTTOMLEFT", 0, 0)
local solve_artifact = ns.CreateCheckBox(parent, "solve_artifact")
solve_artifact:SetPoint("TOPLEFT", screenshot, "BOTTOMLEFT", 0, 0)
local accept_invite = ns.CreateCheckBox(parent, "accept_invite")
accept_invite:SetPoint("TOPLEFT", solve_artifact, "BOTTOMLEFT", 0, 0)
local decline_duel = ns.CreateCheckBox(parent, "decline_duel")
decline_duel:SetPoint("TOPLEFT", accept_invite, "BOTTOMLEFT", 0, 0)
local accept_quest = ns.CreateCheckBox(parent, "accept_quest")
accept_quest:SetPoint("TOPLEFT", decline_duel, "BOTTOMLEFT", 0, 0)
local skip_cinematic = ns.CreateCheckBox(parent, "skip_cinematic")
skip_cinematic:SetPoint("TOPLEFT", accept_quest, "BOTTOMLEFT", 0, 0)
local auto_role = ns.CreateCheckBox(parent, "auto_role")
auto_role:SetPoint("TOPLEFT", skip_cinematic, "BOTTOMLEFT", 0, 0)
local cancel_bad_buffs = ns.CreateCheckBox(parent, "cancel_bad_buffs")
cancel_bad_buffs:SetPoint("TOPLEFT", auto_role, "BOTTOMLEFT", 0, 0)
local tab_binder = ns.CreateCheckBox(parent, "tab_binder")
tab_binder:SetPoint("TOPLEFT", cancel_bad_buffs, "BOTTOMLEFT", 0, 0)
local logging_combat = ns.CreateCheckBox(parent, "logging_combat")
logging_combat:SetPoint("TOPLEFT", tab_binder, "BOTTOMLEFT", 0, 0)
local buff_on_scroll = ns.CreateCheckBox(parent, "buff_on_scroll")
buff_on_scroll:SetPoint("TOPLEFT", logging_combat, "BOTTOMLEFT", 0, 0)
local open_items = ns.CreateCheckBox(parent, "open_items")
open_items:SetPoint("TOPLEFT", buff_on_scroll, "BOTTOMLEFT", 0, 0)
local resurrection = ns.CreateCheckBox(parent, "resurrection")
resurrection:SetPoint("TOPLEFT", open_items, "BOTTOMLEFT", 0, 0)
local summon = ns.CreateCheckBox(parent, "summon")
summon:SetPoint("TOPLEFT", resurrection, "BOTTOMLEFT", 0, 0)
local whisper_invite = ns.CreateCheckBox(parent, "whisper_invite")
whisper_invite:SetPoint("TOPLEFT", summon, "BOTTOMLEFT", 0, 0)
whisper_invite.needsReload = false
local invite_keyword = ns.CreateEditBox(parent, "invite_keyword", true)
invite_keyword:SetPoint("TOPLEFT", whisper_invite, "BOTTOMLEFT", 6, -6)
invite_keyword:SetWidth(90)
invite_keyword:SetMaxLetters(20)
local auto_collapse = ns.CreateDropDown(parent, "auto_collapse", true, false, CollapseTable)
auto_collapse:SetPoint("TOPLEFT", invite_keyword, "BOTTOMLEFT", -22, -10)
end
-- Reminder
do
local parent = ShestakUIOptionsPanel.reminder
local solo_buffs_enable = ns.CreateCheckBox(parent, "solo_buffs_enable", L_GUI_REMINDER_SOLO_ENABLE)
solo_buffs_enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local solo_buffs_sound = ns.CreateCheckBox(parent, "solo_buffs_sound", L_GUI_REMINDER_SOLO_SOUND)
solo_buffs_sound:SetPoint("TOPLEFT", solo_buffs_enable, "BOTTOMLEFT", 0, 0)
local solo_buffs_size = ns.CreateNumberSlider(parent, "solo_buffs_size", nil, nil, 0, 80, 1, true, L_GUI_REMINDER_SOLO_SIZE, L_GUI_REMINDER_SOLO_SIZE_DESC)
solo_buffs_size:SetPoint("TOPLEFT", solo_buffs_sound, "BOTTOMLEFT", 0, -20)
-- Raid buffs
local subheader = ns.addSubCategory(parent, L_GUI_REMINDER_SUBHEADER)
subheader:SetPoint("TOPLEFT", solo_buffs_size, "BOTTOMLEFT", 0, -16)
local raid_buffs_enable = ns.CreateCheckBox(parent, "raid_buffs_enable", L_GUI_REMINDER_RAID_ENABLE)
raid_buffs_enable:SetPoint("TOPLEFT", subheader, "BOTTOMLEFT", 0, -8)
local raid_buffs_always = ns.CreateCheckBox(parent, "raid_buffs_always", L_GUI_REMINDER_RAID_ALWAYS)
raid_buffs_always:SetPoint("TOPLEFT", raid_buffs_enable, "BOTTOMLEFT", 0, 0)
local raid_buffs_size = ns.CreateNumberSlider(parent, "raid_buffs_size", nil, nil, 0, 40, 1, true, L_GUI_REMINDER_RAID_SIZE, L_GUI_REMINDER_RAID_SIZE_DESC)
raid_buffs_size:SetPoint("TOPLEFT", raid_buffs_always, "BOTTOMLEFT", 0, -20)
local raid_buffs_alpha = ns.CreateNumberSlider(parent, "raid_buffs_alpha", nil, nil, 0, 1, 0.05, true, L_GUI_REMINDER_RAID_ALPHA, L_GUI_REMINDER_RAID_ALPHA_DESC)
raid_buffs_alpha:SetPoint("TOPLEFT", raid_buffs_size, "BOTTOMLEFT", 0, -20)
end
-- Raid cooldowns
do
local parent = ShestakUIOptionsPanel.raidcooldown
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_COOLDOWN_RAID_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local height = ns.CreateNumberSlider(parent, "height", nil, nil, 0, 30, 1, true, L_GUI_COOLDOWN_RAID_HEIGHT)
height:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, -20)
local width = ns.CreateNumberSlider(parent, "width", nil, nil, 0, 300, 1, true, L_GUI_COOLDOWN_RAID_WIDTH)
width:SetPoint("LEFT", height, "RIGHT", 120, 0)
local upwards = ns.CreateCheckBox(parent, "upwards", L_GUI_COOLDOWN_RAID_SORT)
upwards:SetPoint("TOPLEFT", height, "BOTTOMLEFT", 0, -10)
local expiration = ns.CreateCheckBox(parent, "expiration", L_GUI_COOLDOWN_RAID_EXPIRATION)
expiration:SetPoint("TOPLEFT", upwards, "BOTTOMLEFT", 0, 0)
local show_self = ns.CreateCheckBox(parent, "show_self", L_GUI_COOLDOWN_RAID_SHOW_SELF)
show_self:SetPoint("TOPLEFT", expiration, "BOTTOMLEFT", 0, 0)
local show_icon = ns.CreateCheckBox(parent, "show_icon", L_GUI_COOLDOWN_RAID_ICONS)
show_icon:SetPoint("TOPLEFT", show_self, "BOTTOMLEFT", 0, 0)
local show_inraid = ns.CreateCheckBox(parent, "show_inraid", L_GUI_COOLDOWN_RAID_IN_RAID)
show_inraid:SetPoint("TOPLEFT", show_icon, "BOTTOMLEFT", 0, 0)
local show_inparty = ns.CreateCheckBox(parent, "show_inparty", L_GUI_COOLDOWN_RAID_IN_PARTY)
show_inparty:SetPoint("TOPLEFT", show_inraid, "BOTTOMLEFT", 0, 0)
local show_inarena = ns.CreateCheckBox(parent, "show_inarena", L_GUI_COOLDOWN_RAID_IN_ARENA)
show_inarena:SetPoint("TOPLEFT", show_inparty, "BOTTOMLEFT", 0, 0)
local ListButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
ListButton:SetPoint("TOPLEFT", show_inarena, "BOTTOMLEFT", 3, -5)
ListButton:SetSize(100, 23)
ListButton:SetText(L_GUI_SPELL_LIST)
ListButton:SetWidth(ListButton.Text:GetWidth() + 15)
ListButton.tooltipText = "|cffFFD100"..L_GUI_RESET_SPELLS_DESC.."|r"
ListButton:SetScript("OnClick", function()
if not C.options["raidcooldown"] then
C.options["raidcooldown"] = {}
end
if not C.options["raidcooldown"]["spells_list"] then
C.options["raidcooldown"]["spells_list"] = T.raid_spells
C.options.raidcooldown.spells_list_ver = 3
end
if IsControlKeyDown() then
C.options["raidcooldown"]["spells_list"] = nil
ns.setReloadNeeded(true)
ListButton.tooltipText = "|cffFFD100"..REQUIRES_RELOAD.."|r"
ListButton:SetScript("OnClick", nil)
GameTooltip:Hide()
SpellList:Hide()
return
end
BuildSpellList(C.options["raidcooldown"]["spells_list"], true)
end)
tinsert(ns.buttons, ListButton)
local function toggleListButton()
local shown = enable:GetChecked()
ListButton:SetEnabled(shown)
if not T.raid_spells then ListButton:Disable() return end
end
enable:HookScript("OnClick", toggleListButton)
ListButton:HookScript("OnShow", toggleListButton)
end
-- Enemy cooldowns
do
local parent = ShestakUIOptionsPanel.enemycooldown
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_COOLDOWN_ENEMY_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local size = ns.CreateNumberSlider(parent, "size", nil, nil, 0, 60, 1, true, L_GUI_COOLDOWN_ENEMY_SIZE)
size:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, -20)
local direction = ns.CreateDropDown(parent, "direction", true, L_GUI_COOLDOWN_ENEMY_DIRECTION, {"RIGHT", "LEFT", "UP", "DOWN"})
direction:SetPoint("TOPLEFT", size, "BOTTOMLEFT", -16, -10)
local show_always = ns.CreateCheckBox(parent, "show_always", L_GUI_COOLDOWN_ENEMY_EVERYWHERE)
show_always:SetPoint("TOPLEFT", direction, "BOTTOMLEFT", 16, 0)
local show_inpvp = ns.CreateCheckBox(parent, "show_inpvp", L_GUI_COOLDOWN_ENEMY_IN_BG)
show_inpvp:SetPoint("TOPLEFT", show_always, "BOTTOMLEFT", 0, 0)
local show_inarena = ns.CreateCheckBox(parent, "show_inarena", L_GUI_COOLDOWN_ENEMY_IN_ARENA)
show_inarena:SetPoint("TOPLEFT", show_inpvp, "BOTTOMLEFT", 0, 0)
local show_inparty = ns.CreateCheckBox(parent, "show_inparty")
show_inparty:SetPoint("TOPLEFT", show_inarena, "BOTTOMLEFT", 0, 0)
local class_color = ns.CreateCheckBox(parent, "class_color")
class_color:SetPoint("TOPLEFT", show_inparty, "BOTTOMLEFT", 0, 0)
local ListButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
ListButton:SetPoint("TOPLEFT", class_color, "BOTTOMLEFT", 3, -5)
ListButton:SetSize(100, 23)
ListButton:SetText(L_GUI_SPELL_LIST)
ListButton:SetWidth(ListButton.Text:GetWidth() + 15)
ListButton.tooltipText = "|cffFFD100"..L_GUI_RESET_SPELLS_DESC.."|r"
ListButton:SetScript("OnClick", function()
if not C.options["enemycooldown"] then
C.options["enemycooldown"] = {}
end
if not C.options["enemycooldown"]["spells_list"] then
C.options["enemycooldown"]["spells_list"] = T.enemy_spells
C.options.enemycooldown.spells_list_ver = 2
end
if IsControlKeyDown() then
C.options["enemycooldown"]["spells_list"] = nil
ns.setReloadNeeded(true)
ListButton.tooltipText = "|cffFFD100"..REQUIRES_RELOAD.."|r"
ListButton:SetScript("OnClick", nil)
GameTooltip:Hide()
SpellList:Hide()
return
end
BuildSpellList(C.options["enemycooldown"]["spells_list"], true)
end)
tinsert(ns.buttons, ListButton)
local function toggleListButton()
local shown = enable:GetChecked()
ListButton:SetEnabled(shown)
if not T.enemy_spells then ListButton:Disable() return end
end
enable:HookScript("OnClick", toggleListButton)
ListButton:HookScript("OnShow", toggleListButton)
end
-- Pulse cooldowns
do
local parent = ShestakUIOptionsPanel.pulsecooldown
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_COOLDOWN_PULSE_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local size = ns.CreateNumberSlider(parent, "size", nil, nil, 0, 150, 1, true, L_GUI_COOLDOWN_ENEMY_SIZE)
size:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, -20)
local sound = ns.CreateCheckBox(parent, "sound", L_GUI_COOLDOWN_PULSE_SOUND)
sound:SetPoint("TOPLEFT", size, "BOTTOMLEFT", 0, -10)
local anim_scale = ns.CreateNumberSlider(parent, "anim_scale", nil, nil, 0, 3, 0.05, true, L_GUI_COOLDOWN_PULSE_ANIM_SCALE)
anim_scale:SetPoint("TOPLEFT", sound, "BOTTOMLEFT", 0, -20)
local hold_time = ns.CreateNumberSlider(parent, "hold_time", nil, nil, 0, 5, 1, true, L_GUI_COOLDOWN_PULSE_HOLD_TIME)
hold_time:SetPoint("TOPLEFT", anim_scale, "BOTTOMLEFT", 0, -20)
local threshold = ns.CreateNumberSlider(parent, "threshold", nil, nil, 0, 15, 1, true, L_GUI_COOLDOWN_PULSE_THRESHOLD, L_GUI_COOLDOWN_PULSE_THRESHOLD_DESC)
threshold:SetPoint("TOPLEFT", hold_time, "BOTTOMLEFT", 0, -20)
end
-- Threat
do
local parent = ShestakUIOptionsPanel.threat
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_THREAT_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local height = ns.CreateNumberSlider(parent, "height", nil, nil, 0, 25, 1, true, L_GUI_THREAT_HEIGHT)
height:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, -20)
local width = ns.CreateNumberSlider(parent, "width", nil, nil, 0, 350, 1, true, L_GUI_THREAT_WIDTH)
width:SetPoint("TOPLEFT", height, "BOTTOMLEFT", 0, -20)
local bar_rows = ns.CreateNumberSlider(parent, "bar_rows", nil, nil, 1, 15, 1, true, L_GUI_THREAT_ROWS)
bar_rows:SetPoint("TOPLEFT", width, "BOTTOMLEFT", 0, -20)
local hide_solo = ns.CreateCheckBox(parent, "hide_solo", L_GUI_THREAT_HIDE_SOLO)
hide_solo:SetPoint("TOPLEFT", bar_rows, "BOTTOMLEFT", 0, -20)
end
-- Top Panel
do
local parent = ShestakUIOptionsPanel.toppanel
local enable = ns.CreateCheckBox(parent, "enable", L_GUI_TOP_PANEL_ENABLE)
enable:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local mouseover = ns.CreateCheckBox(parent, "mouseover", L_GUI_TOP_PANEL_MOUSE)
mouseover:SetPoint("TOPLEFT", enable, "BOTTOMLEFT", 0, 0)
local height = ns.CreateNumberSlider(parent, "height", nil, nil, 40, 150, 1, true, L_GUI_TOP_PANEL_HEIGHT)
height:SetPoint("TOPLEFT", mouseover, "BOTTOMLEFT", 0, -20)
local width = ns.CreateNumberSlider(parent, "width", nil, nil, 100, 500, 1, true, L_GUI_TOP_PANEL_WIDTH)
width:SetPoint("TOPLEFT", height, "BOTTOMLEFT", 0, -20)
end
-- Stats
do
local parent = ShestakUIOptionsPanel.stats
local clock = ns.CreateCheckBox(parent, "clock", L_GUI_STATS_CLOCK)
clock:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local latency = ns.CreateCheckBox(parent, "latency", L_GUI_STATS_LATENCY)
latency:SetPoint("TOPLEFT", clock, "BOTTOMLEFT", 0, 0)
local fps = ns.CreateCheckBox(parent, "fps", L_GUI_STATS_FPS)
fps:SetPoint("TOPLEFT", latency, "BOTTOMLEFT", 0, 0)
local friend = ns.CreateCheckBox(parent, "friend", FRIENDS)
friend:SetPoint("TOPLEFT", fps, "BOTTOMLEFT", 0, 0)
local guild = ns.CreateCheckBox(parent, "guild", GUILD)
guild:SetPoint("TOPLEFT", friend, "BOTTOMLEFT", 0, 0)
local durability = ns.CreateCheckBox(parent, "durability", DURABILITY)
durability:SetPoint("TOPLEFT", guild, "BOTTOMLEFT", 0, 0)
local experience = ns.CreateCheckBox(parent, "experience", L_GUI_STATS_EXPERIENCE)
experience:SetPoint("TOPLEFT", durability, "BOTTOMLEFT", 0, 0)
local talents = ns.CreateCheckBox(parent, "talents", SPECIALIZATION, L_GUI_STATS_TALENTS_DESC)
talents:SetPoint("TOPLEFT", experience, "BOTTOMLEFT", 0, 0)
local location = ns.CreateCheckBox(parent, "location", L_GUI_STATS_LOCATION)
location:SetPoint("TOPLEFT", talents, "BOTTOMLEFT", 0, 0)
local coords = ns.CreateCheckBox(parent, "coords", L_GUI_STATS_COORDS)
coords:SetPoint("TOPLEFT", location, "BOTTOMLEFT", 0, 0)
local battleground = ns.CreateCheckBox(parent, "battleground", L_GUI_STATS_BG)
battleground:SetPoint("TOPLEFT", coords, "BOTTOMLEFT", 0, 0)
local damage = ns.CreateCheckBox(parent, "damage", DAMAGE)
damage:SetPoint("TOPLEFT", battleground, "BOTTOMLEFT", 0, 0)
local bottom_line = ns.CreateCheckBox(parent, "bottom_line")
bottom_line:SetPoint("TOPLEFT", damage, "BOTTOMLEFT", 0, 0)
-- Currency
local currency = ns.addSubCategory(parent, L_GUI_STATS_SUBHEADER_CURRENCY)
currency:SetPoint("TOPLEFT", bottom_line, "BOTTOMLEFT", 0, -16)
local currency_archaeology = ns.CreateCheckBox(parent, "currency_archaeology", L_GUI_STATS_CURRENCY_ARCHAEOLOGY)
currency_archaeology:SetPoint("TOPLEFT", currency, "BOTTOMLEFT", 0, -8)
local currency_cooking = ns.CreateCheckBox(parent, "currency_cooking", L_GUI_STATS_CURRENCY_COOKING)
currency_cooking:SetPoint("TOPLEFT", currency_archaeology, "BOTTOMLEFT", 0, 0)
local currency_raid = ns.CreateCheckBox(parent, "currency_raid", L_GUI_STATS_CURRENCY_RAID)
currency_raid:SetPoint("TOPLEFT", currency_cooking, "BOTTOMLEFT", 0, 0)
local currency_misc = ns.CreateCheckBox(parent, "currency_misc", CURRENCY.. " "..EXPANSION_NAME9)
currency_misc:SetPoint("TOPLEFT", currency_raid, "BOTTOMLEFT", 0, 0)
local ResetGoldButton = CreateFrame("Button", nil, parent, "UIPanelButtonTemplate")
ResetGoldButton:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT", -20, 5)
ResetGoldButton:SetSize(100, 23)
ResetGoldButton:SetText(RESET.." "..strlower(WORLD_QUEST_REWARD_FILTERS_GOLD))
ResetGoldButton:SetWidth(ResetGoldButton.Text:GetWidth() + 15)
ResetGoldButton:SetScript("OnClick", function()
StaticPopup_Show("RESET_STATS")
end)
tinsert(ns.buttons, ResetGoldButton)
end
-- Trade
do
local parent = ShestakUIOptionsPanel.trade
local profession_tabs = ns.CreateCheckBox(parent, "profession_tabs")
profession_tabs:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local already_known = ns.CreateCheckBox(parent, "already_known")
already_known:SetPoint("TOPLEFT", profession_tabs, "BOTTOMLEFT", 0, 0)
local disenchanting = ns.CreateCheckBox(parent, "disenchanting")
disenchanting:SetPoint("TOPLEFT", already_known, "BOTTOMLEFT", 0, 0)
local enchantment_scroll = ns.CreateCheckBox(parent, "enchantment_scroll")
enchantment_scroll:SetPoint("TOPLEFT", disenchanting, "BOTTOMLEFT", 0, 0)
local sum_buyouts = ns.CreateCheckBox(parent, "sum_buyouts")
sum_buyouts:SetPoint("TOPLEFT", enchantment_scroll, "BOTTOMLEFT", 0, 0)
local archaeology = ns.CreateCheckBox(parent, "archaeology")
archaeology:SetPoint("TOPLEFT", sum_buyouts, "BOTTOMLEFT", 0, 0)
local merchant_itemlevel = ns.CreateCheckBox(parent, "merchant_itemlevel")
merchant_itemlevel:SetPoint("TOPLEFT", archaeology, "BOTTOMLEFT", 0, 0)
end
-- Miscellaneous
do
local parent = ShestakUIOptionsPanel.misc
local raid_tools = ns.CreateCheckBox(parent, "raid_tools")
raid_tools:SetPoint("TOPLEFT", parent.subText, "BOTTOMLEFT", 0, 0)
local shift_marking = ns.CreateCheckBox(parent, "shift_marking")
shift_marking:SetPoint("TOPLEFT", raid_tools, "BOTTOMLEFT", 0, 0)
local afk_spin_camera = ns.CreateCheckBox(parent, "afk_spin_camera")
afk_spin_camera:SetPoint("TOPLEFT", shift_marking, "BOTTOMLEFT", 0, 0)
local quest_auto_button = ns.CreateCheckBox(parent, "quest_auto_button")
quest_auto_button:SetPoint("TOPLEFT", afk_spin_camera, "BOTTOMLEFT", 0, 0)
local item_level = ns.CreateCheckBox(parent, "item_level")
item_level:SetPoint("TOPLEFT", quest_auto_button, "BOTTOMLEFT", 0, 0)
local click_cast = ns.CreateCheckBox(parent, "click_cast")
click_cast:SetPoint("TOPLEFT", item_level, "BOTTOMLEFT", 0, 0)
local click_cast_filter = ns.CreateCheckBox(parent, "click_cast_filter")
click_cast_filter:SetPoint("TOPLEFT", click_cast, "BOTTOMLEFT", 20, 0)
click_cast.children = {click_cast_filter}
local chars_currency = ns.CreateCheckBox(parent, "chars_currency")
chars_currency:SetPoint("TOPLEFT", click_cast_filter, "BOTTOMLEFT", -20, 0)
local hide_raid_button = ns.CreateCheckBox(parent, "hide_raid_button")
hide_raid_button:SetPoint("TOPLEFT", chars_currency, "BOTTOMLEFT", 0, 0)
end
----------------------------------------------------------------------------------------
-- Skin extra frames
----------------------------------------------------------------------------------------
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_LOGIN")
f:SetScript("OnEvent", function()
if not ShestakUI then return end
T, C = unpack(ShestakUI)
SpellList:StripTextures()
SpellList:CreateBackdrop("Transparent")
SpellList.backdrop:SetPoint("TOPLEFT", -18, 0)
SpellList.backdrop:SetPoint("BOTTOMRIGHT", 0, 9)
SpellListScrollFrameSpellList:StripTextures()
SpellListScrollFrameSpellList:CreateBackdrop("Overlay")
SpellListScrollFrameSpellList.backdrop:SetPoint("TOPLEFT", 2, 3)
SpellListScrollFrameSpellList.backdrop:SetPoint("BOTTOMRIGHT", 2, -3)
T.SkinCloseButton(SpellListCloseButton)
SpellListScrollFrameSpellListScrollBar:SetPoint("TOPLEFT", SpellListScrollFrameSpellList, "TOPRIGHT", 6, -13)
SpellListScrollFrameSpellListScrollBar:SetPoint("BOTTOMLEFT", SpellListScrollFrameSpellList, "BOTTOMRIGHT", 6, 13)
T.SkinScrollBar(SpellListScrollFrameSpellListScrollBar)
T.SkinEditBox(SpellListTextInput)
T.SkinEditBox(SpellListTextInput2)
ProfileList:StripTextures()
ProfileList:CreateBackdrop("Transparent")
ProfileList.backdrop:SetPoint("TOPLEFT", -18, 0)
ProfileList.backdrop:SetPoint("BOTTOMRIGHT", 0, 9)
T.SkinCloseButton(ProfileListCloseButton)
ProfileListPanel:CreateBackdrop("Overlay")
ShestakUIInfoFrame:SetTemplate("Overlay")
ShestakUIProfileFrame:SetTemplate("Transparent")
T.SkinScrollBar(ShestakUIProfileFrameScrollScrollBar)
ShestakUIProfileFrameScroll:CreateBackdrop("Overlay")
ShestakUIProfileFrameScroll.backdrop:SetPoint("TOPLEFT", -4, 4)
ShestakUIProfileFrameScroll.backdrop:SetPoint("BOTTOMRIGHT", 4, -4)
C_Timer.After(3, function()
local dropdown = ShestakUIOptionsPanelgeneralchoose_profileDropDown
if dropdown then
T.SkinDropDownBox(dropdown)
end
end)
end)
----------------------------------------------------------------------------------------
-- Slash commands
----------------------------------------------------------------------------------------
do
function SlashCmdList.CONFIG()
if not options or not options:IsShown() then
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION)
HideUIPanel(GameMenuFrame)
options:Show()
else
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION)
options:Hide()
end
end
SLASH_CONFIG1 = "/config"
SLASH_CONFIG2 = "/cfg"
SLASH_CONFIG3 = "/configui"
function SlashCmdList.RESETCONFIG()
if ShestakUIOptionsGlobal[realm][name] == true then
StaticPopup_Show("SHESTAKUI_RESET_PERCHAR")
else
StaticPopup_Show("SHESTAKUI_RESET")
end
end
SLASH_RESETCONFIG1 = "/resetconfig"
end
----------------------------------------------------------------------------------------
-- Button in GameMenuButton frame
----------------------------------------------------------------------------------------
local menuButton = CreateFrame("Button", "GameMenuButtonSettingsUI", GameMenuFrame, "GameMenuButtonTemplate")
menuButton:SetText("ShestakUI")
menuButton:SetPoint("TOP", GetLocale() ~= "koKR" and "GameMenuButtonAddons" or "GameMenuButtonRatings", "BOTTOM", 0, -1)
GameMenuFrame:HookScript("OnShow", function(self)
self:SetHeight(self:GetHeight() + menuButton:GetHeight())
GameMenuButtonLogout:SetPoint("TOP", menuButton, "BOTTOM", 0, -16)
end)
menuButton:SetScript("OnClick", function()
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION)
HideUIPanel(GameMenuFrame)
options:Show()
end)
================================================
FILE: ShestakUI_Config/ShestakUI_Config.toc
================================================
## Interface: 100005
## Title: ShestakUI Config
## Notes: In-game configuration for ShestakUI
## Author: Shestak
## Version: 9.20
## RequiredDeps: ShestakUI
## SavedVariables: ShestakUIOptionsGlobal, ShestakUIOptions
## SavedVariablesPerCharacter: ShestakUIOptionsPerChar
## X-Website: http://shestak.org
## X-Credits: Haleth, Solor
## X-Thanks: Tryllemann, Wetxius
Locales\English.lua
Locales\Chinese.lua
Locales\French.lua
Locales\German.lua
Locales\Italian.lua
Locales\Russian.lua
Locales\Spanish.lua
Locales\Taiwan.lua
Core.lua
Options.lua