Aller au contenu


[résolu] Détecter Si Une Cellule Intérieure A Un Niveau D'eau


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

#1 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 17 juillet 2009 - 11:45

Bien le bonjour.

Afin d'empêcher que le joueur puisse se servir de bombes sous l'eau, j'ai utilisé les fonctions GetPos Z, GetInterior ainsi que GetWaterLevel.

C'est d'une simplicité enfantine:

- si le joueur est en extérieur, il suffit de détecter si la bombe renvoie un Z négatif... dans ce cas elle est sous l'eau et pfuit!
- si le joueur est en intérieur, il suffit de détecter si la valeur du niveau d'eau de la cellule est supérieur à la coordonnée de la bombe sur l'axe des Z... dans ce cas, elle est sous l'eau et pfuit!

Mais...

si la cellule n'a pas d'eau, c'est la dernière valeur du GetLevelWater qui est tenue en compte, ce qui fausse tous les calculs: si par hasard la bombe se trouve au-dessous du niveau d'eau de la cellule précédente, ça fait forcément pfuit! alors que la bombe est au sec.

D'où ma question: est-il possible de détecter par script si la cellule intérieure dans laquelle on se trouve n'a pas d'eau?
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#2 lnari

lnari

    Chocapic Cortexicus


Posté 17 juillet 2009 - 11:49

Coucou NQD.

La solution qui me semble la plus simple est simplement de mettre de l'eau dans toutes tes cellules, et si tu veux une cell "sans eau", tu places son niveau bien en-dessous de tout le reste (pas juste en dessous sinon tu vas avoir le sound).

Ainsi, tes niveaux d'eau sont respectés pour chaque cell, tu as un "WaterLevel" défini dans chacune, et tu n'as rien à modifier de ton script bien pensé.

#3 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 17 juillet 2009 - 11:57

Mmmh... Le problème est que je veux que ce script fonctionne également dans les cellules du jeu d'origine... voire même dans des cellules venues d'autres modules...
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#4 lnari

lnari

    Chocapic Cortexicus


Posté 17 juillet 2009 - 12:10

Ah, je croyais que tes bombes étaient à utilisation spécifique.

Je pense que tu devrais essayer de passer par une des "caractéristiques" de la présence de l'eau. A réfléchir, je vois bien le GetSoundPlaying "Water Layer" et GetSoundPlaying "drown" (le premier étant la surface de l'eau, le second le son de la respiration sous l'eau). Si aucun des deux n'est joué, tu n'as pas d'eau à proximité. Si l'un des deux joue, tu peux alors faire le GetWaterLevel.

Du genre :

Begin BombScript

If ( GetSoundPlaying "Water Layer" == 1 )
If ( GetPos Z < GetWaterLevel )
; Pfuit
Endif
Endif

If ( GetSoundPlaying "drown" == 1 )
If ( GetPos Z < GetWaterLevel )
; Pfuit
Endif
Endif

End

A priori, dans un autre cell sans eau, tu vas avoir le GetWaterLevel qui va renvoyer n'importe quoi, mais comme tu n'auras pas les sons qui jouent, tu n'auras pas le Pfuit. Et dans une Cell avec de l'eau tu as forcément l'un de ces deux sons qui jouent (puisque c'est soit celui de surface, soit celui en dessous), donc le test est comme avant.

Maintenant faut tester voir si ça marche, je ne l'ai pas fait, et je ne suis pas sûr à 100% que les GetSoundPlaying marchent si le joueur a coupé le volume de tous les sons, bien qu'à mon avis, ça passe.

Je ne garantis rien, donc, mais ça peut être une idée. ;)

#5 Kira

Kira

    Top-modeleuse...


Posté 17 juillet 2009 - 12:12

Bonjour Not Quite Dead...
Plutôt que chercher si la cellule contient de l'eau, ne serait-il pas plus facile de savoir si le joueur est dans l'eau?...

Il devrait suffire de faire un test sur "GetSoundPlaying", avec les sons "Swim left", "Swim right", "Underwater" et "Drowning damage", qui sont, à ma connaissance, les seuls sons associés au milieu aquatique...

Mais c'est juste une théorie, je n'ai pas testé le résultat...

***Edit***
J'ai été prise de vitesse par une Souris Cornue... C'est sûrement la preuve que je ne suis pas trop loin de la solution....
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...)

#6 lnari

lnari

    Chocapic Cortexicus


Posté 17 juillet 2009 - 12:15

A priori, au moins, on cherche dans le même ordre d'idée. ;)

#7 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 17 juillet 2009 - 12:17

Bonne(s) idée(s). ;)

Je m'en vais essayer tout ça et je vous redis. :)
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#8 elendell

elendell

    Mécano Dell'Arte


Posté 17 juillet 2009 - 16:12

Voir le messageSouris Cornue, le 17.07.2009 à 13:09, dit :

Maintenant faut tester voir si ça marche, je ne l'ai pas fait, et je ne suis pas sûr à 100% que les GetSoundPlaying marchent si le joueur a coupé le volume de tous les sons, bien qu'à mon avis, ça passe.
A priori, oui. "GetSoundPlaying" ne détecte malheureusement pas si un son est actuellement joué par la carte son mais juste si l'ordre de jouer une "ID" de son est actif dans la frame où se fait le "GetSoundPlaying" (même si son volume est fixé à 0). Je dis malheureusement parce que du coup, on est obligé d'utiliser "PlayLoopSound3DVP" même si on ne veut pas que le son soit joué en boucle, dès lors qu'on a besoin d'utiliser "GetSoundPlaying" sur ce son à un autre moment que sa frame de déclenchement. (Avec "PlaySound", "GetSoundPlaying" ne renvoie 1 que pour une frame, même si le son dure 5mn.)

J'avais eu du mal à le comprendre à cause de cette phrase imprécise du MSfD : ""GetSoundPlaying" Renvoie 1 lorsque le son spécifié est actuellement joué."

#9 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 17 juillet 2009 - 17:18

J'ai essayé d'utiliser ces conditions, mais cela ne semble pas fonctionner: est-ce qu'utiliser la fonction GetSoundPlaying dans un script ne vérifierait pas en fait si l'objet porteur du script joue ou non le son, plutôt que de vérifier si n'importe quel objet joue le son?

En tout cas, j'ai essayé en testant swim left et swim right avec comme appelant le PJ... et ça ne semble pas fonctionner... ;) Par ailleurs, il y a fort à parier que si le joueur restait immobile, ces sons ne seraient pas joués...

Pour le drown, il n'est joué qu'en cas de noyade... et je me demande ce qui joue le son waterlayer... mais probablement pas un objet unique...

Il me semble donc difficile de passer par des sons.

J'ai pensé essayer de faire quelque chose avec la jauge d'air, mais c'est en fait un mauvais critère, puisque le joueur peut très bien barboter.

J'avais songé placer faire à chaque changement de cellule un setup de la variable récupérant le niveau de l'eau qui la mettait à -900'000, en espérant que dans une cellule sans niveau d'eau ça ne bougerait plus et que les bombes sauteraient alors que dans une cellule avec niveau d'eau, le niveau réel prendrait le relais... mais manifestement ça ne fonctionne pas non plus. Tout porte à croire que s'il n'y a pas de niveau d'eau, le tescs considère que la valeur est 0, ce qui est fort embêtant.

Dernière idée: il me semble que le sommeil détectait si le joueur avait les pieds dans l'eau. "You can only rest on solid ground." Quelqu'un sait comment ça marche?
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#10 elendell

elendell

    Mécano Dell'Arte


Posté 17 juillet 2009 - 19:16

Voir le messageNot Quite Dead, le 17.07.2009 à 18:17, dit :

