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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Lancement d'un sort par un PNJ

Par judgeju le 4/7/2002 à 10:56:48 (#1755422)

Bonjour, je voudrai qu'un PNJ prêtre lance un sort de bless sur un PJ suite à une phrase de conversation. J'ai mis le script suivant dans Action Taken de la phrase, mais le sort ne part pas???
Je dois avoir fait une erreur :), mais où??

void main()
{
// Set the variables
SetLocalInt(GetPCSpeaker(), "nHenrySpeak", 1);
AssignCommand(OBJECT_SELF,ActionCastSpellAtObject (SPELL_BLESS,GetPCSpeaker(),,TRUE));
AdjustReputation (GetPCSpeaker(),OBJECT_SELF,20);
}

Par Kray le 4/7/2002 à 11:01:16 (#1755453)

Tu ne donnes pas de cible à ton sort.

void main()
{
// Set the variables
object oPC = GetPCSpeaker();
SetLocalInt(oPC, "nHenrySpeak", 1);
ActionCastSpellAtObject( SPELL_BLESS , oPC,METAMAGIC_ANY,TRUE);
AdjustReputation (oPC,OBJECT_SELF,20);
}

Par Xune Vrinn le 4/7/2002 à 11:04:01 (#1755477)

Allez, je tente de corriger et je suis sûr que DuckeyMaster se fera un plaisir de passer derrière. ;)


void main()
{

// récupération de l'objet qui parle avec le NPC.
object oSpellTarget = GetPCSpeaker();

// lancement du sort sur la cible
AssignCommand(OBJECT_SELF, ActionCastSpellAtObject(SPELL_BLESS, oSpellTarget, ,TRUE));

// ajustement de la réputation de la cible
AdjustReputation (oSpellTarget, OBJECT_SELF, 20);

// on crée une variable locale de Type Integer nomée nHenrySpeak qu'on flag à 1 pour indiquer que le sort a déjà été lancé sur cette personne
SetLocalInt(oSpellTarget, "nHenrySpeak", 1);
}


Edit :

1) Plus d'informations sur ActionCastSPellAtObject sur http://nx.squid.org/reference.html?keywords=ActionCastSpellAtObject
2) Pareil que le canard, on a été doublés par un Kray

Par ZeDuckMaster le 4/7/2002 à 11:05:39 (#1755494)

commence deja par creer une variable temporaire dans laquelle tu met le joueur :
object oPC = GetPCSpeaker();
ca evitera de rappeller 3 fois la fonction GetPCSpeaker, tu y gagnera en temps d'execution, meme si c'est imperceptible ;)

ensuite essaye peut etre de mettre tous les parametres de ActionCastSpellAtObject, meme si ceux -ci sont defini par defaut .....

