106 lines
3.8 KiB
C++
106 lines
3.8 KiB
C++
//========= 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
|