diff --git a/README.md b/README.md index f65eb3d7..eedf2846 100644 --- a/README.md +++ b/README.md @@ -1,146 +1,312 @@ -pfUI performance updates, use on own risk. +# pfUI -## DLL Integrations +[![Version](https://img.shields.io/badge/version-6.0.0-blue.svg)](https://github.com/shagu/pfUI) +[![WoW](https://img.shields.io/badge/WoW-1.12.1%20Vanilla-orange.svg)](#) +[![TBC](https://img.shields.io/badge/WoW-2.4.3%20TBC-green.svg)](#) +[![SuperWoW](https://img.shields.io/badge/SuperWoW-Enhanced-purple.svg)](https://github.com/balakethelock/SuperWoW) -pfUI includes optional integration modules for client DLLs that provide enhanced functionality beyond what the standard WoW 1.12 client supports. These features are only enabled when the corresponding DLL is installed. +An AddOn for World of Warcraft: Vanilla (1.12.1) and The Burning Crusade (2.4.3), which aims to be a full replacement for the original interface. The design is inspired by several screenshots I've seen from TukUI, ElvUI and others. This addon delivers modern features and a minimalistic style that's easy to use right from the start. It is entirely written from scratch without any inclusion of third-party addons or libraries. + +This is **not** an addon-pack like [ShaguUI](http://shagu.org/ShaguUI/), however, there is support for external addons like MobHealth3, DPSMate and others, but they will never be shipped within the package. + +**Please do not re-upload or distribute outdated versions of this project. However, you are more than welcome to fork or link to the official github page.** --- +## What's New in Version 6.0.0 (January 5, 2026) + +### 🚀 Major Performance Improvements + +- ✅ **Central Raid/Party Event Handler** - Replaced per-frame event registration with a centralized system using O(1) unitmap lookups instead of O(n) iteration. Reduces event processing from ~5,760 calls/sec to ~400 calls/sec in 40-man raids (97.5% improvement) +- ✅ **Raid HP/Mana Update Fix** - Fixed race condition where unitmap wasn't rebuilt after frame IDs were reassigned, causing HP/Mana bars to not update when players swap positions +- ✅ **OnUpdate Throttling** - Added configurable throttles to reduce CPU usage: + - Nameplates: 0.1s throttle (target updates remain instant) + - Tooltip cursor following: 0.1s throttle + - Chat tab mouseover: 0.1s throttle + - Panel alignment: 0.2s throttle + - Autohide hover check: 0.05s throttle + - Libpredict cleanup: 0.1s throttle + +### 🔧 Castbar & Pushback System + +- ✅ **Pushback Fix** - Fixed spell pushback calculation: now correctly adds delay to `casttime` instead of `start` time, matching actual WoW behavior +- ✅ **Player GUID Caching** - Caches player GUID on PLAYER_ENTERING_WORLD for efficient self-cast detection +- ✅ **Hybrid Detection System** - Uses libcast.db for player casts (handles SPELLCAST_DELAYED events) and SuperWoW's UNIT_CASTEVENT for NPC/other player casts +- ✅ **2-Decimal Precision** - Castbar timer now displays with 2 decimal places (e.g., "1.45 / 2.50") for more precise timing + +### 🐱 Druid Stealth Detection + +- ✅ **Event-Based Detection** - Replaced polling-based stealth detection with event-driven system using UNIT_CASTEVENT and PLAYER_AURAS_CHANGED +- ✅ **Instant Cat Form Detection** - Detects Cat Form via UNIT_CASTEVENT (spell ID 768) for immediate actionbar page switch +- ✅ **Smart Buff Scanning** - Only scans buffs when actually needed (entering Cat Form), eliminates 31-buff scan every frame +- ✅ **Cached Variables** - Caches stealth state to prevent redundant checks + +### 🎯 Nameplate Improvements + +- ✅ **Friendly Player Classification** - Fixed friendly players being classified as FRIENDLY_NPC, now correctly uses FRIENDLY_PLAYER for proper nameplate coloring and behavior +- ✅ **Performance Throttle** - 0.1s update throttle for non-target nameplates while keeping target nameplate updates instant + +### 🆕 New Modules + +- ✅ **nampower.lua** - Nampower DLL integration module: + - Spell Queue Indicator (shows queued spell icon near castbar) + - GCD Indicator + - Reactive Spell Indicator + - Enhanced buff tracking + - Requires [Nampower DLL](https://gitea.com/avitasia/nampower) + +- ✅ **unitxp.lua** - UnitXP_SP3 DLL integration module: + - Line of Sight Indicator on target frame + - Behind Indicator on target frame + - OS Notifications for combat events + - Distance-based features + - Requires [UnitXP_SP3 DLL](https://github.com/allfoxwy/UnitXP_SP3) + +- ✅ **bgscore.lua** - Battleground Score frame positioning: + - Movable BG score frame + - Position saving across sessions + +### 🛠️ DLL Detection & API Helpers + +- ✅ **HasSuperWoW()** - Detects SuperWoW DLL presence +- ✅ **HasUnitXP()** - Detects UnitXP_SP3 DLL presence +- ✅ **HasNampower()** - Detects Nampower DLL presence +- ✅ **GetUnitDistance(unit1, unit2)** - Returns distance using best available method (UnitXP or SuperWoW) +- ✅ **UnitInLineOfSight(unit1, unit2)** - Line of sight check via UnitXP +- ✅ **UnitIsBehind(unit1, unit2)** - Behind check via UnitXP + +### 📝 New Slash Commands + +- ✅ **/pfdll** - Shows DLL status for SuperWoW, Nampower, and UnitXP with detailed diagnostics +- ✅ **/pfbehind** - Test command for Behind/LOS detection on current target +- ✅ **/clickthrough** or **/ct** - Toggle clickthrough mode (click through corpses) + +### 🎮 SuperWoW API Wrappers + +- ✅ **TrackUnit API** - Track group members on minimap (configurable) +- ✅ **Raid Marker Targeting** - Target units by raid marker ("mark1" to "mark8") +- ✅ **GetUnitOwner** - Get owner of pets/totems using "owner" suffix +- ✅ **Enhanced SpellInfo** - Wrapper returning structured spell data +- ✅ **Clickthrough API** - Toggle clicking through corpses +- ✅ **Autoloot API** - Control autoloot setting +- ✅ **GetPlayerBuffSpellId** - Get spell ID from buff index +- ✅ **LogToCombatLog** - Add custom entries to combat log +- ✅ **SetLocalRaidTarget** - Set raid markers only visible to self +- ✅ **GetItemCharges** - Get item charges (SuperWoW returns as negative) +- ✅ **GetUnitWeaponEnchants** - Get weapon enchant info on any unit + +### 💬 Chat Enhancements + +- ✅ **Player Level Display** - Shows player level next to names in chat (color-coded by difficulty) +- ✅ **Tab Mouseover Throttle** - 0.1s throttle for chat tab hover effects + +### ⚙️ New Configuration Options + +All new features are configurable via `/pfui`: + +**Unit Frames → SuperWoW Settings:** +- Track Group on Minimap + +**Unit Frames → Nampower Settings:** +- Show Spell Queue Indicator +- Spell Queue Icon Size +- Show Reactive Spell Indicator +- Reactive Indicator Size +- Enhanced Buff Tracking + +**Unit Frames → UnitXP Settings:** +- Show Line of Sight Indicator +- Show Behind Indicator +- Enable OS Notifications + +**Chat → Text:** +- Enable Player Levels + +### 🐛 Bugfixes + +- ✅ **superwow_active Variable** - Fixed inconsistent SuperWoW detection across modules (nameplates, castbar, librange, unitframes) +- ✅ **Unitmap Race Condition** - Fixed HP/Mana not updating when raid members swap positions +- ✅ **Friendly Nameplate Color** - Fixed friendly players using NPC color instead of player color + +### 🔄 TBC Compatibility Preserved + +All TBC-specific features remain intact: +- ✅ Commanding Shout indicator +- ✅ Misdirection indicator +- ✅ Earth Shield indicator +- ✅ Prayer of Mending indicator + +--- + +**Version:** 6.0.0 +**Release Date:** January 5, 2026 +**Compatibility:** World of Warcraft 1.12.1 (Vanilla) & 2.4.3 (TBC) +**Optional DLLs:** SuperWoW, Nampower, UnitXP_SP3 (enhanced features when available) + +--- + +## Installation (Vanilla) +1. Download **[Latest Version](https://github.com/shagu/pfUI/archive/master.zip)** +2. Unpack the Zip file +3. Rename the folder "pfUI-master" to "pfUI" +4. Copy "pfUI" into Wow-Directory\Interface\AddOns +5. Restart Wow + +## Installation (The Burning Crusade) +1. Download **[Latest Version](https://github.com/shagu/pfUI/archive/master.zip)** +2. Unpack the Zip file +3. Rename the folder "pfUI-master" to "pfUI-tbc" +4. Copy "pfUI-tbc" into Wow-Directory\Interface\AddOns +5. Restart Wow + +## Optional DLL Enhancements + +pfUI 6.0.0 includes optional integrations with client-side DLLs for enhanced functionality: + ### SuperWoW +**Repository:** [https://github.com/balakethelock/SuperWoW](https://github.com/balakethelock/SuperWoW) -**Repository:** https://github.com/balakethelock/SuperWoW - -SuperWoW provides GUID-based unit tracking, spell information APIs, and various client enhancements. - -#### Features - -- **GUID-Based Focus Frame** - Focus frame uses actual unit GUIDs instead of name-based emulation -- **Native Mouseover Casting** - `/pfcast` supports true mouseover targeting via `CastSpellByName(spell, unit)` -- **Druid Mana Bar** - Shows mana while in feral forms (requires `unitframes.druidmanabar` config) -- **Enhanced Cast Bars** - Uses `UNIT_CASTEVENT` for accurate cast/channel tracking with spell IDs -- **Enhanced Debuff Tracking** - Accurate debuff application via `UNIT_CASTEVENT` with caster info -- **Group Minimap Tracking** - Track party/raid members on minimap via `TrackUnit()` API -- **Raid Marker Targeting** - Target units by raid marker (`mark1` to `mark8`) -- **Clickthrough Mode** - Click through corpses to loot underneath (`/clickthrough` or `/ct`) -- **Config Import/Export** - Save and load pfUI configs via `/pfexport` and `/pfimport` -- **Local Raid Markers** - Set raid markers visible only to yourself -- **Enchanting Link Fixes** - Converts enchant links for compatibility with non-SuperWoW clients - -#### API Functions - -| Function | Description | -|----------|-------------| -| `pfUI.api.GetMarkedUnit(index)` | Get unit ID for raid marker 1-8 | -| `pfUI.api.TargetMark(index)` | Target unit with raid marker | -| `pfUI.api.GetUnitOwner(unit)` | Get owner of pet/totem | -| `pfUI.api.GetSpellInfo(spellId)` | Get spell name, rank, texture, range | -| `pfUI.api.SetClickthrough(enabled)` | Enable/disable clickthrough | -| `pfUI.api.ToggleClickthrough()` | Toggle clickthrough mode | -| `pfUI.api.SetAutoloot(enabled)` | Enable/disable autoloot | -| `pfUI.api.ExportConfig(filename)` | Export config to file | -| `pfUI.api.ImportConfig(filename)` | Import config from file | -| `pfUI.api.GetPlayerBuffSpellId(index)` | Get spell ID for player buff | -| `pfUI.api.LogToCombatLog(text)` | Add text to combat log | -| `pfUI.api.SetLocalRaidTarget(unit, index)` | Set local-only raid marker | -| `pfUI.api.GetItemCharges(bag, slot)` | Get item charges (returns positive) | -| `pfUI.api.GetUnitWeaponEnchants(unit)` | Get weapon enchant info | - ---- +Provides: +- Enhanced castbar detection via UNIT_CASTEVENT +- UnitPosition for distance calculations +- SetMouseoverUnit for improved targeting +- SpellInfo for spell data queries ### Nampower +**Repository:** [https://gitea.com/avitasia/nampower](https://gitea.com/avitasia/nampower) -**Repository:** https://gitea.com/avitasia/nampower - -Nampower provides spell queuing, precise cooldown tracking, and detailed aura/buff information. - -#### Features - -- **Spell Queue Indicator** - Shows queued spell icon near castbar (requires `unitframes.spellqueue` config) -- **Reactive Spell Indicator** - Highlights when Overpower, Revenge, Execute, Riposte, etc. are usable (requires `unitframes.reactive_indicator`) -- **Enhanced Debuff Tracking** - GUID-based debuff tracking via `DEBUFF_ADDED/REMOVED` events -- **Enhanced Buff Tracking** - GUID-based buff tracking via `BUFF_ADDED/REMOVED` events (requires `unitframes.nampower_buffs`) -- **Swing Timer** - Track main-hand and off-hand auto-attack timers -- **Disenchant All** - `/disenchantall` or `/dea` to disenchant eligible items - -#### API Functions - -| Function | Description | -|----------|-------------| -| `pfUI.api.GetUnitAuras(unit)` | Get all buffs/debuffs with spell IDs via `GetUnitField` | -| `pfUI.api.UnitHasAura(unit, spellId)` | Check if unit has specific aura | -| `pfUI.api.GetUnitResistances(unit)` | Get unit's resistances (armor, fire, frost, etc.) | -| `pfUI.api.GetPreciseCooldown(spellId)` | Get precise cooldown info (remaining ms, GCD state) | -| `pfUI.api.GetPreciseItemCooldown(itemId)` | Get precise item cooldown | -| `pfUI.api.GetEquippedTrinkets()` | Get equipped trinket info | -| `pfUI.api.GetTrinketCooldown(slot)` | Get trinket cooldown | -| `pfUI.api.UseTrinket(slot, target)` | Use trinket | -| `pfUI.api.GetNampowerItemStats(itemId)` | Get item stats | -| `pfUI.api.GetNampowerItemLevel(itemId)` | Get item level | -| `pfUI.api.GetSpellBonus(spellId, modType)` | Get spell modifiers (damage, crit, cost) | -| `pfUI.api.GetSpellDamageBonus(spellId)` | Get spell damage bonus | -| `pfUI.api.GetSpellCritBonus(spellId)` | Get spell crit bonus | -| `pfUI.api.GetSpellCostReduction(spellId)` | Get spell cost reduction | -| `pfUI.api.GetAllBagItems()` | Get all bag items | -| `pfUI.api.FindItem(itemIdOrName)` | Find item in bags | -| `pfUI.api.UseItem(itemIdOrName, target)` | Use item | -| `pfUI.api.GetPlayerEquipment()` | Get player's equipped items | -| `pfUI.api.GetTargetEquipment()` | Get target's equipped items | -| `pfUI.api.GetMaxRankSpellId(spellName)` | Get spell ID for max rank | -| `pfUI.api.GetSpellSlotInfo(spellName)` | Get spell slot/book info | -| `pfUI.api.QueueLuaScript(script, priority)` | Queue Lua script for execution | -| `pfUI.api.QueueSpell(spellName)` | Queue spell by name | -| `pfUI.api.StopChannelNextTick()` | Stop channeling next tick | -| `pfUI.api.GetSpellRecord(spellId)` | Get full spell database record | -| `pfUI.api.GetSpellSchool(spellId)` | Get spell school (Fire, Frost, etc.) | -| `pfUI.api.GetSwingTimers()` | Get auto-attack swing timers | -| `pfUI.api.libdebuff_nampower(unit, id)` | Enhanced UnitDebuff with Nampower data | - ---- +Provides: +- Spell queue indicator +- GCD indicator +- Reactive spell detection +- Enhanced cast information ### UnitXP_SP3 +**Repository:** [https://github.com/allfoxwy/UnitXP_SP3](https://github.com/allfoxwy/UnitXP_SP3) -**Repository:** https://github.com/allfoxwy/UnitXP_SP3 +Provides: +- Line of Sight detection +- Behind detection +- Accurate distance calculations +- OS notifications -UnitXP provides line-of-sight checks, positional information, precise distances, and OS-level notifications. +Use `/pfdll` in-game to check which DLLs are detected. -#### Features +## Commands -- **Line of Sight Indicator** - Shows "NO LOS" text on target frame when target is obstructed (requires `unitframes.los_indicator`) -- **Behind Indicator** - Shows "BEHIND" text on target frame when positioned behind target (requires `unitframes.behind_indicator`) -- **OS Notifications** - Flashes taskbar and plays system sound on whispers, ready checks, BG queue pops (requires `unitframes.unitxp_notify`) -- **Precise Distance** - Exact yard distance between units -- **Smart Targeting** - Target nearest enemy, highest HP, cycle through enemies + /pfui Open the configuration GUI + /pfdll Show DLL detection status (SuperWoW, Nampower, UnitXP) + /pfbehind Test Behind/LOS detection on current target + /clickthrough Toggle clickthrough mode (or /ct) + /share Open the configuration import/export dialog + /gm Open the ticket Dialog + /rl Reload the whole UI + /farm Toggles the Farm-Mode + /pfcast Same as /cast but for mouseover units + /focus Creates a Focus-Frame for the current target + /castfocus Same as /cast but for focus frame + /clearfocus Clears the Focus-Frame + /swapfocus Toggle Focus and Target-Frame + /pftest Toggle pfUI Unitframe Test Mode + /abp Addon Button Panel -#### API Functions +## Languages +pfUI supports and contains language specific code for the following gameclients. +* English (enUS) +* Korean (koKR) +* French (frFR) +* German (deDE) +* Chinese (zhCN) +* Spanish (esES) +* Russian (ruRU) -| Function | Description | -|----------|-------------| -| `pfUI.api.GetPreciseDistance(unit1, unit2)` | Get exact distance in yards | -| `pfUI.api.IsInMeleeRange(unit)` | Check if unit is in melee range | -| `pfUI.api.GetAoEDistance(unit1, unit2)` | Get distance for AoE calculations | -| `pfUI.api.TargetNearestEnemy()` | Target nearest hostile unit | -| `pfUI.api.TargetHighestHP()` | Target enemy with most HP | -| `pfUI.api.TargetNextEnemy()` | Cycle to next enemy | -| `pfUI.api.TargetPreviousEnemy()` | Cycle to previous enemy | -| `pfUI.api.TargetNextMarked(order)` | Target next marked enemy in order | -| `pfUI.api.UnitInLineOfSight(unit1, unit2)` | Check line of sight between units | -| `pfUI.api.UnitIsBehind(unit1, unit2)` | Check if unit1 is behind unit2 | +## Recommended Addons +* [pfQuest](https://shagu.org/pfQuest) A simple database and quest helper +* [WIM](http://addons.us.to/addon/wim), [WIM (continued)](https://github.com/shirsig/WIM) Give whispers an instant messenger feel + +## Plugins +* [pfUI-eliteoverlay](https://shagu.org/pfUI-eliteoverlay) Add elite dragons to unitframes +* [pfUI-fonts](https://shagu.org/pfUI-fonts) Additional fonts for pfUI +* [pfUI-CustomMedia](https://github.com/mrrosh/pfUI-CustomMedia) Additional textures for pfUI +* [pfUI-Gryphons](https://github.com/mrrosh/pfUI-Gryphons) Add back the gryphons to your actionbars + +## FAQ +**What does "pfUI" stand for?** +The term "*pfui!*" is german and simply stands for "*pooh!*", because I'm not a +big fan of creating configuration UI's, especially not via the Wow-API +(you might have noticed that in ShaguUI). + +**How can I donate?** +You can donate via [GitHub](https://github.com/sponsors/shagu) or [Ko-fi](https://ko-fi.com/shagu) + +**How do I report a Bug?** +Please provide as much information as possible in the [Bugtracker](https://github.com/shagu/pfUI/issues). +If there is an error message, provide the full content of it. Just telling that "there is an error" won't help any of us. +Please consider adding additional information such as: since when did you got the error, +does it still happen using a clean configuration, what other addons are loaded and which version you're running. +When playing with a non-english client, the language might be relevant too. If possible, explain how people can reproduce the issue. + +**How can I contribute?** +Report errors and issues in the [Bugtracker](https://github.com/shagu/pfUI/issues). +Please make sure to have the latest version installed and check for conflicting addons beforehand. + +**I have bad performance, what can I do?** +Version 6.0.0 includes significant performance optimizations. If you still experience issues: +1. Disable "Frame Shadows" in Settings → Appearance → Enable Frame Shadows +2. Check `/pfdll` to see which DLLs are active (some features require DLLs) +3. Disable all AddOns but pfUI and enable one-by-one to identify conflicts +4. Report issues via the [Bugtracker](https://github.com/shagu/pfUI/issues) + +**Where is the happiness indicator for pets?** +The pet happiness is shown as the color of your pet's frame. Depending on your skin, this can either be the text or the background color of your pet's healthbar: + +- Green = Happy +- Yellow = Content +- Red = Unhappy + +Since version 4.0.7 there is also an additional icon that can be enabled from the pet unit frame options. + +**Can I use Clique with pfUI?** +This addon already includes support for clickcasting. If you still want to make use of clique, all pfUI's unitframes are already compatible to Clique-TBC. For Vanilla, a pfUI compatible version can be found [Here](https://github.com/shagu/Clique/archive/master.zip). If you want to keep your current version of Clique, you'll have to apply this [Patch](https://github.com/shagu/Clique/commit/a5ee56c3f803afbdda07bae9cd330e0d4a75d75a). + +**Where is the Experience Bar?** +The experience bar shows up on mouseover and whenever you gain experience, next to left chatframe by default. There's also an option to make it stay visible all the time. + +**How do I show the Damage- and Threatmeter Dock?** +If you enabled the "dock"-feature for your external (third-party) meters such as DPSMate or KTM, then you'll be able to toggle between them and the Right Chat by clicking on the ">" symbol on the bottom-right panel. + +**Why is my chat always resetting to only 3 lines of text?** +This happens if "Simple Chat" is enabled in blizzards interface settings (Advanced Options). +Paste the following command into your chat to disable that option: `/run SIMPLE_CHAT="0"; pfUI.chat.SetupPositions(); ReloadUI()` + +**How can I enable mouseover cast?** +On Vanilla, create a macro with "/pfcast SPELLNAME". If you also want to see the cooldown, You might want to add "/run if nil then CastSpellByName("SPELLNAME") end" on top of the macro. For The Burning Crusade, just use the regular mouseover macros. + +**Will there be pfUI for Activision's "Classic" remakes?** +No, it would require an entire rewrite of the AddOn since the game is now a different one. The AddOn-API has evolved during the last 15 years and the new "Classic" versions are based on a current retail gameclient. I don't plan to play any of those new versions, so I won't be porting any of my addons to it. + +**Everything from scratch?! Are you insane?** +Most probably, yes. --- -### Configuration Options +## 🤝 Credits & Acknowledgments -These DLL features can be enabled/disabled via `/pfui` settings under Unit Frames: +- **Shagu** - Original pfUI creator and maintainer +- **SuperWoW Team** - SuperWoW framework development +- **Nampower Team** - Nampower DLL development +- **UnitXP Team** - UnitXP_SP3 DLL development +- **Community** - Bug reports, feature suggestions, and testing -| Setting | DLL | Description | -|---------|-----|-------------| -| `unitframes.druidmanabar` | SuperWoW | Show mana bar while shapeshifted | -| `unitframes.track_group` | SuperWoW | Track group members on minimap | -| `unitframes.spellqueue` | Nampower | Show spell queue indicator | -| `unitframes.spellqueuesize` | Nampower | Spell queue icon size | -| `unitframes.reactive_indicator` | Nampower | Show reactive ability procs | -| `unitframes.reactive_size` | Nampower | Reactive indicator icon size | -| `unitframes.nampower_buffs` | Nampower | Enhanced buff tracking | -| `unitframes.los_indicator` | UnitXP | Show line of sight indicator | -| `unitframes.behind_indicator` | UnitXP | Show behind indicator | -| `unitframes.unitxp_notify` | UnitXP | Enable OS notifications | +--- + +## 📄 License + +Same as original pfUI - free to use and modify. + +--- + +**Version:** 6.0.0 +**Release Date:** January 5, 2026 +**Compatibility:** World of Warcraft 1.12.1 (Vanilla) & 2.4.3 (TBC) +**Status:** Stable & Production-Ready diff --git a/api/api.lua b/api/api.lua index dfa73621..030a1afd 100644 --- a/api/api.lua +++ b/api/api.lua @@ -3,10 +3,6 @@ pfUI.api = { } -- load pfUI environment setfenv(1, pfUI:GetEnvironment()) --- Client API shortcuts -gfind = string.gmatch or string.gfind -mod = math.mod or mod - -- [ DLL Detection Helpers ] -- Detects presence of various DLL extensions for enhanced functionality @@ -83,6 +79,10 @@ function pfUI.api.UnitIsBehind(unit1, unit2) return nil end +-- Client API shortcuts +gfind = string.gmatch or string.gfind +mod = math.mod or mod + -- [ strsplit ] -- Splits a string using a delimiter. -- 'delimiter' [string] characters that will be interpreted as delimiter @@ -1260,6 +1260,10 @@ function pfUI.api.EnableAutohide(frame, timeout, combat) end frame.hover:SetScript("OnUpdate", function() + -- throttle to 0.05s + if (this.tick or 0) > GetTime() then return end + this.tick = GetTime() + 0.05 + if this.activeTo == "keep" then return end if MouseIsOver(this, 10, -10, -10, 10) then diff --git a/api/config.lua b/api/config.lua index b7e3ceee..de550b88 100644 --- a/api/config.lua +++ b/api/config.lua @@ -221,6 +221,13 @@ function pfUI:LoadConfig() pfUI:UpdateConfig("unitframes", nil, "druidmanabar", "1") pfUI:UpdateConfig("unitframes", nil, "druidmanaheight", "2") pfUI:UpdateConfig("unitframes", nil, "druidmanatext", "0") + pfUI:UpdateConfig("unitframes", nil, "rangechecki", "4") + pfUI:UpdateConfig("unitframes", nil, "combowidth", "6") + pfUI:UpdateConfig("unitframes", nil, "comboheight", "6") + pfUI:UpdateConfig("unitframes", nil, "abbrevnum", "1") + pfUI:UpdateConfig("unitframes", nil, "abbrevname", "1") + + -- Nampower Settings pfUI:UpdateConfig("unitframes", nil, "spellqueue", "1") pfUI:UpdateConfig("unitframes", nil, "spellqueuesize", "24") pfUI:UpdateConfig("unitframes", nil, "gcd_indicator", "0") @@ -229,15 +236,12 @@ function pfUI:LoadConfig() pfUI:UpdateConfig("unitframes", nil, "reactive_indicator", "0") pfUI:UpdateConfig("unitframes", nil, "reactive_size", "28") pfUI:UpdateConfig("unitframes", nil, "damage_tracking", "0") + + -- UnitXP Settings pfUI:UpdateConfig("unitframes", nil, "los_indicator", "0") pfUI:UpdateConfig("unitframes", nil, "behind_indicator", "0") pfUI:UpdateConfig("unitframes", nil, "unitxp_notify", "0") pfUI:UpdateConfig("unitframes", nil, "track_group", "0") - pfUI:UpdateConfig("unitframes", nil, "rangechecki", "4") - pfUI:UpdateConfig("unitframes", nil, "combowidth", "6") - pfUI:UpdateConfig("unitframes", nil, "comboheight", "6") - pfUI:UpdateConfig("unitframes", nil, "abbrevnum", "1") - pfUI:UpdateConfig("unitframes", nil, "abbrevname", "1") pfUI:UpdateConfig("unitframes", nil, "selfingroup", "0") pfUI:UpdateConfig("unitframes", nil, "selfinraid", "0") @@ -725,8 +729,8 @@ function pfUI:LoadConfig() pfUI:UpdateConfig("chat", "text", "playerlinks", "1") pfUI:UpdateConfig("chat", "text", "detecturl", "1") pfUI:UpdateConfig("chat", "text", "classcolor", "1") - pfUI:UpdateConfig("chat", "text", "playerlevel", "1") pfUI:UpdateConfig("chat", "text", "whosearchunknown", "0") + pfUI:UpdateConfig("chat", "text", "playerlevel", "1") pfUI:UpdateConfig("chat", "left", "width", "380") pfUI:UpdateConfig("chat", "left", "height", "180") pfUI:UpdateConfig("chat", "right", "enable", "0") diff --git a/api/unitframes.lua b/api/unitframes.lua index db4fe46e..e9a4eb81 100644 --- a/api/unitframes.lua +++ b/api/unitframes.lua @@ -2405,6 +2405,8 @@ function pfUI.uf:SetupBuffIndicators(config) if myclass == "WARRIOR" then -- Battle Shout table.insert(indicators, "interface\\icons\\ability_warrior_battleshout") + -- Commanding Shout (TBC) + table.insert(indicators, "interface\\icons\\ability_warrior_rallyingcry") end if myclass == "MAGE" then @@ -2423,6 +2425,14 @@ function pfUI.uf:SetupBuffIndicators(config) -- Aspect of the Pack table.insert(indicators, "interface\\icons\\ability_mount_whitetiger") + + -- Misdirection (TBC) + table.insert(indicators, "interface\\icons\\ability_hunter_misdirection") + end + + if myclass == "SHAMAN" then + -- Earth Shield (TBC) + table.insert(indicators, "interface\\icons\\spell_nature_skinofearth") end end @@ -2451,6 +2461,8 @@ function pfUI.uf:SetupBuffIndicators(config) table.insert(indicators, "interface\\icons\\spell_holy_renew") -- Power Word: Shield table.insert(indicators, "interface\\icons\\spell_holy_powerwordshield") + -- Prayer of Mending (TBC) + table.insert(indicators, "interface\\icons\\spell_holy_prayerofmendingtga") end if myclass == "DRUID" or config.all_hots == "1" then diff --git a/init/compat.xml b/init/compat.xml index 173883ce..7d9f7b2d 100644 --- a/init/compat.xml +++ b/init/compat.xml @@ -1,3 +1,4 @@ + diff --git a/init/modules.xml b/init/modules.xml index 07f703ff..198ae3b4 100644 --- a/init/modules.xml +++ b/init/modules.xml @@ -35,6 +35,7 @@ + @@ -65,6 +66,7 @@ + @@ -72,4 +74,5 @@ + diff --git a/init/skins.xml b/init/skins.xml index 088c2d55..010e2b96 100644 --- a/init/skins.xml +++ b/init/skins.xml @@ -26,6 +26,7 @@ + @@ -33,4 +34,13 @@ + + + + + + + + + diff --git a/modules/addonbuttons.lua b/modules/addonbuttons.lua index 319ebf3d..c083163f 100644 --- a/modules/addonbuttons.lua +++ b/modules/addonbuttons.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("addonbuttons", "vanilla", function () +pfUI:RegisterModule("addonbuttons", "vanilla:tbc", function () if not pfUI.minimap then return end if C.abuttons.enable == "0" then return end diff --git a/modules/addons.lua b/modules/addons.lua index da35d396..220035c8 100644 --- a/modules/addons.lua +++ b/modules/addons.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("addons", "vanilla", function () +pfUI:RegisterModule("addons", "vanilla:tbc", function () local rawborder, border = GetBorderSize() -- add main menu button diff --git a/modules/afkcam.lua b/modules/afkcam.lua index 504ad036..a9d55d0d 100644 --- a/modules/afkcam.lua +++ b/modules/afkcam.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("afkcam", "vanilla", function () +pfUI:RegisterModule("afkcam", "vanilla:tbc", function () local MARKED_AFK_CAPTURE = SanitizePattern(MARKED_AFK_MESSAGE) local social_chats = { "CHAT_MSG_SAY", diff --git a/modules/autovendor.lua b/modules/autovendor.lua index 5dc88369..57c259ab 100644 --- a/modules/autovendor.lua +++ b/modules/autovendor.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("autovendor", "vanilla", function () +pfUI:RegisterModule("autovendor", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local processed = {} diff --git a/modules/bags.lua b/modules/bags.lua index 49d5a084..d343d98a 100644 --- a/modules/bags.lua +++ b/modules/bags.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("bags", "vanilla", function () +pfUI:RegisterModule("bags", "vanilla:tbc", function () local rawborder, default_border = GetBorderSize("bags") local knownInventorySpellTextures = { @@ -573,8 +573,8 @@ pfUI:RegisterModule("bags", "vanilla", function () SlotLeave() end) - -- The OnEvent function of the template scans for framenames, - -- and doesn't know the pf-Names. Therefore, triggering + -- On TBC, the OnEvent function of the template scans for framenames, + -- and obviously doesn't know the pf-Names. Therefore, triggering -- the update function on each frame manually if frame == pfUI.bag.left and BankFrameItemButton_Update then local SlotUpdate = frame.bagslots.slots[slot].frame:GetScript("OnUpdate") diff --git a/modules/bubbles.lua b/modules/bubbles.lua index 16f4dba6..61f9e991 100644 --- a/modules/bubbles.lua +++ b/modules/bubbles.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("bubbles", "vanilla", function () +pfUI:RegisterModule("bubbles", "vanilla:tbc", function () local alpha = tonumber(C.chat.bubbles.alpha) diff --git a/modules/buff.lua b/modules/buff.lua index 7dfbabf6..f7114416 100644 --- a/modules/buff.lua +++ b/modules/buff.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("buff", "vanilla", function () +pfUI:RegisterModule("buff", "vanilla:tbc", function () -- Hide Blizz BuffFrame:Hide() BuffFrame:UnregisterAllEvents() diff --git a/modules/buffwatch.lua b/modules/buffwatch.lua index f9c7a154..e9109b2a 100644 --- a/modules/buffwatch.lua +++ b/modules/buffwatch.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("buffwatch", "vanilla", function () +pfUI:RegisterModule("buffwatch", "vanilla:tbc", function () local rawborder, border = GetBorderSize("panels") local scanner = libtipscan:GetScanner("buffwatch") diff --git a/modules/chat.lua b/modules/chat.lua index 6268bd4f..5c706824 100644 --- a/modules/chat.lua +++ b/modules/chat.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("chat", "vanilla", function () +pfUI:RegisterModule("chat", "vanilla:tbc", function () local panelfont = C.panel.use_unitfonts == "1" and pfUI.font_unit or pfUI.font_default local panelfont_size = C.panel.use_unitfonts == "1" and C.global.font_unit_size or C.global.font_size local rawborder, default_border = GetBorderSize("chat") @@ -753,7 +753,8 @@ pfUI:RegisterModule("chat", "vanilla", function () end -- Remove prat CLINKs - text = gsub(text, "{CLINK:(%x+):([%d-]-:[%d-]-:[%d-]-:[%d-]-):([^}]-)}", "|c%1|Hitem:%2|h[%3]|h|r") + text = gsub(text, "{CLINK:(%x+):([%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-):([^}]-)}", "|c%1|Hitem:%2|h[%3]|h|r") -- tbc + text = gsub(text, "{CLINK:(%x+):([%d-]-:[%d-]-:[%d-]-:[%d-]-):([^}]-)}", "|c%1|Hitem:%2|h[%3]|h|r") -- vanilla -- Remove chatter CLINKs text = gsub(text, "{CLINK:item:(%x+):([%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-):([^}]-)}", "|c%1|Hitem:%2|h[%3]|h|r") diff --git a/modules/chatcopy.lua b/modules/chatcopy.lua index c67b2a01..11da75e0 100644 --- a/modules/chatcopy.lua +++ b/modules/chatcopy.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("chatcopy", "vanilla", function () +pfUI:RegisterModule("chatcopy", "vanilla:tbc", function () local limit = 100 local f = CreateFrame("Frame") f:RegisterEvent("PLAYER_ENTERING_WORLD") diff --git a/modules/combopoints.lua b/modules/combopoints.lua index 839f50d7..f874974e 100644 --- a/modules/combopoints.lua +++ b/modules/combopoints.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("combopoints", "vanilla", function () +pfUI:RegisterModule("combopoints", "vanilla:tbc", function () local rawborder, border = GetBorderSize() -- Hide Blizzard combo point frame and unregister all events to prevent it from popping up again diff --git a/modules/cooldown.lua b/modules/cooldown.lua index 9561cf83..0a293940 100644 --- a/modules/cooldown.lua +++ b/modules/cooldown.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("cooldown", "vanilla", function () +pfUI:RegisterModule("cooldown", "vanilla:tbc", function () -- cache values local lowcolor = {strsplit(",", C.appearance.cd.lowcolor)} local normalcolor = {strsplit(",", C.appearance.cd.normalcolor)} @@ -134,7 +134,14 @@ pfUI:RegisterModule("cooldown", "vanilla", function () end end - -- vanilla does not have a cooldown frame type, so we hook the - -- regular SetTimer function that each one is calling. - hooksecurefunc("CooldownFrame_SetTimer", SetCooldown) + if pfUI.expansion == "vanilla" then + -- vanilla does not have a cooldown frame type, so we hook the + -- regular SetTimer function that each one is calling. + hooksecurefunc("CooldownFrame_SetTimer", SetCooldown) + else + -- tbc and later expansion have a cooldown frametype, so we can + -- hook directly into the frame creation and add our function there. + local methods = getmetatable(CreateFrame('Cooldown', nil, nil, 'CooldownFrameTemplate')).__index + hooksecurefunc(methods, 'SetCooldown', SetCooldown) + end end) diff --git a/modules/easteregg.lua b/modules/easteregg.lua index 9c5a7512..35a76c6d 100644 --- a/modules/easteregg.lua +++ b/modules/easteregg.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("easteregg", "vanilla", function () +pfUI:RegisterModule("easteregg", "vanilla:tbc", function () -- merry x-mas! if date("%m%d") == "1224" or date("%m%d") == "1225" then local title = (UnitFactionGroup("player") == "Horde") and PVP_RANK_18_0 or PVP_RANK_18_1 diff --git a/modules/energytick.lua b/modules/energytick.lua index cfcffb71..8e966afc 100644 --- a/modules/energytick.lua +++ b/modules/energytick.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("energytick", "vanilla", function () +pfUI:RegisterModule("energytick", "vanilla:tbc", function () if not pfUI.uf or not pfUI.uf.player then return end local energytick = CreateFrame("Frame", nil, pfUI.uf.player.power.bar) @@ -7,9 +7,6 @@ pfUI:RegisterModule("energytick", "vanilla", function () energytick:RegisterEvent("UNIT_DISPLAYPOWER") energytick:RegisterEvent("UNIT_ENERGY") energytick:RegisterEvent("UNIT_MANA") - energytick:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF") - energytick:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS") - energytick:SetScript("OnEvent", function() if UnitPowerType("player") == 0 and C.unitframes.player.manatick == "1" then this.mode = "MANA" @@ -21,14 +18,6 @@ pfUI:RegisterModule("energytick", "vanilla", function () this:Hide() end - -- Filter nur eigene Energy-Gewinne von Talents/Buffs - if event == "CHAT_MSG_SPELL_SELF_BUFF" or event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS" then - if string.find(arg1, "You gain") and string.find(arg1, "Energy from") then - this.ignoreNextGain = true - end - return - end - if event == "PLAYER_ENTERING_WORLD" then this.lastMana = UnitMana("player") end @@ -49,10 +38,7 @@ pfUI:RegisterModule("energytick", "vanilla", function () this.badtick = diff end elseif this.mode == "ENERGY" and diff > 0 then - if not this.ignoreNextGain then - this.target = 2 - end - this.ignoreNextGain = false + this.target = 2 end this.lastMana = this.currentMana end @@ -83,10 +69,14 @@ pfUI:RegisterModule("energytick", "vanilla", function () energytick.spark:SetWidth(C.unitframes.player.pheight + 5) energytick.spark:SetBlendMode('ADD') + -- update spark size on player frame changes local hookUpdateConfig = pfUI.uf.player.UpdateConfig function pfUI.uf.player.UpdateConfig() + -- update spark sizes energytick.spark:SetHeight(C.unitframes.player.pheight + 15) energytick.spark:SetWidth(C.unitframes.player.pheight + 5) + + -- run default unitframe update function hookUpdateConfig(pfUI.uf.player) end -end) \ No newline at end of file +end) diff --git a/modules/farmmode.lua b/modules/farmmode.lua index 0a1e3bad..19478884 100644 --- a/modules/farmmode.lua +++ b/modules/farmmode.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("farmmode", "vanilla", function () +pfUI:RegisterModule("farmmode", "vanilla:tbc", function () local function ToggleFarmMode() if pfUI.farmmap:IsShown() then pfUI.farmmap:Hide() diff --git a/modules/feigndeath.lua b/modules/feigndeath.lua index 01a5e41f..ba4e5fcd 100644 --- a/modules/feigndeath.lua +++ b/modules/feigndeath.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("feigndeath", "vanilla", function () +pfUI:RegisterModule("feigndeath", "vanilla:tbc", function () local cache = { } local scanner = libtipscan:GetScanner("feigndeath") local healthbar = scanner:GetChildren() diff --git a/modules/firstrun.lua b/modules/firstrun.lua index 582cbe45..f27bd7f2 100644 --- a/modules/firstrun.lua +++ b/modules/firstrun.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("firstrun", "vanilla", function () +pfUI:RegisterModule("firstrun", "vanilla:tbc", function () pfUI.firstrun = CreateFrame("Frame", "pfFirstRunWizard", UIParent) pfUI.firstrun.steps = {} diff --git a/modules/focus.lua b/modules/focus.lua index 16f4124a..a2e24582 100644 --- a/modules/focus.lua +++ b/modules/focus.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("focus", "vanilla", function () +pfUI:RegisterModule("focus", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end diff --git a/modules/group.lua b/modules/group.lua index 81684f70..5aa0aaa2 100644 --- a/modules/group.lua +++ b/modules/group.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("group", "vanilla", function () +pfUI:RegisterModule("group", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end diff --git a/modules/gryphons.lua b/modules/gryphons.lua index 287ae5b8..96eba04e 100644 --- a/modules/gryphons.lua +++ b/modules/gryphons.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("gryphons", "vanilla", function () +pfUI:RegisterModule("gryphons", "vanilla:tbc", function () pfUI.gryphons = { frames = { left = CreateFrame("Frame"), diff --git a/modules/gui.lua b/modules/gui.lua index 64785efe..92b2abde 100644 --- a/modules/gui.lua +++ b/modules/gui.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("gui", "vanilla", function () +pfUI:RegisterModule("gui", "vanilla:tbc", function () local Reload, U, CreateConfig, CreateTabFrame, CreateArea, CreateGUIEntry, EntryUpdate -- "searchDB" gets populated when CreateConfig is called. The table holds @@ -2402,26 +2402,36 @@ pfUI:RegisterModule("gui", "vanilla", function () CreateConfig(nil, "ShaguDPS (" .. T["Dock"] .. ")", C.thirdparty.shagudps, "dock", "checkbox") CreateConfig(nil, "DPSMate (" .. T["Skin"] .. ")", C.thirdparty.dpsmate, "skin", "checkbox") CreateConfig(nil, "DPSMate (" .. T["Dock"] .. ")", C.thirdparty.dpsmate, "dock", "checkbox") - CreateConfig(nil, "SWStats (" .. T["Skin"] .. ")", C.thirdparty.swstats, "skin", "checkbox") - CreateConfig(nil, "SWStats (" .. T["Dock"] .. ")", C.thirdparty.swstats, "dock", "checkbox") - CreateConfig(nil, "KLH Threat Meter (" .. T["Skin"] .. ")", C.thirdparty.ktm, "skin", "checkbox") - CreateConfig(nil, "KLH Threat Meter (" .. T["Dock"] .. ")", C.thirdparty.ktm, "dock", "checkbox") - CreateConfig(nil, "TW Threatmeter (" .. T["Skin"] .. ")", C.thirdparty.twt, "skin", "checkbox") - CreateConfig(nil, "TW Threatmeter (" .. T["Dock"] .. ")", C.thirdparty.twt, "dock", "checkbox") - CreateConfig(nil, "WIM", C.thirdparty.wim, "enable", "checkbox") - CreateConfig(nil, "HealComm", C.thirdparty.healcomm, "enable", "checkbox") - CreateConfig(nil, "SortBags", C.thirdparty.sortbags, "enable", "checkbox") + CreateConfig(nil, "Recount (" .. T["Skin"] .. ")", C.thirdparty.recount, "skin", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "Recount (" .. T["Dock"] .. ")", C.thirdparty.recount, "dock", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "Omen (" .. T["Skin"] .. ")", C.thirdparty.omen, "skin", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "Omen (" .. T["Dock"] .. ")", C.thirdparty.omen, "dock", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "SWStats (" .. T["Skin"] .. ")", C.thirdparty.swstats, "skin", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "SWStats (" .. T["Dock"] .. ")", C.thirdparty.swstats, "dock", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "KLH Threat Meter (" .. T["Skin"] .. ")", C.thirdparty.ktm, "skin", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "KLH Threat Meter (" .. T["Dock"] .. ")", C.thirdparty.ktm, "dock", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "TW Threatmeter (" .. T["Skin"] .. ")", C.thirdparty.twt, "skin", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "TW Threatmeter (" .. T["Dock"] .. ")", C.thirdparty.twt, "dock", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "WIM", C.thirdparty.wim, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "HealComm", C.thirdparty.healcomm, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "SortBags", C.thirdparty.sortbags, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "Bag_Sort", C.thirdparty.bag_sort, "enable", "checkbox", nil, nil, nil, nil, "tbc") CreateConfig(nil, "MrPlow", C.thirdparty.mrplow, "enable", "checkbox") - CreateConfig(nil, "BetterCharacterStats", C.thirdparty.bcs, "enable", "checkbox") - CreateConfig(nil, "Crafty", C.thirdparty.crafty, "enable", "checkbox") - CreateConfig(nil, "CleverMacro", C.thirdparty.clevermacro, "enable", "checkbox") - CreateConfig(nil, "FlightMap", C.thirdparty.flightmap, "enable", "checkbox") - CreateConfig(nil, "TheoryCraft", C.thirdparty.theorycraft, "enable", "checkbox") - CreateConfig(nil, "SuperMacro", C.thirdparty.supermacro, "enable", "checkbox") - CreateConfig(nil, "AtlasLoot", C.thirdparty.atlasloot, "enable", "checkbox") - CreateConfig(nil, "MyRolePlay", C.thirdparty.myroleplay, "enable", "checkbox") - CreateConfig(nil, "DruidManaBar", C.thirdparty.druidmana, "enable", "checkbox") - CreateConfig(nil, "NoteIt", C.thirdparty.noteit, "enable", "checkbox") + CreateConfig(nil, "BetterCharacterStats", C.thirdparty.bcs, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "Crafty", C.thirdparty.crafty, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "CleverMacro", C.thirdparty.clevermacro, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "AckisRecipeList", C.thirdparty.ackis, "enable", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "SheepWatch", C.thirdparty.sheepwatch, "enable", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "TotemTimers", C.thirdparty.totemtimers, "enable", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "DruidBar", C.thirdparty.druidbar, "enable", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "BCEPGP", C.thirdparty.bcepgp, "enable", "checkbox", nil, nil, nil, nil, "tbc") + CreateConfig(nil, "FlightMap", C.thirdparty.flightmap, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "TheoryCraft", C.thirdparty.theorycraft, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "SuperMacro", C.thirdparty.supermacro, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "AtlasLoot", C.thirdparty.atlasloot, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "MyRolePlay", C.thirdparty.myroleplay, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "DruidManaBar", C.thirdparty.druidmana, "enable", "checkbox", nil, nil, nil, nil, "vanilla") + CreateConfig(nil, "NoteIt", C.thirdparty.noteit, "enable", "checkbox", nil, nil, nil, nil, "vanilla") end) CreateGUIEntry(T["Components"], T["Modules"], function() diff --git a/modules/hoverbind.lua b/modules/hoverbind.lua index a838a5c2..00f4a162 100644 --- a/modules/hoverbind.lua +++ b/modules/hoverbind.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("hoverbind", "vanilla", function () +pfUI:RegisterModule("hoverbind", "vanilla:tbc", function () local keymap = { -- buttons to binding association ["pfActionBarMainButton"] = "ACTIONBUTTON", diff --git a/modules/infight.lua b/modules/infight.lua index b48b4e88..95531a8e 100644 --- a/modules/infight.lua +++ b/modules/infight.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("infight", "vanilla", function () +pfUI:RegisterModule("infight", "vanilla:tbc", function () local function OnUpdate() if not this.infight and not this.aggro and not this.health then return end if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + .1 end diff --git a/modules/loot.lua b/modules/loot.lua index bfa2ab1a..a2284398 100644 --- a/modules/loot.lua +++ b/modules/loot.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("loot", "vanilla", function () +pfUI:RegisterModule("loot", "vanilla:tbc", function () local rawborder, border = GetBorderSize() pfUI.loot = CreateFrame("Frame", "pfLootFrame", UIParent) diff --git a/modules/map.lua b/modules/map.lua index 247e1150..806f1e17 100644 --- a/modules/map.lua +++ b/modules/map.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("map", "vanilla", function () +pfUI:RegisterModule("map", "vanilla:tbc", function () table.insert(UISpecialFrames, "WorldMapFrame") local function UpdateTooltipScale() diff --git a/modules/mapreveal.lua b/modules/mapreveal.lua index c8120a6c..594b0ff3 100644 --- a/modules/mapreveal.lua +++ b/modules/mapreveal.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("mapreveal", "vanilla", function () +pfUI:RegisterModule("mapreveal", "vanilla:tbc", function () -- do not load if other map addon is loaded if Cartographer then return end if METAMAP_TITLE then return end diff --git a/modules/minimap.lua b/modules/minimap.lua index 3ea5f343..53bc3374 100644 --- a/modules/minimap.lua +++ b/modules/minimap.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("minimap", "vanilla", function () +pfUI:RegisterModule("minimap", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local size = tonumber(C.appearance.minimap.size) or 140 @@ -39,7 +39,7 @@ pfUI:RegisterModule("minimap", "vanilla", function () Minimap:SetWidth(size) Minimap:SetHeight(size) - -- do the best to detect the minimap arrow + -- vanilla+tbc: do the best to detect the minimap arrow local arrowscale = tonumber(C.appearance.minimap.arrowscale) local minimaparrow = ({Minimap:GetChildren()})[9] for k, v in pairs({Minimap:GetChildren()}) do diff --git a/modules/mirrortimers.lua b/modules/mirrortimers.lua index 311e6683..6b08f395 100644 --- a/modules/mirrortimers.lua +++ b/modules/mirrortimers.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("mirrortimers", "vanilla", function () +pfUI:RegisterModule("mirrortimers", "vanilla:tbc", function () local font = pfUI.font_default local fontsize = tonumber(C.global.font_size) local height = fontsize * 1.3 diff --git a/modules/panel.lua b/modules/panel.lua index 8f235776..755cd079 100644 --- a/modules/panel.lua +++ b/modules/panel.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("panel", "vanilla", function() +pfUI:RegisterModule("panel", "vanilla:tbc", function() -- initialize gold cache if not yet happened pfUI_cache["gold"] = pfUI_cache["gold"] or {} diff --git a/modules/pet.lua b/modules/pet.lua index 46a45ede..223c633c 100644 --- a/modules/pet.lua +++ b/modules/pet.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("pet", "vanilla", function () +pfUI:RegisterModule("pet", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end pfUI.uf.pet = pfUI.uf:CreateUnitFrame("Pet", nil, C.unitframes.pet) diff --git a/modules/pettarget.lua b/modules/pettarget.lua index 1fe945df..017c30c4 100644 --- a/modules/pettarget.lua +++ b/modules/pettarget.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("pettarget", "vanilla", function () +pfUI:RegisterModule("pettarget", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end local rawborder, default_border = GetBorderSize("unitframes") diff --git a/modules/pixelperfect.lua b/modules/pixelperfect.lua index 16862787..ec4166d4 100644 --- a/modules/pixelperfect.lua +++ b/modules/pixelperfect.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("pixelperfect", "vanilla", function () +pfUI:RegisterModule("pixelperfect", "vanilla:tbc", function () -- pre-calculated min values local statics = { [4] = 1.4222222222222, diff --git a/modules/player.lua b/modules/player.lua index 91302d80..59979fff 100644 --- a/modules/player.lua +++ b/modules/player.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("player", "vanilla", function () +pfUI:RegisterModule("player", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end diff --git a/modules/questitem.lua b/modules/questitem.lua index 290495e2..7a8715c6 100644 --- a/modules/questitem.lua +++ b/modules/questitem.lua @@ -96,7 +96,11 @@ pfUI:RegisterModule("questitem", function () SelectQuestLogEntry(quest) -- detect and ignore quest headers - _, _, _, header = GetQuestLogTitle(quest) + if pfUI.client <= 11200 then -- vanilla + _, _, _, header = GetQuestLogTitle(quest) + elseif pfUI.client > 11200 then -- tbc + _, _, _, _, header = GetQuestLogTitle(quest) + end if not header then text, objective = GetQuestLogQuestText() diff --git a/modules/raid.lua b/modules/raid.lua index 6b3577ae..7bda90ba 100644 --- a/modules/raid.lua +++ b/modules/raid.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("raid", "vanilla", function () +pfUI:RegisterModule("raid", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end diff --git a/modules/roll.lua b/modules/roll.lua index 8580e514..7762774c 100644 --- a/modules/roll.lua +++ b/modules/roll.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("roll", "vanilla", function () +pfUI:RegisterModule("roll", "vanilla:tbc", function () pfUI.roll = CreateFrame("Frame", "pfLootRoll", UIParent) pfUI.roll.frames = {} diff --git a/modules/screenshot.lua b/modules/screenshot.lua index d6ac5b8f..54bb3425 100644 --- a/modules/screenshot.lua +++ b/modules/screenshot.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("screenshot", "vanilla", function () +pfUI:RegisterModule("screenshot", "vanilla:tbc", function () if C.screenshot.interval == "0" and C.screenshot.levelup == "0" and C.screenshot.pvprank == "0" diff --git a/modules/sellvalue.lua b/modules/sellvalue.lua index a14427f8..f854d089 100644 --- a/modules/sellvalue.lua +++ b/modules/sellvalue.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("sellvalue", "vanilla", function () +pfUI:RegisterModule("sellvalue", "vanilla:tbc", function () local function AddVendorPrices(frame, id, count) if pfSellData[id] then local _, _, sell, buy = strfind(pfSellData[id], "(.*),(.*)") diff --git a/modules/share.lua b/modules/share.lua index d5cc522e..a49841bc 100644 --- a/modules/share.lua +++ b/modules/share.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("share", "vanilla", function () +pfUI:RegisterModule("share", "vanilla:tbc", function () local function serialize(tbl, comp, name, ignored, spacing) local spacing = spacing or "" local match = nil diff --git a/modules/socialmod.lua b/modules/socialmod.lua index a3da0610..e18fea58 100644 --- a/modules/socialmod.lua +++ b/modules/socialmod.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("socialmod", "vanilla", function () +pfUI:RegisterModule("socialmod", "vanilla:tbc", function () local playerdb = _G.pfUI_playerDB pfUI.socialmod = CreateFrame("Frame", "pfSocialMod", UIParent) pfUI.socialmod:RegisterEvent("CHAT_MSG_SYSTEM") diff --git a/modules/superwow.lua b/modules/superwow.lua index 0ffdf4c3..4382d0f6 100644 --- a/modules/superwow.lua +++ b/modules/superwow.lua @@ -439,70 +439,6 @@ pfUI:RegisterModule("superwow", "vanilla", function () end end - -- Config Import/Export API using ImportFile/ExportFile - if ImportFile and ExportFile then - pfUI.api.ExportConfig = function(filename) - filename = filename or "pfUI_config_backup.txt" - local configStr = "" - - -- Serialize config to string - local function serialize(tbl, indent) - indent = indent or "" - local result = "{\n" - for k, v in pairs(tbl) do - local keyStr = type(k) == "string" and '["' .. k .. '"]' or "[" .. tostring(k) .. "]" - if type(v) == "table" then - result = result .. indent .. " " .. keyStr .. " = " .. serialize(v, indent .. " ") .. ",\n" - elseif type(v) == "string" then - result = result .. indent .. " " .. keyStr .. ' = "' .. v .. '",\n' - else - result = result .. indent .. " " .. keyStr .. " = " .. tostring(v) .. ",\n" - end - end - return result .. indent .. "}" - end - - if pfUI_config then - configStr = "pfUI_config = " .. serialize(pfUI_config) - ExportFile(filename, configStr) - DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: Config exported to imports/" .. filename) - return true - end - return false - end - - pfUI.api.ImportConfig = function(filename) - filename = filename or "pfUI_config_backup.txt" - local content = ImportFile(filename) - if content and content ~= "" then - -- Load the config string - local func, err = loadstring(content) - if func then - func() - DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: Config imported from imports/" .. filename) - DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: Please /reload to apply changes") - return true - else - DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: Error parsing config: " .. (err or "unknown")) - end - else - DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: Could not read imports/" .. filename) - end - return false - end - - -- Slash commands for config backup - SLASH_PFEXPORT1 = "/pfexport" - SlashCmdList["PFEXPORT"] = function(msg) - pfUI.api.ExportConfig(msg ~= "" and msg or nil) - end - - SLASH_PFIMPORT1 = "/pfimport" - SlashCmdList["PFIMPORT"] = function(msg) - pfUI.api.ImportConfig(msg ~= "" and msg or nil) - end - end - -- GetPlayerBuffID wrapper if GetPlayerBuffID then pfUI.api.GetPlayerBuffSpellId = function(buffIndex) @@ -559,7 +495,7 @@ pfUI:RegisterModule("superwow", "vanilla", function () end end - -- Enhance libcast with SuperWoW data for NPCs and other players only + -- Enhance libcast with SuperWoW data for NPCs and other players -- Player casts use SPELLCAST_* events for proper pushback handling local supercast = CreateFrame("Frame") local playerGuid = nil @@ -622,6 +558,9 @@ pfUI:RegisterModule("superwow", "vanilla", function () -- skip on buff procs during cast if event_type == "CAST" then if not libcast.db[guid] or libcast.db[guid].cast ~= spell then + -- ignore casts without 'START' event, while there is already another cast. + -- those events can be for example a frost shield proc while casting frostbolt. + -- we want to keep the cast itself, so we simply skip those. return end end @@ -639,7 +578,10 @@ pfUI:RegisterModule("superwow", "vanilla", function () libcast.db[dbKey].icon = icon libcast.db[dbKey].channel = event_type == "CHANNEL" or false elseif arg3 == "FAIL" then + -- For player: use playerName, for others: use GUID local dbKey = isPlayer and UnitName("player") or guid + + -- delete all cast entries if libcast.db[dbKey] then libcast.db[dbKey].cast = nil libcast.db[dbKey].rank = nil diff --git a/modules/target.lua b/modules/target.lua index 11104094..9522b8d0 100644 --- a/modules/target.lua +++ b/modules/target.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("target", "vanilla", function () +pfUI:RegisterModule("target", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end diff --git a/modules/targettarget.lua b/modules/targettarget.lua index e8310065..893ad670 100644 --- a/modules/targettarget.lua +++ b/modules/targettarget.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("targettarget", "vanilla", function () +pfUI:RegisterModule("targettarget", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end diff --git a/modules/targettargettarget.lua b/modules/targettargettarget.lua index ec31d90c..6e912b3b 100644 --- a/modules/targettargettarget.lua +++ b/modules/targettargettarget.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("targettargettarget", "vanilla", function () +pfUI:RegisterModule("targettargettarget", "vanilla:tbc", function () -- do not go further on disabled UFs if C.unitframes.disable == "1" then return end diff --git a/modules/thirdparty.lua b/modules/thirdparty.lua index f84037f7..f480df7f 100644 --- a/modules/thirdparty.lua +++ b/modules/thirdparty.lua @@ -1,7 +1,10 @@ -pfUI:RegisterModule("thirdparty", "vanilla", function() +pfUI:RegisterModule("thirdparty", "vanilla:tbc", function() -- This module includes the core logic of thirdparty modules. -- Right now, in particular the functions to register addons to the -- dockframe of the chat panel aswell as the thirdparty root-table. + -- This module is supposed to be loaded on all expansions, so only + -- addons that can share the same glue code across expansions will go here. + -- For expansion related code, see: thirdparty-vanilla and thirdparty-tbc. pfUI.thirdparty = {} @@ -193,7 +196,8 @@ pfUI:RegisterModule("thirdparty", "vanilla", function() end -- MrPlow Bag Sorting Addon. - -- https://www.wowace.com/projects/mr-plow/files/288059 + -- Vanilla: https://www.wowace.com/projects/mr-plow/files/288059 + -- TBC: https://www.wowace.com/projects/mr-plow/files/136162 HookAddonOrVariable("MrPlow", function() if C.thirdparty.mrplow.enable == "0" then return end @@ -228,7 +232,8 @@ pfUI:RegisterModule("thirdparty", "vanilla", function() end) -- ShaguDPS Damage Meter - -- https://github.com/shagu/ShaguDPS + -- Vanilla: https://github.com/shagu/ShaguDPS + -- TBC: https://github.com/shagu/ShaguDPS HookAddonOrVariable("ShaguDPS", function() local docktable = { "shagudps", "ShaguDPS", "ShaguDPSWindow", function() -- single @@ -328,7 +333,8 @@ pfUI:RegisterModule("thirdparty", "vanilla", function() end) -- DPSMate Damage Meter - -- https://github.com/Geigerkind/DPSMate + -- Vanilla: https://github.com/Geigerkind/DPSMate + -- TBC: https://github.com/Geigerkind/DPSMateTBC HookAddonOrVariable("DPSMate_DPSMate", function() local docktable = { "dpsmate", "DPSMate", "DPSMate_DPSMate", function() -- single diff --git a/modules/totems.lua b/modules/totems.lua index 56ab9480..59eab973 100644 --- a/modules/totems.lua +++ b/modules/totems.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("totems", "vanilla", function () +pfUI:RegisterModule("totems", "vanilla:tbc", function () local _, class = UnitClass("player") local slots = { @@ -42,6 +42,9 @@ pfUI:RegisterModule("totems", "vanilla", function () -- Try to recast totem on left click in vanilla local active, name, start, duration, icon = GetTotemInfo(this.id) if name then CastSpellByName(name) end + elseif pfUI.client > 11200 and this.id and arg1 and arg1 == "RightButton" then + -- Try to cancel totem on right click in tbc+ + DestroyTotem(this.id) end end diff --git a/modules/uf_tukui.lua b/modules/uf_tukui.lua index e798043c..b48e3829 100644 --- a/modules/uf_tukui.lua +++ b/modules/uf_tukui.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("uf_tukui", "vanilla", function () +pfUI:RegisterModule("uf_tukui", "vanilla:tbc", function () if C.unitframes.disable == "1" or C.unitframes.layout ~= "tukui" then return end -- update player layout diff --git a/modules/unlock.lua b/modules/unlock.lua index 629097d4..59fcd473 100644 --- a/modules/unlock.lua +++ b/modules/unlock.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("unlock", "vanilla", function () +pfUI:RegisterModule("unlock", "vanilla:tbc", function () local rawborder, default_border = GetBorderSize() -- grouped frames diff --git a/modules/unusable.lua b/modules/unusable.lua index f51c2b6b..73a9d992 100644 --- a/modules/unusable.lua +++ b/modules/unusable.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("unusable", "vanilla", function () +pfUI:RegisterModule("unusable", "vanilla:tbc", function () if not pfUI.bag then return end if C.appearance.bags.unusable ~= "1" then return end diff --git a/modules/updatenotify.lua b/modules/updatenotify.lua index 31aa9cdc..a88730dd 100644 --- a/modules/updatenotify.lua +++ b/modules/updatenotify.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("updatenotify", "vanilla", function () +pfUI:RegisterModule("updatenotify", "vanilla:tbc", function () local alreadyshown = false local localversion = tonumber(pfUI.version.major*10000 + pfUI.version.minor*100 + pfUI.version.fix) local remoteversion = tonumber(pfUI_init.updateavailable) or 0 diff --git a/modules/xpbar.lua b/modules/xpbar.lua index 54ca6a7d..7b1ed36f 100644 --- a/modules/xpbar.lua +++ b/modules/xpbar.lua @@ -1,4 +1,4 @@ -pfUI:RegisterModule("xpbar", "vanilla", function () +pfUI:RegisterModule("xpbar", "vanilla:tbc", function () local rawborder, default_border = GetBorderSize() local parse_faction = SanitizePattern(FACTION_STANDING_INCREASED) diff --git a/pfUI-tbc.toc b/pfUI-tbc.toc new file mode 100644 index 00000000..a55f4b82 --- /dev/null +++ b/pfUI-tbc.toc @@ -0,0 +1,17 @@ +## Interface: 20400 +## Title: |cff33ffccpf|cffffffffUI +## Author: Shagu +## Notes: A complete user interface replacement. +## Notes-ruRU: Полная замена пользовательского интерфейса. +## Version: 6.0.0 +## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache +## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB + +pfUI.lua + +init\env.xml +init\compat.xml +init\api.xml +init\libs.xml +init\skins.xml +init\modules.xml diff --git a/pfUI.lua b/pfUI.lua index b8229436..606919f8 100644 --- a/pfUI.lua +++ b/pfUI.lua @@ -77,9 +77,17 @@ end}) local _, _, _, client = GetBuildInfo() client = client or 11200 --- set expansion to vanilla -pfUI.expansion = "vanilla" -pfUI.client = client +-- detect client expansion +if client >= 20000 and client <= 20400 then + pfUI.expansion = "tbc" + pfUI.client = client +elseif client >= 30000 and client <= 30300 then + pfUI.expansion = "wotlk" + pfUI.client = client +else + pfUI.expansion = "vanilla" + pfUI.client = client +end -- setup pfUI namespace setmetatable(pfUI.env, {__index = getfenv(0)}) @@ -111,20 +119,34 @@ function pfUI:UpdateFonts() -- load font configuration local default, tooltip, unit, unit_name, combat - if pfUI_config.global.force_region == "1" and GetLocale() == "zhCN" then + if pfUI_config.global.force_region == "1" and GetLocale() == "zhCN" and pfUI.expansion == "vanilla" then -- force locale compatible fonts (zhCN 1.12) default = "Fonts\\FZXHLJW.TTF" tooltip = "Fonts\\FZXHLJW.TTF" combat = "Fonts\\FZXHLJW.TTF" unit = "Fonts\\FZXHLJW.TTF" unit_name = "Fonts\\FZXHLJW.TTF" - elseif pfUI_config.global.force_region == "1" and GetLocale() == "zhTW" then + elseif pfUI_config.global.force_region == "1" and GetLocale() == "zhCN" and pfUI.expansion == "tbc" then + -- force locale compatible fonts (zhCN 2.4.3) + default = "Fonts\\ZYHei.ttf" + tooltip = "Fonts\\ZYHei.ttf" + combat = "Fonts\\ZYKai_C.ttf" + unit = "Fonts\\ZYKai_T.ttf" + unit_name = "Fonts\\ZYHei.ttf" + elseif pfUI_config.global.force_region == "1" and GetLocale() == "zhTW" and pfUI.expansion == "vanilla" then -- force locale compatible fonts (zhTW 1.12) default = "Fonts\\FZXHLJW.ttf" tooltip = "Fonts\\FZXHLJW.ttf" combat = "Fonts\\FZXHLJW.ttf" unit = "Fonts\\FZXHLJW.ttf" unit_name = "Fonts\\FZXHLJW.ttf" + elseif pfUI_config.global.force_region == "1" and GetLocale() == "zhTW" and pfUI.expansion == "tbc" then + -- force locale compatible fonts (zhTW 2.4.3) + default = "Fonts\\bHEI01B.ttf" + tooltip = "Fonts\\bHEI01B.ttf" + combat = "Fonts\\bHEI01B.ttf" + unit = "Fonts\\bHEI01B.ttf" + unit_name = "Fonts\\bHEI01B.ttf" elseif pfUI_config.global.force_region == "1" and GetLocale() == "koKR" then -- force locale compatible fonts (koKR) default = "Fonts\\2002.TTF" @@ -222,7 +244,7 @@ end function pfUI:RegisterModule(name, a2, a3) if pfUI.module[name] then return end local hasv = type(a2) == "string" - local func, version = hasv and a3 or a2, hasv and a2 or "vanilla" + local func, version = hasv and a3 or a2, hasv and a2 or "vanilla:tbc:wotlk" -- check for client compatibility if not strfind(version, pfUI.expansion) then return end @@ -237,7 +259,7 @@ end function pfUI:RegisterSkin(name, a2, a3) if pfUI.skin[name] then return end local hasv = type(a2) == "string" - local func, version = hasv and a3 or a2, hasv and a2 or "vanilla" + local func, version = hasv and a3 or a2, hasv and a2 or "vanilla:tbc:wotlk" -- check for client compatibility if not strfind(version, pfUI.expansion) then return end diff --git a/pfUI.toc b/pfUI.toc index 187f4a22..7b448484 100644 --- a/pfUI.toc +++ b/pfUI.toc @@ -3,7 +3,7 @@ ## Author: Shagu ## Notes: A complete user interface replacement. ## Notes-ruRU: Полная замена пользовательского интерфейса. -## Version: 5.5.5 +## Version: 6.0.0 ## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache ## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB diff --git a/skins/blizzard/auction.lua b/skins/blizzard/auction.lua index f94c3e3a..0cd64855 100644 --- a/skins/blizzard/auction.lua +++ b/skins/blizzard/auction.lua @@ -1,11 +1,16 @@ -pfUI:RegisterSkin("Auctionhouse", "vanilla", function () +pfUI:RegisterSkin("Auctionhouse", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() HookAddonOrVariable("Blizzard_AuctionUI", function() - SkinArrowButton(BidPrevPageButton, "left", 18) - SkinArrowButton(BidNextPageButton, "right", 18) - SkinArrowButton(AuctionsPrevPageButton, "left", 18) - SkinArrowButton(AuctionsNextPageButton, "right", 18) + -- Compatibility + if BrowseResetButton then -- tbc + SkinButton(BrowseResetButton) + else -- vanilla + SkinArrowButton(BidPrevPageButton, "left", 18) + SkinArrowButton(BidNextPageButton, "right", 18) + SkinArrowButton(AuctionsPrevPageButton, "left", 18) + SkinArrowButton(AuctionsNextPageButton, "right", 18) + end hooksecurefunc("AuctionFrame_OnShow", function() AuctionFrame:ClearAllPoints() diff --git a/skins/blizzard/battlefield.lua b/skins/blizzard/battlefield.lua index f8dcb283..7ff50008 100644 --- a/skins/blizzard/battlefield.lua +++ b/skins/blizzard/battlefield.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Battlefield", "vanilla", function () +pfUI:RegisterSkin("Battlefield", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() diff --git a/skins/blizzard/battlefield_minimap.lua b/skins/blizzard/battlefield_minimap.lua index e2eb12b7..e0a21d5e 100644 --- a/skins/blizzard/battlefield_minimap.lua +++ b/skins/blizzard/battlefield_minimap.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Battlefield Minimap", "vanilla", function () +pfUI:RegisterSkin("Battlefield Minimap", "vanilla:tbc", function () local rawborder, border = GetBorderSize() HookAddonOrVariable("Blizzard_BattlefieldMinimap", function() diff --git a/skins/blizzard/character.lua b/skins/blizzard/character.lua index fea07800..88d4775f 100644 --- a/skins/blizzard/character.lua +++ b/skins/blizzard/character.lua @@ -1,13 +1,26 @@ -pfUI:RegisterSkin("Character", "vanilla", function () +pfUI:RegisterSkin("Character", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() - -- Honor Tab - StripTextures(HonorFrame) + -- Compatibility + if PlayerTitleDropDown then -- tbc, wotlk + -- Character Tab + SkinDropDown(PlayerTitleDropDown) + PlayerTitleDropDown:SetPoint("TOP", CharacterLevelText, "BOTTOM", 0, -2) + PlayerTitleDropDownText:SetPoint("LEFT", PlayerTitleDropDown.backdrop, "LEFT", 6, 2) + SkinDropDown(PlayerStatFrameLeftDropDown) + SkinDropDown(PlayerStatFrameRightDropDown) - HonorFrameProgressBar:SetStatusBarTexture(pfUI.media["img:bar"]) - CreateBackdrop(HonorFrameProgressBar) - HonorFrameProgressBar:SetHeight(24) + -- Honor Tab + StripTextures(PVPFrame) + else -- vanilla + -- Honor Tab + StripTextures(HonorFrame) + + HonorFrameProgressBar:SetStatusBarTexture(pfUI.media["img:bar"]) + CreateBackdrop(HonorFrameProgressBar) + HonorFrameProgressBar:SetHeight(24) + end local magicResTextureCords = { {0.21875, 0.78125, 0.25, 0.3203125}, diff --git a/skins/blizzard/dressup.lua b/skins/blizzard/dressup.lua index cf5c0ffe..d618a36c 100644 --- a/skins/blizzard/dressup.lua +++ b/skins/blizzard/dressup.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Dress Up Frame", "vanilla", function () +pfUI:RegisterSkin("Dress Up Frame", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() diff --git a/skins/blizzard/friends.lua b/skins/blizzard/friends.lua index 26b21ce3..fe6080e6 100644 --- a/skins/blizzard/friends.lua +++ b/skins/blizzard/friends.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Friends", "vanilla", function () +pfUI:RegisterSkin("Friends", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local maxtab = pfUI.expansion == "vanilla" and 4 or 5 @@ -336,6 +336,24 @@ pfUI:RegisterSkin("Friends", "vanilla", function () GuildInfoCancelButton:ClearAllPoints() GuildInfoCancelButton:SetPoint("BOTTOMRIGHT", GuildInfoFrame, "BOTTOMRIGHT", -10, 8) + if GuildInfoGuildEventButton then -- log button (tbc+) + SkinButton(GuildInfoGuildEventButton) + GuildInfoGuildEventButton:ClearAllPoints() + GuildInfoGuildEventButton:SetPoint("BOTTOM", GuildInfoFrame, "BOTTOM", 0, 8) + end + + if GuildEventLogFrame then -- guild log frame (tbc+) + StripTextures(GuildEventFrame) + CreateBackdrop(GuildEventFrame, nil, true, .75) + StripTextures(GuildEventLogFrame) + CreateBackdrop(GuildEventLogFrame, nil, true, .75) + StripTextures(GuildEventLogScrollFrame) + SkinScrollbar(GuildEventLogScrollFrameScrollBar) + SkinCloseButton(GuildEventLogCloseButton) + GuildEventLogCancelButton:SetPoint("BOTTOMRIGHT", -9, 8) + SkinButton(GuildEventLogCancelButton) + end + -- guild control StripTextures(GuildControlPopupFrame) CreateBackdrop(GuildControlPopupFrame, nil, true, .75) @@ -374,6 +392,46 @@ pfUI:RegisterSkin("Friends", "vanilla", function () GuildControlPopupAcceptButton:SetPoint("RIGHT", GuildControlPopupFrameCancelButton, "LEFT", -2*bpad, 0) end + if ChannelFrameVerticalBar then -- Channel Tab (TBC+) + StripTextures(ChannelFrameVerticalBar) + SkinButton(ChannelFrameNewButton) + ChannelFrameNewButton:SetPoint("BOTTOMRIGHT", -15, 82) + + StripTextures(ChannelListScrollFrame) + SkinScrollbar(ChannelListScrollFrameScrollBar) + + for i = 1, MAX_DISPLAY_CHANNEL_BUTTONS do + StripTextures(_G["ChannelButton"..i]) + SkinButton(_G["ChannelButton"..i]) + end + + for i = 1, 22 do + StripTextures(_G["ChannelMemberButton"..i]) + end + + CreateBackdrop(ChannelMemberButton1) + ChannelMemberButton1.backdrop:SetPoint("BOTTOMRIGHT", ChannelMemberButton22, "BOTTOMRIGHT", -1, 0) + + StripTextures(ChannelRosterScrollFrame) + SkinScrollbar(ChannelRosterScrollFrameScrollBar) + + StripTextures(ChannelFrameDaughterFrame) + CreateBackdrop(ChannelFrameDaughterFrame) + + StripTextures(ChannelFrameDaughterFrameChannelName) + CreateBackdrop(ChannelFrameDaughterFrameChannelName, nil, true) + ChannelFrameDaughterFrameChannelName:SetTextInsets(5,5,5,5) + + StripTextures(ChannelFrameDaughterFrameChannelPassword) + CreateBackdrop(ChannelFrameDaughterFrameChannelPassword, nil, true) + ChannelFrameDaughterFrameChannelPassword:SetTextInsets(5,5,5,5) + + SkinCloseButton(ChannelFrameDaughterFrameDetailCloseButton) + + SkinButton(ChannelFrameDaughterFrameCancelButton) + SkinButton(ChannelFrameDaughterFrameOkayButton) + end + do -- Raid Tab StripTextures(RaidInfoFrame) CreateBackdrop(RaidInfoFrame, nil, true, .75) diff --git a/skins/blizzard/game_menu.lua b/skins/blizzard/game_menu.lua index 9e202c7a..9b6d440b 100644 --- a/skins/blizzard/game_menu.lua +++ b/skins/blizzard/game_menu.lua @@ -1,10 +1,14 @@ -pfUI:RegisterSkin("Game Menu", "vanilla", function () +pfUI:RegisterSkin("Game Menu", "vanilla:tbc", function () StripTextures(GameMenuFrame) CreateBackdrop(GameMenuFrame, nil, true, .75) CreateBackdropShadow(GameMenuFrame) GameMenuFrame:SetWidth(GameMenuFrame:GetWidth() - 30) - GameMenuFrame:SetHeight(GameMenuFrame:GetHeight() + 6) + if pfUI.expansion == 'tbc' then + GameMenuFrame:SetHeight(GameMenuFrame:GetHeight() + 10) + elseif pfUI.expansion == 'vanilla' then + GameMenuFrame:SetHeight(GameMenuFrame:GetHeight() + 6) + end local title = GetNoNameObject(GameMenuFrame, "FontString", "ARTWORK", MAIN_MENU) title:SetTextColor(1,1,1,1) diff --git a/skins/blizzard/gossipquest.lua b/skins/blizzard/gossipquest.lua index dec691a6..183347d7 100644 --- a/skins/blizzard/gossipquest.lua +++ b/skins/blizzard/gossipquest.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Gossip and Quest", "vanilla", function () +pfUI:RegisterSkin("Gossip and Quest", "vanilla:tbc", function () local frames = {'Quest', 'Gossip'} local panels = {'Greeting', 'Detail', 'Progress', 'Reward'} local buttons = { diff --git a/skins/blizzard/guild_registrar.lua b/skins/blizzard/guild_registrar.lua index 62955cf4..44c1459d 100644 --- a/skins/blizzard/guild_registrar.lua +++ b/skins/blizzard/guild_registrar.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Guild Registrar", "vanilla", function () +pfUI:RegisterSkin("Guild Registrar", "vanilla:tbc", function () StripTextures(GuildRegistrarFrame) StripTextures(GuildRegistrarGreetingFrame) CreateBackdrop(GuildRegistrarFrame, nil, nil, .75) diff --git a/skins/blizzard/help.lua b/skins/blizzard/help.lua index b47060b7..54413aa1 100644 --- a/skins/blizzard/help.lua +++ b/skins/blizzard/help.lua @@ -1,7 +1,19 @@ -pfUI:RegisterSkin("Help", "vanilla", function () +pfUI:RegisterSkin("Help", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() + -- not much here for tbc yet + if pfUI.client > 11200 then + local ticket, background = TicketStatusFrame:GetChildren() + CreateBackdrop(background, nil, true, .75) + TicketStatusFrame:SetHeight(40) + TicketStatusFrame:ClearAllPoints() + TicketStatusFrame:SetPoint("TOP", 0, -5) + + UpdateMovable(TicketStatusFrame) + return + end + StripTextures(HelpFrame) CreateBackdrop(HelpFrame, nil, nil, .75) CreateBackdropShadow(HelpFrame) diff --git a/skins/blizzard/inspect.lua b/skins/blizzard/inspect.lua index cbbc39b4..b81609c3 100644 --- a/skins/blizzard/inspect.lua +++ b/skins/blizzard/inspect.lua @@ -20,6 +20,111 @@ local slots = { "RangedSlot", } +pfUI:RegisterSkin("Inspect", "tbc", function () + local rawborder, border = GetBorderSize() + local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() + + HookAddonOrVariable("Blizzard_InspectUI", function() + CreateBackdrop(InspectFrame, nil, nil, .75) + CreateBackdropShadow(InspectFrame) + + InspectFrame.backdrop:SetPoint("TOPLEFT", 10, -10) + InspectFrame.backdrop:SetPoint("BOTTOMRIGHT", -30, 72) + InspectFrame:SetHitRectInsets(10,30,10,72) + EnableMovable("InspectFrame", "Blizzard_InspectUI", INSPECTFRAME_SUBFRAMES) + + SkinCloseButton(InspectFrameCloseButton, InspectFrame.backdrop, -6, -6) + + InspectFrame:DisableDrawLayer("ARTWORK") + + InspectNameText:ClearAllPoints() + InspectNameText:SetPoint("TOP", InspectFrame.backdrop, "TOP", 0, -10) + InspectGuildText:Show() + InspectGuildText:ClearAllPoints() + InspectGuildText:SetPoint("TOP", InspectLevelText, "BOTTOM", 0, -1) + + for i = 1, 3 do + local tab = _G["InspectFrameTab"..i] + local lastTab = _G["InspectFrameTab"..(i-1)] + tab:ClearAllPoints() + if lastTab then + tab:SetPoint("LEFT", lastTab, "RIGHT", border*2 + 1, 0) + else + tab:SetPoint("TOPLEFT", InspectFrame.backdrop, "BOTTOMLEFT", bpad, -(border + (border == 1 and 1 or 2))) + end + SkinTab(tab) + end + + do -- Character Tab + StripTextures(InspectPaperDollFrame) + + EnableClickRotate(InspectModelFrame) + InspectModelRotateLeftButton:Hide() + InspectModelRotateRightButton:Hide() + + for _, slot in pairs(slots) do + local frame = _G["Inspect"..slot] + SkinButton(frame, nil, nil, nil, _G["Inspect"..slot.."IconTexture"], true) + end + + hooksecurefunc("InspectPaperDollFrame_OnShow", function() + local guild, title = GetGuildInfo(InspectFrame.unit) + local text = guild and format(TEXT(GUILD_TITLE_TEMPLATE), title, guild) or "" + InspectGuildText:SetText(text) + end) + + hooksecurefunc("InspectPaperDollItemSlotButton_Update", function(button) + local unit = InspectFrame.unit + local link = GetInventoryItemLink(unit, button:GetID()) + if link then + local quality = select(3, GetItemInfo(link)) + button:SetBackdropBorderColor(GetItemQualityColor(quality)) + else + button:SetBackdropBorderColor(pfUI.cache.er, pfUI.cache.eg, pfUI.cache.eb, pfUI.cache.ea) + end + end) + end + + do -- PVP Tab + StripTextures(InspectPVPFrame) + end + + do -- Talent Tab + StripTextures(InspectTalentFrame) + InspectTalentFrameCancelButton:Hide() + InspectTalentFrameCloseButton:Hide() + + InspectTalentFrameSpentPoints:ClearAllPoints() + InspectTalentFrameSpentPoints:SetPoint("BOTTOMRIGHT", InspectTalentFrame, "BOTTOMRIGHT", 0, 83) + + StripTextures(InspectTalentFrameScrollFrame) + SkinScrollbar(InspectTalentFrameScrollFrameScrollBar) + + for i = 1, MAX_NUM_TALENTS do + local talent = _G["InspectTalentFrameTalent"..i] + if talent then + StripTextures(talent) + SkinButton(talent, nil, nil, nil, _G["InspectTalentFrameTalent"..i.."IconTexture"]) + + _G["InspectTalentFrameTalent"..i.."Rank"]:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE") + end + end + + for i = 1, 3 do + local tab = _G["InspectTalentFrameTab"..i] + local lastTab = _G["InspectTalentFrameTab"..(i-1)] + tab:ClearAllPoints() + if lastTab then + tab:SetPoint("LEFT", lastTab, "RIGHT", border*2 + 1, 0) + else + tab:SetPoint("TOPLEFT", 70, -50) + end + SkinTab(tab) + end + end + end) +end) + pfUI:RegisterSkin("Inspect", "vanilla", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() diff --git a/skins/blizzard/itemtext.lua b/skins/blizzard/itemtext.lua index 568901d9..2455919a 100644 --- a/skins/blizzard/itemtext.lua +++ b/skins/blizzard/itemtext.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Books", "vanilla", function () +pfUI:RegisterSkin("Books", "vanilla:tbc", function () StripTextures(ItemTextFrame) CreateBackdrop(ItemTextFrame, nil, nil, .75) CreateBackdropShadow(ItemTextFrame) diff --git a/skins/blizzard/keybindings.lua b/skins/blizzard/keybindings.lua index 9b570b88..049aac20 100644 --- a/skins/blizzard/keybindings.lua +++ b/skins/blizzard/keybindings.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("KeyBindings", "vanilla", function () +pfUI:RegisterSkin("KeyBindings", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() diff --git a/skins/blizzard/macro.lua b/skins/blizzard/macro.lua index efe4c582..890ad6bc 100644 --- a/skins/blizzard/macro.lua +++ b/skins/blizzard/macro.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Macro", "vanilla", function () +pfUI:RegisterSkin("Macro", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() diff --git a/skins/blizzard/mail.lua b/skins/blizzard/mail.lua index 8830e0fe..861c7d1f 100644 --- a/skins/blizzard/mail.lua +++ b/skins/blizzard/mail.lua @@ -1,10 +1,53 @@ -pfUI:RegisterSkin("Mailbox", "vanilla", function () +pfUI:RegisterSkin("Mailbox", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() + -- Compatibility local StationeryBackgroundLeft, StationeryBackgroundRight + if ATTACHMENTS_MAX_SEND then -- tbc + do -- SendMailFrame + for i = 1, ATTACHMENTS_MAX_SEND do + local btn = _G["SendMailAttachment"..i] + StripTextures(btn) + SkinButton(btn, nil, nil, nil, nil, true) + end - do -- SendMailFrame + hooksecurefunc("SendMailFrame_Update", function() + for i = 1, ATTACHMENTS_MAX_SEND do + local btn = _G["SendMailAttachment"..i] + HandleIcon(btn, btn:GetNormalTexture()) + + local link = GetSendMailItemLink(i) + if link then + local r,g,b = GetItemQualityColor(select(3, GetItemInfo(link))) + btn:SetBackdropBorderColor(r,g,b,1) + else + btn:SetBackdropBorderColor(GetStringColor(pfUI_config.appearance.border.color)) + end + end + end) + + StationeryBackgroundLeft, StationeryBackgroundRight = SendStationeryBackgroundLeft, SendStationeryBackgroundRight + end + + do -- OpenMailFrame + for i = 1, ATTACHMENTS_MAX_RECEIVE do + SkinButton(_G["OpenMailAttachmentButton"..i], nil, nil, nil, _G["OpenMailAttachmentButton"..i.."IconTexture"], true) + end + + hooksecurefunc("InboxFrame_OnClick", function(index) + for i=1, ATTACHMENTS_MAX_RECEIVE do + local link = GetInboxItemLink(index, i) + if not link then return end + local r,g,b = GetItemQualityColor(select(3, GetItemInfo(link))) + _G["OpenMailAttachmentButton"..i]:SetBackdropBorderColor(r,g,b,1) + end + end) + + SkinButton(OpenMailReportSpamButton) + end + else -- vanilla + do -- SendMailFrame local skin = CreateFrame("Frame") skin:SetScript("OnEvent", function() this:UnregisterEvent("MAIL_SHOW") @@ -79,6 +122,7 @@ pfUI:RegisterSkin("Mailbox", "vanilla", function () end end) end + end StripTextures(MailFrame, true) CreateBackdrop(MailFrame, nil, nil, .75) diff --git a/skins/blizzard/merchant.lua b/skins/blizzard/merchant.lua index 084285cf..ccceba7e 100644 --- a/skins/blizzard/merchant.lua +++ b/skins/blizzard/merchant.lua @@ -1,9 +1,21 @@ -pfUI:RegisterSkin("Merchant", "vanilla", function () +pfUI:RegisterSkin("Merchant", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() - MerchantRepairAllButton:ClearAllPoints() - MerchantRepairAllButton:SetPoint("RIGHT", MerchantBuyBackItemItemButton, "LEFT", -6, 0) + -- Compatibility + if MerchantGuildBankRepairButton then -- tbc + SkinButton(MerchantGuildBankRepairButton, nil, nil, nil, MerchantGuildBankRepairButtonIcon) + MerchantGuildBankRepairButtonIcon:SetTexCoord(.59, .82, .06, .54) + hooksecurefunc("MerchantFrame_UpdateRepairButtons", function() + MerchantGuildBankRepairButton:ClearAllPoints() + MerchantGuildBankRepairButton:SetPoint("RIGHT", MerchantBuyBackItemItemButton, "LEFT", -14, 0) + MerchantRepairAllButton:ClearAllPoints() + MerchantRepairAllButton:SetPoint("RIGHT", MerchantGuildBankRepairButton, "LEFT", -6, 0) + end) + else -- vanilla + MerchantRepairAllButton:ClearAllPoints() + MerchantRepairAllButton:SetPoint("RIGHT", MerchantBuyBackItemItemButton, "LEFT", -6, 0) + end StripTextures(MerchantFrame) CreateBackdrop(MerchantFrame, nil, nil, .75) diff --git a/skins/blizzard/miscellaneous.lua b/skins/blizzard/miscellaneous.lua index 2af1e4de..ea67ac3b 100644 --- a/skins/blizzard/miscellaneous.lua +++ b/skins/blizzard/miscellaneous.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Stack Split", "vanilla", function () +pfUI:RegisterSkin("Stack Split", "vanilla:tbc", function () StripTextures(StackSplitFrame) CreateBackdrop(StackSplitFrame, nil, nil, .75) CreateBackdropShadow(StackSplitFrame) @@ -7,7 +7,7 @@ pfUI:RegisterSkin("Stack Split", "vanilla", function () SkinButton(StackSplitCancelButton) end) -pfUI:RegisterSkin("Coin Pickup", "vanilla", function () +pfUI:RegisterSkin("Coin Pickup", "vanilla:tbc", function () StripTextures(CoinPickupFrame) CreateBackdrop(CoinPickupFrame, nil, nil, .75) CreateBackdropShadow(CoinPickupFrame) @@ -16,7 +16,7 @@ pfUI:RegisterSkin("Coin Pickup", "vanilla", function () SkinButton(CoinPickupCancelButton) end) -pfUI:RegisterSkin("Color Picker", "vanilla", function () +pfUI:RegisterSkin("Color Picker", "vanilla:tbc", function () CreateBackdrop(ColorPickerFrame) CreateBackdropShadow(ColorPickerFrame) @@ -32,7 +32,7 @@ pfUI:RegisterSkin("Color Picker", "vanilla", function () SkinSlider(OpacitySliderFrame) end) -pfUI:RegisterSkin("Opacity", "vanilla", function () +pfUI:RegisterSkin("Opacity", "vanilla:tbc", function () CreateBackdrop(OpacityFrame, nil, true, .75) CreateBackdropShadow(OpacityFrame) @@ -41,7 +41,7 @@ pfUI:RegisterSkin("Opacity", "vanilla", function () OpacityFrameSlider:SetPoint("CENTER", 0, 0) end) -pfUI:RegisterSkin("Tutorial", "vanilla", function () +pfUI:RegisterSkin("Tutorial", "vanilla:tbc", function () CreateBackdrop(TutorialFrame, nil, true, .75) CreateBackdropShadow(TutorialFrame) @@ -49,7 +49,7 @@ pfUI:RegisterSkin("Tutorial", "vanilla", function () SkinButton(TutorialFrameOkayButton) end) -pfUI:RegisterSkin("Quest Timer", "vanilla", function () +pfUI:RegisterSkin("Quest Timer", "vanilla:tbc", function () CreateBackdrop(QuestTimerFrame, nil, nil, .75) CreateBackdropShadow(QuestTimerFrame) UpdateMovable(QuestTimerFrame, true) diff --git a/skins/blizzard/options-sound.lua b/skins/blizzard/options-sound.lua index 257d4023..341486ab 100644 --- a/skins/blizzard/options-sound.lua +++ b/skins/blizzard/options-sound.lua @@ -1,18 +1,40 @@ -pfUI:RegisterSkin("Options - Sound", "vanilla", function () +pfUI:RegisterSkin("Options - Sound", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() - local SoundOptionsFrameHeaderText = GetNoNameObject(SoundOptionsFrame, "FontString", "ARTWORK", SOUNDOPTIONS_MENU) - local NUM_CHECKBOXES = 8 - local NUM_SLIDERS = 4 + -- Compatibility + local SoundOptionsFrameHeaderText, NUM_CHECKBOXES, NUM_SLIDERS + if SOUND_OPTIONS then -- tbc + SoundOptionsFrameHeaderText = GetNoNameObject(SoundOptionsFrame, "FontString", "BACKGROUND", SOUND_OPTIONS) + NUM_CHECKBOXES = 11 + NUM_SLIDERS = 6 - SoundOptionsFrameOkay:ClearAllPoints() - SoundOptionsFrameOkay:SetPoint("RIGHT", SoundOptionsFrameCancel, "LEFT", -2*bpad, 0) - SoundOptionsFrameSlider1:ClearAllPoints() - SoundOptionsFrameSlider1:SetPoint("TOPRIGHT", SoundOptionsFrame, "TOPRIGHT", -18, -43) - for i=2, NUM_SLIDERS do - _G["SoundOptionsFrameSlider"..i]:ClearAllPoints() - _G["SoundOptionsFrameSlider"..i]:SetPoint("TOP", _G["SoundOptionsFrameSlider"..i-1], "BOTTOM", 0, -30) + StripTextures(AudioOptionsFrame) + CreateBackdrop(SoundOptionsFramePlayback, nil, true, .75) + CreateBackdrop(SoundOptionsFrameHardware, nil, true, .75) + CreateBackdrop(SoundOptionsFrameVolume, nil, true, .75) + + SkinDropDown(SoundOptionsOutputDropDown) + + SoundOptionsFrameDefaults:ClearAllPoints() + SoundOptionsFrameDefaults:SetPoint("TOPLEFT", SoundOptionsFramePlayback, "BOTTOMLEFT", 0, -10) + SoundOptionsFrameCancel:ClearAllPoints() + SoundOptionsFrameCancel:SetPoint("TOPRIGHT", SoundOptionsFrameVolume, "BOTTOMRIGHT", 0, -10) + SoundOptionsFrameOkay:ClearAllPoints() + SoundOptionsFrameOkay:SetPoint("RIGHT", SoundOptionsFrameCancel, "LEFT", -2*bpad, 0) + else -- vanilla + SoundOptionsFrameHeaderText = GetNoNameObject(SoundOptionsFrame, "FontString", "ARTWORK", SOUNDOPTIONS_MENU) + NUM_CHECKBOXES = 8 + NUM_SLIDERS = 4 + + SoundOptionsFrameOkay:ClearAllPoints() + SoundOptionsFrameOkay:SetPoint("RIGHT", SoundOptionsFrameCancel, "LEFT", -2*bpad, 0) + SoundOptionsFrameSlider1:ClearAllPoints() + SoundOptionsFrameSlider1:SetPoint("TOPRIGHT", SoundOptionsFrame, "TOPRIGHT", -18, -43) + for i=2, NUM_SLIDERS do + _G["SoundOptionsFrameSlider"..i]:ClearAllPoints() + _G["SoundOptionsFrameSlider"..i]:SetPoint("TOP", _G["SoundOptionsFrameSlider"..i-1], "BOTTOM", 0, -30) + end end StripTextures(SoundOptionsFrame) diff --git a/skins/blizzard/options-video.lua b/skins/blizzard/options-video.lua index 853bdcb0..70c7e325 100644 --- a/skins/blizzard/options-video.lua +++ b/skins/blizzard/options-video.lua @@ -1,19 +1,45 @@ -pfUI:RegisterSkin("Options - Video", "vanilla", function () +pfUI:RegisterSkin("Options - Video", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() - local MAX_SLIDERS = 9 - local MAX_CHECKBOXES = 18 + -- Compatibility + local MAX_SLIDERS, MAX_CHECKBOXES + if OptionsFrameSlider10 then -- tbc + MAX_SLIDERS = 11 + MAX_CHECKBOXES = 19 - for i=1, MAX_SLIDERS do - local slider = _G["OptionsFrameSlider"..i] - local shift = 0 - if i == 1 or i == 6 then shift = 4 - elseif i == 4 or i == 8 then shift = 10 + for i=1, MAX_SLIDERS do + local slider = _G["OptionsFrameSlider"..i] + local shift = 0 + if i == 4 or i == 5 or i == 7 or i == 8 or i == 10 or i == 11 then shift = 10 end + local point, anchor, anchorPoint, x, y = slider:GetPoint() + slider:ClearAllPoints() + slider:SetPoint(point, anchor, anchorPoint, x, y - shift) + end + + hooksecurefunc("OptionsFrame_Load", function() + OptionsFramePixelShaders:SetWidth(230) + OptionsFrameMiscellaneous:ClearAllPoints() + OptionsFrameMiscellaneous:SetPoint("LEFT", OptionsFramePixelShaders, "RIGHT", 6, 0) + end) + OptionsFrameDefaults:ClearAllPoints() + OptionsFrameDefaults:SetPoint("TOPLEFT", OptionsFramePixelShaders, "BOTTOMLEFT", 0, -10) + OptionsFrameCancel:ClearAllPoints() + OptionsFrameCancel:SetPoint("TOPRIGHT", OptionsFrameMiscellaneous, "BOTTOMRIGHT", 0, -10) + else -- vanilla + MAX_SLIDERS = 9 + MAX_CHECKBOXES = 18 + + for i=1, MAX_SLIDERS do + local slider = _G["OptionsFrameSlider"..i] + local shift = 0 + if i == 1 or i == 6 then shift = 4 + elseif i == 4 or i == 8 then shift = 10 + end + local point, anchor, anchorPoint, x, y = slider:GetPoint() + slider:ClearAllPoints() + slider:SetPoint(point, anchor, anchorPoint, x, y - shift) end - local point, anchor, anchorPoint, x, y = slider:GetPoint() - slider:ClearAllPoints() - slider:SetPoint(point, anchor, anchorPoint, x, y - shift) end CreateBackdrop(OptionsFrame, nil, nil, .75) diff --git a/skins/blizzard/popup_dialogs.lua b/skins/blizzard/popup_dialogs.lua index fc3aed02..d795a7bf 100644 --- a/skins/blizzard/popup_dialogs.lua +++ b/skins/blizzard/popup_dialogs.lua @@ -1,5 +1,12 @@ -pfUI:RegisterSkin("Popup Dialogs", "vanilla", function () +pfUI:RegisterSkin("Popup Dialogs", "vanilla:tbc", function () for i = 1, STATICPOPUP_NUMDIALOGS do + -- Compatibility + local money = _G["StaticPopup"..i.."MoneyInputFrame"] + if money then -- tbc + SkinMoneyInputFrame(money) + end + + local dialog = _G["StaticPopup"..i] CreateBackdrop(dialog, nil, true, .75) CreateBackdropShadow(dialog) diff --git a/skins/blizzard/professions.lua b/skins/blizzard/professions.lua index bbd266d1..eab6d31e 100644 --- a/skins/blizzard/professions.lua +++ b/skins/blizzard/professions.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Profession", "vanilla", function () +pfUI:RegisterSkin("Profession", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() @@ -219,7 +219,37 @@ pfUI:RegisterSkin("Profession", "vanilla", function () end) end - _G[displayed] = 23 + -- Compatibility + if search then -- tbc + _G[displayed] = 21 + scrollframe:SetHeight(338) + + local rank = _G[name.."RankFrameSkillRank"] + rank:ClearAllPoints() + rank:SetPoint("CENTER", rankbar, "CENTER", 0, 0) + + local available = _G[frame:GetName().."AvailableFilterCheckButton"] + SkinCheckbox(available) + available:ClearAllPoints() + available:SetPoint("TOPLEFT", scrollframe.backdrop, "BOTTOMLEFT", -4, -5) + + search:DisableDrawLayer("BACKGROUND") + CreateBackdrop(search, nil, nil, 1) + search.backdrop:SetAllPoints(search) + search:SetTextInsets(5, 5, 5, 5) + search:SetHeight(22) + search:ClearAllPoints() + search:SetPoint("TOPRIGHT", scrollframe.backdrop, "BOTTOMRIGHT", 0, -5) + + local craft_filter = CraftFrameFilterDropDown + if craft_filter then + SkinDropDown(craft_filter) + craft_filter:ClearAllPoints() + craft_filter:SetPoint("BOTTOMRIGHT", scrollframe.backdrop, "TOPRIGHT", 15, 0) + end + else -- vanilla + _G[displayed] = 23 + end -- build remaining tradeskills for i = 9, _G[displayed] do local button = _G[template..i] or CreateFrame("Button", template..i, frame, template.."ButtonTemplate") diff --git a/skins/blizzard/questlog.lua b/skins/blizzard/questlog.lua index 748b2fb9..23b4d0e8 100644 --- a/skins/blizzard/questlog.lua +++ b/skins/blizzard/questlog.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Quest Log", "vanilla", function () +pfUI:RegisterSkin("Quest Log", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() @@ -6,10 +6,23 @@ pfUI:RegisterSkin("Quest Log", "vanilla", function () _G.MAX_WATCHABLE_QUESTS = 20 -- TODO do -- quest log frame - local QUEST_COUNT = QuestLogQuestCount + -- Compatibility + local QUEST_COUNT + if QuestLogCount then -- tbc + QUEST_COUNT = QuestLogCount - QUEST_COUNT:ClearAllPoints() - QUEST_COUNT:SetPoint("TOPRIGHT", -10, -30) + StripTextures(QUEST_COUNT) + QUEST_COUNT:ClearAllPoints() + hooksecurefunc("QuestLogUpdateQuestCount", function(numQuests) + QUEST_COUNT:ClearAllPoints() + QUEST_COUNT:SetPoint("BOTTOMRIGHT", QuestLogFrame, "TOPRIGHT", 0, -50) + end) + else -- vanilla + QUEST_COUNT = QuestLogQuestCount + + QUEST_COUNT:ClearAllPoints() + QUEST_COUNT:SetPoint("TOPRIGHT", -10, -30) + end hooksecurefunc("QuestLog_OnShow", function() QuestLogFrame:ClearAllPoints() diff --git a/skins/blizzard/readycheck.lua b/skins/blizzard/readycheck.lua index 0d21ec89..51ec176b 100644 --- a/skins/blizzard/readycheck.lua +++ b/skins/blizzard/readycheck.lua @@ -1,6 +1,12 @@ -pfUI:RegisterSkin("Readycheck", "vanilla", function () +pfUI:RegisterSkin("Readycheck", "vanilla:tbc", function () HookAddonOrVariable("Blizzard_RaidUI", function() - local update_func = "ReadyCheck_OnUpdate" + -- Compatibility + local update_func + if ReadyCheckFrame_OnUpdate then -- tbc + update_func = "ReadyCheckFrame_OnUpdate" + else -- vanilla + update_func = "ReadyCheck_OnUpdate" + end StripTextures(ReadyCheckFrame, true) CreateBackdrop(ReadyCheckFrame, nil, nil, .75) diff --git a/skins/blizzard/spellbook.lua b/skins/blizzard/spellbook.lua index db5bf427..e28383c3 100644 --- a/skins/blizzard/spellbook.lua +++ b/skins/blizzard/spellbook.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Spellbook", "vanilla", function () +pfUI:RegisterSkin("Spellbook", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() diff --git a/skins/blizzard/stable.lua b/skins/blizzard/stable.lua index fdf6f7f1..9e6e7a52 100644 --- a/skins/blizzard/stable.lua +++ b/skins/blizzard/stable.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Pet Stable Master", "vanilla", function () +pfUI:RegisterSkin("Pet Stable Master", "vanilla:tbc", function () StripTextures(PetStableFrame) CreateBackdrop(PetStableFrame, nil, nil, .75) CreateBackdropShadow(PetStableFrame) diff --git a/skins/blizzard/tabard.lua b/skins/blizzard/tabard.lua index 46efde05..e8e48c21 100644 --- a/skins/blizzard/tabard.lua +++ b/skins/blizzard/tabard.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Guild Tabard", "vanilla", function () +pfUI:RegisterSkin("Guild Tabard", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() diff --git a/skins/blizzard/talents.lua b/skins/blizzard/talents.lua index 11c9370a..f26e5a4c 100644 --- a/skins/blizzard/talents.lua +++ b/skins/blizzard/talents.lua @@ -1,10 +1,16 @@ -pfUI:RegisterSkin("Talents", "vanilla", function () +pfUI:RegisterSkin("Talents", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() HookAddonOrVariable("Blizzard_TalentUI", function() - local TALENT_FRAME = _G.TalentFrame - local TALENT_FRAME_NAME = TALENT_FRAME:GetName() + -- Compatibility + local TALENT_FRAME, TALENT_FRAME_NAME + if PlayerTalentFrame then -- tbc + TALENT_FRAME = _G.PlayerTalentFrame + else -- vanilla + TALENT_FRAME = _G.TalentFrame + end + TALENT_FRAME_NAME = TALENT_FRAME:GetName() StripTextures(TALENT_FRAME) diff --git a/skins/blizzard/taxi.lua b/skins/blizzard/taxi.lua index 79a7bc36..fac03ade 100644 --- a/skins/blizzard/taxi.lua +++ b/skins/blizzard/taxi.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Flightmaster", "vanilla", function () +pfUI:RegisterSkin("Flightmaster", "vanilla:tbc", function () StripTextures(TaxiFrame) CreateBackdrop(TaxiFrame, nil, nil, .75) CreateBackdropShadow(TaxiFrame) diff --git a/skins/blizzard/tooltips.lua b/skins/blizzard/tooltips.lua index d1195ee8..c050c541 100644 --- a/skins/blizzard/tooltips.lua +++ b/skins/blizzard/tooltips.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Tooltips", "vanilla", function () +pfUI:RegisterSkin("Tooltips", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local alpha = tonumber(C.tooltip.alpha) diff --git a/skins/blizzard/trade.lua b/skins/blizzard/trade.lua index fe0a9e4c..fd6237d6 100644 --- a/skins/blizzard/trade.lua +++ b/skins/blizzard/trade.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Trade", "vanilla", function () +pfUI:RegisterSkin("Trade", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() diff --git a/skins/blizzard/trainer.lua b/skins/blizzard/trainer.lua index e752f7bb..62df6005 100644 --- a/skins/blizzard/trainer.lua +++ b/skins/blizzard/trainer.lua @@ -1,4 +1,4 @@ -pfUI:RegisterSkin("Trainer", "vanilla", function () +pfUI:RegisterSkin("Trainer", "vanilla:tbc", function () local rawborder, border = GetBorderSize() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()