#include <sdktools_voice>

public Plugin myinfo = { name = "Voice Settings By Distance", author = "nsdot", description = "", version = "1", url = "" };

ConVar dist;

public void OnPluginStart()
{
	dist = CreateConVar("voice_distance", "500.0"), "Set voice distance";
}

public void OnClientPostAdminCheck(int client)
{
	CreateTimer(1.0, VoiceSettings, client, TIMER_REPEAT);
}

public Action VoiceSettings(Handle timer, int client)
{
	if (IsPlayerValid(client))
	{
		int cEntity = GetClientCommunicationEntity(client);
		for (int i = 1; i <= MaxClients; i++)
		{
			if (IsPlayerValid(i))
			{
				int tEntity = GetClientCommunicationEntity(i);
				if (GetDistance(cEntity, tEntity) <= GetConVarFloat(dist) && IsPlayerAlive(client) && IsPlayerAlive(i))
				{
					SetListenOverride(client, i, Listen_Yes);
					SetListenOverride(i, client, Listen_Yes);
				}
				else
				{
					SetListenOverride(client, i, Listen_No);
					SetListenOverride(i, client, Listen_No);
				}
			}
		}
	}
	else
	{
		return Plugin_Stop;
	}
	return Plugin_Continue;
}

int GetClientCommunicationEntity(int client)
{
	return client;
}

bool IsPlayerValid(int client)
{
	if (client <= 0)
		return false;
	
	if (client > MaxClients)
		return false;
	
	if (!IsValidEdict(client))
		return false;
	
	if (!IsClientConnected(client))
		return false;
	
	if (!IsClientInGame(client))
		return false;
	
	if (!IsClientAuthorized(client))
		return false;
	
	if (IsFakeClient(client))
		return false;
	
	return true;
}

float GetDistance(int ent1, int ent2) {
	float orig1[3];
	float orig2[3];
	GetEntPropVector(ent1, Prop_Send, "m_vecOrigin", orig1);
	GetEntPropVector(ent2, Prop_Send, "m_vecOrigin", orig2);
	return GetVectorDistance(orig1, orig2);
}