Author Topic: gas_mask  (Read 670 times)

tpt

  • Apprenti poseur de brushs
  • Posts: 66
gas_mask
« on: July 23, 2010, 11:11:48 PM »
Salut,

je voulais savoir comment faire pour enlever le gasmask a un point précis avec un trigger multiple comme pour activer le gasmask

le script

Code: [Select]
exec global/ai.scr
exec global/loadout.scr maps/test_mask2.scr
main:
     level waittill prespawn
         exec global/ambient.scr test_mask2
     level waittill spawn
         $player item weapons/mp44.tik
         $player ammo mg 1000
         waitthread global/items.scr::add_item "gasmask" 1
    level.script="map/test_mask2.scr"
end
////////////////////////
porter_le_masque:
         iprintlnbold_noloc "Il vaut mieux porter son masque à gaz à partir de cette limite"//affiche cettte phrase à l'écran en même temps que l'on met le masque.
         huddraw_shader 200 "textures/hud/gasmask_overlay"
         huddraw_align 200 left top
         huddraw_rect 200 0 0 640 480
         huddraw_virtualsize 200 1
         huddraw_color 200 1 1 1
         huddraw_alpha 200 1
         thread gasmasksounds
         $masktrigger nottriggerable//inactive le trigger après le passage. sinon on aurait le message à chaque fois.
end
////////////////////////
gasmasksounds:
         local.skill = getcvar(skill)
         println local.skill
         if(local.skill == "0")
         local.health = 1250
         if(local.skill == "1")
         local.health = 750
         if(local.skill == "2")
         local.health = 250
         local.twothirdshealth = ((local.health / 3.0) * 2.0)
         local.onethirdshealth = (local.health / 3.0)
         local.currentsound = 0
                while(1)
                        {
                                local.playerhealth = $player.health
                                local.playerhealth = (local.playerhealth * 1.0)
                                if(local.playerhealth > local.twothirdshealth && local.currentsound != 1)
                                        {
                                        local.currentsound = 1
                                        $player stopsound
                                        $player loopsound gasmask1
                                        }
                                if (local.playerhealth > local.onethirdshealth && $player.health <= local.twothirdshealth && local.currentsound != 2)
                                        {
                                        local.currentsound = 2
                                        $player stopsound
                                        $player loopsound gasmask2
                                        }
                               if (local.playerhealth <= local.onethirdshealth && local.currentsound != 3)
                                        {
                                        local.currentsound = 3
                                        $player stopsound
                                        $player loopsound gasmask3
                                        }
                               wait 1
                        }
end

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
gas_mask
« Reply #1 on: July 24, 2010, 09:28:51 AM »
Dans le "gasmasksound", rajoute, avant le while:

Code: [Select]
level.SoundThread = local
Ensuite, crée un thread de suppression du mask:

Code: [Select]
vire_le_masque:
      iprintlnbold_noloc "Bon, tu peux l'enlever maintenant"//affiche cettte phrase à l'écran en même temps que l'on vire le masque.
        huddraw_alpha 200 0
        $masktrigger triggerable //Active le trigger d'ajout du mask
        $masksupprime nottriggerable
//inactive le trigger après le passage. sinon on aurait le message à chaque fois.
//en considérant que masksupprime soit le nom du trigger de suppression
        $player stopsound //On retient son souffle !
         level.SoundThread end // Termine le thread du son du mask, sinon, on s'entendrait encore respirer!
end

Et le tour est joué !
Après, peut-etre voulais-tu que le mask soit viré quand on quitte le trigger qui l'active?!
« Last Edit: July 24, 2010, 09:29:35 AM by snaky »

tpt

  • Apprenti poseur de brushs
  • Posts: 66
gas_mask
« Reply #2 on: July 24, 2010, 03:11:08 PM »
Quote
Après, peut-etre voulais-tu que le mask soit viré quand on quitte le trigger qui l'active?!

enfaite je crois que c'est mieux cette méthode du meme trigger qui active et désactive  