...est-ce qu'utiliser la fonction GetSoundPlaying dans un script ne vérifierait pas en fait si l'objet porteur du script joue ou non le son, plutôt que de vérifier si n'importe quel objet joue le son?
Pas forcément le porteur du script mais il faut préciser qui est censé jouer le son ("IDobjet"->GetSoundPlaying, "IDson").

Voir le messageNot Quite Dead, le 17.07.2009 à 18:17, dit :

En tout cas, j'ai essayé en testant swim left et swim right avec comme appelant le PJ... et ça ne semble pas fonctionner...
Ça fonctionne si on teste les bonnes "ID" de sons :mrgreen: :  

begin testeau

if ( "player"->GetSoundPlaying "DefaultLandWater" == 1 )
	MessageBox "Plouf, sacré plongeon !"
elseif ( "player"->GetSoundPlaying "FootWaterLeft" == 1 )
	MessageBox "Nage ou marche sur l'eau (G)."
elseif ( "player"->GetSoundPlaying "FootWaterRight" == 1 )
	MessageBox "Nage ou marche sur l'eau (D)."
elseif ( "player"->GetSoundPlaying "drowning damage" == 1 )
	MessageBox "Tu vas bientôt nourrir les poissons."
endif

end

Note que marcher sur l'eau et nager utilise les mêmes sons !  :(  (Ces sons ont d'ailleurs les mêmes "wav" que les "Swim").

Voir le messageNot Quite Dead, le 17.07.2009 à 18:17, dit :

