Come posso implementare il cloaking multiplayer con elementi visivi che resistono all'hacking lato client?


19

Ho pensato di implementare lo stealth in una partita multiplayer. È un gioco in stile MOBA, quindi pensa a League of Legends (LoL) e Heroes of the Storm (HotS). Più client si connettono a un singolo server, che trasmette lo stato del gioco a tutti i client. I client inviano i loro dati di input al server, che potrebbe rifiutarli quando incontrano comandi non validi, rendendo così impossibile imbrogliare (beh, in teoria).

Ora, cito questi giochi apposta perché entrambi hanno implementato la furtività in modo diverso. LoL ha una modalità invisibile con due possibili stati: sei completamente visibile o completamente invisibile. HotS d'altra parte, implementa la furtività in modo tale da poterlo riconoscere da un luccichio nell'aria:

Invisibilità di Heroes of the Storm

Penso che questo sia un meccanico pulito, in quanto promuove / premia prestando attenzione a ciò che ti circonda. Tuttavia, essendo questo un gioco multiplayer mi sono reso conto che questo potrebbe rivelarsi facilmente sfruttabile.

Quando si implementa la modalità invisibile in modalità "LoL", è possibile semplicemente interrompere l'invio delle coordinate del giocatore agli altri client. Quando il personaggio del giocatore interrompe la furtività, il server può nuovamente trasmettere la posizione. Tuttavia, con il modello HotS, è possibile vedere un luccichio nell'aria in cui si muove il personaggio. Ciò significa che il server deve inviare la posizione del giocatore agli altri client. Ciò significa che i giocatori che cambiano la trama o il modello o anche il codice di gioco stesso potrebbero rendere inutile la meccanica del mantello. Ecco un thread sulle schede HotS al riguardo.

La mia domanda è se esiste un modo per implementare il cloaking (con un "luccichio", alla HotS), senza avere il problema che i giocatori furbi possano modificare il gioco (i dati) e "battere il sistema". È possibile e, in caso contrario, come fanno gli altri giochi multiplayer con questa meccanica a gestirlo? Solo lo stile di invisibilità LoL è inattaccabile?

Ho pensato di fare in modo che il server inviasse posizioni "mantello" fasulle di tanto in tanto, ma questo danneggia anche i giocatori onesti che stanno solo prestando attenzione, quindi non lo farà.


Correlato è il collegamento , ma non sto chiedendo di imbattersi in altri (che possono essere gestiti dal server) ma piuttosto di visualizzare le unità ammantate.
Underflow

Questo è un cattivo suggerimento, ma è possibile eseguire tutto il rendering grafico sul server, quindi trasmettere lo schermo di ogni giocatore ai propri client. Inviano solo input, tu invii solo output. Il client è una shell sottile che visualizza semplicemente il video e riproduce l'audio.
user137

Philipp ha avuto un'ottima idea lì. Voglio aggiungere che devi ancora essere consapevole delle scatole di delimitazione e della loro intersezione con colpi di abilità ecc. Se stai inviando delle scatole di delimitazione, un programmatore intelligente può decodificare quale personaggio è invisibile (se ci sono diversi eroi). Se hai degli effetti che si innescano al momento del colpo, dovrai inviare qualcosa come la casella o almeno la posizione e la scala dell'effetto.
Ricorda

In realtà non puoi implementare il cloaking in stile LoL cessando di inviare le coordinate del giocatore. Anche se i personaggi non vengono disegnati, devono comunque essere in grado di interagire con la mappa (e altri giocatori) in altri modi. L'implementazione di una modalità invisibile "rilevabile" (impronte, riflessi, ecc.) Elimina gran parte dell'incentivo a superare comunque il problema di modificare il gioco: impari a rilevare i personaggi mascherati e ad andare avanti.
The Spooniest

2
@TheSpooniest: potresti spiegare cosa intendi con Non puoi effettivamente implementare il cloaking in stile LoL cessando di inviare le coordinate del giocatore ? Se il giocatore A è invisibile e il server non invia più le coordinate ai giocatori B e C, il server può comunque gestire ad esempio la collisione tra i giocatori A e B rifiutando di spostare il personaggio di B sopra A (come se camminassero in un muro). Se A (ancora invisibile) lancia un'abilità su B, il server può semplicemente inviare "abilità sparata dalla posizione x, y nella direzione d da A" a B e C.
Underflow

