Comme ceci
par exemple :

Nous
avons fait la charpente de notre système d'objectif ;
maintenant on va y rajouter certaines choses pour le rendre
plus réaliste et esthétique.
4)
Préparer l'explosion du canon
Tout
d'abord faisons le model de l'explosion du canon (dont je vous
ai parlé plus haut). Faites un script_model,
positionnez le en plein milieu du canon (là ou l'explosion
aura lieu) et donnez lui les clé
/ valeur suivantes :
model / animate/fx_explosion_tank.tik
targetname / exploderfire
#set / 1
Vous
reconnaissez la valeur de groupe #set
: 1 dont je vous ai parlé
tout à l'heure. On nomme ce model d'explosion exploderfire
et il ne faut surtout pas en changer car c'est le nom utilisé
dans le script exploder.scr.
Vous devriez avoir à peu près ceci :

Vous
pouvez créer d'autres models d'explosions en changeant
le model. Mais les valeurs targetname
/ exploderfire et #set
/ 1 doivent toujours être
les même, du temps que vous travaillez sur la même
explosion. Par exemple on va en rajouter un autre pour que ça
fasse une jolie gerbe de flamme : Donc faites à nouveau
un script_model auquel vous donnerez
les valeurs suivantes :
model
/ animate/fx_mortar_higgins.tik
targetname / exploderfire
#set / 1
#pause / 0.2
Vous
vous demandez certainement ce que c'est que ce #pause
! Et bien c'est tout simplement le temps de latence (en secondes)
qu'il y aura entre l'explosion (du canon) et l'apparition de
ce model d'explosion, ceci afin d'avoir une explosion en plusieurs
temps. Et l'effet est vraiment très joli croyez-moi !
Alors vous pouvez remercier le créateur du script, parceque
cette idée de créer des explosions à "multi-stades"
était vraiment intelligente. Vous pouvez mettre des valeurs
#pause pour les models d'explosion
: exploderfire (c'est ce qu'on vient de faire), pour les débris
: exploderchunk (vous allez voir ça juste après).
Une dernière chose : si vous ne mettez aucune valeur
de #pause, il n'y aura pas de délai.
5)
Préparer les débris-projectiles de l'explosion
Aussi
nous allons rajouter des débris de canon qui vont voler
lors de l'explosion, afin de donner plus de réalisme
à l'ensemble.
Pour cela faites un brush de forme quelconque (vraiment très
simple, on ne verra presque pas la forme dans le jeu) d'environ
24 unités de côté et 6 d'épaisseur,
que vous placerez parallèlement à la surface du
canon contre laquelle il se trouve, appliquez lui une texture
métallique (j'ai bien dit métallique et pas clip
metal), qui se rapproche le plus possible de celle du canon,
et faites-en un script_object (clic
droit / <span style='font-family:Courier'>script / object)
auquel vous donnerez les clé
/ valeur suivantes :
targetname
/ exploderchunk
target / t1
#set / 1
Placez
ce script_object où vous
voulez autour du canon, mais attention : IL NE DOIT
EN AUCUN CAS TOUCHER LE POLYGONE SYMBOLISANT LE CANON
(le polygone qui se colore en rouge lorsque vous séléctionnez
le canon) !
Puis faites un script_origin (clic
droit / script / origin) que vous placerez là où
vous voulez que le débris vole, et donnez lui cette clé
/ valeur :
targetname
/ t1
Vous
devez donc voir une flèche bleu entre le débris
et le script_origin. Cela prouve
que les 2 entités sont bien liées entre elles.
Vous pouvez
reproduire ce couple débris/destination autant de fois
que vous voulez, pour avoir plusieurs débris qui volent
en même temps, mais en respectant certaines règles
:
- Le débris doit TOUJOURS avoir comme targetname : exploderchunk
- Tant que vous travaillez sur la même explosion, le débris
aura comme valeur de groupe (#set),
la même valeur numérique que les autres entités
du groupe ; donc en locurence : 1.
- Dans chacun des couples débris/destination : la cible
(target) du débris [script_object]
doit être identique au nom (targetname)
de la destination [script_origin].
Bien sûr, le nom utilisé va changer entre les différents
couples (t1, t2, t3, ...)
Donc au
final ça devrait vous donner ceci :

Ou
encore ceci :

(Vous
avez vu j'en ai mis un paquet, mais c'est ce qu'il faut si vous
voulez vraiment que votre explosion soit super réaliste)
6)
Faire sauter les objets aux alentour du canon
[en construction ...]
Voilà,
on a fini au niveau mapping ! C'est sympa hun ! Tous ces script_models,
script_objects, script_origins, trigger_uses,... toutes ces
couleurs, ces flèches : c'est super interressant mais
il ne faut pas en abuser... Alors juste avant de passer au script
on va faire une dernière vérification pour voir
si vous n'avez rien oublié :

