Расширяем возможности стандартного API

NozmaD

Администратор
Команда форума
Администратор
Сообщения
166
Баллы
208
В этом топике будет приведен пример добавления некоторых методов в стандартное API RageMP, основной целью этого действа является сокращение кода и ускорение разработки в будущих скриптах.

Пример:
JavaScript:
// Вместо этого:
mp.players.forEach(_player => { _player.outputChatBox("Hello!!!"); });
// Можно будет писать так:
mp.players.BroadcastMessage("Hello!!!");

Начнём. Создаем в каталоге 'packages/keker' файл 'new-api.js', и сразу же объявим его в 'packages/keker/index.js' добавив туда строку:
JavaScript:
require('./new-api');

Теперь начнем добавлять наш код в 'new-api.js', начнем с методов для работы с векторами, точнее для вычисления дистанции между ними:
JavaScript:
mp.Vector3.Distance = function (v1, v2){
    return Math.abs(Math.sqrt(Math.pow((v2.x - v1.x),2) +
                                    Math.pow((v2.y - v1.y),2)+
                                    Math.pow((v2.z - v1.z),2)));
} // функция вычисляющая расстояние между двумя точками в пространстве X;Y;Z;

mp.Vector3.Distance2D = function (v1, v2){
    return Math.abs(Math.sqrt(Math.pow((v2.x - v1.x),2) +
                                    Math.pow((v2.y - v1.y),2)));
} // функция вычисляющая расстояние между двумя точками на плоскости X;Y;

Теперь их можно вызывать в любом месте вашего кода. Пример:
JavaScript:
// Вернет расстояние от игрока до его машины в пространстве X;Y;Z
let distance = mp.Vector3.Distance(player.position, player.veh.position);

// Вернет расстояние от игрока до его машины в горизонтальной плоскости X;Y;
let distance = mp.Vector3.Distance2D(player.position, player.veh.position);

Теперь добавим в 'new-api.js' методы broadcast'a сообщений и удобного спавна машин:
JavaScript:
// функция выводящая сообщение в чат либо всем игрокам онлайн, либо игрокам находящимся в определенном радиусе, так же позволяет задать цвет текста
mp.players.BroadcastMessage = function(s, v, d, c){
    if(typeof v == 'undefined'){ // если функция вызвана с 1 параметром BroadcastMessage("Wellcome!!!");
        this.forEach( player => {
            player.outputChatBox(s);
        });
    } else if( typeof v == 'string'){ // если функция вызвана с параметром цвета BroadcastMessage("Wellcome!!!", "#ddd");
        this.forEach(player => {
            player.outputChatBox("<font color='"+v+"'>"+s+"</font>");
        });
    } else if(typeof v == 'object' && typeof d == 'number'){ // если функция вызвана с параметром радиуса действия BroadcastMessage("Wellcome!!!", new mp.Vector3(0, 0, 0), 50);
        this.forEach(player => {
            if(Math.pow((player.position.x - v.x), 2) + Math.pow((player.position.y - v.y), 2) + Math.pow((player.position.z - v.z), 2) < Math.pow(d, 2)){ // проверяем находится ли игрок в заданом радиусе
                if(typeof c == 'string') { // если функция вызвана со всеми параметрами BroadcastMessage("Wellcome!!!", new mp.Vector3(0, 0, 0), 50, "#ddd");
                    player.outputChatBox("<font color='"+c+"'>"+s+"</font>");
                } else {
                    player.outputChatBox(s);
                }
            }
        });
    }
}

// Спавн транспорта в заданной точке, либо по координатам X;Y;Z, возвращает созданый транспорт
mp.vehicles.Spawn = function(m, x, y, z){
    if(typeof x == 'number' && typeof y == 'number' && typeof z == 'number'){
        return this.new(mp.joaat(m), new mp.Vector3(x, y, z));
    } else if(typeof x == "object") {
        return this.new(mp.joaat(m), x);
    }
}

Их вызов в дальнейшем будет выглядеть таким образом:
JavaScript:
//Вместо такого кода:
mp.players.forEach(_player => {
  _player.outputChatBox("<font color='#ddd'>Hello!!!</font>");
});

// Можно использовать это:

// Отправит сообщение всем игрокам сервера
mp.players.BroadcastMessage("Hello!!!");

// Отправит сообщение всем игрокам сервера, цвет текста будет #ddd
mp.players.BroadcastMessage("Hello!!!", "#ddd");

// Отправит сообщение всем игрокам в радиусе 50м от текущего, Local Chat
mp.players.BroadcastMessage("Hello!!!", player.position, 50);

// Отправит сообщения всем игрокам в радиусе 50м от текущего, цвет текста красный
mp.players.BroadcastMessage("Hello!!!", player.position, 50, "red");


// Удобный спавн траспорта
// Вместо этого:
let veh = mp.vehicles.new(mp.joaat('sultanrs'), new mp.Vector3(200, 14, 25));

// Теперь можно использовать это:

// Создаст транспорт в указаных координатах, и вернет его в переменную veh
let veh = mp.vehicles.Spawn('sultanrs', 200, 14, 25);

//или это:
let pos = player.postion;
pos.x += 2;
let veh = mp.vehicles.Spawn('sultanrs', pos); // Создаст транспорт в указанной точке и вернет его

Ну и пару методов для работы с игроком, можно как добавить в 'new-api.js' это:

JavaScript:
mp.events.add({"playerJoin": player => {
        player.TeleportTo =  function(x, y, z){
            if(typeof x == 'object'){ // если первый параметр является вектором
                this.position = x;
            } else if(typeof x == 'number' && typeof y == 'number' && typeof z == 'number'){ // если координаты заданы по отдельности
                this.position = new mp.Vector3(x, y, z);
            }
        } // функция телепорта игрока к заданой точке, либо по координатам X;Y;Z;
        player.Message = function(s, c){
            if(typeof s == 'string' && typeof c == 'string'){ // если задан цвет
                this.outputChatBox("<font color='"+с+"'>"+s+"</font>");
            } else if (typeof s == 'string'){
                this.outputChatBox(s);
            }
        } // функция для быстрой отправки сообщения игроку в чат, с возможностью задать цвет текста
    }
});

Либо вставить код от сюда в 'packages/keker/evens/common.js', вызов этих методов будет выглядеть так:
JavaScript:
// Телепорт игрока
player.TeleportTo(player.veh.position.x-2, player.veh.position.y, player.veh.postion.z); // Телепортирует игрока к точке сбоку от его машины

let pos = player.veh.position;
pos.x -= 2
player.TeleportTo(pos); // сделает тоже самое только сдесь в функцию передается вектор а не координаты

// Удобный вывод сообщений игроку, с возможностью задать цвет текста
player.Message("Hello!!!"); // Отправит сообщение в чат игроку

player.Message("Hello!!!", "#ddd"); // Отправит сообщение в чат игроку, цвет текста #ddd
Link:

Пожалуйста, Войдите или Зарегистрируйтесь, что бы увидеть скрытый контент.

 
Автор
Gross
Верх