#ifndef CDLL_INT_H
#define CDLL_INT_H
#ifdef _WIN32
#pragma once
#endif

#include "sdk/basetypes.h"
#include "sdk/interface.h"
#include "sdk/mathlib.h"
#include "sdk/const.h"
#include "sdk/checksum_crc.h"
#include "sdk/datamap.h"
#include "sdk/bitbuf.h"
#include "sdk/ButtonCode.h"
#include "sdk/modes.h"

#if !defined( _X360 )
#include "sdk/xboxstubs.h"
#endif

#include "sdk/jobthread.h" 
#include "sdk/VGUI.h"

#include "../GetVfunc.hpp"

struct SpatializationInfo_t;
class IClientEntity;

class ClientClass;
struct model_t;
class CSentence;
struct vrect_t;
struct cmodel_t;
class IMaterial;
class CAudioSource;
class CMeasureSection;
class SurfInfo;
class ISpatialQuery;
struct cache_user_t;
class IMaterialSystem;
class VMatrix;
struct ScreenFade_t;
struct ScreenShake_t;
class CViewSetup;
class CEngineSprite;
class CGlobalVarsBase;
class CPhysCollide;
class CSaveRestoreData;
class INetChannelInfo;
struct datamap_t;
struct typedescription_t;
class CStandardRecvProxies;
struct client_textmessage_t;
class IAchievementMgr;
class CGamestatsData;
class KeyValues;
class IFileList;
class CRenamedRecvTableInfo;
class CMouthInfo;
class IConVar;

struct player_info_t
{
public:
	char __pad0[0x8];
	union {
		long long xuid;
		struct {
			int xuidlow;
			int xuidhigh;
		};
	};
	char name[128];
	int userid;
	char guid[33];
	unsigned int friendsid;
	char friendsname[128];
	bool fakeplayer;
	bool ishltv;
	unsigned int customfiles[4];
	unsigned char filesdownloaded;
};

struct AudioState_t
{
	Vector m_Origin;
	QAngle m_Angles;
	bool m_bIsUnderwater;
};


enum SkyboxVisibility_t
{
	SKYBOX_NOT_VISIBLE = 0,
	SKYBOX_3DSKYBOX_VISIBLE,
	SKYBOX_2DSKYBOX_VISIBLE,
};

struct SkyBoxMaterials_t
{
	IMaterial* material[6];
};

enum ClientFrameStage_t
{
	FRAME_UNDEFINED = -1,			     
	FRAME_START,

	FRAME_NET_UPDATE_START,
	FRAME_NET_UPDATE_POSTDATAUPDATE_START,
	FRAME_NET_UPDATE_POSTDATAUPDATE_END,
	FRAME_NET_UPDATE_END,

	FRAME_RENDER_START,
	FRAME_RENDER_END
};

enum RenderViewInfo_t
{
	RENDERVIEW_UNSPECIFIED = 0,
	RENDERVIEW_DRAWVIEWMODEL = (1 << 0),
	RENDERVIEW_DRAWHUD = (1 << 1),
	RENDERVIEW_SUPPRESSMONITORRENDERING = (1 << 2),
};

DECLARE_POINTER_HANDLE(LightCacheHandle_t);


struct OcclusionParams_t
{
	float	m_flMaxOccludeeArea;
	float	m_flMinOccluderArea;
};


#define VENGINE_CLIENT_RANDOM_INTERFACE_VERSION	"VEngineRandom001"

#define VENGINE_CLIENT_INTERFACE_VERSION		"VEngineClient014"
#define VENGINE_CLIENT_INTERFACE_VERSION_13		"VEngineClient013"

