// smooth teleport in eye view direction (with collision)
//
stock bool TeleportPlayerSmooth(int client, float distance, float jump_power = 251.0)
{
static float angle[3], dir[3], current[3], resulting[3], vecOrigin[3], vecTarget[3];
static int iVelocity = 0;
if (iVelocity == 0)
iVelocity = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]");
//GetEntPropVector(client, Prop_Send, "m_vecVelocity", current);
int iNear = GetNearestClient(client, -1);
if (iNear != 0) {
GetClientAbsOrigin(client, vecOrigin);
GetClientAbsOrigin(iNear, vecTarget);
GetVectorOrigins(vecOrigin, vecTarget, angle);
TeleportEntity(client, NULL_VECTOR, angle, NULL_VECTOR);
}
GetClientEyeAngles(client, angle);
//dir[0] = Cosine(DegToRad(angle[1])) * distance;
//dir[1] = Sine(DegToRad(angle[1])) * distance;
GetAngleVectors(angle, dir, NULL_VECTOR, NULL_VECTOR);
ScaleVector(dir, distance);
GetEntDataVector(client, iVelocity, current);
resulting[0] = current[0] + dir[0];
resulting[1] = current[1] + dir[1];
resulting[2] = jump_power; // min. 251
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, resulting);
return true;
}
int GetNearestClient(int client, int team) {
float tpos[3], spos[3], dist, mindist;
int i, iNear;
mindist = 0.0;
iNear = -1;
GetClientAbsOrigin(client, tpos);
for (i = 1; i <= MaxClients; i++) {
if (i != client && IsClientInGame(i) && (GetClientTeam(i) == team || (team == -1 && GetClientTeam(i) != 1)) && IsPlayerAlive(i)) {
GetClientAbsOrigin(i, spos);
dist = GetVectorDistance(tpos, spos, false);
if (dist < mindist || mindist == 0.0) {
mindist = dist;
iNear = i;
}
}
}
return iNear;
}