99 lines
2.6 KiB
C++
99 lines
2.6 KiB
C++
// NextBotComponentInterface.h
|
|
// Interface for all components
|
|
// Author: Michael Booth, May 2006
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
|
|
#ifndef _NEXT_BOT_COMPONENT_INTERFACE_H_
|
|
#define _NEXT_BOT_COMPONENT_INTERFACE_H_
|
|
|
|
#include "NextBotEventResponderInterface.h"
|
|
|
|
class INextBot;
|
|
class Path;
|
|
class CGameTrace;
|
|
class CTakeDamageInfo;
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------------------------------
|
|
/**
|
|
* Various processes can invoke a "reply" (ie: callback) via instances of this interface
|
|
*/
|
|
class INextBotReply
|
|
{
|
|
public:
|
|
virtual void OnSuccess( INextBot *bot ) { } // invoked when process completed successfully
|
|
|
|
enum FailureReason
|
|
{
|
|
DENIED,
|
|
INTERRUPTED,
|
|
FAILED
|
|
};
|
|
virtual void OnFail( INextBot *bot, FailureReason reason ) { } // invoked when process failed
|
|
};
|
|
|
|
|
|
//--------------------------------------------------------------------------------------------------------------------------
|
|
/**
|
|
* Next Bot component interface
|
|
*/
|
|
class INextBotComponent : public INextBotEventResponder
|
|
{
|
|
public:
|
|
INextBotComponent( INextBot *bot );
|
|
virtual ~INextBotComponent() { }
|
|
|
|
virtual void Reset( void ) { m_lastUpdateTime = 0; m_curInterval = TICK_INTERVAL; } // reset to initial state
|
|
virtual void Update( void ) = 0; // update internal state
|
|
virtual void Upkeep( void ) { } // lightweight update guaranteed to occur every server tick
|
|
|
|
inline bool ComputeUpdateInterval(); // return false is no time has elapsed (interval is zero)
|
|
inline float GetUpdateInterval();
|
|
|
|
virtual INextBot *GetBot( void ) const { return m_bot; }
|
|
|
|
private:
|
|
float m_lastUpdateTime;
|
|
float m_curInterval;
|
|
|
|
friend class INextBot;
|
|
|
|
INextBot *m_bot;
|
|
INextBotComponent *m_nextComponent; // simple linked list of components in the bot
|
|
};
|
|
|
|
|
|
inline bool INextBotComponent::ComputeUpdateInterval()
|
|
{
|
|
if ( m_lastUpdateTime )
|
|
{
|
|
float interval = gpGlobals->curtime - m_lastUpdateTime;
|
|
|
|
const float minInterval = 0.0001f;
|
|
if ( interval > minInterval )
|
|
{
|
|
m_curInterval = interval;
|
|
m_lastUpdateTime = gpGlobals->curtime;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// First update - assume a reasonable interval.
|
|
// We need the very first update to do work, for cases
|
|
// where the bot was just created and we need to propagate
|
|
// an event to it immediately.
|
|
m_curInterval = 0.033f;
|
|
m_lastUpdateTime = gpGlobals->curtime - m_curInterval;
|
|
|
|
return true;
|
|
}
|
|
|
|
inline float INextBotComponent::GetUpdateInterval()
|
|
{
|
|
return m_curInterval;
|
|
}
|
|
|
|
#endif // _NEXT_BOT_COMPONENT_INTERFACE_H_
|