DENIS.P.

Создаем радар с собственной картой

В теме 14 сообщений

Всем привет, думаю многие знают, что на некоторых проектах в мод-паки входит своя карта, отображаемая на радаре и в меню (ESC > Карта) с маппингом сервера, но немногие знают, как сделать себе такую. В этой теме я расскажу, как сделать собственный рендер карты со своим маппингом сервера.

 

Для начала несколько примечаний:
Для рендера с маппингом сервера потребуется перевести его в IPL формат, если ваша карта уже есть в таком формате - хорошо, если нет - мы научимся конвертировать её в этой теме.
Рекомендуется, чтобы удаляемые объекты (RemoveBuildingForPlayer), либо были в небольшом количестве, либо были незаметными, потому что удалить их на рендере невозможно.
Рендер можно делать с модификацией на текстуры игры (весна, осень, зима), получается весьма красиво.
Для рендера мы будем использовать программу MapViewer, которую можно найти в сети, но рекомендую использовать мою версию с некоторыми исправлениями в её скриптах.
Карту, которую мы получим в итоге, можно в пару кликов перевести либо в одно изображение, либо разделить по TXD файлам для мод-пака с помощью программы XRadarEditor.
Для создания рендера я рекомендую использовать полностью чистую копию GTA Criminal Russia 
На итоговом рендере не будет воды, её можно дорисовать через фотошоп.

Переводим карту в IPL формат:
Скачиваем следующий скрипт. Script
Используем любой сервер с установленным на нем sscanf 2.8.2 или выше.
Перекинем ipl.pwn в filterscripts и скомпилируем.
В файл scriptfiles/iplc/input.txt записываем код маппинга строго в формате CreateObjeсt без комментариев и лишних строк (пустых в том числе).
Запускаем сервер и вводим в консоль команду "loadfs ipl".
Если всё будет отлично - в scriptfiles/iplc/output.txt будет записан маппинг в формате IPL.

Подготовка игры для рендера карты:
Как я и сказал, рекомендуется чистая версия GTA Criminal Russia (желательно копией, дабы в будущем можно было легко делать рендер и не засорять рабочую игру).
Создаем в директории игры папку "map", копируем в созданную папку файлы "mp.img" и "mp_col.img" из папки "multiplayer_c/models" (оригинальной игры с мультиплеером), скачиваем файл и перекидываем его в папку "map" под названием "mp.ide".
Копируем IPL файл карты (полученный ранее в output.txt) в папку "map" под названием "map.ipl".
Если у вас есть мод-пак со своими объектами, то переместите всё в ту же папку IDE и IMG файл мод-пака, допустим под названиями "modpack.ide" и "modpack.img" (если есть IPL файл, то добавьте его содержимое к map.ipl).
Откройте файл %ПапкаИгры%/data/gta.dat и замените все его содержимое на:

IMG MODELS\gta3.IMG
IMG MODELS\gamemod.IMG
IMG MODELS\gta_int.IMG

IMG map\mp.IMG
IMG map\mp_col.IMG
# IMG map\modpack.IMG

IDE DATA\MAPS\generic\vegepart.IDE
IDE DATA\MAPS\generic\barriers.IDE
IDE DATA\MAPS\generic\dynamic.IDE
IDE DATA\MAPS\generic\dynamic2.IDE
IDE DATA\MAPS\generic\multiobj.IDE
IDE DATA\MAPS\generic\procobj.IDE
IDE DATA\MAPS\leveldes\levelxre.IDE
IDE DATA\MAPS\sopki\sopki.IDE
IDE DATA\MAPS\sopki\newgen.IDE
IDE DATA\MAPS\sopki\sopki_lesa.IDE
IDE DATA\MAPS\Arzamas\arzamas_N.IDE
IDE DATA\MAPS\Arzamas\arzamas_gen.IDE
IDE DATA\MAPS\Arzamas\arzamas_park.IDE
IDE DATA\MAPS\Arzamas\country_WN.IDE
IDE DATA\MAPS\Arzamas\arzamas_S.IDE
IDE DATA\MAPS\crteam\crteam.IDE
IDE DATA\MAPS\ryazan\ryazan.IDE
IDE DATA\MAPS\russia\garel.IDE
IDE DATA\MAPS\russia\materik.IDE
IDE DATA\MAPS\russia\materik_objs.IDE
IDE DATA\MAPS\lytkarino\lytkarino.IDE
IDE DATA\MAPS\russia\rogovichi.IDE
IDE DATA\MAPS\russia\OpenAir.IDE
IDE DATA\MAPS\batyrevo\batyrevo.IDE
IDE DATA\MAPS\mod_int\mod_int.IDE
IDE DATA\MAPS\mod_int\AudiosurfGame.IDE
IDE DATA\MAPS\veh_mods\veh_mods.IDE
IDE DATA\TXDCUT.IDE

