OpenTTD сервер

Openttd logo

Вступление

OpenTTD - клон популярной игры Transport Tycoon Deluxe (сокращенно - TTD), изданной компанией Microprose в 1995 году. В отличие от оригинальной игры, Open Transport Tycoon Deluxe обладает открытым исходным кодом и распространяется бесплатно. За время развития проекта OpenTTD в игру были добавлены многочисленные новые возможности и эта работа продолжается.

В этой статье расскажу о поднятии сервера на стандартной сборке OpenTTD (без патчей).

Установка и настройка сервера

Устанавливать будем из исходников т.к порт увы обновляется не часто.
На данный момент доступна версия 1.0.4. Качаем исходники с сайта проекта http://www.openttd.org/en/download-stable, в списке выбираем openttd-x.x.x-source.

Распаковываем.

tar -xvf openttd-1.0.4-source.tar.bz2
cd openttd-1.0.4

Собираем и устанавливаем. При сборке может ругнуться на отсутствующую библиотеку liblzo2. Выхода два: либо поставить ее, либо отклонить его установку, добавив ключик --without-liblzo2 (библиотека liblzo2 нужна для сжатия save файлов)
./configure --enable-dedicated --without-liblzo2
gmake
gmake install

После установки копируем исполняемый файл
cp /usr/local/games/openttd /usr/local/share/games/openttd/

На этом установка завершена, приступаем к настройке.

Для начала нужно скопировать графические библиотеки, без нее сервер не запустится.

