Je pense que vous avez une petite idée de ce que nous allons étudier ici . Souvenez-vous du chapitre dans la cité minière de Ravenholm, rappelez-vous de l'odeur des zombies cramés et de leurs cris d'agonie . Nous allons parler des firetraps, ces systèmes qui permettent d'ouvrir le gaz, de l'embraser et de brûler tout ce qui passe
Réaliser un firetrap n'est pas spécialement difficile; ça fait juste intervenir assez bien d'entités. Vous en connaissez certaines, et vous allez en découvrir de nouvelles. A la fin de ce mini-tuto, vous saurez créer un départ de feu, des flammes, un effet de gaz qui s'échappe, et nous reverrons aussi les logic_relay, les func_rot_button et les ambient_generic, bref, de l'amusement en perspective .
Il faut dans un premier temps nous occuper de la partie mapping .
Créez une ruelle étroite, et ensuite, placez les models. Je vous ai listé ici les models nécessaires :
Entité |
Model |
Description |
---|---|---|
models/props_citizen_tech/firetrap_gashose01a.mdl |
C'est le tuyau de gaz avec les becs Bunsen. Placez le au raz du sol. |
|
models/props_citizen_tech/firetrap_propanecanister01a.mdl |
C'est juste la bombonne de gaz |
|
models/props_citizen_tech/firetrap_buttonpad.mdl |
C'est le support du bouton rouge qui permet de créer les étincelles |
|
models/props_citizen_tech/Firetrap_button01a.mdl |
C'est le bouton rouge |
|
models/props_pipes/valvewheel002.mdl |
C'est la vanne d'ouverture/fermeture du gaz |
Essayez de vous arranger pour obtenir quelque chose comme ceci (remarquez que j'ai mis quelques décals, histoire de décorer un brin) :
On va maintenant mettre en place les entités, mais sans s'occuper des outputs, juste le placement et le paramétrage.
Pour faire tourner le bouton rouge et la vanne de gaz, on va utiliser des func_rot_button. Vous savez comment ça marche, donc ça ira vite .
Créez, avec la texture invisible, vos deux boutons rotatifs. Voici les paramètres que je vous suggère :
Name : firetrap_boutonrouge
Speed : 200
Sounds : Squeaky
Delay Before Reset : 1
Distance : 90
Cochez les flags Not Solid, Y Axis (ou un autre, ça dépend d'orientation de votre bouton) et Use Activates.
Name : firetrap_vannedegaz
Speed : 200
Sounds : Squeaky
Delay Before Reset : 3
Distance : 360 (un tour complet, pour que ce soit bien ouvert )
Cochez les flags Not Solid, Toggle (pour pouvoir fermer et ouvrir) et Use Activates.
Souvenez-vous des étincelles, l'entité env_spark. Il va falloir placer un env_spark à l'extrémité de chaque bec Bunsen, avec les mêmes paramètres, à savoir :
Name : firetrap_spark
Magniture : Medium
Spark Trail Length : Long
env_steam est une nouvelle entité. Elle permet de créer un jet de vapeur. Nous allons l'utiliser pour représenter les jets de gaz qui sortent des bec Bunsen . On mettra donc une de ces entités à chaque sortie de bec Bunsen.
L'env_steam est représenté sous la forme d'un cône. Le sommet symbolise le point de départ du gaz, et la base indique dans quel sens le jet est projeté, ce qui est plutôt pratique pour bien positionner l'entité. Comme c'est une nouvelle entité, je vais vous lister ses propriétés, les expliquer, et donner les valeurs adéquates dans le cas de notre jet de gaz incolore .
Name : firetrap_vapeur
Initial State : état initial de l'entité. Mettez Off
Particule Type : : type de particule qui est projeté :
Normal : un gros jet gras
Heat Wave : un effet vague de chaleur, comme sur les autoroutes quand il fait chaud.Choisissez cette option, ça donnera un bel effet flou
Spread Speed : vitesse de dissociation des particules. Il faut comprendre que c'est la vitesse à laquelle les particules s'éloignent les unes des autres. En mettant une valeur de 15, le jet reste relativement compact
Speed : vitesse de sortie du jet de gaz. Mettez 200
Particule start size : taille des particules au début du jet. Mettez 10
Particule end size : taille des particules à la fin du jet. Mettez 20
Emisson rate : fréquence d'émission des particules. Une valeur de 25 est acceptable
Color : couleur du jet. Prenez une teinte orangée ( 239 194 61 ), mais si ça n'a pas beaucoup d'importance, puisqu'on va rendre le jet transparent
Length of steam jet : longueur du jet. Une longueur de 80 convient largement
Translucency : transparence. Laissez 255
How fast does the particles spin : (pour Episode One) vitesse de rotation des particules. Laissez 8
Il existe une entité pour créer une flamme, nous la verrons juste après, et il existe aussi une entité pour créer un effet d'embrasement. Cette entité se nomme env_firesource. Placez également une de ces entités à la sortie de chaque bec Bunsen (près des env_spark, ce qui est logique).
Name : firetrap_firesource
Radius : 60
Nous voici enfin aux flammes . L'entité utilisée pour en créer une est env_fire (remarquez que le nom des entités correspondent souvent à leur fonction ).
Name : firetrap_fires
Start Disabled : Yes
Duration : temps que brûle la flamme. Mettez ce que vous voulez, car on cochera le flag Infinite Duration
Sire : taille de la flamme. Voyez ma remarque plus bas...
Attack : vitesse à laquelle la flamme grandit pour aboutir à sa taille maximale (Size). Ca doit être rapide, c'est du gaz. Mettez 0.05
Type : type de flamme. Laissez bien Naturel, on n'a pas besoin d'un effet plasma
Ignition point : position du point d'ignition. Mettez 1, la flamme est au sol .
Damage Scale : mettez 10 pour multiplier par 10 les dommages causés par la flamme
Cochez aussi le flag Smokeless, pour ne pas créer trop de fumée. On fait un simple brasier, pas un incinérateur .
Pensez à mettre un Size décroissant sur les env_fire. Près des becs Bunsen, mettez une Size de 110, et descendez jusqu'à 80 pour les flammes les plus éloignées de ce bec. Ça donne un effet de réel, car il y a plus de gaz près des becs, donc de plus grandes flammes .
On va ajouter plusieurs sons, au moyen d'ambient_generic. Il n'y a pas de réglages particulier, hormis le nom de l'entité, le son à jouer et quelques flags. Je vous ai fait un tableau pour présenter ça proprement :
Name |
Emplacement |
Son |
Explications |
Flags cochés |
---|---|---|---|---|
firetrap_vapeur_son |
Au centre des flammes |
ambient/gas/steam_loop1.wav |
Son que fait le gaz en sortant des becs Bunsen |
Start Silent |
firetrap_firestart_son |
Au centre des flammes |
d1_town.FlameTrapIgnite |
Son joué quand le gaz s'embrase |
Start Silent, Is Not Looped |
firetrap_fires_son |
Au centre des flammes |
d1_town.LargeFireLoop |
Le bruit que fait le brasier |
Start Silent |
firetrap_firestop_son |
Au centre des flammes |
d1_town.FlameTrapExtinguish |
Son joué quand on coupe le gaz et que les flammes s'éteignent |
Start Silent, Is Not Looped |
firetrap_boutonrouge_son |
Près du bouton rouge |
Town.d1_town_01_lightswitch2 |
Bruit du bouton (une sorte de clic sourd). Pensez à mettre une distance d'audition faible |
Start Silent, Is Not Looped |
On va aussi ajouter un petite light qu'on allumera en même temps que les flammes, pour appuyer l'éclairage de ces flammes
Name : firetrap_light
Brightness : 254 174 10 500
Et cochez le flag Initialy Dark.
Voici une image de ce que j'obtiens. Vous devriez avoir sensiblement la même chose :
Ce que j'obtiens. Remarquez que les env_steam, les env_firesource et les env_spark sont au même endroit sur chaque bec
Attaquons-ous maintenant au codage des outputs ; ce n'est pas difficile, mais ça demande de la logique .
Histoire de nous simplifier la tâche, nous allons créer deux logic_relay : un pour démarrer l'embrasement, et un autre pour y mettre fin. Nommez respectivement ces deux entités firetrap_relay_start et firetrap_relay_end. Laissez la propriété Start Disabled sur Yes.
On y reviendra plus tard. On va commencer par les outputs de la vanne de gaz.
Output named |
Targets entities |
Via this input |
Parameter |
Delay |
---|---|---|---|---|
OnIn |
firetrap_vapeur |
Toggle |
<none> |
0.00 |
OnIn |
firetrap_relay_start |
Enable |
<none> |
0.00 |
OnIn |
firetrap_vapeur_son |
ToggleSound |
<none> |
0.00 |
J'utilise l'output OnIn, qui a pour effet d'être déclenché dès qu'on pose les mains sur la vanne (dès qu'on presse E ). Comme ça, dès qu'on commence à tourner, ça se déclenche. Donc, dès qu'on pose les mains, on actionne/arrête les jets de vapeur (firetrap_vapeur), ainsi que leur bruit (firetrap_vapeur_son). J'active aussi le logic_relay de départ de feu (firetrap_relay_start). Mais attention, il est activé, pas déclenché !
On le déclenchera quand on tournera le bouton rouge. Ce stratagème nous empêche de déclencher le logic_relay sans avoir ouvert le gaz avant (puisque dans ce cas, le logic_relay n'aurait pas été activé).
Maintenant, on va ajouter les outputs quand on lâche la vanne (on vient de de la refermer) :
Output named |
Targets entities |
Via this input |
Parameter |
Delay |
---|---|---|---|---|
OnOut |
firetrap_vapeur |
Toggle |
<none> |
0.00 |
OnOut |
firetrap_relay_start |
Disable |
<none> |
0.00 |
OnOut |
firetrap_relay_end |
Trigger |
<none> |
0.00 |
OnOut |
firetrap_vapeur_son |
ToggleSound |
<none> |
0.00 |
Donc là, rien de bien compliqué. On annule tout ce qui a été fait avec OnIn. On fait appel au relais firetrap_relay_end, qu'on déclenche (il sera activé par le relais de démarrage du feu).
Ici, il n'y a que 3 outputs très simples :
Output named |
Targets entities |
Via this input |
Parameter |
Delay |
---|---|---|---|---|
OnIn |
firetrap_boutonrouge_son |
PlaySound |
<none> |
0.00 |
OnIn |
firetrap_spark |
SparkOnce |
<none> |
0.00 |
OnIn |
firetrap_relay_start |
Trigger |
<none> |
0.00 |
Très simple. On joue le son du bouton, on actionne les étincelles une fois (SparkOnce) et on déclenche le logic_relay qui va à son tour déclencher le brasier .
On va enfin s'occuper du firetrap_relay_start. On va activer les env_firesources, les env_fire. On active aussi firetrap_relay_end, et on désactivé le firetrap_relay_start (il s'auto-désactive ). On en profite aussi pour allumer la light, 0.5 secondes après .
Output named |
Targets entities |
Via this input |
Parameter |
Delay |
---|---|---|---|---|
OnTrigger |
firetrap_firesource |
Enable |
<none> |
0.00 |
OnTrigger |
firetrap_relay_end |
Enable |
<none> |
0.00 |
OnTrigger |
firetrap_fires |
Enable |
<none> |
0.00 |
OnTrigger |
firetrap_relay_start |
Disable |
<none> |
0.00 |
OnTrigger |
firetrap_firestart_son |
PlaySound |
<none> |
0.00 |
OnTrigger |
firetrap_light |
TurnOn |
<none> |
0.50 |
Output named |
Targets entities |
Via this input |
Parameter |
Delay |
---|---|---|---|---|
OnTrigger |
firetrap_firesource |
Disable |
<none> |
0.00 |
OnTrigger |
firetrap_firestop_son |
PlaySound |
<none> |
0.00 |
OnTrigger |
firetrap_relay_end |
Disable |
<none> |
0.00 |
OnTrigger |
firetrap_fires |
Extinguish |
1 |
0.20 |
OnTrigger |
firetrap_fires |
Disable |
<none> |
1.20 |
OnTrigger |
firetrap_light |
TurnOff |
<none> |
0.35 |
Donc ici, on fait quasiment le contraire de ce qui a été fait avec le relais de départ. On annule tout, et on s'auto-désactive. Remarquez l'input plutôt particulier que possèdent les env_fire : Extinguish. C'est un input qui permet de réduire progressivement la taille des flammes à 0, en fonction de la vitesse en paramètre. Nous avons mis 1, pour que les flammes mettent une seconde à mourir, ce qui accentue un peu le réalisme .
A ce moment, le tout devrait fonctionner.
Oui, mais on n'a pas parlé du bruit que font les flammes, on l'oublie ?
Non non non, on va le déclencher, mais pas avec les logic_relay. On va utiliser un détecteur de chaleur pour savoir si les flammes brûlent ou ne brûlent pas . De cette manière, le son sera joué exactement quand le brasier sera actif !
Pour ça, on va utiliser l'entité env_firesensor. Placez cette entité au centre des env_fire (au même endroit que les ambient_generic). Voici les paramètres :
Name : on ne met rien, pas besoin de l'appeler
Radius : 40
Heat level : niveau de chaleur. Laissez 32 degrés
Time at level : le temps avant de déclencher l'entité dès que la chaleur a atteint le Heat level. Laissez 0
Quand le niveau de chaleur est dépassé, l'output OnHeatLevelStart est déclenché. Quand le seuil redescend, c'est OnHeatLevelEnd qui est appelé. On va donc utiliser ces deux outputs pour jouer/muter le son :
Output named |
Targets entities |
Via this input |
Parameter |
Delay |
---|---|---|---|---|
OnHeatLevelStart |
firetrap_fires_son |
PlaySound |
<none> |
0.00 |
OnHeatLevelEnd |
firetrap_fires_son |
StopSound |
<none> |
0.00 |
Voilà, ce n'est pas bien compliqué .
Ehhh, mais dans Ravenholm, quand on tire dans le gaz, ça s'embrase. Or ici, çe ne marche pas. Pourquoi ?
Parce qu'on n'a rien mis pour détecter le shoot .
J'ai pensé à une méthode simple pour faire ça. Je mets un func_button avec la texture nodraw sur le sol, et qui recouvre toute la surface des flammes. Ce bouton fait une unité de haut et est plaqué au sol. Le paramètre de façon à ce qui ne se passe rien de spécial, hormis si on tire dessus. Pour ça, je mets la propriété Health sur 2, et je coche le flag Damage Activates. Pour savoir si on a tiré sur le bouton, j'utilise cet output :
Output named |
Targets entities |
Via this input |
Parameter |
Delay |
---|---|---|---|---|
OnDamaged |
firetrap_relay_start |
Trigger |
<none> |
0.00 |
Voici ce que j'ai