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)
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, открываем его и пишем:
Теперь зайдем в 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") пишем:
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
и еще я путь к модельке другой прописал (скачал готовый от амк)
Добавлено (17.09.2011, 11:52) --------------------------------------------- а, и еще как добавить динамические новости о смерте сталкеров? мне посоветовали скачать новости от амк, но там о смерте сталкеров не чего ни было сказанно?
Сообщение отредактировал MaxOFF - Суббота, 17.09.2011, 11:47
При загрузки сохранения выскакивает такой лог: Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...îå Èçäàíèå\shoc\gamedata\scripts\bind_stalker.script:438: attempt to concatenate field '?' (a nil value)
В 438 строке написанно это: get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
Вопрос выше решен. Появился другой вопрос О_О При переходе на кордон вылет Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...îå Èçäàíèå\shoc\gamedata\scripts\task_manager.script:349: attempt to index a nil value
На кордоне у меня везде новые сталкеры (кроме Волка) без диалогов и квестов. 3 квеста у сидора (найди принеси), которые пока не работают (т.е. выдача инфопоршня в игре пока что невозможна). В чем проблема?
Ребят, а вот вопрос к знающим. Я создал нпс в ТЧ уникального прописал ему респаун и все в порядке и заспаунил. А как сделать респаун у простых нпс например bandit_novice так скажим. Расъесняю допустим ситуацию. Я заспаунил бандита новичка, он стоит нормально, а как прописать ему респаун просто незнаю. Может напишите если знаете. Вот только бы с респауном розобраться осталось.И да если знаете напишите еше респаун мутантов.И стать с вики не надо я читал там уже, хотелось бы, чтобы объяснили по нормальному, а не по научному
Quote (MaxOFF)
вопрос из разряда школотских:как сделать так чтоб предмел полюбому всегда был бы в продаже у торговца?
Тебе нужно лезть в config/misc/trade_нужный торговец.Первая часть там прописанно, что он покупает.Во в 2 части начиная со слов suplies_start ето что у него есть первое число непомню что, а 2 число это во сколько раз дороже предмет будет стоить. Вот пример af_dummy = 1, 0.5 3 Часть начинается со слов start_sell Туда прописываешь свой товар пример: novice_outfit = 1, 2 Надеюсь понятно разъеснил. Свой товар пиши и в suplies_start и start_sell
Сообщение отредактировал EnerjaiZer - Суббота, 17.09.2011, 17:25
EnerjaiZer, слушай, а trade_trader это сидоровича конфиг? а то че то у него в продаже спальник не появляется(
Да это сидорович, а ты пропеши так. suplies_start спальник = 1, 0.5 start_sell спальник = 1, 2 Попробуй и отпишись. Ну мне хоть ответьте кто-нить плиз. Замучился писать ужн. Вместо спальника пиши название мешка из items!!!