cd /usr/local/share/games/openttd/data
wget _http://binaries.openttd.org/extra/opengfx/0.3.1/opengfx-0.3.1-all.zip
tar -xvf opengfx-0.3.1-all.zip
cp opengfx-0.3.1/*.grf ./
cp opengfx-0.3.1/*.obg ./
rm -R opengfx-0.3.1

Теперь запустим сервер чтоб создался конфигурационный файл. По умолчанию конфигурационный файл хранится в домашней директории пользователя от которого запускаете сервер, но удобнее хранить все в одном месте. Поэтому мы укажем, где у нас будет конфигурационный файл с помощью ключа "-c"
cd /usr/local/share/games/openttd
./openttd -D -c openttd.cfg

В консоли посыпется лог старта сервера
[2010-09-30 11:26:53] dbg: [net] [core] starting network...
[2010-09-30 11:26:53] dbg: [net] [udp] initializing listeners
[2010-09-30 11:26:53] dbg: [net] [core] network online, multiplayer available

Выходим

quit

Должен появться файл конфигурации openttd.cfg который нам нужно отредактировать. Для начала настроим все что связано с сетевой частью.Для этого открываем openttd.cfg и ищем раздел [network].

[network]
server_port = 3979 // Порт который будет слушать openttd (Openttd использует TCP и UDP)
server_advertise = true // Будет ли наш сервер анонсировать себя на мастер
                        // сервер (_http://www.openttd.org/en/servers)
lan_internet = 0       // Тоже что и server_advertise
rcon_password = пароль // Пароль для доступа к консоли из игры командой rcon.
server_name = Название сервера
autoclean_companies = true // Включение или отключение функции автоочистка. Если включено,
                           // компании без игровой активности за определенное игровое 
                           //(autoclean_protected и autoclean_unprotected) время 
                           //будут уничтожены.
autoclean_unprotected = 12 // Компании не защищенные паролем будут удалены через 12 мес.
autoclean_protected = 0 // У компаний защищенных паролем и не активных будет удален пароль
autoclean_novehicles = 12 // Не активные компании с отсутствующим транспортом будут
                          // удалены через 12 месяцев
max_companies = 10       // Максимальное кол-во компаний
max_clients = 8          // Максимальное кол-во клиентов
max_spectators = 4       // Максимальное кол-во наблюдателей
restart_game_year = 2050 // Дата рестарта сервера
min_active_clients = 0   // Игра остановился, когда количество активных игроков меньше
                        // заданного числа

С сетевой частью все. Немного расскажу про другие настройки которые возможно вы захотите изменить.

[difficulty]
number_towns = 1 // Устанавливает количество городов для новой карты (0 = very low 
                 //| 1 = low | 2 = normal | 3 = high | 4 = custom)
number_industries = 1 // Устанавливает количество индустрии для новой карты (0 = none |
                      // 1 = very low | 2 = low | 3 = normal {default} | 4 = high)
max_loan = 300000 // Устанавливает максимальный начальный кредит на новую игру. 
                  // Всегда в британских фунтах. Изменение валюты в разделе [locate] 
                  // или в окне настроек игры изменит максимальную сумму кредита
                  // по обменному курсу выбранной валюты. Максимальная сумма кредита
                  // будет увеличиваться с течением времени, если инфляция включена
vehicle_breakdowns = 0 // Частота поломок транспорта (0 = none, 1 = reduced, 2 = normal)
disasters = 0 // Катастрофы ( 0 = выклб 1 = вкл)
 
[game_creation]
starting_year = 1950 // Начальный год
map_x = 9 // Размер карты (8 - 256, 9 - 512, 10 - 1024, 11 - 2048)
map_y = 9 // Размер карты (8 - 256, 9 - 512, 10 - 1024, 11 - 2048)
 
[vehicle]
max_trains = 500 // Макс. кол-во поездов
max_roadveh = 200 // Макс. кол-во машинок
max_aircraft = 50 // Макс. кол-во самалетов
max_ships = 30 // Макс. кол-во караблей
wagon_speed_limits = true // Устанавливает ограничение скорости для вагонов. 
                          // Эта функция влияет только на вагоны из доп. графики (NewGRF).
 
[station]
adjacent_stations = true Позволяет объединять смежные станции
 
[gui]
autosave = quarterly // Автоматическое сохранение игры в предопределенный интервал
                     //  времени. (off = отключить | monthly = каждый месяц |
                     // quarterly = каждый квартал | half year = каждые пол года |
                     // yearly =  каждый год)
max_num_autosaves = 10 // Кол-во файлов автосохранений.

Более подробно о настройках вы можете почитать тут wiki.openttd.org
Нектороые настройки можно менять во время игры из консоли с помощью команды set
set max_trains 750

Запуск сервера

С настройками все, теперь немного про способы запуска сервера. Можно запустить в бэкграунде (ключ "-f") или с помощью менеджера виртуальных сессий (screen).
Для начала создадим пользователя от которого будет запускаться сервер (лучше не запускать от привелигированного пользователя)

pw useradd openttd -s /sbin/nologin

Выставим права на директорию с игрой
chown -R openttd:openttd /usr/local/share/games/openttd

Запускаем в бэкграунде
su -m openttd -c "/usr/local/share/games/openttd/openttd -D -f -c \
/usr/local/share/games/openttd/openttd.cfg"

Можно запустить и в screen если он у вас установлен ( я предпочитаю этот способ т.к можно зайти и порулить сервером из консоли, да и вообще можно посмотреть что на нем творится )
Если у вас screen не установлен то будем собирать менеджер виртуальных сессий (все опции по умолчанию)

cd /usr/ports/sysutils/screen; make install clean

Запускаем
screen -A -m -d -S openttd su -m openttd -c "/usr/local/share/games/openttd/openttd -D \
 -f -c /usr/local/share/games/openttd/openttd.cfg"

Для авто запуска и управления сервером, написал небольшой скрипт

js# cat /usr/local/etc/rc.d/openttd.sh
 
#!/bin/sh
#
#
 
# PROVIDE: openttd
# REQUIRE: LOGIN
# KEYWORD: shutdown
 
. /etc/rc.subr
 
name="openttd"
rcvar=`set_rcvar`
 
load_rc_config $name
 
: ${openttd_enable="NO"}
: ${openttd_user="openttd"}
: ${openttd_port=""}
: ${openttd_args=""}
: ${openttd_cfg="/usr/local/share/games/openttd/openttd.cfg"}
 
command="/usr/local/share/games/openttd/openttd"
screen="/usr/local/bin/screen"
 
openttd_args="-f -c ${openttd_cfg}"
 
[ -n "${openttd_port}"  ] && openttd_args="${openttd_port} ${openttd_args}"
 
start_cmd="echo Starting ${name}.; su -m ${openttd_user} -c \
"${command} -D ${openttd_args}\""
 
run_rc_command "$1"

Сервер запускается в бэкграунде, если вы хотите чтобы сервер запускался в скрине то изменитье строку
start_cmd="echo Starting ${name}.; su -m ${openttd_user} -c \
"${command} -D ${openttd_args}\""

на
start_cmd="echo Starting ${name}.; su -m ${openttd_user} -c \
"${screen} -A -m -d -S openttd ${command} -D ${openttd_args}\""

Выставляем права на запуск для стартового скрипта
chmod +x /usr/local/etc/rc.d/openttd.sh

Добавляем в /etc/rc.conf

openttd_enable="YES"

Запускаем

/usr/local/etc/rc.d/openttd.sh start
Starting openttd.
Loading dedicated server...
  - Forked to background with pid 19216

Проверяем, запустился ли сервер
sockstat | grep openttd
openttd  openttd    29057 5  tcp4   192.168.1.54:3979   *:*
openttd  openttd    29057 41 udp4   192.168.1.54:3979   *:*

Не забудте открыть в фаерволе соотвествующие порты для TCP и UDP протокола

Все ок. Сервер запущен, пробуем подключиться.

Использование скриптов

OpenTTD имеет возможность выполнить один из ряда скриптов при запуске.
Скрипты должны включать обычный текстовый файл, который был переименован в то, чему он соответствуют (см. ниже). Скрипты находятся в папке scripts

Сетевые скрипты
on_client.scr - Этот сценарий выполняется всякий раз, когда Вы присоединяетесь к серверу
on_server_connect.scr- Этот сценарий будет выполняться на сервере, когда клиент подключается ( В этом скрипте можно написать приветствие или другу полезную информацию, например правила итд.)

Эти скрипты служат для настройки ip/порта и другой настройки сервера
pre_server.scr - Выполняется до запуска TCP стека игры ( Т.е можно изменить параметры порта итд)
pre_dedicated.scr - Выполняется до запуска TCP стека игры ( Т.е можно изменить параметры порта итд). Только для Dedicated режима сервера

Эти скрипты должны быть использованы для установки имени сервера, паролей итд.
on_server.scr выполняется после запуска сервера
on_dedicated.scr выполняется после запуска сервера . Только для Dedicated режима сервера.

Пример скрипта - on_server_connect.scr

say "== Добро пожаловать на сервер =="
say ""
say "== ПРАВИЛА =="
say "* Не блокировать"
say "* Одна компания для одного игрока"
say "* Играть под своим Ником (Не под ником Player)"
say "* Не забывайте ставить пароль на свою компанию"

Более подробнее об использовании скриптов, смотрите в примерах в папке scripts

Управление сервером

Управлением сервером можно из самой игры с помощью команды rcon из консоли игры (Консоль открывается по нажатию кнопки ~).. Пароль для доступа к управлению сервера устанавливается в конфигурационном файле сервера (rcon_password = ваш пароль)

Теперь про команды которые могут понадобиться для управления сервером.

kick <ip | client-id> - Кикнуть клиента по  IP <ip> или по его id <client-id>
ban <ip | client-id> - Бан клиента по IP <ip> или по его id <client-id>
unban <ip> - Разбанить клиента <ip>
banlist - Список забаненных клиентов
reset_company <company-id> -	Удалить компанию по его id <company-id>
pause - Паузу в игре
unpause - Снятие паузы
clients - Список клиентов ( Его id, имя, company_id и IP адрес)
companies - Список компаний и их атрибуты ( Название компании, кол-во техники итд.)
status - Получить информацию о состоянии всех подключенных клиентов.
move <client-id> <company-id>	Переместить клиента в любую компанию.
client_name <client-id> <name>	- Принудительно сменить Ник игроку.

Примеры:

rcon ваш пароль "move 1 2"
rcon ваш пароль "pause"

Более подробнее о консольных командах можно почитаться тут wiki.openttd.org/Console

NewGRF

Для того, чтобы сделать игру более разнообразной - вам поможет NewGRF.

NewGRF, это так называемые дополнительные наборы графики, которые расширяют возможности Openttd добавляя в него новую технику, индустрию, всевозможные здания и т.д.

Всю новую графику нужно скопировать в папку data. Не рекомендую все сваливать в корень папки data, а лучше создать в ней папку newgrf и туда скопировать новую графику.

Теперь нужно подключить графику в конфигурационном файле. Редактируем его.

[newgrf]
newgrf/jpstationsw.grf =
newgrf/indstatrw.grf =
newgrf/2ccshipsw.grf =
newgrf/4LVw.grf =

Так же у NewGRF бывают доп. параметры, которые указываются после знака =

newgrf/basecosts.grf = 21 16 57 15 1 12 2 10 15 9 16 9 17 10 18 9 19 9 48 7 27 12

Про параметры читайте в описании к NewGRF файлам.

Ссылки где можно найти доп. графику:
http://bananas.openttd.org/en/newgrf/
http://grfcrawler.tt-forums.net/index.php
http://wiki.openttd.org/NewGRF_List
На форуме tt-forums.net

Web статистика

Для статистики нам понадобятся
- Веб-Сервер ( Например Apache)
- PHP5
- PHP Class OpenTTDLib

OpenTTDLib - это набор PHP5 классов позволяющие получать статистику в реальном времени с openttd серверов, которые затем могут отображаться на вашем веб сайте или хранится в БД.

Требования к PHP:
OpneTTDLib использует функции BCMath, пэтому убедитесь что php собран с поддержкой BCMath, если нет - то установите его.

cd /usr/ports/math/php5-bcmath; make install clean

Установка:

cd /usr/local/www/

Качаем библиотеку. Увы, сайт автора не работает (http://codecubes.org), выкладываю сюда.

wget _http://ignix.ru/system/files/openttdlib-0.3.2.tar.gz

Распаковываем
tar xvf  OpenTTDLib-0.3.2.tar.gz

Переименовываем директорию
mv OpenTTDLib-0.3.2 openttd

и удаляем архив, если не нужен
rm OpenTTDLib-0.3.2.tar.gz

В директории можно найти документацию в подпапке doc, а так же примеры в файлах example.php и example2.php ( example2.php использует шаблон HTML_Template_Sigma, который можно найти в портах ).

Библиотека проста в использовании и очень хорошо документирована, чем я и воспользовался, написав свой вариант статистики.

Скачиваем архив в папку с OpenTTDLib, и разворачиваем

wget _http://ignix.ru/system/files/ottd.tar.gz
tar xvf ottd.tar.gz

Нам нужно отредактировать файл index.php, а точнее всего 2 строчки

$server['host']     = 'IP или имя сервера';
$server['port']     = 'порт';

Кеширование.

Поддержка кэширования OpenTTDLib позволяет использовать объект SimpleXML, имеющийся на PHP 5.1.3. Если вы отключите функциональность кэширования, тем не менее, вы сможете использовать более раннюю версию PHP5.

По умолчанию кеш сбрасывается в файл cache.xml, который должен быть расположен в корне OpenTTDlib, и веб-сервер должен иметь права на запись в этот файл.

chown www:www cache.xml
chmod 775 cache.xml

Расположение, а так же название кеш файла, можно изменить с помощью опции OpenTTDLib::OPTION_CACHE_FILE

$openttd->setOption( OpenTTDLib::OPTION_CACHE_FILE,	'cache.xml' );

Если у веб-сервера нет доступа для записи кэш-файла, пожалуйста, установите OpenTTDLib::OPTION_CACHE_UPDATE в false, чтобы остановить OpenTTDLib от попыток добавить новые или обновленные данные в файл.

$openttd->setOption( OpenTTDLib::OPTION_CACHE_UPDATE,	true );

Если вы хотите отключить кеширование, то установите OpenTTDLib:: OPTION_CACHE_NEWGRF в false.

$openttd->setOption( OpenTTDLib::OPTION_CACHE_NEWGRF,	true );

Более подробнее о кэширование можно почитать в документации, в частности , раздел о OpenTTDLib :: OPTION_CACHE_NEWGRF.

Настроим наш веб-сервер на примере Apache.

Сконфигурируем Apache. Добавим Alias в файл конфигурации веб сервера:

vim /usr/local/etc/apache22/httpd.conf
 
   Alias /openttd" /usr/local/www/openttd/"
    <Directory "/usr/local/www/openttd">
        Options Indexes FollowSymlinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>

Перезапустим apache.

apachectl graceful

Пример статистики.

Приятной игры

ВложениеРазмер
openttdlib-0.3.2.tar.gz88.32 КБ
ottd.tar.gz12.27 КБ
ottd-stat.png34.72 КБ
Дополнительные материалы
Ваша оценка: Нет Средняя: 5 (19 голосов)

FFFFFFFFFFFFFF

не работает скрипт у меня пишит это

localhost / # /usr/local/etc/rc.d/openttd.sh start
/usr/local/etc/rc.d/openttd.sh: line 1: js#: команда не найдена
/usr/local/etc/rc.d/openttd.sh: line 11: /etc/rc.subr: Нет такого файла или каталога
/usr/local/etc/rc.d/openttd.sh: line 14: set_rcvar: команда не найдена
/usr/local/etc/rc.d/openttd.sh: line 16: load_rc_config: команда не найдена
/usr/local/etc/rc.d/openttd.sh: line 34: unexpected EOF while looking for matching `"'
/usr/local/etc/rc.d/openttd.sh: line 35: ошибка синтаксиса: неожиданный конец файла

Чесно, ничего не понял. Я так

Чесно, ничего не понял. Я так понял если я нуб, то тут и читать не нужно, всё равно не поймёшь.

Последние статьи

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer