Comment prédire correctement le mouvement lorsqu'un joueur est invisible?

20

J'ai un jeu multijoueur et je fais des prédictions côté client, mais certains joueurs peuvent boire une potion et devenir invisibles ...

Le problème est que lorsqu'ils deviennent invisibles, je ne partage rien que le client puisse utiliser pour savoir qu'il est là, donc lorsqu'un joueur essaie de pénétrer dans une tuile occupée par un joueur invisible, il prédit qu'il réussit, puis obtient un laide correction de position envoyée par le serveur.

Une solution serait de partager quelque chose pour que le client puisse le dire, mais les pirates pourraient ensuite l'utiliser pour découvrir où se trouvent les joueurs invisibles, tricher.

Btw j'ai déjà résolu la prédiction des mouvements réguliers, cela fonctionne parfaitement.

affiszervmention
la source
4
Envoyez simplement les informations sur tous les joueurs. Les tricheurs vont tricher. Ne paralysez pas l'expérience des joueurs honnêtes et pensez plutôt à créer un système de signalement pour les tricheurs.
user1306322
2
@ user1306322 En facilitant la tâche des tricheurs, vous paralyserez également les joueurs honnêtes. Un système de signalisation est une bonne idée, mais si l'invisibilité est une grande partie du jeu, quelque chose de préventif pourrait être nécessaire.
ThatOneGuy
@ user1895420 c'est généralement assez bon pour ne pas envoyer de telles choses en texte brut, de sorte qu'aucun joueur moyen ne peut facilement accéder à ces données. Si seulement une personne technophile peut le faire, alors c'est aussi une bonne mesure préventive.
user1306322
1
Ou, peut-être, c'est une meilleure idée de changer un peu le mécanisme d'invisibilité pour qu'il ne fonctionne pas à proximité, de sorte que même ceux qui sont capables de se frayer un chemin à travers les données du jeu ne peuvent vraiment obtenir aucun avantage.
user1306322
Que diriez-vous d'envoyer simplement la position du joueur invisible (avec un drapeau pour le garder invisible) uniquement lorsqu'un joueur visible est proche? Cela devrait vous donner quelques images pour éviter le problème de sur-mouvement, alors que cela ne devrait pas donner aux tricheurs suffisamment de temps pour réagir. Pour deux joueurs invisibles, j'ignorerais simplement la collision. Si vous avez un serveur central qui a toutes les positions des joueurs, vous pouvez également le faire coordonner quand diffuser la position et quand non.
jdm

Réponses:

30

Cela pourrait être considéré comme un problème d'animation. Si une correction de position revient du serveur suite à une tentative de se déplacer vers un objet invisible, renvoyez non seulement la correction mais un indicateur indiquant pourquoi la correction était nécessaire. Au lieu d'un joueur qui saute en arrière, il peut faire une sorte d'animation "woah" en arrière, ce qui donne plus vraisemblablement l'impression qu'il vient de tomber sur quelque chose.

Dans les jeux utilisant cette approche, il n'est pas rare de supprimer l'invisibilité (au moins momentanément) de tout ce qui a été rencontré. Entre autres choses, cela incite les joueurs invisibles à éviter les foules ou à se rapprocher trop des autres personnages, ce qui réduit la fréquence à laquelle la collision avec un joueur invisible se produit en premier lieu. Ainsi, même si votre animation pour ce type de collision est faible (ou inexistante), elle est quelque peu cachée par le personnage invisible apparaissant dans la visibilité et télégraphiant clairement à tout le monde ce qui vient de se produire.

Le besoin d'animation pourrait être supprimé en ne laissant pas l'invisibilité fonctionner à courte distance. Cela incite encore plus les joueurs invisibles à éviter de se rapprocher des autres personnages. Il s'agit d'une approche courante pour les jeux basés sur la furtivité et l'IA (remplacer "invisible" par "non visible pour la cible") et peut être vue dans les jeux PvP comme World of Tanks. Il n'y a pas besoin de s'inquiéter de la réponse aux collisions avec des personnages invisibles si rien d'invisible n'est jamais assez proche de vous pour entrer en collision (dans les limites de latence).

La solution de Dracor pour simplement ignorer les collisions avec des objets invisibles est également une bonne solution. Cela nécessite à nouveau quelques animations (pour le client des joueurs invisibles) afin que les objets ne se contentent pas de couper l'avatar du joueur sur son écran. Si vous ne faites rien d'autre, vous pouvez faire en sorte que les objets visibles repoussent toujours les objets invisibles afin que le joueur invisible soit automatiquement déplacé sur le serveur si quelqu'un entre en collision avec lui.