( Par ailleurs, il y a fort à parier que si le joueur restait immobile, ces sons ne seraient pas joués...
C'est le seul problème restant à résoudre. S'il nage, marche ou saute dans l'eau pour aller poser sa bombe, tu le sauras mais s'il nage jusqu'à l'endroit qu'il veut faire sauter, fait une marque, quitte la cellule et revient avec "rappel", tu ne pourras pas détecter l'eau. Je vais essayer de trouver une parade (sans garantie).

Voir le messageNot Quite Dead, le 17.07.2009 à 18:17, dit :

je me demande ce qui joue le son waterlayer... mais probablement pas un objet unique...
C'est déterminé par le Morrowind.ini, comme les sons de climats (ni script, ni objet).

Voir le messageNot Quite Dead, le 17.07.2009 à 18:17, dit :

Dernière idée: il me semble que le sommeil détectait si le joueur avait les pieds dans l'eau. "You can only rest on solid ground." Quelqu'un sait comment ça marche?
Il y a bien une détection mais je doute qu'on puisse récupérer cette valeur. Je vais chercher...

#11 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 17 juillet 2009 - 19:26

Bonsoir tout le monde!

Citation

J'avais songé placer faire à chaque changement de cellule un setup de la variable récupérant le niveau de l'eau qui la mettait à -900'000, en espérant que dans une cellule sans niveau d'eau ça ne bougerait plus et que les bombes sauteraient alors que dans une cellule avec niveau d'eau, le niveau réel prendrait le relais... mais manifestement ça ne fonctionne pas non plus. Tout porte à croire que s'il n'y a pas de niveau d'eau, le tescs considère que la valeur est 0, ce qui est fort embêtant.

Il y a peut être une parade...

Si le script détecte un waterlevel à 0 en entrant dans la cellule:
mettre le waterlevel à 1
si après cela, getwaterlevel renvoit à 1 -> il y a de l'eau puisque setwaterlevel en a changé le niveau
puis remettre le waterlevel à 0 , pour éviter d'éventuels problèmes de scripts venant d'autres modules.

Si le waterlevel ne change pas -> pas d'eau, pas de pfuit

Qu'en pensez-vous?

Modifié par Von Zeeple, 17 juillet 2009 - 19:27.

Le Steampunk, c'est bon, mangez en  !

#12 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 17 juillet 2009 - 19:31

Wow. Merci mille fois d'avoir jeté un coup d'oeil là-dessus elendell. :D :D :D

Voir le messageelendell, le 17.07.2009 à 20:15, dit :

Voir le messageNot Quite Dead, le 17.07.2009 à 18:17, dit :

( Par ailleurs, il y a fort à parier que si le joueur restait immobile, ces sons ne seraient pas joués...
C'est le seul problème restant à résoudre. S'il nage, marche ou saute dans l'eau pour aller poser sa bombe, tu le sauras mais s'il nage jusqu'à l'endroit qu'il veut faire sauter, fait une marque, quitte la cellule et revient avec "rappel", tu ne pourras pas détecter l'eau. Je vais essayer de trouver une parade (sans garantie).
S'il reste immobile à la surface de l'eau il ne devrait plus produire de son même sans se téléporter, non? :( Bon. Ca reste tout de même un cas limite.

Je testerai ça dans le détail dans une dizaine de jours: là il me faut me mettre au préparatifs de voyage: je pars en vacances demain. :mrgreen:

Il faudra que je jette également un coup d'oeil à la suggestion de Von Zeeple. :D

Merci à tous pour votre aide sur cet épineux problème. :D :D :D
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#13 elendell

elendell

    Mécano Dell'Arte


Posté 17 juillet 2009 - 19:34

Ça semble très bien Von mais je croyais que NQD avait essayé ça. (Je n'ai pas très bien compris son explication je crois  :mrgreen: ).

A tester, donc.

EDIT :

Citation

S'il reste immobile à la surface de l'eau il ne devrait plus produire de son même sans se téléporter, non? icon_confused.gif Bon. Ca reste tout de même un cas limite.
Oui mais avant d'être immobile, il a bien fallu qu'il y aille et le script l'a noté dans une variable conditionnelle pour le "pshiiit". (Ce qui implique de tester également le changement de cellule. A chaque changement de cellule : remise à 0 de la variable.)

#14 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 17 juillet 2009 - 19:36

Je vous montrerai les scripts à mon retour, ce sera plus précis. :mrgreen:
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#15 Von Zeeple

Von Zeeple

    Grille pain Dwemer


Posté 17 juillet 2009 - 21:42

Citation

Ça semble très bien Von mais je croyais que NQD avait essayé ça. (Je n'ai pas très bien compris son explication je crois icon_smile.gif ).

Sans vouloir parler à la place de NQD, il me semble qu'il s'agissait plutôt d'un:

set Var_niveau to -900
set Var_niveau to getwaterlevel;en espérant que getwaterlevel laisserait Var_niveau à -900 dans le cas d'une cellule sans eau

Ce que je proposais était:

setwaterlevel to 1
if ( getwaterlevel != 1 ); si le niveau n'a pas changé, par exemple, valeur dans la cell précédente
set humide to 0 
elseif ( getwaterlevel == 1 )
set humide to 1
endif

remettre au niveau d'origine

j'ai enlevé le "if (getwaterlevel == 0)" car j'avais oublié que getwaterlevel renvoyait la valeur de la cell précédente.
Il est possible que le niveau d'eau de la cell précédente soit 1, il faut donc prévoir un système d'incrémentation pour être sur de détecter la variation de la valeur renvoyée par getwaterlevel.

Modifié par Von Zeeple, 17 juillet 2009 - 21:44.

Le Steampunk, c'est bon, mangez en  !

#16 elendell

elendell

    Mécano Dell'Arte


Posté 18 juillet 2009 - 01:15

Voir le messageVon Zeeple, le 17.07.2009 à 22:41, dit :

Ce que je proposais était:

setwaterlevel to 1
if ( getwaterlevel != 1 ); si le niveau n'a pas changé, par exemple, valeur dans la cell précédente
set humide to 0 
elseif ( getwaterlevel == 1 )
set humide to 1
endif
Malheureusement, ça ne fonctionne pas.  :D

J'ai fait différents essais de scripts, en une ou plusieurs frames et avec les cellules suivantes : "Abanabi" (eau à -1200), "Todd" (pas d'eau), "Vivec, canal des Mystères, centre" (eau à 0).

Contrairement à ce qu'indique NQD, "GetWaterLevel" fonctionne dans tous les cas. Si la nouvelle cellule n'a pas d'eau, elle retourne 0 et pas la valeur du dernier test où il y avait de l'eau. On ne peut bien sûr pas en déduire qu'il n'y a pas d'eau puisque l'eau peut être à 0.

Le problème pour ta proposition est que "SetWaterLevel" fonctionne également, même si la case "Has Water" de la cellule n'est pas cochée. Donc, en faisant "SetWaterLevel 1" (sans le "to" pour la fonction), tu n'auras jamais "GetWaterLevel != 1".

Note : "ModWaterLevel" fonctionne également.



EDIT pour NQD :

En attendant de voir le script à ton retour, je note une réflexion pour ne pas l'oublier :

Voir le messageelendell, le 17.07.2009 à 20:15, dit :

Voir le messageNot Quite Dead, le 17.07.2009 à 18:17, dit :

( Par ailleurs, il y a fort à parier que si le joueur restait immobile, ces sons ne seraient pas joués...
C'est le seul problème restant à résoudre. S'il nage, marche ou saute dans l'eau pour aller poser sa bombe, tu le sauras mais s'il nage jusqu'à l'endroit qu'il veut faire sauter, fait une marque, quitte la cellule et revient avec "rappel", tu ne pourras pas détecter l'eau. Je vais essayer de trouver une parade (sans garantie).
Logiquement, comme c'est une bombe, je pense que le PJ devra s'éloigner avant l'explosion (avec un timer). Dans ce cas, le script détectera le son de nage, saura qu'il y a de l'eau dans la cellule, en déduira qu'il peut se baser sur le rapport "position bombe/niveau de l'eau" et sera toujours à temps de remplacer l'explosion par le "pfuiiit" à la fin du timer. Sauf bien sûr si le PJ se téléporte encore une fois avant l'explosion (avec objet, parchemin ou multi-marques) mais généralement, on aime bien voir l'explosion et on reste pour la voir.  :mrgreen:

Et de toute façon, si c'est un local, il ne tournera plus.  :(

#17 Finraïl

Finraïl

    Modèle de wiwilandais nanotechnologique


Posté 18 juillet 2009 - 10:19

Pour tout ce qui est de savoir si le joueur est dans l'eau ou non, tu peux copier les scripts présents dans MR_Armor. Toute cette problématique a déjà été traitée par différents essais. Egalement, le cas où le joueur ne bouge plus sous l'eau est abordé. Reste maintenant à définir l'usage précis de tes bombes pour définir les ajustements ou les cas limites (ex : le joueur peut-il lancer une bombe dans l'eau en étant sur la berge, etc...)  :mrgreen:

Not Quite Dead, le 22.06.2006 à 19:42, dit :

[...]un changement avatarien, même infime, est PAS BIEN et nuisible [...]
Les lisez-moi c'est bon, mangez-en !! Image IPB

Fervent Partisan de l'Immuabilité Avatarienne.

Morrowind Renaissance


#18 elendell

elendell

    Mécano Dell'Arte


Posté 20 juillet 2009 - 20:11

Voir le messageFinraïl, le 18.07.2009 à 11:18, dit :

Pour tout ce qui est de savoir si le joueur est dans l'eau ou non, tu peux copier les scripts présents dans MR_Armor. Toute cette problématique a déjà été traitée par différents essais. Egalement, le cas où le joueur ne bouge plus sous l'eau est abordé. Reste maintenant à définir l'usage précis de tes bombes pour définir les ajustements ou les cas limites (ex : le joueur peut-il lancer une bombe dans l'eau en étant sur la berge, etc...)  :good:
J'ai trouvé la partie détection de la nage mais je n'ai pas vu de détection de l'eau si le PJ ne bouge pas.  :|
(Au passage, il est très bien ce module !  :help:)
Note : En me relisant, je m'aperçois que je n'ai pas vérifié quel son est joué quand le PJ marche sur l'eau. Si c'est le même son (les FootWater), en tenez-vous compte dans Mr_Armor pour ne pas appliquer les malus dans ce cas ?

Mais je reviens au présent sujet :

J'ai trouvé le moyen de détecter si un objet est dans l'eau à un moment précis. Ça correspond donc, je pense, au besoin de NQD pour sa bombe. On ne se préoccupe plus de savoir s'il y a de l'eau ou non dans la cellule, ni même si le PJ lui-même est sous l'eau.
De plus, on peut faire ce test à n'importe quel moment. Quand le PJ dépose la bombe, quand il l'active ou encore, quand elle devrait exploser si c'est un objet à lancer (cas où la bombe serait lancée dans un endroit sec mais avec le PJ qui serait dans l'eau ou l'inverse, comme évoqué par Finraïl).

Le principe : En cherchant à détecter le lancement d'Undewater qui se produit quand le PJ entre sous l'eau, je me suis aperçu de particularités des sons d'environnements. Je ferai un sujet sur ça car se servir des mêmes ID de sons dans un "mod" peut avoir des répercussions étranges et non souhaitables.

Je n'ai pas réussi à détecter le lancement automatique d'Underwater mais on peut détecter l'arrêt de ce son qui se produit quand le PJ n'est plus sous l'eau. Contrairement à un "StopSound" qui ne stoppe habituellement un son ciblé que s'il cible lui aussi cet objet, le "StopSound" de sons d'environnement stoppe tous les sons correspondants, même s'ils sont ciblés.

Donc, pour savoir si un objet est sous l'eau, je place le PJ au même endroit que l'objet (plus bas pour tenir compte de la différence de hauteur des centres), je fais jouer Underwater par le PJ (avec un volume à 0), je place le PJ à une hauteur à coup sûr hors de l'eau et je teste si le PJ a toujours Underwater actif.

Si l'objet est sous l'eau, le fait de placer le PJ au même endroit déclenche le Underwater environnemental. Comme ce dernier est actif, si à la frame suivante le PJ est hors de l'eau, ça déclenche automatiquement le "StopSound" qui va également stopper le Underwater ciblé sur le PJ. Ensuite, il suffit de replacer le PJ à sa position d'origine et de faire un "StopSound" ciblé sur lui.

Ce StopSound ciblé est nécessaire pour 2 raisons : 1) Si l'objet n'était pas dans l'eau, il n'y a pas de "StopSound" environnemental et 2) S'il était sous l'eau il faut quand même le stopper parce que sinon, si le PJ va sous l'eau par la suite dans la même cellule, le Underwater environnemental qui serait lancé aurait les réglages qu'on avait donné à l'Underwater ciblé.  :paladin:

Bref, voici le script en question :

begin Bombe_Scr

; Script local pour tester si un objet est sous l'eau à un moment précis.

short etape
short son
short sousleau
float posx
float posy
float posz
float posxPJ
float posyPJ
float poszPJ

if ( OnActivate == 1 ); OnActivate ne sert que pour ce script d'essai, pour dire de lancer le test.
	set posxPJ to ( Player->GetPos x )
	set posyPJ to ( Player->GetPos y )
	set poszPJ to ( Player->GetPos z )
	set posx to GetPos x
	set posy to GetPos y
	set posz to GetPos z
	set posz to ( posz - 120 ); à régler en fonction de son centre dans le NIF et si l'on veut que le script relève seulement l'immersion totale ou même partielle de l'objet.
	TCL
	Player->SetPos x posx
	Player->SetPos y posy
	Player->SetPos z posz
	set etape to 1
endif

if ( etape == 1 )
	Player->PlayLoopSound3DVP Underwater 0.0 0.0
	set etape to 2
elseif ( etape == 2 )
	Player->SetPos z 10000
	set etape to 3
elseif ( etape == 3 )
; 	on attend une frame car dès fois, une seule ne suffit pas pour valider
; 	le "StopSound" automatique, quand le PJ n'est plus dans l'eau.
	set etape to 4
elseif ( etape == 4 )
	set son to ( Player->GetSoundPlaying, Underwater )
	Player->StopSound, Underwater
	if ( son == 1 )
		MessageBox "La mèche est hors de l'eau."
		set sousleau to 0; pour le reste du script si besoin
	else
		MessageBox "La mèche est sous l'eau !"
		set sousleau to 1; pour le reste du script si besoin
	endif
	Player->SetPos x posxPJ
	Player->SetPos y posyPJ
	Player->SetPos z poszPJ
	TCL
	set etape to 0
	activate; Ne sert que pour l'essai
endif

end

Voila. Cette version finale a fonctionné dans tous mes essais. Les seuls petits inconvénients que j'ai trouvés sont qu'il se produit un petit éclair très rapide (le PJ est placé en plein ciel pendant 2 frames) et une micro coupure du son Underwater si le PJ est sous l'eau. Mais je pense que ce n'est pas très gênant pour ce que ça permet de faire.  ;)

