[résolu] Détecter Une Chute Critique
#1
Posté 27 décembre 2005 - 04:16
J'aimerais remplacer le son de la chute (avec blessure, qui, par défaut, semble être le même son qu'un coup reçu) par un autre. Pour cela, il faudrait que je puisse anticiper le moment d'une chute critique.
Merci
#2
Posté 27 décembre 2005 - 14:51
On pourrait peut être détecter la chute en relevant la position sur l'axe Z du Player constemment toutes les 0,X secondes, et du son et de la réduction de vie/son de blessure joué. Assez lourd au final.
#3
Posté 27 décembre 2005 - 16:11
En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.
#4
Posté 27 décembre 2005 - 16:32
Angora, le 27.12.2005 à 16:11, dit :
Ca m'étonne qu'il soit impossible de détecter une chute critique... puisque, quand ça se produit, c'est suivi par une animation bien particulière... N'y a-t-il pas moyen de détecter ces deux conditions : retomber sur le sol + dégâts ? (puisque c'est ce qui se produit lorsqu'on chute de trop haut)... ? non ?
#5
Posté 27 décembre 2005 - 16:54
En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.
#6
Posté 27 décembre 2005 - 18:04
On peut en effet détecter le moment où il retombe sur le sol et se blesse, mais cela nécessitera un script global qui tourne en permanence, ainsi que plusieurs expérimentations.
#7
Posté 27 décembre 2005 - 22:03
Comme j'ai déjà un script global qui tourne dans mon mod, je pense que rajouter quelques lignes ne changera pas grand chose... Peux-tu me donner un exemple de script pour détecter une chute critique (en fonction de la position de joueur et des dégâts subis, par exemple) ? J'ai envie d'expérimenter.
Merci.
#8
Posté 28 décembre 2005 - 12:16
BEGIN Script Detection_Chute_sur_BESTIOLE float PJPosZ_encours float PJPosZ_prev float distance_mini_chute if ( MenuMode == 1 ) Return endif ; si lévitation, on ne fait rien. ; if ( Player->GetEffect "sEffectLevitate" == 1 ) Return endif Set PJPosZ_encours to ( Player->GetPos, Z ) ; Si le PJ se prend un coup, et qu'il est en train de tomber, on considère que c'est une chute critique. ; if ( Player->GetSoundPlaying "Son_Coup_Pris" == 1 ); regarader sous TESCS l'ID du son. if ( ( PJPosZ_prev - PJPosZ_encours ) >= 30 ); valeur prise au hasard, il faudrait faire des tests. PlaySound "TON_SON_DE_CHUTE"; mets l'ID de ton son. endif endif Set PJPosZ_prev to PJPosZ_encours END
Ce script n'est pas encore très lourd, mais il comporte quelques problèmes. J'en appelle aux autres scripteurs/modeurs:
- Si le joueur pousse le son de blessure au cours de sa chute, ton son sera déclenché.
- Est-ce que les changements de positions du PJ, à chaque changement de frame, prennent en compte la différence de temps entre la frame et la précédente? Si oui, si ca lag, si PJ descend à pied une montagne de forte pente, et si il pousse le son de blessure, il se peut que le script déclenche ton son de chute.
Ensuite, me vient une interrogation: à quel moment une chute est-elle considérée comme critique? A partir d'une certaine vitesse de chute, ou d'une certaine distance?
Si c'est la vitesse, alors il y a 2 choses:
- L'acrobatie n'est pas gérée. Il faudrait tester la valeur pour une acrobatie minimale, ou voir si il y a proportionnalité. Gérer l'acrobatie permettrait d'affiner les tests.
- Il ne gère pas l'effet Chute ralentie. Là, il faudrait tester si la chute est critique à la même vitesse (au moins) que sans l'effet magique..Si non, tester si cette vitesse minimale critique est proportionnelle à la magnitude de l'effet magique, où qu'il y est une fonction TESCS-able associée.
Si c'est la distance, impossible de gérer l'effet Chute ralentie et l'Acrobatie avec ce script. Il faudrait en faire un autre plus compliqué, qui détecterait et mémoriserait l'altitude initiale et celle finale d'une chute. Mais ca ouvrirait une optique intéressante: déclencher un son genre "Aaaaaaaahhhh!" quand la chute devient trop longue.
Modifié par MysticalShadow, 28 décembre 2005 - 12:20.
#9
Posté 31 décembre 2005 - 12:44
Voici les deux scripts (apparemment avec quelques oublis)... Le premier s'inspire de celui de MysticalShadow en ajoutant une variable temps (j'ignore pourquoi):
Begin Fall_Test short PJPosZ_encours short PJPosZ_prev short Distance float Timer if ( MenuMode == 1 ) Return endif if ( ( player->GetEffect "sEffectLevitate" ) == 1 ) Return endif if ( Timer < 0.2 ) Set Timer to ( Timer + GetSecondsPassed ) Return endif Set Timer to 0 Set PJPosZ_encours to ( player->GetPos, Z ) if ( ( player->GetSoundPlaying "Health Damage" ) == 1 ) Set Distance to ( PJPosZ_prev - PJPosZ_encours ) PlaySound "NOUVEAU SON" Set AcrobaticsSkill to ( player->GetAcrobatics ) MessageBox "You fell g% units. Your Acrobatics are g%." Distance AcrobaticsSkill endif Set PJPosZ_prev to PJPosZ_encours End Fall_Test
Apparemment, le scripteur a oublié une ligne "short AcrobaticsSkill" que j'ai rajoutée (sinon j'avais un message d'erreur en sauvegardant le script)
Le second, plus long :
Begin Script_Detection_Chute short PJPosZ_counter short PJPosZ_encours short PJPosZ_prev1 short PJPosZ_prev2 short PJPosZ_prev3 short PJPosZ_prev4 short PJPosZ_prev5 short PJPosZ_prev6 short PJPosZ_prev7 short PJPosZ_prev8 short PJPosZ_prev9 short PJPosZ_prev10 short PJPosZ_prev11 short PJPosZ_prev12 short PJPosZ_prev13 short PJPosZ_prev14 short PJPosZ_prev15 short PJPosZ_prev16 short PJPosZ_prev17 short PJPosZ_prev18 short PJPosZ_prev19 short PJPosZ_prev20 short Health_prev short Distance if ( MenuMode == 1 ) Return endif if ( PJPosZ_counter == 0 ) Set Distance to prev1 - PJPosZ_encours Set PJPosZ_prev1 to PJPosZ_encours elseif ( PJPosZ_counter == 1 ) Set Distance to prev2 - PJPosZ_encours Set PJPosZ_prev2 to PJPosZ_encours elseif ( PJPosZ_counter == 2 ) Set Distance to prev3 - PJPosZ_encours Set PJPosZ_prev3 to PJPosZ_encours elseif ( PJPosZ_counter == 3 ) Set Distance to prev4 - PJPosZ_encours Set PJPosZ_prev4 to PJPosZ_encours elseif ( PJPosZ_counter == 4 ) Set Distance to prev5 - PJPosZ_encours Set PJPosZ_prev5 to PJPosZ_encours elseif ( PJPosZ_counter == 5 ) Set Distance to prev6 - PJPosZ_encours Set PJPosZ_prev6 to PJPosZ_encours elseif ( PJPosZ_counter == 6 ) Set Distance to prev7 - PJPosZ_encours Set PJPosZ_prev7 to PJPosZ_encours elseif ( PJPosZ_counter == 7 ) Set Distance to prev8 - PJPosZ_encours Set PJPosZ_prev8 to PJPosZ_encours elseif ( PJPosZ_counter == 8 ) Set Distance to prev9 - PJPosZ_encours Set PJPosZ_prev9 to PJPosZ_encours elseif ( PJPosZ_counter == 9 ) Set Distance to prev10 - PJPosZ_encours Set PJPosZ_prev10 to PJPosZ_encours elseif ( PJPosZ_counter == 10 ) Set Distance to prev11 - PJPosZ_encours Set PJPosZ_prev11 to PJPosZ_encours elseif ( PJPosZ_counter == 11 ) Set Distance to prev12 - PJPosZ_encours Set PJPosZ_prev12 to PJPosZ_encours elseif ( PJPosZ_counter == 12 ) Set Distance to prev13 - PJPosZ_encours Set PJPosZ_prev13 to PJPosZ_encours elseif ( PJPosZ_counter == 13 ) Set Distance to prev14 - PJPosZ_encours Set PJPosZ_prev14 to PJPosZ_encours elseif ( PJPosZ_counter == 14 ) Set Distance to prev15 - PJPosZ_encours Set PJPosZ_prev15 to PJPosZ_encours elseif ( PJPosZ_counter == 15 ) Set Distance to prev16 - PJPosZ_encours Set PJPosZ_prev16 to PJPosZ_encours elseif ( PJPosZ_counter == 16 ) Set Distance to prev17 - PJPosZ_encours Set PJPosZ_prev17 to PJPosZ_encours elseif ( PJPosZ_counter == 17 ) Set Distance to prev18 - PJPosZ_encours Set PJPosZ_prev18 to PJPosZ_encours elseif ( PJPosZ_counter == 18 ) Set Distance to prev19 - PJPosZ_encours Set PJPosZ_prev19 to PJPosZ_encours elseif ( PJPosZ_counter == 19 ) Set Distance to prev20 - PJPosZ_encours Set PJPosZ_prev20 to PJPosZ_encours Set PJPosZ_counter to -1 endif Set PJPosZ_encours to ( player->GetPos, Z ) Set PJPosZ_counter to ( PJPosZ_counter + 1 ) if ( ( player->GetEffect "sEffectLevitate" ) == 1 ) elseif ( ( player->GetHealth ) < Health_prev ) if ( Distance >= 30 ); this value can be changed. PlaySound "NEW_SOUND_FOR_CRITICAL_FALL". MessageBox "Now you should hear the sound." endif MessageBox "You fell g% units." Distance endif Set Health_prev to ( Player->GetHealth ) End Script_Detection_Chute
Apparemment là aussi il y a une erreur lorsque je sauvegarde:
"Set Distance to prev1 - PJPosZ_encours"
Je pense qu'il s'agit d'une erreur de syntaxe et j'ai rectifié en :
"Set Distance to PJPosZ_prev1 - PJPosZ_encours" (et pour toutes les lignes suivantes)
Malheureusement, ça ne fonctionne toujours pas. Ce qui m'étonne, c'est que le scripteur n'a pas recours aux commandes GetSoundPlaying, Stopsound et Playsound, pour remplacer le son par défaut... dès lors je ne vois pas trop comment ces scripts peuvent parvenir au résultat escompté.
Est-ce que qqun voit un moyen de faire fonctionner l'un de ces scripts (ou celui de MysticalShadow) à partir de ça ?
Merci.
#10
Posté 31 décembre 2005 - 14:33
Voilà, si tu corriges les sons pour les dégâts hors-coups (comme la chute), alors, à moins que ce ne soit déjà fait, il faudrait aussi faire quelque chose pour la lave (et les utilisations de HurtStandingActor/HurtCollidingActor). Ça m'a toujours interloqué d'entendre "Baf ! Baf ! Baf !" quand quelqu'un se noie dans un lac de lave...
En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.
#11
Posté 31 décembre 2005 - 16:36
@Mordicus: On ne peut malheureusement pas arrêter le son de la blessure. En effet, StopSound n'arrête que les sons joués en boucle (via PlayLoopSound). On ne peut donc faire qu'une superposition des 2 sons.
Le 2e script que t'a proposé le scripteur talenteux, il ne me paraît pas fameux. J'ai eu la même idée, confrontée au même problème: trop de tests, donc torp de performances bouffées pour un événement qui n'arrive pas souvent.
D'ailleurs il a semblé concevoir ses scripts pour que tu puisses expérimenter, et faire part de tes résultats pour rendre le script fonctionnel...car il va falloir faire plusieurs tests si l'on souhaite faire quelquechose d'efficace.
Mais déjà, il faudrait savoir si la chute du PJ s'accélère dans le temps, et si il y a un seuil de durée à partir duquel la vitesse ne croît plus.
#12
Posté 01 janvier 2006 - 23:56
Angora, le 31.12.2005 à 14:33, dit :
MysticalShadow, le 31.12.2005 à 16:36, dit :
Citation
Dans le cas de la chute, en revanche, la son de "Damage health" immédiatement suivi d'un son de chute, ça peut rendre pas mal... Il faut que je procède à des essais. Mais je n'ai toujours pas de script qui fonctionne.
Citation
Voici encore deux scripts que je cherche à faire (si quelqu'un peut aider):
- un script qui détecte quand le PJ marche sur du bois (par exemple, le petit pont en bois de Seyda Nihyn), pour changer le bruit des pas dans ce cas là.
- un script qui arrête la musique d'exploration et de combats (en jouant un mp3 silencieux), lorsque les sons "haunted" et "Spirit voices" (bruits d'ambiance toujours présents dans les tombes) sont actifs... en partant, par exemple, de:
if ( GetSoundPlaying "haunted" == 1 ) StreamMusic "silence.mp3" etc...(De façon à ce que, dès que le joueur sortira de la tombe, la musique habituelle reprenne.)
J'ai fait un script tout bête qui ne marche pas.
Modifié par Mordicus, 01 janvier 2006 - 23:57.
#13
Posté 08 janvier 2006 - 21:37
Grâce un gros coup de pouce de l'ami Abot, voici le script pour ceux que ça pourrait intéresser:
begin Detection_Chute float PJPosZ_encours float PJPosZ_prev if ( MenuMode == 1 ) Return endif if ( Player->GetEffect sEffectLevitate == 1 ) Return endif Set PJPosZ_encours to ( Player->GetPos, Z ) if ( Player->GetSoundPlaying "Health Damage" == 1 ) set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours ) MessageBox "delta Z per frame %f" PJPosZ_encours; cette ligne sert seulement au débuggage. if ( PJPosZ_encours >= 30 ); cette valeur peut être modifiée. player->StopSound "Health Damage" player->PlaySound3D "Body Fall Large"; mettre l'ID du nouveau son désiré. endif endif Set PJPosZ_prev to PJPosZ_encours End
Sinon, pour changer le bruit des dégâts causés par la lave, voici le script d'origine:
begin lava if ( menumode == 1 ) return endif if ( CellChanged == 0 ) if ( GetSoundPlaying "lava layer" == 0 ) PlayLoopSound3DVP "lava layer", 1.0, 1.0 endif endif HurtStandingActor, 20.0 ;20 pts of damage a sec end lava
C'est évidemment la dernière ligne qu'il faudrait changer, afin qu'un son de brûlure puisse être joué. Est-ce que quelqu'un voit comment remplacer "HurtStandingActor, 20.0" par une formule équivalente permettant de causer des dégâts et de jouer un son sur mesure
#14
Posté 09 janvier 2006 - 10:58
Mais on pourrait peut-être faire ça :
if ( GetStandingPC == 1 ) if ( timer >= 1 ) Player->ModCurrentHealth -20 set timer to 0 endif player->PlaySound3D "ça crame"; pour le choix du son, je te laisse te débrouiller :) elseif ( GetStandingActor == 1 ) HurtStandingActor 20 PlaySound3D "ça crame" endif
Inconvénient : si le joueur et un autre acteur sont sur la même plaque de lave, l'autre acteur ne subit aucun dégâts.
Alternative, on utilise endif suivi de if au lieu de elseif, mais alors dans un tel cas le joueur se prend doubles dégâts.
En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.
#15
Posté 11 janvier 2006 - 21:54
Ceci me paraît simple:
begin lava if ( menumode == 1 ) return endif if ( CellChanged == 0 ) if ( GetSoundPlaying "lava layer" == 0 ) PlayLoopSound3DVP "lava layer", 1.0, 1.0 endif endif HurtStandingActor, 20.0 ;20 pts of damage a sec if ( GetStandingPC == 0 ) Return endif Set timer to ( timer + GetSecondsPassed ) if ( timer >= 1 ) PlaySound3D "ça crame" Set timer to 0 endif end lavaIl y a un piège?
@Mordicus: Il y a une petite bourde dans le script que tu proposes. Mieux vaut remplacer ceci:
Citation
MessageBox "delta Z per frame %f" PJPosZ_encours; cette ligne sert seulement au débuggage.
if ( PJPosZ_encours >= 30 ); cette valeur peut être modifiée.
set PJPosZ_prev to ( PJPosZ_prev - PJPosZ_encours ) MessageBox "delta Z per frame %f" PJPosZ_prev; cette ligne sert seulement au débuggage. if ( PJPosZ_prev >= 30 ); cette valeur peut être modifiée.Sinon, ce qui m'intrigue, c'est que le "30" soit la bonne valeur. La messagebox te donne une valeur proche de 30?
Modifié par MysticalShadow, 12 janvier 2006 - 07:22.
#16
Posté 11 janvier 2006 - 22:55
Pour la lave:
- avec le script d'Angora, rien ne se passe quand je marche sur la lave. Pas de dégâts, et pas de son.
- avec ton script Mystical, le TESCS renvoie une erreur et ne semble pas comprendre la commande GetStandingPJ.
Pour les chutes critiques, il y a en fait un problème dans le script que j'ai présenté plus haut, qui n'est pas réglé. C'est que lorsqu'on reçoit des dégâts importants (+ de 30) dans un combat, le son "damage health" est aussi remplacé par le son de la chute.
Voici quel était le script (j'y ai rajouté deux conditions pour que le son varie en fonction de la gravité de la chute):
begin Detection_Chute float PJPosZ_encours float PJPosZ_prev if ( MenuMode == 1 ) Return endif if ( Player->GetEffect sEffectLevitate == 1 ) Return endif Set PJPosZ_encours to ( Player->GetPos, Z ) if ( Player->GetSoundPlaying "Health Damage" == 1 ) set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours ) MessageBox "delta Z per frame %f" PJPosZ_encours if ( PJPosZ_encours >= 30 ) player->StopSound "Health Damage" if ( PJPosZ_encours >= 90 ) player->PlaySound3D "Critical Fall" endif if ( PJPosZ_encours >= 60 ) player->PlaySound3D "WolfHit2" endif endif endif end detection_chute
Ce script marche très bien pour le son des chutes, mais en combat le son "health damage' est remplacé par "critical fall".
Suite à cela, Abot m'a donné un second script à essayer:
begin Detection_Chute float PJPosZ_encours float PJPosZ_prev if ( MenuMode == 1 ) Return endif if ( Player->GetEffect sEffectLevitate == 1 ) Return endif Set PJPosZ_encours to ( Player->GetPos, Z ) ; everything in a line to the right of a; is a comment if ( Player->GetSoundPlaying "Health Damage" == 1 ) set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours ) ; next line is for debugging only MessageBox "delta Z per frame %f" PJPosZ_encours ; next line means: if, and only if, PJPosZ_encours >= 30 do the next block ( block = next indented lines ) if ( PJPosZ_encours >= 30 ); change sound only if falling speed is high enough player->StopSound "Health Damage"; first thing, stop the sound if falling speed is high enough ; next if/elseif will choose the 1 sound to play instead. notice how ; the indentation helps understanding block start/end if ( PJPosZ_encours >= 90 ) player->PlaySound3D "Critical Fall" ; next line means: if - and only if - previous if condition is false ( PJPosZ_encours < 90 ) do the next block elseif ( PJPosZ_encours >= 60 ) player->PlaySound3D "WolfHit2" ; next line means: if ( PJPosZ_encours < 60 ) do the next block else player->PlaySound3D "Body Fall Medium" endif; end of if ( PJPosZ_encours >= 90 ) block endif; end of if ( PJPosZ_encours >= 30 ) block endif; end of if ( Player->GetSoundPlaying... block Set PJPosZ_prev to PJPosZ_encours End Detection_Chute
Ce second script résoud 1 problème (plus de son de chute pendan les combats), mais il a deux autres problèmes:
- on n'entend plus la différence de son selon la gravité de la chute (c'est toujours le même son, alors que ça marchait dans le script précédent)
- pendant les combats, tout se passe bien, sauf, quand on est sous l'eau (combat avec un poisson carnacier, par exemple) ou quand on marche sur la lave (justement ): dans ces deux cas le son des dégâts (damage health) est remplacé par le son de la chute...
Je suis bloqué ici. Si vous avez une idée...
EDIT:
Citation
Modifié par Mordicus, 11 janvier 2006 - 22:59.
#17
Posté 12 janvier 2006 - 07:28
Je continue de penser que tes bugs sont dûs à cette ligne:
set PJPosZ_encours to ( PJPosZ_prev - PJPosZ_encours )IL ne faut pas utilier la variable PJPoszZ_encours, car à la fin du script il y a cette entrée:
Set PJPosZ_prev to PJPosZ_encoursMieux vaut utiliser l'autre variable. Voilà ce que ca donne:
#18
Posté 12 janvier 2006 - 10:48
MysticalShadow, le 11.01.2006 à 21:54, dit :
Parce que le son de dégâts entrainé par HurtStandingActor est celui qu'on ne veut plus entendre.
Dans le bout de script proposé, on utilise HurtStandingActor pour blesser les autres créatures, puisqu'il n'y a pas moyen de faire autrement, et en partant du principe que le son sera moins fort que pour le joueur.
Mordicus, le 11.01.2006 à 22:55, dit :
Tu n'as pas oublié de mettre un set timer to ( timer + GetSecondsPassed ) avant, par hasard ?
En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.
#19
Posté 12 janvier 2006 - 11:48
- Par contre, pour les chutes, ça à l'air de fonctionner très bien (y compris sous l'eau). Mais je dois faire encore quelques essais pour être sûr que tout est parfait.
Il y a juste un "endif" en trop à la fin du script.
Citation
Et merci pour votre aide!
#20
Posté 12 janvier 2006 - 19:56
begin _s_detection_chute short IsJumping float CurrentLife if ( GetPCJumping ) MessageBox "Ahhh" Set IsJumping to 1 Set CurrentLife to ( player->GetHealth ) else if ( IsJumping == 1 ) Set IsJumping to 0 if ( player->GetHealth != CurrentLife ) MessageBox "Aie ! ca fait mal" else MessageBox "Même pas mal d'abbord;)" endif endif endif end
Seuls problemes :
- Il est tribunal requis
- Il ne marche que si le joueur se fait mal apres avoir sauter avec le bouton [saut]. Il ne detecte donc pas si tu tombes d'une falaise en marchant
Avantages :
- Il fait la difference entre le faite de de faire frapper pendant le saut et au moment de la chute
#21
Posté 12 janvier 2006 - 20:57
Pour la lave: le script marche maintenant (j'ai aussi ajouté un "float timer") mais le son est joué de façon répétée et saccadée (il est répété plusieurs fois de suite sans être joué en entier). Il doit y avoir un réglage à faire au niveau du timer, pour que le son ne soit pas rejoué avant quelques secondes (le temps que le son se termine).
Question accessoire: il aurait été bien qu'avec ce nouveau son (quand il marchera...) que je puisse rajouter l'effet "lueurs rouges" (celui que l'on peut voir lorsqu'on se noye, le bord de l'écran devant alors rouge et clignotant, comme pour simuler l'agonie...). Est-ce que c'est scriptable ?
Pour le script de détection de chute: ben non, finalement ça ne marche toujours pas. Il y a toujours deux problèmes:
- celui d'arriver à jouer un son différent en fonction de la gravité de la chute (ce problème pourrait être réglé en n'utilisant qu'un seul son pour les chutes critiques) - j'ai soit toujours le même son, soit les trois sons à la fois.
- celui de faire la différence entre les coups reçu et les chutes (un script précédent fourni par Abot semblait fonctionner, mais pas dans certains cas: sous l'eau, sur la lave, etc.). A chaque fois que je reçois des coups et que le son de la chute est joué, le débuggage indique "Z = 0.0000 frame". Je ne sais pas trop bien comment intérpréter ça. Les chutes dans l'eau font aussi des dégâts, ce qui n'est pas normal je pense...
@ Fandorn : merci, ça peut-être intéressant. Mais il faudrait pour l'instant que j'arrive à différencier correctement un chute (involontaire) d'un coup... Le script d'Abot y arrivait presque, sauf dans des cas particuliers.
Pour la nécessité d'avoir le Tribunal installé, j'ai déjà besoin de recourrir à un start script pour autre chose, donc ce sera nécessaire de toute façon...
--------------------
Question un peu à part: Est-ce qu'il serait possible de faire un script détectant le niveau d'un ennemi/monstre qui attaque et de le comparer à celui du joueur ?
#22
Posté 12 janvier 2006 - 21:35
Mordicus, le 12.01.2006 à 20:57, dit :
Il faut alors mettre un deuxième timer et régler selon la durée du son de brûlure. On va dire que ce son dure trois secondes pour l'exemple :
begin lava float timer float timer2 if ( menumode == 1 ) return endif if ( GetStandingPC == 1 ) if ( timer >= 1 ) Player->ModCurrentHealth -20 set timer to 0 endif if ( timer2 >= 3 ) set timer2 to 0 endif if ( timer2 == 0 ) player->PlaySound3D "brulure"; pour le choix du son, je te laisse te débrouiller :) endif elseif ( GetStandingActor == 1 ) HurtStandingActor 20 if ( timer2 >= 3 ) set timer2 to 0 endif if ( timer2 == 0 ) PlaySound3D "brulure" endif else set timer to 0 set timer2 to 0 return endif set timer to ( timer + GetSecondsPassed ) set timer2 to ( timer2 + GetSecondsPassed ) end lava
Au menu, insertion de timer2 pour le son et déplacement de la mise à jour de la variable à après pour que timer2 soit égal à 0 quand le joueur ou quelqu'un d'autre vient de mettre le pied sur la lave.
Mordicus, le 12.01.2006 à 20:57, dit :
Pas à ma connaissance.
Mordicus, le 12.01.2006 à 20:57, dit :
Hélas, non. Pas moyen de travailler sur des références ou des pointeurs...
Bon, en pratique, si c'est possible. Mais au lieu de faire un script global, il faut faire des script locaux collés sur chaque ennemi ou monstre. Ce qui implique donc de modifier des tas de scripts préexistants pour rajouter la portion de code concernée. L'horreur.
Modifié par Angora, 12 janvier 2006 - 21:36.
En français, il n'y a jamais, jamais, JAMAIS, J-A-M-A-I-S, de cédille à un 'c' devant un 'e', un 'i' ou un 'y'. Jamais. Sans aucune exception. Pas la moindre. Zéro. Cédille devant e, i ou y = faute. Un point, c'est tout, c'est comme ça, ça a toujours été comme ça, et ça le sera toujours.
#23
Posté 12 janvier 2006 - 21:46
BEGIN Detection_Chute float PJPosZ_encours float PJPosZ_prev float chute if ( MenuMode == 1 ) Return endif if ( Player->GetEffect sEffectLevitate == 1 ) Return endif Set PJPosZ_encours to ( Player->GetPos, Z ) if ( chute > 0 ) ; test pour savoir si on est blessé lors de l'aterrissage. if ( ( PJPosZ_prev - PJPosZ_encours ) <= 5 ) if ( GetInterior == 0 ) , tests poru savoir si le PJ chute dans de l'eau. if ( PJPosZ_encours < 0 ) Set chute to 0 endif else if ( PJPosZ_encours <= GetWaterLevel ) Set chute to 0 endif endif if ( chute >= 90 ) Player->PlaySound3D "Critical Fall" elseif ( chute >= 60 ) Player->PlaySound3D "WolfHit2" elseif ( chute >= 30 ) player->PlaySound3D "Body Fall Medium" endif endif Set chute to 0 endif if ( Player->GetSoundPlaying "Health Damage" == 1 ) Set chute to ( PJPosZ_prev - PJPosZ_encours ) MessageBox "delta Z per frame %f" chute endif Set PJPosZ_prev to PJPosZ_encours ENDIl devrait différencier les coups pris des blessures de l'atterissage, mais le bruit de la blessure n'est pas arrêté.
Reste à trouver un moyen de détecter le fait que le PJ soit dans l'eau. Il y a-t-il une fonction adéquate?
Quant au script lava, j'ai oublié de déclarer la variable float timer, désolé. De toute facon mon script n'empêchait pas le bruit de blessure d'être joué, et ce n'est pas ce qui est souhaité.
Modifié par MysticalShadow, 14 janvier 2006 - 18:08.
#24
Posté 12 janvier 2006 - 21:54
A l'interieur l'axe Z est faussé
Si Dehors & Z<0 alors on est sous l'eau
sinon y'a un truc mais je ne suis pas sur !
quand on tombe sous l'eau, on n'a pas le temps de prendre sa respiration ( a verifier )
donc on se noie ... et un son special est jouer.
#25
Posté 12 janvier 2006 - 21:56
0 utilisateur(s) li(sen)t ce sujet
0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)