Aller au contenu


[résolu] Baisser Des Lampes


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

#1 Orann

Orann

    Nérévarine de Pertevue


Posté 29 juin 2009 - 17:14

J'ai un script qui fonctionne imparfaitement:

begin A_P_lamp_palais_gouv
; merci a3jv
  
  short jour
  
  if ( jour == 0 )
	 if ( GameHour >= 8 )
		if ( GameHour < 20 )
		   disable
		   set jour to 1
		endif
	 endif
  endif
  
  if ( jour == 1 )
	 if ( GameHour < 8 )
		enable
		set jour to 0
	 elseif ( GameHour >= 20 )
		enable
		set jour to 0
	 endif
  endif
  
  end

Ce script active ou désactive des lampes qui diffusent du noir pendant la nuit uniquement dans des cells intérieures. Le problème c'est que le disable fonctionne mal avec les npcs: sur ces derniers, la lumière négative se diffuse même quand la lampe est disable et que la lumière sombre n'est plus dans la pièce.

La solution, que j'ai déjà expérimentée, est de baisser les lampes (de 2000 unités au moins). Il suffit à la place du "disable" de mettre "move z -2000" pour descendre et "move z 2000" pour remonter le jour venu.

J'en arrive à la difficulté: il arrive que cette instruction ne fonctionne pas (quand on change de cell alors que le jour est devenu nuit, ou l'inverse) et je pense que le souci vient du fait que le "move" doit impérativement s'exécuter une fois et une seule... Je pense que parfois, à cause de fluctuation aléatoire du framerate, soit l'instruction ne s'éxécute pas complètement (la lampe baisse moins de 2000), soit il s'exécute trop (la lampe baisse plus de 2000), et du coup ça dérègle tout. Résultat, il fait nuit en plein jour et vice-versa...

J'aurai besoin de votre aide pour améliorer ce script, je supose, en établissant un système de contrôle pour que la lampe descende bien une seule fois de 2000 et remonte pareil.

Je précise, parce qu'il faut compliquer un peu, que je suis morro seul, et donc impossible d'utiliser setpos avec des variables... :mrgreen:

Merci beaucoup aux courageux!

Modifié par Orann, 02 juillet 2009 - 08:47.

Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#2 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 29 juin 2009 - 17:54

Peut-être que ceci conviendrait :
begin A_P_lamp_palais_gouv
; merci a3jv

short jour
short doonce
float maposz
float initz
float initz2

if ( doonce == 0 )
	set initz to getpos z
	set initz2 to initz - 2000
	set doonce to 1
endif

if ( jour == 0 )
	if ( GameHour >= 8 )
	   if ( GameHour < 20 )
		  set maposz to getposz
	  if ( maposz > initz2 )
		moveworld, z, -2000
	  else
			  set jour to 1
	  endif
	   endif
	endif
endif

if ( jour == 1 )
	if ( GameHour < 8 )
		  set maposz to getposz
	  if ( maposz < initz )
		moveworld, z, 2000
	  else
			  set jour to 0
	  endif
	elseif ( GameHour >= 20 )
		  set maposz to getposz
	  if ( maposz < initz )
		moveworld, z, 2000
	  else
			  set jour to 0
	  endif
	endif
endif

end
Le problème est qu'avec une telle vitesse la lampe pourrait en un frame dépasser la position de référence, ce n'est pas grave en descente, plus en remontée... peut être nécessaire d'avoir un mécanisme correctif plus lent de redescente si la position devient trop supérieure à initz genre :
if ( jour == 1 )
	if ( GameHour < 8 )
		  set maposz to getposz
	  if ( maposz < initz )
		moveworld, z, 2000
	  elseif ( maposz > initz + 50 )
		moveworld, z, -50
else
			  set jour to 0
	  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...


#3 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 29 juin 2009 - 18:55

Les objets de type light sont réinitialisés à leur position éditeur au chargement d'une partie.

#4 Kira

Kira

    Top-modeleuse...


Posté 29 juin 2009 - 19:50

Bonjour Orann....

Ne serait-il pas possible de créer une globale avec un script simple qui la fasse passer de 0 à 1 suivant le jour ou la nuit, et d'utiliser cette globale pour faire monter ou descendre ta lampe?...
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 Orann

Orann

    Nérévarine de Pertevue


Posté 29 juin 2009 - 20:18

Merci Korfandar, je vais tester ça dès que possible! :mrgreen:

@Kira: je pensais éventuellement à une solution de ce genre...

Nerwal dit :

Les objets de type light sont réinitialisés à leur position éditeur au chargement d'une partie.

L'utilisation d'un script globale pourrait alors détecter le chargement de la partie et en utilisant une variable globale contourner ce souci ?
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#6 elendell

elendell

    Mécano Dell'Arte


Posté 29 juin 2009 - 23:27

