Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для MARVEL
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.09.2016
    Сообщений
    22
    Репутация:
    1 ±

    Аренда трейлера для дальнобойщиков

    Делаю аренду трейлеров для дальнобойщиков и столкнулся с некоторыми трудностями. Сама идея заключается в том, чтоб трейлер, который арендовал один игрок, не смог взять другой игрок, чтоб он отцеплялся от его трака, если он его, все таки, прицепил. И еще, если у игрока уже есть арендованный трейлер, то он не сможет подцепить другой трейлер, чтоб у него выводилось сообщение, типа "Вы уже арендуете трейлер" и он так-же отцеплялся. Так вот, суть в том, что не могу додуматься как такое реализовать правильно. Делал через ежесекундный таймер для игрока, но там после проверок и ретурнов таймер прекращает обновляться, ибо реализован так:

     Код
    PHP код:
    public OnPlayerConnect(playerid)
    {
        
    player_timer_ID[playerid] = SetTimerEx("@_OnPlayerTimer"1000false"i"playerid);
        return 
    true;
    }

    @
    _OnPlayerTimer(playerid);
    @
    _OnPlayerTimer(playerid)
    {
        
    player_timer_ID[playerid] = SetTimerEx("@_OnPlayerTimer"1000false"i"playerid);
        return 
    true;



    Но если сделать таймер цикличным, то тогда игроку будет флудить текстом, если он прицепит не свой трейлер и будет как-то криво отцепляться, то есть, отцепляется трейлер только раза с десятого.

    Вот код аренды в таймере:
     Код
    PHP код:
    if(pInfo[playerid][pTruckVehicle] != -// Если арендован грузовик
        
    && GetPlayerVehicleID(playerid) == pInfo[playerid][pTruckVehicle// Сидит ли игрок в арендованном грузовике
        
    && IsTrailerAttachedToVehicle(GetPlayerVehicleID(playerid))) // Прицеплен ли трейлер к грузовику
    {
        new 
    vehicleid GetPlayerVehicleID(playerid), 
            
    trailerid GetVehicleTrailer(vehicleid);

        if(
    trailerid >= trucker_trailer[0] && trailerid <= trucker_trailer[1]) // Если прицеплен определенный трейлер, то проходит дальше
        
    {
            if(
    GetPVarInt(playerid, !"rent_trucker_trailer") && GetPVarInt(playerid, !"rent_trucker_trailer") != trailerid)
            {
                
    SendErrorMessage(playerid"У Вас уже есть трейлер, который Вы арендуете!");
                return 
    DetachTrailerFromVehicle(vehicleid);
            } 
    // Если есть арендованный трейлер, но прицеплен не он

            
    foreach(new iplayers_truckers)
            {
                if(
    GetPVarInt(i"rent_trucker_trailer") == trailerid && != playerid)
                {
                    
    SendErrorMessage(playerid"Данный трейлер уже арендуют!");
                    return 
    DetachTrailerFromVehicle(vehicleid);
                }
            } 
    // Если прицепленный трейлер уже кто-то арендует.

            
    if(GetPVarInt(playerid, !"rent_trucker_trailer"
                && 
    GetPVarInt(playerid, !"rent_trucker_trailer") == trailerid
            
    ) return true// Если есть арендованный трейлер и прицеплен он

            
    if(GetMoney(playerid) < 750)
            {
                
    SendErrorMessage(playerid"У Вас недостаточно средств для аренды трейлера!");
                return 
    DetachTrailerFromVehicle(vehicleid);
            } 
    // Если недостаточно средств для аренды

            
    Dialog_Open(playeridDialog:DLG_TRAILER_RENTDIALOG_STYLE_MSGBOX,
                !
    ""C_WHITE"Аренда трейлера",
                !
    "\n\
                "
    C_WHITE"Вы желаете арендовать данный трейлер?\n\
                - Стоимость аренды: "
    C_MONEY"$750",
                !
    "Да", !"Отмена"
            
    );
        }



    Прощу прощения, что, возможно, что-то плохо объяснил, но как смог. :)

  2. #2
    Аватар для KrutoyKrosch
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2016
    Сообщений
    301
    Репутация:
    7 ±
    Так вроде же есть колбек который вызывается когда трейлер прицеплен. Не?

    http://wiki.sa-mp.com/wiki/OnTrailerUpdate
    http://wiki.sa-mp.com/wiki/OnUnoccupiedVehicleUpdate

    - - - Добавлено - - -

    А таймер не обновляется потому что return возвращает и таймер новый в конце не создается. Делай тогда возврат таймера -

    return player_timer_ID[playerid] = SetTimerEx(!"@_OnPlayerTimer", 1000, false, !"i", playerid);

  3. #3
    Аватар для MARVEL
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.09.2016
    Сообщений
    22
    Репутация:
    1 ±
    Цитата Сообщение от KrutoyKrosch Посмотреть сообщение
    Так вроде же есть колбек который вызывается когда трейлер прицеплен. Не?

    http://wiki.sa-mp.com/wiki/OnTrailerUpdate
    http://wiki.sa-mp.com/wiki/OnUnoccupiedVehicleUpdate

    - - - Добавлено - - -

    А таймер не обновляется потому что return возвращает и таймер новый в конце не создается. Делай тогда возврат таймера -

    return player_timer_ID[playerid] = SetTimerEx(!"@_OnPlayerTimer", 1000, false, !"i", playerid);
    Я делал и так, и так, но при использовании данных колбеков проверки проходят нормально, но игроку флудит текстом и прицеп нормально не отцепляется. При изменении цикличности секундного таймера такая же беда, только флудит текстом меньше.

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    У тебя какая-то каша из pVar, которые тут вообще не нужны. Всё, что тебе нужно - это один массив для хранения ID игрока у трейлера с количеством ячеек равным числу трейлеров.

    Когда игрок цепляет новый трейлер, обращаешься к нужной ячейке массива у трейлера и проверяешь, закреплён ли за кем-то трейлер и если закреплён, является ли игрок владельцем. И дальше уже производишь нужные действия.
    Хранить информацию о номере трейлера на стороне игрока есть смысл только чтоб не нужно было цикл запускать при каждом выходе и сверять данные массива трейлеров с ID игрока, дабы обнулить их.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. #5
    Аватар для KrutoyKrosch
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2016
    Сообщений
    301
    Репутация:
    7 ±
    Так отцепляй прицеп и телепортируй его немного дальше от машины (узнаешь корды машины в которой игрок, ставишь их прицепу только +20 к X или Y, там проверку поворота машины просто сделай (можно заморочиться и сделать cos + sin, но сложно), помню тоже когда-то такое делал.

  6. #6
    Аватар для MARVEL
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.09.2016
    Сообщений
    22
    Репутация:
    1 ±
    Цитата Сообщение от KrutoyKrosch Посмотреть сообщение
    Так отцепляй прицеп и телепортируй его немного дальше от машины (узнаешь корды машины в которой игрок, ставишь их прицепу только +20 к X или Y, там проверку поворота машины просто сделай (можно заморочиться и сделать cos + sin, но сложно), помню тоже когда-то такое делал.
    Уже пробовал и такой вариант, немного кривовато все получалось, но получалось. Так что попробую заморочиться над этим вариантом, наверное.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •