Jump to content

Search the Community

Showing results for tags 'карта'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Russian Section
    • Новости и объявления
    • Пиратия: Документация
    • Пиратия: Релизы
    • Пиратия: Разработка
    • Пиратия: Web
    • Пиратия: Помощь
    • Совместные проекты / набор команды
    • Доска объявлений
    • Программирование
    • Оффтопик
    • Корзина
  • English Section
    • News & Announcements
    • Guides
    • Releases
    • Development
    • Web
    • Questions & Help
    • Shared Projects / Team search
    • Paid services & Requests
    • Programming
    • Offtopic
    • Recycle bin
  • Portuguese Section
    • Dúvidas & Ajuda
  • Spanish Section
    • Preguntas y Ayuda
  • Servers
    • Russian servers
    • English servers

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Found 4 results

  1. Программа для сжатия .map файлов При работе с редактором карт YAMMI может возникнуть проблема, которая заключается в том, что выходной файл .map будет очень большого размера. Например, если открыть в YAMMI карту darkblue.map (Великий Синий Океан) и сохранить её на диск, то размер карты будет порядка 240 Мб, вместо изначальных 46 Мб! Это связано с тем, что большую часть карты darkblue занимает море, т.е. по сути одинаковые клетки, которые друг от друга ничем не отличаются, и такие клетки необязательно записывать в .map файл - игровой клиент автоматически заменит их на воду при отрисовке, но YAMMI не использует эту оптимизацию и все равно записывает "пустые" клетки в выходной .map файл. Данная программа решает описанную выше проблему и позволяет существенно уменьшить размер .map файлов на диске после их редактирования в YAMMI. Для этого она ищет в .map файле "пустые" клетки и удаляет их из файла. Скачать 1) Программа (pkodev.tool.mapcompressor.exe); 2) Исходный код (C++). Программа консольная, поэтому пути до исходного и выходного .map файлов передаются через параметры запуска: > pkodev.tool.mapcompressor darkblue.map darkblue_c.map darkblue.map - это несжатый .map файл, который требуется уменьшить; darkblue_c.map - это сжатый .map файл после обработки программой. Вывод программы будет примерно следующий: PKOdev.NET .map file compressor program Version: v1.0.0 (03/01/2022) Author: V3ct0r Input .map file: darkblue.map Output .map file: darkblue_c.map Input .map file information: * Width: 4096 * Height: 4096 * Section width: 8 * Section height: 8 * Sections number: 262144 Please wait . . . Done! * Sections compressed: 222007 * Percentage: 84.69% * Bytes freed: 213126720 Как видно из вывода, размер .map файла был уменьшен примерно на 203 Мб! Внимание! На данный момент программа еще не была протестирована должным образом, поэтому после сжатия на картах могут возникать те или иные ошибки. Учитывайте это при работе и храните резервные копии исходных .map файлов.
  2. [Мод] Полная карта местности для региона Как известно, полную карту имеют только основные регионы (Аскарон, Магический океан и Великий синий океан). Когда игрок нажимает кнопку "Карта" под миникартой, чтобы открыть полную карту местности, клиент отправляет серверу пакет с соответствующим запросом. Сервер читает этот пакет, решает, имеет ли регион, в котором в данный момент находится игрок, полную карту, и отправляет ответ клиенту. Если ответ "положительный", то клиент открывает игроку большую карту. Если "отрицательный", то игрок получает в систему сообщение "Эта местность не имеет полной карты": Данный мод позволяет добавлять полные карты местности для любого региона: Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.fullmap; Версия: 1.0; Автор: V3ct0r; Тип: для сервера (GameServer.exe); Поддерживаемые исполняемые .exe файлы: GAMESERVER_136, GAMESERVER_138. Установка 1) В директории "mods" Вашего GameServer создайте папку "pkodev.mod.fullmap"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.fullmap.server.<x>.dll" для Вашей версии Game.exe; 3) Поместите в неё файл настроек мода "pkodev.mod.fullmap.cfg" и запишите в него список названий карт, для которых необходимо добавить полную карту местности. Название каждой карты записывается с новой строки: darkswamp garner2 puzzleworld puzzleworld2 Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  3. Инструмент для обрезания и склеивания карт Данный инструмент позволяет вырезать квадратные фрагменты из файлов карт клиента .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. Карта мира (Аскарон, Магический океан и Великий синий океан на одной карте) Объединенная игровая карта мира с основными континентами и островами на одной карте. Установка карты Клиент: 1) Поместить файлы world.map, world.obj, world.rbo в папке "Client\map" из приложенного архива в соответствующую папку игрового клиента; 2) Поместить файл миникарты "Client\texture\minimap\world\world.pk" из приложенного архива в соответствующую папку игрового клиента; 3) Добавить в файл mapinfo.txt ("Клиент\scripts\table") строку: XX world World 1 2202,2782 255,255,255 Где XX – последний незанятый ID. 4) Скомпилировать mapinfo.bin. Сервер: 1) Поместить папку "GameServer\resource\world" из приложенного архива в папку "GameServer\resource" Ваших серверных файлов; 2) Добавить следующую строку в файл "GameServer\resource\script\MisScript\ScriptDefine.lua" AddMap("world", "World") 3) Добавить карту в GameServer.cfg для запуска: map = world Некоторые полезные координаты Основные города: Аргент 2145, 3410 (&move 2145, 3410, world) Шайтан 3085, 3250 (&move 3085, 3250, world) Ледынь 1015, 500 (&move 1015, 500, world) Громоград 650, 2080 (&move 650, 2080, world) Острова: Остров Лета 3455, 1755 (&move 3455, 1755, world) Остров Весны 3506, 797 (&move 3506, 797, world) Остров Осени 2915, 1460 (&move 2915, 1460, world) Остров Удачи 1600, 1320 (&move 1600, 1320, world) Остров Зефира 1405, 2405 (&move 1405, 2405, world) Остров Купидона 2055, 2490 (&move 2055, 2490, world) Остров Канареек 3900, 3450 (&move 3900, 3450, world) Остров Стужи 3050, 2280 (&move 3050, 2280, world) Ледниковый Остров 2240, 1940 (&move 2240, 1940, world) Остров Руин 2720, 3670 (&move 2720, 3670, world) Остров Арены 1225, 2765 (&move 1225, 2765, world) Особенности практического применения 1) Карта не продумывалась в плане дизайна и проектировалась "на глаз" чтобы уместить основные континенты и острова на площади 4096 x 4096. Так, например, не учитывались географические и климатические особенности: "летние" острова находятся рядом с заснеженным континентом, а "зимние" – рядом с пустынным. Целью создания данной карты являлась демонстрация возможности подобных разработок; 2) Карта совершенно пустая. Это означает что на неё нужно добавить: точки возрождения персонажей игроков, NPC, точки возрождения монстров, ресурсы, порталы, причалы, регионы погоды и тому подобное; 3) Поскольку на одной карте будет множество объектов, включая персонажей игроков, неизвестно как будет работать GameServer.exe в плане производительности и хватит ли ему памяти. Вероятно, три основных континента были разделены разработчиками игры на разные карты именно из соображений производительности и распределения ресурсов. Тем не менее, можно попробовать настраивать следующие параметры из GameServer.cfg: [Entity] max_ply = 3000 max_cha = 15000 max_item = 30000 max_tnpc = 300 4) Серверные файлы world.atr и world.blk были получены с помощью программы YAMMI. При конвертации .map файла в .atr и .blk было получено предупреждение, что данная функция экспериментальная и, при использовании этих файлов на стороне сервера, могут возникнуть непредвиденные проблемы. Если такие проблемы действительно возникнут, и при должной необходимости, рассматривается разработка собственного конвертера .map -> .atr и .map -> .blk; 5) Генерация миникарты занимает около 4 часов, а итоговый файл .pk весит 849 Мегабайт (размер целого клиента!). Это связано с тем, что каждый фрагмент миникарты имеет разрешение 256 x 256 и сохраняется в формате .bmp, а также из-за большего числа фрагментов, чем на любой другой карте ("пустые" фрагменты с морем не сохраняются в .pk файл). При этом, фрагменты, например, из миникарты garner имеют размеры всего 64 x 64. Поэтому в теории можно существенно сократить размер файла world.pk, если пропатчить Game.exe и заставить его генерировать фрагменты размером 64 x 64. Также стоит отметить, что PK Viewer не работает с такими большими .pk файлами; 6) Файлы карты имеют большие размеры: world.map (86,4 МБ), world.obj (22,3 МБ), world.atr (48,0 МБ), world.blk (8,00 МБ). Получение карты Данная карта была получена с помощью Инструмента для обрезания и склеивания карт со следующей программой: #include <iostream> #include "Map.h" // Entry point int main(int argc, char* argv[]) { // Path to directory with maps const std::string base{ "C:\\pkodev\\map" }; // Print a welcome message std::cout << "Map cut & glue tool by V3ct0r from PKODev.NET" << std::endl; std::cout << std::endl; try { // Write a message std::cout << "Building world map, it can take a time . . ." << std::endl; // Main maps pkodev::MapWrapper garner, magicsea, darkblue; // Load main maps garner.load(base + "\\garner"); magicsea.load(base + "\\magicsea"); darkblue.load(base + "\\darkblue"); // Main continents pkodev::MapWrapper argent, shaitan, icicle; // Cut main continents from main maps argent = garner.cut( { 168, 980 }, { 2364, 3272 } ); shaitan = magicsea.cut( { 522, 2816 }, { 1880, 3900 } ); icicle = darkblue.cut( { 386, 178 }, { 3248, 1076 } ); // Some islands pkodev::MapWrapper autsumspr, fortune, cupid, arena, bridge, chill, glacier, zephyr; // Cut islands from main maps autsumspr = darkblue.cut( { 2088, 2371 }, { 4000, 3660 } ); // Autumn island + Summer island + Spring island fortune = darkblue.cut( { 1414, 1681 }, { 1771, 2024 } ); // Isle of Fortune cupid = magicsea.cut( { 2368, 2330 }, { 2675, 2608 } ); // Cupid isle arena = darkblue.cut( { 372, 3376 }, { 518, 3498 } ); // Arena isle bridge = darkblue.cut( { 762, 3344 }, { 964, 3524 } ); // Unknown isle nearly arena isle chill = magicsea.cut( { 2274, 370 }, { 2554, 782 } ); // Isle of Chill glacier = garner.cut( { 2134, 1069 }, { 2325, 1222 } ); // Glacier isle zephyr = garner.cut ({ 3200, 3045 }, { 3610, 3390 } ); // Zephyr isle // Use Ascaron map as base map garner.del( { 0, 112 }, { 4095, 4000 } ); // Free main maps magicsea.clear(); darkblue.clear(); // Add main continents + Autumn/Summer/Spring islands to the base map garner.glue( { 80, 1600 }, argent); argent.clear(); garner.glue( { 2700, 2500 }, shaitan); shaitan.clear(); garner.glue( { 2200, 600 }, autsumspr); autsumspr.clear(); garner.glue( { 80, 160 }, icicle); icicle.clear(); // Remove some garbage from the map garner.del( { 1119,1872 }, { 2372,2987 }); garner.del( { 1265, 1660 }, { 1770, 1980 }); garner.del( { 2621, 1765 }, { 2945, 1935 }); garner.del( { 2016, 1810 }, { 2115, 1875 }); garner.del( { 3912, 2623 }, { 4095, 3050 }); garner.del( { 1082, 1980 }, { 1124, 2024 }); garner.del( { 1125, 1819 }, { 1246, 1864 }); garner.del( { 2239, 3000 }, { 2289, 3036 }); garner.del( { 2948, 600 }, { 2970, 648 }); garner.del( { 245, 588 }, { 282, 620 }); garner.del( { 324, 680 }, { 390, 906 }); garner.del( { 2768, 3442 }, { 2882, 3480 }); garner.del( { 2935, 3428 }, { 2965, 3460 }); garner.del( { 3096, 3404 }, { 3226, 3447 }); garner.del( { 2240, 3572 }, { 2279, 3605 }); garner.del( { 3383, 3327 }, { 3603, 3459 }); garner.del( { 3743, 3204 }, { 3864, 3257 }); garner.del( { 3880, 3076 }, { 3915, 3105 }); garner.del( { 4010, 3168 }, { 4036, 3205 }); garner.del( { 3359, 908 }, { 3607, 1090 }); garner.del( { 1032, 1944 }, { 1055, 1968 }); garner.del( { 3254, 1192 }, { 3367, 1299 }); garner.del( { 3093, 1471 }, { 3153, 1610 }); garner.del( { 3075, 1679 }, { 3117, 1714 }); garner.del( { 3783, 671 }, { 3881, 793 }); garner.del( { 3695, 805 }, { 3727, 836 }); garner.del( { 2963, 615 }, { 2977, 631 }); garner.del( { 2040, 1685 }, { 2224, 1850 }); // Add islands to the map garner.glue( { 1388, 1036 }, fortune); fortune.clear(); garner.glue( { 1900, 2420 }, cupid); cupid.clear(); garner.glue( { 1125, 2740 }, arena); arena.clear(); garner.glue( { 2944, 1932 }, chill); chill.clear(); garner.glue( { 2656, 3632 }, bridge); bridge.clear(); garner.glue( { 2096, 1885 }, glacier); glacier.clear(); garner.glue( { 1348, 2160 }, zephyr); zephyr.clear(); // Save new map to file garner.save(base + "\\garner"); // Write a message std::cout << "Done!" << std::endl; } 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; } Скачать карту (596,3 МБ)
×
×
  • Create New...