Como posso implementar a camuflagem multiplayer com recursos visuais que resistem aos hackers do lado do cliente?

19

Eu estive pensando em implementar stealth em um jogo multiplayer. É um jogo estilo MOBA, então pense em League of Legends (LoL) e Heroes of the Storm (HotS). Vários clientes se conectam a um único servidor, que transmite o estado do jogo a todos os clientes. Os clientes enviam seus dados de entrada para o servidor, o que pode ser rejeitado ao encontrar comandos inválidos, impossibilitando a trapaça (bem, em teoria).

Agora, eu mencionei esses jogos de propósito porque ambos implementaram stealth de maneira diferente. LoL tem discrição com dois estados possíveis: você é completamente visível ou completamente invisível. O HotS, por outro lado, implementa furtividade de maneira que você pode perceber com um brilho no ar:

Invisibilidade de Heroes of the Storm

Penso que este é um mecânico elegante, pois promove / recompensa prestando atenção ao seu entorno. No entanto, este ser um jogo multiplayer me fez perceber que isso pode ser facilmente explorável.

Quando você implementa furtividade da maneira 'LoL', pode simplesmente parar de enviar as coordenadas do jogador para os outros clientes. Quando o personagem do jogador quebra furtivamente, o servidor pode transmitir o local novamente. No entanto, com o modelo HotS, um brilho pode ser visto no ar onde o personagem está se movendo. Isso significa que o servidor deve estar enviando a localização do player para os outros clientes. O que significa que jogadores que mudam a textura ou modelo ou mesmo o próprio código do jogo podem tornar inútil o mecânico da capa. Aqui está um tópico nas placas HotS sobre isso.

Minha pergunta é se existe alguma maneira de implementar camuflagem (com um 'shimmer', à la HotS), sem ter o problema de que jogadores habilidosos podem modificar o jogo (dados) e 'vencer o sistema'. Isso é possível e, se não, como outros jogos multiplayer com esse mecânico lidam com isso? Apenas o estilo LoL de invisibilidade é invencível?

Pensei em ter o servidor enviando locais falsos de 'capa' de vez em quando, mas isso também prejudica jogadores justos que estão apenas prestando atenção, para que não funcionem.

Underflow
fonte
Relacionado é o link , mas não estou perguntando sobre encontrar outras pessoas (que podem ser tratadas pelo servidor), mas exibindo unidades camufladas.
Underflow
Esta é uma péssima sugestão, mas você pode fazer toda a renderização gráfica no servidor e depois transmitir a tela de cada jogador para seus clientes. Eles apenas enviam entrada, você envia apenas saída. O cliente é um shell fino que simplesmente exibe o vídeo e reproduz o áudio.
user137
Philipp teve uma ideia muito boa lá. Quero acrescentar que você ainda precisa estar ciente das caixas delimitadoras e sua interseção com as fotos de habilidades etc. Se você estiver enviando caixas delimitadoras, um codificador inteligente pode fazer engenharia reversa de qual personagem é invisível (se houver heróis diferentes). Se você tiver algum efeito que seja acionado ao acertar, será necessário enviar algo como a caixa ou, pelo menos, a posição e a escala do efeito. Esteja ciente de que tudo o mais abstrato é mais
Greaka
Na verdade, você não pode implementar a camuflagem no estilo LoL deixando de enviar as coordenadas do jogador. Mesmo que os personagens não sejam atraídos, eles ainda precisam interagir com o mapa (e outros jogadores) de outras maneiras. Mas implementar a furtividade "detectável" (pegadas, cintilações etc.) remove grande parte do incentivo para enfrentar o problema de modificar o jogo de qualquer maneira: você aprende a detectar personagens encapuzados e seguir em frente.
O Spooniest
2
@ TheSpooniest: você poderia explicar o que você quer dizer com Você não pode realmente implementar a camuflagem no estilo LoL deixando de enviar coordenadas de jogador ? Se o jogador A estiver invisível e o servidor não enviar mais as coordenadas aos jogadores B e C, o servidor ainda poderá lidar com, por exemplo, colisão entre os jogadores A e B, recusando mover o personagem de B em cima de A (como se eles andassem em uma parede). Se A (ainda invisível) dispara uma habilidade para B, o servidor pode simplesmente enviar "habilidade disparada da posição x, y na direção d de A" para B e C.
Underflow

