Il rilevamento delle collisioni deve essere eseguito sul lato server o in modo cooperativo tra client / server?


24

Sto lavorando a un gioco online che avrà un processo di rilevamento delle collisioni molto pesante. I modelli dei giocatori si scontreranno con altri giocatori, mob, strutture, terreno e oggetti solidi che esistono solo sul lato server (non memorizzati nei file di dati del client).

Per motivi di sicurezza, devo fare tutto il rilevamento delle collisioni sul lato server? O dovrei fare in modo che il client esegua il rilevamento e che il server lo segua in qualche modo? Sento che sarà troppo per il server fare da solo (sto progettando il motore per centinaia di giocatori su un server).

Qualcuno sa come lo fanno gli MMO tradizionali? So che quasi tutti gli MMO in questo momento sono sensibili agli hack fisici e di solito li affrontano rilevando hack e vietando le persone. Preferirei che gli hack non funzionassero affatto, almeno per la componente fisica.

Risposte:


21

Sembra che la risposta ovvia sia fare la maggior parte del rilevamento sul lato client (per fluidità), quindi interpolare ciò che dice il server se il client è troppo lontano. Il server spunterà ad una frequenza meno frequente rispetto al client (come, diciamo, 10hz), e probabilmente avrebbe bisogno di avere un po 'di base "può questo giocatore aver raggiunto dove dice che è attualmente dalla sua ultima posizione conosciuta", il che implica una sorta di soluzione di tipo nav mesh e di pathfinding.

Potrebbe essere proibitivamente lento a seconda delle tue esigenze. Potresti prendere una decisione di progettazione, ad esempio, per non preoccuparti della collisione giocatore-giocatore sul server. La maggior parte dei giochi, per quanto ne so, non importa nemmeno di ciò sul client. Dipende davvero dalle tue esigenze.

Ma la regola generale è che non dovresti mai fidarti del cliente. Se influisce sul gameplay, devi almeno verificarlo sul server.


24

Quindi, alcune risposte qui.

  • La collisione lato client è l'ideale dal punto di vista delle prestazioni e dal punto di vista del giocatore. Non vuoi che la collisione sia ritardata, vuoi che i giocatori si imbattano in un oggetto solido e si fermino. Se lo fai sul lato server, stai osservando i giocatori di gommatura ovunque o dando un notevole ritardo ai giocatori quando provano a muoversi. Bad mojo, in entrambi i casi.

  • La collisione sul lato server è ideale dal punto di vista della sicurezza. Più i tuoi clienti si avvicinano ai "terminali stupidi", meno sfruttabile il tuo gioco. C'è una ragione per cui nessuno che suona un MUD testuale deve preoccuparsi di wallhack o speedhack - è perché il client non sta facendo nulla che valga la pena menzionare.

  • Fare entrambe le cose è "ideale" in quasi tutti i casi. Lascia che i client facciano le loro cose, quindi ricontrolla sul server per assicurarsi che le persone non stiano tradendo. Gli aspetti negativi sono la complessità, la sincronizzazione (cosa fare esattamente se i due non sono d'accordo) e l'utilizzo della CPU del server.

  • Quello che consiglio è di farlo quasi interamente sul lato client. Il cliente è autorevole riguardo alla sua posizione, proprio come in un sistema completamente lato client, e fa tutto da solo. Inoltre, ogni tanto il server controlla casualmente vari giocatori. Mantenere basso il carico del server, ma questo eliminerà gli imbroglioni sorprendentemente velocemente.

In alternativa, fallo sul lato client per ora, aggiungi la verifica lato server ad un certo punto in futuro se il tuo gioco diventa abbastanza popolare da farci ingannare dalle persone. Il che, siamo onesti, probabilmente non lo farà, quindi non ha senso passare il tempo del programmatore su di esso in questo momento.


3

World of Warcraft non rileva le collisioni tra giocatori / mob. Potrebbero esserci o meno ragioni tecniche alla base di questa decisione, ma in realtà, questa deve essere più una decisione di progettazione del gioco che una decisione tecnica:

Immagina quanto possa essere sfruttabile nelle situazioni giocatore contro giocatore. O quanto sarebbe difficile usare la banca / la casa d'aste / le cassette postali se altri giocatori (spesso inattivi) bloccassero il tuo movimento!

Per quanto riguarda il rilevamento delle collisioni client vs server, in realtà, a meno che il movimento non sia molto lento, deve essere principalmente lato client, quindi sembra giusto per ogni client. La risposta ritardata / ritardata della collisione e / o la collisione con oggetti "invisibili" sarebbe piuttosto spiacevole.


1
Sebbene la domanda non riguardi se la collisione giocatore contro mob / giocatore è una cattiva progettazione del gioco, suggerirei di guardare giochi come Darkfall Online in cui tutto è solido. Aggiunge una nuova dimensione al gameplay e ti consente di fare cose molto interessanti con il gioco. Non mi preoccuperei che i giocatori blocchino cose come le banche nel mio gioco perché ci sarà sempre un piccolo spazio in cui i giocatori possono vedere attraverso per aprire l'oggetto.
BarakatX2,

Potresti avere i giocatori bloccati da tutto ciò che potrebbero attaccare e qualsiasi cosa non possano attaccare possono semplicemente attraversare. Ad esempio, i giocatori non sarebbero in grado di attraversare i mob in quanto possono attaccare i mob. Inoltre, non sarebbero in grado di attraversare i giocatori mentre sono contrassegnati per il PVP poiché sono contrassegnati con il PVP. Un giocatore che non è contrassegnato PVP può attraversare qualsiasi giocatore, anche quelli che non sono contrassegnato PVP, perché non può attaccare quei giocatori.
Azaral,

2

Se sei preoccupato per gli hack e questo ha un grande impatto nel gioco, allora la risposta è SÌ.

Nel mio gioco basato su browser, che è un tipo di gioco "city building", non mi preoccupo degli hack perché il motore client non fallirà quando impagino lo stato del gioco salvato.

Tuttavia, potrebbe potenzialmente abusare del gameplay in quanto il giocatore deve spendere monete di gioco (o denaro premium) per espandere l'area giocabile al fine di costruire più case / edifici. Quindi, implementerò un semplice controllo del numero di tessere occupate dall'edificio appena aggiunto e quante tessere gratuite sono disponibili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.