summaryrefslogtreecommitdiff
path: root/game/server/tf2/ragdoll_shadow.cpp
blob: 5c35c10c95568cb94b086dcc054bc54705d2857f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Resource chunks
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "ragdoll_shadow.h"
#include "tf_player.h"
#include "sendproxy.h"

// FIXME Hook up a real player standin
static char *sRagdollShadowModel = "models/player/human_commando.mdl";


IMPLEMENT_SERVERCLASS_ST( CRagdollShadow, DT_RagdollShadow )
	SendPropInt( SENDINFO( m_nPlayer ), 10, SPROP_UNSIGNED ),

	SendPropExclude( "DT_BaseEntity", "m_angAbsRotation[0]" ),
	SendPropExclude( "DT_BaseEntity", "m_angAbsRotation[1]" ),
	SendPropExclude( "DT_BaseEntity", "m_angAbsRotation[2]" ),

END_SEND_TABLE()

LINK_ENTITY_TO_CLASS( ragdoll_shadow, CRagdollShadow );
PRECACHE_REGISTER( ragdoll_shadow );

CRagdollShadow::CRagdollShadow( void )
{
	m_pPlayer = NULL;
	m_nPlayer = 0;
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CRagdollShadow::Spawn( )
{
	// Init value & model
	if ( m_pPlayer )
	{
		SetModelName( m_pPlayer->GetModelName() );
	}
	else
	{
		SetModelName( AllocPooledString( sRagdollShadowModel ) );
	}

	BaseClass::Spawn();

	// Create the object in the physics system
	IPhysicsObject *pPhysics = VPhysicsInitNormal( SOLID_VPHYSICS, FSOLID_NOT_SOLID, false );
//	IPhysicsObject *pPhysics = VPhysicsInitNormal( SOLID_VPHYSICS, 0, false );
	
	// disable physics sounds on this object
	pPhysics->SetMaterialIndex( physprops->GetSurfaceIndex("default_silent") );

	UTIL_SetSize( this, Vector(-36,-36, 0), Vector(36,36,72) );
}

//-----------------------------------------------------------------------------
// Purpose: 
// Input  : **ppSendTable - 
//			*recipient - 
//			*pvs - 
//			clientArea - 
// Output : Returns true on success, false on failure.
//-----------------------------------------------------------------------------
int CRagdollShadow::ShouldTransmit( const CCheckTransmitInfo *pInfo )
{
	// Always send to local player
	if ( Instance( pInfo->m_pClientEnt ) == GetOwnerEntity() )
		return FL_EDICT_ALWAYS;

	return BaseClass::ShouldTransmit( pInfo );
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CRagdollShadow::Precache( void )
{
	PrecacheModel( sRagdollShadowModel );
}

//-----------------------------------------------------------------------------
// Purpose: Create a resource chunk
//-----------------------------------------------------------------------------
CRagdollShadow *CRagdollShadow::Create( CBaseTFPlayer *player, const Vector& force )
{
	CRagdollShadow *pRagdollShadow = (CRagdollShadow*)CreateEntityByName("ragdoll_shadow");

	UTIL_SetOrigin( pRagdollShadow, player->GetAbsOrigin() );

	pRagdollShadow->m_pPlayer = player;
	pRagdollShadow->m_nPlayer = player->entindex();

	pRagdollShadow->Spawn();
	pRagdollShadow->SetAbsVelocity( force );
	pRagdollShadow->SetLocalAngles( vec3_angle );
	pRagdollShadow->SetLocalAngularVelocity( RandomAngle( -100, 100 ) );

	//pRagdollShadow->AddEffects( EF_NODRAW );
	pRagdollShadow->AddEffects( EF_NOSHADOW );

	pRagdollShadow->m_lifeState = LIFE_DYING;

	IPhysicsObject *pPhysicsObject = pRagdollShadow->VPhysicsGetObject();
	if ( pPhysicsObject )
	{
		AngularImpulse tmp;
		QAngleToAngularImpulse( pRagdollShadow->GetLocalAngularVelocity(), tmp );
		pPhysicsObject->AddVelocity( &pRagdollShadow->GetAbsVelocity(), &tmp );
	}

	return pRagdollShadow;
}