Aller au contenu


Enchaînement Trop Rapide De "Result Script"


  • Veuillez vous connecter pour répondre
12 réponses à ce sujet

#1 Wolpertinger

Wolpertinger

Posté 06 août 2010 - 22:14

Bonjour à tous, Wiwilandais !

Dans le cadre d'une quête sur un mod que je prépare, je dois faire en sorte que :

1) le pnj à qui le joueur vient de parler (ce qui a déclenché une quête) quitte le lieu jusqu'à une destination précise (j'utilise pour ça "AddScriptPackage"), jusque là ça marche.

2) le pnj, une fois arrivé à sa destination, est téléporté vers une cell inaccessible (fonction "MoveTo")

3) le pnj meurt dans la cell ("fonction kill")

Donc au départ j'utilisais ce résult script :

Citation


SetStage 1WeatherleahQuestOne 5
AddScriptPackage 1WeatherleahRufusAlamoTravel


Ensuite je me suis dis que s'il mourrait une fois arrivé à sa destination, je n'avais pas besoin d'utiliser MoveTo, le cadavre disparaîtrait au bout d'un moment, et de toute façon le PJ serait occupé dans la quête que je lui ai préparé.

J'ai donc utilisé ça :

Citation


SetStage 1WeatherleahQuestOne 5
AddScriptPackage 1WeatherleahRufusAlamoTravel
kill


C'est là qu'arrive le premier soucis : le pnj ne semble pas avoir pris en compte la deuxième ligne, et meurt directement sous les yeux ébahis du PJ qui vient d'obtenir sa petite quête. Vous comprendrez mon désarroi, d'aucun qu'à ce moment de la quête le pnj n'a aucune raison de mourir. Les crises cardiaques frapperaient-elles Tamriel ?
Enfin bref je souhaiterais que le pnj fasse d'abord son package "travel" avant de mourir, plutôt que de passer direct de la première ligne à la troisième ligne.

Quant à MoveTo, je ne dois pas maîtriser encore cette fonction, puisque le tescs m'assure que mes références vers le marker que j'ai choisi ne sont pas bonnes.

Merci d'avance à l'âme charitable qui pourra m'apporter la lumière ^^
~ Procrastinator ! ~

#2 Shadow she-wolf

Shadow she-wolf

    Le katana de la GBT


Posté 06 août 2010 - 22:41

Coucou,


Le problème est que le contenu du Result Script est exécuté sur une unique frame (les mêmes que dans "FPS" à peu-près), le jeu ne va donc pas du tout attendre la fin d'un quelconque package pour tuer le PNJ. A vrai dire, tu lui a demandé d'ajouter un package et de l'éxecuter, ce que le jeu fait bel et bien.
AddScriptPackage n'attend pas la fin du dit package pour passer à l'instruction suivante, ce serait très problématique si c'était le cas en fait...

Il faut donc utiliser un script externe pour se débarasser du PNJ, les résult script n'étant que purement éventementiels ne sont pas du tout adaptés à cette situation.

Il faut donc, via un script externe (les scripts de quêtes semblent les plus adaptés), attendre que le PNJ soit arrivé à destination, avant de le tuer.

Citation

Ensuite je me suis dis que s'il mourrait une fois arrivé à sa destination, je n'avais pas besoin d'utiliser MoveTo, le cadavre disparaîtrait au bout d'un moment, et de toute façon le PJ serait occupé dans la quête que je lui ai préparé.
A titre personnel, je trouve que tu présupose beaucoup de choses sur le comportement du joueur. :P
Si le joueur décide de faire une pause dans la quête pour une raison X ou Y et va se balader...il risque de tomber sur le cadavre du donneur de quête...et donc se poser des questions.
Il faut savoir qu'un cadavre ne disparait qu'après 3 (ou 5 je ne sais plus) jours en jeu, ce qui laisse une bonne marge.

#3 Wolpertinger

Wolpertinger

Posté 06 août 2010 - 23:17

Tu as raison, le joueur n'est pas forcé d'enchaîner tout de suite ^^ Par contre j'ignorais que les cadavres mettaient tant de temps à disparaître.

