mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 01:39:36 +00:00
1
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
//========= 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user