abstract_class IVEngineClient013
{
public:
	virtual int					GetIntersectingSurfaces(
									const model_t * model,
									const Vector & vCenter,
									const float radius,
									const bool bOnlyVisibleSurfaces,	      
									SurfInfo * pInfos,
									const int nMaxInfos) = 0;

	virtual Vector				GetLightForPoint(const Vector& pos, bool bClamp) = 0;

	virtual IMaterial* TraceLineMaterialAndLighting(const Vector& start, const Vector& end,
									Vector& diffuseLightColor, Vector& baseColor) = 0;

	virtual const char* ParseFile(const char* data, char* token, int maxlen) = 0;
	virtual bool				CopyLocalFile(const char* source, const char* destination) = 0;

	virtual void				GetScreenSize(int& width, int& height) = 0;

	virtual void				ServerCmd(const char* szCmdString, bool bReliable = true) = 0;
	virtual void				ClientCmd(const char* szCmdString) = 0;

	virtual bool				GetPlayerInfo(int ent_num, player_info_t* pinfo) = 0;

	virtual int					GetPlayerForUserID(int userID) = 0;

	virtual client_textmessage_t* TextMessageGet(const char* pName) = 0;

	virtual bool				Con_IsVisible(void) = 0;

	virtual int					GetLocalPlayer(void) = 0;

	virtual const model_t* LoadModel(const char* pName, bool bProp = false) = 0;

	virtual float				GetLastTimeStamp(void) = 0;

	virtual CSentence* GetSentence(CAudioSource* pAudioSource) = 0;
	virtual float				GetSentenceLength(CAudioSource* pAudioSource) = 0;
	virtual bool				IsStreaming(CAudioSource* pAudioSource) const = 0;

	virtual void				GetViewAngles(Vector& va) = 0;
	virtual void				SetViewAngles(QAngle& va) = 0;

	virtual int					GetMaxClients(void) = 0;

	virtual	const char* Key_LookupBinding(const char* pBinding) = 0;

	virtual const char* Key_BindingForKey(ButtonCode_t code) = 0;

	virtual	void				Key_SetBinding(ButtonCode_t code, const char* pBinding) = 0; 

	virtual void				StartKeyTrapMode(void) = 0;
	virtual bool				CheckDoneKeyTrapping(ButtonCode_t& code) = 0;

	virtual bool				IsInGame(void) = 0;
	virtual bool				IsConnected(void) = 0;
	virtual bool				IsDrawingLoadingImage(void) = 0;

	virtual void				HideLoadingPlaque(void) = 0; 

	virtual void				Con_NPrintf(int pos, PRINTF_FORMAT_STRING const char* fmt, ...) = 0;
	virtual void				Con_NXPrintf(const struct con_nprint_s* info, PRINTF_FORMAT_STRING const char* fmt, ...) = 0;

	virtual int					IsBoxVisible(const Vector& mins, const Vector& maxs) = 0;

	virtual int					IsBoxInViewCluster(const Vector& mins, const Vector& maxs) = 0;

	virtual bool				CullBox(const Vector& mins, const Vector& maxs) = 0;

	virtual void				Sound_ExtraUpdate(void) = 0;

#if defined(_PS3)
	virtual void				Sound_ServerUpdateSoundsPS3(void) = 0; 
#endif

	virtual const char* GetGameDirectory(void) = 0;

	virtual const VMatrix& WorldToScreenMatrix() = 0;

	virtual const VMatrix& WorldToViewMatrix() = 0;

	virtual int					GameLumpVersion(int lumpId) const = 0;
	virtual int					GameLumpSize(int lumpId) const = 0;
	virtual bool				LoadGameLump(int lumpId, void* pBuffer, int size) = 0;

	virtual int					LevelLeafCount() const = 0;

	virtual ISpatialQuery* GetBSPTreeQuery() = 0;

	virtual void		LinearToGamma(float* linear, float* gamma) = 0;

	virtual float		LightStyleValue(int style) = 0;

	virtual void		ComputeDynamicLighting(const Vector& pt, const Vector* pNormal, Vector& color) = 0;

	virtual void		GetAmbientLightColor(Vector& color) = 0;

	virtual int			GetDXSupportLevel() = 0;

	virtual bool        SupportsHDR() = 0;

	virtual void		Mat_Stub(IMaterialSystem* pMatSys) = 0;

	virtual void GetChapterName(char* pchBuff, int iMaxLength) = 0;
	virtual char const* GetLevelName(void) = 0;
	virtual char const* GetLevelNameShort(void) = 0; 
	virtual char const* GetMapGroupName(void) = 0; 
#if !defined( NO_VOICE )
	virtual struct IVoiceTweak_s* GetVoiceTweakAPI(void) = 0;
	virtual void SetVoiceCasterID(uint32 casterID) = 0; 
#endif
	virtual void		EngineStats_BeginFrame(void) = 0;
	virtual void		EngineStats_EndFrame(void) = 0;

	virtual void		FireEvents() = 0;

	virtual int			GetLeavesArea(int* pLeaves, int nLeaves) = 0;

	virtual bool		DoesBoxTouchAreaFrustum(const Vector& mins, const Vector& maxs, int iArea) = 0;
	virtual int			GetFrustumList(Frustum_t** pList, int listMax) = 0; 
	virtual bool		ShouldUseAreaFrustum(int area) = 0; 

	virtual void		SetAudioState(const AudioState_t& state) = 0;

	virtual int			SentenceGroupPick(int groupIndex, char* name, int nameBufLen) = 0;
	virtual int			SentenceGroupPickSequential(int groupIndex, char* name, int nameBufLen, int sentenceIndex, int reset) = 0;
	virtual int			SentenceIndexFromName(const char* pSentenceName) = 0;
	virtual const char* SentenceNameFromIndex(int sentenceIndex) = 0;
	virtual int			SentenceGroupIndexFromName(const char* pGroupName) = 0;
	virtual const char* SentenceGroupNameFromIndex(int groupIndex) = 0;
	virtual float		SentenceLength(int sentenceIndex) = 0;

	virtual void		ComputeLighting(const Vector& pt, const Vector* pNormal, bool bClamp, Vector& color, Vector* pBoxColors = NULL) = 0;

	virtual void		ActivateOccluder(int nOccluderIndex, bool bActive) = 0;
	virtual bool		IsOccluded(const Vector& vecAbsMins, const Vector& vecAbsMaxs) = 0;
	virtual int			GetOcclusionViewId() const = 0; 

	virtual void* SaveAllocMemory(size_t num, size_t size) = 0;
	virtual void		SaveFreeMemory(void* pSaveMem) = 0;

	virtual INetChannelInfo* GetNetChannelInfo(void) = 0;
	//virtual INetChannel* GetNetChannelInfo(void) = 0;

	virtual void		DebugDrawPhysCollide(const CPhysCollide* pCollide, IMaterial* pMaterial, matrix3x4_t& transform, const color32& color) = 0;
	virtual void		CheckPoint(const char* pName) = 0;
	virtual void		DrawPortals() = 0;
	virtual bool		IsPlayingDemo(void) = 0;
	virtual bool		IsRecordingDemo(void) = 0;
	virtual bool		IsPlayingTimeDemo(void) = 0;
	virtual int			GetDemoRecordingTick(void) = 0;
	virtual int			GetDemoPlaybackTick(void) = 0;
	virtual int			GetDemoPlaybackStartTick(void) = 0;
	virtual float		GetDemoPlaybackTimeScale(void) = 0;
	virtual int			GetDemoPlaybackTotalTicks(void) = 0;
	virtual bool		IsPaused(void) = 0;
	virtual float GetTimescale(void) const = 0; 
	virtual bool		IsTakingScreenshot(void) = 0;
	virtual bool		IsHLTV(void) = 0;
	virtual bool		IsLevelMainMenuBackground(void) = 0;
	virtual void		GetMainMenuBackgroundName(char* dest, int destlen) = 0;

	virtual void		SetOcclusionParameters(const OcclusionParams_t& params) = 0;

	virtual void		GetUILanguage(char* dest, int destlen) = 0;

	virtual SkyboxVisibility_t IsSkyboxVisibleFromPoint(const Vector& vecPoint) = 0;

	virtual const char* GetMapEntitiesString() = 0;

	virtual bool		IsInEditMode(void) = 0;

	virtual float		GetScreenAspectRatio() = 0;

	virtual bool		REMOVED_SteamRefreshLogin(const char* password, bool isSecure) = 0;
	virtual bool		REMOVED_SteamProcessCall(bool& finished) = 0;

	virtual unsigned int	GetEngineBuildNumber() = 0;   
	virtual const char* GetProductVersionString() = 0;     

	virtual void			GrabPreColorCorrectedFrame(int x, int y, int width, int height) = 0;

	virtual bool			IsHammerRunning() const = 0;

	virtual void			ExecuteClientCmd(const char* szCmdString) = 0;

	virtual bool MapHasHDRLighting(void) = 0;
	virtual bool MapHasLightMapAlphaData(void) = 0; 

	virtual int	GetAppID() = 0;

	virtual Vector			GetLightForPointFast(const Vector& pos, bool bClamp) = 0;

	virtual void			ClientCmd_Unrestricted(const char* szCmdString, bool fromConsoleOrKeybind = false) = 0;
	virtual void			ClientCmd_Unrestricted(const char* szCmdString, bool fromConsoleOrKeybind, int nUserSlot, bool bCheckValidSlot = true) = 0; 
	 
	virtual void			SetRestrictServerCommands(bool bRestrict) = 0;

	virtual void			SetRestrictClientCommands(bool bRestrict) = 0;

	virtual void			SetOverlayBindProxy(int iOverlayID, void* pBindProxy) = 0;

	virtual bool			CopyFrameBufferToMaterial(const char* pMaterialName) = 0;

	virtual void			ChangeTeam(const char* pTeamName) = 0;

	virtual void			ReadConfiguration(const bool readDefault = false) = 0;

	virtual void SetAchievementMgr(IAchievementMgr* pAchievementMgr) = 0;
	virtual IAchievementMgr* GetAchievementMgr() = 0;

	virtual bool			MapLoadFailed(void) = 0;
	virtual void			SetMapLoadFailed(bool bState) = 0;

	virtual bool			IsLowViolence() = 0;
	virtual const char* GetMostRecentSaveGame(void) = 0;
	virtual void			SetMostRecentSaveGame(const char* lpszFilename) = 0;

	virtual void			StartXboxExitingProcess() = 0;
	virtual bool			IsSaveInProgress() = 0;
	virtual uint			OnStorageDeviceAttached(void) = 0;
	virtual void			OnStorageDeviceDetached(void) = 0;

	virtual void			ResetDemoInterpolation(void) = 0;

	virtual void SetGamestatsData(CGamestatsData* pGamestatsData) = 0;
	virtual CGamestatsData* GetGamestatsData() = 0;

#if defined( USE_SDL )
	virtual void GetMouseDelta(int& x, int& y, bool bIgnoreNextMouseDelta = false) = 0;
#endif

	virtual void ServerCmdKeyValues(KeyValues* pKeyValues) = 0;

	virtual bool IsSkippingPlayback(void) = 0;
	virtual bool IsLoadingDemo(void) = 0;

	virtual bool IsPlayingDemoALocallyRecordedDemo() = 0;

	virtual	const char* Key_LookupBindingExact(const char* pBinding) = 0;

	virtual void				AddPhonemeFile(const char* pszPhonemeFile) = 0;

};

