Author Topic: [resolu] Respiration Dans L'eau  (Read 1319 times)

lehezee

  • Poseur de brushs
  • Posts: 119
    • http://www.darkside-c.fr
[resolu] Respiration Dans L'eau
« on: August 10, 2008, 07:41:56 PM »
Bonjour les caskamiens !
Attention ! je fais appels aux Grands scripteur  :)

J'ai trouvé un script dans une map nommé "Ramelle" qui est censé pouvoir faire que l'on respire dans l'eau comme ceci:

barre de respiration qand on est dans l'eau:


Avant que l'on rentre dans l'eau et juste apré en avoir sortie:


Comme on peux le constater, lorsque l'on rentre dans l'eau, l'ecran devient bleu et lorsque l'on en sort... l'ecran redevient normalement progressivement ( oula, sa fait des grands mots sa  :P ).
On peux aussi voir que si on reste trop dans l'eau, la barre defile et lorsque la barre a fait son chemin ba... on meurt de noyade  :lol:

Alors voila j'aimerais savoir comment installé ce magnifique script et/ou il y a du mapping dites le moi  :plz

Ha oui j'oublié... le script de l'eau  :)

Code: [Select]
main()
{
  drownage = getentarray("drown","targetname");
  if (isDefined("drownage"))
  {
  precacheShader("black");
  precacheShader("white");

  level.barsize = 350;
  level.drowntime = 6;
  level.hurttime = 5;

  for(d = 0; d < drownage.size; d++)
  {
  drownage[d] thread water();
  }
 }
}

 Water()
 {
 while (1)
  {
  self waittill("trigger", other);

  if(isPlayer(other) && other istouching(self))
  other thread drown(self);
  }
}
  drown(trigger)
  {
  dceiling = getent(trigger.target,"targetname");
  water_vision = undefined;
  while (self istouching(trigger) && !self istouching(dceiling))
  {
  wait .125;
  if(isDefined(self.drowning))
  return;  
  self.drowning = true;

  if(!isDefined(water_vision))
  {
  water_vision = newClientHudElem(self);
  water_vision.x = 0;
  water_vision.y = 0;
  water_vision setshader ("white", 640, 480);
  water_vision.alignX = "left";
  water_vision.alignY = "top";
  water_vision.horzAlign = "fullscreen";
  water_vision.vertAlign = "fullscreen";
  water_vision.color = (.16, .38, .5);
  water_vision.alpha = .75;
  }


level.barincrement = (level.barsize / (20.0 * level.drowntime));
// level.player allowProne(false);
if(!isDefined(self.progressbackground))
{
  self.progressbackground = newClientHudElem(self);    
  self.progressbackground.alignX = "center";
  self.progressbackground.alignY = "middle";
  self.progressbackground.x = 320;
  self.progressbackground.y = 385;
  self.progressbackground.alpha = 0.5;
}
self.progressbackground setShader("black", (level.barsize + 4), 14);  

if(!isDefined(self.progressbar))
{
  self.progressbar = newClientHudElem(self);    
  self.progressbar.alignX = "left";
  self.progressbar.alignY = "middle";
  self.progressbar.x = (320 - (level.barsize / 2.0));
  self.progressbar.y = 385;
}
self.progressbar setShader("white", 0, 8);  
self.progressbar scaleOverTime(level.drowntime, level.barsize, 8);

self.progresstime = 0;
d = 0;
f = 0;

while(isalive(self) && self istouching(trigger) && !self istouching(dceiling) && (self.progresstime < level.drowntime))
{  
  d ++;
  f ++;
  
  wait 0.05;
  self.progresstime += 0.05;


  if(self.progresstime >= level.hurttime)    
   {
   if(f >= 4)
    {
    radiusDamage(self.origin,10, 7, 7);
    f = 0;
    }
   }
}

if(isalive(self) && self istouching(trigger) && !self istouching(dceiling) && (self.progresstime >= level.drowntime))
{

  self.progressbackground destroy();
  self.progressbar destroy();

  wait 0.025;
  radiusDamage(self.origin,22, 3000, 3000);

  self.drowning = undefined;
  self.sounder = undefined;



  randb = randomInt(4);
  deathmethod1 = " made a hole in the water and lay down quietly to rest forever.";
  deathmethod2 = " paid a long lasting visit to Davy Jones's Locker.";
  deathmethod3 = " went diving without breathing apparatus.";
  deathmethod4 = " swam like a brick.";
  
  if (randb == 0)
  iPrintLn( self.name, deathmethod1);
  if (randb == 1)
  iPrintLn( self.name, deathmethod2);
  if (randb == 2)
  iPrintLn( self.name, deathmethod3);
  if (randb == 3)
  iPrintLn( self.name, deathmethod4);
  wait .05;
  water_vision destroy();
}
else
{
  water_vision.alpha = .5;
  water_vision fadeOverTime(3);
  water_vision.alpha = 0;
  wait 0.05;
  self.progressbackground destroy();
  self.progressbar destroy();
  self.drowning = undefined;
  self.sounder = undefined;
}  
wait .05;
}
        }

