КАК СТРОИТЬ КАРТЫ В BLACK OPS III | РУКОВОДСТВО ДЛЯ CЛОНИКОВ 🐘
📌КАК ПРАВИЛЬНО УСТАНОВИТЬ СОФТ ДЛЯ СОЗДАНИЯ КАРТ
Первым делом в библиотеке выставляем галочки на разделе "Инструменты" и "Приложения"
Далее в поиске либо ручками находим - Call of Duty: Black Ops III - Mod Tools
Перед тем как устанавливать, при помощи ПРАВОЙ КНОПКИ МЫШИ заходим в свойства этого приложения и переходим в раздел с ДОПОЛНИТЕЛЬНЫМ КОНТЕНТОМ и ставим галочку чтобы докачать весь контент редактора чтобы не словить баги, лаги и прочую нечесть.
После шагов описанных выше заходим в панель управления Windows и ищем раздел "Часы и регион" - "Изменение форматов даты, времени и чисел"
В разделе "Форматы" нужна кнопка "Дополнительные параметры"
Разделитель целой и дробной части используем "." (точку) Применяем и закрываем.
Устанавливаем!
После установки выходим из приложения Steam на своём PC и в папке с играми Steam (Steam/steamapps/common) появится новая папка "Call of Duty Black Ops III 455130" в ней мы должны убрать цифры и пробел перед ними чтобы начать слияние папок
Далее ищем в папке "steamapps" файл "appmanifest_455130" и открываем его как блокнот
в документе в пункте installdir убираем цифры также как делали это у папки, сохраняем и можем запускать приложение через Steam
Далее ОБЯЗАТЕЛЬНО выставляем все языки в редакторе как у меня чтобы при запуске карты на отличных от вас языках она не вылетала
Дальше закрываем полностью лаунчер и скачиваем дополнительные микро-плюшки для него ТУТ[mega.nz] чтобы облегчить жизнь в редакторе.
- Скачать архив
- Открыть архив
- Открыть папку "Ultra Dark" и перенести всё содержимое в главную папку Black Ops III
📝НЕБОЛЬШОЕ ВВЕДЕНИЕ ПО СОДЕРЖИМОМУ В MOD TOOLS
🧶КАК СОЗДАТЬ КАРТУ И ЗАПУСТИТЬ ЕЁ В РЕДАКТОРЕ
"Template" используем "ZM Mod Level" и пишем название обязательно начинающееся на "zm_" и нажимаем "OK"
Чтобы запустить карту в редакторе выбираем её в меню лаунчера чтобы она горела оранжевым и нажимаем на кнопку с буквой R и ждём полной загрузки
Welcome! =)
🏃🏻♂️ОСНОВНОЕ УПРАВЛЕНИЕ RADIANT
Backspace - Удалить объект
ПКМ - Горизонтальное перемещение
Ctrl + ПКМ - Вертикальное перемещение
Ctrl + Shift + ПКМ - Свободный обзор
N - Параметры энтити
S - Параметры текстур
H - Скрыть объект
Shift + H - Показать скрытые объекты
B - Браузер энтити
M - Браузер моделей
T - Браузер текстур
F - Фильтр объектов
R - Разворот объектов
F5-F9 - Изменение освещения
Ctrl + Tab - Изменение перспективы
🎈ПОЛЕЗНОСТИ
Плагин для Visual Studio Code обеспечивающий удобства в скриптинге[marketplace.visualstudio.com]
Плагин для Visual Studio Code обеспечивающий удобства в редактировании кода звуков[marketplace.visualstudio.com]
Devraw Legacy[docs.google.com]
T7Wiki[www.t7wiki.com]
Wiki ModMe[wiki.modme.co]
Kingslayer Kyle's Assets[sites.google.com]
API документация по GSC языку от ZeRoY[scripts.zeroy.com]
Пак скриптов, звуков, текстур с моих карт (можете ковырять их узнавая новое если разберётесь)[drive.google.com]
ModTools Discord[discord.gg]
✨АССЕТЫ: ДОБАВЛЕНИЕ ПЕРКОВ
После скачки пака с перками делаем следующее:
Перенести выделенные папки из архива в главную папку с БО3 с заменой
Далее в архиве открываем путь (usermaps - OPEN ME\YOUR_MAP_NAME) и содержимое перекидываем в папку вашей карты
Далее скачиваем два архива:
Библиотека визуальных эффектов[mega.nz]
Скрипты для компиляции кастомного худа[mega.nz]
Переносим все папки из архива с эффектами (hb21_fx_library) в главную папку с БО3 с заменой
В архиве с L3ak Mod будет .dll файл, его кидаем по следующему пути (Call of Duty Black Ops III\bin)
Далее переходим в папку нашей карты и ищем файл "имянашейкарты.gsc" в папке "scripts" (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.gsc)
В коде ищем раздел //Perks и после "#using scripts\zm\_zm_perk_staminup;" вставляем следующее:
#using scripts\zm\_zm_perk_electric_cherry;
#using scripts\zm\_zm_perk_widows_wine;
#using scripts\zm\_zm_perk_vulture_aid;
#using scripts\zm\_zm_perk_whoswho;
#using scripts\zm\_zm_perk_tombstone;
#using scripts\zm\_zm_perk_phdflopper;
#using scripts\zm\_zm_perk_elemental_pop;
#using scripts\zm\_zm_perk_random;
Тоже самое делаем в файле .csc нашей карты (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.csc)
После чего открываем в архиве с перками следующий путь (EXAMPLE MAP!!!!!!!!!!!!!!!!!!!!\usermaps\zm_ultimate_perks\ui\uieditor) и открываем следующий путь в папке нашей карты (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\ui\uieditor) и переносим "menus" из архива.После чего мы снова открываем наш .csc файл (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.csc) и в функции "main" вставляем следующую строку
luiLoad( "ui.uieditor.menus.hud.t7hud_zm_custom" );Топаем по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующую строку прямо над "xmodel,skybox_default_day"
include,hb21_perks
Направляемся по пути (Call of Duty Black Ops III\share\zone_source) и открываем "hb21_perks.zpkg". Туда вставляем строку указанную ниже. Куда её вписать указано на скриншоте
rawfile, ui/ uieditor/ menus/ hud/ t7hud_zm_custom .lua (уберите пробел перед .lua и после слешей, а то стим думает что ссылка, пример на скриншоте)И напоследок добавляем звуки. Ищем файл .szc (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\sound\zoneconfig\zm_zperma_city.szc) и открываем его.
После этих строк
{
"Type" : "ALIAS",
"Name" : "user_aliases",
"Filename" : "user_aliases.csv",
"Specs" : [ ]
},
{
"Type" : "ALIAS",
"Name" : "perk_sounds",
"Filename" : "perk_sounds.csv",
"Specs" : [ ]
},
{
"Type" : "ALIAS",
"Name" : "wonderfizz_sounds",
"Filename" : "wonderfizz_sounds.csv",
"Specs" : [ ]
},
✨АССЕТЫ: ДОБАВЛЕНИЕ ЯЩИКОВ
После скачки пака с ящиками делаем следующее:
Перенести выделенные папки из архива в главную папку с БО3 с заменой
Далее в архиве открываем путь (usermaps - OPEN ME\YOUR_MAP_NAME) и содержимое перекидываем в папку вашей карты
Далее переходим в папку нашей карты и ищем файл "имянашейкарты.gsc" в папке "scripts" (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.gsc)
Ищем в коде строку "#using scripts\zm\zm_usermap;" и после неё вставляем следующее: #using scripts\zm\_hb21_zm_magicbox;
Тоже самое проделываем и в .csc файле нашей карты. (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.csc)
Топаем по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующую строку прямо над "xmodel,skybox_default_day"
include,hb21_mystery_boxesИ напоследок добавляем звуки. Ищем файл .szc (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\sound\zoneconfig\zm_zperma_city.szc) и открываем его.
После этих строк
{
"Type" : "ALIAS",
"Name" : "user_aliases",
"Filename" : "user_aliases.csv",
"Specs" : [ ]
},
{
"Type" : "ALIAS",
"Name" : "mysterybox_sounds",
"Filename" : "mysterybox_sounds.csv",
"Specs" : [ ]
},
Находим наши коробки в редакторе карт в браузере префабов (ПКМ по пустому месту редактора) Ставим на карту, компилируем, радуемся! (Если нет звуков перекомпилируйте карту ещё раз либо проверьте шаги выше)
✨АССЕТЫ: ДОБАВЛЕНИЕ ОРУЖИЙ
После скачки пака с оружием делаем следующее:
Перенести выделенные папки из архива в главную папку с БО3 с заменой
Топаем по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующие строки прямо над "xmodel,skybox_default_day"
stringtable,gamedata/weapons/zm/zm_levelcommon_weapons.csv
weapon,t8_abr223
weapon,t8_abr223_up
weapon,t8_auger_dmr
weapon,t8_auger_dmr_up
weapon,t8_cordite
weapon,t8_cordite_up
weapon,t8_escargot
weapon,t8_escargot_up
weapon,t8_essex_m07
weapon,t8_essex_m07_up
weapon,t8_zweihander
weapon,t8_zweihander_up
weapon,t8_gks
weapon,t8_gks_up
weapon,t8_hades
weapon,t8_hades_up
weapon,t8_hellion_salvo
weapon,t8_hellion_salvo_up
weapon,t8_hitchcock_m9
weapon,t8_hitchcock_m9_up
weapon,t8_icr7
weapon,t8_icr7_up
weapon,t8_kn57
weapon,t8_kn57_up
weapon,t8_koshka
weapon,t8_koshka_up
weapon,t8_m1897
weapon,t8_m1897_up
weapon,t8_m1927
weapon,t8_m1927_up
weapon,t8_maddox_rfb
weapon,t8_maddox_rfb_up
weapon,t8_mog12
weapon,t8_mog12_up
weapon,t8_mozu
weapon,t8_mozu_up
weapon,t8_mx9
weapon,t8_mx9_up
weapon,t8_outlaw
weapon,t8_outlaw_up
weapon,t8_overkill_zm
weapon,t8_overkill_launcher_zm
weapon,t8_overkill_up_zm
weapon,t8_overkill_launcher_up_zm
weapon,t8_paladin_hb50
weapon,t8_paladin_hb50_up
weapon,t8_rampart17
weapon,t8_rampart17_up
weapon,t8_rk7
weapon,t8_rk7_up
weapon,t8_saug9mm
weapon,t8_saug9mm_up
weapon,t8_sdm
weapon,t8_sdm_up
weapon,t8_sg12
weapon,t8_sg12_up
weapon,t8_spitfire
weapon,t8_spitfire_up
weapon,t8_strife
weapon,t8_strife_up
weapon,t8_swordfish
weapon,t8_swordfish_up
weapon,t8_titan
weapon,t8_titan_up
weapon,t8_vapr_xkg
weapon,t8_vapr_xkg_up
weapon,t8_vkm750
weapon,t8_vkm750_up
weapon,t8_daemon3xb
weapon,t8_daemon3xb_up
weapon,t8_grav
weapon,t8_grav_up
weapon,t8_kap45
weapon,t8_kap45_up
weapon,t8_rampage
weapon,t8_rampage_up
weapon,t8_swat_rft
weapon,t8_swat_rft_up
weapon,t8_switchblade_x9
weapon,t8_switchblade_x9_up
weapon,t8_vendetta
weapon,t8_vendetta_up
weapon,t8_welling
weapon,t8_welling_up
Удаляем в папке gamedata всё кроме папки "weapons-zm-zm_levelcommon_weapons.csv"
Открываем "zm_levelcommon_weapons.csv" и вставляем туда следующее предварительно удалив прошлые записи. t8_abr223,t8_abr223_up,,1500,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_auger_dmr,t8_auger_dmr_up,,1750,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_cordite,t8_cordite_up,,1500,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_escargot,t8_escargot_up,,1300,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_essex_m07,t8_essex_m07_up,,500,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_zweihander,t8_zweihander_up,,3000,lmg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,lmg,,,
t8_gks,t8_gks_up,,1300,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_hades,t8_hades_up,,2500,lmg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,lmg,,,
t8_hellion_salvo,t8_hellion_salvo_up,,3000,launcher,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,launcher,TRUE,,
t8_hitchcock_m9,t8_hitchcock_m9_up,,1750,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_icr7,t8_icr7_up,,1550,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_kn57,t8_kn57_up,,1400,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_koshka,t8_koshka_up,,2000,sniper,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,sniper,,,
t8_m1897,t8_m1897_up,,1500,shotgun,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,shotgun,,,
t8_m1927,t8_m1927_up,,1500,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_maddox_rfb,t8_maddox_rfb_up,,1400,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_mog12,t8_mog12_up,,1000,shotgun,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,shotgun,,,
t8_mozu,t8_mozu_up,,1000,pistol,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,pistol,,,
t8_mx9,t8_mx9_up,,1100,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_outlaw,t8_outlaw_up,,1900,sniper,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,sniper,,,
t8_overkill,t8_overkill_up,,7500,lmg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,lmg,,,
t8_paladin_hb50,t8_paladin_hb50_up,,2500,sniper,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,sniper,,,
t8_rampart17,t8_rampart17_up,,1700,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_rk7,t8_rk7_up,,700,pistol,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,pistol,,,
t8_saug9mm,t8_saug9mm_up,,750,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_sdm,t8_sdm_up,,1750,sniper,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,sniper,,,
t8_sg12,t8_sg12_up,,1300,shotgun,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,shotgun,,,
t8_spitfire,t8_spitfire_up,,1400,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_strife,t8_strife_up,,300,pistol,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,pistol,,,
t8_swordfish,t8_swordfish_up,,1600,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_titan,t8_titan_up,,2750,lmg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,lmg,,,
t8_vapr_xkg,t8_vapr_xkg_up,,1550,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_vkm750,t8_vkm750_up,,3000,lmg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,lmg,,,
t8_daemon3xb,t8_daemon3xb_up,,1000,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_grav,t8_grav_up,,1600,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_kap45,t8_kap45_up,,750,pistol,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,pistol,,,
t8_rampage,t8_rampage_up,,1600,shotgun,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,shotgun,,,
t8_swat_rft,t8_swat_rft_up,,1650,rifle,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,rifle,,,
t8_switchblade_x9,t8_switchblade_x9_up,,1150,smg,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,smg,,,
t8_vendetta,t8_vendetta_up,,1700,sniper,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,sniper,,,
t8_welling,t8_welling_up,,1300,pistol,,,,,TRUE,FALSE,FALSE,,,FALSE,TRUE,pistol,,,
Компилируем, радуемся! (Если нет звуков перекомпилируйте карту ещё раз либо проверьте шаги выше)
✨АССЕТЫ: ИЗМЕНЕНИЕ ОТРЯДА
Переносим две папки из архива в главную папку БО3
Перемещаемся по пути (Call of Duty Black Ops III\zone_source\all\assetlist) и открываем файл "core_common.csv"
Внутри файла ищем строки через Ctrl+F:
xmodel,c_zom_zod_boxer_mpc_fb
xmodel,c_zom_zod_boxer_viewbody
xmodel,c_zom_zod_boxer_viewhands
xmodel,c_zom_zod_boxer_viewlegs
xmodel,c_zom_zod_detective_mpc_fb
xmodel,c_zom_zod_detective_viewbody
xmodel,c_zom_zod_detective_viewhands
xmodel,c_zom_zod_detective_viewlegs
xmodel,c_zom_zod_femme_mpc_fb
xmodel,c_zom_zod_femme_viewbody
xmodel,c_zom_zod_femme_viewhands
xmodel,c_zom_zod_femme_viewlegs
xmodel,c_zom_zod_magician_mpc_fb
xmodel,c_zom_zod_magician_viewbody
xmodel,c_zom_zod_magician_viewhands
xmodel,c_zom_zod_magician_viewlegs
image,uie_t7_zm_hud_score_char5
image,uie_t7_zm_hud_score_char6
image,uie_t7_zm_hud_score_char7
image,uie_t7_zm_hud_score_char8
Топаем по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующие строки прямо над "xmodel,skybox_default_day"
xmodel,c_zom_zod_boxer_mpc_fbxmodel,c_zom_zod_boxer_viewbody
xmodel,c_zom_zod_boxer_viewhands
xmodel,c_zom_zod_boxer_viewlegs
xmodel,c_zom_zod_detective_mpc_fb
xmodel,c_zom_zod_detective_viewbody
xmodel,c_zom_zod_detective_viewhands
xmodel,c_zom_zod_detective_viewlegs
xmodel,c_zom_zod_femme_mpc_fb
xmodel,c_zom_zod_femme_viewbody
xmodel,c_zom_zod_femme_viewhands
xmodel,c_zom_zod_femme_viewlegs
xmodel,c_zom_zod_magician_mpc_fb
xmodel,c_zom_zod_magician_viewbody
xmodel,c_zom_zod_magician_viewhands
xmodel,c_zom_zod_magician_viewlegs
image,uie_t7_zm_hud_score_char5
image,uie_t7_zm_hud_score_char6
image,uie_t7_zm_hud_score_char7
image,uie_t7_zm_hud_score_char8
Далее переходим в папку нашей карты и ищем файл "имянашейкарты.gsc" в папке "scripts" (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.gsc)
Открываем файл и ищем функцию main()
и под zm_usermap::main(); вставляем следующее
Также самом низу файла вставляем новую функцию как на скриншоте
function set_character_body_type(){
self SetCharacterBodyType( self.characterIndex + 5 );
}
Компилируем, радуемся! (Если нет звуков перекомпилируйте карту ещё раз либо проверьте шаги выше)
✨АССЕТЫ: ИЗМЕНЕНИЕ ЗВУКОВ РАУНДА
СТАНДАРТНЫЙ ПАК ЗВУКОВ ЗДЕСЬ (Звуки можно будет изменить на свои)[mega.nz]
Переносим папки из архива в главную папку БО3Ищем файл .szc (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\sound\zoneconfig\zm_zperma_city.szc) и открываем его.
После этих строк
{
"Type" : "ALIAS",
"Name" : "user_aliases",
"Filename" : "user_aliases.csv",
"Specs" : [ ]
},
Вставляем наши
{"Type" : "ALIAS",
"Name" : "mus_round_classified",
"Filename" : "mus_round_classified.csv",
"Specs" : [ ]
},
По пути (Call of Duty Black Ops III\sound_assets\zmb\zmb_blops4\mus\classified) находятся наши звуки.
По пути (Call of Duty Black Ops III\share\raw\sound\aliases) в файле "mus_round_classified" находится код наших звуков
Во первых - нужен звук в особом формате (.wav,48000Hz,16bit) для этого я использовал Sony Vegas, но вы можете использовать другой софт для конвертации ваших звуков в этот формат.
Чтобы добавить свои звуки вы должны понять следующее:- Белым цветов выделено название которое используется в коде карты
- Зелёным цветом указан путь до звука начинающийся с папки "sound_assets"
Компилируем, радуемся! (Если нет звуков перекомпилируйте карту ещё раз либо проверьте шаги выше)
Вы можете изменить звуки раунда для собак при помощи этих строк:
Если Стим не даёт скопировать данные строчки, откройте как ссылки и скопируйте их оттуда(Будьте внимательны при использовании пути, я создавал дополнительную папку для собак)
✨АССЕТЫ: ИЗМЕНЕНИЕ ИКОНОК БОНУСОВ
КАЧАЕМ ПАК ИКОНОК ТУТ (Сможете в дальнейшем изменить на свои)[drive.google.com]
По классике переносим файлы из архива в папку БО3Копируем текст ниже и направляемся по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующую строку прямо над "xmodel,skybox_default_day"
image,specialty_giant_killjoy_zombiesimage,specialty_giant_2x_zombies
image,specialty_giant_firesale_zombies
image,t7_hud_zm_powerup_giant_deathmachine
Открываем APE и пишем в строке поиска Name - deathmachine и находим изображение t7_hud_zm_powerup_giant_deathmachine, находим троеточие и выбираем нашу кастомную иконку по пути (Call of Duty Black Ops III\texture_assets\custom\powerups) и выбираем новую иконку мини-гана
В ЭТОЙ ПАПКЕ ЛЕЖАТ ВСЕ НАШИ БОНУСЫ, МОЖЕТЕ ОТКРЫТЬ ИХ ЧЕРЕЗ ФОТОШОП И ИЗМЕНИТЬ КАК ВАМ НУЖНО, ТАК КАК ДАННУЮ ПРОЦЕДУРУ ПОИСКА ЧЕРЕЗ APE ДЛЯ ДРУГИХ БОНУСОВ ДЕЛАТЬ НЕ НУЖНО.
Компилируем, радуемся!
✨АССЕТЫ: ИЗМЕНЕНИЕ ЗВУКОВ БОНУСОВ
КОМПЛЕКТ КАСТОМНОГО АНАУНСЕРА КАЧАЕМ ТУТ (Сможете изменить на свои)[mega.nz]
Из архива перекидываем папки в главную папку БО3Ищем файл .szc (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\sound\zoneconfig\zm_zperma_city.szc) и открываем его.
После этих строк
{
"Type" : "ALIAS",
"Name" : "user_aliases",
"Filename" : "user_aliases.csv",
"Specs" : [ ]
},
Вставляем наши:
{"Type" : "ALIAS",
"Name" : "chaos_ancr",
"Filename" : "chaos_ancr.csv",
"Specs" : [ ]
},
Компилируем, радуемся! (Если нет звуков перекомпилируйте карту ещё раз либо проверьте шаги выше)
По пути (Call of Duty Black Ops III\sound_assets\announcer\chaos) можете найти эти звуки и заменить на нужные вам (нужен звук в особом формате (.wav,48000Hz,16bit) для этого я использовал Sony Vegas, но вы можете использовать другой софт для конвертации ваших звуков в этот формат.)
✨АССЕТЫ: СВОЙ КАМУФЛЯЖ ДЛЯ PACK-A-PUNCH
КАЧАЕМ ПРЕСЕТ ДЛЯ КАМУФЛЯЖЕЙ ТУТ[drive.google.com]
Переносим папки из архива в главную папку БО3✨АССЕТЫ: ИЗМЕНЕНИЕ ИКОНОК ПЕРКОВ
КАЧАЕМ СТАНДАРТНЫЙ ПРЕСЕТ ТУТ (Сможете в будущем изменить)[mega.nz]
Папку ui из архива переносим в главную папку нашей карты (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city)Делаем в файле .csc нашей карты (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.csc) строку
LuiLoad( "ui.uieditor.menus.hud.hud_zm_mapname" );
в функции main над текстом "zm_usermap::main();"Нажимаем ПКМ по нашей GDT и выбираем New Asset далее задаём название для нашей текстуры и нажимаем ОК
По пути (Call of Duty Black Ops III\texture_assets) создаём папку где буду храниться наши иконки и переносим нужные нам туда (я использовал ЭТОТ ПАК[drive.google.com] а затем менял его под себя)
Выбираем наш созданный ассет и выбираем в нём новую иконку для перка и также делаем настройки как на втором скриншотеЗапоминаем название нашей кастомной текстуры и идём по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующую строку прямо над "xmodel,skybox_default_day"
image,ИМЯ_ВАШЕЙ_ИКОНКИ_В_APEИ после добавления всех имён ваших кастомных перков вставляем
rawfile,ui/uieditor/menus/hud/hud_zm_mapname.lua
rawfile,ui/rewrite/ui/uieditor/widgets/hud/zm_perks/ZMPerksContainerFactory.lua
Проворачиваем так для каждого перка, компилируем и радуемся!
✨АССЕТЫ: ДОБАВЛЕНИЕ МАРГВ
ПАК МАРГВ КАЧАТЬ ТУТ[mega.nz]
ОБЯЗАТЕЛЬНАЯ БИБЛИОТЕКА ВИЗУАЛЬНЫХ ЭФФЕКТОВ[mega.nz]
Далее переходим в папку нашей карты и ищем файл "имянашейкарты.gsc" в папке "scripts" (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.gsc)
В коде ищем раздел //Perks и после "#using scripts\zm\_zm_perk_staminup;" вставляем следующее:
#using scripts\zm\_hb21_zm_ai_margwa;
Тоже самое делаем в файле .csc нашей карты (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.csc)Добавляем звуки. Ищем файл .szc (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\sound\zoneconfig\zm_zperma_city.szc) и открываем его.
После этих строк:
{
"Type" : "ALIAS",
"Name" : "user_aliases",
"Filename" : "user_aliases.csv",
"Specs" : [ ]
},
Вставляем наши:
{"Type" : "ALIAS",
"Name" : "zm_ai_margwa",
"Filename" : "zm_ai_margwa.csv",
"Specs" : [ ]
},
Идём по пути (Call of Duty Black Ops III\zone_source\all\assetlist) и открываем файл core_patch.csv и ищем в файле строчки
scriptparsetree,scripts/shared/ai/margwa.csc
scriptparsetree,scripts/shared/ai/margwa.gsc
Топаем по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующую строку прямо над "xmodel,skybox_default_day"
include,zm_ai_margwaВыбираем фиолетовую маргву и удаляем её (она багованная) и делаем как один шаг назад (ПКМ->Prefab) но теперь выбираем Leave Prefab.
Дальше переносим префаб из того же раздела со спавнпоинтом маргв на 3Д картуКомпилируем и радуемся ! (Если нет звуков компилируем ещё раз)
✨АССЕТЫ: МУЗЫКАЛЬНАЯ ПАСХАЛКА
ФАЙЛЫ ДЛЯ ПАСХАЛКИ КАЧАЕМ ТУТ (Уберите пробелы, стим кусается)
https://www.me dia fi re.com/file/j3pa79xa3d5w4jh/music_ee.rar
В архиве по пути (music_ee\music_ee\usermaps\your_map\scripts\zm) переносим файл в (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm)
После чего в этом же месте открываем (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.gsc)
В файле над строчкой
//Traps
#using scripts\zm\_zm_trap_electric;
Вписываем нашу
#using scripts\zm\_zm_easteregg_song;Чуть ниже найдём функцию main в которой над
//Setup the levels Zombie Zone Volumes
level.zones = [];
level.zone_manager_init_func =&usermap_test_zone_init;
Впишем
thread zm_easteregg_song::init();Добавляем звуки. Ищем файл .szc (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\sound\zoneconfig\zm_zperma_city.szc) и открываем его.
После этих строк
{
"Type" : "ALIAS",
"Name" : "user_aliases",
"Filename" : "user_aliases.csv",
"Specs" : [ ]
},
Вставляем наши:
{"Type" : "ALIAS",
"Name" : "music",
"Filename" : "music.csv",
"Specs" : [ ]
},
Топаем по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующую строку прямо над "xmodel,skybox_default_day"
scriptparsetree,scripts/zm/_zm_easteregg_song.gscВ папке (Call of Duty Black Ops III\sound_assets) создаём папку "music" и засовываем в неё 3 наших аудиофайла с именами "song_name" "ee_loop_trigger" и "ee_trigger"
Звуком "song_name" будет наш трек
Звуком "ee_loop_trigger" будет амбиент который играет около медведя
Звуком "ee_trigger" будет звук активации медведя
(Нужен звук в особом формате (.wav,48000Hz,16bit) для этого я использовал Sony Vegas, но вы можете использовать другой софт для конвертации ваших звуков в этот формат.)
(Можно зайти внутрь префаба ПКМ->Enter Prefab и изменить медведя на другую модель)
Конвертируем и радуемся ! (Если звуки отсутствуют то компилируем карту ещё раз)
❌💻СКРИПТИНГ: БАЗОВЫЕ ЗНАНИЯ
❌💻СКРИПТИНГ: КНОПКИ
❌💻СКРИПТИНГ: ЗВУКИ
❌💻СКРИПТИНГ: ТЕЛЕПОРТ ОТРЯДА
💻СКРИПТИНГ: ПРОЛЁТЫ (МИНИ КАТ-СЦЕНЫ)
Открываем Radiant, нажимаем (B) и ищем раздел Script и ставим 2 штуки origin на нашу 3д карту.
Когда мы поставили нашу камеры и её ориентир возвращаемся к скрипту.
Первым пунктом идёт строка которая отвечает за неуязвимость персонажей во время работы камеры (зомби потеряют игроков из вида):
self zm_utility::increment_ignoreme();
Далее идёт строка которая замораживает управление игрокам:
self freezecontrols( true );
Затем идёт важная строка которая отвечает за плавность перемещения камеры от игрока к камере (и наоборот). В скобках указано время перехода, нулевое значение моментально телепортирует в камеру:
self StartCameraTween(0);
Активация камеры идёт через данную строку:
self CameraActivate (true);
Теперь прописываем настройку камеры
GetEnt отвечает за определением кодом каким именем в коде будет обладать объект из редактора (но мне удобнее давать им одинаковое имя в коде и в редакторе) Здесь я задаю камеру:
camera1 = GetEnt("camera1", "targetname");
( ИМЯ_ДЛЯ_КОДА = GetEnt("ИМЯ_ОБЪЕКТА_В_РЕДАКТОРЕ(TARGETNAME)", "targetname"); )
Устанавливаем позицию для камеры
self CameraSetPosition (( camera1.origin ));
Снова GetEnt но теперь я определяю ориентир для камеры:
camera1dir = GetEnt("camera1dir", "targetname");
Устанавливаем ориентир для камеры и добавляю время ожидание игрой сколько она будет ждать до отключения вида камеры
self CameraSetLookAt (( camera1dir.origin ));
wait (6);
И наконец заключительные строки:
Переход от камеры к игроку
self StartCameraTween(0);
Отключение вида камеры
self CameraActivate (false);
Включение управления
self freezecontrols( false );
Отключения бессмертия
self zm_utility::decrement_ignoreme();
function camtrigger()
{
takekeyfridge = GetEnt("takekeyfridge", "targetname");
takekeyfridge SetHintString("Press ^9[{+activate}]^7 to take the contents of the refrigerator");
takekeyfridge SetCursorHint("HINT_NOICON");
takekeyfridge waittill("trigger");
level notify("startcam1");
}
function Cameraonecallfunction()
{
level waittill("startcam1");
foreach(player in level.players)
{
player thread Cameraone();
}
}
function Cameraone()
{
self zm_utility::increment_ignoreme();
self freezecontrols( true );
self StartCameraTween(0);
self CameraActivate (true);
camera1 = GetEnt("camera1", "targetname");
self CameraSetPosition (( camera1.origin ));
camera1dir = GetEnt("camera1dir", "targetname");
self CameraSetLookAt (( camera1dir.origin ));
wait (6);
self StartCameraTween(0);
self CameraActivate (false);
self freezecontrols( false );
self zm_utility::decrement_ignoreme();
}
💻СКРИПТИНГ: АНИМАЦИИ
Идём в папку нашей карты (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city) и создаем там папку animtrees, в ней создаем файл с именем animations в формате .atr
Топаем по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующую строку прямо над "xmodel,skybox_default_day"
rawfile,animtrees/animations.atrxanim,ИМЯ_ВАШЕЙ_АНИМАЦИИ_В_APE
Далее переходим в папку нашей карты и ищем файл "имянашейкарты.gsc" в папке "scripts" (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.gsc)
В нём, над функцией main прекешируем нашу анимацию и наше дерево анимаций при помощи двух строк
#precache( "xanim", "ИМЯ_ВАШЕЙ_АНИМАЦИИ_В_APE");#using_animtree("animations");
В функции main регистрируем нашу новую функцию которая будет отвечать за анимацию
level thread ВАШЕ_ИМЯ_ФУНКЦИИ();В самом низу .gsc файла создаем нашу функцию (с тем именем что мы написали в main) и пишем внутри неё код по этим правилам:
ИМЯ_МОДЕЛИ_В_РЕДАКТОРЕ = getEnt("ИМЯ_МОДЕЛИ_В_РЕДАКТОРЕ", "targetname");ИМЯ_МОДЕЛИ_В_РЕДАКТОРЕ useanimtree(#animtree);
ИМЯ_МОДЕЛИ_В_РЕДАКТОРЕ AnimScripted( "", ИМЯ_МОДЕЛИ_В_РЕДАКТОРЕ.origin , ИМЯ_МОДЕЛИ_В_РЕДАКТОРЕ.angles, %ИМЯ_АНИМАЦИИ_В_APE);
Компилируем, радуемся!
💻СКРИПТИНГ: ЭКРАННЫЙ ВИДЖЕТ
Закидываем наше изображение на лист
Сохраняем картинку в формате .png
Открываем Mod Tools и кликаем на иконку обезьяны чтобы открыть APE
В настройках материала ставим как на скриншоте
Топаем по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone_source\zm_zperma_city.zone) и открываем .zone файл в котором вставляем следующие строчки прямо над "xmodel,skybox_default_day"
material,ИМЯ СИНЕГО ШАРИКА
image,ИМЯ КАРТИНКИ
Далее переходим в папку нашей карты и ищем файл "имянашейкарты.gsc" в папке "scripts" (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.gsc)
Под "#using scripts\zm\zm_usermap;" вставляем это
#precache ("material","ИМЯ ВАШЕГО МАТЕРИЛА");Далее добавляем в одну из наших функций в момент когда должна появится картинка следующий скрипт (myscriptname будет использоваться тут как скриптовое имя рисунка, myimage будет использоваться как рисунок который мы закинули в precache шагом выше)
myscriptname = NewTeamHudElem( "allies" );
myscriptname.alignX = "left";
myscriptname.alignY = "bottom";
myscriptname.horzAlign = "left";
myscriptname.vertAlign = "bottom";
myscriptname.x = 0;
myscriptname.y = -180;
myscriptname.alpha = 0;
myscriptname FadeOverTime(0.5);
myscriptname.alpha = 1;
myscriptname.color = (1, 1, 1);
myscriptname SetShader( "myimage", 200, 200 );
wait (6);
myscriptname FadeOverTime(0.5);
myscriptname.alpha = 0;
wait (0.5);
myscriptname destroy();
Мой пример реализации этого скрипта в своей функции (банальное появление рисунка после чёрного экрана на стартеМожете экспериментировать со значениями плавных переходов, настройками изображения (они отвечают за местоположение) и цифрами в разделе где даём скриптовому имени изображение (они отвечают за размер)
Компилируем - радуемся !
💻СКРИПТИНГ: ДОБАВЛЕНИЕ ВИДЕО
ПОДГОТАВЛИВАЕМ НАШЕ ВИДЕО В ФОРМАТЕ 720p 30FPS, и звук от этого видео отдельно (если он есть) в формате (.wav,48000Hz,16bit) для этого я использовал Sony Vegas, но вы можете использовать другой софт для конвертации ваших звуков в этот формат.
Качаем конвертор для нашего ролика[github.com] и устанавливаем его.
Перемещаем ролик в нашу программуИдём по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone) и создаем папку video в которую кидаем наши конвертированные ролики
В нашем .gsc файле карты (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm)
Среди уже имеющихся #using строк вставляем следующую
#using scripts\shared\lui_shared;Далее топаем в нашу функцию где мы хотим исполнить показ видео (по кнопке, посреди скрипта, не важно) и пишем эту строку
level lui::play_movie_with_timeout("ИМЯ ВАШЕГО ВИДЕО", "fullscreen", СКОЛЬКО СЕКУНД ИДЁТ ВИДЕО, false, false);
Если видео со звуком то вставляем эти строки перед нашим видео
foreach(player in level.players)
player PlaySoundToPlayer("ИМЯ ЗВУКА В ALLIAS", player);
Код звука для alias'а
ИМЯ ЗВУКА В КОДЕ,,,МЕСТОПОЛОЖЕНИЕ ЗВУКА.wav,,,UIN_MOD,,,,,BUS_FX,grp_bink,,,,,100,100,,,,,,,,2,oldest,,,1,1,,,,,,2d,,,NONLOOPING,,,,,,,,,,,,,,,,,,,,,,,,,,,yes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,После того как расположили текстуру - выделяем - кнопка S - пункт Both чтобы растянуть по всей площади браша
Среди уже имеющихся #using строк вставляем следующую
#using scripts\shared\lui_shared;Далее топаем в нашу функцию где мы хотим исполнить показ видео (по кнопке, посреди скрипта, не важно) и пишем эту строку
VideoStart("ИМЯ ВАШЕГО ВИДЕОФАЙЛА",true);
wait (КОЛИЧЕСТВО СЕКУНД ВАШЕГО ВИДЕО);
VideoStop("ИМЯ ВАШЕГО ВИДЕОФАЙЛА");
Если видео со звуком то вставляем эти строки перед нашим "WAIT"
PlaySoundAtPosition("ИМЯ ВАШЕГО ЗВУКА В ALLIAS", (КООРДИНАТЫ ЗВУКА));
Код звука для alias'а
ИМЯ ЗВУКА В КОДЕ,,,МЕСТОПОЛОЖЕНИЕ ЗВУКА.wav,,,UIN_MOD,,,,,BUS_FX,grp_blink,,,,,100,100,500,600,800,,,,,,,,,0,0,100,100,0,1,,3d,,,NONLOOPING,,,,,,,1,,,,,"""OMG""",,,,,,,,,,,,,,,yes,,,,,,,yes,,,,,,,,,,,,,,,,,,,,,,,,,,,🧱СТРОИТЕЛЬСТВО: РАСШИРЕНИЕ ТЕРРИТОРИИ И СКАЙБОКСА
1 - SKY (синие) - Текстуры вытянуть по высоте и длине (построив из них квадрат)
ЗАМЕЧУ ЧТО ЭТО НЕ ОДНА ТЕКСТУРА, А КУБ ПОСТРОЕННЫЙ ИЗ 6 ЧАСТЕЙ (4 СТЕНЫ, КРЫША И ПОЛ)
2 - SUN (картинка солнца) - Текстура которая должна поместиться внутри нашего "домика" построенного из SKY текстур
3 - UMBRA (текстура дробного цвета) - Текстура которая должна поместиться внутри SUN текстуры
4 - FPS TOOL (голубая текстура) - Текстура которая должна поместиться внутри UMBRA текстуры
🧱СТРОИТЕЛЬСТВО: ДОБАВЛЕНИЕ СВОЕЙ ТЕКСТУРЫ
Растягиваем наше изображение по листу
Сохраняем картинку в формате .TIFF
Открываем Mod Tools и кликаем на иконку обезьяны чтобы открыть APE
В настройках материала ставим как на скриншоте
Сохраняемся через Ctrl+S и идём в редактор !
Вызываем меню текстур на букву T и убираем фильтры как на скриншоте🧱СТРОИТЕЛЬСТВО: ДОБАВЛЕНИЕ/УДАЛЕНИЕ СОБАК
Чтобы отключить собак на карте идём по пути (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\scripts\zm\zm_zperma_city.gsc)
Ищем функцию main и в ней над zm_usermap::main(); вставляем следующую строку
level.dog_rounds_allowed = false;Компилируем карту, тестируем, радуемся !
🧱СТРОИТЕЛЬСТВО: НАСТРОЙКА ОСВЕЩЕНИЯ
ВАЖНО! Этими кубами нужно заполнять всё пространство вашей карты чтобы она не выглядела ужасно и имела нормальные отражения и блики (НО НЕ ДЕЛАЙТЕ ЭТО ВСЁ ЗА ОДИН КУБ! ЗАПОЛНЯЙТЕ КАРТЫ ПРОМЕЖУТКАМИ!) Я делаю 1 куб на одну улицу/комнату.
Через Ctrl+Shift сферу можно двигать в кубе чтобы изменить центральную точку ловли отражений.
Через свойства энтити (N) можно убрать галочку box (это делается на тот случай если помещение не квадратное и имеет особую форму)(Также в этом меню вы можете найти пунтк vcolor и тоже поиграться с ним)
И на последок можно добавить тумана. Заходим в энтити браузер (B) во вкладке volume достаем litfog на нашу 3Д карту и растягиваем его по всей карте (не выходя за территорию скайбокса и ему подобных)
Заходим в настройки энтити (N) и в пункте fsi_1 выбираем понравившийся нам туман🧱СТРОИТЕЛЬСТВО: СМЕНА СКАЙБОКСА
КАЧАЕМ ПАК СКАЙБОКСОВ ТУТ[mega.nz]
Файлы со скриншота перекидываем в главну папку БО3 и открываем Radiant❌🧱СТРОИТЕЛЬСТВО: СОЗДАНИЕ ДВЕРЕЙ И ЗОНИНГ
❌🧱СТРОИТЕЛЬСТВО: СПАВНЫ ЗОМБИ И ПРИВЯЗКА К ЗОНАМ
❌🧱СТРОИТЕЛЬСТВО: ДОПОЛНИТЕЛЬНЫЕ ПУТИ ДЛЯ ЗОМБИ
🧩ПОДГОТОВКА КАРТЫ К ЗАПУСКУ И ТЕСТАМ
Сохраняем проект и закрываем редактор. После этого программа может спросить об экспорте света на что бы отвечаем "Yes" а затем "OK"
В лаунчере ставим галочку около названия карты которую мы хотим скомпилировать, справа от неё ставим галочки на Compile, Light (Выставить режим Medium) и Link, нажимаем "Build", ждём.
Если отсутствовали ошибки в скриптах, не было дубликатов в APE и прочей шушеры и вы всё сделали верно то результат в логах будет примерно таковым
Чтобы запустить карту нужно поставить галочку около её названия, убрать все галочки напротив неё за исключением "Run" и нажимаем "Build"
🎀ПУБЛИКАЦИЯ КАРТЫ И ОФОРМЛЕНИЕ СТРАНИЦЫ
В этом разделе мы будем делать загрузочный экран, превью для мастерской и меню игры.
Открываем путь нашей карты (Мой пример: Call of Duty Black Ops III\usermaps\zm_zperma_city\zone) и находим 2 белых изображения loadingimage и previewimage открываем их в вашем фото-редакторе и редактируем как вам нравится, после чего сохраняем с заменой.Сохраняемся (Ctrl+S)
Пока карты компилируется сделаем превью для мастерской Steam.
Создаём изображение разрешением 512х512 и делаем на нём наше превью
Когда карта скомпилировалась и вы проверили что она работает можем публиковать её
Если вы сделали изменения на карте и хотите выпустить обновление нужно только повторить шаг с кнопкой облака только без изменения полей.
🎈ЗАКЛЮЧЕНИЕ
Разбирайтесь, ковыряйтесь, изучайте, экспериментируйте, используйте мои текста как пример и будет вам успех.
Удачи в начинаниях =)
Мои работы:
https://steamcommunity.com/sharedfiles/filedetails/?id=3275838368
https://steamcommunity.com/sharedfiles/filedetails/?id=3315363974
https://steamcommunity.com/sharedfiles/filedetails/?id=3384632650
https://steamcommunity.com/sharedfiles/filedetails/?id=3487389967
https://steamcommunity.com/sharedfiles/filedetails/?id=3624990817
This guide was created by its original author on the Steam Community. Are you the author and want it removed? Request removal.