Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrĂ´le

Recherche | Retour aux forums

JOL Archives

Cours de Scripts pour les Quiches. Leçon Cinq.

Par Amaranthe le 10/7/2002 Ă  9:42:04 (#1784995)

Cours de Scripts pour les Quiches. Leçon Cinq.
Par Celowin mailto:james.foxglove@verizon.net
traduit par Amaranthe mailto:amaranthe@free.fr

Introduction
Le but de cette série de leçons, est d'apprendre a se servir des scripts a n'importe qui.

Maintenant vous commencez a en connaître un rayon sur les scripts, je pense que tous ceux qui ont suivi mes leçons jusqu’ici et qui arrivent a les mettre en pratique ne sont plus des quiches en programmation ;)
Il y a bien sur encore beaucoup de choses qui peuvent être dites, mais avec ce que vous avez appris jusqu'à présent vous êtes d’hors et déjà capables de faire de chouettes scripts.

Voici un exemple de script un peu plus compliqué. Il requiert un peu de travail et introduit de nouvelles commandes, mais je pense que le jeu en vaut la chandelle.

- Ouvrez le module de Test.
- Reprenez votre première « Area », on a assez travaillé avec ce garde.
- Virez moi ce chanteur.
- Mettez un « start point » a votre module.
- A l’autre bout de la zone, placez un npc, un « commoner » par exemple, en fait cela n’a que peu d’importance, on va changer pas mal de choses.
- Dans l’onglet « Basic » changez son nom en « Cible », son tag en « CIBLE », sa race en « Construct », son apparence en « Archery Target », son genre en « None » et son portrait en po_PLC_F01_ .
- Dans l’onglet « Advanced » cochez la case « Plot ».
- Allez dans l’éditeur de faction. Créez une nouvelle faction « Cible », dont la faction parente est « Hostile ». Mettez les Cible - Commoner et la Commoner - Cible a 50
- Changez la faction de notre cible en « Cible ».
- Dans l’onglet « Scripts », supprimez tous les scripts. Dans notre cas, nous ne voulons pas que notre cible se retourne contre son agresseur et l’attaque ;)
- Mettez le script suivant dans le « OnDamaged ».


// Script de « OnDamaged » : tm_cible_dm
// Script de Cible.
// Produit un "thunk" lorsqu’elle est touchée //
void main()
{
if (GetWeaponRanged(GetLastWeaponUsed(GetLastAttacker())))
{
SpeakString("**Thunk**");
}
}

- Vous pouvez d’hors et déjà tester votre cible, mais ce n’est pas le plus intéressant.
- Placez un « Waypoint » a environ un carré de votre cible.
- Donnez lui le tag « CibleWp001 ».
- Placez un autre npc commoner près de votre Waypoint.
- Changez son tag en « Tireur ».
- Laissez le soin au programme de choisir son nom au hasard.
- Dans l’onglet « Feats » ajoutez lui « Weapon Proficiency (simple) ».
- Dans l’onglet « Inventory », choisissez lui des « Darts ».
- Click droit sur les fléchettes que vous venez de lui ajoutez, changez la « Stack Size » a 3.
- Cliquez sur Ok et Ă©quipez le npc avec.
- Sortez de lÂ’inventaire en validant.
- Ouvrez l’onglet « Scripts ».
- Editez le script du « OnSpawn » et enlevez le commentaire devant le « OnHeartbeat ».
Il y a une autre ligne que nous allons décommenter, le :
SetSpawnInCondition (NW_FLAG_SET_WARNINGS);

- Ajoutez egalement une ligne au début :
SetLocalInt(OBJECT_SELF, "ETATCIBLE", 1);

- Allez dans le « UserDefined » et ajoutez le script suivant.

