Лек едит на Auto Unstuck

Въпроси и проблеми свързани с AMXModX.
Аватар
tom1k
Извън линия
Потребител
Потребител
Мнения: 202
Регистриран на: 29 Сеп 2020, 23:50
Местоположение: Добрич
Се отблагодари: 16 пъти
Получена благодарност: 8 пъти

Лек едит на Auto Unstuck

Мнение от tom1k » 17 Дек 2020, 00:43

Добър вечер!
Ако може да се добави команда /unstuck и да те Unstuck-ва. Също така като си сам в сървъра самия плъгин спира да работи, ако може да се оправи. Благодаря!

Код за потвърждение: Избери целия код

#include <amxmodx> 
#include <fun>
#include <fakemeta_util>

#pragma semicolon 1 

#define DISTANCE 220 

new g_iTeam[33]; 
new bool:g_bSolid[33]; 
new bool:g_bHasSemiclip[33]; 
new Float:g_fOrigin[33][3]; 

new bool:g_bSemiclipEnabled; 

new g_iForwardId[3]; 
new g_iMaxPlayers; 
new g_iCvar[3]; 

new stuck[33];

public plugin_init( ) 
{ 
    register_plugin( "Semiclip", "1.0", "dedihost" ); 
     
    g_iCvar[0] = register_cvar( "semiclip_enabled", "1" ); 
    g_iCvar[1] = register_cvar( "semiclip_teamclip", "1" ); 
    g_iCvar[2] = register_cvar( "semiclip_transparancy", "1" ); 
    set_task(0.1,"checkstuck",0,"",0,"b");
    register_forward( FM_ClientCommand, "fwdClientCommand" ); 
     
    if( get_pcvar_num( g_iCvar[0] ) ) 
    { 
        g_iForwardId[0] = register_forward( FM_PlayerPreThink, "fwdPlayerPreThink" ); 
        g_iForwardId[1] = register_forward( FM_PlayerPostThink, "fwdPlayerPostThink" ); 
        g_iForwardId[2] = register_forward( FM_AddToFullPack, "fwdAddToFullPack_Post", 1 ); 
         
        g_bSemiclipEnabled = true; 
    } 
    else 
        g_bSemiclipEnabled = false; 
         
  
     
    g_iMaxPlayers = get_maxplayers( ); 
} 

public client_disconnected( id )
{
	if( id == g_iMaxPlayers )
	{
		new old = g_iMaxPlayers;
		for( new i=1; i<old; i++ )
		{
			if( is_user_connected(i) )
				g_iMaxPlayers = i;
		}
	}
}



public fwdPlayerPreThink( plr ) 
{ 
    static id, last_think; 

    if( last_think > plr ) 
    { 
        for( id = 1 ; id <= g_iMaxPlayers ; id++ ) 
        { 
            if( is_user_alive( id ) ) 
            { 
                if( get_pcvar_num( g_iCvar[1] ) ) 
                    g_iTeam[id] = get_user_team( id ); 
                 
                g_bSolid[id] = pev( id, pev_solid ) == SOLID_SLIDEBOX ? true : false; 
                pev( id, pev_origin, g_fOrigin[id] ); 
            } 
            else 
                g_bSolid[id] = false; 
        } 
    } 

    last_think = plr; 

    if( g_bSolid[plr] ) 
    { 
        for( id = 1 ; id <= g_iMaxPlayers ; id++ ) 
        { 
            if( g_bSolid[id] && get_distance_f( g_fOrigin[plr], g_fOrigin[id] ) <= DISTANCE && id != plr ) 
            { 
                if(g_iTeam[plr] != g_iTeam[id])
                    return FMRES_IGNORED; 
     
                set_pev( id, pev_solid, SOLID_NOT ); 
                g_bHasSemiclip[id] = true; 
            } 
        } 
    } 

    return FMRES_IGNORED; 
} 

