Находим ближайшее транспортное средство

geneff

Middle Developer
Скриптер
Вообщем, название темы говорит само за себя - будем с помощью функции находить ближайший транспорт.

Аргументы:
  • player - обьект нашего игрока
  • distance - дистанция на которой будем искать ближайший транспорт
Возвращает:
  • null - если не найдено ближайшего транспорта в нашем радиусе
  • veh - обьект найденого транспорта
Сама функция:
JavaScript:
const getNearestVehicle = (player, distance) => {
    let veh = null;
    mp.vehicles.forEachInRange(player.position, distance, vehicle => {
        const dist = player.dist(vehicle.position);
        if (dist < distance) {
            distance = dist;
            veh = vehicle;
        }
    })
    return veh;
}

Для примера сделаем команду открывания/закрывания транспортного средства:
JavaScript:
mp.events.addCommand('lock', (player) => {
    const veh = getNearestVehicle(player, 2);

    if (veh === null)
        return player.outputChatBox('Вы должны находится возле машины.');

    veh.locked = !veh.locked;
    player.outputChatBox(veh.locked ? 'Close' : 'Open');
})
 

seaniwe

Senior Developer
Скриптер
Вообщем, название темы говорит само за себя - будем с помощью функции находить ближайший транспорт.

Аргументы:
  • player - обьект нашего игрока
  • distance - дистанция на которой будем искать ближайший транспорт
Возвращает:
  • null - если не найдено ближайшего транспорта в нашем радиусе
  • veh - обьект найденого транспорта
Сама функция:
JavaScript:
const getNearestVehicle = (player, distance) => {
    let veh = null;
    mp.vehicles.forEachInRange(player.position, distance, vehicle => {
        const dist = player.dist(vehicle.position);
        if (dist < distance) {
            distance = dist;
            veh = vehicle;
        }
    })
    return veh;
}

Для примера сделаем команду открывания/закрывания транспортного средства:
JavaScript:
mp.events.addCommand('lock', (player) => {
    const veh = getNearestVehicle(player, 2);

    if (veh === null)
        return player.outputChatBox('Вы должны находится возле машины.');

    veh.locked = !veh.locked;
    player.outputChatBox(veh.locked ? 'Close' : 'Open');
})
Чётко!
 

Lev Angel

Developer
Команда форума
Скриптер
Здорово! Не знал насчет Entity::dist и Pool::forEachInRange. Будет полезно :)
 

skyElmax

Trainee
JavaScript:
const getNearestVehicle = (player, distance) => {
    let veh = null;
    mp.vehicles.forEachInRange(player.position, distance, vehicle => {
        const dist = player.dist(vehicle.position);
        if (dist < distance) {
            distance = dist;
            veh = vehicle;
        }
    })
    return veh;
}

предлагаю заменить на

Код:
mp.Player.prototype.getNearestVehicle = function (distance) {
    let veh = null;
    mp.vehicles.forEachInRange(this.position, distance, vehicle => {
        const dist = this.dist(vehicle.position);
        if (dist < distance) {
            distance = dist;
            veh = vehicle;
        }
    })
    return veh;
}

и в таком случае можно обращаться красиво

Код:
player.getNearestVehicle(15);
 

Revalto

Trainee
JavaScript:
const getNearestVehicle = (player, distance) => {
    let veh = null;
    mp.vehicles.forEachInRange(player.position, distance, vehicle => {
        const dist = player.dist(vehicle.position);
        if (dist < distance) {
            distance = dist;
            veh = vehicle;
        }
    })
    return veh;
}

предлагаю заменить на

Код:
mp.Player.prototype.getNearestVehicle = function (distance) {
    let veh = null;
    mp.vehicles.forEachInRange(this.position, distance, vehicle => {
        const dist = this.dist(vehicle.position);
        if (dist < distance) {
            distance = dist;
            veh = vehicle;
        }
    })
    return veh;
}

и в таком случае можно обращаться красиво

Код:
player.getNearestVehicle(15);
А что если...

JavaScript:
mp.Player.prototype.getNearestVehicle = (distance) => {
    const veh = mp.vehicles.toArray().reduce((a, b) => this.dist(a.position) < this.dist(b.position) ? a : b);
    return this.dist(veh.position) < distance ? veh : null;
}
 

Lev Angel

Developer
Команда форума
Скриптер
А что если...

JavaScript:
mp.Player.prototype.getNearestVehicle = (distance) => {
    const veh = mp.vehicles.toArray().reduce((a, b) => this.dist(a.position) < this.dist(b.position) ? a : b);
    return this.dist(veh.position) < distance ? veh : null;
}
Страдает читаемость кода.
Да и вопрос что быстрее будет бегать mp.vehicles.toArray().reduce или mp.vehicles.forEachInRange? Не знаю как под капотом реализован forEachInRange. Скорее всего будет +- одинаково.
 

Revalto

Trainee
Страдает читаемость кода.
Да и вопрос что быстрее будет бегать mp.vehicles.toArray().reduce или mp.vehicles.forEachInRange? Не знаю как под капотом реализован forEachInRange. Скорее всего будет +- одинаково.
Да, будет одинакого, ибо в любом случае идет проверка на дистанцию. Читаемость кода никуда не пропадает, это вполне обычный стандарт в JavaScript (NodeJS) ;)
 

Lev Angel

Developer
Команда форума
Скриптер
Стандартный то он стандартный :) Просто воспринимается сложновато. Нужно потратить какое-то время чтобы понять что там происходит.
 

Dihan48

Middle Developer
Скриптер
Да, будет одинакого, ибо в любом случае идет проверка на дистанцию. Читаемость кода никуда не пропадает, это вполне обычный стандарт в JavaScript (NodeJS) ;)
1611556505648.png
нет, forEachInRange выполняется на много быстрее, результат на скрине.
И еще подводный камушек в reduce() - Если массив пустой и аргумент initialValue не указан, будет брошено исключение TypeError
 
Последнее редактирование:
Яндекс.Метрика
Верх