its just nides fullupdate. works with 1.12
This commit is contained in:
parent
87bb74837f
commit
4167f74894
165
FullUpdate_nide_1.12/gamedata/FullUpdate.games.txt
Normal file
165
FullUpdate_nide_1.12/gamedata/FullUpdate.games.txt
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
"Games"
|
||||||
|
{
|
||||||
|
"#default"
|
||||||
|
{
|
||||||
|
"#supported"
|
||||||
|
{
|
||||||
|
"engine" "orangebox_valve"
|
||||||
|
"engine" "css"
|
||||||
|
"engine" "csgo"
|
||||||
|
}
|
||||||
|
|
||||||
|
"Addresses"
|
||||||
|
{
|
||||||
|
"CBaseServer"
|
||||||
|
{
|
||||||
|
"windows"
|
||||||
|
{
|
||||||
|
"signature" "CVEngineServer::CreateFakeClient"
|
||||||
|
"read" "8"
|
||||||
|
}
|
||||||
|
"linux"
|
||||||
|
{
|
||||||
|
"signature" "sv"
|
||||||
|
}
|
||||||
|
"mac"
|
||||||
|
{
|
||||||
|
"signature" "sv"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"Signatures"
|
||||||
|
{
|
||||||
|
"CVEngineServer::CreateFakeClient"
|
||||||
|
{
|
||||||
|
"library" "engine"
|
||||||
|
"windows" "\x55\x8B\xEC\x56\xFF\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x8B"
|
||||||
|
}
|
||||||
|
|
||||||
|
"sv"
|
||||||
|
{
|
||||||
|
"library" "engine"
|
||||||
|
"linux" "@sv"
|
||||||
|
"mac" "@sv"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"#default"
|
||||||
|
{
|
||||||
|
"#supported"
|
||||||
|
{
|
||||||
|
"engine" "orangebox"
|
||||||
|
"engine" "left4dead"
|
||||||
|
"engine" "left4dead2"
|
||||||
|
}
|
||||||
|
|
||||||
|
"Addresses"
|
||||||
|
{
|
||||||
|
"CBaseServer"
|
||||||
|
{
|
||||||
|
"windows"
|
||||||
|
{
|
||||||
|
"signature" "CVEngineServer::CreateFakeClient"
|
||||||
|
"read" "6"
|
||||||
|
}
|
||||||
|
"linux"
|
||||||
|
{
|
||||||
|
"signature" "sv"
|
||||||
|
}
|
||||||
|
"mac"
|
||||||
|
{
|
||||||
|
"signature" "sv"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"Signatures"
|
||||||
|
{
|
||||||
|
"CVEngineServer::CreateFakeClient"
|
||||||
|
{
|
||||||
|
"library" "engine"
|
||||||
|
"windows" "\x8B\x44\x24\x04\x50\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0"
|
||||||
|
}
|
||||||
|
|
||||||
|
"sv"
|
||||||
|
{
|
||||||
|
"library" "engine"
|
||||||
|
"linux" "@sv"
|
||||||
|
"mac" "@sv"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"#default"
|
||||||
|
{
|
||||||
|
"#supported"
|
||||||
|
{
|
||||||
|
"engine" "orangebox"
|
||||||
|
"engine" "orangebox_valve"
|
||||||
|
"engine" "css"
|
||||||
|
}
|
||||||
|
|
||||||
|
"Offsets"
|
||||||
|
{
|
||||||
|
"CBaseServer::GetClient"
|
||||||
|
{
|
||||||
|
"windows" "6"
|
||||||
|
"linux" "7"
|
||||||
|
"mac" "7"
|
||||||
|
}
|
||||||
|
"CBaseClient::UpdateAcknowledgedFramecount"
|
||||||
|
{
|
||||||
|
"linux" "44"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"#default"
|
||||||
|
{
|
||||||
|
"#supported"
|
||||||
|
{
|
||||||
|
"engine" "left4dead"
|
||||||
|
"engine" "left4dead2"
|
||||||
|
"engine" "csgo"
|
||||||
|
}
|
||||||
|
|
||||||
|
"Offsets"
|
||||||
|
{
|
||||||
|
"CBaseServer::GetClient"
|
||||||
|
{
|
||||||
|
"windows" "6"
|
||||||
|
"linux" "7"
|
||||||
|
"mac" "7"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"csgo"
|
||||||
|
{
|
||||||
|
"Offsets"
|
||||||
|
{
|
||||||
|
// a1[134] * 4
|
||||||
|
"m_nDeltaTick"
|
||||||
|
{
|
||||||
|
"linux" "536"
|
||||||
|
}
|
||||||
|
// a1[206] * 4
|
||||||
|
"m_nForceWaitForTick"
|
||||||
|
{
|
||||||
|
"linux" "824"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"Signatures"
|
||||||
|
{
|
||||||
|
// Str: "Sending full update to Client %s (%s)\n" ^ CBaseClient::OnRequestFullUpdate
|
||||||
|
"CBaseClient::OnRequestFullUpdate"
|
||||||
|
{
|
||||||
|
"library" "engine"
|
||||||
|
"linux" "\x55\x89\xE5\x53\x83\xEC\x14\x8B\x5D\x08\xC7\x44\x24\x04\x00\x00\x00\x00\x8D\x83\x24\x02\x00\x00"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
218
FullUpdate_nide_1.12/scripting/FullUpdate.sp
Normal file
218
FullUpdate_nide_1.12/scripting/FullUpdate.sp
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
#pragma semicolon 1
|
||||||
|
#pragma newdecls required
|
||||||
|
|
||||||
|
#include <sourcemod>
|
||||||
|
#include <sdktools>
|
||||||
|
#include <FullUpdate>
|
||||||
|
|
||||||
|
Handle g_hCBaseClient_UpdateAcknowledgedFramecount;
|
||||||
|
Handle g_hCBaseClient_OnRequestFullUpdate;
|
||||||
|
Handle g_hGetClient;
|
||||||
|
|
||||||
|
Address m_nDeltaTick;
|
||||||
|
Address m_nForceWaitForTick;
|
||||||
|
|
||||||
|
Address g_pBaseServer;
|
||||||
|
|
||||||
|
int g_iLastFullUpdate[MAXPLAYERS + 1] = { 0, ... };
|
||||||
|
|
||||||
|
public Plugin myinfo =
|
||||||
|
{
|
||||||
|
name = "FullUpdate",
|
||||||
|
author = "BotoX, PŠΣ™ SHUFEN, maxime1907",
|
||||||
|
description = "Serverside cl_fullupdate",
|
||||||
|
version = "1.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPluginStart()
|
||||||
|
{
|
||||||
|
GameData hGameData = new GameData("FullUpdate.games");
|
||||||
|
if (hGameData == null) {
|
||||||
|
SetFailState("Couldn't load FullUpdate.games game config!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined GetClientIClient
|
||||||
|
g_pBaseServer = GameConfGetAddress(hGameData, "CBaseServer");
|
||||||
|
if(g_pBaseServer == Address_Null)
|
||||||
|
{
|
||||||
|
SetFailState("Couldn't get BaseServer address!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StartPrepSDKCall(SDKCall_Raw);
|
||||||
|
if (!PrepSDKCall_SetFromConf(hGameData, SDKConf_Virtual, "CBaseServer::GetClient"))
|
||||||
|
{
|
||||||
|
delete hGameData;
|
||||||
|
SetFailState("PrepSDKCall_SetFromConf(hGameData, SDKConf_Virtual, \"CBaseServer::GetClient\" failed!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain);
|
||||||
|
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
|
||||||
|
g_hGetClient = EndPrepSDKCall();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (GetEngineVersion() != Engine_CSGO)
|
||||||
|
{
|
||||||
|
// void CBaseClient::UpdateAcknowledgedFramecount()
|
||||||
|
StartPrepSDKCall(SDKCall_Raw);
|
||||||
|
|
||||||
|
if(!PrepSDKCall_SetFromConf(hGameData, SDKConf_Virtual, "CBaseClient::UpdateAcknowledgedFramecount"))
|
||||||
|
{
|
||||||
|
delete hGameData;
|
||||||
|
SetFailState("PrepSDKCall_SetFromConf(hGameData, SDKConf_Virtual, \"CBaseClient::UpdateAcknowledgedFramecount\" failed!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
|
||||||
|
|
||||||
|
g_hCBaseClient_UpdateAcknowledgedFramecount = EndPrepSDKCall();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// void CBaseClient::OnRequestFullUpdate(char const *pchReason)
|
||||||
|
StartPrepSDKCall(SDKCall_Raw);
|
||||||
|
if (!PrepSDKCall_SetFromConf(hGameData, SDKConf_Signature, "CBaseClient::OnRequestFullUpdate")) {
|
||||||
|
delete hGameData;
|
||||||
|
SetFailState("PrepSDKCall_SetFromConf(hGameData, SDKConf_Signature, \"CBaseClient::OnRequestFullUpdate\") failed!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer);
|
||||||
|
g_hCBaseClient_OnRequestFullUpdate = EndPrepSDKCall();
|
||||||
|
|
||||||
|
int offset = hGameData.GetOffset("m_nDeltaTick");
|
||||||
|
if (offset == -1) {
|
||||||
|
delete hGameData;
|
||||||
|
SetFailState("Cannot get offset CBaseClient->m_nDeltaTick");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_nDeltaTick = view_as<Address>(offset);
|
||||||
|
|
||||||
|
offset = hGameData.GetOffset("m_nForceWaitForTick");
|
||||||
|
if (offset == -1) {
|
||||||
|
delete hGameData;
|
||||||
|
SetFailState("Cannot get offset CBaseClient->m_nForceWaitForTick");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_nForceWaitForTick = view_as<Address>(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete hGameData;
|
||||||
|
|
||||||
|
RegConsoleCmd("sm_fullupdate", Command_FullUpdate);
|
||||||
|
AddCommandListener(Command_cl_fullupdate, "cl_fullupdate");
|
||||||
|
RegConsoleCmd("fullupdate", Command_FullUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
|
||||||
|
{
|
||||||
|
CreateNative("ClientFullUpdate", Native_FullUpdate);
|
||||||
|
RegPluginLibrary("FullUpdate");
|
||||||
|
|
||||||
|
return APLRes_Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnClientConnected(int client)
|
||||||
|
{
|
||||||
|
g_iLastFullUpdate[client] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FullUpdate(int client)
|
||||||
|
{
|
||||||
|
if(g_iLastFullUpdate[client] + 1 > GetTime())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (IsFakeClient(client))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (GetEngineVersion() != Engine_CSGO)
|
||||||
|
{
|
||||||
|
Address pIClient = GetBaseClient(client);
|
||||||
|
if (!pIClient)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
SDKCall(g_hCBaseClient_UpdateAcknowledgedFramecount, pIClient, -1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Address pIClient = GetBaseClient(client);
|
||||||
|
if (!pIClient)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int iDeltaTick = LoadFromAddress(pIClient + m_nDeltaTick, NumberType_Int32);
|
||||||
|
int iForceWaitForTick = LoadFromAddress(pIClient + m_nForceWaitForTick, NumberType_Int32);
|
||||||
|
|
||||||
|
if (iForceWaitForTick > 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (iDeltaTick == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
char sReason[128];
|
||||||
|
FormatEx(sReason, sizeof(sReason), "%N called this function by 'sm_fullupdate' command", client);
|
||||||
|
|
||||||
|
SDKCall(g_hCBaseClient_OnRequestFullUpdate, pIClient, sReason);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get acknowledged client frame
|
||||||
|
StoreToAddress(pIClient + m_nDeltaTick, -1, NumberType_Int32);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_iLastFullUpdate[client] = GetTime();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Native_FullUpdate(Handle plugin, int numParams)
|
||||||
|
{
|
||||||
|
int client = GetNativeCell(1);
|
||||||
|
|
||||||
|
if(client > MaxClients || client <= 0)
|
||||||
|
{
|
||||||
|
ThrowNativeError(SP_ERROR_NATIVE, "Client is not valid.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!IsClientInGame(client))
|
||||||
|
{
|
||||||
|
ThrowNativeError(SP_ERROR_NATIVE, "Client is not in-game.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(IsFakeClient(client))
|
||||||
|
{
|
||||||
|
ThrowNativeError(SP_ERROR_NATIVE, "Client is fake-client.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FullUpdate(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action Command_cl_fullupdate(int client, const char[] command, int args)
|
||||||
|
{
|
||||||
|
Command_FullUpdate(client, -1);
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action Command_FullUpdate(int client, int args)
|
||||||
|
{
|
||||||
|
FullUpdate(client);
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined GetClientIClient
|
||||||
|
stock Address GetClientIClient(int client)
|
||||||
|
{
|
||||||
|
return SDKCall(g_hGetClient, g_pBaseServer, client-1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
stock Address GetBaseClient(int client)
|
||||||
|
{
|
||||||
|
Address pIClientTmp = GetClientIClient(client);
|
||||||
|
if(!pIClientTmp)
|
||||||
|
return Address_Null;
|
||||||
|
|
||||||
|
// The IClient vtable is +4 from the IGameEventListener2 (CBaseClient) vtable due to multiple inheritance.
|
||||||
|
return pIClientTmp - view_as<Address>(4);
|
||||||
|
}
|
24
FullUpdate_nide_1.12/scripting/include/FullUpdate.inc
Normal file
24
FullUpdate_nide_1.12/scripting/include/FullUpdate.inc
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#if defined _FullUpdate_Included
|
||||||
|
#endinput
|
||||||
|
#endif
|
||||||
|
#define _FullUpdate_Included
|
||||||
|
|
||||||
|
native bool ClientFullUpdate(int client);
|
||||||
|
|
||||||
|
public SharedPlugin __pl_FullUpdate =
|
||||||
|
{
|
||||||
|
name = "FullUpdate",
|
||||||
|
file = "FullUpdate.smx",
|
||||||
|
#if defined REQUIRE_PLUGIN
|
||||||
|
required = 1,
|
||||||
|
#else
|
||||||
|
required = 0,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#if !defined REQUIRE_PLUGIN
|
||||||
|
public __pl_FullUpdate_SetNTVOptional()
|
||||||
|
{
|
||||||
|
MarkNativeAsOptional("ClientFullUpdate");
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user