Entités concernées : func_tracktrain, func_traincontrols, path_track
Type d'entité : toutes des entités-bloc, sauf le path_track (entité-point)
Difficulté : plutôt difficile
Les trains sont un peu difficiles à configurer, en effet. En fait, il existe plusieurs sortes de trains. Nous verrons ici le plus standard de tous. Pour les autres trains, je vous en parlerai brièvement mais sachez déjà que le fonctionnement est quasiment identique.
Le mot "train" ne doit pas vous rebuter. Ok c'est un train comme celui que l'on rencontre dans Half-Life, mais vous n'êtes pas obligés de faire le même véhicule ! Vous pouvez créer un véhicule avec la forme que vous voulez, aussi complexe que vous le désirez !
La particularité du train, c'est qu'il doit suivre un chemin bien précis (des rails par exemple). Le joueur ne peut donc pas aller où il veut dans la map.
Si vous faites une map pour Counter-Strike, nous verrons qu'il est possible de créer une voiture "libre" que l'on peut conduire où l'on veut !
En fait, la première chose à faire serait de créer le train avec des blocs. Commencez donc par ça ! A vous de voir la forme que vous voulez lui donner.
En ce qui me concerne, je vais en faire un assez simplet comme dans Half-Life, mais libre à vous de faire ce que vous voulez !
Voilà ce que ça donne en 2 minutes (c'est la chose la plus immonde que j'aie jamais faite) :
Horrible non ?

