Page 1 of 2

if $trigger: show - else hide ?

Posted: Thu Jun 02, 2005 6:47 pm
by Kalti
Well then, let me be the honest n00b for today...

I want to detect if there's a player in the room, so I've placed a trigger_multiple $room_occupied

If there is a player detected in the room I want to 'show' a certain element but if there isn't a player detected I want that element to 'hide'.

Anyways, I don't have the understanding to this all by myself so let me show you the mess I came up with... It is based on my lift script.

Code: Select all

//*** Room  ***
occupied_prep:
	level.occupied=0 // 0 is  not occupied, 1 is occupied
end

room_occupied:
   $room_occupied nottriggerable
   if (level.occupied==1)
   {
      $object show
      level.occupied=1
   }
   else
   {
      $object hide
      level.occupied=0
   }
   $room_occupied triggerable
end

//*** END - Room  ***
Obviously the above doesn't work and more obviously I don't seem to have any clue what I'm doing so please guys, treat me kindly and help me out here :D

Posted: Thu Jun 02, 2005 7:38 pm
by Rookie One.pl
This thread is launched by setthread, right? Well, I'd do it like this:

Code: Select all

room_occupied:
   self nottriggerable
   $object show
   local.occupied = 1
   while (local.occupied)
   {
      for (local.i = 1; local.i <= $player.size; local.i++)
      {
         if ($player[local.i] isTouching $room_occupied)
            break
         local.occupied = 0
         $object hide
      }
      waitframe
   }
   self triggerable
end
What this will do is to check for players touching the trigger (will also affect spectators). The for loop will break upon the first player touching it, therefore it won't reach the local.occupied = 0 part. But if there are no players touching it, it will set local.occupied to 0. Simple. ;)

Posted: Thu Jun 02, 2005 8:37 pm
by Kalti
Thank you...

Ehrm... setthread ?

And it shouldn't act on spectators if at all possible

I had a simple script working to the point where the object was 'hidden' and then got shown when a player was detected in the room... only problem was it remained shown after the player had left the room/trigger while no other players where present.

Posted: Thu Jun 02, 2005 8:50 pm
by Axion
With your original method, you would need two triggers- one inside the room and one outside. When you touch the inside trigger, the object would show, and when you touched the outside trigger, the object would hide. The problem with that is that if someone touches the outside trigger while someone is already in the room, the object would suddenly disappear.

Go with Rookie's method.

Posted: Thu Jun 02, 2005 9:17 pm
by Kalti
Thanks guys...

It isn't worth the effort when it will also act on spectators, plain and simple.

I have thought of doing it with an entrance and exit trigger but soon came to the conclusion that it would cause problems with the more then one player.

Unless... I shouldn't allow more then one player at a time in the room... hmm

Posted: Thu Jun 02, 2005 11:13 pm
by wacko
Kalti wrote:Ehrm... setthread ?
Your trigger_multiple will have to have a key/value of setthread/room_occupied. This way the trigger, when touched, will execute the thread.

@Rookie One: U're sure, this would affect spectators?! The trigger_multiple would execute the thread when touched by a specator?

Posted: Fri Jun 03, 2005 5:07 am
by Rookie One.pl
It should affect spectators, too.

But, look here. Imagine you were a spectator and flew into that room. A player enters the room and the object suddenly appears. He leaves and the object disappears. That'd be weird, huh? Anyway, this one will also check if the players are alive and not spectating:

Code: Select all

room_occupied:
   self nottriggerable
   $object show
   local.occupied = 1
   while (local.occupied)
   {
      for (local.i = 1; local.i <= $player.size; local.i++)
      {
         if (isAlive($player[local.i]) && $player[local.i].dmteam != spectator)
         {
            if ($player[local.i] isTouching $room_occupied)
               break
         }
         local.occupied = 0
         $object hide
      }
      waitframe
   }
   self triggerable
end
I've also arrived upon the conclusion that setting local.occupied to 1 before breaking the loop is quite pointless (it's already 1 since it hasn't been changed yet) so I omitted it here. ;)

Posted: Fri Jun 03, 2005 7:53 am
by Kalti
Wow... thanks all

And I can call that thread by thread room_occupied ?

