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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

@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

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

@Карлан, Я просто боюсь ерись сморозить, ну да ладно. Можно ли так, перед сохранением проверить не совпдает ли 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 ядер, 32 потока, 5.75 ГГц); 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
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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