source-engine/game/server/NextBot/NextBotComponentInterface.h

99 lines
2.6 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
// 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_