
Nous allons reprendre le même
principe que notre mur à exploser au PanzerFaust, sauf que
cette fois-ci, ce sera en posant une charge explosive. Pour cela,
nous allons procéder comme la précédente fois,
et faire une nouvelle ouverture dans notre mur. Filtrez les modèles
statiques pour une meilleure visibilité.

Ajoutons maintenant nos brushs
dans l'espace creusé en appliquant la texture SHADOWCASTER
(cf. Détruire
un mur au Panzerfaust). Filtrez ensuite ce brush (touche
H).

Ajoutez le mur intact en le
texturant correctement puis, donnez-lui (tous les brushs sélectionnés)
la fonction script_brushmodel. Nous allons lui donner
la ligne targetname
mur_avant. En fait,
à partir de notre script, nous indiquerons au moteur quand
il faut afficher ou faire disparaître les brushs mur_avant.
Filtrez ensuite les brushs (touche H).

Ensuite, créez ce que
sera le mur après son explosion. Chose faite, sélectionnez
tous les brushs et donnez-leurs la fonction script_brushmodel.
Ajoutez maintenant la ligne targetname
mur_après.
Filtrez ensuite les brushs (touche H).

Nous allons maintenant compliquer
les choses, faire en sorte que les barrils volent au moement de l'explosion
(à l'aide de la fonction exploderchunk. Affichez
de nouveau les modèles statiques puis sélectionnez les
3 barrils que vous trsnformerez en script_model.
Pour notre tutorial sur le
mur à exploser avec un panzerfaust, nous avions utiliser la
chaine script_exploder 1, ici nous prendrons une
chaine de déclenchement différente à savoir script_exploder
2. Nous allons ajouter une autre
commande à cela, une fonction script_delay.
Un script_delay permet de décaler le déclenchement d'une
explosion ou d'un mouvement à partir du déclenchement
du TRIGGER. Dans notre exemple, nous allons mettre
un déclenchement de l'action à 15,6 secondes (nous verrons
plus loin pourquoi) : script_delay
15.6.
Pour mémoire, un script_exploder
seul fait disparaître les brushs ou entités au déclenchement.

Nous allons maintenant créer
nos barrils qui volent à l'explosion. Pour cela, nous avons
besoin de 3 autres barrils en script_model. Première
chose à faire, les rattacher à la chaine script_exploder
2. Deuxième chose, synchroniser
le mouvement de ces barrils avec la disparition des 3 autres barrils,
ajoutez donc un script_delay
à 15.5.
Le mouvement sera alors déclanché 0.1
seconde avant la disparition des 3 autres modèles précédents.
Comme précisé plus haut, la fonction qui permet de déplacer
des script_model ou script_brushmodel
est la fonction exploderchunk, ajoutez donc la ligne
targetname exploderchunk.

Pour indiquer dans quel sens
iront les modèles, nous allons là aussi ajouter des
script_origin à chacun des 3 modèles
exploderchunk. Ajoutez alors 3 script_origin et rattachez
chacun des modèles à un script_origin. Pour mémoire,
sélectionnez d'abord le modèle, puis le script_origin
et faites un CTRL + K. La flèche rouge doit
aller vers l'origin.
Dans la suite de ce tutorial,
nous allons placer les barrils par terre, après leur envole.
Pour cela, à partir de la vue XY Top faites
en sorte de ne pas trop éloigner les script_origin.

Ajoutez maintenant 3 nouveaux
script_model barrils mais cette fois-ci couchés
sur le flanc que vous placerez aligné prêt de chacun
des script_origin (en vous basant sur la vue XY
Top). Les flèches rouges du screenshot suivant vous
montre où se trouvent les script_origin par
rapport à nos 3 nouveaux script_model.
Ensuite ajoutez les lignes
script_exploder 2,
targetname exploder
(les modèles seront affichés
après le déclenchement du TRIGGER selon
le script_delay) et
un script_delay
16.3 (soit 16.3 secondes
après le déclenchement de notre TRIGGER).

Le problème des script_model
est qu'ils n'ont pas de collmaps, en d'autres termes on peut les traverser.
Pour cela, nous allons devoir créer des CLIP
pour créer manuellement les collisions de ces barrils à
terre. Comme il ne faut pas qu'ils (les CLIP) soient activés
avant l'explosion, nous allons les mettre en script_brushmodel.
Créez donc 3 brushs (soit en les faisant de la forme du barril
avec une texture CLIP NOSIGHT METAL, soit en reprenant
son collmap) puis mettez-les en script_brushmodel.
Ensuite, comme pour les modèles
de barrils précédents, ajoutez : script_exploder
2, targetname
exploder
et script_delay 16.3.

Il nous reste à placer
le modèle d'explosif et son TRIGGER.
Prenez le modèle xmodel/explosivepack_objective_incomplete
que vous transformerez en script_model ajoutez lui la ligne targetname
bombe. Le targetname
bombe sera ensuite utiliser
à partir du script que nous allons créer pour faire
fonctionner tout cela.

Créez maintenant le
déclencheur, un TRIGGER_USE et ajoutez la
ligne script_exploder 2.
Nous allons ajouter une fonction qui permettra d'afficher un message
dans le jeu à savoir : Appuyez sur [Utilisez] pour poser
la bombe. Ceci se fait avec la ligne : hintstring
Appuyez sur [Utilisez] pour poser la
bombe. Vous pouvez bien-sûr mettre n'importe
quel message différent.
Dernière chose à
faire, rattacher notre déclencheur à notre modèle
d'explosif. Sélectionnez d'abord le modèle, puis le
TRIGGER_USE et faites un CTRL + K.
La flèche bleue
doit aller vers le TRIGGER_USE.
Voici au final une vue d'ensemble
de notre création. Nous en avons fini avec le mapping, passons
maintenant au script.
D'abord, nous allons créer
un nouveau fichier FX pour les besoins de ce tutorial
que nous appellerons bombe_fx.gsc où nous mettrons :
main()
{
precacheFX();
}
precacheFX()
{
level._effect["mp_bomb"] = loadfx("fx/explosions/mp_bomb.efx");
level._effect["exp_concrete"] = loadfx("fx/map_kharkov1/exp_concrete.efx");
}