IDE map\mp.IDE
# IDE map\modpack.IDE

IPL DATA\MAPS\sopki\sopki.IPL
IPL DATA\MAPS\sopki\sopki_add2.IPL
IPL DATA\MAPS\sopki\sopki_add3.IPL
IPL DATA\MAPS\sopki\sveg.IPL
IPL DATA\MAPS\sopki\add_sopki.IPL
IPL DATA\MAPS\sopki\sopki_lesa.IPL
IPL DATA\MAPS\Arzamas\arzamas_N.IPL
IPL DATA\MAPS\Arzamas\arzamas_N2.IPL
IPL DATA\MAPS\Arzamas\arzamas_Ngen.IPL
IPL DATA\MAPS\Arzamas\country_WN.IPL
IPL DATA\MAPS\Arzamas\arzamas_veg.IPL
IPL DATA\MAPS\Arzamas\arzamas_veg2.IPL
IPL DATA\MAPS\Arzamas\arzamas_park.IPL
IPL DATA\MAPS\Arzamas\arzamas_S.IPL
IPL DATA\MAPS\crteam\crteam.IPL
IPL DATA\MAPS\crteam\crteam_gen.IPL
IPL DATA\MAPS\crteam\crteam_veg.IPL
IPL DATA\MAPS\ryazan\ryazan.IPL
IPL DATA\MAPS\ryazan\ryazan_gen.IPL
IPL DATA\MAPS\ryazan\ryazan_veg.IPL
IPL DATA\MAPS\ryazan\koryakino.IPL
IPL DATA\MAPS\ryazan\koryakino_gen.IPL
IPL DATA\MAPS\russia\garel.IPL
IPL DATA\MAPS\russia\garel_gen.IPL
IPL DATA\MAPS\russia\materik.IPL
IPL DATA\MAPS\russia\materik_objs.IPL
IPL DATA\MAPS\russia\materik_gen.IPL
IPL DATA\MAPS\russia\SPC_generic.IPL
IPL DATA\MAPS\lytkarino\lytkarino.IPL
IPL DATA\MAPS\lytkarino\lyt_genveg.IPL
IPL DATA\MAPS\russia\rogovichi.IPL
IPL DATA\MAPS\russia\tesla_place.IPL
IPL DATA\MAPS\russia\bigRyazanLes.IPL
IPL DATA\MAPS\russia\OpenAir.IPL
IPL DATA\MAPS\batyrevo\batyrevo.IPL
IPL DATA\MAPS\batyrevo\batyrevo_tree.IPL
IPL DATA\MAPS\russia\metro2.IPL
IPL DATA\MAPS\mod_int\mod_int.IPL
IPL DATA\MAPS\mod_int\AudiosurfGame.IPL
IPL DATA\MAPS\audiozon.IPL
IPL DATA\MAPS\cull.IPL

IPL map\map.IPL

Раскомментируйте комментарии с файлами "modpack.IDE" и "modpack.IPL", если это требуется (пункт 4).
На этом подготовление игры к рендеру закончено, можем идти дальше.

