mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-12 11:49:09 +00:00
1
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//=============================================================================//
|
||||
|
||||
#ifndef CLIENT_THINKLIST_H
|
||||
#define CLIENT_THINKLIST_H
|
||||
#ifdef _WIN32
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
|
||||
#include "igamesystem.h"
|
||||
#include "utllinkedlist.h"
|
||||
#include "cliententitylist.h"
|
||||
#include "iclientthinkable.h"
|
||||
#include "utlrbtree.h"
|
||||
|
||||
|
||||
#define CLIENT_THINK_ALWAYS -1293
|
||||
#define CLIENT_THINK_NEVER -1
|
||||
|
||||
|
||||
#define INVALID_THINK_HANDLE ClientThinkList()->GetInvalidThinkHandle()
|
||||
|
||||
|
||||
class CClientThinkList : public IGameSystemPerFrame
|
||||
{
|
||||
public:
|
||||
|
||||
CClientThinkList();
|
||||
virtual ~CClientThinkList();
|
||||
|
||||
virtual char const *Name() { return "CClientThinkList"; }
|
||||
virtual bool IsPerFrame() { return true; }
|
||||
|
||||
// Set the next time at which you want to think. You can also use
|
||||
// one of the CLIENT_THINK_ defines.
|
||||
void SetNextClientThink( ClientEntityHandle_t hEnt, float nextTime );
|
||||
|
||||
// Remove an entity from the think list.
|
||||
void RemoveThinkable( ClientEntityHandle_t hEnt );
|
||||
|
||||
// Use to initialize your think handles in IClientThinkables.
|
||||
ClientThinkHandle_t GetInvalidThinkHandle();
|
||||
|
||||
// This is called after network updating and before rendering.
|
||||
void PerformThinkFunctions();
|
||||
|
||||
// Call this to destroy a thinkable object - deletes the object post think.
|
||||
void AddToDeleteList( ClientEntityHandle_t hEnt );
|
||||
void RemoveFromDeleteList( ClientEntityHandle_t hEnt );
|
||||
|
||||
// IClientSystem implementation.
|
||||
public:
|
||||
|
||||
virtual bool Init();
|
||||
virtual void PostInit() {};
|
||||
virtual void Shutdown();
|
||||
virtual void LevelInitPreEntity();
|
||||
virtual void LevelInitPostEntity() {}
|
||||
virtual void LevelShutdownPreEntity();
|
||||
virtual void LevelShutdownPostEntity();
|
||||
virtual void PreRender();
|
||||
virtual void PostRender() { }
|
||||
virtual void Update( float frametime );
|
||||
virtual void OnSave() {}
|
||||
virtual void OnRestore() {}
|
||||
virtual void SafeRemoveIfDesired() {}
|
||||
|
||||
private:
|
||||
struct ThinkEntry_t
|
||||
{
|
||||
ClientEntityHandle_t m_hEnt;
|
||||
float m_flNextClientThink;
|
||||
float m_flLastClientThink;
|
||||
int m_nIterEnum;
|
||||
};
|
||||
|
||||
struct ThinkListChanges_t
|
||||
{
|
||||
ClientEntityHandle_t m_hEnt;
|
||||
ClientThinkHandle_t m_hThink;
|
||||
float m_flNextTime;
|
||||
};
|
||||
|
||||
// Internal stuff.
|
||||
private:
|
||||
void SetNextClientThink( ClientThinkHandle_t hThink, float nextTime );
|
||||
void RemoveThinkable( ClientThinkHandle_t hThink );
|
||||
void PerformThinkFunction( ThinkEntry_t *pEntry, float curtime );
|
||||
ThinkEntry_t* GetThinkEntry( ClientThinkHandle_t hThink );
|
||||
void CleanUpDeleteList();
|
||||
|
||||
// Add entity to frame think list
|
||||
void AddEntityToFrameThinkList( ThinkEntry_t *pEntry, bool bAlwaysChain, int &nCount, ThinkEntry_t **ppFrameThinkList );
|
||||
|
||||
private:
|
||||
CUtlLinkedList<ThinkEntry_t, unsigned short> m_ThinkEntries;
|
||||
|
||||
CUtlVector<ClientEntityHandle_t> m_aDeleteList;
|
||||
CUtlVector<ThinkListChanges_t> m_aChangeList;
|
||||
|
||||
// Makes sure the entries are thinked once per frame in the face of hierarchy
|
||||
int m_nIterEnum;
|
||||
bool m_bInThinkLoop;
|
||||
};
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
// Inlines.
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
inline ClientThinkHandle_t CClientThinkList::GetInvalidThinkHandle()
|
||||
{
|
||||
return (ClientThinkHandle_t)(uintp)m_ThinkEntries.InvalidIndex();
|
||||
}
|
||||
|
||||
|
||||
inline CClientThinkList::ThinkEntry_t* CClientThinkList::GetThinkEntry( ClientThinkHandle_t hThink )
|
||||
{
|
||||
return &m_ThinkEntries[ (unsigned long)hThink ];
|
||||
}
|
||||
|
||||
|
||||
inline CClientThinkList* ClientThinkList()
|
||||
{
|
||||
extern CClientThinkList g_ClientThinkList;
|
||||
return &g_ClientThinkList;
|
||||
}
|
||||
|
||||
|
||||
#endif // CLIENT_THINKLIST_H
|
||||
Reference in New Issue
Block a user