Платформа: Сталкер Зов Припяти 1.6.02 Благодарность: FantomICW (за вдохновение создать статью) Ссылка на готовый мод
Создание нового раздела в настройках игры
Вводная часть: В этом уроке я расскажу вам как создать свой собственный раздел в настройках игры оригинальным способом в стиле ПЫСов. В данном случае мы рассмотрим такой компонент как выпадающий список «combobox», на примере создания раздела с выбором группировки, обратите внимание, что урок рассчитан для тех, кто владеет хотя бы минимальными навыками работы с GUI как я И так приступим!
Откроем файл по пути gamedata\configs\ui\ui_mm_opt.xml и в самый низ вписываем наш раздел:
Цитата
<tab_cheats>
<cap_community_difficulty x="15" y="5" width="135" height="24"> ; Эта надписть будет находится возле выпадающего списка <text r="170" g="170" b="170" font="letterica16" align="r" vert_align="c">ui_mm_community</text> </cap_community_difficulty>
<btn_cheats_cancel x="338" y="322" width="108" height="24"> ; Кнопка возвращения к стандартному разделу из игры <text align="c" font="letterica16">ui_mm_cheats_cancel</text> <texture>ui_inGame2_button</texture> <text_color> <e r="210" g="210" b="210"/> </text_color> </btn_cheats_cancel>
</tab_cheats>
Далее в этом же файле находим строку <tab_video> так как в данном примере мы сделаем кнопку перехода в наш новый раздел через раздел настроек видео так как он находится ближе всего, хотя по моему логичнее было бы расположить кнопку в разделе геймплея, но не суть. Перед последней строкой пишем:
<btn_cheats x="225" y="322" width="108" height="24"> ; Это кнопка перехода на новый раздел <text align="c" font="letterica16">ui_mm_cheats</text> <texture>ui_inGame2_button</texture> <text_color> <e r="210" g="210" b="210"/> </text_color> </btn_cheats>
Далее зарегистрируем наш раздел и его компоненты в файле ui_mm_opt_main.script. Сначала пропишем каллбеки всех компонентов. Для этого в файле найдём строку функции function options_dialog:InitCallBacks() и после строки self:AddCallback("btn_advanced_graphic",ui_events.BUTTON_CLICKED, self.OnBtnAdvGraphic, self) пропишем наши компоненты:
self:AddCallback("btn_cheats",ui_events.BUTTON_CLICKED, self.OnBtnCheats, self) -- Регистрируем каллбек нашей кнопки перехода на новый раздел self:AddCallback("combo_community",ui_events.LIST_ITEM_SELECT, self.UpdateDependControls, self) -- Регистрируем каллбек выпадающего списка группировок self:AddCallback("btn_cheats_cancel",ui_events.BUTTON_CLICKED, self.OnBtnCheatsCancel, self) -- Регистрируем каллбек кнопки "Назад"
Должно получиться так:
Цитата
function options_dialog:InitCallBacks() self:AddCallback("tab", ui_events.TAB_CHANGED, self.OnTabChange, self) self:AddCallback("btn_advanced_graphic",ui_events.BUTTON_CLICKED, self.OnBtnAdvGraphic, self) self:AddCallback("btn_cheats",ui_events.BUTTON_CLICKED, self.OnBtnCheats, self) -- Регистрируем каллбек нашей кнопки перехода на новый раздел self:AddCallback("combo_community",ui_events.LIST_ITEM_SELECT, self.UpdateDependControls, self) -- Регистрируем каллбек выпадающего списка группировок self:AddCallback("btn_cheats_cancel",ui_events.BUTTON_CLICKED, self.OnBtnCheatsCancel, self) -- Регистрируем каллбек кнопки "Назад"
Далее выше этой функции есть строка self:OnAOOptionChange() после неё пишем строку для регистрации функции выбора содержимого нашего выпадающего списка, в данном случае строку выбора группировки:
self:OnCommunityChanged() -- Регистрируем глобальную функцию из выпадающего списка группировок
Далее находим строку с функцией function options_dialog:OnTabChange() и после неё пишем:
self.dlg_cheats:Show (false) -- Делаем наш раздел изначально выключенным
Должно получиться так:
Цитата
function options_dialog:OnTabChange() self.dlg_cheats:Show (false) -- Делаем наш раздел изначально выключенным self.dlg_video:Show (false) self.dlg_sound:Show (false) self.dlg_gameplay:Show (false) self.dlg_controls:Show (false) self.dlg_video_adv:Show (false)
Теперь ниже находим строку
elseif ids == "controls" then self.dlg_controls:Show(true)
И после неё прописываем наш раздел
elseif ids == "cheats" then -- Здесь тоже зарегистрируем наш раздел на всякий случай self.dlg_cheats:Show(true) end
Должно получиться так:
Цитата
local ids = self.tab:GetActiveId() if ids == "video" then self.dlg_video:Show(true) elseif ids == "sound" then self.dlg_sound:Show(true) elseif ids == "gameplay" then self.dlg_gameplay:Show(true) elseif ids == "controls" then self.dlg_controls:Show(true) elseif ids == "cheats" then -- Здесь тоже зарегистрируем наш раздел на всякий случай self.dlg_cheats:Show(true) end
end
С регистрацией нашего нового уникального раздела мы закончили. Теперь осталось сделать так чтобы это всё выполняло свои функции. Для этого в самый низ пишем:
Цитата
-- Скрипты для чит меню
-- Создаём функцию нажатия на кнопку нового раздела
function options_dialog:OnBtnCheats() self.dlg_video:Show(false) self.dlg_cheats:Show(true) end
-- Создаём функцию нажатия на новую кнопку "Назад" для возвращения к исходным параметрам настроек
function options_dialog:OnBtnCheatsCancel() self.dlg_video:Show(true) self.dlg_cheats:Show(false)
end
-- Создаём глобальную функцию из выпадающего списка группировок
function options_dialog:OnCommunityChanged(actor, npc) local community = self.combo_community:CurrentID()
-- Условия если выбрана та или иная группировка из списка
if (community==1) then self.combo_community:enable_id(1) printf("actor now in [actor] community") if db.actor then db.actor:set_character_community("actor", 0, 0) end return true end
if (community==2) then self.combo_community:enable_id(2) printf("actor now in [bandit] community") if db.actor then db.actor:set_character_community("bandit", 0, 0) end return true end
if (community==3) then self.combo_community:enable_id(3) printf("actor now in [dolg] community") if db.actor then db.actor:set_character_community("dolg", 0, 0) end return true end
if (community==4) then self.combo_community:enable_id(4) printf("actor now in [ecolog] community") if db.actor then db.actor:set_character_community("ecolog", 0, 0) end return true end
if (community==5) then self.combo_community:enable_id(5) printf("actor now in [freedom] community") if db.actor then db.actor:set_character_community("freedom", 0, 0) end return true end
if (community==6) then self.combo_community:enable_id(6) printf("actor now in [killer] community") if db.actor then db.actor:set_character_community("killer", 0, 0) end return true end
if (community==7) then self.combo_community:enable_id(7) printf("actor now in [army] community") if db.actor then db.actor:set_character_community("army", 0, 0) end return true end
if (community==8) then self.combo_community:enable_id(8) printf("actor now in [monolith] community") if db.actor then db.actor:set_character_community("monolith", 0, 0) end return true end
if (community==9) then self.combo_community:enable_id(9) printf("actor now in [monster] community") if db.actor then db.actor:set_character_community("monster", 0, 0) end return true end
if (community==10) then self.combo_community:enable_id(10) printf("actor now in [stalker] community") if db.actor then db.actor:set_character_community("stalker", 0, 0) end return true end
if (community==11) then self.combo_community:enable_id(11) printf("actor now in [zombied] community") if db.actor then db.actor:set_character_community("zombied", 0, 0) end return true end
end
Откроем файл по пути gamedata\configs\scripts\ui_mm_opt_video.script и после строки
зарегистрируем нашу кнопку для перехода в наш новый раздел:
btn = xml:Init3tButton ("tab_video:btn_cheats", self) -- Создаём кнопку перехода к новому разделу в разделе "Видео" handler:Register (btn, "btn_cheats")
Ну вот мы и пришли к завершающей стадии, осталось только сделать так чтобы все надписи в нашем разделе были на русском языке, для этого откроем файл по пути gamedata\configs\text\rus\ui_st_mm.xml и в самом конце пропишем:
Если же вы желаете создать что-то на подобии спавн мода, то вот представляю вашему вниманию образец на примере спавна артефактов. Откроем файл по пути gamedata\configs\scripts\ui_mm_opt_cheats.script и в самый конец пишем:
Тексты по типу st_af_baloon_name в данном случае являются именами артефактов из файла gamedata\configs\text\st_items_artefacts.xml
Далее откроем файл ui_mm_opt_main.script и в случае выпадающего списка артефактов в самый конец пишем:
Цитата
-- Создаём глобальную функцию спавна предметов из выпадающего списка артефактов
function options_dialog:OnArtefactsChanged(first_speaker, second_speaker) local artefacts = self.combo_artefacts:CurrentID()
-- Условия если выбран тот или иной предмет из списка
if (artefacts==1) then self.combo_artefacts:enable_id(1) dialogs.relocate_item_section(second_speaker, "af_baloon", "in") end
if (artefacts==2) then self.combo_artefacts:enable_id(2) dialogs.relocate_item_section(second_speaker, "af_blood", "in") end
if (artefacts==3) then self.combo_artefacts:enable_id(3) dialogs.relocate_item_section(second_speaker, "af_cristall_flower", "in") end
if (artefacts==4) then self.combo_artefacts:enable_id(4) dialogs.relocate_item_section(second_speaker, "af_cristall", "in") end
if (artefacts==5) then self.combo_artefacts:enable_id(5) dialogs.relocate_item_section(second_speaker, "af_dummy_battery", "in") end
if (artefacts==6) then self.combo_artefacts:enable_id(6) dialogs.relocate_item_section(second_speaker, "af_dummy_glassbeads", "in") end
if (artefacts==7) then self.combo_artefacts:enable_id(7) dialogs.relocate_item_section(second_speaker, "af_electra_flash", "in") end
if (artefacts==8) then self.combo_artefacts:enable_id(8) dialogs.relocate_item_section(second_speaker, "af_electra_moonlight", "in") end
if (artefacts==9) then self.combo_artefacts:enable_id(9) dialogs.relocate_item_section(second_speaker, "af_electra_sparkler", "in") end
if (artefacts==10) then self.combo_artefacts:enable_id(10) dialogs.relocate_item_section(second_speaker, "af_eye", "in") end
if (artefacts==11) then self.combo_artefacts:enable_id(11) dialogs.relocate_item_section(second_speaker, "af_fire", "in") end
if (artefacts==12) then self.combo_artefacts:enable_id(12) dialogs.relocate_item_section(second_speaker, "af_fireball", "in") end
if (artefacts==13) then self.combo_artefacts:enable_id(13) dialogs.relocate_item_section(second_speaker, "af_fuzz_kolobok", "in") end
if (artefacts==14) then self.combo_artefacts:enable_id(14) dialogs.relocate_item_section(second_speaker, "af_glass", "in") end
if (artefacts==15) then self.combo_artefacts:enable_id(15) dialogs.relocate_item_section(second_speaker, "af_gold_fish", "in") end
if (artefacts==16) then self.combo_artefacts:enable_id(16) dialogs.relocate_item_section(second_speaker, "af_gravi", "in") end
if (artefacts==17) then self.combo_artefacts:enable_id(17) dialogs.relocate_item_section(second_speaker, "af_ice", "in") end
if (artefacts==18) then self.combo_artefacts:enable_id(18) dialogs.relocate_item_section(second_speaker, "af_medusa", "in") end
if (artefacts==19) then self.combo_artefacts:enable_id(19) dialogs.relocate_item_section(second_speaker, "af_mincer_meat", "in") end
if (artefacts==20) then self.combo_artefacts:enable_id(20) dialogs.relocate_item_section(second_speaker, "af_night_star", "in") end
if (artefacts==21) then self.combo_artefacts:enable_id(21) dialogs.relocate_item_section(second_speaker, "af_soul", "in") end
if (artefacts==22) then self.combo_artefacts:enable_id(22) dialogs.relocate_item_section(second_speaker, "af_vyvert", "in") end
if (artefacts==23) then self.combo_artefacts:enable_id(23) dialogs.relocate_item_section(second_speaker, "af_compass", "in") end
if (artefacts==24) then self.combo_artefacts:enable_id(24) dialogs.relocate_item_section(second_speaker, "af_oasis_heart", "in") end end
Смотрим результат
Таким образом мы научились создавать свой собственный раздел в настройках игры. Данную "опцию" можно использовать в качестве настроек своего мода как например это имеется в модификациях таких как Sigerous, Atmosfear, AMK и.т.д или же просто для спавн меню. Обратите внимание, при тестировании я заметил что иногда проявляется баг с зависанием картинки при включении нового раздела но при этом игра благополучно работает. Лечится этот недуг клавишами Alt + Tab т.е сворачиванием игры. В любом случае я выложил уже готовый мод, в случае если у вас что-либо не получается то можно всегда его скачать и разобрать так скажем по кусочкам. В общем надеюсь вам понравилась моя статья.
Сообщение отредактировал Paradox27kms - Среда, 28.08.2019, 06:18