ReHLDS/HLDS Unreal Vehicle Fixer

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
358
Пол
Мужской
Unreal Vehicle Fixer

Версия 0.2


Исправляет геймплей на картах с автомобилями! Скажи нет убийству тиммейтов!

( Например карта big_city2 или любая другая на которой есть машины! )

* Теперь нельзя убивать своих тиммейтов.
* А за убийство врагов дается фраг!!
* А так же работающая регистрация убийств заложников.

Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <cstrike>

#define is_user_valid(%1)			(1 <= %1 <= MAX_PLAYERS)

new g_pCarDriver[MAX_PLAYERS + 1]= {0,...};
new Float:g_fLastAttacked[MAX_PLAYERS + 1] = {0.0,...};

public plugin_init() 
{
	register_plugin("UNREAL VEHICLE FIXER", "0.2", "KARAULOV");
	register_cvar("car_fixer", "0.2", FCVAR_SPONLY|FCVAR_UNLOGGED)
	
	if (cvar_exists("mp_legacy_vehicle_block"))
	{
		log_amx("This plugin can be disabled, because mp_legacy_vehicle_block cvar is exists!");
	}
	
	register_forward(FM_Blocked, "fw_Blocked", false)
	RegisterHam( Ham_OnControls, "func_vehicle", "FuncButtonVehicle", 1 ); 
}

public FuncButtonVehicle(pCar, pBlocker)
{
	if (is_user_valid(pBlocker))
	{
		g_pCarDriver[pBlocker] = pCar;
	}
}

public get_pDriver(pCar)
{
	for(new i = 1; i <= MAX_PLAYERS;i++)
	{
		if (g_pCarDriver[i] == pCar)
			return i;
	}
	return 0;
}

public client_disconnected(id)
{
	if (task_exists(id))
		remove_task(id);
}

public check_if_stuck(pStucker)
{
	if (!(pev(pStucker,pev_flags) & FL_ONGROUND))
	{
		new Float:fCurOrg[3];
		pev(pStucker,pev_origin,fCurOrg);
		fCurOrg[2]+=2.0;
		set_pev(pStucker,pev_origin,fCurOrg);
	}
}

public fw_Blocked(pCar, pBlocker)
{
	if (!is_valid_ent(pCar))
		return FMRES_IGNORED;
		
	if (!is_valid_ent(pBlocker))
		return FMRES_IGNORED;
		
	if (pev(pBlocker,pev_groundentity) == pCar)
	{
		new Float:v_fCarVel[3];
		pev(pCar,pev_velocity,v_fCarVel)
		set_pev(pBlocker, pev_velocity,v_fCarVel);
		if (!(pev(pBlocker,pev_flags) & FL_ONGROUND))
		{
			new Float:fCurOrg[3];
			pev(pBlocker,pev_origin,fCurOrg);
			fCurOrg[2]+=5.0;
			set_pev(pBlocker,pev_origin,fCurOrg);
		}
		return FMRES_SUPERCEDE;
	}
	
	if (is_user_valid(pBlocker) && !task_exists(pBlocker) && !(pev(pBlocker,pev_flags) & FL_ONGROUND))
	{
		set_task(0.1,"check_if_stuck",pBlocker);
	}
	
	new pDriver = get_pDriver(pCar);
	new classname[32];
	pev(pBlocker, pev_classname, classname,charsmax(classname));
	if (!is_user_valid(pBlocker) && !equal(classname,"hostage_entity"))
		return FMRES_IGNORED;
	pev(pCar, pev_classname, classname,charsmax(classname));
	if (!equal(classname,"func_vehicle"))
		return FMRES_IGNORED;
	
	new Float:v_fCarVel[3];
	pev(pCar,pev_velocity,v_fCarVel)
	
	new Float:fpCarSpeed;
	pev(pCar, pev_speed, fpCarSpeed);
	
	if (fpCarSpeed > 100.0 || fpCarSpeed < -100)
	{
		if (pDriver && pDriver != pBlocker)
		{
			set_pev(pCar,pev_speed,0.0);
			set_pev(pCar,pev_velocity,Float:{ 0.0, 0.0, 0.0 });
			set_pev(pCar,pev_avelocity,Float:{ 0.0, 0.0, 0.0 });
			if (!is_user_valid(pBlocker) || cs_get_user_team(pBlocker) != cs_get_user_team(pDriver))
			{
				if (get_gametime() - g_fLastAttacked[pDriver] > 1.0)
				{
					emit_sound(pDriver, CHAN_ITEM, "weapons/knife_slash1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
					ExecuteHam(Ham_TakeDamage, pBlocker, pCar, pDriver, 50.0, DMG_CRUSH);
				}
				g_fLastAttacked[pDriver] = get_gametime();
			}
		}
	}
	
	v_fCarVel[0]*=1.5;
	v_fCarVel[1]*=1.5;
	v_fCarVel[2] = floatclamp(floatabs(fpCarSpeed),200.0,600.0);
	
	set_pev(pBlocker, pev_velocity,v_fCarVel);
	set_pev(pBlocker, pev_gaitsequence, 6)
	
	return FMRES_SUPERCEDE;
}

Теперь можете смело ставить на сервер карты с машинами, не боясь за то что геймплей будет сломан.
 
Последнее редактирование:

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
358
Пол
Мужской
Версия 0.2

* Фиксы застревания игроков в машине.
* Исправление управления машиной
 

Vaqtincha

aggressive
Разработчик
Скриптер
Регистрация
28 Янв 2018
Сообщения
959
Симпатии
682
Пол
Мужской
Никто не играет на таких гавнокартах если не имбецилы.
 

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
358
Пол
Мужской
Vaqtincha, ну так а причина в чем? В том что невозможно играть в них)

