Как написать свой скрипт? Введение.

Материал из Bully Multiplayer Wiki
Перейти к: навигация, поиск

Содержание

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

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

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

Все скрипты хранятся непосредственно в папке ресурса, а те в свою очередь, в директории /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. Следовательно и выводятся сообщения в чат.