Modding Source : Le Coding
Samedi 31 mai 2008
L’un des postes les plus recherchés par toutes les dev-team est celui de codeur, c’est aussi le type de personne le plus dur à trouver, en effet, quel être humain normal aimerait trifouiller des milliers de lignes de code pour changer une variable ?
Ce poste de codeur est aussi le plus important, c’est presque inimaginable de faire un mod sans toucher au code, ceux qui y parviennent se doivent d’exceller dans un autre domaine, comme l’excellent ‘Minerva Metastasis’ qui fait oublier les lacunes d’Half-Life² avec un level-design de grand malade.
Bref. Le Source Engine se base quasi-exclusivement sur un système d’entités et la conception objet est à la base de tout, dans Source, tout est objet, le player est un CBasePlayer qui hérite de CBaseCombatCharacter qui hérite de CBaseFlex et ainsi de suite, au final tout revient à un CBaseEntity, qui hérite de quelques classes relatives au networking et autres saloperies comme on ne les aime pas.
En fait, c’est plutôt logique, et même simple, sauf que pour une seule entité (le player) tout va être éparpillé dans les quelques milliers de fichiers de code, parce qu’un player tout con, en plus d’être un CBasePlayer et tout ce qui s’en suit, c’est aussi un CHL2MP_Player, un CHL2_Player et j’en passe.
Comment s’y retrouver alors ?
Simple : Ctrl+Shift+F
Ce raccourci (recherche globale sous Visual Studio) est en fait la base du coding Source, couplé à un bon vocabulaire anglophone, vous pouvez faire tout ce que vous voulez.
Vous voulez par exemple, instaurer un système de skins (comme dans Bisounours Party ça va de soi). Vous savez qu’une entité (prop_dynamic) peut faire varier sa skin via un Input (dont vous connaissez bien évidemment le nom) un coup de Ctrl+Shift+F et recherche : “skin”. Avec les guillemets, pour tomber directement sur la ligne qui déclare l’input, autrement, la recherche aurait renvoyé quelques 800 lignes de codes, ce qui est la raison pour laquelle je n’ai pas cherché “skin” dès le début. (En fait si, la recherche la plus logique se fait en premier, mais comme ça a retourné 800 lignes, il faut restreindre la recherche.)
Donc, cette merveilleuse recherche renvoie deux lignes de code, la première est la plus intéressante, c’est la déclaration de l’input au sein de la classe CBaseAnimating qui est la classe de laquelle hérite toute entité avec un model dans le jeu, y compris le player.
Cette ligne, la voici :
DEFINE_INPUT( m_nSkin, FIELD_INTEGER, “skin” ),
Ça signifie : “Fais moi un input “skin” qui modifiera la valeur de l’attribut m_nSkin”
Ça y est, la recherche est terminée, pour mettre en place un système de skin il suffit de faire une ConVar reliée à l’attribut m_nSkin de la classe CBasePlayer, le joueur n’aura plus qu’a modifier cette CVar via la console ou les options.
Finalement, le raisonnement de Source était plutôt logique non ?
Non. Parce que dès le début des tests vous vous apercevrez de deux choses : changer une skin provoque le changement de la skin de tout le monde sur le serveur et les cadavres n’ont pas la bonne skin.
Premièrement : vous savez que vous allez en chier, parce que ce genre de bug ça vient de la façon de transmettre l’information au client, et ça, c’est la plaie.
Deuxièmement : vous découvrez que quand un client meurt, une copie de son model est créée dans une entité à part mais que toutes les informations ne sont pas copiées, et évidemment la skin fait partie de ces informations manquantes.
Couplez ça avec le fait que vous voulez des skins différentes pour les cadavres, pour les teams et pour d’autres modes de jeu, vous obtenez des jours à vous arracher les cheveux.
Ça n’est bien évidemment pas impossible pour autant : mon système de skin fonctionne parfaitement sous Bisounours Party. (Ça faisait longtemps que je ne l’avais pas cité.)
Pour résumer tout ça : sortez-vous les doigts du cul, pour coder il vous suffit d’un peu de jugeote et d’expérience, arrêtez de chercher des codeurs vous n’en trouverez pas. Commencez par modifier deux-trois variables, fouillez le code pour voir comment ça fonctionne, et au bout d’un moment vous pourrez tout faire.