#19 Finraïl

Finraïl

    Modèle de wiwilandais nanotechnologique


Posté 22 juillet 2009 - 20:29

Voir le messageelendell, le 20.07.2009 à 21:10, dit :

J'ai trouvé la partie détection de la nage mais je n'ai pas vu de détection de l'eau si le PJ ne bouge pas.
En fait, c'est une astuce. une globale est mise à jour quand le pj est sous l'eau (détection de son), et quand on ne sait pas (il est immobile, les footwater ne sont pas détectés), la variable est lue et suivant sa valeur je sais si le PJ est encore sous l'eau ou non.

Voir le messageelendell, le 20.07.2009 à 21:10, dit :

(Au passage, il est très bien ce module !  :blush:)
N'hésite pas à le dire à tes amis  :rolleyes:

Voir le messageelendell, le 20.07.2009 à 21:10, dit :

Note : En me relisant, je m'aperçois que je n'ai pas vérifié quel son est joué quand le PJ marche sur l'eau. Si c'est le même son (les FootWater), en tenez-vous compte dans Mr_Armor pour ne pas appliquer les malus dans ce cas ?
Oui, ce sont les footwater. Du coup, la position en Z du joueur est vérifiée pour savoir s'il est au dessus ou au dessous du niveau d'eau (ajusté au pifomètre pour une race de taille standard).

Not Quite Dead, le 22.06.2006 à 19:42, dit :

[...]un changement avatarien, même infime, est PAS BIEN et nuisible [...]
Les lisez-moi c'est bon, mangez-en !! Image IPB

Fervent Partisan de l'Immuabilité Avatarienne.

Morrowind Renaissance


#20 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 23 octobre 2009 - 13:52

Avec énormément de retard, ne m'étant repenché sur cette histoire que ce matin, mille mercis à elendell pour sa proposition de script qui semble effectivement parfaitement résoudre mon petit problème. sleeping.gif :mrgreen: ;)

J'ai utiliser la variable OnPCDrop comme déclencheur et j'ai dû un peu déplacer certaines sections du script pour éviter des court-circuits avec la partie pillée à Fandorn, mais c'est à présent opérationnel. :D

Je pense probablement donner accès aux bombes via une autre quête dans le module, afin de les rendre accessibles à un plus large public. Le travail que vous avez effectué vaut bien cela!

Encore merci à tous pour votre aide. :D :D :D
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV




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

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