En ce qui concerne les scripts de quête, c'est la solution pour laquelle j'avais initialement porté mon choix (sur tes conseils d'ailleurs :huhu:) le soucis c'est que systématiquement le tesc me dit qu'il y a un soucis au niveau des références alors que quand j'utilise les mêmes pour des packages il ne bronche pas...

Voilà ce que je pourrais avoir l'idée d'écrire comme script, compte tenu de la situation :
(j'ai donc mis MoveTo dans une cell inutilisée puis kill)

http://s2.noelshack....-91fbf61953.bmp

Mais voilà ce qu'il me répond (j'ai essayé différentes combinaisons mais il est intraitable ce méchant) :

http://s2.noelshack....-1976ea2549.bmp

Alors bien sûr je me doute qu'il y a une raison mais je ne trouve pas, parce que mes références sont pas moins explicites que d'habitude.
~ Procrastinator ! ~

#4 Shadow she-wolf

Shadow she-wolf

    Le katana de la GBT


Posté 07 août 2010 - 08:23

Alors...plusieurs choses.

Déjà, il faut revoir toute la synataxe du script.
On place la référence appelante avant la fonction appelée, les deux étant liées par un point, comme ceci:
1WeatherleahRufusAlamo.MoveTo zClothesTest
1WeatherleahRufusAlamo.Kill

Tout ce qui se situe après la fonction est ce que l'on nomme des arguments. MoveTo a un argument obligatoire, l'objet où est téléporté la référence appellante (que tu as donc renseigné), et a plusieurs arguments optionnel, qui sont les axe X, Y, Z par rapport à l'objet où est téléporté la référence appellante. (que tu n'as pas renseigné, mais c'est inutile ici)
Kill n'a pas d'argument par contre.


Ensuite, comme tu as fait ton script...
Un script est une boucle, et le jeu lit les instructions de haut en bas.
C'est à dire, que dès le début du jeu, il va lire et exécuter chaque ligne les unes après les autres, et dès qu'il est arrivé en bas, il recommencer la lecture/execution en haut.
Pour éviter une exécution, on utiliser les confitions if/elseif/else comme tu l'as fait, mais une condition fausse empêche de lire ce qui se situe entre le if/elseif/else et le endif ou le elseif/else suivant.

Donc en l'état, ton script va faire ceci:
On déplace Rufus Alamo
on le tue
On regarde si le stage truc a été réalisé:
-Si oui, on ne fait rien
-Si non, ou après le "on ne fait rien", on reboucle le script et on recommence.

Il faut donc changer le script comme ceci:

Begin GameMode

if GetStageDone 1WeatherleahQuestOne 10 == 1
   1WeatherleahRufusAlamo.MoveTo zClothesTest
   1WeatherleahRufusAlamo.Kill
endif

End
Comme cela, le script va faire ceci:
On regarde si le stage truc a été réalisé:
-Si oui, on déplace Rufus Alamo puis on le tue
-Si non, ou après le "on déplace Rufus Alamo puis on le tue", on reboucle le script et on recommence.

Là, ça fonctionnera, mais deux choses:
-Le script, à chaque frame (un script est éxécuté en une frame) fera que le jeu déplacera et tuera Rufus dès que le stage 10 et de la quête 1WeatherleahQuestOne sera terminée.
-C'est lourd et inutile.

Comme c'est quelque chose qui se passe une unique fois, juste après la réalisation d'un stage, il vaut mieux utiliser le script result du fameux stage 10 de la quête 1WeatherleahQuestOne. Là encore le script result est évenmentiel et ne s'éxécute qu'une unique fois, c'est comme cela pour la totalité des scripts résults.
Ce qui permet d'éviter deux instructions et un test inutiles par frame.
Il n'y a que deux façons d'optimiser réellement les scripts:
-Utiliser le plus de scripts évenmentiels possible (donc les script Result, mais aussi certains blocs comme le OnLoad, le OnActivate à la place des blocs non-eventmentiels comme GameMode, MenuMode et cetera).
-Utiliser le moins de variable possible. (ça c'est pareil en programmation pure)




Sinon, tout autre chose:
Quand on met en ligne des images, il vaut mieux utiliser autre chose que du .bmp
Ce format est un format dit non-compressé, c'est à dire qu'il prend beaucoup de place, mais qu'il n'y a pas de perte de qualité.
Les .jpg ou les .png sont compressé, c'est à dire qu'ils sont bien plus léger, mais il y a une légère perte de qualité, étant plus léger, ils sont bien plus adaptés pour être mits en ligne sur internet. (moins long à téléverser pour toi et moins long à télécharger pour nous)


Et dans le cas des scripts, on préfère copier/coller les scripts dans la balise code, comme j'ai fait, ça permet des manipulations plus simples. :)

#5 Wolpertinger

Wolpertinger

Posté 07 août 2010 - 10:59

Bien, je vais tâcher de bien intégrer tout ce que tu as dit, merci encore de ton aide.

Une dernière chose :

Je me suis donc rabattu sur le script result du Stage 10 de ma quête.

J'ai essayé d'abord avec les deux lignes seules, puis avec les "if" comme dans ta seconde citation, et dans les deux cas je retombe dans un problème précédent :

Citation


Script '1WeatherleahQuestOneStage100', line 4 :
Script command "1WeatherleahRufusAlamo.MoveTo" no found


Et si je décide d'ignorer sa requête il me sauvegarde pas le script.
~ Procrastinator ! ~

#6 Shadow she-wolf

Shadow she-wolf

    Le katana de la GBT


Posté 07 août 2010 - 11:11

Okay, il ne faut pas oubleir de s'occuper des références persistantes (voir ici), sinon c'est sur qu'il n'y arrivera pas.

Mais les if ne servent à rien dans le script result. ;)

Désolée de la réponse lapidaire, mais je m'en vais en vacances là, donc à la revoyure. :)

#7 Wolpertinger

Wolpertinger

Posté 07 août 2010 - 15:04

J'ai mis la référence persistante (enfin je crois que c'est ça au vu de ton lien)

