jtfHeightFinder

Created Diff never expires
390 removals
552 lines
326 additions
491 lines
#pragma semicolon 1
#pragma semicolon 1


#include <sourcemod>
#include <sourcemod>
#include <sdktools>
#include <sdktools>
#include <sdkhooks>
#include <sdkhooks>


#define PLUGIN_VERSION "1.0.1"
#define PLUGIN_VERSION "1.0.2"
#define SPRITE_BEAM "materials/sprites/laser.vmt"
#define SPRITE_BEAM "materials/sprites/laser.vmt"


bool PL_Enabled;
bool g_bEnabled;
bool BM_ENABLED[MAXPLAYERS + 1];
bool g_bBrushMode[MAXPLAYERS + 1];
bool CJ_ENABLED[MAXPLAYERS + 1];
bool g_bCheckJump[MAXPLAYERS + 1];


int Offset_for_entity_effect = -1;
int g_iEffectOffset = -1;
int BrushEntityIndex[MAXPLAYERS + 1][1]; //Array of brush entities (trigger_teleport, func_nogrenades)
int g_iBrushEntity[MAXPLAYERS + 1]; //Array of brush entities (trigger_teleport, func_nogrenades)
int sprite;
int g_iSpritePrecache;
int halo;
int g_iHaloPrecache;


float FL_VelClient[MAXPLAYERS + 1][3];
float g_fVelocity[MAXPLAYERS + 1][3];


ConVar g_pluginEnabled;
ConVar g_cvarEnabled;


Handle HudDisplay;
Handle g_hHudSync;


public Plugin:myinfo =
public Plugin myinfo =
{
{
name = "Height Finder",
name = "Height Finder",
author = "Master Cake",
author = "Master Cake",
description = "This plugin finds height",
description = "This plugin finds height",
version = PLUGIN_VERSION,
version = PLUGIN_VERSION,
url = ""
url = ""
};
};


public OnPluginStart()
public void OnPluginStart()
{
{
CreateConVar("hfind_version", PLUGIN_VERSION, "Height Finder Version", FCVAR_REPLICATED | FCVAR_SPONLY | FCVAR_DONTRECORD | FCVAR_NOTIFY);
CreateConVar("hfind_version", PLUGIN_VERSION, "Height Finder Version", FCVAR_SPONLY | FCVAR_DONTRECORD | FCVAR_NOTIFY);


g_pluginEnabled = CreateConVar("hfind_enabled", "1", "Enable Height Finder\n0 = Disabled\n1 = Enabled", _, true, 0.0, true, 1.0);
g_cvarEnabled = CreateConVar("hfind_enabled", "1", "Enable Height Finder\n0 = Disabled\n1 = Enabled", _, true, 0.0, true, 1.0);
PL_Enabled = GetConVarBool(g_pluginEnabled);
g_bEnabled = GetConVarBool(g_cvarEnabled);


HookConVarChange(g_pluginEnabled, ConsoleVarChange);
HookConVarChange(g_cvarEnabled, ConsoleVarChange);


Offset_for_entity_effect = FindSendPropInfo("CBaseEntity", "m_fEffects"); //Find offset to "m_fEffects" property
g_iEffectOffset = FindSendPropInfo("CBaseEntity", "m_fEffects"); //Find offset to "m_fEffects" property
if (Offset_for_entity_effect == -1)
if (g_iEffectOffset == -1)
{
SetFailState("m_fEffects property not found!");
SetFailState("m_fEffects property not found!");
}


RegConsoleCmd("sm_findh", HC_Command, "Command to enable Height Finder");
RegConsoleCmd("sm_findh", cmdFindHeight, "Command to enable Height Finder");
RegConsoleCmd("sm_checkjump", CJ_Command, "Command to enable jump checker");
RegConsoleCmd("sm_checkjump", cmdCheckJump, "Command to enable jump checker");


RegAdminCmd("sm_brushmode", BM_Command, ADMFLAG_GENERIC, "Command to enable/disable brush mode");
RegAdminCmd("sm_brushmode", cmdBrushMode, ADMFLAG_GENERIC, "Command to enable/disable brush mode");
RegAdminCmd("sm_nogrenades", NG_Command, ADMFLAG_GENERIC, "Command to show func_nogrenades brush entities");
RegAdminCmd("sm_nogrenades", cmdEnableNoGrenade, ADMFLAG_GENERIC, "Command to show func_nogrenades brush entities");
RegAdminCmd("sm_stopnogrenades", SNG_Command, ADMFLAG_GENERIC, "Command to stop showing func_nogrenades brush entities");
RegAdminCmd("sm_stopnogrenades", cmdDisableNoGrenade, ADMFLAG_GENERIC, "Command to stop showing func_nogrenades brush entities");
RegAdminCmd("sm_teletriggers", TT_Command, ADMFLAG_GENERIC, "Command to show trigger_teleport brush entities");
RegAdminCmd("sm_teletriggers", cmdEnableTeleTrigger, ADMFLAG_GENERIC, "Command to show trigger_teleport brush entities");
RegAdminCmd("sm_stopteletriggers", STT_Command, ADMFLAG_GENERIC, "Command to stop showing trigger_teleport brush entities");
RegAdminCmd("sm_stopteletriggers", cmdDisableTeleTrigger, ADMFLAG_GENERIC, "Command to stop showing trigger_teleport brush entities");
RegAdminCmd("sm_removent", RENT_Command, ADMFLAG_GENERIC, "Command to remove trigger_teleport and func_nogrenades brush entities");
RegAdminCmd("sm_removent", cmdRemoveEntities, ADMFLAG_GENERIC, "Command to remove trigger_teleport and func_nogrenades brush entities");
RegAdminCmd("sm_getentindex", GEI_Command, ADMFLAG_GENERIC, "Command to get trigger_teleport and func_nogrenades index");
RegAdminCmd("sm_getentindex", cmdGetEntityIndex, ADMFLAG_GENERIC, "Command to get trigger_teleport and func_nogrenades index");
RegAdminCmd("sm_moventup", MEU_Command, ADMFLAG_GENERIC, "Command to move trigger_teleport and func_nogrenades brush entities up");
RegAdminCmd("sm_movent", cmdMoveEnt, ADMFLAG_GENERIC, "Command to move trigger_teleport and func_nogrenades brush entities");
RegAdminCmd("sm_moventdown", MED_Command, ADMFLAG_GENERIC, "Command to move trigger_teleport and func_nogrenades brush entities down");


AutoExecConfig(true, "hfind");
AutoExecConfig(true, "hfind");


HudDisplay = CreateHudSynchronizer();
g_hHudSync = CreateHudSynchronizer();
}
}