abstract_class IVEngineClient : public IVEngineClient013
{
public:
	virtual uint GetProtocolVersion() = 0;
	virtual bool IsWindowedMode() = 0;

	virtual void	FlashWindow() = 0;

	virtual int GetClientVersion() const = 0;   

	virtual bool IsActiveApp() = 0;

	virtual void DisconnectInternal() = 0;

	virtual int GetInstancesRunningCount() = 0;
};


abstract_class IBaseClientDLL
{
public:
	virtual int				Connect(CreateInterfaceFn appSystemFactory, CGlobalVarsBase * pGlobals) = 0;
	virtual void            Disconnect() = 0;
	virtual int				Init(CreateInterfaceFn appSystemFactory, CGlobalVarsBase* pGlobals) = 0;
	virtual void			PostInit() = 0;
	virtual void			Shutdown(void) = 0;
	virtual void			LevelInitPreEntity(char const* pMapName) = 0;
	virtual void			LevelInitPostEntity() = 0;
	virtual void			LevelShutdown(void) = 0;
	virtual ClientClass* GetAllClasses(void) = 0;
	
	virtual int				HudVidInit(void) = 0;
	virtual void			HudProcessInput(bool bActive) = 0;
	virtual void			HudUpdate(bool bActive) = 0;
	virtual void			HudReset(void) = 0;
	virtual void			HudText(const char* message) = 0; 

	virtual bool			ShouldDrawDropdownConsole() = 0;
	virtual void			IN_ActivateMouse(void) = 0;
	virtual void			IN_DeactivateMouse(void) = 0;
	virtual void			IN_Accumulate(void) = 0;
	virtual void			IN_ClearStates(void) = 0;
	virtual bool			IN_IsKeyDown(const char* name, bool& isdown) = 0;
	virtual int				IN_KeyEvent(int eventcode, ButtonCode_t keynum, const char* pszCurrentBinding) = 0;

	virtual void			CreateMove(
								int sequence_number,			    
								float input_sample_frametime,	     
								bool active) = 0;				        

	virtual void			ExtraMouseSample(float frametime, bool active) = 0;
	virtual bool			WriteUsercmdDeltaToBuffer(int nSlot, bf_write* buf, int from, int to, bool isnewcommand) = 0;
	virtual void			EncodeUserCmdToBuffer(int nSlot, bf_write& buf, int slot) = 0;
	virtual void			DecodeUserCmdFromBuffer(int nSlot, bf_read& buf, int slot) = 0;
	virtual void			View_Render(vrect_t* rect) = 0;
	virtual void			RenderView(const CViewSetup& view, int nClearFlags, int whatToDraw) = 0;
	virtual void			View_Fade(ScreenFade_t* pSF) = 0;
	virtual void			SetCrosshairAngle(const QAngle& angle) = 0;
	virtual void			InitSprite(CEngineSprite* pSprite, const char* loadname) = 0;
	virtual void			ShutdownSprite(CEngineSprite* pSprite) = 0;
	virtual int				GetSpriteSize(void) const = 0;
	virtual void			VoiceStatus(int entindex, int iSsSlot, qboolean bTalking) = 0;
	virtual bool			PlayerAudible(int iPlayerIndex) = 0;
	virtual void			InstallStringTableCallback(char const* tableName) = 0;
	virtual void			FrameStageNotify(ClientFrameStage_t curStage) = 0; //37

	//virtual bool			DispatchUserMessage(int msg_type, int32 nFlags, int size, const void* msg) = 0;	   

	
	bool			DispatchUserMessage(int msg_type, int32 nFlags, int size, const void* msg)
	{
		typedef bool(__stdcall* DispatchUserMessageFn)(int, int32, int, const void*);
		//printf("DispatchUserMessageFn %x\n", this);
		return getvfunc<DispatchUserMessageFn>(this, 38)(msg_type, nFlags, size, msg);
	}
	

	virtual CSaveRestoreData* SaveInit(int size) = 0;
	virtual void			SaveWriteFields(CSaveRestoreData*, const char*, void*, datamap_t*, typedescription_t*, int) = 0;
	virtual void			SaveReadFields(CSaveRestoreData*, const char*, void*, datamap_t*, typedescription_t*, int) = 0;
	virtual void			PreSave(CSaveRestoreData*) = 0;
	virtual void			Save(CSaveRestoreData*) = 0;
	virtual void			WriteSaveHeaders(CSaveRestoreData*) = 0;
	virtual void			ReadRestoreHeaders(CSaveRestoreData*) = 0;
	virtual void			Restore(CSaveRestoreData*, bool) = 0;
	virtual void			DispatchOnRestore() = 0;

	virtual CStandardRecvProxies* GetStandardRecvProxies() = 0;

	virtual void			WriteSaveGameScreenshot(const char* pFilename) = 0;

	virtual void			EmitSentenceCloseCaption(char const* tokenstream) = 0;
	virtual void			EmitCloseCaption(char const* captionname, float duration) = 0;

	virtual bool			CanRecordDemo(char* errorMsg, int length) const = 0;

	virtual void			OnDemoRecordStart(char const* pDemoBaseName) = 0;
	virtual void			OnDemoRecordStop() = 0;
	virtual void			OnDemoPlaybackStart(char const* pDemoBaseName) = 0;
	virtual void			OnDemoPlaybackRestart() = 0;
	virtual void			OnDemoPlaybackStop() = 0;
	virtual void			SetDemoPlaybackHighlightXuid(uint64 xuid, bool bLowlights) = 0;
	virtual void			ShowHighlightSkippingMessage(bool bState, int nCurrentTick = 0, int nTickStart = 0, int nTickStop = 0) = 0;

	virtual void			RecordDemoPolishUserInput(int nCmdIndex) = 0;

	virtual bool			CacheReplayRagdolls(const char* pFilename, int nStartTick) = 0;

	virtual void			ReplayUI_SendMessage(KeyValues* pMsg) = 0;

	virtual void* GetReplayFactory() = 0;

	virtual void			ClearLocalPlayerReplayPtr() = 0;

	virtual void unk();

	virtual int				GetScreenWidth() = 0;
	virtual int				GetScreenHeight() = 0;

	virtual void			WriteSaveGameScreenshotOfSize(const char* pFilename, int width, int height, bool bCreatePowerOf2Padded = false, bool bWriteVTF = false) = 0;

	virtual void			WriteReplayScreenshot(void* params) = 0;

	virtual void			UpdateReplayScreenshotCache() = 0;
	  
	virtual bool			GetPlayerView(CViewSetup& playerView) = 0;

	virtual bool			ShouldHideLoadingPlaque(void) = 0;

	virtual void			InvalidateMdlCache() = 0;

	virtual void			IN_SetSampleTime(float frametime) = 0;

	virtual void			OnActiveSplitscreenPlayerChanged(int nNewSlot) = 0;
	virtual void			OnSplitScreenStateChanged() = 0;

	virtual int				GetSpectatorTarget(void* pObserverMode) = 0;

	virtual void			CenterStringOff() = 0;

	virtual void			OnScreenSizeChanged(int nOldWidth, int nOldHeight) = 0;

	virtual void* InstantiateMaterialProxy(const char* proxyName) = 0;

	virtual vgui::VPANEL	GetFullscreenClientDLLVPanel(void) = 0;

	virtual void			MarkEntitiesAsTouching(IClientEntity* e1, IClientEntity* e2) = 0;

	virtual void			OnKeyBindingChanged(ButtonCode_t buttonCode, char const* pchKeyName, char const* pchNewBinding) = 0;

	virtual void			SetBlurFade(float scale) = 0;

	virtual void			ResetHudCloseCaption() = 0;

	virtual bool			HandleGameUIEvent(const InputEvent_t& event) = 0;

	virtual bool			GetSoundSpatialization(SpatializationInfo_t& info) = 0;

	virtual void			Hud_SaveStarted() = 0;

	virtual void			ShutdownMovies() = 0;

	virtual void			GetStatus(char* buffer, int bufsize) = 0;

#if defined ( CSTRIKE15 )
	virtual bool			IsChatRaised(void) = 0;
	virtual bool			IsRadioPanelRaised(void) = 0;
	virtual bool			IsBindMenuRaised(void) = 0;
	virtual bool			IsTeamMenuRaised(void) = 0;
	virtual bool			IsLoadingScreenRaised(void) = 0;

#endif

#if defined(_PS3)
	virtual int				GetDrawFlags(void) = 0;
	virtual int				GetBuildViewID(void) = 0;
	virtual bool			IsSPUBuildWRJobsOn(void) = 0;
	virtual void			CacheFrustumData(Frustum_t* pFrustum, Frustum_t* pAreaFrustum, void* pRenderAreaBits, int numArea, bool bViewerInSolidSpace) = 0;
	virtual void* GetBuildViewVolumeCuller(void) = 0;
	virtual Frustum_t* GetBuildViewFrustum(void) = 0;
	virtual Frustum_t* GetBuildViewAreaFrustum(void) = 0;
	virtual unsigned char* GetBuildViewRenderAreaBits(void) = 0;
#else
	virtual bool			IsBuildWRThreaded(void) = 0;
	virtual void			QueueBuildWorldListJob(CJob* pJob) = 0;
	virtual void			CacheFrustumData(const Frustum_t& frustum, const CUtlVector< Frustum_t, CUtlMemoryAligned< Frustum_t,16 > >& aeraFrustums) = 0;
	virtual const Frustum_t* GetBuildViewFrustum(void) const = 0;
	virtual const CUtlVector< Frustum_t, CUtlMemoryAligned< Frustum_t,16 > >* GetBuildViewAeraFrustums(void) const = 0;
#endif

	virtual bool IsSubscribedMap(const char* pchMapName, bool bOnlyOnDisk) = 0;
	virtual bool IsFeaturedMap(const char* pchMapName, bool bOnlyOnDisk) = 0;

	virtual void DownloadCommunityMapFile(int id) = 0;

	virtual float GetUGCFileDownloadProgress(int id) = 0;

	virtual void RecordUIEvent(const char* szEvent) = 0;

	virtual float FindInventoryItemWithMaxAttributeValue(char const* szItemType, char const* szAttrClass) = 0;

	virtual void DetermineSubscriptionKvToAdvertise(KeyValues* kvLocalPlayer) = 0;

	virtual bool ValidateSignedEvidenceHeader(char const* szKey, void const* pvHeader, void* pPlaybackParameters) = 0;
	virtual void PrepareSignedEvidenceData(void* pvData, int numBytes, int const* pPlaybackParameters) = 0;
	virtual bool ShouldSkipEvidencePlayback(int const* pPlaybackParameters) = 0;

	virtual void* GetScaleformSlotInitController() = 0;

	virtual bool IsConnectedUserInfoChangeAllowed(IConVar* pCvar) = 0;

	virtual char const* GetRichPresenceStatusString() = 0;

	virtual bool			CanStopRecordDemo(char* errorMsg, int length) const = 0;

	virtual void OnHltvReplay(const int& msg) = 0;
	virtual void OnHltvReplayTick() = 0;
	virtual int GetHltvReplayDelay() = 0;

	virtual void OnDemoPlaybackTimeJump() = 0;
	virtual void OnCommandDuringPlayback(char const* cmd) = 0;

	virtual void RetireAllPlayerDecals(bool bRenderContextValid) = 0;
	virtual void EngineGotvSyncPacket(const void* pPkt) = 0;        
	virtual int GetInEyeEntity() const = 0;
	virtual void OnTickPre(int tickcount) = 0;
};

#define CLIENT_DLL_INTERFACE_VERSION		"VClient018"

abstract_class IClientDLLSharedAppSystems
{
public:
	virtual int	Count() = 0;
	virtual char const* GetDllName(int idx) = 0;
	virtual char const* GetInterfaceName(int idx) = 0;
};

#define CLIENT_DLL_SHARED_APPSYSTEMS		"VClientDllSharedAppSystems001"

#endif  
