Counter Strike : Global Offensive Source Code
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.
|
|
//========= Copyright � 1996-2005, 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
|