Как написать свой скрипт? Введение. — различия между версиями

Материал из Bully Multiplayer Wiki
Перейти к: навигация, поиск
Строка 40: Строка 40:
 
* name - Название ресурса.
 
* name - Название ресурса.
 
* author - Автор ресурса.
 
* author - Автор ресурса.
* type - Тип ресурса, script или gamemode. Если указан gamemode, то название ресурса будет установлено как имя игрового режима, и будет показываться в браузере серверов.
+
* type - Тип ресурса, script или gamemode. Если указан gamemode, то название ресурса будет установлено как имя игрового режима, и будет показываться в списке серверов.
 
* version - Версия ресурса.
 
* version - Версия ресурса.
  
Строка 48: Строка 48:
 
* src - Расположение скрипта в директории ресурса.
 
* src - Расположение скрипта в директории ресурса.
 
* type - Тип скрипта, client или server.
 
* type - Тип скрипта, client или server.
* boot - Является ли данный файл ключевым. Если нет, то boot="true" можно даже не вставлять.
+
* boot - Является ли данный файл ключевым. Если нет, то boot="true" можно даже не вставлять. Ключевой файл отличается от остальных тем, что именно он будет запущен при старте ресурса.
  
 
<h3>Создание своего скрипта.</h3>
 
<h3>Создание своего скрипта.</h3>
ы
+
''... может быть это будет позже.''
  
 
<h3>Добавление своего скрипта на сервер.</h3>
 
<h3>Добавление своего скрипта на сервер.</h3>
Если вы уже написали полноценный ресурс, самое время поставить его на сервер.
+
Если вы уже написали свой скрипт и оформили его как ресурс, то самое время поставить его на ваш сервер.
  
* Шаг 1. Загружаем ресурс (папка с содержимым, скрипты, meta.xml и т.п) в директорию /resources.
+
* Шаг 1. Загружаем ресурс (папка с содержимым, скрипты, meta.xml и т.п) в папку '''/resources''', в корне сервера.
* Шаг 2. Добавляем '''<resource src="имя ресурса"/>''' в "конфиг" сервера, [[server.xml]].
+
* Шаг 2. Добавляем '''<resource src="имя ресурса"/>''' в "конфиг" сервера, файл [[server.xml]], в корне сервера.
* Шаг 3. Запускаем/перезагружаем сервер.
+
* Шаг 3. Запускаем или перезагружаем ваш сервер.
  
 
== Разница между серверной и клиентской стороной скрипта. ==
 
== Разница между серверной и клиентской стороной скрипта. ==
Строка 65: Строка 65:
  
 
Один из наглядных примеров:
 
Один из наглядных примеров:
[[graphics.drawRect()]] невозможно вызвать на сервере, т.к. данная функция рисует на экране прямоугольник. У сервера нет таких возможностей, как и экрана. Он передаёт на клиентскую сторону соответствующий "скрипт", который уже может её вызывать (на клиенте).
+
[[graphics.drawRect]] невозможно вызвать на сервере, т.к. данная функция рисует на экране прямоугольник. У сервера нет таких возможностей, как и экрана. При подключении игрока, клиент должен загрузить соответствующий "скрипт", который уже и будет являться "клиентским", для работы с функциями на этой стороне.
  
Клиент не способен выполнять функции относящиеся к серверу, т.к. по факту им не является. Создание транспорта должно его зарегистрировать на сервере, именно по этому попытавшись создав транспорт на клиенте, сервер его удалит при любых взаимодействиях, т.к. его "не существует".
+
Сам клиент не способен выполнять функции относящиеся к серверу, т.к. по факту им не является. К примеру, весь транспорт должен существовать сервере, именно по этому попытавшись создав транспорт на клиенте (что на данный момент технически не возможно), сервер не сможет с ним взаимодействовать через скрипт, а так же синхронизировать, т.к. его "не существует". Так же, клиент не в состоянии "кикать" игрока с сервера, и выполнять записи в серверный лог.
  
 
== Привязка функций к определенным событиям. ==
 
== Привязка функций к определенным событиям. ==
Строка 73: Строка 73:
  
 
Для чего это необходимо?
 
Для чего это необходимо?
Например вы планируете выдавать игроку 100$ за каждого избитого противника. Вам необходимо выполнять вашу функцию при событии [[onPlayerKnockedOut]], что бы игрок получил награду.
+
Например вы планируете выводить сообщения в чат, при "смерти" персонажей. Вам необходимо выполнять вашу функцию при событии [[onPlayerKnockedOut]], так как именно это событие обрабатывается после "смерти" персонажа.
  
 
<div class = "example_server_box">'''Сервер'''<div class="example_box"><syntaxhighlight lang="javascript">
 
<div class = "example_server_box">'''Сервер'''<div class="example_box"><syntaxhighlight lang="javascript">
function knockedOut(player,attacker) {
+
function knockedOut(player, attacker) {
if (!!player && !!attacker) {
+
if (player && attacker) {
//Здесь уже код выдаёт деньги игроку attacker
+
// Функции ниже выведут 2 сообщения, игроку "убийце", и "убитому" игроку.
//Ко всему, у игрока player можно их снять
+
player.sendMessage(new RGB(255, 0, 0), "You knocked out by " + attacker.name + ".");
}
+
attacker.sendMessage(new RGB(0, 255, 0), "You knock " + player.name + ".");
}
+
};
 +
};
 
