La détection des collisions doit-elle être effectuée côté serveur ou en coopération entre client / serveur?

24

Je travaille sur un jeu en ligne qui aura un traitement de détection de collision très lourd. Les modèles de joueurs entreront en collision avec d'autres joueurs, mobs, structures, terrains et objets solides qui n'existent que côté serveur (non stockés dans les fichiers de données client).

Pour des raisons de sécurité, dois-je faire toute la détection de collision côté serveur? Ou devrais-je demander au client de faire la détection et de faire suivre le serveur d'une manière ou d'une autre? J'ai l'impression que ce sera trop pour le serveur de le faire seul (je conçois le moteur pour des centaines de joueurs sur un serveur).

Est-ce que quelqu'un sait comment les MMO traditionnels le font? Je sais que presque tous les MMO en ce moment sont sensibles aux hacks physiques et les traitent généralement en détectant les hacks et en interdisant les gens. Je préférerais que les hacks ne fonctionnent pas du tout, du moins pour la composante physique.

BarakatX2
la source

Réponses:

21

Il semble que la réponse évidente soit de faire la plupart de votre détection côté client (pour la fluidité), puis d'interpoler vers ce que le serveur dit si votre client est trop éloigné. Le serveur fonctionnera à un rythme moins fréquent que le client (comme, par exemple, 10 Hz), et aurait probablement besoin d'avoir un code de base "ce joueur peut-il avoir atteint où il dit qu'il est actuellement de son dernier emplacement connu", ce qui implique une sorte de solution de type mesh nav et de pathfinding.

Cela peut être extrêmement lent en fonction de vos besoins. Vous pouvez prendre une décision de conception, par exemple, pour ne pas vous soucier de la collision joueur-joueur sur le serveur. La plupart des jeux, pour autant que je sache, ne s'en soucient même pas pour le client. Cela dépend vraiment de vos besoins.

Mais la règle d'or est que vous ne devez jamais faire confiance au client. Si cela affecte le gameplay, vous devez au moins le vérifier sur le serveur.

Tetrad
la source
24

Donc, quelques réponses ici.

  • La collision côté client est idéale du point de vue des performances et du point de vue du joueur. Vous ne voulez pas que la collision soit lente, vous voulez que les joueurs tombent sur un objet solide et s'arrêtent. Si vous le faites côté serveur, vous regardez les joueurs de l'élastique partout ou vous donnez aux joueurs un retard notable lorsqu'ils essaient de se déplacer. Mauvais mojo, dans les deux cas.

  • La collision côté serveur est idéale du point de vue de la sécurité. Plus vos clients se rapprochent des "terminaux stupides", moins votre jeu est exploitable. Il y a une raison pour laquelle personne ne jouant sur une MUD textuelle n'a à se soucier des wallhacks ou des speedhacks - c'est parce que le client ne fait rien qui mérite d'être mentionné.

  • Faire les deux est "idéal" dans presque tous les cas. Laissez les clients faire leur travail, puis vérifiez à nouveau sur le serveur pour vous assurer que les gens ne trichent pas. Les inconvénients sont la complexité, la synchronisation (que faites- vous exactement si les deux ne sont pas d'accord) et l'utilisation pure du processeur du serveur.

  • Ce que je recommande, c'est de le faire presque entièrement côté client. Le client fait autorité sur sa position, tout comme dans un système complet côté client, et fait tout son propre traitement. En plus de cela, le serveur vérifie aléatoirement différents joueurs de temps en temps. Gardez la charge du serveur faible, mais cela éliminera les tricheurs étonnamment rapidement.

Alternativement, faites-le côté client pour l'instant, ajoutez la vérification côté serveur à un moment donné dans le futur si votre jeu devient suffisamment populaire pour que les gens le trichent. Ce qui, soyons honnêtes, ne le sera probablement pas, il est donc inutile de passer du temps avec le codeur dessus.

ZorbaTHut
la source
3

World of Warcraft ne fait pas de détection de collision entre les joueurs / mobs. Il peut y avoir ou non des raisons techniques derrière cette décision, mais en réalité, cela doit être plus une décision de conception de jeu qu'une décision technique:

Imaginez à quel point il pourrait être exploitable dans des situations de joueur contre joueur. Ou combien il serait difficile d'utiliser la banque / la maison de vente aux enchères / les boîtes aux lettres si d'autres joueurs (souvent inactifs) bloquaient votre mouvement!

En ce qui concerne la détection de collision basée sur le client contre le serveur - vraiment, à moins que le mouvement ne soit très lent, il doit être principalement côté client, donc il semble droit à chaque client. Une réponse de collision retardée ou retardée et / ou une collision avec des objets «invisibles» serait assez désagréable.

bluescrn
la source
1
Bien que la question ne soit pas de savoir si la collision joueur contre mob / joueur est une mauvaise conception de jeu, je suggérerais de regarder des jeux comme Darkfall Online où tout est solide. Il ajoute une nouvelle dimension au gameplay et vous permet de faire des choses très intéressantes avec le jeu. Je ne m'inquiéterais pas que les joueurs bloquent des choses comme les banques dans mon jeu car il y aura toujours un petit espace où les joueurs peuvent voir à travers pour ouvrir l'objet.
BarakatX2
Vous pourriez avoir des joueurs bloqués par tout ce qu'il pourrait attaquer et tout ce qu'ils ne peuvent pas attaquer, ils peuvent simplement le traverser. Par exemple, les joueurs ne seraient pas en mesure de traverser des foules car ils peuvent attaquer des foules. Ils ne pourraient pas non plus parcourir les joueurs pendant qu'ils sont marqués pour PVP car ils sont marqués PVP. Un joueur qui n'est pas marqué PVP peut traverser n'importe quel joueur, même ceux qui ne sont pas marqués PVP, car il ne peut pas attaquer ces joueurs.
Azaral
2

Si vous êtes préoccupé par les hacks et que cela a un grand impact sur le jeu, la réponse est OUI.

Dans mon jeu basé sur un navigateur qui est un jeu de type "construction de ville", je ne me soucie pas des hacks car le moteur client ne va pas échouer lorsque je mets en forme l'état du jeu enregistré.

Cependant, cela pourrait potentiellement abuser du gameplay car le joueur doit dépenser des pièces de jeu (ou de l'argent premium) pour agrandir la zone jouable afin de construire plus de maisons / bâtiments. Je vais donc implémenter une simple vérification du nombre de tuiles occupées par le bâtiment nouvellement ajouté contre le nombre de tuiles gratuites disponibles.

Développeur de jeux Noob
la source