Script pour faire la nuit dans les intérieurs
3 participants
Page 1 sur 1
Script pour faire la nuit dans les intérieurs
J'ai fait ce script pour que des lamps diffusant de la lumière dark le fasse uniquement la nuit dans les cellules intérieures. Le principe est que la nuit est entre 20h et 8h et que les lampes doivent à ce moment être dans le bâtiment. Le jour, elle descendent le plus bas possible.
Problème: le script fonctionne assez aléatoirement si le joueur passe le jour et la nuit dans la cell intérieur et surtout si il y a un chargement de sauvegarde: les rithmes ont tendance à s'inverser :scratch:
Problème: le script fonctionne assez aléatoirement si le joueur passe le jour et la nuit dans la cell intérieur et surtout si il y a un chargement de sauvegarde: les rithmes ont tendance à s'inverser :scratch:
- Code:
begin A_P_lamp_palais_gouv
short fait
if ( menumode == 1 )
return
endif
if ( cellchanged == 1 )
setatstart
set fait to 0
if ( gamehour < 20 )
if ( gamehour >= 8 )
set fait to 1
moveworld z, -2000
endif
endif
endif
if ( gamehour >= 8 )
if ( gamehour < 20 )
if ( fait == 0 )
moveworld z, -2000
set fait to 1
endif
endif
endif
if ( gamehour >= 20 )
if ( fait == 1 )
moveworld z, 2000
set fait to 0
endif
endif
if ( gamehour < 8 )
if ( fait == 1 )
moveworld z, 2000
set fait to 0
endif
endif
end
Re: Script pour faire la nuit dans les intérieurs
Hello Orann !
Petite question, à quoi te sert le test :
Première critique sur ce morceau de code : il semble que SetAtStart soit partiellement bugguée d'après l'UESP :
Seconde critique : il est inutile de réinitialiser l'objet au changement de cellule. Si on supprime cette portion de code, quand le joueur entre dans la cellule, il y a deux possibilités :
1. L'objet est encore en bonne position et ne sera donc pas déplacé, car la variable fait empêche ce déplacement.
2. L'objet n'est plus en bonne position et il sera déplacé.
Dans les deux cas, c'est bien ce qu'on veut faire.
Troisième micro-critique : dans son état actuel, ton script va tester les trois conditions d'heure à chaque frame et entrer dans l'une d'entre elles. Supposons qu'il soit 22 heures. Le script va entrer dans le bloc "if ( gamehour >= 20 )", mais va aussi tester les deux autres blocs (sans entrer dedans puisque leurs conditions ne sont pas remplies).
Il y a moyen de faire plus efficace en utilisant des elseif.
Si j'intègre les idées précedentes, ça donne quelque chose comme :
Petite question, à quoi te sert le test :
- Code:
if ( cellchanged == 1 )
setatstart
set fait to 0
if ( gamehour < 20 )
if ( gamehour >= 8 )
set fait to 1
moveworld z, -2000
endif
endif
endif
Première critique sur ce morceau de code : il semble que SetAtStart soit partiellement bugguée d'après l'UESP :
Be warned that this function doesn't always seem to do exactly as it should. Objects are not nessecarily reset to its editor defined position.
Seconde critique : il est inutile de réinitialiser l'objet au changement de cellule. Si on supprime cette portion de code, quand le joueur entre dans la cellule, il y a deux possibilités :
1. L'objet est encore en bonne position et ne sera donc pas déplacé, car la variable fait empêche ce déplacement.
2. L'objet n'est plus en bonne position et il sera déplacé.
Dans les deux cas, c'est bien ce qu'on veut faire.
Troisième micro-critique : dans son état actuel, ton script va tester les trois conditions d'heure à chaque frame et entrer dans l'une d'entre elles. Supposons qu'il soit 22 heures. Le script va entrer dans le bloc "if ( gamehour >= 20 )", mais va aussi tester les deux autres blocs (sans entrer dedans puisque leurs conditions ne sont pas remplies).
Il y a moyen de faire plus efficace en utilisant des elseif.
Si j'intègre les idées précedentes, ça donne quelque chose comme :
begin A_P_lamp_palais_gouv
short fait
if ( menumode == 1 )
return
endif
if ( gamehour < 8 )
; Avant 8 h
if ( fait == 1 )
moveworld z, 2000
set fait to 0
endif
elseif ( gamehour >= 20 )
; Après 20 h
if ( fait == 1 )
moveworld z, 2000
set fait to 0
endif
else
; Entre 8 et 20 h
if ( fait == 0 )
moveworld z, -2000
set fait to 1
endif
endif
end
Nenfëa- Nombre de messages : 14
Localisation : Ben, ça dépend du référentiel...
Date d'inscription : 19/04/2006
Re: Script pour faire la nuit dans les intérieurs
Merci je vais tester. En fait, le cellchanged c'était au départ dans l'optique justement de n'effectuer le test qu'une fois quand le joueur entrait, mais ça ne fonctionnait pas correctement donc après certaines modifications infructueuses, je suis arrivé à ça... mais bon c'est pas encore parfait donc merci du coup de main ^^
Re: Script pour faire la nuit dans les intérieurs
Dans ce cas, tu peux tenter de mettre à la place le code :
Ca bloquera tout tant que le joueur ne change pas de cell !
- Code:
if ( CellChanged == 0 )
Return
endif
Ca bloquera tout tant que le joueur ne change pas de cell !
Nenfëa- Nombre de messages : 14
Localisation : Ben, ça dépend du référentiel...
Date d'inscription : 19/04/2006
Re: Script pour faire la nuit dans les intérieurs
Et est-ce que ça détecte aussi en cas de téléportation?
Re: Script pour faire la nuit dans les intérieurs
Là, je dois t'avouer que je ne sais pas trop... je dirais oui à priori, mais je ne l'ai pas testé !
Un autre soucis, c'est que si le joueur attend toute la nuit dans la cell intérieure et ne sors qu'à 14 heures, il fera toujours noir dedans jusqu'à ce qu'il sorte.
Sans le CellChanged, c'est un autre soucis : là, la luminosité changera brutalement au changement d'heure !
Bref, pas de solutions miracle, mais la présence du CellChanged me semble préférable !
Un autre soucis, c'est que si le joueur attend toute la nuit dans la cell intérieure et ne sors qu'à 14 heures, il fera toujours noir dedans jusqu'à ce qu'il sorte.
Sans le CellChanged, c'est un autre soucis : là, la luminosité changera brutalement au changement d'heure !
Bref, pas de solutions miracle, mais la présence du CellChanged me semble préférable !
Nenfëa- Nombre de messages : 14
Localisation : Ben, ça dépend du référentiel...
Date d'inscription : 19/04/2006
Re: Script pour faire la nuit dans les intérieurs
Je viens enfin de tester (le concours passé ça aide!) et ça fonctionne! Je vais rajouter le " if ( cellchanged == 0 )" sur le script je pense, ainsi que sur le script des npcs qui, sans ça, se téléporte dans leur lit dès le changement d'heure.
Re: Script pour faire la nuit dans les intérieurs
Je viens de constater un problème:
Je suis dans la cell de jour. Pas de problème. J'avance le temps (touche T), les lumières n'apparaissent pas la nuit. (normal avec le ( cellchanged == 0 ).
Mais, je sors et je rerentre (toujours la nuit): à l'intérieur il fait jour...
Je suis dans la cell de jour. Pas de problème. J'avance le temps (touche T), les lumières n'apparaissent pas la nuit. (normal avec le ( cellchanged == 0 ).
Mais, je sors et je rerentre (toujours la nuit): à l'intérieur il fait jour...
Re: Script pour faire la nuit dans les intérieurs
Hello Orann !
Pourrais tu poster le script en entier pour voir s'il n'y a pas une erreur d'enchaînement dessus ?
Normalement, CellChanged ne renvoit 1 que quand le joueur entre dans la cell (sur une seule frame).
Pourrais tu poster le script en entier pour voir s'il n'y a pas une erreur d'enchaînement dessus ?
Normalement, CellChanged ne renvoit 1 que quand le joueur entre dans la cell (sur une seule frame).
Nenfëa- Nombre de messages : 14
Localisation : Ben, ça dépend du référentiel...
Date d'inscription : 19/04/2006
Re: Script pour faire la nuit dans les intérieurs
J'ai un peu perdu la main mais je me demande si les variables locales ne se réinitialisent pas automatiquement, soit en entrant dans la cellule, soit au bout d'un certain temps. Ce qui expliquerait que suivant l'heure ou on pénètre la cellule les choses ne sont pas à leur place.
Si quand tu pénètres la cell ta lampe est déjà à -2000, que "fait" est à 0 et qu'il est 11h du mat, elle va s'enfoncer à -4000.
Tu risques de ne jamais la voir remonter.
Si tes éclairages de nuit sont posés de base en position normale (haute), tu peux peut-être essayer un truc dans ce genre :
Si quand tu pénètres la cell ta lampe est déjà à -2000, que "fait" est à 0 et qu'il est 11h du mat, elle va s'enfoncer à -4000.
Tu risques de ne jamais la voir remonter.
Si tes éclairages de nuit sont posés de base en position normale (haute), tu peux peut-être essayer un truc dans ce genre :
- Code:
begin A_P_lamp_palais_gouv
DontSaveObject ; pour que la sauvegarde ne garde pas les éventuelles modifs de positions en mémoire.
short fait
if ( CellChanged == 1 )
set fait to 0
endif
if ( fait == 1 )
return
endif
if ( gamehour >= 8 )
if ( gamehour < 20 )
moveworld z, -2000
else SetAtStart ; bon si c'est buggé, je ne sais pas par quoi remplacer !
endif
endif
set fait to 1
end
a3jv- Nombre de messages : 912
Localisation : Sous le soleil de la Cerdagne
Date d'inscription : 10/05/2007
Re: Script pour faire la nuit dans les intérieurs
Je ne connaissais pas "DontsaveObject". Je vais tester de ce pas. Merci
Re: Script pour faire la nuit dans les intérieurs
Bon, je viens de tester: ça ne fonctionne pas...
Si j'arrive de nuit, la première fois, ça marche, il fait nuit. Mais après, il fait tout le temps jours, même la nuit...
Je ne comprends pas, c'est pourtant pas quelque chose de compliquer à la base comme script
Si j'arrive de nuit, la première fois, ça marche, il fait nuit. Mais après, il fait tout le temps jours, même la nuit...
Je ne comprends pas, c'est pourtant pas quelque chose de compliquer à la base comme script
Re: Script pour faire la nuit dans les intérieurs
Les variables locales d'un script ne sont normalement jamais réinitialisées automatiquement - si ça se produit, c'est un vilain petit bug !
Peux-tu poster le contenu du script, Orann ?
Ce devrait normalement être quelque chose comme :
Peux-tu poster le contenu du script, Orann ?
Ce devrait normalement être quelque chose comme :
- Code:
Begin A_P_lamp_palais_gouv
short jour
; On ne change de luminosité qu'au moment où le joueur entre dans la cellule
if ( CellChanged == 0 )
Return
endif
if ( GameHour < 8 )
; Avant 8 h
if ( jour == 1 )
Set jour to 0
MoveWorld z, 2000
endif
elseif ( GameHour >= 20 )
; Après 20 h
if ( jour == 1 )
Set jour to 0
MoveWorld z, 2000
endif
else
; Entre 8 et 20 h
if ( jour == 0 )
Set jour to 1
MoveWorld z, -2000
endif
endif
end
Nenfëa- Nombre de messages : 14
Localisation : Ben, ça dépend du référentiel...
Date d'inscription : 19/04/2006
Re: Script pour faire la nuit dans les intérieurs
Le voici dans la dernière version avant celle d'A3jv:
- Code:
begin A_P_lamp_palais_gouv
; merci Nenfëa ^^
short fait
if ( CellChanged == 0 )
Return
endif
if ( menumode == 1 )
return
endif
if ( gamehour < 8 )
; Avant 8 h
if ( fait == 1 )
moveworld z, 2000
set fait to 0
endif
elseif ( gamehour >= 20 )
; Après 20 h
if ( fait == 1 )
moveworld z, 2000
set fait to 0
endif
else
; Entre 8 et 20 h
if ( fait == 0 )
moveworld z, -2000
set fait to 1
endif
endif
end
Re: Script pour faire la nuit dans les intérieurs
Désolé que ça n'ait pas marché.
Si la solution de Nenfëa marchait bien avant de rajouter le CellChanged, je pense que tu devrais faire sans et utiliser celle là..
Sinon, j'avais rebuché les tutos et le script et j'étais arrivé à un truc épuré très proche de ton script de départ avec les deux possibilités jour ou nuit qui font monter ou descendre et se renvoient la variable.
J'avais voulu te le poster il y a deux jours mais la connexion foirait régulièrement (il faudra que je fasse quelque chose pour remédier à ça, c'est de pire en pire, alors j'écris sous "World" et je poste mon laïus dare-dare par un copier/coller) et puis le visuel de la réponse voulait à tout prix me réunir les deux if (< et >=) sur une seule et même ligne, impossible de dissocier !?…
Bref j'ai abandonné à la dernière rupture de connexion.
Ca me rappelle des souvenirs de galères, des longs moments de doutes, recherches et réflexions.
Le grand mystère des scripts du Tescs !
Des espaces en trop ou en manque et c'est foireux, des guillemets en résult de dialogue pour additem et pas pour removeitem ou l'inverse, un truc qui va bien pour un script mais foire avec un autre…
Bon, je te poste ma "trouvaille" ultime qui est très proche de ton script d'origine (sans CellChanged) pour voir.
Edit : Ah ben si (déconnecté !…) ça marche… J'ai remis GameHour...et hop déconnecté 3 fois et lutte avec la prise tel, les filtres, le modem, je pense que je vais massacrer ma livebox.
Si la solution de Nenfëa marchait bien avant de rajouter le CellChanged, je pense que tu devrais faire sans et utiliser celle là..
Sinon, j'avais rebuché les tutos et le script et j'étais arrivé à un truc épuré très proche de ton script de départ avec les deux possibilités jour ou nuit qui font monter ou descendre et se renvoient la variable.
J'avais voulu te le poster il y a deux jours mais la connexion foirait régulièrement (il faudra que je fasse quelque chose pour remédier à ça, c'est de pire en pire, alors j'écris sous "World" et je poste mon laïus dare-dare par un copier/coller) et puis le visuel de la réponse voulait à tout prix me réunir les deux if (< et >=) sur une seule et même ligne, impossible de dissocier !?…
Bref j'ai abandonné à la dernière rupture de connexion.
Ca me rappelle des souvenirs de galères, des longs moments de doutes, recherches et réflexions.
Le grand mystère des scripts du Tescs !
Des espaces en trop ou en manque et c'est foireux, des guillemets en résult de dialogue pour additem et pas pour removeitem ou l'inverse, un truc qui va bien pour un script mais foire avec un autre…
Bon, je te poste ma "trouvaille" ultime qui est très proche de ton script d'origine (sans CellChanged) pour voir.
- Code:
begin A_P_lamp_palais_gouv
short jour
if ( MenuMode == 1 )
return
endif
if ( jour == 0 )
if ( GameHour >= 8 )
if ( GameHour < 20 )
MoveWorld z, -1000
set jour to 1
endif
endif
endif
if ( jour == 1 )
if ( GameHour < 8 )
if ( GameHour >= 20 )
MoveWorld z, 1000
set jour to 0
endif
endif
endif
end
Edit : Ah ben si (déconnecté !…) ça marche… J'ai remis GameHour...et hop déconnecté 3 fois et lutte avec la prise tel, les filtres, le modem, je pense que je vais massacrer ma livebox.
a3jv- Nombre de messages : 912
Localisation : Sous le soleil de la Cerdagne
Date d'inscription : 10/05/2007
Re: Script pour faire la nuit dans les intérieurs
Merci de massacrer ta livebox pour poster et m'aider ^^
Juste vite fait, la seconde partie du script ne peux pas fonctionner...
Il ne peux pas être moins de 8 heures et plus de 20h en même temps... Mais bon, c'est vrai que ce côté épuré était ce que j'avais testé en premier. Je réessayerai dès que j'aurai un peu de temps (mes oraux sont proches).
Merci
Juste vite fait, la seconde partie du script ne peux pas fonctionner...
- Code:
if ( jour == 1 )
if ( GameHour < 8 )
if ( GameHour >= 20 )
MoveWorld z, 1000
set jour to 0
endif
endif
endif
Il ne peux pas être moins de 8 heures et plus de 20h en même temps... Mais bon, c'est vrai que ce côté épuré était ce que j'avais testé en premier. Je réessayerai dès que j'aurai un peu de temps (mes oraux sont proches).
Merci
Re: Script pour faire la nuit dans les intérieurs
Je pense que c'est uniquement un bug de la prévisualisation : j'avais le même problème, j'ai cliqué sur poster par mégarde, et mon post s'est affiché comme je le voulais !a3jv a écrit:et puis le visuel de la réponse voulait à tout prix me réunir les deux if (< et >=) sur une seule et même ligne, impossible de dissocier !?…
J'ai beau regarder, je ne vois pas d'erreur de logique. Juste un détail, le "if ( menumode == 1 )" est inutile dans la mesure où le "if ( CellChanged == 0 )" bloque déjà le script - mais je doute que le problème vienne de là.OraNN a écrit:Le voici dans la dernière version avant celle d'A3jv[...]
Si le problème persiste, je te conseille
Nenfëa- Nombre de messages : 14
Localisation : Ben, ça dépend du référentiel...
Date d'inscription : 19/04/2006
Re: Script pour faire la nuit dans les intérieurs
C'est juste ! :oops:OraNN a écrit:Il ne peux pas être moins de 8 heures et plus de 20h en même temps...
C'est juste aussi ! et re :oops:Nenfëa a écrit:Les variables locales d'un script ne sont normalement jamais réinitialisées automatiquement - si ça se produit, c'est un vilain petit bug !
Je viens de faire un test rapide et effectivement une variable locale placée en zone de tête ne repasse plus par la zone d'initialisation même après sortie > 72 heures et retour dans la cell.
Je ne sais pas pourquoi j'avais un doute à ce niveau là.
Passée à 1, elle reste définitivement à 1 pour la sauvegarde l'ayant enregistrée.
Message édité, j'avais écrit quelques aberrations, il faut que je change de tisane... et de livebox...
a3jv- Nombre de messages : 912
Localisation : Sous le soleil de la Cerdagne
Date d'inscription : 10/05/2007
Re: Script pour faire la nuit dans les intérieurs
Pour essayer de me rattraper, j'ai testé le script suivant sur un activator coché "references persist" que j'ai placé en position visible sur le sol chez Arrile, dans le tescs.
J'ai testé et ça marche parfaitement chez moi dans tous les cas d'heure.
Il est toujours invisible le jour et toujours visible la nuit.
Voici le script :
J'ai testé et ça marche parfaitement chez moi dans tous les cas d'heure.
Il est toujours invisible le jour et toujours visible la nuit.
Voici le script :
- Code:
begin A_P_lamp_palais_gouv
short jour
if ( CellChanged == 0 )
return
endif
if ( jour == 0 )
if ( GameHour >= 8 )
if ( GameHour < 20 )
MoveWorld z, -2000
set jour to 1
endif
endif
endif
if ( jour == 1 )
if ( GameHour < 8 )
MoveWorld z, 2000
set jour to 0
elseif ( GameHour >= 20 )
MoveWorld z, 2000
set jour to 0
endif
endif
end
a3jv- Nombre de messages : 912
Localisation : Sous le soleil de la Cerdagne
Date d'inscription : 10/05/2007
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|