Je fais un jeu MMO et je suis juste arrivé à un point où j'ai besoin de mettre en œuvre des réalisations ... Comment faire? La chose la plus simple à faire serait de l'exécuter toutes les 100 ms:
for a in achievements
for p in players
if a.meetsRequirements(p) then p.completeAchievement(a)
Mais cela soulève encore plus de complications. Par exemple, comment puis-je vérifier si la réalisation est effectivement terminée? Les joueurs ont-ils des propriétés personnalisées uniquement pour une réalisation spécifique? J'ai fait ce genre de chose avec les quêtes, car elles consistent principalement à "collecter 100 bois", donc les quêtes actives sur un joueur le vérifient. De plus, il doit y avoir un meilleur moment pour le vérifier, cela ralentirait périodiquement mon serveur, je pense.
Réponses:
Ce que vous faites dépend de la nature de la réalisation. À moins que vos réalisations ne correspondent toutes à un modèle simple (collectez X nombre de Y), vous devrez les caser dans une certaine mesure.
À l'aide d'un système de communication basé sur les messages, vous pouvez fournir des crochets qui rendent le codage de cas particulier localisé. Vous pouvez demander à certaines actions d'envoyer des messages aux auditeurs qui s'enregistrent. Ensuite, votre code / script de réussite peut simplement s'enregistrer auprès des écouteurs appropriés et effectuer les tests nécessaires pour lancer la réussite.
Vous auriez des messages pour les événements typiques que vous pourriez souhaiter que les réalisations écoutent. Des choses comme «le joueur a acquis l'objet X» ou «l'entité Y a tué l'entité Z». De cette façon, vous pouvez suivre des choses comme le nombre de Z que le joueur a tués.
C'est probablement le mieux que vous puissiez faire pour un système de réalisations. Il centralise le code autant que possible et confie aux auditeurs la responsabilité de la détection de la réussite réelle.
Il convient également de noter que, pour les systèmes de réussite centralisés (X-Box Live, succès Steam), la progression vers les succès est généralement stockée sur le serveur. Ainsi, pour les réalisations d'accumulation ("effectuer la tâche XY nombre de fois"), le script de réussite détecte simplement quand X a été effectué et fait monter le décompte du serveur. Pour d'autres types de réalisations ("effectuer la tâche X"), la réalisation du serveur est binaire: soit vous l'avez fait, soit vous ne l'avez pas fait.
la source
Selon la nature de vos réalisations, vous pouvez également introduire une sorte de "réalisations marqueurs".
Si vous avez par exemple 3 réalisations consécutives:
Bois 1 - Collectez 100 bois
Bois 2 - Collectez 500 bois
Bois 3 - Collectez 1k bois
Ensuite, il serait logique d'enregistrer simplement un événement OnChange pour la première réalisation jusqu'à ce que le joueur l'achève. Une fois terminé, vous pouvez enregistrer le prochain objet de réussite.
Cela nécessite bien sûr la conception (ou le calcul) d'un arbre de dépendance de réalisation.
la source