Gaming Zone Communautes Battlefield PiTrust Communautes Mods
SommairemapstutorielsforumtétéchargementsdiversLes liensLivre d'Or
Un objectif à explosion simple.

 

Ce tutoriel est certainement l'un de ceux qui sera le plus lu, car vous êtes nombreux à vouloir mettre des objectifs sur vos cartes pour les rendre attractives et moins "statiques". Vous allez donc apprendre à mettre un objectif sur une carte MULTIJOUEURS pour faire gagner une équipe en posant une bombe et en attendant son explosion, ou en défendant.

Avant de commencer je vais d'abord vous informer que ce qui est en vert est facultatif, et donc que ce n'est pas obligatoire de le faire si vous voulez que votre objectif fonctionne correctement, cependant je vous recommende fortement de le faire si vous voulez avoir quelquechose de correct. Les propriétés annotées d'une étoile verte (*) sont également des fonctions optionnelles.

I ) La carte

Alors commençons sans plus attendre. Faites une gentille petite carte avec tout le nécessaire (info_player_start, valeurs de lumière dans le worldspawn, etc...). Un peu comme ceci :

Comme c'est une carte à objectif, vous allez l'enregistrer dans le dossier maps/obj et non dans le dossier maps/dm comme vous aviez l'habitude de faire, si vous n'avez jamais fait de carte à objectif. N'oubliez pas de rajouter le préfixe "obj_" devant de le nom de la carte pour pouvoir la lancer (après la compilation) en partie match par objectif dans le menu de lancement de partie ; si vous ne le faites pas, votre carte marchera quand même mais vous ne pourrez la lancer qu'en partie match par équipe, ce qui aura pour conséquence qu'aucune équipe ne gagnera !

1) Définir et placer l'objectif à détruire

Maintenant nous allons placer l'objet qui va exploser. Ce peut être un véhicule, un canon,... enfin tout ce que vous pouvez trouver sous forme de model. Vous avez certainement vu des dizaines de cartes avec objectif : "Détruire le flak88" ou "Faire sauter le canon de 88mm"... alors je suppose que vous commencez à être lassés de ce canon de 88mm qui fit la renommée de l'artillerie allemande pendant la guerre (la famause flak) mais qui, à la longue, est bien monotone. Alors pour varier on va prendre le canon de 150mm, vous voyez le gros canon de Omaha Beach : bien lourd et puissant ! Bien sûr ce n'est qu'un exemple, n'importe quel model ferait l'affaire, même une chaise (mais le problème avec une chaise c'est qu'on ne verrait pas ce qu'il en reste après l'explosion... ). Trève de plaisanterie, passons aux choses sérieuses : positionnez vous dans l'une des vue 2D et faites clic droit / turretweapon / german / 15cmcannon. Vous devriez obtenir ceci :

Maintenez séléctionné le canon, appellez la console des entités (raccourci : N) et entrez les clé / valeur suivantes :
targetname / canon1
Là on définit le nom du canon...

$destroyed_model / statweapons/15cmcannon_d.tik
Cela sert à définir le model "détruit" du canon, qui le remplacera

. Bien sûr cela dépend du model que vous avez pris au départ. Aussi pour chacun des models non détruits suivants, on associera son model détruit :
- canon de 88mm (flak) : statweapons/flak88turret.tik | statweapons/flak88_d.tik
- canon de 20mm : statweapons/20mmflak.tik | statweapons/20mmflak_d.tik
- nebelwerfer : statweapons/nebelwerfer.tik | statweapons/nebelwerfer_d.tik
- avion fockwulf : vehicles/fockwulf.tik | vehicles/fockwulf_d.tik
- half track Sdkfz : vehicles/sdkfz.tik | vehicles/sdkfz_green_d.tik
- tank sherman : static/vehicle_shermantank.tik | static/vehicle_shermantank_dead.tik
- etc...

Vous trouverez tous les autres en allant soit dans vehicle/... soit dans static/vehicle/...

(Note : Pour utiliser directement ces models sans aller les rechercher dans la liste, faites un script_model (clic droit / script / model) auquel vous donnerez comme clé / valeur : model / nom_du_model_non_détruit (l'un de ceux que je viens de vous donner) et reprenez le tutoriel au début du paragraphe : 1) Définir et placer l'objectif à détruire )

2) Faire la bombe

Maintenant déséléctionnez le canon et faites un script_model (clic droit / script / model). Vous obtenez une espèce de cube bleu, comme ceci :


