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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Script qui ne s'interrompt pas

Par Cassin le 4/7/2002 à 15:04:56 (#1756630)

J'ai encore un problème ;)

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)

tu peux toujours essayer de poster le script (s'il est pas trop long).
et il se trouve dans quel evenement le script ?

Par Cassin le 4/7/2002 à 15:38:17 (#1756891)

Arf, oui en effet ça serais mieux... Je suis très fatigué en ce moment moi... ;)

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)

alors voila ce que j'en dit :
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)

Pour un trigger.

Sur OnEnter :

void main()
{
oPC = GetEnteringObject();
SetLocalInt(oPC,"InZone",1);
}
Sur OnExit :
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)

bon alors voila comment faire :

- 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)

Kray : y'a un petit problème avec les scripts du trigger, il me met le message d'erreur "ERROR: VARIABLE DEFINED WITHOUT TYPE", et je ne vois pas du tout où placer ces fichues paranthèses !

Oukejelémé ??? :D

Par Gargantuel le 4/7/2002 à 21:14:38 (#1758527)

Rajoutes la ligne


object oPC;


en début de tes scripts de trigger et ca ira mieux :-)

Par Cassin le 4/7/2002 à 21:48:06 (#1758715)

C'est bon, les scripts sont passés, mais... ça marche pas ! :doute:

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)

juste pour dire que ma methode a moa, elle marche :D

.....hein ? .... bon d'accord je sort ..... :p

Par Kray le 4/7/2002 à 21:55:30 (#1758739)

Tu as bien placé un objet invisible au tag InvisibleObject sur/sous/dans/justeàcoté du tronc? ;)

Par Cassin le 4/7/2002 à 22:03:48 (#1758768)

Ben oui, elle est juste devant son pif (mais peut-être que parce que c'est invisible il le voit pas... :D Hum, désolé... ;) ), j'ai même orienté la flèche (option apparemment apparue avec le dernier patch) dans sa direction, mais rien, niet, nada, il bouge pas... :(

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)

OnPerception :

void main()
{
if(GetIsPC(GetLastPerceived()))
{
SignalEvent(OBJECT_SELF,EventUserDefined(200));
}
}
Faut pas l'oublier non plus... Sinon je sais pas et j'ai la flemme grave :p

Par Cassin le 4/7/2002 à 22:47:31 (#1758908)

OK, ça marche !


MERCI !!!

script complet

Par Tyriael le 5/7/2002 à 23:04:44 (#1765132)

Serait il possible que quelqu'un recopie a la suite le script complet , se qu'il faut faire pour l'utiliser (pnj) , sa fonction et ou le mettre
merci d'avance

Par Cassin le 8/7/2002 à 9:53:45 (#1775150)

Un peu en retard, mais mieux vaut tard que jamais... :D

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)

[PHP][/PHP] ;)

JOL Archives 1.0.1
@ JOL / JeuxOnLine