vanilla-wow-addons – Rev 1
?pathlinks?
Necronomicon = AceAddonClass:new({
name = NECRONOMICON_CONST.Title,
description = NECRONOMICON_CONST.Desc,
version = NECRONOMICON_CONST.Version,
releaseDate = "",
aceCompatible = 103,
author = "Ammo",
email = "wouter@ctlaltdel.nl",
website = "http://www.wowace.com",
category = "interface",
db = AceDbClass:new("NecronomiconDB"),
cmd = AceChatCmdClass:new(NECRONOMICON_CONST.ChatCmd,NECRONOMICON_CONST.ChatOpt),
----------------------------
-- Module Loadup --
----------------------------
Initialize = function(self)
self.Compost = CompostLib:GetInstance("compost-1")
self.Metrognome = Metrognome:GetInstance("1")
self.Metrognome:Register("Necronomicon", self.Heartbeat, NECRONOMICON_CONST.UpdateInterval, self )
end,
Enable = function(self)
if( UnitClass("player") == NECRONOMICON_CONST.Pattern.Warlock ) then
self.shardcount = 0
self.healthstone = {}
self.soulstone = {}
self.spellstone = {}
self.firestone = {}
self.spells = {}
self.timers = {}
self.timerstext = ""
self.lastupdate = 0
self.currentspell = {}
self.mounttype = 0
self.hasdemons = nil
self.soulstonetimer = nil
self.soulstonetarget = nil
self.soulstonestate = nil
if( not self:GetOpt("firsttimedone") ) then
self:SetOpt("timers", TRUE)
self:SetOpt("firsttimedone", TRUE)
end
self:ScanSpells()
self:ScanStones()
self:SetupFrames()
self.frames.main:Show()
self:UpdateButtons()
self:RegisterEvent("BAG_UPDATE")
self:RegisterEvent("NECRONOMICON_BAG_UPDATE")
self:RegisterEvent("SPELLS_CHANGED")
self:RegisterEvent("LEARNED_SPELL_IN_TAB", "SPELLS_CHANGED")
self:RegisterEvent("SPELLCAST_START")
self:RegisterEvent("SPELLCAST_FAILED")
self:RegisterEvent("SPELLCAST_INTERRUPTED")
self:RegisterEvent("SPELLCAST_CHANNEL_START")
-- self:RegisterEvent("SPELLCAST_CHANNEL_STOP")
self:RegisterEvent("SPELLCAST_STOP")
self:RegisterEvent("PLAYER_REGEN_ENABLED")
self:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS")
self:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE")
self:Hook("CastSpell", "OnCastSpell", Necronomicon )
self:Hook("CastSpellByName", "OnCastSpellByName", Necronomicon )
self:Hook("UseAction", "OnUseAction", Necronomicon )
-- self:Hook("UseContainerItem", "OnUseContainerItem" )
if( self:GetOpt("timers") ) then
self.Metrognome:Start("Necronomicon")
self.frames.timers:Show()
else
self.frames.timers:Hide()
end
end
end,
Disable = function(self)
if( UnitClass("player") == NECRONOMICON_CONST.Pattern.Warlock ) then
-- Stop the heartbeat and hide our main frame
self.Metrognome:Stop("Necronomicon")
self.frames.main:Hide()
self.UnregisterAllEvents()
self:Unhook("CastSpell")
self:Unhook("CastSpellByName")
self:Unhook("UseAction")
-- self:Unhook("UseContainerItem")
end
end,
----------------------------
-- General --
----------------------------
GetGradient = function( self, perc )
local gradient = "|CFF00FF00" -- BrightGreen
if( perc < 10 ) then
gradient = "|CFFFF0000" -- Red
elseif( perc < 20 ) then
gradient = "|CFFFF3300" -- RedOrange
elseif( perc < 30 ) then
gradient = "|CFFFF6600" -- DarkOrange
elseif( perc < 40 ) then
gradient = "|CFFFF9933" -- DirtyOrange
elseif( perc < 50 ) then
gradient = "|CFFFFCC00" -- DarkYellow
elseif( perc < 60 ) then
gradient = "|CFFFFFF66" -- LightYellow
elseif( perc < 70 ) then
gradient = "|CFFCCFF66" -- YellowGreen
elseif( perc < 80 ) then
gradient = "|CFF99FF66" -- LightGreen
elseif( perc < 90 ) then
gradient = "|CFF66FF66" -- LighterGreen
end
return gradient
end,
ScanStones = function( self )
local bag
local shards = 0
local itemLink
self.Compost:Erase(self.healthstone)
self.Compost:Erase(self.soulstone)
self.Compost:Erase(self.spellstone)
self.Compost:Erase(self.firestone)
for bag = 4, 0, -1 do
local size = GetContainerNumSlots(bag)
if (size > 0) then
local slot
for slot=1, size, 1 do
if (GetContainerItemLink(bag,slot)) then
itemLink = GetContainerItemLink(bag,slot)
if( string.find( itemLink, NECRONOMICON_CONST.Pattern.Shard ) and
not string.find( itemLink, NECRONOMICON_CONST.Pattern.Corrupted ) ) then
shards = shards + 1
elseif( string.find( itemLink, NECRONOMICON_CONST.Pattern.Healthstone ) ) then
self.healthstone[0] = bag
self.healthstone[1] = slot
elseif( string.find( itemLink, NECRONOMICON_CONST.Pattern.Soulstone ) ) then
self.soulstone[0] = bag
self.soulstone[1] = slot
elseif( string.find( itemLink, NECRONOMICON_CONST.Pattern.Spellstone ) ) then
self.spellstone[0] = bag
self.spellstone[1] = slot
self.spellstone[2] = FALSE -- not equipped
elseif( string.find( itemLink, NECRONOMICON_CONST.Pattern.Firestone ) ) then
self.firestone[0] = bag
self.firestone[1] = slot
self.firestone[2] = FALSE -- not equipped
end
end
end
end
end
if( GetInventoryItemLink("player",GetInventorySlotInfo("SecondaryHandSlot") ) ) then
itemLink = GetInventoryItemLink("player",GetInventorySlotInfo("SecondaryHandSlot") )
if( string.find( itemLink, NECRONOMICON_CONST.Pattern.Spellstone ) ) then
self.spellstone[0] = TRUE
self.spellstone[1] = TRUE
self.spellstone[2] = TRUE -- equipped
elseif( string.find( itemLink, NECRONOMICON_CONST.Pattern.Firestone ) ) then
self.firestone[0] = TRUE
self.firestone[1] = TRUE
self.firestone[2] = TRUE -- equipped
end
end
self.shardcount = shards
end,
ScanSpells = function( self )
local spellName, spellRank, spellTotal, id, rank, maxrank, rankedSpell
local spellLevel = {}
self.spells.normal = {}
self.spells.timed = {}
self.spells.timedid = {}
self.spells.timedname = {}
self.spells.timeddisplay = {}
for id = 1, 180 do
rankedSpell = nil
spellName, spellRank = GetSpellName(id, "spell")
if (spellName) then
if( spellRank and spellRank ~= "" ) then
spellTotal = spellName .. " " .. spellRank
else
spellTotal = spellName
end
if( NECRONOMICON_CONST.Spell[spellName] ) then
self.spells.normal[NECRONOMICON_CONST.Spell[spellName]] = id
self.hasdemons = 1
end
-- self:Msg("Spell: ##"..spellTotal.."##")
if( NECRONOMICON_CONST.RankedSpell[spellTotal] ) then
local thistag, thislevel
thistag = NECRONOMICON_CONST.RankedSpell[spellTotal][1]
thislevel = NECRONOMICON_CONST.RankedSpell[spellTotal][2]
if( not spellLevel[thistag] or thislevel > spellLevel[thistag] ) then
self.spells.normal[thistag] = id
spellLevel[thistag] = thislevel
if( thistag == "MOUNT" ) then
self.mounttype = thislevel
end
end
end
if( NECRONOMICON_CONST.RankedSpell[spellName] ) then
rankedSpell = spellName
end
if( NECRONOMICON_CONST.RankedSpell[spellTotal] ) then
rankedSpell = spellTotal
end
if( rankedSpell ) then
local thistag, thislevel
thistag = NECRONOMICON_CONST.RankedSpell[rankedSpell][1]
thislevel = NECRONOMICON_CONST.RankedSpell[rankedSpell][2]
if( not spellLevel[thistag] or thislevel > spellLevel[thistag] ) then
self.spells.normal[thistag] = id
spellLevel[thistag] = thislevel
if( thistag == "MOUNT" ) then
self.mounttype = thislevel
end
end
end
if( NECRONOMICON_CONST.TimedSpell[spellName] ) then
maxrank = 0
if (string.find(spellRank, NECRONOMICON_CONST.Pattern.Rank )) then
for rank in string.gfind( spellRank, NECRONOMICON_CONST.Pattern.Rank ) do
rank = tonumber(rank)
if( rank > maxrank ) then
maxrank = rank
end
end
end
if( maxrank == 0 ) then
maxrank = 1
end
if( not spellLevel[spellName] or maxrank > spellLevel[spellName] ) then
self.spells.timedname[strlower(spellName)] = strlower(spellTotal)
end
self.spells.timedid[id] = strlower(spellTotal)
self.spells.timed[strlower(spellTotal)] = NECRONOMICON_CONST.TimedSpell[spellName][maxrank]
self.spells.timeddisplay[strlower(spellTotal)] = spellName
end
end
end
end,
GetTargetInfo = function( self )
local targetInfo = { }
if( UnitExists("target") ) then
targetInfo.Name = UnitName("target")
targetInfo.Sex = UnitSex("target")
targetInfo.Level = UnitLevel("target")
if( targetInfo.Level == -1 ) then targetInfo.Level = "??" end
targetInfo.Classification = UnitClassification("target")
if( targetInfo.Classification == "worldboss" ) then
targetInfo.Classification = "b+"
elseif( targetInfo.Classification == "rareelite" ) then
targetInfo.Classification = "r+"
elseif( targetInfo.Classification == "elite" ) then
targetInfo.Classification = "+"
elseif( targetInfo.Classification == "rare" ) then
targetInfo.Classification = "r"
else
targetInfo.Classification = ""
end
targetInfo.IsPlayer = UnitIsPlayer("target")
targetInfo.IsEnemy = UnitCanAttack("player", "target")
targetInfo.Id = targetInfo.Name..targetInfo.Sex..targetInfo.Level
targetInfo.Display = "["..targetInfo.Level..targetInfo.Classification.."] "..targetInfo.Name
return targetInfo
else
return FALSE
end
end,
RegisterSpellCast = function( self, spell )
if( not self:GetOpt("timers") ) then return end
if( self.currentspell.state and
self.currentspell.state == NECRONOMICON_CONST.State.Start ) then
-- We do nothing. This happens when you cast a spell with a duration and
-- after that cast another spell, which attempt to register with the timers.
-- the state will be > 1 when SPELLCAST_START has fired we are casting atm.
-- so ignore this cast.
return
end
-- We reset the current spellcast whatever happens next.
self.Compost:Erase( self.currentspell )
-- Not a valid spell? don't do a thing
if( not self.spells.timed[spell] ) then return end
-- If we don't have a target this spell is not worth monitoring for our purposes
local target = self:GetTargetInfo()
if( not target ) then return end
-- Valid Spell, Valid target
self.currentspell.state = NECRONOMICON_CONST.State.Cast
self.currentspell.target = target
self.currentspell.spell = spell
self.currentspell.spelldisplay = self.spells.timeddisplay[spell]
self.currentspell.duration = self.spells.timed[spell]
-- self:Msg( "Registered t:"..self.currentspell.target.Display.." s: "..self.currentspell.spell.." d: "..self.currentspell.duration )
end,
DeleteSoulstoneTimer = function( self )
self.soulstonetimer = nil
self.soulstonetarget = nil
if( self:GetOpt("soulstonesound") ) then
PlaySoundFile("Interface\\AddOns\\Necronomicon\\Sounds\\Soulstone.mp3")
end
end,
ClearTimers = function( self )
local i,j
for i in pairs( self.timers ) do
for j in pairs( self.timers[i] ) do
if( j ~= "name" and j ~= "nr" ) then
Timex:DeleteSchedule("Necronomicon Timers "..i..j)
end
end
end
self.Compost:Erase( self.timers )
end,
TimerDeleteSpell = function( self, mindex, sindex )
if( self.timers[mindex] ) then
if( self.timers[mindex][sindex] ) then
self.timers[mindex][sindex]["duration"] = nil
self.timers[mindex][sindex] = nil
self.timers[mindex]["nr"] = self.timers[mindex]["nr"] - 1
end
if( self.timers[mindex]["nr"] < 1 ) then
self.timers[mindex]["name"] = nil
self.timers[mindex]["nr"] = nil
self.timers[mindex] = nil
end
end
end,
TimerAddSpell = function( self )
local mindex = self.currentspell.target.Id
local sindex = self.currentspell.spelldisplay
if( self.timers[mindex] ) then
if( self.timers[mindex][sindex] ) then
-- self:Msg("AddSpell Updating "..mindex..sindex )
self.currentspell.state = NECRONOMICON_CONST.State.Update
self.currentspell.oldduration = Timex:ScheduleCheck("Necronomicon Timers "..mindex..sindex, TRUE)
Timex:DeleteSchedule("Necronomicon Timers "..mindex..sindex )
Timex:AddSchedule("Necronomicon Timers "..mindex..sindex, self.currentspell.duration, nil, nil, Necronomicon.TimerDeleteSpell, Necronomicon, mindex, sindex )
self.timers[mindex][sindex]["duration"] = self.currentspell.duration
else
-- self:Msg("AddSpell Newspell "..mindex..sindex )
self.currentspell.state = NECRONOMICON_CONST.State.NewSpell
self.timers[mindex][sindex] = {}
self.timers[mindex][sindex]["duration"] = self.currentspell.duration
self.timers[mindex]["nr"] = self.timers[mindex]["nr"] + 1
Timex:AddSchedule("Necronomicon Timers "..mindex..sindex, self.currentspell.duration, nil, nil, Necronomicon.TimerDeleteSpell, Necronomicon, mindex, sindex )
end
else
-- self:Msg("AddSpell Newmonster&spell "..mindex..sindex )
self.currentspell.state = NECRONOMICON_CONST.State.NewMonsterNewSpell
self.timers[mindex] = {}
self.timers[mindex]["nr"] = 0
self.timers[mindex]["name"] = self.currentspell.target.Display
self.timers[mindex][sindex] = {}
self.timers[mindex][sindex]["duration"] = self.currentspell.duration
self.timers[mindex]["nr"] = self.timers[mindex]["nr"] + 1
Timex:AddSchedule("Necronomicon Timers "..mindex..sindex, self.currentspell.duration, nil, nil, Necronomicon.TimerDeleteSpell, Necronomicon, mindex, sindex )
end
end,
TimerRollback = function( self )
local mindex = self.currentspell.target.Id
local sindex = self.currentspell.spelldisplay
local i
if( not mindex or not sindex ) then return end
if( self.currentspell.state == NECRONOMICON_CONST.State.NewMonsterNewSpell ) then
if( self.timers[mindex] and self.timers[mindex][sindex] ) then
self.timers[mindex][sindex]["duration"] = nil
self.timers[mindex][sindex] = nil
self.timers[mindex]["name"] = nil
self.timers[mindex]["nr"] = nil
self.timers[mindex] = nil
Timex:DeleteSchedule( "Necronomicon Timers "..mindex..sindex )
end
elseif( self.currentspell.state == NECRONOMICON_CONST.State.NewSpell ) then
if( self.timers[mindex] and self.timers[mindex][sindex] ) then
self.timers[mindex][sindex]["duration"] = nil
self.timers[mindex][sindex] = nil
self.timers[mindex]["nr"] = self.timers[mindex]["nr"] - 1
Timex:DeleteSchedule( "Necronomicon Timers "..mindex..sindex )
end
elseif( self.currentspell.state == NECRONOMICON_CONST.State.Update ) then
Timex:DeleteSchedule( "Necronomicon Timers "..mindex..sindex )
Timex:AddSchedule( "Necronomicon Timers "..mindex..sindex, (self.currentspell.duration - self.currentspell.oldduration), nil, nil, Necronomicon.TimerDeleteSpell, Necronomicon, mindex, sindex )
end
end,
SendChatMessage = function( self, msg )
if (GetNumRaidMembers() > 0) then
SendChatMessage(msg, "RAID");
elseif (GetNumPartyMembers() > 0) then
SendChatMessage(msg, "PARTY");
else
SendChatMessage(msg, "SAY");
end
end,
BuildTime = function( self, duration )
local minute
if( duration > 59 ) then
minute = floor( duration / 60 )
duration = duration - (minute *60)
else
minute = 0
end
if( minute < 10 ) then minute = "0"..minute end
if( duration < 10 ) then duration = "0"..duration end
return minute..":"..duration
end,
SummonDemon = function( self, spellid )
local modifier = self:GetOpt("feldommodifier")
local modused = nil
if( modifier == "ctrl" and IsControlKeyDown() ) then
modused = TRUE
elseif( modifier == "alt" and IsAltKeyDown() ) then
modused = TRUE
elseif( modifier == "shift" and IsShiftKeyDown() ) then
modused = TRUE
end
if( modused and self.spells.normal["FELDOMINATION"] ) then
local start, dur = GetSpellCooldown( self.spells.normal["FELDOMINATION"], BOOKTYPE_SPELL )
if( start == 0 and dur == 0 ) then
CastSpell(self.spells.normal["FELDOMINATION"], BOOKTYPE_SPELL )
SpellStopCasting()
end
end
CastSpell( spellid, BOOKTYPE_SPELL )
if( self:GetOpt("closeonclick") ) then
self:DemonsClicked()
end
end,
CastDemonsMenu = function( self, spellid )
CastSpell( spellid, BOOKTYPE_SPELL )
if( self:GetOpt("closeonclick") ) then
self:DemonsClicked()
end
end,
----------------------------
-- GUI Updating Functions --
----------------------------
SetupFrames = function( self )
local x, y
self.frames = {}
self.frames.main = CreateFrame( "Frame", nil, UIParent )
self.frames.main.owner = self
self.frames.main:Hide()
self.frames.main:EnableMouse(true)
self.frames.main:SetMovable(true)
self.frames.main:SetWidth(1)
self.frames.main:SetHeight(1)
if( self:GetOpt("mainx") and self:GetOpt("mainy") ) then
x = self:GetOpt("mainx")
y = self:GetOpt("mainy")
self.frames.main:SetPoint("TOPLEFT", UIParent, "TOPLEFT", x, y )
else
self.frames.main:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 150, -150)
end
-- Graphical Shardcounter
self.frames.shard = CreateFrame( "Button", nil, self.frames.main )
self.frames.shard.owner = self
self.frames.shard:SetWidth(64)
self.frames.shard:SetHeight(64)
self.frames.shard:SetPoint("CENTER", self.frames.main, "CENTER" )
self.frames.shard:RegisterForDrag("LeftButton")
self.frames.shard:SetScript("OnDragStart", function() this.owner.frames.main:StartMoving() end )
self.frames.shard:SetScript("OnDragStop",
function()
this.owner.frames.main:StopMovingOrSizing()
local _,_,_,x,y = this.owner.frames.main:GetPoint("CENTER")
this.owner:SetOpt("mainx", x)
this.owner:SetOpt("mainy", y)
end
)
-- Text inside the counter
self.frames.shardtext = self.frames.shard:CreateFontString(nil, "OVERLAY")
self.frames.shardtext.owner = self
self.frames.shardtext:SetFontObject(GameFontNormalSmall)
self.frames.shardtext:ClearAllPoints()
self.frames.shardtext:SetTextColor(1, 1, 1, 1)
self.frames.shardtext:SetWidth(64)
self.frames.shardtext:SetHeight(64)
self.frames.shardtext:SetPoint("TOPLEFT", self.frames.shard, "TOPLEFT")
self.frames.shardtext:SetJustifyH("CENTER")
self.frames.shardtext:SetJustifyV("MIDDLE")
-- Healthstone button
self.frames.healthstone = CreateFrame("Button", nil, self.frames.main )
self.frames.healthstone.owner = self
self.frames.healthstone:SetWidth(32)
self.frames.healthstone:SetHeight(32)
self.frames.healthstone:SetPoint("CENTER", self.frames.main, "CENTER", -14, -45 )
self.frames.healthstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\EmptyButton" )
self.frames.healthstone:SetHighlightTexture( "Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" )
self.frames.healthstone:SetScript("OnClick", function() this.owner:HealthstoneClicked() end )
-- Soulstone button
self.frames.soulstone = CreateFrame("Button", nil, self.frames.main )
self.frames.soulstone.owner = self
self.frames.soulstone:SetWidth(32)
self.frames.soulstone:SetHeight(32)
self.frames.soulstone:SetPoint("CENTER", self.frames.main, "CENTER", -40, -33 )
self.frames.soulstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\EmptyButton" )
self.frames.soulstone:SetHighlightTexture( "Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" )
self.frames.soulstone:SetScript("OnClick", function() this.owner:SoulstoneClicked() end )
-- Spellstone button
self.frames.spellstone = CreateFrame("Button", nil, self.frames.main )
self.frames.spellstone.owner = self
self.frames.spellstone:SetWidth(32)
self.frames.spellstone:SetHeight(32)
self.frames.spellstone:SetPoint("CENTER", self.frames.main, "CENTER", 14, -45 )
self.frames.spellstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\EmptyButton" )
self.frames.spellstone:SetHighlightTexture( "Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" )
self.frames.spellstone:SetScript("OnClick", function() this.owner:SpellstoneClicked() end )
-- Firestone button
self.frames.firestone = CreateFrame("Button", nil, self.frames.main )
self.frames.firestone.owner = self
self.frames.firestone:SetWidth(32)
self.frames.firestone:SetHeight(32)
self.frames.firestone:SetPoint("CENTER", self.frames.main, "CENTER", 40, -33 )
self.frames.firestone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\EmptyButton" )
self.frames.firestone:SetHighlightTexture( "Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" )
self.frames.firestone:SetScript("OnClick", function() this.owner:FirestoneClicked() end )
-- Demons button
self.frames.demons = CreateFrame("Button", nil, self.frames.main )
self.frames.demons.owner = self
self.frames.demons:SetWidth(32)
self.frames.demons:SetHeight(32)
self.frames.demons:SetPoint("CENTER", self.frames.main, "CENTER", -40, 33 )
self.frames.demons:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\EmptyButton" )
self.frames.demons:SetHighlightTexture( "Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" )
self.frames.demons:SetScript("OnClick", function() this.owner:DemonsClicked() end )
-- Mount button
self.frames.mount = CreateFrame("Button", nil, self.frames.main )
self.frames.mount.owner = self
self.frames.mount:SetWidth(32)
self.frames.mount:SetHeight(32)
self.frames.mount:SetPoint("CENTER", self.frames.main, "CENTER", -14, 45 )
self.frames.mount:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\EmptyButton" )
self.frames.mount:SetHighlightTexture( "Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" )
self.frames.mount:SetScript("OnClick", function() this.owner:MountClicked() end )
-- Demon Armor button
self.frames.armor = CreateFrame("Button", nil, self.frames.main )
self.frames.armor.owner = self
self.frames.armor:SetWidth(32)
self.frames.armor:SetHeight(32)
self.frames.armor:SetPoint("CENTER", self.frames.main, "CENTER", 14, 45 )
self.frames.armor:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\EmptyButton" )
self.frames.armor:SetHighlightTexture( "Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" )
self.frames.armor:SetScript("OnClick", function() this.owner:ArmorClicked() end )
-- Summon button
self.frames.summon = CreateFrame("Button", nil, self.frames.main )
self.frames.summon.owner = self
self.frames.summon:SetWidth(32)
self.frames.summon:SetHeight(32)
self.frames.summon:SetPoint("CENTER", self.frames.main, "CENTER", 40, 33 )
self.frames.summon:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\EmptyButton" )
self.frames.summon:SetHighlightTexture( "Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" )
self.frames.summon:SetScript("OnClick", function() this.owner:SummonClicked() end )
-- Teh Demons
self.frames.demonmenu = CreateFrame("Frame", nil, self.frames.demons )
self.frames.demonmenu.owner = self
self.frames.demonmenu:SetWidth(1)
self.frames.demonmenu:SetHeight(1)
self.frames.demonmenu:SetPoint("TOPRIGHT", self.frames.demons, "TOPLEFT" )
self.frames.demonmenu:Hide()
-- Imp
self.frames.imp = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.imp.owner = self
self.frames.imp:SetWidth(36)
self.frames.imp:SetHeight(36)
self.frames.imp:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_SummonImp")
self.frames.imp:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.imp:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", 0, 0 )
self.frames.imp:SetScript("OnClick", function() this.owner:SummonDemon( this.owner.spells.normal["IMP"] ) end )
-- Voidwalker
self.frames.voidwalker = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.voidwalker.owner = self
self.frames.voidwalker:SetWidth(36)
self.frames.voidwalker:SetHeight(36)
self.frames.voidwalker:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_SummonVoidwalker")
self.frames.voidwalker:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.voidwalker:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -36, 0 )
self.frames.voidwalker:SetScript("OnClick", function() this.owner:SummonDemon( this.owner.spells.normal["VOIDWALKER"] ) end )
-- Succubus
self.frames.succubus = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.succubus.owner = self
self.frames.succubus:SetWidth(36)
self.frames.succubus:SetHeight(36)
self.frames.succubus:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_SummonSuccubus")
self.frames.succubus:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.succubus:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -72, 0 )
self.frames.succubus:SetScript("OnClick", function() this.owner:SummonDemon( this.owner.spells.normal["SUCCUBUS"] ) end )
-- Felhunter
self.frames.felhunter = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.felhunter.owner = self
self.frames.felhunter:SetWidth(36)
self.frames.felhunter:SetHeight(36)
self.frames.felhunter:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_SummonFelhunter")
self.frames.felhunter:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.felhunter:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -108, 0 )
self.frames.felhunter:SetScript("OnClick", function() this.owner:SummonDemon( this.owner.spells.normal["FELHUNTER"] ) end )
-- Inferno
self.frames.inferno = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.inferno.owner = self
self.frames.inferno:SetWidth(36)
self.frames.inferno:SetHeight(36)
self.frames.inferno:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_SummonInfernal")
self.frames.inferno:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.inferno:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -108, -36 )
self.frames.inferno:SetScript("OnClick", function() this.owner:CastDemonsMenu( this.owner.spells.normal["INFERNO"] ) end )
-- Eye of Kilrogg
self.frames.kilrogg = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.kilrogg.owner = self
self.frames.kilrogg:SetWidth(36)
self.frames.kilrogg:SetHeight(36)
self.frames.kilrogg:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_EvilEye")
self.frames.kilrogg:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.kilrogg:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -72, -36 )
self.frames.kilrogg:SetScript("OnClick", function() this.owner:CastDemonsMenu( this.owner.spells.normal["KILROGG"] ) end )
-- Health Funnel
self.frames.healthfunnel = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.healthfunnel.owner = self
self.frames.healthfunnel:SetWidth(36)
self.frames.healthfunnel:SetHeight(36)
self.frames.healthfunnel:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_LifeDrain")
self.frames.healthfunnel:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.healthfunnel:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -36, -36 )
self.frames.healthfunnel:SetScript("OnClick", function() this.owner:CastDemonsMenu( this.owner.spells.normal["HEALTHFUNNEL"] ) end )
-- Ritual of Doom
self.frames.doomguard = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.doomguard.owner = self
self.frames.doomguard:SetWidth(36)
self.frames.doomguard:SetHeight(36)
self.frames.doomguard:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_AntiMagicShell")
self.frames.doomguard:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.doomguard:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -108, -72 )
self.frames.doomguard:SetScript("OnClick", function() this.owner:CastDemonsMenu( this.owner.spells.normal["DOOMGUARD"] ) end )
-- Fel Domination
self.frames.feldomination = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.feldomination.owner = self
self.frames.feldomination:SetWidth(36)
self.frames.feldomination:SetHeight(36)
self.frames.feldomination:SetNormalTexture( "Interface\\Icons\\Spell_Nature_RemoveCurse")
self.frames.feldomination:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.feldomination:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -0, -36 )
self.frames.feldomination:SetScript("OnClick", function() this.owner:CastDemonsMenu( this.owner.spells.normal["FELDOMINATION"] ) end )
-- Demonic Sacrifice
self.frames.demonicsacrifice = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.demonicsacrifice.owner = self
self.frames.demonicsacrifice:SetWidth(36)
self.frames.demonicsacrifice:SetHeight(36)
self.frames.demonicsacrifice:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_PsychicScream")
self.frames.demonicsacrifice:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.demonicsacrifice:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -0, -72 )
self.frames.demonicsacrifice:SetScript("OnClick", function() this.owner:CastDemonsMenu( this.owner.spells.normal["DEMONICSACRIFICE"] ) end )
-- Soul Link
self.frames.soullink = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.soullink.owner = self
self.frames.soullink:SetWidth(36)
self.frames.soullink:SetHeight(36)
self.frames.soullink:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_GatherShadows")
self.frames.soullink:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.soullink:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -36, -72 )
self.frames.soullink:SetScript("OnClick", function() this.owner:CastDemonsMenu( this.owner.spells.normal["SOULLINK"] ) end )
-- Enslave Demon
self.frames.enslave = CreateFrame("Button", nil, self.frames.demonmenu )
self.frames.enslave.owner = self
self.frames.enslave:SetWidth(36)
self.frames.enslave:SetHeight(36)
self.frames.enslave:SetNormalTexture( "Interface\\Icons\\Spell_Shadow_EnslaveDemon")
self.frames.enslave:SetHighlightTexture( "Interface\\Buttons\\ButtonHilight-Square" )
self.frames.enslave:SetPoint("TOPRIGHT", self.frames.demonmenu, "TOPLEFT", -72, -72 )
self.frames.enslave:SetScript("OnClick", function() this.owner:CastDemonsMenu( this.owner.spells.normal["ENSLAVE"] ) end )
-- Spelltimers
self.frames.timers = CreateFrame("Button", nil, self.frames.main )
self.frames.timers.owner = self
self.frames.timers:SetMovable(true)
self.frames.timers:EnableMouse(true)
self.frames.timers:SetWidth(150)
self.frames.timers:SetHeight(25)
self.frames.timers:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = false, tileSize = 16, edgeSize = 16,
insets = { left = 5, right =5, top = 5, bottom = 5 }})
self.frames.timers:SetBackdropColor( 0.7, 0, 0.7, 1 )
self.frames.timers:SetBackdropBorderColor( 1, 1, 1, 1)
if( self:GetOpt("timerx") and self:GetOpt("timery") ) then
x = self:GetOpt("timerx")
y = self:GetOpt("timery")
self.frames.timers:SetPoint("TOPLEFT", UIParent, "TOPLEFT", x, y )
else
self.frames.timers:SetPoint("TOPLEFT", self.frames.main, "BOTTOM", 60, 40)
end
self.frames.timers:RegisterForDrag("LeftButton")
self.frames.timers:SetScript("OnDragStart", function() this:StartMoving() end )
self.frames.timers:SetScript("OnDragStop",
function()
this:StopMovingOrSizing()
local _,_,_,x,y = this:GetPoint("TOPLEFT")
this.owner:SetOpt("timerx", x)
this.owner:SetOpt("timery", y)
end
)
self.frames.timersheader = self.frames.timers:CreateFontString(nil, "OVERLAY")
self.frames.timersheader.owner = self
self.frames.timersheader:SetFontObject(GameFontNormalSmall)
self.frames.timersheader:ClearAllPoints()
self.frames.timersheader:SetTextColor(0.8, 0.8, 1, 1)
self.frames.timersheader:SetPoint("CENTER", self.frames.timers, "CENTER", 0, 1 )
self.frames.timersheader:SetJustifyH("CENTER")
self.frames.timersheader:SetJustifyV("MIDDLE")
self.frames.timersheader:SetText( NECRONOMICON_CONST.Timerheader )
self.frames.timerstext = self.frames.timers:CreateFontString(nil, "OVERLAY")
self.frames.timerstext.owner = self
self.frames.timerstext:SetFontObject(GameFontNormalSmall)
self.frames.timerstext:ClearAllPoints()
self.frames.timerstext:SetTextColor(1, 1, 1, 1)
self.frames.timerstext:SetPoint("TOPLEFT", self.frames.timers, "TOPLEFT", 10, -6 )
self.frames.timerstext:SetJustifyH("LEFT")
self.frames.timerstext:SetJustifyV("MIDDLE")
self.frames.timerstext:SetWidth(200)
self.frames.timerstext:SetText( "" )
self:UpdateFrameLocks()
end,
UpdateShardCount = function( self )
local texture = self:GetOpt("texture")
if(texture) then
if( self.shardcount < 33 ) then
self.frames.shard:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\".. texture .."\\Shard"..self.shardcount )
else
self.frames.shard:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\".. texture .."\\Shard32" )
end
else
if( self.shardcount < 17 ) then
self.frames.shard:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\CounterButton-"..self.shardcount )
else
self.frames.shard:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\CounterButton-16" )
end
end
self.frames.shardtext:SetText(""..self.shardcount )
end,
UpdateHealthstone = function( self )
if( not self.spells.normal["HEALTHSTONE"] ) then
self.frames.healthstone:Hide()
return
end
if( self.healthstone[0] ~= nil ) then
self.frames.healthstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\HealthstoneButton-03" )
else
self.frames.healthstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\HealthstoneButton-01" )
end
self.frames.healthstone:Show()
end,
UpdateSoulstone = function( self )
if( not self.spells.normal["SOULSTONE"] ) then
self.frames.soulstone:Hide()
return
end
if( self.soulstone[0] ) then
self.frames.soulstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\SoulstoneButton-02" )
else
self.frames.soulstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\SoulstoneButton-01" )
end
self.frames.soulstone:Show()
end,
UpdateSpellstone = function( self )
if( not self.spells.normal["SPELLSTONE"] ) then
self.frames.spellstone:Hide()
return
end
if( self.spellstone[0] ~= nil ) then
if( self.spellstone[2] ) then
self.frames.spellstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\SpellstoneButton-03" )
else
self.frames.spellstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\SpellstoneButton-02" )
end
else
self.frames.spellstone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\SpellstoneButton-01" )
end
self.frames.spellstone:Show()
end,
UpdateFirestone = function( self )
if( not self.spells.normal["FIRESTONE"] ) then
self.frames.firestone:Hide()
return
end
if( self.firestone[0] ~= nil ) then
if( self.firestone[2] ) then
self.frames.firestone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\FirestoneButton-03" )
else
self.frames.firestone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\FirestoneButton-02" )
end
else
self.frames.firestone:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\FirestoneButton-01" )
end
self.frames.firestone:Show()
end,
UpdateOtherButtons = function( self )
if( not self.spells.normal["ARMOR"] ) then
self.frames.armor:Hide()
else
self.frames.armor:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\DemonicArmorButton-01" )
self.frames.armor:Show()
end
if( not self.spells.normal["RITUALOFSUMMONING"] ) then
self.frames.summon:Hide()
else
self.frames.summon:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\RitualSummonButton-01" )
self.frames.summon:Show()
end
if( not self.spells.normal["MOUNT"] ) then
self.frames.mount:Hide()
else
self.frames.mount:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\MountButton-0"..self.mounttype )
self.frames.mount:Show()
end
if( not self.hasdemons ) then
self.frames.demons:Hide()
else
self.frames.demons:SetNormalTexture( "Interface\\AddOns\\Necronomicon\\Images\\SummonerButton-00" )
self.frames.demons:Show()
if( self.spells.normal["IMP"] ) then
self.frames.imp:Show()
else
self.frames.imp:Hide()
end
if( self.spells.normal["VOIDWALKER"] ) then
self.frames.voidwalker:Show()
else
self.frames.voidwalker:Hide()
end
if( self.spells.normal["SUCCUBUS"] ) then
self.frames.succubus:Show()
else
self.frames.succubus:Hide()
end
if( self.spells.normal["FELHUNTER"] ) then
self.frames.felhunter:Show()
else
self.frames.felhunter:Hide()
end
if( self.spells.normal["INFERNO"] ) then
self.frames.inferno:Show()
else
self.frames.inferno:Hide()
end
if( self.spells.normal["DOOMGUARD"] ) then
self.frames.doomguard:Show()
else
self.frames.doomguard:Hide()
end
if( self.spells.normal["FELDOMINATION"] ) then
self.frames.feldomination:Show()
else
self.frames.feldomination:Hide()
end
if( self.spells.normal["DEMONICSACRIFICE"] ) then
self.frames.demonicsacrifice:Show()
else
self.frames.demonicsacrifice:Hide()
end
if( self.spells.normal["ENSLAVE"] ) then
self.frames.enslave:Show()
else
self.frames.enslave:Hide()
end
if( self.spells.normal["SOULLINK"] ) then
self.frames.soullink:Show()
else
self.frames.soullink:Hide()
end
if( self.spells.normal["KILROGG"] ) then
self.frames.kilrogg:Show()
else
self.frames.kilrogg:Hide()
end
if( self.spells.normal["HEALTHFUNNEL"] ) then
self.frames.healthfunnel:Show()
else
self.frames.healthfunnel:Hide()
end
end
end,
UpdateTimers = function( self )
local mindex, sindex, duration, text, tleft, gradient
self.timerstext = ""
if( self.soulstonetimer and self.soulstonetimer == 2 ) then
duration = Timex:ScheduleCheck("Necronomicon Soulstone Timer", TRUE)
-- tleft = floor(1800 - duration)
tleft = floor(duration)
text = self:BuildTime(tleft)
gradient = self:GetGradient( floor((tleft/1800)*100) )
self.timerstext = self.timerstext .. "\n\n|CFF00FF00"..self.soulstonetarget.."|r"
self.timerstext = self.timerstext .. "\n "..gradient..NECRONOMICON_CONST.Pattern.SoulstoneResurrection.." "..text.."|r"
end
for mindex in pairs(self.timers) do
if( self.timers[mindex]["name"] ) then
self.timerstext = self.timerstext .. "\n\n".."|CFFFF5555"..self.timers[mindex]["name"].."|r"
for sindex in pairs(self.timers[mindex]) do
if( sindex ~= "name" and sindex ~= "nr" ) then
duration = Timex:ScheduleCheck("Necronomicon Timers "..mindex..sindex, TRUE)
if( duration ) then
-- tleft = floor(self.timers[mindex][sindex]["duration"] - duration)
tleft = floor( duration )
text = self:BuildTime(tleft)
gradient = self:GetGradient( floor((tleft/self.timers[mindex][sindex]["duration"])*100) )
self.timerstext = self.timerstext .. "\n "..gradient..sindex.." "..text.."|r"
else
self.timerstext = self.timerstext .. "\n "..sindex.." ?? "
end
end
end
end
end
self.frames.timerstext:SetText(self.timerstext)
end,
UpdateButtons = function( self )
self:UpdateShardCount()
self:UpdateHealthstone()
self:UpdateSoulstone()
self:UpdateFirestone()
self:UpdateSpellstone()
self:UpdateOtherButtons()
end,
UpdateFrameLocks = function( self )
if( self:GetOpt("lock") ) then
self.frames.timers:SetMovable(false)
self.frames.timers:SetBackdrop(nil)
self.frames.timers:SetBackdropColor(0,0,0,0)
self.frames.timers:SetBackdropBorderColor(0,0,0,0)
self.frames.main:SetMovable(false)
self.frames.timers:RegisterForDrag()
self.frames.shard:RegisterForDrag()
else
self.frames.timers:SetMovable(true)
self.frames.timers:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = false, tileSize = 16, edgeSize = 16,
insets = { left = 5, right =5, top = 5, bottom = 5 }})
self.frames.timers:SetBackdropColor( 0.7, 0, 0.7, 1 )
self.frames.timers:SetBackdropBorderColor( 1, 1, 1, 1)
self.frames.main:SetMovable(true)
self.frames.timers:RegisterForDrag("LeftButton")
self.frames.shard:RegisterForDrag("LeftButton")
end
end,
----------------------------
-- ButtonClicks --
----------------------------
HealthstoneClicked = function( self )
if( self.healthstone[0] ~= nil ) then
if( UnitExists("target") and UnitIsPlayer("target") and not UnitIsEnemy("target", "player") and UnitName("target") ~= UnitName("player") ) then
if( not UnitCanCooperate("player", "target")) then
self:Msg( NECRONOMICON_CONST.Message.Busy )
elseif (not CheckInteractDistance("target",2)) then
self:Msg( NECRONOMICON_CONST.Message.TooFarAway )
else
PickupContainerItem( self.healthstone[0], self.healthstone[1] )
if ( CursorHasItem() ) then
DropItemOnUnit("target")
Timex:AddSchedule("Necronomicon Healthstone Trade", 3, nil, nil, "AcceptTrade", "" )
end
end
elseif( (UnitHealth("player") < UnitHealthMax("player")) and GetContainerItemCooldown(self.healthstone[0],self.healthstone[1]) == 0) then
UseContainerItem( self.healthstone[0], self.healthstone[1] )
end
else
CastSpell( self.spells.normal["HEALTHSTONE"], BOOKTYPE_SPELL )
end
end,
SoulstoneClicked = function( self )
if( self.soulstone[0] ~= nil ) then
if ( not UnitIsEnemy("player", "target") and UnitExists("target") ) then
UseContainerItem( self.soulstone[0], self.soulstone[1] )
end
else
CastSpell( self.spells.normal["SOULSTONE"], BOOKTYPE_SPELL )
end
end,
SpellstoneClicked = function( self )
if( self.spellstone[0] ~= nil ) then
if( self.spellstone[2] ) then
UseInventoryItem(GetInventorySlotInfo("SecondaryHandSlot"))
self:BAG_UPDATE()
else
UseContainerItem(self.spellstone[0], self.spellstone[1])
end
else
CastSpell( self.spells.normal["SPELLSTONE"], BOOKTYPE_SPELL )
end
end,
FirestoneClicked = function( self )
if( self.firestone[0] ~= nil ) then
if( not self.firestone[2] ) then
UseContainerItem(self.firestone[0], self.firestone[1])
end
else
CastSpell( self.spells.normal["FIRESTONE"], BOOKTYPE_SPELL )
end
end,
DemonsClicked = function( self )
if( self.frames.demonmenu.opened ) then
self.frames.demonmenu:Hide()
self.frames.demonmenu.opened = FALSE
else
self.frames.demonmenu:Show()
self.frames.demonmenu.opened = TRUE
end
end,
SummonClicked = function( self )
if( self.spells.normal["RITUALOFSUMMONING"] ) then
CastSpell( self.spells.normal["RITUALOFSUMMONING"], BOOKTYPE_SPELL )
end
end,
ArmorClicked = function( self )
if( self.spells.normal["ARMOR"] ) then
CastSpell( self.spells.normal["ARMOR"], BOOKTYPE_SPELL )
end
end,
MountClicked = function( self )
if( self.spells.normal["MOUNT"] ) then
CastSpell( self.spells.normal["MOUNT"], BOOKTYPE_SPELL )
end
end,
----------------------------
-- WoW Event Handlers --
----------------------------
BAG_UPDATE = function( self )
local bag = arg1
Timex:AddSchedule("Necronomicon Bag Update", 0.5, nil, nil, "NECRONOMICON_BAG_UPDATE", Necronomicon )
end,
SPELLS_CHANGED = function( self )
self:ScanSpells()
self:UpdateButtons()
end,
SPELLCAST_START = function( self )
-- self:Msg("SPELLCAST_START: "..arg1 )
if( self.currentspell.state ) then
if( self.currentspell.state == NECRONOMICON_CONST.State.Cast ) then
self.currentspell.state = NECRONOMICON_CONST.State.Start
-- we have started casting
else
-- I want nothing do do with this cast
self.Compost:Erase(self.currentspell)
end
end
self.soulstonestate = nil
if( arg1 == NECRONOMICON_CONST.Pattern.SoulstoneResurrection ) then
if( UnitName("target") ) then
self.soulstonetimer = 1
self.soulstonetarget = "["..UnitLevel("target").."] "..UnitName("target")
self.soulstonename = UnitName("target")
self:SendChatMessage(string.format( NECRONOMICON_CONST.Message.PreSoulstone, UnitName("target") ) )
end
elseif( arg1 == NECRONOMICON_CONST.Pattern.RitualOfSummoning ) then
if( UnitName("target") ) then
self:SendChatMessage(string.format( NECRONOMICON_CONST.Message.PreSummon, UnitName("target") ) )
self.presummoncount = self.shardcount
self.summoning = true
self.summonvictim = UnitName("target")
end
end
end,
SPELLCAST_FAILED = function( self )
-- self:Msg("SPELLCAST_FAILED" )
if( self.currentspell.state ) then
self.currentspell.state = NECRONOMICON_CONST.State.Failed
end
end,
SPELLCAST_STOP = function( self )
-- self:Msg("SPELLCAST_STOP" )
if( self.currentspell.state and self.currentspell.state < NECRONOMICON_CONST.State.Stop ) then
self.currentspell.state = NECRONOMICON_CONST.State.Stop
self:TimerAddSpell()
end
if( self.soulstonetimer and self.soulstonetimer == 1 ) then
self.soulstonetimer = 2
self.soulstonestate = 1
Timex:AddSchedule("Necronomicon Soulstone Timer", 1800, nil, nil, Necronomicon.DeleteSoulstoneTimer, Necronomicon )
self:SendChatMessage(string.format( NECRONOMICON_CONST.Message.Soulstone, self.soulstonename ) )
end
end,
SPELLCAST_INTERRUPTED = function( self )
-- self:Msg("SPELLCAST_INTERRUPTED" )
if( self.currentspell.state and self.currentspell.state > NECRONOMICON_CONST.State.Stop ) then
self:TimerRollback()
end
if( self.soulstonetimer and self.soulstonestate ) then
self.soulstonetimer = nil
self.soulstonestate = nil
Timex:DeleteSchedule("Necronomicon Soulstone Timer")
self:SendChatMessage( NECRONOMICON_CONST.Message.SoulstoneAborted )
end
end,
SPELLCAST_CHANNEL_START = function( self )
-- self:Msg("SPELLCAST_CHANNEL_START: "..arg1)
if( self.currentspell.state ) then
if( self.currentspell.state == NECRONOMICON_CONST.State.Cast ) then
self.currentspell.state = NECRONOMICON_CONST.State.Start
-- we have started casting
end
end
end,
SPELLCAST_CHANNEL_STOP = function( self )
-- self:Msg("SPELLCAST_CHANNEL_STOP")
if( self.summoning ) then
self:ScanStones()
if( self.shardcount >= self.summoncount ) then
-- failed summoning
self:SendChatMessage( string.format( NECRONOMICON_CONST.Message.FailedSummon, self.summonvictim) )
end
self.summoning = nil
end
end,
PLAYER_REGEN_ENABLED = function( self )
self:ClearTimers()
end,
CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS = function( self )
if( self:GetOpt("shadowtrancesound") and string.find( arg1, NECRONOMICON_CONST.Pattern.ShadowTrance ) ) then
PlaySoundFile("Interface\\AddOns\\Necronomicon\\Sounds\\ShadowTrance.mp3")
end
end,
CHAT_MSG_SPELL_SELF_DAMAGE = function( self )
if( self.currentspell.state and self.currentspell.state > NECRONOMICON_CONST.State.Stop ) then
if( string.find( arg1, NECRONOMICON_CONST.Pattern.Resisted ) or
string.find( arg1, NECRONOMICON_CONST.Pattern.Immune ) ) then
self:TimerRollback()
end
end
end,
----------------------------
-- My Event Handlers --
----------------------------
NECRONOMICON_BAG_UPDATE = function( self )
self:ScanStones()
self:UpdateShardCount()
self:UpdateHealthstone()
self:UpdateSoulstone()
self:UpdateSpellstone()
self:UpdateFirestone()
end,
Heartbeat = function( self)
self:UpdateTimers()
end,
----------------------------
-- My Hooks --
----------------------------
OnCastSpell = function( self, spellid, spellbooktab )
-- self:Msg( "OnCastSpell: "..spellid..", "..spellbooktab)
self:CallHook("CastSpell", spellid, spellbooktab )
if( self.spells.timedid[spellid] ) then
self:RegisterSpellCast( self.spells.timedid[spellid] )
end
end,
OnCastSpellByName = function( self, spellname )
-- self:Msg("OnCastSpellByName: "..spellname )
self:CallHook("CastSpellByName", spellname )
if( self.spells.timed[strlower(spellname)] ) then
self:RegisterSpellCast( strlower(spellname) )
elseif( self.spells.timedname[strlower(spellname)] ) then
self:RegisterSpellCast( self.spells.timedname[strlower(spellname)] )
end
end,
OnUseAction = function( self, actionid, a2, a3)
-- self:Msg("OnUseAction: "..actionid )
self:CallHook("UseAction", actionid, a2, a3 )
NecronomiconTooltip:SetAction(actionid)
local lefttext = NecronomiconTooltipTextLeft1:GetText()
local righttext = NecronomiconTooltipTextRight1:GetText()
if( lefttext ) then
if( righttext ) then
righttext = lefttext.." "..righttext
else
righttext = lefttext
end
lefttext = strlower( lefttext )
righttext = strlower( righttext )
if( self.spells.timed[lefttext] ) then
self:RegisterSpellCast( lefttext )
elseif( self.spells.timed[righttext] ) then
self:RegisterSpellCast( righttext )
end
end
end,
-- Not using this for now
OnUseContainerItem = function( self, index, slot )
self:Msg("OnUseContainerItem: "..index..", "..slot )
return self:CallHook("UseContainerItem", index, slot )
end,
----------------------------
-- Chat --
----------------------------
chatReset = function( self )
self.frames.main:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 150, -150)
self.frames.timers:SetPoint("TOPLEFT", self.frames.main, "BOTTOM", 60, 40)
end,
chatFelDom = function( self, modifier )
if( modifier == "ctrl" ) then
self:SetOpt("feldommodifier", "ctrl")
elseif( modifier == "alt" ) then
self:SetOpt("feldommodifier", "alt")
elseif( modifier == "shift" ) then
self:SetOpt("feldommodifier", "shift")
elseif( modifier == "none" ) then
self:SetOpt("feldommodifier", nil )
else
self:Msg( NECRONOMICON_CONST.Chat.FelDomValid )
end
if( self:GetOpt("feldommodifier") ) then
self:Msg( NECRONOMICON_CONST.Chat.FelDomModifier .. self:GetOpt("feldommodifier") )
else
self:Msg( NECRONOMICON_CONST.Chat.FelDomModifier .. "none" )
end
end,
chatCloseClick = function( self )
self:TogOpt("closeonclick")
self:Msg(NECRONOMICON_CONST.Chat.CloseOnClick, ACEG_MAP_ONOFF[self:GetOpt("closeonclick") or 0])
end,
chatShadowTranceSound = function( self )
self:TogOpt("shadowtrancesound")
self:Msg(NECRONOMICON_CONST.Chat.ShadowTranceSound, ACEG_MAP_ONOFF[self:GetOpt("shadowtrancesound") or 0])
end,
chatSoulstoneSound = function( self )
self:TogOpt("soulstonesound")
self:Msg(NECRONOMICON_CONST.Chat.SoulstoneSound, ACEG_MAP_ONOFF[self:GetOpt("soulstonesound") or 0])
end,
chatTimers = function( self )
self:TogOpt("timers")
self:Msg(NECRONOMICON_CONST.Chat.Timers, ACEG_MAP_ONOFF[self:GetOpt("timers") or 0])
if( self:GetOpt("timers") ) then
self.Metrognome:Start("Necronomicon")
self.frames.timers:Show()
else
self.Metrognome:Stop("Necronomicon")
self.frames.timers:Hide()
end
end,
chatLock = function( self )
self:TogOpt("lock")
self:Msg(NECRONOMICON_CONST.Chat.Lock, ACEG_MAP_ONOFF[self:GetOpt("lock") or 0])
self:UpdateFrameLocks()
end,
chatTexture = function( self, texture )
if( texture == "default" ) then
self:SetOpt("texture", nil)
elseif( texture == "blue" ) then
self:SetOpt("texture", "Blue")
elseif( texture == "orange" ) then
self:SetOpt("texture", "Orange")
elseif( texture == "rose" ) then
self:SetOpt("texture", "Rose")
elseif( texture == "turquoise" ) then
self:SetOpt("texture", "Turquoise")
elseif( texture == "violet" ) then
self:SetOpt("texture", "Violet")
elseif( texture == "x" ) then
self:SetOpt("texture", "X")
else
self:Msg( NECRONOMICON_CONST.Chat.TextureValid )
end
if( self:GetOpt("texture") ) then
self:Msg( NECRONOMICON_CONST.Chat.Texture .. self:GetOpt("texture") )
else
self:Msg( NECRONOMICON_CONST.Chat.Texture .. "default" )
end
self:UpdateShardCount()
end,
Report = function( self )
if( self:GetOpt("texture") ) then
self:Msg( NECRONOMICON_CONST.Chat.Texture .. self:GetOpt("texture") )
else
self:Msg( NECRONOMICON_CONST.Chat.Texture .. "default" )
end
if( self:GetOpt("feldommodifier") ) then
self:Msg( NECRONOMICON_CONST.Chat.FelDomModifier .. self:GetOpt("feldommodifier") )
else
self:Msg( NECRONOMICON_CONST.Chat.FelDomModifier .. "none" )
end
self:Msg(NECRONOMICON_CONST.Chat.CloseOnClick, ACEG_MAP_ONOFF[self:GetOpt("closeonclick") or 0])
self:Msg(NECRONOMICON_CONST.Chat.SoulstoneSound, ACEG_MAP_ONOFF[self:GetOpt("soulstonesound") or 0])
self:Msg(NECRONOMICON_CONST.Chat.ShadowTranceSound, ACEG_MAP_ONOFF[self:GetOpt("shadowtrancesound") or 0])
self:Msg(NECRONOMICON_CONST.Chat.Lock, ACEG_MAP_ONOFF[self:GetOpt("lock") or 0])
end,
-- Command Reporting Closures
GetOpt = function(self, path, var)
if (not var) then var = path; path = nil; end
local profilePath = path and {self.profilePath, path} or self.profilePath;
return self.db:get(profilePath, var)
end,
SetOpt = function(self, path, var, val)
if (not val) then val = var; var = path; path = nil; end
local profilePath = path and {self.profilePath, path} or self.profilePath;
return self.db:set(profilePath, var, val)
end,
TogOpt = function(self, path, var)
if (not var) then var = path; path = nil; end
local profilePath = path and {self.profilePath, path} or self.profilePath;
return self.db:toggle(profilePath, var)
end,
Msg = function(self, ...)
self.cmd:result(NECRONOMICON_MSG_COLOR, unpack(arg))
end,
Result = function(self, text, val, map)
if( map ) then val = map[val or 0] or val end
self.cmd:result(NECRONOMICON_MSG_COLOR, text, " ", ACEG_TEXT_NOW_SET_TO, " ",
format(NECRONOMICON_DISPLAY_OPTION, val or ACE_CMD_REPORT_NO_VAL)
)
end,
TogMsg = function(self, var, text)
local val = self:TogOpt(var)
self:Result(text, val, ACEG_MAP_ONOFF)
return val
end,
Error = function(self, ...)
local text = "";
for i=1,getn(arg) do
text = text .. arg[i]
end
error(NECRONOMICON_MSG_COLOR .. text, 2)
end,
})
----------------------------------
-- Load this bitch up! --
----------------------------------
Necronomicon:RegisterForLoad()