2020-01-23 23:15:26 +01:00
# pragma semicolon 1
# define DEBUG
# define PLUGIN_AUTHOR "jenz"
# define PLUGIN_VERSION "1.00"
2020-04-22 00:17:28 +02:00
# define generic_length 256
2020-01-23 23:15:26 +01:00
# include <sourcemod>
# include <sdktools>
# pragma newdecls required
2020-02-28 22:00:22 +01:00
int present = 0 ;
2020-02-09 00:26:05 +01:00
int targethuman = 0 ;
2020-05-05 23:52:01 +02:00
int stuckcounterX = 0 ;
int stuckcounterY = 0 ;
bool hunt_or_mimic = false ;
Database database_connection_input ;
2020-01-23 23:15:26 +01:00
public Plugin myinfo =
{
name = " coordinates for the bot " ,
author = PLUGIN_AUTHOR ,
description = " hello " ,
version = PLUGIN_VERSION ,
url = " "
} ;
2020-02-28 22:00:22 +01:00
public void OnClientDisconnect ( int client )
2020-01-23 23:15:26 +01:00
{
2020-02-28 22:00:22 +01:00
if ( present = = client )
2020-04-22 00:17:28 +02:00
{
2020-02-28 22:00:22 +01:00
present = 0 ;
2020-04-22 00:17:28 +02:00
mysql_enable_disable_connected ( 0 ) ;
}
2020-01-23 23:15:26 +01:00
}
2020-02-28 22:00:22 +01:00
public void OnPluginStart ( )
2020-01-23 23:15:26 +01:00
{
2020-05-05 23:52:01 +02:00
//talking
RegConsoleCmd ( " sm_autism " , cmd_talk , " talking to the bot through java application " ) ;
2020-02-28 22:00:22 +01:00
//hooks
HookEvent ( " round_start " , Event_RoundStart , EventHookMode_PostNoCopy ) ;
2020-04-22 00:17:28 +02:00
HookEvent ( " player_team " , event_playerteam , EventHookMode_PostNoCopy ) ;
2020-05-05 23:52:01 +02:00
//global DB
char error_connect [ generic_length ] ;
if ( SQL_CheckConfig ( " css_autism_bot_info " ) )
database_connection_input = SQL_Connect ( " css_autism_bot_info " , true , error_connect , sizeof ( error_connect ) ) ;
if ( database_connection_input = = null )
PrintToChatAll ( " {green}[UNLOZE] {white}Error! Could not connect to maria-DB! " ) ;
2020-04-22 00:17:28 +02:00
//mysql
sql_create_table ( ) ;
2020-01-23 23:15:26 +01:00
}
2020-05-05 23:52:01 +02:00
public Action cmd_talk ( int client , int args )
{
char info [ generic_length ] ;
GetCmdArgString ( info , sizeof ( info ) ) ;
2020-05-06 01:24:15 +02:00
if ( strlen ( info ) = = 0 )
{
PrintToChat ( client , " Add a message to the command if autism bot is ingame " ) ;
return Plugin_Handled ;
}
2020-05-05 23:52:01 +02:00
char error_connect [ generic_length ] ;
Database database_connection ;
if ( SQL_CheckConfig ( " css_autism_bot_info " ) )
database_connection = SQL_Connect ( " css_autism_bot_info " , true , error_connect , sizeof ( error_connect ) ) ;
if ( database_connection = = null )
PrintToChatAll ( " {green}[UNLOZE] {white}Error! Could not connect to maria-DB! " ) ;
//256 not enough
char query_start [ generic_length ] ;
Format ( query_start , sizeof ( query_start ) , " INSERT INTO unloze_css_autism_bot.`chatting` (`chatmessage`, `responsemessage`) VALUES ('%s', '') " , info ) ;
//PrintToChatAll("query_start: %s", query_start);
mysql_exec_prepared_statement ( database_connection , query_start ) ;
delete database_connection ;
return Plugin_Handled ;
}
public void OnPluginEnd ( )
{
delete database_connection_input ;
}
2020-04-22 00:17:28 +02:00
public Action event_playerteam ( Event event , const char [ ] name , bool dontBroadcast )
{
int client = GetClientOfUserId ( event . GetInt ( " userid " ) ) ;
if ( client = = present )
{
//PrintToChatAll("called event_playerteam");
int team = event . GetInt ( " team " ) ;
//PrintToChatAll("team: %i", team);
if ( team = = 2 | | team = = 3 )
mysql_bot_not_spec ( ) ;
}
}
2020-05-05 23:52:01 +02:00
2020-02-28 22:00:22 +01:00
public void Event_RoundStart ( Handle event , const char [ ] name , bool dontBroadcast )
2020-01-23 23:15:26 +01:00
{
2020-02-28 22:00:22 +01:00
targethuman = 0 ;
2020-04-22 00:17:28 +02:00
int server_port = GetConVarInt ( FindConVar ( " hostport " ) ) ;
if ( server_port = = 27015 )
{
mysql_update_playercount ( ) ;
}
2020-05-05 23:52:01 +02:00
hunt_or_mimic = false ;
2020-04-22 00:17:28 +02:00
if ( present )
mysql_clean_movement_input ( ) ;
2020-01-23 23:15:26 +01:00
}
2020-02-28 22:00:22 +01:00
public void OnMapStart ( )
2020-02-09 00:26:05 +01:00
{
2020-04-22 00:17:28 +02:00
sql_create_table ( ) ;
2020-05-05 23:52:01 +02:00
CreateTimer ( 1.3 , recursive_pressing , INVALID_HANDLE , TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE ) ;
2020-02-09 00:26:05 +01:00
}
2020-02-28 22:00:22 +01:00
public bool TraceEntityFilterPlayer ( int entity , int contentsMask )
2020-02-09 00:26:05 +01:00
{
2020-02-28 22:00:22 +01:00
return ( entity > GetMaxClients ( ) | | ! entity ) ;
2020-02-09 00:26:05 +01:00
}
2020-02-28 22:00:22 +01:00
public Action recursive_pressing ( Handle timer , any data )
2020-02-14 23:27:57 +01:00
{
2020-04-22 00:17:28 +02:00
if ( present & & IsPlayerAlive ( present ) )
2020-02-14 23:27:57 +01:00
{
2020-05-05 23:52:01 +02:00
float present_bot_coords [ 3 ] ;
GetClientAbsOrigin ( present , present_bot_coords ) ;
2020-05-21 00:19:49 +02:00
int targeteam = 0 ;
if ( GetClientTeam ( present ) ! = 3 )
{
//2 = autismo is zm and follows closest zm
targeteam = 2 ;
}
else
{
targeteam = 3 ;
}
if ( ! IsValidClient ( targethuman ) | | GetClientTeam ( targethuman ) ! = targeteam | | ! IsPlayerAlive ( targethuman ) )
2020-05-05 23:52:01 +02:00
{
hunt_or_mimic = false ;
float lowest_distance = 1000000.0 ;
for ( int i = 1 ; i < = MaxClients ; i + + )
2020-05-21 00:19:49 +02:00
if ( IsValidClient ( i ) & & IsPlayerAlive ( i ) & & GetClientTeam ( i ) = = targeteam & & i ! = present )
2020-02-14 23:27:57 +01:00
{
2020-05-21 00:19:49 +02:00
float flVel [ 3 ] ;
float minvelocity = 10.0 ;
GetEntPropVector ( i , Prop_Data , " m_vecAbsVelocity " , flVel ) ;
if ( flVel [ 0 ] < minvelocity & & flVel [ 1 ] < minvelocity )
continue ;
2020-05-05 23:52:01 +02:00
float pos [ 3 ] ;
GetClientAbsOrigin ( i , pos ) ;
float dx = present_bot_coords [ 0 ] - pos [ 0 ] ;
float dy = present_bot_coords [ 1 ] - pos [ 1 ] ;
float dz = FloatAbs ( present_bot_coords [ 2 ] - pos [ 2 ] ) ;
float dist = SquareRoot ( dx * dx + dy * dy + dz * dz ) ;
if ( dist < lowest_distance )
{
lowest_distance = dist ;
targethuman = i ;
}
2020-02-14 23:27:57 +01:00
}
2020-05-05 23:52:01 +02:00
}
2020-05-21 00:19:49 +02:00
2020-05-05 23:52:01 +02:00
//get bot in distance, mimic all input until CT dead/round over
//copy all input to track each origin correctly on path
//prioritize with global lowest distance what coord point is closest to bot to start mimic entry
//from which it can mimic input of player forward on each round, boolean
2020-02-28 22:00:22 +01:00
if ( IsValidClient ( targethuman ) )
2020-01-23 23:15:26 +01:00
{
2020-05-05 23:52:01 +02:00
float target_human_coords [ 3 ] ;
int distance_limit = 105 ;
GetClientAbsOrigin ( targethuman , target_human_coords ) ;
float xyz [ 3 ] ;
float dx = present_bot_coords [ 0 ] - target_human_coords [ 0 ] ;
float dy = present_bot_coords [ 1 ] - target_human_coords [ 1 ] ;
float dz = FloatAbs ( present_bot_coords [ 2 ] - target_human_coords [ 2 ] ) ;
float dist = SquareRoot ( dx * dx + dy * dy + dz * dz ) ;
//PrintToChatAll("dist: %f", dist);
if ( dist < distance_limit )
hunt_or_mimic = true ;
2020-05-21 00:19:49 +02:00
else
hunt_or_mimic = false ;
2020-05-05 23:52:01 +02:00
dx = present_bot_coords [ 0 ] - target_human_coords [ 0 ] ;
dy = present_bot_coords [ 1 ] - target_human_coords [ 1 ] ;
dz = FloatAbs ( present_bot_coords [ 2 ] - target_human_coords [ 2 ] ) ;
xyz [ 0 ] = dx ;
xyz [ 1 ] = dy ;
xyz [ 2 ] = dz ;
2020-02-28 22:00:22 +01:00
int keys = GetClientButtons ( targethuman ) ;
2020-04-22 00:17:28 +02:00
char keyinput [ generic_length ] ;
2020-05-05 23:52:01 +02:00
//if true mimicing human input
if ( hunt_or_mimic )
2020-02-28 22:00:22 +01:00
{
2020-05-05 23:52:01 +02:00
if ( keys & IN_FORWARD )
{
StrCat ( keyinput , sizeof ( keyinput ) , " -back; wait 5; +forward; wait 5; " ) ;
}
else if ( keys & IN_BACK )
{
StrCat ( keyinput , sizeof ( keyinput ) , " -forward; wait 5; +back; wait 5; " ) ;
}
if ( keys & IN_MOVELEFT )
{
StrCat ( keyinput , sizeof ( keyinput ) , " -moveright; wait 5; +moveleft; wait 5; " ) ;
}
else if ( keys & IN_MOVERIGHT )
{
StrCat ( keyinput , sizeof ( keyinput ) , " -moveleft; wait 5; +moveright; wait 5; " ) ;
}
2020-02-28 22:00:22 +01:00
}
if ( keys & IN_JUMP )
{
2020-04-22 00:17:28 +02:00
StrCat ( keyinput , sizeof ( keyinput ) , " +jump; " ) ;
2020-02-28 22:00:22 +01:00
}
2020-04-22 00:17:28 +02:00
if ( keys & IN_DUCK )
{
StrCat ( keyinput , sizeof ( keyinput ) , " +duck; " ) ;
}
2020-05-05 23:52:01 +02:00
//PrintToChatAll("targethuman: %N", targethuman);
float clientangles [ 3 ] ;
GetClientAbsAngles ( targethuman , clientangles ) ;
mysql_send_input ( keyinput , clientangles , xyz , target_human_coords , hunt_or_mimic ) ;
2020-01-23 23:15:26 +01:00
}
}
2020-02-28 22:00:22 +01:00
return Plugin_Handled ;
2020-01-23 23:15:26 +01:00
}
stock bool IsValidClient ( int client )
{
if ( client > 0 & & client < = MaxClients & & IsClientConnected ( client ) & & IsClientInGame ( client ) )
{
return true ;
}
return false ;
}
public void OnClientPostAdminCheck ( int client )
{
//STEAM_0:1:34783317
//STEAM_0:1:60189040
//[U:1:120378081]
2020-02-14 23:27:57 +01:00
//[U:1:69566635]
2020-01-23 23:15:26 +01:00
char auth [ 50 ] ;
GetClientAuthId ( client , AuthId_Engine , auth , sizeof ( auth ) ) ;
if ( StrEqual ( " [U:1:120378081] " , auth , false ) )
2020-04-22 00:17:28 +02:00
{
mysql_enable_disable_connected ( 1 ) ;
2020-02-28 22:00:22 +01:00
present = client ;
2020-04-22 00:17:28 +02:00
}
2020-02-28 22:00:22 +01:00
else if ( StrEqual ( " STEAM_0:1:60189040 " , auth , false ) )
2020-04-22 00:17:28 +02:00
{
mysql_enable_disable_connected ( 1 ) ;
2020-02-28 22:00:22 +01:00
present = client ;
2020-04-22 00:17:28 +02:00
}
}
public void sql_create_table ( )
{
char error_connect [ generic_length ] ;
Database database_connection ;
if ( SQL_CheckConfig ( " css_autism_bot_info " ) )
database_connection = SQL_Connect ( " css_autism_bot_info " , true , error_connect , sizeof ( error_connect ) ) ;
if ( database_connection = = null )
PrintToChatAll ( " {green}[UNLOZE] {white}Error! Could not connect to maria-DB! " ) ;
//256 not enough
2020-05-05 23:52:01 +02:00
char query_start [ generic_length * 3 ] ;
2020-04-22 00:17:28 +02:00
Format ( query_start , sizeof ( query_start ) , " CREATE TABLE IF NOT EXISTS unloze_css_autism_bot.`bot status` (`connected` BOOL DEFAULT false, `spectate` BOOL DEFAULT true, `ID` INT NOT NULL DEFAULT 1, `playercount` INT DEFAULT 0, PRIMARY KEY (`ID`)) " ) ;
mysql_exec_prepared_statement ( database_connection , query_start ) ;
2020-05-05 23:52:01 +02:00
Format ( query_start , sizeof ( query_start ) , " CREATE TABLE IF NOT EXISTS unloze_css_autism_bot.`bot movement input` (`keyinput` text NOT NULL, `clientangles_0` DECIMAL(13, 8) DEFAULT 0.000, `clientangles_1` DECIMAL(13, 8) DEFAULT 0.000, `clientangles_2` DECIMAL(13, 8) DEFAULT 0.000, `xyz_0` DECIMAL(13, 8) DEFAULT 0.000, `xyz_1` DECIMAL(13, 8) DEFAULT 0.000, `xyz_2` DECIMAL(13, 8) DEFAULT 0.000, `client_coord_0` DECIMAL(13, 8) DEFAULT 0.000, `client_coord_1` DECIMAL(13, 8) DEFAULT 0.000, `client_coord_2` DECIMAL(13, 8) DEFAULT 0.000, `hunt_or_mimic` BOOLEAN DEFAULT false, `stuckX` BOOLEAN DEFAULT false, `stuckY` BOOLEAN DEFAULT false, `entry_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP) " ) ;
2020-04-22 00:17:28 +02:00
mysql_exec_prepared_statement ( database_connection , query_start ) ;
Format ( query_start , sizeof ( query_start ) , " INSERT INTO unloze_css_autism_bot.`bot status` (connected, spectate, ID) VALUES (0, 1, 1) ON DUPLICATE KEY UPDATE connected = VALUES(connected), spectate = VALUES(spectate) " ) ;
mysql_exec_prepared_statement ( database_connection , query_start ) ;
2020-05-05 23:52:01 +02:00
Format ( query_start , sizeof ( query_start ) , " CREATE TABLE IF NOT EXISTS unloze_css_autism_bot.`chatting` (`chatmessage` text NOT NULL, `responsemessage` text NOT NULL) " ) ;
mysql_exec_prepared_statement ( database_connection , query_start ) ;
2020-04-22 00:17:28 +02:00
delete database_connection ;
}
public void mysql_clean_movement_input ( )
{
char error_connect [ generic_length ] ;
Database database_connection ;
if ( SQL_CheckConfig ( " css_autism_bot_info " ) )
database_connection = SQL_Connect ( " css_autism_bot_info " , true , error_connect , sizeof ( error_connect ) ) ;
if ( database_connection = = null )
PrintToChatAll ( " {green}[UNLOZE] {white}Error! Could not connect to maria-DB! " ) ;
char query_start [ generic_length ] ;
Format ( query_start , sizeof ( query_start ) , " delete from unloze_css_autism_bot.`bot movement input` " ) ;
mysql_exec_prepared_statement ( database_connection , query_start ) ;
}
public void mysql_update_playercount ( )
{
char error_connect [ generic_length ] ;
Database database_connection ;
if ( SQL_CheckConfig ( " css_autism_bot_info " ) )
database_connection = SQL_Connect ( " css_autism_bot_info " , true , error_connect , sizeof ( error_connect ) ) ;
if ( database_connection = = null )
PrintToChatAll ( " {green}[UNLOZE] {white}Error! Could not connect to maria-DB! " ) ;
char query_start [ generic_length ] ;
Format ( query_start , sizeof ( query_start ) , " INSERT INTO unloze_css_autism_bot.`bot status` (playercount, ID) VALUES (%i, 1) ON DUPLICATE KEY UPDATE playercount = %i " , MaxClients , MaxClients ) ;
mysql_exec_prepared_statement ( database_connection , query_start ) ;
delete database_connection ;
}
public void mysql_bot_not_spec ( )
{
char error_connect [ generic_length ] ;
Database database_connection ;
if ( SQL_CheckConfig ( " css_autism_bot_info " ) )
database_connection = SQL_Connect ( " css_autism_bot_info " , true , error_connect , sizeof ( error_connect ) ) ;
if ( database_connection = = null )
PrintToChatAll ( " {green}[UNLOZE] {white}Error! Could not connect to maria-DB! " ) ;
char query_start [ generic_length ] ;
Format ( query_start , sizeof ( query_start ) , " INSERT INTO unloze_css_autism_bot.`bot status` (connected, spectate, ID) VALUES (1, 0, 1) ON DUPLICATE KEY UPDATE connected = VALUES(connected), spectate = VALUES(spectate) " ) ;
mysql_exec_prepared_statement ( database_connection , query_start ) ;
}
public void mysql_enable_disable_connected ( int state )
{
char error_connect [ generic_length ] ;
Database database_connection ;
if ( SQL_CheckConfig ( " css_autism_bot_info " ) )
database_connection = SQL_Connect ( " css_autism_bot_info " , true , error_connect , sizeof ( error_connect ) ) ;
if ( database_connection = = null )
PrintToChatAll ( " {green}[UNLOZE] {white}Error! Could not connect to maria-DB! " ) ;
char query_start [ generic_length ] ;
if ( ! state )
Format ( query_start , sizeof ( query_start ) , " INSERT INTO unloze_css_autism_bot.`bot status` (connected, spectate, ID) VALUES (0, 1, 1) ON DUPLICATE KEY UPDATE connected = VALUES(connected), spectate = VALUES(spectate) " ) ;
else
Format ( query_start , sizeof ( query_start ) , " INSERT INTO unloze_css_autism_bot.`bot status` (connected, spectate, ID) VALUES (1, 1, 1) ON DUPLICATE KEY UPDATE connected = VALUES(connected), spectate = VALUES(spectate) " ) ;
//PrintToChatAll("query_start: %s", query_start);
mysql_exec_prepared_statement ( database_connection , query_start ) ;
delete database_connection ;
}
2020-05-05 23:52:01 +02:00
public void mysql_send_input ( char [ ] keyinput , float clientangles [ 3 ] , float xyz [ 3 ] , float client_coord [ 3 ] , bool hunt_or_mimicb )
2020-04-22 00:17:28 +02:00
{
//TODO maybe add autism bot coords too as information
char query_start [ generic_length ] ;
2020-05-05 23:52:01 +02:00
float flVel [ 3 ] ;
GetEntPropVector ( present , Prop_Data , " m_vecAbsVelocity " , flVel ) ;
int stuckX = 0 ;
int stuckY = 0 ;
2020-05-21 00:19:49 +02:00
int stuckcap = 3 ;
2020-05-05 23:52:01 +02:00
float mincapvelocity = 10.0 ;
if ( flVel [ 0 ] < mincapvelocity )
{
stuckcounterX + + ;
if ( stuckcounterX > stuckcap )
{
stuckcounterX = 0 ;
stuckX = 1 ;
}
}
if ( flVel [ 1 ] < mincapvelocity )
{
stuckcounterY + + ;
if ( stuckcounterY > stuckcap )
{
stuckcounterY = 0 ;
stuckY = 1 ;
}
}
Format ( query_start , sizeof ( query_start ) , " INSERT INTO unloze_css_autism_bot.`bot movement input` VALUES ('%s', %f, %f, %f, %f, %f, %f, %f, %f, %f, %i, %i, %i, NOW()) " , keyinput , clientangles [ 0 ] , clientangles [ 1 ] , clientangles [ 2 ] , xyz [ 0 ] , xyz [ 1 ] , xyz [ 2 ] , client_coord [ 0 ] , client_coord [ 1 ] , client_coord [ 2 ] , hunt_or_mimicb , stuckX , stuckY ) ;
mysql_exec_prepared_statement ( database_connection_input , query_start ) ;
//PrintToChatAll("flVel: %f %f %f", flVel[0], flVel[1], flVel[2]);
2020-04-22 00:17:28 +02:00
//PrintToChatAll("query_start: %s", query_start);
}
public void mysql_exec_prepared_statement ( Database database_connection , char [ ] query_statement )
{
char error [ generic_length ] ;
DBStatement create_statement = SQL_PrepareQuery ( database_connection , query_statement , error , sizeof ( error ) ) ;
if ( create_statement = = INVALID_HANDLE )
{
CloseHandle ( create_statement ) ;
return ;
}
SQL_Execute ( create_statement ) ;
CloseHandle ( create_statement ) ;
2020-01-23 23:15:26 +01:00
}