Positionnez le un peu éloigné du canon pour pouvoir le séléctionner et le désélectionner sans problème, on le placera à sa position finale plus tard. Ce script_model va servir à faire la bombe ; maintenez le séléctionné et appellez la console des entités pour lui donner les clé / valeur suivantes :

model / items/pulse_explosive.tik
targetname / bombe1
target / canon1
#exploder_set / 1
$trigger_name / bombe1_trigger
$explosion_fx / animate/fx_explosion_flak88.tik
$explosion_sound / explo_hallway1 (*)

Ce qui devrait au final vous donner ceci :

Bon, je vous dois quelques explications :

¤ model / items/pulse_explosive.tik
On définit le model de la bombe : Sous Mohradiant ça ressemble à une bombe normale, mais dans le jeu ce sera rouge transparent et clignotera (pour indiquer où poser la bombe). Vous n'êtes pas obligé de mettre cette fonction car c'est fait automatiquement dans le script (obj_dm.scr).

¤ targetname / bombe1
On définit le nom de la bombe qui sera ensuite utilisé dans le script.

¤ target / canon1
On définit l'objet lié la bombe, c'est à dire l'objet qui sera remplacé par son model détruit lors de l'explosion. Vous pouvez vérifier : canon1 est bien le nom qu'on a donné au canon précédemment. Lorsque vous introduisez cette valeur, une flèche bleue doit se tracer entre la bombe et le canon ; c'est tout à fait normal, cela prouve que les 2 entités sont bien "connectées" entre elles. (au passage, target veut dire cible en Français)

¤ #exploder_set / 1
Ici, c'est un peu plus compliqué : Lors de l'explosion de la bombe, le script qui gère l'amorçage et le désamorçage de la bombe : obj_dm.scr va commander une explosion au exploder.scr et ceci se fait avec des valeurs de groupes numériques (1, 2, 3, 4, ...) qui sont communes à toutes les entités impliquée dans une explosion (objet intact, objet détruit, model de l'explosion, débris dus à l'explosion, ...). Donc ici la bombe a pour valeur de groupe 1, et comme elle est liée au canon, lui aussi interviendra dans l'explosion du groupe 1. On va rajouter plus tard un model d'explosion (l'explosion elle-même) pour le canon et des débris, auxquels on donnera aussi comme valeur de groupe 1.

¤ $trigger_name / bombe1_trigger
Là on donne le nom du trigger qui servira pour amorcer et désamorcer la bombe. On n'a pas encore fait le trigger, mais c'est la prochaine étape.

¤ $explosion_fx / animate/fx_explosion_flak88.tik
On définit le model d'explosion de la BOMBE, et non du canon ! Pour le canon, comme je vous l'ai dit juste avant, on va créer un model d'explosion qui aura pour valeur de groupe 1.

¤ $explosion_sound / explo_hallway1 (*)
Le son qui sera joué lors de l'explosion. on va le déclarer dans le script...

3) Faire le déclancheur pour poser la bombe

Maintenant qu'on en a fini avec la bombe elle-même, on va faire le trigger qui servira à l'amorcer et à la désamorcer.
Faites donc un petit brush englobant le model de votre bombe, et transformez le en trigger_use (clic droit / trigger / use). Normalement, lors de la manipulation, le brush doit prendre automatiquement la texture trigger. Vous devriez obtenir quelquechose comme ça :


Maintenez le trigger séléctionné, et donnez lui comme clé / valeur :

targetname / bombe1_trigger

Voilà notre trigger est créé. Vous voyez on l'a appelé bombe1_trigger, ce qui coïncide bien avec le nom du trigger qu'on avait défini dans les paramètres de la bombe ($trigger_name). Maintenant séléctionnez la bombe et le trigger, et placez les où bon vous semble sur le canon.
(Note : Petite astuce pour séléctionner la bombe qui est située à l'intérieur du trigger : Désélectionnez tout, faites CTRL + T pour filtrer les triggers. Séléctionnez votre bombe, puis refaites CTRL + T pour enlever le filtre "trigger", donc votre trigger doit réapparaitre et vous pouvez maintenant le séléctionner lui aussi.)

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

 

 

Par Danker - 2003 Copyright © by CaskAmi Prod. Tout droit réservé.

 

Page générée en

Design / concept Amigos3D - Copyright ©2006 CaskAmi Prod. Tous droits réservés.
Caskami.com est hébergé; par Eliott-Ness.