Add ThirdPerson + FullUpdate
This commit is contained in:
parent
028213944f
commit
33a8bb32c6
20
FullUpdate/gamedata/FullUpdate2.games.txt
Normal file
20
FullUpdate/gamedata/FullUpdate2.games.txt
Normal file
@ -0,0 +1,20 @@
|
||||
"Games"
|
||||
{
|
||||
"#default"
|
||||
{
|
||||
"#supported"
|
||||
{
|
||||
"engine" "orangebox"
|
||||
"engine" "orangebox_valve"
|
||||
"engine" "css"
|
||||
}
|
||||
|
||||
"Offsets"
|
||||
{
|
||||
"CBaseClient::UpdateAcknowledgedFramecount"
|
||||
{
|
||||
"linux" "44"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
106
FullUpdate/scripting/FullUpdate.sp
Normal file
106
FullUpdate/scripting/FullUpdate.sp
Normal file
@ -0,0 +1,106 @@
|
||||
#pragma semicolon 1
|
||||
#pragma newdecls required
|
||||
|
||||
#include <sourcemod>
|
||||
#include <sdktools>
|
||||
#include <FullUpdate>
|
||||
|
||||
Handle g_hCBaseClient_UpdateAcknowledgedFramecount;
|
||||
int g_iLastFullUpdate[MAXPLAYERS + 1] = { 0, ... };
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "FullUpdate",
|
||||
author = "BotoX",
|
||||
description = "Serverside cl_fullupdate",
|
||||
version = "1.0"
|
||||
}
|
||||
|
||||
public void OnPluginStart()
|
||||
{
|
||||
Handle hGameConf = LoadGameConfigFile("FullUpdate2.games");
|
||||
if(hGameConf == INVALID_HANDLE)
|
||||
{
|
||||
SetFailState("Couldn't load FullUpdate2.games game config!");
|
||||
return;
|
||||
}
|
||||
|
||||
// void CBaseClient::UpdateAcknowledgedFramecount()
|
||||
StartPrepSDKCall(SDKCall_Raw);
|
||||
|
||||
if(!PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, "CBaseClient::UpdateAcknowledgedFramecount"))
|
||||
{
|
||||
CloseHandle(hGameConf);
|
||||
SetFailState("PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, \"CBaseClient::UpdateAcknowledgedFramecount\" failed!");
|
||||
return;
|
||||
}
|
||||
CloseHandle(hGameConf);
|
||||
|
||||
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
|
||||
|
||||
g_hCBaseClient_UpdateAcknowledgedFramecount = EndPrepSDKCall();
|
||||
|
||||
RegConsoleCmd("sm_fullupdate", Command_FullUpdate);
|
||||
RegConsoleCmd("cl_fullupdate", Command_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;
|
||||
|
||||
// The IClient vtable is +4 from the IGameEventListener2 (CBaseClient) vtable due to multiple inheritance.
|
||||
Address pIClient = GetClientIClient(client) - view_as<Address>(4);
|
||||
if(!pIClient)
|
||||
return false;
|
||||
|
||||
SDKCall(g_hCBaseClient_UpdateAcknowledgedFramecount, pIClient, -1);
|
||||
|
||||
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_FullUpdate(int client, int args)
|
||||
{
|
||||
FullUpdate(client);
|
||||
return Plugin_Handled;
|
||||
}
|
24
FullUpdate/scripting/include/FullUpdate.inc
Normal file
24
FullUpdate/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
|
97
ThirdPerson/scripting/ThirdPerson.sp
Normal file
97
ThirdPerson/scripting/ThirdPerson.sp
Normal file
@ -0,0 +1,97 @@
|
||||
#pragma semicolon 1
|
||||
#pragma newdecls required
|
||||
|
||||
#include <sourcemod>
|
||||
#include <FullUpdate>
|
||||
#include <multicolors>
|
||||
|
||||
bool g_bThirdPerson[MAXPLAYERS + 1] = { false, ... };
|
||||
|
||||
// Spectator Movement modes (from smlib)
|
||||
enum Obs_Mode
|
||||
{
|
||||
OBS_MODE_NONE = 0, // not in spectator mode
|
||||
OBS_MODE_DEATHCAM, // special mode for death cam animation
|
||||
OBS_MODE_FREEZECAM, // zooms to a target, and freeze-frames on them
|
||||
OBS_MODE_FIXED, // view from a fixed camera position
|
||||
OBS_MODE_IN_EYE, // follow a player in first person view
|
||||
OBS_MODE_CHASE, // follow a player in third person view
|
||||
OBS_MODE_POI, // PASSTIME point of interest - game objective, big fight, anything interesting; added in the middle of the enum due to tons of hard-coded "<ROAMING" enum compares
|
||||
OBS_MODE_ROAMING, // free roaming
|
||||
|
||||
NUM_OBSERVER_MODES
|
||||
};
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "FullUpdate",
|
||||
author = "BotoX",
|
||||
description = "Serverside cl_fullupdate",
|
||||
version = "1.0"
|
||||
}
|
||||
|
||||
public void OnPluginStart()
|
||||
{
|
||||
RegConsoleCmd("sm_tp", Command_ThirdPerson, "Toggle thirdperson");
|
||||
|
||||
HookEvent("player_death", Event_PlayerDeathPost, EventHookMode_Post);
|
||||
HookEvent("player_spawn", Event_PlayerSpawnPost, EventHookMode_Post);
|
||||
}
|
||||
|
||||
public void OnClientConnected(int client)
|
||||
{
|
||||
g_bThirdPerson[client] = false;
|
||||
}
|
||||
|
||||
public Action Command_ThirdPerson(int client, int args)
|
||||
{
|
||||
if(g_bThirdPerson[client])
|
||||
ThirdPersonOff(client);
|
||||
else
|
||||
ThirdPersonOn(client);
|
||||
}
|
||||
|
||||
public void Event_PlayerDeathPost(Event event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
int client = GetClientOfUserId(event.GetInt("userid"));
|
||||
ThirdPersonOff(client);
|
||||
}
|
||||
|
||||
public void Event_PlayerSpawnPost(Event event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
int client = GetClientOfUserId(event.GetInt("userid"));
|
||||
ThirdPersonOff(client);
|
||||
}
|
||||
|
||||
void ThirdPersonOn(int client)
|
||||
{
|
||||
if(g_bThirdPerson[client])
|
||||
return;
|
||||
|
||||
if(!IsPlayerAlive(client))
|
||||
return;
|
||||
|
||||
SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", 0);
|
||||
SetEntProp(client, Prop_Send, "m_iObserverMode", OBS_MODE_DEATHCAM);
|
||||
SetEntProp(client, Prop_Send, "m_bDrawViewmodel", 0);
|
||||
SetEntProp(client, Prop_Send, "m_iFOV", 120);
|
||||
|
||||
g_bThirdPerson[client] = true;
|
||||
CPrintToChat(client, "\x03[ThirdPerson]\x01 is {green}ON{default}.");
|
||||
}
|
||||
|
||||
void ThirdPersonOff(int client)
|
||||
{
|
||||
if(!g_bThirdPerson[client])
|
||||
return;
|
||||
|
||||
SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", -1);
|
||||
SetEntProp(client, Prop_Send, "m_iObserverMode", 0);
|
||||
SetEntProp(client, Prop_Send, "m_bDrawViewmodel", 1);
|
||||
SetEntProp(client, Prop_Send, "m_iFOV", 90);
|
||||
|
||||
ClientFullUpdate(client);
|
||||
|
||||
g_bThirdPerson[client] = false;
|
||||
CPrintToChat(client, "\x03[ThirdPerson]\x01 is {red}OFF{default}.");
|
||||
}
|
1
ThirdPerson/scripting/include/FullUpdate.inc
Symbolic link
1
ThirdPerson/scripting/include/FullUpdate.inc
Symbolic link
@ -0,0 +1 @@
|
||||
../../../FullUpdate/scripting/include/FullUpdate.inc
|
Loading…
Reference in New Issue
Block a user