improved player following significiantly again

This commit is contained in:
christian 2021-12-14 21:01:39 +01:00
parent 90c83dedb8
commit 1b90d90d4b

View File

@ -13,8 +13,8 @@
#include <cstrike>
#include <socket>
int target_human_afk_counter[MAXPLAYERS + 1];
int targethuman[MAXPLAYERS + 1];
int target_friend_afk_counter[MAXPLAYERS + 1];
int target_friend[MAXPLAYERS + 1];
int target_enemy[MAXPLAYERS + 1];
int buttons_old[MAXPLAYERS + 1];
int flags_old[MAXPLAYERS + 1];
@ -47,7 +47,7 @@ public void OnPluginStart()
for (int i = 1; i <= MaxClients; i++)
if (IsValidClient(i))
{
targethuman[i] = 0;
target_friend[i] = 0;
target_enemy[i] = 0;
reset_target_human_tp_coord(i);
OnClientPostAdminCheck(i);
@ -81,7 +81,7 @@ public void trigger_teleport(const char[] output, int entity_index, int client,
for (int i = 1; i <= MaxClients; i++)
if (IsValidClient(i))
{
if (targethuman[i] == client)
if (target_friend[i] == client)
{
GetEntPropVector(client, Prop_Send, "m_vecOrigin", targethuman_teleported[i]);
CreateTimer(6.0, reset_target_tp, client);
@ -98,7 +98,7 @@ public void Trigger_Multiple(const char[] output, int entity_index, int client,
for (int i = 1; i <= MaxClients; i++)
if (IsValidClient(i))
{
if (targethuman[i] == client)
if (target_friend[i] == client)
{
GetEntPropVector(client, Prop_Send, "m_vecOrigin", targethuman_teleported[i]);
CreateTimer(6.0, reset_target_tp, client);
@ -277,7 +277,7 @@ public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast
for (int i = 1; i <= MaxClients; i++)
if (IsValidClient(i) && !IsFakeClient(i))
{
targethuman[i] = 0;
target_friend[i] = 0;
target_enemy[i] = 0;
reset_target_human_tp_coord(i);
}
@ -316,11 +316,6 @@ public Action bot_check_connect(Handle timer, any data)
for (int i = 1; i <= MaxClients; i++)
if (IsValidClient(i) && !IsFakeClient(i))
{
//OnClientPostAdminCheck and OnClientAuthorized forwards wont trigger on the gg server after mapchanges/reconnects, welp
if (CheckCommandAccess(i, "sm_kick", ADMFLAG_KICK))
admins[i] = true;
else if (CheckCommandAccess(i, "sm_reserved", ADMFLAG_RESERVATION))
vips[i] = true;
if (client_count > 60)
{
found_bot1 = true;
@ -379,25 +374,21 @@ public Action bot_check_connect(Handle timer, any data)
{
send_socket_msg(msg, strlen(msg), ports[0]);
found_bot1 = true;
CreateTimer(1.0, respawn_bot, i);
}
if (is_autism_bot2(i))
{
send_socket_msg(msg, strlen(msg), ports[1]);
found_bot2 = true;
CreateTimer(1.0, respawn_bot, i);
}
if (is_autism_bot3(i))
{
send_socket_msg(msg, strlen(msg), ports[2]);
found_bot3 = true;
CreateTimer(1.0, respawn_bot, i);
}
if (is_autism_bot4(i))
{
send_socket_msg(msg, strlen(msg), ports[3]);
found_bot4 = true;
CreateTimer(1.0, respawn_bot, i);
}
}
}
@ -525,12 +516,6 @@ public bool is_bot_player(int client)
public Action recursive_pressing(Handle timer, any data)
{
int i_port = GetConVarInt(FindConVar("hostport"));
bool is_host_ze = false;
if (i_port == server_ports[0])
{
is_host_ze = true;
}
bool found_valid_ct = false;
for (int client = 1; client <= MaxClients; client++)
{
@ -539,40 +524,13 @@ public Action recursive_pressing(Handle timer, any data)
{
found_valid_ct = true;
}
if (is_bot_player(client))
{
if (GetClientTeam(client) == 1 || GetClientTeam(client) == 0)
{
if (is_host_ze)
{
ChangeClientTeam(client, 2);
}
else
{
int T_client_count = 0;
int CT_client_count = 0;
for (int clientI = 1; clientI <= MaxClients; clientI++)
{
if (!IsValidClient(clientI)) continue;
if (GetClientTeam(clientI) == 2)
{
T_client_count++;
}
else if (GetClientTeam(clientI) == 3)
{
CT_client_count++;
}
}
if (T_client_count > CT_client_count)
{
ChangeClientTeam(client, 3);
}
else
{
ChangeClientTeam(client, 2);
}
}
continue;
ChangeClientTeam(client, 2);
continue;
}
if (bot_avoid_edge[client] >= 3)
bot_avoid_edge[client] = -1;
@ -608,13 +566,13 @@ public Action recursive_pressing(Handle timer, any data)
}
//no target in water somehow
target_enemy[client] = GetClosestClient_option1(false, client);
targethuman[client] = GetClosestClient_option1(true, client);
target_friend[client] = GetClosestClient_option1(true, client);
float enemy_distance = -1.0;
float dist_target = -1.0;
float pos[3];
if (IsValidClient(targethuman[client]))
if (IsValidClient(target_friend[client]))
{
GetEntPropVector(targethuman[client], Prop_Send, "m_vecOrigin", pos);
GetEntPropVector(target_friend[client], Prop_Send, "m_vecOrigin", pos);
dist_target = get_power_distance(client, pos);
}
if (IsValidClient(target_enemy[client]))
@ -622,24 +580,17 @@ public Action recursive_pressing(Handle timer, any data)
GetEntPropVector(target_enemy[client], Prop_Send, "m_vecOrigin", pos);
enemy_distance = get_power_distance(client, pos);
}
if ((750 > enemy_distance > 0 && enemy_distance > dist_target && targeteam == 2) || dist_target < 0 < enemy_distance)
if (IsValidClient(target_friend[client]))
face_call(target_friend[client], client);
else if (IsValidClient(target_enemy[client]) && !admins[target_enemy[client]] && !vips[target_enemy[client]])
{
/*
float feet_origin[3], enemy_feet_origin[3];
GetClientAbsOrigin(client, feet_origin);
GetClientAbsOrigin(target_enemy[client], enemy_feet_origin);
if (feet_origin[2] + 100 > enemy_feet_origin[2])
*/
face_call(target_enemy[client], client);
}
else if (IsValidClient(targethuman[client]))
face_call(targethuman[client], client);
//might prevent bot from jumping off ladders
if (GetEntProp(client, Prop_Data, "m_nWaterLevel") <= 2 && GetEntityMoveType(client) != MOVETYPE_LADDER)
trace_hulling_bot(client);
char message[generic_length * 7];
if (IsValidClient(targethuman[client]))
Format(message, sizeof(message), "dist_target: %f targethuman: %N enemy_distance: %f targeteam: %i", dist_target, targethuman[client], enemy_distance, targeteam);
if (IsValidClient(target_friend[client]))
Format(message, sizeof(message), "dist_target: %f targethuman: %N enemy_distance: %f targeteam: %i", dist_target, target_friend[client], enemy_distance, targeteam);
else
Format(message, sizeof(message), "dist_target: %f targethuman: none enemy_distance: %f targeteam: %i", dist_target, enemy_distance, targeteam);
if (IsValidClient(target_enemy[client]))
@ -875,15 +826,17 @@ stock bool IsValidClient(int client)
stock bool is_client_stuck_or_afk(int client)
{
float min_distance_cap = 1.0;
float client_own_distance = get_power_distance(client, client_old_coords[client]);
GetEntPropVector(client, Prop_Send, "m_vecOrigin", client_old_coords[client]);
return client_own_distance < min_distance_cap;
}
public bool check_client_team(int client, int i, bool finding_friend)
{
return (finding_friend && GetClientTeam(client) == GetClientTeam(i)) || (!finding_friend && GetClientTeam(client) != GetClientTeam(i));
//can trigger between 6-8 times per second
target_friend_afk_counter[client]++;
if (target_friend_afk_counter[client] > 24)
{
target_friend_afk_counter[client] = 0;
float min_distance_cap = 1.0;
float client_own_distance = get_power_distance(client, client_old_coords[client]);
GetEntPropVector(client, Prop_Send, "m_vecOrigin", client_old_coords[client]);
return client_own_distance < min_distance_cap;
}
return false;
}
public int GetClosestClient_option1(bool finding_friend, int client)
@ -892,39 +845,21 @@ public int GetClosestClient_option1(bool finding_friend, int client)
int nearest = -1;
if (GetEntityMoveType(client) == MOVETYPE_LADDER)
return nearest;
//are there other players than bots to follow
bool other_players_than_bots = false;
for (int i = 1; i <= MaxClients; i++)
if (IsValidClient(i) && IsPlayerAlive(i) && i != client && !is_bot_player(i) && IsAbleToSee(client, i) && check_client_team(client, i, finding_friend))
{
other_players_than_bots = true;
break;
}
for (int i = 1; i <= MaxClients; i++)
if (IsValidClient(i) && IsPlayerAlive(i) && i != client && (!other_players_than_bots || !is_bot_player(i)) && check_client_team(client, i, finding_friend))
if (IsValidClient(i) && IsPlayerAlive(i) && i != client && !is_bot_player(i))
{
if (!IsAbleToSee(client, i))
continue;
if (is_client_stuck_or_afk(i))
if (!IsAbleToSee(client, i) || is_client_stuck_or_afk(i))
{
if (i != targethuman[client])
continue;
target_human_afk_counter[client]++;
int afk_cap = 4;
if (target_human_afk_counter[client] > afk_cap)
{
target_human_afk_counter[client] = 0;
continue;
}
continue;
}
float pos[3];
GetEntPropVector(i, Prop_Send, "m_vecOrigin", pos);
float dist_target = get_power_distance(client, pos);
if (GetClientTeam(i) != GetClientTeam(client) && (admins[i] || vips[i]))
if ((finding_friend && GetClientTeam(i) != GetClientTeam(client)) || (!finding_friend && GetClientTeam(i) == GetClientTeam(client)))
{
continue;
}
if ((admins[i] || vips[i] || i == targethuman[client]))
if ((admins[i] || vips[i] || i == target_friend[client]))
dist_target /= 5;
if (nearestdistance < 0 || dist_target < nearestdistance)
{
@ -942,17 +877,9 @@ public float get_power_distance(int target_player, float [3]pos)
return GetVectorDistance(vec, pos);
}
public Action respawn_bot(Handle timer, int client)
{
if (IsValidClient(client) && is_bot_player(client) && !IsPlayerAlive(client) && GetClientTeam(client) > 1)
{
CS_RespawnPlayer(client);
}
}
public void OnClientPostAdminCheck(int client)
{
target_human_afk_counter[client] = 0;
target_friend_afk_counter[client] = 0;
bot_avoid_edge[client] = -1;
char auth[64];
GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth));
@ -961,22 +888,18 @@ public void OnClientPostAdminCheck(int client)
if (is_autism_bot1(client))
{
send_socket_msg(msg, strlen(msg), ports[0]);
CreateTimer(10.0, respawn_bot, client);
}
if (is_autism_bot2(client))
{
send_socket_msg(msg, strlen(msg), ports[1]);
CreateTimer(10.0, respawn_bot, client);
}
if (is_autism_bot3(client))
{
send_socket_msg(msg, strlen(msg), ports[2]);
CreateTimer(10.0, respawn_bot, client);
}
if (is_autism_bot4(client))
{
send_socket_msg(msg, strlen(msg), ports[3]);
CreateTimer(10.0, respawn_bot, client);
}
if (CheckCommandAccess(client, "sm_kick", ADMFLAG_KICK))
admins[client] = true;
@ -987,15 +910,6 @@ public void OnClientPostAdminCheck(int client)
client_old_coords[client][2] = 0.0;
}
//this feels pretty fucking autistic why cant the forward just trigger, am i retarded?
public void OnClientAuthorized(int client, const char[] auth)
{
if (IsValidClient(client))
{
OnClientPostAdminCheck(client);
}
}
public void OnSocketError(Handle socket, const int errorType, const int errorNum, any args)
{
CloseHandle(socket);
@ -1033,7 +947,7 @@ public void OnClientDisconnect(int client)
client_old_coords[client][0] = 0.0;
client_old_coords[client][1] = 0.0;
client_old_coords[client][2] = 0.0;
target_human_afk_counter[client] = 0;
target_friend_afk_counter[client] = 0;
}
//Socket callback
@ -1080,10 +994,10 @@ public bool IsAbleToSee(int entity, int client)
GetClientMins(client, mins);
GetClientMaxs(client, maxs);
// Check outer 4 corners of player.
if (IsRectangleVisible(vecEyePos, vecorigin, mins, maxs, 1.30))
if (IsRectangleVisible(vecEyePos, vecorigin, mins, maxs, 1.30)) //1.30
return true;
// Check inner 4 corners of player.
if (IsRectangleVisible(vecEyePos, vecorigin, mins, maxs, 0.65))
if (IsRectangleVisible(vecEyePos, vecorigin, mins, maxs, 0.65)) //0.65
return true;
return false;
}