public OnMapStart()
public void OnMapStart()
{
{
sprite = PrecacheModel(SPRITE_BEAM);
g_iSpritePrecache = PrecacheModel(SPRITE_BEAM);
halo = PrecacheModel(SPRITE_BEAM);
g_iHaloPrecache = PrecacheModel(SPRITE_BEAM);
}
}


public ConsoleVarChange(Handle:CVar, const String:oldValue[], const String:newValue[])
public void ConsoleVarChange(ConVar cvar, const char[] oldValue, const char[] newValue)
{
{
if(CVar == g_pluginEnabled)
g_bEnabled = GetConVarBool(cvar);
{
PL_Enabled = GetConVarBool(g_pluginEnabled);
}
}
}


public OnClientPutInServer(myClient)
public void OnClientPutInServer(int client)
{
{
BM_ENABLED[myClient] = false;
g_bBrushMode[client] = false;
CJ_ENABLED[myClient] = false;
g_bCheckJump[client] = false;
BrushEntityIndex[myClient][0] = -1;
g_iBrushEntity[client] = -1;
}
}


public int MenuHandler_func(Menu menu, MenuAction action, int param1, int param2)
public int MenuHandler_func(Menu menu, MenuAction action, int param1, int param2)
{
{
if (action == MenuAction_End)
if (action == MenuAction_End)
{
{
delete menu;
delete menu;
}
}
}
}


public Action:CJ_Command(myClient, args)
public Action cmdCheckJump(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient))
if (g_bEnabled && client)
return Plugin_Continue;

if (!CJ_ENABLED[myClient])
{
{
CJ_ENABLED[myClient] = true;
g_bCheckJump[client] = !g_bCheckJump[client];
ReplyToCommand(myClient, "[SM] Jump Check Enabled!");
ReplyToCommand(client, "[SM] Jump Check %s!", g_bCheckJump[client] ? "Enabled" : "Disabled");
return Plugin_Continue;
}
}
if (CJ_ENABLED[myClient])
{
CJ_ENABLED[myClient] = false;
ReplyToCommand(myClient, "[SM] Jump Check Disabled!");
}


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:BM_Command(myClient, args)
public Action cmdBrushMode(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient))
if (g_bEnabled && client)
return Plugin_Continue;

if (!BM_ENABLED[myClient])
{
{
BM_ENABLED[myClient] = true;
g_bBrushMode[client] = !g_bBrushMode[client];
ReplyToCommand(myClient, "[SM] Brush Mode Enabled!");
ReplyToCommand(client, "[SM] Brush Mode %s!", g_bBrushMode[client] ? "Enabled" : "Disabled");
return Plugin_Continue;
}
}
if (BM_ENABLED[myClient])
{
BM_ENABLED[myClient] = false;
ReplyToCommand(myClient, "[SM] Brush Mode Disabled!");
}


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:RENT_Command(myClient, args)
public Action cmdRemoveEntities(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient) || !BM_ENABLED[myClient])
if (!g_bEnabled || !client || !g_bBrushMode[client])
return Plugin_Continue;
{
return Plugin_Handled;
}


int EntityCount = GetEntityCount();
char className[32];
char myClassName[50];
for (int i = MaxClients + 1; i <= 2048; ++i)
for (int myEntity = MaxClients + 1; myEntity <= EntityCount; ++myEntity)
{
{
if (IsValidEntity(myEntity))
if (IsValidEntity(i))
{
{
GetEntityClassname(myEntity, myClassName, sizeof(myClassName));
GetEntityClassname(i, className, sizeof(className));
if (StrEqual(myClassName, "trigger_teleport") || StrEqual(myClassName, "func_nogrenades"))
if (StrEqual(className, "trigger_teleport") || StrEqual(className, "func_nogrenades"))
{
{
RemoveEntity(myEntity);
RemoveEntity(i);
}
}
}
}
}
}


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:STT_Command(myClient, args)
public Action cmdDisableTeleTrigger(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient) || !BM_ENABLED[myClient])
if (!g_bEnabled || !client || !g_bBrushMode[client])
return Plugin_Continue;
{
return Plugin_Handled;
}


int EntityCouunt = GetEntityCount();
char className[32];
char myClassName[50];
for (int i = MaxClients + 1; i <= 2048; ++i)
for (int myEntity = MaxClients + 1; myEntity <= EntityCouunt; ++myEntity)
{
{
if (IsValidEntity(myEntity))
if (IsValidEntity(i))
{
{
GetEntityClassname(myEntity, myClassName, sizeof(myClassName));
GetEntityClassname(i, className, sizeof(className));
if (StrEqual(myClassName, "trigger_teleport"))
if (StrEqual(className, "trigger_teleport"))
{
{
StopShowBrushEntity(myEntity);
StopShowBrushEntity(i);
}
}
}
}
}
}


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:TT_Command(myClient, args)
public Action cmdEnableTeleTrigger(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient) || !BM_ENABLED[myClient])
if (!g_bEnabled || !client || !g_bBrushMode[client])
return Plugin_Continue;
{
return Plugin_Handled;
}


int EntityCouunt = GetEntityCount();
char className[32];
char myClassName[50];
for (int i = MaxClients + 1; i <= 2048; ++i)
for (int myEntity = MaxClients + 1; myEntity <= EntityCouunt; ++myEntity)
{
{
if (IsValidEntity(myEntity))
if (IsValidEntity(i))
{
{
GetEntityClassname(myEntity, myClassName, sizeof(myClassName));
GetEntityClassname(i, className, sizeof(className));
if (StrEqual(myClassName, "trigger_teleport"))
if (StrEqual(className, "trigger_teleport"))
{
{
ShowBrushEntity(myEntity);
ShowBrushEntity(i);
}
}
}
}
}
}


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:NG_Command(myClient, args)
public Action cmdEnableNoGrenade(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient) || !BM_ENABLED[myClient])
if (!g_bEnabled || !client || !g_bBrushMode[client])
return Plugin_Continue;
{
return Plugin_Handled;
}


