shape1
shape2
shape3
shape4
shape7
shape8

Ограничение скорости у разбитой машины

Mirex

Руководитель проекта
Команда портала
Гл.Администратор
Золотой
21.12.2013
2 512
3
550
0
29
definehost.ru
Скриптер
Идея: Если авто игрока сломано, скрипт не даст разогнаться быстрее 50 км/ч (регулируется)
 
Реализация: Измеряется скорость по осям X и Y, если замечаем превышение скорости замедляем транспортное средство.
 
Особенности: Используется оптимизированная версия без тригонометрии чтобы сильно не нагружать процессор. В ней имеется недостаток который заключается в том что предельная скорость в направлениях СВ, ЮВ, ЮЗ, СЗ будет больше максимальной, но не более чем на 30%. Также стоит отметить что нет проверки на тип транспортного средства.
 
Ко всем дефайнам:
#define BE_MIN_HLS 500.00 // здоровье ниже которого машина считается сломанной
#define BE_MAX_SPD_VAR 50 // максимальная скорость, можно изменять
#define BE_MAX_SPD BE_MAX_SPD_VAR*0.005

Ко всем глобальным переменным:

new const BE_Bad_Vehs[] = {
460, 464, 476, 511, 512, 513, 519, 520, 539, 553, 577, 592, 593, // planes
417, 425, 447, 465, 469, 487, 488, 497, 501, 548, 563 // heli
};
new bool: BE_Play_Check[MAX_PLAYERS];

В конец мода:

forward BadEngine();
public BadEngine()
{
new veh, Float:spd[3], Float:hls;
for(new i; i != GetMaxPlayers(); i++)
{
if( !BE_Play_Check ) { continue; }
veh = GetPlayerVehicleID( i );
if( !veh ) { continue; }
GetVehicleHealth( veh, hls );
if( hls > BE_MIN_HLS ) { continue; }
GetVehicleVelocity( veh, spd[0], spd[1], spd[2] );

if( floatabs(spd[0]) > floatabs(spd[1]) )
{
if( floatabs(spd[ 0 ]) > BE_MAX_SPD )
{
hls = BE_MAX_SPD / floatabs(spd[ 0 ]);
SetVehicleVelocity( veh, spd[0]*hls, spd[1]*hls, spd[2] );
}
}
else
{
if( floatabs(spd[ 1 ]) > BE_MAX_SPD )
{
hls = BE_MAX_SPD / floatabs(spd[ 1 ]);
SetVehicleVelocity( veh, spd[0]*hls, spd[1]*hls, spd[2] );
}
}
}
}

В public OnPlayerStateChange

if( newstate == PLAYER_STATE_DRIVER )
{
new temp;
temp = GetVehicleModel( GetPlayerVehicleID( playerid ) );
BE_Play_Check[ playerid ] = true;
for(new i; i != sizeof( BE_Bad_Vehs ); i++ )
{
if( temp == BE_Bad_Vehs[ i ] )
{
BE_Play_Check[ playerid ] = false;
break;
}
}
}
if( oldstate == PLAYER_STATE_DRIVER )
{
BE_Play_Check[ playerid ] = false;
}

В public OnGameModeInit

SetTimer("BadEngine", 500, true);

Автор: OFFREAL