7.8 KiB
DatacenterSim v7.1 — Pack multi complet
Pack de 3 patches qui corrigent les 3 bugs identifiés en multijoueur après reco :
- Portage d'équipements invisible pour les autres joueurs
- Câbles alim + RJ45 pendants après reco
- Serveurs éteints après reco
Ce qu'il y a dans le ZIP
Scripts_Modifies/ (remplacer dans Assets/Scripts/)
-
PlayerInteraction.cs— 3 changements- Revert de mon patch authority (plus de AssignClientAuthority/RemoveClientAuthority sur équipements)
CmdUpdateTransportPositionbouge maintenant l'objet côté serveur- Helper
SetNetworkTransformActif()+ désactivation NT local pendant portage + réactivation à la pose CmdAppuyerBoutonPowerappelleEtatEquipementNetworkSync.ServerSyncEtatpour le rejoin
-
CablageReseau.cs— 4 ajoutsCmdCreerCableRJ45/CmdCreerCableAlimenregistrent dans le gestionnaireCmdSupprimerCableRJ45/CmdSupprimerCableAlimdésenregistrent
-
BaieNetworkSetup.cs— 1 ajoutOnStartClientnotifie le gestionnaire que la baie est prête
-
EtatEquipement.cs— 1 ajoutVerifierAlimentationappelleEtatEquipementNetworkSync.ServerSyncEtatquand l'état change
Scripts_Nouveaux/ (AJOUTER dans Assets/Scripts/)
-
GestionnaireCablesReseau.cs— NetworkBehaviour singleton qui tient 2 SyncLists (câbles alim + RJ45) et rejoue les câbles au rejoin des clients -
EtatEquipementNetworkSync.cs— Composant à ajouter sur les prefabs d'équipements rackmount pour synchroniser l'état bouton/sous-tension au rejoin
Configuration Unity requise
1. Prefabs d'équipements : NetworkTransform en Server To Client
IMPORTANT : tu avais configuré Client To Server pour mon dernier patch raté. Remets-les en Server To Client :
Pour chaque prefab dans NetworkManager.spawnPrefabs (sauf Chariot et prefab joueur) :
- Ouvrir le prefab
- Le
NetworkTransformReliable/NetworkTransformUnreliable:- Sync Direction :
Server To Client⚠️ - Sync Position : ✅
- Sync Rotation : ✅
- Sync Scale : ❌
- Compress Rotation : ✅
- Only Sync On Change : ✅
- Interpolate Position : ✅
- Interpolate Rotation : ✅
- Send Interval Multiplier : 3 ou 5
- Sync Direction :
Prefabs concernés : Serveur_1U, Switch_24P, Parefeu, PDU_APC_*, Baie_Procedurale, Toron_Base.
Ne PAS toucher : le chariot (Client To Server) et le prefab joueur (Client To Server).
2. Ajouter GestionnaireCablesReseau à la scène Datacenter_01
- Dans la scène,
Hierarchy→ clic droit →Create Empty - Renommer :
GestionnaireCables_Holder Add Component→NetworkIdentity(laisser toutes les checkboxes décochées)Add Component→GestionnaireCablesReseau- Sauver la scène (Ctrl+S)
3. Ajouter EtatEquipementNetworkSync sur les prefabs d'équipements rackmount
Pour chaque prefab qui a un BoutonPower + EtatEquipement :
- Ouvrir le prefab
Add Component→EtatEquipementNetworkSync- Sauver
Prefabs concernés : Serveur_1U, Switch_24P, Parefeu.
(Pas besoin sur PDU, Toron, Baie — ces prefabs n'ont pas de bouton power.)
Tests à faire
Test 1 — Non-régression solo
Lancer en éditeur Play. Tout doit fonctionner comme avant (pas de multi).
Test 2 — Portage visible en multi
- Host + 1 client connecté
- Client prend un serveur 1U depuis un carton → tu dois voir le serveur suivre le client
- Client le pose dans une baie → tu dois voir le snap
- Tu prends le même serveur pour le déracker → le client doit te voir le porter
Test 3 — Câbles alim au rejoin
- Client pose baie + 2 serveurs + 2 PDUs + 2 câbles alim
- Client allume les serveurs (bouton Power)
- Client déco + reco
- Attendu : câbles alim toujours connectés (non pendants), serveurs toujours allumés (ventilos tournent, LED verte)
Test 4 — Câbles RJ45 au rejoin
- Client pose baie + 2 serveurs + 1 switch + torons + câbles RJ45
- Client déco + reco
- Attendu : câbles RJ45 toujours branchés correctement
Test 5 — 2e joueur qui rejoint en cours
- Client 1 a tout câblé et allumé
- Client 2 se connecte
- Attendu : client 2 voit TOUT l'état (câbles + serveurs allumés)
Logs à surveiller
Côté serveur, quand un câble est créé :
[Serveur] Câble alim créé : PDU 10 prise 11 → equip 7 port 0
[GestionnaireCablesReseau] Cable alim enregistre (total : 1)
Côté client qui rejoint :
[GestionnaireCablesReseau] Client rejoint : 2 cables alim, 3 cables RJ45 a recreer
[BaieNetworkSetup] Baie regeneree cote client : Baie_Procedurale(Clone)
[GestionnaireCablesReseau] Baie prete : Baie_Procedurale(Clone), retry cables en attente
[GestionnaireCablesReseau] Cable alim recree : PDU 10 prise #11 -> PSU0
[GestionnaireCablesReseau] Tous les cables ont ete recrees
Si timeout (normalement jamais) :
[GestionnaireCablesReseau] Timeout : 1 cables alim + 0 cables RJ45 jamais recrees
→ ça veut dire qu'une baie ou un équipement ne s'est pas spawné correctement côté client.
Architecture du mécanisme "baie prête"
Le problème classique au rejoin : on tente de recréer un câble entre PDU X et serveur Y, mais X ou Y n'existent pas encore localement parce que leur parent (la baie) n'a pas fini de se régénérer.
Solution :
- Au
OnStartClientdu gestionnaire, on met tous les câbles à recréer en "liste d'attente" - On tente une première passe après 0.5s (laisse le temps aux premiers spawn)
- Chaque
BaieNetworkSetup.OnStartClientse termine parNotifierBaiePrete()qui déclenche un retry sur tous les câbles en attente - En fallback, un retry périodique toutes les 0.5s pendant 15s max
- Timeout à 15s avec un warning dans les logs
C'est robuste aux ordres de spawn aléatoires et évite tout callback hell.
Remarques techniques
Pourquoi retirer l'authority pour le portage ?
NetworkTransform Client-to-Server exige l'authority. Le patch précédent transférait l'authority au ramassage, mais ça créait plein de race conditions (logs EntityStateMessage without authority, objets figés/dédoublés...).
La nouvelle approche : le serveur est TOUJOURS autoritaire. Le client porteur envoie des CmdUpdateTransportPosition qui bougent l'objet côté serveur, puis NetworkTransform Server-to-Client propage aux autres clients. Beaucoup plus simple, plus robuste.
Pourquoi désactiver NT local pour le porteur ?
Sans ça, le client porteur reçoit sa propre position serveur avec ~50ms de latence → son objet tremble. En désactivant le NT localement, son objet suit parfaitement ses mouvements (il est pilote par le Rigidbody local).
Quand il pose, on réactive NT → il reçoit alors la position "figée" du serveur (qui a fait rb.isKinematic=true + position snap).
Pourquoi un gestionnaire séparé pour les câbles ?
CablageReseau est sur le prefab joueur : chaque joueur a sa propre instance. Impossible d'y mettre une SyncList globale. On crée donc un singleton à part qui porte l'état global.
Pourquoi un composant séparé pour l'état power ?
Pour éviter de transformer EtatEquipement en NetworkBehaviour (ce qui casserait les équipements instanciés localement, par ex. pour les tests en éditeur). Composant séparé = découplage propre.
Si ça ne marche pas
- Serveur crash au lancement → probablement
GestionnaireCablesReseausansNetworkIdentitydans la scène. Vérifier. - Câbles toujours pendants au reco → regarder les logs
[GestionnaireCablesReseau]. Si "Timeout", c'est que les refs PDU/port sont toujours null. Ouvrir un ticket. - Portage local trembant →
SetNetworkTransformActifpas appelé au ramassage. Vérifier logs console. - Erreur
EntityStateMessage without authority→ il reste un NT en Client-to-Server quelque part. Vérifier tous les prefabs.