int EntityCouunt = GetEntityCount();
char className[32];
char myClassName[50];
for (int i = MaxClients + 1; i <= 2048; ++i)
for (int myEntity = MaxClients + 1; myEntity <= EntityCouunt; ++myEntity)
{
{
if (IsValidEntity(myEntity))
if (IsValidEntity(i))
{
{
GetEntityClassname(myEntity, myClassName, sizeof(myClassName));
GetEntityClassname(i, className, sizeof(className));
if (StrEqual(myClassName, "func_nogrenades"))
if (StrEqual(className, "func_nogrenades"))
{
{
ShowBrushEntity(myEntity);
ShowBrushEntity(i);
}
}
}
}
}
}


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:SNG_Command(myClient, args)
public Action cmdDisableNoGrenade(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient) || !BM_ENABLED[myClient])
if (!g_bEnabled || !client || !g_bBrushMode[client])
return Plugin_Continue;
{
return Plugin_Handled;
}


int EntityCouunt = GetEntityCount();
char className[32];
char myClassName[50];
for (int i = MaxClients + 1; i <= 2048; ++i)
for (int myEntity = MaxClients + 1; myEntity <= EntityCouunt; ++myEntity)
{
{
if (IsValidEntity(myEntity))
if (IsValidEntity(i))
{
{
GetEntityClassname(myEntity, myClassName, sizeof(myClassName));
GetEntityClassname(i, className, sizeof(className));
if (StrEqual(myClassName, "func_nogrenades"))
if (StrEqual(className, "func_nogrenades"))
{
{
StopShowBrushEntity(myEntity);
StopShowBrushEntity(i);
}
}
}
}
}
}


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:MED_Command(myClient, args)
public Action cmdMoveEnt(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient) || !BM_ENABLED[myClient])
if (!g_bEnabled || !client || !g_bBrushMode[client])
return Plugin_Continue;
{
return Plugin_Handled;
}


if (args != 2)
if (args != 2)
{
{
ReplyToCommand(myClient, "Usage: sm_moventdown <index> <num of units>");
ReplyToCommand(client, "Usage: sm_moventup <index> <num of units>");
return Plugin_Handled;
return Plugin_Handled;
}
}


char myArgs1[32];
char arg1[32];
GetCmdArg(1, myArgs1, sizeof(myArgs1));
GetCmdArg(1, arg1, sizeof(arg1));
int EntIndex = StringToInt(myArgs1);

if (!IsValidEntity(EntIndex))
int entity = StringToInt(arg1);
if (!IsValidEntity(entity))
{
return Plugin_Handled;
return Plugin_Handled;
char myArgs2[32];
}
GetCmdArg(2, myArgs2, sizeof(myArgs2));

int num = StringToInt(myArgs2);
char arg2[32];
if (num > 999)
GetCmdArg(2, arg2, sizeof(arg2));

int distance = StringToInt(arg2);
if (!distance || distance > 999 || distance < -999)
{
{
ReplyToCommand(myClient, "Invalid value");
ReplyToCommand(client, "Invalid value");
return Plugin_Handled;
return Plugin_Handled;
}
}
else

char className[32];
GetEntityClassname(entity, className, sizeof(className));

if (StrEqual(className, "func_nogrenades") || StrEqual(className, "trigger_teleport"))
{
{
float EntPos[3];
float origin[3];
char typent[32];
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", origin);
GetEntityClassname(EntIndex, typent, sizeof(typent));

if (StrEqual(typent, "func_nogrenades") || StrEqual(typent, "trigger_teleport"))
origin[2] += distance;
{

GetEntPropVector(EntIndex, Prop_Send, "m_vecOrigin", EntPos);
TeleportEntity(entity, origin, NULL_VECTOR, NULL_VECTOR);
if (num == 0)
{
EntPos[2] += num;
}
else
{
EntPos[2] -= num;
}
TeleportEntity(EntIndex, EntPos, NULL_VECTOR, NULL_VECTOR);
}
}
}


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:MEU_Command(myClient, args)
public Action cmdGetEntityIndex(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient) || !BM_ENABLED[myClient])
if (!g_bEnabled || !client || !g_bBrushMode[client])
return Plugin_Continue;

if (args != 2)
{
ReplyToCommand(myClient, "Usage: sm_moventup <index> <num of units>");
return Plugin_Handled;
}

char myArgs1[32];
GetCmdArg(1, myArgs1, sizeof(myArgs1));
int EntIndex = StringToInt(myArgs1);
if (!IsValidEntity(EntIndex))
return Plugin_Handled;
char myArgs2[32];
GetCmdArg(2, myArgs2, sizeof(myArgs2));
int num = StringToInt(myArgs2);
if (num > 999)
{
{
ReplyToCommand(myClient, "Invalid value");
return Plugin_Handled;
return Plugin_Handled;
}
}
else
float eyeOrigin[3];
GetClientEyePosition(client, eyeOrigin);

float eyeAngle[3];
GetClientEyeAngles(client, eyeAngle);

Handle tr = TR_TraceRayFilterEx(eyeOrigin, eyeAngle, MASK_PLAYERSOLID, RayType_Infinite, TraceFilterEntity);
if (TR_DidHit(tr))
{
{
float EntPos[3];
float endPoint[3];
char typent[32];
TR_GetEndPosition(endPoint, tr);
GetEntityClassname(EntIndex, typent, sizeof(typent));
TR_EnumerateEntities(eyeOrigin, endPoint, PARTITION_TRIGGER_EDICTS, RayType_EndPoint, DetectTrigger, client);
if (StrEqual(typent, "func_nogrenades") || StrEqual(typent, "trigger_teleport"))

if (g_iBrushEntity[client] != -1)
{
{
GetEntPropVector(EntIndex, Prop_Send, "m_vecOrigin", EntPos);
ReplyToCommand(client, "Entity Index: %i", g_iBrushEntity[client]);
if (num == 0)
{
EntPos[2] += num;
}
else
{
EntPos[2] += num; //Anyway LOL
}
TeleportEntity(EntIndex, EntPos, NULL_VECTOR, NULL_VECTOR);
}
}
}
}


delete tr;