Risposte:


20

Non puoi implementare un effetto luccicante senza renderlo facile da sfruttare ... ma cosa succede se usi un mezzo indiretto per mostrare che qualcuno è in giro, un mezzo che si applica anche ai giocatori visibili?

Ad esempio, cosa succede se i giocatori lasciano impronte e i messaggi "impronta creata" vengono inviati dal server indipendentemente dalla posizione del giocatore? Ogni giocatore lascia impronte in modo da non rendere più visibile il modello dell'impronta senza coprire l'arena e rendere meno evidente ogni singola impronta, ma se un giocatore vede un'impronta apparire senza un personaggio visibile, sa che c'è qualcuno.

Puoi anche fare cose come avere piccoli ciottoli che vengono fatti cadere, frusciare l'erba quando qualcuno ci cammina, o increspature che appaiono quando qualcuno si muove attraverso l'acqua. Se i "segni" si applicano solo a determinati luoghi o materiali, questo potrebbe aggiungere una strategia aggiuntiva che costringe i personaggi invisibili a muoversi con cura ed evitare cose che daranno loro le loro posizioni.


without making it easy to exploit-> Questo vale per tutte le meccaniche di gioco, non solo per quella particolare.
S. Tarık Çetin il

12
Per quanto riguarda l'ultimo paragrafo: tieni presente che quando un giocatore invisibile è l' unica cosa che fa accadere queste cose, stai fornendo informazioni utili per gli hack. Ma puoi anche innescare di volta in volta ciascuno attraverso eventi casuali o azioni di altri giocatori. Ciò genererebbe rumore che distrae l'hack e ha il piacevole effetto collaterale di rendere l'ambiente molto più vivo e dinamico.
Philipp

2
Questa è un'idea molto interessante, grazie! Nel caso delle "impronte", questo potrebbe persino premiare i giocatori invisibili a "camminare dentro" i passi (vecchi) del loro bersaglio, rendendo più furtivi gli altri furtivamente (cioè provenienti da dietro). Anche se qualcuno rendesse le trame dei passi (o cosa hai) più ovvie, intervenire su di esse (forse) rinfrescerebbe solo la durata del display.
Underflow

3
Naturalmente, in questo caso potrebbe essere fatto un hack sul lato client per mostrare quali tracce sono nuove.
Muhd,

3
Un hack sul lato client potrebbe evidenziare impronte create in regioni che non corrispondono alla posizione di un giocatore.
Edward Coffey,

31

Quando guardi le innumerevoli altre domande sulla prevenzione degli imbrogli nei giochi multiplayer che si trovano su questo sito, vedrai facilmente che non esiste davvero alcuna misura tecnica per prevenire gli imbrogli sul lato client.

Tutto quello che puoi fare è fornire meno informazioni sull'entità mascherata. Tutto ciò che il cliente deve sapere per rendere l'effetto di distorsione è che ci sia qualcosa ammantato in quella posizione. Ma non ha bisogno di sapere nulla di specifico, come quello che è esattamente, quanta salute ha lasciato e cosa sta facendo in questo momento. A seconda del tuo gioco, questo da solo può essere un deficit informativo che cambia il gioco per il giocatore.


6
Con "meno informazioni" arrivano anche "informazioni meno accurate". Scegli un offset di (diciamo) 10 piedi in un'unica direzione casuale che viene mantenuta sul lato server e invia invece quella posizione. In altri incontri casuali, aggiungi falsi personaggi luccicanti "L'hai visto? Pensavo di aver visto qualcosa lì."
Keeta: ripristina Monica il

2
@Keeta se lo usi, vorrai fare un po 'di smoothing (cioè non generare ogni volta un valore completamente casuale) con un filtro di segnale o con una sorta di Random Walk verso la direzione dell'entità. Se è troppo nervoso, allora è davvero ovvio per gli occhi, quindi dovrai bilanciare la capacità del giocatore di essere nascosto durante il movimento e di essere nascosto quando resta fermo. Quest'ultimo sarà e dovrebbe essere più efficace.
Nate Diamond,

