Inside3D!
     

func_train, one point at a time?

 
Post new topic   Reply to topic    Inside3d Forums Forum Index -> QuakeC Programming
View previous topic :: View next topic  
Author Message
dayfive



Joined: 10 Nov 2006
Posts: 77

PostPosted: Thu Feb 28, 2008 2:21 am    Post subject: func_train, one point at a time? Reply with quote

hi,

is there presently any way in the plain generic quake engine to instead of having a trigger_once or trigger_multiple start a func_train in motion and not be able to stop it instead have some kind of trigger once to make the train simply increment one point along its path?
Back to top
View user's profile Send private message
frag.machine



Joined: 25 Nov 2006
Posts: 728

PostPosted: Thu Feb 28, 2008 4:14 am    Post subject: Reply with quote

This can be handled in the QuakeC side, and I think mods like Quoth already do it.
_________________
frag.machine - Q2K4 Project
http://fragmachine.quakedev.com/
Back to top
View user's profile Send private message Visit poster's website
Willem



Joined: 23 Jan 2008
Posts: 73

PostPosted: Thu Feb 28, 2008 10:49 am    Post subject: Reply with quote

I'm pretty sure this code does what you're asking. It's a func_train adaptation that will stop at any path_corner that has a wait of -1. When you trigger it again, it will move to the next one in the path.

If this doesn't work, I apologize, it may have rotted since I last used it.

You'll have to add some variables to def.qc like "isMoving". I hope this at least gets you on the right track.

Or use Quoth. Razz


Code:

// ================================================================
// FUNC_MOVER
// ================================================================

// Forward declarations

void() func_mover_next;
void() func_mover_use;
void() func_mover_wait;

void() func_mover_blocked =
{
   if( time < self.attack_finished )
   {
      return;
   }
   
   self.attack_finished = time + 0.5;
   
   T_Damage (other, self, self, self.dmg);
};

// Triggered.

void() func_mover_use =
{
   // Ignore triggers if we are already moving
   
   if( self.isMoving )
   {
      return;
   }
   
   func_mover_next();
};

void() func_mover_wait =
{
   sound( self, CHAN_VOICE, self.noise, 1, ATTN_NORM );

   if( self.wait )
   {
      self.nextthink = self.ltime + self.wait;
   }
   else
   {
      self.nextthink = self.ltime + 0.01;
   }
   
   self.isMoving = FALSE;
   self.think = func_mover_next;
};

void() func_mover_next =
{
   local entity targ;

   targ = find( world, targetname, self.target );
   self.target = targ.target;
   
   if( !self.target )
   {
      objerror( "mover_next: no next target" );
   }
      
   if( targ.wait )
   {
      self.wait = targ.wait;
   }
   else
   {
      self.wait = 0;
   }
   
   self.isMoving = TRUE;   
   sound( self, CHAN_VOICE, self.noise1, 1, ATTN_NORM );
   SUB_CalcMove( targ.origin - self.mins, self.speed, func_mover_wait );
};

void() func_mover_find =
{
   local entity targ;

   // Find the first path_corner we are targeting
   targ = find( world, targetname, self.target );
   self.target = targ.target;
   
   // Move to the target
   setorigin( self, targ.origin - self.mins );
   
   // If this mover isn't being targetted, make it start moving immediately
   if( !self.targetname )
   {   
      // not triggered, so start immediately
      self.nextthink = self.ltime + 0.1;
      self.think = func_mover_next;
   }
};

/*QUAKED func_mover (.8 .5 .0) ?
A mover is a brush entity that can move to path_corners.

This works a lot like a func_train except that each time the mover stops, it can be triggered again.
Set up a series of path_corners with a wait of -1 to create a mover that moves and stops at waypoints.

"sounds =
0) None
1) Train
2) Base
3) Medieval
*/
void() func_mover =
{   
   if( !self.speed )
   {
      self.speed = 100;
   }
      
   if (!self.target)
   {
      objerror ("func_mover without a target");
   }
      
   if( !self.dmg )
   {
      self.dmg = 2;
   }
      
   self.isMoving = FALSE;

   self.cnt = 1;
   self.solid = SOLID_BSP;
   self.movetype = MOVETYPE_PUSH;
   self.blocked = func_mover_blocked;
   self.use = func_mover_use;
   self.classname = "mover";
   
   if (self.sounds == 0)
   {
      precache_sound ("misc/null.wav");
      self.noise = ("misc/null.wav");
      precache_sound ("misc/null.wav");
      self.noise1 = ("misc/null.wav");
   }
   else if (self.sounds == 1)
   {
      precache_sound ("plats/train2.wav");
      self.noise = ("plats/train2.wav");
      precache_sound ("plats/train1.wav");
      self.noise1 = ("plats/train1.wav");
   }
   else if (self.sounds == 2)
   {
      precache_sound ("plats/plat2.wav");
      self.noise = "plats/plat2.wav";
      precache_sound ("plats/plat1.wav");
      self.noise1 = "plats/plat1.wav";
   }
   else if (self.sounds == 3)
   {
      precache_sound ("plats/medplat2.wav");
      self.noise = "plats/medplat2.wav";
      precache_sound ("plats/medplat1.wav");
      self.noise1 = "plats/medplat1.wav";
   }

   setmodel( self, self.model );
   setsize( self, self.mins, self.maxs );
   setorigin( self, self.origin );
   
   // Start movers on the second frame, to make sure their targets have had a chance to spawn
   self.nextthink = self.ltime + 0.1;
   self.think = func_mover_find;
};

_________________
www.wantonhubris.com
Back to top
View user's profile Send private message Visit poster's website
Dr. Shadowborg
Inside3D Staff


Joined: 16 Oct 2004
Posts: 726

PostPosted: Thu Feb 28, 2008 4:28 pm    Post subject: Reply with quote

See Rogue's Dissolution of Eternity source as well.
_________________
"Roboto suggests Plasma Bazooka."
Back to top
View user's profile Send private message
leileilol



Joined: 15 Oct 2004
Posts: 1321

PostPosted: Thu Feb 28, 2008 6:33 pm    Post subject: Reply with quote

p0x's Extras has this too
_________________
Back to top
View user's profile Send private message
OneManClan



Joined: 28 Feb 2009
Posts: 62

PostPosted: Tue Apr 13, 2010 8:12 am    Post subject: Reply with quote

Can this function be used to make a (TF2 style) payload map for Quake1? ie to make the 'cart' stop and start along a fixed path?

ie
If there are Blue players near the cart it moves (slowly)along its path. If there are no Blue players near the cart for (eg) 20 secs, it slowly moves backwards. The cart gives health and ammo to the Blue team.


Possible?


OneManClan
Back to top
View user's profile Send private message
c0burn



Joined: 05 Nov 2004
Posts: 158
Location: Liverpool, England

PostPosted: Tue Apr 13, 2010 9:20 am    Post subject: Reply with quote

Of course it's possible.
Back to top
View user's profile Send private message Visit poster's website AIM Address MSN Messenger
Display posts from previous:   
Post new topic   Reply to topic    Inside3d Forums Forum Index -> QuakeC Programming All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2004 phpBB Group