108 lines
3.5 KiB
C#
108 lines
3.5 KiB
C#
// 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<BoutonPower>();
|
|
_etat = GetComponentInChildren<EtatEquipement>();
|
|
}
|
|
|
|
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
|
|
// ============================================================
|
|
|
|
/// <summary>
|
|
/// Appele cote serveur quand BoutonPower.Appuyer() a ete execute et qu'il
|
|
/// faut synchroniser l'etat aux clients (actuels et futurs).
|
|
/// </summary>
|
|
[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<BoutonPower>();
|
|
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<EtatEquipement>();
|
|
if (_etat == null) return;
|
|
|
|
_etat.estSousTension = valeur;
|
|
}
|
|
}
|