return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:GEI_Command(myClient, args)
public Action cmdFindHeight(int client, int args)
{
{
if(!PL_Enabled || !IsValidClient(myClient) || !BM_ENABLED[myClient])
if (!g_bEnabled || !client)
return Plugin_Continue;

float FL_TargetPos[3];
float FL_PlayerPos[3];
float FL_PlayerAng[3];
GetClientEyePosition(myClient, FL_PlayerPos);
GetClientEyeAngles(myClient, FL_PlayerAng);
Handle myTrace = TR_TraceRayFilterEx(FL_PlayerPos, FL_PlayerAng, MASK_PLAYERSOLID, RayType_Infinite, TraceFilterEntity);

if(TR_DidHit(myTrace))
{
{
TR_GetEndPosition(FL_TargetPos, myTrace);
return Plugin_Handled;
TR_EnumerateEntities(FL_PlayerPos, FL_TargetPos, PARTITION_TRIGGER_EDICTS, RayType_EndPoint, DetectTrigger, myClient);
if (BrushEntityIndex[myClient][0] != -1)
ReplyToCommand(myClient, "Entity Index: %i", BrushEntityIndex[myClient][0]);
}
}
delete myTrace;

return Plugin_Handled;
}

public Action:HC_Command(myClient, args)
{
if(!PL_Enabled || !IsValidClient(myClient))
return Plugin_Continue;


Menu menu = new Menu(MenuHandler_func);
Menu menu = new Menu(MenuHandler_func);
menu.SetTitle("Height Finder");
menu.SetTitle("Height Finder");


static float FL_TargetPos[3];
float eyeOrigin[3];
static float FL_PlayerPos[3];
GetClientEyePosition(client, eyeOrigin);
static float FL_PlayerAbsPos[3];
static float FL_PlayerTempPos[3];
static float FL_PlayerAng[3];
static float FL_TargetVec[3];
GetClientEyePosition(myClient, FL_PlayerPos);
GetClientAbsOrigin(myClient, FL_PlayerAbsPos); //Abs Origin
GetClientEyeAngles(myClient, FL_PlayerAng);
Handle myTrace = TR_TraceRayFilterEx(FL_PlayerPos, FL_PlayerAng, MASK_PLAYERSOLID, RayType_Infinite, TraceFilterEntity);


if(TR_DidHit(myTrace))
float playerOrigin[3];
GetClientAbsOrigin(client, playerOrigin); //Abs Origin

float eyeAngle[3];
GetClientEyeAngles(client, eyeAngle);

Handle myTrace = TR_TraceRayFilterEx(eyeOrigin, eyeAngle, MASK_PLAYERSOLID, RayType_Infinite, TraceFilterEntity);

float endPoint[3];
if (TR_DidHit(myTrace))
{
{
TR_GetEndPosition(FL_TargetPos, myTrace);
TR_GetEndPosition(endPoint, myTrace);
TR_EnumerateEntities(FL_PlayerPos, FL_TargetPos, PARTITION_TRIGGER_EDICTS, RayType_EndPoint, DetectTrigger, myClient);
TR_EnumerateEntities(eyeOrigin, endPoint, PARTITION_TRIGGER_EDICTS, RayType_EndPoint, DetectTrigger, client);
}
}

delete myTrace;
delete myTrace;


char distance[32];
char buffer[32];
char detent[32];
char typent[32];
SubtractVectors(FL_TargetPos, FL_PlayerAbsPos, FL_TargetVec); //Distance to the ground
Format(distance, sizeof(distance), "Target height: %1.3f", FL_TargetVec[2]);
if (BrushEntityIndex[myClient][0] != -1)
Format(detent, sizeof(detent), "Brush entity: YES");
else
Format(detent, sizeof(detent), "Brush entity: NO");


menu.AddItem("th", distance, ITEMDRAW_DISABLED);
float difference[3];
menu.AddItem("be", detent, ITEMDRAW_DISABLED);
SubtractVectors(endPoint, playerOrigin, difference); //Distance to the ground


if (BrushEntityIndex[myClient][0] != -1)
FormatEx(buffer, sizeof(buffer), "Target height: %1.3f", difference[2]);
menu.AddItem("", buffer, ITEMDRAW_DISABLED);

FormatEx(buffer, sizeof(buffer), "Brush entity: %s", g_iBrushEntity[client] != -1 ? "YES" : "NO");
menu.AddItem("", buffer, ITEMDRAW_DISABLED);

if (g_iBrushEntity[client] != -1)
{
{
GetEntityClassname(BrushEntityIndex[myClient][0], typent, sizeof(typent));
GetEntityClassname(g_iBrushEntity[client], buffer, sizeof(buffer));
if (StrEqual(typent, "func_nogrenades"))

Format(typent, sizeof(typent), "First detected: Nogrenade");
if (StrEqual(buffer, "func_nogrenades"))
if (StrEqual(typent, "trigger_teleport"))
{
Format(typent, sizeof(typent), "First detected: Teleport");
Format(buffer, sizeof(buffer), "First detected: Nogrenade");
}
else if (StrEqual(buffer, "trigger_teleport"))
{
Format(buffer, sizeof(buffer), "First detected: Teleport");
}
}
}
else
else
{
{
Format(typent, sizeof(typent), "First detected: ---");
Format(buffer, sizeof(buffer), "First detected: ---");
}
}
menu.AddItem("fd", typent, ITEMDRAW_DISABLED);
menu.Display(myClient, 30);


int color[4]; color[0] = 255; color[1] = 255; color[2] = 255; color[3] = 255;
menu.AddItem("", buffer, ITEMDRAW_DISABLED);
TE_SetupBeamPoints(FL_PlayerAbsPos, FL_TargetPos, sprite, halo, 0, 0, 7.0, 5.0, 5.0, 1, 0.0, color, 0);
menu.Display(client, 30);
TE_SendToClient(myClient, 0.1);

FL_PlayerTempPos = FL_PlayerAbsPos;
TE_SetupBeamPoints(playerOrigin, endPoint, g_iSpritePrecache, g_iHaloPrecache, 0, 0, 7.0, 5.0, 5.0, 1, 0.0, {255, 255, 255, 255}, 0);
FL_PlayerTempPos[2] = FL_TargetPos[2];
TE_SendToClient(client, 0.1);
TE_SetupBeamPoints(FL_TargetPos, FL_PlayerTempPos, sprite, halo, 0, 0, 7.0, 5.0, 5.0, 1, 0.0, color, 0);

TE_SendToClient(myClient, 0.1);
float temp[3];
TE_SetupBeamPoints(FL_PlayerTempPos, FL_PlayerAbsPos, sprite, halo, 0, 0, 7.0, 5.0, 5.0, 1, 0.0, color, 0);
temp[0] = playerOrigin[0];
TE_SendToClient(myClient, 0.1);
temp[1] = playerOrigin[1];
temp[2] = endPoint[2];

TE_SetupBeamPoints(endPoint, temp, g_iSpritePrecache, g_iHaloPrecache, 0, 0, 7.0, 5.0, 5.0, 1, 0.0, {255, 255, 255, 255}, 0);
TE_SendToClient(client, 0.1);

TE_SetupBeamPoints(temp, playerOrigin, g_iSpritePrecache, g_iHaloPrecache, 0, 0, 7.0, 5.0, 5.0, 1, 0.0, {255, 255, 255, 255}, 0);
TE_SendToClient(client, 0.1);


return Plugin_Handled;
return Plugin_Handled;
}
}


