Сповіщення
Очистити все

SoC. Спальний мішок


Ранг:
Майстер
Роль:
Гість
Записи:
750
Приєднався:
2 роки тому
 

Для створення спального мішка нам знадобляться ці файли:

У папці 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>
 

Примітки

  • Значок у нас не спального мішка, а костюма бандита. Модель – мішок з піском.

Ось, власне, і все! Можете тестувати!



   
Цитата