------------------------------------------------------------------------------------------------------ -- 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 23.04.2006-1 ------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------ -- FONCTIONS D'INSERTION ------------------------------------------------------------------------------------------------------ -- La table des timers est là pour ça ! function Necrosis_InsertTimerParTable(IndexTable, Target, LevelTarget, SpellGroup, SpellTimer, TimerTable) -- Insertion de l'entrée dans le tableau table.insert(SpellTimer, { Name = NECROSIS_SPELL_TABLE[IndexTable].Name, Time = NECROSIS_SPELL_TABLE[IndexTable].Length, TimeMax = floor(GetTime() + NECROSIS_SPELL_TABLE[IndexTable].Length), Type = NECROSIS_SPELL_TABLE[IndexTable].Type, Target = Target, TargetLevel = LevelTarget, Group = 0, Gtimer = nil }); -- Association d'un timer graphique au timer SpellTimer, TimerTable = Necrosis_AddFrame(SpellTimer, TimerTable); -- Tri des entrées par type de sort Necrosis_Tri(SpellTimer, "Type"); -- Création des groupes (noms des mobs) des timers SpellGroup, SpellTimer = Necrosis_Parsing(SpellGroup, SpellTimer); return SpellGroup, SpellTimer, TimerTable; end -- Et pour insérer le timer de pierres function Necrosis_InsertTimerStone(Stone, start, duration, SpellGroup, SpellTimer, TimerTable) -- Insertion de l'entrée dans le tableau if Stone == "Healthstone" then table.insert(SpellTimer, { Name = NECROSIS_COOLDOWN.Healthstone, Time = 180, TimeMax = floor(GetTime() + 180), Type = 2, Target = "", TargetLevel = "", Group = 2, Gtimer = nil }); -- Association d'un timer graphique au timer SpellTimer, TimerTable = Necrosis_AddFrame(SpellTimer, TimerTable); elseif Stone == "Spellstone" then table.insert(SpellTimer, { Name = NECROSIS_COOLDOWN.Spellstone, Time = 30, TimeMax = floor(GetTime() + 30), Type = 2, Target = "", TargetLevel = "", Group = 2, Gtimer = nil }); -- Association d'un timer graphique au timer SpellTimer, TimerTable = Necrosis_AddFrame(SpellTimer, TimerTable); elseif Stone == "Soulstone" then table.insert(SpellTimer, { Name = NECROSIS_SPELL_TABLE[11].Name, Time = floor(duration - GetTime() + start), TimeMax = floor(start + duration), Type = NECROSIS_SPELL_TABLE[11].Type, Target = "???", TargetLevel = "", Group = 1, Gtimer = nil, }); -- Association d'un timer graphique au timer SpellTimer, TimerTable = Necrosis_AddFrame(SpellTimer, TimerTable); end -- Tri des entrées par type de sort Necrosis_Tri(SpellTimer, "Type"); -- Création des groupes (noms des mobs) des timers SpellGroup, SpellTimer = Necrosis_Parsing(SpellGroup, SpellTimer); return SpellGroup, SpellTimer, TimerTable; end -- Pour la création de timers personnels function NecrosisTimerX(nom, duree, truc, Target, LevelTarget, SpellGroup, SpellTimer, TimerTable) table.insert(SpellTimer, { Name = nom, Time = duree, TimeMax = floor(GetTime() + duree), Type = truc, Target = Target, TargetLevel = LevelTarget, Group = 0, Gtimer = nil }); -- Association d'un timer graphique au timer SpellTimer, TimerTable = Necrosis_AddFrame(SpellTimer, TimerTable); -- Tri des entrées par type de sort Necrosis_Tri(SpellTimer, "Type"); -- Création des groupes (noms des mobs) des timers SpellGroup, SpellTimer = Necrosis_Parsing(SpellGroup, SpellTimer); return SpellGroup, SpellTimer, TimerTable; end ------------------------------------------------------------------------------------------------------ -- FONCTIONS DE RETRAIT ------------------------------------------------------------------------------------------------------ -- Connaissant l'index du Timer dans la liste, on le supprime function Necrosis_RetraitTimerParIndex(index, SpellTimer, TimerTable) -- Suppression du timer graphique local Gtime = SpellTimer[index].Gtimer; TimerTable = Necrosis_RemoveFrame(Gtime, TimerTable); -- On enlève le timer de la liste table.remove(SpellTimer, index); return SpellTimer, TimerTable; end -- Si on veut supprimer spécifiquement un Timer... function Necrosis_RetraitTimerParNom(name, SpellTimer, TimerTable) for index = 1, table.getn(SpellTimer), 1 do if SpellTimer[index].Name == name then SpellTimer = Necrosis_RetraitTimerParIndex(index, SpellTimer, TimerTable); break; end end return SpellTimer, TimerTable; end -- Fonction pour enlever les timers de combat lors de la regen function Necrosis_RetraitTimerCombat(SpellGroup, SpellTimer, TimerTable) for index=1, table.getn(SpellTimer), 1 do if SpellTimer[index] then -- Si les cooldowns sont nominatifs, on enlève le nom if SpellTimer[index].Type == 3 then SpellTimer[index].Target = ""; SpellTimer[index].TargetLevel = ""; end -- Enlevage des timers de combat if ((SpellTimer[index].Type == 4) or (SpellTimer[index].Type == 5)) then SpellTimer = Necrosis_RetraitTimerParIndex(index, SpellTimer, TimerTable); end end end if table.getn(SpellGroup.Name) >= 4 then for index = 4, table.getn(SpellGroup.Name), 1 do table.remove(SpellGroup.Name); table.remove(SpellGroup.SubName); table.remove(SpellGroup.Visible); end end return SpellGroup, SpellTimer, TimerTable; end ------------------------------------------------------------------------------------------------------ -- FONCTIONS BOOLEENNES ------------------------------------------------------------------------------------------------------ function Necrosis_TimerExisteDeja(Nom, SpellTimer) for index = 1, table.getn(SpellTimer), 1 do if SpellTimer[index].Name == Nom then return true; end end return false; end ------------------------------------------------------------------------------------------------------ -- FONCTIONS DE TRI ------------------------------------------------------------------------------------------------------ -- On définit les groupes de chaque Timer function Necrosis_Parsing(SpellGroup, SpellTimer) local GroupeOK = false; for index = 1, table.getn(SpellTimer), 1 do local GroupeOK = false; for i = 1, table.getn(SpellGroup.Name), 1 do if ((SpellTimer[index].Type == i) and (i <= 3)) or (SpellTimer[index].Target == SpellGroup.Name[i] and SpellTimer[index].TargetLevel == SpellGroup.SubName[i]) then GroupeOK = true; SpellTimer[index].Group = i; break; end end -- Si le groupe n'existe pas, on en crée un nouveau if not GroupeOK then table.insert(SpellGroup.Name, SpellTimer[index].Target); table.insert(SpellGroup.SubName, SpellTimer[index].TargetLevel); table.insert(SpellGroup.Visible, false); SpellTimer[index].Group = table.getn(SpellGroup.Name); end end Necrosis_Tri(SpellTimer, "Group"); return SpellGroup, SpellTimer; end -- On trie les timers selon leur groupe function Necrosis_Tri(SpellTimer, clef) return table.sort(SpellTimer, function (SubTab1, SubTab2) return SubTab1[clef] < SubTab2[clef] end); end ------------------------------------------------------------------------------------------------------ -- FONCTIONS D'AFFICHAGE : CREATION DE LA CHAINE DE CARACTERE ------------------------------------------------------------------------------------------------------ function Necrosis_DisplayTimer(display, index, SpellGroup, SpellTimer, GraphicalTimer, TimerTable) if not SpellTimer then return display, SpellGroup; end local minutes = 0; local seconds = 0; local affichage; -- Changement de la couleur suivant le temps restant local percent = (floor(SpellTimer[index].TimeMax - floor(GetTime())) / SpellTimer[index].Time)*100; local color = NecrosisTimerColor(percent); if not SpellGroup.Visible[SpellTimer[index].Group] and SpellGroup.SubName[SpellTimer[index].Group] ~= nil and SpellGroup.Name[SpellTimer[index].Group] ~= nil then display = display.."-------------------------------\n"..SpellGroup.Name[SpellTimer[index].Group].." "..SpellGroup.SubName[SpellTimer[index].Group].."\n-------------------------------\n"; -- Crée le tableau qui servira aux timers graphiques table.insert(GraphicalTimer.texte, SpellGroup.Name[SpellTimer[index].Group].." "..SpellGroup.SubName[SpellTimer[index].Group]); table.insert(GraphicalTimer.TimeMax, 0); table.insert(GraphicalTimer.Time, 0); table.insert(GraphicalTimer.titre, true); table.insert(GraphicalTimer.temps, ""); table.insert(GraphicalTimer.Gtimer, 0); SpellGroup.Visible[SpellTimer[index].Group] = true; end -- Mise en place d'un Chrono plutôt qu'un Compte à Rebours pour l'asservissement if SpellTimer[index].Name == NECROSIS_SPELL_TABLE[10].Name then seconds = floor(GetTime()) - (SpellTimer[index].TimeMax - SpellTimer[index].Time); else seconds = SpellTimer[index].TimeMax - floor(GetTime()); end minutes = floor(seconds/60); if (minutes > 0) then if (minutes > 9) then affichage = tostring(minutes)..":"; else affichage = "0"..minutes..":" end else affichage = "0:"; end seconds = mod(seconds, 60); if (seconds > 9) then affichage = affichage..seconds else affichage = affichage.."0"..seconds end display = display..""..affichage.." - "; -- Crée le tableau qui servira aux timers graphiques if (SpellTimer[index].Type == 1 or SpellTimer[index].Name == NECROSIS_SPELL_TABLE[16].Name) and (SpellTimer[index].Target ~= "") then if NecrosisConfig.SpellTimerPos == 1 then affichage = affichage.." - "..SpellTimer[index].Target; else affichage = SpellTimer[index].Target.." - "..affichage; end end table.insert(GraphicalTimer.texte, SpellTimer[index].Name); table.insert(GraphicalTimer.TimeMax, SpellTimer[index].TimeMax); table.insert(GraphicalTimer.Time, SpellTimer[index].Time); table.insert(GraphicalTimer.titre, false); table.insert(GraphicalTimer.temps, affichage); table.insert(GraphicalTimer.Gtimer, SpellTimer[index].Gtimer); if NecrosisConfig.CountType == 3 then if SpellTimer[index].Name == NECROSIS_SPELL_TABLE[11].Name then if (minutes > 0) then NecrosisShardCount:SetText(minutes.." m"); else NecrosisShardCount:SetText(seconds); end end end if NecrosisConfig.Circle == 2 then if SpellTimer[index].Name == NECROSIS_SPELL_TABLE[11].Name then if (minutes >= 16) then NecrosisButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Turquoise\\Shard"..minutes - 15); elseif minutes >= 1 or seconds >= 33 then NecrosisButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Orange\\Shard"..minutes + 1); else NecrosisButton:SetNormalTexture("Interface\\AddOns\\Necrosis\\UI\\Rose\\Shard"..seconds); end end end display = display..color..SpellTimer[index].Name..""; if (SpellTimer[index].Type == 1 or SpellTimer[index].Name == NECROSIS_SPELL_TABLE[16].Name) and (SpellTimer[index].Target ~= "") then display = display.." - "..SpellTimer[index].Target.."\n"; else display = display.."\n"; end -- Affichage des timers graphiques (si sélectionnés) if NecrosisConfig.Graphical then NecrosisAfficheTimer(GraphicalTimer, TimerTable); end return display, SpellGroup, GraphicalTimer, TimerTable; end