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

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

44 минуты назад, Stalkersof сказал(а):

Алгоритм подскажите.

Когда перебираешь 65к серверных объектов, проверяя для каждого, сталкер ли он, и жив ли он, проверяй для каждого объекта, на какой локации он находится. Сделать это можно, по гейм-вертексу его.

  • Спасибо 1
  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

Ссылка на комментарий
1 час назад, Stalkersof сказал(а):

Я хотел респавн сделать.

Поставь на локации респавнер и смарт-террайн, и будет у тебя там респавн.

  • Нравится 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Доброго времени суток. Вопрос к знатокам. Есть ли у кого любой скрипт воровства вещей из ящиков на ТЧ (даже самый примитивный). Буду премного благодарен.

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

Здравствуйте. Можно ли менять направление полёта ворон скриптово? Надо чтобы до выброса (около 1 минуты) вороны начинали летать строго на юг.

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

В продолжения скрипта проверки нпс на локации. В общем не получается не могу понять как получить гейм-вертекс. Скрипт валиться на локальной переменной obj нил валуе.

 

function get_level_nps()
--if level.name() ~= "l12u_control_monolith" then return end
	for i=1,65535 do
		local sobj = alife():object(i)
		if sobj then
		local obj = level.object_by_id(sobj.id)
			if IsStalker(sobj) and sobj:alive() and obj:game_vertex_id() == 2482 then
			    --news_manager.send_tip(db.actor,obj)
			    return true
			end	
		end
	end
	return false
end

Может подскажите что не так то.

Ссылка на комментарий
Только что, Stalkersof сказал(а):

local obj = level.object_by_id(sobj.id)

Что-то ме подсказывает что id тут лишнее попробуй так

local obj = level.object_by_id(sobj)

 

  • Спасибо 1
  • Не согласен 1
Ссылка на комментарий
54 минуты назад, ted.80 сказал(а):

Что-то ме подсказывает что id тут лишнее попробуй так

Не надо так делать, в том варианте должно быть именно sobj.id.

А так гейм вертекс можно (и нужно в данном случае) получать уже из серверного объекта:

local sobj = alife():object(i)
if sobj and sobj.m_game_vertex_id == 2482 and IsStalker(sobj) and sobj:alive() then
    return true
end

И ещё: почему только 2482? Других вертексов на нужной локации нет?
Имхо, лучше из гейм вертекса получать id локации и проверять уже его совпадение с нужным:

function get_level_nps()
	local al, gg = alife(), game_graph() -- многократно используемые функции кешируем для производительности
	for i=1,65535 do
		local sobj = al:object(i)
		if sobj and gg:vertex(sobj.m_game_vertex_id):level_id() == XXX and IsStalker(sobj) and sobj:alive() then -- вместо XXX подставить Id локации (не путать с наименованием)
			return true
		end
	end
	return false
end

Или, чтобы не вызывать лишние функции, сравнивать sobj.m_game_vertex_id с диапазоном значений - больше одного и меньше другого:

if sobj and sobj.m_game_vertex_id >= XXX and sobj.m_game_vertex_id <= YYY and IsStalker(sobj) and sobj:alive() then -- вместо XXX и YYY подставить граничные гейм вертексы локации
	return true
end

 

Изменено пользователем Kirgudu
  • Спасибо 1
  • Согласен 1
  • Полезно 2
Ссылка на комментарий
2 часа назад, Kirgudu сказал(а):

Имхо, лучше из гейм вертекса получать id локации и проверять уже его совпадение с нужным:



function get_level_nps()
	local al, gg = alife(), game_graph() -- многократно используемые функции кешируем для производительности
	for i=1,65535 do
		local sobj = al:object(i)
		if sobj and gg:vertex(sobj.m_game_vertex_id):level_id() == XXX and IsStalker(sobj) and sobj:alive() then -- вместо XXX подставить Id локации (не путать с наименованием)
			return true
		end
	end
	return false
end

Вроде такой вариант работает. Во всяком случае все условия выполняются. Проверил нпс находит. Вылета тоже нет. Ид локации взял из game_levels.ltx Правильно? 

Да еще такой вопрос мне надо осознанца отсеять. С Серверного объекта секцию можно нпс получить?

 

Изменено пользователем Stalkersof
  • Нравится 1
Ссылка на комментарий
Только что, Stalkersof сказал(а):

С Серверного объекта секцию можно нпс получить?

sobj:section_name() же. Как и всегда)

2 часа назад, ted.80 сказал(а):

Что-то ме подсказывает

А название метода

2 часа назад, ted.80 сказал(а):

object_by_id

не подсказало, что .id там быть - ДОЛЖНО ?

Плохо, что не подсказало :(

  • Спасибо 1
  • Нравится 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

 

Скрытый текст

function PdaWindow:InitControls()
    self.stat = CUIStatic()
    self.stat:Init(0,0,1024,768)
    self.owner:AttachChild(self.stat)
    local xml = CScriptXmlInit()
    xml:ParseFile("inventory_new.xml")

    local actor = db.actor
    self.player_dialog = xml:InitStatic("player", self)
    self.player_community = xml:InitStatic("player:community", self.player_dialog)
    self.player_community:SetText(game.translate_string(actor:character_community()))
end

Как узная имя группировки гг?

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

@ARTLantist 

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

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

@AndreySol 

for i=1,65535 do
     local s = sim:object(i)
     if s then
         local obj = level.object_by_id(s.id)
         if obj  then
             local camp = o:get_campfire()
             if camp and obj:position():distance_to(db.actor:position()) < 5 then
			 	...нужные действия и куча end...
        

такой вариант кода пойдёт? Просто меня смущает огромный цикл с перебором всех симуляционных объектов... Мб его можно было бы чем-то заменить?

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

@ARTLantist 

Что такое "o:get_campfire()"?

Цитата

Мб его можно было бы чем-то заменить?

Я ж написал - от ситуации зависит. Если действие проверки привязано к конкретному костру - лучше плясать от костра. Если нужно проверять на наличие любого костра рядом, тогда перебором, код в принципе пойдет, только разобраться что есть такое "o:get_campfire()"?

Ссылка на комментарий
Только что, ARTLantist сказал(а):

Мб его можно было бы чем-то заменить?

Заменить можно, но муторно.

Можно прикрепить к кострам скриптовый биндер, при входе в онлайн объекта, из биндера регистрировать его в некой таблице.

И тогда ваш цикл будет перебирать не 65к объектов, а только объекты в этой таблице, т.е. костры.

  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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