dcsim-gameserver/Patchs/v3/README_PATCHES_V3.md
2026-04-17 21:04:44 +00:00

72 lines
3.0 KiB
Markdown

# Patches v3 - Fix bouton Power (câble alim non détecté) sur dedicated server
## Diagnostic
Quand tu branches un câble d'alim PDU → serveur, tu as dans les logs serveur :
```
[Serveur] Câble alim créé : PDU 8 prise 1 → equip 5 port 0 ← ok ça passe
...
BoutonPower: aucun câble d'alimentation branché ! ← refuse
```
**Cause racine** : `CableAlimentation.Awake()` appelle `Shader.Find("Sprites/Default")` qui retourne `null` côté dedicated server (le rendu est strippé → pas de shaders). Le `new Material(null)` qui suit crashe silencieusement l'initialisation du composant, et la méthode `CmdCreerCableAlim` s'interrompt juste après le `AddComponent<CableAlimentation>()`, **avant** les appels à `prise.Connecter()` et `port.Connecter()`.
**Résultat** : côté serveur, `port.estConnecte` reste à `false`, donc le `BoutonPower.Appuyer()` refuse d'allumer l'équipement.
Tu peux le vérifier dans tes tout premiers logs de déploiement :
```
ERROR: Shader Sprites/Default shader is not supported on this GPU
ERROR: Shader Standard shader is not supported on this GPU
```
## Scripts patchés (2)
### CableAlimentation.cs
3 gardes `if (DedicatedServerMode.IsDedicatedServer) return;` ajoutées dans :
- `Awake()` → skip création LineRenderer + Shader.Find
- `Update()` → skip animation visuelle
- `Initialiser()` → skip DessinerCable mais continue d'assigner prisePDU/portEquipement
Le composant existe toujours côté serveur, avec ses références logiques (prisePDU/portEquipement), mais sans LineRenderer. Résultat : `prise.Connecter()` et `port.Connecter()` s'exécutent proprement, `port.estConnecte = true`, le BoutonPower fonctionne.
### CableRJ45.cs
Même traitement préventif dans `CreerLineRenderer()`. Les câbles RJ45 semblaient fonctionner dans tes tests (les logs montrent `[Serveur] Câble RJ45 créé`), mais `Shader.Find("Standard")` retourne null côté serveur et ça pollue les WARNINGS. Le patch rend le comportement propre.
## Actions à faire
### 1. Remplacer les 2 scripts
Copie les 2 `.cs` depuis `Scripts_Modifies/` dans `Assets/Scripts/` de ton projet Unity, écrase les versions existantes.
### 2. Switch platform Unity vers Dedicated Server
File → Build Settings → Dedicated Server / Linux → Switch Platform.
### 3. Rebuild + redéploie
Build → transfert sur la Debian → `sudo systemctl restart datacentersim-server`.
### 4. Test
Lance le jeu client :
1. Connecte-toi au serveur
2. Commande un serveur 1U + PDU
3. Branche l'alim PDU → serveur
4. Appuie sur Power
Attendu : le serveur s'allume et les logs **NE disent PLUS** `BoutonPower: aucun câble d'alimentation branché`.
## Note sur l'architecture
Cette approche (gardes locales dans chaque composant) est scalable : si tu rencontres un autre script avec `Shader.Find` / `new Material` qui plante sur le serveur, le pattern est toujours le même :
```csharp
if (DedicatedServerMode.IsDedicatedServer) return;
// ... code visuel ...
```
Placer la garde **tout au début** de la méthode qui crée le Material, juste après les validations de base.