Bonjour,

Une variante du script de Korfandar serait d'utiliser "SetAtStart" pour replacer la lumière noire à sa position de départ :

begin A_P_lamp_palais_gouv
; merci a3jv

short doonce
float maposz
float initz
float initz2

if ( doonce == 0 )
	set initz to getpos z
	set initz2 to initz - 2000
	set doonce to 1
endif

set maposz to GetPos z

if ( GameHour >= 20 )
	if ( maposz != initz )
		SetAtStart
	endif
elseif ( GameHour < 8 )
	if ( maposz != initz )
		SetAtStart
	endif
else
	if ( maposz > initz2 )
		moveworld, z, -2000
	endif
endif

end

J'ai aussi enlevé la variable "jour" parce que je n'ai pas compris son utilité mais on peut bien sûr la replacer.
Il n'y a pas besoin de se préoccuper du rechargement de sauvegarde avec ce script mais si besoin, lis ce sujet, Orann.

#7 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 29 juin 2009 - 23:52

Citation

Les objets de type light sont réinitialisés à leur position éditeur au chargement d'une partie.

Sauf si on fait la sav dans la cellule contenant les lampes.

Dans ce cas, il suffit de savoir si le joueur est sorti de la cell:


Voici un script pour qu'un interrupteur allume toutes les lampes de la pièce ( des lumières négatives dans le cas d'Orann )

begin "GDI_switch_light_script"

;Quand activé, allume toutes les lumières switchables de la pièce

short used
short state;0=off 1=on
short framcounter

if ( cellchanged == 1 ); on règle ici le problème de la sav hors cell
if ( state == 0 )
	set GDI_switchlight to -1
elseif ( state == 1 )
	set GDI_switchlight to 1
endif
endif

If ( OnActivate == 1 )
if ( used == 0 )
playsound "Menu Click"
	set used to 1
if ( state == 0 )
	set GDI_switchlight to 1
elseif ( state == 1 )
	set GDI_switchlight to -1
endif
endif
endif


if ( GDI_switchlight == 1 )
set state to 1
elseif ( GDI_switchlight == -1 )
set state to 0
endif

if ( used == 1 )
if ( framcounter < 2 )
set framcounter to ( framcounter + 1 )
else
set used to 0
set framcounter to 0
set GDI_switchlight to 0
endif
endif

end

