You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.6 KiB
98 lines
2.6 KiB
// 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_
|
|
|