Cela donne :

Citation


RufusAlamo01.MoveTo AnvilmarkTest
RufusAlamo01.Kill


Cela ne fonctionne toujours pas. Pire encore, le tescs me dit que ce n'est pas une référence persistante et que je ne peux donc pas la mettre dans le script.

Si quelqu'un peut m'aider...
~ Procrastinator ! ~

#8 Kanet

Kanet

Posté 07 août 2010 - 21:07

Coucou Wolpertinger !

Est -ce que tu as attribué une référence à ton marker ?

Je m'explique, enfin j'essaye... Voilà, tu dois placer ton marker dans la cell de la fenetre de rendu, puis lui donner une référence dans la fenetre Reference qui s'ouvre quand tu double clic sur ton marker.

Attention ne change pas l'ID du marker, mais ajoutes seulement une réference.

les scripts ont besoin des références des objets . Dans ton script ça donne : RufusAlamo01.Moveto AnvilmarkTest.Ref

Si ta "persistent reference " n'est pas un marker, mais un autre objet, tu coches la case persistent reference de cet objet et comme pour les markers, tu rentres une référence dans la fenetre de cet objet.

Je ne sais pas si je suis bien claire... Mais j'espère que cela t'aidera !
"  Les Dieux se rient des prières des rois comme de celles des bouviers "  

#9 Wolpertinger

Wolpertinger

Posté 07 août 2010 - 23:17

D'abord, merci de t'être intéressé à mon problème ^^

Je dois vraiment être pas doué, car je galère. Je suis allé dans la cell où se trouvait le marker, et dans référence j'ai mis "MarkRufusAlamo01".
Cela donne :

Citation

RufusAlamo01.MoveTo AnvilMarkTest.MarkRufusAlamo01

Le Tescs m'affiche alors deux avertissements quand je veux valider.

1)

Citation

Script '1WeatherleahQuestOneStage100', line 1
Syntax Error. Reference not allowed in this context.

Si je me fis à mon vocabulaire anglophone, le tescs me dit que je n'ai pas l'autorisation de mettre une référence, alors qu'il me l'a réclamait un peu plus tôt ><

2)

Citation

Script '1WeatherleahQuestOneStage100', line 1
Missing Parameter ObjectReferenceID
Compiled script not saved !

Et là si je comprends bien il lui manque une référence, alors qu'il vient de dire qu'elle n'était pas permise.

Enfin bref... Mon niveau ridicule en script ne me permet pas de régler ce problème.

PS: Si je n'ai pas fait comme tu me l'as indiqué Kanet, n'hésite pas à me le faire remarquer. Pourtant j'ai bien été mettre une référence à ce marker.

Modifié par Wolpertinger, 07 août 2010 - 23:18.

~ Procrastinator ! ~

#10 Kanet

Kanet

Posté 08 août 2010 - 00:42

