Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Превышение заданной скорости

Статус
В этой теме нельзя размещать новые ответы.

PI

The world on the edge of reality
Что мы делаем?
Мы рассмотрим урок по созданию "анти превышения скорости" для вашего сервера.
Этот вопрос часто подымался у людей, занимавшихся 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) > 100)
        {
            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) > 100)
        {
            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
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу