V3ct0r 2,117 Report post Posted December 12, 2021 Инструмент для обрезания и склеивания карт Данный инструмент позволяет вырезать квадратные фрагменты из файлов карт клиента .map и .obj, а так же добавлять фрагменты уже к существующим картам, таким образом, объединять несколько карт в одну. С её помощью, например, можно вырезать отдельный остров или создать объединенную карту мира. В .map файлах содержится вся основная информация о картах игрового мира:1) Области суши и воды;2) ID текстур поверхности суши;3) ID регионов из areaset.bin;4) Рельеф местности, высоты;5) Проходимые и непроходимые участки;6) Боевые и безопасные зоны. В .obj файлах находится список всех неживых объектов, которые присутствуют на карте (здания, постройки, деревья, растения, камни и тому подобное). Сам по себе инструмент не является законченной программой – пользователь должен самостоятельно написать программу, которая создаст требуемую карту. В качестве языка программирования используется C++, а средой программирования выступает Visual Studio 2019 Community. Таким образом, для использования данного инструмента потребуются базовые знания языка C++. API Инструментарий представлен двумя классами, которые находятся в файле Map.h:1) pkodev::MapFile – класс для работы с картами в формате .map;2) pkodev::ObjFile – класс для работы с картами в формате .obj. Данные классы обладают одинаковым интерфейсом. Кроме того, в файле Map.h определена структура pkodev::point, которая описывает точку с координатами (x, y). Поскольку, в основном, требуется одновременное редактирование .map и .obj файлов, был определен класс pkodev::MapWrapper, который инкапсулирует внутри себя объекты pkodev::MapFile и pkodev::ObjFile, и обеспечивает их одновременное изменение. Обладает таким же интерфейсом, как и указанные классы. В процессе работы могут возникнуть ошибки. Для их обработки определены классы исключений pkodev::map_file_exception и pkodev::obj_file_exception, которые являются наследниками класса std::runtime_error. MapFile::MapFile(), ObjFile::ObjFile() Создать пустую карту с нулевым размером. MapFile(unsigned int width, unsigned int height), ObjFile:: ObjFile(unsigned int width, unsigned int height) Создать пустую карту с размерами width x height. void MapFile::load(const std::string& path), void ObjFile::load(const std::string& path) Загрузить карту из файла. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. void MapFile::save(const std::string& path), void ObjFile:: save (const std::string& path) Сохранить карту в файл. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. MapFile MapFile::cut(const point& start, const point& end), ObjFile ObjFile::cut(const point& start, const point& end) Вырезать квадратный фрагмент карты. start – начальные координаты (x0, y0), end – конечные (x1, y1). Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. void MapFile::glue(const point& pos, MapFile& map), void ObjFile::glue(const point& pos, ObjFile& map) Добавить на карту квадратный фрагмент. pos – координаты, по которым разместить фрагмент, map – добавляемый фрагмент карты. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. void MapFile::del(const point& start, const point& end), void ObjFile::del(const point& start, const point& end) Удалить с карты квадратный фрагмент. start – начальные координаты (x0, y0), end – конечные (x1, y1). Фрагмент заменяется морем. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. void MapFile::clear(), void ObjFile::clear() Удалить карту и освободить память. Класс pkodev::MapWrapper обладает аналогичным интерфейсом, но есть разница в методах load() и save(): путь до файла указывается без расширения. Примеры использования Вырезание фрагмента Напишем программу, которая вырежет "остров Удачи" из локации "Великий Синий океан". Соответственно, нам необходимо работать с файлами darkblue.map и darkblue.obj. Открываем Visual Studio 2019 Community, создаем консольное приложение C++ и подключаем файлы Map.h и Map.cpp, либо загружаем уже готовый проект из архива во вложении. Алгоритм программы будет следующий:1) Открыть файлы darkblue.map и darkblue.obj;2) Вырезать из них фрагмент с координатами x0 = 1430, y0 = 1675, x1 = 1780, y1 = 2025;3) Сохранить фрагмент в файлы fortune.map и fortune.obj. Пишем код: #include <iostream> #include "Map.h" // Точка входа int main(int argc, char* argv[]) { try { // Создаем объект для одновременной работы с .map и .obj файлами pkodev::MapWrapper darkblue; // Загружаем карту из файла darkblue darkblue.load("C:\\pkodev\\Client\\map\\darkblue"); // Вырезаем остров удачи pkodev::MapWrapper fortune = darkblue.cut({ 1430, 1675 }, { 1780, 2025 }); // Сохраняем остров удачи fortune.save("C:\\pkodev\\Client\\map\\fortune"); } catch (const pkodev::map_file_exception& e) { std::cout << ".map file error: " << e.what() << std::endl; return 1; } catch (const pkodev::obj_file_exception& e) { std::cout << ".obj file error: " << e.what() << std::endl; return 2; } catch (...) { std::cout << "Unknown error!" << std::endl; return 3; } return 0 } В результате получим карту (скриншот из YAMMI): Склеивание карт Теперь попробуем склеить несколько карт в одну. Для примера создадим массив "островов Удачи", из острова, который мы получили в прошлом примере. Алгоритм программы будет следующий:1) Создать пустую карту размером 1024 x 1024;2) Загрузить "остров Удачи" из файлов fortune.map и fortune.obj;3) Поместить "остров Удачи" по координатам (128, 32) на карту;4) Поместить "остров Удачи" по координатам (512, 320) на карту;5) Поместить "остров Удачи" по координатам (128, 576) на карту;6) Сохранить карту в файл array.map и array.obj. Пишем код: #include <iostream> #include "Map.h" // Точка входа int main(int argc, char* argv[]) { try { // Создаем пустую карту 1024 x 1024 pkodev::MapWrapper map(1024, 1024); // Остров Удачи pkodev::MapWrapper fortune; // Загружаем остров Удачи из файла fortune.load("C:\\pkodev\\Client\\map\\fortune"); // Добавляем несколько островов Удачи на пустую карту map.glue({ 128, 32 }, fortune); map.glue({ 512, 320 }, fortune); map.glue({ 128, 576 }, fortune); // Сохраняем карту map.save("C:\\pkodev\\Client\\map\\array"); } catch (const pkodev::map_file_exception& e) { std::cout << ".map file error: " << e.what() << std::endl; return 1; } catch (const pkodev::obj_file_exception& e) { std::cout << ".obj file error: " << e.what() << std::endl; return 2; } catch (...) { std::cout << "Unknown error!" << std::endl; return 3; } return 0; } В результате получим карту (скриншот из YAMMI): Скачать инструмент (9 Кб) 4 2 Quote Some useful links / Полезные ссылки Tips for making a topic in 'Questions & Help' / Рекомендации по созданию тем в разделе "Помощь" Server Advertising Section Rules / Правила раздела "Реклама серверов" Available e-mail domains for registration / Допустимые e-mail домены для регистрации User groups / Группы пользователей User ranks / Звания пользователей "Broken" pictures on the forum / "Битые" изображения на форуме Beware of scammers! / Осторожно, мошенники! My developments / Мои разработки Mods for client and server / Моды для клиента и сервера PKOdev.NET website for Tales of Pirates Server / PKOdev.NET веб-обвязка для сервера Пиратии I do not provide any help in private messages and outside the forum. Use 'Questions & Help' section please. Thank you for understanding! Я не оказываю какую-либо помощь в личных сообщениях и вне форума. Пожалуйста, используйте раздел "Пиратия: Помощь". Благодарю за понимание! Share this post Link to post Share on other sites
Kst 45 Report post Posted December 12, 2021 lucky -> fortune lucky.load("C:\\pkodev\\Client\\map\\fortune"); 1 Quote Работаем над портированием пиратии под все платформы (win, linux, android, macos, ios) We are developing the tales of pirates to all platform (win, linux, android, macos, ios) telegram: https://t.me/magicsea_online Share this post Link to post Share on other sites