Files
Nanami-Plates/Core.lua
2026-03-20 10:20:05 +08:00

216 lines
7.9 KiB
Lua

NanamiPlates = {}
NanamiPlates.modules = {}
NanamiPlates.registry = {}
local pairs = pairs
local tostring = tostring
local CreateFrame = CreateFrame
local superwow_active = (SpellInfo ~= nil) or (UnitGUID ~= nil) or (SUPERWOW_VERSION ~= nil)
NanamiPlates.superwow_active = superwow_active
local _, playerClass = UnitClass("player")
playerClass = playerClass or ""
NanamiPlates.playerClass = playerClass
NanamiPlates.castDB = {}
NanamiPlates.castTracker = {}
NanamiPlates.debuffTracker = {}
NanamiPlates.recentMeleeCrits = {}
NanamiPlates.recentMeleeHits = {}
NanamiPlates.playerClassCache = {}
NanamiPlates.playerRole = "DPS"
local function Print(msg)
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("|cffff88cc[Nanami-Plates]|r " .. tostring(msg))
end
end
NanamiPlates.Print = Print
local function HookScript(frame, script, func)
local prev = frame:GetScript(script)
frame:SetScript(script, function(a1, a2, a3, a4, a5, a6, a7, a8, a9)
if prev then prev(a1, a2, a3, a4, a5, a6, a7, a8, a9) end
func(a1, a2, a3, a4, a5, a6, a7, a8, a9)
end)
end
NanamiPlates.HookScript = HookScript
local function DisableShaguTweaksNameplates()
if ShaguTweaks and ShaguTweaks.libnameplate then
ShaguTweaks.libnameplate:SetScript("OnUpdate", nil)
ShaguTweaks.libnameplate.OnInit = {}
ShaguTweaks.libnameplate.OnShow = {}
ShaguTweaks.libnameplate.OnUpdate = {}
ShaguTweaks.libnameplate.disabled_by_nanamiplates = true
return true
end
return false
end
local function DisablePfUINameplates()
if pfUI then
if pfUI.modules then pfUI.modules["nameplates"] = nil end
if pfNameplates then
pfNameplates:Hide()
pfNameplates:UnregisterAllEvents()
end
if pfUI.nameplates then pfUI.nameplates = nil end
return true
end
return false
end
DisableShaguTweaksNameplates()
DisablePfUINameplates()
local function GetPlayerClassByName(name)
if not name then return nil end
local cache = NanamiPlates.playerClassCache
if cache[name] then return cache[name] end
local playerName = UnitName("player")
if name == playerName then
cache[name] = playerClass
return playerClass
end
local numRaid = GetNumRaidMembers()
if numRaid > 0 then
for i = 1, numRaid do
local raidName, _, _, _, _, raidClass = GetRaidRosterInfo(i)
if raidName == name then
cache[name] = raidClass
return raidClass
end
end
else
local numParty = GetNumPartyMembers()
for i = 1, numParty do
local partyUnit = "party" .. i
if UnitExists(partyUnit) then
local partyName = UnitName(partyUnit)
if partyName == name then
local _, partyClass = UnitClass(partyUnit)
cache[name] = partyClass
return partyClass
end
end
end
end
return nil
end
NanamiPlates.GetPlayerClassByName = GetPlayerClassByName
local NP_EventFrame = CreateFrame("Frame", "NanamiPlatesFrame", UIParent)
NP_EventFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
NP_EventFrame:RegisterEvent("ADDON_LOADED")
NP_EventFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
NP_EventFrame:RegisterEvent("UNIT_AURA")
NP_EventFrame:RegisterEvent("PARTY_MEMBERS_CHANGED")
NP_EventFrame:RegisterEvent("RAID_ROSTER_UPDATE")
NP_EventFrame:RegisterEvent("PLAYER_LEVEL_UP")
NP_EventFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
NP_EventFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
NP_EventFrame:RegisterEvent("UNIT_CASTEVENT")
NP_EventFrame:RegisterEvent("SPELLCAST_STOP")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_FAILED_LOCALPLAYER")
NP_EventFrame:RegisterEvent("CHARACTER_POINTS_CHANGED")
NP_EventFrame:RegisterEvent("QUEST_LOG_UPDATE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_PARTY_DAMAGE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_TRADESKILLS")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_OTHER")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_SELF")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_PARTY_BUFF")
NP_EventFrame:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_SELF_BUFF")
NP_EventFrame:RegisterEvent("CHAT_MSG_COMBAT_SELF_HITS")
NP_EventFrame:RegisterEvent("CHAT_MSG_COMBAT_PARTY_HITS")
NP_EventFrame:RegisterEvent("CHAT_MSG_COMBAT_FRIENDLYPLAYER_HITS")
NP_EventFrame:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_CREATURE_HITS")
NP_EventFrame:RegisterEvent("CHAT_MSG_COMBAT_SELF_RANGED_HITS")
NP_EventFrame:RegisterEvent("CHAT_MSG_COMBAT_PARTY_RANGED_HITS")
NanamiPlates.EventFrame = NP_EventFrame
NanamiPlates.SPELL_EVENTS = {
["CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_PARTY_DAMAGE"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE"] = true,
["CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF"] = true,
["CHAT_MSG_SPELL_SELF_DAMAGE"] = true,
["CHAT_MSG_SPELL_TRADESKILLS"] = true,
["CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE"] = true,
["CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE"] = true,
["CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE"] = true,
["CHAT_MSG_SPELL_AURA_GONE_OTHER"] = true,
["CHAT_MSG_SPELL_AURA_GONE_SELF"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_PARTY_BUFF"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_SELF_BUFF"] = true,
["CHAT_MSG_SPELL_FAILED_LOCALPLAYER"] = true,
}
NanamiPlates.SPELL_DAMAGE_EVENTS = {
["CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_PARTY_DAMAGE"] = true,
["CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE"] = true,
["CHAT_MSG_SPELL_SELF_DAMAGE"] = true,
["CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE"] = true,
["CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE"] = true,
["CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE"] = true,
}
NanamiPlates.COMBAT_EVENTS = {
["CHAT_MSG_COMBAT_SELF_HITS"] = true,
["CHAT_MSG_COMBAT_PARTY_HITS"] = true,
["CHAT_MSG_COMBAT_FRIENDLYPLAYER_HITS"] = true,
["CHAT_MSG_COMBAT_CREATURE_VS_CREATURE_HITS"] = true,
["CHAT_MSG_COMBAT_SELF_RANGED_HITS"] = true,
["CHAT_MSG_COMBAT_PARTY_RANGED_HITS"] = true,
}
NanamiPlates.STUN_EFFECTS = {
"Cheap Shot", "Kidney Shot", "Bash", "Hammer of Justice",
"Charge Stun", "Intercept Stun", "Concussion Blow",
"Gouge", "Sap", "Pounce"
}
NanamiPlates.REMOVE_PENDING_PATTERNS = {
SPELLIMMUNESELFOTHER or "%s is immune to your %s.",
IMMUNEDAMAGECLASSSELFOTHER or "%s is immune to your %s damage.",
SPELLMISSSELFOTHER or "Your %s missed %s.",
SPELLRESISTSELFOTHER or "Your %s was resisted by %s.",
SPELLEVADEDSELFOTHER or "Your %s was evaded by %s.",
SPELLDODGEDSELFOTHER or "Your %s was dodged by %s.",
SPELLDEFLECTEDSELFOTHER or "Your %s was deflected by %s.",
SPELLREFLECTSELFOTHER or "Your %s was reflected back by %s.",
SPELLPARRIEDSELFOTHER or "Your %s was parried by %s.",
SPELLLOGABSORBSELFOTHER or "Your %s is absorbed by %s.",
}
NanamiPlates.TANK_CLASSES = {
["Warrior"] = true,
["Paladin"] = true,
["Druid"] = true,
["Shaman"] = true,
}
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("|cffff88cc[Nanami-Plates]|r Loading...")
end