Les collisions invisibles-invisibles sont un peu plus délicates. Il peut être avantageux de simplement désactiver les collisions sur eux car personne ne peut voir si deux objets invisibles s’écrêtent ensemble (en supposant par "invisible" nous voulons dire que les deux objets ne sont pas visibles pour le même client). Si l'un des objets devient visible, il revient automatiquement à la réponse de collision visible-invisible (repoussez l'objet invisible).

Tout cela devient plus compliqué si l'invisibilité a compliqué des ensembles de qui peut voir qui. La première ou la deuxième solution ci-dessus est probablement la meilleure ici si vous en avez besoin. Tous les problèmes comme celui-ci n'ont pas besoin d'une solution technique; beaucoup ont juste besoin de solutions de conception (par exemple, ne laissez pas cette fonctionnalité à vos concepteurs).

Sean Middleditch
la source
5
Le jeu Team Fortress 2 utilise cette première approche ... Si un espion invisible touche un autre joueur, l'autre joueur peut voir l'espion (ou s'il est de derrière, au moins détecter un obstacle).
Xantix
4

Je ne vois vraiment que deux options ici si vous ne voulez pas dire au client où se trouve le joueur invisible: 1) Vous ignorez la collision d'unités pour les joueurs invisibles - une solution simple, et les joueurs ne pourraient pas trouver les joueurs invisibles en tests de collision non plus. 2) Après avoir décidé du chemin prévu, vous envoyez au serveur le chemin prévu et corrigez le chemin lui-même côté serveur, puis renvoyez le nouveau chemin.

Daniel Rusznyak
la source
le problème avec ignorer la collision pour les joueurs invisibles est si un joueur invisible cesse d'être invisible juste quand il entre en collision avec quelqu'un d'autre. De plus, cela ne semble pas correct. Dans mon jeu, je n'ai pas vraiment de chemins ou d'orientation, les joueurs ne peuvent se déplacer que dans les 4 directions, une étape à la fois
affiszervmention
Il ne reste alors plus qu'à envoyer le mouvement prévu (soit un seul vecteur soit un tableau de vecteurs) et à effectuer une vérification côté serveur. Ou animez simplement la correction, comme dit ci-dessous.
Daniel Rusznyak
1
Si vous avez une carte basée sur une grille et que vous vérifiez tous les carrés un par un, vous pouvez également essayer de coder l'emplacement des caractères invisibles côté serveur avec un codage à sens unique, tel que SHA-1 ou SHA-2. , puis vérifiez votre propre chemin en encodant les coordonnées vérifiées avec le même algorithme. Je ne peux pas dire que ses performances sont efficaces, mais si vous voulez vraiment le faire côté client, cette solution peut également fonctionner avec un nombre limité de positions, et le piratage peut être très gênant en raison de la quantité de points de grille à encoder et correspondre avec les données en mémoire.
Daniel Rusznyak
Je peux voir que ça marche. Ma plus petite carte a 1500 positions différentes. Dois-je utiliser HMAC avec la clé changeant toutes les quelques secondes pour empêcher l'attaquant de précalculer toutes les positions?
affiszervmention
5
Non, tout schéma que vous pouvez trouver ne serait pas "sécurisé" contre les pirates. Si le client peut déterminer si le joueur va entrer en collision avec une position donnée, alors quelqu'un peut pirater votre partie. HMACing avec une clé rotative n'empêchera pas le client de faire 1500 HMACs par seconde. N'essayez pas de faire vous-même la cryptographie. Si vous souhaitez atteindre l'objectif initial, envoyez uniquement la position invisible du joueur au client s'il se trouve à moins de 1 ou 2 cases du joueur. Ensuite, vous pouvez seulement pirater pour savoir si quelqu'un est juste à côté de vous (ce qui n'est pas utile car vous pouvez simplement bouger pour vérifier cela).
2

À moins que je ne comprenne quelque chose, la solution est simple. N'envoyez pas au client des informations sur tous les joueurs invisibles, uniquement sur ceux qui se trouvent à portée qu'ils pourraient subir une collision dans les limites du mouvement pendant l'intervalle prévu. En d'autres termes, si le client ne doit prévoir que 200 ms dans le futur, n'envoyez que des informations sur les joueurs invisibles à l'intérieur des max_player_velocity units/sec * 1/5 secunités.

R ..
la source
Je suppose que cela pourrait fonctionner, mais mon jeu est basé sur des tuiles (j'ai oublié de dire).
affiszervmention
Donc, ne révélez que des joueurs invisibles dans les tuiles adjacentes, ou à 2 pas de là, ou autre chose.
R ..
alors il n'est pas sûr qu'ils entreraient en collision, et les joueurs invisibles devraient rester à l'écart de toute personne piratant pour ne pas être découverts
affiszervmention