dcsim-gameserver/Patchs/v4/README_PATCHES_V4.md

101 lines
3.3 KiB
Markdown

# Patches v4 - VRAI fix du BoutonPower sur dedicated server
## ⚠️ Remplace les patches v3 qui étaient partiellement corrects
La v3 (patch de CableAlimentation + CableRJ45) n'était PAS la cause racine.
Le patch de v3 reste valide (évite des WARNINGS visuels), mais le vrai bug
était ailleurs.
## 🎯 La vraie cause racine
`CablageReseau.TrouverPortAlimentation()` cherchait les équipements dans
**`NetworkClient.spawned`** au lieu de `NetworkServer.spawned`.
Sur un dedicated server (serveur pur, pas host), `NetworkClient` n'est pas
actif, donc `NetworkClient.spawned` est **vide**. Résultat :
- `TrouverPortAlimentation()` retournait toujours `null`
- La condition `if (prise != null && port != null && ...)` était fausse
- `port.Connecter()` n'était JAMAIS appelé
- `port.estConnecte` restait à `false`
- `BoutonPower` refusait d'allumer l'équipement
Le message `[Serveur] Câble alim créé` était trompeur parce qu'il apparaît
AVANT la vérification, juste au moment de l'entrée dans la méthode.
## ✅ Le fix
Ajout d'un helper universel `TrouverGameObjectNetId(netId)` dans `CablageReseau.cs`
qui cherche dans le bon dictionnaire selon le contexte :
- `NetworkServer.spawned` si on est serveur (dedicated OU host)
- `NetworkClient.spawned` si on est purement client
- `null` sinon
Les 3 helpers `TrouverPortRJ45`, `TrouverPriseC13`, `TrouverPortAlimentation`
utilisent maintenant ce helper universel.
## 📄 Script patché (1)
- **`CablageReseau.cs`** — helper universel + refacto des 3 méthodes Trouver*
## 🚀 Actions à faire
### 1. Remplacer le script dans Unity
Copie `Scripts_Modifies/CablageReseau.cs` dans `Assets/Scripts/`, écrase
l'existant.
### 2. Rebuild Dedicated Server
File → Build Settings → Dedicated Server Linux → Build.
⚠️ **Astuce** : si tu veux t'assurer que le build prend bien les derniers
scripts, supprime le contenu du dossier de build avant de rebuilder. Unity
fait parfois du cache agressif.
### 3. Redéploie sur la Debian
```bash
# Arrêter le service
sudo systemctl stop datacentersim-server
# Remplacer le dossier
# (ou scp -r depuis ton Windows)
# Relancer
sudo systemctl start datacentersim-server
sudo journalctl -u datacentersim-server -f
```
### 4. Test
1. Commande PDU + serveur 1U
2. Branche l'alim PDU → serveur (même procédure qu'avant)
3. Appuie sur Power → **DOIT S'ALLUMER**
Attendu dans les logs serveur : plus de `BoutonPower: aucun câble
d'alimentation branché !`.
## 🐛 Bug annexe détecté (pour plus tard)
Les câbles RJ45 ne font RIEN côté serveur actuellement (la méthode
`CmdCreerCableRJ45` broadcast juste aux clients sans créer d'état serveur).
Conséquence : les logiques type "flux de paquets", "consommation bande
passante", etc. ne tourneront pas si elles dépendent de l'existence des
câbles RJ45 côté serveur. À réfléchir dans une future refonte quand tu
implémenteras ce genre de features.
Pour l'instant c'est OK, le multi fonctionne et les câbles s'affichent
bien chez tous les clients via le Rpc.
## 🖥️ Rappel Ctrl+C qui ne marche pas
Ajoute `-batchmode -nographics` aux arguments quand tu lances manuellement :
```bash
./DatacenterSim.x86_64 -server -port 7777 -batchmode -nographics
```
Ces flags forcent Unity à gérer proprement SIGINT. Ton service systemd les
utilise déjà (ils sont dans `datacentersim-server.service`).