Silver Raven 197 Опубликовано 30 Июля 2016 (изменено) @Возрождённый, тут два варианта: 1. Поменять compile шейдер этих кирпичей в СДК на def_no_shadow или def_vertex_no_shadow. (слишком муторно, надо перекомпилировать локацию, по сему, отпадает) 2. Возможно, light секция этого костра в спавне расположена слишком низко. Такое бывает. Поднять на пол-метра или около того. Скорее всего это решит проблему. Изменено 30 Июля 2016 пользователем Silver Raven 2 aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 6 Августа 2016 Когда-то на форуме когда-то нарыл функцию, добавляющую в ТЧ переход от загрузочного экрана к игре аналогично ЗП. Кинул к остальному "мусору" и забыл. Сегодня решил воткнуть в игру. Но что-то не так. ничего не изменилось. То-ли функция вообще не вызывается, то-ли еще чего. Вызов из bind_stalker: -- Загружаем настройки дропа death_manager.init_drop_settings() -- Пауза перехода к игре, аля ЗП ui_main_menu.start() Сама функция: -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- local press_any_key_on_start = true local sound_volume_eff,sound_volume_music = 0,0 -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- class "main_menu" (CUIScriptWnd) function main_menu:__init() super() self.mbox_mode = 0 self:InitControls() self:InitCallBacks() -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- if level.present() and not press_any_key_on_start then level.hide_indicators() self.start_btn=CUIStatic() self.start_btn:SetWndRect(Frect():set(0,0,1024,768)) self.start_btn:InitTexture("ui\\ui_load") self.start_btn:SetText("Нажмите любую клавишу для перехода к игре") self.start_btn:SetTextAlign(CGameFont.alCenter) self.start_btn:SetTextY(695) self.start_btn:SetFont(GetFontGraffiti19Russian()) self.alpha = 0 self:AttachChild(self.start_btn) self:Show(false) local con=get_console() sound_volume_eff=con:get_float("snd_volume_eff") con:execute("snd_volume_eff 0") sound_volume_music=con:get_float("snd_volume_music") con:execute("snd_volume_music 0") self.tmr = profile_timer() -- Создаем таймер self.tmr:start() -- Запускаем его end -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- end function main_menu:__finalize() end function main_menu:InitControls() self:Init(0,0,1024,768) local xml = CScriptXmlInit() xml:ParseFile("ui_mm_main.xml") xml:InitStatic("back_movie", self) xml:InitStatic("background", self) xml:InitStatic("fire_movie", self) self.shniaga = xml:InitMMShniaga("shniaga_wnd",self); self.message_box = CUIMessageBoxEx() self:Register(self.message_box, "msg_box") local mm = _G.main_menu.get_main_menu() local alex_mod_ver = xml:InitStatic ("alex_mod_ver",self) local _ver = xml:InitStatic ("static_version",self) alex_mod_ver:SetText ("AleX MOD Reload ver.2.0.0 Alpha") _ver:SetText ("Game ver." .. mm:GetGSVer() .. "+") -- Подгружаем настройки для user.ltx alex_mod.loading_mod_settings() end function main_menu:Show(f) self.shniaga:SetVisibleMagnifier(f) end function main_menu:InitCallBacks() -- new game self:AddCallback("btn_novice", ui_events.BUTTON_CLICKED, self.OnButton_new_novice_game, self) self:AddCallback("btn_stalker", ui_events.BUTTON_CLICKED, self.OnButton_new_stalker_game, self) self:AddCallback("btn_veteran", ui_events.BUTTON_CLICKED, self.OnButton_new_veteran_game, self) self:AddCallback("btn_master", ui_events.BUTTON_CLICKED, self.OnButton_new_master_game, self) self:AddCallback("btn_spawn", ui_events.BUTTON_CLICKED, self.OnButton_load_spawn, self) -- options self:AddCallback("btn_options", ui_events.BUTTON_CLICKED, self.OnButton_options_clicked, self) -- load self:AddCallback("btn_load", ui_events.BUTTON_CLICKED, self.OnButton_load_clicked, self) -- save self:AddCallback("btn_save", ui_events.BUTTON_CLICKED, self.OnButton_save_clicked, self) -- multiplayer self:AddCallback("btn_multiplayer", ui_events.BUTTON_CLICKED, self.OnButton_multiplayer_clicked, self) -- quit self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.OnButton_quit_clicked, self) self:AddCallback("btn_quit_to_mm", ui_events.BUTTON_CLICKED, self.OnButton_disconnect_clicked, self) self:AddCallback("btn_ret", ui_events.BUTTON_CLICKED, self.OnButton_return_game, self) self:AddCallback("btn_lastsave", ui_events.BUTTON_CLICKED, self.OnButton_last_save, self) self:AddCallback("btn_credits", ui_events.BUTTON_CLICKED, self.OnButton_credits_clicked, self) -- message box self:AddCallback("msg_box", ui_events.MESSAGE_BOX_OK_CLICKED, self.OnMsgOk, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_CANCEL_CLICKED, self.OnMsgCancel, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_YES_CLICKED, self.OnMsgYes, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_NO_CLICKED, self.OnMsgNo, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_QUIT_GAME_CLICKED,self.OnMessageQuitGame, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_QUIT_WIN_CLICKED, self.OnMessageQuitWin, self) function main_menu:OnMsgOk() self.mbox_mode = 0 end function main_menu:OnMsgCancel() self.mbox_mode = 0 end function main_menu:OnMsgYes() if self.mbox_mode == 1 then self:LoadLastSave() end self.mbox_mode = 0 end function main_menu:OnMsgNo() self.mbox_mode = 0 end function main_menu:LoadLastSave() local console = get_console() console:execute ("main_menu off") console:execute ("load_last_save") end function main_menu:OnButton_last_save() if (alife() == nil) then self:LoadLastSave (); return end self.mbox_mode = 1 self.message_box:Init ("message_box_confirm_load_save") self:GetHolder():start_stop_menu(self.message_box, true) end function main_menu:OnButton_credits_clicked() game.start_tutorial("credits_seq") end function main_menu:OnButton_quit_clicked() self.message_box:Init("message_box_quit_windows") self:GetHolder():start_stop_menu(self.message_box, true) end function main_menu:OnButton_disconnect_clicked() self.message_box:Init("message_box_quit_game") if (level.game_id() ~= 1) then self.message_box:SetText("ui_mm_disconnect_message") -- MultiPlayer else self.message_box:SetText("ui_mm_quit_game_message") -- SinglePlayer end self:GetHolder():start_stop_menu(self.message_box, true) end function main_menu:OnMessageQuitGame() local console = get_console() console:execute("disconnect") end function main_menu:OnMessageQuitWin() local console = get_console() console:execute("quit") end function main_menu:OnButton_return_game() local console = get_console() console:execute("main_menu off") end function main_menu:OnButton_new_novice_game() local console = get_console() console:execute("g_game_difficulty gd_novice") self:StartGame() end function main_menu:OnButton_new_stalker_game() local console = get_console() console:execute("g_game_difficulty gd_stalker") self:StartGame() end function main_menu:OnButton_new_veteran_game() local console = get_console() console:execute("g_game_difficulty gd_veteran") self:StartGame() end function main_menu:OnButton_new_master_game() local console = get_console() console:execute("g_game_difficulty gd_master") self:StartGame() end function main_menu:StartGame() local console = get_console() if (alife() ~= nil) then console:execute ("disconnect") end console:execute("start server(all/single/alife/new) client(localhost)") console:execute("main_menu off") end function main_menu:OnButton_load_spawn() if self.spawn_dlg == nil then self.spawn_dlg = ui_spawn_dialog.spawn_dialog() self.spawn_dlg.owner = self end self:GetHolder():start_stop_menu(self.spawn_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(false) end function main_menu:OnButton_save_clicked() if self.save_dlg == nil then self.save_dlg = ui_save_dialog.save_dialog() self.save_dlg.owner = self end self:GetHolder():start_stop_menu(self.save_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(false) end function main_menu:OnButton_options_clicked() if self.opt_dlg == nil then self.opt_dlg = ui_mm_opt_main.options_dialog() self.opt_dlg.owner = self end self.opt_dlg:UpdateControls() self:GetHolder():start_stop_menu(self.opt_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(false) end function main_menu:OnButton_load_clicked() if self.load_dlg ==nil then self.load_dlg = ui_load_dialog.load_dialog() self.load_dlg.owner = self end self:GetHolder():start_stop_menu(self.load_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(false) end function main_menu:OnButton_multiplayer_clicked() if self.mp_dlg ==nil then self.mp_dlg = ui_mp_main.mp_main() self.mp_dlg.owner = self end self.mp_dlg:UpdateControls() self:GetHolder():start_stop_menu(self.mp_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(false) local console = get_console() console:execute ("check_for_updates 0") self.mp_dlg:OnRadio_NetChanged() end function main_menu:Dispatch(cmd, param) --virtual function if cmd == 2 then self:OnButton_multiplayer_clicked() end return true end -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- function main_menu:Update() CUIScriptWnd.Update(self) if self.tmr then self.tmr:stop() -- Останавливаем таймер if not self.last_time then self.last_time = self.tmr:time() end -- инициализируем время последнего апдейта if self.tmr:time() - self.last_time > 7000 then -- Если прошло больше 7 мс ( чем больше значение, тем медленнее моргание надписи ) self.last_time = self.tmr:time() -- Запоминаем время текущего апдейта self.start_btn:SetTextColor(self.alpha,159,142,126) if self.alpha > 250 then self.step = -3 elseif self.alpha < 60 then self.step = 3 end self.alpha = self.alpha + self.step end self.tmr:start() -- Таймер продолжает работу end end -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- function main_menu:OnKeyboard(dik, keyboard_action) --virtual function CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) local bind = dik_to_bind(dik) local console = get_console() -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- if self.start_btn and dik ~= DIK_keys.DIK_GRAVE then self.OnButton_return_game() return true end -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik == DIK_keys.DIK_ESCAPE then if level.present() and (db.actor ~= nil) and db.actor:alive() then console:execute("main_menu off") end end if dik == DIK_keys.DIK_Q then self:OnMessageQuitWin() -- Position Informer (удалить после тестирования!) elseif dik == DIK_keys.DIK_F4 then self:show_position_informer_window() end end return true end -- Position Informer (удалить после тестирования!) function main_menu:show_position_informer_window() if self.cheat_dlg == nil then self.cheat_dlg = positioninformer.pi() self.cheat_dlg.owner = self end self:GetHolder():start_stop_menu(self.cheat_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(true) end -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- local timer = 0 function f1() return timer<time_global() end function f2() set_inactivate_input_time(5) get_console():execute("main_menu 1") timer = time_global() + 200 level.add_call(f1,f3) end function f3() local console = get_console() console:hide() press_any_key_on_start = true level.show_indicators() console:execute("snd_volume_eff " .. sound_volume_eff) console:execute("snd_volume_music " .. sound_volume_music) sound_volume_eff,sound_volume_music = nil,nil end function start() if has_alife_info("storyline_actor_start") then timer = time_global() + 500 level.add_call(f1,f2) else press_any_key_on_start = true end end -- ---------------------------------------------------- Пауза перед стартом, аля ЗП ---------------------------------------------- aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 6 Августа 2016 @Kondr48, хм, чего-то падает: FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ... - trilogy\shoc\gamedata\scripts\bind_stalker.script:50: attempt to index field 'st' (a nil value) Можен он под 4-ый патч? aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 6 Августа 2016 @Kondr48, не в вызове дело. В чем-то другом. Но на чистой игре работает - я проверил. Значит где-то конфликт, вот только где... aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 7 Августа 2016 (изменено) Оказывается автопауза после загрузки левела аля ЗП не совместима с этой правкой: -- ------------------------------------------------------------------------------------------------------------------- -- Схема удаления, в начале игры, всех объектов ставящих себе ID от левелчейнжера в качестве PARENT_ID -- © 2015 by makdm, Zander_driver -- ------------------------------------------------------------------------------------------------------------------- local parent_id = {} local remove_sobj = {} local i = 1 -- Пробегаем по объектам и айдишники всех level_changer помещаем в таблицу while i < 65535 do local sobj = alife():object( i ) if sobj and sobj:clsid() == clsid.level_changer then parent_id[ sobj.id ] = sobj.id end i = i + 1 end -- Пробегаем по объектам и все child level_changer помещаем в таблицу for n = 1, 65534 do local sobj = alife():object( n ) if sobj then for k,v in pairs( parent_id ) do if sobj.parent_id == v then table.insert(remove_sobj, sobj.id) end end end end --Удаляем child level_changer for _k,_v in pairs( remove_sobj ) do local sobj_for_remove = alife():object(_v) if sobj_for_remove then alife():release(sobj_for_remove, true) end end Я попробовал перенести выполнение функции на скажем так, более поздний срок: Выдать инфопоршень когда игрок уже нажал любую клавишу для перехода к игре: function mm_on_kbd(mm,dik, keyboard_action) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if mm.start_btn then level.show_indicators() level.set_snd_volume(mm.sv) _G.ui_main_menu.main_menu.OnKeyboard = _G.ap_mm_on_kbd _G.ui_main_menu.main_menu.Update = _G.ap_mm_upd get_console():execute("main_menu off") db.actor:give_info_portion("game_started") -- отсрочка работы "чистильщика" объектов ставящих себе ID от левелчейнжера в качестве PARENT_ID end end return mm.start_btn~=nil end local parent_id = {} local remove_sobj = {} local i = 1 -- Пробегаем по объектам и айдишники всех level_changer помещаем в таблицу if has_alife_info("geme_started") then -- отсрочка работы "чистильщика" объектов ставящих себе ID от левелчейнжера в качестве PARENT_ID while i < 65535 do local sobj = alife():object( i ) if sobj and sobj:clsid() == clsid.level_changer then parent_id[ sobj.id ] = sobj.id end i = i + 1 end -- Пробегаем по объектам и все child level_changer помещаем в таблицу for n = 1, 65534 do local sobj = alife():object( n ) if sobj then for k,v in pairs( parent_id ) do if sobj.parent_id == v then table.insert(remove_sobj, sobj.id) end end end end --Удаляем child level_changer for _k,_v in pairs( remove_sobj ) do local sobj_for_remove = alife():object(_v) if sobj_for_remove then alife():release(sobj_for_remove, true) end db.actor:disable_info_portion ("geme_started") -- отсрочка работы "чистильщика" объектов ставящих себе ID от левелчейнжера в качестве PARENT_ID end end Игра сваливается с логом: FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...e.r. - trilogy\shoc\gamedata\scripts\xr_logic.script:1143: attempt to index local 'obj' (a nil value) Как бы их совместить? З.Ы. Есть функция скрывающая курсор с экрана? (level.hide_indicators() в этом не помогает) Изменено 7 Августа 2016 пользователем Silver Raven aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 7 Августа 2016 (изменено) @Firebird, ок, пока отрежу. Немного переработал часть скрипта автопаузы аля ЗП, для совместимости с движковой правкой, растягивающей интро текстуры на весь экран: ------------------- ДО: function on_mm_init(mm) if level.present() and _G.press_any_key_on_start then _G.press_any_key_on_start = false level.hide_indicators() mm.start_btn = CUIStatic() mm.start_btn:SetWndRect(Frect():set(0,0,1024,768)) mm.start_btn:InitTexture("ui\\ui_load") mm.start_btn:SetText("Нажмите любую клавишу для перехода к игре") mm.start_btn:SetTextAlign(CGameFont.alCenter) mm.start_btn:SetTextY(695) mm.start_btn:SetFont(GetFontGraffiti22Russian()) mm.alpha = 255 mm:AttachChild(mm.start_btn) mm:Show(false) mm.sv = level.get_snd_volume() mm.tmr = profile_timer() -- создаем таймер mm.tmr:start() -- запускаем его mm.last_time = 0 -- инициализируем время последнего апдейта _G.ui_main_menu.main_menu.__init = _G.ap_mm_init -- картинка загружаемой локации mm.level_intro = CUIStatic() if device().aspect_ratio >= 0.75 then mm.level_intro:SetWndRect(Frect():set(257,369,512,256)) mm.level_intro:InitTexture("intro\\intro_"..level.name()) else mm.level_intro:SetStretchTexture(true) mm.level_intro:SetWndRect(Frect():set(257,370,257+512,370+256)) mm.level_intro:InitTexture("intro\\intro_"..level.name()) end mm:AttachChild(mm.level_intro) end end ------------------- ПОСЛЕ: function on_mm_init(mm) if level.present() and _G.press_any_key_on_start then _G.press_any_key_on_start = false level.hide_indicators() mm.start_btn = CUIStatic() mm.start_btn:SetStretchTexture(true) mm.start_btn:SetWndRect(Frect():set(0,0,1024,768)) mm.start_btn:InitTexture("intro\\intro_"..level.name()) mm.start_btn:SetText("Нажмите любую клавишу для перехода к игре") mm.start_btn:SetTextAlign(CGameFont.alCenter) mm.start_btn:SetTextY(695) mm.start_btn:SetFont(GetFontGraffiti22Russian()) mm.alpha = 255 mm:AttachChild(mm.start_btn) mm:Show(false) mm.sv = level.get_snd_volume() mm.tmr = profile_timer() -- Создаем таймер mm.tmr:start() -- Запускаем его mm.last_time = 0 -- Инициализируем время последнего апдейта _G.ui_main_menu.main_menu.__init = _G.ap_mm_init end end На чистой игре работает стабильно, на моей сборке косячит: FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ... - trilogy\shoc\gamedata\scripts\bind_stalker.script:490: attempt to concatenate field '?' (a nil value) (строка 490: get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) - причем тут сложность игры, как ее "цепляет"?) Вроде, поменял по-мелочи... Изменено 7 Августа 2016 пользователем Silver Raven aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 7 Августа 2016 @Kondr48, ошибок в синтаксисе нет, я в первую очередь проверил Script Syntax Checker-ом. _G.press_any_key_on_start = true -- мод включен - true/false - мод выключен local function inj_mm_init(func_name) local name = "ap_mm_init" _G[name] = _G.ui_main_menu.main_menu.__init _G.ui_main_menu.main_menu.__init = function(...) _G[name](...) local arg={...} loadstring('return _G["'..string.gsub(func_name,"%.",'"]["')..'"]')()(arg[1]) end end local function inj_mm_upd(func_name) local name = "ap_mm_upd" if not _G.ui_main_menu.main_menu.Update then _G.ui_main_menu.main_menu.Update = function()end end _G[name] = _G.ui_main_menu.main_menu.Update _G.ui_main_menu.main_menu.Update = function(...) _G[name](...) local arg={...} loadstring('return _G["'..string.gsub(func_name,"%.",'"]["')..'"]')()(arg[1]) end end local function inj_mm_on_kbd(func_name) local name = "ap_mm_on_kbd" _G[name] = _G.ui_main_menu.main_menu.OnKeyboard _G.ui_main_menu.main_menu.OnKeyboard = function(...) local arg={...} if not loadstring('return _G["'..string.gsub(func_name,"%.",'"]["')..'"]')()(arg[1],arg[2],arg[3]) then return _G[name](...) end return true end end function main() if _G.press_any_key_on_start then inj_mm_init("autopause.on_mm_init",true) inj_mm_upd("autopause.mm_update",true) inj_mm_on_kbd("autopause.mm_on_kbd",true) inj.inj_update("autopause.on_upd",true) end end function on_mm_init(mm) if level.present() and _G.press_any_key_on_start then _G.press_any_key_on_start = false level.hide_indicators() mm.start_btn = CUIStatic() mm.start_btn:SetStretchTexture(true) mm.start_btn:SetWndRect(Frect():set(0,0,1024,768)) mm.start_btn:InitTexture("intro\\intro_"..level.name()) mm.start_btn:SetText("Нажмите любую клавишу для перехода к игре") mm.start_btn:SetTextAlign(CGameFont.alCenter) mm.start_btn:SetTextY(695) mm.start_btn:SetFont(GetFontGraffiti22Russian()) mm.alpha = 255 mm:AttachChild(mm.start_btn) mm:Show(false) mm.sv = level.get_snd_volume() mm.tmr = profile_timer() -- Создаем таймер mm.tmr:start() -- Запускаем его mm.last_time = 0 -- Инициализируем время последнего апдейта _G.ui_main_menu.main_menu.__init = _G.ap_mm_init end end function mm_update(mm) if mm.tmr then mm.tmr:stop() if mm.tmr:time() - mm.last_time > 6000 then -- Чем больше значение, тем медленнее моргание надписи mm.last_time = mm.tmr:time() mm.start_btn:SetTextColor(mm.alpha,159,142,126) if mm.alpha > 250 then mm.step = -2 elseif mm.alpha < 60 then mm.step = 2 end mm.alpha = mm.alpha + mm.step end mm.tmr:start() get_console():hide() end end function mm_on_kbd(mm,dik, keyboard_action) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if mm.start_btn then level.show_indicators() level.set_snd_volume(mm.sv) _G.ui_main_menu.main_menu.OnKeyboard = _G.ap_mm_on_kbd _G.ui_main_menu.main_menu.Update = _G.ap_mm_upd get_console():execute("main_menu off") db.actor:give_info_portion("game_started") end end return mm.start_btn~=nil end function on_upd() if device().precache_frame<3 then inj.inj_update("autopause.on_upd",false) if _G.g_start_avi then _G.ui_main_menu.main_menu.__init = _G.ap_mm_init _G.ui_main_menu.main_menu.OnKeyboard = _G.ap_mm_on_kbd _G.ui_main_menu.main_menu.Update = _G.ap_mm_upd else get_console():execute("main_menu 1") end end end aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 7 Августа 2016 (изменено) Огорчу - он не все ошибки видит... Личный опыт. Могу пример скрипта скинуть - ошибок чекер не показывает, но вызвать функцию из скрипта невозможно - вылетает... Ну увы, мои глаза точно не лучше Script Syntax Checker-а. Если кто заметит ошибку в коде, надеюсь укажет здесь. (весь скрипт целиком в моем прошлом посте) Изменено 7 Августа 2016 пользователем Silver Raven aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 14 Августа 2016 Прибил наконец вылет игры, при адаптации к своей сборке и движковым правкам (растягивающим интро текстуры на весь экран) скрипта автопаузы после загрузки левела аля ЗП от Charsi. Теперь стал вопрос, как заставить заглохнуть музыкальную тему из главного меню, во время работы скрипта. Сначала, добавил по классике level.set_snd_volume(0), а после нажатия игроком любой кнопки level.set_snd_volume(1) - почему-то не катит. Да и вообще ситуация со звуком в скрипте не очень понятна: function on_mm_init(mm) if level.present() and _G.press_any_key_on_start then _G.press_any_key_on_start = false level.hide_indicators() mm.start_btn = CUIStatic() mm.start_btn:SetStretchTexture(true) mm.start_btn:SetWndRect(Frect():set(0,0,1024,768)) mm.start_btn:InitTexture("intro\\intro_"..level.name()) mm.start_btn:SetText("Нажмите любую клавишу для перехода к игре") mm.start_btn:SetTextAlign(CGameFont.alCenter) mm.start_btn:SetTextY(695) mm.start_btn:SetFont(GetFontGraffiti22Russian()) mm.alpha = 255 mm:AttachChild(mm.start_btn) mm:Show(false) --mm.sv = level.get_snd_volume() <--------- Исходник. Получаем текущую громкость звука? А где его отключение? level.set_snd_volume(0) <--------- Не работает. ХЗ mm.tmr = profile_timer() -- Создаем таймер mm.tmr:start() -- Запускаем его mm.last_time = 0 -- Инициализируем время последнего апдейта _G.ui_main_menu.main_menu.__init = _G.ap_mm_init end end function mm_on_kbd(mm,dik, keyboard_action) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if mm.start_btn then level.show_indicators() level.set_snd_volume(1) <--------- Не работает. ХЗ --level.set_snd_volume(mm.sv) <---------- Исходник. Возвращаем громкость звука из mm.sv = level.set_snd_volume()? _G.ui_main_menu.main_menu.OnKeyboard = _G.ap_mm_on_kbd _G.ui_main_menu.main_menu.Update = _G.ap_mm_upd get_console():execute("main_menu off") end end return mm.start_btn~=nil end З.Ы. И да, точно нет способа запихнуть в скрипт скрытие курсора? (хоть подменой текстуры) aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 14 Августа 2016 @Kondr48, угу, так работает. Остается только вопрос с курсором и... З.Ы. Функция, проверяющая текущую сложность игры по пресетам (новичек, сталкер и т.п.) и возвращающая true или false в зависимости от результата проверки. Нашел похожую в оригинале, но не понял как допилить ее. aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 14 Августа 2016 (изменено) @monk, пока нет. Бала одна теория, но почитав соответствующие статьи понял, что на ТЧ это невозможно реализовать. Во всяком случае без правок движка, а в этом я не бум-бум... З.Ы. По прежнему ищу функцию вида: if game_difficulty = "novice" or "stalker" then return true end return false end Понятое дело не в виде такого бреда. Чисто для передачи общей структуры. Не знаю, как у нас в игре ПЫС указывали сложность, цифрами или пресетами. Изменено 14 Августа 2016 пользователем Silver Raven 1 aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 14 Августа 2016 @BoBaH_671, @Eugen81, игра падает с обоими вариантами. aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 14 Августа 2016 (изменено) А так: if game_difficult == "gd_novice" or game_difficult == "gd_stalker" then ? И так не хочет работать. @BoBaH_671, лог - классика жанра: FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...a.l.k.e.r. - trilogy\shoc\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value) Изменено 14 Августа 2016 пользователем Silver Raven aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 14 Августа 2016 @Eugen81, и так тоже. aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 14 Августа 2016 (изменено) @BFG, дык у нас на форуме, вроде была тема по какой-то разработке с такими возможностями. Забыл где. И рестрикторы отрисовываются и спавном можно заниматься, прямо на месте. @Карлан, отлично. Работает. Как и этот вариант от @Kondr48: local game_difficult = get_console():get_string("g_game_difficulty") function difficult_check() if game_difficult == "gd_novice" or game_difficult == "gd_stalker" then return true else return false end end А возможно как-то обойти необходимость регистрировать\прописывать функции вызываемые из логики в xr_effects.script? Насчет курсора, есть одна идея. Ему можно задавать координаты на экране? Если да, то как вывести его далеко за пределы экрана, тем самым "скрыв" от игрока? Возможно как-нибудь разделить такую портянку на части? Читать очень неудобно: [sr_idle@check_game_difficult_and_actor_outfit] on_actor_inside = %=lab_x7_check_game_difficult =lab_x7_biohazard_check_actor_outfit% {-lab_x7_actor_chose_hight_difficult -lab_x7_actor_have_bioprotection_outfit} sr_timer@biohazard_without_bioprotection_outfit_low_difficult, {-lab_x7_actor_chose_hight_difficult +lab_x7_actor_have_bioprotection_outfit} sr_timer@biohazard_with_bioprotection_outfit_low_difficult, {+lab_x7_actor_chose_hight_difficult -lab_x7_actor_have_bioprotection_outfit} sr_timer@biohazard_without_bioprotection_outfit_hight_difficult, {+lab_x7_actor_chose_hight_difficult +lab_x7_actor_have_bioprotection_outfit} sr_timer@biohazard_with_bioprotection_outfit_hight_difficult Изменено 14 Августа 2016 пользователем Silver Raven aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 15 Августа 2016 (изменено) @dPlayer, метку можно повесить на невидимый (использовать ogf модельки из equipment_cache) и неюзаемый маленький объект с такой логикогй: [logic] active = ph_idle@none [ph_idle@none] nonscript_usable = false tips = И таким конфигом: [fake_inventory_box]:identity_immunities $spawn = "devices\fake_inventory_box" class = O_INVBOX cform = skeleton visual = physics\equipment_cache\equipment_box_01_case.ogf custom_data = scripts\fake_inventory_box.ltx radius = 0 script_binding = bind_physic_object.init Изменено 15 Августа 2016 пользователем Silver Raven 1 1 aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 15 Августа 2016 @Kondr48, Если работать через all.spawn, то я бы тоже отдал предпочтение рестриктору. А если через скрипты, гораздо проще (меньше кода) заспавнить такой вот объект. 1 aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 15 Августа 2016 Переработал одно из сообщений для квеста: [logic] active = sr_tip@alex_squad_sos_signal [sr_tip@alex_squad_sos_signal] name = generators_alex_squad_sos_signal_message type = tips sender = generators_alex_squad_sos_signal cond = {-find_sos_signal_source_task_complite} single = true timeout = 3000 showtime = 7000 on_signal = tip_sended | sr_idle@start_quest_timer [sr_idle@start_quest_timer] on_timer = 6000 | nil %+find_sos_signal_source% Игра крашится с руганью на news_manager: FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ... - trilogy\shoc\gamedata\scripts\news_manager.script:158: attempt to index field '?' (a nil value) Вроде, без все ошибок. Правильность инфопоршней проверил. Чего он еще хочет? aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 15 Августа 2016 @BoBaH_671, как минимум то, что сообщение должно выдаваться в строго определенном месте. 1 aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение
Silver Raven 197 Опубликовано 15 Августа 2016 (изменено) @Charsi, да, похоже на то. Забыл поправить имя иконки в таблице, когда переписывал схему. Уже и забыл где ее искать, в config\ui, кажется? Автопауза в стиле ЗП твоя же разработка? Можно как-нибудь скрыть курсор во время работы скрипта? И не включать весь скрипт при старте игры? (там бяка получается, если принудительно пропустить начальный ролик) @BoBaH_671, при чем тут ее кривость. Если думать в этой плоскости, то в Сталкере криво практически все, от этого никуда не денешься. Вот старая схема. Перегруженная лишними элементами (писал давно, знаний не хватало), но вполне рабочая: [logic] active = sr_idle@start [sr_idle@start] on_actor_inside = sr_idle@start_message_timer, sr_idle@stop [sr_idle@start_message_timer] on_timer = 3000| sr_tip@alex_squad_need_help [sr_tip@alex_squad_need_help] name = generators_alex_squad_need_help_message type = tips sender = alex_squad showtime = 7000 cond = {-alex_squad_need_help} %+alex_squad_send_sos_signal_start_quest_timer% on_info = {+alex_squad_send_sos_signal_start_quest_timer} sr_idle@quest_timer [sr_idle@quest_timer] on_timer = 6000 | nil %+alex_squad_need_help% [sr_idle@stop] Изменено 15 Августа 2016 пользователем Silver Raven aka Stalker_AleX333 Мои проекты - ЯндексДиск | Я на Gamer-Mods.ru Поделиться этим сообщением Ссылка на сообщение