//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef ICLIENTNETWORKABLE_H #define ICLIENTNETWORKABLE_H #ifdef _WIN32 #pragma once #endif #include "iclientunknown.h" #include "tier1/bitbuf.h" class IClientEntity; class ClientClass; enum ShouldTransmitState_t { SHOULDTRANSMIT_START=0, // The entity is starting to be transmitted (maybe it entered the PVS). SHOULDTRANSMIT_END // Called when the entity isn't being transmitted by the server. // This signals a good time to hide the entity until next time // the server wants to transmit its state. }; // NOTE: All of these are commented out; NotifyShouldTransmit actually // has all these in them. Left it as an enum in case we want to go back though enum DataUpdateType_t { DATA_UPDATE_CREATED = 0, // indicates it was created +and+ entered the pvs // DATA_UPDATE_ENTERED_PVS, DATA_UPDATE_DATATABLE_CHANGED, // DATA_UPDATE_LEFT_PVS, // DATA_UPDATE_DESTROYED, // FIXME: Could enable this, but it's a little worrying // since it changes a bunch of existing code }; abstract_class IClientNetworkable { public: // Gets at the containing class... virtual IClientUnknown* GetIClientUnknown() = 0; // Called by the engine when the server deletes the entity. virtual void Release() = 0; // Supplied automatically by the IMPLEMENT_CLIENTCLASS macros. virtual ClientClass* GetClientClass() = 0; // This tells the entity what the server says for ShouldTransmit on this entity. // Note: This used to be EntityEnteredPVS/EntityRemainedInPVS/EntityLeftPVS. virtual void NotifyShouldTransmit( ShouldTransmitState_t state ) = 0; // // NOTE FOR ENTITY WRITERS: // // In 90% of the cases, you should hook OnPreDataChanged/OnDataChanged instead of // PreDataUpdate/PostDataUpdate. // // The DataChanged events are only called once per frame whereas Pre/PostDataUpdate // are called once per packet (and sometimes multiple times per frame). // // OnDataChanged is called during simulation where entity origins are correct and // attachments can be used. whereas PostDataUpdate is called while parsing packets // so attachments and other entity origins may not be valid yet. // virtual void OnPreDataChanged( DataUpdateType_t updateType ) = 0; virtual void OnDataChanged( DataUpdateType_t updateType ) = 0; // Called when data is being updated across the network. // Only low-level entities should need to know about these. virtual void PreDataUpdate( DataUpdateType_t updateType ) = 0; virtual void PostDataUpdate( DataUpdateType_t updateType ) = 0; // Objects become dormant on the client if they leave the PVS on the server. virtual bool IsDormant( void ) = 0; // Ent Index is the server handle used to reference this entity. // If the index is < 0, that indicates the entity is not known to the server virtual int entindex( void ) const = 0; // Server to client entity message received virtual void ReceiveMessage( int classID, bf_read &msg ) = 0; // Get the base pointer to the networked data that GetClientClass->m_pRecvTable starts at. // (This is usually just the "this" pointer). virtual void* GetDataTableBasePtr() = 0; // Tells the entity that it's about to be destroyed due to the client receiving // an uncompressed update that's caused it to destroy all entities & recreate them. virtual void SetDestroyedOnRecreateEntities( void ) = 0; virtual void OnDataUnchangedInPVS() = 0; }; #endif // ICLIENTNETWORKABLE_H