Voila je ne vous demande pas ce que fait le script (je viens de vous le dire au debut. si si  :D ). Sa serait gentil au Grand scripteur de me dire comment installé le script car lorsque je le declare simplement dans mon .gsc principal sans mapping (sans targetname etc...) le script ne marche pas :s

Merci les caskamiens de votre aide  :D
« Last Edit: August 28, 2008, 06:03:24 PM by lehezee »


lehezee

  • Poseur de brushs
  • Posts: 119
    • http://www.darkside-c.fr
[resolu] Respiration Dans L'eau
« Reply #1 on: August 17, 2008, 12:08:21 PM »
Vous savez svp ?   :plz  


Juli-One

  • Legomaniaque
  • Posts: 1286
    • http://
[resolu] Respiration Dans L'eau
« Reply #2 on: August 17, 2008, 12:53:11 PM »
C'est sur qu'en le mettant à l'arrache ça ne peut pas marcher  :shh

Je dirais que tu dois mettre un trigger dans l'eau.

Avec comme targetname : drown.

Lequel ça je sais pas  :D Surement un multiple.

Je crois que le script vient de "_drownage.gsc" à activer via ton gsc principal.

Avec cette ligne :  "maps\mp\_drownage::main();"

Le fichier _drownage.gsc doit être mis dans maps/mp dans ton .iwd.

Il y a sûrement d'autre manip à faire dans la map mais je ne vois pas trop.
Peut-être un trigger damage quelquepart.

En tout cas si tu comptes utiliser ce script il faut bien y afficher la source soit par un loadscreen ou soit par un message d'acceuil.  ;)

 

lehezee

  • Poseur de brushs
  • Posts: 119
    • http://www.darkside-c.fr
[resolu] Respiration Dans L'eau
« Reply #3 on: August 18, 2008, 12:34:42 PM »
Merci pour ta reponse mais dans la map "source" ramelle, il n'y a pas de fichier nommée drownage et du coup, lorque je met la ligne
Code: [Select]
maps\mp\_drownage::main();Il y a l'erreur comme quoi il ne peut trouver ce fichier....
Et si j'enleve cette ligne ba le script marche a moitié, je m'explique:

J'arrive a lancer ma map et je suis donc dessus, jusque la pas de probleme. Mais des que je vais dans le trigger multiple avec pour targetname: drown ba la c'est le script qui bug :'(
Je vous prend une video (c'est une map test normal quelle soit pas belle  :rolleyes: ): http://www.dailymotion.com/lehezee02/video...nbug_videogames

Les erreurs:
-Tant que l'on est dans l'eau et que la barre defile, il y a une erreur a la ligne 24 soit:
Code: [Select]
self waittill("trigger", other);
-Des que la barre a fini son chemin et que l'on est en train de mourrir, il y a une erreur a la ligne 145 soit:
Code: [Select]
wait 0.1;
Je ne comprend pas aidez moi svp  :plz
« Last Edit: August 18, 2008, 12:36:42 PM by lehezee »


Juli-One

  • Legomaniaque
  • Posts: 1286
    • http://
[resolu] Respiration Dans L'eau
« Reply #4 on: August 26, 2008, 05:45:07 PM »
Je pense que l'excellent tuto de Kovni pourra t'aider :
M
alheureusement prévu pour COD4 essaye sur COD2 avec ton script mais avec sa méthode de mapping  ;)

