Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Attaque d'un pj
Attaque d'un pj
Par Anianka le 31/8/2002 à 15:07:23 (#2067555)
Par miriandel le 31/8/2002 à 15:56:05 (#2067797)
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)
Par LeProctophantasmiste le 31/8/2002 à 17:15:12 (#2068133)
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)
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)
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)
le seul probleme c'est que mon getnearestcreatre a pas l'air de fonctionner ...
Par LeProctophantasmiste le 31/8/2002 à 18:54:47 (#2068733)
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)
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)
Par LeProctophantasmiste le 31/8/2002 à 20:05:59 (#2069184)
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