Bien,
pour ce tutorial je vais supposer que vous avez déjà
quelques connaissances en mapping…et en scripting ; et que vous
connaissez bien le fonctionnement de Mohradiant… !
Ici
je vais vous apprendre à faire des volets animés (très
simple) puis à forcer le mouvement qui les fait s’entrechoquer
selon événement…(un peu plus compliqué),
et enfin à leur ajouter un son : utilisation des alias (là,
ça devient sérieux !).
Donc
pour commencer, vous aller créer votre carte (vous savez comment
faire : ciel, point de départ des joueurs,… ! je n’y
reviendrais pas) avec une maison (à 2 étages de préférence),
et 5 fenêtres minimums (mais pas toutes sur le même mur,
c’est important !).
Ce
qui devrait vous donner à peu près ceci :

I
) Faire des volets animés
Très
bien, nous allons donc maintenant créer les volets ! Faites
2 brushs d’épaisseur 4 (c’est la norme…),
dont la hauteur est un peu plus grande que celle de la fenêtre
à laquelle ils sont associés (pour plus de réalisme
bien sûr !), et dont la largeur est environ la moitié
de la largeur de la fenêtre : afin qu’ils coïncident
lorsqu’ils seront fermés ! Vous les placerez perpendiculairement
au mur (s’aider avec la vue XY top) et de chaque coté
de la fenêtre ! Je pense que l’image suivante vous
aidera à mieux comprendre :

Il faut maintenant
texturer ces brushs ! Tapez wood
dans la boite de dialogue située juste en dessous de la
barre d’outil, appelez la console des textures (avec la
touche T ), puis tapez dans la boite de message située
dans la console des textures : shutter_set2. Remarque, vous pouvez
également trouver cette texture en allant dans Texture/central_europe.
Bien
maintenant texturez vos faces de brush avec cette texture (n’oubliez
pas : CTRL + F pour étaler la texture sur toute une face) !
Mais vous pouvez utiliser une autre texture de bois pour les côtés
du brush. Il est très important de ne pas oublier de texturer
le coté du brush situé du coté du mur : c’est
a dire celui ou est situé la charnière du volet (dans
la réalité) ; en effet, cette partie sera visible lorsque
le volet sera en mouvement. Sur cette illustration, j’ai volontairement
supprimé une partie du mur pour que vous puissiez mieux voir
de quoi je veux parler :

Voilà,
maintenant que c’est fait, vous allez créer, comme pour
une porte rotative, le brush avec la texture origin
qui sera l’axe de rotation de votre volet lorsqu’il bougera,
c’est en quelque sorte la charnière !

Alors
maintenez sélectionné ce brush « origin
» et sélectionnez en même temps l’un des
2 volets, faites clique droit et transformez les en script_object
!

Maintenez
toujours l’axe et le volet sélectionnés puis appelez
la console des entités (avec la touche n), puis donnez leur
les clé/valeur
suivantes :
-> s’il s’agit du volet situé à droite
de la fenêtre : targetname/rshutter
-> s’il s’agit du volet situé à gauche
de la fenêtre : targetname/lshutter
Note
: Attention, ne vous fiez pas à ce que vous voyez
dans la vue 2D, Il faut toujours se placer dans la vue 3D en face
des volets pour savoir lequel est à gauche, et lequel est à
droite !!
Et bien maintenant vous pouvez faire la même chose pour tous
les volets, à toutes le fenêtres...
Voilà,
ce sera très court pour la partie scripting : Il vous suffit
juste d’ajouter cette ligne sous level waittill prespawn :
exec global/shutter.scr
II
) Forcer l’entrechoquement des volets selon évènement:
Nous allons maintenant
passer à une partie un peu plus compliquée : Faire s’entrechoquer
les volets selon événement ! Ici j’ai choisi l’explosion
d’un canon !
Vous allez donc créer un flak 88 destructible, comme c’est
remarquablement bien expliqué dans les
tutoriels de notre ami Tropheus.
Allez-y,
faites ce qui est dit : dans la carte et dans le script ! (attention,
il s’agit d’une méthode valable uniquement pour
les cartes en solitaire, pour les cartes multijoueurs, allez voir
le tutoriel : [lien]Faire un objectif à explosion simple[/lien]).
Placez votre canon pas trop éloigné de la maison pour
que l’effet final soit bien réaliste.
Ce qui devrait vous donner quelque chose comme ceci :

