3189 lines
122 KiB
Lua
3189 lines
122 KiB
Lua
------------------------------------------------------------------------------------------------------
|
|
-- Necrosis LdC
|
|
--
|
|
-- Créateur initial (US) : Infernal (http://www.revolvus.com/games/interface/necrosis/)
|
|
-- Implémentation de base (FR) : Tilienna Thorondor
|
|
-- Reprise du projet : Lomig & Nyx des Larmes de Cenarius, Kael'Thas
|
|
--
|
|
-- Skins et voix Françaises : Eliah, Ner'zhul
|
|
-- Version Allemande par Arne Meier et Halisstra, Lothar
|
|
-- Remerciements spéciaux pour Sadyre (JoL)
|
|
-- Version 05.09.2006-1
|
|
------------------------------------------------------------------------------------------------------
|
|
|
|
-- Configuration par défaut
|
|
-- Se charge en cas d'absence de configuration ou de changement de version
|
|
Default_NecrosisConfig = {
|
|
Version = NecrosisData.Version;
|
|
SoulshardContainer = 4;
|
|
SoulshardSort = false;
|
|
SoulshardDestroy = false;
|
|
ShadowTranceAlert = true;
|
|
ShowSpellTimers = true;
|
|
AntiFearAlert = true;
|
|
NecrosisLockServ = true;
|
|
NecrosisAngle = 180;
|
|
StonePosition = {true, true, true, true, true, true, true, true};
|
|
NecrosisToolTip = true;
|
|
NoDragAll = false;
|
|
PetMenuPos = 34;
|
|
BuffMenuPos = 34;
|
|
CurseMenuPos = 34;
|
|
ChatMsg = true;
|
|
ChatType = true;
|
|
NecrosisLanguage = GetLocale();
|
|
ShowCount = true;
|
|
CountType = 1;
|
|
ShadowTranceScale = 100;
|
|
NecrosisButtonScale = 90;
|
|
NecrosisColor = "Rose";
|
|
Sound = true;
|
|
SpellTimerPos = 1;
|
|
SpellTimerJust = "LEFT";
|
|
Circle = 1;
|
|
Graphical = true;
|
|
Yellow = true;
|
|
SensListe = 1;
|
|
PetName = {
|
|
[1] = " ",
|
|
[2] = " ",
|
|
[3] = " ",
|
|
[4] = " "
|
|
};
|
|
DominationUp = false;
|
|
AmplifyUp = false;
|
|
SM = false;
|
|
SteedSummon = false;
|
|
DemonSummon = true;
|
|
BanishScale = 100;
|
|
};
|
|
|
|
NecrosisConfig = {};
|
|
local Debug = false;
|
|
local Loaded = false
|
|
|
|
-- Détection des initialisations du mod
|
|
local NecrosisRL = true;
|
|
|
|
-- Initialisation des variables utilisées par Necrosis pour la gestion des sorts lancés
|
|
local SpellCastName = nil;
|
|
local SpellCastRank = nil;
|
|
local SpellTargetName = nil;
|
|
local SpellTargetLevel = nil;
|
|
local SpellCastTime = 0;
|
|
|
|
-- Initialisation des tableaux gérant les Timers
|
|
-- Un pour les sorts à timer, l'autre pour les groupes de mobs
|
|
-- Le dernier permet l'association d'un timer à une frame graphique
|
|
SpellTimer = {};
|
|
local SpellGroup = {
|
|
Name = {"Rez", "Main", "Cooldown"},
|
|
SubName = {" ", " ", " "},
|
|
Visible = {true, true, true}
|
|
};
|
|
|
|
local TimerTable = {};
|
|
for i = 1, 50, 1 do
|
|
TimerTable[i] = false;
|
|
end
|
|
|
|
-- Menus : Permet l'affichage des menus de buff et de pet
|
|
local PetShow = false;
|
|
local PetMenuShow = false;
|
|
local BuffShow = false;
|
|
local BuffMenuShow = false;
|
|
local CurseShow = false;
|
|
local CurseMenuShow = false;
|
|
|
|
-- Menus : Permet la disparition progressive du menu des pets (transparence)
|
|
local AlphaPetMenu = 1;
|
|
local AlphaPetVar = 0;
|
|
local PetVisible = false;
|
|
|
|
-- Menus : Permet la disparition progressive du menu des buffs (transparence)
|
|
local AlphaBuffMenu = 1;
|
|
local AlphaBuffVar = 0;
|
|
local BuffVisible = false;
|
|
|
|
-- Menus : Permet la disparition progressive du menu des curses (transparence)
|
|
local AlphaCurseMenu = 1;
|
|
local AlphaCurseVar = 0;
|
|
local CurseVisible = false;
|
|
|
|
-- Menus : Permet de recaster le dernier cast du menu en cliquant milieu sur celui-ci
|
|
local LastDemon = 0;
|
|
local LastBuff = 0;
|
|
local LastCurse = 0;
|
|
local LastCurseClick = "LeftButton";
|
|
|
|
-- Liste des boutons disponible pour le démoniste dans chaque menu
|
|
local PetMenuCreate = {};
|
|
local BuffMenuCreate = {};
|
|
local CurseMenuCreate = {};
|
|
|
|
-- Variables utilisées pour la gestion des montures
|
|
local MountAvailable = false;
|
|
local NecrosisMounted = false;
|
|
local NecrosisTellMounted = true;
|
|
local PlayerCombat = false;
|
|
|
|
-- Variables utilisées pour la gestion des transes de l'ombre
|
|
local ShadowTrance = false;
|
|
local AntiFearInUse = false;
|
|
local ShadowTranceID = -1;
|
|
|
|
-- Variables utilisées pour la gestion des fragments d'âme
|
|
-- (principalement comptage)
|
|
local Soulshards = 0;
|
|
local SoulshardContainer = 4;
|
|
local SoulshardSlot = {};
|
|
local SoulshardSlotID = 1;
|
|
local SoulshardMP = 0;
|
|
local SoulshardTime = 0;
|
|
|
|
-- Variables utilisées pour la gestion des composants d'invocation
|
|
-- (principalement comptage)
|
|
local InfernalStone = 0;
|
|
local DemoniacStone = 0;
|
|
|
|
|
|
-- Variables utilisées pour la gestion des boutons d'invocation et d'utilisation des pierres
|
|
local StoneIDInSpellTable = {0, 0, 0, 0}
|
|
local SoulstoneUsedOnTarget = false;
|
|
local SoulstoneOnHand = false;
|
|
local SoulstoneLocation = {nil,nil};
|
|
local SoulstoneMode = 1;
|
|
local HealthstoneOnHand = false;
|
|
local HealthstoneLocation = {nil,nil};
|
|
local HealthstoneMode = 1;
|
|
local FirestoneOnHand = false;
|
|
local FirestoneLocation = {nil,nil};
|
|
local FirestoneMode = 1;
|
|
local SpellstoneOnHand = false;
|
|
local SpellstoneLocation = {nil,nil};
|
|
local SpellstoneMode = 1;
|
|
local HearthstoneOnHand = false;
|
|
local HearthstoneLocation = {nil,nil};
|
|
local ItemswitchLocation = {nil,nil};
|
|
local ItemOnHand = false;
|
|
|
|
-- Variables gérant la possibilité ou l'impossibilité d'utiliser un timer de rez
|
|
local SoulstoneWaiting = false;
|
|
local SoulstoneCooldown = false;
|
|
local SoulstoneAdvice = false;
|
|
local SoulstoneTarget = "";
|
|
|
|
-- Variables utilisées dans la gestion des démons
|
|
local DemonType = nil;
|
|
local DemonEnslaved = false;
|
|
|
|
-- Variables utilisées pour l'anti-fear
|
|
local AFblink1, AFBlink2 = 0;
|
|
local AFImageType = { "", "Immu", "Prot"}; -- Fear warning button filename variations
|
|
local AFCurrentTargetImmune = false;
|
|
|
|
-- Variables utilisées pour les échanges de pierre avec les joueurs
|
|
local NecrosisTradeRequest = false;
|
|
local Trading = false;
|
|
local TradingNow = 0;
|
|
|
|
-- Gestion des sacs à fragment d'âme
|
|
local BagIsSoulPouch = {nil, nil, nil, nil, nil};
|
|
|
|
-- Variable contenant les derniers messages invoqués
|
|
local PetMess = 0
|
|
local SteedMess = 0
|
|
local RezMess = 0
|
|
local TPMess = 0
|
|
|
|
-- Permet la gestion des tooltips dans Necrosis (sans la frame des pièces de monnaie)
|
|
local lOriginal_GameTooltip_ClearMoney;
|
|
|
|
local Necrosis_In = true;
|
|
|
|
------------------------------------------------------------------------------------------------------
|
|
-- FONCTIONS NECROSIS APPLIQUEES A L'ENTREE DANS LE JEU
|
|
------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
-- Fonction appliquée au chargement
|
|
function Necrosis_OnLoad()
|
|
|
|
-- Permet de repérer les sorts lancés
|
|
Necrosis_Hook("UseAction", "Necrosis_UseAction", "before");
|
|
Necrosis_Hook("CastSpell", "Necrosis_CastSpell", "before");
|
|
Necrosis_Hook("CastSpellByName", "Necrosis_CastSpellByName", "before");
|
|
|
|
-- Enregistrement des événements interceptés par Necrosis
|
|
this:RegisterEvent("PLAYER_ENTERING_WORLD");
|
|
this:RegisterEvent("PLAYER_LEAVING_WORLD");
|
|
NecrosisButton:RegisterEvent("BAG_UPDATE");
|
|
NecrosisButton:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS");
|
|
NecrosisButton:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_SELF");
|
|
NecrosisButton:RegisterEvent("CHAT_MSG_SPELL_BREAK_AURA");
|
|
NecrosisButton:RegisterEvent("PLAYER_REGEN_DISABLED");
|
|
NecrosisButton:RegisterEvent("PLAYER_REGEN_ENABLED");
|
|
NecrosisButton:RegisterEvent("UNIT_PET");
|
|
NecrosisButton:RegisterEvent("SPELLCAST_START");
|
|
NecrosisButton:RegisterEvent("SPELLCAST_FAILED");
|
|
NecrosisButton:RegisterEvent("SPELLCAST_INTERRUPTED");
|
|
NecrosisButton:RegisterEvent("SPELLCAST_STOP");
|
|
NecrosisButton:RegisterEvent("LEARNED_SPELL_IN_TAB");
|
|
NecrosisButton:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE");
|
|
NecrosisButton:RegisterEvent("PLAYER_TARGET_CHANGED");
|
|
NecrosisButton:RegisterEvent("TRADE_REQUEST");
|
|
NecrosisButton:RegisterEvent("TRADE_REQUEST_CANCEL");
|
|
NecrosisButton:RegisterEvent("TRADE_SHOW");
|
|
NecrosisButton:RegisterEvent("TRADE_CLOSED");
|
|
|
|
-- Enregistrement des composants graphiques
|
|
NecrosisButton:RegisterForDrag("LeftButton");
|
|
NecrosisButton:RegisterForClicks("LeftButtonUp", "RightButtonUp");
|
|
NecrosisButton:SetFrameLevel(1);
|
|
|
|
-- Enregistrement de la commande console
|
|
SlashCmdList["NecrosisCommand"] = Necrosis_SlashHandler;
|
|
SLASH_NecrosisCommand1 = "/necro";
|
|
end
|
|
|
|
|
|
-- Fonction appliquée une fois les paramètres des mods chargés
|
|
function Necrosis_LoadVariables()
|
|
if Loaded or UnitClass("player") ~= NECROSIS_UNIT_WARLOCK then
|
|
return
|
|
end
|
|
|
|
Necrosis_Initialize();
|
|
Loaded = true ;
|
|
|
|
-- Détection du type de démon présent à la connexion
|
|
DemonType = UnitCreatureFamily("pet");
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------
|
|
-- FONCTIONS NECROSIS
|
|
------------------------------------------------------------------------------------------------------
|
|
|
|
-- Fonction lancée à la mise à jour de l'interface (main) -- toutes les 0,1 secondes environ
|
|
function Necrosis_OnUpdate()
|
|
|
|
-- La fonction n'est utilisée que si Necrosis est initialisé et le joueur un Démoniste --
|
|
if (not Loaded) and UnitClass("player") ~= NECROSIS_UNIT_WARLOCK then
|
|
return;
|
|
end
|
|
-- La fonction n'est utilisée que si Necrosis est initialisé et le joueur un Démoniste --
|
|
|
|
|
|
-- Gestion des fragments d'âme : Tri des fragment toutes les secondes
|
|
local curTime = GetTime();
|
|
if ((curTime-SoulshardTime) >= 1) then
|
|
SoulshardTime = curTime;
|
|
if (SoulshardMP > 0) then
|
|
Necrosis_SoulshardSwitch("MOVE");
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------
|
|
-- Gestion des sorts du Démoniste
|
|
----------------------------------------------------------
|
|
|
|
-- Gestion du menu d'invocation des démons
|
|
if PetShow then
|
|
if GetTime() >= AlphaPetVar and AlphaPetMenu > 0 and (not PetVisible) then
|
|
AlphaPetVar = GetTime() + 0.1;
|
|
NecrosisPetMenu1:SetAlpha(AlphaPetMenu);
|
|
NecrosisPetMenu2:SetAlpha(AlphaPetMenu);
|
|
NecrosisPetMenu3:SetAlpha(AlphaPetMenu);
|
|
NecrosisPetMenu4:SetAlpha(AlphaPetMenu);
|
|
NecrosisPetMenu5:SetAlpha(AlphaPetMenu);
|
|
NecrosisPetMenu6:SetAlpha(AlphaPetMenu);
|
|
NecrosisPetMenu7:SetAlpha(AlphaPetMenu);
|
|
NecrosisPetMenu8:SetAlpha(AlphaPetMenu);
|
|
NecrosisPetMenu9:SetAlpha(AlphaPetMenu);
|
|
AlphaPetMenu = AlphaPetMenu - 0.1;
|
|
end
|
|
if AlphaPetMenu <= 0 then
|
|
Necrosis_PetMenu();
|
|
end
|
|
end
|
|
|
|
-- Gestion du menu des Buffs
|
|
if BuffShow then
|
|
if GetTime() >= AlphaBuffVar and AlphaBuffMenu > 0 and (not BuffVisible) then
|
|
AlphaBuffVar = GetTime() + 0.1;
|
|
NecrosisBuffMenu1:SetAlpha(AlphaBuffMenu);
|
|
NecrosisBuffMenu2:SetAlpha(AlphaBuffMenu);
|
|
NecrosisBuffMenu3:SetAlpha(AlphaBuffMenu);
|
|
NecrosisBuffMenu4:SetAlpha(AlphaBuffMenu);
|
|
NecrosisBuffMenu5:SetAlpha(AlphaBuffMenu);
|
|
NecrosisBuffMenu6:SetAlpha(AlphaBuffMenu);
|
|
NecrosisBuffMenu7:SetAlpha(AlphaBuffMenu);
|
|
NecrosisBuffMenu8:SetAlpha(AlphaBuffMenu);
|
|
NecrosisBuffMenu9:SetAlpha(AlphaBuffMenu);
|
|
AlphaBuffMenu = AlphaBuffMenu - 0.1;
|
|
end
|
|
if AlphaBuffMenu <= 0 then
|
|
Necrosis_BuffMenu();
|
|
end
|
|
end
|
|
|
|
-- Gestion du menu des Curses
|
|
if CurseShow then
|
|
if GetTime() >= AlphaCurseVar and AlphaCurseMenu > 0 and (not CurseVisible) then
|
|
AlphaCurseVar = GetTime() + 0.1;
|
|
NecrosisCurseMenu1:SetAlpha(AlphaCurseMenu);
|
|
NecrosisCurseMenu2:SetAlpha(AlphaCurseMenu);
|
|
NecrosisCurseMenu3:SetAlpha(AlphaCurseMenu);
|
|
NecrosisCurseMenu4:SetAlpha(AlphaCurseMenu);
|
|
NecrosisCurseMenu5:SetAlpha(AlphaCurseMenu);
|
|
NecrosisCurseMenu6:SetAlpha(AlphaCurseMenu);
|
|
NecrosisCurseMenu7:SetAlpha(AlphaCurseMenu);
|
|
NecrosisCurseMenu8:SetAlpha(AlphaCurseMenu);
|
|
NecrosisCurseMenu9:SetAlpha(AlphaCurseMenu);
|
|
AlphaCurseMenu = AlphaCurseMenu - 0.1;
|
|
end
|
|
if AlphaCurseMenu <= 0 then
|
|
Necrosis_CurseMenu();
|
|
end
|
|
end
|
|
|
|
-- Gestion du talent "Crépuscule"
|
|
if NecrosisConfig.ShadowTranceAlert then
|
|
local Actif = false;
|
|
local TimeLeft = 0;
|
|
Necrosis_UnitHasTrance();
|
|
if ShadowTranceID ~= -1 then Actif = true; end
|
|
if Actif and not ShadowTrance then
|
|
ShadowTrance = true;
|
|
Necrosis_Msg(NECROSIS_NIGHTFALL_TEXT.Message, "USER");
|
|
if NecrosisConfig.Sound then PlaySoundFile(NECROSIS_SOUND.ShadowTrance); end
|
|
local ShadowTranceIndex, cancel = GetPlayerBuff(ShadowTranceID,"HELPFUL|HARMFUL|PASSIVE");
|
|
TimeLeft = floor(GetPlayerBuffTimeLeft(ShadowTranceIndex));
|
|
NecrosisShadowTranceTimer:SetText(TimeLeft);
|
|
ShowUIPanel(NecrosisShadowTranceButton);
|
|
end
|
|
if not Actif and ShadowTrance then
|
|
HideUIPanel(NecrosisShadowTranceButton);
|
|
ShadowTrance = false;
|
|
end
|
|
if Actif and ShadowTrance then
|
|
local ShadowTranceIndex, cancel = GetPlayerBuff(ShadowTranceID,"HELPFUL|HARMFUL|PASSIVE");
|
|
TimeLeft = floor(GetPlayerBuffTimeLeft(ShadowTranceIndex));
|
|
NecrosisShadowTranceTimer:SetText(TimeLeft);
|
|
end
|
|
end
|
|
|
|
-- Gestion des Antifears
|
|
if NecrosisConfig.AntiFearAlert then
|
|
local Actif = false; -- must be False, or a number from 1 to AFImageType[] max element.
|
|
|
|
-- Checking if we have a target. Any fear need a target to be casted on
|
|
if UnitExists("target") and UnitCanAttack("player", "target") and not UnitIsDead("target") then
|
|
-- Checking if the target has natural immunity (only NPC target)
|
|
if not UnitIsPlayer("target") then
|
|
for index=1, table.getn(NECROSIS_ANTI_FEAR_UNIT), 1 do
|
|
if (UnitCreatureType("target") == NECROSIS_ANTI_FEAR_UNIT[index] ) then
|
|
Actif = 2; -- Immun
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- We'll start to parse the target buffs, as his class doesn't give him natural permanent immunity
|
|
if not Actif then
|
|
for index=1, table.getn(NECROSIS_ANTI_FEAR_SPELL.Buff), 1 do
|
|
if Necrosis_UnitHasBuff("target",NECROSIS_ANTI_FEAR_SPELL.Buff[index]) then
|
|
Actif = 3; -- Prot
|
|
break;
|
|
end
|
|
end
|
|
|
|
-- No buff found, let's try the debuffs
|
|
for index=1, table.getn(NECROSIS_ANTI_FEAR_SPELL.Debuff), 1 do
|
|
if Necrosis_UnitHasEffect("target",NECROSIS_ANTI_FEAR_SPELL.Debuff[index]) then
|
|
Actif = 3; -- Prot
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- an immunity has been detected before, but we still don't know why => show the button anyway
|
|
if AFCurrentTargetImmune and not Actif then
|
|
Actif = 1;
|
|
end
|
|
end
|
|
|
|
if Actif then
|
|
-- Antifear button is currently not visible, we have to change that
|
|
if not AntiFearInUse then
|
|
AntiFearInUse = true;
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Information.FearProtect, "USER");
|
|
NecrosisAntiFearButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\AntiFear"..AFImageType[Actif].."-02");
|
|
if NecrosisConfig.Sound then PlaySoundFile(NECROSIS_SOUND.Fear); end
|
|
ShowUIPanel(NecrosisAntiFearButton);
|
|
AFBlink1 = GetTime() + 0.6;
|
|
AFBlink2 = 2;
|
|
|
|
-- Timer to make the button blink
|
|
elseif GetTime() >= AFBlink1 then
|
|
if AFBlink2 == 1 then
|
|
AFBlink2 = 2;
|
|
else
|
|
AFBlink2 = 1;
|
|
end
|
|
AFBlink1 = GetTime() + 0.4;
|
|
NecrosisAntiFearButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\AntiFear"..AFImageType[Actif].."-0"..AFBlink2);
|
|
end
|
|
|
|
elseif AntiFearInUse then -- No antifear on target, but the button is still visible => gonna hide it
|
|
AntiFearInUse = false;
|
|
HideUIPanel(NecrosisAntiFearButton);
|
|
end
|
|
end
|
|
|
|
-- Gestion du Timer des sorts
|
|
if (not NecrosisSpellTimerButton:IsVisible()) then
|
|
ShowUIPanel(NecrosisSpellTimerButton);
|
|
end
|
|
local display = "";
|
|
|
|
if NecrosisConfig.CountType == 3 then
|
|
NecrosisShardCount:SetText("");
|
|
end
|
|
local update = false;
|
|
if ((curTime - SpellCastTime) >= 1) then
|
|
SpellCastTime = curTime;
|
|
update = true;
|
|
end
|
|
|
|
-- On met à jour les boutons toutes les secondes
|
|
-- On accepte le trade de la pierre de soin si transfert en cours
|
|
if update then
|
|
if Trading then
|
|
TradingNow = TradingNow - 1;
|
|
if TradingNow == 0 then
|
|
AcceptTrade();
|
|
Trading = false;
|
|
end
|
|
end
|
|
Necrosis_UpdateIcons();
|
|
end
|
|
|
|
-- Parcours du tableau des Timers
|
|
local GraphicalTimer = {texte = {}, TimeMax = {}, Time = {}, titre = {}, temps = {}, Gtimer = {}};
|
|
if SpellTimer then
|
|
for index = 1, table.getn(SpellTimer), 1 do
|
|
if SpellTimer[index] then
|
|
if (GetTime() <= SpellTimer[index].TimeMax) then
|
|
-- Création de l'affichage des timers
|
|
display, SpellGroup, GraphicalTimer, TimerTable = Necrosis_DisplayTimer(display, index, SpellGroup, SpellTimer, GraphicalTimer, TimerTable);
|
|
end
|
|
-- Action toutes les secondes
|
|
if (update) then
|
|
-- On enlève les timers terminés
|
|
local TimeLocal = GetTime();
|
|
if TimeLocal >= (SpellTimer[index].TimeMax - 0.5) and SpellTimer[index].TimeMax ~= -1 then
|
|
-- Si le timer était celui de la Pierre d'âme, on prévient le Démoniste
|
|
if SpellTimer[index].Name == NECROSIS_SPELL_TABLE[11].Name then
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Information.SoulstoneEnd, "USER");
|
|
SpellTimer[index].Target = "";
|
|
SpellTimer[index].TimeMax = -1;
|
|
if NecrosisConfig.Sound then PlaySoundFile(NECROSIS_SOUND.SoulstoneEnd); end
|
|
Necrosis_RemoveFrame(SpellTimer[index].Gtimer, TimerTable);
|
|
-- On met à jour l'apparence du bouton de la pierre d'âme
|
|
Necrosis_UpdateIcons();
|
|
-- Sinon on enlève le timer silencieusement (mais pas en cas d'enslave)
|
|
elseif SpellTimer[index].Name ~= NECROSIS_SPELL_TABLE[10].Name then
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParIndex(index, SpellTimer, TimerTable);
|
|
index = 0;
|
|
break;
|
|
end
|
|
end
|
|
-- Si le Démoniste n'est plus sous l'emprise du Sacrifice
|
|
if SpellTimer and SpellTimer[index].Name == NECROSIS_SPELL_TABLE[17].Name then -- Sacrifice
|
|
if not Necrosis_UnitHasEffect("player", SpellTimer[index].Name) and SpellTimer[index].TimeMax ~= nil then
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParIndex(index, SpellTimer, TimerTable);
|
|
index = 0;
|
|
break;
|
|
end
|
|
end
|
|
-- Si la cible visée n'est plus atteinte par un sort lancé [résists]
|
|
if SpellTimer and (SpellTimer[index].Type == 4 or SpellTimer[index].Type == 5)
|
|
and SpellTimer[index].Target == UnitName("target")
|
|
then
|
|
-- On triche pour laisser le temps au mob de bien sentir qu'il est débuffé ^^
|
|
if TimeLocal >= ((SpellTimer[index].TimeMax - SpellTimer[index].Time) + 1.5)
|
|
and SpellTimer[index] ~= 6 then
|
|
if not Necrosis_UnitHasEffect("target", SpellTimer[index].Name) then
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParIndex(index, SpellTimer, TimerTable);
|
|
index = 0;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
else
|
|
for i = 1, 10, 1 do
|
|
local frameName = "NecrosisTarget"..i.."Text";
|
|
local frameItem = getglobal(frameName);
|
|
if frameItem:IsShown() then
|
|
frameItem:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
if NecrosisConfig.ShowSpellTimers or NecrosisConfig.Graphical then
|
|
-- Si affichage de timer texte
|
|
if not NecrosisConfig.Graphical then
|
|
-- Coloration de l'affichage des timers
|
|
display = Necrosis_MsgAddColor(display);
|
|
-- Affichage des timers
|
|
NecrosisListSpells:SetText(display);
|
|
else
|
|
NecrosisListSpells:SetText("");
|
|
end
|
|
for i = 4, table.getn(SpellGroup.Name) do
|
|
SpellGroup.Visible[i] = false;
|
|
end
|
|
else
|
|
if (NecrosisSpellTimerButton:IsVisible()) then
|
|
NecrosisListSpells:SetText("");
|
|
HideUIPanel(NecrosisSpellTimerButton);
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Fonction lancée selon l'événement intercepté
|
|
function Necrosis_OnEvent(event)
|
|
if (event == "PLAYER_ENTERING_WORLD") then
|
|
Necrosis_In = true;
|
|
elseif (event == "PLAYER_LEAVING_WORLD") then
|
|
Necrosis_In = false;
|
|
end
|
|
|
|
-- Traditionnel test : Le joueur est-il bien Démoniste ?
|
|
-- Le jeu est-il bine chargé ?
|
|
if (not Loaded) or (not Necrosis_In) or UnitClass("player") ~= NECROSIS_UNIT_WARLOCK then
|
|
return;
|
|
end
|
|
|
|
-- Si le contenu des sacs a changé, on vérifie que les Fragments d'âme sont toujours dans le bon sac
|
|
if (event == "BAG_UPDATE") then
|
|
if (NecrosisConfig.SoulshardSort) then
|
|
Necrosis_SoulshardSwitch("CHECK");
|
|
else
|
|
Necrosis_BagExplore();
|
|
end
|
|
-- Gestion de la fin de l'incantation des sorts
|
|
elseif (event == "SPELLCAST_STOP") then
|
|
Necrosis_SpellManagement();
|
|
-- Quand le démoniste commence à incanter un sort, on intercepte le nom de celui-ci
|
|
-- On sauve également le nom de la cible du sort ainsi que son niveau
|
|
elseif (event == "SPELLCAST_START") then
|
|
SpellCastName = arg1;
|
|
SpellTargetName = UnitName("target");
|
|
if not SpellTargetName then
|
|
SpellTargetName = "";
|
|
end
|
|
SpellTargetLevel = UnitLevel("target");
|
|
if not SpellTargetLevel then
|
|
SpellTargetLevel = "";
|
|
end
|
|
-- Quand le démoniste stoppe son incantation, on relache le nom de celui-ci
|
|
elseif (event == "SPELLCAST_FAILED") or (event == "SPELLCAST_INTERRUPTED") then
|
|
SpellCastName = nil;
|
|
SpellCastRank = nil;
|
|
SpellTargetName = nil;
|
|
SpellTargetLevel = nil;
|
|
-- Flag si une fenetre de Trade est ouverte, afin de pouvoir trader automatiquement les pierres de soin
|
|
elseif event == "TRADE_REQUEST" or event == "TRADE_SHOW" then
|
|
NecrosisTradeRequest = true;
|
|
elseif event == "TRADE_REQUEST_CANCEL" or event == "TRADE_CLOSED" then
|
|
NecrosisTradeRequest = false;
|
|
-- AntiFear button hide on target change
|
|
elseif event == "PLAYER_TARGET_CHANGED" then
|
|
if NecrosisConfig.AntiFearAlert and AFCurrentTargetImmune then
|
|
AFCurrentTargetImmune = false;
|
|
end
|
|
-- AntiFear immunity on cast detection
|
|
elseif event == "CHAT_MSG_SPELL_SELF_DAMAGE" then
|
|
if NecrosisConfig.AntiFearAlert then
|
|
for spell, creatureName in string.gfind(arg1, NECROSIS_ANTI_FEAR_SRCH) do
|
|
-- We check if the casted spell on the immune target is Fear or Death Coil
|
|
if spell == NECROSIS_SPELL_TABLE[13].Name or spell == NECROSIS_SPELL_TABLE[19].Name then
|
|
AFCurrentTargetImmune = true;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Si le Démoniste apprend un nouveau sort / rang de sort, on récupère la nouvelle liste des sorts
|
|
-- Si le Démoniste apprend un nouveau sort de buff ou d'invocation, on recrée les boutons
|
|
elseif (event == "LEARNED_SPELL_IN_TAB") then
|
|
Necrosis_SpellSetup();
|
|
Necrosis_CreateMenu();
|
|
Necrosis_ButtonSetup();
|
|
|
|
-- A la fin du combat, on arrête de signaler le Crépuscule
|
|
-- On enlève les timers de sorts ainsi que les noms des mobs
|
|
elseif (event == "PLAYER_REGEN_ENABLED") then
|
|
PlayerCombat = false;
|
|
SpellGroup, SpellTimer, TimerTable = Necrosis_RetraitTimerCombat(SpellGroup, SpellTimer, TimerTable);
|
|
for i = 1, 10, 1 do
|
|
local frameName = "NecrosisTarget"..i.."Text";
|
|
local frameItem = getglobal(frameName);
|
|
if frameItem:IsShown() then
|
|
frameItem:Hide();
|
|
end
|
|
end
|
|
-- Quand le démoniste change de démon
|
|
elseif (event == "UNIT_PET" and arg1 == "player") then
|
|
Necrosis_ChangeDemon();
|
|
-- Actions personnelles -- "Buffs"
|
|
elseif (event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS") then
|
|
Necrosis_SelfEffect("BUFF");
|
|
-- Actions personnelles -- "Debuffs"
|
|
elseif event == "CHAT_MSG_SPELL_AURA_GONE_SELF" or event == "CHAT_MSG_SPELL_BREAK_AURA" then
|
|
Necrosis_SelfEffect("DEBUFF");
|
|
elseif event == "PLAYER_REGEN_DISABLED" then
|
|
PlayerCombat = true;
|
|
-- Fin de l'écran de chargement
|
|
end
|
|
return;
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------
|
|
-- FONCTIONS NECROSIS "ON EVENT"
|
|
------------------------------------------------------------------------------------------------------
|
|
|
|
-- Events : PLAYER_ENTERING_WORLD et PLAYER_LEAVING_WORLD
|
|
-- Fonction appliquée à chaque écran de chargement
|
|
-- Quand on sort d'une zone, on arrête de surveiller les envents
|
|
-- Quand on rentre dans une zone, on reprend la surveillance
|
|
-- Cela permet d'éviter un temps de chargement trop long du mod
|
|
function Necrosis_RegisterManagement(RegistrationType)
|
|
if RegistrationType == "IN" then
|
|
NecrosisButton:RegisterEvent("BAG_UPDATE");
|
|
NecrosisButton:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS");
|
|
NecrosisButton:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_SELF");
|
|
NecrosisButton:RegisterEvent("CHAT_MSG_SPELL_BREAK_AURA");
|
|
NecrosisButton:RegisterEvent("PLAYER_REGEN_DISABLED");
|
|
NecrosisButton:RegisterEvent("PLAYER_REGEN_ENABLED");
|
|
NecrosisButton:RegisterEvent("UNIT_PET");
|
|
NecrosisButton:RegisterEvent("SPELLCAST_START");
|
|
NecrosisButton:RegisterEvent("SPELLCAST_FAILED");
|
|
NecrosisButton:RegisterEvent("SPELLCAST_INTERRUPTED");
|
|
NecrosisButton:RegisterEvent("SPELLCAST_STOP");
|
|
NecrosisButton:RegisterEvent("LEARNED_SPELL_IN_TAB");
|
|
NecrosisButton:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE");
|
|
NecrosisButton:RegisterEvent("PLAYER_TARGET_CHANGED");
|
|
NecrosisButton:RegisterEvent("TRADE_REQUEST");
|
|
NecrosisButton:RegisterEvent("TRADE_REQUEST_CANCEL");
|
|
NecrosisButton:RegisterEvent("TRADE_SHOW");
|
|
NecrosisButton:RegisterEvent("TRADE_CLOSED");
|
|
else
|
|
NecrosisButton:UnregisterEvent("BAG_UPDATE");
|
|
NecrosisButton:UnregisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS");
|
|
NecrosisButton:UnregisterEvent("CHAT_MSG_SPELL_AURA_GONE_SELF");
|
|
NecrosisButton:UnregisterEvent("CHAT_MSG_SPELL_BREAK_AURA");
|
|
NecrosisButton:UnregisterEvent("PLAYER_REGEN_DISABLED");
|
|
NecrosisButton:UnregisterEvent("PLAYER_REGEN_ENABLED");
|
|
NecrosisButton:UnregisterEvent("UNIT_PET");
|
|
NecrosisButton:UnregisterEvent("SPELLCAST_START");
|
|
NecrosisButton:UnregisterEvent("SPELLCAST_FAILED");
|
|
NecrosisButton:UnregisterEvent("SPELLCAST_INTERRUPTED");
|
|
NecrosisButton:UnregisterEvent("SPELLCAST_STOP");
|
|
NecrosisButton:UnregisterEvent("LEARNED_SPELL_IN_TAB");
|
|
NecrosisButton:UnregisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE");
|
|
NecrosisButton:UnregisterEvent("PLAYER_TARGET_CHANGED");
|
|
NecrosisButton:UnregisterEvent("TRADE_REQUEST");
|
|
NecrosisButton:UnregisterEvent("TRADE_REQUEST_CANCEL");
|
|
NecrosisButton:UnregisterEvent("TRADE_SHOW");
|
|
NecrosisButton:UnregisterEvent("TRADE_CLOSED");
|
|
end
|
|
return;
|
|
end
|
|
|
|
-- event : UNIT_PET
|
|
-- Permet de timer les asservissements, ainsi que de prévenir pour les ruptures d'asservissement
|
|
-- Change également le nom du pet au remplacement de celui-ci
|
|
function Necrosis_ChangeDemon()
|
|
-- Si le nouveau démon est un démon asservi, on place un timer de 5 minutes
|
|
if (Necrosis_UnitHasEffect("pet", NECROSIS_SPELL_TABLE[10].Name)) then
|
|
if (not DemonEnslaved) then
|
|
DemonEnslaved = true;
|
|
SpellGroup, SpellTimer, TimerTable = Necrosis_InsertTimerParTable(10, "","", SpellGroup, SpellTimer, TimerTable);
|
|
end
|
|
else
|
|
-- Quand le démon asservi est perdu, on retire le Timer et on prévient le Démoniste
|
|
if (DemonEnslaved) then
|
|
DemonEnslaved = false;
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParNom(NECROSIS_SPELL_TABLE[10].Name, SpellTimer, TimerTable);
|
|
if NecrosisConfig.Sound then PlaySoundFile(NECROSIS_SOUND.EnslaveEnd); end
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Information.EnslaveBreak, "USER");
|
|
end
|
|
end
|
|
|
|
-- Si le démon n'est pas asservi on définit son titre, et on met à jour son nom dans Necrosis
|
|
DemonType = UnitCreatureFamily("pet");
|
|
for i = 1, 4, 1 do
|
|
if DemonType == NECROSIS_PET_LOCAL_NAME[i] and NecrosisConfig.PetName[i] == " " and UnitName("pet") ~= UNKNOWNOBJECT then
|
|
NecrosisConfig.PetName[i] = UnitName("pet");
|
|
NecrosisLocalization();
|
|
break;
|
|
end
|
|
end
|
|
|
|
return;
|
|
end
|
|
|
|
-- events : CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS, CHAT_MSG_SPELL_AURA_GONE_SELF et CHAT_MSG_SPELL_BREAK_AURA
|
|
-- Permet de gérer les effets apparaissants et disparaissants sur le démoniste
|
|
-- Basé sur le CombatLog
|
|
function Necrosis_SelfEffect(action)
|
|
if action == "BUFF" then
|
|
-- Insertion d'un timer quand le Démoniste subit "Sacrifice"
|
|
if arg1 == NECROSIS_TRANSLATION.SacrificeGain then
|
|
SpellGroup, SpellTimer, TimerTable = Necrosis_InsertTimerParTable(17, "", "", SpellGroup, SpellTimer, TimerTable);
|
|
end
|
|
-- Changement du bouton de monture quand le Démoniste chevauche
|
|
if string.find(arg1, NECROSIS_SPELL_TABLE[1].Name) or string.find(arg1, NECROSIS_SPELL_TABLE[2].Name) then
|
|
NecrosisMounted = true;
|
|
if NecrosisConfig.SteedSummon and NecrosisTellMounted
|
|
and NecrosisConfig.ChatMsg and NECROSIS_PET_MESSAGE[6] and not NecrosisConfig.SM
|
|
then
|
|
local tempnum = random(1, table.getn(NECROSIS_PET_MESSAGE[6]));
|
|
while tempnum == SteedMess and table.getn(NECROSIS_PET_MESSAGE[6]) >= 2 do
|
|
tempnum = random(1, table.getn(NECROSIS_PET_MESSAGE[6]));
|
|
end
|
|
SteedMess = tempnum;
|
|
for i = 1, table.getn(NECROSIS_PET_MESSAGE[6][tempnum]) do
|
|
Necrosis_Msg(Necrosis_MsgReplace(NECROSIS_PET_MESSAGE[6][tempnum][i]), "SAY");
|
|
end
|
|
NecrosisTellMounted = false;
|
|
end
|
|
NecrosisMountButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\MountButton-02");
|
|
|
|
end
|
|
-- Changement du bouton de la domination corrompue si celle-ci est activée + Timer de cooldown
|
|
if string.find(arg1, NECROSIS_SPELL_TABLE[15].Name) and NECROSIS_SPELL_TABLE[15].ID ~= nil then
|
|
DominationUp = true;
|
|
NecrosisPetMenu1:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Domination-02");
|
|
end
|
|
-- Changement du bouton de la malédiction amplifiée si celle-ci est activée + Timer de cooldown
|
|
if string.find(arg1, NECROSIS_SPELL_TABLE[42].Name) and NECROSIS_SPELL_TABLE[42].ID ~= nil then
|
|
AmplifyUp = true;
|
|
NecrosisCurseMenu1:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Amplify-02");
|
|
end
|
|
else
|
|
-- Changement du bouton de monture quand le Démoniste est démonté
|
|
if string.find(arg1, NECROSIS_SPELL_TABLE[1].Name) or string.find(arg1, NECROSIS_SPELL_TABLE[2].Name) then
|
|
NecrosisMounted = false;
|
|
NecrosisTellMounted = true;
|
|
NecrosisMountButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\MountButton-01");
|
|
end
|
|
-- Changement du bouton de Domination quand le Démoniste n'est plus sous son emprise
|
|
if string.find(arg1, NECROSIS_SPELL_TABLE[15].Name) and NECROSIS_SPELL_TABLE[15].ID ~= nil then
|
|
DominationUp = false;
|
|
NecrosisPetMenu1:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Domination-01");
|
|
end
|
|
-- Changement du bouton de la malédiction amplifiée quand le Démoniste n'est plus sous son emprise
|
|
if string.find(arg1, NECROSIS_SPELL_TABLE[42].Name) and NECROSIS_SPELL_TABLE[42].ID ~= nil then
|
|
AmplifyUp = false;
|
|
NecrosisCurseMenu1:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Amplify-01");
|
|
end
|
|
end
|
|
return;
|
|
end
|
|
|
|
-- event : SPELLCAST_STOP
|
|
-- Permet de gérer tout ce qui touche aux sorts une fois leur incantation réussie
|
|
function Necrosis_SpellManagement()
|
|
local SortActif = false;
|
|
if (SpellCastName) then
|
|
-- Si le sort lancé à été une Résurrection de Pierre d'âme, on place un timer
|
|
if (SpellCastName == NECROSIS_SPELL_TABLE[11].Name) then
|
|
if SpellTargetName == UnitName("player") then
|
|
SpellTargetName = "";
|
|
end
|
|
-- Si les messages sont actifs et que la pierre est posée sur un joueur ciblé, hop, message !
|
|
if (NecrosisConfig.ChatMsg or NecrosisConfig.SM)
|
|
and SoulstoneUsedOnTarget then
|
|
SoulstoneTarget = SpellTargetName;
|
|
SoulstoneAdvice = true;
|
|
end
|
|
SpellGroup, SpellTimer, TimerTable = Necrosis_InsertTimerParTable(11, SpellTargetName, "", SpellGroup, SpellTimer, TimerTable);
|
|
-- Si le sort était un rituel d'invocation, alors on écrit une phrase a caractère informatif aux joueurs
|
|
elseif (SpellCastName == NECROSIS_TRANSLATION.SummoningRitual)
|
|
and (NecrosisConfig.ChatMsg or NecrosisConfig.SM)
|
|
and NECROSIS_INVOCATION_MESSAGES then
|
|
local tempnum = random(1, table.getn(NECROSIS_INVOCATION_MESSAGES));
|
|
while tempnum == TPMess and table.getn(NECROSIS_INVOCATION_MESSAGES) >= 2 do
|
|
tempnum = random(1, table.getn(NECROSIS_INVOCATION_MESSAGES));
|
|
end
|
|
TPMess = tempnum;
|
|
for i = 1, table.getn(NECROSIS_INVOCATION_MESSAGES[tempnum]) do
|
|
Necrosis_Msg(Necrosis_MsgReplace(NECROSIS_INVOCATION_MESSAGES[tempnum][i], SpellTargetName), "WORLD");
|
|
end
|
|
-- Pour les autres sorts castés, tentative de timer si valable
|
|
else
|
|
for spell=1, table.getn(NECROSIS_SPELL_TABLE), 1 do
|
|
if SpellCastName == NECROSIS_SPELL_TABLE[spell].Name and not (spell == 10) then
|
|
-- Si le timer existe déjà sur la cible, on le met à jour
|
|
for thisspell=1, table.getn(SpellTimer), 1 do
|
|
if SpellTimer[thisspell].Name == SpellCastName
|
|
and SpellTimer[thisspell].Target == SpellTargetName
|
|
and SpellTimer[thisspell].TargetLevel == SpellTargetLevel
|
|
and NECROSIS_SPELL_TABLE[spell].Type ~= 4
|
|
and spell ~= 16
|
|
then
|
|
-- Si c'est sort lancé déjà présent sur un mob, on remet le timer à fond
|
|
if spell ~= 9 or (spell == 9 and not Necrosis_UnitHasEffect("target", SpellCastName)) then
|
|
SpellTimer[thisspell].Time = NECROSIS_SPELL_TABLE[spell].Length;
|
|
SpellTimer[thisspell].TimeMax = floor(GetTime() + NECROSIS_SPELL_TABLE[spell].Length);
|
|
if spell == 9 and SpellCastRank == 1 then
|
|
SpellTimer[thisspell].Time = 20;
|
|
SpellTimer[thisspell].TimeMax = floor(GetTime() + 20);
|
|
end
|
|
end
|
|
SortActif = true;
|
|
break;
|
|
end
|
|
-- Si c'est un banish sur une nouvelle cible, on supprime le timer précédent
|
|
if SpellTimer[thisspell].Name == SpellCastName and spell == 9
|
|
and
|
|
(SpellTimer[thisspell].Target ~= SpellTargetName
|
|
or SpellTimer[thisspell].TargetLevel ~= SpellTargetLevel)
|
|
then
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParIndex(thisspell, SpellTimer, TimerTable);
|
|
SortActif = false;
|
|
break;
|
|
end
|
|
|
|
-- Si c'est un fear, on supprime le timer du fear précédent
|
|
if SpellTimer[thisspell].Name == SpellCastName and spell == 13 then
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParIndex(thisspell, SpellTimer, TimerTable);
|
|
SortActif = false;
|
|
break;
|
|
end
|
|
if SortActif then break; end
|
|
end
|
|
-- Si le timer est une malédiction, on enlève la précédente malédiction sur la cible
|
|
if (NECROSIS_SPELL_TABLE[spell].Type == 4) or (spell == 16) then
|
|
for thisspell=1, table.getn(SpellTimer), 1 do
|
|
-- Mais on garde le cooldown de la malédiction funeste
|
|
if SpellTimer[thisspell].Name == NECROSIS_SPELL_TABLE[16].Name then
|
|
SpellTimer[thisspell].Target = "";
|
|
SpellTimer[thisspell].TargetLevel = "";
|
|
end
|
|
if SpellTimer[thisspell].Type == 4
|
|
and SpellTimer[thisspell].Target == SpellTargetName
|
|
and SpellTimer[thisspell].TargetLevel == SpellTargetLevel
|
|
then
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParIndex(thisspell, SpellTimer, TimerTable);
|
|
break;
|
|
end
|
|
end
|
|
SortActif = false;
|
|
end
|
|
if not SortActif
|
|
and NECROSIS_SPELL_TABLE[spell].Type ~= 0
|
|
and spell ~= 10
|
|
then
|
|
|
|
if spell == 9 then
|
|
if SpellCastRank == 1 then
|
|
NECROSIS_SPELL_TABLE[spell].Length = 20;
|
|
else
|
|
NECROSIS_SPELL_TABLE[spell].Length = 30;
|
|
end
|
|
end
|
|
|
|
SpellGroup, SpellTimer, TimerTable = Necrosis_InsertTimerParTable(spell, SpellTargetName, SpellTargetLevel, SpellGroup, SpellTimer, TimerTable);
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
SpellCastName = nil;
|
|
SpellCastRank = nil;
|
|
return;
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------
|
|
-- FONCTIONS DE L'INTERFACE -- LIENS XML
|
|
------------------------------------------------------------------------------------------------------
|
|
|
|
-- En cliquant droit sur Necrosis, on affiche ou masque les deux panneaux de configurations
|
|
function Necrosis_Toggle(button)
|
|
if button == "LeftButton" then
|
|
if NECROSIS_SPELL_TABLE[41].ID then
|
|
CastSpell(NECROSIS_SPELL_TABLE[41].ID, "spell");
|
|
end
|
|
return;
|
|
elseif (NecrosisGeneralFrame:IsVisible()) then
|
|
HideUIPanel(NecrosisGeneralFrame);
|
|
return;
|
|
else
|
|
if NecrosisConfig.SM then
|
|
Necrosis_Msg("!!! Short Messages : <brightGreen>On", "USER");
|
|
end
|
|
ShowUIPanel(NecrosisGeneralFrame);
|
|
NecrosisGeneralTab_OnClick(1);
|
|
return;
|
|
end
|
|
end
|
|
|
|
-- Fonction permettant le déplacement d'éléments de Necrosis sur l'écran
|
|
function Necrosis_OnDragStart(button)
|
|
if (button == "NecrosisIcon") then GameTooltip:Hide(); end
|
|
button:StartMoving();
|
|
end
|
|
|
|
-- Fonction arrêtant le déplacement d'éléments de Necrosis sur l'écran
|
|
function Necrosis_OnDragStop(button)
|
|
if (button == "NecrosisIcon") then Necrosis_BuildTooltip("OVERALL"); end
|
|
button:StopMovingOrSizing();
|
|
end
|
|
|
|
-- Fonction alternant Timers graphiques et Timers textes
|
|
function Necrosis_HideGraphTimer()
|
|
for i = 1, 50, 1 do
|
|
local elements = {"Text", "Bar", "Texture", "OutText"}
|
|
if NecrosisConfig.Graphical then
|
|
if TimerTable[i] then
|
|
for j = 1, 4, 1 do
|
|
frameName = "NecrosisTimer"..i..elements[j];
|
|
frameItem = getglobal(frameName);
|
|
frameItem:Show();
|
|
end
|
|
end
|
|
else
|
|
for j = 1, 4, 1 do
|
|
frameName = "NecrosisTimer"..i..elements[j];
|
|
frameItem = getglobal(frameName);
|
|
frameItem:Hide();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Fonction gérant les bulles d'aide
|
|
function Necrosis_BuildTooltip(button, type, anchor)
|
|
|
|
-- Si l'affichage des bulles d'aide est désactivé, Bye bye !
|
|
if not NecrosisConfig.NecrosisToolTip then
|
|
return;
|
|
end
|
|
|
|
-- On regarde si la domination corrompue, le gardien de l'ombre ou l'amplification de malédiction sont up (pour tooltips)
|
|
local start, duration, start2, duration2, start3, duration3
|
|
if NECROSIS_SPELL_TABLE[15].ID then
|
|
start, duration = GetSpellCooldown(NECROSIS_SPELL_TABLE[15].ID, BOOKTYPE_SPELL);
|
|
else
|
|
start = 1;
|
|
duration = 1;
|
|
end
|
|
if NECROSIS_SPELL_TABLE[43].ID then
|
|
start2, duration2 = GetSpellCooldown(NECROSIS_SPELL_TABLE[43].ID, BOOKTYPE_SPELL);
|
|
else
|
|
start2 = 1;
|
|
duration2 = 1;
|
|
end
|
|
if NECROSIS_SPELL_TABLE[42].ID then
|
|
start3, duration3 = GetSpellCooldown(NECROSIS_SPELL_TABLE[42].ID, BOOKTYPE_SPELL);
|
|
else
|
|
start3 = 1;
|
|
duration3 = 1;
|
|
end
|
|
|
|
-- Création des bulles d'aides....
|
|
GameTooltip:SetOwner(button, anchor);
|
|
GameTooltip:SetText(NecrosisTooltipData[type].Label);
|
|
-- ..... pour le bouton principal
|
|
if (type == "Main") then
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.Soulshard..Soulshards);
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.InfernalStone..InfernalStone);
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.DemoniacStone..DemoniacStone);
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.Soulstone..NecrosisTooltipData[type].Stone[SoulstoneOnHand]);
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.Healthstone..NecrosisTooltipData[type].Stone[HealthstoneOnHand]);
|
|
-- On vérifie si une pierre de sort n'est pas équipée
|
|
NecrosisTooltip:SetInventoryItem("player", 17);
|
|
local rightHand = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
if string.find(rightHand, NECROSIS_ITEM.Spellstone) then SpellstoneOnHand = true; end
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.Spellstone..NecrosisTooltipData[type].Stone[SpellstoneOnHand]);
|
|
-- De même pour la pierre de feu
|
|
if string.find(rightHand, NECROSIS_ITEM.Firestone) then FirestoneOnHand = true; end
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.Firestone..NecrosisTooltipData[type].Stone[FirestoneOnHand]);
|
|
-- Affichage du nom du démon, ou s'il est asservi, ou "Aucun" si aucun démon n'est présent
|
|
if (DemonType) then
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.CurrentDemon..DemonType);
|
|
elseif DemonEnslaved then
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.EnslavedDemon);
|
|
else
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.NoCurrentDemon);
|
|
end
|
|
-- ..... pour les boutons de pierre
|
|
elseif (string.find(type, "stone")) then
|
|
-- Pierre d'âme
|
|
if (type == "Soulstone") then
|
|
-- On affiche le nom de la pierre et l'action que produira le clic sur le bouton
|
|
-- Et aussi le Temps de recharge
|
|
if SoulstoneMode == 1 or SoulstoneMode == 3 then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[StoneIDInSpellTable[1]].Mana.." Mana");
|
|
end
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetBagItem(SoulstoneLocation[1], SoulstoneLocation[2]);
|
|
local itemName = tostring(NecrosisTooltipTextLeft6:GetText());
|
|
GameTooltip:AddLine(NecrosisTooltipData[type].Text[SoulstoneMode]);
|
|
if string.find(itemName, NECROSIS_TRANSLATION.Cooldown) then
|
|
GameTooltip:AddLine(itemName);
|
|
end
|
|
-- Pierre de vie
|
|
elseif (type == "Healthstone") then
|
|
-- Idem
|
|
if HealthstoneMode == 1 then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[StoneIDInSpellTable[2]].Mana.." Mana");
|
|
end
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetBagItem(HealthstoneLocation[1], HealthstoneLocation[2]);
|
|
local itemName = tostring(NecrosisTooltipTextLeft6:GetText());
|
|
GameTooltip:AddLine(NecrosisTooltipData[type].Text[HealthstoneMode]);
|
|
if string.find(itemName, NECROSIS_TRANSLATION.Cooldown) then
|
|
GameTooltip:AddLine(itemName);
|
|
end
|
|
-- Pierre de sort
|
|
elseif (type == "Spellstone") then
|
|
-- Eadem
|
|
if SpellstoneMode == 1 then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[StoneIDInSpellTable[3]].Mana.." Mana");
|
|
end
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetInventoryItem("player", 17);
|
|
local itemName = tostring(NecrosisTooltipTextLeft9:GetText());
|
|
local itemStone = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
GameTooltip:AddLine(NecrosisTooltipData[type].Text[SpellstoneMode]);
|
|
if (string.find(itemStone, NECROSIS_ITEM.Spellstone)
|
|
and string.find(itemName, NECROSIS_TRANSLATION.Cooldown)) then
|
|
GameTooltip:AddLine(itemName);
|
|
end
|
|
-- Pierre de feu
|
|
elseif (type == "Firestone") then
|
|
-- Idem, mais sans le cooldown
|
|
if FirestoneMode == 1 then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[StoneIDInSpellTable[4]].Mana.." Mana");
|
|
end
|
|
GameTooltip:AddLine(NecrosisTooltipData[type].Text[FirestoneMode]);
|
|
end
|
|
-- ..... pour le bouton des Timers
|
|
elseif (type == "SpellTimer") then
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetBagItem(HearthstoneLocation[1], HearthstoneLocation[2]);
|
|
local itemName = tostring(NecrosisTooltipTextLeft5:GetText());
|
|
GameTooltip:AddLine(NecrosisTooltipData[type].Text);
|
|
if string.find(itemName, NECROSIS_TRANSLATION.Cooldown) then
|
|
GameTooltip:AddLine(NECROSIS_TRANSLATION.Hearth.." - "..itemName);
|
|
else
|
|
GameTooltip:AddLine(NecrosisTooltipData[type].Right..GetBindLocation());
|
|
end
|
|
|
|
-- ..... pour le bouton de la Transe de l'ombre
|
|
elseif (type == "ShadowTrance") then
|
|
local rank = Necrosis_FindSpellAttribute("Name", NECROSIS_NIGHTFALL.BoltName, "Rank");
|
|
GameTooltip:SetText(NecrosisTooltipData[type].Label.." |CFF808080Rank "..rank.."|r");
|
|
-- ..... pour les autres buffs et démons, le coût en mana...
|
|
elseif (type == "Enslave") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[35].Mana.." Mana");
|
|
if Soulshards == 0 then
|
|
GameTooltip:AddLine("|c00FF4444"..NecrosisTooltipData.Main.Soulshard..Soulshards.."|r");
|
|
end
|
|
elseif (type == "Mount") then
|
|
if NECROSIS_SPELL_TABLE[2].ID then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[2].Mana.." Mana");
|
|
elseif NECROSIS_SPELL_TABLE[1].ID then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[1].Mana.." Mana");
|
|
end
|
|
elseif (type == "Armor") then
|
|
if NECROSIS_SPELL_TABLE[31].ID then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[31].Mana.." Mana");
|
|
else
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[36].Mana.." Mana");
|
|
end
|
|
elseif (type == "Invisible") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[33].Mana.." Mana");
|
|
elseif (type == "Aqua") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[32].Mana.." Mana");
|
|
elseif (type == "Kilrogg") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[34].Mana.." Mana");
|
|
elseif (type == "Banish") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[9].Mana.." Mana");
|
|
elseif (type == "Weakness") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[23].Mana.." Mana");
|
|
if not (start3 > 0 and duration3 > 0) then
|
|
GameTooltip:AddLine(NecrosisTooltipData.AmplifyCooldown);
|
|
end
|
|
elseif (type == "Agony") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[22].Mana.." Mana");
|
|
if not (start3 > 0 and duration3 > 0) then
|
|
GameTooltip:AddLine(NecrosisTooltipData.AmplifyCooldown);
|
|
end
|
|
elseif (type == "Reckless") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[24].Mana.." Mana");
|
|
elseif (type == "Tongues") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[25].Mana.." Mana");
|
|
elseif (type == "Exhaust") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[40].Mana.." Mana");
|
|
if not (start3 > 0 and duration3 > 0) then
|
|
GameTooltip:AddLine(NecrosisTooltipData.AmplifyCooldown);
|
|
end
|
|
elseif (type == "Elements") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[26].Mana.." Mana");
|
|
elseif (type == "Shadow") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[27].Mana.." Mana");
|
|
elseif (type == "Doom") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[16].Mana.." Mana");
|
|
elseif (type == "Amplify") then
|
|
if start3 > 0 and duration3 > 0 then
|
|
local seconde = duration3 - ( GetTime() - start3)
|
|
local affiche, minute, time
|
|
if seconde <= 59 then
|
|
affiche = tostring(floor(seconde)).." sec";
|
|
else
|
|
minute = tostring(floor(seconde/60))
|
|
seconde = mod(seconde, 60);
|
|
if seconde <= 9 then
|
|
time = "0"..tostring(floor(seconde));
|
|
else
|
|
time = tostring(floor(seconde));
|
|
end
|
|
affiche = minute..":"..time;
|
|
end
|
|
GameTooltip:AddLine("Cooldown : "..affiche);
|
|
end
|
|
elseif (type == "TP") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[37].Mana.." Mana");
|
|
if Soulshards == 0 then
|
|
GameTooltip:AddLine("|c00FF4444"..NecrosisTooltipData.Main.Soulshard..Soulshards.."|r");
|
|
end
|
|
elseif (type == "SoulLink") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[38].Mana.." Mana");
|
|
elseif (type == "ShadowProtection") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[43].Mana.." Mana");
|
|
if start2 > 0 and duration2 > 0 then
|
|
local seconde = duration2 - ( GetTime() - start2)
|
|
local affiche
|
|
affiche = tostring(floor(seconde)).." sec";
|
|
GameTooltip:AddLine("Cooldown : "..affiche);
|
|
end
|
|
elseif (type == "Domination") then
|
|
if start > 0 and duration > 0 then
|
|
local seconde = duration - ( GetTime() - start)
|
|
local affiche, minute, time
|
|
if seconde <= 59 then
|
|
affiche = tostring(floor(seconde)).." sec";
|
|
else
|
|
minute = tostring(floor(seconde/60))
|
|
seconde = mod(seconde, 60);
|
|
if seconde <= 9 then
|
|
time = "0"..tostring(floor(seconde));
|
|
else
|
|
time = tostring(floor(seconde));
|
|
end
|
|
affiche = minute..":"..time;
|
|
end
|
|
GameTooltip:AddLine("Cooldown : "..affiche);
|
|
end
|
|
elseif (type == "Imp") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[3].Mana.." Mana");
|
|
if not (start > 0 and duration > 0) then
|
|
GameTooltip:AddLine(NecrosisTooltipData.DominationCooldown);
|
|
end
|
|
|
|
elseif (type == "Void") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[4].Mana.." Mana");
|
|
if Soulshards == 0 then
|
|
GameTooltip:AddLine("|c00FF4444"..NecrosisTooltipData.Main.Soulshard..Soulshards.."|r");
|
|
elseif not (start > 0 and duration > 0) then
|
|
GameTooltip:AddLine(NecrosisTooltipData.DominationCooldown);
|
|
end
|
|
elseif (type == "Succubus") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[5].Mana.." Mana");
|
|
if Soulshards == 0 then
|
|
GameTooltip:AddLine("|c00FF4444"..NecrosisTooltipData.Main.Soulshard..Soulshards.."|r");
|
|
elseif not (start > 0 and duration > 0) then
|
|
GameTooltip:AddLine(NecrosisTooltipData.DominationCooldown);
|
|
end
|
|
elseif (type == "Fel") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[6].Mana.." Mana");
|
|
if Soulshards == 0 then
|
|
GameTooltip:AddLine("|c00FF4444"..NecrosisTooltipData.Main.Soulshard..Soulshards.."|r");
|
|
elseif not (start > 0 and duration > 0) then
|
|
GameTooltip:AddLine(NecrosisTooltipData.DominationCooldown);
|
|
end
|
|
elseif (type == "Infernal") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[8].Mana.." Mana");
|
|
if InfernalStone == 0 then
|
|
GameTooltip:AddLine("|c00FF4444"..NecrosisTooltipData.Main.InfernalStone..InfernalStone.."|r");
|
|
else
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.InfernalStone..InfernalStone);
|
|
end
|
|
elseif (type == "Doomguard") then
|
|
GameTooltip:AddLine(NECROSIS_SPELL_TABLE[30].Mana.." Mana");
|
|
if DemoniacStone == 0 then
|
|
GameTooltip:AddLine("|c00FF4444"..NecrosisTooltipData.Main.DemoniacStone..DemoniacStone.."|r");
|
|
else
|
|
GameTooltip:AddLine(NecrosisTooltipData.Main.DemoniacStone..DemoniacStone);
|
|
end
|
|
elseif (type == "Buff") and LastBuff ~= 0 then
|
|
GameTooltip:AddLine(NecrosisTooltipData.LastSpell..NECROSIS_SPELL_TABLE[LastBuff].Name);
|
|
elseif (type == "Curse") and LastCurse ~= 0 then
|
|
GameTooltip:AddLine(NecrosisTooltipData.LastSpell..NECROSIS_SPELL_TABLE[LastCurse].Name);
|
|
elseif (type == "Pet") and LastDemon ~= 0 then
|
|
GameTooltip:AddLine(NecrosisTooltipData.LastSpell..NECROSIS_PET_LOCAL_NAME[(LastDemon - 2)]);
|
|
end
|
|
-- Et hop, affichage !
|
|
GameTooltip:Show();
|
|
end
|
|
|
|
-- Fonction mettant à jour les boutons Necrosis et donnant l'état du bouton de la pierre d'âme
|
|
function Necrosis_UpdateIcons()
|
|
-- Pierre d'âme
|
|
-----------------------------------------------
|
|
|
|
-- On se renseigne pour savoir si une pierre d'âme a été utilisée --> vérification dans les timers
|
|
local SoulstoneInUse = false;
|
|
if SpellTimer then
|
|
for index = 1, table.getn(SpellTimer), 1 do
|
|
if (SpellTimer[index].Name == NECROSIS_SPELL_TABLE[11].Name) and SpellTimer[index].TimeMax > 0 then
|
|
SoulstoneInUse = true;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Si la Pierre n'a pas été utilisée, et qu'il n'y a pas de pierre en inventaire -> Mode 1
|
|
if not (SoulstoneOnHand or SoulstoneInUse) then
|
|
SoulstoneMode = 1;
|
|
SoulstoneWaiting = false;
|
|
SoulstoneCooldown = false;
|
|
end
|
|
|
|
-- Si la Pierre n'a pas été utilisée, mais qu'il y a une pierre en inventaire
|
|
if SoulstoneOnHand and (not SoulstoneInUse) then
|
|
-- Si la pierre en inventaire contient un timer, et qu'on sort d'un RL --> Mode 4
|
|
local start, duration = GetContainerItemCooldown(SoulstoneLocation[1],SoulstoneLocation[2]);
|
|
if NecrosisRL and start > 0 and duration > 0 then
|
|
SpellGroup, SpellTimer, TimerTable = Necrosis_InsertTimerStone("Soulstone", start, duration, SpellGroup, SpellTimer, TimerTable);
|
|
SoulstoneMode = 4;
|
|
NecrosisRL = false;
|
|
SoulstoneWaiting = false;
|
|
SoulstoneCooldown = true;
|
|
-- Si la pierre ne contient pas de timer, ou qu'on ne sort pas d'un RL --> Mode 2
|
|
else
|
|
SoulstoneMode = 2;
|
|
NecrosisRL = false;
|
|
SoulstoneWaiting = false;
|
|
SoulstoneCooldown = false;
|
|
end
|
|
end
|
|
|
|
-- Si la Pierre a été utilisée mais qu'il n'y a pas de pierre en inventaire --> Mode 3
|
|
if (not SoulstoneOnHand) and SoulstoneInUse then
|
|
SoulstoneMode = 3;
|
|
SoulstoneWaiting = true;
|
|
-- Si on vient de poser la pierre, on l'annonce au raid
|
|
if SoulstoneAdvice and NECROSIS_SOULSTONE_ALERT_MESSAGE then
|
|
local tempnum = random(1, table.getn(NECROSIS_SOULSTONE_ALERT_MESSAGE));
|
|
while tempnum == RezMess and table.getn(NECROSIS_SOULSTONE_ALERT_MESSAGE) >= 2 do
|
|
tempnum = random(1, table.getn(NECROSIS_SOULSTONE_ALERT_MESSAGE));
|
|
end
|
|
RezMess = tempnum;
|
|
for i = 1, table.getn(NECROSIS_SOULSTONE_ALERT_MESSAGE[tempnum]) do
|
|
Necrosis_Msg(Necrosis_MsgReplace(NECROSIS_SOULSTONE_ALERT_MESSAGE[tempnum][i], SoulstoneTarget), "WORLD");
|
|
end
|
|
SoulstoneAdvice = false;
|
|
end
|
|
end
|
|
|
|
-- Si la Pierre a été utilisée et qu'il y a une pierre en inventaire
|
|
if SoulstoneOnHand and SoulstoneInUse then
|
|
SoulstoneAdvice = false;
|
|
if not (SoulstoneWaiting or SoulstoneCooldown) then
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParNom(NECROSIS_SPELL_TABLE[11].Name, SpellTimer, TimerTable);
|
|
SoulstoneMode = 2;
|
|
else
|
|
SoulstoneWaiting = false;
|
|
SoulstoneCooldown = true;
|
|
SoulstoneMode = 4;
|
|
end
|
|
end
|
|
|
|
-- Affichage de l'icone liée au mode
|
|
NecrosisSoulstoneButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\SoulstoneButton-0"..SoulstoneMode);
|
|
|
|
-- Pierre de vie
|
|
-----------------------------------------------
|
|
|
|
-- Mode "j'en ai une" (2) / "j'en ai pas" (1)
|
|
if (HealthstoneOnHand) then
|
|
HealthstoneMode = 2;
|
|
else
|
|
HealthstoneMode = 1;
|
|
end
|
|
|
|
-- Affichage de l'icone liée au mode
|
|
NecrosisHealthstoneButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\HealthstoneButton-0"..HealthstoneMode);
|
|
|
|
-- Pierre de sort
|
|
-----------------------------------------------
|
|
|
|
-- Si la pierre est équipée, mode 3
|
|
local rightHand = GetInventoryItemTexture("player", 17);
|
|
if (rightHand == "Interface\\Icons\\INV_Misc_Gem_Sapphire_01" and not SpellstoneOnHand) then
|
|
SpellstoneMode = 3;
|
|
else
|
|
-- Pierre dans l'inventaire, mode 2
|
|
if (SpellstoneOnHand) then
|
|
SpellstoneMode = 2;
|
|
-- Pierre inexistante, mode 1
|
|
else
|
|
SpellstoneMode = 1;
|
|
end
|
|
end
|
|
|
|
-- Affichage de l'icone liée au mode
|
|
NecrosisSpellstoneButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\SpellstoneButton-0"..SpellstoneMode);
|
|
|
|
-- Pierre de feu
|
|
-----------------------------------------------
|
|
|
|
-- Pierre équipée = mode 3
|
|
if (rightHand == "Interface\\Icons\\INV_Misc_Gem_Bloodstone_02" and not FirestoneOnHand) then
|
|
FirestoneMode = 3;
|
|
-- Pierre dans l'inventaire = mode 2
|
|
elseif (FirestoneOnHand) then
|
|
FirestoneMode = 2;
|
|
-- Pierre inexistante = mode 1
|
|
else
|
|
FirestoneMode = 1;
|
|
end
|
|
|
|
-- Affichage de l'icone liée au mode
|
|
NecrosisFirestoneButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\FirestoneButton-0"..FirestoneMode);
|
|
|
|
|
|
-- Bouton des démons
|
|
-----------------------------------------------
|
|
local mana = UnitMana("player");
|
|
|
|
local ManaPet = {"1", "1", "1", "1", "1", "1"};
|
|
|
|
-- Si cooldown de domination corrompue on grise
|
|
if NECROSIS_SPELL_TABLE[15].ID and not DominationUp then
|
|
local start, duration = GetSpellCooldown(NECROSIS_SPELL_TABLE[15].ID, "spell");
|
|
if start > 0 and duration > 0 then
|
|
NecrosisPetMenu1:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Domination-03");
|
|
else
|
|
NecrosisPetMenu1:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Domination-01");
|
|
end
|
|
end
|
|
|
|
-- Si cooldown de gardien de l'ombre on grise
|
|
if NECROSIS_SPELL_TABLE[43].ID then
|
|
local start2, duration2 = GetSpellCooldown(NECROSIS_SPELL_TABLE[43].ID, "spell");
|
|
if start2 > 0 and duration2 > 0 then
|
|
NecrosisBuffMenu8:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\ShadowWard-03");
|
|
else
|
|
NecrosisBuffMenu8:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\ShadowWard-01");
|
|
end
|
|
end
|
|
|
|
-- Si cooldown de la malédiction amplifiée on grise
|
|
if NECROSIS_SPELL_TABLE[42].ID and not AmplifyUp then
|
|
local start3, duration3 = GetSpellCooldown(NECROSIS_SPELL_TABLE[42].ID, "spell");
|
|
if start3 > 0 and duration3 > 0 then
|
|
NecrosisCurseMenu1:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Amplify-03");
|
|
else
|
|
NecrosisCurseMenu1:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Amplify-01");
|
|
end
|
|
end
|
|
|
|
if mana ~= nil then
|
|
-- Coloration du bouton en grisé si pas assez de mana
|
|
if NECROSIS_SPELL_TABLE[3].ID then
|
|
if NECROSIS_SPELL_TABLE[3].Mana > mana then
|
|
for i = 1, 6, 1 do
|
|
ManaPet[i] = "3";
|
|
end
|
|
elseif NECROSIS_SPELL_TABLE[4].ID then
|
|
if NECROSIS_SPELL_TABLE[4].Mana > mana then
|
|
for i = 2, 6, 1 do
|
|
ManaPet[i] = "3";
|
|
end
|
|
elseif NECROSIS_SPELL_TABLE[8].ID then
|
|
if NECROSIS_SPELL_TABLE[8].Mana > mana then
|
|
for i = 5, 6, 1 do
|
|
ManaPet[i] = "3";
|
|
end
|
|
elseif NECROSIS_SPELL_TABLE[30].ID then
|
|
if NECROSIS_SPELL_TABLE[30].Mana > mana then
|
|
ManaPet[6] = "3";
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Coloration du bouton en grisé si pas de pierre pour l'invocation
|
|
if Soulshards == 0 then
|
|
for i = 2, 4, 1 do
|
|
ManaPet[i] = "3";
|
|
end
|
|
end
|
|
if InfernalStone == 0 then
|
|
ManaPet[5] = "3";
|
|
end
|
|
if DemoniacStone == 0 then
|
|
ManaPet[6] = "3";
|
|
end
|
|
|
|
-- Texturage des boutons de pet
|
|
if DemonType == NECROSIS_PET_LOCAL_NAME[1] then
|
|
NecrosisPetMenu2:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Imp-02");
|
|
NecrosisPetMenu3:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Voidwalker-0"..ManaPet[2]);
|
|
NecrosisPetMenu4:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Succubus-0"..ManaPet[3]);
|
|
NecrosisPetMenu5:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Felhunter-0"..ManaPet[4]);
|
|
NecrosisPetMenu6:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Infernal-0"..ManaPet[5]);
|
|
NecrosisPetMenu7:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Doomguard-0"..ManaPet[6]);
|
|
elseif DemonType == NECROSIS_PET_LOCAL_NAME[2] then
|
|
NecrosisPetMenu2:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Imp-0"..ManaPet[1]);
|
|
NecrosisPetMenu3:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Voidwalker-02");
|
|
NecrosisPetMenu4:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Succubus-0"..ManaPet[3]);
|
|
NecrosisPetMenu5:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Felhunter-0"..ManaPet[4]);
|
|
NecrosisPetMenu6:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Infernal-0"..ManaPet[5]);
|
|
NecrosisPetMenu7:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Doomguard-0"..ManaPet[6]);
|
|
elseif DemonType == NECROSIS_PET_LOCAL_NAME[3] then
|
|
NecrosisPetMenu2:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Imp-0"..ManaPet[1]);
|
|
NecrosisPetMenu3:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Voidwalker-0"..ManaPet[2]);
|
|
NecrosisPetMenu4:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Succubus-02");
|
|
NecrosisPetMenu5:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Felhunter-0"..ManaPet[4]);
|
|
NecrosisPetMenu6:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Infernal-0"..ManaPet[5]);
|
|
NecrosisPetMenu7:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Doomguard-0"..ManaPet[6]);
|
|
elseif DemonType == NECROSIS_PET_LOCAL_NAME[4] then
|
|
NecrosisPetMenu2:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Imp-0"..ManaPet[1]);
|
|
NecrosisPetMenu3:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Voidwalker-0"..ManaPet[2]);
|
|
NecrosisPetMenu4:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Succubus-0"..ManaPet[3]);
|
|
NecrosisPetMenu5:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Felhunter-02");
|
|
NecrosisPetMenu6:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Infernal-0"..ManaPet[5]);
|
|
NecrosisPetMenu7:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Doomguard-0"..ManaPet[6]);
|
|
elseif DemonType == NECROSIS_PET_LOCAL_NAME[5] then
|
|
NecrosisPetMenu2:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Imp-0"..ManaPet[1]);
|
|
NecrosisPetMenu3:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Voidwalker-0"..ManaPet[2]);
|
|
NecrosisPetMenu4:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Succubus-0"..ManaPet[3]);
|
|
NecrosisPetMenu5:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Felhunter-0"..ManaPet[4])
|
|
NecrosisPetMenu6:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Infernal-02");
|
|
NecrosisPetMenu7:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Doomguard-0"..ManaPet[6]);
|
|
elseif DemonType == NECROSIS_PET_LOCAL_NAME[6] then
|
|
NecrosisPetMenu2:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Imp-0"..ManaPet[1]);
|
|
NecrosisPetMenu3:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Voidwalker-0"..ManaPet[2]);
|
|
NecrosisPetMenu4:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Succubus-0"..ManaPet[3]);
|
|
NecrosisPetMenu5:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Felhunter-0"..ManaPet[4])
|
|
NecrosisPetMenu6:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Infernal-0"..ManaPet[5]);
|
|
NecrosisPetMenu7:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Doomguard-02");
|
|
else
|
|
NecrosisPetMenu2:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Imp-0"..ManaPet[1]);
|
|
NecrosisPetMenu3:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Voidwalker-0"..ManaPet[2]);
|
|
NecrosisPetMenu4:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Succubus-0"..ManaPet[3]);
|
|
NecrosisPetMenu5:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Felhunter-0"..ManaPet[4])
|
|
NecrosisPetMenu6:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Infernal-0"..ManaPet[5]);
|
|
NecrosisPetMenu7:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\Doomguard-0"..ManaPet[6]);
|
|
end
|
|
|
|
|
|
-- Bouton des buffs
|
|
-----------------------------------------------
|
|
|
|
if mana ~= nil then
|
|
-- Coloration du bouton en grisé si pas assez de mana
|
|
if MountAvailable and not NecrosisMounted then
|
|
if NECROSIS_SPELL_TABLE[2].ID then
|
|
if NECROSIS_SPELL_TABLE[2].Mana > mana or PlayerCombat then
|
|
NecrosisMountButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\MountButton-03");
|
|
else
|
|
NecrosisMountButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\MountButton-01");
|
|
end
|
|
else
|
|
if NECROSIS_SPELL_TABLE[1].Mana > mana or PlayerCombat then
|
|
NecrosisMountButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\MountButton-03");
|
|
else
|
|
NecrosisMountButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\MountButton-01");
|
|
end
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[35].ID then
|
|
if NECROSIS_SPELL_TABLE[35].Mana > mana or Soulshards == 0 then
|
|
NecrosisPetMenu8:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Enslave-03");
|
|
else
|
|
NecrosisPetMenu8:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Enslave-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[31].ID then
|
|
if NECROSIS_SPELL_TABLE[31].Mana > mana then
|
|
NecrosisBuffMenu1:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\ArmureDemo-03");
|
|
else
|
|
NecrosisBuffMenu1:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\ArmureDemo-01");
|
|
end
|
|
elseif NECROSIS_SPELL_TABLE[36].ID then
|
|
if NECROSIS_SPELL_TABLE[36].Mana > mana then
|
|
NecrosisBuffMenu1:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\ArmureDemo-03");
|
|
else
|
|
NecrosisBuffMenu1:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\ArmureDemo-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[32].ID then
|
|
if NECROSIS_SPELL_TABLE[32].Mana > mana then
|
|
NecrosisBuffMenu2:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Aqua-03");
|
|
else
|
|
NecrosisBuffMenu2:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Aqua-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[33].ID then
|
|
if NECROSIS_SPELL_TABLE[33].Mana > mana then
|
|
NecrosisBuffMenu3:SetNormalTexture("Interface\\AddOns\\Necrosis\\\UI\\Invisible-03");
|
|
else
|
|
NecrosisBuffMenu3:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Invisible-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[34].ID then
|
|
if NECROSIS_SPELL_TABLE[34].Mana > mana then
|
|
NecrosisBuffMenu4:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Kilrogg-03");
|
|
else
|
|
NecrosisBuffMenu4:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Kilrogg-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[37].ID then
|
|
if NECROSIS_SPELL_TABLE[37].Mana > mana or Soulshards == 0 then
|
|
NecrosisBuffMenu5:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\TPButton-05");
|
|
else
|
|
NecrosisBuffMenu5:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\TPButton-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[38].ID then
|
|
if NECROSIS_SPELL_TABLE[38].Mana > mana then
|
|
NecrosisBuffMenu7:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Lien-03");
|
|
else
|
|
NecrosisBuffMenu7:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Lien-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[43].ID then
|
|
if NECROSIS_SPELL_TABLE[43].Mana > mana then
|
|
NecrosisBuffMenu8:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\ShadowWard-03");
|
|
else
|
|
NecrosisBuffMenu8:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\ShadowWard-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[9].ID then
|
|
if NECROSIS_SPELL_TABLE[9].Mana > mana then
|
|
NecrosisBuffMenu9:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Banish-03");
|
|
else
|
|
NecrosisBuffMenu9:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Banish-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[44].ID then
|
|
if (NECROSIS_SPELL_TABLE[44].Mana > mana) or (not UnitExists("Pet")) then
|
|
NecrosisPetMenu9:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Sacrifice-03");
|
|
else
|
|
NecrosisPetMenu9:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Sacrifice-01");
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-- Bouton des curses
|
|
-----------------------------------------------
|
|
|
|
if mana ~= nil then
|
|
-- Coloration du bouton en grisé si pas assez de mana
|
|
if NECROSIS_SPELL_TABLE[23].ID then
|
|
if NECROSIS_SPELL_TABLE[23].Mana > mana then
|
|
NecrosisCurseMenu2:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Weakness-03");
|
|
else
|
|
NecrosisCurseMenu2:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Weakness-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[22].ID then
|
|
if NECROSIS_SPELL_TABLE[22].Mana > mana then
|
|
NecrosisCurseMenu3:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Agony-03");
|
|
else
|
|
NecrosisCurseMenu3:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Agony-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[24].ID then
|
|
if NECROSIS_SPELL_TABLE[24].Mana > mana then
|
|
NecrosisCurseMenu4:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Reckless-03");
|
|
else
|
|
NecrosisCurseMenu4:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Reckless-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[25].ID then
|
|
if NECROSIS_SPELL_TABLE[25].Mana > mana then
|
|
NecrosisCurseMenu5:SetNormalTexture("Interface\\AddOns\\Necrosis\\\UI\\Tongues-03");
|
|
else
|
|
NecrosisCurseMenu5:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Tongues-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[40].ID then
|
|
if NECROSIS_SPELL_TABLE[40].Mana > mana then
|
|
NecrosisCurseMenu6:SetNormalTexture("Interface\\AddOns\\Necrosis\\\UI\\Exhaust-03");
|
|
else
|
|
NecrosisCurseMenu6:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Exhaust-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[26].ID then
|
|
if NECROSIS_SPELL_TABLE[26].Mana > mana then
|
|
NecrosisCurseMenu7:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Elements-03");
|
|
else
|
|
NecrosisCurseMenu7:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Elements-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[27].ID then
|
|
if NECROSIS_SPELL_TABLE[27].Mana > mana then
|
|
NecrosisCurseMenu8:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Shadow-03");
|
|
else
|
|
NecrosisCurseMenu8:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Shadow-01");
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[16].ID then
|
|
if NECROSIS_SPELL_TABLE[16].Mana > mana then
|
|
NecrosisCurseMenu9:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Doom-03");
|
|
else
|
|
NecrosisCurseMenu9:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Doom-01");
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- Bouton des Timers
|
|
-----------------------------------------------
|
|
if HearthstoneLocation[1] then
|
|
local start, duration, enable = GetContainerItemCooldown(HearthstoneLocation[1], HearthstoneLocation[2]);
|
|
if duration > 20 and start > 0 then
|
|
NecrosisSpellTimerButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\SpellTimerButton-Cooldown");
|
|
else
|
|
NecrosisSpellTimerButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\SpellTimerButton-Normal");
|
|
end
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------
|
|
-- FONCTIONS DES PIERRES ET DES FRAGMENTS
|
|
------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
-- T'AS QU'A SAVOIR OU T'AS MIS TES AFFAIRES !
|
|
function Necrosis_SoulshardSetup()
|
|
SoulshardSlotID = 1;
|
|
for slot=1, table.getn(SoulshardSlot), 1 do
|
|
table.remove(SoulshardSlot, slot);
|
|
end
|
|
for slot=1, GetContainerNumSlots(NecrosisConfig.SoulshardContainer), 1 do
|
|
table.insert(SoulshardSlot, nil);
|
|
end
|
|
end
|
|
|
|
|
|
-- Fonction qui fait l'inventaire des éléments utilisés en démonologie : Pierres, Fragments, Composants d'invocation
|
|
function Necrosis_BagExplore()
|
|
local soulshards = Soulshards;
|
|
Soulshards = 0;
|
|
InfernalStone = 0;
|
|
DemoniacStone = 0;
|
|
SoulstoneOnHand = false;
|
|
HealthstoneOnHand = false;
|
|
FirestoneOnHand = false;
|
|
SpellstoneOnHand = false;
|
|
HearthstoneOnHand = false;
|
|
ItemOnHand = false;
|
|
-- Parcours des sacs
|
|
for container=0, 4, 1 do
|
|
-- Parcours des emplacements des sacs
|
|
for slot=1, GetContainerNumSlots(container), 1 do
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetBagItem(container, slot);
|
|
local itemName = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
local itemSwitch = tostring(NecrosisTooltipTextLeft3:GetText());
|
|
local itemSwitch2 = tostring(NecrosisTooltipTextLeft4:GetText());
|
|
-- Si le sac est le sac défini pour les fragments
|
|
-- hop la valeur du Tableau qui représente le slot du Sac = nil (pas de Shard)
|
|
if (container == NecrosisConfig.SoulshardContainer) then
|
|
if itemName ~= NECROSIS_ITEM.Soulshard then
|
|
SoulshardSlot[slot] = nil;
|
|
end
|
|
end
|
|
-- Dans le cas d'un emplacement non vide
|
|
if itemName then
|
|
-- On prend le nombre d'item en stack sur le slot
|
|
local _, ItemCount = GetContainerItemInfo(container, slot);
|
|
-- Si c'est un fragment ou une pierre infernale, alors on rajoute la qté au nombre de pierres
|
|
if itemName == NECROSIS_ITEM.Soulshard then Soulshards = Soulshards + 1; end
|
|
if itemName == NECROSIS_ITEM.InfernalStone then InfernalStone = InfernalStone + ItemCount; end
|
|
if itemName == NECROSIS_ITEM.DemoniacStone then DemoniacStone = DemoniacStone + ItemCount; end
|
|
-- Si c'est une pierre d'âme, on note son existence et son emplacement
|
|
if string.find(itemName, NECROSIS_ITEM.Soulstone) then
|
|
SoulstoneOnHand = true;
|
|
SoulstoneLocation = {container,slot};
|
|
end
|
|
-- Même chose pour une pierre de soin
|
|
if string.find(itemName, NECROSIS_ITEM.Healthstone) then
|
|
HealthstoneOnHand = true;
|
|
HealthstoneLocation = {container,slot};
|
|
end
|
|
-- Et encore pour la pierre de sort
|
|
if string.find(itemName, NECROSIS_ITEM.Spellstone) then
|
|
SpellstoneOnHand = true;
|
|
SpellstoneLocation = {container,slot};
|
|
end
|
|
-- La pierre de feu maintenant
|
|
if string.find(itemName, NECROSIS_ITEM.Firestone) then
|
|
FirestoneOnHand = true;
|
|
FirestoneLocation = {container,slot};
|
|
end
|
|
-- et enfin la pierre de foyer
|
|
if string.find(itemName, NECROSIS_ITEM.Hearthstone) then
|
|
HearthstoneOnHand = true;
|
|
HearthstoneLocation = {container,slot};
|
|
end
|
|
|
|
-- On note aussi la présence ou non des objets "main gauche"
|
|
-- Plus tard ce sera utilisé pour remplacer automatiquement une pierre absente
|
|
if itemSwitch == NECROSIS_ITEM.Offhand or itemSwitch2 == NECROSIS_ITEM.Offhand then
|
|
ItemOnHand = true;
|
|
ItemswitchLocation = {container, slot};
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Affichage du bouton principal de Necrosis
|
|
if NecrosisConfig.Circle == 1 then
|
|
if (Soulshards <= 32) then
|
|
NecrosisButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\"..NecrosisConfig.NecrosisColor.."\\Shard"..Soulshards);
|
|
else
|
|
NecrosisButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\"..NecrosisConfig.NecrosisColor.."\\Shard32");
|
|
end
|
|
elseif SoulstoneMode ==1 or SoulstoneMode == 2 then
|
|
if (Soulshards <= 32) then
|
|
NecrosisButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Bleu\\Shard"..Soulshards);
|
|
else
|
|
NecrosisButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Bleu\\Shard32");
|
|
end
|
|
end
|
|
if NecrosisConfig.ShowCount then
|
|
if NecrosisConfig.CountType == 2 then
|
|
NecrosisShardCount:SetText(InfernalStone.." / "..DemoniacStone);
|
|
elseif NecrosisConfig.CountType == 1 then
|
|
if Soulshards < 10 then
|
|
NecrosisShardCount:SetText("0"..Soulshards);
|
|
else
|
|
NecrosisShardCount:SetText(Soulshards);
|
|
end
|
|
end
|
|
else
|
|
NecrosisShardCount:SetText("");
|
|
end
|
|
-- Et on met le tout à jour !
|
|
Necrosis_UpdateIcons();
|
|
|
|
-- S'il y a plus de fragment que d'emplacements dans le sac défini, on affiche un message d'avertissement
|
|
if (Soulshards > soulshards and Soulshards == GetContainerNumSlots(NecrosisConfig.SoulshardContainer)) then
|
|
if (SoulshardDestroy) then
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Bag.FullPrefix..GetBagName(NecrosisConfig.SoulshardContainer)..NECROSIS_MESSAGE.Bag.FullDestroySuffix);
|
|
else
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Bag.FullPrefix..GetBagName(NecrosisConfig.SoulshardContainer)..NECROSIS_MESSAGE.Bag.FullSuffix);
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Fonction qui permet de trouver / ranger les fragments dans les sacs
|
|
function Necrosis_SoulshardSwitch(type)
|
|
if (type == "CHECK") then
|
|
SoulshardMP = 0;
|
|
for container = 0, 4, 1 do
|
|
for i = 1, 3, 1 do
|
|
if GetBagName(container) == NECROSIS_ITEM.SoulPouch[i] then
|
|
BagIsSoulPouch[container + 1] = true;
|
|
break;
|
|
else
|
|
BagIsSoulPouch[container + 1] = false;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
for container = 0, 4, 1 do
|
|
if BagIsSoulPouch[container+1] then break; end
|
|
if container ~= NecrosisConfig.SoulshardContainer then
|
|
for slot=1, GetContainerNumSlots(container), 1 do
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetBagItem(container, slot);
|
|
local itemInfo = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
if itemInfo == NECROSIS_ITEM.Soulshard then
|
|
if (type == "CHECK") then
|
|
SoulshardMP = SoulshardMP + 1;
|
|
elseif (type == "MOVE") then
|
|
Necrosis_FindSlot(container, slot);
|
|
SoulshardMP = SoulshardMP - 1;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
-- Après avoir tout déplacer, il faut retrouver les emplacements des pierres, etc, etc...
|
|
Necrosis_BagExplore();
|
|
end
|
|
|
|
-- Pendant le déplacement des fragments, il faut trouver un nouvel emplacement aux objets déplacés :)
|
|
function Necrosis_FindSlot(shardIndex, shardSlot)
|
|
local full = true;
|
|
for slot=1, GetContainerNumSlots(NecrosisConfig.SoulshardContainer), 1 do
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetBagItem(NecrosisConfig.SoulshardContainer, slot);
|
|
local itemInfo = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
if string.find(itemInfo, NECROSIS_ITEM.Soulshard) == nil then
|
|
PickupContainerItem(shardIndex, shardSlot);
|
|
PickupContainerItem(NecrosisConfig.SoulshardContainer, slot);
|
|
SoulshardSlot[SoulshardSlotID] = slot;
|
|
SoulshardSlotID = SoulshardSlotID + 1
|
|
if (CursorHasItem()) then
|
|
if shardIndex == 0 then
|
|
PutItemInBackpack();
|
|
else
|
|
PutItemInBag(19 + shardIndex);
|
|
end
|
|
end
|
|
full = false;
|
|
break;
|
|
end
|
|
end
|
|
-- Destruction des fragments en sur-nombre si l'option est activée
|
|
if (full and NecrosisConfig.SoulshardDestroy) then
|
|
PickupContainerItem(shardIndex, shardSlot);
|
|
if (CursorHasItem()) then DeleteCursorItem(); end
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------
|
|
-- FONCTIONS DES SORTS
|
|
------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
-- Affiche ou masque les boutons de sort à chaque nouveau sort appris
|
|
function Necrosis_ButtonSetup()
|
|
if NecrosisConfig.NecrosisLockServ then
|
|
Necrosis_NoDrag();
|
|
Necrosis_UpdateButtonsScale();
|
|
else
|
|
HideUIPanel(NecrosisPetMenuButton);
|
|
HideUIPanel(NecrosisBuffMenuButton);
|
|
HideUIPanel(NecrosisCurseMenuButton);
|
|
HideUIPanel(NecrosisMountButton);
|
|
HideUIPanel(NecrosisFirestoneButton);
|
|
HideUIPanel(NecrosisSpellstoneButton);
|
|
HideUIPanel(NecrosisHealthstoneButton);
|
|
HideUIPanel(NecrosisSoulstoneButton);
|
|
if (NecrosisConfig.StonePosition[1]) and StoneIDInSpellTable[4] ~= 0 then
|
|
ShowUIPanel(NecrosisFirestoneButton);
|
|
end
|
|
if (NecrosisConfig.StonePosition[2]) and StoneIDInSpellTable[3] ~= 0 then
|
|
ShowUIPanel(NecrosisSpellstoneButton);
|
|
end
|
|
if (NecrosisConfig.StonePosition[3]) and StoneIDInSpellTable[2] ~= 0 then
|
|
ShowUIPanel(NecrosisHealthstoneButton);
|
|
end
|
|
if (NecrosisConfig.StonePosition[4]) and StoneIDInSpellTable[1] ~= 0 then
|
|
ShowUIPanel(NecrosisSoulstoneButton);
|
|
end
|
|
if (NecrosisConfig.StonePosition[5]) and BuffMenuCreate ~= {} then
|
|
ShowUIPanel(NecrosisBuffMenuButton);
|
|
end
|
|
if (NecrosisConfig.StonePosition[6]) and MountAvailable then
|
|
ShowUIPanel(NecrosisMountButton);
|
|
end
|
|
if (NecrosisConfig.StonePosition[7]) and PetMenuCreate ~= {} then
|
|
ShowUIPanel(NecrosisPetMenuButton);
|
|
end
|
|
if (NecrosisConfig.StonePosition[8]) and CurseMenuCreate ~= {} then
|
|
ShowUIPanel(NecrosisCurseMenuButton);
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- Ma fonction préférée ! Elle fait la liste des sorts connus par le démo, et les classe par rang.
|
|
-- Pour les pierres, elle sélectionne le plus haut rang connu
|
|
function Necrosis_SpellSetup()
|
|
local StoneType = {NECROSIS_ITEM.Soulstone, NECROSIS_ITEM.Healthstone, NECROSIS_ITEM.Spellstone, NECROSIS_ITEM.Firestone};
|
|
local StoneMaxRank = {0, 0, 0, 0};
|
|
|
|
local CurrentStone = {
|
|
ID = {},
|
|
Name = {},
|
|
subName = {}
|
|
};
|
|
|
|
local CurrentSpells = {
|
|
ID = {},
|
|
Name = {},
|
|
subName = {}
|
|
};
|
|
|
|
local spellID = 1;
|
|
local Invisible = 0;
|
|
local InvisibleID = 0;
|
|
|
|
-- On va parcourir tous les sorts possedés par le Démoniste
|
|
while true do
|
|
local spellName, subSpellName = GetSpellName(spellID, BOOKTYPE_SPELL);
|
|
|
|
if not spellName then
|
|
do break end
|
|
end
|
|
|
|
-- Pour les sorts avec des rangs numérotés, on compare pour chaque sort les rangs 1 à 1
|
|
-- Le rang supérieur est conservé
|
|
if (string.find(subSpellName, NECROSIS_TRANSLATION.Rank)) then
|
|
local found = false;
|
|
local rank = tonumber(strsub(subSpellName, 6, strlen(subSpellName)));
|
|
for index=1, table.getn(CurrentSpells.Name), 1 do
|
|
if (CurrentSpells.Name[index] == spellName) then
|
|
found = true;
|
|
if (CurrentSpells.subName[index] < rank) then
|
|
CurrentSpells.ID[index] = spellID;
|
|
CurrentSpells.subName[index] = rank;
|
|
end
|
|
break;
|
|
end
|
|
end
|
|
-- Les plus grands rangs de chacun des sorts à rang numérotés sont insérés dans la table
|
|
if (not found) then
|
|
table.insert(CurrentSpells.ID, spellID);
|
|
table.insert(CurrentSpells.Name, spellName);
|
|
table.insert(CurrentSpells.subName, rank);
|
|
end
|
|
end
|
|
|
|
-- Test du Rang de la détection d'invisibilité
|
|
if spellName == NECROSIS_TRANSLATION.GreaterInvisible then
|
|
Invisible = 3;
|
|
InvisibleID = spellID;
|
|
elseif spellName == NECROSIS_TRANSLATION.Invisible and Invisible ~= 3 then
|
|
Invisible = 2;
|
|
InvisibleID = spellID;
|
|
elseif spellName == NECROSIS_TRANSLATION.LesserInvisible and Invisible ~= 3 and Invisible ~= 2 then
|
|
Invisible = 1;
|
|
InvisibleID = spellID;
|
|
end
|
|
|
|
-- Les pierres n'ont pas de rang numéroté, l'attribut de rang fait partie du nom du sort
|
|
-- Pour chaque type de pierre, on va donc faire....
|
|
for stoneID=1, table.getn(StoneType), 1 do
|
|
-- Si le sort étudié est bien une invocation de ce type de pierre et qu'on n'a pas
|
|
-- déjà assigné un rang maximum à cette dernière
|
|
if (string.find(spellName, StoneType[stoneID]))
|
|
and StoneMaxRank[stoneID] ~= table.getn(NECROSIS_STONE_RANK)
|
|
then
|
|
-- Récupération de la fin du nom de la pierre, contenant son rang
|
|
local stoneSuffix = string.sub(spellName, string.len(NECROSIS_CREATE[stoneID]) + 1);
|
|
-- Reste à trouver la correspondance de son rang
|
|
for rankID=1, table.getn(NECROSIS_STONE_RANK), 1 do
|
|
-- Si la fin du nom de la pierre correspond à une taille de pierre, on note le rang !
|
|
if string.lower(stoneSuffix) == string.lower(NECROSIS_STONE_RANK[rankID]) then
|
|
-- On a une pierre, on a son rang, reste à vérifier si c'est la plus puissante,
|
|
-- et si oui, l'enregistrer
|
|
if rankID > StoneMaxRank[stoneID] then
|
|
StoneMaxRank[stoneID] = rankID;
|
|
CurrentStone.Name[stoneID] = spellName;
|
|
CurrentStone.subName[stoneID] = NECROSIS_STONE_RANK[rankID];
|
|
CurrentStone.ID[stoneID] = spellID;
|
|
end
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
spellID = spellID + 1;
|
|
end
|
|
|
|
-- On insère dans la table les pierres avec le plus grand rang
|
|
for stoneID=1, table.getn(StoneType), 1 do
|
|
if StoneMaxRank[stoneID] ~= 0 then
|
|
table.insert(NECROSIS_SPELL_TABLE, {
|
|
ID = CurrentStone.ID[stoneID],
|
|
Name = CurrentStone.Name[stoneID],
|
|
Rank = 0,
|
|
CastTime = 0,
|
|
Length = 0,
|
|
Type = 0,
|
|
});
|
|
StoneIDInSpellTable[stoneID] = table.getn(NECROSIS_SPELL_TABLE);
|
|
end
|
|
end
|
|
-- On met à jour la liste des sorts avec les nouveaux rangs
|
|
for spell=1, table.getn(NECROSIS_SPELL_TABLE), 1 do
|
|
for index = 1, table.getn(CurrentSpells.Name), 1 do
|
|
if (NECROSIS_SPELL_TABLE[spell].Name == CurrentSpells.Name[index])
|
|
and NECROSIS_SPELL_TABLE[spell].ID ~= StoneIDInSpellTable[1]
|
|
and NECROSIS_SPELL_TABLE[spell].ID ~= StoneIDInSpellTable[2]
|
|
and NECROSIS_SPELL_TABLE[spell].ID ~= StoneIDInSpellTable[3]
|
|
and NECROSIS_SPELL_TABLE[spell].ID ~= StoneIDInSpellTable[4]
|
|
then
|
|
NECROSIS_SPELL_TABLE[spell].ID = CurrentSpells.ID[index];
|
|
NECROSIS_SPELL_TABLE[spell].Rank = CurrentSpells.subName[index];
|
|
end
|
|
end
|
|
end
|
|
|
|
-- On met à jour la durée de chaque sort en fonction de son rang
|
|
for index=1, table.getn(NECROSIS_SPELL_TABLE), 1 do
|
|
if (index == 9) then -- si Bannish
|
|
if NECROSIS_SPELL_TABLE[index].ID ~= nil then
|
|
NECROSIS_SPELL_TABLE[index].Length = NECROSIS_SPELL_TABLE[index].Rank * 10 + 10;
|
|
end
|
|
end
|
|
if (index == 13) then -- si Fear
|
|
if NECROSIS_SPELL_TABLE[index].ID ~= nil then
|
|
NECROSIS_SPELL_TABLE[index].Length = NECROSIS_SPELL_TABLE[index].Rank * 5 + 5;
|
|
end
|
|
end
|
|
if (index == 14) then -- si Corruption
|
|
if NECROSIS_SPELL_TABLE[index].ID ~= nil and NECROSIS_SPELL_TABLE[index].Rank <= 2 then
|
|
NECROSIS_SPELL_TABLE[index].Length = NECROSIS_SPELL_TABLE[index].Rank * 3 + 9;
|
|
end
|
|
end
|
|
end
|
|
|
|
for spellID=1, MAX_SPELLS, 1 do
|
|
local spellName, subSpellName = GetSpellName(spellID, "spell");
|
|
if (spellName) then
|
|
for index=1, table.getn(NECROSIS_SPELL_TABLE), 1 do
|
|
if NECROSIS_SPELL_TABLE[index].Name == spellName then
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetSpell(spellID, 1);
|
|
local _, _, ManaCost = string.find(NecrosisTooltipTextLeft2:GetText(), "(%d+)");
|
|
if not NECROSIS_SPELL_TABLE[index].ID then
|
|
NECROSIS_SPELL_TABLE[index].ID = spellID;
|
|
end
|
|
NECROSIS_SPELL_TABLE[index].Mana = tonumber(ManaCost);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if NECROSIS_SPELL_TABLE[1].ID or NECROSIS_SPELL_TABLE[2].ID then
|
|
MountAvailable = true;
|
|
else
|
|
MountAvailable = false;
|
|
end
|
|
|
|
-- Insertion du plus haut rang de détection d'invisibilité connu
|
|
if Invisible >= 1 then
|
|
NECROSIS_SPELL_TABLE[33].ID = InvisibleID;
|
|
NECROSIS_SPELL_TABLE[33].Rank = 0;
|
|
NECROSIS_SPELL_TABLE[33].CastTime = 0;
|
|
NECROSIS_SPELL_TABLE[33].Length = 0;
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetSpell(InvisibleID, 1);
|
|
local _, _, ManaCost = string.find(NecrosisTooltipTextLeft2:GetText(), "(%d+)");
|
|
NECROSIS_SPELL_TABLE[33].Mana = tonumber(ManaCost);
|
|
end
|
|
end
|
|
|
|
-- Fonction d'extraction d'attribut de sort
|
|
-- F(type=string, string, int) -> Spell=table
|
|
function Necrosis_FindSpellAttribute(type, attribute, array)
|
|
for index=1, table.getn(NECROSIS_SPELL_TABLE), 1 do
|
|
if string.find(NECROSIS_SPELL_TABLE[index][type], attribute) then return NECROSIS_SPELL_TABLE[index][array]; end
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
-- Fonction pour caster un Eclat d'ombre depuis le bouton de la Transe de l'Ombre
|
|
-- L'éclat doit avoir le rang le plus haut
|
|
function Necrosis_CastShadowBolt()
|
|
local spellID = Necrosis_FindSpellAttribute("Name", NECROSIS_NIGHTFALL.BoltName, "ID");
|
|
if (spellID) then
|
|
CastSpell(spellID, "spell");
|
|
else
|
|
Necrosis_Msg(NECROSIS_NIGHTFALL_TEXT.NoBoltSpell, "USER");
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------
|
|
-- FONCTIONS DIVERSES
|
|
------------------------------------------------------------------------------------------------------
|
|
|
|
-- Fonction pour savoir si une unité subit un effet
|
|
-- F(string, string)->bool
|
|
function Necrosis_UnitHasEffect(unit, effect)
|
|
local index = 1;
|
|
while UnitDebuff(unit, index) do
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetUnitDebuff(unit, index);
|
|
local DebuffName = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
if (string.find(DebuffName, effect)) then
|
|
return true;
|
|
end
|
|
index = index+1;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
-- Function to check the presence of a buff on the unit.
|
|
-- Strictly identical to UnitHasEffect, but as WoW distinguishes Buff and DeBuff, so we have to.
|
|
function Necrosis_UnitHasBuff(unit, effect)
|
|
local index = 1;
|
|
while UnitBuff(unit, index) do
|
|
-- Here we'll cheat a little. checking a buff or debuff return the internal spell name, and not the name we give at start
|
|
-- So we use an API widget that will use the internal name to return the known name.
|
|
-- For example, the "Curse of Agony" spell is internaly known as "Spell_Shadow_CurseOfSargeras". Much easier to use the first one than the internal one.
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetUnitBuff(unit, index);
|
|
local BuffName = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
if (string.find(BuffName, effect)) then
|
|
return true;
|
|
end
|
|
index = index+1;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
|
|
-- Permet de reconnaitre quand le joueur gagne Crépuscule / Transe de l'ombre
|
|
function Necrosis_UnitHasTrance()
|
|
local ID = -1;
|
|
for buffID = 0, 24, 1 do
|
|
local buffTexture = GetPlayerBuffTexture(buffID);
|
|
if buffTexture == nil then break end
|
|
if strfind(buffTexture, "Spell_Shadow_Twilight") then
|
|
ID = buffID;
|
|
break
|
|
end
|
|
end
|
|
ShadowTranceID = ID;
|
|
end
|
|
|
|
-- Fonction pour gérer les actions effectuées par Necrosis au clic sur un bouton
|
|
function Necrosis_UseItem(type,button)
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetBagItem("player", 17);
|
|
local rightHand = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
|
|
-- Fonction pour utiliser une pierre de foyer dans l'inventaire
|
|
-- s'il y en a une dans l'inventaire, et si c'était un click droit
|
|
if type == "Hearthstone" and button == "RightButton" then
|
|
if (HearthstoneOnHand) then
|
|
-- on l'utilise
|
|
UseContainerItem(HearthstoneLocation[1], HearthstoneLocation[2]);
|
|
-- soit il n'y en a pas dans l'inventaire, on affiche un message d'erreur
|
|
else
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.NoHearthStone, "USER");
|
|
end
|
|
end
|
|
|
|
-- Si on clique sur le bouton de la pierre d'âme
|
|
-- On met à jour le bouton pour savoir quel est le mode
|
|
if (type == "Soulstone") then
|
|
Necrosis_UpdateIcons();
|
|
-- Si le mode = 2 (une pierre dans l'inventaire, pas de pierre utilisée)
|
|
-- alors on l'utilise
|
|
if (SoulstoneMode == 2) then
|
|
-- Si un joueur est ciblé, sur le joueur (avec message d'alerte)
|
|
-- Si un joueur n'est pas ciblé, sur le Démoniste (sans message)
|
|
if UnitIsPlayer("target") then
|
|
SoulstoneUsedOnTarget = true;
|
|
else
|
|
SoulstoneUsedOnTarget = false;
|
|
TargetUnit("player");
|
|
end
|
|
UseContainerItem(SoulstoneLocation[1], SoulstoneLocation[2]);
|
|
-- Maintenant que l'on crée un timer sur la session, nous ne sortons plus d'un RL
|
|
NecrosisRL = false;
|
|
-- Et hop, on remet à jour l'affichage des boutons :)
|
|
Necrosis_UpdateIcons();
|
|
-- si il n'y a pas de pierre d'âme dans l'inventaire, alors on crée la pierre d'âme de rang le plus grand :)
|
|
elseif (SoulstoneMode == 1) or (SoulstoneMode == 3) then
|
|
if StoneIDInSpellTable[1] ~= 0 then
|
|
CastSpell(NECROSIS_SPELL_TABLE[StoneIDInSpellTable[1]].ID, "spell");
|
|
else
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.NoSoulStoneSpell, "USER");
|
|
end
|
|
|
|
end
|
|
-- Si on clique sur le bouton de la pierre de vie :
|
|
elseif (type == "Healthstone") then
|
|
-- soit il y en a une dans l'inventaire
|
|
if HealthstoneOnHand then
|
|
-- Dans ce cas si un pj allié est sélectionné, on lui donne la pierre
|
|
-- Sinon, on l'utilise
|
|
if NecrosisTradeRequest then
|
|
PickupContainerItem(HealthstoneLocation[1], HealthstoneLocation[2]);
|
|
ClickTradeButton(1);
|
|
NecrosisTradeRequest = false;
|
|
Trading = true;
|
|
TradingNow = 3;
|
|
return;
|
|
elseif (UnitExists("target") and UnitIsPlayer("target") and (not UnitCanAttack("player", "target")) and UnitName("target") ~= UnitName("player")) then
|
|
PickupContainerItem(HealthstoneLocation[1], HealthstoneLocation[2]);
|
|
if ( CursorHasItem() ) then
|
|
DropItemOnUnit("target");
|
|
Trading = true;
|
|
TradingNow = 3;
|
|
end
|
|
return;
|
|
end
|
|
if (UnitHealth("player") == UnitHealthMax("player")) then
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.FullHealth, "USER");
|
|
else
|
|
SpellStopCasting();
|
|
UseContainerItem(HealthstoneLocation[1], HealthstoneLocation[2]);
|
|
local HealthstoneInUse = false
|
|
if Necrosis_TimerExisteDeja(NECROSIS_COOLDOWN.Healthstone, SpellTimer) then
|
|
HealthstoneInUse = true;
|
|
end
|
|
if not HealthstoneInUse then
|
|
SpellGroup, SpellTimer, TimerTable = Necrosis_InsertTimerStone(type, nil, nil, SpellGroup, SpellTimer, TimerTable);
|
|
end
|
|
end
|
|
-- soit il n'y en a pas dans l'inventaire, et la pierre de plus haut rang est créée
|
|
else
|
|
if StoneIDInSpellTable[2] ~= 0 then
|
|
CastSpell(NECROSIS_SPELL_TABLE[StoneIDInSpellTable[2]].ID, "spell");
|
|
else
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.NoHealthStoneSpell, "USER");
|
|
end
|
|
end
|
|
-- Au tour de la pierre de sort
|
|
elseif (type == "Spellstone") then
|
|
-- Si la pierre est équipée ou dans l'inventaire, un clic droit l'équipe / la déséquipe
|
|
if (SpellstoneMode ~= 1 and button == "RightButton")
|
|
-- Si la pierre n'est pas équipée, le raccourci clavier équipe la pierre
|
|
or (SpellstoneMode == 2 and button == "Binding") then
|
|
Necrosis_SwitchOffHand(type);
|
|
-- Si la pierre est équipée, un clic gauche utilise la pierre
|
|
elseif SpellstoneMode == 3 then
|
|
local start, duration, enable = GetInventoryItemCooldown("player", 17) ;
|
|
UseInventoryItem(17);
|
|
if duration == 0 or start == 0 then Necrosis_SwitchOffHand("Off-hand"); end
|
|
-- sinon on crée la pierre :)
|
|
elseif (SpellstoneMode == 1) then
|
|
if StoneIDInSpellTable[3] ~= 0 then
|
|
CastSpell(NECROSIS_SPELL_TABLE[StoneIDInSpellTable[3]].ID, "spell");
|
|
else
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.NoSpellStoneSpell, "USER");
|
|
end
|
|
end
|
|
-- Meme chose pour la pierre de feu
|
|
elseif (type == "Firestone") then
|
|
-- Si la pierre n'existe pas, elle est créée
|
|
if (FirestoneMode == 1) then
|
|
if StoneIDInSpellTable[4] ~= 0 then
|
|
CastSpell(NECROSIS_SPELL_TABLE[StoneIDInSpellTable[4]].ID, "spell");
|
|
else
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.NoFireStoneSpell, "USER");
|
|
end
|
|
-- Si la pierre existe, un clic droit l'équipe / la déséquiper
|
|
elseif button ~= "LeftButton" then
|
|
Necrosis_SwitchOffHand(type);
|
|
end
|
|
-- Si on clic sur le bouton de monture
|
|
elseif (type == "Mount") then
|
|
-- Soit c'est la monture épique
|
|
if NECROSIS_SPELL_TABLE[2].ID ~= nil then
|
|
CastSpell(NECROSIS_SPELL_TABLE[2].ID, "spell");
|
|
Necrosis_OnUpdate();
|
|
-- Soit c'est la monture classique
|
|
elseif NECROSIS_SPELL_TABLE[1].ID ~= nil then
|
|
CastSpell(NECROSIS_SPELL_TABLE[1].ID, "spell");
|
|
Necrosis_OnUpdate();
|
|
-- (Soit c'est rien :) )
|
|
else
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.NoRiding, "USER");
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Fonction permettant de permutter un objet main-gauche équipé avec un objet main-gauche de l'inventaire
|
|
function Necrosis_SwitchOffHand(type)
|
|
if (type == "Spellstone") then
|
|
if SpellstoneMode == 3 then
|
|
if ItemOnHand then
|
|
Necrosis_Msg("Equipe "..GetContainerItemLink(ItemswitchLocation[1],ItemswitchLocation[2])..NECROSIS_MESSAGE.SwitchMessage..GetInventoryItemLink("player",17), "USER");
|
|
PickupInventoryItem(17);
|
|
PickupContainerItem(ItemswitchLocation[1],ItemswitchLocation[2]);
|
|
end
|
|
return;
|
|
else
|
|
PickupContainerItem(SpellstoneLocation[1], SpellstoneLocation[2]);
|
|
PickupInventoryItem(17);
|
|
-- Le switch avec une pierre de sort implique un cooldown porté au timer
|
|
if Necrosis_TimerExisteDeja(NECROSIS_COOLDOWN.Spellstone, SpellTimer) then
|
|
SpellTimer, TimerTable = Necrosis_RetraitTimerParNom(NECROSIS_COOLDOWN.Spellstone, SpellTimer, TimerTable);
|
|
end
|
|
SpellGroup, SpellTimer, TimerTable = Necrosis_InsertTimerStone(type, nil, nil, SpellGroup, SpellTimer, TimerTable);
|
|
return;
|
|
end
|
|
elseif (type == "Firestone") then
|
|
if FirestoneMode == 3 then
|
|
if ItemOnHand then
|
|
PickupInventoryItem(17);
|
|
PickupContainerItem(ItemswitchLocation[1],ItemswitchLocation[2]);
|
|
Necrosis_Msg(NECROSIS_MESSAGE.EquipMessage..GetContainerItemLink(ItemswitchLocation[1],ItemswitchLocation[2])..NECROSIS_MESSAGE.SwitchMessage..GetInventoryItemLink("player",17), "USER");
|
|
end
|
|
return;
|
|
else
|
|
PickupContainerItem(FirestoneLocation[1], FirestoneLocation[2]);
|
|
PickupInventoryItem(17);
|
|
return;
|
|
end
|
|
end
|
|
if (type == "OffHand") and UnitClass("player") == NECROSIS_UNIT_WARLOCK then
|
|
if ItemswitchLocation[1] ~= nil and ItemswitchLocation[2] ~= nil then
|
|
PickupContainerItem(ItemswitchLocation[1],ItemswitchLocation[2]);
|
|
PickupInventoryItem(17);
|
|
end
|
|
end
|
|
end
|
|
|
|
function Necrosis_MoneyToggle()
|
|
for index=1, 10 do
|
|
local text = getglobal("NecrosisTooltipTextLeft"..index);
|
|
text:SetText(nil);
|
|
text = getglobal("NecrosisTooltipTextRight"..index);
|
|
text:SetText(nil);
|
|
end
|
|
NecrosisTooltip:Hide();
|
|
NecrosisTooltip:SetOwner(WorldFrame, "ANCHOR_NONE");
|
|
end
|
|
|
|
function Necrosis_GameTooltip_ClearMoney()
|
|
-- Intentionally empty; don't clear money while we use hidden tooltips
|
|
end
|
|
|
|
|
|
-- Fonction pour placer les boutons autour de Necrosis (et pour grossir / retracir l'interface...)
|
|
function Necrosis_UpdateButtonsScale()
|
|
local NBRScale = (100 + (NecrosisConfig.NecrosisButtonScale - 85)) / 100;
|
|
if NecrosisConfig.NecrosisButtonScale <= 95 then
|
|
NBRScale = 1.1;
|
|
end
|
|
if NecrosisConfig.NecrosisLockServ then
|
|
Necrosis_ClearAllPoints();
|
|
HideUIPanel(NecrosisPetMenuButton);
|
|
HideUIPanel(NecrosisBuffMenuButton);
|
|
HideUIPanel(NecrosisCurseMenuButton);
|
|
HideUIPanel(NecrosisMountButton);
|
|
HideUIPanel(NecrosisFirestoneButton);
|
|
HideUIPanel(NecrosisSpellstoneButton);
|
|
HideUIPanel(NecrosisHealthstoneButton);
|
|
HideUIPanel(NecrosisSoulstoneButton);
|
|
local indexScale = -36;
|
|
for index=1, 8, 1 do
|
|
if NecrosisConfig.StonePosition[index] then
|
|
if index == 1 and StoneIDInSpellTable[4] ~= 0 then
|
|
NecrosisFirestoneButton:SetPoint("CENTER", "NecrosisButton", "CENTER", ((40 * NBRScale) * cos(NecrosisConfig.NecrosisAngle-indexScale)), ((40 * NBRScale) * sin(NecrosisConfig.NecrosisAngle-indexScale)));
|
|
ShowUIPanel(NecrosisFirestoneButton);
|
|
indexScale = indexScale + 36;
|
|
end
|
|
if index == 2 and StoneIDInSpellTable[3] ~= 0 then
|
|
NecrosisSpellstoneButton:SetPoint("CENTER", "NecrosisButton", "CENTER", ((40 * NBRScale) * cos(NecrosisConfig.NecrosisAngle-indexScale)), ((40 * NBRScale) * sin(NecrosisConfig.NecrosisAngle-indexScale)));
|
|
ShowUIPanel(NecrosisSpellstoneButton);
|
|
indexScale = indexScale + 36;
|
|
end
|
|
if index == 3 and StoneIDInSpellTable[2] ~= 0 then
|
|
NecrosisHealthstoneButton:SetPoint("CENTER", "NecrosisButton", "CENTER", ((40 * NBRScale) * cos(NecrosisConfig.NecrosisAngle-indexScale)), ((40 * NBRScale) * sin(NecrosisConfig.NecrosisAngle-indexScale)));
|
|
ShowUIPanel(NecrosisHealthstoneButton);
|
|
indexScale = indexScale + 36;
|
|
end
|
|
if index == 4 and StoneIDInSpellTable[1] ~= 0 then
|
|
NecrosisSoulstoneButton:SetPoint("CENTER", "NecrosisButton", "CENTER", ((40 * NBRScale) * cos(NecrosisConfig.NecrosisAngle-indexScale)), ((40 * NBRScale) * sin(NecrosisConfig.NecrosisAngle-indexScale)));
|
|
ShowUIPanel(NecrosisSoulstoneButton);
|
|
indexScale = indexScale + 36;
|
|
end
|
|
if index == 5 and BuffMenuCreate ~= {} then
|
|
NecrosisBuffMenuButton:SetPoint("CENTER", "NecrosisButton", "CENTER", ((40 * NBRScale) * cos(NecrosisConfig.NecrosisAngle-indexScale)), ((40 * NBRScale) * sin(NecrosisConfig.NecrosisAngle-indexScale)));
|
|
ShowUIPanel(NecrosisBuffMenuButton);
|
|
indexScale = indexScale + 36;
|
|
end
|
|
if index == 6 and MountAvailable then
|
|
NecrosisMountButton:SetPoint("CENTER", "NecrosisButton", "CENTER", ((40 * NBRScale) * cos(NecrosisConfig.NecrosisAngle-indexScale)), ((40 * NBRScale) * sin(NecrosisConfig.NecrosisAngle-indexScale)));
|
|
ShowUIPanel(NecrosisMountButton);
|
|
indexScale = indexScale + 36;
|
|
end
|
|
if index == 7 and PetMenuCreate ~= {} then
|
|
NecrosisPetMenuButton:SetPoint("CENTER", "NecrosisButton", "CENTER", ((40 * NBRScale) * cos(NecrosisConfig.NecrosisAngle-indexScale)), ((40 * NBRScale) * sin(NecrosisConfig.NecrosisAngle-indexScale)));
|
|
ShowUIPanel(NecrosisPetMenuButton);
|
|
indexScale = indexScale + 36;
|
|
end
|
|
if index == 8 and CurseMenuCreate ~= {} then
|
|
NecrosisCurseMenuButton:SetPoint("CENTER", "NecrosisButton", "CENTER", ((40 * NBRScale) * cos(NecrosisConfig.NecrosisAngle-indexScale)), ((40 * NBRScale) * sin(NecrosisConfig.NecrosisAngle-indexScale)));
|
|
ShowUIPanel(NecrosisCurseMenuButton);
|
|
indexScale = indexScale + 36;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- Fonction (XML) pour rétablir les points d'attache par défaut des boutons
|
|
function Necrosis_ClearAllPoints()
|
|
NecrosisFirestoneButton:ClearAllPoints();
|
|
NecrosisSpellstoneButton:ClearAllPoints();
|
|
NecrosisHealthstoneButton:ClearAllPoints();
|
|
NecrosisSoulstoneButton:ClearAllPoints();
|
|
NecrosisMountButton:ClearAllPoints();
|
|
NecrosisPetMenuButton:ClearAllPoints();
|
|
NecrosisBuffMenuButton:ClearAllPoints();
|
|
NecrosisCurseMenuButton:ClearAllPoints();
|
|
end
|
|
|
|
-- Fonction (XML) pour étendre la propriété NoDrag() du bouton principal de Necrosis sur tout ses boutons
|
|
function Necrosis_NoDrag()
|
|
NecrosisFirestoneButton:RegisterForDrag("");
|
|
NecrosisSpellstoneButton:RegisterForDrag("");
|
|
NecrosisHealthstoneButton:RegisterForDrag("");
|
|
NecrosisSoulstoneButton:RegisterForDrag("");
|
|
NecrosisMountButton:RegisterForDrag("");
|
|
NecrosisPetMenuButton:RegisterForDrag("");
|
|
NecrosisBuffMenuButton:RegisterForDrag("");
|
|
NecrosisCurseMenuButton:RegisterForDrag("");
|
|
end
|
|
|
|
-- Fonction (XML) inverse de celle du dessus
|
|
function Necrosis_Drag()
|
|
NecrosisFirestoneButton:RegisterForDrag("LeftButton");
|
|
NecrosisSpellstoneButton:RegisterForDrag("LeftButton");
|
|
NecrosisHealthstoneButton:RegisterForDrag("LeftButton");
|
|
NecrosisSoulstoneButton:RegisterForDrag("LeftButton");
|
|
NecrosisMountButton:RegisterForDrag("LeftButton");
|
|
NecrosisPetMenuButton:RegisterForDrag("LeftButton");
|
|
NecrosisBuffMenuButton:RegisterForDrag("LeftButton");
|
|
NecrosisCurseMenuButton:RegisterForDrag("LeftButton");
|
|
end
|
|
|
|
-- Ouverture du menu des buffs
|
|
function Necrosis_BuffMenu(button)
|
|
if button == "MiddleButton" and LastBuff ~= 0 then
|
|
Necrosis_BuffCast(LastBuff);
|
|
return;
|
|
end
|
|
BuffMenuShow = not BuffMenuShow;
|
|
if not BuffMenuShow then
|
|
BuffShow = false;
|
|
BuffVisible = false;
|
|
NecrosisBuffMenuButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\BuffMenuButton-01");
|
|
BuffMenuCreate[1]:ClearAllPoints();
|
|
BuffMenuCreate[1]:SetPoint("CENTER", "NecrosisBuffMenuButton", "CENTER", 3000, 3000);
|
|
AlphaBuffMenu = 1;
|
|
else
|
|
BuffShow = true;
|
|
NecrosisBuffMenuButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\BuffMenuButton-02");
|
|
-- Si clic droit, le menu de buff reste ouvert
|
|
if button == "RightButton" then
|
|
BuffVisible = true;
|
|
end
|
|
-- S'il n'existe aucun buff on ne fait rien
|
|
if BuffMenuCreate == nil then
|
|
return;
|
|
end
|
|
-- Sinon on affiche les icones
|
|
NecrosisBuffMenu1:SetAlpha(1);
|
|
NecrosisBuffMenu2:SetAlpha(1);
|
|
NecrosisBuffMenu3:SetAlpha(1);
|
|
NecrosisBuffMenu4:SetAlpha(1);
|
|
NecrosisBuffMenu5:SetAlpha(1);
|
|
NecrosisBuffMenu6:SetAlpha(1);
|
|
NecrosisBuffMenu7:SetAlpha(1);
|
|
NecrosisBuffMenu8:SetAlpha(1);
|
|
NecrosisBuffMenu9:SetAlpha(1);
|
|
BuffMenuCreate[1]:ClearAllPoints();
|
|
BuffMenuCreate[1]:SetPoint("CENTER", "NecrosisBuffMenuButton", "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31) , 26);
|
|
AlphaPetVar = GetTime() + 3;
|
|
AlphaBuffVar = GetTime() + 6;
|
|
AlphaCurseVar = GetTime() + 6;
|
|
end
|
|
end
|
|
|
|
-- Ouverture du menu des curses
|
|
function Necrosis_CurseMenu(button)
|
|
if button == "MiddleButton" and LastCurse ~= 0 then
|
|
Necrosis_CurseCast(LastCurse, LastCurseClick);
|
|
return;
|
|
end
|
|
-- S'il n'existe aucune curse on ne fait rien
|
|
if CurseMenuCreate[1] == nil then
|
|
return;
|
|
end
|
|
CurseMenuShow = not CurseMenuShow;
|
|
if not CurseMenuShow then
|
|
CurseShow = false;
|
|
CurseVisible = false;
|
|
NecrosisCurseMenuButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\CurseMenuButton-01");
|
|
CurseMenuCreate[1]:ClearAllPoints();
|
|
CurseMenuCreate[1]:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
AlphaCurseMenu = 1;
|
|
else
|
|
CurseShow = true;
|
|
NecrosisCurseMenuButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\CurseMenuButton-02");
|
|
-- Si clic droit, le menu de curse reste ouvert
|
|
if button == "RightButton" then
|
|
CurseVisible = true;
|
|
end
|
|
-- Sinon on affiche les icones
|
|
NecrosisCurseMenu1:SetAlpha(1);
|
|
NecrosisCurseMenu2:SetAlpha(1);
|
|
NecrosisCurseMenu3:SetAlpha(1);
|
|
NecrosisCurseMenu4:SetAlpha(1);
|
|
NecrosisCurseMenu5:SetAlpha(1);
|
|
NecrosisCurseMenu6:SetAlpha(1);
|
|
NecrosisCurseMenu7:SetAlpha(1);
|
|
NecrosisCurseMenu8:SetAlpha(1);
|
|
NecrosisCurseMenu9:SetAlpha(1);
|
|
CurseMenuCreate[1]:ClearAllPoints();
|
|
CurseMenuCreate[1]:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31) , -26);
|
|
AlphaPetVar = GetTime() + 3;
|
|
AlphaBuffVar = GetTime() + 6;
|
|
AlphaCurseVar = GetTime() + 6;
|
|
end
|
|
end
|
|
|
|
-- Ouverture du menu des démons
|
|
function Necrosis_PetMenu(button)
|
|
if button == "MiddleButton" and LastDemon ~= 0 then
|
|
Necrosis_PetCast(LastDemon);
|
|
return;
|
|
end
|
|
-- S'il n'existe aucun sort d'invocation on ne fait rien
|
|
if PetMenuCreate[1] == nil then
|
|
return;
|
|
end
|
|
PetMenuShow = not PetMenuShow;
|
|
if not PetMenuShow then
|
|
PetShow = false;
|
|
PetVisible = false;
|
|
NecrosisPetMenuButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\PetMenuButton-01");
|
|
PetMenuCreate[1]:ClearAllPoints();
|
|
PetMenuCreate[1]:SetPoint("CENTER", "NecrosisPetMenuButton", "CENTER", 3000, 3000);
|
|
AlphaPetMenu = 1;
|
|
else
|
|
PetShow = true;
|
|
NecrosisPetMenuButton:SetNormalTexture("Interface\\Addons\\Necrosis\\UI\\PetMenuButton-02");
|
|
-- Si clic droit, le menu de pet reste ouvert
|
|
if button == "RightButton" then
|
|
PetVisible = true;
|
|
end
|
|
-- Sinon on affiche les icones (on les déplace sur l'écran)
|
|
NecrosisPetMenu1:SetAlpha(1);
|
|
NecrosisPetMenu2:SetAlpha(1);
|
|
NecrosisPetMenu3:SetAlpha(1);
|
|
NecrosisPetMenu4:SetAlpha(1);
|
|
NecrosisPetMenu5:SetAlpha(1);
|
|
NecrosisPetMenu6:SetAlpha(1);
|
|
NecrosisPetMenu7:SetAlpha(1);
|
|
NecrosisPetMenu8:SetAlpha(1);
|
|
NecrosisPetMenu9:SetAlpha(1);
|
|
PetMenuCreate[1]:ClearAllPoints();
|
|
PetMenuCreate[1]:SetPoint("CENTER", "NecrosisPetMenuButton", "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31) , 26);
|
|
AlphaPetVar = GetTime() + 3;
|
|
end
|
|
end
|
|
|
|
-- A chaque changement du livre des sorts, au démarrage du mod, ainsi qu'au changement de sens du menu on reconstruit les menus des sorts
|
|
function Necrosis_CreateMenu()
|
|
PetMenuCreate = {};
|
|
CurseMenuCreate = {};
|
|
BuffMenuCreate = {};
|
|
local menuVariable = nil;
|
|
local PetButtonPosition = 0;
|
|
local BuffButtonPosition = 0;
|
|
local CurseButtonPosition = 0;
|
|
|
|
-- On cache toutes les icones des démons
|
|
for i = 1, 9, 1 do
|
|
menuVariable = getglobal("NecrosisPetMenu"..i);
|
|
menuVariable:Hide();
|
|
end
|
|
-- On cache toutes les icones des sorts
|
|
for i = 1, 9, 1 do
|
|
menuVariable = getglobal("NecrosisBuffMenu"..i);
|
|
menuVariable:Hide();
|
|
end
|
|
-- On cache toutes les icones des curses
|
|
for i = 1, 9, 1 do
|
|
menuVariable = getglobal("NecrosisCurseMenu"..i);
|
|
menuVariable:Hide();
|
|
end
|
|
|
|
|
|
-- Si le sort de Domination corrompue existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[15].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu1");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenuButton", "CENTER", 3000, 3000);
|
|
PetButtonPosition = 1;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
-- Si l'invocation du Diablotin existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[3].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu2");
|
|
menuVariable:ClearAllPoints();
|
|
if PetButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenu"..PetButtonPosition, "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31), 0);
|
|
end
|
|
PetButtonPosition = 2;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
-- Si l'invocation du Marcheur existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[4].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu3");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenu"..PetButtonPosition, "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31), 0);
|
|
PetButtonPosition = 3;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
-- Si l'invocation du Succube existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[5].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu4");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenu"..PetButtonPosition, "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31), 0);
|
|
PetButtonPosition = 4;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
-- Si l'invocation du Felhunter existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[6].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu5");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenu"..PetButtonPosition, "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31), 0);
|
|
PetButtonPosition = 5;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
-- Si l'invocation de l'Infernal existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[8].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu6");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenu"..PetButtonPosition, "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31), 0);
|
|
PetButtonPosition = 6;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
-- Si l'invocation du Doomguard existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[30].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu7");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenu"..PetButtonPosition, "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31), 0);
|
|
PetButtonPosition = 7;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
-- Si l'asservissement existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[35].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu8");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenu"..PetButtonPosition, "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31), 0);
|
|
PetButtonPosition = 8;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
-- Si le sacrifice démoniaque existe, on affiche le bouton dans le menu des pets
|
|
if NECROSIS_SPELL_TABLE[44].ID then
|
|
menuVariable = getglobal("NecrosisPetMenu9");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisPetMenu"..PetButtonPosition, "CENTER", ((36 / NecrosisConfig.PetMenuPos) * 31), 0);
|
|
PetButtonPosition = 9;
|
|
table.insert(PetMenuCreate, menuVariable);
|
|
end
|
|
|
|
|
|
-- Maintenant que tous les boutons de pet sont placés les uns à côté des autres (hors de l'écran), on affiche les disponibles
|
|
for i = 1, table.getn(PetMenuCreate), 1 do
|
|
ShowUIPanel(PetMenuCreate[i]);
|
|
end
|
|
|
|
-- Si l'Armure Démoniaque existe, on affiche le bouton dans le menu des buffs
|
|
if NECROSIS_SPELL_TABLE[31].ID or NECROSIS_SPELL_TABLE[36].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu1");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenuButton", "CENTER", 3000, 3000);
|
|
BuffButtonPosition = 1;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
-- Si la respiration interminable existe, on affiche le bouton dans le menu des buffs
|
|
if NECROSIS_SPELL_TABLE[32].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu2");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenu"..BuffButtonPosition, "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31), 0);
|
|
BuffButtonPosition = 2;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
-- Si la détection de l'invisibilité existe, on affiche le bouton dans le menu des buffs (au plus haut rang)
|
|
if NECROSIS_SPELL_TABLE[33].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu3");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenu"..BuffButtonPosition, "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31), 0);
|
|
BuffButtonPosition = 3;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
-- Si la respiration interminable existe, on affiche le bouton dans le menu des buffs
|
|
if NECROSIS_SPELL_TABLE[34].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu4");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenu"..BuffButtonPosition, "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31), 0);
|
|
BuffButtonPosition = 4;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
-- Si l'invocation de joueur existe, on affiche le bouton dans le menu des buffs
|
|
if NECROSIS_SPELL_TABLE[37].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu5");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenu"..BuffButtonPosition, "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31), 0);
|
|
BuffButtonPosition = 5;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
-- Si le Radar à démon existe, on affiche le bouton dans le menu des buffs
|
|
if NECROSIS_SPELL_TABLE[39].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu6");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenu"..BuffButtonPosition, "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31), 0);
|
|
BuffButtonPosition = 6;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
-- Si le Lien Spirituel existe, on affiche le bouton dans le menu des buffs
|
|
if NECROSIS_SPELL_TABLE[38].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu7");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenu"..BuffButtonPosition, "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31), 0);
|
|
BuffButtonPosition = 7;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
-- Si la protection contre les ombres existe, on affiche le bouton dans le menu des buffs
|
|
if NECROSIS_SPELL_TABLE[43].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu8");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenu"..BuffButtonPosition, "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31), 0);
|
|
BuffButtonPosition = 8;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
-- Si le banissement existe, on affiche le bouton dans le menu des buffs
|
|
if NECROSIS_SPELL_TABLE[9].ID then
|
|
menuVariable = getglobal("NecrosisBuffMenu9");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisBuffMenu"..BuffButtonPosition, "CENTER", ((36 / NecrosisConfig.BuffMenuPos) * 31), 0);
|
|
BuffButtonPosition = 9;
|
|
table.insert(BuffMenuCreate, menuVariable);
|
|
end
|
|
|
|
-- Maintenant que tous les boutons de buff sont placés les uns à côté des autres (hors de l'écran), on affiche les disponibles
|
|
for i = 1, table.getn(BuffMenuCreate), 1 do
|
|
ShowUIPanel(BuffMenuCreate[i]);
|
|
end
|
|
|
|
-- Si la Malédiction amplifiée existe, on affiche le bouton dans le menu des curses
|
|
if NECROSIS_SPELL_TABLE[42].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu1");
|
|
menuVariable:ClearAllPoints();
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
CurseButtonPosition = 1;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
-- Si la Malédiction de faiblesse existe, on affiche le bouton dans le menu des curses
|
|
if NECROSIS_SPELL_TABLE[23].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu2");
|
|
menuVariable:ClearAllPoints();
|
|
if CurseButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenu"..CurseButtonPosition, "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31), 0);
|
|
end
|
|
CurseButtonPosition = 2;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
-- Si la Malédiction d'agonie existe, on affiche le bouton dans le menu des curses
|
|
if NECROSIS_SPELL_TABLE[22].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu3");
|
|
menuVariable:ClearAllPoints();
|
|
if CurseButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenu"..CurseButtonPosition, "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31), 0);
|
|
end
|
|
CurseButtonPosition = 3;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
-- Si la Malédiction de témérité existe, on affiche le bouton dans le menu des curses (au plus haut rang)
|
|
if NECROSIS_SPELL_TABLE[24].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu4");
|
|
menuVariable:ClearAllPoints();
|
|
if CurseButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenu"..CurseButtonPosition, "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31), 0);
|
|
end
|
|
CurseButtonPosition = 4;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
-- Si la Malédiction des languages existe, on affiche le bouton dans le menu des curses
|
|
if NECROSIS_SPELL_TABLE[25].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu5");
|
|
menuVariable:ClearAllPoints();
|
|
if CurseButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenu"..CurseButtonPosition, "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31), 0);
|
|
end
|
|
CurseButtonPosition = 5;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
-- Si la Malédiction de fatigue existe, on affiche le bouton dans le menu des curses
|
|
if NECROSIS_SPELL_TABLE[40].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu6");
|
|
menuVariable:ClearAllPoints();
|
|
if CurseButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenu"..CurseButtonPosition, "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31), 0);
|
|
end
|
|
CurseButtonPosition = 6;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
-- Si la Malédiction des éléments existe, on affiche le bouton dans le menu des curses
|
|
if NECROSIS_SPELL_TABLE[26].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu7");
|
|
menuVariable:ClearAllPoints();
|
|
if CurseButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenu"..CurseButtonPosition, "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31), 0);
|
|
end
|
|
CurseButtonPosition = 7;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
-- Si la Malédiction de l'ombre, on affiche le bouton dans le menu des curses
|
|
if NECROSIS_SPELL_TABLE[27].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu8");
|
|
menuVariable:ClearAllPoints();
|
|
if CurseButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenu"..CurseButtonPosition, "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31), 0);
|
|
end
|
|
CurseButtonPosition = 8;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
-- Si la Malédiction funeste existe, on affiche le bouton dans le menu des curses
|
|
if NECROSIS_SPELL_TABLE[16].ID then
|
|
menuVariable = getglobal("NecrosisCurseMenu9");
|
|
menuVariable:ClearAllPoints();
|
|
if CurseButtonPosition == 0 then
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenuButton", "CENTER", 3000, 3000);
|
|
else
|
|
menuVariable:SetPoint("CENTER", "NecrosisCurseMenu"..CurseButtonPosition, "CENTER", ((36 / NecrosisConfig.CurseMenuPos) * 31), 0);
|
|
end
|
|
CurseButtonPosition = 9;
|
|
table.insert(CurseMenuCreate, menuVariable);
|
|
end
|
|
|
|
-- Maintenant que tous les boutons de curse sont placés les uns à côté des autres (hors de l'écran), on affiche les disponibles
|
|
for i = 1, table.getn(CurseMenuCreate), 1 do
|
|
ShowUIPanel(CurseMenuCreate[i]);
|
|
end
|
|
end
|
|
|
|
-- Gestion des casts du menu des buffs
|
|
function Necrosis_BuffCast(type)
|
|
local TargetEnemy = false;
|
|
if UnitCanAttack("player","target") and type ~= 9 then
|
|
TargetUnit("player");
|
|
TargetEnemy = true;
|
|
end
|
|
-- Si le Démoniste possède la peau de démon mais pas l'armure démoniaque
|
|
if not NECROSIS_SPELL_TABLE[type].ID then
|
|
CastSpell(NECROSIS_SPELL_TABLE[36].ID, "spell");
|
|
else
|
|
if (type ~= 44) or (type == 44 and UnitExists("Pet")) then
|
|
CastSpell(NECROSIS_SPELL_TABLE[type].ID, "spell");
|
|
end
|
|
end
|
|
LastBuff = type;
|
|
if TargetEnemy then TargetLastTarget(); end
|
|
AlphaBuffMenu = 1;
|
|
AlphaBuffVar = GetTime() + 3;
|
|
end
|
|
|
|
-- Gestion des casts du menu des curses
|
|
function Necrosis_CurseCast(type, click)
|
|
if (UnitIsFriend("player","target")) and (not UnitCanAttack("player","target")) then
|
|
AssistUnit("target");
|
|
end
|
|
if (UnitCanAttack("player","target")) and (UnitName("target") ~= nil) then
|
|
if (type == 23 or type == 22 or type == 40) then
|
|
if (click == "RightButton") and (NECROSIS_SPELL_TABLE[42].ID ~= nil) then
|
|
local start3, duration3 = GetSpellCooldown(NECROSIS_SPELL_TABLE[42].ID, "spell");
|
|
if not (start3 > 0 and duration3 > 0) then
|
|
CastSpell(NECROSIS_SPELL_TABLE[42].ID, "spell");
|
|
SpellStopCasting(NECROSIS_SPELL_TABLE[42].Name);
|
|
end
|
|
end
|
|
end
|
|
CastSpell(NECROSIS_SPELL_TABLE[type].ID, "spell");
|
|
LastCurse = type;
|
|
LastCurseClick = click;
|
|
if (click == "MiddleButton") and (UnitExists("Pet")) then
|
|
PetAttack();
|
|
end
|
|
end
|
|
AlphaCurseMenu = 1;
|
|
AlphaCurseVar = GetTime() + 3;
|
|
end
|
|
|
|
-- Gestion des casts du menu des démons
|
|
function Necrosis_PetCast(type, click)
|
|
if type == 8 and InfernalStone == 0 then
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.InfernalStoneNotPresent, "USER");
|
|
return;
|
|
elseif type == 30 and DemoniacStone == 0 then
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.DemoniacStoneNotPresent, "USER");
|
|
return;
|
|
elseif type ~= 15 and type ~= 3 and type ~= 8 and type ~= 30 and Soulshards == 0 then
|
|
Necrosis_Msg(NECROSIS_MESSAGE.Error.SoulShardNotPresent, "USER");
|
|
return;
|
|
end
|
|
if (type == 3 or type == 4 or type == 5 or type == 6) then
|
|
LastDemon = type;
|
|
if (click == "RightButton") and (NECROSIS_SPELL_TABLE[15].ID ~= nil) then
|
|
local start, duration = GetSpellCooldown(NECROSIS_SPELL_TABLE[15].ID, "spell");
|
|
if not (start > 0 and duration > 0) then
|
|
CastSpell(NECROSIS_SPELL_TABLE[15].ID, "spell");
|
|
SpellStopCasting(NECROSIS_SPELL_TABLE[15].Name);
|
|
end
|
|
end
|
|
if NecrosisConfig.DemonSummon and NecrosisConfig.ChatMsg and not NecrosisConfig.SM then
|
|
if NecrosisConfig.PetName[(type - 2)] == " " and NECROSIS_PET_MESSAGE[5] then
|
|
local tempnum = random(1, table.getn(NECROSIS_PET_MESSAGE[5]));
|
|
while tempnum == PetMess and table.getn(NECROSIS_PET_MESSAGE[5]) >= 2 do
|
|
tempnum = random(1, table.getn(NECROSIS_PET_MESSAGE[5]));
|
|
end
|
|
PetMess = tempnum;
|
|
for i = 1, table.getn(NECROSIS_PET_MESSAGE[5][tempnum]) do
|
|
Necrosis_Msg(Necrosis_MsgReplace(NECROSIS_PET_MESSAGE[5][tempnum][i]), "SAY");
|
|
end
|
|
elseif NECROSIS_PET_MESSAGE[(type - 2)] then
|
|
local tempnum = random(1, table.getn(NECROSIS_PET_MESSAGE[(type - 2)]));
|
|
while tempnum == PetMess and table.getn(NECROSIS_PET_MESSAGE[(type - 2)]) >= 2 do
|
|
tempnum = random(1, table.getn(NECROSIS_PET_MESSAGE[(type - 2)]));
|
|
end
|
|
PetMess = tempnum;
|
|
for i = 1, table.getn(NECROSIS_PET_MESSAGE[(type - 2)][tempnum]) do
|
|
Necrosis_Msg(Necrosis_MsgReplace(NECROSIS_PET_MESSAGE[(type - 2)][tempnum][i], nil , type - 2), "SAY");
|
|
end
|
|
end
|
|
end
|
|
end
|
|
CastSpell(NECROSIS_SPELL_TABLE[type].ID, "spell");
|
|
AlphaPetMenu = 1;
|
|
AlphaPetVar = GetTime() + 3;
|
|
end
|
|
|
|
-- Fonction permettant l'affichage des différentes pages du livre des configurations
|
|
function NecrosisGeneralTab_OnClick(id)
|
|
local TabName;
|
|
for index=1, 5, 1 do
|
|
TabName = getglobal("NecrosisGeneralTab"..index);
|
|
if index == id then
|
|
TabName:SetChecked(1);
|
|
else
|
|
TabName:SetChecked(nil);
|
|
end
|
|
end
|
|
if id == 1 then
|
|
ShowUIPanel(NecrosisShardMenu);
|
|
HideUIPanel(NecrosisMessageMenu);
|
|
HideUIPanel(NecrosisButtonMenu);
|
|
HideUIPanel(NecrosisTimerMenu);
|
|
HideUIPanel(NecrosisGraphOptionMenu);
|
|
NecrosisGeneralIcon:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BookIcon");
|
|
NecrosisGeneralPageText:SetText(NECROSIS_CONFIGURATION.Menu1);
|
|
elseif id == 2 then
|
|
HideUIPanel(NecrosisShardMenu);
|
|
ShowUIPanel(NecrosisMessageMenu);
|
|
HideUIPanel(NecrosisButtonMenu);
|
|
HideUIPanel(NecrosisTimerMenu);
|
|
HideUIPanel(NecrosisGraphOptionMenu);
|
|
NecrosisGeneralIcon:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BookIcon");
|
|
NecrosisGeneralPageText:SetText(NECROSIS_CONFIGURATION.Menu2);
|
|
elseif id == 3 then
|
|
HideUIPanel(NecrosisShardMenu);
|
|
HideUIPanel(NecrosisMessageMenu);
|
|
ShowUIPanel(NecrosisButtonMenu);
|
|
HideUIPanel(NecrosisTimerMenu);
|
|
HideUIPanel(NecrosisGraphOptionMenu);
|
|
NecrosisGeneralIcon:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BookIcon");
|
|
NecrosisGeneralPageText:SetText(NECROSIS_CONFIGURATION.Menu3);
|
|
elseif id == 4 then
|
|
HideUIPanel(NecrosisShardMenu);
|
|
HideUIPanel(NecrosisMessageMenu);
|
|
HideUIPanel(NecrosisButtonMenu);
|
|
ShowUIPanel(NecrosisTimerMenu);
|
|
HideUIPanel(NecrosisGraphOptionMenu);
|
|
NecrosisGeneralIcon:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BookIcon");
|
|
NecrosisGeneralPageText:SetText(NECROSIS_CONFIGURATION.Menu4);
|
|
elseif id == 5 then
|
|
HideUIPanel(NecrosisShardMenu);
|
|
HideUIPanel(NecrosisMessageMenu);
|
|
HideUIPanel(NecrosisButtonMenu);
|
|
HideUIPanel(NecrosisTimerMenu);
|
|
ShowUIPanel(NecrosisGraphOptionMenu);
|
|
NecrosisGeneralIcon:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BookIcon");
|
|
NecrosisGeneralPageText:SetText(NECROSIS_CONFIGURATION.Menu5);
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- Bon, pour pouvoir utiliser le Timer sur les sorts instants, j'ai été obligé de m'inspirer de Cosmos
|
|
-- Comme je ne voulais pas rendre le mod dépendant de Sea, j'ai repris ses fonctions
|
|
-- Apparemment, la version Stand-Alone de ShardTracker a fait pareil :) :)
|
|
Necrosis_Hook = function (orig,new,type)
|
|
if(not type) then type = "before"; end
|
|
if(not Hx_Hooks) then Hx_Hooks = {}; end
|
|
if(not Hx_Hooks[orig]) then
|
|
Hx_Hooks[orig] = {}; Hx_Hooks[orig].before = {}; Hx_Hooks[orig].before.n = 0; Hx_Hooks[orig].after = {}; Hx_Hooks[orig].after.n = 0; Hx_Hooks[orig].hide = {}; Hx_Hooks[orig].hide.n = 0; Hx_Hooks[orig].replace = {}; Hx_Hooks[orig].replace.n = 0; Hx_Hooks[orig].orig = getglobal(orig);
|
|
else
|
|
for key,value in Hx_Hooks[orig][type] do if(value == getglobal(new)) then return; end end
|
|
end
|
|
Necrosis_Push(Hx_Hooks[orig][type],getglobal(new)); setglobal(orig,function(...) Necrosis_HookHandler(orig,arg); end);
|
|
end
|
|
|
|
Necrosis_HookHandler = function (name,arg)
|
|
local called = false; local continue = true; local retval;
|
|
for key,value in Hx_Hooks[name].hide do
|
|
if(type(value) == "function") then if(not value(unpack(arg))) then continue = false; end called = true; end
|
|
end
|
|
if(not continue) then return; end
|
|
for key,value in Hx_Hooks[name].before do
|
|
if(type(value) == "function") then value(unpack(arg)); called = true; end
|
|
end
|
|
continue = false;
|
|
local replacedFunction = false;
|
|
for key,value in Hx_Hooks[name].replace do
|
|
if(type(value) == "function") then
|
|
replacedFunction = true; if(value(unpack(arg))) then continue = true; end called = true;
|
|
end
|
|
end
|
|
if(continue or (not replacedFunction)) then retval = Hx_Hooks[name].orig(unpack(arg)); end
|
|
for key,value in Hx_Hooks[name].after do
|
|
if(type(value) == "function") then value(unpack(arg)); called = true;end
|
|
end
|
|
if(not called) then setglobal(name,Hx_Hooks[name].orig); Hx_Hooks[name] = nil; end
|
|
return retval;
|
|
end
|
|
|
|
function Necrosis_Push (table,val)
|
|
if(not table or not table.n) then return nil; end
|
|
table.n = table.n+1;
|
|
table[table.n] = val;
|
|
end
|
|
|
|
function Necrosis_UseAction(id, number, onSelf)
|
|
Necrosis_MoneyToggle();
|
|
NecrosisTooltip:SetAction(id);
|
|
local tip = tostring(NecrosisTooltipTextLeft1:GetText());
|
|
if tip then
|
|
SpellCastName = tip;
|
|
SpellTargetName = UnitName("target");
|
|
if not SpellTargetName then
|
|
SpellTargetName = "";
|
|
end
|
|
SpellTargetLevel = UnitLevel("target");
|
|
if not SpellTargetLevel then
|
|
SpellTargetLevel = "";
|
|
end
|
|
end
|
|
end
|
|
|
|
function Necrosis_CastSpell(spellId, spellbookTabNum)
|
|
local Name, Rank = GetSpellName(spellId, spellbookTabNum);
|
|
if Rank ~= nil then
|
|
local _, _, Rank2 = string.find(Rank, "(%d+)");
|
|
SpellCastRank = tonumber(Rank2);
|
|
end
|
|
SpellCastName = Name;
|
|
|
|
SpellTargetName = UnitName("target");
|
|
if not SpellTargetName then
|
|
SpellTargetName = "";
|
|
end
|
|
SpellTargetLevel = UnitLevel("target");
|
|
if not SpellTargetLevel then
|
|
SpellTargetLevel = "";
|
|
end
|
|
end
|
|
|
|
function Necrosis_CastSpellByName(Spell)
|
|
local _, _, Name = string.find(Spell, "(.+)%(");
|
|
local _, _, Rank = string.find(Spell, "([%d]+)");
|
|
|
|
if Rank ~= nil then
|
|
local _, _, Rank2 = string.find(Rank, "(%d+)");
|
|
SpellCastRank = tonumber(Rank2);
|
|
end
|
|
|
|
if not Name then
|
|
_, _, Name = string.find(Spell, "(.+)");
|
|
end
|
|
SpellCastName = Name;
|
|
|
|
SpellTargetName = UnitName("target");
|
|
if not SpellTargetName then
|
|
SpellTargetName = "";
|
|
end
|
|
SpellTargetLevel = UnitLevel("target");
|
|
if not SpellTargetLevel then
|
|
SpellTargetLevel = "";
|
|
end
|
|
end
|
|
|
|
function NecrosisTimer(nom, duree)
|
|
local Cible = UnitName("target");
|
|
local Niveau = UnitLevel("target");
|
|
local truc = 6;
|
|
if not Cible then
|
|
Cible = "";
|
|
truc = 2;
|
|
end
|
|
if not Niveau then
|
|
Niveau = "";
|
|
end
|
|
|
|
SpellGroup, SpellTimer, TimerTable = NecrosisTimerX(nom, duree, truc, Cible, Niveau, SpellGroup, SpellTimer, TimerTable);
|
|
end
|
|
|
|
function NecrosisSpellCast(name)
|
|
if string.find(name, "coa") then
|
|
SpellCastName = NECROSIS_SPELL_TABLE[22].Name;
|
|
SpellTargetName = UnitName("target");
|
|
if not SpellTargetName then
|
|
SpellTargetName = "";
|
|
end
|
|
SpellTargetLevel = UnitLevel("target");
|
|
if not SpellTargetLevel then
|
|
SpellTargetLevel = "";
|
|
end
|
|
CastSpell(NECROSIS_SPELL_TABLE[22].ID, "spell");
|
|
end
|
|
end
|