updated how to prioritize targets, updated teleport targeting, updated water level movement and ladder movement, updated connection, updated hulltracing for walls, still missing more edge detection, added states to define possible bot behaviour
This commit is contained in:
parent
614de777f3
commit
007ecbec7e
@ -54,6 +54,8 @@ def bot_process_movement(input_line):
|
||||
strInput += "wait 2; use weapon_elite; wait 3; +forward; wait 2;"
|
||||
elif state == 2:
|
||||
strInput += "-forward; wait 2; use weapon_elite; wait 3;"
|
||||
elif state == 8:
|
||||
strInput += "use weapon_knife; wait 5; +forward; wait 2;"
|
||||
|
||||
print('dist_target: ', dist_target, ' enemy distance: ', enemy_distance, ' targetteam: ', targeteam, ' state:', state)
|
||||
if state not in [0, 2, 5, 7, 8]:
|
||||
@ -127,15 +129,16 @@ def launch_css_process():
|
||||
subprocess.getoutput([f"/home/{whoami}/.steam/debian-installation/steam.sh -applaunch 240 -textmode -novid -nosound -noipx -nojoy -noshaderapi -port {data_ports['steam_port']}"])
|
||||
print('finished starting game')
|
||||
|
||||
def bot_connect(server, connected_to_other):
|
||||
def bot_connect(data):
|
||||
#use whatever ip you want here to connect with
|
||||
str1 = ""
|
||||
if "connect to ze" == server:
|
||||
if "connect to ze" == data:
|
||||
str1 = f"connect {data_ports['server_ip_port_ze']}"
|
||||
connected_to_other = False
|
||||
elif "connect to ze2" == server and not connected_to_other:
|
||||
elif "connect to ze2" == data:
|
||||
str1 = f"connect {data_ports['server_ip_port_ze2']}"
|
||||
writeCfgInput(str1)
|
||||
time.sleep(0.5)
|
||||
writeCfgInput("")
|
||||
print('not yet connected')
|
||||
|
||||
if __name__ == '__main__':
|
||||
@ -149,7 +152,7 @@ if __name__ == '__main__':
|
||||
restart_sdl_and_steam()
|
||||
else:
|
||||
kill_owned_process("pidof hl2_linux")
|
||||
connected_to_other = False
|
||||
is_bot_connected_to_ze2 = False
|
||||
launch_css_process()
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
@ -177,28 +180,31 @@ if __name__ == '__main__':
|
||||
writeCfgInput(response_msg)
|
||||
if ip != data_ports['ovh_ip']:
|
||||
continue
|
||||
if data == "autismo connected":
|
||||
print('Bot connected!')
|
||||
connection_issue_counter = 0
|
||||
elif data == "rtv":
|
||||
response_msg = "say rtv"
|
||||
writeCfgInput(response_msg)
|
||||
elif data == "bot kicked server full":
|
||||
print('bot kicked server full: ', datetime.datetime.now().time())
|
||||
elif "connected to" in data:
|
||||
connected_to_other = True
|
||||
elif "not connected" in data:
|
||||
connected_to_other = False
|
||||
elif "connect to" in data:
|
||||
elif "autismo connected to ze" == data:
|
||||
print('Bot connected to ze!')
|
||||
connection_issue_counter = 0
|
||||
is_bot_connected_to_ze2 = False
|
||||
elif "not connected to ze2" == data:
|
||||
is_bot_connected_to_ze2 = False
|
||||
elif "autismo connected to ze2" == data:
|
||||
print('Bot connected to ze2!')
|
||||
connection_issue_counter = 0
|
||||
is_bot_connected_to_ze2 = True
|
||||
elif "connect to ze" == data or ("connect to ze2" == data and not is_bot_connected_to_ze2):
|
||||
if connection_issue_counter == 20:
|
||||
kill_owned_process("pidof hl2_linux")
|
||||
print('exiting')
|
||||
sys.exit(1)
|
||||
if not connected_to_other or "connect to ze" == data:
|
||||
else:
|
||||
print('data: ', data)
|
||||
connection_issue_counter += 1
|
||||
print('connection_issue_counter: ', connection_issue_counter)
|
||||
bot_connect(data, connected_to_other)
|
||||
bot_connect(data)
|
||||
elif "clientmessage:" in data:
|
||||
messager_name = data.split("clientmessage:", 1)[1].split(" 72DqZ84")[0]
|
||||
databyte_send_message = messager_name + data.split("72DqZ84")[1]
|
||||
|
@ -16,13 +16,15 @@
|
||||
int target_friend_afk_counter[MAXPLAYERS][MAXPLAYERS + 1];
|
||||
int target_friend[MAXPLAYERS + 1];
|
||||
int target_enemy[MAXPLAYERS + 1];
|
||||
bool human_too_close[MAXPLAYERS + 1];
|
||||
bool bot_follow_tp[MAXPLAYERS + 1];
|
||||
int buttons_old[MAXPLAYERS + 1];
|
||||
int flags_old[MAXPLAYERS + 1];
|
||||
int ports[7] = {48470, 48471, 48472, 48473, 48474, 48479, 48480}; //last three indexes are ports its sending udp from in plugin
|
||||
int server_ports[2] = {27015, 27035}; //server ports: ze, ze2
|
||||
int bot_avoid_edge[MAXPLAYERS + 1];
|
||||
float client_old_coords[MAXPLAYERS + 1][3];
|
||||
float targethuman_self_teleported[MAXPLAYERS + 1][3];
|
||||
float targetfriend_prev_coords[MAXPLAYERS + 1][3];
|
||||
bool chat_cooldown = false;
|
||||
|
||||
//socket for bot input
|
||||
@ -53,6 +55,7 @@ public void OnPluginStart()
|
||||
//talking
|
||||
RegConsoleCmd("sm_autism", cmd_talk, "talking to the bot through java application");
|
||||
RegConsoleCmd("sm_botrtv", cmd_botrtv, "making bots rtv");
|
||||
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
|
||||
|
||||
//UDP connection
|
||||
connect_socket();
|
||||
@ -74,22 +77,34 @@ public void OnPluginEnd()
|
||||
}
|
||||
}
|
||||
|
||||
public void reset_target_tp(int client)
|
||||
public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
if (IsValidClient(client) && is_bot_player(client))
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
targethuman_self_teleported[client][0] = 0.0;
|
||||
targethuman_self_teleported[client][1] = 0.0;
|
||||
targethuman_self_teleported[client][2] = 0.0;
|
||||
if (IsValidClient(i))
|
||||
{
|
||||
if (is_bot_player(i))
|
||||
{
|
||||
bot_avoid_edge[i] = -1;
|
||||
target_friend[i] = -1;
|
||||
target_enemy[i] = -1;
|
||||
human_too_close[i] = false;
|
||||
bot_follow_tp[i] = false;
|
||||
targetfriend_prev_coords[i][0] = 0.0;
|
||||
targetfriend_prev_coords[i][1] = 0.0;
|
||||
targetfriend_prev_coords[i][2] = 0.0;
|
||||
for (int j = 1; j <= MaxClients; j++)
|
||||
{
|
||||
if (IsValidClient(j) && j != i)
|
||||
{
|
||||
target_friend_afk_counter[i][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Action reset_target_tp_timer(Handle timer, int client)
|
||||
{
|
||||
reset_target_tp(client);
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
public bool distance_check(int client, int botclient, bool nowpos)
|
||||
{
|
||||
float dist_target = 0.0;
|
||||
@ -101,7 +116,6 @@ public bool distance_check(int client, int botclient, bool nowpos)
|
||||
}
|
||||
else
|
||||
{
|
||||
dist_target = get_power_distance(client, targethuman_self_teleported[botclient]);
|
||||
}
|
||||
float min_required_distance = 50000.0;
|
||||
if (dist_target > min_required_distance)
|
||||
@ -238,19 +252,6 @@ public Action bot_chat_cooldown(Handle timer, any data)
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
public void did_target_tp(int client, int bot_client)
|
||||
{
|
||||
if (client == bot_client && targethuman_self_teleported[client][0] != 0.0 && !distance_check(client, bot_client, false))
|
||||
{
|
||||
reset_target_tp(client);
|
||||
}
|
||||
else if (client != bot_client && targethuman_self_teleported[bot_client][0] == 0.0 && !distance_check(client, bot_client, true))
|
||||
{
|
||||
GetEntPropVector(client, Prop_Send, "m_vecOrigin", targethuman_self_teleported[bot_client]);
|
||||
CreateTimer(6.0, reset_target_tp_timer, bot_client);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnMapStart()
|
||||
{
|
||||
chat_cooldown = false;
|
||||
@ -265,143 +266,66 @@ public void send_socket_msg(char[] query_msg, int len, int port)
|
||||
|
||||
public Action bot_check_connect(Handle timer, any data)
|
||||
{
|
||||
//this is designed for being ran from several css servers
|
||||
int client_count = GetClientCount(false);
|
||||
char msg[generic_length];
|
||||
int i_port = GetConVarInt(FindConVar("hostport"));
|
||||
bool is_host_ze = false;
|
||||
if (i_port == server_ports[0])
|
||||
{
|
||||
is_host_ze = true;
|
||||
}
|
||||
bool found_bot1 = false;
|
||||
bool found_bot2 = false;
|
||||
bool found_bot3 = false;
|
||||
bool found_bot4 = false;
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
if (IsValidClient(i) && !IsFakeClient(i))
|
||||
{
|
||||
if (client_count > 60)
|
||||
{
|
||||
found_bot1 = true;
|
||||
found_bot2 = true;
|
||||
found_bot3 = true;
|
||||
found_bot4 = true;
|
||||
if (is_bot_player(i))
|
||||
{
|
||||
KickClient(i, "server full you need to leave");
|
||||
}
|
||||
}
|
||||
if (is_host_ze)
|
||||
{
|
||||
if (client_count < 50)
|
||||
{
|
||||
Format(msg, sizeof(msg), "connect to ze");
|
||||
if (is_autism_bot1(i))
|
||||
{
|
||||
found_bot1 = true;
|
||||
}
|
||||
if (is_autism_bot2(i))
|
||||
{
|
||||
found_bot2 = true;
|
||||
}
|
||||
if (is_autism_bot3(i))
|
||||
{
|
||||
found_bot3 = true;
|
||||
}
|
||||
if (is_autism_bot4(i))
|
||||
{
|
||||
found_bot4 = true;
|
||||
}
|
||||
}
|
||||
else if (client_count > 55)
|
||||
{
|
||||
found_bot1 = true;
|
||||
found_bot2 = true;
|
||||
found_bot3 = true;
|
||||
found_bot4 = true;
|
||||
Format(msg, sizeof(msg), "connect to ze2");
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_bot_player(i))
|
||||
{
|
||||
Format(msg, sizeof(msg), "connected to ze2");
|
||||
}
|
||||
//this is designed for being ran from several css servers
|
||||
int client_count = GetClientCount(false);
|
||||
char msg[generic_length];
|
||||
int i_port = GetConVarInt(FindConVar("hostport"));
|
||||
bool bot1_connected = false;
|
||||
bool bot2_connected = false;
|
||||
bool bot3_connected = false;
|
||||
bool bot4_connected = false;
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
if (IsValidClient(i) && !IsFakeClient(i))
|
||||
{
|
||||
if (is_autism_bot1(i))
|
||||
bot1_connected = true;
|
||||
if (is_autism_bot2(i))
|
||||
bot2_connected = true;
|
||||
if (is_autism_bot3(i))
|
||||
bot3_connected = true;
|
||||
if (is_autism_bot4(i))
|
||||
bot4_connected = true;
|
||||
}
|
||||
|
||||
if (is_autism_bot1(i))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
found_bot1 = true;
|
||||
}
|
||||
if (is_autism_bot2(i))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
found_bot2 = true;
|
||||
}
|
||||
if (is_autism_bot3(i))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
found_bot3 = true;
|
||||
}
|
||||
if (is_autism_bot4(i))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
found_bot4 = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
//this check ensures servers dont overlap each other regarding not connected messages
|
||||
if (!is_host_ze)
|
||||
{
|
||||
Format(msg, sizeof(msg), "not connected");
|
||||
if (!found_bot1 && i_port == server_ports[1])
|
||||
{
|
||||
//ze2
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
}
|
||||
if (!found_bot2 && i_port == server_ports[1])
|
||||
{
|
||||
//ze2
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
}
|
||||
if (!found_bot3 && i_port == server_ports[1])
|
||||
{
|
||||
//ze2
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
}
|
||||
if (!found_bot4 && i_port == server_ports[1])
|
||||
{
|
||||
//ze2
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!found_bot1)
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
}
|
||||
if (!found_bot2)
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
}
|
||||
if (!found_bot3)
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
}
|
||||
if (!found_bot4)
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
}
|
||||
}
|
||||
return Plugin_Continue;
|
||||
if (i_port == server_ports[0])
|
||||
{
|
||||
//revert again to either 10 or 55
|
||||
int max_allowed_players = 55;
|
||||
if (client_count > max_allowed_players)
|
||||
{
|
||||
Format(msg, sizeof(msg), "connect to ze2");
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
}
|
||||
else if (client_count < 50)
|
||||
{
|
||||
Format(msg, sizeof(msg), "connect to ze");
|
||||
if (!bot1_connected)
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
if (!bot2_connected)
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
if (!bot3_connected)
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
if (!bot4_connected)
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//in case the bot is not connected to ze2 anymore make sure that is_bot_connected_to_ze2 is set to false again
|
||||
Format(msg, sizeof(msg), "not connected to ze2");
|
||||
if (!bot1_connected)
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
if (!bot2_connected)
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
if (!bot3_connected)
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
if (!bot4_connected)
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
}
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float vel[3], const float angles[3], int weapon, int subtype,
|
||||
@ -411,10 +335,9 @@ public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float
|
||||
if (is_bot_player(client))
|
||||
{
|
||||
int flags = GetEntityFlags(client);
|
||||
if (!(flags & FL_ONGROUND) && (flags_old[client] & FL_ONGROUND) && !(buttons_old[client] & IN_JUMP) && !(buttons & IN_JUMP) && (GetEntityMoveType(client) != MOVETYPE_LADDER) && GetEntProp(client, Prop_Data, "m_nWaterLevel") <= 2)
|
||||
if (!(flags & FL_ONGROUND) && (flags_old[client] & FL_ONGROUND) && !(buttons_old[client] & IN_JUMP) && !(buttons & IN_JUMP) && (GetEntityMoveType(client) != MOVETYPE_LADDER) && GetEntProp(client, Prop_Data, "m_nWaterLevel") == 0)
|
||||
{
|
||||
float Vel[3], feet_origin[3], ground_pos[3], downwards[3];
|
||||
//TODO prevent bot from falling off edge if nothing infront
|
||||
float velocity_addition_z_axis = 300.0; //300.0
|
||||
GetEntPropVector(client, Prop_Data, "m_vecVelocity", Vel);
|
||||
Vel[2] += velocity_addition_z_axis;
|
||||
@ -527,31 +450,12 @@ public Action recursive_pressing(Handle timer, any data)
|
||||
//3 = autismo is human and should follow closest moving ct
|
||||
targeteam = 3;
|
||||
}
|
||||
if (IsValidClient(target_friend[client]))
|
||||
{
|
||||
did_target_tp(target_friend[client], client);
|
||||
}
|
||||
else if (IsValidClient(target_enemy[client]))
|
||||
{
|
||||
did_target_tp(target_enemy[client], client);
|
||||
}
|
||||
if (targethuman_self_teleported[client][0] != 0.0)
|
||||
{
|
||||
float ClientPos[3];
|
||||
float Result[3];
|
||||
GetClientEyePosition(client, ClientPos);
|
||||
MakeVectorFromPoints(ClientPos, targethuman_self_teleported[client], Result);
|
||||
GetVectorAngles(Result, Result);
|
||||
TeleportEntity(client, NULL_VECTOR, Result, NULL_VECTOR);
|
||||
if (!distance_check(client, client, false))
|
||||
reset_target_tp(client);
|
||||
continue;
|
||||
}
|
||||
//no target in water somehow
|
||||
int previous_friend = target_friend[client];
|
||||
target_enemy[client] = GetClosestClient_option1(false, client);
|
||||
target_friend[client] = GetClosestClient_option1(true, client);
|
||||
|
||||
|
||||
float pos[3];
|
||||
did_target_tp(client, client);
|
||||
float enemy_distance = -1.0;
|
||||
float dist_target = -1.0;
|
||||
if (IsValidClient(target_friend[client]))
|
||||
@ -564,27 +468,80 @@ public Action recursive_pressing(Handle timer, any data)
|
||||
GetEntPropVector(target_enemy[client], Prop_Send, "m_vecOrigin", pos);
|
||||
enemy_distance = get_power_distance(client, pos);
|
||||
}
|
||||
float max_range_dist = 150.0;
|
||||
int state = -1;
|
||||
if (GetEntityMoveType(client) == MOVETYPE_LADDER)
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
int state = -1;
|
||||
//the friend just moved an probably impossible distance so is most likely teleported
|
||||
if (targetfriend_prev_coords[client][0] != 0.0 && IsValidClient(previous_friend))
|
||||
{
|
||||
//how far from old coords did our previous friend move, teleports sometimes dont move one very far,
|
||||
//has to be further than what noclip/surfing/speed might do. Not using hooking on trigger_multiple or trigger_teleport as origin also may be used
|
||||
float distance_between_prev_coord_and_new_coord = get_power_distance(previous_friend, targetfriend_prev_coords[client]);
|
||||
float min_required_distance = 1000.0;
|
||||
if (distance_between_prev_coord_and_new_coord > min_required_distance)
|
||||
{
|
||||
bot_follow_tp[client] = true;
|
||||
}
|
||||
}
|
||||
if (IsValidClient(target_friend[client]) && !bot_follow_tp[client])
|
||||
{
|
||||
GetEntPropVector(target_friend[client], Prop_Send, "m_vecOrigin", targetfriend_prev_coords[client]);
|
||||
}
|
||||
if (bot_follow_tp[client])
|
||||
{
|
||||
float ClientPos[3];
|
||||
float Result[3];
|
||||
GetClientEyePosition(client, ClientPos);
|
||||
MakeVectorFromPoints(ClientPos, targetfriend_prev_coords[client], Result);
|
||||
GetVectorAngles(Result, Result);
|
||||
float distance_between_bot_and_tp = get_power_distance(client, targetfriend_prev_coords[client]);
|
||||
//when we are close enough to teleport just run forward without facing the tp
|
||||
if (distance_between_bot_and_tp > 250.0)
|
||||
{
|
||||
TeleportEntity(client, NULL_VECTOR, Result, NULL_VECTOR);
|
||||
}
|
||||
if (!IsPointVisible(ClientPos, targetfriend_prev_coords[client]))
|
||||
{
|
||||
targetfriend_prev_coords[client][0] = 0.0;
|
||||
targetfriend_prev_coords[client][1] = 0.0;
|
||||
targetfriend_prev_coords[client][2] = 0.0;
|
||||
bot_follow_tp[client] = false;
|
||||
}
|
||||
state = 8; //if its walking into a TP or up/down a ladder it matters to use +forward;
|
||||
}
|
||||
//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))
|
||||
{
|
||||
if (IsValidClient(target_friend[client]))
|
||||
{
|
||||
face_call(target_friend[client], client);
|
||||
}
|
||||
state = 8;
|
||||
}
|
||||
//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]))
|
||||
{
|
||||
human_too_close[client] = true;
|
||||
face_call(target_enemy[client], client);
|
||||
state = 0;
|
||||
}
|
||||
//if bot is ct: if bot is not close enough to friend follow him
|
||||
//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
|
||||
else if (targeteam == 3 && dist_target > max_range_dist)
|
||||
{
|
||||
human_too_close[client] = false;
|
||||
face_call(target_friend[client], client);
|
||||
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
|
||||
else if (targeteam == 3)
|
||||
{
|
||||
human_too_close[client] = true;
|
||||
state = 2;
|
||||
}
|
||||
//if bot is zm follow enemy sometimes
|
||||
@ -616,7 +573,7 @@ public Action recursive_pressing(Handle timer, any data)
|
||||
{
|
||||
state = 7;
|
||||
}
|
||||
if (GetEntProp(client, Prop_Data, "m_nWaterLevel") <= 2 && GetEntityMoveType(client) != MOVETYPE_LADDER)
|
||||
if (GetEntProp(client, Prop_Data, "m_nWaterLevel") == 0 && GetEntityMoveType(client) != MOVETYPE_LADDER)
|
||||
trace_hulling_bot(client);
|
||||
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);
|
||||
@ -666,155 +623,174 @@ public Action recursive_pressing(Handle timer, any data)
|
||||
//https://developer.valvesoftware.com/wiki/Dimensions
|
||||
public void trace_hulling_bot(int client)
|
||||
{
|
||||
char message[generic_length * 3];
|
||||
float step_cap = 18.0;
|
||||
float crouch_min = 48.0;
|
||||
float stand_min = 63.0;
|
||||
float feet_origin[3], mins[3], maxs[3], eye_position[3];
|
||||
int BOUNDINGBOX_INFLATION_OFFSET = 3;
|
||||
GetClientEyePosition(client, eye_position);
|
||||
GetClientAbsOrigin(client, feet_origin);
|
||||
GetClientMins(client, mins);
|
||||
GetClientMaxs(client, maxs);
|
||||
//increasing boxes sizes
|
||||
for (int ij = 0; ij < sizeof(mins) - 1; ij++)
|
||||
{
|
||||
mins[ij] -= BOUNDINGBOX_INFLATION_OFFSET;
|
||||
maxs[ij] += BOUNDINGBOX_INFLATION_OFFSET;
|
||||
}
|
||||
//acts as full body check
|
||||
feet_origin[2] += BOUNDINGBOX_INFLATION_OFFSET;
|
||||
TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (TR_DidHit())
|
||||
{
|
||||
//check 0.0 to 48.0 units starting from feet
|
||||
feet_origin[2] -= BOUNDINGBOX_INFLATION_OFFSET;
|
||||
mins[2] = 0.0;
|
||||
maxs[2] = crouch_min;
|
||||
TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (!(TR_DidHit()))
|
||||
{
|
||||
//can crouch
|
||||
Format(message, sizeof(message), "hull info:crouch");
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
char message[generic_length * 3];
|
||||
float step_cap = 18.0;
|
||||
float crouch_min = 48.0;
|
||||
float stand_min = 63.0;
|
||||
float feet_origin[3], mins[3], maxs[3], eye_position[3];
|
||||
int BOUNDINGBOX_INFLATION_OFFSET = 3;
|
||||
GetClientEyePosition(client, eye_position);
|
||||
GetClientAbsOrigin(client, feet_origin);
|
||||
GetClientMins(client, mins);
|
||||
GetClientMaxs(client, maxs);
|
||||
//increasing boxes sizes
|
||||
for (int ij = 0; ij < sizeof(mins) - 1; ij++)
|
||||
{
|
||||
mins[ij] -= BOUNDINGBOX_INFLATION_OFFSET;
|
||||
maxs[ij] += BOUNDINGBOX_INFLATION_OFFSET;
|
||||
}
|
||||
//acts as full body check
|
||||
feet_origin[2] += BOUNDINGBOX_INFLATION_OFFSET;
|
||||
TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (TR_DidHit())
|
||||
{
|
||||
//check 0.0 to 48.0 units starting from feet
|
||||
feet_origin[2] -= BOUNDINGBOX_INFLATION_OFFSET;
|
||||
mins[2] = 0.0;
|
||||
maxs[2] = crouch_min;
|
||||
TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (!(TR_DidHit()))
|
||||
{
|
||||
//can crouch
|
||||
Format(message, sizeof(message), "hull info:crouch");
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[2]);
|
||||
send_socket_msg(message, strlen(message), ports[2]);
|
||||
}
|
||||
if (is_autism_bot4(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[3]);
|
||||
if (is_autism_bot4(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[3]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
//something blocks floor crouch
|
||||
eye_position[2] += 5.0;
|
||||
TR_TraceHullFilter(eye_position, eye_position, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (!(TR_DidHit()))
|
||||
{
|
||||
//should not block jump level
|
||||
Format(message, sizeof(message), "hull info:jump");
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
return;
|
||||
}
|
||||
//something blocks floor crouch
|
||||
eye_position[2] += 5.0;
|
||||
TR_TraceHullFilter(eye_position, eye_position, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (!(TR_DidHit()))
|
||||
{
|
||||
//should not block jump level
|
||||
Format(message, sizeof(message), "hull info:jump");
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[2]);
|
||||
}
|
||||
if (is_autism_bot4(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[3]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
//still potentially crouch hole in wall or one side jumpable
|
||||
mins[2] = step_cap;
|
||||
float iterator = step_cap;
|
||||
while (iterator < stand_min)
|
||||
{
|
||||
maxs[2] = iterator;
|
||||
iterator += step_cap;
|
||||
for (int jj = 0; jj < 2; jj++)
|
||||
for (int ij = 0; ij < 2; ij++)
|
||||
{
|
||||
if (jj == 0)
|
||||
mins[ij] += BOUNDINGBOX_INFLATION_OFFSET;
|
||||
else
|
||||
maxs[ij] -= BOUNDINGBOX_INFLATION_OFFSET;
|
||||
|
||||
float eyes_down[3];
|
||||
eyes_down[0] = eye_position[0];
|
||||
eyes_down[1] = eye_position[1] + 10.0;
|
||||
eyes_down[2] = eye_position[2];
|
||||
|
||||
float eyes_forward[3];
|
||||
eyes_forward[0] = eye_position[0];
|
||||
eyes_forward[1] = eye_position[1] + 10.0;
|
||||
eyes_forward[2] = eye_position[2];
|
||||
|
||||
float maxs_new[3];
|
||||
maxs_new[0] = maxs[0] - 8.0;
|
||||
maxs_new[1] = maxs[1] - 8.0;
|
||||
maxs_new[2] = maxs[2];
|
||||
|
||||
TR_TraceHullFilter(eye_position, eye_position, mins, maxs_new, MASK_ALL, TraceRayDontHitSelf);
|
||||
if ((TR_DidHit()))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[2]);
|
||||
bool should_jump = true;
|
||||
TR_TraceHullFilter(eyes_down, eyes_forward, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (!(TR_DidHit()))
|
||||
{
|
||||
should_jump = false;
|
||||
}
|
||||
|
||||
eyes_down[0] = eye_position[0] + 10.0;
|
||||
eyes_forward[0] = eye_position[0] + 10.0;
|
||||
TR_TraceHullFilter(eyes_down, eyes_forward, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if ((TR_DidHit()))
|
||||
{
|
||||
should_jump = false;
|
||||
}
|
||||
|
||||
if (should_jump)
|
||||
{
|
||||
Format(message, sizeof(message), "hull info:jump");
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[2]);
|
||||
}
|
||||
if (is_autism_bot4(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[3]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (is_autism_bot4(client))
|
||||
|
||||
TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (!(TR_DidHit()))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[3]);
|
||||
//hit wall on one side, no need to jump just run forward
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
//still potentially crouch hole in wall or one side jumpable
|
||||
mins[2] = step_cap;
|
||||
float iterator = step_cap;
|
||||
while (iterator < stand_min)
|
||||
{
|
||||
maxs[2] = iterator;
|
||||
iterator += step_cap;
|
||||
for (int jj = 0; jj < 2; jj++)
|
||||
for (int ij = 0; ij < 2; ij++)
|
||||
{
|
||||
if (jj == 0)
|
||||
mins[ij] += BOUNDINGBOX_INFLATION_OFFSET;
|
||||
else
|
||||
maxs[ij] -= BOUNDINGBOX_INFLATION_OFFSET;
|
||||
TR_TraceHullFilter(feet_origin, feet_origin, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (!(TR_DidHit()))
|
||||
{
|
||||
Format(message, sizeof(message), "hull info:jump");
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[2]);
|
||||
}
|
||||
if (is_autism_bot4(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[3]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
TR_TraceHullFilter(eye_position, eye_position, mins, maxs, MASK_ALL, TraceRayDontHitSelf);
|
||||
if (!(TR_DidHit()))
|
||||
{
|
||||
Format(message, sizeof(message), "hull info:jump");
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[2]);
|
||||
}
|
||||
if (is_autism_bot4(client))
|
||||
{
|
||||
send_socket_msg(message, strlen(message), ports[3]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (jj == 0)
|
||||
mins[ij] -= BOUNDINGBOX_INFLATION_OFFSET;
|
||||
else
|
||||
maxs[ij] += BOUNDINGBOX_INFLATION_OFFSET;
|
||||
}
|
||||
}
|
||||
//currently detects when two walls meet and create a corner
|
||||
float move_angles[3];
|
||||
GetClientEyeAngles(client, move_angles);
|
||||
move_angles[0] = 0.0;
|
||||
move_angles[1] += 35.0;
|
||||
move_angles[2] = 0.0;
|
||||
TeleportEntity(client, NULL_VECTOR, move_angles, NULL_VECTOR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (jj == 0)
|
||||
mins[ij] -= BOUNDINGBOX_INFLATION_OFFSET;
|
||||
else
|
||||
maxs[ij] += BOUNDINGBOX_INFLATION_OFFSET;
|
||||
}
|
||||
}
|
||||
//currently detects when two walls meet and create a corner
|
||||
float move_angles[3];
|
||||
GetClientEyeAngles(client, move_angles);
|
||||
move_angles[0] = 0.0;
|
||||
move_angles[1] += 35.0;
|
||||
move_angles[2] = 0.0;
|
||||
TeleportEntity(client, NULL_VECTOR, move_angles, NULL_VECTOR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool TraceRayDontHitSelf(int entity, int mask, any data)
|
||||
@ -852,51 +828,54 @@ stock bool IsValidClient(int client)
|
||||
|
||||
stock bool is_client_stuck_or_afk(int client, int i)
|
||||
{
|
||||
//triggers between 6-8 times per second
|
||||
target_friend_afk_counter[client][i]++;
|
||||
if (target_friend_afk_counter[client][i] >= 24)
|
||||
{
|
||||
float min_distance_cap = 1.0;
|
||||
float i_own_distance = get_power_distance(i, client_old_coords[i]);
|
||||
GetEntPropVector(i, Prop_Send, "m_vecOrigin", client_old_coords[i]);
|
||||
bool not_moved = i_own_distance < min_distance_cap;
|
||||
if (!not_moved)
|
||||
{
|
||||
target_friend_afk_counter[client][i] = 0;
|
||||
}
|
||||
return not_moved;
|
||||
}
|
||||
return false;
|
||||
//triggers between 6-8 times per second
|
||||
target_friend_afk_counter[client][i]++;
|
||||
int human_idle_steps = 12;
|
||||
if (target_friend_afk_counter[client][i] >= human_idle_steps)
|
||||
{
|
||||
float min_distance_cap = 1.0;
|
||||
float i_own_distance = get_power_distance(i, client_old_coords[i]);
|
||||
GetEntPropVector(i, Prop_Send, "m_vecOrigin", client_old_coords[i]);
|
||||
bool not_moved = i_own_distance < min_distance_cap;
|
||||
if (!not_moved)
|
||||
{
|
||||
target_friend_afk_counter[client][i] = 0;
|
||||
}
|
||||
return not_moved;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public int GetClosestClient_option1(bool finding_friend, int client)
|
||||
{
|
||||
float nearestdistance = -1.0;
|
||||
int nearest = -1;
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
if (IsValidClient(i) && IsPlayerAlive(i) && i != client && !is_bot_player(i))
|
||||
{
|
||||
if (!IsAbleToSee(client, i) || is_client_stuck_or_afk(client, i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
float pos[3];
|
||||
GetEntPropVector(i, Prop_Send, "m_vecOrigin", pos);
|
||||
float dist_target = get_power_distance(client, pos);
|
||||
if ((finding_friend && GetClientTeam(i) != GetClientTeam(client)) || (!finding_friend && GetClientTeam(i) == GetClientTeam(client)))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
if (i == target_friend[client])
|
||||
dist_target /= 5; */
|
||||
if (nearestdistance < 0 || dist_target < nearestdistance)
|
||||
{
|
||||
nearest = i;
|
||||
nearestdistance = dist_target;
|
||||
}
|
||||
}
|
||||
return nearest;
|
||||
float nearestdistance = -1.0;
|
||||
int nearest = -1;
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
if (IsValidClient(i) && IsPlayerAlive(i) && i != client)
|
||||
{
|
||||
if (!IsAbleToSee(client, i) || is_client_stuck_or_afk(client, i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
float pos[3];
|
||||
GetEntPropVector(i, Prop_Send, "m_vecOrigin", pos);
|
||||
float dist_target = get_power_distance(client, pos);
|
||||
if ((finding_friend && GetClientTeam(i) != GetClientTeam(client)) || (!finding_friend && GetClientTeam(i) == GetClientTeam(client)))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (is_bot_player(i))
|
||||
{
|
||||
//just making sure bots have lowest priority
|
||||
dist_target = 9000000.0;
|
||||
}
|
||||
if (nearestdistance < 0 || dist_target < nearestdistance)
|
||||
{
|
||||
nearest = i;
|
||||
nearestdistance = dist_target;
|
||||
}
|
||||
}
|
||||
return nearest;
|
||||
}
|
||||
|
||||
public float get_power_distance(int target_player, float [3]pos)
|
||||
@ -908,36 +887,51 @@ public float get_power_distance(int target_player, float [3]pos)
|
||||
|
||||
public void OnClientPostAdminCheck(int client)
|
||||
{
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
if (IsValidClient(i) && is_bot_player(i) && i != client)
|
||||
target_friend_afk_counter[i][client] = 0;
|
||||
}
|
||||
bot_avoid_edge[client] = -1;
|
||||
char auth[64];
|
||||
GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth));
|
||||
char msg[generic_length];
|
||||
Format(msg, sizeof(msg), "autismo connected");
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
}
|
||||
if (is_autism_bot4(client))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
}
|
||||
client_old_coords[client][0] = 0.0;
|
||||
client_old_coords[client][1] = 0.0;
|
||||
client_old_coords[client][2] = 0.0;
|
||||
reset_target_tp(client);
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
if (IsValidClient(i) && is_bot_player(i) && i != client)
|
||||
{
|
||||
target_friend_afk_counter[i][client] = 0;
|
||||
}
|
||||
}
|
||||
//checks if ze or ze2
|
||||
int i_port = GetConVarInt(FindConVar("hostport"));
|
||||
char msg[generic_length];
|
||||
if (i_port == server_ports[0])
|
||||
{
|
||||
Format(msg, sizeof(msg), "autismo connected to ze");
|
||||
}
|
||||
else
|
||||
{
|
||||
Format(msg, sizeof(msg), "autismo connected to ze2");
|
||||
}
|
||||
targetfriend_prev_coords[client][0] = 0.0;
|
||||
targetfriend_prev_coords[client][1] = 0.0;
|
||||
targetfriend_prev_coords[client][2] = 0.0;
|
||||
human_too_close[client] = false;
|
||||
bot_follow_tp[client] = false;
|
||||
bot_avoid_edge[client] = -1;
|
||||
char auth[64];
|
||||
GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth));
|
||||
if (is_autism_bot1(client))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[0]);
|
||||
}
|
||||
if (is_autism_bot2(client))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[1]);
|
||||
}
|
||||
if (is_autism_bot3(client))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
}
|
||||
if (is_autism_bot4(client))
|
||||
{
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
}
|
||||
client_old_coords[client][0] = 0.0;
|
||||
client_old_coords[client][1] = 0.0;
|
||||
client_old_coords[client][2] = 0.0;
|
||||
}
|
||||
|
||||
public void OnSocketError(Handle socket, const int errorType, const int errorNum, any args)
|
||||
@ -968,16 +962,22 @@ stock void connect_socket()
|
||||
|
||||
public void OnClientDisconnect(int client)
|
||||
{
|
||||
bot_avoid_edge[client] = -1;
|
||||
client_old_coords[client][0] = 0.0;
|
||||
client_old_coords[client][1] = 0.0;
|
||||
client_old_coords[client][2] = 0.0;
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
bot_avoid_edge[client] = -1;
|
||||
client_old_coords[client][0] = 0.0;
|
||||
client_old_coords[client][1] = 0.0;
|
||||
client_old_coords[client][2] = 0.0;
|
||||
targetfriend_prev_coords[client][0] = 0.0;
|
||||
targetfriend_prev_coords[client][1] = 0.0;
|
||||
targetfriend_prev_coords[client][2] = 0.0;
|
||||
human_too_close[client] = false;
|
||||
bot_follow_tp[client] = false;
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
if (IsValidClient(i) && is_bot_player(i) && i != client)
|
||||
{
|
||||
target_friend_afk_counter[i][client] = 0;
|
||||
}
|
||||
}
|
||||
reset_target_tp(client);
|
||||
}
|
||||
|
||||
//Socket callback
|
||||
|
Loading…
Reference in New Issue
Block a user