http://caskami.clan-nawak.net/index.php?sh...t=0&#entry61788

kovni

  • Tailleur de maps (expérimenté)
  • Posts: 691
    • http://rebels-clan.com
[resolu] Respiration Dans L'eau
« Reply #5 on: August 26, 2008, 08:23:28 PM »
c'est le même système Juli-one. le mapping reste pareil.

Mais lehezee, sert toi du _drown.gsc pour cod2 que tu as déjà  ;)

le targetname est "drown" pour le 1er trigger. duplicate le et supprime la clé "targetname" sur le  2ème trigger.
ensuite tu sélectionne le 1er puis le 2ème et tu les connecte en faisant touche W.
« Last Edit: August 26, 2008, 08:24:12 PM by kovni »
Patience et volonté



Tropheus

  • Legomaniaque
  • Posts: 1432
    • http://tropheus.tropheus.free.fr
[resolu] Respiration Dans L'eau
« Reply #6 on: August 26, 2008, 11:16:42 PM »
Quote

le targetname est "drown" pour le 1er trigger. duplicate le et supprime la clé "targetname" sur le  2ème trigger.
ensuite tu sélectionne le 1er puis le 2ème et tu les connecte en faisant touche W.
je comprends pas la manip que veux lui faire faire Koko.
puisque dans son script

drown est en tableau.

Quote
drownage = getentarray("drown","targetname");

Quel est l'intéret de les relier ensemble?

++

troph




snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
[resolu] Respiration Dans L'eau
« Reply #7 on: August 26, 2008, 11:50:24 PM »
surement à cause du

Code: [Select]
dceiling = getent(trigger.target,"targetname");
Je pense qu'il faudrait procéder ainsi (n'ayant pas COD, je puis me tromper  :unsure: ):

Créer un trigger dans la zone d'eau, sous l'eau, dont la targetname soit "drown". Lorsque le joueur touche ce trigger, il est considéré comme étant dans l'eau, et donc, comme pouvant se noyer.
Mais ce trigger englobe TOUTE la zone d'eau, du plus bas niveau à la surface. Or, si le joueur touche la surface de l'eau, sa bouche et son nez, que l'on réduira à la tête, ne sont pas forcément dans l'eau... Donc il existe des cas où le joueur touche le trigger d'eau, mais ne se noit pas (car il n'a pas la tete sous l'eau!). Un second trigger permet apparemment de corriger ce problème.
Il faut créer un second trigger qui sera posé un peu sous la surface de l'eau. Ce trigger devrait faire 8 unités de haut (cela me parait pas mal) et s'étendre sur toute la zone d'eau: verticalement, il est aprfaitement superposé au trigger de la zone d'eau.
Ensuite, tu relis le trigger "drown" à ce trigger de surface. Une flèche devrait aprtir du trigger "drown" et aller vers celui de surface.

D'apres le script, le joueur sera considéré comme se noyant si deux conditions sont réunies:
- Il touche le trigger drown
- Il ne touche pas le trigger drown.target, c'est à dire le trigger enfant du "drown", c'est encore à dire le trigger "de surface".
Or, vu que les deux trigger se superposent verticalement parfaitement (vu de haut, ils se superposent), l'ensemble de ces deux condition sera équivalent à avoir un joueur qui touche la zone d'eau ET qui n'ait pas la tête au-dessus de la surface! Donc, il se noie!

En résumé:
Un trigger de targetname "drown" qui englobe toute l'eau, qui sera parent du trigger décrit ci-dessous.
Un trigger sans targetname placé à la surface de l'eau, qui se superpose, verticalemenbt, au "drown".



Attention: la récurence, dans le "for" du premier thread, est faite de d=0 à d = <Nombre de trigger drown>-1
Cela me parait étrange car, pour MOH, les tableaux commencent à 1...

