Come prevedere correttamente il movimento quando un giocatore è invisibile?


20

Ho una partita multiplayer e sto facendo una previsione sul lato client, ma alcuni giocatori possono bere una pozione e diventare invisibili ...

Il problema è che quando diventano invisibili non condivido nulla che il cliente possa usare per sapere che è lì, quindi quando un giocatore cerca di entrare in una tessera occupata da un giocatore invisibile, predice che ci riesce e poi ottiene un brutta correzione della posizione inviata dal server.

Una soluzione sarebbe quella di condividere qualcosa in modo che il cliente possa dirlo, ma poi gli hacker potrebbero usarlo per scoprire dove sono i giocatori invisibili, barare.

A proposito, ho già risolto la previsione del movimento regolare, funziona perfettamente.


4
Invia le informazioni su tutti i giocatori. Gli imbroglioni imbrogliano. Non paralizzare l'esperienza dei giocatori onesti e pensa invece a creare un sistema di segnalazione per gli imbroglioni.
user1306322

2
@ user1306322 Semplificando i truffatori paralizzerai anche i giocatori onesti. Un sistema di segnalazione è una buona idea, ma se l'invisibilità è una parte importante del gioco, qualcosa di preventivo potrebbe essere essenziale.
ThatOneGuy

@ user1895420 è di solito abbastanza buono da non inviare tali cose in chiaro, in modo che nessun giocatore medio possa facilmente ottenere quei dati. Se solo una persona esperta in tecnologia può farlo, allora è una buona misura preventiva come qualsiasi altra.
user1306322

1
O, forse, è una buona idea cambiare un po 'la meccanica dell'invisibilità in modo che non funzioni nelle immediate vicinanze, quindi anche quelli che sono in grado di imbrogliare attraverso i dati di gioco non possono davvero ottenere alcun vantaggio.
user1306322

Che ne dici di inviare la posizione del giocatore invisibile (con una bandiera per tenerlo invisibile) solo quando un giocatore visibile è vicino? Ciò dovrebbe darti un paio di frame per evitare il problema dell'eccessivo movimento, mentre non dovrebbe dare agli imbroglioni abbastanza tempo per reagire. Per due giocatori invisibili, ignorerei semplicemente la collisione. Se hai un server centrale che ha tutte le posizioni del giocatore, puoi anche coordinarlo quando trasmettere la posizione e quando no.
jdm,

Risposte:


30

Questo potrebbe essere considerato un problema di animazione. Se una correzione di posizione ritorna dal server a causa di un tentativo di spostarsi in un oggetto invisibile, rispedire non solo la correzione ma un flag che indica il motivo per cui la correzione era necessaria. Invece di un giocatore che salta all'indietro, può fare un tipo di "woah" di animazione all'indietro, facendolo sembrare più credibile come se avesse appena incontrato qualcosa.

Nei giochi che utilizzano questo approccio, non è insolito rimuovere l'invisibilità (almeno momentaneamente) da qualsiasi cosa si sia verificata. Tra l'altro, ciò incentiva i giocatori invisibili a evitare la folla o ad avvicinarsi troppo agli altri personaggi, riducendo in primo luogo la frequenza con cui un giocatore invisibile si scontra con un giocatore invisibile. Quindi, anche se la tua animazione per questo tipo di collisione è debole (o inesistente), è in qualche modo nascosta dall'invisibile personaggio che entra in visibilità e telegrafando chiaramente a tutti ciò che è appena accaduto.

Il bisogno di animazione potrebbe essere rimosso non lasciando che l'invisibilità funzionasse a distanza ravvicinata. Questo dà ancora più incentivo ai giocatori invisibili per evitare di avvicinarsi ad altri personaggi. Questo è un approccio comune per i giochi basati sull'intuizione e l'intelligenza artificiale (sostituisci "invisibile" con "non visibile al bersaglio") e può essere visto in giochi PvP come World of Tanks. Non è necessario preoccuparsi della risposta alle collisioni con personaggi invisibili se nulla di invisibile ti è mai abbastanza vicino da scontrarti (entro i limiti di latenza).

Anche la soluzione di Dracor per ignorare le collisioni con oggetti invisibili è buona. Ciò richiede di nuovo alcune animazioni (per il client dei giocatori invisibili), quindi gli oggetti non si limitano a tagliare l'avatar del giocatore sul suo schermo. Se non altro, puoi far sì che gli oggetti visibili spingano sempre quelli invisibili in modo tale che il giocatore invisibile si sposti automaticamente sul server se qualcuno si scontra con lui.

