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.
135 lines
3.8 KiB
135 lines
3.8 KiB
//===== Copyright Âc 1996-2008, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose: static_prop - don't move, don't animate, don't do anything.
|
|
// physics_prop - move, take damage, but don't animate
|
|
//
|
|
//===========================================================================//
|
|
|
|
|
|
#include "cbase.h"
|
|
#include "prop_physics2.h"
|
|
#include "tier1/tier1.h"
|
|
#include "vphysics2_interface.h"
|
|
#include "datacache/imdlcache.h"
|
|
#include <vphysics2_interface_flags.h>
|
|
#include "phzfile.h"
|
|
|
|
extern IPhysics2World *g_pPhys2World;
|
|
|
|
ConVar g_cv_phys2_shoot_speed("phys2_shoot_speed", "250");
|
|
|
|
//bool g_bTestPhysics2PropSphere = false;
|
|
|
|
void CPhysics2Prop::Spawn( void )
|
|
{
|
|
SetNetworkQuantizeOriginAngAngles( true );
|
|
|
|
if ( FClassnameIs( this, "physics2_prop" ) )
|
|
{
|
|
SetClassname( "prop_physics2" );
|
|
}
|
|
CBaseEntity::Spawn();
|
|
if ( IsMarkedForDeletion() )
|
|
return;
|
|
|
|
m_pCookedInertia = NULL;
|
|
m_pInertia = NULL;
|
|
m_pShape = NULL;
|
|
|
|
const Physics2PropCollision_t *propCollision = modelinfo->GetPhysics2PropCollision(GetModelIndex());
|
|
m_pShape = propCollision->m_pShape;
|
|
m_pInertia = propCollision->m_pInertia;
|
|
|
|
if(!m_pShape)
|
|
m_pShape = g_pPhysics2ResourceManager->GetStockShape(PHYSICS2_STOCK_SPHERE_1M);
|
|
|
|
if(!m_pInertia)
|
|
{
|
|
m_pCookedInertia = g_pPhysics2->GetCook()->CookInertia(m_pShape);
|
|
m_pInertia = m_pCookedInertia->GetInertia();
|
|
}
|
|
m_pActor = g_pPhys2World->AddActor(m_pShape, m_pInertia);
|
|
fltx4 pos = LoadUnaligned3SIMD(&GetAbsOrigin().x);
|
|
m_pActor->SetPosition(pos);
|
|
m_pActor->SetUserData((uintp)static_cast<CBaseEntity*>(this));
|
|
}
|
|
|
|
CPhysics2Prop::~CPhysics2Prop()
|
|
{
|
|
if(m_pCookedInertia)
|
|
g_pPhysics2->GetCook()->Destroy(m_pCookedInertia);
|
|
m_pActor->SetUserData(0);
|
|
g_pPhys2World->Destroy(m_pActor);
|
|
//g_pPhys2World->Destroy(m_pBoxActor);
|
|
//g_pPhysics2ResourceManager->Release(m_pBoxShape);
|
|
}
|
|
|
|
|
|
void CPhysics2Prop::Precache( void )
|
|
{
|
|
if ( GetModelName() == NULL_STRING )
|
|
{
|
|
Msg( "%s at (%.3f, %.3f, %.3f) has no model name!\n", GetClassname(), GetAbsOrigin().x, GetAbsOrigin().y, GetAbsOrigin().z );
|
|
}
|
|
else
|
|
{
|
|
PrecacheModel( STRING( GetModelName() ) );
|
|
CBaseEntity::Precache();
|
|
}
|
|
}
|
|
|
|
void CPhysics2Prop::VPhysicsUpdate( IPhysicsObject *pPhysicsNull )
|
|
{
|
|
Assert(!pPhysicsNull);
|
|
union
|
|
{
|
|
struct{float x,y,z,w;}f;
|
|
fltx4 v4;
|
|
}temp;
|
|
Assert(m_pActor->GetUserData() == (uintp)this);
|
|
temp.v4 = m_pActor->GetPosition();
|
|
SetAbsOrigin(Vector(temp.f.x,temp.f.y,temp.f.z));
|
|
|
|
QAngle angles;
|
|
QuaternionAngles(m_pActor->GetOrientation(), angles);
|
|
SetAbsAngles(angles);
|
|
}
|
|
|
|
|
|
|
|
|
|
BEGIN_DATADESC( CPhysics2Prop )
|
|
END_DATADESC()
|
|
|
|
// IMPLEMENT_SERVERCLASS_ST( CPhysics2Prop, DT_Physics2Prop )
|
|
// END_SEND_TABLE()
|
|
|
|
LINK_ENTITY_TO_CLASS( prop_physics2, CPhysics2Prop );
|
|
|
|
CON_COMMAND_F( phys2_shoot, "<tank|boomer|smoker|witch|hunter|mob|common> <auto> <ragdoll> <area>. Shoots a phys2 object.", FCVAR_CHEAT )
|
|
{
|
|
CBasePlayer *commandIssuer = UTIL_GetCommandClient();
|
|
if( commandIssuer == NULL )
|
|
return ;
|
|
Vector spawnOffset(0,0,24);
|
|
Vector forward;
|
|
commandIssuer->EyeVectors( &forward );
|
|
|
|
trace_t tr;
|
|
UTIL_TraceLine( commandIssuer->EyePosition(), commandIssuer->EyePosition() + forward * 100, MASK_ZOMBIESOLID, commandIssuer, COLLISION_GROUP_NONE, &tr );
|
|
|
|
|
|
//CBaseEntity *pTemp = CreateEntityByName("prop_physics2");
|
|
Vector velocity = forward * g_cv_phys2_shoot_speed.GetFloat();
|
|
Vector spawnPos = tr.endpos;
|
|
if ( tr.fraction != 1.0 )
|
|
spawnPos += spawnOffset;
|
|
|
|
CBaseEntity *pEntity = CBaseEntity::CreateNoSpawn("prop_physics2", spawnPos, QAngle(0,0,0));
|
|
pEntity->SetModelName(/*castable_string_t*/MAKE_STRING("models/props_crates/supply_crate01.mdl"));
|
|
pEntity->Precache();
|
|
pEntity->SetModel("models/props_crates/supply_crate01.mdl");
|
|
pEntity->Spawn();
|
|
static_cast<CPhysics2Prop*>(pEntity)->m_pActor->SetVelocity(LoadUnaligned3SIMD(&velocity.x));
|
|
//static_cast<CPhysics2Prop*>(pEntity)->m_pBoxActor->;
|
|
}
|