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

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


Halford

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

Здравствуйте.

Каким образом можно поднять живого npc над поверхностью локации? Для actor есть возможность изменять координаты через set_actor_position, для npc я такой функции не нашел... set_const_force применить к живому npc тоже нет возможности, так как у живого npc:get_physics_shell() == nil :(

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu не знаю почему, но не получилось даже с примером из m_netpk > readme_m_netpk.txt:

У меня версия ТЧ 1.0004. Файлы из архива я разложил по папкам, дописал в конце функции start_game_callback в _g.script строку: m_netpk.attach(), тестирую так:

 

Полный код функции  test_abstract() из readme_m_netpk.txt скопировал в amk_mod.script, и вызываю ее из функции restore_sun(), где выводится сообщение от команды AMK TEAM при старте новой игры, но вентилятор не переносится :(

 

Хотя условия "if sobj then" и "if pk:isOk() then" выполняются - я проверил. Пробовал еще второй вариант с установкой колбэка с функцией, что есть в коде, но тоже не помогло :(

@Kirgudu , status для обоих вариантов тоже имеет значение true :(

Как еще можно найти возможную причину?

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

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu ,вы про:

Цитата

Для уже существующих объектов в игре:
     требуется после задания изменений свойст объекта, перевести объект в оффлайн и обратно в онлайн, что модулем делается автоматически.
     Изменения вступят в силу в момент выхода объекта в онлайн.

?

 

Я делал несколько тестов: вызывал функцию test_abstract() из бункера и возле Волка, так же после этого сохранялся и загружал это сохранение, но вентилятор все равно на месте...

 

Возможно, я не совсем понимаю, что нужно сделать, чтобы изменить статус :unknw:

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

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver ,@Kirgudu , у меня версия ТЧ 1.0004 работает стабильно, а с более новыми патчами иногда бывают вылеты :(

 

В readme_m_netpk версия 1.0004 вроде подходит

Цитата

    Заметки:
    - Версии нет-пакетов: ТЧ/ЧН/ЗП (SHoC/CS/SCoP), патч для ТЧ: 1.0004 и выше.

 

9 часов назад, Zander_driver сказал:

Это не имеет никакого отношения к уводу объектов в оффлайн и затем в онлайн.

 

то есть, переключить примерно так нужно:

alife():set_switch_offline(obj.id, true)
test_abstract()
alife():set_switch_online(obj.id, false)

?

 

1 час назад, Kirgudu сказал:

@div, нет, я писал про пункты 1), 2) и 3) чуть пониже процитированной строки.

Понятно, значит нужно еще файл se_item.script проверить / изменить.

 

Пока буду с этим разбираться, хочу спросить, если через m_netpk изменить position npc, чтобы он был выше поверхности карты и не стоял на каком-то объекте, его гравитация будет в ходе игры снижать, чтобы он опустился на поверхность, или же он застынет на измененных координатах и будет висеть в воздухе? Если первый вариант, то чтобы он завис в воздухе, менять координаты придется через update, как я понимаю?

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

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, у OGSR системные требования, как я понял, выше :(

 

ТЧ 1.0004 даже на старом железе без тормозов работает.

 

@Kirgudu, @Zander_driver, несколько раз перечитал readme_m_netpk, и если правильно понял, то менять статус объекта (или npc) online / offline не нужно?

 

Отталкиваюсь от части:

Цитата
При спавне нового игрового объекта:
	 изменения вступят в силу, как только мы выйдем из текущей скриптовой работы и управление вернется движку - он создаст объект и начнет записывать в него параметры.

...

Для уже существующих объектов в игре:
	 требуется после задания изменений свойст объекта, перевести объект в оффлайн и обратно в онлайн, что модулем делается автоматически.
	 Изменения вступят в силу в момент выхода объекта в онлайн.

 

 

или я не правильно понял эту часть?

  • Сочувствую 1

Поделиться этим сообщением


Ссылка на сообщение
7 часов назад, Kirgudu сказал:

Для NPC - скорее se_stalker.script

 

у меня загвоздка еще с примером из readme, с перемещением trader_ventilyator_0000, как указано в test_abstract()

 

Не совсем понял, как применить пункты 1), 2) и 3) из раздела "Как получить возможность менять абстрактную часть пакетов?"

или trader_ventilyator к этому не имеет отношения? Если да, то я совсем не понимаю, почему после вызова test_abstract() не происходит перемещение вентилятора... :to_take_umbrage:

Поделиться этим сообщением


Ссылка на сообщение
6 минут назад, Zander_driver сказал:

А установить-запустить, пробовал?

 