Le collisioni invisibili-invisibili sono un po 'più complicate. Può essere vantaggioso disabilitare solo le collisioni su di loro poiché nessuno può vedere se due oggetti invisibili si stanno unendo (supponendo che "invisibile" intendiamo che entrambi gli oggetti non sono visibili allo stesso client). Se uno degli oggetti diventa visibile, ritorna automaticamente alla risposta di collisione visibile-invisibile (allontanare l'oggetto invisibile).

Tutto ciò diventa più complicato se l'invisibilità ha insiemi complicati di chi può vedere chi. La prima o la seconda soluzione sopra è probabilmente la migliore qui se ne hai bisogno. Non tutti i problemi come questo richiedono una soluzione tecnica; molti hanno solo bisogno di soluzioni di design (ad esempio, non consentire questa funzionalità ai vostri progettisti).


5
Il gioco Team Fortress 2 utilizza quel primo approccio ... Se una spia invisibile tocca un altro giocatore, l'altro giocatore è in grado di vedere la spia (o se da dietro, almeno percepisce qualche ostacolo).
Xantix,

4

Vedo davvero solo due opzioni qui se non vuoi dire al cliente dove si trova il giocatore invisibile: 1) Ignori la collisione dell'unità per i giocatori invisibili: una soluzione semplice e i giocatori non sarebbero in grado di trovare i giocatori invisibili test di collisione neanche. 2) Dopo aver deciso il percorso previsto, si invia al server il percorso previsto e si corregge il percorso stesso sul lato server, quindi si rinvia il nuovo percorso.


il problema con l'ignorare la collisione per i giocatori invisibili è se un giocatore invisibile smette di essere invisibile proprio quando si scontra con qualcun altro. Inoltre, non sembra giusto. Nel mio gioco non ho davvero percorsi o indicazioni
stradali

Quindi ciò che rimane è inviare il movimento previsto (un singolo vettore o una matrice di vettori) ed eseguire un controllo sul lato server. O semplicemente animare la correzione, come detto sotto.
Daniel Rusznyak,

1
Se disponi di una mappa basata su griglia e controlli comunque ogni quadrato uno per uno, puoi anche provare a codificare la posizione dei caratteri invisibili sul lato server con una codifica unidirezionale, come SHA-1 o SHA-2 , quindi controlla il tuo percorso codificando le coordinate verificate con lo stesso algoritmo. Non posso dire che sia efficace dal punto di vista delle prestazioni, ma se vuoi davvero farlo sul lato client, questa soluzione potrebbe funzionare anche con un numero limitato di posizioni e l'hacking potrebbe essere davvero problematico a causa della mera quantità di punti della griglia da codificare e abbinare con i dati in memoria.
Daniel Rusznyak,

Vedo che funziona. La mia mappa più piccola ha 1500 posizioni diverse. Dovrei usare HMAC con la chiave che cambia ogni pochi secondi per impedire all'attaccante di precompilare tutte le posizioni?
affiszervmention

5
No, qualsiasi schema che puoi escogitare non sarebbe "sicuro" contro gli hacker. Se il cliente può determinare se il giocatore si scontrerà contro una determinata posizione, allora qualcuno può hackerare il tuo gioco. L'HMAC con una chiave rotante non impedisce al client di eseguire 1500 HMAC al secondo. Evitare Non tentare di fare la crittografia da soli. Se vuoi raggiungere l'obiettivo originale, manda al giocatore la posizione del giocatore invisibile solo se si trova entro 1 o 2 tessere dal giocatore. Quindi puoi solo hackerare per sapere se qualcuno è proprio accanto a te (il che non è utile perché potresti semplicemente spostarti per controllare questo).

2

A meno che non fraintenda qualcosa, la soluzione è semplice. Non inviare al cliente le informazioni su tutti i giocatori invisibili, solo quelli che si trovano nel raggio d'azione potrebbero essere soggetti a collisioni entro i limiti di movimento durante l'intervallo previsto. In altre parole, se il cliente deve solo prevedere 200 ms in futuro, invia solo informazioni su giocatori invisibili a max_player_velocity units/sec * 1/5 secdistanza di unità.


Immagino che potrebbe funzionare, ma il mio gioco è basato su tessere (ho dimenticato di dire).
affiszervmention,

Quindi rivela solo giocatori invisibili nelle tessere adiacenti, o a 2 passi di distanza, o altro.
R ..

quindi non è sicuro che si scontrerebbero e i giocatori invisibili dovrebbero stare alla larga da chiunque abbia hackerato per non essere scoperto
affiszervmention,
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.