mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-01-09 08:56:43 +00:00
151 lines
4.3 KiB
C++
151 lines
4.3 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#include "cbase.h"
|
|
#include "tf_shield_flat.h"
|
|
#include "tf_shieldshared.h"
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Data tables
|
|
//-----------------------------------------------------------------------------
|
|
LINK_ENTITY_TO_CLASS( shield_flat, CShieldFlat );
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CShieldFlat, DT_Shield_Flat)
|
|
|
|
SendPropInt (SENDINFO(m_ShieldState), 2, SPROP_UNSIGNED ),
|
|
SendPropFloat (SENDINFO(m_Width), 8, 0, 0, 256 ),
|
|
SendPropFloat (SENDINFO(m_Height), 8, 0, 0, 256 ),
|
|
|
|
END_SEND_TABLE()
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Spawn
|
|
//-----------------------------------------------------------------------------
|
|
void CShieldFlat::Spawn( )
|
|
{
|
|
BaseClass::Spawn();
|
|
m_ShieldState = 0;
|
|
ShieldMoved();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Computes the shield bounding box
|
|
//-----------------------------------------------------------------------------
|
|
void CShieldFlat::ShieldMoved( void )
|
|
{
|
|
Vector forward, right, up;
|
|
AngleVectors( GetAbsAngles(), &forward, &right, &up );
|
|
|
|
VectorMA( GetAbsOrigin(), -m_Width * 0.5, right, m_Pos[0] );
|
|
VectorMA( m_Pos[0], -m_Height * 0.5, up, m_Pos[0] );
|
|
VectorMA( m_Pos[0], m_Width, right, m_Pos[1] );
|
|
VectorMA( m_Pos[0], m_Height, up, m_Pos[2] );
|
|
VectorMA( m_Pos[2], m_Width, right, m_Pos[3] );
|
|
|
|
m_LastAngles = GetAbsAngles();
|
|
m_LastPosition = GetAbsOrigin();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Shield size
|
|
//-----------------------------------------------------------------------------
|
|
void CShieldFlat::SetSize( float w, float h )
|
|
{
|
|
m_Width = w;
|
|
m_Height = h;
|
|
Vector mins( -1.0/16.0f, -w * 0.5f, -h * 0.5f );
|
|
Vector maxs( 1.0/16.0f, w * 0.5f, h * 0.5f );
|
|
UTIL_SetSize( this, mins, maxs );
|
|
ShieldMoved();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Compute world axis-aligned bounding box
|
|
//-----------------------------------------------------------------------------
|
|
void CShieldFlat::ComputeWorldSpaceSurroundingBox( Vector *pWorldMins, Vector *pWorldMaxs )
|
|
{
|
|
TransformAABB( CollisionProp()->CollisionToWorldTransform(),
|
|
CollisionProp()->OBBMins(), CollisionProp()->OBBMaxs(), *pWorldMins, *pWorldMaxs );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Shield points
|
|
//-----------------------------------------------------------------------------
|
|
const Vector& CShieldFlat::GetPoint( int x, int y )
|
|
{
|
|
if ((m_LastAngles != GetAbsAngles()) || (m_LastPosition != GetAbsOrigin() ))
|
|
{
|
|
ShieldMoved();
|
|
}
|
|
|
|
int i = (x >= 1);
|
|
i += (y >= 1) * 2;
|
|
return m_Pos[i];
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Called when the shield is EMPed
|
|
//-----------------------------------------------------------------------------
|
|
void CShieldFlat::SetEMPed( bool isEmped )
|
|
{
|
|
CShield::SetEMPed(isEmped);
|
|
if (IsEMPed())
|
|
{
|
|
m_ShieldState |= SHIELD_FLAT_EMP;
|
|
}
|
|
else
|
|
{
|
|
m_ShieldState &= ~SHIELD_FLAT_EMP;
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Shield is killed here
|
|
//-----------------------------------------------------------------------------
|
|
void CShieldFlat::Activate( bool active )
|
|
{
|
|
if (active)
|
|
{
|
|
m_ShieldState &= ~SHIELD_FLAT_INACTIVE;
|
|
}
|
|
else
|
|
{
|
|
m_ShieldState |= SHIELD_FLAT_INACTIVE;
|
|
}
|
|
ActivateCollisions( active );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Create a mobile version of the shield
|
|
//-----------------------------------------------------------------------------
|
|
CShieldFlat* CreateFlatShield( CBaseEntity *pOwner, float w, float h, const Vector& relOrigin, const QAngle &relAngles )
|
|
{
|
|
CShieldFlat *pShield = (CShieldFlat*)CreateEntityByName("shield_flat");
|
|
|
|
pShield->SetParent( pOwner );
|
|
pShield->SetOwnerEntity( pOwner );
|
|
UTIL_SetOrigin( pShield, relOrigin );
|
|
|
|
// Compute relative angles....
|
|
pShield->SetLocalAngles( relAngles );
|
|
pShield->ChangeTeam( pOwner->GetTeamNumber() );
|
|
pShield->Spawn();
|
|
pShield->SetSize( w , h );
|
|
|
|
return pShield;
|
|
}
|
|
|