Burn them, Brother !

Image utilisateur

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 :pirate:

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 :) .

Préparation de la map

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

prop_static

models/props_citizen_tech/firetrap_gashose01a.mdl

C'est le tuyau de gaz avec les becs Bunsen. Placez le au raz du sol.

prop_static

models/props_citizen_tech/firetrap_propanecanister01a.mdl

C'est juste la bombonne de gaz

prop_static

models/props_citizen_tech/firetrap_buttonpad.mdl

C'est le support du bouton rouge qui permet de créer les étincelles

prop_dynamic

models/props_citizen_tech/Firetrap_button01a.mdl

C'est le bouton rouge ^^

prop_dynamic

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) :

Image utilisateur

Préparation des entités

On va maintenant mettre en place les entités, mais sans s'occuper des outputs, juste le placement et le paramétrage.

Les func_rot_button

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 :

Image utilisateur
Bouton rouge
  • 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.

Vanne de gaz
Image utilisateur
  • 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.

Les étincelles

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

Les env_steam

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

Les départs de feu

Image utilisateur

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

Le brasier

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 ;) .

Les ambient_generic

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

Pour finir...

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 :

Image utilisateur

Ce que j'obtiens. Remarquez que les env_steam, les env_firesource et les env_spark sont au même endroit sur chaque bec

Mise en place des outputs

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.

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).

Le bouton rouge

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 :) .

Le relais de départ

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

Le relais de fin

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 :) .

Détecter les flammes, ainsi que le shoot

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

Image utilisateur

Voici ce que j'ai