tpt

  • Apprenti poseur de brushs
  • Posts: 66
gas_mask
« Reply #3 on: July 24, 2010, 06:47:37 PM »
j'ai essayé ça marche j'ai rajouté une ligne masksupprime trigerable je commence a comprendre un peu parcontre je sais pas comment faire ça pour un seul trigger_multiple ça serait plus pratique quand on rentre dans la zone on a le masque quand on en ressort on la plus.

Sinon j'ai remarqué que je garder le masque en spectateur si au préalable je ne passe pas par la zone masksupprime y'a t 'il un moyen d'y remédier?

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
gas_mask
« Reply #4 on: July 24, 2010, 07:15:49 PM »
Y'a toujours moyen, après, c'est plus ou moins compliqué.
Dans le cas présent, c'est assez simple... Du moins, cela semblait assez simple, car il y a un problème: ce script ne marchera que pour du solo! En multi, lorsqu'un joueur entre dans la zone, TOUS auront le masque: celui dans la zone et les autres!

En effet, le "huddraw_*" est une commande appliquée à un script_thread (script_thread est le nom de l'entité qui s'occupe de "lire" un thread). Du coup, TOUS les joueurs verront le masque, puisque la commande est appliquée au script_thread et non à un joueur en particulier.

Un moyen d'y remédier serait le suivant:
Modifie l'un des menus du HUD des joueurs (par exemple, la boussole) pour que le menu en question prenne tout l'écran, et affiche le masque à gaz.

Dans les labels que tu as ajouté au menu, insère cette ligne:

Code: [Select]
enabledcvar "GazMask_Actif"
Dans le jeu, il faudra donc définir la variable console "GazMask_Actif" sur 0 quand on est hors-zone, et sur 1 quand on est dans la zone.

Après, en place de tout ce qui est "huddraw_*" dans le thread d'activation du masque, utilise la commande:

Code: [Select]
local.player stufftext "seta GazMask_Actif 1"
Au début de ce thread, il faut déclarer l'entité "local.player", via:

Code: [Select]
local.player = parm.other
parm.other est une variable contenant l'entité qui a, en dernier, effectué une action (activer un trigger, mourir,...). Donc, ici, puisque parm.other est récupéré dès le début du thread lancé par le trigger, parm.other renverra au joueur qui a activé le trigger.

Après, modifions la partie qui lance les sons. Utilise "local.player thread gasmasksound". Ainsi, le thread sera lancé et dans ce thread, "self" renverra à local.player, donc au joueur ayant activé le trigger.

La commande de désactivation n'est pas à employer si plusieurs joueurs se baladent dans la carte: en effet, si le premier joueur entre dans le trigger, ce dernier ne sera plus actif pour le second ! Donc, on vire cette ligne.

Mais du coup, un joueur entrant dans la zone aura plusieurs fois le message "Mets ton masque"! Une façon d'y remédier est de créer une variable qui va indiquer si le joueur porte le masque ou pas!

Donc, apres le "local.player = ", ajoute:

Code: [Select]
if (local.player.GasMask)
end
else
local.player.GasMask = 1

Ainsi, si le joueur a son masque (.GasMask est défini), alors le thread s'interromp et ne fais rien. S'il ne l'a pas (.GasMask non défini), le script se poursuit et .GasMask est défini à 1 (pour dire que le joueur a son masque).

Maintenant, le thread des sons. Dedans, élimine les lignes:

        local.skill = getcvar(skill)
        println local.skill
        if(local.skill == "0")
        local.health = 1250
        if(local.skill == "1")
        local.health = 750
        if(local.skill == "2")
        local.health = 250

En effet, le niveau de difficulté ne fait référence qu'au solo, pas au multi. A la place, ajoute la ligne:

Code: [Select]
local.health = 100
En effet, en temps normal, les joueurs du multi ont 100 points de vie!

Ensuite, modifie le while. Au lieu de "while (1)", utilise:

