Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Lancement d'un sort par un PNJ
Lancement d'un sort par un PNJ
Par judgeju le 4/7/2002 à 10:56:48 (#1755422)
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)
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)
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)
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)
En plus, la fonction SetLoncalInt marche sans passer par une variable intermédiaire...
Par ZeDuckMaster le 4/7/2002 à 13:08:00 (#1755990)
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)
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)
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)
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)
Par ZeDuckMaster le 4/7/2002 à 14:28:46 (#1756407)
allez les ptits mj de d&d3 une ptite definition ? :D
Par Kray le 4/7/2002 à 14:39:55 (#1756478)
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)
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)
Si quelqu'un trouve...
Par ZeDuckMaster le 4/7/2002 à 15:16:41 (#1756726)
Par Kray le 4/7/2002 à 15:44:11 (#1756914)
Si c'est pas un sort personnel, ca veut dire que c'est un sort de zone...void main()
Non?
{
object oNPC = OBJECT_SELF;
object oPC = GetPCSpeaker();
location lPC = GetLocation(oPC);
AssignCommand(oNPC,ActionCastSpellAtLocation(SPELL_BLESS,lPC,METAMAGIC_ANY,TRUE));
}
Par judgeju le 4/7/2002 à 16:14:25 (#1757073)
Par Gargantuel le 4/7/2002 à 16:17:09 (#1757100)
Ca sent le bug ...
Je regarde
Par ZeDuckMaster le 4/7/2002 à 16:20:45 (#1757119)
Par Kray le 4/7/2002 à 16:25:27 (#1757143)
//::///////////////////////////////////////////////
:doute:
//:: 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));
}
}
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)
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)
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)
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)
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