2010-03-03 9 views
3

Je travaille dans un MMORPG basé sur les cases et j'ai un problème. Chaque utilisateur a une position fixe (une case) tout le temps, donc le reste des utilisateurs peut le voir là, et ne peut pas se déplacer vers cette case. Il n'y a donc qu'un seul objet ou utilisateur dans chaque tuile.Protocole de mouvements de MMORPG basé sur des tuiles

Si un utilisateur devient invisible, le reste des utilisateurs ne peut pas le voir, mais ils ne peuvent toujours pas accéder à sa vignette.

Ma question est, le client doit connaître la position de tous les utilisateurs (même les invisibles)? Le problème avec cette approche est que certains utilisateurs ont réussi à casser le client et à voir les utilisateurs invisibles. Une idée que j'ai eue est que le client ne devrait pas connaître la position des utilisateurs, et avant de se déplacer demander au serveur si la tuile où salut veut se déplacer est disponible, mais le problème est le retard que nous avons.

FYI, le protocole client/serveur est construit avec TCP/IP.

+0

Existe-t-il d'autres raisons pour lesquelles un utilisateur pourrait être gênée de se déplacer à une certaine tuile sauf qu'elle est occupée? – aefxx

+0

Non, il n'y en a pas. Il peut être occupé par un objet "bloquant" ou un utilisateur, seulement cela. – alcuadrado

Répondre

4

Vous devez absolument suivre la deuxième approche pour avoir un MMORPG sécurisé.

En fait, la logique doit être complètement séparée entre le client et le serveur. Alors que le client doit être juste

  • une « chose visuelle » qui est capable de rendre le monde
  • une interface d'entrée pour permettre aux joueurs d'exécuter des actions

le serveur doit prendre soin de tout le reste. .

Ainsi, par exemple, vous devriez gérer le mouvement en quelque chose comme:

  • l'utilisateur tente de déplacer le joueur dans le client
  • client envoie un paquet avec la « demande de déplacement » au serveur
  • serveur vérifie si mouvement il est légal et met à jour sa carte interne selon elle
  • se déplacer était légal juste envoyer tous les clients l'état mis à jour (avec la nouvelle position)
  • se déplacer était illégal avertir que le client qui a essayé de le faire

le plus important de cette approche est que: le client n'est pas responsable du fait déplacer le joueur dans la nouvelle position, il reçoit juste un nouvel état de carte.

Oublier ceci:

  • client demander si un mouvement est légal
  • si le serveur dit OUI, client met à jour la position
+0

génial, c'est l'approche que je veux implémenter, mais il y a un gros délai entre l'entrée utilisateur et le mouvement, au moins avec TCP.Et il est dangereux d'utiliser UDP pour quelque chose comme ça, n'est-ce pas? – alcuadrado

+0

UDP n'est pas dangereux, c'est juste irréalisable .. cela dépend du type d'information que vous voulez transmettre. Par exemple, si vous transmettez l'état de la carte du serveur aux clients 10 fois par seconde, il suffit de les envoyer avec UDP. Certains d'entre eux seront peut-être perdus pendant le voyage mais cela n'affectera pas le gameplay réel. TCP est utilisé pour tout, donc il devrait fonctionner assez vite si le protocole est compressé (adaptatif huffman?) Et ping est acceptable. – Jack

+1

Typiquement, pour "opération normale", votre client supposera que la commande passera à travers, et mettre à jour l'interface utilisateur en conséquence. Ensuite, si le serveur renvoie un "vous avez envoyé des commandes non valides, c'est ce que la carte ressemble", l'interface utilisateur va compenser (généralement de façon saccadée peu attrayante, mais oui) – Tanzelax