nuclide/Source/gs-entbase/server/func_rotating.cpp

113 lines
2 KiB
C++

/***
*
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
*
* See the file LICENSE attached with the sources for usage details.
*
****/
enumflags
{
FR_STARTON,
FR_REVERSE,
FR_ZAXIS,
FR_XAXIS,
FR_ACCDCC,
FR_FANPAIN,
FR_NOTSOLID,
FR_SMALLRADIUS,
FR_MRADIUS,
FR_LRADIUS
};
class CFuncRotating : CBaseTrigger
{
vector m_vecMoveDir;
float m_flSpeed;
void() CFuncRotating;
virtual void() Respawn;
virtual void() Trigger;
virtual void() Rotate;
virtual void() SetMovementDirection;
};
void CFuncRotating :: Rotate( void )
{
nextthink = ltime + 10.0f;
}
void CFuncRotating :: Trigger ( void )
{
if ( vlen( avelocity ) ) {
avelocity = '0 0 0';
} else {
avelocity = m_vecMoveDir * m_flSpeed;
}
}
void CFuncRotating :: Blocked ( void )
{
if ( spawnflags & FR_FANPAIN ) {
// Damage_Apply( other, this, m_iDamage, other.origin, FALSE );
}
}
void CFuncRotating :: Respawn ( void )
{
movetype = MOVETYPE_PUSH;
setorigin( this, origin );
setmodel( this, model );
if ( spawnflags & FR_NOTSOLID ) {
solid = SOLID_NOT;
} else {
solid = SOLID_BSP;
}
if ( spawnflags & FR_STARTON ) {
avelocity = m_vecMoveDir * m_flSpeed;
think = Rotate;
nextthink = ltime + 1.5f;
}
}
void CFuncRotating :: SetMovementDirection ( void )
{
if ( spawnflags & FR_ZAXIS ) {
m_vecMoveDir = '0 0 1';
} else if ( spawnflags & FR_XAXIS ) {
m_vecMoveDir = '1 0 0';
} else {
m_vecMoveDir = '0 1 0';
}
if ( spawnflags & FR_REVERSE ) {
m_vecMoveDir *= -1;
}
}
void CFuncRotating :: CFuncRotating ( void )
{
precache_model( model );
for ( int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2 ) {
switch ( argv( i ) ) {
/*case "spawnorigin":
setorigin( this, stov( argv( i + 1 ) ) );
break;*/
case "speed":
m_flSpeed = stof( argv( i + 1 ) );
break;
default:
break;
}
}
if ( !m_flSpeed ) {
m_flSpeed = 100;
}
CBaseTrigger::CBaseTrigger();
CFuncRotating::SetMovementDirection();
CFuncRotating::Respawn();
}
CLASSEXPORT( func_rotating, CFuncRotating )