public fwdPlayerPostThink( plr ) 
{ 
    static id; 

    for( id = 1 ; id <= g_iMaxPlayers ; id++ ) 
    { 
        if( g_bHasSemiclip[id] ) 
        { 
            set_pev( id, pev_solid, SOLID_SLIDEBOX ); 
            g_bHasSemiclip[id] = false; 
        } 
    } 
} 

public fwdAddToFullPack_Post( es_handle, e, ent, host, hostflags, player, pset ) 
{ 
    if( player ) 
    { 
        if( g_bSolid[host] && g_bSolid[ent] && get_distance_f( g_fOrigin[host], g_fOrigin[ent] ) <= DISTANCE )
        { 
            if( get_pcvar_num( g_iCvar[1] ) && g_iTeam[host] != g_iTeam[ent] ) 
                return FMRES_IGNORED; 
                 
            set_es( es_handle, ES_Solid, SOLID_NOT ); // makes semiclip flawless 
             
            if( get_pcvar_num( g_iCvar[2] ) == 1 ) 
            { 
                set_es( es_handle, ES_RenderMode, kRenderTransAlpha ); 
                set_es( es_handle, ES_RenderAmt, 85 ); 
            } 
            else if( get_pcvar_num( g_iCvar[2] ) == 2 ) 
            { 
                set_es( es_handle, ES_Effects, EF_NODRAW ); 
                set_es( es_handle, ES_Solid, SOLID_NOT ); 
            } 
        } 
    } 
     
    return FMRES_IGNORED; 
} 

// is there a better way to detect changings of g_iCvar[0]? 
public fwdClientCommand( plr ) 
{ 
    // use the forwards just when needed, for good performance 
    if( !get_pcvar_num( g_iCvar[0] ) && g_bSemiclipEnabled ) 
    { 
        unregister_forward( FM_PlayerPreThink, g_iForwardId[0] ); 
        unregister_forward( FM_PlayerPostThink, g_iForwardId[1] ); 
        unregister_forward( FM_AddToFullPack, g_iForwardId[2], 1 ); 
         
        g_bSemiclipEnabled = false; 
    } 
    else if( get_pcvar_num( g_iCvar[0] ) && !g_bSemiclipEnabled ) 
    { 
        g_iForwardId[0] = register_forward( FM_PlayerPreThink, "fwdPlayerPreThink" ); 
        g_iForwardId[1] = register_forward( FM_PlayerPostThink, "fwdPlayerPostThink" ); 
        g_iForwardId[2] = register_forward( FM_AddToFullPack, "fwdAddToFullPack_Post", 1 ); 
         
        g_bSemiclipEnabled = true; 
    } 
} 


public checkstuck()
{
	static players[32], pnum, player, i;
	get_players(players, pnum);
	static Float:origin[3], hull;
	for( i=0; i<pnum; i++ )
	{
		player = players[i];
		if( is_user_alive(player) )
		{
			if( !g_bSolid[player] )
			{
				stuck[player] = 0;
				continue;
			}

			pev(player, pev_origin, origin);
			hull = pev(player, pev_flags) & FL_DUCKING ? HULL_HEAD : HULL_HUMAN;
			if( !is_hull_vacant(origin, hull,player) && !get_user_noclip(player))
			{
				++stuck[player];
				if( stuck[player] >= 10 )
				{
					
					
						
								
					

					if( _asdf( player) == 1 )
					{
						effects(player);
					}
					stuck[player] = 0;
				}
			}
			else
			{
				stuck[player] = 0;
			}
		}
	}
}


