Sign in to follow this  
Gross

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

Recommended Posts

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

Пример:

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

 

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

require('./new-api');

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

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;

Теперь их можно вызывать в любом месте вашего кода. Пример:

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

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

Теперь добавим в 'new-api.js' методы broadcast'a сообщений и удобного спавна машин:

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);
				}
			}
		});
	}
} // функция выводящая сообщение в чат либо всем игрокам онлайн, либо игрокам находящимся в определенном радиусе, так же позволяет задать цвет текста


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);
	}
} // Спавн транспорта в заданной точке, либо по координатам X;Y;Z, возвращает созданый транспорт

Их вызов в дальнейшем будет выглядеть так:

//за место этого довольно маштабного кода:
mp.players.forEach(_player => { 
  _player.outputChatBox("<font color='#ddd'>Hello!!!</font>"); 
});

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

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

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

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

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

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

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

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

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

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', вызов этих методов будет выглядеть так:

// Телепорт игрока

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

 

Ну вот и все, надеюсь, что кому нибудь пригодится!

Share this post


Link to post
Share on other sites

Технический ничего не меняется, mолько для удобства ?

Edited by Leone

Share this post


Link to post
Share on other sites
В 26.01.2017 в 14:18, Leone сказал:

Технический ничего не меняется, mолько для удобства ?

Да, зато при использовании подобных шаблонов в разы можно ускорить разработку.

Share this post


Link to post
Share on other sites
В 08.05.2017 в 05:10, CodeGhoul сказал:

Да, зато при использовании подобных шаблонов в разы можно ускорить разработку.

можно создать снипеты для rage и будет счастье. 

Share this post


Link to post
Share on other sites

Благодарю автора за четкое изъяснение. Теперь использую сам.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.