Примерно месяц назад я приобрел замечательную игру Rust на распродаже. Особенностью этой игры является то, что соло в нее не поиграешь — обязательно нужен сервер. Собственно для этого я и настроил такой сервер на своем VPS. Базовый режим игры мне не нравится, поэтому я использовал модификацию сервера Oxide чтобы изменить режим на «мягкий» PvE. Одной из возможностей, которая позволяет эта модификация — расширение функционала сервера посредством плагинов. Собственно о том, как я настраивал плагин для мини-карты и пойдет речь далее.
Выбираем плагин
Для миникарты я взял плагин LustyMap. В описании плагина есть два варианта работы — простой и комплексный. Комплексный режим позволяет рисовать красивую карту, пользуясь API beancan.io, а простой — отображать статичную картинку карты. Вся загвоздка в том, где взять эту картинку.
Есть простой путь — взять уже сгенерированную картинку пользуясь тем же beancan. Путь посложнее — сгенерировать ее самостоятельно. Естественно я выбрал второй вариант. Он хорош тем, что нет зависимости от внешних сервисов. Из минусов этого способа — нужно где-то взять софт, который генерирует картинку. К счастью есть вот такая разработка в виде плагина к Oxide. Основная проблема в том, что эта разработка довольно сильно устарела, плюс при просмотре кода выяснилось что в целях безопасности плагинам запрещено генерировать файлы кроме файла конфигурации. Разработчик решил эту проблему отправкой данных генерируемой карты методом POST в виде application/x-www-form-urlencoded. Чтобы принять эти данные нужен сервер, который умеет обрабатывать такие данные. В составе этой разработки есть такой сервер, но он нам не подходит, т.к. он ориентирован только на Windows. Однако выход есть и заключается он в виде фреймворка expressjs для nodejs.
Реализация
Нижеследующий простенький скрипт app.js, который я набросал пользуясь рекомендациями этой статьи, позволит принять данные, разобрать их и сохранить в файл:
var express = require("express");
var myParser = require("body-parser");
var fs = require("fs");
var app = express();
app.use(myParser.urlencoded({limit: '10mb', extended: true}))
app.post("/upload", function(req, res) {
var base64Data = req.body.data;
fs.writeFile('map.png', base64Data, 'base64', function (err) {
if (err) throw err;
console.log("It's saved");
});
});
app.listen(5000);
Для того чтобы использовать его нужно установить с помощью npm expressjs:
npm install express
После чего запускаем скрипт
node app.js
При вызове плагина SeederyIoMapGen например путем RCON-команды oxide.reload SeederyIoMapGen он отправляет поток, который этот скрипт сохраняет в виде файла map.png. Далее — копируем его в oxide/data/LustyMap и загружаем плагин. Кстати рекомендую для работы через WebRCON вот такой вот CLI-инструмент.
Результат
Результат конечно не такой хороший, как можно было ожидать, т.к. код генерации карты сильно устаревший, но это лучше чем ничего: