major changes to trayrace and enemy target

This commit is contained in:
jenzur 2020-07-25 21:15:00 +02:00
parent 45f8a4c480
commit 019d0ae41d
2 changed files with 224 additions and 86 deletions

View File

@ -64,8 +64,7 @@ def bot_process_movement(input_line):
strInput = "-attack; wait 2; -use; wait 5; -jump; wait 5; -duck; wait 5; +attack; wait 5; cl_minmodels 1; wait 2; +use; "
if bot_stuck:
print('bot stuck')
for _ in range(2):
strInput += "+jump; wait 15; +duck; wait 15; -jump; wait 15; -duck; wait 3;"
strInput += "+jump; wait 15; +duck; wait 15; -jump; wait 15; -duck; wait 3;"
if dist_target > 2.5:
strInput += "use weapon_elite; wait 3; "
elif targeteam == 3:
@ -83,16 +82,17 @@ def bot_process_movement(input_line):
else:
ladder_counter = 0
min_distance_target_human = 2.0
min_enemy_distance = 20.0
if bot_on_type == 1:
print('bot_on_type water')
strInput += "+jump; wait 5;"
if message_counter > 10:
print('target human: ', targethuman, ' dist_target: ', dist_target, ' enemy distance: ', enemy_distance)
message_counter = 0
if enemy_distance < 0 or dist_target > min_distance_target_human or targeteam == 2:
if enemy_distance < 0 or dist_target > min_distance_target_human or enemy_distance < min_enemy_distance or targeteam == 2:
strInput += "+forward; wait 5; "
boolean_val = random.choice([True, False])
for _ in range(10):
boolean_val = random.choice([True, False])
if boolean_val:
strInput += "+moveleft; wait 15; -moveleft; "
else:

View File

