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.
150 lines
4.3 KiB
150 lines
4.3 KiB
//========= 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; |
|
} |
|
|
|
|