// Script « OnUserDefined »
// tm_flechette_ud
// Jeu de flechette
// Appelé par le OnHeartBeat script.
//
// Le joueur de fléchettes lance les dards de son inventaire ( 3 au départ )
// Va jusqu'à la cible. Récupère ses dards, revient et recommence.
//
void main()
{
int nAppelePar = GetUserDefinedEventNumber();
object oCible = GetNearestObjectByTag("CIBLE");
int nCiblePrete = GetLocalInt(OBJECT_SELF, "ETATCIBLE");
//
switch(nAppelePar)
{
case 1001: // Appelé par OnHeartbeat
//
// nCiblePrete est a 1 si la cible est prĂŞte.
//
if ((GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND)))
&& (nCiblePrete == 1))
{
// Si on a des dards dans la main droite et quÂ’on est prĂŞt a les lancer, alors faisons le.
ClearAllActions();
ActionAttack(oCible, TRUE);
}
else
{
// Sinon, soit nous n’avons plus de dards, soit nous sommes déjà en train d’aller les chercher.
if (nCiblePrete == 1)
{
SetLocalInt(OBJECT_SELF, "ETATCIBLE", 2);
ActionMoveToObject(oCible);
ActionWait(0.5);
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.0);
ActionWait(0.5);
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.0);
ActionWait(0.5);
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 1.0);
object oDestination=GetNearestObjectByTag("CIBLEWP001");
ActionMoveToObject(oDestination);
CreateItemOnObject("nw_wthdt001", OBJECT_SELF, 3);
ActionEquipMostDamagingRanged();
ActionDoCommand(SetLocalInt(OBJECT_SELF, "ETATCIBLE", 1));
}
}
break;
}
}


Voilà un script un petit peu plus compliqué…
Je ne vais pas le détailler, vous avez maintenant suffisamment d’expérience pour pouvoir comprendre par vous même, je vais quand même expliquer deux ou trois petites choses.

J’utilise la variable « ETATCIBLE » pour être sur que nous n’attaquons pas avant d’être prêt. Et que nous ne demandons pas plusieurs fois d’aller chercher les dards.

La commande ActionDoCommand est merveilleuse. Elle prend une commande et la place dans la file d’action. Normalement, dès que le script voir une commande SetLocalInt, il initialise la variable, dans ce cas, cela le force a attendre d’avoir fini tout ce qu’on lui a déjà demandé de faire.

La commande CreateItemOnObject est utilisée pour créer de nouvelles fléchettes. "nw_wthdt001" est le blueprint pour un dard, et le 3 est la taille du stack.

Voilà, je pense que vous pouvez comprendre le reste par vous même. Sinon, ne vous génez pas pour poser des questions…

EtÂ… un petit exercice pour vous maintenantÂ…

J’aimerai qu’un troisième npc annonce les scores ;=)

A vous de bosser un peuÂ…

Amaranthe.

Par adol le 11/7/2002 Ă  18:50:50 (#1792732)

merci, merci c'est toujours aussi bien :).

Par contre j'ai la flemme de faire le script du troisieme perso :Ăľ.

Par MTorment le 13/7/2002 Ă  19:06:41 (#1801238)

Merci Amaranthe pour tes cours, c très sympa et ils sont bien détaillés. Je les suis et les fais depuis le premier.:)
Tu dois te dire qu'après avoir suivi tes leçons, je devrais pouvoir me débrouiller seul, pourtant...
J'ai un problème pour cette leçon, mon tireur ne tire pas, il ne fait rien. J'ai fais les scripts moi-même puis du copier-coller, ça marche toujours pas. Je pense que je me suis trompé pour le OnSpawn :
- il faut bien décommenter SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT); ?
- il faut bien écrire SetLocalInt(OBJECT_SELF, "ETATCIBLE", 1); après le void man() ?

Voilà, c'est sûrement une erreur à la con que j'ai fait. ;)

Par Yushi Sham le 7/9/2002 Ă  17:18:27 (#2115148)

J'ai du faire la mĂŞme erreur parce qu'il ne fait rien non plus, sinon tout les autres marche parfait, merci bien pour ces script :)