Si effectivement tu as une erreur ligne 24, c'est que "self" n'est probablement pas définit. Dans ce cas, je suggèrerait de remplacer le "d=0" de la première boucle "for" par "d=1" et de remplacer le "d<drownage.size" par "d<=drownage.size".
Cela aura pour effet de faire la récurrence de d=1 à d=<Nombre de trigger "drown">, ce qui reste en logique avec MOH, peut-etre pas avec COD (je répète: cette manip' ne serait à faire que si la ligne 24 est erronée dans le script!)

Pour réduire les soucis de ce genre, au lieu du "while(1)", utilise un "while(self)" dont je ne connais pas l'équivalent exact sur COD2 :s
EDIT: ce doit etre "while (IsDefined(self))"

@ bientot!
« Last Edit: August 27, 2008, 10:28:48 AM by snaky »

lehezee

  • Poseur de brushs
  • Posts: 119
    • http://www.darkside-c.fr
[resolu] Respiration Dans L'eau
« Reply #8 on: August 27, 2008, 11:41:12 AM »
Merci a tous d'avoir repondu et... sa marche !!!!   :D

Bon alor pour ceux qui n'auraient pas suivi il faut:
-Mettre un trigger multiple qui englobe TOUTE l'eau et lui donner sa: "targetname" (en clé) et "drown" (en valeur)

-Mettre un second trigger multiple a 10unité au dessus de l'eau (ce trigger representera la tete qui sort de l'eau

-Selectionner en premier le trigger qui est DANS l'eau avec le targetname: drown puis selectionner le deuxieme trigger au dessus de l'eau (attention l'ordre est important)

-Une fois les deux triggers selectionné, appuyez sur la touche W (une fleche rouge apparait alors, c'est normal ^^ )

Et voila c'est fini pour le mapping ;)
Dans le .gsc principal il faut ajouter cette ligne
Code: [Select]
maps\mp\respiration_eau::main();Pour declarer le fichier qui permet la respiration.


Quoi vous n'avez toujours pas compris  :P
Bon allez je vous est fait une ptite map pour exemple  B)
Pour la telecharger c'est la ---> http://rapidshare.com/files/140475937/mp_respi.rar

Dedans vous trouverais un fichier .iwd avec la map deja prete, dans un autre fichier vous trouverez la structure de l'iwd (tout les fichier necessaire y compris le fichier respiration_eau.gsc) et evidemment le .map est fourni ;)


kovni

  • Tailleur de maps (expérimenté)
  • Posts: 691
    • http://rebels-clan.com
[resolu] Respiration Dans L'eau
« Reply #9 on: August 27, 2008, 11:08:59 PM »
Slt troph,

lehezee et surtout snaky, ont bien expliqué le système .

Le 1er trigger (celui de l'eau) sert a declenché la noyade mais tant que la tête touche le 2 ème trigger, il n'y a pas noyade.

le fait de supprimer la clé sur le 2ème trigger s'explique par le fait que c'est un duplicate du 1er, pour mapper + vite.  ;)

Pour cod4, j'ai modifié quelques lignes dans le drown.gsc car celui de cod2 ne fonctionnait pas.

J'ai mis un post dans tuto du forum cod4 :)

salut ma poule
« Last Edit: August 27, 2008, 11:09:15 PM by kovni »
Patience et volonté



Juli-One

  • Legomaniaque
  • Posts: 1286
    • http://
[resolu] Respiration Dans L'eau
« Reply #10 on: August 28, 2008, 01:35:55 AM »
Si possible mettre [Résolu] dans le titre du post ça fait plus clean.

Merci  ;)  

lehezee

  • Poseur de brushs
  • Posts: 119
    • http://www.darkside-c.fr
[resolu] Respiration Dans L'eau
« Reply #11 on: August 28, 2008, 06:04:15 PM »
Voila j'ai modifié le titre Juli-One ;)
Et encore merci a tous pour votre aide  :wub:  


Tropheus

  • Legomaniaque
  • Posts: 1432
    • http://tropheus.tropheus.free.fr
[resolu] Respiration Dans L'eau
« Reply #12 on: August 28, 2008, 11:20:12 PM »
Quote
surement à cause du

Code: [Select]
dceiling = getent(trigger.target,"targetname");
Je pense qu'il faudrait procéder ainsi (n'ayant pas COD, je puis me tromper  :unsure: ):

