Modding Source : Le Coding

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.
31 mai 2008 à 16:53 Citer
"Ce poste de codeur est aussi le plus important"
Heu, c’est pas un peu prétentieux, ça ?
Je vois mal un mod avec tous les models, toutes les maps, tous les sons de HL², mais juste avec un peu de code qui change. Tous les postes sont aussi importants les uns que les autres.
Bon, à part ça, j’aime bien ton article. C’est limite de la vulgarisation. J’ai pas la moindre notion en coding, mais j’ai compris.
BP forever.
31 mai 2008 à 17:08 Citer
C’est un peu à l’arrache ton truc non? Y’a pas un systeme de scripting et une doc officielle?
31 mai 2008 à 17:10 Citer
"et au bout d’un moment vous pourrez tout faire."
J’aurais plutôt mis "presque tout", le mec qui veux se faire un nouveau shader un tant soi peu recherché va quand même bien galeré hein ;)
Et quand on commence par modifier 2, 3 variables sans réelles notions, ca peut devenir "dangereux" par la suite, le gars va commencer par creer ses variables, faire du networking serveur->client, il va surcharger inutilement le tout, au final, quand il aura réellement progressé, il va s’apercevoir qu’il à fait pas mal de merde et qu’il doit revoir énormement de choses. Bref pour les modifications ou apport légers oui on peut se débrouiller seul avec de la jugeotte et un tant soit peu de bonne volonté. Mais dès que c’est pour aller plus loin, autant éviter de conduire son projet vers un echec et accepter le fait qu’il y a des limites à poser, parce que si par miracle on tombe sur un codeur qui accepte de s’occuper du tout, et que ce dernier s’apercoit du merdier qu’est devenu le code, il ne risque pas de sauter de joie, ça c’est sûr ^^.
Cela dit l’article est interessant, j’attend les suivants avec impatience :)
@El_Porico : il y a bien une doc officielle mais elle ne remplace en rien la recherche/découverte des liens entre les différentes classes parce que les gens qui raisonnent comme ça finissent par pourrir les forums d’aide sur le sujet et deviennent des assistés.
"Bonjour je viens de découvrir le C++ et j’ai un probleme avec le code que j’ai copier coller, ca ne compile pas :"
31 mai 2008 à 17:33 Citer
"Commencez par modifier deux-trois variables, fouillez le code pour voir comment ça fonctionne, et au bout d’un moment vous pourrez tout faire."
C’est le meilleur moyen de se retrouver au bout d’un an de dev avec des bugs dans tous les recoins et d’être obligé de tout refaire depuis zéro.
Non, le plus efficace c’est d’apprendre à coder indépendamment du mod. En quelques mois, il y a moyen de savoir bien manipuler ce qui est nécessaire, et de faire tout ce qu’il faut. Mais commencer par trifouiller le code, c’est du suicide pour la suite.
31 mai 2008 à 17:49 Citer
@JBB
Garry’s mod =°
Mais si ça peut te faire plaisir : de tous les postes QUI SONT TOUS COMPLÉMENTAIRES ÇA VA DE SOI pour réellement rendre un mod unique le coding est très important. (Et non pas LE PLUS important bien sûr.) ÇA TE VA COMME ÇA ?
BP Forever.
@Sateth, Cortex
Quand je parle de modifier deux trois variables, c’est généralement quelques constantes, la vitesse d’une roquette, celle du joueur, ce genre de broutilles, c’est comme ça que j’ai commencé. Après je restais prudent, si je savais pas, je touchais pas.
(Et oui certes, "presque tout", je l’ai pas pensé assez fort je crois.)
Mais sans prudence ou jugeote, ouais ça peut devenir un vrai merdier, en témoignent les grands moments de WTF que j’ai passés en lisant le code de GaL. Après faut savoir un minimum ce qu’on fait, et penser que quelqu’un va peut-être relire derrière.
31 mai 2008 à 18:45 Citer
J’ai eu moi aussi à toucher au code d’un mod Source (plus maintenant).
Le SDK apparaît d’abord comme un véritable bordel, mais il n’en est rien, presque tout est d’une propreté surprenante. En fait son seul problème, c’est qu’il est GIGANTESQUE, c’est une quantité de code hallucinante.
Alors plutôt que de jouer à l’artisanat avec des CTRL + F comme le suggère Asibasth, j’ai sorti Doxygen :
http://hl2sdkdoc.akegroup.org/
Si vous voulez avoir une idée de la complexité de la chose, y’a des trucs rigolos à voir, comme la liste des classes, ou encore certains graphiques d’héritage qui filent la migraine.
Par contre, un bon conseil : faites comme moi, faites une documentation autogénérée du code avec Doxygen. Vous allez en chier au début parce qu’il faut configurer Doxygen au micropoil pour avoir des docs correctes (comprendre : où il manque pas plein de trucs), à cause des macros et du "boilerplate code" présent dans le SDK qui perturbent le préprocesseur de Doxygen, mais ça en vaut le coup, c’est bien plus agréable après pour rechercher un truc et pour avoir une vision d’ensemble du fonctionnement de la chose. Je donnerais bien la config (compliquée) pour générer la doc, malheureusement elle a disparu dans un crash disque :(
Ah, j’oubliais, quelques stats de folie qui illustrent bien la complexité du SDK :
- Les docs dont je parle pèsent 4,1 Go au total répartis sur 288 844 fichiers.
- Mon serveur perso, un Core 2 Duo E6750 avec 2 Go de RAM, a mis 6 heures à générer cette doc.
- Pendant la génération, le processus de Doxygen montait parfois à une consommation de 1,5 Go de RAM.
P.S. : n’utilisez pas la doc sur mon lien pour travailler, elle porte sur une ancienne version du SDK et je ne l’ai pas mise à jour (normal, j’ai perdu ma config :( ), et comme je ne m’en sers pas elle peut disparaître à tout moment. Essayez plutôt de la générer vous-même.
31 mai 2008 à 23:04 Citer
Ton article est trop long, je ne peut pas le lire. Désolé mec.
31 mai 2008 à 23:08 Citer
Je suis encore plus désolé que tu ne sois pas en mesure de lire une simple page, c’est triste la jeunesse de nos jours.
(in b4 obvious trawl is obvious)
1 juin 2008 à 8:33 Citer
Ben je le trouve bien cet article, nottament pour les commentaires qu’il génèrent.
1 juin 2008 à 12:13 Citer
Parenthèse pour les vrais, avec Vim on passe un coup de "ctags -R" en répertoire de base et c’est CTRL+] pour browser … :)
Vala
1 juin 2008 à 20:53 Citer
tl;dr
29 décembre 2008 à 22:52 Citer
Salut Asibasth,
Ton article est bien mais un peu faux
Oui en regardant un maximum le code on arrive à obtenir des chose mais très rudimentaire le mieux reste de lire quelques tuto sur les bases et se faire aider par des codeurs et ensuite seulement bidouiller. Perso j’ai réussi à créer toute sorte d’armes avec des tir secondaire assez cool : Coups, lampe, Zoom, Silencieux. Et des effet ( ralentie ( son, image ), Ironsight … ) etc … sans avoir appris le C++ mais tout cela reste très superficielle et n’est jamais très ” Poussé ”
Voila sur ce …