Рендерим саму карту:
Скачиваем мою версию MapViewer.MapViewer
Распаковываем папку из архива в любое место.
Открываем файл games.cfg и прописываем в нем путь для нашей игры, примерно так:
G:\Games\GTA Criminal Russia Full Original
Запускаем MapViewer.exe, у вас должно открыться маленькое черное окошечко. Для того, чтобы убрать курсов из фокуса, нажмите один раз ESC, для того, чтобы закрыть MapViewer, нажмите два раза ESC или ALT + F4.
Нажимаем F1 и дожидаемся загрузи нашей карты, если всё будет отлично - мы сможем летать по карте.
Нажимаем F11 и дожидаемся конца рендера карты, скорее всего это действие придется повторить два раза, т.к. в рендере могут быть артефакты (черные дыры).
В папке radar получаем 145 bmp файлов каждого куска карты.

Объединение в одно изображение или разделение по TXD файлам:
Скачиваем от сюда и запускаем XRadarEditor.
Нажимаем Import > Import Tile(s), переходим в папку radar, выделяем все файлы (CTRL + A) и нажимаем "Открыть".
Экспортировать карту в одно изображение - Export > Export Map, экспортировать по TXD файлам - Export > Export Tiles > As TXDs > All.
Чтобы закрыть XRadarEditor, нажмите ПКМ > Exit.
Для того, чтобы заменить карту в игре, все TXD файлы можно перекинуть в gta3.img с заменой или в IMG файл мод-пака. Как я сказал выше, воду придется дорисовывать вручную (в XRadarEditor можно экспортировать всё в одно изображение, дорисовать воду, а потом импортировать и экспортировать TXD файлы).

Авторство:

Весь текст и авторство программа или их переделки принадлежат  JoKeR_2020 он же Владимир Сергеенко.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос почему такая карта появилась, я все сделал по инструкции!

И при этом карта как то в плохом качестве.

 

 

Скриншот 12-02-2018 140524.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Andrey_Akkerman значит вы в плохом качестве или неверно срендерили карту. При приближении, как известно, качество изображения теряется, так что это необходимо учитывать. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
53 минуты назад, DEST сказал:

@Andrey_Akkerman значит вы в плохом качестве или неверно срендерили карту. При приближении, как известно, качество изображения теряется, так что это необходимо учитывать. 

Он после рендера warning выдает

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Andrey_Akkerman Кстати, если вам нужен более качественный ренденр, то можно засунуть этот файл В папку viewer и сделать рендер, еще рендер лучше делать раз десять дабы было более прорисованней Кликни для скачки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где найти этот сверер с sscanf 2.8.2?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@blinchickvsemq скачать чистый сервер и скачать плагин sscanf 2.8.2, установить его на скачанный чистый и все готово. 

Чистый сервер для CR:MP 0.3e находится в разделе "Моды", а плагин в разделе "Плагины / инклуды". 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@DENIS.P. спасибо! намного лучше обычного качества!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня вопрос, что делать если некоторые здания на карте отрисовываются белым, без текстур?
а в режиме полета когда к ним подлетаю, они не загружаются вообще, стоят только их лоды
в самой игре таких багов нет, все работает стабильно и нормально
при загрузке в map editor тоже все в порядке

 

Спойлер

1111.jpg

Отредактировано пользователем odosenok
Причина: взял изображение под спойлер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 20.08.2019 в 17:32, AMOR сказал:

у меня вопрос, что делать если некоторые здания на карте отрисовываются белым, без текстур?
а в режиме полета когда к ним подлетаю, они не загружаются вообще, стоят только их лоды
в самой игре таких багов нет, все работает стабильно и нормально
при загрузке в map editor тоже все в порядке

 

  Изображение (закрыть спойлер)

1111.jpg

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что делать если у меня нету такого файла scriptfiles/iplc/input.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, _bogdan_ сказал:

Делаю в по инструкции, но при заходе на сервер происходит краш.

В чем может быть проблема?

