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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Attaque d'un pj

Par Anianka le 31/8/2002 à 15:07:23 (#2067555)

J'essaie de forcer un pj a attaquer la cible la plus proche et qu'il n'ai plus la possibilité de controler son personnage pendant quelques temps, comment je peux scripter ca ?

Par miriandel le 31/8/2002 à 15:56:05 (#2067797)

AssignCommand(lePJ, ClearAllActions());
AssignCommand(lePJ, ActionAttack( GetObjectByTag( "leBrolAAttaquer" )));
SetCommandable(FALSE, lePJ);
DelayCommand(15.0f, SetCommandable(TRUE, lePJ));

En clair, tu annules toute action en cours du PJ, tu le forces à attaquer leBrolAAttaquer puis tu l'empêches d'utiliser son clavier, ce qui aura pour effet de l'empêcher de combattre je le crains.

:bouffon:

Par Kemay le 31/8/2002 à 16:04:01 (#2067840)

SetCommandable n'empêche pas d'utiliser le clavier, mais empêche la liste d'action d'être modifiée. A priori Il n'attaquerait donc qu'une fois. A mon avis faut plutôt regarder au niveau des effects Charm/Dominate.

Par LeProctophantasmiste le 31/8/2002 à 17:15:12 (#2068133)

quote]A priori Il n'attaquerait donc qu'une fois.
Je crois comprendre ce que tu veux dire, SetCommandable empècherais ActionAttack de se rappeler. Mais en fait ça marche, j'en ai fait l'expérience, en tout cas ça marchais jusqu'au 1.21, manifestement ActionAttack(), n'est pas codé par un appel récursif dans la queue.

Si ce n'est pas du tout ce que tu voulais dire, je veux bien une explication :).

note: pour ceux qui auraient lu le lexicon, contrairement à ce qui y est écrit, ActionAttack() engendre une série d'attaque jusqu'à la mort de la cible, c'est ce qui rend possible le fait d'avoir plusieurs attaques par round pour les PNJs je crois. A tester avec un PNJ dépouillé de tout ses scripts.


AssignCommand(lePJ, ClearAllActions());
AssignCommand(lePJ, ActionAttack( GetObjectByTag( "leBrolAAttaquer" )));
SetCommandable(FALSE, lePJ);
DelayCommand(15.0f, SetCommandable(TRUE, lePJ));

Je ne suis pas sûr, mais il est possible qu'il y ai un bug: SetCommandable(FALSE,lePJ); s'appliquerait avant ClearAllActions() et ActionAttack(). Il me semble me souvenir que AssignCommand retarde l'exécution à la fin du script. Il se peut que cela soit complètement faux, mais au cas où cela arriverait met le SetCommandable dans un AssignCommand et cela devrait marcher.

Si tu veux que le PJ soit efficasse, une simple attaque physique n'est peut être pas l'idéal pour un mage, par exemple. Tu pourrais essayer avec un truc comme ça à la place d'ActionAttack(), je n'ai aucune idée de ce que ce code donnerait, spécialement sur un PJ:


void RecursiveDetermineCombatRound(oTarget)
{
SetCommandable(TRUE, OBJECT_SELF);
ClearAllActions();
DetermineCombatRound(oTarget);// défini dans nw_i0_generic.nss
ActionDoCommand(RecursiveDetermineCombatRound(oTarget));
SetCommandable(FALSE,OBJECT_SELF);
}

Par Kemay le 31/8/2002 à 17:24:36 (#2068182)

Cool, jamais testé, et je pensais vraiment que ActionAttack() était récursive. AssignComand ne change rien à l'ordre d'exécution des fonction. Le plus simple c'est d'utiliser des ActionDoCommand pour s'assurer que le SetCommandable soit exécuté au bon moment.

Par LeProctophantasmiste le 31/8/2002 à 17:47:40 (#2068291)


AssignComand ne change rien à l'ordre d'exécution

Autant pour moi, je mentionnais ça parce que c'est le genre de bugs qui peuvent prendre un bon moment à comprendre selon le contexte. Je me demande si je n'ai pas fait un certain nombre de scripts avec cette idée dans la tête, va savoir où je l'ai pêchée, merci pour l'info.

Par LeProctophantasmiste le 31/8/2002 à 17:54:43 (#2068343)

Ah oui un complément si tu décide de tenter RecursiveDetermineCombatRound(oTarget),
quand tu veux arrêter l'attaque/redonner le contrôle au joueur execute (sur le pc):

SetCommandable(TRUE,oPC);
ClearAllActions();

ça arrêtera l'appel récursif.

Par Anianka le 31/8/2002 à 18:40:49 (#2068647)

de toute maniere c'est pour transformer un PJ en garou et lui faire attaquer la cible la plus proche jusqu'a la mort de celle ci puis passer à la nouvelle cible la plus proche ...

le seul probleme c'est que mon getnearestcreatre a pas l'air de fonctionner ...

Par LeProctophantasmiste le 31/8/2002 à 18:54:47 (#2068733)

Le script compile?
Si oui, c'est peut être les paramètres que tu as passé à GetNearestCreature qui font que tu ne trouve rien
Tu pourrais utiliser GetNearestSeenOrHeardEnemy() (défini dans nw_i0_generic).
Sinon post le script, on trouvera peut-être quelque chose.

Par Anianka le 31/8/2002 à 19:12:09 (#2068837)

object oTarget ;

oTarget = GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC);

puis plus loin

AssignCommand(oPC,ClearAllActions());
AssignCommand(oPC,ActionAttack(oTarget,FALSE));
SetCommandable(0, oPC);


et quand la cible est morte je veux faire repeter le script mais la ;.. plouf ca fait rien le garou reste immobile

Par miriandel le 31/8/2002 à 19:32:43 (#2068985)

Forcément, t'as oublié la quatrième ligne de mon script...

Par LeProctophantasmiste le 31/8/2002 à 20:05:59 (#2069184)

si tu veux que le PC fasse un carnage:
donne à tout les NPC sensés se faire massacrer le même tag, par exemple PAUV_VIEUX.

crèe un script, carnage.nss, contenant:


void main()
{
object oTarget = GetNearestObjectByTag("PAUV_VIEUX");
SetCommandable(TRUE,OBJECT_SELF);
if(!GetIsObjectValid(oTarget)) return;
ClearAllActions();// on ne sait jamais
ActionAttack(oTarget);
ActionDoCommand(ExecuteScript("carnage", OBJECT_SELF ));
SetCommandable(FALSE, OBJECT_SELF);
}

Quand tu veux que le carnage commence:

ExecuteScript("carnage",oPC);

JOL Archives 1.0.1
@ JOL / JeuxOnLine