Files
DoomRTX/neo/prey/Prey/prey_projectilespiritarrow.cpp
T
2026-05-05 15:01:01 -07:00

105 lines
3.9 KiB
C++

#include "precompiled.h"
#pragma hdrstop
#include "prey_local.h"
/***********************************************************************
hhProjectileSpiritArrow
***********************************************************************/
CLASS_DECLARATION( hhProjectile, hhProjectileSpiritArrow )
EVENT( EV_AllowCollision_Spirit, hhProjectile::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_Chaff, hhProjectile::Event_AllowCollision_PassThru )
EVENT( EV_AllowCollision_Flesh, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_Metal, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_AltMetal, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_Wood, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_Stone, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_Glass, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_Pipe, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_Tile, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_AllowCollision_CardBoard, hhProjectileSpiritArrow::Event_AllowCollision_Collide )
EVENT( EV_Collision_Flesh, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_Metal, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_AltMetal, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_Wood, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_Stone, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_Glass, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_Wallwalk, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_Pipe, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_CardBoard, hhProjectileSpiritArrow::Event_Collision_Stick )
EVENT( EV_Collision_Spirit, hhProjectileSpiritArrow::Event_Collision_Impact )
EVENT( EV_Collision_Chaff, hhProjectileSpiritArrow::Event_Collision_Impact )
END_CLASS
int hhProjectileSpiritArrow::DetermineClipmask() {
return MASK_SPIRITARROW;
}
/*
=================
hhProjectileSpiritArrow::BindToCollisionObject
=================
*/
void hhProjectileSpiritArrow::BindToCollisionObject( const trace_t* collision ) {
if( !collision || collision->fraction == 1.0f ) {
return;
}
idEntity* pEntity = gameLocal.entities[collision->c.entityNum];
HH_ASSERT( pEntity );
if( !pEntity->fl.applyDamageEffects ) {
PostEventMS( &EV_Fizzle, 0 );
return;
}
if ( pEntity->spawnArgs.GetBool( "no_arrow_stick" ) ) {
RemoveProjectile( 0 );
return;
}
jointHandle_t jointHandle = CLIPMODEL_ID_TO_JOINT_HANDLE( collision->c.id );
idVec3 penetrationVector( collision->endAxis[0] * spawnArgs.GetFloat("penetrationDepth", "10") ); // Push the arrow into the hit object a bit
if ( jointHandle != INVALID_JOINT ) {
SetOrigin( collision->endpos + penetrationVector );
BindToJoint( pEntity, jointHandle, true );
} else {
SetOrigin( collision->endpos + penetrationVector );
Bind( pEntity, true );
}
}
/*
=================
hhProjectileSpiritArrow::Event_Collision_Stick
=================
*/
void hhProjectileSpiritArrow::Event_Collision_Stick( const trace_t* collision, const idVec3 &velocity ) {
ProcessCollision( collision, velocity );//Assuming that EV_Fizzle is canceled in ProcessCollision
if (gameLocal.isMultiplayer) { //rww - in mp we don't stick to players.
idEntity *pEntity = gameLocal.entities[collision->c.entityNum];
if (pEntity && pEntity->IsType(hhPlayer::Type)) {
PostEventMS( &EV_Fizzle, 0 );
idThread::ReturnInt( 1 );
return;
}
}
PostEventMS( &EV_Fizzle, spawnArgs.GetInt("remove_time") );
BindToCollisionObject( collision );
fl.ignoreGravityZones = true;
SetGravity( idVec3(0.f, 0.f, 0.f) );
spawnArgs.SetVector("gravity", idVec3(0.f, 0.f, 0.f) );
idThread::ReturnInt( 1 );
}