Voici le script des lumières: ( notez que j'utilise enable/disable au lieu de move.)

begin "GDI_light01_switch_off_script"

dontsaveobject


if ( GDI_switchlight == 1 )
disable
elseif ( GDI_switchlight == -1 )
enable


endif


end

Je n'ai constaté aucun problème avec les npc ou créatures jusqu'à présent.

Modifié par Von Zeeple, 29 juin 2009 - 23:52.

Le Steampunk, c'est bon, mangez en  !

#8 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 30 juin 2009 - 00:21

Citation

if ( cellchanged == 1 )

Malheureusement, CellChanged ne détecte pas tous les changements de cell.

#9 Orann

Orann

    Nérévarine de Pertevue


Posté 30 juin 2009 - 07:15

J'ai testé les deux solutions proposées par Korfandar et Elendell... Et elles souffrent toutes les deux du même souci.

ce qui fonctionne:

- alternance jour / nuit quand on reste dans la cellule
- choix du jour ou de la nuit quand on rentre pour la première fois dans la cellule
- apparition du jour tout le temps (même si c'était la nuit la dernière fois qu'on est passé dans la cell)

ce qui ne fonctionne pas ou qui fonctionne mal:

- l'arrivée de la nuit quand on était passé dans la cell pour la dernière fois le jour. Mon test est le suivant: j'entre le jour, je sors, j'avance l'heure jusqu'à la nuit, je rentre une première fois = il fait toujours jour. Je sors, je rentre immédiatement = il fait maintenant bien nuit...

Les deux scripts ont ce comportement.

Je n'ai pas testé le chargement de sauvegarde.

Merci pour votre aide précieuse!
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#10 elendell

elendell

    Mécano Dell'Arte


Posté 30 juin 2009 - 23:02

Voir le messageOrann, le 30.06.2009 à 08:14, dit :

ce qui ne fonctionne pas ou qui fonctionne mal:

- l'arrivée de la nuit quand on était passé dans la cell pour la dernière fois le jour. Mon test est le suivant: j'entre le jour, je sors, j'avance l'heure jusqu'à la nuit, je rentre une première fois = il fait toujours jour. Je sors, je rentre immédiatement = il fait maintenant bien nuit...
Voila qui est très curieux. Non seulement je n'en comprends pas la raison pour l'instant mais je viens de faire plusieurs fois exactement le même test que toi avec ma variante, dans deux cellules différentes et ça fonctionne parfaitement. J'ai essayé avec la Goty mais aussi avec Morrowind seul.

Comme je ne doute pas de ce que tu dis, il faut réfléchir à ce qui peut être différent dans nos tests respectifs :

- La lumière en question. Pour ma part, j'ai essayé avec une torche (non noire). Mais il y a peut-être quelque chose dans les caractéristiques de tes lumières qui en serait la cause. Essaye avec un autre objet pour voir comment ça réagit.
- La cellule. J'ai fait mes essais en entrant et sortant des cellules par une porte et par COC. Ça fonctionne dans les deux cas et quelques soient les changements d'heure que j'effectue dans l'autre cellule. Mais je n'ai pas essayé en passant d'une cell intérieure à une autre intérieure. Je n'ai pas essayé non plus avec des cellule "faux extérieurs". Essaye de placer une lumière "scriptée" dans une intérieure normale de Morrowind. Par exemple le Bureau des taxes.
- Les coordonnées initiales des lumières. Je ne vois pas pourquoi ça changerait quelque chose mais sait-on jamais.

Essaye aussi de placer des MessageBox avec des boutons "OK" pour voir ce qui se passe à chaque étape de la frame quand tu entres dans la cellule (que tu avais quittée le jour), après avoir fait la nuit quand tu étais dans l'autre.

#11 Orann

Orann

    Nérévarine de Pertevue


Posté 01 juillet 2009 - 08:34

Je vais faire les tests que tu préconises... Mes lampes sont des marqueurs, on ne les vois pas en jeu. Le problème vient peut-être de là...
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#12 Kafou

Kafou

    Le canari a bouffé le rominet !


Posté 01 juillet 2009 - 08:43

Edit : OK j'avais pas lu la petite phrase à la fin du premier post :)

Par contre, je pense qu'une grande partie du problème vient des tests sur la variable "jour", dont j'ai du mal à saisir l'intérêt comme elendell. Le script de ce dernier m'a l'air bien.

----------

Salut !

Déjà, je vois pas trop l'intérêt d'utiliser Move/Moveworld, qui est très aléatoire comme commande (puisque dépendante du framerate), alors qu'on a SetPos à disposition et qui positionne exactement et immédiatement là où tu le demandes.

Ensuite pour le problème des chargements de sauvegarde et de cellule, tout devient très simple, plus besoin de supposer la position de l'objet et de mettre plein de tests pour s'assurer qu'elle est bien celle supposée, puisqu'on positionne toujours l'objet dans l'absolu :

begin

float z
float z2
short init

if( init == 0 )
; position d'origine
  set z to ( getpos z )
; position "disable"
  set z2 to ( z - 2000 )
  set init to 1
endif

if ( GameHour >= 8 )
  if ( GameHour < 20 )
	setpos z z2
	return
  endif
endif

setpos z z

end

Et si vous contrairement à moi vous aimez les if intrusifs partout pour la soi-disante "optimisation" de script :) vous pouvez tester getpos z et comparer avec la valeur voulue avant de faire le setpos. Sauf qu'a priori, tester getpos est aussi sinon plus coûteux que d'exécuter setpos.

En espérant ne pas être trop à côté de la plaque genre setpos qui marcherait pas sur les lampes...
You look like you need a monkey!

Attention : perfectionniste paresseux.

#13 Korfandar

Korfandar

    Ch'ti dragon normand...dans son trou


Posté 01 juillet 2009 - 08:52

Parce que comme l'a dit Orann dans son premier post, setpos ne fonctionne pas avec des variables sur Morrowind seul...

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


#14 Kafou

Kafou

    Le canari a bouffé le rominet !


Posté 01 juillet 2009 - 09:05

Wiwi, j'ai édité mon post depuis :)


Nerwal dit :

Malheureusement, CellChanged ne détecte pas tous les changements de cell.
Tu as plus d'infos là dessus ?
You look like you need a monkey!

Attention : perfectionniste paresseux.

#15 Orann

Orann

    Nérévarine de Pertevue


Posté 01 juillet 2009 - 09:39

En même temps, je me dis que je pourrait utiliser setpos avec une valeur négative telle que je sais que je ne positionne jamais d'intérieur aussi bas, genre -10000.

Je vais essayer comme ça ^^

-----------------------

J'ai testé ce script:
begin A_P_lamp_palais_gouv

if ( GameHour >= 8 )
	if ( GameHour < 20 )
		setpos z -10000
		return
	endif
endif

Setatstart

end

Il fonctionne parfaitement. Pour vérifier, j'ai placé un nif pour ces lampes, et ils se trouvent bien là où ils doivent être quand ils doivent l'être.

Le problème vient de la lumière négative: elle n'est pas prise en compte par le moteur de jeu. quand je rentre la première fois dans la cellule en venant de l'extérieur et qu'il devrait faire nuit toujours dans le même cas de figure... :)

