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

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

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

 

Silver Raven, оригинальная версия, кстати, может не запускаться перед стартовым роликом. Вы проверьте при загрузке сейвов или переходе на другую локацию.

 

Ссылка на комментарий

Такой вопрос. Имеем интересную проблему - на определенной локации( именно на одной, на других такого нет ) при перезагрузке сева, или выхода с локации - вылет. Всё бы ничего,но:

 

1.Вылетает (при перезагрузке сейва ) еще до стадии синхронизации. Лог - пуст. Работал с выводом лога в _g.script - последнее что было - disconnect, ссылок на глючные обьекты нет.

2.Если выйти с локации - то же самое, вылет происходит до того, как игра начинает грузить новую локацию, т.е мое мнение - игровые обьекты не при чем.

3.Сейвы не бьються от таких вылетов.

 

Может кто встречался с такой проблемой. (1.0004+OGSM) 

 

Вот момент перехода с локации на другую:

 

* Log file has been saved successfully!
* Saving spawns...
* Saving objects...
* 16733 objects are successfully saved
* Game я_autosave.sav is successfully saved to file 'c:\documents and settings\all users\documents\stalker-shoc\savedgames\я_autosave.sav'
* DVB created: 1536K
* DIB created: 512K
- r__tf_aniso 1
- r1_tf_mipbias 0.
* SSample: 1024x768
* SSample: enabled
* GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30)
* GPU vertex cache: recognized, 32
*** RESET [179 ms]
- Disconnect
! Unknown command: [smart_terrain_agr_rush]_gulag:_object_setup_offline:_obj=val_dog_weak

 

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

Не соответствует правилам.

Ссылка на комментарий

А вот это последняя строчка лога, она не сигнализирует о проблеме? В том смарте действительно может находится тот объект? Так, на всякий случай.

Изменено пользователем dsh
Ссылка на комментарий

@dsh, отвечу. В смарте проблем нет. А если бы и были - вылетало бы нет. При самой то игре - сколько не бегай вылетов не будет...

 

Для наглядности - это ПЫС смарт. Тут и ломаться вроде нечему...

 

[2350]

; cse_abstract properties
section_name = smart_terrain
name = agr_rush
position = 213.398498535156, 20.5153751373291, 77.0153503417969
direction = 0.0470287166535854, 0.00845688115805388, -0.177990615367889
id = 65535
version = 118
script_version = 6
spawn_id = 1629

; cse_alife_object properties
game_vertex_id = 501
distance = 11.9
level_vertex_id = 413648
object_flags = 0xffffff3e
custom_data = <[smart_terrain]
type = general_lair

communities = dog
capacity = 5

;switch_0 = {=gulag_empty(agr2_st_factory)}
;switch_1 = {=gulag_population_ge(agr_rush:5) !gulag_empty(agr2_st_factory)}
END

; cse_shape properties
shapes = 1
shape_0:type = sphere
shape_0:offset = 0,0,0
shape_0:radius = 5

; cse_alife_space_restrictor properties
restrictor_type = 0

; se_smart_terrain properties


Не соответствует правилам.

Ссылка на комментарий

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

 

 

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

Ссылка на комментарий

@dsh, отвечу. В смарте проблем нет. А если бы и были - вылетало бы нет. При самой то игре - сколько не бегай вылетов не будет...

 

Для наглядности - это ПЫС смарт. Тут и ломаться вроде нечему...

 

У тебя банальная опечатка в аллспавне, вот и не работает нормально.

 

Вот это:

 

 

custom_data = <[smart_terrain]

---------------------------------

www.amk-zone.de

Ссылка на комментарий

 

 

не совместима с этой правкой


Не так давно сталкивался с той же проблемой. В итоге, просто вырезал эту схему.
Помимо всего прочего, игра с регулярной периодичностью валилась с однотипным логом:

Expression : e_entity->ID_Parent == id_parent
Function : xrServer::Process_event_reject
File : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_process_event_reject.cpp
Line : 23
Description : medkit_army24329
Arguments : esc_specnaz5



Были проблемы и у нпс, когда из-за подобных ошибок они начинали бесконечно перезаряжаться.

Ссылка на комментарий

@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

Ссылка на комментарий

 

Silver Raven, киньте правленый скрипт хоть. Хотя не понимаю как так можно исправить четыре цифры)) Скорее всего ошибка в синтаксисе.

 

Ссылка на комментарий

@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

Ссылка на комментарий

@Wlad777, допустим... смарт я снес. НО - ошибки в логике чреваты вылетами с руганью на формат. А тут они только в конкретной ситуации - сейв\лоад(и переход с локи). При заходе на нее вылета небыло ни разу.
Странно, не находите?


 

 

проверил Script Syntax Checker-ом.

 

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

Не соответствует правилам.

Ссылка на комментарий
Такой вопросец по универсальным лагерям:
есть такой смарт
[smart_terrain]
type = general_lair
capacity = 7
communities = boar
switch_0 = {=gulag_empty(gar_dolg_blokpost)}
switch_1 = {=gulag_population_comed_ge(gar_smart_boars:5) !gulag_empty(gar_dolg_blokpost)}
stay = long

есть такие пути

gar_smart_boars_home_1
gar_smart_boars_home_2
gar_smart_boars_raid_1
Разъясните плиз, как эти пути связаны с переключателями состояний смарта. Переключателей 2 а путей 3, как это понимать ? Только на Вики не отправляйте, я там читал - ниче не понял.
Изменено пользователем UnLoaded
Ссылка на комментарий
Огорчу - он не все ошибки видит... Личный опыт. Могу пример скрипта скинуть - ошибок чекер не показывает, но вызвать функцию из скрипта невозможно - вылетает...

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

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

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

Ссылка на комментарий

@UnLoaded, из того, что я вижу в имеющемся скрипте. На каждый путь home будет создано 10 работ. Т.е. этот смарт может принять максимум 20 кабанов. Полагаю, что первые 10 будут первый путь использовать, а вторые 10 - второй. Но так-как смарту указана емкость 7, вероятно, что все 7 будут использовать первый путь. Далее посмотрим на raid пути. Для каждого пути создается 5 работ. И вот тут должен быть вылет, т.к. емкость смарта ( 7 ) больше, чем кол-во работ для raid-а.

Ссылка на комментарий

Разъясните плиз, как эти пути связаны с переключателями состояний смарта. Переключателей 2 а путей 3, как это понимать ? Только на Вики не отправляйте, я там читал - ниче не понял.

Хом работает на обоих стейтах, рейд только на первом. Как ты вообще связываешь пути и стейты? Это два разных понятия. У тебя может быть один стейт и десятки путей, и никаких переключателей вообще не будет. И тут все очевидно, если в гулаг приперлись 5 кабанов и на блокпосте есть мужики, то переключится в первый стейт и рейдить в их сторону чтобы сожрать. Как сожрали валить обратно. Что тут может быть не ясного? Точка сбора, путь атаки, точка после атаки, это логично. Могу ошибаться, но как я понял это реализация такого регулярного набега на блокпост, как гулаг собирает кабанов и есть кого жрать - начинается набег.

 

 

И вот тут должен быть вылет, т.к. емкость смарта ( 7 ) больше, чем кол-во работ для raid-а.

Я же сказал о прекондишне, какой еще вылет? Кабаны набираются на рейд и свитчятся в рейд, далее валят обратно, емкость гулага искусственно поддерживается.

Ссылка на комментарий

Перезаселяю глобально Зону и столкнулся с такой проблемкой. На насыпи, есть лагерь военных (все мы прекрасно знаем) и когда наступает ночь трое из вояк уходят к костру. Как сделать, чтобы они и днем тоже сидели у костра? Я в основном использую general_lager и general_lair, поэтому мне пока сложно разобраться в гулагах такого типа, как на насыпи. На вики почитал, не совсем разобрался.

Добавлено  HellRatz,

Что бы сидели и днем и ночью просто, не ходили? Посмотри логику "kamp".

Работы butcher_512. Все ссылки пропали, поэтому ложу свои сюда, чтобы никогда не потерять:

Customization Pack 0.83 [Beta4] - SoC - Тема модификации.

Customization Pack CoP [Beta]   - CoP - Тема модификации.

Ссылка на комментарий

@Карлан, ну какой вылет, какой. Простой вылет:

 

	for i, v in ipairs( jobs_avail_in_states ) do
		if v < self.capacity then
			print_table( self.Job )
			abort( "[smart_terrain %s] type=%s state=%d capacity=%d: too few absolutely available jobs", self.name, self.type, i, self.capacity )
		end
	end
end
Ссылка на комментарий

 

 

ну какой вылет, какой. Простой вылет:

Ты что-то не так понял, эта функция нигде не вызывается, этот вылет невозможен.

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...