Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Script qui ne s'interrompt pas
Script qui ne s'interrompt pas
Par Cassin le 4/7/2002 à 15:04:56 (#1756630)
Pour que mon bûcheron bûcheronne au lieu de rester immobile comme un con, j'ai repris le script des recrues de l'Académie du Prélude de la campagne solo, ceux qui tapent sur les mannequins.
Hors de temps à autre (ça dépend, des fois ça marche des fois non), je ne plus parler au PNJ ! S'il interrompt bien son bûcheronnage, ça me marque tout le temps "this object is busy and cannot talk"...
Comment faire pour lui parler à coup sûr ?
Ou alors placer un trigger pour qu'il s'interrompe quand le joueur pénètre dedans, et le reprenne après ? Mais quelle commande utiliser ?
Par ZeDuckMaster le 4/7/2002 à 15:09:57 (#1756671)
et il se trouve dans quel evenement le script ?
Par Cassin le 4/7/2002 à 15:38:17 (#1756891)
En fait il y a 2 scripts :
- celui-ci dans OnPerception
void main()
{
if(GetIsPC(GetLastPerceived()))
{
SignalEvent(OBJECT_SELF,EventUserDefined(200));
}
}
- celui-là dans OnUserDefined
void main()
{
switch(GetUserDefinedEventNumber())
{
case 200:
{
if(!IsInConversation(OBJECT_SELF))
{
ActionAttack(GetNearestObjectByTag("InvisibleObject"));
DelayCommand(12.0,ClearAllActions());
DelayCommand(24.0,SignalEvent(OBJECT_SELF,EventUserDefined(200)));
}
else
{
DelayCommand(12.0,SignalEvent(OBJECT_SELF,EventUserDefined(200)));
}
}
}
}
On dirait on fait qu'il cesse de marcher correctement quand je fais des modifications d'autres scripts :doute:
Par ZeDuckMaster le 4/7/2002 à 16:17:14 (#1757101)
bon bin c'est un script sympa pour eviter le OnHeartBeat !
en fait quand ca percoit un joueur (quand celui-ci entre dans la zone visible du pnj) ca lance un UserEvent.
au declanchement de ce UserEvent ca lance l'attaque contre un objet invisible (qui doit etre le pantin ou l'arbre ;) ) pendant 12 secondes et ca relance un UserEvent (donc ca tourne en boucle) 24 secondes apres avoir effacer toutes les actions enregistrées...mais ca uniquement s'il est pas en discussion !
si il est en discussion, au bout de 12 sec ca relance un UserEvent , histoire de tester s'il est toujours en discussion et sinon il repart a l'attaque !
donc en modifiant faut avoir ca en tete, c'est qu'a chaque fois que t'arrives a portée du pnj, le script se declenche en boucle, sans s'arreter ...
une solution j'en vois pas d'evidente immediatement ....
Par Kray le 4/7/2002 à 16:37:48 (#1757218)
Sur OnEnter :void main()
Sur OnExit :
{
oPC = GetEnteringObject();
SetLocalInt(oPC,"InZone",1);
}void main()
{
oPC = GetExitingObject();
SetLocalInt(oPC,"InZone",0);
}
Et sur le PNJ dans OnUserDefined :void main()
:)
{
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC );
switch(GetUserDefinedEventNumber())
{
case 200:
{
if(!IsInConversation(OBJECT_SELF) && GetLocalInt(oPC,"InZone") == 0)
{
ActionAttack(GetNearestObjectByTag("InvisibleObject"));
DelayCommand(12.0,ClearAllActions());
DelayCommand(24.0,SignalEvent(OBJECT_SELF,EventUserDefined(200)));
}
else
{
DelayCommand(12.0,SignalEvent(OBJECT_SELF,EventUserDefined(200)));
}
}
}
}
Par ZeDuckMaster le 4/7/2002 à 19:35:20 (#1758124)
- tout d'abord mettre les scripts la ou ils vont le mieux, c'est a dire deplacer :
SignalEvent(OBJECT_SELF,EventUserDefined(200));
et le mettre dans le script lié a l'evenement OnSpawn (a la suite des autres fonctions y etant, ou creer un nouvo script) et enlever le script de l'evenement OnPerception.
pourquoi ? tout simplement pasque les gars de bioware z'ont pas pensé que lorsque le perso reste a coté du pnj, non seulement le script tourne en boucle une fois lancé mais se redeclenche a chaque tour de jeu (le pnj redetecte le joueur ....) donc ca fait quasiment 2 appels par tour ....
- ensuite virer ce qui peut se trouver dans OnCombatRoundEnd (en fait ya ptete pas tout a virer, mais j'ai pas encore regardé en detail ce qui posait probleme ;) ).
pourquoi ? tout simplement pasque le pnj (enfin chez moi) s'arrete apres avoir attaqué une fois, ce qui est pas tres realiste, et pendant ce temps on peut pas agir dessus ("this object is busy etc ....") et il est impossible de savoir quand est-ce qu'on peut lui parler .....
voila, maintenant quand le bucheron buche, tu peux pas le deranger (ca dure 12 sec, donc 2 attaques si je ne m'abuses), mais des qu'il arrete (encore pendant 12 sec), bin la tu peux lui parler et pendant le temps que tu veux si t'as un fichier de dialogue derriere ...
le seul truc c'est quon ne peut pas deranger le bucheron lorsqu'il buchonne, mais c'est bien connu qu'il ne faut pas deranger bucheron buchonnant :D
Par Cassin le 4/7/2002 à 21:06:57 (#1758480)
Oukejelémé ??? :D
Par Gargantuel le 4/7/2002 à 21:14:38 (#1758527)
object oPC;
en début de tes scripts de trigger et ca ira mieux :-)
Par Cassin le 4/7/2002 à 21:48:06 (#1758715)
Le bûcheron reste immobile à côté de son tronc et "n'attaque" pas le tronc d'arbre, que le joueur soit dans la zone ou pas !
Où est le blème ?
Par ZeDuckMaster le 4/7/2002 à 21:53:32 (#1758734)
.....hein ? .... bon d'accord je sort ..... :p
Par Kray le 4/7/2002 à 21:55:30 (#1758739)
Par Cassin le 4/7/2002 à 22:03:48 (#1758768)
DuckMaster : désolé mais j'aime bien l'idée du trigger, en plus c'est plus réaliste, le mec arrête de bosser quand on vient le voir ;)
Par Kray le 4/7/2002 à 22:15:19 (#1758809)
void main()
Faut pas l'oublier non plus... Sinon je sais pas et j'ai la flemme grave :p
{
if(GetIsPC(GetLastPerceived()))
{
SignalEvent(OBJECT_SELF,EventUserDefined(200));
}
}
Par Cassin le 4/7/2002 à 22:47:31 (#1758908)
MERCI !!!
script complet
Par Tyriael le 5/7/2002 à 23:04:44 (#1765132)
merci d'avance
Par Cassin le 8/7/2002 à 9:53:45 (#1775150)
Voilà les scripts :
Sur le Trigger :
- dans OnEnter :
void main()
{
object oPC;
oPC=GetEnteringObject();
SetLocalInt(oPC,"InZone",1);
}
- Dans OnExit :
void main()
{
object oPC;
oPC = GetExitingObject();
SetLocalInt(oPC,"InZone",0);
}
Sur le PNJ :
Dans OnPerception :
void main()
{
if(GetIsPC(GetLastPerceived()))
{
SignalEvent(OBJECT_SELF,EventUserDefined(200));
}
}
- Dans OnUserDefined :
void main()
{
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC );
switch(GetUserDefinedEventNumber())
{
case 200:
{
if(!IsInConversation(OBJECT_SELF) && GetLocalInt(oPC,"InZone") == 0)
{
ActionAttack(GetNearestObjectByTag("InvisibleObject"));
DelayCommand(12.0,ClearAllActions());
DelayCommand(24.0,SignalEvent(OBJECT_SELF,EventUserDefined(200)));
}
else
{
DelayCommand(12.0,SignalEvent(OBJECT_SELF,EventUserDefined(200)));
}
}
}
}
Voilà !
PS : quelqu'un pourrait indiquer comment mettre les scripts en PHP, avec les couleurs et pis tout plize ? ;)
EDIT : mais quel crétin je fais moi ! Bon, je remet tout ça dans le topic approprié ! ;)
Par Kray le 8/7/2002 à 9:55:34 (#1775156)
JOL Archives 1.0.1
@ JOL / JeuxOnLine