Pour information, l'utilisation
du FX fx/explosions/mp_bomb.efx
génère un effet d'explosion et de fumée et le
FX fx/map_kharkov1/exp_concrete.efx
génère une animation de débris au moent de l'explosion.
Voyons maintenant ce que nous
devons faire pour notre script principal. Les lignes en rouge sont
à ajouter au script :
main()
{
setCullFog (0, 6500, .32, .36, .40, 0);
ambientPlay("ambient_mp_brecourt");
maps\mp\_load::main();
level thread maps\mp\tuto_fx::main();
level thread maps\mp\tuto_fenetre::main();
level thread maps\mp\mortier_fx::main();
level thread maps\mp\bombe_fx::main();
level thread maps\mp\_tankdrive_gmi::main();
level thread maps\mp\_jeepdrive_gmi::main();
precacheModel("xmodel/explosivepack");
game["allies"] = "american";
game["axis"] = "german";
game["american_soldiertype"] = "airborne";
game["american_soldiervariation"] = "normal";
game["german_soldiertype"] = "wehrmacht";
game["german_soldiervariation"] = "normal";
level thread mortier();
level thread avions();
level thread bombe();
}
mortier()
{
mortier = getentarray ("mortier","targetname");
while (1)
{
wait (5 + randomfloat(5));
GoodPosition = false;
while (!GoodPosition)
{
rand = randomint(mortier.size);
GoodPosition = true;
players = getentarray("player", "classname");
for(i = 0; i < players.size; i++)
{
if (distance(mortier[rand].origin,players[i].origin) < 200)
{
GoodPosition = false;
break;
}
}
}
mortier[rand] playsound("mortar_incoming");
wait (1.9);
origin = mortier[rand] getorigin();
playfx (level._effect["mortar_explosion"][randomint(2)],
origin);
mortier[rand] playsound("mortar_explosion");
radiusDamage(mortier[rand].origin, 200, 200, 0);
}
}
avions()
{
level.PlaneSpeed = 3;
spitfire = getent ("spitfire","targetname");
messerschmitt = getent ("messerschmitt","targetname");
temp = getent (spitfire.target,"targetname");
spitfire.dest = temp.origin;
spitfire.start = spitfire.origin;
spitfire hide();
temp = getent (messerschmitt.target,"targetname");
messerschmitt.dest = temp.origin;
messerschmitt.start = messerschmitt.origin;
messerschmitt hide();
wait 2;
while (1)
{
messerschmitt thread passage_avions("son_messerchmitt");
wait 1;
spitfire thread passage_avions("son_spitfire");
wait 30;
}
}
passage_avions(sound)
{
if (isdefined (sound))
self playsound (sound);
wait 4;
self show();
self moveto(self.dest, level.PlaneSpeed, 0.1, 0.1);
wait level.PlaneSpeed;
self hide();
self.origin = self.start;
}
bombe()
{
bombe = getent ("bombe","targetname");//on
déclare le targetname bombe en entité
bombe.trigger = getent (bombe.target,"targetname");
mur_avant = getent ("mur_avant","targetname");//on
déclare les brushs mur_avant en entité
mur_apres = getent ("mur_apres","targetname");//on
déclare les brushs mur_apres en entité
mur_apres hide();//les script_brushmodel mur_apres
ne sont pas affichés
while (1)
{
bombe.trigger waittill ("trigger",other);//déclenchement
du TRIGGER-USE - les
script_delay sont déclenchés
if ((isplayer (other)) && (other.pers["team"] ==
"allies"))
break;
}
bombe playsound ("MP_bomb_plant");//son
joué pour la pose de la bombe
bombe.trigger delete();//le TRIGGER_USE est
effacé
bombe setmodel ("xmodel/explosivepack");//le
modèle explosivepack_objective_incomplete
est remplacé
wait .5;// on attend 0.5 seconde
bombe playLoopSound("bomb_tick");//on
joue le son du compte à rebours
wait 15;// on attend 15 secondes (soit 16 secondes
depuis le déclenchement du TRIGGER
bombe stopLoopSound("bomb_tick");//on
stoppe le son du compte à rebours
origin = bombe getorigin();//on récupère
l'origine de la bombe
bombe delete();//on efface le modèle
de la bombe
playfx(level._effect["mp_bomb"], origin);//on
déclenche le FX mp_bomb
playfx(level._effect["exp_concrete"], origin);//on
déclenche le FX exp_concrete
radiusDamage(origin, 500, 2000, 1000);//on assigne
une zone de danger autour de l'origne de la bombe
mur_apres show();//les script_brushmodel mur_apres
sont affichés
mur_avant delete();//les script_brushmodel mur_avant
sont effacés
}
NB : radiusDamage (self.origin, range,
max_damage, min_damage)

Vous pouvez maintenant compiler
votre map et tester le fruit de votre travail.
Les fichiers (.map - .gsc -
csv) de notre tuto 25/. se trouve ici.
Pour l'utiliser, à partir du menu FICHIER,
sélectionnez IMPORTEZ (.map) ==> IMPORTEZ NOUVELLE
MAP.

Par
Caskou
- 2005 Copyright © by CaskAmi Prod.
Tout droit réservé.