Files
2026-05-05 15:01:01 -07:00

137 lines
3.8 KiB
C++

#include "precompiled.h"
#pragma hdrstop
#include "prey_local.h"
const idEventDef MA_CheckReactions( "<checkreactions>", "e" );
CLASS_DECLARATION( hhMonsterAI, hhAIInspector )
EVENT( EV_PostSpawn, hhAIInspector::Event_PostSpawn )
EVENT( MA_CheckReactions, hhAIInspector::Event_CheckReactions )
END_CLASS
void hhAIInspector::Spawn() {
}
void hhAIInspector::Event_PostSpawn() {
const function_t* func = GetScriptFunction( "state_InspectorIdle" );
if( !func ) {
gameLocal.Warning( "unable to find state_InspectorIdle" );
return;
}
SetState( func );
}
void hhAIInspector::CheckReactions( idEntity* entity ) {
PostEventMS( &MA_CheckReactions, 1000, entity );
}
void hhAIInspector::Event_CheckReactions( idEntity* entity ) {
checkReaction = entity;
targetReaction.entity = entity;
targetReaction.reactionIndex = 0;
if( !targetReaction.GetReaction() ) {
targetReaction.reactionIndex = -1;
gameLocal.Warning( "unable to properly use requested reaction... possibly no reactions on this entity" );
return;
}
const function_t* func = GetScriptFunction( "state_InspectorReactions" );
if( !func ) {
gameLocal.Warning( "unable to find checkreaction state on inspector..." );
return;
}
SetState( func );
}
void hhAIInspector::RestartInspector( const char* inspectClass, idEntity* newReaction, idPlayer* starter ) {
float yaw;
idVec3 org;
idDict spawnDict;
idEntity* react_scout;
idEntity* use_reaction = NULL;
//Find our dictionary to use
const idDict* edict = gameLocal.FindEntityDefDict( inspectClass, false );
if( !edict ) {
gameLocal.Printf( "Unable to find entitfydef '%s'", inspectClass );
return;
}
spawnDict = *edict; //copy the values to an editable dict
//Setup values for position/orientation
yaw = starter->viewAngles.yaw;
org = starter->GetPhysics()->GetOrigin() + idAngles( 0, yaw, 0 ).ToForward() * 180 + idVec3( 0, 0, 1 );
// Set dictionary values...
spawnDict.Set( "angle", va("%f", yaw + 180) );
spawnDict.Set( "origin", org.ToString() );
spawnDict.Set( "spawnClass", "hhAIInspector" );
// Perform actual spawn
react_scout = static_cast<hhAIInspector*>(gameLocal.SpawnEntityType(hhAIInspector::Type, &spawnDict));
if( !react_scout ) {
gameLocal.Printf( "failed to spawn inspector monster..." );
return;
}
use_reaction = newReaction;
if( gameLocal.inspector != NULL ) {
//save our old use_reaction if we haven't specified one
if( !use_reaction && gameLocal.inspector.IsValid() && gameLocal.inspector->checkReaction.IsValid() ) {
use_reaction = gameLocal.inspector->checkReaction.GetEntity();
}
// Remove our old inspector
gameLocal.inspector->PostEventMS( &EV_Remove, 0 );
}
gameLocal.inspector = react_scout;
if( use_reaction ) {
gameLocal.inspector->CheckReactions( use_reaction );
}
}
void hhAIInspector::RestartInspector( idEntity* newReaction, idPlayer* starter ) {
idEntity* react_scout;
float yaw;
idVec3 org;
yaw = starter->viewAngles.yaw;
org = starter->GetPhysics()->GetOrigin() + idAngles( 0, yaw, 0 ).ToForward() * 180 + idVec3( 0, 0, 1 );
idDict dict = gameLocal.inspector.GetEntity()->spawnArgs;
dict.Set( "angle", va("%f", yaw + 180) );
dict.Set( "origin", org.ToString() );
react_scout = static_cast<hhAIInspector*>(gameLocal.SpawnEntityType(hhAIInspector::Type, &dict));
if( !react_scout ) {
gameLocal.Printf( "failed to spawn inspector monster..." );
return;
}
if( gameLocal.inspector != NULL ) {
gameLocal.inspector->PostEventMS( &EV_Remove, 0 );
}
gameLocal.inspector = react_scout;
gameLocal.inspector->CheckReactions( newReaction );
}
/*
=====================
hhAIInspector::Save
=====================
*/
void hhAIInspector::Save( idSaveGame *savefile ) const {
checkReaction.Save( savefile );
}
/*
=====================
hhAIInspector::Restore
=====================
*/
void hhAIInspector::Restore( idRestoreGame *savefile ) {
checkReaction.Restore( savefile );
}