Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Le script qui remplace le OnHeartBeat
Le script qui remplace le OnHeartBeat
Par Azrael07 le 24/7/2002 à 15:35:45 (#1854289)
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)
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)
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)
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)
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)
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