Version 6.1.0 - Raid/Party Frame Fixes

Bugfixes:
- Fixed 40-yard range check not working for raid/party frames
- Fixed aggro indicator not displaying properly on raid/party frames
- Improved aggro cache to only cache positive results for instant detection
- Fixed HP/Mana not updating with "Use Raid Frames for group" enabled
- Added SuperWoW nil-check for SpellInfo
- Added missing events: PARTY_MEMBER_ENABLE, PARTY_MEMBER_DISABLE, PLAYER_UPDATE_RESTING

UI Improvements:
- Share/Hoverbind buttons now show warning when module is disabled
This commit is contained in:
Meow
2026-01-08 12:25:18 +01:00
parent 5d0e195d1e
commit 34f5c3eb02
111 changed files with 4424 additions and 2308 deletions
+2
View File
@@ -0,0 +1,2 @@
github: [shagu]
ko_fi: shagu
+24
View File
@@ -0,0 +1,24 @@
name: Close inactive issues
on:
workflow_dispatch:
schedule:
- cron: "30 1 * * *"
jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v5
with:
operations-per-run: 100
days-before-issue-stale: 30
days-before-issue-close: 14
stale-issue-label: "stale"
stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
days-before-pr-stale: -1
days-before-pr-close: -1
repo-token: ${{ secrets.GITHUB_TOKEN }}
+302 -123
View File
@@ -1,146 +1,325 @@
pfUI performance updates, use on own risk. # pfUI - Turtle WoW Edition
## DLL Integrations [![Version](https://img.shields.io/badge/version-6.1.0-blue.svg)](https://github.com/me0wg4ming/pfUI)
[![Turtle WoW](https://img.shields.io/badge/Turtle%20WoW-1.18.0-brightgreen.svg)](https://turtlecraft.gg/)
[![SuperWoW](https://img.shields.io/badge/SuperWoW-Enhanced-purple.svg)](https://github.com/balakethelock/SuperWoW)
[![Nampower](https://img.shields.io/badge/Nampower-Optional-yellow.svg)](https://gitea.com/avitasia/nampower)
[![UnitXP](https://img.shields.io/badge/UnitXP__SP3-Optional-yellow.svg)](https://codeberg.org/konaka/UnitXP_SP3)
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. **A pfUI fork specifically optimized for [Turtle WoW](https://turtlecraft.gg/) with full SuperWoW, Nampower, and UnitXP_SP3 DLL integration.**
This version includes significant performance improvements, DLL-enhanced features, and TBC spell indicators that work with Turtle WoW's expanded spell library.
> **Looking for TBC support?** Visit the original pfUI by Shagu: [https://github.com/shagu/pfUI](https://github.com/shagu/pfUI)
--- ---
## What's New in Version 6.1.0 (January 8, 2026)
### 🐛 Bugfixes
- ✅ **40-Yard Range Check Fix** - Fixed range check not working for raid/party frames due to throttle variable conflict (`this.tick` vs `this.throttleTick`)
- ✅ **Aggro Indicator Fix** - Fixed aggro indicator not displaying properly on raid/party frames (same throttle issue)
- ✅ **Aggro Detection Cache** - Improved aggro cache to only cache positive results, allowing instant detection when aggro changes while maintaining performance
- ✅ **Raid Frames with Group Display** - Fixed HP/Mana not updating when "Use Raid Frames to display group members" was enabled without being in a raid
- ✅ **SuperWoW nil-check** - Added nil-check for `SpellInfo` in superwow.lua to prevent errors when SuperWoW is not installed
- ✅ **Missing Event Registration** - Added missing events for raid/party frames: `PARTY_MEMBER_ENABLE`, `PARTY_MEMBER_DISABLE`, `PLAYER_UPDATE_RESTING`
### 🎨 UI Improvements
- ✅ **Share Button Warning** - Shows message when Share module is disabled instead of doing nothing
- ✅ **Hoverbind Button Warning** - Shows message when Hoverbind module is disabled instead of doing nothing
---
## 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
*Modules by [jrc13245](https://github.com/jrc13245/)*
- ✅ **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://codeberg.org/konaka/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
### 🎮 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
### 🐢 Turtle WoW TBC Spell Indicators
Turtle WoW includes TBC spells in the Vanilla client. This version includes all TBC buff indicators:
- ✅ Commanding Shout indicator
- ✅ Misdirection indicator
- ✅ Earth Shield indicator
- ✅ Prayer of Mending indicator
---
**Version:** 6.1.0
**Release Date:** January 8, 2026
**Compatibility:** Turtle WoW 1.18.0
**Optional DLLs:** SuperWoW, Nampower, UnitXP_SP3 (enhanced features when available)
---
## Installation
1. Download **[Latest Version](https://github.com/me0wg4ming/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
## Optional DLL Enhancements
pfUI 6.0.0 includes optional integrations with client-side DLLs for enhanced functionality. These DLLs are fully supported on Turtle WoW:
### SuperWoW ### SuperWoW
**Repository:** [https://github.com/balakethelock/SuperWoW](https://github.com/balakethelock/SuperWoW)
**Repository:** https://github.com/balakethelock/SuperWoW Provides:
- Enhanced castbar detection via UNIT_CASTEVENT
SuperWoW provides GUID-based unit tracking, spell information APIs, and various client enhancements. - UnitPosition for distance calculations
- SetMouseoverUnit for improved targeting
#### Features - SpellInfo for spell data queries
- **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 |
---
### Nampower ### Nampower
**Repository:** [https://gitea.com/avitasia/nampower](https://gitea.com/avitasia/nampower)
**Repository:** https://gitea.com/avitasia/nampower Provides:
- Spell queue indicator
Nampower provides spell queuing, precise cooldown tracking, and detailed aura/buff information. - GCD indicator
- Reactive spell detection
#### Features - Enhanced cast information
- **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 |
---
### UnitXP_SP3 ### UnitXP_SP3
**Repository:** [https://codeberg.org/konaka/UnitXP_SP3](https://codeberg.org/konaka/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`) /pfui Open the configuration GUI
- **Behind Indicator** - Shows "BEHIND" text on target frame when positioned behind target (requires `unitframes.behind_indicator`) /pfdll Show DLL detection status (SuperWoW, Nampower, UnitXP)
- **OS Notifications** - Flashes taskbar and plays system sound on whispers, ready checks, BG queue pops (requires `unitframes.unitxp_notify`) /pfbehind Test Behind/LOS detection on current target
- **Precise Distance** - Exact yard distance between units /clickthrough Toggle clickthrough mode (or /ct)
- **Smart Targeting** - Target nearest enemy, highest HP, cycle through enemies /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 | ## Recommended Addons
|----------|-------------| * [pfQuest](https://shagu.org/pfQuest) A simple database and quest helper
| `pfUI.api.GetPreciseDistance(unit1, unit2)` | Get exact distance in yards | * [WIM (continued)](https://github.com/me0wg4ming/WIM/) Give whispers an instant messenger feel
| `pfUI.api.IsInMeleeRange(unit)` | Check if unit is in melee range |
| `pfUI.api.GetAoEDistance(unit1, unit2)` | Get distance for AoE calculations | ## Plugins
| `pfUI.api.TargetNearestEnemy()` | Target nearest hostile unit | * [pfUI-eliteoverlay](https://shagu.org/pfUI-eliteoverlay) Add elite dragons to unitframes
| `pfUI.api.TargetHighestHP()` | Target enemy with most HP | * [pfUI-fonts](https://shagu.org/pfUI-fonts) Additional fonts for pfUI
| `pfUI.api.TargetNextEnemy()` | Cycle to next enemy | * [pfUI-CustomMedia](https://github.com/mrrosh/pfUI-CustomMedia) Additional textures for pfUI
| `pfUI.api.TargetPreviousEnemy()` | Cycle to previous enemy | * [pfUI-Gryphons](https://github.com/mrrosh/pfUI-Gryphons) Add back the gryphons to your actionbars
| `pfUI.api.TargetNextMarked(order)` | Target next marked enemy in order |
| `pfUI.api.UnitInLineOfSight(unit1, unit2)` | Check line of sight between units | ## FAQ
| `pfUI.api.UnitIsBehind(unit1, unit2)` | Check if unit1 is behind unit2 | **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/me0wg4ming/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/me0wg4ming/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/me0wg4ming/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.
**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 ([https://github.com/shagu/pfUI](https://github.com/shagu/pfUI))
- **me0wg4ming** - pfUI fork maintainer and Turtle WoW enhancements
- **jrc13245** - Nampower, UnitXP, and BGScore module integration ([https://github.com/jrc13245/](https://github.com/jrc13245/))
- **SuperWoW Team** - SuperWoW framework development
- **avitasia** - Nampower DLL development
- **konaka** - UnitXP_SP3 DLL development
- **Turtle WoW Team** - For the amazing Vanilla+ experience
- **Community** - Bug reports, feature suggestions, and testing
| Setting | DLL | Description | ---
|---------|-----|-------------|
| `unitframes.druidmanabar` | SuperWoW | Show mana bar while shapeshifted | ## 📄 License
| `unitframes.track_group` | SuperWoW | Track group members on minimap |
| `unitframes.spellqueue` | Nampower | Show spell queue indicator | Same as original pfUI - free to use and modify.
| `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 | **Version:** 6.0.0
| `unitframes.los_indicator` | UnitXP | Show line of sight indicator | **Release Date:** January 5, 2026
| `unitframes.behind_indicator` | UnitXP | Show behind indicator | **Compatibility:** Turtle WoW 1.18.0
| `unitframes.unitxp_notify` | UnitXP | Enable OS notifications | **Status:** Stable
+8 -4
View File
@@ -3,10 +3,6 @@ pfUI.api = { }
-- load pfUI environment -- load pfUI environment
setfenv(1, pfUI:GetEnvironment()) setfenv(1, pfUI:GetEnvironment())
-- Client API shortcuts
gfind = string.gmatch or string.gfind
mod = math.mod or mod
-- [ DLL Detection Helpers ] -- [ DLL Detection Helpers ]
-- Detects presence of various DLL extensions for enhanced functionality -- Detects presence of various DLL extensions for enhanced functionality
@@ -83,6 +79,10 @@ function pfUI.api.UnitIsBehind(unit1, unit2)
return nil return nil
end end
-- Client API shortcuts
gfind = string.gmatch or string.gfind
mod = math.mod or mod
-- [ strsplit ] -- [ strsplit ]
-- Splits a string using a delimiter. -- Splits a string using a delimiter.
-- 'delimiter' [string] characters that will be interpreted as delimiter -- 'delimiter' [string] characters that will be interpreted as delimiter
@@ -1260,6 +1260,10 @@ function pfUI.api.EnableAutohide(frame, timeout, combat)
end end
frame.hover:SetScript("OnUpdate", function() 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 this.activeTo == "keep" then return end
if MouseIsOver(this, 10, -10, -10, 10) then if MouseIsOver(this, 10, -10, -10, 10) then
+10 -6
View File
@@ -221,6 +221,13 @@ function pfUI:LoadConfig()
pfUI:UpdateConfig("unitframes", nil, "druidmanabar", "1") pfUI:UpdateConfig("unitframes", nil, "druidmanabar", "1")
pfUI:UpdateConfig("unitframes", nil, "druidmanaheight", "2") pfUI:UpdateConfig("unitframes", nil, "druidmanaheight", "2")
pfUI:UpdateConfig("unitframes", nil, "druidmanatext", "0") 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, "spellqueue", "1")
pfUI:UpdateConfig("unitframes", nil, "spellqueuesize", "24") pfUI:UpdateConfig("unitframes", nil, "spellqueuesize", "24")
pfUI:UpdateConfig("unitframes", nil, "gcd_indicator", "0") 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_indicator", "0")
pfUI:UpdateConfig("unitframes", nil, "reactive_size", "28") pfUI:UpdateConfig("unitframes", nil, "reactive_size", "28")
pfUI:UpdateConfig("unitframes", nil, "damage_tracking", "0") pfUI:UpdateConfig("unitframes", nil, "damage_tracking", "0")
-- UnitXP Settings
pfUI:UpdateConfig("unitframes", nil, "los_indicator", "0") pfUI:UpdateConfig("unitframes", nil, "los_indicator", "0")
pfUI:UpdateConfig("unitframes", nil, "behind_indicator", "0") pfUI:UpdateConfig("unitframes", nil, "behind_indicator", "0")
pfUI:UpdateConfig("unitframes", nil, "unitxp_notify", "0") pfUI:UpdateConfig("unitframes", nil, "unitxp_notify", "0")
pfUI:UpdateConfig("unitframes", nil, "track_group", "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, "selfingroup", "0")
pfUI:UpdateConfig("unitframes", nil, "selfinraid", "0") pfUI:UpdateConfig("unitframes", nil, "selfinraid", "0")
@@ -725,8 +729,8 @@ function pfUI:LoadConfig()
pfUI:UpdateConfig("chat", "text", "playerlinks", "1") pfUI:UpdateConfig("chat", "text", "playerlinks", "1")
pfUI:UpdateConfig("chat", "text", "detecturl", "1") pfUI:UpdateConfig("chat", "text", "detecturl", "1")
pfUI:UpdateConfig("chat", "text", "classcolor", "1") pfUI:UpdateConfig("chat", "text", "classcolor", "1")
pfUI:UpdateConfig("chat", "text", "playerlevel", "1")
pfUI:UpdateConfig("chat", "text", "whosearchunknown", "0") pfUI:UpdateConfig("chat", "text", "whosearchunknown", "0")
pfUI:UpdateConfig("chat", "text", "playerlevel", "1")
pfUI:UpdateConfig("chat", "left", "width", "380") pfUI:UpdateConfig("chat", "left", "width", "380")
pfUI:UpdateConfig("chat", "left", "height", "180") pfUI:UpdateConfig("chat", "left", "height", "180")
pfUI:UpdateConfig("chat", "right", "enable", "0") pfUI:UpdateConfig("chat", "right", "enable", "0")
+32 -10
View File
@@ -1,6 +1,8 @@
-- load pfUI environment -- load pfUI environment
setfenv(1, pfUI:GetEnvironment()) setfenv(1, pfUI:GetEnvironment())
local superwow_active = HasSuperWoW()
pfUI.uf = CreateFrame("Frame", nil, UIParent) pfUI.uf = CreateFrame("Frame", nil, UIParent)
pfUI.uf:SetScript("OnUpdate", function() pfUI.uf:SetScript("OnUpdate", function()
if InCombatLockdown and not InCombatLockdown() then if InCombatLockdown and not InCombatLockdown() then
@@ -29,17 +31,21 @@ pfUI.uf.RebuildUnitmap = function()
if pfUI.uf.raid then if pfUI.uf.raid then
for i = 1, 40 do for i = 1, 40 do
local frame = pfUI.uf.raid[i] local frame = pfUI.uf.raid[i]
if frame and frame.id and frame.id ~= 0 then if frame and frame.id and frame.id ~= 0 and frame.label then
pfUI.uf.unitmap["raid" .. frame.id] = frame -- ✅ Jetzt auch party-Frames in Raid-Frames unterstützen
local unitstr = frame.label .. frame.id
pfUI.uf.unitmap[unitstr] = frame
end end
end end
end end
-- Rebuild party mappings -- Rebuild party mappings (nur wenn nicht als Raid verwendet)
for i = 1, 4 do if C.unitframes.raidforgroup ~= "1" then
local frame = _G["pfGroup" .. i] for i = 1, 4 do
if frame and frame.label == "party" then local frame = _G["pfGroup" .. i]
pfUI.uf.unitmap["party" .. frame.id] = frame if frame and frame.label == "party" then
pfUI.uf.unitmap["party" .. frame.id] = frame
end
end end
end end
end end
@@ -242,7 +248,8 @@ end)
local aggrodata = { } local aggrodata = { }
function pfUI.api.UnitHasAggro(unit) function pfUI.api.UnitHasAggro(unit)
if aggrodata[unit] and GetTime() < aggrodata[unit].check + 1 then -- Only cache positive results (has aggro) - allows fast detection when aggro changes
if aggrodata[unit] and aggrodata[unit].state > 0 and GetTime() < aggrodata[unit].check + 1 then
return aggrodata[unit].state return aggrodata[unit].state
end end
@@ -984,8 +991,8 @@ function pfUI.uf.OnUpdate()
-- Throttle for raid/party frames: only process updates every 0.1s -- Throttle for raid/party frames: only process updates every 0.1s
-- This reduces OnUpdate calls from 5760/sec (40 frames * 144fps) to ~400/sec -- This reduces OnUpdate calls from 5760/sec (40 frames * 144fps) to ~400/sec
if this.label == "raid" or this.label == "party" then if this.label == "raid" or this.label == "party" then
if (this.tick or 0) > GetTime() then return end if (this.throttleTick or 0) > GetTime() then return end
this.tick = GetTime() + 0.1 this.throttleTick = GetTime() + 0.1
end end
-- process indicator update events -- process indicator update events
@@ -1259,6 +1266,9 @@ function pfUI.uf:EnableEvents()
f:RegisterEvent("RAID_ROSTER_UPDATE") f:RegisterEvent("RAID_ROSTER_UPDATE")
f:RegisterEvent("PARTY_LOOT_METHOD_CHANGED") f:RegisterEvent("PARTY_LOOT_METHOD_CHANGED")
f:RegisterEvent("RAID_TARGET_UPDATE") f:RegisterEvent("RAID_TARGET_UPDATE")
f:RegisterEvent("PARTY_MEMBER_ENABLE")
f:RegisterEvent("PARTY_MEMBER_DISABLE")
f:RegisterEvent("PLAYER_UPDATE_RESTING")
-- Unitmap aktualisieren -- Unitmap aktualisieren
pfUI.uf.RebuildUnitmap() pfUI.uf.RebuildUnitmap()
@@ -2403,6 +2413,8 @@ function pfUI.uf:SetupBuffIndicators(config)
if myclass == "WARRIOR" then if myclass == "WARRIOR" then
-- Battle Shout -- Battle Shout
table.insert(indicators, "interface\\icons\\ability_warrior_battleshout") table.insert(indicators, "interface\\icons\\ability_warrior_battleshout")
-- Commanding Shout (TBC)
table.insert(indicators, "interface\\icons\\ability_warrior_rallyingcry")
end end
if myclass == "MAGE" then if myclass == "MAGE" then
@@ -2421,6 +2433,14 @@ function pfUI.uf:SetupBuffIndicators(config)
-- Aspect of the Pack -- Aspect of the Pack
table.insert(indicators, "interface\\icons\\ability_mount_whitetiger") 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
end end
@@ -2449,6 +2469,8 @@ function pfUI.uf:SetupBuffIndicators(config)
table.insert(indicators, "interface\\icons\\spell_holy_renew") table.insert(indicators, "interface\\icons\\spell_holy_renew")
-- Power Word: Shield -- Power Word: Shield
table.insert(indicators, "interface\\icons\\spell_holy_powerwordshield") table.insert(indicators, "interface\\icons\\spell_holy_powerwordshield")
-- Prayer of Mending (TBC)
table.insert(indicators, "interface\\icons\\spell_holy_prayerofmendingtga")
end end
if myclass == "DRUID" or config.all_hots == "1" then if myclass == "DRUID" or config.all_hots == "1" then
+1960
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -1,3 +1,4 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/"> <Ui xmlns="http://www.blizzard.com/wow/ui/">
<Include file="..\compat\vanilla.lua"/> <Include file="..\compat\vanilla.lua"/>
<Include file="..\compat\tbc.lua"/>
</Ui> </Ui>
+3
View File
@@ -35,6 +35,7 @@
<Include file="..\modules\questitem.lua"/> <Include file="..\modules\questitem.lua"/>
<Include file="..\modules\thirdparty.lua"/> <Include file="..\modules\thirdparty.lua"/>
<Include file="..\modules\thirdparty-vanilla.lua"/> <Include file="..\modules\thirdparty-vanilla.lua"/>
<Include file="..\modules\thirdparty-tbc.lua"/>
<Include file="..\modules\buff.lua"/> <Include file="..\modules\buff.lua"/>
<Include file="..\modules\buffwatch.lua"/> <Include file="..\modules\buffwatch.lua"/>
<Include file="..\modules\nameplates.lua"/> <Include file="..\modules\nameplates.lua"/>
@@ -65,6 +66,7 @@
<Include file="..\modules\afkcam.lua"/> <Include file="..\modules\afkcam.lua"/>
<Include file="..\modules\screenshot.lua"/> <Include file="..\modules\screenshot.lua"/>
<Include file="..\modules\addoncompat.lua"/> <Include file="..\modules\addoncompat.lua"/>
<Include file="..\modules\combatlogfix.lua"/>
<Include file="..\modules\energytick.lua"/> <Include file="..\modules\energytick.lua"/>
<Include file="..\modules\totems.lua"/> <Include file="..\modules\totems.lua"/>
<Include file="..\modules\macrotweak.lua"/> <Include file="..\modules\macrotweak.lua"/>
@@ -72,4 +74,5 @@
<Include file="..\modules\superwow.lua"/> <Include file="..\modules\superwow.lua"/>
<Include file="..\modules\nampower.lua"/> <Include file="..\modules\nampower.lua"/>
<Include file="..\modules\unitxp.lua"/> <Include file="..\modules\unitxp.lua"/>
<Include file="..\modules\bgscore.lua"/>
</Ui> </Ui>
+10
View File
@@ -26,6 +26,7 @@
<Include file="..\skins\blizzard\game_menu.lua"/> <Include file="..\skins\blizzard\game_menu.lua"/>
<Include file="..\skins\blizzard\guild_registrar.lua"/> <Include file="..\skins\blizzard\guild_registrar.lua"/>
<Include file="..\skins\blizzard\help.lua"/> <Include file="..\skins\blizzard\help.lua"/>
<Include file="..\skins\blizzard\options-interface.lua"/>
<Include file="..\skins\blizzard\options-sound.lua"/> <Include file="..\skins\blizzard\options-sound.lua"/>
<Include file="..\skins\blizzard\options-video.lua"/> <Include file="..\skins\blizzard\options-video.lua"/>
<Include file="..\skins\blizzard\petition.lua"/> <Include file="..\skins\blizzard\petition.lua"/>
@@ -33,4 +34,13 @@
<Include file="..\skins\blizzard\tooltips.lua"/> <Include file="..\skins\blizzard\tooltips.lua"/>
<Include file="..\skins\blizzard\tabard.lua"/> <Include file="..\skins\blizzard\tabard.lua"/>
<Include file="..\skins\blizzard\itemtext.lua"/> <Include file="..\skins\blizzard\itemtext.lua"/>
<!-- TBC -->
<Include file="..\skins\blizzard\tracking.lua"/>
<Include file="..\skins\blizzard\guildbank.lua"/>
<Include file="..\skins\blizzard\socket.lua"/>
<Include file="..\skins\blizzard\arena_registrar.lua"/>
<Include file="..\skins\blizzard\arena.lua"/>
<Include file="..\skins\blizzard\time_manager.lua"/>
<Include file="..\skins\blizzard\lfg.lua"/>
</Ui> </Ui>
+2
View File
@@ -1,6 +1,8 @@
-- load pfUI environment -- load pfUI environment
setfenv(1, pfUI:GetEnvironment()) setfenv(1, pfUI:GetEnvironment())
local superwow_active = HasSuperWoW()
--[[ librange ]]-- --[[ librange ]]--
-- A pfUI library that detects and caches distance to units. -- A pfUI library that detects and caches distance to units.
-- --
+51 -21
View File
@@ -395,6 +395,14 @@ pfUI:RegisterModule("actionbar", "vanilla", function ()
for line in gfind(body, "[^%\n]+") do for line in gfind(body, "[^%\n]+") do
_, _, match = string.find(line, '^#showtooltip (.+)') _, _, match = string.find(line, '^#showtooltip (.+)')
-- skip any further manual macro scanning on
-- gameclients with native macro spell detection
if pfUI.client > 11200 and match then
self.spellslot = nil
self.booktype = nil
return
end
-- allow the user to disable the scan -- allow the user to disable the scan
if match and strfind(match, "disable") then if match and strfind(match, "disable") then
return return
@@ -972,17 +980,25 @@ pfUI:RegisterModule("actionbar", "vanilla", function ()
pageswitch:SetScript("OnEvent", function() pageswitch:SetScript("OnEvent", function()
if class ~= "DRUID" then return end if class ~= "DRUID" then return end
-- UNIT_CASTEVENT: detect Cat Form and Prowl cast instantly -- On login/reload: full scan
-- Cat Form: 768 | Prowl: 5215 (R1), 6783 (R2), 9913 (R3) if event == "PLAYER_ENTERING_WORLD" then
prowling = FullScan()
return
end
-- UNIT_CASTEVENT: detect Prowl cast instantly
-- Prowl Spell IDs: 5215 (Rank 1), 6783 (Rank 2), 9913 (Rank 3)
if event == "UNIT_CASTEVENT" then if event == "UNIT_CASTEVENT" then
local guid, target, cEvent, spellId = arg1, arg2, arg3, arg4 local guid, target, cEvent, spellId = arg1, arg2, arg3, arg4
local _, playerGuid = UnitExists("player") local _, playerGuid = UnitExists("player")
if guid == playerGuid and cEvent == "CAST" then if guid == playerGuid and cEvent == "CAST" then
if spellId == 5215 or spellId == 6783 or spellId == 9913 then if spellId == 5215 or spellId == 6783 or spellId == 9913 then
-- Prowl cast detected
inCatForm = true inCatForm = true
prowlActive = true prowlActive = true
prowling = true prowling = true
elseif spellId == 768 then elseif spellId == 768 then
-- Cat Form cast (Spell ID 768)
inCatForm = true inCatForm = true
end end
end end
@@ -1294,26 +1310,40 @@ pfUI:RegisterModule("actionbar", "vanilla", function ()
if enable == "1" then if enable == "1" then
-- handle pet bar -- handle pet bar
if i == 12 then if i == 12 then
-- only show when pet actions exists if pfUI.client > 11200 then
if PetHasActionBar() or pfUI.unlock and pfUI.unlock:IsShown() then if InCombatLockdown and InCombatLockdown() then
bars[i]:Show() -- don't process those events during combat
else else
bars[i]:Hide() -- set state driver for pet bars
end bars[i]:SetAttribute("unit", "pet")
local visibility = pfUI.unlock and pfUI.unlock:IsShown() and "show" or petvisibility
-- show/hide petbar on petbar updates if bars[i].visibility ~= visibility then
if init then RegisterStateDriver(bars[i], 'visibility', visibility)
bars[i]:RegisterEvent("PET_BAR_UPDATE") bars[i].visibility = visibility
bars[i]:SetScript("OnEvent", function()
-- hide obsolete buttons
for i=1, NUM_PET_ACTION_SLOTS do
if not PetHasActionBar() and bars[12][i] then
bars[12][i]:Hide()
end
end end
-- refresh layout end
CreateActionBar(12) else
end) -- only show when pet actions exists
if PetHasActionBar() or pfUI.unlock and pfUI.unlock:IsShown() then
bars[i]:Show()
else
bars[i]:Hide()
end
-- show/hide petbar on petbar updates
if init then
bars[i]:RegisterEvent("PET_BAR_UPDATE")
bars[i]:SetScript("OnEvent", function()
-- hide obsolete buttons
for i=1, NUM_PET_ACTION_SLOTS do
if not PetHasActionBar() and bars[12][i] then
bars[12][i]:Hide()
end
end
-- refresh layout
CreateActionBar(12)
end)
end
end end
-- handle shapeshift bar -- handle shapeshift bar
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("addonbuttons", "vanilla", function () pfUI:RegisterModule("addonbuttons", "vanilla:tbc", function ()
if not pfUI.minimap then return end if not pfUI.minimap then return end
if C.abuttons.enable == "0" then return end if C.abuttons.enable == "0" then return end
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("addons", "vanilla", function () pfUI:RegisterModule("addons", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
-- add main menu button -- add main menu button
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("afkcam", "vanilla", function () pfUI:RegisterModule("afkcam", "vanilla:tbc", function ()
local MARKED_AFK_CAPTURE = SanitizePattern(MARKED_AFK_MESSAGE) local MARKED_AFK_CAPTURE = SanitizePattern(MARKED_AFK_MESSAGE)
local social_chats = { local social_chats = {
"CHAT_MSG_SAY", "CHAT_MSG_SAY",
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("autovendor", "vanilla", function () pfUI:RegisterModule("autovendor", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
local processed = {} local processed = {}
+3 -3
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("bags", "vanilla", function () pfUI:RegisterModule("bags", "vanilla:tbc", function ()
local rawborder, default_border = GetBorderSize("bags") local rawborder, default_border = GetBorderSize("bags")
local knownInventorySpellTextures = { local knownInventorySpellTextures = {
@@ -573,8 +573,8 @@ pfUI:RegisterModule("bags", "vanilla", function ()
SlotLeave() SlotLeave()
end) end)
-- The OnEvent function of the template scans for framenames, -- On TBC, the OnEvent function of the template scans for framenames,
-- and doesn't know the pf-Names. Therefore, triggering -- and obviously doesn't know the pf-Names. Therefore, triggering
-- the update function on each frame manually -- the update function on each frame manually
if frame == pfUI.bag.left and BankFrameItemButton_Update then if frame == pfUI.bag.left and BankFrameItemButton_Update then
local SlotUpdate = frame.bagslots.slots[slot].frame:GetScript("OnUpdate") local SlotUpdate = frame.bagslots.slots[slot].frame:GetScript("OnUpdate")
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("bubbles", "vanilla", function () pfUI:RegisterModule("bubbles", "vanilla:tbc", function ()
local alpha = tonumber(C.chat.bubbles.alpha) local alpha = tonumber(C.chat.bubbles.alpha)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("buff", "vanilla", function () pfUI:RegisterModule("buff", "vanilla:tbc", function ()
-- Hide Blizz -- Hide Blizz
BuffFrame:Hide() BuffFrame:Hide()
BuffFrame:UnregisterAllEvents() BuffFrame:UnregisterAllEvents()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("buffwatch", "vanilla", function () pfUI:RegisterModule("buffwatch", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize("panels") local rawborder, border = GetBorderSize("panels")
local scanner = libtipscan:GetScanner("buffwatch") local scanner = libtipscan:GetScanner("buffwatch")
+2
View File
@@ -1,4 +1,6 @@
pfUI:RegisterModule("castbar", "vanilla", function () pfUI:RegisterModule("castbar", "vanilla", function ()
local superwow_active = HasSuperWoW()
local font = C.castbar.use_unitfonts == "1" and pfUI.font_unit or pfUI.font_default local font = C.castbar.use_unitfonts == "1" and pfUI.font_unit or pfUI.font_default
local font_size = C.castbar.use_unitfonts == "1" and C.global.font_unit_size or C.global.font_size local font_size = C.castbar.use_unitfonts == "1" and C.global.font_unit_size or C.global.font_size
local rawborder, default_border = GetBorderSize("unitframes") local rawborder, default_border = GetBorderSize("unitframes")
+3 -2
View File
@@ -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 = 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 panelfont_size = C.panel.use_unitfonts == "1" and C.global.font_unit_size or C.global.font_size
local rawborder, default_border = GetBorderSize("chat") local rawborder, default_border = GetBorderSize("chat")
@@ -753,7 +753,8 @@ pfUI:RegisterModule("chat", "vanilla", function ()
end end
-- Remove prat CLINKs -- 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 -- 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") text = gsub(text, "{CLINK:item:(%x+):([%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-):([^}]-)}", "|c%1|Hitem:%2|h[%3]|h|r")
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("chatcopy", "vanilla", function () pfUI:RegisterModule("chatcopy", "vanilla:tbc", function ()
local limit = 100 local limit = 100
local f = CreateFrame("Frame") local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_ENTERING_WORLD") f:RegisterEvent("PLAYER_ENTERING_WORLD")
+7
View File
@@ -0,0 +1,7 @@
pfUI:RegisterModule("combatlogfix", "tbc", function ()
-- Fixes the combatlog break bugs that exist since patch 2.4 by simply clearing the whole log
-- on every update. This is required in order to receive new log events. Otherwise, addons like
-- Omen or Recount won't work and simply don't receive any new data at a given time.
local combatlog = CreateFrame("Frame", "pfCombatLogFix", UIParent)
combatlog:SetScript("OnUpdate", CombatLogClearEntries)
end)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("combopoints", "vanilla", function () pfUI:RegisterModule("combopoints", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
-- Hide Blizzard combo point frame and unregister all events to prevent it from popping up again -- Hide Blizzard combo point frame and unregister all events to prevent it from popping up again
+11 -4
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("cooldown", "vanilla", function () pfUI:RegisterModule("cooldown", "vanilla:tbc", function ()
-- cache values -- cache values
local lowcolor = {strsplit(",", C.appearance.cd.lowcolor)} local lowcolor = {strsplit(",", C.appearance.cd.lowcolor)}
local normalcolor = {strsplit(",", C.appearance.cd.normalcolor)} local normalcolor = {strsplit(",", C.appearance.cd.normalcolor)}
@@ -134,7 +134,14 @@ pfUI:RegisterModule("cooldown", "vanilla", function ()
end end
end end
-- vanilla does not have a cooldown frame type, so we hook the if pfUI.expansion == "vanilla" then
-- regular SetTimer function that each one is calling. -- vanilla does not have a cooldown frame type, so we hook the
hooksecurefunc("CooldownFrame_SetTimer", SetCooldown) -- 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) end)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("easteregg", "vanilla", function () pfUI:RegisterModule("easteregg", "vanilla:tbc", function ()
-- merry x-mas! -- merry x-mas!
if date("%m%d") == "1224" or date("%m%d") == "1225" then 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 local title = (UnitFactionGroup("player") == "Horde") and PVP_RANK_18_0 or PVP_RANK_18_1
+6 -16
View File
@@ -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 if not pfUI.uf or not pfUI.uf.player then return end
local energytick = CreateFrame("Frame", nil, pfUI.uf.player.power.bar) 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_DISPLAYPOWER")
energytick:RegisterEvent("UNIT_ENERGY") energytick:RegisterEvent("UNIT_ENERGY")
energytick:RegisterEvent("UNIT_MANA") energytick:RegisterEvent("UNIT_MANA")
energytick:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF")
energytick:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS")
energytick:SetScript("OnEvent", function() energytick:SetScript("OnEvent", function()
if UnitPowerType("player") == 0 and C.unitframes.player.manatick == "1" then if UnitPowerType("player") == 0 and C.unitframes.player.manatick == "1" then
this.mode = "MANA" this.mode = "MANA"
@@ -21,14 +18,6 @@ pfUI:RegisterModule("energytick", "vanilla", function ()
this:Hide() this:Hide()
end 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 if event == "PLAYER_ENTERING_WORLD" then
this.lastMana = UnitMana("player") this.lastMana = UnitMana("player")
end end
@@ -49,10 +38,7 @@ pfUI:RegisterModule("energytick", "vanilla", function ()
this.badtick = diff this.badtick = diff
end end
elseif this.mode == "ENERGY" and diff > 0 then elseif this.mode == "ENERGY" and diff > 0 then
if not this.ignoreNextGain then this.target = 2
this.target = 2
end
this.ignoreNextGain = false
end end
this.lastMana = this.currentMana this.lastMana = this.currentMana
end end
@@ -83,10 +69,14 @@ pfUI:RegisterModule("energytick", "vanilla", function ()
energytick.spark:SetWidth(C.unitframes.player.pheight + 5) energytick.spark:SetWidth(C.unitframes.player.pheight + 5)
energytick.spark:SetBlendMode('ADD') energytick.spark:SetBlendMode('ADD')
-- update spark size on player frame changes
local hookUpdateConfig = pfUI.uf.player.UpdateConfig local hookUpdateConfig = pfUI.uf.player.UpdateConfig
function pfUI.uf.player.UpdateConfig() function pfUI.uf.player.UpdateConfig()
-- update spark sizes
energytick.spark:SetHeight(C.unitframes.player.pheight + 15) energytick.spark:SetHeight(C.unitframes.player.pheight + 15)
energytick.spark:SetWidth(C.unitframes.player.pheight + 5) energytick.spark:SetWidth(C.unitframes.player.pheight + 5)
-- run default unitframe update function
hookUpdateConfig(pfUI.uf.player) hookUpdateConfig(pfUI.uf.player)
end end
end) end)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("farmmode", "vanilla", function () pfUI:RegisterModule("farmmode", "vanilla:tbc", function ()
local function ToggleFarmMode() local function ToggleFarmMode()
if pfUI.farmmap:IsShown() then if pfUI.farmmap:IsShown() then
pfUI.farmmap:Hide() pfUI.farmmap:Hide()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("feigndeath", "vanilla", function () pfUI:RegisterModule("feigndeath", "vanilla:tbc", function ()
local cache = { } local cache = { }
local scanner = libtipscan:GetScanner("feigndeath") local scanner = libtipscan:GetScanner("feigndeath")
local healthbar = scanner:GetChildren() local healthbar = scanner:GetChildren()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("firstrun", "vanilla", function () pfUI:RegisterModule("firstrun", "vanilla:tbc", function ()
pfUI.firstrun = CreateFrame("Frame", "pfFirstRunWizard", UIParent) pfUI.firstrun = CreateFrame("Frame", "pfFirstRunWizard", UIParent)
pfUI.firstrun.steps = {} pfUI.firstrun.steps = {}
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("focus", "vanilla", function () pfUI:RegisterModule("focus", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("group", "vanilla", function () pfUI:RegisterModule("group", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("gryphons", "vanilla", function () pfUI:RegisterModule("gryphons", "vanilla:tbc", function ()
pfUI.gryphons = { pfUI.gryphons = {
frames = { frames = {
left = CreateFrame("Frame"), left = CreateFrame("Frame"),
+37 -21
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("gui", "vanilla", function () pfUI:RegisterModule("gui", "vanilla:tbc", function ()
local Reload, U, CreateConfig, CreateTabFrame, CreateArea, CreateGUIEntry, EntryUpdate local Reload, U, CreateConfig, CreateTabFrame, CreateArea, CreateGUIEntry, EntryUpdate
-- "searchDB" gets populated when CreateConfig is called. The table holds -- "searchDB" gets populated when CreateConfig is called. The table holds
@@ -656,7 +656,11 @@ pfUI:RegisterModule("gui", "vanilla", function ()
pfUI.gui.hoverbind:SetHeight(25) pfUI.gui.hoverbind:SetHeight(25)
pfUI.gui.hoverbind:SetText(T["Hoverbind"]) pfUI.gui.hoverbind:SetText(T["Hoverbind"])
pfUI.gui.hoverbind:SetScript("OnClick", function() pfUI.gui.hoverbind:SetScript("OnClick", function()
if pfUI.hoverbind then pfUI.hoverbind:Show() end if pfUI.hoverbind then
pfUI.hoverbind:Show()
else
message("Please enable the Hoverbind module to use this feature.")
end
end) end)
SkinButton(pfUI.gui.hoverbind) SkinButton(pfUI.gui.hoverbind)
@@ -671,6 +675,8 @@ pfUI:RegisterModule("gui", "vanilla", function ()
if pfShare then if pfShare then
pfShare:Show() pfShare:Show()
pfShareExport:Click() pfShareExport:Click()
else
message("Please enable the Share module to share your config.")
end end
end) end)
SkinButton(pfUI.gui.share) SkinButton(pfUI.gui.share)
@@ -2402,26 +2408,36 @@ pfUI:RegisterModule("gui", "vanilla", function ()
CreateConfig(nil, "ShaguDPS (" .. T["Dock"] .. ")", C.thirdparty.shagudps, "dock", "checkbox") CreateConfig(nil, "ShaguDPS (" .. T["Dock"] .. ")", C.thirdparty.shagudps, "dock", "checkbox")
CreateConfig(nil, "DPSMate (" .. T["Skin"] .. ")", C.thirdparty.dpsmate, "skin", "checkbox") CreateConfig(nil, "DPSMate (" .. T["Skin"] .. ")", C.thirdparty.dpsmate, "skin", "checkbox")
CreateConfig(nil, "DPSMate (" .. T["Dock"] .. ")", C.thirdparty.dpsmate, "dock", "checkbox") CreateConfig(nil, "DPSMate (" .. T["Dock"] .. ")", C.thirdparty.dpsmate, "dock", "checkbox")
CreateConfig(nil, "SWStats (" .. T["Skin"] .. ")", C.thirdparty.swstats, "skin", "checkbox") CreateConfig(nil, "Recount (" .. T["Skin"] .. ")", C.thirdparty.recount, "skin", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "SWStats (" .. T["Dock"] .. ")", C.thirdparty.swstats, "dock", "checkbox") CreateConfig(nil, "Recount (" .. T["Dock"] .. ")", C.thirdparty.recount, "dock", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "KLH Threat Meter (" .. T["Skin"] .. ")", C.thirdparty.ktm, "skin", "checkbox") CreateConfig(nil, "Omen (" .. T["Skin"] .. ")", C.thirdparty.omen, "skin", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "KLH Threat Meter (" .. T["Dock"] .. ")", C.thirdparty.ktm, "dock", "checkbox") CreateConfig(nil, "Omen (" .. T["Dock"] .. ")", C.thirdparty.omen, "dock", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "TW Threatmeter (" .. T["Skin"] .. ")", C.thirdparty.twt, "skin", "checkbox") CreateConfig(nil, "SWStats (" .. T["Skin"] .. ")", C.thirdparty.swstats, "skin", "checkbox", nil, nil, nil, nil, "vanilla")
CreateConfig(nil, "TW Threatmeter (" .. T["Dock"] .. ")", C.thirdparty.twt, "dock", "checkbox") CreateConfig(nil, "SWStats (" .. T["Dock"] .. ")", C.thirdparty.swstats, "dock", "checkbox", nil, nil, nil, nil, "vanilla")
CreateConfig(nil, "WIM", C.thirdparty.wim, "enable", "checkbox") CreateConfig(nil, "KLH Threat Meter (" .. T["Skin"] .. ")", C.thirdparty.ktm, "skin", "checkbox", nil, nil, nil, nil, "vanilla")
CreateConfig(nil, "HealComm", C.thirdparty.healcomm, "enable", "checkbox") CreateConfig(nil, "KLH Threat Meter (" .. T["Dock"] .. ")", C.thirdparty.ktm, "dock", "checkbox", nil, nil, nil, nil, "vanilla")
CreateConfig(nil, "SortBags", C.thirdparty.sortbags, "enable", "checkbox") 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, "MrPlow", C.thirdparty.mrplow, "enable", "checkbox")
CreateConfig(nil, "BetterCharacterStats", C.thirdparty.bcs, "enable", "checkbox") CreateConfig(nil, "BetterCharacterStats", C.thirdparty.bcs, "enable", "checkbox", nil, nil, nil, nil, "vanilla")
CreateConfig(nil, "Crafty", C.thirdparty.crafty, "enable", "checkbox") CreateConfig(nil, "Crafty", C.thirdparty.crafty, "enable", "checkbox", nil, nil, nil, nil, "vanilla")
CreateConfig(nil, "CleverMacro", C.thirdparty.clevermacro, "enable", "checkbox") CreateConfig(nil, "CleverMacro", C.thirdparty.clevermacro, "enable", "checkbox", nil, nil, nil, nil, "vanilla")
CreateConfig(nil, "FlightMap", C.thirdparty.flightmap, "enable", "checkbox") CreateConfig(nil, "AckisRecipeList", C.thirdparty.ackis, "enable", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "TheoryCraft", C.thirdparty.theorycraft, "enable", "checkbox") CreateConfig(nil, "SheepWatch", C.thirdparty.sheepwatch, "enable", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "SuperMacro", C.thirdparty.supermacro, "enable", "checkbox") CreateConfig(nil, "TotemTimers", C.thirdparty.totemtimers, "enable", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "AtlasLoot", C.thirdparty.atlasloot, "enable", "checkbox") CreateConfig(nil, "DruidBar", C.thirdparty.druidbar, "enable", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "MyRolePlay", C.thirdparty.myroleplay, "enable", "checkbox") CreateConfig(nil, "BCEPGP", C.thirdparty.bcepgp, "enable", "checkbox", nil, nil, nil, nil, "tbc")
CreateConfig(nil, "DruidManaBar", C.thirdparty.druidmana, "enable", "checkbox") CreateConfig(nil, "FlightMap", C.thirdparty.flightmap, "enable", "checkbox", nil, nil, nil, nil, "vanilla")
CreateConfig(nil, "NoteIt", C.thirdparty.noteit, "enable", "checkbox") 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) end)
CreateGUIEntry(T["Components"], T["Modules"], function() CreateGUIEntry(T["Components"], T["Modules"], function()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("hoverbind", "vanilla", function () pfUI:RegisterModule("hoverbind", "vanilla:tbc", function ()
local keymap = { local keymap = {
-- buttons to binding association -- buttons to binding association
["pfActionBarMainButton"] = "ACTIONBUTTON", ["pfActionBarMainButton"] = "ACTIONBUTTON",
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("infight", "vanilla", function () pfUI:RegisterModule("infight", "vanilla:tbc", function ()
local function OnUpdate() local function OnUpdate()
if not this.infight and not this.aggro and not this.health then return end 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 if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + .1 end
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("loot", "vanilla", function () pfUI:RegisterModule("loot", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
pfUI.loot = CreateFrame("Frame", "pfLootFrame", UIParent) pfUI.loot = CreateFrame("Frame", "pfLootFrame", UIParent)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("map", "vanilla", function () pfUI:RegisterModule("map", "vanilla:tbc", function ()
table.insert(UISpecialFrames, "WorldMapFrame") table.insert(UISpecialFrames, "WorldMapFrame")
local function UpdateTooltipScale() local function UpdateTooltipScale()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("mapreveal", "vanilla", function () pfUI:RegisterModule("mapreveal", "vanilla:tbc", function ()
-- do not load if other map addon is loaded -- do not load if other map addon is loaded
if Cartographer then return end if Cartographer then return end
if METAMAP_TITLE then return end if METAMAP_TITLE then return end
+2 -2
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("minimap", "vanilla", function () pfUI:RegisterModule("minimap", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local size = tonumber(C.appearance.minimap.size) or 140 local size = tonumber(C.appearance.minimap.size) or 140
@@ -39,7 +39,7 @@ pfUI:RegisterModule("minimap", "vanilla", function ()
Minimap:SetWidth(size) Minimap:SetWidth(size)
Minimap:SetHeight(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 arrowscale = tonumber(C.appearance.minimap.arrowscale)
local minimaparrow = ({Minimap:GetChildren()})[9] local minimaparrow = ({Minimap:GetChildren()})[9]
for k, v in pairs({Minimap:GetChildren()}) do for k, v in pairs({Minimap:GetChildren()}) do
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("mirrortimers", "vanilla", function () pfUI:RegisterModule("mirrortimers", "vanilla:tbc", function ()
local font = pfUI.font_default local font = pfUI.font_default
local fontsize = tonumber(C.global.font_size) local fontsize = tonumber(C.global.font_size)
local height = fontsize * 1.3 local height = fontsize * 1.3
+194 -77
View File
@@ -2,6 +2,10 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
-- disable original castbars -- disable original castbars
pcall(SetCVar, "ShowVKeyCastbar", 0) pcall(SetCVar, "ShowVKeyCastbar", 0)
-- check for SuperWoW support (use SUPERWOW_VERSION global)
local superwow_active = SUPERWOW_VERSION ~= nil
--print("pfUI Nameplates: SuperWoW " .. (superwow_active and "ACTIVE" or "INACTIVE"))
local unitcolors = { local unitcolors = {
["ENEMY_NPC"] = { .9, .2, .3, .8 }, ["ENEMY_NPC"] = { .9, .2, .3, .8 },
["NEUTRAL_NPC"] = { 1, 1, .3, .8 }, ["NEUTRAL_NPC"] = { 1, 1, .3, .8 },
@@ -37,6 +41,10 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
local registry = {} local registry = {}
local debuffdurations = C.appearance.cd.debuffs == "1" and true or nil local debuffdurations = C.appearance.cd.debuffs == "1" and true or nil
-- NEW: Cast event cache like Overhead.lua
local CastEvents = {}
local _, PlayerGUID = UnitExists("player")
-- cache default border color -- cache default border color
local er, eg, eb, ea = GetStringColor(pfUI_config.appearance.border.color) local er, eg, eb, ea = GetStringColor(pfUI_config.appearance.border.color)
@@ -67,6 +75,15 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
return return
end end
local function wipe(table)
if type(table) ~= "table" then
return
end
for k in pairs(table) do
table[k] = nil
end
end
local function IsNamePlate(frame) local function IsNamePlate(frame)
if frame:GetObjectType() ~= NAMEPLATE_FRAMETYPE then return nil end if frame:GetObjectType() ~= NAMEPLATE_FRAMETYPE then return nil end
regions = plate:GetRegions() regions = plate:GetRegions()
@@ -312,17 +329,64 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
nameplates:RegisterEvent("PLAYER_COMBO_POINTS") nameplates:RegisterEvent("PLAYER_COMBO_POINTS")
nameplates:RegisterEvent("UNIT_AURA") nameplates:RegisterEvent("UNIT_AURA")
-- NEW: Register cast events like Overhead.lua
if superwow_active then
nameplates:RegisterEvent("UNIT_CASTEVENT")
end
nameplates:SetScript("OnEvent", function() nameplates:SetScript("OnEvent", function()
if event == "PLAYER_ENTERING_WORLD" then if event == "PLAYER_ENTERING_WORLD" then
this:SetGameVariables() this:SetGameVariables()
elseif event == "UNIT_CASTEVENT" then
-- NEW: Event-based cast handling from Overhead.lua
local casterGUID = arg1
if casterGUID == PlayerGUID then return end
local eventType = arg3 -- "START", "CAST", "FAIL", "CHANNEL"
local spellID = arg4
local castDuration = arg5
local spellName, _, icon = SpellInfo(spellID)
if eventType == "MAINHAND" or eventType == "OFFHAND" then
return
end
if eventType == "CAST" then
if not CastEvents[casterGUID] or spellID ~= CastEvents[casterGUID].spell then
return
end
end
if eventType == "START" or eventType == "CHANNEL" then
if not CastEvents[casterGUID] then
CastEvents[casterGUID] = {}
end
wipe(CastEvents[casterGUID])
CastEvents[casterGUID].event = eventType
CastEvents[casterGUID].spellID = spellID
CastEvents[casterGUID].spellName = spellName
CastEvents[casterGUID].icon = icon
CastEvents[casterGUID].startTime = GetTime()
CastEvents[casterGUID].endTime = castDuration and GetTime() + castDuration / 1000
CastEvents[casterGUID].duration = castDuration and castDuration / 1000 or nil
elseif eventType == "FAIL" then
if CastEvents[casterGUID] then
wipe(CastEvents[casterGUID])
end
end
-- Propagate cast event to all nameplates
for plate in pairs(registry) do
plate.eventcache = true
end
else else
this.eventcache = true this.eventcache = true
end end
end) end)
nameplates:SetScript("OnUpdate", function() nameplates:SetScript("OnUpdate", function()
-- throttle to 10 updates per second instead of every frame -- Throttle main scanner to reasonable rate
if (this.tick or 0.1) > GetTime() then return else this.tick = GetTime() + 0.1 end if (this.tick or 0) > GetTime() then return else this.tick = GetTime() + 0.05 end
-- propagate events to all nameplates -- propagate events to all nameplates
if this.eventcache then if this.eventcache then
@@ -631,6 +695,7 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
end end
if player and unittype == "ENEMY_NPC" then unittype = "ENEMY_PLAYER" end if player and unittype == "ENEMY_NPC" then unittype = "ENEMY_PLAYER" end
if player and unittype == "FRIENDLY_NPC" then unittype = "FRIENDLY_PLAYER" end
elite = plate.original.levelicon:IsShown() and not player and "boss" or elite elite = plate.original.levelicon:IsShown() and not player and "boss" or elite
if not class then plate.wait_for_scan = true end if not class then plate.wait_for_scan = true end
@@ -874,12 +939,19 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
end end
nameplates.OnUpdate = function(frame) nameplates.OnUpdate = function(frame)
local update
local frame = frame or this local frame = frame or this
local nameplate = frame.nameplate local nameplate = frame.nameplate
-- OPTIMIZED: Minimal throttle - only skip if very recent update
local target = UnitExists("target") and frame:GetAlpha() == 1 or nil
local throttle = target and 0.02 or 0.02
if (nameplate.lasttick or 0) + throttle > GetTime() then return end
nameplate.lasttick = GetTime()
local update
local original = nameplate.original local original = nameplate.original
local name = original.name:GetText() local name = original.name:GetText()
local target = UnitExists("target") and frame:GetAlpha() == 1 or nil
local mouseover = UnitExists("mouseover") and original.glow:IsShown() or nil local mouseover = UnitExists("mouseover") and original.glow:IsShown() or nil
local namefightcolor = C.nameplates.namefightcolor == "1" local namefightcolor = C.nameplates.namefightcolor == "1"
@@ -889,12 +961,11 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
nameplate.eventcache = nil nameplate.eventcache = nil
end end
-- reset strata cache on target change -- OPTIMIZED: Cache strata changes
if nameplate.istarget ~= target then if nameplate.istarget ~= target then
nameplate.target_strata = nil nameplate.target_strata = nil
end end
-- keep target nameplate above others
if target and nameplate.target_strata ~= 1 then if target and nameplate.target_strata ~= 1 then
nameplate:SetFrameStrata("LOW") nameplate:SetFrameStrata("LOW")
nameplate.target_strata = 1 nameplate.target_strata = 1
@@ -903,15 +974,22 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
nameplate.target_strata = 0 nameplate.target_strata = 0
end end
-- cache target value
nameplate.istarget = target nameplate.istarget = target
-- set non-target plate alpha -- OPTIMIZED: Cache alpha changes
local newAlpha
if target or not UnitExists("target") then if target or not UnitExists("target") then
nameplate:SetAlpha(1) newAlpha = 1
else else
frame:SetAlpha(.95) newAlpha = tonumber(C.nameplates.notargalpha)
nameplate:SetAlpha(tonumber(C.nameplates.notargalpha)) end
if nameplate.cachedAlpha ~= newAlpha then
if not target and UnitExists("target") then
frame:SetAlpha(.95)
end
nameplate:SetAlpha(newAlpha)
nameplate.cachedAlpha = newAlpha
end end
-- queue update on visual target update -- queue update on visual target update
@@ -939,7 +1017,7 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
if namefightcolor then if namefightcolor then
if r > .9 and g < .2 and b < .2 then if r > .9 and g < .2 and b < .2 then
nameplate.name:SetTextColor(1,0.4,0.2,1) -- infight nameplate.name:SetTextColor(1,0.4,0.2,1)
else else
nameplate.name:SetTextColor(r,g,b,1) nameplate.name:SetTextColor(r,g,b,1)
end end
@@ -979,97 +1057,136 @@ pfUI:RegisterModule("nameplates", "vanilla", function ()
nameplate.tick = GetTime() + .5 nameplate.tick = GetTime() + .5
end end
-- target zoom -- OPTIMIZED: Cache zoom dimensions
local w, h = nameplate.health:GetWidth(), nameplate.health:GetHeight()
if target and C.nameplates.targetzoom == "1" then if target and C.nameplates.targetzoom == "1" then
local zoomval = tonumber(C.nameplates.targetzoomval)+1 if not nameplate.health.zoomed then
local wc = tonumber(C.nameplates.width)*zoomval local zoomval = tonumber(C.nameplates.targetzoomval)+1
local hc = tonumber(C.nameplates.heighthealth)*(zoomval*.9) local wc = tonumber(C.nameplates.width)*zoomval
local animation = false local hc = tonumber(C.nameplates.heighthealth)*(zoomval*.9)
nameplate.health.targetWidth = wc
nameplate.health.targetHeight = hc
end
local w, h = nameplate.health:GetWidth(), nameplate.health:GetHeight()
local wc, hc = nameplate.health.targetWidth, nameplate.health.targetHeight
if wc >= w then if wc >= w then
wc = w*1.05 nameplate.health:SetWidth(w*1.05)
nameplate.health:SetWidth(wc)
nameplate.health.zoomTransition = true nameplate.health.zoomTransition = true
animation = true elseif hc >= h then
end nameplate.health:SetHeight(h*1.05)
if hc >= h then
hc = h*1.05
nameplate.health:SetHeight(hc)
nameplate.health.zoomTransition = true nameplate.health.zoomTransition = true
animation = true else
end if nameplate.health.zoomTransition then
nameplate.health:SetWidth(wc)
if animation == false and not nameplate.health.zoomed then nameplate.health:SetHeight(hc)
nameplate.health:SetWidth(wc) nameplate.health.zoomTransition = nil
nameplate.health:SetHeight(hc) end
nameplate.health.zoomTransition = nil
nameplate.health.zoomed = true nameplate.health.zoomed = true
end end
elseif nameplate.health.zoomed or nameplate.health.zoomTransition then elseif nameplate.health.zoomed or nameplate.health.zoomTransition then
local w, h = nameplate.health:GetWidth(), nameplate.health:GetHeight()
local wc = tonumber(C.nameplates.width) local wc = tonumber(C.nameplates.width)
local hc = tonumber(C.nameplates.heighthealth) local hc = tonumber(C.nameplates.heighthealth)
local animation = false
if wc <= w then if wc <= w then
wc = w*.95 nameplate.health:SetWidth(w*.95)
nameplate.health:SetWidth(wc) elseif hc <= h then
animation = true nameplate.health:SetHeight(h*0.95)
end else
if hc <= h then
hc = h*0.95
nameplate.health:SetHeight(hc)
animation = true
end
if animation == false then
nameplate.health:SetWidth(wc) nameplate.health:SetWidth(wc)
nameplate.health:SetHeight(hc) nameplate.health:SetHeight(hc)
nameplate.health.zoomTransition = nil nameplate.health.zoomTransition = nil
nameplate.health.zoomed = nil nameplate.health.zoomed = nil
nameplate.health.targetWidth = nil
nameplate.health.targetHeight = nil
end end
end end
-- castbar update -- OPTIMIZED: UNIT_CASTEVENT implementation
if C.nameplates["showcastbar"] == "1" and ( C.nameplates["targetcastbar"] == "0" or target ) then if C.nameplates["showcastbar"] == "1" and ( C.nameplates["targetcastbar"] == "0" or target ) then
local channel, cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill local unitstr = target and "target" or nil
-- detect cast or channel bars -- Use SuperWoW GUID if available
cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(target and "target" or name) if superwow_active and not unitstr then
if not cast then channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(target and "target" or name) end unitstr = nameplate.parent:GetName(1)
-- read enemy casts from SuperWoW if enabled
if superwow_active then
cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(nameplate.parent:GetName(1))
if not cast then channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo(nameplate.parent:GetName(1)) end
end end
if not cast and not channel then -- Check event-based cast cache first
nameplate.castbar:Hide() local castInfo = unitstr and CastEvents[unitstr]
elseif cast or channel then
local effect = cast or channel
local duration = endTime - startTime
local max = duration / 1000
local cur = GetTime() - startTime / 1000
-- invert castbar values while channeling if castInfo and castInfo.spellID then
if channel then cur = max + startTime/1000 - GetTime() end -- Check if cast is still valid
if castInfo.startTime + castInfo.duration < GetTime() then
nameplate.castbar:SetMinMaxValues(0, duration/1000) wipe(castInfo)
nameplate.castbar:SetValue(cur) nameplate.castbar:Hide()
nameplate.castbar.text:SetText(round(cur,1)) elseif castInfo.event == "CAST" or castInfo.event == "FAIL" then
if C.nameplates.spellname == "1" then wipe(castInfo)
nameplate.castbar.spell:SetText(effect) nameplate.castbar:Hide()
else else
nameplate.castbar.spell:SetText("") -- Update from cached event data
end nameplate.castbar:SetMinMaxValues(castInfo.startTime, castInfo.endTime)
nameplate.castbar:Show()
if texture then local barValue
nameplate.castbar.icon.tex:SetTexture(texture) if castInfo.event == "CHANNEL" then
nameplate.castbar.icon.tex:SetTexCoord(.1,.9,.1,.9) barValue = castInfo.startTime + (castInfo.endTime - GetTime())
else
barValue = GetTime()
end
nameplate.castbar:SetValue(barValue)
nameplate.castbar.text:SetText(round(GetTime() - castInfo.startTime, 1))
if C.nameplates.spellname == "1" then
nameplate.castbar.spell:SetText(castInfo.spellName)
else
nameplate.castbar.spell:SetText("")
end
if castInfo.icon then
nameplate.castbar.icon.tex:SetTexture(castInfo.icon)
nameplate.castbar.icon.tex:SetTexCoord(.1,.9,.1,.9)
end
nameplate.castbar:Show()
end
else
-- Fallback to API calls if no event data (for non-SuperWoW or target)
local channel, cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill
if target then
cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo("target")
if not cast then
channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitChannelInfo("target")
end
end
if not cast and not channel then
nameplate.castbar:Hide()
else
local effect = cast or channel
local duration = endTime - startTime
local max = duration / 1000
local cur = GetTime() - startTime / 1000
if channel then cur = max + startTime/1000 - GetTime() end
nameplate.castbar:SetMinMaxValues(0, duration/1000)
nameplate.castbar:SetValue(cur)
nameplate.castbar.text:SetText(round(cur,1))
if C.nameplates.spellname == "1" then
nameplate.castbar.spell:SetText(effect)
else
nameplate.castbar.spell:SetText("")
end
nameplate.castbar:Show()
if texture then
nameplate.castbar.icon.tex:SetTexture(texture)
nameplate.castbar.icon.tex:SetTexCoord(.1,.9,.1,.9)
end
end end
end end
else else
+87 -80
View File
@@ -111,7 +111,7 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
if SpellInfo then if SpellInfo then
spellName, spellRank, texture = SpellInfo(spellId) spellName, spellRank, texture = SpellInfo(spellId)
end end
if GetSpellNameAndRankForId then if not spellName and GetSpellNameAndRankForId then
spellName, spellRank = GetSpellNameAndRankForId(spellId) spellName, spellRank = GetSpellNameAndRankForId(spellId)
end end
@@ -123,9 +123,9 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
end end
-- Try GetSpellRec for duration if libdebuff doesn't have it -- Try GetSpellRec for duration if libdebuff doesn't have it
if duration == 0 and GetSpellRec then if duration == 0 and GetSpellRec and spellId then
local spellRec = GetSpellRec(spellId) local success, spellRec = pcall(GetSpellRec, spellId)
if spellRec and spellRec.durationIndex and spellRec.durationIndex > 0 then if success and spellRec and spellRec.durationIndex and spellRec.durationIndex > 0 then
-- Duration index maps to spell duration - common values: -- Duration index maps to spell duration - common values:
-- This is a rough approximation since we don't have the duration table -- This is a rough approximation since we don't have the duration table
duration = 30 -- Default fallback duration = 30 -- Default fallback
@@ -170,21 +170,25 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
local effect, rank, texture, stacks, dtype, duration, timeleft, caster = originalUnitDebuff(self, unit, id) local effect, rank, texture, stacks, dtype, duration, timeleft, caster = originalUnitDebuff(self, unit, id)
-- If we have Nampower data for this unit, try to enhance it -- If we have Nampower data for this unit, try to enhance it
local _, guid = UnitExists(unit) if not UnitExists then return effect, rank, texture, stacks, dtype, duration, timeleft, caster end
if guid and debuffdb[guid] then
-- Find the debuff by slot local exists, guid = UnitExists(unit)
for spellId, data in pairs(debuffdb[guid]) do if not exists or not guid or not debuffdb[guid] then
if data.slot == id then return effect, rank, texture, stacks, dtype, duration, timeleft, caster
-- Use Nampower data for more accurate timing end
if data.duration and data.duration > 0 and data.start then
duration = data.duration -- Find the debuff by slot
timeleft = data.duration + data.start - GetTime() for spellId, data in pairs(debuffdb[guid]) do
if timeleft < 0 then timeleft = 0 end if data.slot == id then
caster = data.caster -- Use Nampower data for more accurate timing
stacks = data.stacks or stacks if data.duration and data.duration > 0 and data.start then
end duration = data.duration
break timeleft = data.duration + data.start - GetTime()
if timeleft < 0 then timeleft = 0 end
caster = data.caster
stacks = data.stacks or stacks
end end
break
end end
end end
@@ -222,20 +226,22 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
if SpellInfo then if SpellInfo then
spellName, spellRank, texture = SpellInfo(spellId) spellName, spellRank, texture = SpellInfo(spellId)
end end
if GetSpellNameAndRankForId then if not spellName and GetSpellNameAndRankForId then
spellName, spellRank = GetSpellNameAndRankForId(spellId) spellName, spellRank = GetSpellNameAndRankForId(spellId)
end end
buffdb[guid][spellId] = { if spellName then
spellId = spellId, buffdb[guid][spellId] = {
name = spellName, spellId = spellId,
rank = spellRank, name = spellName,
texture = texture, rank = spellRank,
stacks = stackCount or 1, texture = texture,
start = GetTime(), stacks = stackCount or 1,
slot = slot, start = GetTime(),
auraLevel = auraLevel slot = slot,
} auraLevel = auraLevel
}
end
elseif event == "BUFF_REMOVED_OTHER" or event == "BUFF_REMOVED_SELF" then elseif event == "BUFF_REMOVED_OTHER" or event == "BUFF_REMOVED_SELF" then
if buffdb[guid] and buffdb[guid][spellId] then if buffdb[guid] and buffdb[guid][spellId] then
buffdb[guid][spellId] = nil buffdb[guid][spellId] = nil
@@ -294,13 +300,13 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
local res = GetUnitField(unit, "resistances") local res = GetUnitField(unit, "resistances")
if not res then return nil end if not res then return nil end
return { return {
armor = res[1], armor = res[1] or 0,
holy = res[2], holy = res[2] or 0,
fire = res[3], fire = res[3] or 0,
nature = res[4], nature = res[4] or 0,
frost = res[5], frost = res[5] or 0,
shadow = res[6], shadow = res[6] or 0,
arcane = res[7] arcane = res[7] or 0
} }
end end
end end
@@ -389,13 +395,13 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
local cd = GetSpellIdCooldown(spellId) local cd = GetSpellIdCooldown(spellId)
if not cd then return nil end if not cd then return nil end
return { return {
onCooldown = cd.isOnCooldown == 1, onCooldown = (cd.isOnCooldown or 0) == 1,
remaining = cd.cooldownRemainingMs / 1000, remaining = (cd.cooldownRemainingMs or 0) / 1000,
remainingMs = cd.cooldownRemainingMs, remainingMs = cd.cooldownRemainingMs or 0,
gcdRemaining = cd.gcdCategoryRemainingMs / 1000, gcdRemaining = (cd.gcdCategoryRemainingMs or 0) / 1000,
gcdRemainingMs = cd.gcdCategoryRemainingMs, gcdRemainingMs = cd.gcdCategoryRemainingMs or 0,
individualRemaining = cd.individualRemainingMs / 1000, individualRemaining = (cd.individualRemainingMs or 0) / 1000,
categoryRemaining = cd.categoryRemainingMs / 1000, categoryRemaining = (cd.categoryRemainingMs or 0) / 1000,
} }
end end
@@ -405,9 +411,9 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
local cd = GetItemIdCooldown(itemId) local cd = GetItemIdCooldown(itemId)
if not cd then return nil end if not cd then return nil end
return { return {
onCooldown = cd.isOnCooldown == 1, onCooldown = (cd.isOnCooldown or 0) == 1,
remaining = cd.cooldownRemainingMs / 1000, remaining = (cd.cooldownRemainingMs or 0) / 1000,
remainingMs = cd.cooldownRemainingMs, remainingMs = cd.cooldownRemainingMs or 0,
} }
end end
end end
@@ -433,9 +439,10 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
if GetTrinkets then if GetTrinkets then
pfUI.api.GetEquippedTrinkets = function() pfUI.api.GetEquippedTrinkets = function()
local trinkets = GetTrinkets() local trinkets = GetTrinkets()
if not trinkets then return {} end
local equipped = {} local equipped = {}
for _, trinket in pairs(trinkets) do for _, trinket in pairs(trinkets) do
if trinket.bagIndex == nil then -- nil bagIndex = equipped if trinket and trinket.bagIndex == nil then -- nil bagIndex = equipped
table.insert(equipped, trinket) table.insert(equipped, trinket)
end end
end end
@@ -445,11 +452,11 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
pfUI.api.GetTrinketCooldown = function(slot) pfUI.api.GetTrinketCooldown = function(slot)
if not GetTrinketCooldown then return nil end if not GetTrinketCooldown then return nil end
local cd = GetTrinketCooldown(slot) local cd = GetTrinketCooldown(slot)
if cd == -1 then return nil end if cd == -1 or not cd then return nil end
return { return {
onCooldown = cd.isOnCooldown == 1, onCooldown = (cd.isOnCooldown or 0) == 1,
remaining = cd.cooldownRemainingMs / 1000, remaining = (cd.cooldownRemainingMs or 0) / 1000,
remainingMs = cd.cooldownRemainingMs, remainingMs = cd.cooldownRemainingMs or 0,
} }
end end
@@ -473,7 +480,7 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
return GetItemLevel(itemId) return GetItemLevel(itemId)
end end
local success, stats = pcall(GetItemStats, itemId, true) local success, stats = pcall(GetItemStats, itemId, true)
if success and stats then if success and stats and stats.itemLevel then
return stats.itemLevel return stats.itemLevel
end end
return nil return nil
@@ -587,41 +594,41 @@ pfUI:RegisterModule("nampower", "vanilla", function ()
-- Spell Database Access via GetSpellRec -- Spell Database Access via GetSpellRec
if GetSpellRec then if GetSpellRec then
pfUI.api.GetSpellRecord = function(spellId) pfUI.api.GetSpellRecord = function(spellId)
local rec = GetSpellRec(spellId) local success, rec = pcall(GetSpellRec, spellId)
if not rec then return nil end if not success or not rec then return nil end
return { return {
spellId = spellId, spellId = spellId,
name = rec.name, name = rec.name or "",
rank = rec.rank, rank = rec.rank or "",
description = rec.description, description = rec.description or "",
manaCost = rec.manaCost, manaCost = rec.manaCost or 0,
baseLevel = rec.baseLevel, baseLevel = rec.baseLevel or 0,
spellLevel = rec.spellLevel, spellLevel = rec.spellLevel or 0,
maxLevel = rec.maxLevel, maxLevel = rec.maxLevel or 0,
maxTargetLevel = rec.maxTargetLevel, maxTargetLevel = rec.maxTargetLevel or 0,
maxTargets = rec.maxTargets, maxTargets = rec.maxTargets or 0,
durationIndex = rec.durationIndex, durationIndex = rec.durationIndex or 0,
powerType = rec.powerType, powerType = rec.powerType or 0,
rangeIndex = rec.rangeIndex, rangeIndex = rec.rangeIndex or 0,
speed = rec.speed, speed = rec.speed or 0,
schoolMask = rec.schoolMask, schoolMask = rec.schoolMask or 0,
runeCostID = rec.runeCostID, runeCostID = rec.runeCostID or 0,
spellMissileID = rec.spellMissileID, spellMissileID = rec.spellMissileID or 0,
iconID = rec.iconID, iconID = rec.iconID or 0,
activeIconID = rec.activeIconID, activeIconID = rec.activeIconID or 0,
nameSubtext = rec.nameSubtext, nameSubtext = rec.nameSubtext or "",
castingTimeIndex = rec.castingTimeIndex, castingTimeIndex = rec.castingTimeIndex or 0,
categoryRecoveryTime = rec.categoryRecoveryTime, categoryRecoveryTime = rec.categoryRecoveryTime or 0,
recoveryTime = rec.recoveryTime, recoveryTime = rec.recoveryTime or 0,
startRecoveryCategory = rec.startRecoveryCategory, startRecoveryCategory = rec.startRecoveryCategory or 0,
startRecoveryTime = rec.startRecoveryTime, startRecoveryTime = rec.startRecoveryTime or 0,
} }
end end
-- Get spell school (fire, frost, nature, etc.) -- Get spell school (fire, frost, nature, etc.)
pfUI.api.GetSpellSchool = function(spellId) pfUI.api.GetSpellSchool = function(spellId)
local rec = GetSpellRec(spellId) local success, rec = pcall(GetSpellRec, spellId)
if not rec then return nil end if not success or not rec or not rec.schoolMask then return nil end
local schools = { local schools = {
[1] = "Physical", [1] = "Physical",
[2] = "Holy", [2] = "Holy",
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("panel", "vanilla", function() pfUI:RegisterModule("panel", "vanilla:tbc", function()
-- initialize gold cache if not yet happened -- initialize gold cache if not yet happened
pfUI_cache["gold"] = pfUI_cache["gold"] or {} pfUI_cache["gold"] = pfUI_cache["gold"] or {}
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("pet", "vanilla", function () pfUI:RegisterModule("pet", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
pfUI.uf.pet = pfUI.uf:CreateUnitFrame("Pet", nil, C.unitframes.pet) pfUI.uf.pet = pfUI.uf:CreateUnitFrame("Pet", nil, C.unitframes.pet)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("pettarget", "vanilla", function () pfUI:RegisterModule("pettarget", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
local rawborder, default_border = GetBorderSize("unitframes") local rawborder, default_border = GetBorderSize("unitframes")
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("pixelperfect", "vanilla", function () pfUI:RegisterModule("pixelperfect", "vanilla:tbc", function ()
-- pre-calculated min values -- pre-calculated min values
local statics = { local statics = {
[4] = 1.4222222222222, [4] = 1.4222222222222,
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("player", "vanilla", function () pfUI:RegisterModule("player", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
+5 -1
View File
@@ -96,7 +96,11 @@ pfUI:RegisterModule("questitem", function ()
SelectQuestLogEntry(quest) SelectQuestLogEntry(quest)
-- detect and ignore quest headers -- 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 if not header then
text, objective = GetQuestLogQuestText() text, objective = GetQuestLogQuestText()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("raid", "vanilla", function () pfUI:RegisterModule("raid", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("roll", "vanilla", function () pfUI:RegisterModule("roll", "vanilla:tbc", function ()
pfUI.roll = CreateFrame("Frame", "pfLootRoll", UIParent) pfUI.roll = CreateFrame("Frame", "pfLootRoll", UIParent)
pfUI.roll.frames = {} pfUI.roll.frames = {}
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("screenshot", "vanilla", function () pfUI:RegisterModule("screenshot", "vanilla:tbc", function ()
if C.screenshot.interval == "0" if C.screenshot.interval == "0"
and C.screenshot.levelup == "0" and C.screenshot.levelup == "0"
and C.screenshot.pvprank == "0" and C.screenshot.pvprank == "0"
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("sellvalue", "vanilla", function () pfUI:RegisterModule("sellvalue", "vanilla:tbc", function ()
local function AddVendorPrices(frame, id, count) local function AddVendorPrices(frame, id, count)
if pfSellData[id] then if pfSellData[id] then
local _, _, sell, buy = strfind(pfSellData[id], "(.*),(.*)") local _, _, sell, buy = strfind(pfSellData[id], "(.*),(.*)")
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("share", "vanilla", function () pfUI:RegisterModule("share", "vanilla:tbc", function ()
local function serialize(tbl, comp, name, ignored, spacing) local function serialize(tbl, comp, name, ignored, spacing)
local spacing = spacing or "" local spacing = spacing or ""
local match = nil local match = nil
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("socialmod", "vanilla", function () pfUI:RegisterModule("socialmod", "vanilla:tbc", function ()
local playerdb = _G.pfUI_playerDB local playerdb = _G.pfUI_playerDB
pfUI.socialmod = CreateFrame("Frame", "pfSocialMod", UIParent) pfUI.socialmod = CreateFrame("Frame", "pfSocialMod", UIParent)
pfUI.socialmod:RegisterEvent("CHAT_MSG_SYSTEM") pfUI.socialmod:RegisterEvent("CHAT_MSG_SYSTEM")
+8 -65
View File
@@ -316,6 +316,7 @@ pfUI:RegisterModule("superwow", "vanilla", function ()
-- assign all required data -- assign all required data
local unit = UnitName(target) local unit = UnitName(target)
local unitlevel = UnitLevel(target) local unitlevel = UnitLevel(target)
if not SpellInfo then return end
local effect, rank = SpellInfo(spell) local effect, rank = SpellInfo(spell)
local duration = libdebuff:GetDuration(effect, rank) local duration = libdebuff:GetDuration(effect, rank)
local caster = "player" local caster = "player"
@@ -439,70 +440,6 @@ pfUI:RegisterModule("superwow", "vanilla", function ()
end end
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 -- GetPlayerBuffID wrapper
if GetPlayerBuffID then if GetPlayerBuffID then
pfUI.api.GetPlayerBuffSpellId = function(buffIndex) pfUI.api.GetPlayerBuffSpellId = function(buffIndex)
@@ -559,7 +496,7 @@ pfUI:RegisterModule("superwow", "vanilla", function ()
end end
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 -- Player casts use SPELLCAST_* events for proper pushback handling
local supercast = CreateFrame("Frame") local supercast = CreateFrame("Frame")
local playerGuid = nil local playerGuid = nil
@@ -622,6 +559,9 @@ pfUI:RegisterModule("superwow", "vanilla", function ()
-- skip on buff procs during cast -- skip on buff procs during cast
if event_type == "CAST" then if event_type == "CAST" then
if not libcast.db[guid] or libcast.db[guid].cast ~= spell 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 return
end end
end end
@@ -639,7 +579,10 @@ pfUI:RegisterModule("superwow", "vanilla", function ()
libcast.db[dbKey].icon = icon libcast.db[dbKey].icon = icon
libcast.db[dbKey].channel = event_type == "CHANNEL" or false libcast.db[dbKey].channel = event_type == "CHANNEL" or false
elseif arg3 == "FAIL" then elseif arg3 == "FAIL" then
-- For player: use playerName, for others: use GUID
local dbKey = isPlayer and UnitName("player") or guid local dbKey = isPlayer and UnitName("player") or guid
-- delete all cast entries
if libcast.db[dbKey] then if libcast.db[dbKey] then
libcast.db[dbKey].cast = nil libcast.db[dbKey].cast = nil
libcast.db[dbKey].rank = nil libcast.db[dbKey].rank = nil
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("target", "vanilla", function () pfUI:RegisterModule("target", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("targettarget", "vanilla", function () pfUI:RegisterModule("targettarget", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("targettargettarget", "vanilla", function () pfUI:RegisterModule("targettargettarget", "vanilla:tbc", function ()
-- do not go further on disabled UFs -- do not go further on disabled UFs
if C.unitframes.disable == "1" then return end if C.unitframes.disable == "1" then return end
+381
View File
@@ -0,0 +1,381 @@
pfUI:RegisterModule("thirdparty-tbc", "tbc", function ()
-- abort when thirdparty core module is not loaded
if not pfUI.thirdparty then return end
local rawborder, default_border = GetBorderSize()
HookAddonOrVariable("Omen", function()
local docktable = { "omen", "Omen", "OmenBarList",
function() -- single
Omen.BarList:ClearAllPoints()
Omen.BarList:SetPoint("TOPLEFT", pfUI.chat.right, "TOPLEFT", -5, 5)
Omen.BarList:SetPoint("BOTTOMRIGHT", pfUI.chat.right, "BOTTOMRIGHT", 5, pfUI.panel.right:GetHeight()-5)
Omen.BarList:SetWidth(pfUI.chat.right:GetWidth() + 7)
-- backdrop adjustments
if Omen.BarList.backdrop then
Omen.BarList.backdrop:SetPoint("TOPLEFT", -default_border+5, default_border-5)
Omen.BarList.backdrop:SetPoint("BOTTOMRIGHT", default_border-5, -18-default_border+5)
end
end,
function() -- dual
Omen.BarList:ClearAllPoints()
Omen.BarList:SetPoint("TOPLEFT", pfUI.chat.right, "TOPLEFT", -5, 5)
Omen.BarList:SetPoint("BOTTOMRIGHT", pfUI.chat.right, "BOTTOM", -default_border+5, pfUI.panel.right:GetHeight()-5)
Omen.BarList:SetWidth(pfUI.chat.right:GetWidth() / 2 + 7)
-- backdrop adjustments
if Omen.BarList.backdrop then
Omen.BarList.backdrop:SetPoint("TOPLEFT", -default_border+5, default_border-5)
Omen.BarList.backdrop:SetPoint("BOTTOMRIGHT", default_border-5, -18-default_border+5)
end
end,
function() -- show
Omen:UpdateDisplay()
Omen:EnableLastModule()
Omen:LayoutModuleIcons()
Omen.ModuleList:SetPoint("BOTTOMLEFT", Omen.BarList, "TOPLEFT", 5, default_border*3-5)
Omen.ModuleList:SetPoint("BOTTOMRIGHT", Omen.BarList, "TOPRIGHT", -5, default_border*3)
-- fake sizes to retain proper button sizes
Omen.ModuleList._GetHeight = Omen.ModuleList._GetHeight or Omen.ModuleList.GetHeight
Omen.ModuleList.GetHeight = function() return 30 end
Omen:LayoutModuleIcons()
Omen.ModuleList.GetHeight = Omen.ModuleList._GetHeight
Omen.ModuleList:SetHeight(20)
OmenResizeGrip:Hide()
Omen:Toggle(true)
end,
function() -- hide
Omen:Toggle(nil)
end,
function() -- once
Omen.Title:Hide()
Omen.Title.Show = function() return end
EnableAutohide(Omen.ModuleList, 1)
local hookUpdateDisplay = Omen.UpdateDisplay
Omen.UpdateDisplay = function(self)
hookUpdateDisplay(self)
pfUI.thirdparty.meters:Resize()
end
Omen.UpdateVisible = function()
if pfUI.thirdparty.meters.state then
Omen.Anchor:Show()
else
Omen.Anchor:Hide()
end
end
end,
}
pfUI.thirdparty.meters:RegisterMeter("threat", docktable)
if C.thirdparty.omen.skin == "1" then
if Omen.Anchor then
local hookUpdateDisplay = Omen.UpdateDisplay
Omen.UpdateDisplay = function(self)
hookUpdateDisplay(self)
StripTextures(Omen.Title)
StripTextures(Omen.ModuleList)
StripTextures(Omen.BarList)
if not Omen.Title.backdrop or not Omen.ModuleList.backdrop or not Omen.BarList.backdrop then
CreateBackdrop(Omen.Title, nil, nil, (C.thirdparty.chatbg == "1" and .8))
CreateBackdropShadow(Omen.Title)
CreateBackdrop(Omen.ModuleList, nil, nil, (C.thirdparty.chatbg == "1" and .8))
CreateBackdropShadow(Omen.ModuleList)
CreateBackdrop(Omen.BarList, nil, nil, (C.thirdparty.chatbg == "1" and .8))
CreateBackdropShadow(Omen.BarList)
end
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
local r, g, b, a = strsplit(",", C.chat.global.background)
Omen.BarList.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
Omen.ModuleList.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
local r, g, b, a = strsplit(",", C.chat.global.border)
Omen.BarList.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
Omen.ModuleList.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
end
end
HookScript(Omen.Anchor, "OnShow", function()
for i, child in pairs({ OmenModuleButtons:GetChildren() }) do
if child and child:IsObjectType("Button") then
child:GetNormalTexture():SetTexCoord(.08, .92, .08, .92)
CreateBackdrop(child, nil, true)
end
end
end)
Omen:UpdateDisplay()
end
end
end)
HookAddonOrVariable("Recount", function()
local docktable = { "recount", "Recount", "Recount_MainWindow",
function() -- single
Recount.MainWindow:ClearAllPoints()
Recount.MainWindow:SetPoint("TOPLEFT", pfUI.chat.right, "TOPLEFT", 0, 10)
Recount.MainWindow:SetPoint("BOTTOMRIGHT", pfUI.chat.right, "BOTTOMRIGHT", 0, 18)
Recount.MainWindow:SetWidth(pfUI.chat.right:GetWidth())
end,
function() -- dual
Recount.MainWindow:ClearAllPoints()
Recount.MainWindow:SetPoint("TOPLEFT", pfUI.chat.right, "TOP", default_border, 10)
Recount.MainWindow:SetPoint("BOTTOMRIGHT", pfUI.chat.right, "BOTTOMRIGHT", 0, 18)
Recount.MainWindow:SetWidth(pfUI.chat.right:GetWidth() / 2)
end,
function() -- show
Recount.MainWindow:Show()
Recount:ResizeMainWindow()
Recount:RefreshMainWindow()
end,
function() -- hide
Recount.MainWindow:Hide()
end,
function() -- once
local hookResize = Recount.ResizeMainWindow
Recount.ResizeMainWindow = function()
hookResize()
local a, b, c = Recount.MainWindow:GetPoint()
if b == pfUI.chat.right and Recount.MainWindow.backdrop then
Recount.MainWindow.backdrop:SetPoint("BOTTOMRIGHT", default_border, -18-default_border)
else
Recount.MainWindow.backdrop:SetPoint("BOTTOMRIGHT", default_border, default_border)
end
end
end,
}
pfUI.thirdparty.meters:RegisterMeter("damage", docktable)
if C.thirdparty.recount.skin == "1" then
if Recount_MainWindow then
StripTextures(Recount.MainWindow)
CreateBackdrop(Recount.MainWindow, nil, nil, (C.thirdparty.chatbg == "1" and .8))
CreateBackdropShadow(Recount.MainWindow)
SkinScrollbar(Recount_MainWindow_ScrollBarScrollBar)
Recount_MainWindow_ScrollBarScrollBarScrollUpButton.Overlay:SetTexture(nil)
Recount_MainWindow_ScrollBarScrollBarScrollDownButton.Overlay:SetTexture(nil)
Recount.MainWindow.DragBottomLeft:SetNormalTexture(nil)
Recount.MainWindow.DragBottomRight:SetNormalTexture(nil)
-- backdrop adjustments
Recount.MainWindow.backdrop:SetPoint("TOPLEFT", -default_border, -5-default_border-GetPerfectPixel())
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
local r, g, b, a = strsplit(",", C.chat.global.background)
Recount.MainWindow.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
local r, g, b, a = strsplit(",", C.chat.global.border)
Recount.MainWindow.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
end
end
end
end)
HookAddonOrVariable("BCEPGP_LootFrame_Update", function()
if C.thirdparty.bcepgp.enable == "0" then return end
local hook = _G.BCEPGP_LootFrame_Update
_G.BCEPGP_LootFrame_Update = function(a,b,c,d,e,f)
LootFrame.numLootItems = GetNumLootItems()
hook(a,b,c,d,e,f)
end
end)
-- Sheep Watch Continued
-- https://www.curseforge.com/wow/addons/sheep-watch-continued/files/225593
HookAddonOrVariable("SheepWatch", function()
if C.thirdparty.sheepwatch.enable == "0" then return end
StripTextures(SheepWatch)
if SheepWatchFrameStatusBar then
SheepWatchFrameStatusBar:SetStatusBarTexture(pfUI.media["img:bar"])
SheepWatchFrameStatusBar:SetHeight(14)
CreateBackdrop(SheepWatchFrameStatusBar)
CreateBackdropShadow(SheepWatchFrameStatusBar)
end
if SheepWatchText then
SheepWatchText:ClearAllPoints()
SheepWatchText:SetPoint("CENTER", 0, 4)
end
if SheepWatchCounterText then
SheepWatchCounterText:ClearAllPoints()
SheepWatchCounterText:SetPoint("RIGHT", 0, 4)
end
end)
HookAddonOrVariable("Bag_Sort", function()
if C.thirdparty.bag_sort.enable == "0" then return end
local sort = CreateFrame("Frame", nil)
sort:RegisterEvent("PLAYER_ENTERING_WORLD")
sort:SetScript("OnEvent", function()
this:UnregisterAllEvents()
pfUI.thirdparty.RegisterBagSort("Bag_Sort",
function()
BS_slashBagSortHandler()
end,
function()
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
GameTooltip:SetText(GetAddOnMetadata("Bag_Sort","Title"))
GameTooltip:AddLine(GetAddOnMetadata("Bag_Sort","Notes"),1,1,1)
GameTooltip:Show()
end,
function()
BS_slashBankSortHandler()
end,
function()
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
GameTooltip:SetText(GetAddOnMetadata("Bag_Sort","Title"))
GameTooltip:AddLine(GetAddOnMetadata("Bag_Sort","Notes"),1,1,1)
GameTooltip:Show()
end)
end)
end)
HookAddonOrVariable("AckisRecipeList", function()
if C.thirdparty.ackis.enable == "0" then return end
if AckisRecipeList.ShowScanButton then
local AckisRecipeListShowScanButton = AckisRecipeList.ShowScanButton
AckisRecipeList.ShowScanButton = function(a1,a2,a3,a4)
-- run the original function
AckisRecipeListShowScanButton(a1,a2,a3,a4)
-- apply skin and reposition the button
SkinButton(AckisRecipeList.ScanButton)
local a,b,c,d,e = AckisRecipeList.ScanButton:GetPoint()
AckisRecipeList.ScanButton:SetPoint(a,b,c,d-14,e-2)
end
end
end)
HookAddonOrVariable("TotemTimers", function()
if C.thirdparty.totemtimers.enable == "0" then return end
local function skin(button, weapon)
if button and not button.pfskinned then
button.pfskinned = true
local icon = button.icon or _G[button:GetName().."Icon"]
icon:SetDrawLayer("BORDER")
SkinButton(button, nil, nil, nil, icon)
SetAllPointsOffset(icon, button, 2)
if _G[button:GetName().."Flash"] then
SetAllPointsOffset(_G[button:GetName().."Flash"], button, 3)
_G[button:GetName().."Flash"]:SetTexCoord(.08, .92, .08, .92)
end
if button.spellIcon then
button.spellIcon:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -2, 2)
button.spellIcon:SetTexCoord(.08, .92, .08, .92)
end
if weapon then
-- weapon button skin workaround taken from ElvUI-TBC:
-- https://github.com/ElvUI-TBC/ElvUI_AddOnSkins/blob/master/ElvUI_AddOnSkins/Skins/Addons/totemTimers.lua#L92-L135
local icon2frame = _G[button:GetName().."Icon2Frame"]
icon2frame:SetFrameStrata("MEDIUM")
icon2frame:SetWidth(icon2frame:GetWidth() + 1)
button.icon2 = _G[button:GetName().."Icon2"]
SetAllPointsOffset(button.icon2, icon2frame, 2)
button.icon1Frame = CreateFrame("Frame", "TotemTimers_MainHandIcon1Frame", button)
button.icon1Frame:SetWidth(16)
button.icon1Frame:SetHeight(30)
button.icon1Frame:SetPoint("LEFT", 0, 0)
button.icon1 = button.icon1Frame:CreateTexture(nil, "MEDIUM")
SetAllPointsOffset(button.icon1, button.icon1Frame, 3)
button.icon1:SetTexture(icon:GetTexture())
button.icon1:SetAlpha(icon:GetAlpha())
_G[button:GetName().."Cooldown"]:SetFrameLevel(button.icon1Frame:GetFrameLevel() + 1)
icon:Hide()
hooksecurefunc(icon, "SetTexture", function(_, texture)
button.icon1:SetTexture(texture)
end)
hooksecurefunc(icon, "SetAlpha", function(_, alpha)
button.icon1:SetAlpha(alpha)
end)
if icon:GetTexCoordModifiesRect() then
button.icon1:SetTexCoord(.08, .5, .08, .92)
else
button.icon1:SetTexCoord(.08, .92, .08, .92)
end
button.icon2:SetTexCoord(.5, .92, .08, .92)
hooksecurefunc(icon, "SetTexCoord", function(self, arg1, arg2)
if arg2 == 0.5 and arg1 == 0 then
button.icon1:SetTexCoord(.08, .5, .08, .92)
elseif arg2 == 1 then
button.icon1:SetTexCoord(.08, .92, .08, .92)
end
end)
hooksecurefunc(button.icon2, "SetTexCoord", function(self, arg1, arg2)
if arg2 == 1 then self:SetTexCoord(.5, .92, .08, .92) end
end)
end
end
end
hooksecurefunc("TotemTimers_SetupGlobals", function()
for i=1,4 do -- skin main buttons
for j=1,10 do skin(_G[i.."SlaveButton"..j]) end
skin(_G["TotemTimers"..i])
end
for _, timer in pairs({ "EarthElemental", "FireElemental", "ManaTide", "ManaTrinket" }) do
skin(_G["TotemTimers_"..timer])
end
for i, tracker in pairs({ "Ankh", "Shield", "MainHand", "EarthShield" }) do
skin(_G["TotemTimers_"..tracker], i==3)
end
end)
end)
HookAddonOrVariable("DruidBarFrame", function()
if C.thirdparty.druidbar.enable == "0" then return end
local p = ManaBarColor[0]
local pr, pg, pb = 0, 0, 0
if p then pr, pg, pb = p.r + .5, p.g +.5, p.b +.5 end
DruidBarKey.color = { pr, pg, pb, 1 }
DruidBarKey.bordercolor = {1,1,1,0}
DruidBarKey.bgcolor = {0,0,0,0}
DruidBarKey.manatexture = pfUI.media[pfUI.uf.player.config.pbartexture]
DruidBarKey.bordertexture = ""
hooksecurefunc("DruidBar_MainGraphics", function()
local f = pfUI.uf.player
DruidBarFrame:SetWidth((f.config.pwidth ~= "-1" and f.config.pwidth or f.config.width))
DruidBarFrame:SetHeight(f.config.pheight)
DruidBarMana:SetAllPoints(DruidBarFrame)
DruidBarText:SetFont(pfUI.font_unit, C.global.font_unit_size, "OUTLINE")
DruidBarText1:SetFont(pfUI.font_unit, C.global.font_unit_size, "OUTLINE")
StripTextures(DruidBarFrame)
CreateBackdrop(DruidBarFrame)
CreateBackdropShadow(DruidBarFrame)
end)
end)
end)
+10 -4
View File
@@ -1,7 +1,10 @@
pfUI:RegisterModule("thirdparty", "vanilla", function() pfUI:RegisterModule("thirdparty", "vanilla:tbc", function()
-- This module includes the core logic of thirdparty modules. -- This module includes the core logic of thirdparty modules.
-- Right now, in particular the functions to register addons to the -- Right now, in particular the functions to register addons to the
-- dockframe of the chat panel aswell as the thirdparty root-table. -- 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 = {} pfUI.thirdparty = {}
@@ -193,7 +196,8 @@ pfUI:RegisterModule("thirdparty", "vanilla", function()
end end
-- MrPlow Bag Sorting Addon. -- 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() HookAddonOrVariable("MrPlow", function()
if C.thirdparty.mrplow.enable == "0" then return end if C.thirdparty.mrplow.enable == "0" then return end
@@ -228,7 +232,8 @@ pfUI:RegisterModule("thirdparty", "vanilla", function()
end) end)
-- ShaguDPS Damage Meter -- ShaguDPS Damage Meter
-- https://github.com/shagu/ShaguDPS -- Vanilla: https://github.com/shagu/ShaguDPS
-- TBC: https://github.com/shagu/ShaguDPS
HookAddonOrVariable("ShaguDPS", function() HookAddonOrVariable("ShaguDPS", function()
local docktable = { "shagudps", "ShaguDPS", "ShaguDPSWindow", local docktable = { "shagudps", "ShaguDPS", "ShaguDPSWindow",
function() -- single function() -- single
@@ -328,7 +333,8 @@ pfUI:RegisterModule("thirdparty", "vanilla", function()
end) end)
-- DPSMate Damage Meter -- DPSMate Damage Meter
-- https://github.com/Geigerkind/DPSMate -- Vanilla: https://github.com/Geigerkind/DPSMate
-- TBC: https://github.com/Geigerkind/DPSMateTBC
HookAddonOrVariable("DPSMate_DPSMate", function() HookAddonOrVariable("DPSMate_DPSMate", function()
local docktable = { "dpsmate", "DPSMate", "DPSMate_DPSMate", local docktable = { "dpsmate", "DPSMate", "DPSMate_DPSMate",
function() -- single function() -- single
+4 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("totems", "vanilla", function () pfUI:RegisterModule("totems", "vanilla:tbc", function ()
local _, class = UnitClass("player") local _, class = UnitClass("player")
local slots = { local slots = {
@@ -42,6 +42,9 @@ pfUI:RegisterModule("totems", "vanilla", function ()
-- Try to recast totem on left click in vanilla -- Try to recast totem on left click in vanilla
local active, name, start, duration, icon = GetTotemInfo(this.id) local active, name, start, duration, icon = GetTotemInfo(this.id)
if name then CastSpellByName(name) end 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
end end
+1 -1
View File
@@ -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 if C.unitframes.disable == "1" or C.unitframes.layout ~= "tukui" then return end
-- update player layout -- update player layout
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("unlock", "vanilla", function () pfUI:RegisterModule("unlock", "vanilla:tbc", function ()
local rawborder, default_border = GetBorderSize() local rawborder, default_border = GetBorderSize()
-- grouped frames -- grouped frames
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("unusable", "vanilla", function () pfUI:RegisterModule("unusable", "vanilla:tbc", function ()
if not pfUI.bag then return end if not pfUI.bag then return end
if C.appearance.bags.unusable ~= "1" then return end if C.appearance.bags.unusable ~= "1" then return end
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("updatenotify", "vanilla", function () pfUI:RegisterModule("updatenotify", "vanilla:tbc", function ()
local alreadyshown = false local alreadyshown = false
local localversion = tonumber(pfUI.version.major*10000 + pfUI.version.minor*100 + pfUI.version.fix) local localversion = tonumber(pfUI.version.major*10000 + pfUI.version.minor*100 + pfUI.version.fix)
local remoteversion = tonumber(pfUI_init.updateavailable) or 0 local remoteversion = tonumber(pfUI_init.updateavailable) or 0
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterModule("xpbar", "vanilla", function () pfUI:RegisterModule("xpbar", "vanilla:tbc", function ()
local rawborder, default_border = GetBorderSize() local rawborder, default_border = GetBorderSize()
local parse_faction = SanitizePattern(FACTION_STANDING_INCREASED) local parse_faction = SanitizePattern(FACTION_STANDING_INCREASED)
+17
View File
@@ -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
+29 -7
View File
@@ -77,9 +77,17 @@ end})
local _, _, _, client = GetBuildInfo() local _, _, _, client = GetBuildInfo()
client = client or 11200 client = client or 11200
-- set expansion to vanilla -- detect client expansion
pfUI.expansion = "vanilla" if client >= 20000 and client <= 20400 then
pfUI.client = client 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 -- setup pfUI namespace
setmetatable(pfUI.env, {__index = getfenv(0)}) setmetatable(pfUI.env, {__index = getfenv(0)})
@@ -111,20 +119,34 @@ function pfUI:UpdateFonts()
-- load font configuration -- load font configuration
local default, tooltip, unit, unit_name, combat 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) -- force locale compatible fonts (zhCN 1.12)
default = "Fonts\\FZXHLJW.TTF" default = "Fonts\\FZXHLJW.TTF"
tooltip = "Fonts\\FZXHLJW.TTF" tooltip = "Fonts\\FZXHLJW.TTF"
combat = "Fonts\\FZXHLJW.TTF" combat = "Fonts\\FZXHLJW.TTF"
unit = "Fonts\\FZXHLJW.TTF" unit = "Fonts\\FZXHLJW.TTF"
unit_name = "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) -- force locale compatible fonts (zhTW 1.12)
default = "Fonts\\FZXHLJW.ttf" default = "Fonts\\FZXHLJW.ttf"
tooltip = "Fonts\\FZXHLJW.ttf" tooltip = "Fonts\\FZXHLJW.ttf"
combat = "Fonts\\FZXHLJW.ttf" combat = "Fonts\\FZXHLJW.ttf"
unit = "Fonts\\FZXHLJW.ttf" unit = "Fonts\\FZXHLJW.ttf"
unit_name = "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 elseif pfUI_config.global.force_region == "1" and GetLocale() == "koKR" then
-- force locale compatible fonts (koKR) -- force locale compatible fonts (koKR)
default = "Fonts\\2002.TTF" default = "Fonts\\2002.TTF"
@@ -222,7 +244,7 @@ end
function pfUI:RegisterModule(name, a2, a3) function pfUI:RegisterModule(name, a2, a3)
if pfUI.module[name] then return end if pfUI.module[name] then return end
local hasv = type(a2) == "string" 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 -- check for client compatibility
if not strfind(version, pfUI.expansion) then return end if not strfind(version, pfUI.expansion) then return end
@@ -237,7 +259,7 @@ end
function pfUI:RegisterSkin(name, a2, a3) function pfUI:RegisterSkin(name, a2, a3)
if pfUI.skin[name] then return end if pfUI.skin[name] then return end
local hasv = type(a2) == "string" 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 -- check for client compatibility
if not strfind(version, pfUI.expansion) then return end if not strfind(version, pfUI.expansion) then return end
+1 -1
View File
@@ -3,7 +3,7 @@
## Author: Shagu ## Author: Shagu
## Notes: A complete user interface replacement. ## Notes: A complete user interface replacement.
## Notes-ruRU: Полная замена пользовательского интерфейса. ## Notes-ruRU: Полная замена пользовательского интерфейса.
## Version: 5.5.4 ## Version: 6.0.0
## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache ## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB ## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
+55
View File
@@ -0,0 +1,55 @@
pfUI:RegisterSkin("Arena", "tbc", function ()
StripTextures(ArenaFrame)
CreateBackdrop(ArenaFrame, nil, nil, .75)
CreateBackdropShadow(ArenaFrame)
ArenaFrame.backdrop:SetPoint("TOPLEFT", 10, -10)
ArenaFrame.backdrop:SetPoint("BOTTOMRIGHT", -32, 72)
ArenaFrame:SetHitRectInsets(10,32,10,72)
EnableMovable(ArenaFrame)
SkinCloseButton(ArenaFrameCloseButton, ArenaFrame.backdrop, -6, -6)
ArenaFrame:DisableDrawLayer("BACKGROUND")
ArenaFrameFrameLabel:ClearAllPoints()
ArenaFrameFrameLabel:SetPoint("TOP", TabardFrame.backdrop, "TOP", 0, -10)
ArenaFrame.zones_bg = CreateFrame("Frame", "ArenaFrameZonesBackground", ArenaFrame)
CreateBackdrop(ArenaFrame.zones_bg, nil, nil, .7)
ArenaFrame.zones_bg:SetWidth(324)
ArenaFrame.zones_bg:SetHeight(204)
ArenaFrame.zones_bg:SetPoint("TOPLEFT", ArenaFrame.backdrop, "TOPLEFT", 9, -62)
ArenaFrame.tex1 = ArenaFrame.backdrop:CreateTexture("ArenaFrameWorldMap1", "ARTWORK")
ArenaFrame.tex1:SetTexture("Interface\\BattlefieldFrame\\UI-Battlefield-WorldMap1")
ArenaFrame.tex1:SetPoint("TOPLEFT", 11, -64)
ArenaFrame.tex1:SetHeight(240)
ArenaFrame.tex2 = ArenaFrame.backdrop:CreateTexture("ArenaFrameWorldMap2", "ARTWORK")
ArenaFrame.tex2:SetTexture("Interface\\BattlefieldFrame\\UI-Battlefield-WorldMap2")
ArenaFrame.tex2:SetPoint("LEFT", ArenaFrame.tex1, "RIGHT", 0, 0)
ArenaFrame.tex2:SetHeight(240)
ArenaFrameNameHeader:ClearAllPoints()
ArenaFrameNameHeader:SetPoint("BOTTOMLEFT", ArenaFrameDivider, "TOPLEFT", 14, 70)
local shift = 28
ArenaZone1:ClearAllPoints()
ArenaZone1:SetPoint("TOPLEFT", ArenaFrame, "TOPLEFT", 23, -79 - shift)
ArenaZone4:ClearAllPoints()
ArenaZone4:SetPoint("TOPLEFT", ArenaZone3, "TOPLEFT", 0, -85 + shift)
ArenaFrame.textbox = CreateFrame("Frame", "ArenaFrameTextBox", ArenaFrame)
ArenaFrame.textbox:SetWidth(324)
ArenaFrame.textbox:SetHeight(110)
CreateBackdrop(ArenaFrame.textbox)
ArenaFrame.textbox:SetPoint("BOTTOM", ArenaFrame.backdrop, "BOTTOM", 0, 36)
ArenaFrameZoneDescription:SetFontObject(GameFontWhite)
ArenaFrameZoneDescription:ClearAllPoints()
ArenaFrameZoneDescription:SetPoint("TOPLEFT", ArenaFrame.textbox, "TOPLEFT", 4, -4)
ArenaFrameZoneDescription:SetPoint("BOTTOMRIGHT", ArenaFrame.textbox, "BOTTOMRIGHT", -4, 4)
SkinButton(ArenaFrameCancelButton)
SkinButton(ArenaFrameJoinButton)
SkinButton(ArenaFrameGroupJoinButton)
end)
+119
View File
@@ -0,0 +1,119 @@
pfUI:RegisterSkin("Arena Registrar", "tbc", function ()
local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
do -- ArenaRegistrarFrame
StripTextures(ArenaRegistrarFrame)
StripTextures(ArenaRegistrarGreetingFrame)
CreateBackdrop(ArenaRegistrarFrame, nil, nil, .75)
CreateBackdropShadow(ArenaRegistrarFrame)
ArenaRegistrarFrame.backdrop:SetPoint("TOPLEFT", 14, -18)
ArenaRegistrarFrame.backdrop:SetPoint("BOTTOMRIGHT", -28, 66)
ArenaRegistrarFrame:SetHitRectInsets(14,28,18,66)
EnableMovable(ArenaRegistrarFrame)
SkinCloseButton(ArenaRegistrarFrameCloseButton, ArenaRegistrarFrame.backdrop, -6, -6)
ArenaRegistrarFrame:DisableDrawLayer("BACKGROUND")
ArenaRegistrarFrameNpcNameText:ClearAllPoints()
ArenaRegistrarFrameNpcNameText:SetPoint("TOP", ArenaRegistrarFrame.backdrop, "TOP", 0, -10)
SkinButton(ArenaRegistrarFrameGoodbyeButton)
SkinButton(ArenaRegistrarFrameCancelButton)
SkinButton(ArenaRegistrarFramePurchaseButton)
ArenaRegistrarCostLabel:SetFontObject("GameFontWhite")
ArenaRegistrarFrameEditBox:DisableDrawLayer("BACKGROUND")
CreateBackdrop(ArenaRegistrarFrameEditBox, nil, nil, 1)
ArenaRegistrarFrameEditBox:SetHeight(16)
local bg = ArenaRegistrarFrame:CreateTexture(nil, "LOW")
bg:SetTexCoord(.1,1,0,1)
bg:SetTexture("Interface\\Stationery\\StationeryTest1")
bg:SetPoint("TOPLEFT", 23, -81)
bg:SetPoint("BOTTOMRIGHT", -40, 100)
end
do -- PVPBannerFrame
StripTextures(PVPBannerFrame)
CreateBackdrop(PVPBannerFrame, nil, nil, .75)
CreateBackdropShadow(PVPBannerFrame)
PVPBannerFrame.backdrop:SetPoint("TOPLEFT", 10, -12)
PVPBannerFrame.backdrop:SetPoint("BOTTOMRIGHT", -32, 72)
PVPBannerFrame:SetHitRectInsets(10,32,12,72)
EnableMovable(PVPBannerFrame)
SkinCloseButton(PVPBannerFrameCloseButton, PVPBannerFrame.backdrop, -6, -6)
PVPBannerFrame:DisableDrawLayer("BACKGROUND")
PVPBannerFrameNameText:ClearAllPoints()
PVPBannerFrameNameText:SetPoint("TOP", ArenaRegistrarFrame.backdrop, "TOP", 0, -10)
PVPBannerFrameGreetingText:ClearAllPoints()
PVPBannerFrameGreetingText:SetPoint("TOP", PVPBannerFrameNameText, "TOP", 0, -10)
PVPBannerFrameCustomizationBorder:Hide()
PVPBannerFrameCustomization1:ClearAllPoints()
PVPBannerFrameCustomization1:SetPoint("TOPLEFT", PVPBannerFrameCustomizationBorder, "TOPLEFT", 48, -45)
for i = 1, 2 do
local frame = _G["PVPBannerFrameCustomization"..i]
StripTextures(frame)
CreateBackdrop(frame, nil, true)
frame:SetHeight(25)
local left = _G["PVPBannerFrameCustomization"..i.."LeftButton"]
StripTextures(left)
SkinArrowButton(left, "left", 25)
left:ClearAllPoints()
left:SetPoint("LEFT", 0, 0)
local right = _G["PVPBannerFrameCustomization"..i.."RightButton"]
StripTextures(right)
SkinArrowButton(right, "right", 25)
right:ClearAllPoints()
right:SetPoint("RIGHT", 0, 0)
local text = _G["PVPBannerFrameCustomization"..i.."Text"]
text:ClearAllPoints()
text:SetPoint("CENTER", 0, 0)
end
local width = PVPBannerFrameCustomization2:GetWidth()
for i = 1, 3 do
local btn = _G["PVPColorPickerButton"..i]
local prev = _G["PVPColorPickerButton"..(i-1)]
SkinButton(btn)
btn:SetWidth(width)
btn:ClearAllPoints()
if prev then
btn:SetPoint("TOPLEFT", prev, "BOTTOMLEFT", 0, -5)
else
btn:SetPoint("TOPLEFT", PVPBannerFrameCustomization2, "BOTTOMLEFT", 0, -5)
end
end
local PVPBannerFrameCancelButton
do -- fix Blizzard bug. A button with the same name is created twice.
for k,v in ipairs({PVPBannerFrameCustomizationFrame:GetChildren()}) do
if v:GetName() == "PVPBannerFrameCancelButton" then v:Hide() end -- This is the wrong and broken button.
end
for k,v in ipairs({PVPBannerFrame:GetChildren()}) do
if v:GetName() == "PVPBannerFrameCancelButton" then PVPBannerFrameCancelButton = v end
end
end
SkinButton(PVPBannerFrameSaveButton)
SkinButton(PVPBannerFrameCancelButton)
PVPBannerFrameCancelButton:ClearAllPoints()
PVPBannerFrameCancelButton:SetPoint("TOPRIGHT", PVPColorPickerButton3, "BOTTOMRIGHT", 0, -10)
SkinButton(PVPBannerFrameAcceptButton)
PVPBannerFrameAcceptButton:ClearAllPoints()
PVPBannerFrameAcceptButton:SetPoint("RIGHT", PVPBannerFrameCancelButton, "LEFT", -2*bpad, 0)
end
end)
+10 -5
View File
@@ -1,11 +1,16 @@
pfUI:RegisterSkin("Auctionhouse", "vanilla", function () pfUI:RegisterSkin("Auctionhouse", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
HookAddonOrVariable("Blizzard_AuctionUI", function() HookAddonOrVariable("Blizzard_AuctionUI", function()
SkinArrowButton(BidPrevPageButton, "left", 18) -- Compatibility
SkinArrowButton(BidNextPageButton, "right", 18) if BrowseResetButton then -- tbc
SkinArrowButton(AuctionsPrevPageButton, "left", 18) SkinButton(BrowseResetButton)
SkinArrowButton(AuctionsNextPageButton, "right", 18) else -- vanilla
SkinArrowButton(BidPrevPageButton, "left", 18)
SkinArrowButton(BidNextPageButton, "right", 18)
SkinArrowButton(AuctionsPrevPageButton, "left", 18)
SkinArrowButton(AuctionsNextPageButton, "right", 18)
end
hooksecurefunc("AuctionFrame_OnShow", function() hooksecurefunc("AuctionFrame_OnShow", function()
AuctionFrame:ClearAllPoints() AuctionFrame:ClearAllPoints()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Battlefield", "vanilla", function () pfUI:RegisterSkin("Battlefield", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Battlefield Minimap", "vanilla", function () pfUI:RegisterSkin("Battlefield Minimap", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
HookAddonOrVariable("Blizzard_BattlefieldMinimap", function() HookAddonOrVariable("Blizzard_BattlefieldMinimap", function()
+19 -6
View File
@@ -1,13 +1,26 @@
pfUI:RegisterSkin("Character", "vanilla", function () pfUI:RegisterSkin("Character", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
-- Honor Tab -- Compatibility
StripTextures(HonorFrame) 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"]) -- Honor Tab
CreateBackdrop(HonorFrameProgressBar) StripTextures(PVPFrame)
HonorFrameProgressBar:SetHeight(24) else -- vanilla
-- Honor Tab
StripTextures(HonorFrame)
HonorFrameProgressBar:SetStatusBarTexture(pfUI.media["img:bar"])
CreateBackdrop(HonorFrameProgressBar)
HonorFrameProgressBar:SetHeight(24)
end
local magicResTextureCords = { local magicResTextureCords = {
{0.21875, 0.78125, 0.25, 0.3203125}, {0.21875, 0.78125, 0.25, 0.3203125},
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Dress Up Frame", "vanilla", function () pfUI:RegisterSkin("Dress Up Frame", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
+59 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Friends", "vanilla", function () pfUI:RegisterSkin("Friends", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
local maxtab = pfUI.expansion == "vanilla" and 4 or 5 local maxtab = pfUI.expansion == "vanilla" and 4 or 5
@@ -336,6 +336,24 @@ pfUI:RegisterSkin("Friends", "vanilla", function ()
GuildInfoCancelButton:ClearAllPoints() GuildInfoCancelButton:ClearAllPoints()
GuildInfoCancelButton:SetPoint("BOTTOMRIGHT", GuildInfoFrame, "BOTTOMRIGHT", -10, 8) 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 -- guild control
StripTextures(GuildControlPopupFrame) StripTextures(GuildControlPopupFrame)
CreateBackdrop(GuildControlPopupFrame, nil, true, .75) CreateBackdrop(GuildControlPopupFrame, nil, true, .75)
@@ -374,6 +392,46 @@ pfUI:RegisterSkin("Friends", "vanilla", function ()
GuildControlPopupAcceptButton:SetPoint("RIGHT", GuildControlPopupFrameCancelButton, "LEFT", -2*bpad, 0) GuildControlPopupAcceptButton:SetPoint("RIGHT", GuildControlPopupFrameCancelButton, "LEFT", -2*bpad, 0)
end 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 do -- Raid Tab
StripTextures(RaidInfoFrame) StripTextures(RaidInfoFrame)
CreateBackdrop(RaidInfoFrame, nil, true, .75) CreateBackdrop(RaidInfoFrame, nil, true, .75)
+6 -2
View File
@@ -1,10 +1,14 @@
pfUI:RegisterSkin("Game Menu", "vanilla", function () pfUI:RegisterSkin("Game Menu", "vanilla:tbc", function ()
StripTextures(GameMenuFrame) StripTextures(GameMenuFrame)
CreateBackdrop(GameMenuFrame, nil, true, .75) CreateBackdrop(GameMenuFrame, nil, true, .75)
CreateBackdropShadow(GameMenuFrame) CreateBackdropShadow(GameMenuFrame)
GameMenuFrame:SetWidth(GameMenuFrame:GetWidth() - 30) 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) local title = GetNoNameObject(GameMenuFrame, "FontString", "ARTWORK", MAIN_MENU)
title:SetTextColor(1,1,1,1) title:SetTextColor(1,1,1,1)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Gossip and Quest", "vanilla", function () pfUI:RegisterSkin("Gossip and Quest", "vanilla:tbc", function ()
local frames = {'Quest', 'Gossip'} local frames = {'Quest', 'Gossip'}
local panels = {'Greeting', 'Detail', 'Progress', 'Reward'} local panels = {'Greeting', 'Detail', 'Progress', 'Reward'}
local buttons = { local buttons = {
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Guild Registrar", "vanilla", function () pfUI:RegisterSkin("Guild Registrar", "vanilla:tbc", function ()
StripTextures(GuildRegistrarFrame) StripTextures(GuildRegistrarFrame)
StripTextures(GuildRegistrarGreetingFrame) StripTextures(GuildRegistrarGreetingFrame)
CreateBackdrop(GuildRegistrarFrame, nil, nil, .75) CreateBackdrop(GuildRegistrarFrame, nil, nil, .75)
+131
View File
@@ -0,0 +1,131 @@
pfUI:RegisterSkin("Guild Bank", "tbc", function ()
local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
HookAddonOrVariable("Blizzard_GuildBankUI", function()
do -- GuildBankFrame
StripTextures(GuildBankFrame)
CreateBackdrop(GuildBankFrame, nil, nil, .75)
CreateBackdropShadow(GuildBankFrame)
GuildBankFrame.backdrop:SetPoint("TOPLEFT", 10, -30)
GuildBankFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 4)
GuildBankFrame:SetHitRectInsets(10,0,30,4)
EnableMovable(GuildBankFrame)
SkinCloseButton(GetNoNameObject(GuildBankFrame, "Button", nil, "UI-Panel-MinimizeButton-Up"), GuildBankFrame.backdrop, -6, -6)
GuildBankEmblemFrame:ClearAllPoints()
GuildBankEmblemFrame:SetPoint("BOTTOM", GuildBankFrame.backdrop, "TOP", -70, 0)
for i = 1, 4 do
local tab = _G["GuildBankFrameTab"..i]
local lastTab = _G["GuildBankFrameTab"..(i-1)]
tab:ClearAllPoints()
if lastTab then
tab:SetPoint("LEFT", lastTab, "RIGHT", border*2 + 1, 0)
else
tab:SetPoint("TOPLEFT", GuildBankFrame.backdrop, "BOTTOMLEFT", bpad, -(border + (border == 1 and 1 or 2)))
end
SkinTab(tab)
end
for i = 1, 6 do
local frame = _G["GuildBankTab"..i]
local button = _G["GuildBankTab"..i.."Button"]
local lastbutton = _G["GuildBankTab"..(i-1).."Button"]
local texture = _G["GuildBankTab"..i.."ButtonIconTexture"]
StripTextures(frame)
SkinButton(button, nil, nil, nil, texture)
button:ClearAllPoints()
if lastbutton then
button:SetPoint("TOP", lastbutton, "BOTTOM", 0, - (border + (border == 1 and 1 or 2) + bpad))
else
button:SetPoint("TOPLEFT", 6, -60)
end
function button.SetChecked(self, checked)
if checked then
self.locked = true
self:SetBackdropBorderColor(1,1,1)
else
self.locked = false
self:SetBackdropBorderColor(GetStringColor(pfUI_config.appearance.border.color))
end
end
end
for i = 1, NUM_GUILDBANK_COLUMNS do
local column = _G["GuildBankColumn"..i]
StripTextures(column)
for j = 1, NUM_SLOTS_PER_GUILDBANK_GROUP do
local slot = _G["GuildBankColumn"..i.."Button"..j]
SkinButton(slot, nil, nil, nil, _G[slot:GetName().."IconTexture"], true)
end
end
hooksecurefunc("GuildBankFrame_Update", function()
if GuildBankFrame.mode ~= "bank" then return end
for i = 1, MAX_GUILDBANK_SLOTS_PER_TAB do
local index = math.fmod(i, NUM_SLOTS_PER_GUILDBANK_GROUP)
if index == 0 then index = NUM_SLOTS_PER_GUILDBANK_GROUP end
local column = ceil((i-.5)/NUM_SLOTS_PER_GUILDBANK_GROUP)
local slot = _G["GuildBankColumn"..column.."Button"..index]
local tab = GetCurrentGuildBankTab()
local link = GetGuildBankItemLink(tab, i)
if link then
local r,g,b = GetItemQualityColor(select(3, GetItemInfo(link)))
slot:SetBackdropBorderColor(r,g,b,1)
else
slot:SetBackdropBorderColor(GetStringColor(pfUI_config.appearance.border.color))
end
end
end)
SkinButton(GuildBankFrameDepositButton)
SkinButton(GuildBankFrameWithdrawButton)
GuildBankFrameWithdrawButton:ClearAllPoints()
GuildBankFrameWithdrawButton:SetPoint("RIGHT", GuildBankFrameDepositButton, "LEFT", -2*bpad, 0)
SkinButton(GuildBankInfoSaveButton)
GuildBankInfoScrollFrameScrollBar:Hide()
end
do -- GuildBankPopupFrame
StripTextures(GuildBankPopupFrame)
CreateBackdrop(GuildBankPopupFrame, nil, nil, .75)
CreateBackdropShadow(GuildBankPopupFrame)
GuildBankPopupFrame.backdrop:SetPoint("TOPLEFT", 0, -6)
GuildBankPopupFrame.backdrop:SetPoint("BOTTOMRIGHT", -26, 26)
GuildBankPopupFrame:SetHitRectInsets(0,26,6,26)
GuildBankPopupFrame.backdrop:SetPoint("TOPLEFT", GuildBankFrame.backdrop, "TOPRIGHT", 2*border, 0)
GuildBankPopupEditBox:DisableDrawLayer("BACKGROUND")
CreateBackdrop(GuildBankPopupEditBox)
StripTextures(GuildBankPopupScrollFrame)
CreateBackdrop(GuildBankPopupScrollFrame)
SkinScrollbar(GuildBankPopupScrollFrameScrollBar)
GuildBankPopupScrollFrame:ClearAllPoints()
GuildBankPopupScrollFrame:SetPoint("TOPLEFT", GuildBankPopupEditBox, "BOTTOMLEFT", -11, -14)
GuildBankPopupScrollFrame:SetWidth(182)
GuildBankPopupScrollFrame:SetHeight(178)
for i = 1, 16 do
local slot = _G["GuildBankPopupButton"..i]
StripTextures(slot)
SkinButton(slot, nil, nil, nil, _G["GuildBankPopupButton"..i.."Icon"], true)
end
GuildBankPopupButton1:ClearAllPoints()
GuildBankPopupButton1:SetPoint("TOPLEFT", GuildBankPopupScrollFrame, "TOPLEFT", 4, -4)
SkinButton(GuildBankPopupCancelButton)
SkinButton(GuildBankPopupOkayButton)
GuildBankPopupOkayButton:ClearAllPoints()
GuildBankPopupOkayButton:SetPoint("RIGHT", GuildBankPopupCancelButton, "LEFT", -2*bpad, 0)
end
end)
end)
+13 -1
View File
@@ -1,7 +1,19 @@
pfUI:RegisterSkin("Help", "vanilla", function () pfUI:RegisterSkin("Help", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() 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) StripTextures(HelpFrame)
CreateBackdrop(HelpFrame, nil, nil, .75) CreateBackdrop(HelpFrame, nil, nil, .75)
CreateBackdropShadow(HelpFrame) CreateBackdropShadow(HelpFrame)
+105
View File
@@ -20,6 +20,111 @@ local slots = {
"RangedSlot", "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 () pfUI:RegisterSkin("Inspect", "vanilla", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Books", "vanilla", function () pfUI:RegisterSkin("Books", "vanilla:tbc", function ()
StripTextures(ItemTextFrame) StripTextures(ItemTextFrame)
CreateBackdrop(ItemTextFrame, nil, nil, .75) CreateBackdrop(ItemTextFrame, nil, nil, .75)
CreateBackdropShadow(ItemTextFrame) CreateBackdropShadow(ItemTextFrame)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("KeyBindings", "vanilla", function () pfUI:RegisterSkin("KeyBindings", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
+75
View File
@@ -0,0 +1,75 @@
pfUI:RegisterSkin("Looking for group", "tbc", function ()
local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
StripTextures(LFGParentFrame)
CreateBackdrop(LFGParentFrame, nil, nil, .75)
CreateBackdropShadow(LFGParentFrame)
LFGParentFrame.backdrop:SetPoint("TOPLEFT", 14, -10)
LFGParentFrame.backdrop:SetPoint("BOTTOMRIGHT", -26, 72)
LFGParentFrame:SetHitRectInsets(14,26,10,72)
EnableMovable(LFGParentFrame)
SkinCloseButton(GetNoNameObject(LFGParentFrame, 'Button', nil, "UI-Panel-MinimizeButton-Up"), LFGParentFrame.backdrop, -6, -6)
LFGParentFrame:DisableDrawLayer("BACKGROUND")
LFGParentFrameTitle:ClearAllPoints()
LFGParentFrameTitle:SetPoint("TOP", LFGParentFrame.backdrop, "TOP", 0, -10)
SkinTab(LFGParentFrameTab1)
LFGParentFrameTab1:ClearAllPoints()
LFGParentFrameTab1:SetPoint("TOPLEFT", LFGParentFrame.backdrop, "BOTTOMLEFT", bpad, -(border + (border == 1 and 1 or 2)))
SkinTab(LFGParentFrameTab2)
LFGParentFrameTab2:ClearAllPoints()
LFGParentFrameTab2:SetPoint("LEFT", LFGParentFrameTab1, "RIGHT", border*2 + 1, 0)
LFGParentFrameBackground:Hide()
LFGFrameClearAllButton:ClearAllPoints()
LFGFrameClearAllButton:SetPoint("RIGHT", LFGFrameDoneButton, "LEFT", -2*bpad, 0)
StripTextures(AutoJoinBackground)
SkinCheckbox(AutoJoinCheckButton)
StripTextures(AddMemberBackground)
SkinCheckbox(AutoAddMembersCheckButton)
CreateBackdrop(LFGComment)
-- skin buttons
local buttons = {
"LFGWizardFrameLFGButton",
"LFGWizardFrameLFMButton",
"LFGFrameDoneButton",
"LFGFrameClearAllButton",
"LFMFrameGroupInviteButton",
"LFMFrameSendMessageButton",
"LFMFrameSearchButton",
"LFMFrameColumnHeader1",
"LFMFrameColumnHeader2",
"LFMFrameColumnHeader3",
"LFMFrameColumnHeader4",
}
for _, name in pairs(buttons) do
SkinButton(_G[name])
end
-- skin dropdowns
local dropdowns = {
"LFGFrameTypeDropDown1",
"LFGFrameNameDropDown1",
"LFGFrameTypeDropDown2",
"LFGFrameNameDropDown2",
"LFGFrameTypeDropDown3",
"LFGFrameNameDropDown3",
}
for _, name in pairs(dropdowns) do
SkinDropDown(_G[name])
end
SkinDropDown(LFMFrameTypeDropDown, nil, nil, nil, true)
SkinDropDown(LFMFrameNameDropDown, nil, nil, nil, true)
end)
+1 -1
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Macro", "vanilla", function () pfUI:RegisterSkin("Macro", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
+46 -2
View File
@@ -1,10 +1,53 @@
pfUI:RegisterSkin("Mailbox", "vanilla", function () pfUI:RegisterSkin("Mailbox", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
-- Compatibility
local StationeryBackgroundLeft, StationeryBackgroundRight 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") local skin = CreateFrame("Frame")
skin:SetScript("OnEvent", function() skin:SetScript("OnEvent", function()
this:UnregisterEvent("MAIL_SHOW") this:UnregisterEvent("MAIL_SHOW")
@@ -79,6 +122,7 @@ pfUI:RegisterSkin("Mailbox", "vanilla", function ()
end end
end) end)
end end
end
StripTextures(MailFrame, true) StripTextures(MailFrame, true)
CreateBackdrop(MailFrame, nil, nil, .75) CreateBackdrop(MailFrame, nil, nil, .75)
+15 -3
View File
@@ -1,9 +1,21 @@
pfUI:RegisterSkin("Merchant", "vanilla", function () pfUI:RegisterSkin("Merchant", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
MerchantRepairAllButton:ClearAllPoints() -- Compatibility
MerchantRepairAllButton:SetPoint("RIGHT", MerchantBuyBackItemItemButton, "LEFT", -6, 0) 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) StripTextures(MerchantFrame)
CreateBackdrop(MerchantFrame, nil, nil, .75) CreateBackdrop(MerchantFrame, nil, nil, .75)
+6 -6
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Stack Split", "vanilla", function () pfUI:RegisterSkin("Stack Split", "vanilla:tbc", function ()
StripTextures(StackSplitFrame) StripTextures(StackSplitFrame)
CreateBackdrop(StackSplitFrame, nil, nil, .75) CreateBackdrop(StackSplitFrame, nil, nil, .75)
CreateBackdropShadow(StackSplitFrame) CreateBackdropShadow(StackSplitFrame)
@@ -7,7 +7,7 @@ pfUI:RegisterSkin("Stack Split", "vanilla", function ()
SkinButton(StackSplitCancelButton) SkinButton(StackSplitCancelButton)
end) end)
pfUI:RegisterSkin("Coin Pickup", "vanilla", function () pfUI:RegisterSkin("Coin Pickup", "vanilla:tbc", function ()
StripTextures(CoinPickupFrame) StripTextures(CoinPickupFrame)
CreateBackdrop(CoinPickupFrame, nil, nil, .75) CreateBackdrop(CoinPickupFrame, nil, nil, .75)
CreateBackdropShadow(CoinPickupFrame) CreateBackdropShadow(CoinPickupFrame)
@@ -16,7 +16,7 @@ pfUI:RegisterSkin("Coin Pickup", "vanilla", function ()
SkinButton(CoinPickupCancelButton) SkinButton(CoinPickupCancelButton)
end) end)
pfUI:RegisterSkin("Color Picker", "vanilla", function () pfUI:RegisterSkin("Color Picker", "vanilla:tbc", function ()
CreateBackdrop(ColorPickerFrame) CreateBackdrop(ColorPickerFrame)
CreateBackdropShadow(ColorPickerFrame) CreateBackdropShadow(ColorPickerFrame)
@@ -32,7 +32,7 @@ pfUI:RegisterSkin("Color Picker", "vanilla", function ()
SkinSlider(OpacitySliderFrame) SkinSlider(OpacitySliderFrame)
end) end)
pfUI:RegisterSkin("Opacity", "vanilla", function () pfUI:RegisterSkin("Opacity", "vanilla:tbc", function ()
CreateBackdrop(OpacityFrame, nil, true, .75) CreateBackdrop(OpacityFrame, nil, true, .75)
CreateBackdropShadow(OpacityFrame) CreateBackdropShadow(OpacityFrame)
@@ -41,7 +41,7 @@ pfUI:RegisterSkin("Opacity", "vanilla", function ()
OpacityFrameSlider:SetPoint("CENTER", 0, 0) OpacityFrameSlider:SetPoint("CENTER", 0, 0)
end) end)
pfUI:RegisterSkin("Tutorial", "vanilla", function () pfUI:RegisterSkin("Tutorial", "vanilla:tbc", function ()
CreateBackdrop(TutorialFrame, nil, true, .75) CreateBackdrop(TutorialFrame, nil, true, .75)
CreateBackdropShadow(TutorialFrame) CreateBackdropShadow(TutorialFrame)
@@ -49,7 +49,7 @@ pfUI:RegisterSkin("Tutorial", "vanilla", function ()
SkinButton(TutorialFrameOkayButton) SkinButton(TutorialFrameOkayButton)
end) end)
pfUI:RegisterSkin("Quest Timer", "vanilla", function () pfUI:RegisterSkin("Quest Timer", "vanilla:tbc", function ()
CreateBackdrop(QuestTimerFrame, nil, nil, .75) CreateBackdrop(QuestTimerFrame, nil, nil, .75)
CreateBackdropShadow(QuestTimerFrame) CreateBackdropShadow(QuestTimerFrame)
UpdateMovable(QuestTimerFrame, true) UpdateMovable(QuestTimerFrame, true)
+175
View File
@@ -0,0 +1,175 @@
pfUI:RegisterSkin("Options - Interface", "tbc", function ()
local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
StripTextures(InterfaceOptionsFrame)
CreateBackdrop(InterfaceOptionsFrame, nil, nil, .75)
CreateBackdropShadow(InterfaceOptionsFrame)
EnableMovable(InterfaceOptionsFrame)
InterfaceOptionsFrameHeaderText:ClearAllPoints()
InterfaceOptionsFrameHeaderText:SetPoint("TOP", InterfaceOptionsFrame.backdrop, "TOP", 0, -10)
StripTextures(InterfaceOptionsFrameCategories)
CreateBackdrop(InterfaceOptionsFrameCategories, nil, true, .75)
StripTextures(InterfaceOptionsFrameAddOns)
CreateBackdrop(InterfaceOptionsFrameAddOns, nil, true, .75)
CreateBackdrop(InterfaceOptionsFramePanelContainer, nil, true, .75)
SkinTab(InterfaceOptionsFrameTab1)
InterfaceOptionsFrameTab1:ClearAllPoints()
InterfaceOptionsFrameTab1:SetPoint("BOTTOMLEFT", InterfaceOptionsFrameCategories, "TOPLEFT", bpad, border + (border == 1 and 1 or 2))
SkinTab(InterfaceOptionsFrameTab2)
InterfaceOptionsFrameTab2:ClearAllPoints()
InterfaceOptionsFrameTab2:SetPoint("LEFT", InterfaceOptionsFrameTab1, "RIGHT", border*2 + 1, 0)
SkinButton(InterfaceOptionsFrameDefaults)
InterfaceOptionsFrameDefaults:ClearAllPoints()
InterfaceOptionsFrameDefaults:SetPoint("TOPLEFT", InterfaceOptionsFrameCategories, "BOTTOMLEFT", 0, -10)
SkinButton(InterfaceOptionsFrameCancel)
InterfaceOptionsFrameCancel:ClearAllPoints()
InterfaceOptionsFrameCancel:SetPoint("TOPRIGHT", InterfaceOptionsFramePanelContainer, "BOTTOMRIGHT", 0, -10)
SkinButton(InterfaceOptionsFrameOkay)
InterfaceOptionsFrameOkay:ClearAllPoints()
InterfaceOptionsFrameOkay:SetPoint("RIGHT", InterfaceOptionsFrameCancel, "LEFT", -2*bpad, 0)
-- universal code for handling any frames!
local function SkinAllObjects(frame)
for _,obj in ipairs({frame:GetChildren()}) do
local obj_type = obj:GetObjectType()
if obj_type == "CheckButton" then
local size = obj:GetHeight()
if size > 26 then size = 26 end
SkinCheckbox(obj, size)
elseif obj_type == "Button" then
SkinButton(obj)
elseif obj_type == "Slider" then
SkinSlider(obj)
elseif obj_type == "Frame" then
local name = obj.GetName and obj:GetName()
if name and _G[name.."Button"] then
SkinDropDown(obj)
else
SkinAllObjects(obj)
end
end
end
end
local blizzardCategories = {
InterfaceOptionsControlsPanel, InterfaceOptionsCombatPanel, InterfaceOptionsDisplayPanel,
InterfaceOptionsQuestsPanel, InterfaceOptionsSocialPanel, InterfaceOptionsActionBarsPanel,
InterfaceOptionsNamesPanel, InterfaceOptionsCombatTextPanel, InterfaceOptionsStatusTextPanel,
InterfaceOptionsPartyRaidPanel, InterfaceOptionsCameraPanel, InterfaceOptionsMousePanel,
InterfaceOptionsHelpPanel, InterfaceOptionsLanguagesPanel
}
for _,frame in ipairs(blizzardCategories) do
SkinAllObjects(frame)
end
-- skin the option panel of any addon
for _,frame in pairs(INTERFACEOPTIONS_ADDONCATEGORIES) do
SkinAllObjects(frame)
end
end)
pfUI:RegisterSkin("Options - Interface", "vanilla", function ()
local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
UIOptionsFrame:SetParent(UIParent)
UIOptionsFrame:SetWidth(1024)
UIOptionsFrame:SetHeight(700)
StripTextures(UIOptionsFrame)
CreateBackdrop(UIOptionsFrame, nil, nil, .75)
CreateBackdropShadow(UIOptionsFrame)
EnableMovable(UIOptionsFrame)
HookScript(UIOptionsFrame, "OnShow", function()
this:ClearAllPoints()
this:SetPoint("CENTER", 0, 0)
end)
UIOptionsFrame.backdrop:SetPoint("BOTTOMRIGHT", 0, 50)
UIOptionsFrame:SetHitRectInsets(0,0,0,50)
-- increase button layer
UIOptionsFrameTab1:SetFrameLevel(8)
UIOptionsFrameTab2:SetFrameLevel(8)
UIOptionsFrameDefaults:SetFrameLevel(8)
UIOptionsFrameCancel:SetFrameLevel(8)
UIOptionsFrameOkay:SetFrameLevel(8)
local close = GetNoNameObject(UIOptionsFrame, "Button", nil, "UI-Panel-MinimizeButton-Up")
if close then
close:SetFrameLevel(8)
SkinCloseButton(close, UIOptionsFrame.backdrop, -6, -6)
end
if UIOptionsFrameTitle then
UIOptionsFrameTitle:ClearAllPoints()
UIOptionsFrameTitle:SetPoint("TOP", UIOptionsFrame.backdrop, "TOP", 0, -10)
end
SkinTab(UIOptionsFrameTab1)
UIOptionsFrameTab1:ClearAllPoints()
UIOptionsFrameTab1:SetPoint("TOPLEFT", UIOptionsFrame.backdrop, "TOPLEFT", 20, -20)
UIOptionsFrameTab1:SetScript("OnClick", function()
PanelTemplates_Tab_OnClick(UIOptionsFrame)
BasicOptions:Show()
AdvancedOptions:Hide()
PlaySound("igCharacterInfoTab")
end)
SkinTab(UIOptionsFrameTab2)
UIOptionsFrameTab2:ClearAllPoints()
UIOptionsFrameTab2:SetPoint("LEFT", UIOptionsFrameTab1, "RIGHT", border*2 + 1, 0)
UIOptionsFrameTab2:SetScript("OnClick", function()
PanelTemplates_Tab_OnClick(UIOptionsFrame)
BasicOptions:Hide()
AdvancedOptions:Show()
PlaySound("igCharacterInfoTab")
end)
UIOptionsFrameCheckButton1:ClearAllPoints() -- Invert Mouse button
UIOptionsFrameCheckButton1:SetPoint("TOPLEFT", UIOptionsFrameSlider1, "TOPRIGHT", 38, 14)
for i=1, 69 do
local buton = _G["UIOptionsFrameCheckButton"..i]
if buton then
SkinCheckbox(buton)
end
end
for i=1, 4 do
SkinSlider(_G["UIOptionsFrameSlider"..i])
end
CreateBackdrop(BasicOptionsGeneral, nil, true, .75)
CreateBackdrop(BasicOptionsDisplay, nil, true, .75)
CreateBackdrop(BasicOptionsCamera, nil, true, .75)
CreateBackdrop(BasicOptionsHelp, nil, true, .75)
CreateBackdrop(AdvancedOptionsActionBars, nil, true, .75)
CreateBackdrop(AdvancedOptionsChat, nil, true, .75)
CreateBackdrop(AdvancedOptionsRaid, nil, true, .75)
CreateBackdrop(AdvancedOptionsCombatText, nil, true, .75)
SkinDropDown(UIOptionsFrameClickCameraDropDown)
SkinDropDown(UIOptionsFrameCameraDropDown)
SkinDropDown(UIOptionsFrameTargetofTargetDropDown)
SkinDropDown(UIOptionsFrameCombatTextDropDown)
SkinButton(UIOptionsFrameResetTutorials)
SkinButton(UIOptionsFrameDefaults)
UIOptionsFrameDefaults:ClearAllPoints()
UIOptionsFrameDefaults:SetPoint("BOTTOMLEFT", UIOptionsFrame.backdrop, "BOTTOMLEFT", 14, 14)
SkinButton(UIOptionsFrameCancel)
UIOptionsFrameCancel:ClearAllPoints()
UIOptionsFrameCancel:SetPoint("BOTTOMRIGHT", UIOptionsFrame.backdrop, "BOTTOMRIGHT", -14, 14)
SkinButton(UIOptionsFrameOkay)
UIOptionsFrameOkay:ClearAllPoints()
UIOptionsFrameOkay:SetPoint("RIGHT", UIOptionsFrameCancel, "LEFT", -2*bpad, 0)
end)
+33 -11
View File
@@ -1,18 +1,40 @@
pfUI:RegisterSkin("Options - Sound", "vanilla", function () pfUI:RegisterSkin("Options - Sound", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
local SoundOptionsFrameHeaderText = GetNoNameObject(SoundOptionsFrame, "FontString", "ARTWORK", SOUNDOPTIONS_MENU) -- Compatibility
local NUM_CHECKBOXES = 8 local SoundOptionsFrameHeaderText, NUM_CHECKBOXES, NUM_SLIDERS
local NUM_SLIDERS = 4 if SOUND_OPTIONS then -- tbc
SoundOptionsFrameHeaderText = GetNoNameObject(SoundOptionsFrame, "FontString", "BACKGROUND", SOUND_OPTIONS)
NUM_CHECKBOXES = 11
NUM_SLIDERS = 6
SoundOptionsFrameOkay:ClearAllPoints() StripTextures(AudioOptionsFrame)
SoundOptionsFrameOkay:SetPoint("RIGHT", SoundOptionsFrameCancel, "LEFT", -2*bpad, 0) CreateBackdrop(SoundOptionsFramePlayback, nil, true, .75)
SoundOptionsFrameSlider1:ClearAllPoints() CreateBackdrop(SoundOptionsFrameHardware, nil, true, .75)
SoundOptionsFrameSlider1:SetPoint("TOPRIGHT", SoundOptionsFrame, "TOPRIGHT", -18, -43) CreateBackdrop(SoundOptionsFrameVolume, nil, true, .75)
for i=2, NUM_SLIDERS do
_G["SoundOptionsFrameSlider"..i]:ClearAllPoints() SkinDropDown(SoundOptionsOutputDropDown)
_G["SoundOptionsFrameSlider"..i]:SetPoint("TOP", _G["SoundOptionsFrameSlider"..i-1], "BOTTOM", 0, -30)
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 end
StripTextures(SoundOptionsFrame) StripTextures(SoundOptionsFrame)
+37 -11
View File
@@ -1,19 +1,45 @@
pfUI:RegisterSkin("Options - Video", "vanilla", function () pfUI:RegisterSkin("Options - Video", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
local MAX_SLIDERS = 9 -- Compatibility
local MAX_CHECKBOXES = 18 local MAX_SLIDERS, MAX_CHECKBOXES
if OptionsFrameSlider10 then -- tbc
MAX_SLIDERS = 11
MAX_CHECKBOXES = 19
for i=1, MAX_SLIDERS do for i=1, MAX_SLIDERS do
local slider = _G["OptionsFrameSlider"..i] local slider = _G["OptionsFrameSlider"..i]
local shift = 0 local shift = 0
if i == 1 or i == 6 then shift = 4 if i == 4 or i == 5 or i == 7 or i == 8 or i == 10 or i == 11 then shift = 10 end
elseif i == 4 or i == 8 then shift = 10 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 end
local point, anchor, anchorPoint, x, y = slider:GetPoint()
slider:ClearAllPoints()
slider:SetPoint(point, anchor, anchorPoint, x, y - shift)
end end
CreateBackdrop(OptionsFrame, nil, nil, .75) CreateBackdrop(OptionsFrame, nil, nil, .75)
+8 -1
View File
@@ -1,5 +1,12 @@
pfUI:RegisterSkin("Popup Dialogs", "vanilla", function () pfUI:RegisterSkin("Popup Dialogs", "vanilla:tbc", function ()
for i = 1, STATICPOPUP_NUMDIALOGS do 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] local dialog = _G["StaticPopup"..i]
CreateBackdrop(dialog, nil, true, .75) CreateBackdrop(dialog, nil, true, .75)
CreateBackdropShadow(dialog) CreateBackdropShadow(dialog)
+32 -2
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Profession", "vanilla", function () pfUI:RegisterSkin("Profession", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
@@ -219,7 +219,37 @@ pfUI:RegisterSkin("Profession", "vanilla", function ()
end) end)
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 -- build remaining tradeskills
for i = 9, _G[displayed] do for i = 9, _G[displayed] do
local button = _G[template..i] or CreateFrame("Button", template..i, frame, template.."ButtonTemplate") local button = _G[template..i] or CreateFrame("Button", template..i, frame, template.."ButtonTemplate")
+17 -4
View File
@@ -1,4 +1,4 @@
pfUI:RegisterSkin("Quest Log", "vanilla", function () pfUI:RegisterSkin("Quest Log", "vanilla:tbc", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() 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 _G.MAX_WATCHABLE_QUESTS = 20 -- TODO
do -- quest log frame do -- quest log frame
local QUEST_COUNT = QuestLogQuestCount -- Compatibility
local QUEST_COUNT
if QuestLogCount then -- tbc
QUEST_COUNT = QuestLogCount
QUEST_COUNT:ClearAllPoints() StripTextures(QUEST_COUNT)
QUEST_COUNT:SetPoint("TOPRIGHT", -10, -30) 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() hooksecurefunc("QuestLog_OnShow", function()
QuestLogFrame:ClearAllPoints() QuestLogFrame:ClearAllPoints()
+8 -2
View File
@@ -1,6 +1,12 @@
pfUI:RegisterSkin("Readycheck", "vanilla", function () pfUI:RegisterSkin("Readycheck", "vanilla:tbc", function ()
HookAddonOrVariable("Blizzard_RaidUI", 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) StripTextures(ReadyCheckFrame, true)
CreateBackdrop(ReadyCheckFrame, nil, nil, .75) CreateBackdrop(ReadyCheckFrame, nil, nil, .75)

Some files were not shown because too many files have changed in this diff Show More