dcsim-gameserver/Patchs/pack_multi/Scripts_Nouveaux/EtatEquipementNetworkSync.cs
2026-04-18 11:31:50 +00:00

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;
}
}