Par Jaha Effect le 15/10/2002 Ă  15:07:52 (#2339779)

J'ai egalement un problème avec mon archer (j'ai un peu bidouillé pour qu'il tire des fleches plutot que des darts)

Mon NPC tire une premiere volée de 3 flèches.
Mais au lieu d'aller Ă  la cible, il reste sur place et marque une pause.
Puis tire à nouveau une volée de 3 flèches puis reste sans bouger.

Alors j'ai verifié mon waypoint en le deplaçant plus pres mais rien y fait

Pourais avoir des detailles please sur ce qui pourrais clocher :)

Jaha Effect :D

Par eMRaistlin le 15/10/2002 Ă  15:26:20 (#2339866)

Dans ce cas, je vous conseille d'utiliser ce type de commande pour verifier ou ca bloque :

void WriteTimestampedLogEntry(string sLogEntry);

En l'occurence, vu que le move semble ne pas marcher, il faut savoir que :

Description
The action subject will move to within fRange of oTarget. If there is no path to oTarget, the function will do nothing. The function call waits for the subject to reach oMoveTo before executing further actions in the action queue.
If an error occurs the log file will contain "ActionMoveToObject failed."


La derniere ligne dit que le log (petit journal d'execution du module) se remplira si l'Action ne s'effectue pas.

C'est ce qu'on appele du Debug. Je vous conseille d'en abuser, histoire de non seulement savoir ou le script ne fonctione pas, mais aussi comprendre comment le moteur d'execution fonctionne... ^^

Par Jaha Effect le 15/10/2002 Ă  17:14:54 (#2340541)

Provient du message de eMRaistlin
Dans ce cas, je vous conseille d'utiliser ce type de commande pour verifier ou ca bloque :

void WriteTimestampedLogEntry(string sLogEntry);

En l'occurence, vu que le move semble ne pas marcher, il faut savoir que :

La derniere ligne dit que le log (petit journal d'execution du module) se remplira si l'Action ne s'effectue pas.

C'est ce qu'on appele du Debug. Je vous conseille d'en abuser, histoire de non seulement savoir ou le script ne fonctione pas, mais aussi comprendre comment le moteur d'execution fonctionne... ^^


Mais je colle ça a la place de
void main()
ou apres? ou avant?

Merci tout de mĂŞme :)

Jaha Effect :D

Par Tyn' le 15/10/2002 Ă  18:28:20 (#2340990)

Coller

WriteTimestampedLogEntry("Mon blabla a printer dans le log");
DANS une fonction quelconque, main() ou autre.

Par Jaha Effect le 17/10/2002 Ă  16:16:42 (#2352348)

bon ben je vois vraiment pas pourquoi ça marche pas :(

MetaQuiche en deroute

Par MjDonald le 5/11/2002 Ă  14:26:52 (#2486002)

Salut,
Chez moi tout le début fonctionne, le lanceur de dards tire ses trois dards, va les chercher puis reste pres de la cible, tire ses dards (en général 2 sur trois a coté) puis finit de taper sur la cible à la main .
Ca m' ennerve, j'y ai passé deux heures hier soir, et soit je suis polio des doigts, soit je n' avais plus les yeux en face des trous, ou soit les deux, mais... Grrrrrr...:monstre:


Autre question : Je ne veux pas que l' on me donne la reponse mais est il possible, avec break, et/ou ClearAllActions, de demander au compteur de stopper le compte lorsque le tireur s' approche de la cible et de reprendre le compte losque le tireur est de nouveau (s'il y arrive un jour chez moi) pret Ă  tirer ?
Je désire juste une confirmation ou une infirmation .

Meci beaucoup de s' occuper des quiches en leurs faisant des tutoriaux (tres bien fait par ailleurs) . Cela ne fait que trois jours que j'ai commencé et plus ca va plus je nage mais je m'accroche et trouver des mains secourables sans avoir le travail prémaché, et donc sans saveur, c'est vraiment sympa!!!

Une quiche qui se sent un peu moins lorraine !

JOL Archives 1.0.1
@ JOL / JeuxOnLine