Что мы делаем?
Мы рассмотрим урок по созданию "анти превышения скорости" для вашего сервера.
Этот вопрос часто подымался у людей, занимавшихся DM или RP модами.
В чем это заключается?
Это заключается в том, что когда игрок водит транспортное средство и превысит скорость, то его остановит с выдачей предупреждения, после несскольких предупреждений игрока выкинет из машины. Колличество предупреждений будет показано на экране.
Как это сделать?
Я покажу вам самый простой вариант, ну чтобы он был не совсем прост мы добавим варнинги (предупреждения).
Преступим.
PHP код:
#define MAX_SPEED 100// Максимально допустимая скорсть (ещё можно создать переменной для изменения в процессе игры)
PHP код:
new Warnings[MAX_PLAYERS];//Глобальная переменная, отвечающая за предупреждения
Если у вас есть повторяющейся таймер на 1 секунду, то следующий код надо вставить туда, если нет то в паблик OnGameModeInit()
PHP код:
SetTimer("UpdatePlayersSpeed",1000,true);//Создадим таймер на 1 секунду, работающий с повторением
Тут я тоже придумал 2 варианта.
Содержание паблика:
1 Вариант.
PHP код:
forward UpdatePlayersSpeed();
public UpdatePlayersSpeed()
{
new Float:X,Float:Y,Float:Z,str[128];
for(new i; i < GetMaxPlayers(); i++)
{
if(!IsPlayerConnected(i)) continue;
if(IsPlayerInAnyVehicle(i) && GetVehicleSpeed(i) > MAX_SPEED)
{
if(Warnings[i] > 3)
{
RemovePlayerFromVehicle(i);
Warnings[i] = 0;
SendClientMessage(i,0xF60000AA,"Вы набрали больше {FFFFFF}трех {F60000}предупреждений! Будеть добры покинуть машину!");
}
else
{
Warnings[i]++;
format(str,sizeof(str),"Превышение скорости зафиксировано ({FFFFFF}%.1f km/h{F60000}). Ваша скорость сброшана!",GetVehicleSpeed(i));
SendClientMessage(i,0xF60000AA,str);
format(str,sizeof(str),"~r~Warning ~w~%d",Warnings[i]);
GameTextForPlayer(i,str,1500,1);
GetPlayerPos(i,X,Y,Z);
SetVehiclePos(GetPlayerVehicleID(i),X,Y,Z);
}
}
}
return 1;
}
2 Вариант.
PHP код:
forward UpdatePlayersSpeed();
public UpdatePlayersSpeed()
{
new Float:X,Float:Y,Float:Z,str[128];
for(new i; i < GetMaxPlayers(); i++)
{
if(!IsPlayerConnected(i)) continue;
if(IsPlayerInAnyVehicle(i) && GetVehicleSpeed(i) > MAX_SPEED)
{
if(Warnings[i] > 3)
{
RemovePlayerFromVehicle(i);
Warnings[i] = 0;
SendClientMessage(i,0xF60000AA,"Вы набрали больше {FFFFFF}трех {F60000}предупреждений! Будеть добры покинуть машину!");
}
else
{
Warnings[i]++;
format(str,sizeof(str),"Превышение скорости зафиксировано ({FFFFFF}%.1f km/h{F60000}). Ваша скорость сброшана!",GetVehicleSpeed(i));
SendClientMessage(i,0xF60000AA,str);
format(str,sizeof(str),"~r~Warning ~w~%d",Warnings[i]);
GameTextForPlayer(i,str,1500,1);
GetVehicleVelocity(GetPlayerVehicleID(i),X,Y,Z);
SetVehicleVelocity(GetPlayerVehicleID(i),X*0.1,Y*0.1,Z);//Снижаем скорость плавнее чем в 1 варианте.
}
}
}
return 1;
}
Я придумал довольно простой способ, но он хорошо работает на деле, при привышении скорости.
Думаю содержимао паблика всем будет понятно. Все функции очень известны и очень просты в применении.
Тут есть нестандартная функция, получения скорости машины.
PHP код:
forward Float:GetVehicleSpeed(playerid);
stock Float:GetVehicleSpeed(playerid)
{
new Float:Pos[3];
GetVehicleVelocity(GetPlayerVehicleID(playerid),Pos[0],Pos[1],Pos[2]);
return floatsqroot(Pos[0] * Pos[0] + Pos[1] * Pos[1] + Pos[2] * Pos[2]) * 140.0;
}
Итак, вот и готова простая система анти превышения скорости, если будут какие-либо вопросы задавайте, я дам ответ.
Людям должно пригодится, тем более такой вопрос был поднят ранее.
Спасибо за внимание. =)
Автор урока: Gameyer
P.S. Все вопросы по теме писать в тему!