
Guide du Système de Phases
Introduction
Ce guide explique comment fonctionne le système de phases dans les émulateurs et comment activer la Phase 0. Les phases permettent de contrôler qui voit quoi sur votre serveur.
1. Les Bases des Phases
Comment ça marche ?
Le système utilise des valeurs numériques pour identifier les phases. Ces valeurs vont de 1 à 4 294 967 296.
Les 32 phases uniques
Il existe 32 phases individuelles :
Phase 1, 2, 4, 8, 16, 32, 64, 128... 4 294 967 296
À retenir : Le nom/numéro de la phase = sa valeur
- Phase 1 : valeur 1
- Phase 4 : valeur 4
- Phase 64 : valeur 64
Combiner les phases
Vous pouvez rendre une entité visible dans plusieurs phases en additionnant leurs valeurs :
-- Visible en phase 1 uniquement
phaseMask = 1
-- Visible en phases 1 ET 2
phaseMask = 3 (1 + 2)
-- Visible en phases 1, 2 ET 4
phaseMask = 7 (1 + 2 + 4)
-- Visible en phases 2 ET 8
phaseMask = 10 (2 + 8)
Astuce : Vous pouvez même additionner des combinaisons entre elles !
-- Exemple : 3 + 5 + 6 = 14
Règle de visibilité
Deux entités se voient si elles partagent au moins une phase commune.
Exemple :
JoueurA : phaseMask = 1 (phase 1)
JoueurB : phaseMask = 2 (phase 2)
JoueurC : phaseMask = 3 (phases 1 + 2)
Résultat :
- JoueurA voit JoueurC
- JoueurB voit JoueurC
- JoueurA ne voit PAS JoueurB
- JoueurC voit JoueurA et JoueurB
2. La Phase 0 - Cas Spécial
Qu'est-ce que la Phase 0 ?
La Phase 0 est une phase complètement isolée. Une entité en Phase 0 :
- Ne voit personne
- N'est vue par personne
- Même deux entités en Phase 0 ne se voient pas
À quoi ça sert ?
La Phase 0 est parfaite pour :
- Stocker des NPCs temporaires
- Libérer les autres phases pour vos joueurs
Le problème par défaut
Sur la plupart des émulateurs, quand vous mettez un NPC en Phase 0, il revient automatiquement en Phase 1 après un redémarrage du serveur.
3. Activer la Phase 0
⚠️ Important : Ce guide est basé sur TrinityCore. Pour AzerothCore, la modification peut être différente.
Modification du code (TrinityCore)
Fichier : src/server/game/Globals/ObjectMgr.cpp
Cherchez et commentez ces blocs :
Pour les Creatures :
/*
if (data.phaseMask == 0)
{
TC_LOG_ERROR("sql.sql", "Table `creature` has creature (GUID: %u Entry: %u) with `phaseMask`=0 (not visible for anyone), set to 1.", data.guid, data.id);
data.phaseMask = 1;
}
*/
Pour les GameObjects :
/*
if (data.phaseMask == 0)
{
TC_LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: %u Entry: %u) with `phaseMask`=0 (not visible for anyone), set to 1.", data.guid, data.id);
data.phaseMask = 1;
}
*/
4. Utiliser la Phase 0
Mettre un NPC en Phase 0
SET @GUID := 12345; -- Remplacez par votre GUID
UPDATE creature SET phaseMask = 0, spawnMask = 0 WHERE guid = @GUID;
Mettre un GameObject en Phase 0
SET @GUID := 67890; -- Remplacez par votre GUID
UPDATE gameobject SET phaseMask = 0, spawnMask = 0 WHERE guid = @GUID;
Vérifier les entités en Phase 0
-- Voir tous les NPCs en Phase 0
SELECT guid, id, phaseMask FROM creature WHERE phaseMask = 0;
-- Voir tous les objets en Phase 0
SELECT guid, id, phaseMask FROM gameobject WHERE phaseMask = 0;
5. Calculs Pratiques
Trouver le phaseMask pour plusieurs phases
Méthode simple : Additionnez les valeurs
Phases 1 + 4 + 16 = ?
-> 1 + 4 + 16 = 21
Vérifier si une phase est active
Méthode binaire : Utilisez l'opérateur &
-- Est-ce que la phase 4 est dans le masque 7 ?
SELECT (7 & 4) > 0 AS est_active;
-- Résultat : 1 (oui)
-- Est-ce que la phase 8 est dans le masque 7 ?
SELECT (7 & 8) > 0 AS est_active;
-- Résultat : 0 (non)
Conseils
- Utilisez des phases logiques (phase 1 = normal, phase 2 = événement, etc.)
- Gardez un registre des entités en Phase 0
- Ne mettez en Phase 0 que ce qui doit être invisible
- Pour les tests GM, utilisez des phases élevées (1024, 2048, etc.)
Remerciements
Merci à Belitharian pour son aide sur la résolution du problème de persistance de la Phase 0.