</syntaxhighlight></div></div>
 
</syntaxhighlight></div></div>
  
Функция есть, но сама собой она не вызовется. Именно для этого используется [[eventHandlers.add()]].
+
Функция есть, но сама собой она не вызовется. Именно для этого используется [[eventHandlers.add]].
  
 
<div class = "example_server_box">'''Сервер'''<div class="example_box"><syntaxhighlight lang="javascript">
 
<div class = "example_server_box">'''Сервер'''<div class="example_box"><syntaxhighlight lang="javascript">
Строка 90: Строка 91:
 
</syntaxhighlight></div></div>
 
</syntaxhighlight></div></div>
  
Теперь функция knockedOut() будет вызываться после события [[onPlayerKnockedOut]].
+
Теперь функция '''knockedOut''' будет вызываться после события [[onPlayerKnockedOut]]. Следовательно и выводятся сообщения в чат.

Версия 04:20, 24 февраля 2018

Содержание

Создание рабочего скрипта.

Для начала мы постараемся разобрать, что нам необходимо для создания рабочего скрипта, шаг за шагом.

Где хранятся все скрипты?

Все скрипты хранятся непосредственно в папке ресурса, а те в свою очередь, в директории /resources.

Пример: /home/user/bullymp_linux/resources


meta.xml

Файл Meta.xml является базовым, для любого ресурса.

<meta>
	<info name="Freeroam" author="Bully Multiplayer Team" type="gamemode" version="1.0"/>
 
	<script src="s_config.js" type="server"/>
	<script src="s_playerModels.js" type="server"/>
	<script src="s_vehicleModels.js" type="server"/>
	<script src="s_commandManager.js" type="server"/>
	<script src="s_commands.js" type="server"/>
	<script src="s_events.js" type="server"/>
	<script src="s_startup.js" type="server"/>
	<script src="s_utility.js" type="server"/>
	<script src="s_main.js" type="server" boot="true"/>
</meta>

Разберём строки по отдельности.

<meta></meta>
  • Тег <meta> является обязательным для файла. (Обычный синтаксис XML)
<info name="Freeroam" author="Bully Multiplayer Team" type="gamemode" version="1.0"/>
  • name - Название ресурса.
  • author - Автор ресурса.
  • type - Тип ресурса, script или gamemode. Если указан gamemode, то название ресурса будет установлено как имя игрового режима, и будет показываться в списке серверов.
  • version - Версия ресурса.
<script src="s_main.js" type="server" boot="true"/>
  • src - Расположение скрипта в директории ресурса.
  • type - Тип скрипта, client или server.
  • boot - Является ли данный файл ключевым. Если нет, то boot="true" можно даже не вставлять. Ключевой файл отличается от остальных тем, что именно он будет запущен при старте ресурса.

Создание своего скрипта.

... может быть это будет позже.

Добавление своего скрипта на сервер.

Если вы уже написали свой скрипт и оформили его как ресурс, то самое время поставить его на ваш сервер.

  • Шаг 1. Загружаем ресурс (папка с содержимым, скрипты, meta.xml и т.п) в папку /resources, в корне сервера.
  • Шаг 2. Добавляем <resource src="имя ресурса"/> в "конфиг" сервера, файл server.xml, в корне сервера.
  • Шаг 3. Запускаем или перезагружаем ваш сервер.

Разница между серверной и клиентской стороной скрипта.

В роли клиента выступает непосредственно запущенное приложение модификации, что и является одним из главных отличий от сервера. Так же именно сервер является "синхронизатором", т.е. именно он передаёт клиенту информацию о позиции других игроков, транспорта и т.п.

Один из наглядных примеров: graphics.drawRect невозможно вызвать на сервере, т.к. данная функция рисует на экране прямоугольник. У сервера нет таких возможностей, как и экрана. При подключении игрока, клиент должен загрузить соответствующий "скрипт", который уже и будет являться "клиентским", для работы с функциями на этой стороне.

Сам клиент не способен выполнять функции относящиеся к серверу, т.к. по факту им не является. К примеру, весь транспорт должен существовать сервере, именно по этому попытавшись создав транспорт на клиенте (что на данный момент технически не возможно), сервер не сможет с ним взаимодействовать через скрипт, а так же синхронизировать, т.к. его "не существует". Так же, клиент не в состоянии "кикать" игрока с сервера, и выполнять записи в серверный лог.

Привязка функций к определенным событиям.

Полноценный игровой режим или же небольшой скрипт редко может обойтись без событий.

Для чего это необходимо? Например вы планируете выводить сообщения в чат, при "смерти" персонажей. Вам необходимо выполнять вашу функцию при событии onPlayerKnockedOut, так как именно это событие обрабатывается после "смерти" персонажа.

Сервер
function knockedOut(player, attacker) {
	if (player && attacker) {
		// Функции ниже выведут 2 сообщения, игроку "убийце", и "убитому" игроку.
		player.sendMessage(new RGB(255, 0, 0), "You knocked out by " + attacker.name + ".");
		attacker.sendMessage(new RGB(0, 255, 0), "You knock " + player.name + ".");
	};
};

Функция есть, но сама собой она не вызовется. Именно для этого используется eventHandlers.add.

Сервер
eventHandlers.add("onPlayerKnockedOut", knockedOut);
Теперь функция knockedOut будет вызываться после события onPlayerKnockedOut. Следовательно и выводятся сообщения в чат.