|  
|  |   
|  
 
  
  
  
 | 
 
 
 
 
 
 
  
  
 | Статус: |  |   
 | Отмычка: |  |   
 | Сообщений: | 194 |   
 | Награды: | 8 |   
 | Регистрация: | 30.01.2013 |  | Для создания спального мешка, нам понадобятся эти файлы: В папке scripts
 • bind_stalker.script
 • пустой файл main_sleep.script
 В папке config/ui
 • ui_movies.xml
 • пустой ui_sleep.xml
 В папке config/misc
 • dream.ltx
 • items.ltx
 В папке config/texs/rus
 • 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_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") -- кнопка на сон одного часа
 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_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() -- спим девять часов
 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() -- сон девять часов
 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) --остановка перемотки. 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\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, "ammo_9x18_fmj", "in")
 dialogs.relocate_item_section(trader, "wpn_knife", "in")
 dialogs.relocate_item_section(trader, "sleep_bag", "in")
 end
Спальный мешок заспаунится в инвентаре после согласия отбить Шустрого у бандитов.
 
 Примечания
 Иконка у нас не спального мешка, а костюма бандита. Модель - мешок с песком.
 Вот, собственно, и все! Можете тестировать!
 
 Ссылки:
 Модель, текстура и значок спальника
 
 Авторы
 Статья создана: Weanchester, TuMaN
 Создал скрипт сна: Ab@dDon
 |  |  Четверг, 14.11.2013, 17:30   
|  |   
|  
 
  
  
  
 | 
 
  
  
 | Статус: |  |   
 | Сообщений: | 666 |   
 | Регистрация: | 30.01.2013 |  |  |  |  | 
|  
|  |   
|  
 
 
 Четверг, 14.11.2013, 18:07 | Сообщение # 2 FantomICW  
  
 | 
 
 
 
 
 
Проект Смерти Вопреки  
  
 | Статус: |  |   
 | Опытный: |  |   
 | Сообщений: | 2259 |   
 | Награды: | 8 |   
 | Регистрация: | 06.01.2013 |  | Цитата Stalker_Monstr (  ) все старое - самое лучшееСчитай, я на тебя обижен
     Зачем так резко высказываться? Ты явно не до конца разбираешься в том, о чем говоришь...
 Переносить подряд десять статей с Инсайда...Это конечно не плохо, может быть очень даже хорошо. Сам таким занимался, правда, писал статью собственную на аналогичные темы.
 В любом случае, если уже перенес, рекомендую добавить цветового выделения. А то все серое. Если цвета на белом фоне того же Инсайда могут смотреться слишком ярко, то фон Ап-про - самое то для выделения.
 |  |  Четверг, 14.11.2013, 18:07   
|  |   
|  
 
  
  
  
 | 
 
  
  
 | Статус: |  |   
 | Сообщений: | 666 |   
 | Регистрация: | 06.01.2013 |  |  |  |  | 
|  
|  |   
|  
 
  
  
  
 | 
 
 
 
 
 
 
  
  
 | Статус: |  |   
 | Отмычка: |  |   
 | Сообщений: | 194 |   
 | Награды: | 8 |   
 | Регистрация: | 30.01.2013 |  |  FantomICW, Я вообще фанат твоих статьей, спасибо. |  |  Четверг, 14.11.2013, 18:16   
|  |   
|  
 
  
  
  
 | 
 
  
  
 | Статус: |  |   
 | Сообщений: | 666 |   
 | Регистрация: | 30.01.2013 |  |  |  |  |