Respostas:

20

Você não pode implementar um efeito cintilante sem facilitar a exploração ... mas e se você usasse um meio indireto de mostrar que alguém está por perto, um meio que também se aplica a jogadores visíveis?

Por exemplo, e se os jogadores deixarem pegadas e as mensagens "pegadas criadas" forem enviadas do servidor independentemente da localização do jogador? Todo jogador deixa pegadas para que você não possa tornar o modelo de pegada mais visível sem cobrir a arena nelas e tornar cada impressão individual menos perceptível, mas se um jogador vê uma pegada aparecer sem um personagem visível, sabe que alguém está lá.

Você também pode fazer coisas como pequenas pedras que são derrubadas, farfalhar a grama quando alguém está passando por ela ou ondulações que aparecem quando alguém se move pela água. Se os 'sinais' se aplicarem apenas a determinados locais ou materiais, isso pode adicionar uma estratégia extra que força os personagens invisíveis a se moverem com cuidado e evitar coisas que revelam suas posições.

IndigoFenix
fonte
without making it easy to exploit-> Isso se aplica a todas as mecânicas do jogo, não apenas a essa particular.
S. Tarık Çetin
12
Em relação ao último parágrafo: lembre-se de que, quando um jogador invisível é a única coisa que faz com que essas coisas aconteçam, você está fornecendo informações úteis para hacks. Mas você também pode acionar cada um deles de tempos em tempos através de eventos aleatórios ou ações de outros jogadores. Isso geraria um ruído que distrai o hack e tem um bom efeito colateral para fazer o ambiente parecer muito mais vivo e dinâmico.
Philipp
2
Esta é uma ideia muito interessante, obrigado! No caso das "pegadas", isso pode até recompensar os jogadores furtivos a "seguirem" os passos (antigos) de seus alvos, tornando mais furtivo se aproximar dos outros (por exemplo, vindo de trás). Mesmo que alguém tenha tornado as texturas dos passos (ou o que você tem) mais óbvias, entrar nelas (talvez) apenas atualizaria a duração da exibição.
Underflow
3
Obviamente, nesse caso, um hack do lado do cliente pode ser feito para mostrar quais faixas são novas.
Muhd
3
Um hack do lado do cliente pode destacar pegadas criadas em regiões que não correspondem à localização de um jogador.
Edward Coffey
31

Quando você olha para as inúmeras outras perguntas sobre prevenção de trapaça em jogos multiplayer que estão neste site, você verá facilmente que realmente não há nenhuma medida técnica para impedir a trapaça do lado do cliente.

Tudo o que você pode fazer é fornecer menos informações sobre a entidade encoberta. Tudo o que o cliente precisa saber para gerar o efeito de distorção é que existe algo encoberto nessa posição. Mas ele não precisa saber nada específico, como exatamente o que é, quanta saúde resta e o que está fazendo no momento. Dependendo do seu jogo, isso por si só pode ser um déficit de informações que muda o jogo para o jogador.

