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

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

@macron, так у тебя скрипт неверный :(. Ща накатаю.

function delete_bad_objects() --// на save callback
	local changer = vector():set(116.57, -0.09, 518.79) --// тут можешь писать прямо obj:position() где obj - твой ченджер
	local dist
	for i=1,65534 do
		local obj = level.object_by_id(i)
		if obj then 
			dist = changer:distance_to(obj:position()) 
			if dist < 4 then --// не трогай, радиус на чаэс примерно такой
				local sobj = alife():object(i)
				if sobj then
					alife():release(sobj, true)
				end
			end
		end
	end
end

Будет проблема с большими объектами, так как сравнивается по центрам, так что смотри сам, можно дополнительно проверять секцию и регулировать радиус удаления.

Если не покатит, то отпиши когда родителя обретают, я костылем подопру ;).

Изменено пользователем Карлан
  • Спасибо 1
Ссылка на комментарий

 

 

а что мешает при спавне объекта проверить координаты спавна и если они в зоне левел-ченджера, то сдвинуть спавн за пределы зоны перехода вглубь локации?

Вылетает не из-за координат, а из-за использования id от левелчейнжера в качестве parent_id. Кстати, визуально эти объекты (пара артов, несколько антирадов) в том месте я так и не нашел.

 

@Карлан, я вставил новый текст вместо старого, но лучше не стало. Боюсь, проблема серьезная, требует непосредственного профессионального подхода/тестирования. Решать такие вопросы сейчас через меня - примерно то же самое, как пытаться чинить компьютер по телефону. :) Если здесь есть истинные фанаты OLR (в чем сильно сомневаюсь), конечно обращайтесь, материал предоставлю, а так - только время зря потратим. Всем спасибо за участие.

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

@macron, возможно проблема не в этом, расскажи когда они родителя обретают. Попробуй перед сейвом удалить все лч, а после загрузки данных их заспавнить, но с ними тоже конечно те еще приколы, помню, когда обработку этих лч писал, с удалением были какие-то хорошие затыки.

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

@macron, Почистите лс, что бы можно было вам писать сообщения.
P.s Извините за такой флуд, пост под снос.

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

Ну у меня есть мысль, можно же получить этот самый parent_id?

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

 

 

Почистите лс

ok

 

 

 

расскажи когда они родителя обретают

Глюко-объекты рождаются в процессе игры, "в зависимости от расположения звезд на небе". Наиболее подвержены им ЧАЭС и Янтарь. Вот конфиги ЧАЭС из распакованного алспавна и битого сейва, если интересно. Нужные секции можно найти по поиску

 

116.575942993164, -0.0990743637084961, 518.794067382813

 

http://rghost.ru/6yLdDMshh

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

@macron, да по барабану когда рождаются, ты выясни когда родителем лч становится :).

 

@vampirnik77, ну давай пиши уже не кокетничай.

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

@Карлан, Я просто боюсь ерись сморозить, ну да ладно. Можно ли так, перед сохранением проверить не совпдает ли parent_id объекта с id левелчейнджера и если совпадает то удалять объект?
 

  • Нравится 1
Ссылка на комментарий
да по барабану когда рождаются, ты выясни когда родителем лч становится

На то, чтобы хоть как-то научиться распаковывать олровские сейвы и на их основе установить связь битых сейвов с левелчейнжерами ушел год. К тому времени, когда ты получишь от меня новый ответ, скорее всего, он будет уже неактуален. :wacko:

 

Пока отвечу так: объекты породила Зона.

 

 

Можно ли так, перед сохранением проверить не совпдает ли parent_id объекта с id левелчейнджера и если совпадает то удалять объект?

Тоже вариант. Но пока даже без проверок объекты  удалять не получается.

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

@macron, просто выведи в лог sobj.parent_id у объектов до сейва, и после лоада.

 

 

 

Тоже вариант.

Видимо я слишком завуалированно излагаю мысли :(. Его я тоже рассматривал, но не первоочередно, и для него тоже надо знать когда парентом становится лч.

 

 

Я по прежнему реквестирую знахаря.

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

 

 

просто выведи в лог sobj.parent_id у объектов до сейва, и после лоада

Вот последний bind_stalker.script. Можешь сам добавить туда, о чем пишешь, если это то что нужно... Говорю же, не всегда врубаюсь, о чем вы, скриптеры, толкуете. :)  А если и врубаюсь, могу неделю изучать/экспериментировать с последовательностью расположения какой-нибудь скобки.

 

http://rghost.ru/7tJpxtFrS

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

@macron, скриптов я не писал уже давно, перекрестимся что ничего не напутал, замени свой сейв на этот:

 

 

function actor_binder:save(packet)

	local changer = vector():set(116.57, -0.09, 518.79) --// тут можешь писать прямо obj:position() где obj - твой ченджер
	local dist
	for i=1,65534 do
		local obj = level.object_by_id(i)
		if obj then 
			dist = changer:distance_to(obj:position()) 
			if dist < 4 then --// не трогай, радиус на чаэс примерно такой
				local sobj = alife():object(i)
				if sobj then
					get_console():execute(string.format('parent_id[%s] = %s', obj:name(), sobj.parent_id))
					alife():release(sobj, true)
				end
			end
		end
	end

		if rx_ai then rx_ai.actor_save(packet) end
	local save_treasure_manager = true

	printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
	object_binder.save(self, packet)

	--' Сохраняем уровень сложности
	if save_treasure_manager == true then
		packet:w_u8(level.get_game_difficulty() + 128)
	else
		packet:w_u8(level.get_game_difficulty())
	end

	--' Сохраняем данные об отключенном вводе
	if self.st.disable_input_time == nil then
		packet:w_bool(false)
	else
		packet:w_bool(true)
		utils.w_CTime(packet, self.st.disable_input_time)
	end

	xr_logic.pstor_save_all(self.object, packet)
	self.weather_manager:save(packet)

	sr_psy_antenna.save( packet )
	
	if save_treasure_manager == true then
		treasure_manager.save(packet)      
	end                                  

	task_manager.save(packet)
	self.actor_detector:save(packet)

end

 

 

Ссылка на комментарий
замени свой сейв на этот:

Ok.

При использовании старого сейва в котором есть левелчейнжер - глухо виснет при попытке сохраниться, наверное пытается грохнуть левелчейнжер. При использовании переделанного сейва (без левелчейнжера) сейвится нормально, но в логе ничего интересного. Только ! Unknown command: parent_id[lvl14_stancia_space_restrictor].

 

http://rghost.ru/8SXL6J5Lw

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

@macron, а разве имя нужного объекта неизвестно? Зачем эти извраты с измерением расстояния до позиции?

Изменено пользователем Shadows
Ссылка на комментарий
а разве имя нужного объекта неизвестно?

Имя, наверное, может быть любое. Как и количество объектов (хотя, обычно в пределах 10-15).Известны лишь координаты (идентичны координатам левелчейнжера) и то, что берут его ID в качестве PARENT_ID. Тут как бы задача получить универсальную удалялку (в будущем - по одной универсальной удалялке на каждый левелчейнжер конкретного уровня и для каждого уровня + добавить имена самих левелчейнжеров в исключения, чтобы их тоже не затерло).

 

ЗЫ: для экспериментов с конкретным сейвом, имена, конечно, известны. Недавно ltx из сейва выкладывал.

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

@macron, вот такой скрипт попробуй

 


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
remove_sobj[ sobj.id ] = sobj
end
end
end
end
--Удаляем child level_changer
for _k,_v in pairs( remove_sobj ) do
alife():release( _v, true )
end

Изменено пользователем makdm
  • Спасибо 1
Ссылка на комментарий

@makdm, так а смысл то какой? Если релиз не работает в фо, то тогда надо попробовать вайл, это как минимум. Например некоторые функции для работы с таблицами тоже в циклах фо того. Но это все теория, а знатоков тут таки нет :(. Ты просто один цикл на три умножил, к тому же зачем перебирать все 65534 для идентификации лч, когда у каждого есть сид, мне так же не ясно.

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

 

 

по одной универсальной удалялке на каждый левелчейнжер

А комп ты тоже каждый день новый себе берешь? по компу на день работы, а то на второй день он не годится же, почему-то.

 

 

 

if sobj.parent_id == v then remove_sobj[ sobj.id ] = sobj

Вот до этого момента все норм.

Сам этот момент - ахтунг полнейший. Не надо быть специалистом, чтобы понять бредовость засовывания ссылки на юзердату - в таблицу, и потом в цикле for пытаться еще что то с этой юзердатой делать.

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

 

 


 

 

некоторые функции для работы с таблицами тоже в циклах фо того

Вообще то все вроде просто. Нельзя ничего делать с ключами-значениями цикла for. вот то что у тебя является k, v - не удалишь, к nil не приравняешь и т.д.

а sobj.id это просто число, с которым мы собственно ничего и не делаем. просто получаем по нему объект и уже его удаляем.

 

 

 

к тому же зачем перебирать все 65534 для идентификации лч, когда у каждого есть сид,

Вообще-то не у каждого, даже в оригинале.

  • Спасибо 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
Сам этот момент - ахтунг полнейший. Не надо быть специалистом, чтобы понять бредовость засовывания ссылки на юзердату - в таблицу, и потом в цикле for пытаться еще что то с этой юзердатой делать.

 

@Zander_driver,  вот, честное слово, не понял тут ахтунга.

Всё работает, как часы. Можешь сам проверить.

 

Хотя можешь и не проверять, а открыть файл bind_smart_terrain.script и в методе net_spawn увидишь

 

db.add_smart_terrain( self.se_smart_terrain )

 

Затем открой файл db.script.  Дальше, надеюсь всё и так ясно.

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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