122 lines
2.7 KiB
C++
122 lines
2.7 KiB
C++
|
|
#include "../../idlib/precompiled.h"
|
|
#pragma hdrstop
|
|
|
|
#include "../Game_local.h"
|
|
#include "AI.h"
|
|
|
|
class rvMonsterFailedTransfer : public idAI {
|
|
public:
|
|
|
|
CLASS_PROTOTYPE( rvMonsterFailedTransfer );
|
|
|
|
rvMonsterFailedTransfer ( void );
|
|
|
|
void Spawn ( void );
|
|
void Killed ( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
|
|
void Save ( idSaveGame *savefile ) const;
|
|
void Restore ( idRestoreGame *savefile );
|
|
|
|
protected:
|
|
|
|
bool allowSplit;
|
|
|
|
virtual void OnDeath ( void );
|
|
|
|
private:
|
|
|
|
CLASS_STATES_PROTOTYPE ( rvMonsterFailedTransfer );
|
|
};
|
|
|
|
CLASS_DECLARATION( idAI, rvMonsterFailedTransfer )
|
|
END_CLASS
|
|
|
|
/*
|
|
================
|
|
rvMonsterFailedTransfer::rvMonsterFailedTransfer
|
|
================
|
|
*/
|
|
rvMonsterFailedTransfer::rvMonsterFailedTransfer ( ) {
|
|
allowSplit = false;
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvMonsterFailedTransfer::Spawn
|
|
================
|
|
*/
|
|
void rvMonsterFailedTransfer::Spawn ( void ) {
|
|
LoadAF ( "ragdoll_legs", true );
|
|
LoadAF ( NULL, true );
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvMonsterFailedTransfer::Save
|
|
================
|
|
*/
|
|
void rvMonsterFailedTransfer::Save( idSaveGame *savefile ) const {
|
|
savefile->WriteBool ( allowSplit );
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvMonsterFailedTransfer::Restore
|
|
================
|
|
*/
|
|
void rvMonsterFailedTransfer::Restore( idRestoreGame *savefile ) {
|
|
savefile->ReadBool ( allowSplit );
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvMonsterFailedTransfer::OnDeath
|
|
================
|
|
*/
|
|
void rvMonsterFailedTransfer::OnDeath ( void ) {
|
|
idAI::OnDeath ( );
|
|
|
|
if ( allowSplit ) {
|
|
idEntity* torso;
|
|
idDict args;
|
|
|
|
LoadAF ( "ragdoll_legs", true );
|
|
|
|
PlayEffect ( "fx_bloodyburst", animator.GetJointHandle ( "chest" ) );
|
|
SetSkin ( declManager->FindSkin ( spawnArgs.GetString ( "skin_legs" ) ) );
|
|
|
|
args.Copy ( *gameLocal.FindEntityDefDict ( "monster_failed_transfer_torso" ) );
|
|
args.SetVector ( "origin", GetPhysics()->GetOrigin() + GetPhysics()->GetGravityNormal() * -50.0f );
|
|
args.SetInt ( "angle", move.current_yaw );
|
|
gameLocal.SpawnEntityDef ( args, &torso );
|
|
torso->fl.takedamage = false;
|
|
PostEventMS( &AI_TakeDamage, 100, 1.0f );
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
rvMonsterFailedTransfer::Killed
|
|
================
|
|
*/
|
|
void rvMonsterFailedTransfer::Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location ) {
|
|
if ( !idStr::Icmp ( GetDamageGroup( location ), "legs" ) && damage < 999 ) {
|
|
allowSplit = true;
|
|
} else {
|
|
allowSplit = false;
|
|
}
|
|
|
|
idAI::Killed ( inflictor, attacker, damage, dir, location );
|
|
}
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
States
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
CLASS_STATES_DECLARATION ( rvMonsterFailedTransfer )
|
|
END_CLASS_STATES
|
|
|