quake4-sdk/source/mpgame/ai/Monster_FailedTransfer.cpp
2007-06-15 00:00:00 +00:00

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