Для створення спального мішка нам знадобляться ці файли:
У папці scripts
- bind_stalker.script
- порожній файл main_sleep.script
У папці config/ui
- ui_movies.xml
- порожній ui_sleep.xml
У папці config/misc
- dream.ltx
- items.ltx
У папці config/texs/ukr
- string_table_enc_equipment.xml
Створення предмета "спальний мішок"
Заходимо в gamedata\config\misc , шукаємо файл items.ltx і в кінці пишемо:
[ sleep_bag ] :identity_immunities GroupControlSection = spawn_group discovery_dependency = $ spawn = "food and drugs\sleep_bag" $ prefetch = 32 class = II_ANTIR ;клас cform = skeleton visual = physics\decor\bag_01.ogf ;модель мішка з піском description = enc_equipment_sleep_bag ; inv_name = sleep_bag ; найменування inv_name_short = sleep_bag ; найменування inv_weight = 0.2 ; вага inv_grid_width = 2 ; ширина іконки inv_grid_height = 2 ; висота іконки inv_grid_x = 12 ; ширина по x inv_grid_y = 0 ; висота по y cost = 3000 ; вартість ; eatable item eat_health = 0 eat_satiety = 0 eat_power = 0 eat_radiation = 0.0 wounds_heal_perc = 0 eat_portions_num = 1 ; food item animation_slot = 4 ;hud item hud = wpn_vodka_hud
Роботу зі створенням спального мішка завершено.
Назва та опис
Заходимо в gamedata \ config \ text \ rus , знаходимо файл string_table_enc_equipment.xml , відкриваємо його і в самому низу, перед </string_table> пишемо:
<string id = "sleep_bag" > <text > Спальний мішок </text > </string > <string id = "enc_equipment_sleep_bag" > <text > Відмінний спальний мішок. Тканина не рветься, стійка до води. Чудова річ переночувати у Зоні. </text > </string >
Отже з предметом закінчили Приступимо до головного .
Робота зі скриптами
Заходимо в gamedata\scripts , знаходимо файл bind_stalker.script , відкриваємо його, знаходимо функцію function actor_binder:net_destroy() і в колбеках пишемо
self.object:set_callback ( callback.use_object, nil )
Повинно вийти так:
function actor_binder:net_destroy ( ) if ( actor_stats.remove_from_ranking~= nil ) then actor_stats.remove_from_ranking ( self.object:id ( ) ) end -- game_stats.shutdown () db.del_actor ( self.object ) sr_light.clean_up ( ) self.object:set_callback ( callback.inventory_info, nil ) self.object :set_callback ( callback.article_info, nil ) self.object:set_callback ( callback.on_item_take , nil ) self.object:set_callback ( callback.on_item_d , self.object:set_callback(callback.actor_sleep, nil) self.object :set_callback ( callback.task_state , nil ) self.object : set_callback ( callback.level_border_enter, nil ) self.object:set_callback ( callback.level_border object:set_callback ( callback.take_item_from_box, nil ) self.object:set_callback ( callback.use_object, nil ) -- ось наш колбек if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:destroy ( ) sr_psy_antenna.psy_antenna = false end xr_sound.stop_all_sound_object ( ) object_binder.net_destroy ( self ) end
У цьому ж файлі знаходимо функцію function actor_binder:reinit() і так само в колбеках пишемо
self.object:set_callback ( callback.use_object, self.use_obj, self )
Повинно вийти так:
function actor_binder:reinit ( ) object_binder.reinit ( self ) local npc_id = self.object:id ( ) db.storage [ npc_id ] = { } self.st = db.storage [ npc_id ] self.st.pstor = nil self.next_restrictors_update_time = -10000 self.object:set_callback ( callback.inventory_info, self.info_callback, self ) self.object:set_callback ( callback.article_info, self.article_callback, self ) self.object :set_callback ( callback.on_item_take, self.on_item_tak object:set_callback ( callback.on_item_drop, self.on_item_drop, self ) self.object:set_callback ( callback.trade_sell_buy_item, self.on_trade, self ) -- for game stats --self.object:set_callback(callback. , self) self.object:set_callback ( callback.task_state , self.task_callback, self ) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback ( callback , self ) self.object:set_callback ( callback.level_border_exit, self.level_border_exit, self ) self.object :set_callback ( callback.take_item_from_box , self.take_item_from_box, self.object_ob, self . ) - ось наш колбек end
Також у цьому файлі знаходимо функцію function actor_binder:on_item_drop (obj) і після неї пишемо:
function actor_binder:use_obj ( obj ) main_sleep.sleep ( obj ) end
Повинно вийти так:
-------------------------------------------------- -------------------------------------------------- ------------------ function actor_binder:on_item_drop ( obj ) level_tasks.proceed ( self.object ) --game_stats.update_drop_item (obj, self.object) end ---- -------------------------------------------------- -------------------------------------------------- -------------- function actor_binder:use_obj ( obj ) - функція використання предмета main_sleep.sleep ( obj ) - наш майбутній скрипт і функція у ньому. end ------------------------------------------------- -------------------------------------------------- -------------------
Тепер у gamedata\scripts створюємо файл з назвою main_sleep.script , відкриваємо його і пишемо:
function sleep ( obj ) if obj ~= nil then if obj:section ( ) == "sleep_bag" then -- при використанні спального мішка відкриватиметься вибіркове меню local hud = sleep_ui ( get_hud ( ) ) -- вказуємо на class "sleep_ui" (CUIScriptWnd) level.start_stop_menu ( hud, true ) - відкриваємо меню end end end class "sleep_ui" ( CUIScriptWnd ) function sleep_ui:__init ( owner ) super ( ) self.owner = owner self:InitControls ( ) self:InitCallBacks ( ) end function sleep_ui:__finalize ( ) end function sleep_ui:InitControls ( ) self:Init ( 50 , 50 , 550 , 450 ) local xml = CScriptXmlInit ( ) xml:ParseFile ( "ui_sleep.xml" ) -- налаштування будуть відтворюватися в цьому xml файлі xml:InitStatic ( "back_video" , self ) - відео ззаду xml:InitStatic ( "background" , self ) - рамка ззаду self:Register ( xml:Init3tButton ( "caption" , self ) , "caption" ) -- заголовок self:Register ( xml:Init3tButton ( "btn_1" , self ) , "btn_1" ) -- кнопка на сон однієї години self: Register ( xml:Init3tButton ( "btn_2" , self ) , "btn_2" ) -- кнопка на сон трьох годин self:Register ( xml:Init3tButton ( "btn_3" , self ) , "btn_3" ) -- кнопка на сон дев if db.actor.health < 0.9 then -- якщо здоров'я впало, self:Register ( xml:Init3tButton ( "btn_4" , self ) , "btn_4" ) -- кнопка на одужання end self:Register ( xml:Init3tButton ( " btn_quit" , self ) , "btn_quit" ) -- кнопка виходу end function sleep_ui:InitCallBacks ( ) self:AddCallback ( "btn_1" , ui_events.BUTTON_CLICKED, self.sleep_ui1, self ) -- кнопка один йде на функцію sleep_ui1 self:AddCallback ( "btn. leep_ui2, self ) - кнопка два йде на функцію sleep_ui2 self:AddCallback ( "btn_3" , ui_events.BUTTON_CLICKED , self.sleep_ui3 , self ) - кнопка три йде на функцію sleep_ui3 if db.actor.health < "0: 9 , ui_events.BUTTON_CLICKED, self.sleep_ui4, self ) -- кнопка йде на sleep_ui4 end self:AddCallback ( "btn_quit" , ui_events.BUTTON_CLICKED, self.on_quit, self ) -- кнопка function sleep_ui :OnKeyboard ( dik, keyboard_action ) - функція на скасування сну при натисканні клавіші Esc CUIScriptWnd.OnKeyboard ( self ,dik,keyboard_action ) if keyboard_action == ui_events.WINDOW_KEY_PR self:on_quit ( ) end if dik == DIK_keys.DIK_NUMPAD1 then self : sleep_ui1 ( ) end if dik == DIK_keys.DIK_NUMPAD2 then self :sleep_ui2 ( ) end if dik == DIK_keys.DIK_NUMPAD3 then self . DIK_NUMPAD4 then self:sleep_ui4 ( ) end end return true end function sleep_ui:sleep_ui1 ( ) -- ось функція від кнопки один main_sleep.sleep_one_hour ( ) -- спимо одну годину self : on_quit ( ) -- вихід end function sleep_ui:sleep_ui2 ( ) -- ось функція від кнопки -- спимо три години self:on_quit ( ) end function sleep_ui:sleep_ui3 ( ) -- ось функція від кнопки три main_sleep.sleep_nine_hours ( ) -- спимо дев'ять годин self:on_quit ( ) end function sleep_ui :s кнопкм чотири main_sleep.sleep_health ( scale ) -- спимо до одужання self:on_quit ( ) end function sleep_ui:check_game ( ) -- перевірка чи запущена гра local check = false if level.present ( ) and ( db.actor ~= nil ) and db.actor:alive ( ) then check = true end return check end function sleep_ui:on_quit ( ) -- ось кнопка виходу self:GetHolder ( ) :start_stop_menu ( self, true ) alife ( ) :create ( "sleep_bag " , db.actor:position ( ) , db.actor:level_vertex_id .actor:game_vertex_id ( ) , db.actor:id ( ) ) -- спаун мішка назад end ---------------------------------- -- DreamMod v0.1 by Ab@dDon --- -- Edited by Weanchester - -- -- ------------------------------ function sleep_one_hour ( ) -- сон одну годину main_sleep.main ( 1 ) end function sleep_three_hours ( ) -- сон три години main_sleep.main ( 3 ) end function sleep_nine_hours ( ) -- сон дев'ять годин main_sleep.main ( 9 ) end function sleep_health ( scale ) -- сон до одужання local sleep_time = ( 1 - db.actor.health ) * 5.00 main_sleep.main ( sleep_time ) end function main ( scale ) -- основна функція basic_time_factor = level.get_time_factor ( ) -- обчислення стандартної швидкості часу db.actor:stop_talk ( ) -- якщо гравець з ким-небудь говорить, діалог закривається. Тут в ній немає сенсу , але раптом кому придасться db.actor:hide_weapon ( ) - ГГ ховає зброю в рюкзак function starter ( scale ) - скрипт перемотування на потрібний час local factor = scale * 2650 - обчислення часу "пробудження" game.start_tutorial ( " time_scaling" ) - виклик функції перемотування function dreamer ( ) -- відповідає за сни level.set_time_factor ( basic_time_factor ) --зупинка перемотування. basic_time_factor - стандартна швидкість перебігу часу local dream = dream.sleep_video_name_callback ( ) -- дозволяє "показати" сон if dream ~= "" then game.start_tutorial ( dream ) -- показ одного з трьох снів else game.start_tutorial ( "without_dream " - "без сну" end end function stopper ( ) level.add_cam_effector ( "camera_effects \\ dream.anm" , 1 , false , "" ) -- ефект підйому db.actor:restore_weapon ( ) -- ГГ дістає зброю level.enable_input ( ) -- включається керування level .add_pp_effector ( "yantar_underground_psi.ppe" , 222 , false , " " ) -- ефект підйому if db.actor.health <= 0.60 then -- якщо хп впало менше 60, то запускається функція з'їдання їжі main_send function eat_food ( ) -- функція з'їдання їжі if db.actor:eat ( db.actor:object ( "conserva" ) ) ~= nil or db.actor:eat ( db.actor:object ( "bread" ) ) ~= nil or db.actor:eat ( db.actor:object ( "kolbasa" ) ) ~= nil then end end
З найголовнішим роботу завершено. Переходимо до передостаннього пункту.
Робота з XML-описувачем
Заходимо в gamedata\config\ui , створюємо файл з назвою ui_sleep.xml , відкриваємо його і пишемо:
<?xml version = "1.0" encoding = "windows-1251" ?> <main > <back_video x = "10" y = "10" width = "380" height = "320" stretch = "1" > <texture > ui\credits_back_512_v10 </texture > </back_video > <background x = "0" y = "0" width = "400" height = "340" stretch = "1" > <texture x = "0" y = "0" width = "350" height = "460" > ui\ui_dg_inventory </texture > </background > <caption x = "175" y = "30" width = "50" height = "35" > <text > Сон </text > </caption > <btn_1 x = "72" y = "80" width = "256" height = "35" > <texture_e > ui\ui_btn_mm_e </texture_e > <texture_t > ui\ui_btn_mm_t< /texture_t > <texture_h > u /texture_h > <text > Спати 1 годину </text > </btn_1 > <btn_2 x = "72" y = "130" width = "256" height = "35" > <texture_e > ui\ui_btn_mm_e </texture_e > <texture_t > ui\ui_btn_mm_t< / texture_t > < texture_h > /texture_h > <text > Спати 3 години </text > </btn_2 > <btn_3 x = "72" y = "180" width = "256" height = "35" > <texture_e > ui\ui_btn_mm_e </texture_e > <texture_t > ui\ui_btn_mm_t< / texture_t > < texture_h > /texture_h > <text > Спати 9 годин </text > </btn_3 > <btn_4 x = "72" y = "230" width = "256" height = "35" > <texture_e > ui\ui_btn_mm_e </texture_e > <texture_t > ui\ui_btn_mm_t< / texture_t > < texture_h > /texture_h > <text > Спати до відновлення здоров'я </text > </btn_4 > <btn_quit x = "270" y = "300" width = " 117" height = " 29" > <texture_e > ui_button_ordinary_e </texture_e > < texture_t > ui_button_ordinary_t < / texture_t > <texture_h > Вихід </text > </btn_quit > </main >
Отже, кнопки описали. Останній пункт.
Сни
Заходимо в gamedata\config\ui , шукаємо файл ui_movies , відкриваємо і в самому кінці пишемо:
<Movie-003_Rats_OutPut -010 > <play_each_item > 1 </play_each_item > <global_wnd x = "0" y = "0" width = "1024" height = "768" > <auto_static x = "0" y = "0" width = "1024" height = "768" stretch = "1" > <window_name > back </window_name > <texture > intro\intro_back </texture > </auto_static > </global_wnd > <item type = "video" > <sound > characters_voice\scenario\video\dream_rats </sound > <pause_state > on </pause_state > <function_on_stop > main_sleep.stopper </function_on_stop > <video_wnd x = "0" y = " 0" width = "1024" height = "768" stretch = "1" > <texture x = "0" y = "1" width = "512" height = "245" > sleep\movie-003_rats_output-010 </ texture > </video_wnd > </item > </Movie-003_Rats_OutPut -010 > <esc_sky_01 > <play_each_item > 1 </play_each_item > <global_wnd x = "0" y = "0" width = "1024" height = "768" > <auto_static x = "0" y = "0" width = "1024 height = "768" stretch = "1" > <window_name > back </window_name > <texture > intro\intro_back </texture > < /auto_static > </global_wnd > <item type = "video" > <sound > characters_voice \ human_01\dolg\states\sleep\sleep_1.ogg </sound > <pause_state > on </pause_state > <function_on_stop > main_sleep.stopper < /function_on_stop > <video "0" y = "0" width = "1024" height = "768" stretch = "1" > <texture x = "0" y = "1" width = "512" height = "245" > sleep\esc_sky_01 </texture > </video_wnd > </item > </esc_sky_01 > <aes_sky_red > <play_each_item > 1 </play_each_item > <global_wnd x = "0" y = "0" width = "1024" height = "768" > <auto_static x = "0" y = "0" width = "1024 height = "768" stretch = "1" > <window_name > back </window_name > <texture > intro\intro_back </texture > < /auto_static > </global_wnd > <item type = "video" > <sound > ambient\air_2.ogg </sound > <pause_state > on </pause_state > <function_on_stop > main_sleep.stopper </function_on_stop > <video_wnd x = "0" y = "0" width = "1024" height = "768" stretch = "1" > <texture x = "0" y = "1" width = "512" height = "245" > sleep\aes_sky_red </texture > </video_wnd > </item > </aes_sky_red > <without_dream > <play_each_item > 1 </play_each_item > <global_wnd x = "0" y = "0" width = "1024" height = "768" > <auto_static x = "0" y = "0" width = "1024 height = "768" stretch = "1" > <window_name > back </window_name > <texture > intro\intro_back </texture > < /auto_static > </global_wnd > <item type = "video" > <sound > characters_voice \ human_01\dolg\states\sleep\sleep_1.ogg </sound > <pause_state > on </pause_state > <function_on_stop > main_sleep.stopper < /function_on_stop > <video "0" y = "0" width = "1024" height = "768" stretch = "1" > <texture x = "0" y = "1" width = "1024" height = "768" > intro\intro_back </texture > </video_wnd > </item > </without_dream > <time_scaling > <play_each_item > 1 </play_each_item > <global_wnd x = "0" y = "0" width = "1024" height = "768" > <auto_static x = "0" y = "0" width = "1024 height = "768" stretch = "1" > <window_name > back </window_name > <texture > intro\intro_back </texture > < /auto_static > </global_wnd > <item type = "video" > <sound > characters_voice\human_01\monolith\states\sleep\sleep_6.ogg </sound > <pause_state > off </pause_state > < can_be_stopped > off </can_be_stopped > < function_on_stop </function_on_stop > <video_wnd x = "0" y = "0" width = "1024" height = "768" stretch = "1" > <texture x = "0" y = "1" width = "1024" height = "768" > intro\intro_back </texture > </video_wnd > </item > </time_scaling >
Тепер зайдемо в gamedata\config\misc , знайдемо файл dream.ltx , відкриємо його. На початку буде така конструкція:
;------------------------------------------------- ------------------------------- ;--- Regular dreams ------------- ------------------------------------------------ ;- -------------------------------------------------- ----------------------------- [ regular_dream1 ] dream = sleep\aes_sky_red probability = 10 type = nightmare [ regular_dream2 ] dream = sleep \ esc_sky_01 probability = 5 type = normal [ regular_dream3 ] dream = sleep\Movie-003_Rats_OutPut -010 probability = 8 type = happy
Видаляємо sleep, щоб вийшло так:
;------------------------------------------------- ------------------------------- ;--- Regular dreams ------------- ------------------------------------------------ ;- -------------------------------------------------- ----------------------------- [ regular_dream1 ] dream = aes_sky_red probability = 10 type = nightmare [ regular_dream2 ] dream = esc_sky_01 probability = 5 type = normal [ regular_dream3 ] dream = Movie-003_Rats_OutPut -010 probability = 8 type = happy
Зробили ми це, щоб гра не вилітала під час сну.
Зі снами закінчили.
Висновок
Залишилося додати мішок у гру.
Для цього заходимо в gamedata\scripts , шукаємо файл escape_dialog.script , відкриваємо його, шукаємо функцію function give_weapon_to_actor (trader, actor) і після dialogs.relocate_item_section(trader, "wpn_knife", "in") пишемо:
dialogs.relocate_item_section ( trader, "sleep_bag" , "in" )
Повинно вийти:
function give_weapon_to_actor ( trader , actor ) dialogs.relocate_item_section ( trader , "wpn_pm" , " in" ) dialogs.relocate_item_section ( trader , " ammo_9x18_fmj " , " in " ) ) dialogs .relocate_item_section ( trader, "wpn_knife" , "in" ) dialogs.relocate_item_section ( trader, "sleep_bag" , "in" ) end
Спальний мішок заспауниться в інвентарі після згоди відбити Шустрого у бандитів.
___________________________________________________________________________________
Але можна спанити його ГГ в інвентар на початку гри. Створюємо ppm_spawner.script і в ньому пишемо
function give_me_speep_bag ( ) local obj = alife ( ) : create ( "sleep_bag" , db.actor:position ( ) , db.actor:level_vertex_id ( ) , db.actor:game_vertex_id ( ) , db.actor:id ( ) )
Тепер у gameplay відкриваємо info_portions і пишемо у функції <game_information_portions> Це
<action>ppm_spawner.give_me_speep_bag</action>
Примітки
- Значок у нас не спального мішка, а костюма бандита. Модель – мішок з піском.
Ось, власне, і все! Можете тестувати!