CoP: Ещё один спальный мешок
Материал из S.T.A.L.K.E.R. Inside Wiki
Всем привет. В статье CoP. Создание спального мешка описан хороший метод создания спальника. К сожалению полученный спальник имеет существенный недостаток - если перетащить его в слот быстрого доступа (который F1-F4), то игра вылетает (проверялось на версии 1.6.02). Есть два метода борьбы с этим:
1. В описании спальника поменять
inv_grid_width = 2
inv_grid_height = 2
на
inv_grid_width = 1
inv_grid_height = 1
и соответственно перерисовать его иконку, но иконка 1х1 для спальника в инвентаре будет выглядеть неприглядно
2. Создать спальник работающий на другом принципе
О втором методе и пойдйт речь.
Содержание
Общий принцип
Мы унаследуем спальник не от identity_immunities, а от бинокля. Что получится:
- спальник нельзя будет перетащить в слот быстрого доступа - нет краша
- спальник будет срабатывать не при «использовании» (не будет такого пункта в меню), а при выбрасывании его из инвентаря и после сна его нужно будет подобрать обратно, что IMHO реалистичнее
Конфиги
В 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
Запускаем новую игру и тестируем