Quem faz os cálculos de IA em um MMO?

30

Estou construindo um MMO e quero adicionar NPCs. O problema é que não conheço o design básico. O que os cálculos, os clientes ou o servidor? Eu entenderia o servidor calculando eventos e reações, mas quando se trata de busca de caminhos, posição e movimento do jogador, quem calcula isso?

Quem calcula a IA do servidor ou cliente? Eu não conseguia imaginar o servidor calculando o caminho, posição, movimento e assim por diante. Por favor, preciso de ajuda para entender isso, obrigado, tudo vai ajudar.

Patrick Lorio
fonte
2
Cuidado com sua terminologia - os NPCs não são jogadores, por exemplo.
Kylotan

Respostas:

25

Atualmente, a maioria dos MMOs tem algo importante feito no lado do servidor, por razões de segurança. Você não pode descarregar muito para o cliente, e é por isso que uma das primeiras coisas interrompidas são as rotinas de IA. Eu acho que a maioria dos desenvolvedores considera o lado do cliente hackável como regra, não como uma exceção.

O Badumna da Scalify ( http://www.scalify.com/badumna.php ) tenta descarregar parte dele nos clientes, pois eles terão cálculos feitos no lado do cliente e enviados um para o outro; alguns dados também são enviados a um par autoritário para serem validados antes de serem repassados ​​aos clientes, assim como um servidor dedicado. A questão é que TODOS os dados em um jogo multiplayer DEVEM ser enviados por meio de um parceiro autorizado, se você quiser evitar trapacear. Eu criei o Badumna, pois parecia o mais próximo do que você poderia querer, mas mesmo isso não será capaz de capturar trapaceiros - pode pegar alguns, mas qualquer coisa crítica (ou seja, tudo, praticamente) precisa ser feita no servidor - lado.

Eu posso expandir um pouco sobre Badumna, porque ainda pode ser algo que você achará útil (mas peço que reconsidere descarregar qualquer coisa importante nos clientes, porque os clientes trapacearão).

Badumna oferece uma arquitetura híbrida para operações de dados. Ele fornece controle completo ao desenvolvedor para decidir o que é crítico (e deve ser verificado) e o que não é (e pode ser enviado pela rede descentralizada).

Se um MMO exigir que todas as informações sejam verificadas, o Badumna funcionará como uma solução cliente-servidor. No entanto, acredito que existem categorias diferentes de aplicativos MMO com requisitos variados. Por exemplo, muitas vezes um MMO terá zonas de combate nas quais os jogadores provavelmente trapacearão e, portanto, todas as informações devem ser verificadas. No entanto, também existem zonas em que os jogadores só podem andar / correr / dançar / conversar. Tais zonas não requerem verificação completa e podem utilizar a rede descentralizada de Badumna e se beneficiar da escalabilidade que ele pode oferecer.

Em segundo lugar, Badumna fornece recursos de segurança adicionais que os desenvolvedores podem acessar, como proteção de identidade (para que os usuários não possam fingir ser outra pessoa), proxy de reclamação (permitindo que os clientes sejam configurados para relatar jogadores mal-intencionados / trapaceiros para uma fonte confiável) e lista negra (banir jogadores maliciosos dos jogos).

Eu realmente não explorei muito Badumna, então pode haver problemas e recursos que eu desconheço, mas pelo menos dei uma olhada superficial nisso.

tl; dr: o cliente realmente deve ser apenas um teclado e um mouse conectados à Internet.

Robert S.
fonte
9

A resposta curta é que, para um MMO padrão, os cálculos de AI são sempre realizados pelo servidor.

Em alguns jogos, o cliente tenta prever a IA, para que os NPCs pareçam reagir mais rapidamente, mas isso é apenas uma ilusão; o NPC real é sempre controlado pelo servidor.

Trevor Powell
fonte
5

Um MMO é um servidor público (da Internet). Qualquer coisa que você queira controlar completamente não deve ser acessível ao público; caso contrário, corre o risco de permitir que um invasor controle os NPCs. A menos que você esteja executando algum tipo de criptografia em seus comandos (o que afetará o desempenho), não será possível confiar que o cliente esteja executando apenas seu próprio código.

Prever movimentos do NPC no cliente para compensar o atraso é uma ótima idéia; teoricamente, você pode incluir o comportamento da IA ​​que quiser no programa do cliente e sincronizá-lo periodicamente - mas permitir que o cliente dite o comportamento de um NPC daria ao cliente o potencial de mexer com o mundo do jogo. Se o cliente dessincronizar do mundo do jogo no servidor, você acabará com NPCs desonestos incontroláveis.

O que é uma pena, na verdade, porque a distribuição da IA ​​pelos clientes pode afetar a escalabilidade.

Tullo_x86
fonte
2
A criptografia é praticamente inútil - o cliente precisa ser capaz de descriptografar tudo o que é enviado a ele e pode fazer engenharia reversa. Na melhor das hipóteses, a criptografia desacelera alguém que cria um cliente trapaceiro.
Adam
2

Normalmente, o servidor deve calcular ou validar todos os dados passados ​​ou recebidos do cliente. Mas depende de quanto você pode confiar no cliente e de quão importante é esse cálculo. Às vezes, o cálculo principal pode ser feito no cliente e o servidor pode usar um método simples para validar os dados resultantes.

trevo vermelho
fonte
1

Para basear-se nas outras respostas, a estratégia "descarregar e verificar" poderia realmente ser útil em situações em que a verificação é mais fácil do que o cálculo original (ou onde apenas verificações pontuais ocasionais seriam suficientes para capturar trapaceiros).

Por exemplo, se o cliente fizesse a busca de caminho A * e enviasse os resultados para o servidor, tudo o que o servidor faria seria verificar se a) o caminho é válido eb) não há um caminho mais curto. A verificação da validade do caminho deve ser fácil e a verificação da otimização pode ser mais fácil do que encontrar o caminho ideal, pois agora você tem um limite superior no comprimento dos caminhos que precisa verificar. (Em particular, se o cliente retornar um caminho linear, é obviamente ótimo, desde que seja válido.) Para ser sincero, não tenho idéia se esse truque em particular seria útil na prática, mas não vejo nenhum obstáculo fundamental para isso.

Observe, no entanto, que se você descarregar o NPC AI para os clientes, um cliente invadido poderá usá-lo para prever o comportamento do NPC antecipadamente. Para alguns tipos de jogos ou situações, isso pode ser um problema sério.

Ilmari Karonen
fonte
1

Provavelmente é melhor ter algumas rotinas simples de IA e cálculos críticos ao jogo no lado do servidor, enquanto lida com operações complexas não críticas ao jogo no lado do cliente.

Por exemplo, o servidor sabe onde está um NPC hostil e onde estão os personagens do jogador. Quando o personagem do jogador fica dentro do alcance do NPC, um cálculo no servidor pode ser feito para ver se o NPC deve atacar o jogador, e um simples roteamento de caminho pode ser feito para determinar quanto tempo o NPC levará para alcançar o jogador.

Após a transição do NPC para o estado de ataque, o cliente pode lidar com animação e localização de caminhos refinados. Quando o NPC está perto o suficiente para o cliente atacar, o servidor pode realizar cálculos para verificar se o ataque ocorreu, qual foi o dano, etc.

Você quer ter certeza de que todos os cálculos que realmente afetam o resultado do jogo são tratados pelo servidor e passados ​​para o cliente, enquanto os cálculos não críticos são manipulados pelo cliente.

No caso mais simples, você manterá o cliente sincronizado com o local em que espera que o servidor esteja, o servidor verificará e o cliente calculará novamente.

jessecurry
fonte