Qu'est-ce que tu as mis en "persistent reference" dans ta cellule ? Un Xmarker ou un objet?

Mes explications étaient tellement claires que je m'aperçois que je t'ai dit des aneries... Excuses-moi, je suis fatiguée... Bon je reprends tout :

Si tu dois déplacer un personnage dans une cellule quelconque, il faut que tu places un Xmarker dans cette cellule.
Les XMarker sont dans la liste des Static du TESC, tout à fait à la fin.

C'est à l'emplacement de ce marker que ton perso sera téléporté.

Ensuite tu double clic sur le Xmarker que tu as posé dans ta cellule. Dans la fenetre qui s'ouvre, en haut tu as : reference editor ID
Là tu tapes (Par exemple ) :RufusAlamo01Marker

Et tu sauvegardes.

Ton perso doit avoir une réference aussi : Tu double clic sur lui là où tu l'as placé et tu tapes dans Ref : RufusAlamo01Ref

Ensuite dans ton script : RufusAlamo01Ref. Moveto RufusAlamo01Marker


Cela devrait etre pris par le script. N'oublie pas "Ref"dans RufusAlamo01Ref

Et ne te décourage pas, hein !


Edit : Excuses-moi pour ce message sans espaces, je n'arrive pas à en faire, je ne sais pas ce qui se passe... Ah ça y est, ça marche !

Modifié par Kanet, 08 août 2010 - 11:12.

"  Les Dieux se rient des prières des rois comme de celles des bouviers "  

#11 Wolpertinger

Wolpertinger

Posté 08 août 2010 - 11:51

Ça fonctionne !!! Allez ça mérite une petite danse :yahoo:

Non plus sérieusement, merci beaucoup pour ton aide rapide et efficace. En suivant ton post c'est la première fois que j'ai fait quelque chose d'aussi vite et facilement sur le tescs depuis que j'ai commencé à apprendre ^^

On a beau dire, qu'est-ce que c'est plaisant l'informatique quand ça fonctionne du premier coup :cool2:

Merci encore Kanet ! L'aventure continue...
~ Procrastinator ! ~

#12 beeratwork

beeratwork

Posté 09 août 2010 - 07:10

J'ai d'abord lu le début, puis j'ai entamé le pavé et je ne pense pas que vous avez essayer ceci :

La ligne de dialogue doit être cochée "goodbye" de sorte que lorsque le joueur à parler, le PNJ stoppe la conversation. Dans le result script, tu fait un
RefPNJ.AddScriptPackage VoyageAnvil
RefPNJ.EvaluatePackage
SetStage MaQuete 35
(35 c'est pour l'exemple) Tu n'est pas obligé de créer une entrée journal pour ce stage là. Tu veux que le joueur voie le PNJ sortir de la pièce et qu'il PNJ meure dans la cellule à Anvil. Ca veut dire que sur le trajet il doit être immortel, sinon si le joueur le suit et qu'il y a des bandits il pourrait mourrir, ou bien qu'on le téléporte une fois hors de vue du joueur, donc dans le bloc game mode de ta quête, tu fais :
if (GetStage MaQuete == 35)
 RefPNJ.SetEssential 1
 if (RefPNJ.GetInSameCell player == 0)
  RefPNJ.MoveTo RefXMarker
 endif
 if (RefPNJ.GetInCell CellAnvilQueTuVeux == 1)
  RefPNJ.SetEssential 0
  RefPNJ.Kill
  SetStage MaQuete 40
 endif
endif
De la sorte la quête vérifiera en permanence si le PNJ arrive à destination ou si le joueur ne le suit pas. Enfin, si ton PNJ est dans une maison, il sera téléporté directement et tué tout de suite après.
Le "SetStage MaQuete 40" permet de passer à la suite de la quête.

Mais je ne suis pas sûr que les ref persistente sont vraiment détruite sinon mon bouilleur d'enfant ne réapparaîtrai pas après 3 mois...

Il est plus probable que le joueur, en allant dans la cell, tombe sur un cadavre. Si tu veux qu'il disparaisse, le mieux est de le téléporter dans une cellule vide une fois hors de la vue du joueur



#13 Wolpertinger

Wolpertinger

Posté 09 août 2010 - 12:00

Je vais essayer ta solution dès que possible, ça pourrait être pas mal en effet. Merci de ton passage :huhu:
~ Procrastinator ! ~




0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)