Вопросы

Tookie Johnson
Активный

Здравствуйте. Делаю фулл рп мод с нуля. Не подскажете как сделать автоматическое удаление незанятого транспорта с сервера с сообщением «Весь незанятый транспорт был автоматически удалён с сервера»?

Поделиться сообщением


Ссылка на сообщение

10 ответов на этот вопрос

  • 1
Cawfee
Великий Гуру

@Tookie Johnson,

 

  открыть спойлер

 

Поделиться сообщением


Ссылка на сообщение
  • 0
𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.
Создатель WayDev

@Cawfee, не вижу смысла расписывать каждое условие, если его можно совместить в одно. Так же, не вижу смысла приравнивать новую переменную к нулю, когда она и так равна нулю. В целом, оба варианта рабочие.

stock DestroyUnoccupiedVehicles() {
    for (new vehicleID = 1; vehicleID <= GetVehiclePoolSize(); vehicleID++) {
        if(IsValidVehicle(vehicleID) && !IsVehicleOccupied(vehicleID)) // если транспортное средство не существует и не занято
            DestroyVehicle(vehicleID); // уничтожаем незанятое транспортное средство
        else
            continue;
    }
}

Да и в цикле вместо MAX_PLAYERS будет разумнее использовать функцию GetPlayerPoolSize:

stock bool:IsVehicleOccupied(vehicleid) {
    for (new i; i <= GetPlayerPoolSize(); i++) {
        if(!IsPlayerConnected(i))
            continue;

        new const vehicleID = GetPlayerVehicleID(playerid);
        if(vehicleID == INVALID_VEHICLE_ID)
            continue;

        return true;
    }
    return false;
}

 

P.S: обновил код функции DestroyUnoccupiedVehicles.

Отредактировано пользователем 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.

Поделиться сообщением


Ссылка на сообщение
  • 0

Кажется, что IsVehicleOccupied не совсем правильно написана, она не использует переданный ей аргумент vehicleid

Вроде так правильно будет 

stock bool:IsVehicleOccupied(vehicleId) {
    for (new i; i <= GetPlayerPoolSize(); i++) {
        if(!IsPlayerConnected(i))
            continue;

        new const playerVehicleId = GetPlayerVehicleID(playerid);
        if(playerVehicleId == INVALID_VEHICLE_ID || playerVehicleId != vehicleId)
            continue;

        return true;
    }
    return false;
}

 

Поделиться сообщением


Ссылка на сообщение
  • 0
𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.
Создатель WayDev

@DEST, двоякая ситуация. Тут либо делать проверку на одно авто с передаваемым параметром, либо делать на все сразу. Если учитывать задачу, для которой она требуется, тогда лучше сделать функцию с передаваемым параметром. К тому же, функция неверна.

Более оптимизированный вариант. В данном варианте избегаем двух проверок: 1. IsPlayerInAnyVehicle; 2. GetPlayerVehicleID;

stock bool:IsVehicleOccupied(vehicleid) {
    for(new i; i <= GetPlayerPoolSize(); i++) {
        if(!IsPlayerConnected(i))
            continue;

        if(vehicleid == INVALID_VEHICLE_ID)
            continue;

        if(IsPlayerInVehicle(i, vehicleid))
            continue;
        
        return true;
    }
    return false;
}

 

Отредактировано пользователем 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.

Поделиться сообщением


Ссылка на сообщение
  • -1
Cawfee
Великий Гуру

@𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.,

 

  В 2/15/2024 в 10:19, 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧. сказал:

не вижу смысла расписывать каждое условие, если его можно совместить в одно

Читать далее...  

Вот только к стилю не хватало придираться. Всегда пишу в таком стиле. Далее фрагмент из рабочего проекта, чтоб уж совсем добить твои глаза.

 

  открыть спойлер

 

  В 2/15/2024 в 10:19, 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧. сказал:

Так же, не вижу смысла приравнивать новую переменную к нулю, когда она и так равна нулю

Читать далее...  

Жертва языков с автоматическим управлением памятью... С меня не будет от того, что лишний раз явно инициализирую переменную.

