Construire
un bombardement (multi
et solo)
ou utiliser les notion de "vecteurs" et de variables
"local".
Tutorial, map et script écrits par : Tropheus
Imaginez-vous sous une pluie de bombes sans jamais pouvoir prévoir l'endroit où elles vont tombées. Et bien c'est ce que nous allons réaliser.
Bon tout d'abord, une petite mise au point.
Qu'est ce qu'une variable ? C'est tout simplement un nom qui permet de garder une valeur numérique sans écrire de nombre.
Qu'est ce qu'une variable "local" ? C'est une variable qui n'est utilisable que dans le thread où elle est créée.
Qu'est-ce qu'un vecteur (vector en anglais) ? C'est la définition d'un point dans l'espace, c'est à dire ses coordonnées. Ici comme on est dans un jeu en 3D le vecteur comporte 3 valeurs. Une valeur pour X, une pour Y et une pour Z (dans cet ordre.)
L'intérêt de combiner variable et vecteur c'est qu'on peut modifier à loisir les coordonnées du vecteur.
Pour plus de précision allez voir de ce côté. Langage MOHAA.
Bon mais revenons à nos moutons.
1/ Partie mapping.
Pour cela rien de particulier une map habituelle worldspawn,
info_player_start, etc... Simplement, ici j'ai mis un petit brush
au centre de la map (comme un pieu). Qui n'a rien de particulier
sauf qu'on le transforme en "script_object" (brush
sélectionné/clicdroit
en 2D/script/object) Avec
les key et value suivantes :
targetname / refer (ou tout autre nom)
Ce script_objet sera notre point de référence pour
faire exploser les bombes. Nous les ferons exploser dans un périmètre
de 200 unités mohaa à gauche, 200 à droite,
200 devant et 200 derrière soit un carré de 400
unités de côté (pas au-dela).
2/ Scripting.
Je pense que pour maintenant il est inutile de vous dire d'ouvrir notepad.Mais bon, ouvrez-le quand même !!!
a/ scripting solo
La map étant appelée "test_explo" vous allez appeler votre script "test_explo.scr". Et vous allez écrire ceci.
//mapping by Tropheus
//scripting by Tropheus
exec global/ai.scr
exec global/loadout.scr maps/test_explo.scr
main:
level waittill prespawn
exec global/ambient.scr test_explo
exec global/exploder.scr
level waittill spawn
$player item weapons/colt45.tik
$player ammo pistol 1000
thread random_explode
level.script="map/test_explo.scr"
end
//////////////////////////////
random_explode:
local.target=$refer
local.a=local.target.origin
local.b=randomint (100)
if (local.b < 25)
{
local.a[0]=local.a[0] - randomint (200)
local.a[1]=local.a[1] - randomint (200)
}
else if (local.b < 50 && local.b >=25)
{
local.a[0]=local.a[0] + randomint (200)
local.a[1]=local.a[1] + randomint (200)
}
else if (local.b > 50 && local.b <= 75)
{
local.a[0]=local.a[0] - randomint (200)
local.a[1]=local.a[1] + randomint (200)
}
else if (local.b > 75)
{
local.a[0]=local.a[0] + randomint (200)
local.a[1]=local.a[1] - randomint (200)
}
local.exp1=spawn "fx/scriptbazookaexplosion.tik"
local.exp2=spawn "animate/fx_mortar_dirt.tik"
local.exp3=spawn "animate/fx_mortar_higgins.tik"
local.exp1.origin=local.a
local.exp1 anim start
local.exp2.origin=local.a
local.exp2 anim start
local.exp3.origin=local.a
local.exp3 anim start
wait(1 + ((randomint(5))*.2))
local.exp1 remove
local.exp2 remove
local.exp3 remove
goto random_explode
end
Ne vous prenez pas la tête, n'allez pas chercher de quoi vous détendre, voici la solution. Après seulement vous appalaudirez l'artiste.
//mapping by Tropheus//l'auteur
//scripting by Tropheus//l'auteur
exec global/ai.scr
exec global/loadout.scr maps/test_explo.scr
main:
level waittill prespawn
exec global/ambient.scr test_explo
exec global/exploder.scr//charge
les scripts liés aux explosions
level waittill spawn
$player item weapons/colt45.tik
$player ammo pistol 1000
thread random_explode//envoie à
la partie du script (thread) qui code les explosions. Si on décide
d'activer le thread par un trigger il faut enlever cette ligne.
level.script="map/test_explo.scr"
end
//////////////////////////////codage
des explosions////////////////////////////////////
random_explode://Nom du thread
//////définition des variables//////////
local.target=$refer//Ici on crée
une première variable local "local.target" qui
prend pour valeur le script_object ($refer)
local.a=local.target.origin//Ici
on crée une seconde variable "local.a" qui va
nous servir pour changer les coordonnées des explosions.
"local.a" aura les valeurs de l'origine du script_object.
C'est à dire ses coordonnées.
local.b=randomint (100)//Ici on crée
une troisième variable "local.b" qui prendra
une valeur entiére au hasard entre 0 et 100. Elle nous
servira simplement pour définir au hasard la partie du
carré qui sera visé.
//////calcul de l'endroit des explosions//////dans
l'ordre du script, carré A puis C puis B puis D sur le
schéma//////////
if (local.b < 25)//Si local.b
est plus petit que 25 alors, mohaa utilisera cette partie du code =>
explosion dans A
{
local.a[0]=local.a[0] - randomint (200)//Ici
grâce à [0] on a accès à l'abscisse
(valeur X) du script_objet. "local.a[0] posséde au
départ donc au départ la valeur de l'X du script_object,
mais ici on lui assigne autre valeur qui sera cette valeur moins
un nombre aléatoire compris entre 0 et 200.
local.a[1]=local.a[1] - randomint (200)//Idem
pour Y. Ceci grâce à [1]
}
else if (local.b < 50 && local.b >=25)//Si "local.b" est
compris entre "25"
et "50"alors, mohaa utilisera cette partie du code =>
explosion dans C
{
local.a[0]=local.a[0] + randomint (200)//id
mais avec + une valeur comprise entre 0 et 200
local.a[1]=local.a[1] + randomint (200)//id
mais avec + une valeur comprise entre 0 et 200
}
else if (local.b > 50 && local.b <= 75)//Si "local.b" est
compris entre "50"
et "75" alors, mohaa utilisera cette partie du code => explosion dans
B.
{
local.a[0]=local.a[0] - randomint (200)
local.a[1]=local.a[1] + randomint (200)
}
else if (local.b > 75)//Si "local.b"
est supérieure a "75" alors, mohaa utilisera
cette partie du code => explosion dans D.
{
local.a[0]=local.a[0] + randomint (200)
local.a[1]=local.a[1] - randomint (200)
}
////////définition des explosions////////////////////////
local.exp1=spawn "fx/scriptbazookaexplosion.tik"//on
utilise encore une variable. La variable
local.exp1 a la valeur "naissance" de la fx "bazookaexplosion".
local.exp2=spawn "animate/fx_mortar_dirt.tik"//idem
mais avec la fx mortar_dirt.tik
local.exp3=spawn "animate/fx_mortar_higgins.tik"//idem
mais avec la fx mortar_higgins.tik
Ici on fait un amalgame de 3 explosions une seule suffirait,
mais
les 3 combinées on a un meilleur rendu de l'explosion.
///////////////////Définition
des endroits des explosions//////////////////
local.exp1.origin=local.a//L'origine
(coordonnées) de la variable local.exp1 (qui est de faire
apparaitre l'explosion du bazooka) prendra la valeur de local.a
que l'on vient de modifier dans la partie au-dessus.
local.exp1 anim start//lance l'animation
local.exp2.origin=local.a//idem pour
la seconde animation
local.exp2 anim start//lance l'animation
local.exp3.origin=local.a//idem pour
la troisème animation
local.exp3 anim start//lance l'animation
wait(1 + ((randomint(5))*.2))//temps
d'attente entre 2 série d'explosions là aussi au
hasard mais avec toujour au moins 1 seconde entre chaque explosion.
Mais avec l'ajout d'une valeur comprise entre 0 et 5 multiplier
par 0.2 soit 1. Donc la série d'explosions suivante arrivera
dans une durée comprise entre 1 et 2 (1+1) secondes.
local.exp1 remove//enlève
la première animation
local.exp2 remove//enlève
la seconde animation
local.exp3 remove//enlève
la troisième animation
goto random_explode//on retourne
au départ. On a une boucle.
end
Bon alors vous voyez, il n'y a pas de quoi devenir chèvre ou de fumer 5 paquets de cigarettes.
b/ Scripting multiplayer
Toujours avec le même logiciel. Ecrivez ceci. Ici ce n'est pas la peine de d'expliquer, c'est la même chose qu'au-dessus.
//mapping : Tropheus
//scripting : Tropheus
main :
// set scoreboard messages
setcvar "g_scoreboardpic" "none"
level waittill prespawn
//*** Precache Dm Stuff
exec global/DMprecache.scr
thread random_explode
level.script = maps/dm/test_explo_multi.scr
level waittill spawn
end
/////////////////////////////////////
random_explode:
local.target=$refer
local.a=local.target.origin
local.b=randomint (100)
if (local.b < 25)
{
local.a[0]=local.a[0]
- randomint (200)
local.a[1]=local.a[1]
- randomint (200)
}
else if (local.b < 50 && local.b >=25)
{
local.a[0]=local.a[0]
+ randomint (200)
local.a[1]=local.a[1]
+ randomint (200)
}
else if (local.b > 50 && local.b <=
75)
{
local.a[0]=local.a[0]
- randomint (200)
local.a[1]=local.a[1]
+ randomint (200)
}
else if (local.b > 75)
{
local.a[0]=local.a[0]
+ randomint (200)
local.a[1]=local.a[1]
- randomint (200)
}
local.exp1=spawn "fx/scriptbazookaexplosion.tik"
local.exp2=spawn "animate/fx_mortar_dirt.tik"
local.exp3=spawn "animate/fx_mortar_higgins.tik"
local.exp1.origin=local.a
local.exp1 anim start
local.exp2.origin=local.a
local.exp2 anim start
local.exp3.origin=local.a
local.exp3 anim start
wait(1 + ((randomint(5))*.2))
local.exp1 remove
local.exp2 remove
local.exp3 remove
goto random_explode
end
Voila de quoi vous faire bombarder en solo comme en multi.
c/ Variantes.
Il se peut que vous soyez intéressé de faire exploser vos bombes dans un périmètre autour de votre joueur.
Rien de plus facile, au-debut du thread il suffit de changer la valeur de la variable local.target en ceci :
Local.target=$player
Vous pouvez faire la même chose avec n'importe quel objet,
mais aussi avec un script_origin qui n'apparait pas à l'écran.
La valeur étant le nom donné à l'objet.
Auteur Tropheus