(Vous
voyez que j'ai fait faire une rotation de 45° au canon (depuis
le début du tutoriel), c'est pour bien vous montrer que,
une fois que le canon aura explosé, son model détruit
sera bien dans la même position que le canon initial.)
Vous
devez donc avoir :
- Le canon de 150mm
- La bombe jaune et noire à l'intérieur du trigger
- Le trigger vert translucide
- Le ou les model(s) d'explosion du canon, en bleu, à
l'intérieur de ce dernier
- Des débris [script_object] de la couleur du canon reliés
par des flèches bleues à des destinations [script_origin]
plus éloignés du canon.
II
) Le script
Nous
voici maintenant dans la partie script, qui est assez simple.
Enfin je dis simple pour moi... Bon j'arrête de faire
le malin, et je vous donne tout de suite le script que vous
allez enregistrer comme ceci : obj_nomdevotrecarte.scr, et que
vous allez placer lui aussi dans le dossier maps/obj, tout comme
le fichier *.map et les autres fichiers de compile (*.bsp, *.vis,
*.prt).
//==========================================//
//|Nom de la carte : obj_tutorial_objectif |//
//|Architecture : |//
//|Script : Danker [Emilien] |//
//==========================================//
main:
setcvar "g_obj_alliedtext1"
"-< Détruire >-"
setcvar "g_obj_alliedtext2" "-< le canon de
150mm >-"
setcvar "g_obj_alliedtext3" ""
setcvar "g_obj_axistext1" "-< Défendre
>-"
setcvar "g_obj_axistext2" "-< le canon de
150mm >-"
setcvar "g_obj_axistext3" ""
setcvar "g_scoreboardpic"
"none"
local.master = spawn ScriptMaster
local.master aliascache explo_hallway1
sound/weapons/explo/explo_hallway1.wav soundparms 2.4 0.4 0.8
0.5 550 6500 auto loaded maps "dm obj"
//-----------------------------//
level waittill prespawn
//-----------------------------//
level.script = maps/obj/obj_tutorial_objectif.scr
exec global/exploder.scr
level.dmrespawning = 1
level.dmroundlimit = 4
level.clockside = "axis"
level.defusing_team = "axis"
level.planting_team = "allies"
//-----------------------------//
level waittill spawn
//-----------------------------//
level.bomb_damage = 200
level.bomb_explosion_radius = 1048
//-----------------------------//
//level waittill roundstart
//-----------------------------//
$bombe1 thread global/obj_dm.scr::bomb_thinker
$bombe1 thread victoire_axe
thread victoire_allies $bombe1
end
//===========================//
//*** Victoire des Alliés ***//
//===========================//
victoire_allies local.bombe:
while (local.bombe.exploded
!= 1)
{
wait 0.1
}
wait 1.5
teamwin allies
end
//===========================//
//*** Victoire des Allemands ***//
//===========================//
victoire_axe:
level waittill axiswin
end
Très
bien. Donc maintenant je vais vous expliquer comment ça
marche : (commentaires en violet, à ne pas recopier donc
! Ne recopiez que ce que je vous ai mis juste au dessus )
//==========================================//
//|Nom de la carte : obj_tutorial_objectif |//
//|Architecture : |//
//|Script : Danker [Emilien] |//
//==========================================//
main:
setcvar
"g_obj_alliedtext1" "-< Détruire >-"
//on définit les objectifs alliés
setcvar "g_obj_alliedtext2" "-< le canon de
150mm >-"
setcvar "g_obj_alliedtext3" ""
setcvar "g_obj_axistext1" "-< Défendre
>-" //pareil pour les Allemands
setcvar "g_obj_axistext2" "-< le canon de
150mm >-"
setcvar "g_obj_axistext3" ""
setcvar
"g_scoreboardpic" "none"
local.master
= spawn ScriptMaster //création
d'une variable permettant de déclarer les sons
local.master
aliascache explo_hallway1 sound/weapons/explo/explo_hallway1.wav
soundparms 2.4 0.4 0.8 0.5 550 6500 auto loaded maps "dm
obj"
//déclaration du son de l'explosion
(pour plus d'info, allez voir le tuto ajouter des sons localisés)
//-----------------------------//
level waittill prespawn
//-----------------------------//
level.script
= maps/obj/obj_tutorial_objectif.scr //ce
qui est en bleu est à changer en fonction du nom de votre
map ! Mais le préfixe "obj_" doit toujours
être présent vu que c'est une carte à objectif
(je vous ai expliqué ça au début)
exec global/exploder.scr
//initialisation du système d'explosion
level.dmrespawning
= 1 //Réapparition des joueurs
durant la partie : 0 = non ; 1 = oui
level.dmroundlimit = 4 //limite de temps
pour poser la bombe
level.clockside = "axis" //équipe
qui gagne si la bombe n'est pas posée au bout de la limite
de temps. Valeurs possibles : "axis" = allemands ;
"allies" = alliés ; "kills" ; "draw"
level.defusing_team
= "axis" //équipe qui
désamorce la bombe (donc qui protège l'objectif)
level.planting_team = "allies" //équipe
qui pose la bombe (autrement dit l'équipe qui attaque
!)
//-----------------------------//
level waittill spawn
//-----------------------------//
level.bomb_damage
= 200 //dégats provoqués
lors de l'explosion de la bombe
level.bomb_explosion_radius = 1048 //rayon
d'action des dégats provoqués par la bombe
//-----------------------------//
//level waittill roundstart //enlever
les 2 slashs (//) devant la ligne si vous jouez à plusieurs
//-----------------------------//
$bombe1
thread global/obj_dm.scr::bomb_thinker //Appelle
le système de gestion (amorçage/désamorçage)
de la bombe
$bombe1 thread victoire_axe //permet au
round de continuer même si les attaquants sont morts et
qu'ils ont posé la bombe (en attendant qu'elle explose
ou qu'elle soit désamorcée)
thread victoire_allies $bombe1
//On appelle le thread qui va attendre l'explosion de la bombe
pour faire gagner les attaquants
//Pour cela on fait passer la bombe sous forme de variable qu'on
va récupérer dans le thread appelé (ici
le thread est en Orange). La bombe
est en Jaunne.
end
//===========================//
//*** Victoire des Alliés ***//
//===========================//
victoire_allies local.bombe:
//vous voyez qu'on récupère
la bombe sous forme de variable "locale" et qu'on
va l'utiliser comme un objet normal...
while (local.bombe.exploded
!= 1) //tant que la bombe n'a PAS explosé...
{
wait 0.1 //...on attend !
}
// quand la bombe explose, la boucle while
s'arrète et la suite du thread est exécutée
wait 1.5 // on attend un petit peu pour
bien profiter de l'explosion qu'on s'est déchiré
à faire ! Ce serait dommage d'avoir fait tout ça
pour rien
teamwin
level.planting_team //l'équipe
qui attaque gagne !
end //fin
du thread
//===========================//
//*** Victoire des Allemands ***//
//===========================//
victoire_axe:
level waittill
axiswin
end
Maintenant
il ne nous reste plus qu'à faire le fichier precache
: obj_nomdelacarte_precache.scr :
//==========================================//
//|Nom de la carte : obj_tutorial_objectif |//
//|*** fichier de préchargement ***|//
//==========================================//
exec
global/DMprecache.scr
cache
models/items/pulse_explosive.tik
cache models/items/explosive.tik
cache
statweapons/15cmcannon.tik
cache statweapons/15cmcannon_d.tik
cache
models/animate/fx_explosion_flak88.tik
cache models/animate/fx_explosion_tank.tik
cache models/animate/fx_mortar_higgins.tik
aliascache
explo_hallway1 sound/weapons/explo/explo_hallway1.wav soundparms
2.4 0.4 0.8 0.5 550 6500 auto loaded maps "dm obj"
Placez ce
fichier dans le même répertoire que les autres
fichiers de la map (*.map ; *.scr ; etc)
Et Ben voilà,
ça c'est fait ! On a donc fini de faire notre système
d'objectif à explosion simple. Ca a du vous paraître
un peu long certes, mais c'est parceque j'ai bien pris le temps
de tout vous détailler et de tout vous expliquer. Entrainez
vous à le faire et à le refaire et vous verrez
que c'est un vrai jeu d'enfant ! En attendant je vous laisse
gouter à la joie de faire exploser VOTRE canon que VOUS
avez créé.
Et aussi pour ceux qui n'ont pas suivi le cours (faut prendre
des notes hun ! ), voici le fichier User_objectif.pk3 comprenant
:
- le fichier *.map
- la carte compilée
- les fichiers scripts