Поделиться сообщением


Ссылка на сообщение
  • 0
𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.
Создатель WayDev
  В 2/15/2024 в 15:19, Cawfee сказал:

Вот только к стилю не хватало придираться.

Читать далее...  

Я не придираюсь к твоему стилю. Вопрос в удобстве и в кол-ве используемых строк. Как твой, так и мой вариант будет рабочим. Я повидал достаточно кода, чтобы не судить других за стиль написания. Не знаю, почему ты принимаешь мои слова на свой счёт.

Поделиться сообщением


Ссылка на сообщение
  • 0
  В 2/15/2024 в 15:16, 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧. сказал:

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

Читать далее...  

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

 

По названию этой функции можно сказать, что она возвращает true, если авто занято кем-либо, и false, если нет. Не понял что ты поменял, функция IsPlayerInVehicle и GetPlayerVehicleID имеют скорее всего одинаковую скорость работы, т.к. обращаются к одним и тем же данным. Просто одна возвращает bool, а другая - ID машины. 

 

  В 2/15/2024 в 15:22, 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧. сказал:

Не знаю, почему ты принимаешь мои слова на свой счёт

Читать далее...  

Так ты в начале сообщения его тегнул, на чей счет это можно еще принять? :bk:

Поделиться сообщением


Ссылка на сообщение
  • 0
Tookie Johnson
Активный

Ребят, спасибо вам за помощь. Сейчас буду пробовать ваши коды. Как остановлюсь на рабочем - напишу и закроете тему.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • whccompany
      От whccompany
      Rostov Role Play | Rostov RP | CRMP Mobile Project объявляет набор людей в свою команду: Нам требуются:
       
      1. Маппера:
      Сдельная оплата труда от 250 до 3000 рублей/ за 1 работу
       
      2. Специалист по Text Draw:
      Сдельная оплата труда от 400 до 3500 рублей/ за одну работу
       
      3. Pawn разработчик:
      Заработная плата от 10 000 рублей/месяц
       
      4. Программист для создания лаунчера и сайта UCP с автодонатом:
      Заработная плата от 10 000 рублей/месяц
       
      Контакты для связи:
       
      ВКонтакте
       
      Telegram
       
    • Владислав2
      От Владислав2
      Здравствуйте, при компиляции появляется ошибка,

      Ошибка:
      error 017: undefined symbol "REP_KUZIA_TD"

      Строки:
       
          REP_KUZIA_TD[0] = TextDrawCreate(7.499990, 314.444396, "REP: 1");
          TextDrawLetterSize(REP_KUZIA_TD[0], 0.400000, 1.600000);
          TextDrawAlignment(REP_KUZIA_TD[0], 1);
          TextDrawColor(REP_KUZIA_TD[0], -1);
          TextDrawSetShadow(REP_KUZIA_TD[0], 0);
          TextDrawSetOutline(REP_KUZIA_TD[0], 1);
          TextDrawBackgroundColor(REP_KUZIA_TD[0], 255);
          TextDrawFont(REP_KUZIA_TD[0], 1);
          TextDrawSetProportional(REP_KUZIA_TD[0], 1);
          TextDrawSetShadow(REP_KUZIA_TD[0], 0);
          REP_KUZIA_TD[1] = TextDrawCreate(6.249957, 330.518493, "ASK: 0");
          TextDrawLetterSize(REP_KUZIA_TD[1], 0.400000, 1.600000);
          TextDrawAlignment(REP_KUZIA_TD[1], 1);
          TextDrawColor(REP_KUZIA_TD[1], -1);
          TextDrawSetShadow(REP_KUZIA_TD[1], 0);
          TextDrawSetOutline(REP_KUZIA_TD[1], 1);
          TextDrawBackgroundColor(REP_KUZIA_TD[1], 255);
          TextDrawFont(REP_KUZIA_TD[1], 1);
          TextDrawSetProportional(REP_KUZIA_TD[1], 1);
          TextDrawSetShadow(REP_KUZIA_TD[1], 0);
          return 1;
      }

      Буду рад если кто-то поможет