Перейти к контенту

[SoC] Ковыряемся в файлах


Halford

Рекомендуемые сообщения

@Возрождённый, тут два варианта: 1. Поменять compile шейдер этих кирпичей в СДК на def_no_shadow или def_vertex_no_shadow. (слишком муторно, надо перекомпилировать локацию, по сему, отпадает)

2. Возможно, light секция этого костра в спавне расположена слишком низко. Такое бывает. Поднять на пол-метра или около того. Скорее всего это решит проблему.

Изменено пользователем Silver Raven
  • Спасибо 2

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

Когда-то на форуме когда-то нарыл функцию, добавляющую в ТЧ переход от загрузочного экрана к игре аналогично ЗП. Кинул к остальному "мусору" и забыл. Сегодня решил воткнуть в игру. Но что-то не так. ничего не изменилось. То-ли функция вообще не вызывается, то-ли еще чего. Вызов из 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

Поделиться этим сообщением


Ссылка на сообщение

@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

Поделиться этим сообщением


Ссылка на сообщение

@Kondr48, не в вызове дело. В чем-то другом. Но на чистой игре работает  - я проверил. Значит где-то конфликт, вот только где...

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

Оказывается автопауза после загрузки левела аля ЗП не совместима с этой правкой:

 

 

-- -------------------------------------------------------------------------------------------------------------------
-- Схема удаления, в начале игры, всех объектов ставящих себе 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() в этом не помогает)

Изменено пользователем Silver Raven

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@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]) - причем тут сложность игры, как ее "цепляет"?)

 

Вроде, поменял по-мелочи...

Изменено пользователем Silver Raven

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@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

Поделиться этим сообщением


Ссылка на сообщение
Огорчу - он не все ошибки видит... Личный опыт. Могу пример скрипта скинуть - ошибок чекер не показывает, но вызвать функцию из скрипта невозможно - вылетает...

Ну увы, мои глаза точно не лучше Script Syntax Checker-а. Если кто заметит ошибку в коде, надеюсь укажет здесь. (весь скрипт целиком в моем прошлом посте)

Изменено пользователем Silver Raven

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

Прибил наконец вылет игры, при адаптации к своей сборке и движковым правкам (растягивающим интро текстуры на весь экран) скрипта автопаузы после загрузки левела аля ЗП от 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

Поделиться этим сообщением


Ссылка на сообщение

@Kondr48, угу, так работает. 

 

Остается только вопрос с курсором и...

 

З.Ы. Функция, проверяющая текущую сложность игры по пресетам (новичек, сталкер и т.п.) и возвращающая true или false в зависимости от результата проверки. Нашел похожую в оригинале, но не понял как допилить ее.

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@monk, пока нет. Бала одна теория, но почитав соответствующие статьи понял, что на ТЧ это невозможно реализовать. Во всяком случае без правок движка, а в этом я не бум-бум...

 

З.Ы. По прежнему ищу функцию вида:

if game_difficulty = "novice" or "stalker" then
       return true 
    end 
       return false 
end

Понятое дело не в виде такого бреда. Чисто для передачи общей структуры. Не знаю, как у нас в игре ПЫС указывали сложность, цифрами или пресетами.

Изменено пользователем Silver Raven
  • Спасибо 1

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

А так: 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)

 

 

Изменено пользователем Silver Raven

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@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

 

 

Изменено пользователем Silver Raven

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@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
Изменено пользователем Silver Raven
  • Спасибо 1
  • Полезно 1

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

@Kondr48, Если работать через all.spawn, то я бы тоже отдал предпочтение рестриктору. А если через скрипты, гораздо проще (меньше кода) заспавнить такой вот объект.

  • Согласен 1

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение

Переработал одно из сообщений для квеста:

[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

Поделиться этим сообщением


Ссылка на сообщение

@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] 

 

 

Изменено пользователем Silver Raven

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...