Code: [Select]
while (self && self.dmteam != "spectator" && self istouching $masktrigger)
Le premier test (self) permet de savoir si le joueur existe encore. Le second permet de vérifier que le joueur n'est pas en spectateur. Le dernier devrait vérifier que le joueur est en contact avec la zone d'activation du masque.

Dans la suite du thread, remplace les "$player" par "self", car les commandes ne s'applique pas à $player (=tous les joueurs ou le joueur présent sur le serveur s'il n'y en a qu'un, comme en solo), mais elles s'applique au local.player défini avant, qui est aussi sauvegardé dans "self" pour ce thread.

Enfin, il faut virer le masque. Pour cela, à la fin du while, on va reprendre les idées du thread qui enlevait le masque. En sortie du while (cad apres le }), on a plusieurs possibilités:
- self n'existe plus
- self.dmteam vaut "spectator"
- self ne touche plus le trigger de la zone

Si self n'existe plus, on ne peut rien faire. Dans les deux autres cas, on va supprimer le masque. Donc, on teste d'abord si self existe, ensuite, si tel est le cas, on vire le masque:

Code: [Select]
if (self)
{
self stufftext "seta GasMask_Actif 0"
self.GasMask = 0
}

La première commande va désactiver l'apparence du masque (car on défini la cvar du joueur à 0), et la seconde va dire au script que le masque a été enlevé.

En résumé, on a:

Quote
main:
//exec global/ai.scr //Pas utile en multi!!
exec global/loadout.scr maps/test_mask2.scr
    level waittill prespawn
        exec global/ambient.scr test_mask2
    level waittill spawn
//        $player item weapons/mp44.tik
//        $player ammo mg 1000
// idem, pas pour le multi ca!

        waitthread global/items.scr::add_item "gasmask" 1 //Inutile aussi, mais pas méchant je pense

   level.script="map/test_mask2.scr"
end
////////////////////////
porter_le_masque:
local.player = parm.other //mettre en mémoire le joueur
if (local.player.GasMask)
end //Ne rien faire si le masque est déjà là
else
local.player.GasMask = 1 //le masque est mis!

        iprintlnbold_noloc "Il vaut mieux porter son masque à gaz à partir de cette limite"//affiche cettte phrase à l'écran en même temps que l'on met le masque.
//        huddraw_shader 200 "textures/hud/gasmask_overlay"
//        huddraw_align 200 left top
//        huddraw_rect 200 0 0 640 480
//        huddraw_virtualsize 200 1
//        huddraw_color 200 1 1 1
//        huddraw_alpha 200 1
// POur du solo, en multi, posera soucis car tous les joueurs verront le masque
local.player stufftext "seta GasMask_Actif 1"//Ecris une variable dans la console du joueur
//Cette variable est reprise dans les menus du HUD pour afficher le masque

        local.player thread gasmasksounds //Active les sons pour CE joueur
//        $masktrigger nottriggerable//inactive le trigger après le passage. sinon on aurait le message à chaque fois.
//Ne pas désactiver le trigger en multi, sinon, les suivants n'ont pas de masque!
end
////////////////////////
gasmasksounds:
//        local.skill = getcvar(skill)
//        println local.skill
//        if(local.skill == "0")
//        local.health = 1250
//        if(local.skill == "1")
//        local.health = 750
//        if(local.skill == "2")
//        local.health = 250
// Pas de niveau de difficulté dans le multi
local.health = 100 //Vie par défaut en multi

        local.twothirdshealth = ((local.health / 3.0) * 2.0)
        local.onethirdshealth = (local.health / 3.0)
        local.currentsound = 0
