#include <sdktools>
public Action OnPlayerRunCmd(int iClient, int& buttons, int& impulse, float vel[3], float angles[3], int& weapon, int& subtype, int& cmdnum, int& tickcount, int& seed, int mouse[2])
{
float vec1[3], vec2[3], vec3[3], div = 9999999.0, div_buf;
GetClientEyePosition(iClient, vec1);
GetLookPos(iClient, vec2);
int iTarget = -1, iTeam = GetClientTeam(iClient);
for (int u = 1; u <= MaxClients; u++) if(iClient != u && IsClientInGame(u) && IsPlayerAlive(u))
{
GetClientEyePosition(u, vec3);
if((div_buf = PointLineDistance(vec3, vec1, vec2)) < div)
{
iTarget = u;
div = div_buf;
}
}
if(iTarget != -1) PrintCenterText(iClient, "Ростояние до башки %N - %f юнитов", iTarget, div);
}
//http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
// x0 - точка до которой нужно узнать ростояние от линии
// x1 - начальная точка линии
// x2 - конечная точка линии
stock float PointLineDistance(const float x0[3], const float x1[3], const float x2[3])
{
float vec1[3], vec2[3], div;
SubtractVectors(x2, x1, vec1);
SubtractVectors(x1, x0, vec2);
div = GetVectorLength(vec1);
GetVectorCrossProduct(vec1, vec2, vec1);
return GetVectorLength(vec1) / div;
}
stock void GetLookPos(int iClient, float v[3])
{
float EyePosition[3], EyeAngles[3]
GetClientEyePosition(iClient, EyePosition);
GetClientEyeAngles(iClient, EyeAngles);
Handle h_trace = TR_TraceRayFilterEx(EyePosition, EyeAngles, MASK_SOLID, RayType_Infinite, GetLookPos_Filter, iClient);
TR_GetEndPosition(v, h_trace);
CloseHandle(h_trace);
}
public bool GetLookPos_Filter(int iEnt, int mask, int iClient)
{
return iClient != iEnt;
}