@ -136,27 +136,6 @@ public Action bot_check_connect(Handle timer, any data)
return Plugin_Continue;
}
public bool TraceRayable(int client, int target)
{
float pos_client[3];
float pos_target[3];
GetClientEyePosition(client, pos_client);
GetClientEyePosition(target, pos_target);
//Handle trace = TR_TraceRayFilterEx(pos_client, pos_target, MASK_NPCSOLID, RayType_EndPoint, FilterClient, client);
Handle trace = TR_TraceRayFilterEx(pos_client, pos_target, MASK_VISIBLE, RayType_EndPoint, FilterClient, client);
if (TR_DidHit(trace))
{
if(TR_GetEntityIndex(trace) == target)
{
CloseHandle(trace);
return true;
}
}
CloseHandle(trace);
return false;
}
public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float vel[3], const float angles[3], int weapon, int subtype,
int cmdnum, int tickcount, int seed, const int mouse[2])
{
@ -226,16 +205,12 @@ public Action recursive_pressing(Handle timer, any data)
}
else
{
face_call(targethuman);
find_closest_match = is_client_stuck_or_afk(targethuman);
if (!find_closest_match)
{
int iterator_counter = 0;
while (iterator_counter < 10 && find_closest_match)
{
face_call(targethuman);
find_closest_match = TraceRayable(present, targethuman) ? false : true;
iterator_counter++;
}
face_call(targethuman);
find_closest_match = IsAbleToSee(present, targethuman) ? false : true;
if (find_closest_match)
{
float dist_target = get_power_distance(targethuman, client_old_coords[targethuman]);
@ -246,62 +221,74 @@ public Action recursive_pressing(Handle timer, any data)
bot_presumed_endpoint[1] = client_old_coords[targethuman][1];
bot_presumed_endpoint[2] = client_old_coords[targethuman][2];
find_closest_match = false;
CreateTimer(6.0, bot_reached_endpoint);
CreateTimer(4.0, bot_reached_endpoint);
}
}
}
}
}
if (find_closest_match)
//check ladder = 0, water = 1, in air(surfing) = 2 TODO
int bot_on_type = -1;
if (GetEntityMoveType(present) == MOVETYPE_LADDER)
bot_on_type = 0;
int ilevel = GetEntProp(present, Prop_Data, "m_nWaterLevel");
if (ilevel >= 2)
bot_on_type = 1;
if (find_closest_match && bot_on_type != 0)
{
targethuman = 0;
targethuman = GetClosestClient_option1(present, targeteam);
if (IsValidClient(targethuman))
}
float enemy_distance = -1.0;
int target_enemy = find_closest_enemy(present, targeteam);
bool chasing_enemy = false;
float dist_target = -1.0;
if (bot_on_type != 0 && bot_on_type != 2 && bot_presumed_endpoint[0] == 0.0)
{
float pos[3];
GetEntPropVector(targethuman, Prop_Send, "m_vecOrigin", pos);
float dist_target = get_power_distance(present, pos);
float enemy_distance = -1.0;
//check ladder = 0, water = 1, in air(surfing) = 2 TODO
int bot_on_type = -1;
if (GetEntityMoveType(present) == MOVETYPE_LADDER)
bot_on_type = 0;
int ilevel = GetEntProp(present, Prop_Data, "m_nWaterLevel");
if (ilevel >= 2)
bot_on_type = 1;
if (bot_on_type != 0 && bot_on_type != 2 && bot_presumed_endpoint[0] == 0.0)
if (IsValidClient(targethuman))
{
int target_enemy = find_closest_enemy(present, targeteam);
if (IsValidClient(target_enemy))
{
float min_distance_target_human = 2.0;
float min_enemy_distance = 100.0;
GetEntPropVector(target_enemy, Prop_Send, "m_vecOrigin", pos);
enemy_distance = get_power_distance(present, pos);
//human aiming for zombie
if (targeteam == 3 && dist_target < min_distance_target_human && enemy_distance > min_enemy_distance)
face_call(target_enemy);
//zombie aiming for human
else if (targeteam == 2 && min_distance_target_human * min_enemy_distance > enemy_distance && enemy_distance > 0)
face_call(target_enemy);
//human aiming human && zombie aiming zombie
else
face_call(targethuman);
}
else
face_call(targethuman);
if (round_start_stuck)
bot_stuck = is_bot_stuck();
GetEntPropVector(targethuman, Prop_Send, "m_vecOrigin", pos);
dist_target = get_power_distance(present, pos);
}
//TODO detect gaps and jump perfectly over them
Format(message, sizeof(message), "dist_target: %f targethuman: %N bot_on_type: %i enemy_distance: %f bot_stuck: %i targeteam: %i", dist_target, targethuman, bot_on_type, enemy_distance, bot_stuck, targeteam);
send_socket_msg(message, strlen(message));
if (IsValidClient(target_enemy))
{
float min_enemy_distance = 20.0;
GetEntPropVector(target_enemy, Prop_Send, "m_vecOrigin", pos);
enemy_distance = get_power_distance(present, pos);
float min_distance_target_human = 2.0;
//human aiming for zombie
if (targeteam == 3 && dist_target > 0 && dist_target < min_distance_target_human && enemy_distance > min_enemy_distance)
{
chasing_enemy = true;
face_call(target_enemy);
}
//zombie aiming for human
if (targeteam == 2 && min_enemy_distance * 3 > enemy_distance && enemy_distance > 0)
{
chasing_enemy = true;
face_call(target_enemy);
}
}
if (IsValidClient(targethuman) && !chasing_enemy)
face_call(targethuman);
if (round_start_stuck)
bot_stuck = is_bot_stuck();
}
//TODO detect gaps and jump perfectly over them
if (IsValidClient(targethuman))
Format(message, sizeof(message), "dist_target: %f targethuman: %N bot_on_type: %i enemy_distance: %f bot_stuck: %i targeteam: %i", dist_target, targethuman, bot_on_type, enemy_distance, bot_stuck, targeteam);
else
Format(message, sizeof(message), "dist_target: %f targethuman: none bot_on_type: %i enemy_distance: %f bot_stuck: %i targeteam: %i", dist_target, bot_on_type, enemy_distance, bot_stuck, targeteam);
send_socket_msg(message, strlen(message));
}
return Plugin_Continue;
}
public bool is_bot_stuck()
{
float min_distance_cap = 0.05;
float min_distance_cap = 0.1;
float bot_own_distance = get_power_distance(present, bot_old_coords);
bot_stuck_g = bot_own_distance < min_distance_cap;
return bot_stuck_g;
@ -337,6 +324,8 @@ stock bool IsValidClient(int client)
stock bool is_client_stuck_or_afk(int client)
{
if (!round_start_stuck)
return false;
float min_distance_cap = 0.05;
int min_cap = 15;
float client_own_distance = get_power_distance(client, client_old_coords[client]);
@ -344,6 +333,8 @@ stock bool is_client_stuck_or_afk(int client)
client_mini_stuck_counter[client]++;
else
client_mini_stuck_counter[client] = 0;
if (client == targethuman)
min_cap = min_cap * 4;
return client_mini_stuck_counter[client] > min_cap;
}
@ -359,11 +350,11 @@ public int find_closest_enemy(int entity, int targeteam)
GetEntPropVector(i, Prop_Send, "m_vecOrigin", pos);
float dist_target = get_power_distance(entity, pos);
bool traceable = false;
face_call(i);
if (TraceRayable(present, i))
if (IsAbleToSee(present, i))
traceable = true;
if (!traceable)
continue;
float trace_advantage = 2.5;
if (traceable)
dist_target = dist_target / trace_advantage;
if (is_client_stuck_or_afk(i))
continue;
if (nearestdistance < 0 || dist_target < nearestdistance)
@ -385,17 +376,16 @@ public int GetClosestClient_option1(int entity, int targeteam)
if (IsValidClient(i) && IsPlayerAlive(i) && GetClientTeam(i) == targeteam && i != present)
{
bool traceable = false;
face_call(i);
if (TraceRayable(present, i))
if (IsAbleToSee(present, i))
traceable = true;
if (is_client_stuck_or_afk(i))
continue;
if (admins[i])
if (admins[i] && traceable)
{
adminpresent = true;
vippresent = false;
}
else if (vips[i] && !adminpresent)
else if (vips[i] && !adminpresent && traceable)
{
vippresent = true;
}
@ -411,9 +401,10 @@ public int GetClosestClient_option1(int entity, int targeteam)
}
float pos[3];
GetEntPropVector(i, Prop_Send, "m_vecOrigin", pos);
float trace_advantage = 2.5;
float dist_target = get_power_distance(entity, pos);
if (!traceable)
continue;
if (traceable)
dist_target = dist_target / trace_advantage;
if (nearestdistance < 0 || dist_target < nearestdistance)
{
nearest = i;
@ -435,11 +426,6 @@ public float get_power_distance(int target_player, float [3]pos)
return power_distance / defaultcap;
}
public bool FilterClient(int entity, int contentsMask, int client)
{
return (entity != client && 1 <= client <= MaxClients || !IsClientInGame(client));
}
public void OnClientPostAdminCheck(int client)
{
//STEAM_0:1:34783317
@ -528,4 +514,156 @@ public Action TimerConnect(Handle timer, any arg)
{
connect(arg);
return Plugin_Handled;
}
public bool IsAbleToSee(int entity, int client)
{
float vecorigin[3];
float vecEyePos[3];
GetClientAbsOrigin(entity, vecorigin);
GetClientEyePosition(client, vecEyePos);
// Check if centre is visible.
if (IsPointVisible(vecEyePos, vecorigin))
return true;
float vecEyePos_ent[3];
float vecEyeAng[3];
GetClientEyeAngles(entity, vecEyeAng);
GetClientEyePosition(entity, vecEyePos_ent);
// Check if weapon tip is visible.
if (IsFwdVecVisible(vecEyePos, vecEyeAng, vecEyePos_ent))
return true;
float mins[3];
float maxs[3];
GetClientMins(client, mins);
GetClientMaxs(client, maxs);
// Check outer 4 corners of player.
if (IsRectangleVisible(vecEyePos, vecorigin, mins, maxs, 1.30))
return true;
// Check inner 4 corners of player.
if (IsRectangleVisible(vecEyePos, vecorigin, mins, maxs, 0.65))
return true;
return false;
}
public bool Filter_NoPlayers(int entity, int mask)
{
return (entity > MaxClients && !(0 < GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity") <= MaxClients));
}
public bool IsPointVisible(const float start[3], const float end[3])
{
TR_TraceRayFilter(start, end, MASK_VISIBLE, RayType_EndPoint, Filter_NoPlayers);
return TR_GetFraction() == 1.0;
}
public bool IsFwdVecVisible(const float start[3], const float angles[3], const float end[3])
{
float fwd[3];
GetAngleVectors(angles, fwd, NULL_VECTOR, NULL_VECTOR);
ScaleVector(fwd, 50.0);
AddVectors(end, fwd, fwd);
return IsPointVisible(start, fwd);
}
public bool IsRectangleVisible(const float start[3], const float end[3], const float mins[3], const float maxs[3], float scale)
{
float ZpozOffset = maxs[2];
float ZnegOffset = mins[2];
float WideOffset = ((maxs[0] - mins[0]) + (maxs[1] - mins[1])) / 4.0;
// This rectangle is just a point!
if (ZpozOffset == 0.0 && ZnegOffset == 0.0 && WideOffset == 0.0)
return IsPointVisible(start, end);
// Adjust to scale.
ZpozOffset *= scale;
ZnegOffset *= scale;
WideOffset *= scale;
// Prepare rotation matrix.
float angles[3];
float fwd[3];
float right[3];
SubtractVectors(start, end, fwd);
NormalizeVector(fwd, fwd);
GetVectorAngles(fwd, angles);
GetAngleVectors(angles, fwd, right, NULL_VECTOR);
float vRectangle[4][3];
float vTemp[3];
// If the player is on the same level as us, we can optimize by only rotating on the z-axis.
if (FloatAbs(fwd[2]) <= 0.7071)
{
ScaleVector(right, WideOffset);
// Corner 1, 2
vTemp = end;
vTemp[2] += ZpozOffset;
AddVectors(vTemp, right, vRectangle[0]);
SubtractVectors(vTemp, right, vRectangle[1]);
// Corner 3, 4
vTemp = end;
vTemp[2] += ZnegOffset;
AddVectors(vTemp, right, vRectangle[2]);
SubtractVectors(vTemp, right, vRectangle[3]);
}
else if (fwd[2] > 0.0) // Player is below us.
{
fwd[2] = 0.0;
NormalizeVector(fwd, fwd);
ScaleVector(fwd, scale);
ScaleVector(fwd, WideOffset);
ScaleVector(right, WideOffset);
// Corner 1
vTemp = end;
vTemp[2] += ZpozOffset;
AddVectors(vTemp, right, vTemp);
SubtractVectors(vTemp, fwd, vRectangle[0]);
// Corner 2
vTemp = end;
vTemp[2] += ZpozOffset;
SubtractVectors(vTemp, right, vTemp);
SubtractVectors(vTemp, fwd, vRectangle[1]);
// Corner 3
vTemp = end;
vTemp[2] += ZnegOffset;
AddVectors(vTemp, right, vTemp);
AddVectors(vTemp, fwd, vRectangle[2]);
// Corner 4
vTemp = end;
vTemp[2] += ZnegOffset;
SubtractVectors(vTemp, right, vTemp);
AddVectors(vTemp, fwd, vRectangle[3]);
}
else // Player is above us.
{
fwd[2] = 0.0;
NormalizeVector(fwd, fwd);
ScaleVector(fwd, scale);
ScaleVector(fwd, WideOffset);
ScaleVector(right, WideOffset);
// Corner 1
vTemp = end;
vTemp[2] += ZpozOffset;
AddVectors(vTemp, right, vTemp);
AddVectors(vTemp, fwd, vRectangle[0]);
// Corner 2
vTemp = end;
vTemp[2] += ZpozOffset;
SubtractVectors(vTemp, right, vTemp);
AddVectors(vTemp, fwd, vRectangle[1]);
// Corner 3
vTemp = end;
vTemp[2] += ZnegOffset;
AddVectors(vTemp, right, vTemp);
SubtractVectors(vTemp, fwd, vRectangle[2]);
// Corner 4
vTemp = end;
vTemp[2] += ZnegOffset;
SubtractVectors(vTemp, right, vTemp);
SubtractVectors(vTemp, fwd, vRectangle[3]);
}
// Run traces on all corners.
for (new i = 0; i < 4; i++)
if (IsPointVisible(start, vRectangle[i]))
return true;
return false;
}