• Просьба не публиковать сообщения с предложениями продажи модов или сборок!

    Мы против использования и перепродажи слитых модов и переделок на их основе. Остальное также сложно верифицировать, поэтому в целом пока что запрещаем эту тему на сайте.

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

geneff

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

Аргументы:
  • 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');
})
 
Вообщем, название темы говорит само за себя - будем с помощью функции находить ближайший транспорт.

Аргументы:
  • 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');
})
Чётко!
 
Здорово! Не знал насчет Entity::dist и Pool::forEachInRange. Будет полезно :)
 
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:
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;
}
 
А что если...

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. Скорее всего будет +- одинаково.
 
Страдает читаемость кода.
Да и вопрос что быстрее будет бегать mp.vehicles.toArray().reduce или mp.vehicles.forEachInRange? Не знаю как под капотом реализован forEachInRange. Скорее всего будет +- одинаково.
Да, будет одинакого, ибо в любом случае идет проверка на дистанцию. Читаемость кода никуда не пропадает, это вполне обычный стандарт в JavaScript (NodeJS) ;)
 
Стандартный то он стандартный :) Просто воспринимается сложновато. Нужно потратить какое-то время чтобы понять что там происходит.
 
Да, будет одинакого, ибо в любом случае идет проверка на дистанцию. Читаемость кода никуда не пропадает, это вполне обычный стандарт в JavaScript (NodeJS) ;)
1611556505648.png
нет, forEachInRange выполняется на много быстрее, результат на скрине.
И еще подводный камушек в reduce() - Если массив пустой и аргумент initialValue не указан, будет брошено исключение TypeError
 
Последнее редактирование:
Назад
Верх