- l'arrivée de la nuit quand on était passé dans la cell pour la dernière fois le jour. Mon test est le suivant: j'entre le jour, je sors, j'avance l'heure jusqu'à la nuit, je rentre une première fois = il fait toujours jour. Je sors, je rentre immédiatement = il fait maintenant bien nuit...

Je vais faire des tests avec d'autres "lumières" de lampe pour voir si ça vient uniquement de la lumière négative...
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#16 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 01 juillet 2009 - 10:18

Voir le messageKafou, le 01.07.2009 à 10:04, dit :

Wiwi, j'ai édité mon post depuis :)


Nerwal dit :

Malheureusement, CellChanged ne détecte pas tous les changements de cell.
Tu as plus d'infos là dessus ?

http://wiwiki.wiwila...ing#CellChanged

Plus de détails et précisions dans MSfD 9 p.62-63 (version pdf)

#17 Kafou

Kafou

    Le canari a bouffé le rominet !


Posté 01 juillet 2009 - 10:59

Voir le messageNerwal, le 01.07.2009 à 11:17, dit :

http://wiwiki.wiwila...ing#CellChanged

Plus de détails et précisions dans MSfD 9 p.62-63 (version pdf)
Ah oui OK. J'avais été confronté à ça y'a un moment, j'avais remplacé par un getpccell == ou != celle que je veux. Puisque je voulais détecter l'entrée et la sortie du PJ pour une cellule en particulier, précisément par téléportation... mais c'est sûr que c'est un cas très particulier.

Merci et sorry pour le HS !
You look like you need a monkey!

Attention : perfectionniste paresseux.

#18 Orann

Orann

    Nérévarine de Pertevue


Posté 01 juillet 2009 - 20:18

J'ai trouvé un script qui fonctionne: je disable l'espace d'une frame la lampe noir quand elle revient en setatstart. Et là, tout fonctionne, même dans le cas qui posait problème avant!

begin A_P_lamp_palais_gouv
; merci Korfandar, Kafou, Elendell, A3jv


short frame

if ( GameHour >= 8 )
	if ( GameHour < 20 )
		set frame to 1
		setpos z -10000
		return
	endif
endif

Setatstart

if ( frame == 1 )
	disable
	set frame to 2
	return
endif

if ( frame == 2 )
	enable
	set frame to 0
endif

end

Seul problème (mais je crois qu'il ne pourra pas être résolu), ça ne fonctionne plus quand on charge (sans quitter le jeu) une sauvegarde effectuée alors qu'on était dans la cellule intérieure de nuit. Si on quitte complètement le jeu, et qu'on charge cette même sauvegarde, ça marche parfaitement...

:ortholiberaux:
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#19 elendell

elendell

    Mécano Dell'Arte


Posté 02 juillet 2009 - 00:51

Voir le messageOrann, le 01.07.2009 à 21:17, dit :

Seul problème (mais je crois qu'il ne pourra pas être résolu), ça ne fonctionne plus quand on charge (sans quitter le jeu) une sauvegarde effectuée alors qu'on était dans la cellule intérieure de nuit. Si on quitte complètement le jeu, et qu'on charge cette même sauvegarde, ça marche parfaitement...
sleeping.gif
Pffffff ! Homme de peu de foi...  :ortholiberaux:

begin A_P_lamp_palais_gouv
; merci Korfandar, Kafou, Elendell, A3jv

short frame

DontSaveObject

if ( GameHour >= 8 )
	if ( GameHour < 20 )
		set frame to 1
		setpos z -10000
		return
	endif
endif

if ( frame == 0 )
	return
elseif ( frame == 1 )
	Setatstart
	disable
	set frame to 2
elseif ( frame == 2 )
	enable
	set frame to 0
endif

end

Note que je l'ai présenté autrement pour qu'il ne refasse pas en permanence les instructions de nuit (juste un if, une fois que la nuit est en place) mais le tien fonctionnerait aussi si tu rajoutais "DontSaveObject".

A part ça, c'est une vrai galère ces lumières noires. J'ai d'abord essayé de donner des instructions différentes si recharge mais mon système de détection de recharge fonctionne avec tous les objets que j'ai testés (y compris les lumières) sauf... les lumières noires !

PS : Je suis content car c'est la première fois que j'utilise "DontSaveObject", qui m'intriguait depuis longtemps.  :laughing1:

#20 Orann

Orann

    Nérévarine de Pertevue


Posté 02 juillet 2009 - 08:47

Merci beaucoup Elendell! Je n'aurais jamais pensé à cette fonction que je n'avais moi non plus jamais utilisé! Mes tests confirment ce que tu dis: tout fonctionne parfaitement dorénavant!

Merci également à tous ceux qui sont intervenus sur ce sujet! ;)
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.




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

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