et puis essaye aussi de mettre OBJECT_SELF dans une variable au lieu de l'utiliser tel quel :
object oNPC = OBJECT_SELF;
moi ca m'a debloqué un script sur des pancartes, pkoi ? j'en sais rien :(

EDIT : arf, là j'ai été un peu long a degainer :D

Par judgeju le 4/7/2002 à 12:49:13 (#1755904)

je vais essayer. Ce que je suis pas, c'est pquoi on peut pas directement utiliser GetPCSpeaker et qu'on doive passer par une variable.
En plus, la fonction SetLoncalInt marche sans passer par une variable intermédiaire...

Par ZeDuckMaster le 4/7/2002 à 13:08:00 (#1755990)

c'est pas que tu peux pas, c'est tout a fait correct d'utiliser la fonction telle quelle.
mais bon alors on va parler un peu plus prog, histoire que tu vois pourquoi il est plus judicieux d'utiliser une variable temporaire plutot que d'appeler 3 fois la meme fonction.

la fonction represente du code a executer, donc plusieurs intructions a faire afin d'arriver au resultat (la qui est de recupere le dernier perso qui est impliqué dans la conversation).
une variable c'est un emplacement memoire, donc quand on l'appelle la valeur est retournée instantannement (ou presque :D )

donc d'un point de vue temps d'execution c'est achement plus rapide d'utiliser une variable qu'une fonction (surtout si la fonction est complexe !)

donc quand t'as besoin de la valeur retournée d'une fonction plusieurs fois, dans plusieurs cas, evites toujours de rappeler cette fonction, stockes son resultat dans une variable temporaire et reutilise cette variable.
bien evidemment si cette fonction n'est appellée qu'une seule fois, ca ne sert a rien de stocker dans une variable, on peut l'utiliser tel quel.

voila :)

Par judgeju le 4/7/2002 à 13:12:22 (#1756010)

Merci pour les explications... Bon, çà marche en passant par des variables, sauf que...
Ben le PJ subit pas les effets du sort (aucun icône d'effet n'apparaît)... Par contre les PNJs autour si. Alors ben, là, je comprend pas...
Donc, si vous pouviez encore m'aider :).

Par ZeDuckMaster le 4/7/2002 à 13:22:41 (#1756055)

t'as essayé avec un autre type de sort, genre attaque par ex ? ;)
sinon essaie aussi GetLastSpeaker() au lieu de GetPCSpeaker()
et aussi tu peux poster tout ton script histoire de voir ;)

Par judgeju le 4/7/2002 à 13:58:39 (#1756264)

Voilà le script. J'ai testé avec un Barkskin et çà marche. Par contre BLESS passe pas. Je pensais que c'était parce que le PJ était pas allié du PNJ. Mais même en modifiant la rep via un adjustreputation juste avant de lancer le sort çà marche pas. J'ai aussi tenté en setupant la faction à 100 pour les PJs, çà n'a pas marché non plus. Donc, je cale... Si quelqu'un a une idée, ou sait comment obtenir le même effet qu'un sort de BLESS sans passé par les sort, ben je le remercie bien d'avance. :)

void main()
{
// Set the variables
object oPC = GetPCSpeaker();
object oNPC = OBJECT_SELF;
SetLocalInt(oPC, "nHenrySpeak", 1);
AdjustReputation (oPC,oNPC,50);
AssignCommand(oNPC,ActionCastSpellAtObject(SPELL_BLESS,oPC,METAMAGIC_ANY,TRUE));
AdjustReputation (oPC,oNPC,-30);
}

Par judgeju le 4/7/2002 à 14:09:07 (#1756315)

Bizarre, mon post précédent a pas fait monter le thread... Voir ci dessus.

Par ZeDuckMaster le 4/7/2002 à 14:28:46 (#1756407)

la par contre ca vient ptetre de specificités du sort bless .... il faudrait des experts de d) !

allez les ptits mj de d&d3 une ptite definition ? :D

Par Kray le 4/7/2002 à 14:39:55 (#1756478)

Bénédiction
Enchantement (coercition) [mental]
Niveau: Pal 1, Prê 1
Composantes: V, G, FD
Temps d'incantation: 1 action
Portée: 15m
Zone d'effet: Tous les alliés se trouvant à moins de 15m
Durée: 1 minute/niveau
Jet de sauvegarde: Aucun
Résistance à la magie: Oui (inoffensif)
Ce sort procure un regain de courage aux alliés du personnage, ce qui se traduit par un bonus de moral de +1, tant aux jets d'attaque qu'aux jets de sauvegarde contre la terreur.
Bénédiction contre et dissipe imprécationC'est pas un sort personnel :).

Par ZeDuckMaster le 4/7/2002 à 15:06:40 (#1756642)

bien joué Kray !
elle vient de la l'erreur !
faut que tu lances le sort sur le pnj pas sur le perso
donc en gros :
AssignCommand(oNPC,ActionCastSpellAtObject(SPELL_BLESS,oNPC,METAMAGIC_ANY,TRUE));

et la ca devrait marcher (enfin j'esperes :D )

Par judgeju le 4/7/2002 à 15:11:09 (#1756681)

Toujours pas... Cà me saoule... Même en mettant la faction à 100 en relation avec les PJS çà marche pas. Par contre çà marche sur les PNJs nickel. Même si ils sont pas de la même faction, si ils ont leur relation à 100, çà marche.
Si quelqu'un trouve...

Par ZeDuckMaster le 4/7/2002 à 15:16:41 (#1756726)

bon bin si personne n'a repondu d'ici la, j'essayerais chez moi ce soir ...

Par Kray le 4/7/2002 à 15:44:11 (#1756914)

:doute:

Si c'est pas un sort personnel, ca veut dire que c'est un sort de zone...

void main()
{
object oNPC = OBJECT_SELF;
object oPC = GetPCSpeaker();
location lPC = GetLocation(oPC);
AssignCommand(oNPC,ActionCastSpellAtLocation(SPELL_BLESS,lPC,METAMAGIC_ANY,TRUE));
}
Non?

Par judgeju le 4/7/2002 à 16:14:25 (#1757073)

En fait, le truc c'est que le sort se lance, on a l'animation et tout et tout, les PNJs alliés (relations 100) sont affectés, mais mon PJ (dans la zone d'effet du sort) ne l'est pas...

Par Gargantuel le 4/7/2002 à 16:17:09 (#1757100)

Ca ne marche pas non plus chez moi.
Ca sent le bug ...
Je regarde

Par ZeDuckMaster le 4/7/2002 à 16:20:45 (#1757119)

Je ne penses pas (mais je peux me tromper ;) ) que ActionCastSpellAtLocation soit fait pour lancer des sorts de zones, mais plutot pour lancer des sorts quand une cible (un objet) n'est pas definie et donc plutot lancer un sort a un endroit....

Par Kray le 4/7/2002 à 16:25:27 (#1757143)

//::///////////////////////////////////////////////
//:: Bless
//:: NW_S0_Bless.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
All allies within 30ft of the caster gain a
+1 attack bonus and a +1 save bonus vs fear
effects
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: July 24, 2001
//:://////////////////////////////////////////////
//:: VFX Pass By: Preston W, On: June 20, 2001
#include "NW_I0_SPELLS"

void main()
{
//Declare major variables
object oTarget;
effect eVis = EffectVisualEffect(VFX_IMP_HEAD_HOLY);
effect eImpact = EffectVisualEffect(VFX_FNF_LOS_HOLY_30);
effect eAttack = EffectAttackIncrease(1);
effect eSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, 1, SAVING_THROW_TYPE_FEAR);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink = EffectLinkEffects(eAttack, eSave);
eLink = EffectLinkEffects(eLink, eDur);
int nDuration = 1 + GetCasterLevel(OBJECT_SELF);
int nMetaMagic = GetMetaMagicFeat();
float fDelay;
//Metamagic duration check
if (nMetaMagic == METAMAGIC_EXTEND)
{
nDuration = nDuration *2; //Duration is +100%
}

//Apply Impact
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation());

//Get the first target in the radius around the caster
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF));
while(GetIsObjectValid(oTarget))
{
if(GetIsReactionTypeFriendly(oTarget) || GetFactionEqual(oTarget))
{
fDelay = GetRandomDelay(0.4, 1.1);
//Fire spell cast at event for target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_BLESS, FALSE));
//Apply VFX impact and bonus effects
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(nDuration)));
}
//Get the next target in the specified area around the caster
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF));
}
}
:doute:

Y'a que deux tests... GetIsReactionTypeFriendly OU GetFactionEqual...

Je vois pas où est le problème. P'tet un bug dans NW_I0_SPELLS...

Par Gargantuel le 4/7/2002 à 16:25:31 (#1757144)

Bon j'ai trouvé :

Tu mets le casteur dans une faction à 100% allié avec les PC

Et tu lances le sort sur le casteur lui-meme :


object oNPC;
int nSpell;
oNPC = OBJECT_SELF;
nSpell = SPELL_BLESS;
ActionCastSpellAtObject(nSpell,oNPC,METAMAGIC_ANY,TRUE);


Ton joueur sera forcement dans la zone et donc affecté !
J'ai testé ca marche chez moi

EDIT: c'est plus joli en mode PHP :)

Par judgeju le 4/7/2002 à 17:02:06 (#1757375)

Je sais où est le problème...
En fait, je veux pas que la relation de la faction soit à 100.
Elle commence en fait à 50.
Donc je faisais adjustreputation +50 (pour monter à 100 et pour que le sort marche), puis le sort, puis un adjustreputation -30 (pour un bonus net de +20).
Or, si j'ai bien compris, le lancement du sort prend du temps et pendant ce temps les deux actions adjustreputation s'activent et je me retrouve avec un 70 lorsque l'effet du sort est appliqué. Donc marche pas puisque besoin d'être allié (rep entre 90 et 100).
Même en mettant le paramètre instantSpell à TRUE, çà ne fonctionne pas... Cà m'ennuie un peu vu que j'ai créé pas mal de faction et beaucoup joué sur les interactions entre chacune, donc que çà m'embête de partir avec un 100 en relation sur une faction...

Par ZeDuckMaster le 4/7/2002 à 18:45:50 (#1757875)

bon je viens de tester dans tous les sens (avec des ActionWait, des tests d'affichage, etc ...), j'ai pas trouvé comment retablir la reputation apres avoir lancé le sort

donc je ne vois qu'une seul solution :
tu te sert du script donné par kray et tu te fais ta propre chtite fonction qui lance un sort bless, mais sans les verifications de reputations ;)

Par turk182 le 5/7/2002 à 11:31:17 (#1761497)

g vu qu'il existait une console dans le jeu
peut etre peut on lancer un custom script diretcement depuis la console
un script qui changerait la faction du joueur :)

JOL Archives 1.0.1
@ JOL / JeuxOnLine