mirror of
https://github.com/jmarshall23/DoomRTX.git
synced 2026-08-16 08:10:32 +02:00
105 lines
3.9 KiB
C++
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 );
|
|
} |