Вітаю всіх! У минулому уроці по створенню спального мішка був один некритичний баг - якщо перетягнути його в слот швидкого доступу (який F1-F4), то гра вилетить. Є два методи боротьби з цим:
1. В налаштуваннях спальнику змінити
inv_grid_width = 2
inv_grid_height = 2
на
inv_grid_width = 1
inv_grid_height = 1
і відповідно перемалювати його іконку, але іконка 1х1 для спальнику в інвентару буде виглядати не дуже.
2. Створити спальник, який працює на іншому принципі.
Про нього й піде мова.
Загальний принцип
Ми внаслідуємо спальник не від identity_immunities, а від бінокля. Що виходить:
- Спальник не можна буде перетягнути в слот швидкого доступу - не буде виліту
- Спальник буде спрацьовувати не при «використанні» (не буде такого пункта в меню), а при викиданні його з інвентару і післе сну його потрібно буде підняти назад, що НАБАГАТО реалістичніше.
Конфиги
В configs\misc\items.ltx дописываем:
------------------------------------------------------------------------------------------------ -- Спальний мішок ------------------------------------------------------------------------------------------------ [sleeping_bag]:wpn_binoc ;identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "devices\sleeping_bag" $prefetch = 32 class = WP_BINOC cform = skeleton visual = dynamics\equipments\item_spalnik inv_name = st_sleeping_bag_title inv_name_short = st_sleeping_bag_title description = st_sleeping_bag_descr use_sound = interface\bag_open inv_weight = 0.5 inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 25 inv_grid_y = 0 cost = 0 eat_health = 0 eat_satiety = 0 eat_power = 0 eat_radiation = 0 wounds_heal_perc = 0 eat_portions_num = 1 slot = -1 hit_power = 0 hit_type = fire_wound ammo_class = ammo_9x19_fmj scope_status = 0 silencer_status = 0 grenade_launcher_status = 0 animation_slot = 13 rpm = 0 cam_dispersion = 0 fire_dispersion_base = 0 hit_power_critical = 0 hud = wpn_vodka_hud can_trade = false random_sleep_a = 2 random_sleep_b = 6 quest_item = false
Важливо: visual МАЄ ІСНУВАТИ. OGF-моделі спальника можно знайти в мережі або створити/перенести їх самостійно.
Скрипти
В scripts створюємо sleeping_bag.script
function use(s_obj) if nil == s_obj then return end if surge_manager.actor_in_cover() then ui_sleep_dialog.sleep() give_info("sleep_active") else news_manager.send_tip(db.actor, game.translate_string("st_sleeping_bag_no_sleep")) end news_manager.send_tip(db.actor, game.translate_string("st_sleeping_bag_take_reminder")) end function use_inventory_item(s_obj) if s_obj and s_obj.section_name and s_obj:section_name() == "sleeping_bag" then use(s_obj) end end
В bind_stalker.script в actor_binder:on_item_drop прописуємо
function actor_binder:on_item_drop (obj) if(obj) then local s_obj = alife():object(obj:id()) sleeping_bag.use_inventory_item(s_obj) end end
В configs\text\rus\st_items_equipment.xml додаємо
<string id="st_sleeping_bag_title"> <text>«Спальний мішок»</text> </string> <string id="st_sleeping_bag_descr"> <text>Похідний спальний мішок. Мабуть, найзручніший спосіб переночувати у Зоні. Але від радіації не врятує, тож для ночівлі потрібно шукати місця скромніше. Наприклад, такі, де можна перечекати викид.</text> </string>
В configs\text\rus\ui_st_screen.xml додаємо
<string id="st_sleeping_bag_no_sleep"> <text>В цьому місці не заснути. Потрібно знайти більш надійне укриття, там де можна перечекати викид.</text> </string> <string id="st_sleeping_bag_take_reminder"> <text>%c[255,255,255,0]Не забудьте забрати спальний мішок.%c[default]</text> </string>
В configs\gamepley\character_desc_general.xml шукаємо на самому початку
<!-- --> <!-- Actor --> <!-- --> <specific_character id="actor" no_random = "1"> <name>st_actor_name</name> <icon>ui_inGame2_Hero</icon> <map_icon x="2" y="5"></map_icon> <team>Actor</team> <supplies> [spawn] \n device_torch \n wpn_binoc \n wpn_knife = 1 \n detector_simple \n helm_respirator \n stalker_outfit \n
і додаємо
sleeping_bag \n
В configs\mp\mp_ranks.ltx шукаємо
[rank_0] rank_name = st_rank_novice ; звание rank_exp = 0, 0 ; опыт, артефакты rank_diff_exp_bonus = 1, 1.5, 2, 3, 4 ;----------------- new items ------------------------- available_items =
Та наприкінці строки available_items через кому додаємо sleeping_bag
Запускаємо нову гру та тестуємо!