You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.3 KiB
151 lines
4.3 KiB
5 years ago
|
//========= 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;
|
||
|
}
|
||
|
|