This repository has been archived on 2022-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
Xash3DArchive/server/ents/baseother.cpp

270 lines
8.0 KiB
C++

//=======================================================================
// Copyright (C) XashXT Group 2007
// misc temporary entities
//=======================================================================
#include "extdll.h"
#include "utils.h"
#include "cbase.h"
#include "player.h"
//=======================================================================
// sparkleent - explode post sparks
//=======================================================================
class CEnvShower : public CBaseEntity
{
void Spawn( void );
void Think( void );
void Touch( CBaseEntity *pOther );
int ObjectCaps( void ) { return FCAP_DONT_SAVE; }
};
LINK_ENTITY_TO_CLASS( sparkleent, CEnvShower );
void CEnvShower::Spawn( void )
{
pev->velocity = RANDOM_FLOAT( 200, 300 ) * pev->angles;
pev->velocity.x += RANDOM_FLOAT(-100.f,100.f);
pev->velocity.y += RANDOM_FLOAT(-100.f,100.f);
if ( pev->velocity.z >= 0 ) pev->velocity.z += 200;
else pev->velocity.z -= 200;
pev->movetype = MOVETYPE_BOUNCE;
pev->gravity = 0.5;
SetNextThink( 0.1 );
pev->solid = SOLID_NOT;
UTIL_SetModel( edict(), "models/common/null.mdl");
UTIL_SetSize(pev, g_vecZero, g_vecZero );
pev->effects |= EF_NODRAW;
pev->speed = RANDOM_FLOAT( 0.5, 1.5 );
pev->angles = g_vecZero;
}
void CEnvShower::Think( void )
{
UTIL_Sparks( pev->origin );
pev->speed -= 0.1;
if ( pev->speed > 0 ) SetNextThink( 0.1 );
else UTIL_Remove( this );
pev->flags &= ~FL_ONGROUND;
}
void CEnvShower::Touch( CBaseEntity *pOther )
{
if ( pev->flags & FL_ONGROUND )
pev->velocity = pev->velocity * 0.1;
else pev->velocity = pev->velocity * 0.6;
if ( (pev->velocity.x*pev->velocity.x+pev->velocity.y*pev->velocity.y) < 10.0 ) pev->speed = 0;
}
//====================================================================
// ChangeLevelFire
//====================================================================
class ChangeLevelFire : public CBaseLogic
{
public:
void PostActivate( void ) { FireTargets(); UTIL_Remove( this ); }
int ObjectCaps( void ) { return CBaseEntity::ObjectCaps() | FCAP_FORCE_TRANSITION; }
};
LINK_ENTITY_TO_CLASS( fireent, ChangeLevelFire );
//=======================================================================
// faderent - rendering time effects
//=======================================================================
class CRenderFxFader : public CBaseLogic
{
public:
void Spawn ( void ) { m_hTarget = CBaseEntity::Instance( pev->owner ); }
void Think ( void )
{
if (((CBaseEntity*)m_hTarget) == NULL)
{
UTIL_Remove( this );
return;
}
float flDegree = (gpGlobals->time - pev->dmgtime)/pev->speed;
if (flDegree >= 1)
{
m_hTarget->pev->renderamt = pev->renderamt + pev->health;
m_hTarget->pev->rendercolor = pev->rendercolor + pev->movedir;
m_hTarget->pev->scale = pev->scale + pev->frags;
m_hTarget->pev->framerate = pev->framerate + pev->max_health;
UTIL_FireTargets( pev->target, m_hTarget, this, USE_TOGGLE );
m_hTarget = NULL;
SetNextThink( 0.1 );
SetThink(Remove);
}
else
{
m_hTarget->pev->renderamt = pev->renderamt + pev->health * flDegree;
m_hTarget->pev->rendercolor.x = pev->rendercolor.x + pev->movedir.x * flDegree;
m_hTarget->pev->rendercolor.y = pev->rendercolor.y + pev->movedir.y * flDegree;
m_hTarget->pev->rendercolor.z = pev->rendercolor.z + pev->movedir.z * flDegree;
m_hTarget->pev->scale = pev->scale + pev->frags * flDegree;
m_hTarget->pev->framerate = pev->framerate + pev->max_health * flDegree;
SetNextThink( 0.01 );//fader step
}
}
};
LINK_ENTITY_TO_CLASS( faderent, CRenderFxFader );
//=======================================================================
// smokeent - temporary smoke
//=======================================================================
class CSmokeEnt : public CBaseAnimating
{
void Spawn( void );
void Think( void );
};
LINK_ENTITY_TO_CLASS( smokeent, CSmokeEnt );
void CSmokeEnt::Spawn( void )
{
pev->solid = SOLID_BBOX;
pev->movetype = MOVETYPE_NONE;
pev->armorvalue = gpGlobals->time;
if(!pev->team) pev->team = 50;
if(pev->team > 250)pev->team = 250;//normalize and remember about random value 0 - 5
}
void CSmokeEnt::Think( void )
{
if (pev->dmgtime)
{
if (pev->dmgtime < gpGlobals->time)
{
UTIL_Remove( this );
return;
}
else if (RANDOM_FLOAT( 0, pev->dmgtime - pev->armorvalue ) > pev->dmgtime - gpGlobals->time)
{
return;
}
}
Vector VecSrc = UTIL_RandomVector( pev->absmin, pev->absmax );
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, VecSrc );
WRITE_BYTE( TE_SMOKE );
WRITE_COORD( VecSrc.x );
WRITE_COORD( VecSrc.y );
WRITE_COORD( VecSrc.z );
WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( RANDOM_LONG(0,5) + pev->impulse ); // scale * 10
WRITE_BYTE( RANDOM_LONG(0, 3) + 8 ); // framerate
MESSAGE_END();
StudioFrameAdvance( );//animate model if present
SetNextThink( 0.2 );
}
//=========================================================
// func_platform floor indicator
//=========================================================
class CFloorEnt:public CPointEntity
{
void Think( void );
void PostActivate( void );
CBasePlatform *pElevator; //no need to save - PostActivate will be restore this
};
void CFloorEnt::PostActivate( void )
{
pElevator = (CBasePlatform*)CBasePlatform::Instance( pev->owner );
SetNextThink( 0 );
}
void CFloorEnt::Think ( void )
{
if(pElevator && (pElevator->GetState() == STATE_TURN_ON || pElevator->GetState() == STATE_TURN_OFF) )
{
UTIL_FireTargets( pev->target, pElevator, this, USE_SET, pElevator->CalcFloor());
SetNextThink( 0.01 );
}
else UTIL_Remove( this );
}
LINK_ENTITY_TO_CLASS( floorent, CFloorEnt );
//====================================================================
// Laser pointer target
//====================================================================
CLaserSpot *CLaserSpot::CreateSpot( void )
{
CLaserSpot *pSpot = GetClassPtr( (CLaserSpot *)NULL );
pSpot->Spawn();
pSpot->pev->classname = MAKE_STRING("laserspotent");
return pSpot;
}
void CLaserSpot::Precache( void )
{
UTIL_PrecacheModel("sprites/glow02.spr");
UTIL_PrecacheSound("weapons/spot_on.wav");
UTIL_PrecacheSound("weapons/spot_off.wav");
}
void CLaserSpot::Spawn( void )
{
Precache( );
//laser dot settings
pev->movetype = MOVETYPE_FLY;
pev->solid = SOLID_NOT;
pev->scale = 1.0;
pev->rendermode = kRenderGlow;
pev->renderfx = kRenderFxNoDissipation;
pev->renderamt = 255;
pev->rendercolor = Vector( 200, 12, 12 );
UTIL_SetModel(ENT(pev), "sprites/glow02.spr" );
UTIL_SetOrigin( this, pev->origin );
}
void CLaserSpot::Suspend( float flSuspendTime )
{
pev->effects |= EF_NODRAW;
// -1 means suspend indefinitely
if (flSuspendTime == -1) SetThink( NULL );
else
{
SetThink( Revive );
SetNextThink( flSuspendTime );
}
}
void CLaserSpot::Revive( void )
{
pev->effects &= ~EF_NODRAW;
SetThink( NULL );
}
void CLaserSpot::Update( CBasePlayer *m_pPlayer )
{
TraceResult tr;
UTIL_MakeVectors( m_pPlayer->pev->v_angle );
UTIL_TraceLine( m_pPlayer->GetGunPosition(), m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 8192, dont_ignore_monsters, ENT(m_pPlayer->pev), &tr );
UTIL_SetOrigin( this, tr.vecEndPos );
if( UTIL_PointContents( tr.vecEndPos ) & CONTENTS_SKY && VARS(tr.pHit)->solid == SOLID_BSP )
{
pev->renderamt = 33;
pev->effects |= EF_NODRAW;
}
else
{
pev->effects &= ~EF_NODRAW;
float SpotDistance = (tr.vecEndPos - m_pPlayer->GetGunPosition()).Length();
int brightness = (1 / log(SpotDistance / 0.3)) * 1300;
pev->scale = SpotDistance / 2500 + RANDOM_FLOAT(0.01, SpotDistance/2750);
if(pev->renderamt >= 255) pev->renderamt = brightness + RANDOM_LONG(1, SpotDistance/400);
else pev->renderamt += 5;
}
}
LINK_ENTITY_TO_CLASS( laserspotent, CLaserSpot );