A detecção de colisão deve ser feita no servidor ou em cooperação entre cliente / servidor?

24

Estou trabalhando em um jogo online que terá um processamento de detecção de colisão muito pesado. Os modelos de jogadores colidem com outros jogadores, mobs, estruturas, terreno e objetos sólidos que existem apenas no lado do servidor (não armazenados nos arquivos de dados do cliente).

Por motivos de segurança, devo fazer toda a detecção de colisões no lado do servidor? Ou devo fazer com que o cliente faça a detecção e faça com que o servidor faça o acompanhamento de alguma forma? Eu sinto que será demais para o servidor fazer sozinho (estou projetando o mecanismo para centenas de jogadores em um servidor).

Alguém sabe como os MMOs tradicionais fazem isso? Eu sei que quase todos os MMOs no momento são suscetíveis a hacks físicos e geralmente lidam com eles detectando hackers e banindo pessoas. Prefiro que os hacks não funcionem, pelo menos para o componente de física.

BarakatX2
fonte

Respostas:

21

Parece que a resposta óbvia é fazer a maior parte da sua detecção no lado do cliente (para suavidade) e, em seguida, você interpola o que o servidor diz se o seu cliente estiver muito distante. O servidor marcará a uma taxa menos frequente do que o cliente (por exemplo, 10 hz) e provavelmente precisará de alguns códigos básicos "pode ​​este jogador chegar onde ele diz que atualmente é do seu último local conhecido", o que implica algum tipo de solução do tipo nav mesh e pathfinding.

Isso pode ser proibitivamente lento, dependendo de quais são suas necessidades. Você pode tomar uma decisão de design, por exemplo, para não se importar com a colisão jogador-jogador no servidor. A maioria dos jogos, até onde eu sei, nem se importa com isso no cliente. Realmente depende de quais são suas necessidades.

Mas a regra geral é que você nunca deve confiar no cliente. Se afetar a jogabilidade, você deve pelo menos verificá-la no servidor.

Tetrad
fonte
24

Então, algumas respostas aqui.

  • A colisão do lado do cliente é ideal do ponto de vista do desempenho e do ponto de vista do jogador. Você não quer que a colisão seja lenta, você quer que os jogadores colidam com um objeto sólido e parem. Se você fizer isso do lado do servidor, estará olhando para jogadores de bandas de borracha em todo o lugar ou dando aos jogadores um atraso notável quando eles tentam se mover. Mau mojo, nos dois casos.

  • A colisão no servidor é ideal do ponto de vista da segurança. Quanto mais seus clientes chegarem aos "terminais burros", menos explorável será o seu jogo. Há uma razão para que ninguém que reproduza um MUD baseado em texto precise se preocupar com wallhacks ou speedhacks - é porque o cliente não está fazendo nada que valha a pena mencionar.

  • Fazer as duas coisas é "ideal" em quase todos os casos. Deixe os clientes fazerem o que precisam e depois verifique novamente o servidor para garantir que as pessoas não estejam trapaceando. As desvantagens são a complexidade, a sincronização (o que exatamente fazer você se os dois discordam), eo uso da CPU do servidor pura.

  • O que eu recomendo é fazer isso quase inteiramente do lado do cliente. O cliente é autoritário sobre sua posição, assim como em um sistema completo do lado do cliente, e faz todo o seu próprio processamento. Além disso, o servidor verifica aleatoriamente vários jogadores de vez em quando. Mantenha a carga do servidor baixa, mas isso eliminará os trapaceiros surpreendentemente rápido.

Como alternativa, faça isso no lado do cliente por enquanto, adicione a verificação no lado do servidor em algum momento no futuro se o seu jogo ficar popular o suficiente para que as pessoas trapaceiem. O que, sejamos honestos, provavelmente não vai, então não faz sentido gastar o tempo do codificador nele agora.

ZorbaTHut
fonte
3

World of Warcraft não faz detecção de colisão entre jogadores / monstros. Pode ou não haver razões técnicas por trás dessa decisão, mas, na verdade, isso deve ser mais uma decisão de design de jogo do que uma decisão técnica:

Imagine o quão explorável poderia ser em situações de jogador contra jogador. Ou quão difícil seria usar o banco / casa de leilões / caixas de correio se outros jogadores (geralmente ociosos) bloquearem seu movimento!

Quanto à detecção de colisão baseada em cliente x servidor - realmente, a menos que o movimento seja muito lento, ele deve ser principalmente do lado do cliente, para que pareça adequado para cada cliente. Resposta de colisão atrasada / atrasada e / ou colidindo com objetos 'invisíveis' seriam bastante desagradáveis.

bluescrn
fonte
11
Embora a questão não seja se a colisão jogador x multidão / jogador é ou não um design de jogo ruim, eu sugiro olhar para jogos como o Darkfall Online, onde tudo é sólido. Ele adiciona uma nova dimensão à jogabilidade e permite que você faça coisas muito interessantes com o jogo. Eu não me preocuparia com jogadores bloqueando coisas como bancos no meu jogo, porque sempre haverá uma pequena lacuna na qual os jogadores podem ver para abrir o objeto.
BarakatX2
Você pode ter jogadores bloqueados por qualquer coisa que possa atacar e qualquer coisa que eles não possam atacar, eles podem simplesmente atravessar. Por exemplo, os jogadores não seriam capazes de percorrer mobs, pois podem atacar mobs. Eles também não seriam capazes de percorrer os jogadores enquanto estiverem sinalizados para PVP, pois são sinalizados para PVP. Um jogador que não esteja com o PVP marcado pode passar por qualquer jogador, mesmo aqueles que não estão com o PVP marcado, porque não pode atacar esses jogadores.
Azaral
2

Se você está preocupado com os hacks e isso tem um grande impacto no jogo, a resposta é SIM.

No meu jogo baseado em navegador, que é do tipo "construção de cidade", não me incomodo com os hacks porque o mecanismo do cliente não falhará quando criar o estado do jogo salvo.

No entanto, isso pode potencialmente abusar da jogabilidade, pois o jogador precisa gastar moedas do jogo (ou dinheiro premium) para expandir a área jogável, a fim de construir mais casas / edifícios. Então, implementarei uma verificação simples do número de peças ocupadas pelo edifício recém-adicionado novamente, quantas peças gratuitas estão disponíveis.

Noob Game Developer
fonte