diff --git a/r5dev/client/cdll_engine_int.h b/r5dev/client/cdll_engine_int.h index f09e9ce0..33a604ba 100644 --- a/r5dev/client/cdll_engine_int.h +++ b/r5dev/client/cdll_engine_int.h @@ -1,7 +1,8 @@ #pragma once #ifndef DEDICATED // We should think about not including this file at all in dedicated tbh. #include "public/include/client_class.h" -#endif +#include "public/include/icliententitylist.h" +#endif // !DEDICATED enum class ClientFrameStage_t : int { @@ -63,6 +64,9 @@ inline bool* cl_time_use_host_tickcount = nullptr; inline CHLClient* gHLClient = nullptr; inline CHLClient* g_pHLClient = nullptr; +#ifndef DEDICATED +inline IClientEntityList* g_pClientEntityList = nullptr; +#endif // !DEDICATED /////////////////////////////////////////////////////////////////////////////// void CHLClient_Attach(); diff --git a/r5dev/client/vengineclient_impl.cpp b/r5dev/client/vengineclient_impl.cpp index 5f452f30..8e20668b 100644 --- a/r5dev/client/vengineclient_impl.cpp +++ b/r5dev/client/vengineclient_impl.cpp @@ -55,9 +55,14 @@ bool CEngineClient::GetRestrictClientCommands() const //--------------------------------------------------------------------------------- // Purpose: get local player // Input : -// Output : void* (C_Player) +// Output : int //--------------------------------------------------------------------------------- -void* CEngineClient::GetLocalPlayer() const +int CEngineClient::GetLocalPlayer() { - return CEngineClient_GetLocalPlayer(); +#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1) + const int index = 35; +#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3) + const int index = 36; +#endif + return CallVFunc<int>(index, this); } \ No newline at end of file diff --git a/r5dev/client/vengineclient_impl.h b/r5dev/client/vengineclient_impl.h index a8b70e1d..7142b403 100644 --- a/r5dev/client/vengineclient_impl.h +++ b/r5dev/client/vengineclient_impl.h @@ -7,7 +7,7 @@ public: bool GetRestrictServerCommands() const; void SetRestrictClientCommands(bool bRestrict); bool GetRestrictClientCommands() const; - void* GetLocalPlayer() const; // Is actually C_Player. + int GetLocalPlayer(); // Local player index. }; /* ==== CVENGINECLIENT ================================================================================================================================================== */ @@ -30,6 +30,7 @@ class HVEngineClient : public IDetour virtual void GetAdr(void) const { spdlog::debug("| FUN: IVEngineClient::CommandExecute : {:#18x} |\n", p_CEngineClient_CommandExecute.GetPtr()); + spdlog::debug("| FUN: IVEngineClient::GetLocalPlayer : {:#18x} |\n", p_CEngineClient_GetLocalPlayer.GetPtr()); spdlog::debug("| VAR: m_bRestrictServerCommands : {:#18x} |\n", reinterpret_cast<uintptr_t>(m_bRestrictServerCommands)); spdlog::debug("| VAR: m_bRestrictClientCommands : {:#18x} |\n", reinterpret_cast<uintptr_t>(m_bRestrictClientCommands)); spdlog::debug("| CON: g_ppEngineClient : {:#18x} |\n", reinterpret_cast<uintptr_t>(g_ppEngineClient)); diff --git a/r5dev/game/client/animationlayer.h b/r5dev/game/client/animationlayer.h new file mode 100644 index 00000000..e69de29b diff --git a/r5dev/game/client/c_baseanimating.h b/r5dev/game/client/c_baseanimating.h new file mode 100644 index 00000000..e69de29b diff --git a/r5dev/game/client/c_basecharacter.h b/r5dev/game/client/c_basecharacter.h new file mode 100644 index 00000000..e69de29b diff --git a/r5dev/game/client/c_baseentity.cpp b/r5dev/game/client/c_baseentity.cpp new file mode 100644 index 00000000..8e55b350 --- /dev/null +++ b/r5dev/game/client/c_baseentity.cpp @@ -0,0 +1,11 @@ +//====== Copyright 1996-2005, Valve Corporation, All rights reserved. =======// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#include "core/stdafx.h" +#include "game/client/c_baseentity.h" +#include "game/client/c_baseplayer.h" + diff --git a/r5dev/game/client/c_baseplayer.h b/r5dev/game/client/c_baseplayer.h new file mode 100644 index 00000000..6b6fafe8 --- /dev/null +++ b/r5dev/game/client/c_baseplayer.h @@ -0,0 +1,51 @@ +#ifndef C_BASEPLAYER_H +#define C_BASEPLAYER_H + +#include "public/include/icliententity.h" +#include "public/include/icliententitylist.h" +#include "public/include/iclientnetworkable.h" +#include "public/include/iclientrenderable.h" +#include "public/include/iclientthinkable.h" +#include "public/include/iclientunknown.h" +#include "public/include/ihandleentity.h" +#include "public/include/ivscript.h" + + +class C_BaseCombatCharacter +{ + int m_nPredictionData; // Unk + //int unk; // Padding? +}; + +class C_BaseEntity : public IClientEntity +{ + const char* m_pszModelName; + int unk0; + char pad[4]; // unk; + HSCRIPT m_hScriptInstance; + const char* m_iszScriptId; +}; + + +class C_BaseAnimating : public C_BaseEntity +{ + +}; + +class C_BaseAnimatingOverlay : public C_BaseAnimating +{ + +}; + +class C_Player : public C_BaseCombatCharacter, public C_BaseAnimatingOverlay +{ + +}; + + +void F() +{ + sizeof(C_Player); +} + +#endif // C_BASEPLAYER_H diff --git a/r5dev/launcher/IApplication.cpp b/r5dev/launcher/IApplication.cpp index 155663b7..0868b9eb 100644 --- a/r5dev/launcher/IApplication.cpp +++ b/r5dev/launcher/IApplication.cpp @@ -58,8 +58,9 @@ bool CModAppSystemGroup::Create(CModAppSystemGroup* pModAppSystemGroup) #endif // DEDICATED g_pConCommand->Init(); g_pFactory->GetFactoriesFromRegister(); - #ifndef DEDICATED + g_pClientEntityList = g_pFactory->GetFactoryPtr("VClientEntityList003", false).RCast<IClientEntityList*>(); + for (auto& map : g_pCVar->DumpToMap()) { g_pConsole->m_vsvCommandBases.push_back( diff --git a/r5dev/public/include/client_class.h b/r5dev/public/include/client_class.h index 2b595ec3..48a7dfed 100644 --- a/r5dev/public/include/client_class.h +++ b/r5dev/public/include/client_class.h @@ -1,6 +1,5 @@ #pragma once - -class IClientNetworkable; +#include "public/include/iclientnetworkable.h" typedef IClientNetworkable* (*CreateClientClassFn)(int entNum, int serialNum); typedef IClientNetworkable* (*CreateEventFn)(); diff --git a/r5dev/public/include/icliententity.h b/r5dev/public/include/icliententity.h new file mode 100644 index 00000000..9e47c540 --- /dev/null +++ b/r5dev/public/include/icliententity.h @@ -0,0 +1,15 @@ +#ifndef ICLIENTENTITY_H +#define ICLIENTENTITY_H + +#include "iclientunknown.h" +#include "iclientrenderable.h" +#include "iclientnetworkable.h" +#include "iclientthinkable.h" + +class IClientEntity : public IClientUnknown, public IClientRenderable, public IClientNetworkable, public IClientThinkable +{ + void* __vftable /*VFT*/; +}; + + +#endif // ICLIENTENTITY_H \ No newline at end of file diff --git a/r5dev/public/include/icliententitylist.h b/r5dev/public/include/icliententitylist.h index 57355c0c..f44a1b6c 100644 --- a/r5dev/public/include/icliententitylist.h +++ b/r5dev/public/include/icliententitylist.h @@ -1,8 +1,8 @@ #pragma once +#include "iclientnetworkable.h" +#include "icliententity.h" using CBaseHandle = unsigned long; -class IClientNetworkable; -class IClientEntity; class IClientEntityList // Fully reversed beside index 0 which is probably a destructor. { diff --git a/r5dev/public/include/iclientnetworkable.h b/r5dev/public/include/iclientnetworkable.h new file mode 100644 index 00000000..7156dbb9 --- /dev/null +++ b/r5dev/public/include/iclientnetworkable.h @@ -0,0 +1,9 @@ +#ifndef ICLIENTNETWORKABLE_H +#define ICLIENTNETWORKABLE_H + +class IClientNetworkable +{ + void* __vftable /*VFT*/; +}; + +#endif // ICLIENTNETWORKABLE_H \ No newline at end of file diff --git a/r5dev/public/include/iclientrenderable.h b/r5dev/public/include/iclientrenderable.h new file mode 100644 index 00000000..68f0f9d1 --- /dev/null +++ b/r5dev/public/include/iclientrenderable.h @@ -0,0 +1,25 @@ +#ifndef ICLIENTRENDERABLE_H +#define ICLIENTRENDERABLE_H + +//----------------------------------------------------------------------------- +// Handle to an renderable in the client leaf system +//----------------------------------------------------------------------------- +typedef unsigned short ClientRenderHandle_t; + +enum +{ + INVALID_CLIENT_RENDER_HANDLE = (ClientRenderHandle_t)0xffff, +}; + +class IClientRenderable +{ + void* __vftable /*VFT*/; +}; + +class IClientModelRenderable +{ + void* __vftable /*VFT*/; +}; + + +#endif // ICLIENTRENDERABLE_H \ No newline at end of file diff --git a/r5dev/public/include/iclientthinkable.h b/r5dev/public/include/iclientthinkable.h new file mode 100644 index 00000000..026f5a60 --- /dev/null +++ b/r5dev/public/include/iclientthinkable.h @@ -0,0 +1,9 @@ +#ifndef ICLIENTTHINKABLE_H +#define ICLIENTTHINKABLE_H + +class IClientThinkable +{ + void* __vftable /*VFT*/; +}; + +#endif // ICLIENTTHINKABLE_H \ No newline at end of file diff --git a/r5dev/public/include/iclientunknown.h b/r5dev/public/include/iclientunknown.h new file mode 100644 index 00000000..cbaf419e --- /dev/null +++ b/r5dev/public/include/iclientunknown.h @@ -0,0 +1,10 @@ +#ifndef ICLIENTUNKNOWN_H +#define ICLIENTUNKNOWN_H + +class IClientUnknown +{ + void* __vftable /*VFT*/; +}; + + +#endif // ICLIENTUNKNOWN_H \ No newline at end of file diff --git a/r5dev/public/include/ihandleentity.h b/r5dev/public/include/ihandleentity.h new file mode 100644 index 00000000..4859afba --- /dev/null +++ b/r5dev/public/include/ihandleentity.h @@ -0,0 +1,9 @@ +#ifndef IHANDLEENTITY_H +#define IHANDLEENTITY_H + +class IHandleEntity +{ + void* __vftable /*VFT*/; +}; + +#endif // IHANDLEENTITY_H \ No newline at end of file diff --git a/r5dev/public/include/ivscript.h b/r5dev/public/include/ivscript.h new file mode 100644 index 00000000..042b67f5 --- /dev/null +++ b/r5dev/public/include/ivscript.h @@ -0,0 +1,22 @@ +#ifndef IVSCRIPT_H +#define IVSCRIPT_H + +enum ScriptLanguage_t +{ + SL_NONE, + SL_GAMEMONKEY, + SL_SQUIRREL, + SL_LUA, + SL_PYTHON, + + SL_DEFAULT = SL_SQUIRREL +}; + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- + +DECLARE_POINTER_HANDLE(HSCRIPT); +#define INVALID_HSCRIPT ((HSCRIPT)-1) + +#endif // IVSCRIPT_H diff --git a/r5dev/tier0/basetypes.h b/r5dev/tier0/basetypes.h index 491b5fe6..c0d51a09 100644 --- a/r5dev/tier0/basetypes.h +++ b/r5dev/tier0/basetypes.h @@ -268,3 +268,78 @@ struct vrect_t constexpr int MAX_NETCONSOLE_INPUT_LEN = 4096; constexpr int MSG_NOSIGNAL = 0; + +//----------------------------------------------------------------------------- +// Declares a type-safe handle type; you can't assign one handle to the next +//----------------------------------------------------------------------------- + +// 32-bit pointer handles. + +// Typesafe 8-bit and 16-bit handles. +template< class HandleType > +class CBaseIntHandle +{ +public: + + inline bool operator==(const CBaseIntHandle& other) { return m_Handle == other.m_Handle; } + inline bool operator!=(const CBaseIntHandle& other) { return m_Handle != other.m_Handle; } + + // Only the code that doles out these handles should use these functions. + // Everyone else should treat them as a transparent type. + inline HandleType GetHandleValue() { return m_Handle; } + inline void SetHandleValue(HandleType val) { m_Handle = val; } + + typedef HandleType HANDLE_TYPE; + +protected: + + HandleType m_Handle; +}; + +template< class DummyType > +class CIntHandle16 : public CBaseIntHandle< unsigned short > +{ +public: + inline CIntHandle16() {} + + static inline CIntHandle16<DummyType> MakeHandle(HANDLE_TYPE val) + { + return CIntHandle16<DummyType>(val); + } + +protected: + inline CIntHandle16(HANDLE_TYPE val) + { + m_Handle = val; + } +}; + + +template< class DummyType > +class CIntHandle32 : public CBaseIntHandle< uint32 > +{ +public: + inline CIntHandle32() {} + + static inline CIntHandle32<DummyType> MakeHandle(HANDLE_TYPE val) + { + return CIntHandle32<DummyType>(val); + } + +protected: + inline CIntHandle32(HANDLE_TYPE val) + { + m_Handle = val; + } +}; + + +// NOTE: This macro is the same as windows uses; so don't change the guts of it +#define DECLARE_HANDLE_16BIT(name) typedef CIntHandle16< struct name##__handle * > name; +#define DECLARE_HANDLE_32BIT(name) typedef CIntHandle32< struct name##__handle * > name; + +#define DECLARE_POINTER_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name +#define FORWARD_DECLARE_HANDLE(name) typedef struct name##__ *name + +#define DECLARE_DERIVED_POINTER_HANDLE( _name, _basehandle ) struct _name##__ : public _basehandle##__ {}; typedef struct _name##__ *_name +#define DECLARE_ALIASED_POINTER_HANDLE( _name, _alias ) typedef struct _alias##__ *name \ No newline at end of file diff --git a/r5dev/vproj/clientsdk.vcxproj b/r5dev/vproj/clientsdk.vcxproj index bcd55ce0..43876ec4 100644 --- a/r5dev/vproj/clientsdk.vcxproj +++ b/r5dev/vproj/clientsdk.vcxproj @@ -51,6 +51,7 @@ <ClCompile Include="..\filesystem\filesystem.cpp" /> <ClCompile Include="..\gameui\IConsole.cpp" /> <ClCompile Include="..\gameui\IBrowser.cpp" /> + <ClCompile Include="..\game\client\c_baseentity.cpp" /> <ClCompile Include="..\game\client\spritemodel.cpp" /> <ClCompile Include="..\game\shared\animation.cpp" /> <ClCompile Include="..\inputsystem\inputsystem.cpp" /> @@ -190,6 +191,7 @@ <ClInclude Include="..\gameui\IConsole.h" /> <ClInclude Include="..\gameui\IBrowser.h" /> <ClInclude Include="..\game\client\c_baseentity.h" /> + <ClInclude Include="..\game\client\c_baseplayer.h" /> <ClInclude Include="..\game\client\enginesprite.h" /> <ClInclude Include="..\game\client\hud.h" /> <ClInclude Include="..\game\shared\animation.h" /> @@ -233,11 +235,18 @@ <ClInclude Include="..\public\include\const.h" /> <ClInclude Include="..\public\include\edict.h" /> <ClInclude Include="..\public\include\globalvars_base.h" /> + <ClInclude Include="..\public\include\icliententity.h" /> + <ClInclude Include="..\public\include\iclientnetworkable.h" /> + <ClInclude Include="..\public\include\iclientrenderable.h" /> + <ClInclude Include="..\public\include\iclientthinkable.h" /> + <ClInclude Include="..\public\include\iclientunknown.h" /> <ClInclude Include="..\public\include\icommandline.h" /> <ClInclude Include="..\public\include\idebugoverlay.h" /> + <ClInclude Include="..\public\include\ihandleentity.h" /> <ClInclude Include="..\public\include\inetchannel.h" /> <ClInclude Include="..\public\include\inetmsghandler.h" /> <ClInclude Include="..\public\include\ivrenderview.h" /> + <ClInclude Include="..\public\include\ivscript.h" /> <ClInclude Include="..\public\include\memaddr.h" /> <ClInclude Include="..\public\include\binstream.h" /> <ClInclude Include="..\public\include\httplib.h" /> diff --git a/r5dev/vproj/clientsdk.vcxproj.filters b/r5dev/vproj/clientsdk.vcxproj.filters index 15539df3..cf8bfd33 100644 --- a/r5dev/vproj/clientsdk.vcxproj.filters +++ b/r5dev/vproj/clientsdk.vcxproj.filters @@ -555,6 +555,9 @@ <ClCompile Include="..\tier0\threadtools.cpp"> <Filter>sdk\tier0</Filter> </ClCompile> + <ClCompile Include="..\game\client\c_baseentity.cpp"> + <Filter>sdk\game\client</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\client\cdll_engine_int.h"> @@ -1613,6 +1616,30 @@ <ClInclude Include="..\tier0\memstd.h"> <Filter>sdk\tier0</Filter> </ClInclude> + <ClInclude Include="..\game\client\c_baseplayer.h"> + <Filter>sdk\game\client</Filter> + </ClInclude> + <ClInclude Include="..\public\include\iclientrenderable.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\iclientthinkable.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\iclientunknown.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\ihandleentity.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\iclientnetworkable.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\icliententity.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\ivscript.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <Image Include="..\shared\resource\lockedserver.png"> diff --git a/r5dev/vproj/dedicated.vcxproj b/r5dev/vproj/dedicated.vcxproj index 51f3ddb1..b8bb06b3 100644 --- a/r5dev/vproj/dedicated.vcxproj +++ b/r5dev/vproj/dedicated.vcxproj @@ -219,6 +219,7 @@ <ClInclude Include="..\public\include\inetchannel.h" /> <ClInclude Include="..\public\include\inetmsghandler.h" /> <ClInclude Include="..\public\include\iserver.h" /> + <ClInclude Include="..\public\include\ivscript.h" /> <ClInclude Include="..\public\include\memaddr.h" /> <ClInclude Include="..\public\include\bansystem.h" /> <ClInclude Include="..\public\include\binstream.h" /> diff --git a/r5dev/vproj/dedicated.vcxproj.filters b/r5dev/vproj/dedicated.vcxproj.filters index 20d95716..6cfe03d6 100644 --- a/r5dev/vproj/dedicated.vcxproj.filters +++ b/r5dev/vproj/dedicated.vcxproj.filters @@ -1173,6 +1173,9 @@ <ClInclude Include="..\tier0\memstd.h"> <Filter>sdk\tier0</Filter> </ClInclude> + <ClInclude Include="..\public\include\ivscript.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="..\common\opcodes.cpp"> diff --git a/r5dev/vproj/gamesdk.vcxproj b/r5dev/vproj/gamesdk.vcxproj index c5cb08b2..26f6e1cf 100644 --- a/r5dev/vproj/gamesdk.vcxproj +++ b/r5dev/vproj/gamesdk.vcxproj @@ -53,6 +53,7 @@ <ClCompile Include="..\filesystem\filesystem.cpp" /> <ClCompile Include="..\gameui\IConsole.cpp" /> <ClCompile Include="..\gameui\IBrowser.cpp" /> + <ClCompile Include="..\game\client\c_baseentity.cpp" /> <ClCompile Include="..\game\client\spritemodel.cpp" /> <ClCompile Include="..\game\server\ai_network.cpp" /> <ClCompile Include="..\game\server\ai_networkmanager.cpp" /> @@ -201,6 +202,7 @@ <ClInclude Include="..\gameui\IConsole.h" /> <ClInclude Include="..\gameui\IBrowser.h" /> <ClInclude Include="..\game\client\c_baseentity.h" /> + <ClInclude Include="..\game\client\c_baseplayer.h" /> <ClInclude Include="..\game\client\enginesprite.h" /> <ClInclude Include="..\game\client\hud.h" /> <ClInclude Include="..\game\server\ai_network.h" /> @@ -254,13 +256,20 @@ <ClInclude Include="..\public\include\const.h" /> <ClInclude Include="..\public\include\edict.h" /> <ClInclude Include="..\public\include\globalvars_base.h" /> + <ClInclude Include="..\public\include\icliententity.h" /> <ClInclude Include="..\public\include\icliententitylist.h" /> + <ClInclude Include="..\public\include\iclientnetworkable.h" /> + <ClInclude Include="..\public\include\iclientrenderable.h" /> + <ClInclude Include="..\public\include\iclientthinkable.h" /> + <ClInclude Include="..\public\include\iclientunknown.h" /> <ClInclude Include="..\public\include\icommandline.h" /> <ClInclude Include="..\public\include\idebugoverlay.h" /> + <ClInclude Include="..\public\include\ihandleentity.h" /> <ClInclude Include="..\public\include\inetchannel.h" /> <ClInclude Include="..\public\include\inetmsghandler.h" /> <ClInclude Include="..\public\include\iserver.h" /> <ClInclude Include="..\public\include\ivrenderview.h" /> + <ClInclude Include="..\public\include\ivscript.h" /> <ClInclude Include="..\public\include\memaddr.h" /> <ClInclude Include="..\public\include\bansystem.h" /> <ClInclude Include="..\public\include\binstream.h" /> diff --git a/r5dev/vproj/gamesdk.vcxproj.filters b/r5dev/vproj/gamesdk.vcxproj.filters index 48f8597e..078d22aa 100644 --- a/r5dev/vproj/gamesdk.vcxproj.filters +++ b/r5dev/vproj/gamesdk.vcxproj.filters @@ -591,6 +591,9 @@ <ClCompile Include="..\server\persistence.cpp"> <Filter>sdk\server</Filter> </ClCompile> + <ClCompile Include="..\game\client\c_baseentity.cpp"> + <Filter>sdk\game\client</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\client\cdll_engine_int.h"> @@ -1697,6 +1700,30 @@ <ClInclude Include="..\tier0\memstd.h"> <Filter>sdk\tier0</Filter> </ClInclude> + <ClInclude Include="..\game\client\c_baseplayer.h"> + <Filter>sdk\game\client</Filter> + </ClInclude> + <ClInclude Include="..\public\include\icliententity.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\iclientthinkable.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\iclientunknown.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\ihandleentity.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\iclientnetworkable.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\iclientrenderable.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> + <ClInclude Include="..\public\include\ivscript.h"> + <Filter>sdk\public\include</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <Image Include="..\shared\resource\lockedserver.png">