пробовал два раза, у меня перезагрузка системного сразу после запуска... Списал это на старое железо, позже, как разберусь с m_netpk, посмотрю по совету @mole venomous другие версии. Сейчас ищу проблему, почему даже тестовый пример из m_netpk у меня не работает...

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, блок питания с запасом, кулер по тестам тоже держит температуру, скорее всего дело в процессоре, который старенький и еще видеокарты нет, так что отдувается за всех... Планировал обновить сборку, но с ситуацией на железо в предыдущее года желание отпало :(


Скажите, пожалуйста, в чем может быть причина, что после вызова test_abstract(), код которого приведен в readme:

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


function test_abstract()
	--/ Переносим вентилятор из каморки Сидоровича на тумбочку в подвальчике деревни новичков (на Кордоне)
	local sobj = alife():object("trader_ventilyator_0000") --/ находим в игре серверный объект вентилятора
	if sobj then --/ нашли?
		local pk = get_netpk(sobj,0) --/ или m_netpk.net_cse_abstract(sobj)
		if pk:isOk() then
			local vPos = vector():set(-212.8,-22.28,-127.20) --/ координаты 'на тумбочке в подвальчике'
			local vDir = vector():set(0,3.14,0) --/ направление: 'лопастями от стены'
			--/ var-1: установка колбэка с таблицей
			local status = pk:setCallback( { position = vPos, direction = vDir } )
			--[[ --/ var-2: установка колбэка с функцией
			local status = pk:setCallback( function(data)
				data.position  = vPos --/ change property 'position' in 'cse_abstract'
				data.direction = vDir --/ change property 'direction' in 'cse_abstract'
			end )
			--]]
		end
	end
end


 

вентилятор не меняет своего положения?

 

 

Поделиться этим сообщением


Ссылка на сообщение
3 минуты назад, Zander_driver сказал:

а какое железо если не секрет?

 

Процессор Intel Pentium G3250, 4 ГБ DDR, 1 ТБ HDD

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver возможно, если на чистой системе будет работать... У меня почему ТЧ стабильно работает только с патчем 1.0004, хотя пробовал разные по очереди ставить с переустановкой самой ТЧ...

@Zander_driver, @Kirgudu,

 

2 часа назад, Kirgudu сказал:
5 часов назад, Zander_driver сказал:

Но, что при этом отвалится в логике НПС? Любопытный вопрос, на который у меня нет ответа. Но памятуя о том, что в коде обслуживающем действия НПС, обращения к АИ-сетке встречаются на каждом шагу, подозреваю что будут проблемы.

Тоже не знаю. Убирал флаги перехода в оффлайн у БТР, сбрасывал какие-то флаги у физ. объектов - проблем не было. НПС спавнить в воздухе в голову не приходило.

 

У меня не как :(

В se_stalker.script я дописал: if self.cb_netpk then self.cb_netpk(self, packet) end в нужное место...

 

Скрытый текст
function clear_useful_for_ai(sobj)
  local pk = get_netpk(sobj, 1)				-- [m_netpk] прочитать нетпакет
  local data = pk:get()							-- [m_netpk] вывести данные в таблицу
  data.object_flags = bit_xor(data.object_flags, 8)		-- двоичное сравнение и сброс флага "интерактивно" на 0 (позиция 8 или 2^3 справа налево: …1xxx или …0xxx –> …0xxx)
 
  data.object_flags = bit_or(data.object_flags, 8)			-- то же для поднятия флага при любых исходных значениях
  pk:set(data)									-- [m_netpk] записать данные в нетпакет по измененной таблице
end
 
function test_abstract_npc()
  local sobj = alife():create("esc_unik_npc", vector():set(-218.20, -20.2, -145.63), 35362, 47)
 
  clear_useful_for_ai(sobj)
 
  if sobj then --/ нашли?
    local pk = get_netpk(sobj, 0) --/ или m_netpk.net_cse_abstract(sobj)
    if pk:isOk() then
      local vPos = vector():set(-218.20, -20.2 + 10, -145.63)
      local vDir = vector():set(0, 3.14, 0)
      --/ var-1: установка колбэка с таблицей
      local status = pk:setCallback( { position = vPos, direction = vDir } )
    end
  end
end

 

 

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, @Zander_driver, какие еще есть "подводные камни"? Условие 1) и 2) тоже выполнено, код вроде полный...

P. S. @Kirgudu, спасибо Вам за код, изучаю...

28 минут назад, Kirgudu сказал:

Имхо, технических сведений вполне достаточно, может просто не хватило внимательности при реализации.

 

@Kirgudu, да, Вы правы, я se_physic не додумался правильно отредактировать в тот момент, сейчас поправил, работает...

С npc правда пока код не работает, хотя se_stalker.script соответствует требованиям пунктов 1), 2) и 3)

 

1 час назад, div сказал:
  код (Скрыть)

function clear_useful_for_ai(sobj) local pk = get_netpk(sobj, 1) -- [m_netpk] прочитать нетпакет local data = pk:get() -- [m_netpk] вывести данные в таблицу data.object_flags = bit_xor(data.object_flags, 8) -- двоичное сравнение и сброс флага "интерактивно" на 0 (позиция 8 или 2^3 справа налево: …1xxx или …0xxx –> …0xxx) data.object_flags = bit_or(data.object_flags, 8) -- то же для поднятия флага при любых исходных значениях pk:set(data) -- [m_netpk] записать данные в нетпакет по измененной таблице end function test_abstract_npc() local sobj = alife():create("esc_unik_npc", vector():set(-218.20, -20.2, -145.63), 35362, 47) clear_useful_for_ai(sobj) if sobj then --/ нашли? local pk = get_netpk(sobj, 0) --/ или m_netpk.net_cse_abstract(sobj) if pk:isOk() then local vPos = vector():set(-218.20, -20.2 + 10, -145.63) local vDir = vector():set(0, 3.14, 0) --/ var-1: установка колбэка с таблицей local status = pk:setCallback( { position = vPos, direction = vDir } ) end end end

