ef2-sdk/dlls/game/FollowPathToEntity.cpp

134 lines
4.1 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /EF2/Code/DLLs/game/FollowPathToEntity.cpp $
// $Revision:: 12 $
// $Author:: Singlis $
// $Date:: 9/26/03 2:36p $
//
// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
//
//
// DESCRIPTION:
// Specialization of FollowPath used to follow moving entities
//
#include "_pch_cpp.h"
#include "actor.h"
#include "FollowPathToEntity.h"
//------------------------- CLASS ------------------------------
//
// Name: FollowPathToEntity
// Base Class: FollowPath
//
// Description: FollowPathToEntity is a specialization of
// FollowPath used when the Actor must move to a moving Entity
//
// Method of Use: Behaviors Aggregate FollowPath classes to
// handle long term motion to a goal
//
//--------------------------------------------------------------
CLASS_DECLARATION( FollowPath, FollowPathToEntity, NULL )
{
{ NULL, NULL }
};
//----------------------------------------------------------------
// Name: FollowPathToEntity
// Class: FollowPathToEntity
//
// Description: default constructor
//
// Parameters: None
//
// Returns: None
//----------------------------------------------------------------
FollowPathToEntity::FollowPathToEntity():
_targetEntity(NULL),
_oldGoalPosition(0,0,0)
{
}
//----------------------------------------------------------------
// Name: SetGoal
// Class: FollowPathToEntity
//
// Description: sets goal entity and creates a path to it
//
// Parameters:
// Entity entity - goal entity
// float radius - how close actor needs to get to goal
// Actor self - the Actor trying to get to the goal
//
// Returns: None
//----------------------------------------------------------------
void FollowPathToEntity::SetGoal(Entity *entity, const float radius, Actor &self)
{
SetRadius(radius);
if (
( _targetEntity == NULL ) ||
( _targetEntity->entnum != entity->entnum)
)
{
_targetEntity = entity;
_oldGoalPosition = GetGoalPosition();
GetPath().SetPath(self, self.origin, GetGoalPosition());
}
}
//----------------------------------------------------------------
// Name: ClearTraceToGoal
// Class: FollowPathToEntity
//
// Description: test to determine if Actor can move directly
// to the goal
//
// Parameters:
// Actor self - the Actor trying to get to the goal
// trace_t trace - trace that travels from the
// Actor to the goal
//
// Returns: bool that is true if the trace reaches the goal
//----------------------------------------------------------------
const bool FollowPathToEntity::ClearTraceToGoal( Actor &self, const trace_t &traceToGoal, const float radius ) const
{
assert (_targetEntity != NULL);
// Path is only obstructed by the goal object itself
bool traceHitGoal = (
(_targetEntity->entnum == traceToGoal.entityNum) &&
(traceToGoal.entityNum != ENTITYNUM_NONE)
);
return ( FollowPath::ClearTraceToGoal( self, traceToGoal, radius ) || (!traceToGoal.startsolid && traceHitGoal ) );
}
//----------------------------------------------------------------
// Name: Evaluate
// Class: FollowPathToEntity
//
// Description: attempts to move the Actor to the goal position
//
// Parameters:
// Actor self - the actor following the path
//
// Returns: Steering::ReturnValue returns reason for failure
//----------------------------------------------------------------
const Steering::ReturnValue FollowPathToEntity::Evaluate( Actor &self)
{
if (Vector::Distance( _oldGoalPosition, GetGoalPosition()) > GetAvoidanceDistance() )
{
_oldGoalPosition = GetGoalPosition();
GetPath().SetPath(self, self.origin, GetGoalPosition() );
}
return FollowPath::Evaluate( self);
}