Le serveur s'occupe des clients : il calcule sans cesse leur nouvelle position en prenant en compte leurs mouvements et les informe du résultat. C'est le seul a connaître précisément la position de tout le monde à un moment donné.
En effet, pour remédier à une mauvaise connexion et donc un faible nombre d'information leur parvenant quant à leur position, les clients font de la prédiction. Ils exécutent en fait le même code que le serveur pour savoir avant même qu'il ne leur ait dit où ils vont être. Ceci rend le jeu bien plus fluide pour le joueur. En contre partie, cela reste de la prédiction, et n'est donc pas la réalité.
C'est pour cela que parfois, surtout si vous avez joué avec une très mauvaise connexion (un modem) vous passez sur une armure, vous entendez le bruit comme quoi vous l'avez bien prise, vous voyez votre niveau d'armure augmenter, et subitement tout disparaît. C'est parce que le module client a fait une mauvaise prédiction (un autre joueur a coté de vous était un peu plus proche que vous de l'armure).
Ayez donc bien ceci à l'esprit : tous les mouvements, de la rotation d'une arme à terre aux boyaux qui s'éparpillent en passant bien sûr par un joueur sont calculés par le module serveur.
Le serveur s'occupe donc :
- des mouvements des joueurs
- du tir des armes
- des items, powerups, ouverture des portes, ...
- des règles du jeu (points de vie, fraglimit, équipes, mort d'un joueur, ...)
- de l'intelligence artificielle (bots)
Pour aider à s'y retrouver dans les 64 fichiers sources de la partie serveur, voici la signification de quelques acronymes :
- pour le nom des fichiers :
- ai : artificial intelligence = intelligence artificielle => fichier source concernant les bots
- bg : both games = les 2 jeux, sous entendu le serveur et le client : code en commun entre le serveur et le client (mouvements du joueur, ...). Utilisé par le client pour les prédictions.
- g : game = jeux : règles du jeu (scores, armes, respawn, ...)
- pour le nom des fonctions :
- EA : Elementary Action = Action Elémentaire : mouvements de base (pour les bots)
Comme chaque module, le serveur s'occupe aussi des commandes qui lui sont destinées (
kick,
map_restart,
fraglimit, ...).
Nous allons donc commencer notre analyse à partir de wmMain (
g_main.c).