Créer un trigger dans la zone d'eau, sous l'eau, dont la targetname soit "drown". Lorsque le joueur touche ce trigger, il est considéré comme étant dans l'eau, et donc, comme pouvant se noyer.
Mais ce trigger englobe TOUTE la zone d'eau, du plus bas niveau à la surface. Or, si le joueur touche la surface de l'eau, sa bouche et son nez, que l'on réduira à la tête, ne sont pas forcément dans l'eau... Donc il existe des cas où le joueur touche le trigger d'eau, mais ne se noit pas (car il n'a pas la tete sous l'eau!). Un second trigger permet apparemment de corriger ce problème.
Il faut créer un second trigger qui sera posé un peu sous la surface de l'eau. Ce trigger devrait faire 8 unités de haut (cela me parait pas mal) et s'étendre sur toute la zone d'eau: verticalement, il est aprfaitement superposé au trigger de la zone d'eau.
Ensuite, tu relis le trigger "drown" à ce trigger de surface. Une flèche devrait aprtir du trigger "drown" et aller vers celui de surface.

D'apres le script, le joueur sera considéré comme se noyant si deux conditions sont réunies:
- Il touche le trigger drown
- Il ne touche pas le trigger drown.target, c'est à dire le trigger enfant du "drown", c'est encore à dire le trigger "de surface".
Or, vu que les deux trigger se superposent verticalement parfaitement (vu de haut, ils se superposent), l'ensemble de ces deux condition sera équivalent à avoir un joueur qui touche la zone d'eau ET qui n'ait pas la tête au-dessus de la surface! Donc, il se noie!

En résumé:
Un trigger de targetname "drown" qui englobe toute l'eau, qui sera parent du trigger décrit ci-dessous.
Un trigger sans targetname placé à la surface de l'eau, qui se superpose, verticalemenbt, au "drown".



Attention: la récurence, dans le "for" du premier thread, est faite de d=0 à d = <Nombre de trigger drown>-1
Cela me parait étrange car, pour MOH, les tableaux commencent à 1...

Si effectivement tu as une erreur ligne 24, c'est que "self" n'est probablement pas définit. Dans ce cas, je suggèrerait de remplacer le "d=0" de la première boucle "for" par "d=1" et de remplacer le "d<drownage.size" par "d<=drownage.size".
Cela aura pour effet de faire la récurrence de d=1 à d=<Nombre de trigger "drown">, ce qui reste en logique avec MOH, peut-etre pas avec COD (je répète: cette manip' ne serait à faire que si la ligne 24 est erronée dans le script!)

Pour réduire les soucis de ce genre, au lieu du "while(1)", utilise un "while(self)" dont je ne connais pas l'équivalent exact sur COD2 :s
EDIT: ce doit etre "while (IsDefined(self))"

@ bientot!
J'aime bien quand mon élève m'explique c'est tout de suite plus clair....

Merci Snaky :wub:  pour ton explication  

Merci Koko pour ton tuto.

Troph

PS Koko j'ai commencé à scripté Tréogat (Et on a trouvé un modeler qui nous fait les canons qui nous manquaient)

Bises mes poules!!!

 




kovni

  • Tailleur de maps (expérimenté)
  • Posts: 691
    • http://rebels-clan.com
[resolu] Respiration Dans L'eau
« Reply #13 on: August 29, 2008, 04:11:27 PM »
ne m'oublie pas, ma poule, je veux testé  les maps  ;)  
Patience et volonté



chtigreg

  • Tailleur de maps
  • Posts: 286
[resolu] Respiration Dans L'eau
« Reply #14 on: October 20, 2010, 11:59:28 PM »
salut,

aller, pas sur que j'aurai une réponse, mais enfin je me lance....

le script marche très bien sauf que......ça ne fonctionne que 14 fois !! alors je ne sais pas dire si ça fonctionne 14 fois pour chaque player ou si c'est 14 fois pour l'ensemble des players. bref ma question n'est pas là mais là --> pourquoi 14 fois ? ce sont les triggers multiples qui ont cette "propriété" ou c'est le script qui veut ça ?
j'avoue qu'il y a bien un chiffre "14" dans le script mais rien à voir (il sert à définir l'épaisseur du fond de la barre de progression (ouai j'ai essayé, et alors   lol)).
une idée les amis ?

a+