28/12/2020, 12:18 AM
(Última modificación: 28/12/2020, 12:20 AM por GeX~'. Edited 2 times in total.)
Hola buenas estoy ocupado este plugin la verdad que me costo adaptarlo por el mysql que no se ningun carajo jaja resulta que el bot funciona excelente pero me gustaría que cuando grabe la ruta el bot muestre si el jugador se agacho la verdad nose como se hace o si el plugin ya trae alguna función para hacerlo que muestre eso que digo espero alguien me eche una manito con eso porfavor acudo a ustedes ya que son unos crack en esto.
dejo el código para que lo vean
dejo el código para que lo vean
Código PHP:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#include <fun>
#include <engine>
#include <kzarg>
new const g_szRecordEntity[ ] = "EntityRecorder";
new const g_iTaskLoadBot = 8883;
new Array:g_aPlayerOrigin[33], Array:g_aPlayerAngles[33], Array:g_aPlayerButtons[33]
new Array:g_aPlayerForwardMove[33], Array:g_aPlayerSideMove[33], Array:g_aPlayerUpMove[33]
new Array:g_aPlayerVelocity[33], Array:g_aPlayerTime[33]
new Float:g_fForwardMove[33], Float:g_fSideMove[33], Float:g_fUpMove[33], Float:g_fBotTime
new g_iBotIndex, g_szBotName[MAX_NAME_LENGTH], g_iCurrentFrame;
enum FWrite { FW_NONE = 0, FW_DELETESOURCE = ( 1 << 0 ), FW_CANOVERRIDE = ( 1 << 1 ) }
public plugin_init()
{
register_forward(FM_CmdStart, "OnCmdStart")
register_think(g_szRecordEntity, "OnRecordThink");
}
public plugin_natives( )
{
register_library( "ReplayBOT" );
register_native( "GetReplayBotIndex", "Native_GetReplayBotIndex" );
register_native( "GetBotVelocityX", "Native_GetBotVelocityX" );
register_native( "GetBotVelocityY", "Native_GetBotVelocityY" );
register_native( "GetBotVelocityZ", "Native_GetBotVelocityZ" );
register_native( "GetBotTime", "Native_GetBotTime" );
register_native( "GetBotButtons", "Native_GetBotButtons" );
}
public plugin_precache( )
{
new iEnt = cs_create_entity( "info_target" );
assert iEnt; assert
entity_set_string(iEnt, EV_SZ_classname, g_szRecordEntity)
set_pev( iEnt, pev_nextthink, get_gametime( ) + 0.009 );
for( new i = 0; i < 33; i++ )
{
g_aPlayerOrigin[ i ] = ArrayCreate( 3 );
g_aPlayerAngles[ i ] = ArrayCreate( 3 );
g_aPlayerButtons[ i ] = ArrayCreate( );
g_aPlayerForwardMove[ i ] = ArrayCreate( );
g_aPlayerSideMove[ i ] = ArrayCreate( );
g_aPlayerUpMove[ i ] = ArrayCreate( );
g_aPlayerVelocity[ i ] = ArrayCreate( 3 );
g_aPlayerTime[ i ] = ArrayCreate( );
}
new szConfigsDir[ 64 ], szBotPath[ 256 ], szMapName[ 32 ];
get_localinfo( "amxx_configsdir", szConfigsDir, charsmax( szConfigsDir ) );
get_mapname( szMapName, charsmax( szMapName ) );
formatex( szBotPath, charsmax( szBotPath ), "%s/kz/BotRepeater/%s.ini", szConfigsDir, szMapName );
if( file_exists( szBotPath ) )
{
new hFile = fopen( szBotPath, "r" );
new szLine[ 386 ], szOriginX[ 20 ], szOriginY[ 20 ], szOriginZ[ 20 ], szAngleX[ 20 ], szAngleY[ 20 ], szAngleZ[ 20 ],
szButtons[ 20 ], szForward[ 20 ], szSide[ 20 ], szUp[ 20 ], szVelocityX[ 20 ], szVelocityY[ 20 ], szVelocityZ[ 20 ];
new Float:fOrigin[ 3 ], Float:fAngles[ 3 ], biButtons, Float:fForwardMove, Float:fSideMove, Float:fUpMove, Float:fVelocity[ 3 ], iTime;
new szAccount[ 32 ], szTime[ 20 ];
fgets( hFile, szLine, charsmax( szLine ) );
parse( szLine, szAccount, charsmax( szAccount ), szTime, charsmax( szTime ) );
//GetNickFromAccount( szAccount, g_szBotName, charsmax( g_szBotName ) );
formatex(g_szBotName, charsmax( g_szBotName ), szAccount);
//get_user_name( iEnt, g_szBotName, charsmax( g_szBotName ) );
g_fBotTime = str_to_float( szTime );
while( !feof( hFile ) )
{
fgets( hFile, szLine, charsmax( szLine ) );
parse( szLine, szOriginX, charsmax( szOriginX ), szOriginY, charsmax( szOriginY ), szOriginZ, charsmax( szOriginZ ),
szAngleX, charsmax( szAngleX ), szAngleY, charsmax( szAngleY ), szAngleZ, charsmax( szAngleZ ),
szButtons, charsmax( szButtons ), szForward, charsmax( szForward ), szSide, charsmax( szSide ), szUp, charsmax( szUp ),
szVelocityX, charsmax( szVelocityX ), szVelocityY, charsmax( szVelocityY ), szVelocityZ, charsmax( szVelocityZ ),
szTime, charsmax( szTime )
);
fOrigin[ 0 ] = str_to_float( szOriginX );
fOrigin[ 1 ] = str_to_float( szOriginY );
fOrigin[ 2 ] = str_to_float( szOriginZ );
fAngles[ 0 ] = str_to_float( szAngleX );
fAngles[ 1 ] = str_to_float( szAngleY );
fAngles[ 2 ] = str_to_float( szAngleZ );
fVelocity[ 0 ] = str_to_float( szVelocityX );
fVelocity[ 1 ] = str_to_float( szVelocityY );
fVelocity[ 2 ] = str_to_float( szVelocityZ );
biButtons = str_to_num( szButtons );
fForwardMove = str_to_float( szForward );
fSideMove = str_to_float( szSide );
fUpMove = str_to_float( szUp );
iTime = str_to_num( szTime );
ArrayPushArray( g_aPlayerOrigin[ 0 ], fOrigin );
ArrayPushArray( g_aPlayerAngles[ 0 ], fAngles );
ArrayPushArray( g_aPlayerVelocity[ 0 ], fVelocity );
ArrayPushCell( g_aPlayerButtons[ 0 ], biButtons );
ArrayPushCell( g_aPlayerForwardMove[ 0 ], fForwardMove );
ArrayPushCell( g_aPlayerSideMove[ 0 ], fSideMove );
ArrayPushCell( g_aPlayerUpMove[ 0 ], fUpMove );
ArrayPushCell( g_aPlayerTime[ 0 ], iTime );
}
fclose( hFile );
log_amx( "Información del bot cargada. Total de lineas de archivo: %i", ArraySize( g_aPlayerOrigin[ 0 ] ) );
set_task( 5.0, "LoadBot", g_iTaskLoadBot );
}
}
public kz_startclimb( iClient ) {
ArrayClear( g_aPlayerOrigin[ iClient ] );
ArrayClear( g_aPlayerAngles[ iClient ] );
ArrayClear( g_aPlayerButtons[ iClient ] );
ArrayClear( g_aPlayerForwardMove[ iClient ] );
ArrayClear( g_aPlayerSideMove[ iClient ] );
ArrayClear( g_aPlayerUpMove[ iClient ] );
ArrayClear( g_aPlayerVelocity[ iClient ] );
ArrayClear( g_aPlayerTime[ iClient ] );
}
SaveRun( iClient, Float:fTime )
{
new szConfigsDir[ 64 ], szBotPath[ 256 ], szMapName[ 32 ], szAccount[ 32 ], szLine[ 386 ], hFile;
get_user_name( iClient, szAccount, charsmax( szAccount ) );
//get_user_name(id,g_playername[id],charsmax(g_playername[]))
get_localinfo( "amxx_configsdir", szConfigsDir, charsmax( szConfigsDir ) );
get_mapname( szMapName, charsmax( szMapName ) );
formatex( szBotPath, charsmax( szBotPath ), "%s/kz/BotRepeater/%s.ini", szConfigsDir, szMapName );
if( file_exists( szBotPath ) )
{
delete_file( szBotPath );
}
if( g_iBotIndex )
{
server_cmd( "kick #%i", get_user_userid( g_iBotIndex ) );
ArrayClear( g_aPlayerOrigin[ 0 ] );
ArrayClear( g_aPlayerAngles[ 0 ] );
ArrayClear( g_aPlayerButtons[ 0 ] );
ArrayClear( g_aPlayerForwardMove[ 0 ] );
ArrayClear( g_aPlayerSideMove[ 0 ] );
ArrayClear( g_aPlayerUpMove[ 0 ] );
ArrayClear( g_aPlayerVelocity[ 0 ] );
ArrayClear( g_aPlayerTime[ 0 ] );
g_iBotIndex = 0;
}
hFile = fopen( szBotPath, "a+" );
if( hFile )
{
new iSize = ArraySize( g_aPlayerOrigin[ iClient ] );
new Float:fOrigin[ 3 ], Float:fAngles[ 3 ], biButtons, Float:fForwardMove, Float:fSideMove, Float:fUpMove, Float:fVelocity[ 3 ], iTime;
formatex( szLine, charsmax( szLine ), "^"%s^" ^"%f^"^n", szAccount, fTime );
fputs( hFile, szLine );
get_user_name(iClient, g_szBotName, charsmax( g_szBotName ) )
//GetNickFromAccount( szAccount, g_szBotName, charsmax( g_szBotName ) );
g_fBotTime = fTime;
for( new i = 0; i < iSize; i++ )
{
ArrayGetArray( g_aPlayerOrigin[ iClient ], i, fOrigin );
ArrayGetArray( g_aPlayerAngles[ iClient ], i, fAngles );
ArrayGetArray( g_aPlayerVelocity[ iClient ], i, fVelocity );
biButtons = ArrayGetCell( g_aPlayerButtons[ iClient ], i );
fForwardMove = ArrayGetCell( g_aPlayerForwardMove[ iClient ], i );
fSideMove = ArrayGetCell( g_aPlayerSideMove[ iClient ], i );
fUpMove = ArrayGetCell( g_aPlayerUpMove[ iClient ], i );
iTime = ArrayGetCell( g_aPlayerTime[ iClient ], i );
formatex( szLine, charsmax( szLine ), "^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%i^" ^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%f^" ^"%i^"%s", fOrigin[ 0 ], fOrigin[ 1 ], fOrigin[ 2 ], fAngles[ 0 ], fAngles[ 1 ], fAngles[ 2 ], biButtons, fForwardMove, fSideMove, fUpMove, fVelocity[ 0 ], fVelocity[ 1 ], fVelocity[ 2 ], iTime, ( i + 1 == iSize ? "" : "^n" ) );
fputs( hFile, szLine );
ArrayPushArray( g_aPlayerOrigin[ 0 ], fOrigin );
ArrayPushArray( g_aPlayerAngles[ 0 ], fAngles );
ArrayPushArray( g_aPlayerVelocity[ 0 ], fVelocity );
ArrayPushCell( g_aPlayerButtons[ 0 ], biButtons );
ArrayPushCell( g_aPlayerForwardMove[ 0 ], fForwardMove );
ArrayPushCell( g_aPlayerSideMove[ 0 ], fSideMove );
ArrayPushCell( g_aPlayerUpMove[ 0 ], fUpMove );
ArrayPushCell( g_aPlayerTime[ 0 ], iTime );
}
fclose( hFile );
if( task_exists( g_iTaskLoadBot ) )
remove_task( g_iTaskLoadBot );
set_task( 5.0, "LoadBot", g_iTaskLoadBot );
}
}
public LoadBot( )
{
if( get_playersnum( 1 ) == get_maxplayers( ) )
{
set_task( 30.0, "LoadBot", g_iTaskLoadBot );
return;
}
if( g_iBotIndex )
{
server_cmd( "kick #%i", get_user_userid( g_iBotIndex ) );
g_iBotIndex = 0;
}
new iMin = floatround( g_fBotTime, floatround_floor ) / 60;
new Float:iSec = g_fBotTime - ( 60 * iMin );
formatex( g_szBotName, charsmax( g_szBotName ), "%s %s%i:%s%.5f", g_szBotName, iMin > 9 ? "" : "0", iMin, iSec > 9 ? "" : "0", iSec );
new iBot = engfunc( EngFunc_CreateFakeClient, g_szBotName );
if( iBot )
{
engfunc( EngFunc_FreeEntPrivateData, iBot );
set_user_info( iBot, "model", "gordon" );
set_user_info( iBot, "rate", "3500" );
set_user_info( iBot, "cl_updaterate", "30" );
set_user_info( iBot, "cl_lw", "0" );
set_user_info( iBot, "cl_lc", "0" );
set_user_info( iBot, "tracker", "0" );
set_user_info( iBot, "cl_dlmax", "128" );
set_user_info( iBot, "lefthand", "1" );
set_user_info( iBot, "friends", "0" );
set_user_info( iBot, "dm", "0" );
set_user_info( iBot, "ah", "1" );
set_user_info( iBot, "*bot", "1" );
set_user_info( iBot, "_cl_autowepswitch", "1" );
set_user_info( iBot, "_vgui_menu", "0" );
set_user_info( iBot, "_vgui_menus", "1" );
new szRejectReason[ 128 ];
dllfunc( DLLFunc_ClientConnect, iBot, g_szBotName, szRejectReason );
if( !is_user_connected( iBot ) )
return;
dllfunc( DLLFunc_ClientPutInServer, iBot );
set_pev( iBot, pev_spawnflags, pev( iBot, pev_spawnflags ) | FL_FAKECLIENT );
set_pev( iBot, pev_flags, pev( iBot, pev_flags ) | FL_FAKECLIENT );
engclient_cmd( iBot, "jointeam", "2" );
engclient_cmd( iBot, "joinclass", "2" );
g_iBotIndex = iBot; // Salva o ID do bot ANTES de qualquer possibilidade de retorno
if( cs_get_user_team( iBot ) == CS_TEAM_CT )
ExecuteHam( Ham_CS_RoundRespawn, iBot );
if( !is_user_alive( iBot ) )
return;
give_item( iBot, "weapon_knife" );
set_user_godmode( iBot, 1 );
cs_set_user_model(iBot, "vip")
}
}
public OnRecordThink( iEnt )
{
if( !pev_valid( iEnt ) )
return PLUGIN_CONTINUE;
static iPlayers[ 32 ], iNum, iClient;
get_players( iPlayers, iNum, "a" );
for( new i = 0; i < iNum; i++ )
{
iClient = iPlayers[ i ];
if( iClient == g_iBotIndex )
{
g_iCurrentFrame++;
if( g_iCurrentFrame < ArraySize( g_aPlayerOrigin[ 0 ] ) )
{
static Float:fOrigin[ 3 ], Float:fAngles[ 3 ], biButtons, Float:fForwardMove, Float:fSideMove, Float:fUpMove, Float:fVelocity[ 3 ];
ArrayGetArray( g_aPlayerOrigin[ 0 ], g_iCurrentFrame, fOrigin );
ArrayGetArray( g_aPlayerAngles[ 0 ], g_iCurrentFrame, fAngles );
ArrayGetArray( g_aPlayerVelocity[ 0 ], g_iCurrentFrame, fVelocity );
biButtons = ArrayGetCell( g_aPlayerButtons[ 0 ], g_iCurrentFrame );
fForwardMove = ArrayGetCell( g_aPlayerForwardMove[ 0 ], g_iCurrentFrame );
fSideMove = ArrayGetCell( g_aPlayerSideMove[ 0 ], g_iCurrentFrame );
fUpMove = ArrayGetCell( g_aPlayerUpMove[ 0 ], g_iCurrentFrame );
set_pev( iClient, pev_v_angle, fAngles );
fAngles[ 0 ] /= -3.0;
biButtons &= ~IN_USE;
biButtons &= ~IN_ATTACK;
biButtons &= ~IN_ATTACK2;
set_pev( iClient, pev_movetype, MOVETYPE_NOCLIP );
set_pev( iClient, pev_solid, SOLID_NOT );
set_pev( iClient, pev_angles, fAngles );
set_pev( iClient, pev_origin, fOrigin );
set_pev( iClient, pev_velocity, fVelocity );
set_pev( iClient, pev_button, biButtons );
set_pev( iClient, pev_fixangle, 1 );
engfunc( EngFunc_RunPlayerMove, iClient, fAngles, fForwardMove, fSideMove, fUpMove, biButtons, 0, 10 );
if( pev( iClient, pev_flags ) & FL_ONGROUND )
{
if( biButtons & IN_DUCK && IsMoving( biButtons ) )
set_pev( iClient, pev_gaitsequence, 5 );
else if( biButtons & IN_DUCK )
set_pev( iClient, pev_gaitsequence, 2 );
else
set_pev( iClient, pev_gaitsequence, 4 );
if( biButtons & IN_JUMP )
set_pev( iClient, pev_gaitsequence, 6 );
else
set_pev( iClient, pev_gaitsequence, 4 );
}
else
{
if( biButtons & IN_JUMP )
set_pev( iClient, pev_gaitsequence, 6 );
else if( biButtons & IN_DUCK )
set_pev( iClient, pev_gaitsequence, 5 );
else
set_pev( iClient, pev_gaitsequence, 6 );
}
}
else
g_iCurrentFrame = 0;
}
else
{
if( kz_get_user_status( iClient ) )
{
static Float:fOrigin[ 3 ], Float:fAngles[ 3 ], biButtons, Float:fVelocity[ 3 ];
pev( iClient, pev_origin, fOrigin );
pev( iClient, pev_v_angle, fAngles );
pev( iClient, pev_button, biButtons );
pev( iClient, pev_velocity, fVelocity );
ArrayPushArray( g_aPlayerOrigin[ iClient ], fOrigin );
ArrayPushArray( g_aPlayerAngles[ iClient ], fAngles );
ArrayPushArray( g_aPlayerVelocity[ iClient ], fVelocity );
ArrayPushCell( g_aPlayerButtons[ iClient ], biButtons );
ArrayPushCell( g_aPlayerForwardMove[ iClient ], g_fForwardMove[ iClient ] );
ArrayPushCell( g_aPlayerSideMove[ iClient ], g_fSideMove[ iClient ] );
ArrayPushCell( g_aPlayerUpMove[ iClient ], g_fUpMove[ iClient ] );
ArrayPushCell( g_aPlayerTime[ iClient ], kz_get_user_roundtime( iClient ) ); // Mudar isso para o float que eu criei se formatar
}
/*else if( g_bPreRun[ iClient ] && !kz_get_user_status( ) ) // Record PreRun
{
}*/
}
}
set_pev( iEnt, pev_nextthink, get_gametime( ) + 0.009 );
return PLUGIN_CONTINUE;
}
public OnCmdStart( iClient, iUcHandler, iSeed )
{
if( !is_user_alive( iClient ) )
return FMRES_IGNORED;
if( !kz_get_user_status( iClient ) )
return FMRES_IGNORED;
static Float:fForwardMove, Float:fSideMove, Float:fUpMove;
get_uc( iUcHandler, UC_ForwardMove, fForwardMove );
get_uc( iUcHandler, UC_SideMove, fSideMove );
get_uc( iUcHandler, UC_UpMove, fUpMove );
g_fForwardMove[ iClient ] = fForwardMove;
g_fSideMove[ iClient ] = fSideMove;
g_fUpMove[ iClient ] = fUpMove;
return FMRES_IGNORED;
}
public OnDeletePro( iClient, szMap[ 32 ], bool:bIsPro ) // Procurar pelo BotRepeater na pasta atual e na pasta OldRuns
{
if( !bIsPro )
return;
new szConfigsDir[ 64 ], szFilePath[ 192 ];
get_localinfo( "amxx_configsdir", szConfigsDir, charsmax( szConfigsDir ) );
formatex( szFilePath, charsmax( szFilePath ), "%s/kz/BotRepeater/%s.ini", szConfigsDir, szMap );
if( !file_exists( szFilePath ) )
return;
new szCurMap[ 32 ];
get_mapname( szCurMap, charsmax( szCurMap ) );
if( delete_file( szFilePath ) == 1 )
{
if( equali( szMap, szCurMap ) && g_iBotIndex > 0 )
{
server_cmd( "kick #%i", get_user_userid( g_iBotIndex ) );
ArrayClear( g_aPlayerOrigin[ 0 ] );
ArrayClear( g_aPlayerAngles[ 0 ] );
ArrayClear( g_aPlayerButtons[ 0 ] );
ArrayClear( g_aPlayerForwardMove[ 0 ] );
ArrayClear( g_aPlayerSideMove[ 0 ] );
ArrayClear( g_aPlayerUpMove[ 0 ] );
ArrayClear( g_aPlayerVelocity[ 0 ] );
ArrayClear( g_aPlayerTime[ 0 ] );
g_iBotIndex = 0;
}
console_print( iClient, "[ BmX Pro BOT ] Bot do mapa %s tambem foi removido.", szMap );
}
}
public plugin_end( )
{
for( new i = 0; i < 33; i++ )
{
ArrayDestroy( g_aPlayerOrigin[ i ] );
ArrayDestroy( g_aPlayerAngles[ i ] );
ArrayDestroy( g_aPlayerButtons[ i ] );
ArrayDestroy( g_aPlayerForwardMove[ i ] );
ArrayDestroy( g_aPlayerSideMove[ i ] );
ArrayDestroy( g_aPlayerUpMove[ i ] );
ArrayDestroy( g_aPlayerVelocity[ i ] );
ArrayDestroy( g_aPlayerTime[ i ] );
}
}
bool:IsMoving( biButtons )
{
if( biButtons & IN_FORWARD || biButtons & IN_BACK || biButtons & IN_LEFT || biButtons & IN_RIGHT )
return true;
return false;
}
stock fcopy( read_path[ 256 ], dest_path[ 256 ], FWrite:flags = FW_NONE )
{
new fp_read = fopen( read_path, "rb" );
if( !fp_read )
{
fclose( fp_read )
return 0;
}
if( file_exists( dest_path ) && !( flags & FW_CANOVERRIDE ) )
return 0;
new fp_write = fopen( dest_path, "wb" );
static buffer[ 256 ];
static readsize;
fseek( fp_read, 0, SEEK_END );
new fsize = ftell( fp_read );
fseek( fp_read, 0, SEEK_SET );
for( new j = 0; j < fsize; j+= 256 )
{
readsize = fread_blocks( fp_read, buffer, 256, BLOCK_CHAR );
fwrite_blocks( fp_write, buffer, readsize, BLOCK_CHAR );
}
fclose( fp_read );
fclose( fp_write );
if( flags & FW_DELETESOURCE )
delete_file( read_path );
return 1;
}
public Native_GetReplayBotIndex(iPlugin, iParams) {
return g_iBotIndex;
}
public Float:Native_GetBotVelocityX(iPlugin, iParams) {
if(!g_iBotIndex)
return 0.0;
new Float:fVelocity[3];
ArrayGetArray(g_aPlayerVelocity[0], g_iCurrentFrame, fVelocity);
return fVelocity[0];
}
public Float:Native_GetBotVelocityY(iPlugin, iParams) {
if(!g_iBotIndex)
return 0.0;
new Float:fVelocity[3];
ArrayGetArray(g_aPlayerVelocity[0], g_iCurrentFrame, fVelocity);
return fVelocity[1];
}
public Float:Native_GetBotVelocityZ(iPlugin, iParams) {
if(!g_iBotIndex)
return 0.0;
new Float:fVelocity[3];
ArrayGetArray( g_aPlayerVelocity[0 ], g_iCurrentFrame, fVelocity);
return fVelocity[2];
}
public Native_GetBotButtons(iPlugin, iParams) {
if(!g_iBotIndex)
return 0;
return ArrayGetCell(g_aPlayerButtons[0], g_iCurrentFrame)
}
public Native_GetBotTime(iPlugin, iParams) {
if(!g_iBotIndex)
return 0;
return ArrayGetCell(g_aPlayerTime[0], g_iCurrentFrame);
}