public Action:OnPlayerRunCmd(myClient, &myButtons, &myImpulse, Float:myVel[3], Float:myAng[3], &myWeapon)
public Action OnPlayerRunCmd(int client, int &buttons)
{
{
if(!PL_Enabled || !IsValidClient(myClient))
if (!g_bEnabled || !g_bCheckJump[client])
{
return Plugin_Continue;
return Plugin_Continue;
}


if (CJ_ENABLED[myClient])
GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", g_fVelocity[client]);
if (g_fVelocity[client][2] <= 0.0)
{
{
GetEntPropVector(myClient, Prop_Data, "m_vecAbsVelocity", FL_VelClient[myClient]);
return Plugin_Continue;
if (FL_VelClient[myClient][2] > 0.0)
}
{
static float FL_TargetPos[3];
static float FL_PlayerPos[3];
static float FL_PlayerAng[3]; FL_PlayerAng[0] = 90.0; FL_PlayerAng[1] = 0.0; FL_PlayerAng[2] = 0.0;
static float FL_TargetVec[3];
GetClientAbsOrigin(myClient, FL_PlayerPos);
Handle myTrace = TR_TraceRayFilterEx(FL_PlayerPos, FL_PlayerAng, MASK_PLAYERSOLID, RayType_Infinite, TraceFilterEntity);


if(TR_DidHit(myTrace))
float playerOrigin[3];
{
GetClientAbsOrigin(client, playerOrigin);
TR_GetEndPosition(FL_TargetPos, myTrace);
}
delete myTrace;


SubtractVectors(FL_PlayerPos, FL_TargetPos, FL_TargetVec); //Distance to the ground
Handle tr = TR_TraceRayFilterEx(playerOrigin, view_as<float>({90.0, 0.0, 0.0}), MASK_PLAYERSOLID, RayType_Infinite, TraceFilterEntity);
ClearSyncHud(myClient, HudDisplay);
float endPoint[3];
SetHudTextParams(0.65, 0.55, 5.0, 255, 255, 255, 255, 0, 0.1, 0.1, 0.1);
if (TR_DidHit(tr))
ShowSyncHudText(myClient, HudDisplay, "Your max height: %1.3f", FL_TargetVec[2]);
{
return Plugin_Continue;
TR_GetEndPosition(endPoint, tr);
}

float difference[3];
SubtractVectors(playerOrigin, endPoint, difference); //Distance to the ground

SetHudTextParams(0.65, 0.55, 5.0, 255, 255, 255, 255, 0, 0.1, 0.1, 0.1);
ShowSyncHudText(client, g_hHudSync, "Your max height: %1.3f", difference[2]);
}
}

delete tr;

return Plugin_Continue;
return Plugin_Continue;
}
}


public bool TraceFilterEntity(int myEntity, int myMask)
public bool TraceFilterEntity(int entity, int mask)
{
{
return (myEntity == 0 || myEntity > MaxClients); //0 - server console
return !entity || entity > MaxClients;
}
}


public bool DetectTrigger(int myEntity, int myClient)
public bool DetectTrigger(int entity, int client)
{
{
char myClassName[50];
char className[32];
GetEntityClassname(myEntity, myClassName, sizeof(myClassName));
GetEntityClassname(entity, className, sizeof(className));
if (StrEqual(myClassName, "trigger_teleport") || StrEqual(myClassName, "func_nogrenades"))
if (StrEqual(className, "trigger_teleport") || StrEqual(className, "func_nogrenades"))
{
{
BrushEntityIndex[myClient][0] = myEntity;
g_iBrushEntity[client] = entity;
return false;
return false;
}
}
else

{
g_iBrushEntity[client] = -1;
BrushEntityIndex[myClient][0] = -1;
return true;
return true;
}
}
}