function clear_useful_for_ai(sobj)
  local pk = get_netpk(sobj, 1)				-- [m_netpk] прочитать нетпакет
  local data = pk:get()							-- [m_netpk] вывести данные в таблицу
  data.object_flags = bit_xor(data.object_flags, 8)		-- двоичное сравнение и сброс флага "интерактивно" на 0 (позиция 8 или 2^3 справа налево: …1xxx или …0xxx –> …0xxx)
 
  data.object_flags = bit_or(data.object_flags, 8)			-- то же для поднятия флага при любых исходных значениях
  pk:set(data)									-- [m_netpk] записать данные в нетпакет по измененной таблице
end
 
function test_abstract_npc()
  local sobj = alife():create("esc_unik_npc", vector():set(-218.20, -20.2, -145.63), 35362, 47)
 
  clear_useful_for_ai(sobj)
 
  if sobj then --/ нашли?
    local pk = get_netpk(sobj, 0) --/ или m_netpk.net_cse_abstract(sobj)
    if pk:isOk() then
      local vPos = vector():set(-218.20, -20.2 + 10, -145.63)
      local vDir = vector():set(0, 3.14, 0)
      --/ var-1: установка колбэка с таблицей
      local status = pk:setCallback( { position = vPos, direction = vDir } )
    end
  end
end

 

 

 

Поделиться этим сообщением


Ссылка на сообщение

я наверно не тот флаг снимаю :facepalm:

data.object_flags = bit_xor(data.object_flags, 128)

data.object_flags = bit_or(data.object_flags, 128)

 

так же должно быть?

Поделиться этим сообщением


Ссылка на сообщение
7 минут назад, Kirgudu сказал:

Или так, наверное. Только что-то одно.

 

Пробовал через bit_xor с bit_or и  bit_and как Вы написали, но пока не дало результата... Копаю дальше...

6 минут назад, Zander_driver сказал:

Для начала попробовать на совершенно простейшем объекте. Аптечке там

 

Аптечки (II_MEDKI) в class_registrator.script у себя не нашел, и честно, не знаю как их там прописывать (знаний маловато для этого)

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, класс есть, но в se_item.script нужно к чему обращаться? se_... Не к identity_immunities же? se_medkit?

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

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, он требует минимум if self.cb_netpk then self.cb_netpk(self, packet) end в методе STATE_Write... Просто я не знаю, что для аптечек нужно использовать в se_... Пробовал на костюме, там понятно что писать нужно в se_outfit:STATE_Write(packet)

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

data.object_flags = bit_and(data.object_flags, bit_not(128)) -- сброс UsedAI_Locations 

 

вместо:
 

data.object_flags = bit_xor(data.object_flags, 128)

data.object_flags = bit_or(data.object_flags, 128)

 

экзоскелет (exo_outfit) реально падает, в то время как вариант с xor + or он практически сразу же лежит на поверхности карты....

 

@Zander_driver, @Kirgudu,можно ли сказать в таком случае, что если каким-то образом зафиксировать data.object_flags, то костюм будет висеть в воздухе? Я так понимаю, смотреть в сторону update не стоит, нужен искать способ, как заморозить это значение?

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, @Kirgudu, то есть, с npc проблема, что они анимацмей управляются? Хочешь npc, который над локацией, нужно как-то с анимацией это химичить?

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, нет возможности такую создать, или нет в игре? Я просто с анимациями в этой игре еще работал, но если принцип схож с общими правилами для разных игр, то должна быть родительская кость, которая определяет положение в пространстве...

@Zander_driver, @Kirgudu, кстати, а вентилятор из примера спокойно зависает в воздухе без всяких изменений флагов, пока ГГ его не затронет...

 

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

screen.jpg

 

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, @Kirgudu, подскажите, ранее была информация, о том, что изменяет m_netpk можно менять по HEX значению. Я так понимаю, речь про смещение в памяти? Можно узнать, как вычислить это смещение? Хочу попробовать заморозить значение этой ячейки памяти через сторонние программы, и проверить, упадет тогда объект или нет? :)

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

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, нашел тему про X-Ray Extensions.

 

Цитата

Версии игры, поддерживаемые на данный момент:
ТЧ (патч 1.0006): xrGame.dll, XR_3DA.exe, xrRender_R1/2

 

:WhiteVoid_2:  что-то с версиями как-то не везет...

 

Цитата

Прочитал из объекта тыщу разных чисел и сидишь разбираешься что есть что, для чего, и куда... я в 2014-16 году с этим наигрался.

 

Я пытался найти ячейки в памяти отвечающие за значение координат объекта (например, obj:position().x), но не смотря на то, что искал через условия ">" и "<", так как это не целые числа, найти конкретную ячейку не получилось.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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