@NateDiamond Sì, esattamente. Questo è il motivo per cui dichiaro che il server crea un offset specifico della posizione effettiva. Quindi, mentre il vero attore si muove, l'offset farà muovere anche il luccichio. Osservando attentamente il luccichio mentre si muove, puoi dedurre dove si trova l'attore reale, ma ci vuole un po 'di lavoro. Se l'invisibilità fosse reale e causasse questo luccichio nella vita reale, immagino che questo focus extra sia esattamente ciò che sarebbe necessario per superare l'invisibilità.
Keeta: ripristina Monica il

C'è stata un'interessante modifica, e l'unica che ha funzionato, di ioquake3 per creare un server a prova di wallhack . L'idea era quella di verificare sul lato server se un giocatore A potesse vedere un altro giocatore B (ovvero, nessun muro o altra separazione che bloccasse la vista) prima di decidere se il giocatore A dovesse ricevere le informazioni sulla posizione di B. Questo si è dimostrato molto efficace contro muretti, perché resi inutili. Quindi il punto più basso è che l'unico modo per garantire che nessuno manipoli i dati è di non dare loro alcuna informazione.
gaborous

@gaborous è un controllo costoso da fare, soprattutto per ogni giocatore ad ogni tick. Potrebbe benissimo essere una spesa utile, ma è qualcosa che lo sviluppatore dovrà considerare nei costi e nelle capacità del server.
Nate Diamond,

1

Sì, qualsiasi informazione che invii al cliente può essere mostrata in modo più ovvio di quanto volevi. Ma ecco il trucco:

Mitigare l'impatto

Certo, il cliente può avere alcune informazioni, ma pensando attentamente a quali informazioni sei disposto a condividere e su ciò che i giocatori possono fare con esso puoi almeno mitigare l'impatto degli hack del client.

1. Cosa osserva il giocatore?

  1. Vedi il personaggio con le caratteristiche sul posto: in questo caso il cliente avrà tutte le informazioni e gli hack possono semplicemente annullare il mantello
  2. Vedi qualcosa sul posto: in questo caso il cliente ha informazioni sulla posizione. Può rendere ovvia la posizione, ma altre informazioni dovrebbero comunque essere nascoste.
  3. Osserva qualcosa ma non è nel posto

un. Vedi qualcosa ma non è sul posto (Bridge o Bush si muovono, ma è grande, quindi non sai dove mirare; i passi diventano visibili solo con un ritardo di 2 secondi): In questo caso il cliente sa solo che c'è qualcosa, ma non dove / cosa esattamente.