Ну и их количество слишком мало) А причина все та же, из-за того что на таких картах нельзя было играть.

Сначала PR делал но понял что Молчун гандон и что нормальные PR у него уже годами висят)
И решил в виде плагина сделать.
 
Последнее редактирование:

karaulov

Скриптер
Постоялец
Пользователь
Регистрация
5 Май 2019
Сообщения
1.041
Симпатии
358
Пол
Мужской
Кому там понадобилось без engine/cstrike:

C++:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define is_user_valid(%1)            (1 <= %1 <= MAX_PLAYERS)

new g_pCarDriver[MAX_PLAYERS + 1]= {0,...};
new Float:g_fLastAttacked[MAX_PLAYERS + 1] = {0.0,...};

public plugin_init()
{
    register_plugin("UNREAL VEHICLE FIXER", "0.2", "KARAULOV");
    register_cvar("car_fixer", "0.2", FCVAR_SPONLY|FCVAR_UNLOGGED)
    
    if (cvar_exists("mp_legacy_vehicle_block"))
    {
        log_amx("This plugin can be disabled, because mp_legacy_vehicle_block cvar is exists!");
    }
    
    register_forward(FM_Blocked, "fw_Blocked", false)
    RegisterHam( Ham_OnControls, "func_vehicle", "FuncButtonVehicle", 1 );
}

public FuncButtonVehicle(pCar, pBlocker)
{
    if (is_user_valid(pBlocker))
    {
        g_pCarDriver[pBlocker] = pCar;
    }
}

public get_pDriver(pCar)
{
    for(new i = 1; i <= MAX_PLAYERS;i++)
    {
        if (g_pCarDriver[i] == pCar)
            return i;
    }
    return 0;
}

public client_disconnected(id)
{
    if (task_exists(id))
        remove_task(id);
}

public check_if_stuck(pStucker)
{
    if (!(pev(pStucker,pev_flags) & FL_ONGROUND))
    {
        new Float:fCurOrg[3];
        pev(pStucker,pev_origin,fCurOrg);
        fCurOrg[2]+=2.0;
        set_pev(pStucker,pev_origin,fCurOrg);
    }
}

public fw_Blocked(pCar, pBlocker)
{
    if (!pev_valid(pCar))
        return FMRES_IGNORED;
        
    if (!pev_valid(pBlocker))
        return FMRES_IGNORED;
        
    if (pev(pBlocker,pev_groundentity) == pCar)
    {
        new Float:v_fCarVel[3];
        pev(pCar,pev_velocity,v_fCarVel)
        set_pev(pBlocker, pev_velocity,v_fCarVel);
        if (!(pev(pBlocker,pev_flags) & FL_ONGROUND))
        {
            new Float:fCurOrg[3];
            pev(pBlocker,pev_origin,fCurOrg);
            fCurOrg[2]+=5.0;
            set_pev(pBlocker,pev_origin,fCurOrg);
        }
        return FMRES_SUPERCEDE;
    }
    
    if (is_user_valid(pBlocker) && !task_exists(pBlocker) && !(pev(pBlocker,pev_flags) & FL_ONGROUND))
    {
        set_task(0.1,"check_if_stuck",pBlocker);
    }
    
    new pDriver = get_pDriver(pCar);
    new classname[32];
    pev(pBlocker, pev_classname, classname,charsmax(classname));
    if (!is_user_valid(pBlocker) && !equal(classname,"hostage_entity"))
        return FMRES_IGNORED;
    pev(pCar, pev_classname, classname,charsmax(classname));
    if (!equal(classname,"func_vehicle"))
        return FMRES_IGNORED;
    
    new Float:v_fCarVel[3];
    pev(pCar,pev_velocity,v_fCarVel)
    
    new Float:fpCarSpeed;
    pev(pCar, pev_speed, fpCarSpeed);
    
    if (fpCarSpeed > 100.0 || fpCarSpeed < -100)
    {
        if (pDriver && pDriver != pBlocker)
        {
            set_pev(pCar,pev_speed,0.0);
            set_pev(pCar,pev_velocity,Float:{ 0.0, 0.0, 0.0 });
            set_pev(pCar,pev_avelocity,Float:{ 0.0, 0.0, 0.0 });
            if (!is_user_valid(pBlocker) || get_user_team(pBlocker) != get_user_team(pDriver))
            {
                if (get_gametime() - g_fLastAttacked[pDriver] > 1.0)
                {
                    emit_sound(pDriver, CHAN_ITEM, "weapons/knife_slash1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
                    ExecuteHam(Ham_TakeDamage, pBlocker, pCar, pDriver, 50.0, DMG_CRUSH);
                }
                g_fLastAttacked[pDriver] = get_gametime();
            }
        }
    }
    
    v_fCarVel[0]*=1.5;
    v_fCarVel[1]*=1.5;
    v_fCarVel[2] = floatclamp(floatabs(fpCarSpeed),200.0,600.0);
    
    set_pev(pBlocker, pev_velocity,v_fCarVel);
    set_pev(pBlocker, pev_gaitsequence, 6)
    
    return FMRES_SUPERCEDE;
}
 
Сверху Снизу