2021-10-19 23:18:36 +00:00
|
|
|
/*
|
2022-07-07 16:10:14 +00:00
|
|
|
* Copyright (c) 2016-2022 Vera Visions LLC.
|
2021-10-19 23:18:36 +00:00
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
|
|
* copyright notice and this permission notice appear in all copies.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
|
|
|
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
2022-07-07 16:10:14 +00:00
|
|
|
*/
|
2021-10-19 23:18:36 +00:00
|
|
|
|
2022-12-14 07:16:00 +00:00
|
|
|
static void droptofloorwrapper( entity foo ) {
|
|
|
|
entity old_self = self;
|
|
|
|
|
|
|
|
self = foo;
|
|
|
|
droptofloor();
|
|
|
|
self = old_self;
|
|
|
|
}
|
2022-08-10 21:24:06 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::NSEntity( void ) {
|
2022-08-10 21:24:06 +00:00
|
|
|
identity = 1;
|
2023-01-23 04:01:24 +00:00
|
|
|
m_flSpawnTime = time;
|
2022-08-10 21:24:06 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::Spawned( void ) {
|
2022-08-10 21:24:06 +00:00
|
|
|
super::Spawned();
|
|
|
|
|
|
|
|
m_oldAngle = angles;
|
|
|
|
m_oldOrigin = origin;
|
2022-11-16 22:04:10 +00:00
|
|
|
m_oldModel = Util_FixModel( model );
|
2022-08-10 21:24:06 +00:00
|
|
|
m_oldSolid = solid;
|
|
|
|
|
|
|
|
#ifdef SERVER
|
|
|
|
m_oldstrTarget = target;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( m_oldModel ) {
|
|
|
|
precache_model( GetSpawnModel() );
|
2022-08-10 21:24:06 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( m_strOnTrigger ) {
|
|
|
|
m_strOnTrigger = CreateOutput( m_strOnTrigger );
|
|
|
|
}
|
2022-08-10 21:24:06 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::EntIndex( void ) {
|
|
|
|
return ( num_for_edict( this ) );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::DropToFloor( void ) {
|
|
|
|
droptofloorwrapper( this );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetForward( void ) {
|
|
|
|
makevectors( angles );
|
|
|
|
return ( v_forward );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetRight( void ) {
|
|
|
|
makevectors( angles );
|
|
|
|
return ( v_right );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetUp( void ) {
|
|
|
|
makevectors( angles );
|
|
|
|
return ( v_up );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::WorldSpaceCenter( void ) {
|
|
|
|
return ( absmin + ( 0.5 * ( absmax - absmin ) ) );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::WaterLevel( void ) {
|
|
|
|
return ( waterlevel );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::VisibleVec( vector org ) {
|
2022-04-02 07:10:25 +00:00
|
|
|
vector flDelta;
|
|
|
|
float flFoV;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
makevectors( angles );
|
|
|
|
flDelta = normalize( org - origin );
|
2022-04-02 07:10:25 +00:00
|
|
|
flFoV = flDelta * v_forward;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( flFoV > 0.3f ) {
|
|
|
|
traceline( origin, org, TRUE, this );
|
|
|
|
if ( trace_fraction == 1.0f ) {
|
|
|
|
return ( true );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
}
|
2022-11-16 22:04:10 +00:00
|
|
|
return ( false );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::Visible( entity ent ) {
|
2022-04-02 07:10:25 +00:00
|
|
|
vector flDelta;
|
|
|
|
float flFoV;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
makevectors( angles );
|
|
|
|
flDelta = normalize( ent.origin - origin );
|
2022-04-02 07:10:25 +00:00
|
|
|
flFoV = flDelta * v_forward;
|
|
|
|
|
2022-05-27 21:55:33 +00:00
|
|
|
/* is it in our field of view? */
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( flFoV > 0.3f ) {
|
|
|
|
traceline( origin, ent.origin, MOVE_NORMAL, this );
|
|
|
|
if ( trace_fraction == 1.0f || trace_ent == ent ) {
|
|
|
|
print( sprintf( "%s can see %s\n", classname, ent.classname ) );
|
|
|
|
return ( true );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
}
|
2022-11-16 22:04:10 +00:00
|
|
|
print( sprintf( "%s can not see %s\n", classname, ent.classname ) );
|
|
|
|
return ( false );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::HasSpawnFlags( float sf ) {
|
|
|
|
return ( spawnflags & sf ) ? true : false;
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::IsOnGround( void ) {
|
|
|
|
return ( flags & FL_ONGROUND ) ? true : false;
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::IsSolid( void ) {
|
|
|
|
return ( solid != SOLID_NOT ) ? true : false;
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
entity NSEntity::GetGroundEntity( void ) {
|
|
|
|
return ( groundentity );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::CreatedByMap( void ) {
|
|
|
|
return ( _mapspawned );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-04-03 21:04:34 +00:00
|
|
|
|
2021-10-19 23:18:36 +00:00
|
|
|
#ifdef CLIENT
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::RendererRestarted( void ) {
|
|
|
|
|
2022-08-06 04:15:19 +00:00
|
|
|
}
|
2021-10-19 23:18:36 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::ReceiveEntity( float flNew, float flChanged ) {
|
|
|
|
READENTITY_COORD( origin[0], BASEFL_CHANGED_ORIGIN_X )
|
|
|
|
READENTITY_COORD( origin[1], BASEFL_CHANGED_ORIGIN_Y )
|
|
|
|
READENTITY_COORD( origin[2], BASEFL_CHANGED_ORIGIN_Z )
|
|
|
|
READENTITY_ANGLE( angles[0], BASEFL_CHANGED_ANGLES_X )
|
|
|
|
READENTITY_ANGLE( angles[1], BASEFL_CHANGED_ANGLES_Y )
|
|
|
|
READENTITY_ANGLE( angles[2], BASEFL_CHANGED_ANGLES_Z )
|
|
|
|
READENTITY_SHORT( modelindex, BASEFL_CHANGED_MODELINDEX )
|
|
|
|
READENTITY_BYTE( solid, BASEFL_CHANGED_SOLID )
|
|
|
|
READENTITY_BYTE( movetype, BASEFL_CHANGED_FLAGS )
|
|
|
|
READENTITY_INT( flags, BASEFL_CHANGED_FLAGS )
|
|
|
|
READENTITY_COORD( mins[0], BASEFL_CHANGED_SIZE )
|
|
|
|
READENTITY_COORD( mins[1], BASEFL_CHANGED_SIZE )
|
|
|
|
READENTITY_COORD( mins[2], BASEFL_CHANGED_SIZE )
|
|
|
|
READENTITY_COORD( maxs[0], BASEFL_CHANGED_SIZE )
|
|
|
|
READENTITY_COORD( maxs[1], BASEFL_CHANGED_SIZE )
|
|
|
|
READENTITY_COORD( maxs[2], BASEFL_CHANGED_SIZE )
|
|
|
|
READENTITY_BYTE( frame, BASEFL_CHANGED_FRAME )
|
|
|
|
READENTITY_FLOAT( skin, BASEFL_CHANGED_SKIN )
|
|
|
|
READENTITY_FLOAT( effects, BASEFL_CHANGED_EFFECTS )
|
|
|
|
READENTITY_FLOAT( scale, BASEFL_CHANGED_SCALE )
|
|
|
|
READENTITY_COORD( velocity[0], BASEFL_CHANGED_VELOCITY_X )
|
|
|
|
READENTITY_COORD( velocity[1], BASEFL_CHANGED_VELOCITY_Y )
|
|
|
|
READENTITY_COORD( velocity[2], BASEFL_CHANGED_VELOCITY_Z )
|
|
|
|
READENTITY_COORD( avelocity[0], BASEFL_CHANGED_ANGULARVELOCITY )
|
|
|
|
READENTITY_COORD( avelocity[1], BASEFL_CHANGED_ANGULARVELOCITY )
|
|
|
|
READENTITY_COORD( avelocity[2], BASEFL_CHANGED_ANGULARVELOCITY )
|
|
|
|
if ( modelindex ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
drawmask = MASK_ENGINE;
|
|
|
|
} else {
|
|
|
|
drawmask = 0;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( scale == 0.0f )
|
2021-10-19 23:18:36 +00:00
|
|
|
scale = 1.0f;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( flChanged & BASEFL_CHANGED_SIZE )
|
|
|
|
setsize( this, mins, maxs );
|
2022-08-07 21:12:55 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
setorigin( this, origin );
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::postdraw( void ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
/* Make sure StartFrame calls this */
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::SendEntity( entity ePEnt, float flChanged ) {
|
|
|
|
if ( !modelindex )
|
|
|
|
return ( 0 );
|
2021-10-19 23:18:36 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( clienttype( ePEnt ) != CLIENTTYPE_REAL )
|
|
|
|
return ( 0 );
|
2021-10-19 23:18:36 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( alpha == 0.0f )
|
|
|
|
return ( 0 );
|
2021-10-19 23:18:36 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
WriteByte( MSG_ENTITY, ENT_ENTITY );
|
2023-01-06 07:32:42 +00:00
|
|
|
|
|
|
|
/* optimisation */
|
|
|
|
{
|
|
|
|
/* we'll never network these if we aren't moving. */
|
|
|
|
if (movetype == MOVETYPE_NONE) {
|
|
|
|
flChanged &= ~BASEFL_CHANGED_VELOCITY_X;
|
|
|
|
flChanged &= ~BASEFL_CHANGED_VELOCITY_Y;
|
|
|
|
flChanged &= ~BASEFL_CHANGED_VELOCITY_Z;
|
|
|
|
flChanged &= ~BASEFL_CHANGED_ANGULARVELOCITY;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_bIsBrush == true) {
|
|
|
|
flChanged &= ~BASEFL_CHANGED_FLAGS;
|
|
|
|
flChanged &= ~BASEFL_CHANGED_SCALE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-19 23:18:36 +00:00
|
|
|
/* broadcast how much data is expected to be read */
|
2022-11-16 22:04:10 +00:00
|
|
|
WriteFloat( MSG_ENTITY, flChanged );
|
|
|
|
|
|
|
|
SENDENTITY_COORD( origin[0], BASEFL_CHANGED_ORIGIN_X )
|
|
|
|
SENDENTITY_COORD( origin[1], BASEFL_CHANGED_ORIGIN_Y )
|
|
|
|
SENDENTITY_COORD( origin[2], BASEFL_CHANGED_ORIGIN_Z )
|
|
|
|
SENDENTITY_ANGLE( angles[0], BASEFL_CHANGED_ANGLES_X )
|
|
|
|
SENDENTITY_ANGLE( angles[1], BASEFL_CHANGED_ANGLES_Y )
|
|
|
|
SENDENTITY_ANGLE( angles[2], BASEFL_CHANGED_ANGLES_Z )
|
|
|
|
SENDENTITY_SHORT( modelindex, BASEFL_CHANGED_MODELINDEX )
|
|
|
|
SENDENTITY_BYTE( solid, BASEFL_CHANGED_SOLID )
|
|
|
|
SENDENTITY_BYTE( movetype, BASEFL_CHANGED_FLAGS )
|
|
|
|
SENDENTITY_INT( flags, BASEFL_CHANGED_FLAGS )
|
|
|
|
SENDENTITY_COORD( mins[0], BASEFL_CHANGED_SIZE )
|
|
|
|
SENDENTITY_COORD( mins[1], BASEFL_CHANGED_SIZE )
|
|
|
|
SENDENTITY_COORD( mins[2], BASEFL_CHANGED_SIZE )
|
|
|
|
SENDENTITY_COORD( maxs[0], BASEFL_CHANGED_SIZE )
|
|
|
|
SENDENTITY_COORD( maxs[1], BASEFL_CHANGED_SIZE )
|
|
|
|
SENDENTITY_COORD( maxs[2], BASEFL_CHANGED_SIZE )
|
|
|
|
SENDENTITY_BYTE( frame, BASEFL_CHANGED_FRAME )
|
|
|
|
SENDENTITY_FLOAT( skin, BASEFL_CHANGED_SKIN )
|
|
|
|
SENDENTITY_FLOAT( effects, BASEFL_CHANGED_EFFECTS )
|
|
|
|
SENDENTITY_FLOAT( scale, BASEFL_CHANGED_SCALE )
|
|
|
|
SENDENTITY_COORD( velocity[0], BASEFL_CHANGED_VELOCITY_X )
|
|
|
|
SENDENTITY_COORD( velocity[1], BASEFL_CHANGED_VELOCITY_Y )
|
|
|
|
SENDENTITY_COORD( velocity[2], BASEFL_CHANGED_VELOCITY_Z )
|
|
|
|
SENDENTITY_COORD( avelocity[0], BASEFL_CHANGED_ANGULARVELOCITY )
|
|
|
|
SENDENTITY_COORD( avelocity[1], BASEFL_CHANGED_ANGULARVELOCITY )
|
|
|
|
SENDENTITY_COORD( avelocity[2], BASEFL_CHANGED_ANGULARVELOCITY )
|
|
|
|
return ( 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
void NSEntity::EvaluateEntity( void ) {
|
|
|
|
EVALUATE_VECTOR( origin, 0, BASEFL_CHANGED_ORIGIN_X )
|
|
|
|
EVALUATE_VECTOR( origin, 1, BASEFL_CHANGED_ORIGIN_Y )
|
|
|
|
EVALUATE_VECTOR( origin, 2, BASEFL_CHANGED_ORIGIN_Z )
|
|
|
|
EVALUATE_VECTOR( angles, 0, BASEFL_CHANGED_ANGLES_X )
|
|
|
|
EVALUATE_VECTOR( angles, 1, BASEFL_CHANGED_ANGLES_Y )
|
|
|
|
EVALUATE_VECTOR( angles, 2, BASEFL_CHANGED_ANGLES_Z )
|
|
|
|
EVALUATE_FIELD( modelindex, BASEFL_CHANGED_MODELINDEX )
|
|
|
|
EVALUATE_FIELD( solid, BASEFL_CHANGED_SOLID )
|
|
|
|
EVALUATE_FIELD( movetype, BASEFL_CHANGED_FLAGS )
|
|
|
|
EVALUATE_FIELD( flags, BASEFL_CHANGED_FLAGS )
|
|
|
|
EVALUATE_VECTOR( mins, 0, BASEFL_CHANGED_SIZE )
|
|
|
|
EVALUATE_VECTOR( mins, 1, BASEFL_CHANGED_SIZE )
|
|
|
|
EVALUATE_VECTOR( mins, 2, BASEFL_CHANGED_SIZE )
|
|
|
|
EVALUATE_VECTOR( maxs, 0, BASEFL_CHANGED_SIZE )
|
|
|
|
EVALUATE_VECTOR( maxs, 1, BASEFL_CHANGED_SIZE )
|
|
|
|
EVALUATE_VECTOR( maxs, 2, BASEFL_CHANGED_SIZE )
|
|
|
|
EVALUATE_FIELD( frame, BASEFL_CHANGED_FRAME )
|
|
|
|
EVALUATE_FIELD( skin, BASEFL_CHANGED_SKIN )
|
|
|
|
EVALUATE_FIELD( effects, BASEFL_CHANGED_EFFECTS )
|
|
|
|
EVALUATE_FIELD( scale, BASEFL_CHANGED_SCALE )
|
|
|
|
EVALUATE_VECTOR( velocity, 0, BASEFL_CHANGED_VELOCITY_X )
|
|
|
|
EVALUATE_VECTOR( velocity, 1, BASEFL_CHANGED_VELOCITY_Y )
|
|
|
|
EVALUATE_VECTOR( velocity, 2, BASEFL_CHANGED_VELOCITY_Z )
|
|
|
|
EVALUATE_VECTOR( avelocity, 0, BASEFL_CHANGED_ANGULARVELOCITY )
|
|
|
|
EVALUATE_VECTOR( avelocity, 1, BASEFL_CHANGED_ANGULARVELOCITY )
|
|
|
|
EVALUATE_VECTOR( avelocity, 2, BASEFL_CHANGED_ANGULARVELOCITY )
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Make sure StartFrame calls this */
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::ParentUpdate( void ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
EvaluateEntity();
|
|
|
|
|
|
|
|
frame1time += frametime;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( m_parent ) {
|
2022-03-25 00:59:30 +00:00
|
|
|
NSEntity parent;
|
2022-11-16 22:04:10 +00:00
|
|
|
entity p = find( world, ::targetname, m_parent );
|
2021-10-19 23:18:36 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( p ) {
|
|
|
|
if ( !m_parent_attachment ) {
|
|
|
|
parent = ( NSEntity ) p;
|
2022-03-29 03:20:29 +00:00
|
|
|
vector ofs = parent.origin - parent.GetSpawnOrigin();
|
2022-11-16 22:04:10 +00:00
|
|
|
|
|
|
|
SetOrigin( GetSpawnOrigin() + ofs );
|
|
|
|
} else if ( m_parent_attachment == "origin" ) {
|
|
|
|
SetOrigin( p.origin );
|
2022-03-25 00:59:30 +00:00
|
|
|
}
|
|
|
|
}
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
2022-04-03 21:04:34 +00:00
|
|
|
|
|
|
|
/* handle end-touch */
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( m_beingTouched == true )
|
|
|
|
if ( m_flTouchTime < GetTime() ) {
|
|
|
|
EndTouch( m_eTouchLast );
|
|
|
|
m_beingTouched = false;
|
|
|
|
m_eTouchLast = __NULL__;
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
2022-08-06 04:15:19 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
entity NSEntity::GetParent( void ) {
|
|
|
|
return ( find( world, ::targetname, m_parent ) );
|
2022-04-02 07:10:25 +00:00
|
|
|
}
|
2022-08-06 04:15:19 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetParent( string name ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
m_parent = name;
|
|
|
|
}
|
2022-08-06 04:15:19 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetParentAttachment( string name ) {
|
2022-03-25 00:59:30 +00:00
|
|
|
m_parent_attachment = name;
|
|
|
|
}
|
2022-08-06 04:15:19 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::ClearParent( void ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
m_parent = __NULL__;
|
2022-03-25 00:59:30 +00:00
|
|
|
m_parent_attachment = __NULL__;
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
2022-01-03 08:23:20 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::RestoreAngles( void ) {
|
2022-01-03 08:23:20 +00:00
|
|
|
angles = GetSpawnAngles();
|
|
|
|
}
|
2022-08-06 04:15:19 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::ClearAngles( void ) {
|
|
|
|
angles =[0, 0, 0];
|
2022-01-03 08:23:20 +00:00
|
|
|
}
|
2021-10-19 23:18:36 +00:00
|
|
|
#endif
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetEffects( float newEffects ) {
|
2022-08-24 20:31:25 +00:00
|
|
|
effects = newEffects;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetFrame( float newFrame ) {
|
|
|
|
if ( newFrame == frame )
|
2022-08-24 20:31:25 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
frame = newFrame;
|
|
|
|
frame1time = 0.0f;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetSkin( float newSkin ) {
|
2022-08-24 20:31:25 +00:00
|
|
|
skin = newSkin;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetOwner( entity newOwner ) {
|
2022-02-02 18:23:31 +00:00
|
|
|
owner = newOwner;
|
2022-08-06 04:15:19 +00:00
|
|
|
}
|
2022-02-02 18:23:31 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetVelocity( vector vecNew ) {
|
2022-02-02 18:23:31 +00:00
|
|
|
velocity = vecNew;
|
2022-08-06 04:15:19 +00:00
|
|
|
}
|
2022-02-02 18:23:31 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetTouch( void ()newTouch ) {
|
2022-02-02 18:23:31 +00:00
|
|
|
touch = newTouch;
|
2022-08-06 04:15:19 +00:00
|
|
|
}
|
2022-02-02 18:23:31 +00:00
|
|
|
|
2021-10-19 23:18:36 +00:00
|
|
|
/* we want to really use those set functions because they'll notify of any
|
|
|
|
* networking related changes. otherwise we'll have to keep track of copies
|
|
|
|
* that get updated every frame */
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetSendFlags( float flSendFlags ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
#ifdef SERVER
|
|
|
|
SendFlags |= flSendFlags;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetMovetype( float newMovetype ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
movetype = newMovetype;
|
|
|
|
}
|
2022-04-03 21:04:34 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetGravity( float newGrav ) {
|
2022-04-03 21:04:34 +00:00
|
|
|
gravity = newGrav;
|
|
|
|
}
|
2021-10-19 23:18:36 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetSolid( float newSolid ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
solid = newSolid;
|
|
|
|
}
|
2022-08-06 04:15:19 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetScale( float newScale ) {
|
|
|
|
if ( newScale == scale )
|
2022-08-24 20:31:25 +00:00
|
|
|
return;
|
|
|
|
|
2022-02-02 18:23:31 +00:00
|
|
|
scale = newScale;
|
2022-11-16 22:04:10 +00:00
|
|
|
setsize( this, m_vecMins * scale, m_vecMaxs * scale );
|
2022-02-02 18:23:31 +00:00
|
|
|
}
|
2021-10-19 23:18:36 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::UpdateBounds( void ) {
|
2022-01-21 20:24:25 +00:00
|
|
|
vector newMins, newMaxs;
|
2022-01-20 20:18:24 +00:00
|
|
|
float flScale = 1.0f;
|
|
|
|
|
2022-02-01 21:37:21 +00:00
|
|
|
newMins = m_vecMins;
|
|
|
|
newMaxs = m_vecMaxs;
|
|
|
|
|
2022-01-20 20:18:24 +00:00
|
|
|
/* avoid useless computation */
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( angles !=[0, 0, 0] ) {
|
2022-01-20 20:18:24 +00:00
|
|
|
/* adjust bbox according to rotation */
|
|
|
|
vector vecCorner[8];
|
2022-11-16 22:04:10 +00:00
|
|
|
|
|
|
|
newMins = newMaxs =[0, 0, 0];
|
|
|
|
for ( int i = 0; i < 8; i++ ) {
|
|
|
|
vecCorner[i][0] = ( i & 1 ) ? m_vecMins[0] : m_vecMaxs[0];
|
|
|
|
vecCorner[i][1] = ( i & 2 ) ? m_vecMins[1] : m_vecMaxs[1];
|
|
|
|
vecCorner[i][2] = ( i & 4 ) ? m_vecMins[2] : m_vecMaxs[2];
|
2022-01-20 20:18:24 +00:00
|
|
|
vecCorner[i] += origin;
|
2022-11-16 22:04:10 +00:00
|
|
|
vecCorner[i] = Math_RotateAroundPivot( vecCorner[i], origin, angles[1] );
|
2022-01-20 20:18:24 +00:00
|
|
|
vecCorner[i] -= origin;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( !( vecCorner[i][0] <= newMaxs[0] ) )
|
2022-01-20 20:18:24 +00:00
|
|
|
newMaxs[0] = vecCorner[i][0];
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( !( vecCorner[i][1] <= newMaxs[1] ) )
|
2022-01-20 20:18:24 +00:00
|
|
|
newMaxs[1] = vecCorner[i][1];
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( !( vecCorner[i][2] <= newMaxs[2] ) )
|
2022-01-20 20:18:24 +00:00
|
|
|
newMaxs[2] = vecCorner[i][2];
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( !( vecCorner[i][0] >= newMins[0] ) )
|
2022-01-20 20:18:24 +00:00
|
|
|
newMins[0] = vecCorner[i][0];
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( !( vecCorner[i][1] >= newMins[1] ) )
|
2022-01-20 20:18:24 +00:00
|
|
|
newMins[1] = vecCorner[i][1];
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( !( vecCorner[i][2] >= newMins[2] ) )
|
2022-01-20 20:18:24 +00:00
|
|
|
newMins[2] = vecCorner[i][2];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 0.0 is never valid, if you want it to disappear do something else */
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( scale != 0.0 )
|
2022-01-21 20:24:25 +00:00
|
|
|
flScale = scale;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
setsize( this, newMins * flScale, newMaxs * flScale );
|
2022-01-21 20:24:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetAngles( vector newAngles ) {
|
2022-01-21 20:24:25 +00:00
|
|
|
angles = newAngles;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetAngularVelocity( vector newAvel ) {
|
2022-04-03 21:04:34 +00:00
|
|
|
avelocity = newAvel;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetSize( vector newMins, vector newMaxs ) {
|
2022-01-21 20:24:25 +00:00
|
|
|
float flScale = 1.0f;
|
|
|
|
|
|
|
|
m_vecMins = newMins;
|
|
|
|
m_vecMaxs = newMaxs;
|
|
|
|
|
|
|
|
/* 0.0 is never valid, if you want it to disappear do something else */
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( scale != 0.0f )
|
2022-01-20 20:18:24 +00:00
|
|
|
flScale = scale;
|
2021-11-10 02:00:09 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
setsize( this, newMins * flScale, newMaxs * flScale );
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
2022-01-20 20:18:24 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetOrigin( vector newOrigin ) {
|
|
|
|
setorigin( this, newOrigin );
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetModel( string newModel ) {
|
2023-01-06 06:30:49 +00:00
|
|
|
m_bIsBrush = substring(newModel, 0, 1) == "*" ? true : false;
|
2021-10-19 23:18:36 +00:00
|
|
|
model = newModel;
|
2022-11-16 22:04:10 +00:00
|
|
|
setmodel( this, newModel );
|
2022-01-20 20:18:24 +00:00
|
|
|
|
|
|
|
/* mins/maxs have been updated by setmodel */
|
2022-11-16 22:04:10 +00:00
|
|
|
SetSize( mins, maxs );
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetModelindex( float newModelIndex ) {
|
|
|
|
if ( newModelIndex == modelindex )
|
2021-10-19 23:18:36 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
modelindex = newModelIndex;
|
2022-11-16 22:04:10 +00:00
|
|
|
SetSize( mins, maxs );
|
2023-01-06 06:30:49 +00:00
|
|
|
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::AddEffects( float fl ) {
|
2022-10-14 20:08:47 +00:00
|
|
|
effects |= fl;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::RemoveEffects( float fl ) {
|
2022-10-14 20:08:47 +00:00
|
|
|
effects &= ~fl;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::AddFlags( float fl ) {
|
2022-04-03 21:04:34 +00:00
|
|
|
flags |= fl;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::RemoveFlags( float fl ) {
|
2022-04-03 21:04:34 +00:00
|
|
|
flags &= ~fl;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetThink( void ( void ) func ) {
|
2022-08-26 22:39:00 +00:00
|
|
|
think = func;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SetNextThink( float fl ) {
|
2022-08-31 20:24:18 +00:00
|
|
|
float flTime = GetTime();
|
2022-08-26 22:39:00 +00:00
|
|
|
|
|
|
|
/* HACK: to make sure things happen post-spawn */
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( flTime <= 0.0f )
|
2022-08-26 22:39:00 +00:00
|
|
|
flTime = 0.1f;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( fl >= 0 )
|
2022-08-26 22:39:00 +00:00
|
|
|
nextthink = flTime + fl;
|
|
|
|
else
|
2022-11-16 22:04:10 +00:00
|
|
|
NSLog( "%s sets bogus nextthink value %f\n", classname, fl );
|
2022-08-26 22:39:00 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::ScheduleThink( void ( void ) func, float fl ) {
|
|
|
|
SetThink( func );
|
|
|
|
SetNextThink( fl );
|
2022-08-26 22:39:00 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetSpawnOrigin( void ) {
|
|
|
|
return ( m_oldOrigin );
|
2022-08-24 20:31:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetSpawnAngles( void ) {
|
|
|
|
return ( m_oldAngle );
|
2022-08-24 20:31:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
string NSEntity::GetSpawnModel( void ) {
|
|
|
|
return ( m_oldModel );
|
2022-08-24 20:31:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetEffects( void ) {
|
|
|
|
return ( effects );
|
2022-08-24 20:31:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetFrame( void ) {
|
|
|
|
return ( frame );
|
2022-08-24 20:31:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetSkin( void ) {
|
|
|
|
return ( skin );
|
2022-08-24 20:31:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetScale( void ) {
|
|
|
|
return ( scale );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
entity NSEntity::GetOwner( void ) {
|
|
|
|
return ( owner );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetVelocity( void ) {
|
|
|
|
return ( velocity );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetSolid( void ) {
|
|
|
|
return ( solid );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
string NSEntity::GetModel( void ) {
|
|
|
|
return ( model );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetModelindex( void ) {
|
|
|
|
return ( modelindex );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetMovetype( void ) {
|
|
|
|
return ( movetype );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetGravity( void ) {
|
|
|
|
return ( gravity );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetAngles( void ) {
|
|
|
|
return ( angles );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetAngularVelocity( void ) {
|
|
|
|
return ( avelocity );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetOrigin( void ) {
|
|
|
|
return ( origin );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetMins( void ) {
|
|
|
|
return ( mins );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetMaxs( void ) {
|
|
|
|
return ( maxs );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetRealMins( void ) {
|
|
|
|
return ( m_vecMins );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetRealMaxs( void ) {
|
|
|
|
return ( m_vecMaxs );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetAbsoluteMins( void ) {
|
|
|
|
return ( absmin );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
vector NSEntity::GetAbsoluteMaxs( void ) {
|
|
|
|
return ( absmax );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetFlags( void ) {
|
|
|
|
return ( flags );
|
2022-04-03 21:04:34 +00:00
|
|
|
}
|
|
|
|
|
2022-12-15 00:51:16 +00:00
|
|
|
bool NSEntity::HasFlags(float bits) {
|
|
|
|
if ( flags & bits )
|
|
|
|
return (true);
|
|
|
|
|
|
|
|
return (false);
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
float NSEntity::GetNextThinkTime( void ) {
|
|
|
|
return ( nextthink );
|
2022-08-26 22:39:00 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::IsThinking( void ) {
|
|
|
|
return ( nextthink > GetTime() )? true : false;
|
2022-08-26 22:39:00 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::ReleaseThink( void ) {
|
2022-08-26 22:39:00 +00:00
|
|
|
think = __NULL__;
|
|
|
|
nextthink = 0.0f;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::ClearVelocity( void ) {
|
|
|
|
velocity = avelocity =[0.0f, 0.0f, 0.0f];
|
2022-08-26 22:39:00 +00:00
|
|
|
}
|
|
|
|
|
2022-04-20 17:44:59 +00:00
|
|
|
#ifdef SERVER
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::Respawn( void ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
NSTrigger::Respawn();
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
SetSolid( m_oldSolid );
|
|
|
|
SetAngles( GetSpawnAngles() );
|
|
|
|
SetOrigin( GetSpawnOrigin() );
|
|
|
|
SetModel( GetSpawnModel() );
|
|
|
|
SetTriggerTarget( m_oldstrTarget ); /* FIXME: Move into NSTrigger::Respawn */
|
|
|
|
}
|
|
|
|
|
|
|
|
void NSEntity::Save( float handle ) {
|
|
|
|
super::Save( handle );
|
|
|
|
SaveFloat( handle, "pvsflags", pvsflags );
|
|
|
|
SaveFloat( handle, "_mapspawned", _mapspawned );
|
|
|
|
SaveFloat( handle, "scale", scale );
|
|
|
|
SaveVector( handle, "m_vecMins", m_vecMins );
|
|
|
|
SaveVector( handle, "m_vecMaxs", m_vecMaxs );
|
|
|
|
SaveVector( handle, "m_oldOrigin", m_oldOrigin );
|
|
|
|
SaveVector( handle, "m_oldAngle", m_oldAngle );
|
|
|
|
SaveString( handle, "m_oldModel", m_oldModel );
|
|
|
|
SaveFloat( handle, "m_oldSolid", m_oldSolid );
|
|
|
|
SaveFloat( handle, "m_flTouchTime", m_flTouchTime );
|
|
|
|
SaveBool( handle, "m_beingTouched", m_beingTouched );
|
|
|
|
SaveEntity( handle, "m_eTouchLast", m_eTouchLast );
|
|
|
|
SaveString( handle, "m_parent", m_parent );
|
|
|
|
SaveString( handle, "m_parent_attachment", m_parent_attachment );
|
|
|
|
}
|
|
|
|
|
|
|
|
void NSEntity::Restore( string strKey, string strValue ) {
|
|
|
|
switch ( strKey ) {
|
2022-08-10 21:24:06 +00:00
|
|
|
case "pvsflags":
|
2022-11-16 22:04:10 +00:00
|
|
|
pvsflags = stof( strValue );
|
2022-03-18 04:05:47 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "_mapspawned":
|
2022-11-16 22:04:10 +00:00
|
|
|
_mapspawned = stof( strValue );
|
2021-10-22 18:51:51 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "scale":
|
2022-11-16 22:04:10 +00:00
|
|
|
scale = ReadFloat( strValue );
|
2021-10-22 19:20:22 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_vecMins":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_vecMins = ReadVector( strValue );
|
2021-10-22 19:20:22 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_vecMaxs":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_vecMaxs = ReadVector( strValue );
|
2021-10-22 19:20:22 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_oldOrigin":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_oldOrigin = ReadVector( strValue );
|
2021-10-22 19:20:22 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_oldAngle":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_oldAngle = ReadVector( strValue );
|
2021-10-22 18:51:51 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_oldModel":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_oldModel = ReadString( strValue );
|
2021-10-22 18:51:51 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_oldSolid":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_oldSolid = ReadFloat( strValue );
|
2021-10-22 18:51:51 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_flTouchTime":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_flTouchTime = ReadFloat( strValue );
|
2021-10-22 19:20:22 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_beingTouched":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_beingTouched = ReadBool( strValue );
|
2021-10-22 18:51:51 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_eTouchLast":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_eTouchLast = ReadEntity( strValue );
|
2021-10-22 18:51:51 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_parent":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_parent = ReadString( strValue );
|
2021-10-22 18:51:51 +00:00
|
|
|
break;
|
2022-08-10 21:24:06 +00:00
|
|
|
case "m_parent_attachment":
|
2022-11-16 22:04:10 +00:00
|
|
|
m_parent_attachment = ReadString( strValue );
|
2022-04-06 23:21:07 +00:00
|
|
|
break;
|
2021-10-22 18:51:51 +00:00
|
|
|
default:
|
2022-11-16 22:04:10 +00:00
|
|
|
super::Restore( strKey, strValue );
|
2022-08-10 21:24:06 +00:00
|
|
|
break;
|
2021-10-22 18:51:51 +00:00
|
|
|
}
|
|
|
|
}
|
2022-08-10 21:24:06 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::Input( entity eAct, string strInput, string strData ) {
|
|
|
|
switch ( strInput ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
case "Kill":
|
2022-08-31 22:18:06 +00:00
|
|
|
Destroy();
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
case "KillHierarchy":
|
|
|
|
/* this works because ents are basically just entnums */
|
2022-11-16 22:04:10 +00:00
|
|
|
for ( entity e = world; ( e = findfloat( e, ::owner, this ) ); ) {
|
|
|
|
NSEntity ent = ( NSEntity ) e;
|
|
|
|
|
2022-08-31 20:24:18 +00:00
|
|
|
ent.Destroy();
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
2022-08-31 20:24:18 +00:00
|
|
|
Destroy();
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
case "SetParent":
|
2022-11-16 22:04:10 +00:00
|
|
|
SetParent( strData );
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
2022-03-25 00:59:30 +00:00
|
|
|
case "SetParentAttachment":
|
2022-11-16 22:04:10 +00:00
|
|
|
SetParentAttachment( strData );
|
2022-03-25 00:59:30 +00:00
|
|
|
break;
|
2021-10-19 23:18:36 +00:00
|
|
|
case "ClearParent":
|
|
|
|
ClearParent();
|
|
|
|
break;
|
2022-03-27 01:04:06 +00:00
|
|
|
case "Use":
|
|
|
|
eActivator = eAct;
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( PlayerUse )
|
2022-03-27 01:04:06 +00:00
|
|
|
PlayerUse();
|
|
|
|
break;
|
2021-10-19 23:18:36 +00:00
|
|
|
default:
|
2022-11-16 22:04:10 +00:00
|
|
|
NSTrigger::Input( eAct, strInput, strData );
|
2021-10-19 23:18:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::SpawnKey( string strKey, string strValue ) {
|
2021-10-19 23:18:36 +00:00
|
|
|
/* we do re-read a lot of the builtin fields in case we want to set
|
|
|
|
defaults. just in case anybody is wondering. */
|
2022-11-16 22:04:10 +00:00
|
|
|
switch ( strKey ) {
|
2022-03-18 04:05:47 +00:00
|
|
|
case "spawnflags":
|
2022-11-16 22:04:10 +00:00
|
|
|
spawnflags = stof( strValue );
|
2022-03-18 04:05:47 +00:00
|
|
|
break;
|
2021-10-19 23:18:36 +00:00
|
|
|
case "origin":
|
2022-11-16 22:04:10 +00:00
|
|
|
origin = stov( strValue );
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
case "model":
|
|
|
|
model = strValue;
|
|
|
|
break;
|
|
|
|
case "angles":
|
2022-11-16 22:04:10 +00:00
|
|
|
angles = stov( strValue );
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
case "angle":
|
2022-11-16 22:04:10 +00:00
|
|
|
angles[1] = stof( strValue );
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
case "solid":
|
2022-11-16 22:04:10 +00:00
|
|
|
solid = stof( strValue );
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
#ifdef SERVER
|
|
|
|
case "health":
|
2022-11-16 22:04:10 +00:00
|
|
|
health = stof( strValue );
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
case "parentname":
|
2022-11-16 22:04:10 +00:00
|
|
|
SetParent( strValue );
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
case "ignorepvs":
|
|
|
|
pvsflags = PVSF_IGNOREPVS;
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
default:
|
2022-11-16 22:04:10 +00:00
|
|
|
NSTrigger::SpawnKey( strKey, strValue );
|
2021-10-19 23:18:36 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::OnRemoveEntity( void ) {
|
2022-04-13 06:48:31 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::Destroy( void ) {
|
2022-12-01 00:47:24 +00:00
|
|
|
removed = 1; /* mark this as cleanly removed */
|
2022-04-13 06:48:31 +00:00
|
|
|
OnRemoveEntity();
|
2022-12-01 01:26:50 +00:00
|
|
|
ScheduleThink(Util_Destroy, 0.0f );
|
2022-08-06 04:15:19 +00:00
|
|
|
}
|
2022-08-24 20:31:25 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::Show( void ) {
|
2022-08-24 20:31:25 +00:00
|
|
|
effects &= ~EF_NODRAW;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::Hide( void ) {
|
2022-08-24 20:31:25 +00:00
|
|
|
effects |= EF_NODRAW;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::IsHidden( void ) {
|
|
|
|
return ( effects & EF_NODRAW ) ? true : false;
|
2022-08-24 20:31:25 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::Disappear( void ) {
|
2022-08-27 18:20:38 +00:00
|
|
|
modelindex = 0;
|
|
|
|
solid = SOLID_NOT;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::MakeStatic( void ) {
|
|
|
|
makestatic( this );
|
2022-08-24 20:31:25 +00:00
|
|
|
}
|
2022-08-26 22:39:00 +00:00
|
|
|
|
2023-01-06 21:23:48 +00:00
|
|
|
bool
|
|
|
|
NSEntity::CanSpawn(bool clientSide)
|
|
|
|
{
|
|
|
|
/* in most cases, we don't need these to spawn on the client-side */
|
|
|
|
if (clientSide)
|
|
|
|
return false;
|
|
|
|
else
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::WithinBounds( entity check ) {
|
|
|
|
if not ( check.absmin[0] >= absmin[0] && check.absmax[0] <= absmax[0] )
|
|
|
|
return ( false );
|
|
|
|
if not ( check.absmin[1] >= absmin[1] && check.absmax[1] <= absmax[1] )
|
|
|
|
return ( false );
|
|
|
|
if not ( check.absmin[2] >= absmin[2] && check.absmax[2] <= absmax[2] )
|
|
|
|
return ( false );
|
2022-08-26 22:39:00 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
return ( true );
|
2022-08-26 22:39:00 +00:00
|
|
|
}
|
2022-08-31 20:24:18 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::StartSound( string strSample, float channel, float flags, bool broadcast ) {
|
|
|
|
if not ( whichpack( strcat( "sound/", strSample ) ) )
|
|
|
|
return ( false );
|
2022-08-31 20:24:18 +00:00
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( broadcast ) {
|
|
|
|
sound( this, channel, strSample, 1.0, ATTN_NORM );
|
|
|
|
} else {
|
2022-08-31 22:18:06 +00:00
|
|
|
#ifdef SERVER
|
|
|
|
msg_entity = this;
|
2022-11-16 22:04:10 +00:00
|
|
|
sound( this, channel, strSample, 1.0, ATTN_NORM, 0, SOUNDFLAG_UNICAST );
|
2022-08-31 22:18:06 +00:00
|
|
|
msg_entity = __NULL__;
|
|
|
|
#else
|
2022-11-16 22:04:10 +00:00
|
|
|
sound( this, channel, strSample, 1.0, ATTN_NORM );
|
2022-08-31 22:18:06 +00:00
|
|
|
#endif
|
|
|
|
}
|
2022-11-16 22:04:10 +00:00
|
|
|
return ( true );
|
2022-08-31 20:24:18 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
bool NSEntity::StartSoundDef( string strSample, float channel, bool broadcast ) {
|
|
|
|
NSLog( "StartSoundDef: %s %d %d", strSample, channel, broadcast );
|
|
|
|
Sound_Play( this, channel, strSample );
|
|
|
|
return ( true );
|
2022-08-31 20:24:18 +00:00
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::StopSound( float channel, bool broadcast ) {
|
|
|
|
sound( this, channel, "common/null.wav", 0.1f, ATTN_NORM );
|
2022-08-31 20:24:18 +00:00
|
|
|
}
|
|
|
|
|
2022-12-08 01:05:50 +00:00
|
|
|
vector NSEntity::NearestWallPointForRadius(float radius)
|
|
|
|
{
|
|
|
|
vector vecRadius = [radius, radius, radius];
|
|
|
|
tracebox(origin, -vecRadius, vecRadius, origin, MOVE_EVERYTHING, this);
|
|
|
|
|
|
|
|
if (trace_fraction <= 1.0) {
|
|
|
|
return trace_endpos;
|
|
|
|
} else {
|
|
|
|
return origin;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-16 22:04:10 +00:00
|
|
|
void NSEntity::HandleThink( void ) {
|
2022-08-31 20:24:18 +00:00
|
|
|
/* support for think/nextthink */
|
2022-11-16 22:04:10 +00:00
|
|
|
if ( think && nextthink > 0.0f ) {
|
|
|
|
if ( nextthink < time ) {
|
2022-08-31 20:24:18 +00:00
|
|
|
nextthink = 0.0f;
|
|
|
|
think();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-12-14 07:16:00 +00:00
|
|
|
|
2023-01-19 03:01:56 +00:00
|
|
|
bool NSEntity::IsFacing(entity target)
|
|
|
|
{
|
|
|
|
vector vecDiff = normalize(target.origin - origin);
|
|
|
|
makevectors(angles);
|
|
|
|
return ((vecDiff * v_forward) > 0 ) ? true : false;
|
|
|
|
}
|
|
|
|
|
2023-01-23 04:01:24 +00:00
|
|
|
float
|
|
|
|
NSEntity::GetSpawnAge(void)
|
|
|
|
{
|
|
|
|
return time - m_flSpawnTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
float
|
|
|
|
NSEntity::GetSpawnTime(void)
|
|
|
|
{
|
|
|
|
return m_flSpawnTime;
|
|
|
|
}
|
|
|
|
|
2022-12-14 07:16:00 +00:00
|
|
|
#ifdef CLIENT
|
|
|
|
void
|
|
|
|
NSEntity_ReadEntity(bool new)
|
|
|
|
{
|
|
|
|
float fl;
|
|
|
|
|
|
|
|
NSEntity read = (NSEntity)self;
|
|
|
|
if (new) {
|
|
|
|
spawnfunc_NSEntity();
|
|
|
|
}
|
|
|
|
|
|
|
|
fl = readfloat();
|
|
|
|
read.ReceiveEntity(new, fl);
|
|
|
|
}
|
|
|
|
#endif
|