Bon peu importe, c'est pour l'exemple.
Ceci constitue donc la charpente de votre train. Ne faites pas comme moi : appliquez-vous, pour que ça ait plus l'air d'un train que d'un Lego®
Et si je veux mettre une autre entité qui se déplace en même temps que le train, comme une mitraillette ?
Hélas, ne cherchez pas à le faire, c'est impossible ! Half-Life ne permet pas de déplacer d'autres entités en même temps que le train.
Ceux qui font du mapping pour Day of Defeat ont par contre la possibilité de le faire, grâce au système "Spirit" inclus dans Dod (j'en reparlerai dans les entités de Dod).
Bon, que faire ensuite ? Il faut créer le bloc ORIGIN de votre train. Eh oui, ces fameux blocs ORIGIN vous poursuivent jusqu'ici ! Je vous rappelle pour info qu'ils permettent à Half-Life de connaître le centre de gravité de votre objet.
Ici, il faudra placer le bloc ORIGIN le plus au centre possible de votre train, comme ceci :
Sélectionnez ensuite TOUS les blocs que vous avez utilisés pour le train, dont le bloc ORIGIN. Cliquez sur "toEntity" et choisissez l'entité
func_tracktrain.
Voici les propriétés intéressantes à retenir :
- Name : ultra-important, c'est le nom de votre train (ex : "montrain"). Ce nom permettra à Half-Life d'identifier votre train.
- Global Entity Name : si votre train doit fonctionner sur plusieurs maps (pour une aventure solo), donnez ici un nom à votre train. Ce nom doit être unique dans toutes les maps.
- First stop target : nom du premier arrêt (c'est le nom d'une entité path_track). C'est à partir de là que ça se corse, je vous expliquerai le fonctionnement plus bas. Pour l'instant, mettez "path1".
- Sound : son produit par le train en déplacement.
- Distance between the wheels : distance en unités de Worldcraft séparant les roues avant et arrière de votre train. Half-Life saura ainsi faire tourner le train.
Ne vous prenez pas la tête et mettez la longueur de votre train : ça marchera sans problème ! Pour connaître la longueur de votre train, sélectionnez-le et lisez ce qui est écrit en bas de l'écran, dans la barre d'informations.
Exemple : "176w 256l 82h". Le train a donc une longueur de 256 unités !
- Height above track : distance en hauteur séparant le centre du train (son bloc ORIGIN) et les rails. Si vous avez bien placé votre train sur les rails, alors mettez une valeur de 0.
- Initial speed : vitesse initiale du train (en unités de Worldcraft par seconde). Si vous mettez une valeur supérieure à 0, alors on aura l'impression que le train accélère petit à petit, jusqu'à sa vitesse maximale.
- Speed (units per second) : vitesse du train, en unités de Worldcraft par seconde.
- Damage on crush : si quelqu'un se fait écraser par le train, indiquez ici le nombre de points de vie qu'il perdra (0 = pas de bobo).
- Volume (10 = loudest) : volume du son. Mettez une valeur entre 0 et 10, sachant que 10 est la valeur la plus élevée.
- Bank angle on turns : angle de rotation du train lors d'un virage. Les virages ne sont pas très difficiles à mettre en place, et souvent si on laisse la valeur de 0 ça marche très bien !
Cette entité possède 3 flags :
- No Pitch (X-rot) : il n'y aura pas de tangage du train (ne cochez pas, ça fait plus réaliste comme ça

- No user control : le joueur ne peut pas prendre le contrôle du train. Dans ce cas, le train est activé tout seul par un trigger.
- Passable : le train traversera les joueurs et les entités. Ce sera un train "fantôme" : on peut le voir mais pas le toucher. Il est rare que l'on se serve de ce flag quand même

Ensuite (car hélas on n'a pas encore fini), il va falloir orienter le train. Parce qu'il y a 90% de chances que votre train soit dans le mauvais sens lorsque vous jouerez sur votre map, même si vous croyez l'avoir mis dans le bon sens !
Pour ce faire, sélectionnez le train et allez dans le menu Tools/Transform (Ctrl + M). Faites faire à votre train une rotation sur l'axe des Z (90 °, 180 ° ou 270 °).
Chaque cas est particulier donc je ne peux pas vous dire de quelle valeur faire tourner votre train. Faites plusieurs essais jusqu'à ce que le train soit dans le bon sens, c'est tout
Ensuite, il va falloir créer un point où l'on pourra contrôler votre train (le faire avancer, reculer etc...). Ce sera le point de commande de votre train.
Créez un bloc AAATRIGGER, que vous transformerez en entité
func_traincontrols. Placez ce bloc là où le joueur est censé prendre le contrôle du train.
Cette entité possède juste un attribut : "Train Name". Indiquez-y le nom de votre train.
Ce qui doit donner :
Vous remarquerez que le train a changé d'orientation, pour que dans Half-Life il soit correctement positionné.
Les contrôles du train sont situés juste devant les manettes de gaz (logique).
Le parcours du train
Maintenant que le train est en place, il vous reste à définir son trajet.
En effet je vous le rappelle, un train doit suivre un parcours bien précis (comme des rails). Eh bien c'est le moment de s'en occuper !
Pour indiquer le parcours, on place à plusieurs endroits des entités-point nommées
path_track. Le train traversera chaque
path_track dans l'ordre que vous aurez défini.
Pour commencez, placez un premier path_track juste devant le bloc ORIGIN, à la même hauteur que celui-ci :
Le
path_track est en violet, et se trouve à la même hauteur que le bloc ORIGIN.
Je vous rappelle que le champ "First stop target" des propriétés du train doit avoir la valeur "path1".
Il va maintenant falloir éditer les propriétés du path_track :
- Name : nom du path_track. Il est TRES IMPORTANT de nommer ses path_track intelligemment, parce qu'il va y en avoir plusieurs. Je vous recommande par exemple d'appeler le premier "path1", le second "path2", le troisième "path3" etc...
- Next stop target : nom du prochain path_track où le train doit aller. Ca lui indique sa prochaine destination.
Les 2 entités ci-dessus suffisent amplement pour faire fonctionner les
path_track. Voici toutefois la description des autres attributs :
- Fire on pass : nom d'une entité à déclencher lors du passage du train.
- Branch path : point de passage secondaire (si votre train utilise des changements de voies).
- Fire on dead end : nom d'une entité à déclencher si ce path_track est situé à la fin de la voie (par exemple une voix qui dit : "Terminus, tout le monde descend !"

- New train speed : nouvelle vitesse du train, si vous voulez qu'il accélère ou ralentisse à partir de là.
Les flags sont les suivants :
- Disabled : le train ne peut pas se rendre à ce point tant que l'entité n'a pas été activée.
- Fire once : l'entité est désactivée une fois que le train est passé par là.
- Branch reverse : inversion des changements de voies.
- Disable train : le train s'arrête lorsqu'il arrive à ce point.
Voilà, vous devrez placer des
path_track à tous les endroits où votre train doit tourner. Surtout, veillez bien à ce que toutes ces entités soient à la même hauteur !
Voici le fonctionnement des
path_track :
- Premier path_track : Name = "path1", Next stop target = "path2"
- Deuxième path_track : Name = "path2", Next stop target = "path3"
- Troisième path_track : Name = "path3", Next stop target = "path4"
- etc etc...
Enfin, voici un dernier petit exemple pour illustrer le tout :
Comme vous pouvez le voir, je n'ai placé des
path_track que lorsque c'était nécessaire (aux virages). Il est inutile de mettre 36 points de passages au milieu d'une ligne droite : 2 suffisent, 1 à chaque bout !
Autres entités utiles
Bon, je crois vous avoir pratiquement tout dit sur les trains, je ne vais donc pas m'y attarder éternellement. Toutefois, je vous indique quand même qu'il existe d'autres entités qui peuvent vous être utiles :
- func_trackchange : changement de voie pour un train, pour le faire monter d'un étage par exemple.
- func_trackautochange : changement automatique de voie pour un train. C'est la même chose qu'un ascenseur rotatif en fait.
- func_train : pourquoi je n'ai pas parlé de cette entité en premier ? Parce que c'est la même chose pratiquement que le func_tracktrain, à part que ça utilise des path_corner au lieu des path_track. Mieux vaut utiliser un func_tracktrain à mon goût, enfin bon c'est vous qui voyez

Pour conclure, je dirais qu'un train est un peu compliqué à mettre en place la première fois, mais que le jeu en vaut la chandelle. Après, c'est 100% de régal : on peut fragger des aliens sur son train en fonçant dans le tas ! BOURRIIIINN !!!!!!