Philipp
fonte
6
Com "menos informações" também vem "informações menos precisas". Escolha um deslocamento de (digamos) 10 pés em uma única direção aleatória que seja mantida no lado do servidor e envie esse local. Em outros encontros aleatórios, adicione caracteres falsos e cintilantes "Você viu isso? Pensei ter visto algo lá".
Keeta - restabelece Monica
2
@Keeta, se você utilizar isso, será necessário suavizar (ou seja, não gerar um valor totalmente aleatório de cada vez), seja com um filtro de sinal ou com algum tipo de Caminhada Aleatória em direção à direção da entidade. Se estiver muito nervoso, é realmente óbvio para os olhos, então você precisará equilibrar a capacidade do jogador de ficar oculto durante o movimento e oculto ao ficar parado. Este último será e deve ser mais eficaz.
Nate Diamond
@NateDiamond Sim, exatamente. É por isso que afirmo que o servidor cria um deslocamento específico da localização real. Então, à medida que o ator real se move, o deslocamento fará com que o brilho se mova também. Observando atentamente o brilho enquanto ele se move, você pode deduzir onde está o ator real, mas isso exige algum trabalho. Se a invisibilidade fosse real e causasse esse brilho na vida real, imagino que esse foco extra seja exatamente o que seria necessário para superar a invisibilidade.
Keeta - restabelece Monica
Houve uma modificação interessante, e a única que realmente funcionou, do ioquake3 para criar um servidor à prova de falhas . A idéia era verificar no lado do servidor se um jogador A podia ver outro jogador B (ou seja, sem paredes nem outra separação bloqueando a exibição) antes de decidir se o jogador A deveria receber as informações de posição de B. Isso provou ser altamente eficaz contra wallhacks, como foram inúteis. Portanto, o ponto principal é que a única maneira de garantir que ninguém manipule os dados é não lhes fornecer nenhuma informação.
gaborous
@gaborous, é um teste caro, especialmente para todos os jogadores a cada tick. Pode muito bem ser uma despesa que vale a pena, mas é algo que o desenvolvedor precisará considerar no custo e nas habilidades do servidor.
Nate Diamond
1

Sim, qualquer informação que você enviar para o cliente pode ser mostrada mais obviamente do que você pretendia. Mas aqui está o truque:

Mitigar o impacto

Certamente, o cliente pode ter algumas informações, mas pensando cuidadosamente em quais informações você deseja compartilhar e no que os jogadores podem fazer com elas, você pode pelo menos atenuar o impacto dos hacks do cliente.

1. O que o jogador observa?

  1. Você vê o personagem com características no local: Nesse caso, o cliente terá todas as informações e os hacks podem simplesmente desfazer a capa
  2. Você vê algo no local: nesse caso, o cliente possui informações de localização. Pode tornar a localização óbvia, mas outras informações ainda devem estar ocultas.
  3. Você observa algo, mas não está no lugar

uma. Você vê algo, mas não está no local (a ponte ou o mato se move, mas é grande, de modo que você não sabe para onde mirar; os passos só se tornam visíveis com um atraso de 2 segundos): Nesse caso, o cliente sabe apenas que existe alguma coisa, mas não onde / o que exatamente.

b. Você observa algo de uma maneira diferente (soa se houver algo na área; indicação de proximidade como um radar com ou sem direção)

A captura de tela na pergunta parece estar entre 1 e 2, pois provavelmente é baseada em informações limitadas, mas você ainda vê o esboço que pode fornecer algumas informações.

2. O que o jogador pode fazer?

Suponha que você pense que alguém está na coordenada XY, o que você pode fazer? Aqui estão algumas opções típicas:

Atacante

  1. Você pode atacá-lo como se ele não estivesse camuflado
  2. Você pode atacá-lo com ataques AOA / armadilhas que o envolvem ou não
  3. Você pode ativamente soltá-lo e só atacá-lo depois
  4. Você não pode atacá-lo de forma alguma

Movendo

  1. Quando você começa a se mover, percebe que o motor o leva misteriosamente a um desvio
  2. Você começa a caminhar em direção ao seu objetivo normalmente, mas quando alcança o personagem oculto, se move ao redor dele ou para
  3. Você não é bloqueado pelo personagem oculto

Se a seleção de rota for normalmente feita no lado do cliente