public Action Func_SetTransmit(int entity, int myClient)
public Action Func_SetTransmit(int entity, int client)
{
{
if (!BM_ENABLED[myClient])
if (!g_bBrushMode[client])
{
{
return Plugin_Handled; //Disable trigger_teleport transmit to the client (if plugin is disabled for current player in array)
//Disable trigger_teleport transmit to the client (if plugin is disabled for current player in array)
return Plugin_Handled;
}
}

return Plugin_Continue;
return Plugin_Continue;
}
}


/////////////////////////////// <-- STOCKS --> ////////////////////////////////////////////////
/////////////////////////////// <-- STOCKS --> ////////////////////////////////////////////////


/**
#define EF_NODRAW 0x020
* Checks client validity
* @param myEntity Entity index.
* @param Replay Logical bool parameter.
*/
stock bool:IsValidClient(myClient, bool:Replay = true)
{
if(myClient <= 0 || myClient > MaxClients || !IsClientInGame(myClient))
return false;
if(Replay && (IsClientSourceTV(myClient) || IsClientReplay(myClient) || IsClientObserver(myClient)))
return false;
return true;
}


/**
/**
* Sets transmit state to the edict and flag (shows brush entity - func_nogrenades, trigger_teleport)
* Sets transmit state to the edict and flag (shows brush entity - func_nogrenades, trigger_teleport)
* @param myEntity Entity index.
* @param entity Entity index.
*/
*/
stock void ShowBrushEntity(int myEntity)
void ShowBrushEntity(int entity)
{
{
if (IsValidEdict(myEntity))
if (!IsValidEdict(entity))
{
{
int EffectFlags = GetEntData(myEntity, Offset_for_entity_effect);
return;
int EdictFlags = GetEdictFlags(myEntity);
if (myEntity != -1)
{
EffectFlags &= ~32; //EF_NODRAW flag (0x020)
EdictFlags &= ~FL_EDICT_DONTSEND; //Transmit State - Don't ever transmit.

SetEntData(myEntity, Offset_for_entity_effect, EffectFlags);
ChangeEdictState(myEntity, Offset_for_entity_effect);
SetEdictFlags(myEntity, EdictFlags);
}
}
}
SDKHook(myEntity, SDKHook_SetTransmit, Func_SetTransmit);

SetEntData(entity, g_iEffectOffset, GetEntData(entity, g_iEffectOffset) & ~EF_NODRAW);
SetEdictFlags(entity, GetEdictFlags(entity) & ~FL_EDICT_DONTSEND);

ChangeEdictState(entity, g_iEffectOffset);

SDKHook(entity, SDKHook_SetTransmit, Func_SetTransmit);
}
}


/**
/**
* Sets transmit state to the edict and flag (stops showing brush entities - func_nogrenades, trigger_teleport)
* Sets transmit state to the edict and flag (stops showing brush entities - func_nogrenades, trigger_teleport)
* @param myEntity Entity index.
* @param entity Entity index.
*/
*/
stock void StopShowBrushEntity(int myEntity)
void StopShowBrushEntity(int entity)
{
{
if (IsValidEdict(myEntity))
if (!IsValidEdict(entity))
{
{
int EffectFlags = GetEntData(myEntity, Offset_for_entity_effect);
return;
int EdictFlags = GetEdictFlags(myEntity);
if (myEntity != -1)
{
EffectFlags |= 32; //EF_NODRAW flag (0x020)
EdictFlags |= FL_EDICT_DONTSEND; //Transmit State - Don't ever transmit.

SetEntData(myEntity, Offset_for_entity_effect, EffectFlags);
ChangeEdictState(myEntity, Offset_for_entity_effect);
SetEdictFlags(myEntity, EdictFlags);
}
}
}
SDKUnhook(myEntity, SDKHook_SetTransmit, Func_SetTransmit);

SetEntData(entity, g_iEffectOffset, GetEntData(entity, g_iEffectOffset)|EF_NODRAW);
SetEdictFlags(entity, GetEdictFlags(entity)|FL_EDICT_DONTSEND);

ChangeEdictState(entity, g_iEffectOffset);

SDKUnhook(entity, SDKHook_SetTransmit, Func_SetTransmit);
}
}