Yanlışlık Varmı Pluginde Acil Bakarmısınız
Gönderilme zamanı: Cum Mar 10, 2017 10:49 pm
Kod: Tümünü seç
#include <amxmodx>
#include <fakemeta>
#define START_DISTANCE 32 // --| The first search distance for finding a free location in the map.
#define MAX_ATTEMPTS 128 // --| How many times to search in an area for a free space.
#define MAX_CLIENTS 32
new Float:gf_LastCmdTime[ MAX_CLIENTS + 1 ];
new gp_UnstuckFrequency;
// --| Just for readability.
enum Coord_e { Float:x, Float:y, Float:z };
// --| Macro.
#define GetPlayerHullSize(%1) ( ( pev ( %1, pev_flags ) & FL_DUCKING ) ? HULL_HEAD : HULL_HUMAN )
public plugin_init ()
{
register_plugin ( "Unstick Player", "1.0.2", "Arkshine" );
// --| Cvars.
gp_UnstuckFrequency = register_cvar ( "amx_unstuck_frequency", "4.0" );
// --| Client command.
register_clcmd ( "unstuck" , "ClientCommand_UnStick" );
register_clcmd ( "say /stuck" , "ClientCommand_UnStick" );
register_clcmd ( "say_team /unstuck", "ClientCommand_UnStick" );
register_clcmd ( "say /unstuck" , "ClientCommand_UnStick" );
register_clcmd ( "say /kurtul" , "ClientCommand_UnStick" );
register_clcmd ( "say_team /kurtul" , "ClientCommand_UnStick" );
}
public ClientCommand_UnStick ( const id )
{
new Float:f_MinFrequency = get_pcvar_float ( gp_UnstuckFrequency );
new Float:f_ElapsedCmdTime = get_gametime () - gf_LastCmdTime[ id ];
if ( f_ElapsedCmdTime < f_MinFrequency )
{
client_print ( id, print_chat, "[AMXX] You must wait %.1f seconds before trying to free yourself.", f_MinFrequency - f_ElapsedCmdTime );
return PLUGIN_HANDLED;
}
gf_LastCmdTime[ id ] = get_gametime ();
new i_Value;
if ( ( i_Value = UTIL_UnstickPlayer ( id, START_DISTANCE, MAX_ATTEMPTS ) ) != 1 )
{
switch ( i_Value )
{
case 0 : client_print ( id, print_chat, "[AMXX] Kurtulmak Icin Say'a /kurtul yada /stuck Yaz" );
case -1 : client_print ( id, print_chat, "[AMXX] Bugdan Kurtulmak Icin Say'a /kurtul yada /stuck Yaz" );
}
}
return PLUGIN_CONTINUE;
}
UTIL_UnstickPlayer ( const id, const i_StartDistance, const i_MaxAttempts )
{
// --| Not alive, ignore.
if ( !is_user_alive ( id ) ) return -1
static Float:vf_OriginalOrigin[ Coord_e ], Float:vf_NewOrigin[ Coord_e ];
static i_Attempts, i_Distance;
// --| Get the current player's origin.
pev ( id, pev_origin, vf_OriginalOrigin );
i_Distance = i_StartDistance;
while ( i_Distance < 1000 )
{
i_Attempts = i_MaxAttempts;
while ( i_Attempts-- )
{
vf_NewOrigin[ x ] = random_float ( vf_OriginalOrigin[ x ] - i_Distance, vf_OriginalOrigin[ x ] + i_Distance );
vf_NewOrigin[ y ] = random_float ( vf_OriginalOrigin[ y ] - i_Distance, vf_OriginalOrigin[ y ] + i_Distance );
vf_NewOrigin[ z ] = random_float ( vf_OriginalOrigin[ z ] - i_Distance, vf_OriginalOrigin[ z ] + i_Distance );
engfunc ( EngFunc_TraceHull, vf_NewOrigin, vf_NewOrigin, DONT_IGNORE_MONSTERS, GetPlayerHullSize ( id ), id, 0 );
// --| Free space found.
if ( get_tr2 ( 0, TR_InOpen ) && !get_tr2 ( 0, TR_AllSolid ) && !get_tr2 ( 0, TR_StartSolid ) )
{
// --| Set the new origin .
engfunc ( EngFunc_SetOrigin, id, vf_NewOrigin );
return 1;
}
}
i_Distance += i_StartDistance;
}
// --| Could not be found.
return 0;
}

@TunnS[C]
@alpersoylu34
@Tasarimci v2