Dennis
fonte
Obrigado pela sua contribuição. Eu estava pensando em deixar as pessoas "colidirem" com caracteres invisíveis de qualquer maneira, porque isso é algo que o servidor pode calcular e manipular. A idéia do som é clara e muda o som de maneira sutil (tensão, pense Jaws ) seria legal, mas isso também não seria facilmente substituído por, por exemplo, um arquivo de som mais alto ou até mesmo um arquivo de voz dizendo ALGUM UM FECHADO É ROUBADO ?
Underflow
1
Outra idéia ao longo da linha de 'a': Um brilho poderia aparecer aleatoriamente em algum lugar perto do jogador encapuzado, mas não no local exato. Se o servidor apenas enviar a posição do shimmer, o cliente não poderá realmente fazer muita engenharia reversa. De fato, mesmo se o jogador encapuzado estivesse completamente visível, isso ainda funcionaria como mecânico.
Jezzamon
1
@Jezzamon sim, algum tipo de mecânico de 'deslocamento' também seria legal. No entanto, na situação da capa que não funcionaria: não quero punir os jogadores que estão à procura de brilhar; eles precisariam ter a localização 'exata' do cintilante para mirar, por exemplo, tiros de habilidades.
Underflow
-2

O efeito cascata pode ser feito através do código shader. Você pode desativar o uso da textura nesse modo, para que a simples alteração da textura não seja mais um problema.

Em 3D, quando o modelo entra em ação, você ainda pode alterar o shader para um que simule a refração, usando apenas a superfície do modelo, descartando a cor. Mesmo quando o modelo é substituído de alguma forma, o efeito permanece.

Modificar o shader pré-compilado seria tão difícil quanto modificar o código do jogo e acho que é um nível mais difícil do que alguma pesquisa de textura nos arquivos do jogo.

Marte
fonte
3
Você perdeu a pergunta real. Não se tratava de criar tecnicamente um efeito de distorção. Era sobre como dar ao cliente as informações onde renderizá-las sem fornecer informações úteis que possam expor ao player.
Philipp
1
Bem, eu abordar este: Which means that players that change the texture or model or even the game code itself could render the cloak mechanic useless. E não vejo por que perdi a pergunta 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: Ele é camuflado com brilho, B: é mais difícil de modificar do que uma simples mudança de textura. ONDE realmente renderizar é outro lado. Se a posição é a única coisa em que precisamos aplicar o efeito cascata, esses devem ser os únicos dados enviados ao jogador.
Mars
2
Eu desenvolvi hacks do lado do cliente no passado. A noção de que é mais difícil modificar shaders é muito, muito enganadora. Sim, ele interrompe a forma mais básica possível de ataque, mas qualquer pessoa com Google-fu decente pode descobrir isso em uma tarde. Agora, jogue seu jogo contra um hacker decente e veja quanto tempo leva até que ele seja preenchido com a bondade enganosa do lado do cliente.
Copie e cole seu comentário para todas as respostas aqui, pois qualquer coisa do lado do cliente pode ser explorada. Sei que não é tão difícil modificar código (há bots, hacks, mods em jogos AAA), mas acho mais fácil procurar textura semitransparente nos arquivos do jogo do que procurar instruções específicas sobre o efeito cascata do shader. Obviamente, se os arquivos de sombreador forem texto sem formatação e mal compactados, mesmo uma criança poderá quebrá-lo. Eu apenas dei uma resposta, que pode ser combinado com "menos dados passados para o jogador" uma para fornecer nível decente de security.I realmente não sei o que há de errado com ele, uma vez que fornece uma solução real
Mars
@Thebluefish na justiça, é por isso que os desenvolvedores se afastaram de gastar recursos tentando parar de trapacear e, em vez disso, gastaram recursos em métodos muito complicados, obscuros e bem construídos para detectar trapaças e banir os jogadores ofensores de suas plataformas ... (obviamente consulte sistemas como o VAC do Steam).
Trotski94