stock _asdf(id)
{
	new hullsize = (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN;

	new Float:origin[3], tr = 0; 
	pev(id, pev_origin, origin);


		engfunc(EngFunc_TraceHull, origin, origin, 0, hullsize, id, tr);

		//engfunc(EngFunc_TraceHull, origin, origin, IGNORE_MONSTERS, hullsize, id, tr);

	if( !get_tr2(tr,TR_StartSolid) && !get_tr2(tr,TR_AllSolid) && get_tr2(tr,TR_InOpen) )
		return -1;

	new Float:new_origin[3], distance, i, trace, Float:fraction;

	const UNSTUCK_START_DISTANCE = 32;
	const UNSTUCK_MAX_ATTEMPTS = 128;

	distance = UNSTUCK_START_DISTANCE;

	while( distance < 1000 ) {	// 1000 is just incase, should never get anywhere near that
		for( i = 0; i < UNSTUCK_MAX_ATTEMPTS; i++ ){
			new_origin[0] = random_float(origin[0]-distance, origin[0]+distance);
			new_origin[1] = random_float(origin[1]-distance, origin[1]+distance);
			new_origin[2] = random_float(origin[2]-distance, origin[2]+distance);

			if ( fm_trace_hull(new_origin, hullsize, id) == 0 ) {
				engfunc(EngFunc_TraceLine, origin, new_origin, IGNORE_MONSTERS, id, trace);
				get_tr2(trace, TR_flFraction, fraction);
				if( fraction == 1.0 )
				{
					fm_entity_set_origin(id, new_origin);
					return 1;
				}
			}
		}
		distance += UNSTUCK_START_DISTANCE;
	}

	return 0;
}
bool:is_hull_vacant(const Float:origin[3], hull,id) {
	static tr, phit;
	engfunc(EngFunc_TraceHull, origin, origin, 0, hull, id, tr);
phit = get_tr2( tr, TR_pHit );
if ( !get_tr2( tr, TR_StartSolid ) || !get_tr2( tr, TR_AllSolid ) || (is_user_alive(phit) && get_user_team(phit)==get_user_team(id) ) )

		return true;
	
	return false;
}
effects(id)
{
	set_hudmessage(255,150,50, -1.0, 0.65, 0, 6.0, 1.5,0.1,0.7); // HUDMESSAGE
	show_hudmessage(id,"Automatic Unstuck!"); // HUDMESSAGE
	message_begin(MSG_ONE_UNRELIABLE,105,{0,0,0},id );      
	write_short(1<<10);   // fade lasts this long duration
	write_short(1<<10);   // fade lasts this long hold time
	write_short(1<<1);   // fade type (in / out)
	write_byte(20);            // fade red
	write_byte(255);    // fade green
	write_byte(255);        // fade blue
	write_byte(255);    // fade alpha
	message_end();
	client_cmd(id,"spk fvox/blip.wav");
}
iG-Blockmaker # HNS 100aa
45.144.155.175:27018


Аватар
tom1k
Извън линия
Потребител
Потребител
Мнения: 202
Регистриран на: 29 Сеп 2020, 23:50
Местоположение: Добрич
Се отблагодари: 16 пъти
Получена благодарност: 8 пъти

Лек едит на Auto Unstuck

Мнение от tom1k » 22 Дек 2020, 02:10

Още ми трябва! .. Благодаря.
iG-Blockmaker # HNS 100aa
45.144.155.175:27018


Аватар
tom1k
Извън линия
Потребител
Потребител
Мнения: 202
Регистриран на: 29 Сеп 2020, 23:50
Местоположение: Добрич
Се отблагодари: 16 пъти
Получена благодарност: 8 пъти

Лек едит на Auto Unstuck

Мнение от tom1k » 03 Апр 2021, 17:42

tom1k написа: 22 Дек 2020, 02:10 Още ми трябва! .. Благодаря.
Още ми трябва!
iG-Blockmaker # HNS 100aa
45.144.155.175:27018


Аватар
tom1k
Извън линия
Потребител
Потребител
Мнения: 202
Регистриран на: 29 Сеп 2020, 23:50
Местоположение: Добрич
Се отблагодари: 16 пъти
Получена благодарност: 8 пъти

Лек едит на Auto Unstuck

Мнение от tom1k » 15 Апр 2021, 09:25

Единствено ми трябва да се добави команда /unstuck
iG-Blockmaker # HNS 100aa
45.144.155.175:27018


Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Поддръжка / Помощ”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта