// EtatEquipementNetworkSync.cs - v1.0 // // Composant a ajouter sur chaque prefab d'equipement rackmount qui possede un // EtatEquipement + BoutonPower (Serveur_1U, Switch_24P, Parefeu, etc.). // // Synchronise 2 etats critiques au rejoin : // 1. L'etat "bouton Power allume" (BoutonPower.estAllume) // 2. L'etat "sous tension" de l'equipement (EtatEquipement.estSousTension) // // Le serveur est autoritaire : quand le serveur change l'etat (via // CmdAppuyerBoutonPower), il appelle ServerSetEstAllume() qui met a jour la // SyncVar. Les clients (actuellement connectes ET futurs rejoigneurs) // recoivent l'etat via le hook SyncVar. // // Note : les animations visuelles (ventilos, LEDs) sont gerees par l'Update() // de EtatEquipement et BoutonPower qui lisent simplement les bool locaux. using UnityEngine; using Mirror; [RequireComponent(typeof(NetworkIdentity))] public class EtatEquipementNetworkSync : NetworkBehaviour { [SyncVar(hook = nameof(OnBoutonAllumeChanged))] private bool _syncBoutonAllume = false; [SyncVar(hook = nameof(OnSousTensionChanged))] private bool _syncSousTension = false; private BoutonPower _bouton; private EtatEquipement _etat; void Awake() { _bouton = GetComponentInChildren(); _etat = GetComponentInChildren(); } public override void OnStartClient() { base.OnStartClient(); // Sur le host, rien a faire (le serveur est deja a jour) if (NetworkServer.active) return; // Au rejoin : appliquer les valeurs actuelles des SyncVars. // Les hooks ne sont PAS appeles automatiquement pour les valeurs initiales, // il faut forcer l'application ici. ApplyBoutonAllume(_syncBoutonAllume); ApplySousTension(_syncSousTension); } // ============================================================ // API SERVEUR // ============================================================ /// /// Appele cote serveur quand BoutonPower.Appuyer() a ete execute et qu'il /// faut synchroniser l'etat aux clients (actuels et futurs). /// [Server] public void ServerSyncEtat() { if (_bouton != null) _syncBoutonAllume = _bouton.estAllume; if (_etat != null) _syncSousTension = _etat.estSousTension; } // ============================================================ // HOOKS // ============================================================ void OnBoutonAllumeChanged(bool ancien, bool nouveau) { ApplyBoutonAllume(nouveau); } void OnSousTensionChanged(bool ancien, bool nouveau) { ApplySousTension(nouveau); } // ============================================================ // APPLICATION LOCALE // ============================================================ private void ApplyBoutonAllume(bool valeur) { if (_bouton == null) _bouton = GetComponentInChildren(); if (_bouton == null) return; if (_bouton.estAllume != valeur) { // On assigne directement le champ sans appeler Appuyer() (qui ferait // des effets de bord comme verifier le cablage, rejouer les sons, etc.) _bouton.estAllume = valeur; _bouton.MettreAJourVisuel(); } } private void ApplySousTension(bool valeur) { if (_etat == null) _etat = GetComponentInChildren(); if (_etat == null) return; _etat.estSousTension = valeur; } }