Случайная подборка модов
Альтернатива 1.3.1
4.0
Новое Время
3.2
Dead Autumn
4.1
Время перемен v1.0
3.8
Oblivion Lost Remake 2.5
4.4
NEYA Online
3.1
Последние обновленные темы Прямой эфир Самые популярные темы Последние новости
  • Страница 1 из 1
  • 1
Архив - только для чтения
Форум » Архив » Моддинг - Архив » [ТЧ] Спальный мешок (Автор: Ab@dDon)
[ТЧ] Спальный мешок
Российская Федерация  Stalker_Monstr
Четверг, 14.11.2013, 17:30 | Сообщение # 1
Статус:
Отмычка:
Сообщений: 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
Украина  FantomICW
Четверг, 14.11.2013, 18:07 | Сообщение # 2
Проект Смерти Вопреки
Статус:
Опытный:
Сообщений: 2259
Награды: 8
Регистрация: 06.01.2013

Цитата Stalker_Monstr ()
все старое - самое лучшее

Считай, я на тебя обижен smile dry
Зачем так резко высказываться? Ты явно не до конца разбираешься в том, о чем говоришь...
Переносить подряд десять статей с Инсайда...Это конечно не плохо, может быть очень даже хорошо. Сам таким занимался, правда, писал статью собственную на аналогичные темы.
В любом случае, если уже перенес, рекомендую добавить цветового выделения. А то все серое. Если цвета на белом фоне того же Инсайда могут смотреться слишком ярко, то фон Ап-про - самое то для выделения.
  Злобная реклама
Четверг, 14.11.2013, 18:07
Статус:
Сообщений: 666
Регистрация: 06.01.2013
Российская Федерация  Stalker_Monstr
Четверг, 14.11.2013, 18:16 | Сообщение # 3
Статус:
Отмычка:
Сообщений: 194
Награды: 8
Регистрация: 30.01.2013

FantomICW, Я вообще фанат твоих статьей, спасибо.
  Злобная реклама
Четверг, 14.11.2013, 18:16
Статус:
Сообщений: 666
Регистрация: 30.01.2013
Форум » Архив » Моддинг - Архив » [ТЧ] Спальный мешок (Автор: Ab@dDon)
  • Страница 1 из 1
  • 1
Поиск: