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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Le script qui remplace le OnHeartBeat

Par Azrael07 le 24/7/2002 à 15:35:45 (#1854289)

Voila donc pour tout commentaire ou suggestion pour le script qui ce trouve ici, c sur ce post plutot que directement la bas.

Si qlq veux bien le tester pour moi pasque moi je pourrais pas avant la fin des vacances :sanglote: :sanglote: :sanglote:

Par tonton le grognon le 24/7/2002 à 16:00:23 (#1854442)

je veux pas etre contrariant, mais le onheartbeat d'origine bosse quasiment a l'archi ralenti voir pas du tout quand il n'y a pas de PC dans la zone (ce qui pose d'ailleur le probleme, des npc passant d'une zone ou des PJ sont present, vers une une zone il n'y en a pas, provoquant un "gel" du NPC dont le script se bloque, en attendant qu'un PC entre dans la zone...)

bref ...meme si c'est un beau boulot.. je suis pas convaincu de l'utilité

Par Azrael07 le 24/7/2002 à 16:11:04 (#1854506)

ARRRRRRRRHHHHHHHHHHHHH ca fait combien de temp que je bosse la dessus................
Non ca va ca m'a pas pris bcp de temp
Tu dit que ca sert a rien, ma fois je veus bien te croire, mais j'entend tout le temp sur le forum Le OnHeartBeat ca bouffe des ressources il faut pas l'utiliser, et c clair, evidemment ce script ne doit pas etre utilisé pour TOUT les cas dans ce genre. G pensé a se truc quand on voudrait utilisé le OnHeartBeat a la masse, c vrai que c quand meme vachement utile le OHB.
Bon ben g plus qu'a trouver ot'chose si ca ca sert a rien...

:eureka: Je vais reconfigurer nwn pour en faire un demineur:bouffon: :bouffon: :bouffon:

Bon ok j'arrete la et je retourne me coucher:)

Par tonton le grognon le 24/7/2002 à 19:28:34 (#1855579)

Le OnHeartBeat ca bouffe des ressources


oui...effectivement....quand les pcs sont dans l' AREA ou il y a des npc qui fonctionnent avec des scripts (ou n'importe quoi d'ailleur) sur le onhearbeat... on parle meme pas des trucs qui sont hors zones... sinon nwn marcherait facon paraplegique....

ton script seraient utilse s'il optimisait le OHB...quand il sert :)... c'est a dire quand les PC sont la :D

OnheartBeat, le pourquoi de son exisance

Par Kemay le 25/7/2002 à 3:00:12 (#1857368)

Comme Azrael07, j'avais cherché à faire un script pour remplacer onHeartBeat, à la différence près que je ne me basais pas sur l'event onEnter de l'area mais sur l'event onPerception des NPC.

Bref là n'est pas vraiment la question, après moultes versions infructueuses, j'ai finalement compris que le principal problème à toute volonté d'émuler le HeartBeat c'est que l'on cherche à faire un loop dont la condition ne se vérifie qu'après qu'une action soit (ou série d'actions) soient effectuées.

ar exemple : tant que le joueur est dans le champ de vision du NPC "Bob" va du point A au point B puis du point B au point A. On aurait tendance à écrire cela dans le onPerception de Bob:

void main()
{
object oWPA = GetWaypointByTag("A");
object oWPB = GetWaypointByTag("B");
//Definir oPC comme etant l'objet qui fait se lancer le script
object oPC = GetLastPerceived();
//Distance partir de laquelle le joueur peut voir le NPC (valeur au pif juste pour l'exemple)
float fVisible = 1.0;
//Distance de perception du NPC (valeur au pif juste pour l'exemple)
float fPerception = 10.0;
//Tant que oPC est un joueur et est dans le champ de vision du NPC
while ( GetIsPC(oPC) && GetDistanceBetween(OBJECT_SELF,oPC) < fPerception )
{
if (!GetIsInCombat() && IsInConversation(OBJECT_SELF) == FALSE
&& GetLocalInt(OBJECT_SELF,"EstOccupe")==0 && GetDistanceBetween(OBJECT_SELF,oPC) < fVisible)
{
SetLocalInt(OBJECT_SELF,"EstOccupe",1);
ActionMoveToObject(oWPB);
ActionMoveToObject(oWPA);
ActionDoCommand(SetLocalInt(OBJECT_SELF,"EstOccupe",0));
}
//Definir oPC comme la joueur le plus proche du NPC
oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);
}
//Si PC le plus proche n'a pas le NPC dans son champ de vision
//Arreter tout
ClearAllActions();
}


Ce script ne marche pas, il renvoie l'erreur: Too many instructions
Ce problème vient du système de "double queue" de Neverwinter Nights. Toutes les actions sont mises dans l "action queue" et le reste dans la "command queue". C'est à dire que le programme passe à la ligne suivante du script non pas après avoir effectuer l'action mais après avoir ajouté l'action dans "l'action queue". Cela fait une différence énorme, pour exécuter une action, le NPC peut prendre une dizaines de secondes ou plus, mais pour exécuter une commande du style GetNearestCreature, le programme prend quoi ? une nanoseconde ? moins ? de toute façon on n'arrive pas à imaginer ce que c'est. En gros avant même que le NPC n'ai commencé son déplacement, le programme a deja tourné dans la boucle plusieurs milliers (millions ? plus ?) de fois ... Too many instructions Tu m'étonnes ;)

En fait il faudrait pouvoir lui dire de ne redéfinir oPC et vérifier le loop que lorsque le reste du loop a été effectué mais hélas (à ma connaissance) ce n'est pas possible. Toutes les fonctions qui retourne une variable (GetQuelquechose en gros) vont dans la "command queue" et il n'est pas possible d'utiliser ActionDoCommand sur une fonction qui retourne quelquechose.

Bref, sans passer par le onHeartBeat, pas d'action en boucle un nombre potentiel illimité de fois (c'est certainement pour cette raisons d'ailleurs qu'ils ont créé un event qui se lance indéfiniment sans aucun déclencheur).

Pour plus d'info sur le système "double queue" vous pouvez jeter un oeil ici

[EDIT]mmmmh je viens de repenser aux fonctions récursives et il y a peut être quelquechose à faire. C'est difficile à tester maintenant mais peut être qu'au lieu d'ecrire un while loop, rappeler le script lui même par un ActionDoCommand(ExecuteScript) ça marcherait. Essaierai ça plus tard, marre du heartbeat pour aujourd'hui :p [/EDIT]

Par Azrael07 le 26/7/2002 à 10:34:27 (#1861563)

Le système de queue je connais c vachement fréquent en programation.

Mais en fait je vois pas pourquoi il s'applique à ton script :confus:

Puisque tu initialise une variable EstOccupe qui ne laisse passer le code que si le npc ne fait rien. Je remet pas en question les raisons de ton plantage, mais si t'y comprend mieux que moi je voudrait bien que tu m'explique où je me plante...

A ce que je sache, seules les lignes

ActionMoveToObject(oWPB);
ActionMoveToObject(oWPA);
ActionDoCommand(SetLocalInt(OBJECT_SELF,"EstOccupe",0));

sont considérée cme des actions, et donc placées dans la queue
:confus:

Ou alors c moi qui suis vraiment un gros blaireau :confus: :confus:

Par Kemay le 26/7/2002 à 16:56:52 (#1863858)

Le problème ne vient pas du moment où tu définis la condition mais du moment où elle est vérifiée. Relis bien le script, la variable utilisée n'empêche que l'exécution des actions du personnage pas l'exécution de la boucle, c'est à dire que même si rien n'est rajouté à "l'action queue" la boucle est quand même vérifier quelquechose comme 1million de fois la secondes pendant tout le temps où le PC reste dans l'aire définie.... Et ça c'est pas cool.. ;)

Pour que ça marche, il faudrait pouvoir redéfinir oPC après que la les actions du NPC soient effectuées et non pas comme c'est le cas en réalité après que la liste d'actions à effectuer ait été ajoutée à "l'action queue" (avec quelquechose du style oPC = ActionDoCommand(GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC)); )ce qui n'est possible puisque seule une fonction qui ne retourne rien peut être ajoutée à l'action queue)

JOL Archives 1.0.1
@ JOL / JeuxOnLine