Replication Strategy
Sistema di replicazione server-authoritative per multiplayer
Filosofia
Server-Authoritative Il server ha l'ultima parola su tutto. I client inviano richieste, il server valida ed esegue.
Deterministic Stesso input + stesso stato = stesso risultato. Importante per shuffle obiettivi, combattimento, ecc.
Secure Informazioni sensibili (obiettivi) replicate solo al proprietario.
Layers di Replicazione
GameState (Global)
Replicato a TUTTI i client.
Contiene:
- Fase di gioco corrente
- Turno corrente (quale giocatore)
- Colori disponibili
- Tempo di gioco
- Configurazioni partita
Usato per:
- UI condivisa (timer, fase)
- Decisioni client-side (disabilita input)
PlayerState (Per-Player)
Replicato con condizioni.
Public Data (tutti vedono):
- PlayerID
- ArmyColor
- TroopsToPlace
- bIsEliminated
- TerritoriesControlled
Private Data (solo owner):
- MainObjective (COND_OwnerOnly)
- SecondaryObjectives (COND_OwnerOnly)
Usato per:
- UI player-specific
- Validazioni
- Obiettivi segreti
Territory Actors (World)
Replicato a TUTTI.
Contiene:
- OwnerPlayerID
- ArmyCount
- ContinentID
- Adiacenze
Usato per:
- Rendering mappa
- Calcoli obiettivi
- UI tooltips
Conditional Replication
COND_OwnerOnly
DOREPLIFETIME_CONDITION(ARosikoPlayerState, MainObjective, COND_OwnerOnly);Comportamento:
- Server invia solo al client proprietario
- Altri client ricevono valore di default
- Perfetto per dati segreti
Esempio: Player 1 ha obiettivo "Elimina Rosso".
- Client Player 1 → vede "Elimina Rosso"
- Client Player 2 → vede ObjectiveIndex = -1 (default)
- Client Player 3 → vede ObjectiveIndex = -1 (default)
Impossibile sniffare obiettivi altrui.
RepNotify Pattern
Problema
Come sa l'UI quando i dati cambiano?
Soluzione: RepNotify
UPROPERTY(ReplicatedUsing = OnRep_MainObjective)
FAssignedObjective MainObjective;
UFUNCTION()
void OnRep_MainObjective() {
// Chiamato automaticamente quando replica
OnObjectivesUpdated.Broadcast();
}Vantaggi: ✅ Zero polling ✅ Instant update ✅ Decoupled (UI si binda ad evento) ✅ Performance
RPC Pattern
Client → Server (Server RPC)
UFUNCTION(Server, Reliable, WithValidation)
void Server_PlaceTroops(int32 PlayerID, int32 TerritoryID, int32 Amount);Reliable: Garantito arrivo, in ordine.
WithValidation: Funzione _Validate chiamata prima.
Flusso:
Client chiama Server_PlaceTroops()
↓
Eseguito sul SERVER
↓
Validazione (controlli base)
↓
Se valido → _Implementation
↓
GameManager valida logica gameplay
↓
Se OK → Modifica stato
↓
Stato replicato automaticamenteServer → Clients (Multicast RPC)
UFUNCTION(NetMulticast, Reliable)
void Multicast_NotifyPhaseChange(EGamePhase NewPhase);Eseguito su TUTTI i client.
Usato per:
- Eventi globali (cambio fase, vittoria)
- Effetti visivi sincronizzati
- Suoni globali
Ownership Model
PlayerController
- Owned by: Client che lo controlla
- Authority: Server
PlayerState
- Owned by: Stesso owner del controller
- Authority: Server
- Visible to: Tutti (dati pubblici) o solo owner (privati)
GameManager
- Owned by: Server
- Authority: Server
- Visible to: Tutti
Territory Actors
- Owned by: Nessuno (world actors)
- Authority: Server
- Visible to: Tutti
Security Measures
Owner Validation
Ogni RPC verifica che il chiamante possa agire solo per sé.
if (CallerPlayerState->GameManagerPlayerID != RequestedPlayerID) {
// CHEATING - Log e blocca
return;
}Server Authority
Tutte le modifiche di stato avvengono solo sul server.
if (!HasAuthority()) {
// Non sei il server - errore
return;
}Gameplay Validation
RPC validation = controlli base (non null, range). GameManager validation = logica gameplay (turno, fase, risorse).
Separazione previene exploit ma non disconnette per bug/lag.
Bandwidth Optimization
Conditional Replication
Solo owner riceve obiettivi → -70% traffico obiettivi.
Delta Compression
UE replica solo cambiamenti.
Se TroopsToPlace non cambia → 0 byte inviati.
Relevancy
Territori lontani possono essere "not relevant" per certi client. (Non implementato ancora, ma possibile per mappe enormi).
Testing Strategy
Standalone
Un processo, nessuna replicazione. Per test logica pura.
Listen Server
Server + client nello stesso processo. Per test base multiplayer.
Dedicated Server
Server separato, N client. Per test replicazione reale.
Simulated Lag
net PktLag=100
net PktLoss=5Per test robustezza.
Stato Implementazione
✅ Completato:
- Server-authoritative core
- COND_OwnerOnly obiettivi
- RepNotify pattern
- Server RPC validation
- Owner checks
- Multicast eventi globali
🔧 Da fare:
- Lag compensation
- Client-side prediction
- Rollback per discrepanze
- Metriche network (ping, packet loss)
How is this guide?
Last updated on