//               while(1)
//Utilisons un while plus complet
while (self && self.dmteam != "spectator" && self istouching $masktrigger)
                       {
                               local.playerhealth = self.health //$player devient "self"
                               local.playerhealth = (local.playerhealth * 1.0)
                               if(local.playerhealth > local.twothirdshealth && local.currentsound != 1)
                                       {
                                       local.currentsound = 1
                                       self stopsound
                                       self loopsound gasmask1
                                       }
                               if (local.playerhealth > local.onethirdshealth && local.playerhealth <= local.twothirdshealth && local.currentsound != 2)
                                       {
                                       local.currentsound = 2
                                       self stopsound
                                       self loopsound gasmask2
                                       }
                              if (local.playerhealth <= local.onethirdshealth && local.currentsound != 3)
                                       {
                                       local.currentsound = 3
                                       self stopsound
                                       self loopsound gasmask3
                                       }
                              wait 1
                       }

//Un autre test de sortie
if (self)
{
self.GasMask = 0 //Dis au script que le masque est parti
self stufftext "seta GasMask_Actif 0" //Dis au joueur que son jeu n'a plus à afficher le masque
}

end

tpt

  • Apprenti poseur de brushs
  • Posts: 66
gas_mask
« Reply #5 on: July 24, 2010, 09:19:46 PM »
Il y'a un truc que j'ai pas trop compris

Quote
Un moyen d'y remédier serait le suivant:
Modifie l'un des menus du HUD des joueurs (par exemple, la boussole) pour que le menu en question prenne tout l'écran, et affiche le masque à gaz.

Dans les labels que tu as ajouté au menu, insère cette ligne:

CODE
enabledcvar "GazMask_Actif"

Si c'est bien un fichier hud urc qu'il faut modifier j'ai pris ça
Code: [Select]
menu "hud_fraglimit" 216 24 NONE 1
bgcolor 0 0 0 0
fgcolor 1 1 1 1
align right top


resource
Label
{
title "Score:"
name "Default"
//rect 0 0 64 24
rect 0 0 80 24
fgcolor 0.69 0.69 0.00 1.00
bgcolor 0.50 0.50 0.50 0.00
borderstyle "NONE"
font facfont-20
textalign right

}
resource
Label
{
title "/"
name "Default"
rect 88 0 32 24
fgcolor 0.69 0.69 0.00 1.00
bgcolor 0.50 0.50 0.50 0.00
borderstyle "NONE"
font facfont-20

}
resource
Label
{
title "score display"
name "Default"
rect 64 0 32 24
fgcolor 0.69 0.69 0.00 1.00
bgcolor 0.50 0.50 0.50 0.00
borderstyle "NONE"
playerstat "21"
font facfont-20
textalign right

}
resource
Label
{
title "("
name "Default"
rect 136 0 24 24
fgcolor 0.69 0.69 0.00 1.00
bgcolor 0.50 0.50 0.50 0.00
borderstyle "NONE"
font facfont-20
textalign right

}
resource
Label
{
title "score limit display"
name "Default"
rect 112 0 32 24
fgcolor 0.69 0.69 0.00 1.00
bgcolor 0.50 0.50 0.50 0.00
borderstyle "NONE"
linkcvar "cg_fraglimit"
font facfont-20
textalign left

}
resource
Label
{
title "highest score display"
name "Default"
rect 160 0 40 24
fgcolor 0.69 0.69 0.00 1.00
bgcolor 0.50 0.50 0.50 0.00
borderstyle "NONE"
playerstat "25"
font facfont-20
//textalign left

}
resource
Label
{
title ")"
name "Default"
rect 200 0 24 24
fgcolor 0.69 0.69 0.00 1.00
bgcolor 0.50 0.50 0.50 0.00
borderstyle "NONE"
font facfont-20
textalign left

}
end.

je dois ajouter la ligne dans le hud_fraglimit.urc? et la remplacer par celle existant sur un serveur en ligne?
Code: [Select]
enabledcvar "GazMask_Actif"
sinon niveau mapping je garde juste un triger multiple avec setthread porter_le_masque targetname masktrigger?

J'ai essayer sans le bidouille de l'hud donc a chaque fois que je passse dans le triger ya le message qui s'active sans mettre le masque