Посмотрите в логах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Люди, а что, если нету папки "radar" после рендера?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можете обновить ссылку на скрипт?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Chopick
      От Chopick
      Всем здравствуйте! Делаю систему домов/бизнесов по туториалу knox know с плагином GoodArea. Есть проблема, если заходишь в интерьер бизнеса, то когда выходишь спавнит почему-то на пикап дома.

      Вот енумы:
       
      #define MAX_HOUSES 1000 #define MAX_BIZS 1000 enum house {         hID,         STREAMER_TAG_PICKUP:hPICKUP,         STREAMER_TAG_AREA:hAREA,         hOWNER[MAX_PLAYER_NAME],         STREAMER_TAG_3D_TEXT_LABEL:hTEXT[256],         STREAMER_TAG_MAP_ICON:hICON,         hPRICE,         hCLASS,         hINTERIOR,         Float:hX,         Float:hY,         Float:hZ,         Float:hA,         hCONDITION // Закрыт/Открыт } new House[MAX_HOUSES][house]; new Houses; new HouseGroup; enum biz {         bID,         STREAMER_TAG_PICKUP:bPICKUP,         STREAMER_TAG_AREA:bAREA,         bOWNER[MAX_PLAYER_NAME],         STREAMER_TAG_3D_TEXT_LABEL:bTEXT[256],         STREAMER_TAG_MAP_ICON:bICON,         bNAME[25],         bPRICE,         bTYPE,         bINTERIOR,         Float:bX,         Float:bY,         Float:bZ,         Float:bA } new Biz[MAX_BIZS][biz]; new Bizs; new BizGroup; enum interior_info {         intID,         intNAME[41],         intINTERIOR,         Float:intX,         Float:intY,         Float:intZ,         Float:intA,         STREAMER_TAG_AREA:intAREA } new Interior[MAX_INTERIORS][interior_info]; new Interiors; new InteriorGroup; Вот что у меня в OnGameModeInit:
      HouseGroup = CreateGroupGoodAreas(GoodArea:HouseEnter); InteriorGroup = CreateGroupGoodAreas(GoodArea:InteriorExit); BizGroup = CreateGroupGoodAreas(GoodArea:BizArea);  
      Вот стоки:
      GAResponse:HouseEnter(playerid, response, key, index) {         switch(response)         {             case GA_RESPONSE_PRESS_KEY:             {                 if(key & KEY_WALK)                 {                 if(House[index][hCONDITION] > 0 && House[index][hOWNER] == player_info[playerid][NAME] || House[index][hCONDITION] == 0)                 {                                         GoToInterior(playerid, House[index][hINTERIOR]);                                         SetPlayerVirtualWorld(playerid, index);                                 }                                 else if(House[index][hCONDITION] > 0 && House[index][hOWNER] != player_info[playerid][NAME]) return SCM(playerid, COLOR_RED, "[Ошибка]{ffffff}Этот дом закрыт на ключ!");                         }                 }                 case GA_RESPONSE_ENTER:                 {                     if(House[index][hOWNER] == 0)                     {                         CreateNoOwnerHouseTD(playerid);                         for(new i = 0; i < sizeof NoOwnerTextDraw_PTD[]; i++)                         {                             PlayerTextDrawShow(playerid, NoOwnerTextDraw_PTD[playerid][i]);                                 }                                 new price[8];                                 format(price, sizeof(price), "%d$", House[index][hPRICE]);                                 PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][2], price);                                 new id[9];                                 format(id, sizeof(id), "%d", House[index][hID]);                                 PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][0], id);                                 switch(House[index][hCLASS])                                 {                                     case 1: PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][1], "A");                                     case 2: PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][1], "B");                                     case 3: PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][1], "C");                                 }                                 for(new i = 0; i < sizeof NoOwnerTextDraw_TD; i++)                         {                             TextDrawShowForPlayer(playerid, NoOwnerTextDraw_TD[i]);                                 }                         }                 }                 case GA_RESPONSE_LEAVE:                 {                 for(new i = 0; i < sizeof NoOwnerTextDraw_PTD[]; i++)                 {                     PlayerTextDrawHide(playerid, NoOwnerTextDraw_PTD[playerid][i]);                         }                         for(new i = 0; i < sizeof NoOwnerTextDraw_TD; i++)                 {                     TextDrawHideForPlayer(playerid, NoOwnerTextDraw_TD[i]);                         }                 }         }         return 1; } GAResponse:BizArea(playerid, response, key, index) {         switch(response)         {             case GA_RESPONSE_PRESS_KEY:             {                 if(key & KEY_WALK)                 {                     GoToInteriorBiz(playerid, Biz[index][bINTERIOR]);                                 SetPlayerVirtualWorld(playerid, index);                 }                 }         }         return 1; } GAResponse:InteriorExit(playerid, response, key, index) {         switch(response)         {             case GA_RESPONSE_PRESS_KEY:             {                 new world = GetPlayerVirtualWorld(playerid);                 if(key & KEY_WALK)                 {                     if(world < MAX_HOUSES)                     {                         SetPlayerInterior(playerid, 0);                             SetPlayerVirtualWorld(playerid, 0);                             SetPlayerPos(playerid, House[world][hX], House[world][hY], House[world][hZ]);                             SetPlayerFacingAngle(playerid, House[world][hA]);                                 }                                 else if(world < MAX_HOUSES + MAX_BIZS)                     {                         world -= MAX_HOUSES;                                         printf("%d index world", world);                         SetPlayerInterior(playerid, 0);                             SetPlayerVirtualWorld(playerid, 0);                             SetPlayerPos(playerid, Biz[world][bX], Biz[world][bY], Biz[world][bZ]);                             SetPlayerFacingAngle(playerid, Biz[world][bA]);                                 }                         }                         if(key & KEY_CTRL_BACK)                         {                             if(player_info[playerid][HOUSE] != House[world][hID]) return SCM(playerid, COLOR_RED, "[Ошибка]{ffffff}Вы не владелец данного дома!");                             new dialog[256];                                 format(dialog, sizeof(dialog),                                         "{ffd900}[1]{ffffff}Информация о доме\n\                                         {ffd900}[2]{ffffff}%s дом",                                 (House[world][hCONDITION] == 1) ? ("{00ff00}Открыть") : ("{ff0000}Закрыть"));                             SPD(playerid, DLG_HMENU, DIALOG_STYLE_LIST, "{ffd900}Меню дома", dialog, "Выбрать", "Закрыть");                             return 1;                         }                 }         }         return 1; } stock GoToInterior(playerid, interior) {     for(new i = 0; i < Interiors; i++)         {             if(Interior[i][intID] != interior) continue;             SetPlayerInterior(playerid, Interior[i][intINTERIOR]);             SetPlayerPos(playerid, Interior[i][intX], Interior[i][intY], Interior[i][intZ]);             SetPlayerFacingAngle(playerid, Interior[i][intA]);             SetPlayerCheckpoint(playerid, Interior[i][intX], Interior[i][intY], Interior[i][intZ], 1.0);             new str[128];             format(str, sizeof(str),                         "Нажмите \"ALT\" для выхода\n\                         Нажмите \"H\", чтобы открыть меню дома");             Create3DTextLabel(str, -1, Interior[i][intX], Interior[i][intY], Interior[i][intZ], 15.0, 0, 1);             return 1;         }         return 0; } stock GoToInteriorBiz(playerid, interior) {     for(new i = 0; i < Interiors; i++)         {             if(Interior[i][intID] != interior) continue;             SetPlayerInterior(playerid, Interior[i][intINTERIOR]);             SetPlayerPos(playerid, Interior[i][intX], Interior[i][intY], Interior[i][intZ]);             SetPlayerFacingAngle(playerid, Interior[i][intA]);             SetPlayerCheckpoint(playerid, Interior[i][intX], Interior[i][intY], Interior[i][intZ], 1.0);             new str[128];             format(str, sizeof(str),                         "Нажмите \"ALT\" для выхода");             Create3DTextLabel(str, -1, Interior[i][intX], Interior[i][intY], Interior[i][intZ], 15.0, 0, 1);             return 1;         }         return 0; }  
       
      Что мне делать, подскажите пожалуйста?
    • Jdjdjd
      От Jdjdjd
      Как сделать открытие закрытие ворот в Радмир рп на копии,и куд а нужно вставлять код?