mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-10-21 11:02:58 -04:00
Added serverGame library
This commit is contained in:
@@ -0,0 +1,248 @@
|
||||
// ======================================================================
|
||||
//
|
||||
// AiMovementPathFlee.cpp
|
||||
// copyright (c) 2001 Sony Online Entertainment
|
||||
//
|
||||
// ======================================================================
|
||||
|
||||
#include "serverGame/FirstServerGame.h"
|
||||
#include "serverGame/AiMovementFlee.h"
|
||||
|
||||
#include "serverGame/AiMovementArchive.h"
|
||||
#include "serverGame/AiCreatureController.h"
|
||||
#include "serverGame/CreatureObject.h"
|
||||
#include "serverScript/ScriptFunctionTable.h"
|
||||
#include "sharedDebug/Profiler.h"
|
||||
#include "sharedFoundation/FormattedString.h"
|
||||
#include "sharedObject/CellProperty.h"
|
||||
|
||||
using namespace Scripting;
|
||||
|
||||
// ======================================================================
|
||||
|
||||
AiMovementFlee::AiMovementFlee( AICreatureController * controller )
|
||||
: AiMovementWaypoint(controller),
|
||||
m_fleeFrom(),
|
||||
m_fleeTo(),
|
||||
m_minDistance(0.0f),
|
||||
m_maxDistance(0.0f)
|
||||
{
|
||||
}
|
||||
|
||||
AiMovementFlee::AiMovementFlee( AICreatureController * controller, ServerObject const * target, float minDistance, float maxDistance )
|
||||
: AiMovementWaypoint(controller),
|
||||
m_fleeFrom(target),
|
||||
m_fleeTo(),
|
||||
m_minDistance(minDistance),
|
||||
m_maxDistance(maxDistance)
|
||||
{
|
||||
}
|
||||
|
||||
AiMovementFlee::AiMovementFlee( AICreatureController * controller, Archive::ReadIterator & source )
|
||||
: AiMovementWaypoint(controller, source),
|
||||
m_fleeFrom(source),
|
||||
m_fleeTo(source),
|
||||
m_minDistance(0.0f),
|
||||
m_maxDistance(0.0f)
|
||||
{
|
||||
Archive::get(source, m_minDistance);
|
||||
Archive::get(source, m_maxDistance);
|
||||
|
||||
SETUP_SYNCRONIZED_STATE( AiMovementFlee::stateWaiting );
|
||||
SETUP_SYNCRONIZED_STATE( AiMovementFlee::stateThinking );
|
||||
SETUP_SYNCRONIZED_STATE( AiMovementFlee::stateMoving );
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
AiMovementFlee::~AiMovementFlee()
|
||||
{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void AiMovementFlee::pack( Archive::ByteStream & target ) const
|
||||
{
|
||||
AiMovementWaypoint::pack(target);
|
||||
m_fleeFrom.pack(target);
|
||||
m_fleeTo.pack(target);
|
||||
Archive::put(target, m_minDistance);
|
||||
Archive::put(target, m_maxDistance);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void AiMovementFlee::alter ( float time )
|
||||
{
|
||||
PROFILER_AUTO_BLOCK_DEFINE("AiMovementFlee::alter");
|
||||
|
||||
AiMovementWaypoint::alter(time);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
void AiMovementFlee::getDebugInfo ( std::string & outString ) const
|
||||
{
|
||||
AiMovementWaypoint::getDebugInfo(outString);
|
||||
|
||||
Vector const & flee_w = m_fleeFrom.getPosition_w();
|
||||
outString += FormattedString<1024>().sprintf("AiMovementFlee: fleeingFrom(%d) offset(%.2f, %.2f, %.2f) distance[%.2f...%.2f]", m_fleeFrom.getObjectId().getHashValue(), flee_w.x, flee_w.y, flee_w.z, m_minDistance, m_maxDistance);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
AiStateResult AiMovementFlee::stateWaiting ( float time )
|
||||
{
|
||||
UNREF(time);
|
||||
|
||||
if(!m_fleeFrom.isValid())
|
||||
return triggerTargetLost();
|
||||
|
||||
return triggerThinking();
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
AiStateResult AiMovementFlee::stateThinking ( float time )
|
||||
{
|
||||
UNREF(time);
|
||||
|
||||
if(!m_fleeFrom.isValid())
|
||||
return triggerTargetLost();
|
||||
|
||||
if(generateWaypoint())
|
||||
return triggerMoving();
|
||||
|
||||
return ASR_Done;
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
AiStateResult AiMovementFlee::stateMoving ( float time )
|
||||
{
|
||||
if(m_controller->getStuckCounter() > 5)
|
||||
return triggerThinking();
|
||||
|
||||
return AiMovementWaypoint::stateMoving(time);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
AiStateResult AiMovementFlee::triggerThinking ( void )
|
||||
{
|
||||
CHANGE_STATE( AiMovementFlee::stateThinking );
|
||||
|
||||
return ASR_Continue;
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
AiStateResult AiMovementFlee::triggerWaypoint ( void )
|
||||
{
|
||||
m_controller->triggerScriptsWithTarget(TRIG_FLEE_WAYPOINT,m_fleeFrom.getObjectId());
|
||||
|
||||
AiMovementWaypoint::triggerWaypoint();
|
||||
|
||||
return ASR_Continue;
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
AiStateResult AiMovementFlee::triggerTargetLost ( void )
|
||||
{
|
||||
m_controller->triggerScriptsWithTarget(TRIG_FLEE_TARGET_LOST,m_fleeFrom.getObjectId());
|
||||
|
||||
AiMovementWaypoint::triggerTargetLost();
|
||||
|
||||
endBehavior();
|
||||
|
||||
return ASR_Done;
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
AiStateResult AiMovementFlee::triggerPathNotFound ( void )
|
||||
{
|
||||
m_controller->triggerScriptsWithTarget(TRIG_FLEE_PATH_NOT_FOUND,m_fleeFrom.getObjectId());
|
||||
|
||||
endBehavior();
|
||||
|
||||
return ASR_Done;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
bool AiMovementFlee::hasWaypoint ( void ) const
|
||||
{
|
||||
return m_fleeTo.isValid();
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
AiLocation const & AiMovementFlee::getWaypoint ( void ) const
|
||||
{
|
||||
return m_fleeTo;
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
bool AiMovementFlee::updateWaypoint ( void )
|
||||
{
|
||||
m_fleeFrom.update();
|
||||
m_fleeTo.update();
|
||||
|
||||
if(m_fleeFrom.hasChanged())
|
||||
{
|
||||
generateWaypoint();
|
||||
|
||||
m_fleeFrom.setChanged(false);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ----------
|
||||
|
||||
bool AiMovementFlee::generateWaypoint ( void )
|
||||
{
|
||||
Vector current = m_controller->getCreaturePosition_w();
|
||||
Vector start = m_fleeFrom.getPosition_w();
|
||||
|
||||
Vector delta = current - start;
|
||||
delta.x += Random::randomReal(0.0f,0.1f);
|
||||
delta.y = 0;
|
||||
delta.z += Random::randomReal(0.0f,0.1f);
|
||||
delta.normalize();
|
||||
|
||||
float fleeDistance = Random::randomReal(m_minDistance, m_maxDistance);
|
||||
delta *= fleeDistance;
|
||||
|
||||
Vector fleePoint = current + delta;
|
||||
|
||||
m_fleeTo = AiLocation(CellProperty::getWorldCellProperty(),fleePoint);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
bool AiMovementFlee::getDecelerate ( void ) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
AiMovementType AiMovementFlee::getType() const
|
||||
{
|
||||
return AMT_flee;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
AiMovementFlee * AiMovementFlee::asAiMovementFlee()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
Reference in New Issue
Block a user