Sign in to follow this  
Gross

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

Recommended Posts

Gross    9

В этом топике будет приведен пример добавления некоторых методов в стандартное 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
Leone    6

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

Edited by Leone

Share this post


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

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

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

Share this post


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

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

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

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.