Une fois fini,
vous allez sélectionner tous les volets (et leur brush «
origin »), se situant sur le mur
auquel fait face le canon ! Et vous allez leur donner comme clé/valeur
: #group/1
Ici,
1 est le numéro que vous attribuez au groupe de volets, et
qui va vous servir ensuite dans le script pour les faire bouger !
C’est une bonne idée de regrouper les volets par «
mur », et de donner à chaque groupe de volets situé
sur un mur différent, une valeur différente ( 1, 2,
3, 4,…). cela vous permet de créer de magnifiques effets
pour le passage d’un avion juste au dessus de la maison par
exemple, ou une explosion localisée.
Bien,
ce tuto s’arête ici en ce qui concerne le mapping ; maintenant
place au script !
Votre
sript doit désormais ressembler a ça : (sans
la ligne rouge)
-
pour une carte en solitaire
//nom de la carte: tutorial_volets
main:
// set scoreboard messages
setcvar "g_obj_alliedtext1" "Tutorial pour les"
setcvar "g_obj_alliedtext2" "volets animés"
setcvar "g_obj_alliedtext3"
setcvar "g_obj_axistext1" "Réalisé par
Danker"
setcvar "g_obj_axistext2" "en s'inspirant des tutos"
setcvar "g_obj_axistext3" "de Surgeon et de Tropheus"
setcvar "g_scoreboardpic" "none"
level waittill prespawn
level.script = maps/tutorial_volets.scr
exec global/shutter.scr
exec global/exploder.scr
level waittill spawn
thread obj1
end
//*** l'explosion du flak ***//
obj1:
$bomb1_trigger waittill trigger
$bomb1 model "animate/explosive.tik"
$bomb1 playsound plantbomb1
$player loopsound bombtick
$player stopwatch 5
wait 5
$player stoploopsound
$bomb1 playsound explode_tank
waitthread global/exploder.scr::explode 1
$bomb1 remove
radiusdamage $hurtobject1 250 600
wait 0.2
thread global/shutter.scr::shuttrig 1
end
-
pour une carte multijoueurs avec objectif
//nom de la carte : obj_tutorial_volets
main:
setcvar "g_obj_alliedtext1" "Détruire"
setcvar "g_obj_alliedtext2" "le canon de 88mm"
setcvar "g_obj_alliedtext3" ""
setcvar "g_obj_axistext1" "Défendre"
setcvar "g_obj_axistext2" "le canon de 88mm"
setcvar "g_obj_axistext3" ""
setcvar "g_scoreboardpic" "none"
level waittill prespawn
level.script = maps/obj/obj_tutorial_volets.scr
exec global/exploder.scr
exec global/shutter.scr
level.dmrespawning = 0
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 0.2
thread global/shutter.scr::shuttrig 1
wait 1.5
teamwin allies
end
//*** Victoire des allemands ***//
victoire_axe:
level waittill axiswin
end
En
fait il vous suffit juste de rajouter cette simple petite ligne :
thread global/shutter.scr::shuttrig 1
Comme
je viens de le faire en écrivant cette commande en rouge. Cela
active l’entrechoquement des volets juste au moment de l’explosion
(si vous ne comprenez pas pourquoi, référez vous aux
indications de script dans le tutoriel de Tropheus ou dans le tutoriels
sur l’objectif par explosion). Ici 1 est la valeur de groupe
que vous avez donné aux volets. Vous pouvez mettre plusieurs
fois cette ligne de suite, en changeant à chaque ligne le nombre
(valeur de groupe) ce qui permettra de faire s’entrechoquer
plusieurs groupes de volets en même temps. Et si vous commandez
une petite attente entre chaque entrechoquement, par la commande «
wait x » (ou x est un nombre), vous pourrez ainsi simuler l’effet
du souffle de l’explosion qui fera bouger les groupes de volets
les uns à la suite des autres en fonction de leur éloignement
par rapport au lieu l’explosion. C’est très joli
à voir.
III
) Ajouter des sons aux volets animés:
Maintenant
nous allons donner un son aux volets, ou plus précisément,
nous allons déclarer les sons des volets. En effet le script
qui commande le mouvement des volets (mohda/main/pak0.pk3/global/shutter.scr)
commande également l’exécution de certains sons
à des moments précis. Or, comme vous le savez peut-être,
les sons de MOHAA on besoin d’un alias (une sorte de rappel
de l’emplacement du fichier son et qui définit également
ses paramètres tels que le volume, la fréquence, et
le canal sur lequel il est joué) dans le sript afin que le
jeu les reconnaisse. Ces alias (ou déclarations) de fichiers
sons sont présent dans un fichier nommé ubersound.scr.
Ce fichier est sensé être lu par le jeu à chaque
lancement de carte, ainsi l’on n’aurait pas besoin de
déclarer les sons dans chaque script chaque fois qu’on
en utilise, mais Medal of Honor est un jeu qui, malgré sa qualité
de réalisation, et malgré les patchs correctifs, possède
encore des bugs, et ce fichier ubersound.scr
n’est pas lu lorsque l’on lance une carte. Si vous voulez
connaître la raison, la voici : Chaque carte lorsqu’elle
est présente sous forme de fichier .pk3 peut posséder
un fichier ubersound.scr (situé
dans un dossier ubersound) qui est censé être lu à
Vous allez donc insérer dans votre sript les alias de ces sons
(que vous trouverez ici : mohaa/main/pak0.pk3/ubersound/ubersound.scr
). Comme ceci : (placez les au même endroit pour une carte multijoueurs)
//nom de la carte: tutorial_volets
main:
// set scoreboard messages
setcvar "g_obj_alliedtext1" "Tutorial pour les"
setcvar "g_obj_alliedtext2" "volets animés"
setcvar "g_obj_alliedtext3"
setcvar "g_obj_axistext1" "proposé par Danker"
setcvar "g_obj_axistext2" "en s'inspirant des tutos"
setcvar "g_obj_axistext3" "de Surgeon et de Tropheus"
setcvar "g_scoreboardpic" "none"
local.master = spawn SricptMaster
local.master aliascache shuttersqueak_01
sound/mechanics/Mec_ShutterSqueak_01.wav soundparms 0.5 0.2 0.8 0.4
250 2500 auto loaded maps "m dm obj"
local.master aliascache shuttersqueak_02
sound/mechanics/Mec_ShutterSqueak_02.wav soundparms 0.5 0.2 0.8 0.4
250 2500 auto loaded maps "m dm obj"
local.master aliascache shuttersqueak_03
sound/mechanics/Mec_ShutterSqueak_03.wav soundparms 0.5 0.2 0.8 0.4
250 2500 auto loaded maps "m dm obj"
local.master aliascache shuttersqueak_04
sound/mechanics/Mec_ShutterSqueak_04.wav soundparms 0.5 0.2 0.8 0.4
250 2500 auto loaded maps "m dm obj"
local.master aliascache shutterhit_01
sound/mechanics/Mec_ShutterHit_01.wav soundparms 0.5 0.2 0.8 0.4 250
2500 auto loaded maps "m dm obj"
level waittill prespawn
level.script = maps/tutorial_volets.scr
exec global/shutter.scr
exec global/exploder.scr
level waittill spawn
thread obj1
end
//*** l'explosion du flak ***//
obj1:
$bomb1_trigger waittill trigger
$bomb1 model "animate/explosive.tik"
$bomb1 playsound plantbomb1
$player loopsound bombtick
$player stopwatch 5
wait 5
$player stoploopsound
$bomb1 playsound explode_tank
waitthread global/exploder.scr::explode 1
$bomb1 remove
radiusdamage $hurtobject1 256 384
wait 0.2
thread global/shutter.scr::shuttrig 1
end
N’oubliez
pas de rajouter, juste avant les allias, cette petite ligne :
local.master = spawn ScriptMaster
Pour
vous aider a mieux comprendre ce qu’est un alias, je vais en
décrire un :
local.master
// C’est la variable qui sert à créer les alias.
Pour en savoir plus, allez faire un tour dans G_allclasses.htm
aliascache
shuttersqueak_01 sound/mechanics/Mec_ShutterSqueak_01.wav
// ici vous définnissez le nom du son et son emplacement.
soundparms
0.5 0.2 0.8 0.4 250 2500 auto loaded maps "m dm obj"
// cette partie définit l’intensité du son (1er
paramètre) ainsi que plusieurs paramètres que je ne
connais pas. L’avant dernier paramètre correspond à
la distance à partir de laquelle le son commence à faiblir,
et le dernier correspond à la distance au delà de laquelle
le son n’est plus audible ! (pour en savoir plus, allez voir
le tuto sur les sons localisés (C’est ça
l’organisation SANS faille de Caskami :-° :p)
aliascache
shuttersqueak_01 sound/mechanics/Mec_ShutterSqueak_01.wav soundparms
0.5 0.2 0.8 0.4 250 2500 auto loaded maps "m dm obj" //
toute cette partie est celle que vous trouvez dans le ubersound.scr
! Il faut y rajouter le petit : local.master devant ; et aussi rectifier
la toute dernière partie entre guillemets qui apparaît
souvent ainsi dans le ubersound.scr :
« m1L1 » ou « m2l3 m2l4 » ; et qu’il
faut remplacer par : « m dm obj» ; je ne suis pas sûr
de l’utilité de ce changement, mais il me semble qu’il
permet de charger automatiquement ces sons pour les maps solo, dm
et obj…
Pour le fichier *_precache.scr, allez voir le tuto sur les sons localisés
où il est ce qu’il faut mettre.
A noter que si vous essayez sous En Formation ou sous L’Offensive,
il faut faire un petit restart dans la console pour bien entendre
les sons… Pour éviter ce problème, il faut faire
un ubersound.scr personnel, mais ça c’est expliqué
dans le tuto sur les sons localisés.
Vous
pouvez, bien entendu, changer le son des volets (en importer par exemple),
auquel cas il faudra IMPERATIVEMENT garder
les mêmes noms (ex : shuttersqueak_01) et ne changer que le
chemin du son : sound/volets/Mon_son_1.wav !
Voilà
je crois que j’ai tout dit ! Maintenant si vous avez des questions,
je suis à votre écoute sur le forum.