Posted: Fri Jun 03, 2005 8:53 am
by wacko
Rookie One.pl {sfx} wrote:It should affect spectators, too.
But, look here. Imagine you were a spectator and flew into that room. A player enters the room and the object suddenly appears. He leaves and the object disappears. That'd be weird, huh?
So, what u mean is, that a spectator would see the object show and hide when a player enters or leaves the room. But he wouldn't trigger the trigger_multiple himself. That's what I ment :wink:
And yes, Kalti. Ur trigger_multiple will need key/value: targetname/room_occupied (for Rookie's script, line 11) and setthread/room_occupied (to call this thread).

Posted: Fri Jun 03, 2005 9:04 am
by Kalti
And is it possible to add more $objects then just the one ?

Like this ?

Code: Select all

room_occupied:
   self nottriggerable
   $object show
   $object1 show
   $object2 show
   local.occupied = 1
   while (local.occupied)
   {
      for (local.i = 1; local.i <= $player.size; local.i++)
      {
         if (isAlive($player[local.i]) && $player[local.i].dmteam != spectator)
         {
            if ($player[local.i] isTouching $room_occupied)
               break
         }
         local.occupied = 0
         $object hide
         $object1 hide
         $object2 hide
      }
      waitframe
   }
   self triggerable
end
and.. ehrm... it will still do the 'hide' thing even when a spectator is present ?

Posted: Fri Jun 03, 2005 10:01 am
by wacko
Kalti wrote:And is it possible to add more $objects then just the one ?
and.. ehrm... it will still do the 'hide' thing even when a spectator is present ?
Yes and yes.
the if clause if (isAlive($player[local.i]) && $player[local.i].dmteam != spectator) is just true for an alive and not spectating player, so it wouldn't bother whether that player is touching the trigger, therefore wouldn't 'break', would set local.occupied to 0 and hide the objects.

Only thing bout ur script is, that u will still need the thread to hide the objec(s) at gamestart like

Code: Select all

occupied_prep:
$object hide
//and others if there were
end
which would have to be called by the main thread, but u surely know this :wink:

Posted: Fri Jun 03, 2005 10:27 am
by Kalti
Thanks and thanks :D

Very kind all !

Will try it in a few hours from now :wink:

Posted: Fri Jun 03, 2005 10:45 am
by Rookie One.pl
Oops... Once again I was wrong... :oops: Local.occupied = 1 is necessary!

Code: Select all

room_occupied:
   self nottriggerable
   $object show
   $object1 show
   $object2 show
   local.occupied = 1
   while (local.occupied)
   {
      for (local.i = 1; local.i <= $player.size; local.i++)
      {
         if (isAlive($player[local.i]) && $player[local.i].dmteam != spectator)
         {
            if ($player[local.i] isTouching $room_occupied)
            {
               local.occupied = 0
               break
            }
         }
         local.occupied = 0
         $object hide
         $object1 hide
         $object2 hide
      }
      waitframe
   }
   self triggerable
end

Posted: Fri Jun 03, 2005 3:43 pm
by Kalti
Wacko galantly handed me an example map which I used to get it all implemented in my own map... thank you !

Showing you the working script:

Code: Select all

main:

//*** Scoreboard Messages And Image
setcvar "g_obj_alliedtext1" "" 
setcvar "g_obj_alliedtext2" ""
setcvar "g_obj_alliedtext3" ""
setcvar "g_obj_axistext1" "" 
setcvar "g_obj_axistext2" ""
setcvar "g_obj_axistext3" ""
setcvar "g_scoreboardpic" "none"

local.master = spawn ScriptMaster

//local.master aliascache [aliasname] [soundfile] soundparms [basevolume] [randvolume] [basepitch] [randpitch] [mindist] [maxdist] [channel] loaded maps "obj dm"

	// call additional stuff for playing this map round based is needed
	if(level.roundbased)
		thread roundbasedthread

	level waittill prespawn

//*** Precache Dm Stuff
	//exec maps/dm/yourmapnamehere_precache.scr

	exec global/door_locked.scr::lock
	level.script = maps/dm/creditroom.scr
	//exec global/weather.scr
	//exec global/shutter.scr

	level waittill spawn
	//$room_occupied thread room_occupied
	$speaker_room stopsound snd_room
	$$object hide
	$object1 hide
	$object2 hide

end

//*** Room ***
room_occupied:
   self nottriggerable
   $speaker_room loopsound snd_room
   $object show
   $object1 show
   $object2 show
   local.occupied = 1
   while (local.occupied)
   {
      for (local.i = 1; local.i <= $player.size; local.i++)
      {
         if (isAlive($player[local.i]) && $player[local.i].dmteam != spectator)
         {
            if ($player[local.i] isTouching $room_occupied)
               break
            }
         local.occupied = 0
         $speaker_room stopsound snd_room
	 $object hide
	 $object1 hide
	 $object2 hide
      }
      waitframe
   }
   self triggerable
end

//-----------------------------------------------------------------------------

roundbasedthread:

	// Can specify different scoreboard messages for round based games here.

	level waitTill prespawn

	level waittill spawn

	// set the parameters for this round based match
	level.dmrespawning = 0 // 1 or 0
	level.dmroundlimit = 5 // round time limit in minutes
	level.clockside = kills // set to axis, allies, kills, or draw

	level waittill roundstart

end
Now, 2 questions...

#1. Why does it work with //$room_occupied thread room_occupied commented out ?

#2. And I have placed:

Code: Select all

//$room_occupied thread room_occupied
$speaker_room stopsound snd_room
$$object hide
$object1 hide
$object2 hide
...below "level waittill spawn" is that correct or am I just lucky ?

*EDIT: I know I have not yet placed a sound alias :wink:

Posted: Fri Jun 03, 2005 4:53 pm
by Rookie One.pl
Ad. 1. Because it's setthreaded.