b. Osserva qualcosa in modo diverso (suono se qualcosa è nell'area; indicazione di vicinanza come un radar con o senza direzione)

Lo screenshot nella domanda sembra essere compreso tra 1 e 2 in quanto probabilmente si basa su informazioni limitate, ma si vede ancora lo schema che potrebbe fornire alcune informazioni.

2. Cosa può fare il giocatore?

Supponiamo che tu pensi che qualcuno sia alla coordinata XY, cosa puoi fare? Ecco alcune scelte tipiche:

attaccare

  1. Puoi attaccarlo come se non fosse ammantato
  2. Puoi attaccarlo con attacchi / trappole AOA che lo sganciano o meno
  3. Puoi sganciarlo attivamente e attaccarlo solo in seguito
  4. Non puoi attaccarlo affatto

In movimento

  1. Quando inizi a muoverti, noti che il motore ti porta misteriosamente in una deviazione
  2. Inizi a camminare verso il tuo obiettivo normalmente, ma quando raggiungi il personaggio nascosto ti muovi intorno a lui o ti fermi
  3. Non vieni bloccato dal personaggio nascosto

Se la selezione del percorso viene normalmente eseguita sul lato client


Grazie per il tuo contributo. Stavo pensando di permettere alle persone di "imbattersi" in caratteri invisibili comunque, perché è qualcosa che il server può calcolare e gestire. L'idea del suono è chiara e cambiare il suono in modo sottile (tensione, pensa Jaws ) sarebbe bello ma non sarebbe facilmente sostituibile con ad esempio un file audio più forte o anche un file vocale che dice QUALCUNO CHIUSO È STATO STEALTHED ?
Underflow

1
Un'altra idea sulla falsariga di "a": un luccichio potrebbe apparire in modo casuale da qualche parte vicino al giocatore ammantato, ma non nella posizione esatta. Se il server invia semplicemente la posizione del luccichio, il client non può davvero fare molta ingegneria inversa su questo. In effetti, anche se il giocatore ammantato fosse completamente visibile, funzionerebbe comunque da meccanico.
Jezzamon,

1
@Jezzamon sì, anche una sorta di meccanico di "spostamento" sarebbe bello. Tuttavia, nella situazione del mantello che non funzionerebbe: non voglio punire i giocatori che sono alla ricerca di luccichii; avrebbero bisogno di avere la posizione "esatta" del luccichio per mirare, ad esempio, a colpi di abilità.
Underflow

-2

L'effetto a catena potrebbe essere fatto tramite il codice shader. È possibile disabilitare l'utilizzo della trama in questa modalità in modo che la semplice modifica della trama non sia più un problema.

In 3D, quando il modello entra in gioco, puoi ancora cambiare lo shader in uno che simula la rifrazione, usando solo la superficie del modello, scartando il colore. Anche quando il modello viene sostituito in qualche modo, l'effetto rimane.

Modificare lo shader precompilato sarebbe difficile quanto modificare il codice di gioco e penso che sia un livello più difficile di una ricerca di texture all'interno dei file di gioco.


3
Hai perso la vera domanda. Non si trattava di creare tecnicamente un tale effetto di distorsione. Si trattava di come fornire al cliente le informazioni su dove renderlo senza fornirgli informazioni utili che può esporre al giocatore.
Philipp

1
Beh, mi rivolgo in questo modo: Which means that players that change the texture or model or even the game code itself could render the cloak mechanic useless. E non vedo perché ho perso la domanda whether there is some way to implement cloaking (with a 'shimmer', à la HotS), without having the issue that crafty players can modify the game (data) . A: Inserisce il cloaking con il luccichio, B: è più difficile da modificare rispetto al semplice cambio di trama. DOVE rendere effettivamente è un altro lato. Se la posizione è l'unica cosa di cui abbiamo bisogno per applicare l'effetto a catena, dovrebbe essere l'unico dato inviato al giocatore.
Marte

2
Ho sviluppato hack lato client in passato. L'idea che sia più difficile modificare gli shader è molto, molto fuorviante. Sì, ferma la più semplice forma di attacco possibile, ma chiunque abbia un discreto Google-fu potrebbe capirlo in un pomeriggio. Ora metti il ​​tuo gioco contro un hacker decente e vedi quanto tempo ci vuole prima che si riempiano di bontà cheaty lato client.

Copia e incolla il tuo commento su ogni risposta qui, poiché qualsiasi lato client può essere sfruttato. So che non è così difficile modificare il codice (ci sono bot, hack, mod nei giochi AAA), ma trovo più facile cercare texture semi-trasparenti nei file di gioco piuttosto che cercare istruzioni specifiche dell'effetto ripple shader. Ovviamente se i file shader sono di testo semplice e vengono compressi a malapena, anche un bambino potrebbe romperlo. Ho appena dato una risposta, che può essere combinata con "meno dati passati al giocatore" uno per fornire un livello decente di sicurezza. Non so davvero cosa ci sia di sbagliato, in quanto fornisce una soluzione effettiva
Mars

@Thebluefish in tutta onestà, è per questo che gli sviluppatori si sono allontanati dal spendere risorse nel tentativo di smettere di imbrogliare, e invece hanno speso risorse per metodi molto contorti, oscuri e ben costruiti per rilevare i cheat e bandire definitivamente i giocatori offensivi dalle loro piattaforme ... (ovviamente fare riferimento a sistemi come Steam VAC).
Trotski94
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.