From 8372992ad03c12621ebc00794cdaac515c17d3fd Mon Sep 17 00:00:00 2001 From: BotoX Date: Wed, 16 Oct 2019 15:16:42 +0200 Subject: [PATCH] new plugin: FixPointViewcontrol --- .../scripting/FixPointViewcontrol.sp | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 FixPointViewcontrol/scripting/FixPointViewcontrol.sp diff --git a/FixPointViewcontrol/scripting/FixPointViewcontrol.sp b/FixPointViewcontrol/scripting/FixPointViewcontrol.sp new file mode 100644 index 00000000..8cf26055 --- /dev/null +++ b/FixPointViewcontrol/scripting/FixPointViewcontrol.sp @@ -0,0 +1,97 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include +#include +#include + +public Plugin myinfo = +{ + name = "FixPointViewcontrol", + author = "xen + BotoX", + description = "", + version = "1.0", + url = "" +} + +Handle g_hAcceptInput; +int g_iAttachedViewControl[MAXPLAYERS + 1] = {INVALID_ENT_REFERENCE, ...}; + +public void OnPluginStart() +{ + HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post); + + // Gamedata. + Handle hConfig = LoadGameConfigFile("sdktools.games"); + if (hConfig == INVALID_HANDLE) + SetFailState("Couldn't load sdktools game config!"); + + int offset = GameConfGetOffset(hConfig, "AcceptInput"); + if (offset == -1) + SetFailState("Failed to find AcceptInput offset"); + + delete hConfig; + + // DHooks. + g_hAcceptInput = DHookCreate(offset, HookType_Entity, ReturnType_Bool, ThisPointer_CBaseEntity, Hook_AcceptInput); + DHookAddParam(g_hAcceptInput, HookParamType_CharPtr); + DHookAddParam(g_hAcceptInput, HookParamType_CBaseEntity); + DHookAddParam(g_hAcceptInput, HookParamType_CBaseEntity); + DHookAddParam(g_hAcceptInput, HookParamType_Object, 20, DHookPass_ByVal|DHookPass_ODTOR|DHookPass_OCTOR|DHookPass_OASSIGNOP); + DHookAddParam(g_hAcceptInput, HookParamType_Int); +} + +public Action Event_PlayerDeath(Handle hEvent, const char[] szName, bool bDontBroadcast) +{ + int client = GetClientOfUserId(GetEventInt(hEvent, "userid")); + DisableViewControl(client); +} + +public void OnClientDisconnect(int client) +{ + DisableViewControl(client); +} + +void DisableViewControl(int client) +{ + if (g_iAttachedViewControl[client] == INVALID_ENT_REFERENCE) + return; + + int entity = EntRefToEntIndex(g_iAttachedViewControl[client]); + if (entity == INVALID_ENT_REFERENCE) + return; + + AcceptEntityInput(entity, "Disable", client, entity); +} + +public void OnEntityCreated(int entity, const char[] classname) +{ + if (StrEqual(classname, "point_viewcontrol")) + { + DHookEntity(g_hAcceptInput, false, entity); + } +} + +public MRESReturn Hook_AcceptInput(int entity, Handle hReturn, Handle hParams) +{ + char sCommand[128]; + DHookGetParamString(hParams, 1, sCommand, sizeof(sCommand)); + + int iActivator = DHookGetParam(hParams, 2); + if (iActivator < 1 || iActivator > MaxClients) + return MRES_Ignored; + + if (StrEqual(sCommand, "Enable", false)) + { + g_iAttachedViewControl[iActivator] = EntIndexToEntRef(entity); + } + + else if (StrEqual(sCommand, "Disable", false)) + { + SetEntPropEnt(entity, Prop_Data, "m_hPlayer", iActivator); + g_iAttachedViewControl[iActivator] = INVALID_ENT_REFERENCE; + } + + return MRES_Ignored; +}