Генерация карты в RUST

Примерно месяц назад я приобрел замечательную игру 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-инструмент.

Результат

Результат конечно не такой хороший, как можно было ожидать, т.к. код генерации карты сильно устаревший, но это лучше чем ничего:

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.