moved tracehull and setting angles out of timer and into onruncmd forward. this prevents having to use teleportentity
This commit is contained in:
parent
c68107be34
commit
a049ed7f9a
@ -122,11 +122,115 @@ public MRESReturn OnGetRunCmdPre(int entity, Handle hReturn)
|
|||||||
return MRES_Ignored;
|
return MRES_Ignored;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void get_new_angles(int client, int target, float angles[3])
|
||||||
|
{
|
||||||
|
float TargetPos[3];
|
||||||
|
float ClientPos[3];
|
||||||
|
float Result[3];
|
||||||
|
GetClientEyePosition(target, TargetPos);
|
||||||
|
GetClientEyePosition(client, ClientPos);
|
||||||
|
MakeVectorFromPoints(ClientPos, TargetPos, Result);
|
||||||
|
GetVectorAngles(Result, Result);
|
||||||
|
angles[0] = Result[0];
|
||||||
|
angles[1] = Result[1];
|
||||||
|
angles[2] = Result[2];
|
||||||
|
}
|
||||||
|
|
||||||
public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3], float angles[3], int& weapon, int& subtype, int& cmdnum, int& tickcount, int& seed, int mouse[2])
|
public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3], float angles[3], int& weapon, int& subtype, int& cmdnum, int& tickcount, int& seed, int mouse[2])
|
||||||
{
|
{
|
||||||
//we use info we just got from OnPlayerRunCmdPre to determine if to jump
|
//we use info we just got from OnPlayerRunCmdPre to determine if to jump
|
||||||
if (!IsValidClient(client) || !IsPlayerAlive(client) || !is_bot_player[client]) return Plugin_Continue;
|
if (!IsValidClient(client) || !IsPlayerAlive(client) || !is_bot_player[client]) return Plugin_Continue;
|
||||||
|
|
||||||
|
//2023 october: the new place to set angles for the client instead of using face_call, through this is teleporting avoided which can trigger trigger_multiples
|
||||||
|
if (!bot_follow_tp[client])
|
||||||
|
{
|
||||||
|
int targeteam = 0;
|
||||||
|
if (GetClientTeam(client) != 3)
|
||||||
|
{
|
||||||
|
//2 = autismo is zm and should follow enemies sometimes
|
||||||
|
targeteam = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//3 = autismo is human and should follow closest moving ct
|
||||||
|
targeteam = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool found_enemy = false;
|
||||||
|
for (int clienti = 1; clienti <= MaxClients; clienti++)
|
||||||
|
{
|
||||||
|
if (!IsValidClient(clienti)) continue;
|
||||||
|
if (GetClientTeam(clienti) == 2 && IsPlayerAlive(clienti))
|
||||||
|
{
|
||||||
|
found_enemy = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float pos[3];
|
||||||
|
float dist_target = -1.0;
|
||||||
|
if (IsValidClient(target_friend[client]))
|
||||||
|
{
|
||||||
|
GetEntPropVector(target_friend[client], Prop_Send, "m_vecOrigin", pos);
|
||||||
|
dist_target = get_power_distance(client, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
float max_range_dist = 65.0;
|
||||||
|
//here we put into consideration if the human is leaving or standing around. If the bots already catched up to the human they can have a larger distance between the player and themselves so they dont constantly follow him. If the player is leaving the bots needs to follow him much closer.
|
||||||
|
if (targeteam == 3 && human_too_close[client])
|
||||||
|
{
|
||||||
|
max_range_dist = 200.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float enemy_distance = -1.0;
|
||||||
|
if (IsValidClient(target_enemy[client]))
|
||||||
|
{
|
||||||
|
GetEntPropVector(target_enemy[client], Prop_Send, "m_vecOrigin", pos);
|
||||||
|
enemy_distance = get_power_distance(client, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (GetEntityMoveType(client) == MOVETYPE_LADDER || (IsValidClient(target_friend[client]) && GetEntityMoveType(target_friend[client]) == MOVETYPE_LADDER))
|
||||||
|
{
|
||||||
|
if (IsValidClient(target_friend[client]))
|
||||||
|
{
|
||||||
|
get_new_angles(client, target_friend[client], angles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//if bot is ct: is close enough to friend, can stop following friend and focus on shooting zombies
|
||||||
|
else if (targeteam == 3 && 0 < dist_target < max_range_dist && IsValidClient(target_enemy[client]))
|
||||||
|
{
|
||||||
|
get_new_angles(client, target_enemy[client], angles);
|
||||||
|
}
|
||||||
|
//if bot is ct: if bot is not close enough to friend follow him, //dist_target being larger than max_range_dist means a friend was found to follow
|
||||||
|
//we also check if zm already spawned, if not then stay close to friend
|
||||||
|
else if ((targeteam == 3 && dist_target > max_range_dist) || !found_enemy)
|
||||||
|
{
|
||||||
|
get_new_angles(client, target_friend[client], angles);
|
||||||
|
}
|
||||||
|
//if bot is zm follow enemy sometimes
|
||||||
|
else if (targeteam == 2 && 0 < enemy_distance < max_range_dist * 5 && IsValidClient(target_enemy[client]))
|
||||||
|
{
|
||||||
|
get_new_angles(client, target_enemy[client], angles);
|
||||||
|
}
|
||||||
|
//if bot is zm just follow the closest friend zm, but not constantly when too close because people start bitching then
|
||||||
|
else if (targeteam == 2 && dist_target > max_range_dist / 2)
|
||||||
|
{
|
||||||
|
get_new_angles(client, target_friend[client], angles);
|
||||||
|
}
|
||||||
|
//if bot is zm and no close enemies and no friends far away enough to follow then check if friend is close, if its the case then do nothing
|
||||||
|
else if (targeteam == 2 && 0 < dist_target < max_range_dist / 2)
|
||||||
|
{
|
||||||
|
get_new_angles(client, target_friend[client], angles);
|
||||||
|
}
|
||||||
|
//if bot is zm and there are no friends close or far away but there is also no enemy close check if there is an enemy far away
|
||||||
|
else if (targeteam == 2 && IsValidClient(target_enemy[client]))
|
||||||
|
{
|
||||||
|
get_new_angles(client, target_enemy[client], angles);
|
||||||
|
}
|
||||||
|
if (GetEntProp(client, Prop_Data, "m_nWaterLevel") == 0 && GetEntityMoveType(client) != MOVETYPE_LADDER)
|
||||||
|
trace_hulling_bot(client);
|
||||||
|
}
|
||||||
|
|
||||||
if ((GetEntityMoveType(client) & MOVETYPE_LADDER))
|
if ((GetEntityMoveType(client) & MOVETYPE_LADDER))
|
||||||
{
|
{
|
||||||
has_to_jump_bots[client] = 2;
|
has_to_jump_bots[client] = 2;
|
||||||
@ -152,7 +256,6 @@ public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3
|
|||||||
//this check accomedates checking for if the bot actually was teleported by the map because then he should not teleport back again to coords_run_cmd
|
//this check accomedates checking for if the bot actually was teleported by the map because then he should not teleport back again to coords_run_cmd
|
||||||
//the famous voodoo incidents that people have seen.
|
//the famous voodoo incidents that people have seen.
|
||||||
float distance_bot_current_position_last_position = get_power_distance(client, coords_run_cmd[client]);
|
float distance_bot_current_position_last_position = get_power_distance(client, coords_run_cmd[client]);
|
||||||
//PrintToChatAll("distance_bot_current_position_last_position: %f %N", distance_bot_current_position_last_position, client);
|
|
||||||
|
|
||||||
if (distance_bot_current_position_last_position > 500.0)
|
if (distance_bot_current_position_last_position > 500.0)
|
||||||
{
|
{
|
||||||
@ -570,17 +673,12 @@ public Action recursive_pressing(Handle timer, any data)
|
|||||||
//if the bot or its target is on the ladder just use forward to reach the ladder
|
//if the bot or its target is on the ladder just use forward to reach the ladder
|
||||||
else if (GetEntityMoveType(client) == MOVETYPE_LADDER || (IsValidClient(target_friend[client]) && GetEntityMoveType(target_friend[client]) == MOVETYPE_LADDER))
|
else if (GetEntityMoveType(client) == MOVETYPE_LADDER || (IsValidClient(target_friend[client]) && GetEntityMoveType(target_friend[client]) == MOVETYPE_LADDER))
|
||||||
{
|
{
|
||||||
if (IsValidClient(target_friend[client]))
|
|
||||||
{
|
|
||||||
face_call(target_friend[client], client);
|
|
||||||
}
|
|
||||||
state = 8;
|
state = 8;
|
||||||
}
|
}
|
||||||
//if bot is ct: is close enough to friend, can stop following friend and focus on shooting zombies
|
//if bot is ct: is close enough to friend, can stop following friend and focus on shooting zombies
|
||||||
else if (targeteam == 3 && 0 < dist_target < max_range_dist && IsValidClient(target_enemy[client]))
|
else if (targeteam == 3 && 0 < dist_target < max_range_dist && IsValidClient(target_enemy[client]))
|
||||||
{
|
{
|
||||||
human_too_close[client] = true;
|
human_too_close[client] = true;
|
||||||
face_call(target_enemy[client], client);
|
|
||||||
state = 0;
|
state = 0;
|
||||||
}
|
}
|
||||||
//if bot is ct: if bot is not close enough to friend follow him, //dist_target being larger than max_range_dist means a friend was found to follow
|
//if bot is ct: if bot is not close enough to friend follow him, //dist_target being larger than max_range_dist means a friend was found to follow
|
||||||
@ -588,7 +686,6 @@ public Action recursive_pressing(Handle timer, any data)
|
|||||||
else if ((targeteam == 3 && dist_target > max_range_dist) || !found_enemy)
|
else if ((targeteam == 3 && dist_target > max_range_dist) || !found_enemy)
|
||||||
{
|
{
|
||||||
human_too_close[client] = false;
|
human_too_close[client] = false;
|
||||||
face_call(target_friend[client], client);
|
|
||||||
state = 1;
|
state = 1;
|
||||||
}
|
}
|
||||||
//if bot is ct and close enough to friend then just do nothing in case of there being no enemy to shoot at.
|
//if bot is ct and close enough to friend then just do nothing in case of there being no enemy to shoot at.
|
||||||
@ -600,25 +697,21 @@ public Action recursive_pressing(Handle timer, any data)
|
|||||||
//if bot is zm follow enemy sometimes
|
//if bot is zm follow enemy sometimes
|
||||||
else if (targeteam == 2 && 0 < enemy_distance < max_range_dist * 5 && IsValidClient(target_enemy[client]))
|
else if (targeteam == 2 && 0 < enemy_distance < max_range_dist * 5 && IsValidClient(target_enemy[client]))
|
||||||
{
|
{
|
||||||
face_call(target_enemy[client], client);
|
|
||||||
state = 3;
|
state = 3;
|
||||||
}
|
}
|
||||||
//if bot is zm just follow the closest friend zm, but not constantly when too close because people start bitching then
|
//if bot is zm just follow the closest friend zm, but not constantly when too close because people start bitching then
|
||||||
else if (targeteam == 2 && dist_target > max_range_dist / 2)
|
else if (targeteam == 2 && dist_target > max_range_dist / 2)
|
||||||
{
|
{
|
||||||
face_call(target_friend[client], client);
|
|
||||||
state = 4;
|
state = 4;
|
||||||
}
|
}
|
||||||
//if bot is zm and no close enemies and no friends far away enough to follow then check if friend is close, if its the case then do nothing
|
//if bot is zm and no close enemies and no friends far away enough to follow then check if friend is close, if its the case then do nothing
|
||||||
else if (targeteam == 2 && 0 < dist_target < max_range_dist / 2)
|
else if (targeteam == 2 && 0 < dist_target < max_range_dist / 2)
|
||||||
{
|
{
|
||||||
face_call(target_friend[client], client);
|
|
||||||
state = 5;
|
state = 5;
|
||||||
}
|
}
|
||||||
//if bot is zm and there are no friends close or far away but there is also no enemy close check if there is an enemy far away
|
//if bot is zm and there are no friends close or far away but there is also no enemy close check if there is an enemy far away
|
||||||
else if (targeteam == 2 && IsValidClient(target_enemy[client]))
|
else if (targeteam == 2 && IsValidClient(target_enemy[client]))
|
||||||
{
|
{
|
||||||
face_call(target_enemy[client], client);
|
|
||||||
state = 6;
|
state = 6;
|
||||||
}
|
}
|
||||||
//else nothing to do as zm
|
//else nothing to do as zm
|
||||||
@ -626,8 +719,6 @@ public Action recursive_pressing(Handle timer, any data)
|
|||||||
{
|
{
|
||||||
state = 7;
|
state = 7;
|
||||||
}
|
}
|
||||||
if (GetEntProp(client, Prop_Data, "m_nWaterLevel") == 0 && GetEntityMoveType(client) != MOVETYPE_LADDER)
|
|
||||||
trace_hulling_bot(client);
|
|
||||||
char message[generic_length * 7];
|
char message[generic_length * 7];
|
||||||
Format(message, sizeof(message), "dist_target: %f enemy_distance: %f targeteam: %i state: %i", dist_target, enemy_distance, targeteam, state);
|
Format(message, sizeof(message), "dist_target: %f enemy_distance: %f targeteam: %i state: %i", dist_target, enemy_distance, targeteam, state);
|
||||||
if (specific_bot_player[client] == 1)
|
if (specific_bot_player[client] == 1)
|
||||||
@ -861,27 +952,6 @@ public bool TraceRayDontHitSelf(int entity, int mask, any data)
|
|||||||
return entity != data && !(0 < entity <= MaxClients);
|
return entity != data && !(0 < entity <= MaxClients);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void face_call(int client, int selfclient)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < 5; j++)
|
|
||||||
faceclient(client, selfclient);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void faceclient(int target_human, int client)
|
|
||||||
{
|
|
||||||
if (IsValidClient(client) && IsValidClient(target_human))
|
|
||||||
{
|
|
||||||
float TargetPos[3];
|
|
||||||
float ClientPos[3];
|
|
||||||
float Result[3];
|
|
||||||
GetClientEyePosition(target_human, TargetPos);
|
|
||||||
GetClientEyePosition(client, ClientPos);
|
|
||||||
MakeVectorFromPoints(ClientPos, TargetPos, Result);
|
|
||||||
GetVectorAngles(Result, Result);
|
|
||||||
TeleportEntity(client, NULL_VECTOR, Result, NULL_VECTOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stock bool IsValidClient(int client)
|
stock bool IsValidClient(int client)
|
||||||
{
|
{
|
||||||
if (client > 0 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client))
|
if (client > 0 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client))
|
||||||
|
Loading…
Reference in New Issue
Block a user