From 537ef8da20c2b10d5bbfdfe6318eef8e87396d59 Mon Sep 17 00:00:00 2001
From: neon <>
Date: Fri, 21 Jun 2019 12:30:16 +0200
Subject: [PATCH] Hide: just dumping my code here. currently eating waaaay too
 much CPU. maybe useful at some point tho.

---
 Hide/scripting/Hide.sp | 203 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 203 insertions(+)
 create mode 100644 Hide/scripting/Hide.sp

diff --git a/Hide/scripting/Hide.sp b/Hide/scripting/Hide.sp
new file mode 100644
index 00000000..3be3bf82
--- /dev/null
+++ b/Hide/scripting/Hide.sp
@@ -0,0 +1,203 @@
+#include <multicolors>
+#include <sourcemod>
+#include <sdkhooks>
+#include <zombiereloaded>
+
+/* BOOLS */
+bool g_bHideEnabled;
+bool g_bHidePlayers[MAXPLAYERS+1][MAXPLAYERS+1];
+
+/* INTEGERS */
+int g_iHideDistance[MAXPLAYERS+1];
+
+/* CONVARS */
+ConVar g_hCVar_HideEnabled;
+ConVar g_hCVar_HideMinimumDistance;
+ConVar g_hCVar_HideMaximumDistance;
+ConVar g_hCVar_HideDefaultDistance;
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public Plugin myinfo =
+{
+	name         = "Hide Teammates",
+	author       = "Neon",
+	description  = "A plugin that can !hide teammates with individual distances",
+	version      = "1.0.0",
+	url 		= "https://steamcommunity.com/id/n3ontm"
+};
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public void OnPluginStart()
+{
+
+	g_hCVar_HideEnabled         	= CreateConVar("sm_hide_enabled", "1", "", FCVAR_NONE, true, 0.0, true, 1.0);
+	g_hCVar_HideMinimumDistance 	= CreateConVar("sm_hide_minimum_distance", "10", "", FCVAR_NONE, true, 1.0);
+	g_hCVar_HideMaximumDistance 	= CreateConVar("sm_hide_maximum_distance", "50000", "", FCVAR_NONE, true, 1.0);
+	g_hCVar_HideDefaultDistance 	= CreateConVar("sm_hide_default_distance", "10000", "", FCVAR_NONE, true, 1.0);
+	g_bHideEnabled = g_hCVar_HideEnabled.BoolValue;
+	g_hCVar_HideEnabled.AddChangeHook(OnConVarChanged);
+
+
+	RegAdminCmd("sm_hide", Command_Hide, ADMFLAG_RCON);
+
+	for(int client = 1; client <= MaxClients; client++)
+	{
+		if(IsClientInGame(client))
+			OnClientPutInServer(client);
+	}
+}
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public void OnMapStart()
+{
+	CreateTimer(0.3, UpdateHide, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
+}
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
+{
+	g_bHideEnabled = convar.BoolValue;
+
+	for(int client = 1; client <= MaxClients; client++)
+	{
+		for(int target = 1; target <= MaxClients; target++)
+			g_bHidePlayers[client][target] = false;
+
+		if(IsClientInGame(client))
+		{
+			if(g_bHideEnabled)
+				SDKHook(client, SDKHook_SetTransmit, Hook_SetTransmit);
+			else
+				SDKUnhook(client, SDKHook_SetTransmit, Hook_SetTransmit);
+		}
+	}
+
+	if(g_bHideEnabled)
+		CPrintToChatAll("{cyan}[Hide] {white}has been allowed.");
+	else
+		CPrintToChatAll("{cyan}[Hide] {white}has been disabled.");
+}
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public void OnClientPutInServer(int client)
+{
+	if(!g_bHideEnabled)
+		return;
+
+	SDKHook(client, SDKHook_SetTransmit, Hook_SetTransmit);
+}
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public void OnClientDisconnect(int client)
+{
+	g_iHideDistance[client] = 0;
+	for(int target = 1; target <= MaxClients; target++)
+	{
+		g_bHidePlayers[client][target] = false;
+	}
+}
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public Action Command_Hide(int client, int args)
+{
+	if(!g_bHideEnabled)
+	{
+		ReplyToCommand(client, "[Hide] is currently not allowed.");
+		return Plugin_Handled;
+	}
+
+	int iDistance;
+
+	if(args == 0)
+	{
+		if(g_iHideDistance[client])
+		{
+			g_iHideDistance[client] = 0;
+			ReplyToCommand(client, "[Hide] is now disabled.");
+			return Plugin_Handled;
+		}
+		else
+			iDistance = g_hCVar_HideDefaultDistance.IntValue;
+	}
+	else
+	{
+		char sArgs[8];
+		GetCmdArg(1, sArgs, sizeof(sArgs));
+		iDistance = StringToInt(sArgs);
+	}
+
+	if((iDistance == 0) || (iDistance < g_hCVar_HideMinimumDistance.IntValue) || (iDistance > g_hCVar_HideMaximumDistance.IntValue))
+	{
+		ReplyToCommand(client, "[Hide] Wrong input! Allowed range: %d-%d", g_hCVar_HideMinimumDistance.IntValue, g_hCVar_HideMaximumDistance.IntValue);
+		return Plugin_Handled;
+	}
+
+	g_iHideDistance[client] = iDistance;
+	ReplyToCommand(client, "[Hide] Humans within range %d are now hidden.", g_iHideDistance[client]);
+	return Plugin_Handled;
+}
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public Action UpdateHide(Handle timer)
+{
+	if(!g_bHideEnabled)
+		return Plugin_Continue;
+
+	for(int client = 1; client <= MaxClients; client++)
+	{
+		if(!g_iHideDistance[client])
+			continue;
+
+		if(!IsClientInGame(client) || !IsPlayerAlive(client) || !ZR_IsClientHuman(client))
+			continue;
+
+		float fOriginClient[3];
+		float fOriginTarget[3];
+
+		for(int target = 1; target <= MaxClients; target++)
+		{
+			if(target != client && IsClientInGame(target) && IsPlayerAlive(target) && ZR_IsClientHuman(target))
+			{
+				GetClientAbsOrigin(target, fOriginTarget);
+				GetClientAbsOrigin(client, fOriginClient);
+				if(GetVectorDistance(fOriginTarget, fOriginClient, true) < float(g_iHideDistance[client]))
+					g_bHidePlayers[client][target] = true;
+				else
+					g_bHidePlayers[client][target] = false;
+			}
+			else
+				g_bHidePlayers[client][target] = false;
+		}
+	}
+	return Plugin_Continue;
+}
+
+//----------------------------------------------------------------------------------------------------
+// Purpose:
+//----------------------------------------------------------------------------------------------------
+public Action Hook_SetTransmit(int target, int client)
+{
+	if(!g_bHideEnabled)
+		return Plugin_Continue;
+
+	if(g_bHidePlayers[client][target])
+		return Plugin_Handled;
+
+	return Plugin_Continue;
+}
\ No newline at end of file