SoC. Спальный мешок — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

SoC. Спальный мешок — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
(Примечание)
(Примечание)
Строка 500: Строка 500:
  
 
Вот собственно и все! Можете идти тестировать!
 
Вот собственно и все! Можете идти тестировать!
 +
 +
Еслт хотите свою иконку, смотрите[[http://www.stalkerin.gameru.net/wiki/index.php/Изменение%20текстур| эту]] статью
  
 
===Авторы===
 
===Авторы===

Версия 10:26, 6 июля 2011

Итак, сегодня мы создадим спальный мешок.

Создание самого мешка

Заходим в 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\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 = 5
type        = nightmare

[regular_dream2]
dream       = esc_sky_01
probability = 10
type        = normal

[regular_dream3]
dream       = Movie-003_Rats_OutPut-010
probability = 8
type        = happy

Мы это удалили, чтоб игра не вылетала во время сна. Но о снах - позже. Итак, половина работы завершенно. Приступим к главному.

Работа со скриптами

Заходим в 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_drop, nil)
	--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_exit, nil)
	self.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_take, self)
	self.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.actor_sleep, self.sleep_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.level_border_enter, self.level_border_enter, 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)
	self.object:set_callback(callback.use_object, self.use_obj, 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 создаем файл c с названем 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") -- кнопка на сон 1 часа
	self:Register(xml:Init3tButton("btn_2", self),"btn_2") -- кнопка на сон 3 часов
	self:Register(xml:Init3tButton("btn_3", self),"btn_3") -- кнопка на сон 9 часов
	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_2", ui_events.BUTTON_CLICKED, self.sleep_ui2, self) -- кнопка два идет на функцию sleep_ui2
	self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.sleep_ui3, self) -- кнопка три идет на функцию sleep_ui3
	if db.actor.health < 0.9 then
	self:AddCallback("btn_4", ui_events.BUTTON_CLICKED, self.sleep_ui4, self) -- кнопка идет на sleep_ui4
    end
	self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.on_quit, self) -- кнопка идет на выход
end
 
function sleep_ui:OnKeyboard(dik, keyboard_action) -- функция на отмену сна при нажатии клавиши Esc
	CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
	if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
		if dik == DIK_keys.DIK_ESCAPE then
			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:sleep_ui3()
		end
		if dik == DIK_keys.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() -- вот функция от кнопки два
		main_sleep.sleep_three_hours() -- спим три часа
		self:on_quit()
end
function sleep_ui:sleep_ui3() -- вот функция от кнопки три
		main_sleep.sleep_nine_hours() -- спим 9 часов
		self:on_quit()
end
function sleep_ui:sleep_ui4() -- функция от кнопкм четыри
		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(), db.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() сон 9 часов
	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()
	level.disable_input()	
	main_sleep.starter(scale)
end
 
function starter(scale)
	local factor = scale * 2650
	game.start_tutorial("time_scaling")
	level.set_time_factor(factor)
end
 
function dreamer()
	level.set_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_sleep.eat_food()
    end
end
 
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>ui\ui_btn_mm_h</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>ui\ui_btn_mm_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>ui\ui_btn_mm_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>ui\ui_btn_mm_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>ui_button_ordinary_h</texture_h>
	    <text>Выход</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_wnd x="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_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>
	</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>main_sleep.dreamer</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\scripts ищем файл db.script открываем его, ищем функцию: function add_actor( obj ) и после: add_obj( obj ) пишем:

alife():create("sleep_bag", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

Должно получится:

function add_actor( obj )
	actor = obj
	actor_proxy:net_spawn( obj )
	add_obj( obj )
        alife():create("sleep_bag", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

Спальный мешок появится в начале игры.

Примечание

Иконка у нас не спального мешка, а костюм бандита. Модель - мешок картошки.

Уберите все комментарии, иначе будет вылет!

Вот собственно и все! Можете идти тестировать!

Еслт хотите свою иконку, смотрите[эту] статью

Авторы

Статья создана:Участник:Weanchester

Создал скрипт сна: Ab@dDon

Другие места
LANGUAGE