mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-25 05:20:49 +00:00
6.2.2 push
For more informations read the readme please!
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# pfUI - Turtle WoW Edition
|
# pfUI - Turtle WoW Edition
|
||||||
|
|
||||||
[](https://github.com/me0wg4ming/pfUI)
|
[](https://github.com/me0wg4ming/pfUI)
|
||||||
[](https://turtlecraft.gg/)
|
[](https://turtlecraft.gg/)
|
||||||
[](https://github.com/balakethelock/SuperWoW)
|
[](https://github.com/balakethelock/SuperWoW)
|
||||||
[](https://gitea.com/avitasia/nampower)
|
[](https://gitea.com/avitasia/nampower)
|
||||||
@@ -14,6 +14,33 @@ This version includes significant performance improvements, DLL-enhanced feature
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## What's New in Version 6.2.2 (January 10, 2026)
|
||||||
|
|
||||||
|
### 🎯 Failed Spell Detection (libdebuff.lua)
|
||||||
|
|
||||||
|
- ✅ **Resist/Miss/Dodge/Parry Detection** - Spells that fail to land no longer create or update timers
|
||||||
|
- Detects: Miss, Resist, Dodge, Parry, Evade, Deflect, Reflect, Block, Absorb, Immune
|
||||||
|
- Timer is either blocked before creation or reverted if fail event arrives late
|
||||||
|
- ✅ **Public API: `libdebuff:DidSpellFail(spell)`** - Other modules can check if a spell recently failed
|
||||||
|
- Returns true if spell failed within the last 1 second
|
||||||
|
- Used by turtle-wow.lua for refresh mechanics
|
||||||
|
|
||||||
|
### 🐱 Druid/Warlock Refresh Fixes (turtle-wow.lua)
|
||||||
|
|
||||||
|
- ✅ **Ferocious Bite Refresh Fix** - Rip/Rake timers only refresh when Ferocious Bite actually hits
|
||||||
|
- Previously: Timer refreshed even on dodge/parry/miss
|
||||||
|
- Now: Uses `DidSpellFail()` to verify hit before refreshing
|
||||||
|
- ✅ **Conflagrate Refresh Fix** - Immolate duration only reduced when Conflagrate actually hits
|
||||||
|
- ✅ **Caster Inheritance** - Refresh mechanics preserve existing caster info when not explicitly provided
|
||||||
|
|
||||||
|
### ⚡ SuperWoW Compatibility (superwow.lua)
|
||||||
|
|
||||||
|
- ✅ **Removed UNIT_CASTEVENT for DoT Timers** - SuperWoW's instant event fires before resist/miss detection
|
||||||
|
- DoT timers now use standard hook-based fallback (compatible with resist detection)
|
||||||
|
- HoT timers (Rejuvenation, Renew, etc.) still use SuperWoW for instant detection (buffs can't be resisted)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## What's New in Version 6.2.1 (January 10, 2026)
|
## What's New in Version 6.2.1 (January 10, 2026)
|
||||||
|
|
||||||
### 🎯 Debuff Timer Protection System (libdebuff.lua)
|
### 🎯 Debuff Timer Protection System (libdebuff.lua)
|
||||||
@@ -399,7 +426,7 @@ Same as original pfUI - free to use and modify.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Version:** 6.2.1
|
**Version:** 6.2.2
|
||||||
**Release Date:** January 10, 2026
|
**Release Date:** January 10, 2026
|
||||||
**Compatibility:** Turtle WoW 1.18.0
|
**Compatibility:** Turtle WoW 1.18.0
|
||||||
**Status:** Stable
|
**Status:** Stable
|
||||||
|
|||||||
+37
-10
@@ -29,6 +29,19 @@ local lastspell
|
|||||||
-- Speichert die Ranks der zuletzt gecasteten Spells (bleibt länger als pending)
|
-- Speichert die Ranks der zuletzt gecasteten Spells (bleibt länger als pending)
|
||||||
local lastCastRanks = {}
|
local lastCastRanks = {}
|
||||||
|
|
||||||
|
-- Speichert Spells die gefailed sind (miss/dodge/parry/etc.) für 1 Sekunde
|
||||||
|
local lastFailedSpells = {}
|
||||||
|
|
||||||
|
-- Prüft ob ein Spell kürzlich gefailed ist (öffentliche Funktion für andere Module)
|
||||||
|
function libdebuff:DidSpellFail(spell)
|
||||||
|
if not spell then return false end
|
||||||
|
local data = lastFailedSpells[spell]
|
||||||
|
if data and (GetTime() - data.time) < 1 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
-- Shared Debuffs: Diese werden von allen Spielern geteilt (nur einer kann drauf sein)
|
-- Shared Debuffs: Diese werden von allen Spielern geteilt (nur einer kann drauf sein)
|
||||||
-- Timer darf von anderen Spielern aktualisiert werden
|
-- Timer darf von anderen Spielern aktualisiert werden
|
||||||
local sharedDebuffs = {
|
local sharedDebuffs = {
|
||||||
@@ -166,6 +179,8 @@ function libdebuff:PersistPending(effect)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function libdebuff:RevertLastAction()
|
function libdebuff:RevertLastAction()
|
||||||
|
if lastspell and lastspell.effect then
|
||||||
|
end
|
||||||
lastspell.start = lastspell.start_old
|
lastspell.start = lastspell.start_old
|
||||||
lastspell.start_old = nil
|
lastspell.start_old = nil
|
||||||
libdebuff:UpdateUnits()
|
libdebuff:UpdateUnits()
|
||||||
@@ -184,6 +199,13 @@ function libdebuff:AddEffect(unit, unitlevel, effect, duration, caster, rank)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not unit or not effect then return end
|
if not unit or not effect then return end
|
||||||
|
|
||||||
|
-- SCHUTZ: Wenn der Spell gerade gefailed ist (miss/dodge/parry/etc.), nicht anwenden
|
||||||
|
-- Nur für eigene Spells prüfen, nicht für andere Spieler
|
||||||
|
if caster == "player" and libdebuff:DidSpellFail(effect) then
|
||||||
|
return -- Spell hat nicht getroffen, keinen Timer setzen
|
||||||
|
end
|
||||||
|
|
||||||
unitlevel = unitlevel or 0
|
unitlevel = unitlevel or 0
|
||||||
if not libdebuff.objects[unit] then libdebuff.objects[unit] = {} end
|
if not libdebuff.objects[unit] then libdebuff.objects[unit] = {} end
|
||||||
if not libdebuff.objects[unit][unitlevel] then libdebuff.objects[unit][unitlevel] = {} end
|
if not libdebuff.objects[unit][unitlevel] then libdebuff.objects[unit][unitlevel] = {} end
|
||||||
@@ -306,19 +328,24 @@ libdebuff:SetScript("OnEvent", function()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Update Pending Spells
|
-- Update Pending Spells und tracke failed spells
|
||||||
elseif event == "CHAT_MSG_SPELL_FAILED_LOCALPLAYER" or event == "CHAT_MSG_SPELL_SELF_DAMAGE" then
|
elseif event == "CHAT_MSG_SPELL_FAILED_LOCALPLAYER" or event == "CHAT_MSG_SPELL_SELF_DAMAGE" then
|
||||||
-- Remove pending spell
|
-- Prüfe ob ein Spell gefailed ist und speichere ihn
|
||||||
for _, msg in pairs(libdebuff.rp) do
|
for _, msg in pairs(libdebuff.rp) do
|
||||||
local effect = cmatch(arg1, msg)
|
local effect = cmatch(arg1, msg)
|
||||||
if effect and libdebuff.pending[3] == effect then
|
if effect then
|
||||||
-- instant removal of the pending spell
|
-- Speichere den failed spell für 1 Sekunde
|
||||||
libdebuff:RemovePending()
|
lastFailedSpells[effect] = { time = GetTime() }
|
||||||
return
|
|
||||||
elseif effect and lastspell and lastspell.start_old and lastspell.effect == effect then
|
-- Bestehende Logik: Remove pending spell
|
||||||
-- late removal of debuffs (e.g hunter arrows as they hit late)
|
if libdebuff.pending[3] == effect then
|
||||||
libdebuff:RevertLastAction()
|
libdebuff:RemovePending()
|
||||||
return
|
return
|
||||||
|
elseif lastspell and lastspell.start_old and lastspell.effect == effect then
|
||||||
|
-- late removal of debuffs (e.g hunter arrows as they hit late)
|
||||||
|
libdebuff:RevertLastAction()
|
||||||
|
return
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif event == "SPELLCAST_STOP" then
|
elseif event == "SPELLCAST_STOP" then
|
||||||
|
|||||||
+4
-24
@@ -300,30 +300,10 @@ pfUI:RegisterModule("superwow", "vanilla", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Enhance libdebuff with SuperWoW data
|
-- NOTE: SuperWoW libdebuff enhancement removed.
|
||||||
local superdebuff = CreateFrame("Frame")
|
-- UNIT_CASTEVENT fires before resist/miss/dodge events arrive,
|
||||||
superdebuff:RegisterEvent("UNIT_CASTEVENT")
|
-- which breaks the failed spell detection system in libdebuff.
|
||||||
superdebuff:SetScript("OnEvent", function()
|
-- DoT timers use the standard hook-based fallback instead.
|
||||||
-- variable assignments
|
|
||||||
local caster, target, event, spell, duration = arg1, arg2, arg3, arg4
|
|
||||||
|
|
||||||
-- skip other caster and empty target events
|
|
||||||
local _, guid = UnitExists("player")
|
|
||||||
if caster ~= guid then return end
|
|
||||||
if event ~= "CAST" then return end
|
|
||||||
if not target or target == "" then return end
|
|
||||||
|
|
||||||
-- assign all required data
|
|
||||||
local unit = UnitName(target)
|
|
||||||
local unitlevel = UnitLevel(target)
|
|
||||||
if not SpellInfo then return end
|
|
||||||
local effect, rank = SpellInfo(spell)
|
|
||||||
local duration = libdebuff:GetDuration(effect, rank)
|
|
||||||
local caster = "player"
|
|
||||||
|
|
||||||
-- add effect to current debuff data
|
|
||||||
libdebuff:AddEffect(unit, unitlevel, effect, duration, caster)
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- TrackUnit API for adding group members to minimap
|
-- TrackUnit API for adding group members to minimap
|
||||||
-- Tracks friendly units on the minimap for easier group coordination
|
-- Tracks friendly units on the minimap for easier group coordination
|
||||||
|
|||||||
@@ -33,8 +33,9 @@ pfUI:RegisterModule("turtle-wow", "vanilla", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- refresh rip and rake duration on ferocious bite (Turtle WoW feature)
|
-- refresh rip and rake duration on ferocious bite (Turtle WoW feature)
|
||||||
|
-- Only refresh if Ferocious Bite actually hit (not missed/dodged/parried/etc.)
|
||||||
local match = string.find(arg1, "Ferocious Bite")
|
local match = string.find(arg1, "Ferocious Bite")
|
||||||
if match and arg2 then
|
if match and arg2 and not libdebuff:DidSpellFail("Ferocious Bite") then
|
||||||
local name = UnitName("target")
|
local name = UnitName("target")
|
||||||
local level = UnitLevel("target")
|
local level = UnitLevel("target")
|
||||||
|
|
||||||
@@ -52,9 +53,9 @@ pfUI:RegisterModule("turtle-wow", "vanilla", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- refresh Immolate duration after cast Conflagrate
|
-- refresh Immolate duration after cast Conflagrate
|
||||||
|
-- Only refresh if Conflagrate actually hit
|
||||||
local conflagrate = string.find(string.sub(arg1,6,17), "Conflagrate")
|
local conflagrate = string.find(string.sub(arg1,6,17), "Conflagrate")
|
||||||
--arg2 is spell dmg when it hits, nil when it misses
|
if conflagrate and arg2 and not libdebuff:DidSpellFail("Conflagrate") then
|
||||||
if conflagrate and arg2 then
|
|
||||||
local name = UnitName("target")
|
local name = UnitName("target")
|
||||||
local level = UnitLevel("target")
|
local level = UnitLevel("target")
|
||||||
if libdebuff.objects[name] and libdebuff.objects[name][level] and libdebuff.objects[name][level]["Immolate"] then
|
if libdebuff.objects[name] and libdebuff.objects[name][level] and libdebuff.objects[name][level]["Immolate"] then
|
||||||
|
|||||||
+1
-1
@@ -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: 6.2.1
|
## Version: 6.2.2
|
||||||
## 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
|
||||||
|
|
||||||
|
|||||||
@@ -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: 6.2.1
|
## Version: 6.2.2
|
||||||
## 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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user