Aller au contenu


Un Matelas Récalcitrant


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

#1 john doe

john doe

Posté 31 juillet 2013 - 16:55

Bonjour à tous les wiwilandais !
voici un message d'erreur qui survient au démarrage de MW :

Local count for script "X_matelas_flottant" differs from local
count for saved reference data .

Quelqu'un peut-il m'en dire un peu plus là-dessus ?

#2 Kira

Kira

    Top-modeleuse...


Posté 31 juillet 2013 - 17:03

Coucou, John Doe...
En l'état actuel des choses, il va être un peu malaisé de te donner une réponse rapide, ce script n'appartenant pas au jeu et aux extensions de base... Mais, en général, ce n'est pas un message alarmant et il suffit de continuer en cliquant sur "yes" ou "yes for all" pour que le jeu se lance sans souci...

Pourrais-tu indiquer, dans ton profil, la liste de tes mods?... Ça facilitera grandement la recherche...
Tout n'est qu'illusion... Surtout le fait de le penser.....
Image IPB
(Wiwi d'or de la plus serviable et de la plus cool... Merci à vous tous...)

#3 john doe

john doe

Posté 31 juillet 2013 - 17:29

c'est un mod que je suis en train de réaliser ... à la maison .
Je pense que le script associé à l'objet en cause ne fonctionne pas ; alors je te le livre pour me
dire si ,au moins ,il est correct :
begin X_matelas_flottant
short DoOnce
short actived
float timer
if (OnActivate == 1)
   set actived to 1
endif
if (activated == 1)
   if (DoOnce == 0)
      set timer to (timer + GetSecondsPassed )
      if ( timer < 5 )
         "cache_trappe"->Move x 10
      else
         set DoOnce to 1
         set activated to 0
      endif
   endif
endif
End

#4 Kira

Kira

    Top-modeleuse...


Posté 31 juillet 2013 - 18:17

Coucou, John Doe...
Effectivement, si le script vient d'un mod en cours dans ton Tescs, je ne risquais pas de le trouver...

Si j'ai bien compris ton script, il sert, quand on active un objet, à faire glisser une plaque dissimulant un passage, et à la laisser ensuite ouverte, non?...
Dans ce cas, je pense que tu peux simplifier un peu en mettant quelque chose de ce genre...

begin x_matelas_flottant

short DoOnce
Float timer
if ( MenuMode ==1 )		 ;afin d'éviter que le script ne se poursuive pendant l'ouverture d'un inventaire...
	  return
endif
if ( OnActivate == 1 )
   if ( DoOnce == 0 )
	   Set timer to ( timer + SetSecondsPassed )
		   Set DoOnce to 1
   endif
endif
while ( timer < 5 )
		 "cache_trappe"->Move, x, 10   ; Tant que le timer n'atteint pas 5, la plaque bouge...
enwhile

end

Dans l'état actuel de ton script, tu risques de rencontrer quelques soucis avec ta variable "actived" qui ne sert pas vraiment à grand-chose...
De plus, tu as, je pense, fait une petite coquille en la nommant "activated" dans un des tests... Là, le script risque de ne pas comprendre ce que tu veux...
Tout n'est qu'illusion... Surtout le fait de le penser.....
Image IPB
(Wiwi d'or de la plus serviable et de la plus cool... Merci à vous tous...)

#5 john doe

john doe

Posté 31 juillet 2013 - 18:39

Merci kira !
je vais essayé comme ça .
Je voudrais néanmoins avoir un éclaicissement : lorsque l'on déplace un objet pendant plusieurs secondes
le script boucle sur lui même mais alors quel état prend la fonction OnActivate ?
Puisque le joueur relâche la barre d'espace ,la valeur repasse-t-elle à 0 ?
Habitué à la programmation "classique" ,j'avoue être complètement perturbé par ces scripts qui
bouclent en permanence !?

#6 Kira

Kira

    Top-modeleuse...


Posté 31 juillet 2013 - 18:56

La fonction "OnActivate" renvoie une valeur de 0 si l'obje est inactivé, et de 1 s'il est activé...
Donc, il faut qu'elle ait une action qui lui soit directement attachée dans la même frame, et une interruption immédiatement après...
En effet, le joueur peut exercer sur la barre d'espace soit un appui bref, soit un long, et il ne faut pas que ça puisse influer sur le résultat du script...

C'est donc le but de cette partie...
if ( OnActivate == 1 )
   if ( DoOnce == 0 )
		   Set timer to ( timer + SetSecondsPassed )
				   Set DoOnce to 1
   endif
endif

Si tu appuies sur la barre d'espace, le "OnActivate", initialement à 0 passe à 1.. Le DoOnce, initialement à 0 indique que c'est la première fois que tu actives l'objet, donc le timer se déclenche, puis le DoOnce passe immédiatement à 1, ce qui bloque le test "if ( DoOnce == 0 ) qui est désormais faux, et interdit de facto un deuxième démarrage du timer afin de le laisser se dérouler sans interférence...

A présent, le script se résume à la boucle "while--->endwhile qui se répètera tant que le timer n'a pas atteint 5 secondes...

Donc, pour résumer, après avoir activé une fois l'objet déclencheur, tu pourras ré-appuyer dessus autant que tu veux, ça ne fera plus rien...
Tout n'est qu'illusion... Surtout le fait de le penser.....
Image IPB
(Wiwi d'or de la plus serviable et de la plus cool... Merci à vous tous...)

#7 john doe

john doe

Posté 31 juillet 2013 - 22:09

Je vois ,c'est clair maintenant. Pour en revenir à mon petit problème ,le script a complètement foiré à
tel point que MW ne veut plus démarrer !? Je pense n'avoir plus d'autre choix que la réinstallation .
Pas grave  ... mais je suis certain que ce problème de référence n'était pas anodin.

#8 Kira

Kira

    Top-modeleuse...


Posté 31 juillet 2013 - 23:23

Je suis désolée d'apprendre ça, John Doe...

Avant de tout réinstaller, as-tu essayé de démarrer une nouvelle partie?... Il se peut que ton souci vienne du fait que tu aies fait une sauvegarde en cours de test de ton mod, et la sauvegarde ne marchera plus si tu modifies quelque chose après...

Il ne faut jamais sauvegarder sur un mod en cours....
Tout n'est qu'illusion... Surtout le fait de le penser.....
Image IPB
(Wiwi d'or de la plus serviable et de la plus cool... Merci à vous tous...)

#9 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 01 août 2013 - 09:28

En fait, le script de Kira ne marche pas car le "Set timer to ( timer + SetSecondsPassed )" ne s'exécute qu'une fois à cause du doonce alors qu'il doit s'exécuter à chaque frame tant que le timer < 5
Voici un script que j'utilise pour avoir une cloison coulissante :
begin kbase_s_dnicloison_xm
short monetat
short moveon
float timer
if ( moveon == 0 )
if ( onactivate == 1 )
  set timer to 0
  set moveon to 1
endif
else
set timer to timer + getsecondspassed
if ( timer < 3 )
  if ( monetat == 0 )
   moveworld x -45
  else
   moveworld x 45
  endif
else
  if ( monetat == 0 )
   set monetat to 1
   set moveon to 0
  else
   set monetat to 0
   set moveon to 0
   ;setatstart
  endif
endif
endif
end

Le script est sur l'objet même qui coulisse et permet de le remettre à sa place si on le réactive mais ça donne l'idée pour gérer ton matelas.
moveon permet de savoir si la cloison est en mouvement (1) ou pas (0) et monetat indique si elle est en position ouverte (1) ou fermée (0) sachant qu'elle est initialement fermée.

L'abus de SMS est dangereux pour l'élocution mentale

Le mod qui révèle (presque) tout sur les dwemers : Dwarmor

Fervent Partisan de l'Instabilité Avatarienne
Quart du quarteron des VGM...


#10 Kira

Kira

    Top-modeleuse...


Posté 01 août 2013 - 10:35

En effet, Korfandar, tu as raison...
Le dernier script avec timer que j'ai utilisé remonte à mes mannequins magiques, il faudrait que je révise mes classiques plus souvent...

Le voilà, mais c'est un script pour un rideau ouvrable et refermable...
Spoiler

Mais, pour finir, je dois avouer que, plutôt que les timers, je préfère utiliser les coordonnées pour déplacer un objet, surtout si c'est un mouvement qui doit se répéter; ayant remarqué des soucis de décalage avec les timers, à la longue...

Pour le contrôle par coordonnées, ça donne plutôt ça...

Spoiler

Là, le timer ne sert qu'à marquer le temps d'arrêt pendant lequel on peut sauter sur la plateforme de l'ascenseur, mais le mouvement en lui-même ne se fait que par la vérification des coordonnées de l'objet...
Tout n'est qu'illusion... Surtout le fait de le penser.....
Image IPB
(Wiwi d'or de la plus serviable et de la plus cool... Merci à vous tous...)

#11 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 01 août 2013 - 11:08

Juste pour discussion générale autour des objets en mouvements :
Le problème de ton script par coordonnées est qu'il est lié à l'emplacement précis de l'objet en mouvement, mes cloisons sont des objets génériques que je peux mettre n'importe où (en fait il y a 4 cloisons selon l'axe de mouvement voulu (x ou y) et le sens d'ouverture (positif ou négatif)). Mais pour le problème de john doe, vu qu'il s'agit d'un objet précis, pas de problème.
Le problème de décalage existe aussi avec ton script de coordonnées pour une exécution dans un sens donné, tu ne peux jamais savoir exactement la position exacte en bout de course, ton script compense cela sur un cycle aller-retour, ce qu'on peut faire dans mon script timer en décommentant le setatstart.

Pour le problème de john doe, vu qu'il n'y a qu'un aller sur un objet précis, les solutions se valent.

begin X_matelas_flottant
short moveon
float timer
if ( moveon == 2 ) ; si lit ouvert, plus rien à faire
return
endif
if ( moveon == 0 )
if ( onactivate == 1 )
	set timer to 0
	set moveon to 1
endif
else
set timer to timer + getsecondspassed
if ( timer < 5 )
	 "cache_trappe"->Move x 10
else
	 set moveon to 2
   endif
endif
end

L'abus de SMS est dangereux pour l'élocution mentale

Le mod qui révèle (presque) tout sur les dwemers : Dwarmor

Fervent Partisan de l'Instabilité Avatarienne
Quart du quarteron des VGM...


#12 john doe

john doe

Posté 01 août 2013 - 13:32

Merci à tous.
Une question cependant : la boucle while bloque-t-elle l'exécution d'autres scripts ?
Pour faire simple ,les scripts sont-ils exécutés par des threads séparés ou de façon synchrone
l'un après l'autre ?

#13 Kira

Kira

    Top-modeleuse...


Posté 01 août 2013 - 13:44

Coucou, John Doe, et désolée d'avoir un peu digressé...

Plusieurs scripts locaux peuvent s’exécuter simultanément dans la même cellule sans interférer...
La seule chose, c'est que si tu passe un certain nombre de scripts exécutés en parallèle, ton framerate finira par en souffrir...
Après, en ce qui concerne le nombre maximum, il n'y a pas de règle exacte, mais on peut dire qu'il vaut mieux éviter de mettre plus de dix scripts en boucle dans une cellule si on veut être clément avec toutes les configurations...
Tout n'est qu'illusion... Surtout le fait de le penser.....
Image IPB
(Wiwi d'or de la plus serviable et de la plus cool... Merci à vous tous...)

#14 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 01 août 2013 - 14:35

Je crois que l'exécution est bien séquentielle en réalité. Le jeu maintient une liste (sous une forme ou une autre) des scripts à exécuter chaque frame et les exécute les uns après les autres (de manière indépendante chacun par contre).
Donc pour répondre à ta question John Doe, oui le while du script de Kira aura une incidence puisqu'il tourne à l'infini DANS UNE MEME FRAME amenant le jeu à systématiquement planter à mon avis. En fait de manière générale, pour les scripts Morrowind, on n'utilise quasiment jamais les boucles puisqu'il y a en permanence la "boucle infinie de l'exécution chaque frame".

L'abus de SMS est dangereux pour l'élocution mentale

Le mod qui révèle (presque) tout sur les dwemers : Dwarmor

Fervent Partisan de l'Instabilité Avatarienne
Quart du quarteron des VGM...





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

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