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

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


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

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

Изменено пользователем 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
Ссылка на комментарий

 

 

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

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

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

 

 

Хом работает на обоих стейтах, рейд только на первом.

 

 

И тут все очевидно

Где об этом почитать ?

Вот мне - не очевидно, перерыл весь раздел по Алайфу на STALKER Inside Wiki, ничего нормального не нашел. Про mob_home знаю, а что за "raid" такой, смотрел схемы монстров - не вижу такой схемы. Каким образом движок понимает, что первые два пути - для switch_0, а третий - для switch_1.

 

 

Я же сказал о прекондишне, какой еще вылет?

Где он, этот прекондишн ?

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

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

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

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

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

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

Войти

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

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

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