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

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

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

10 минут назад, div сказал:

Intel Pentium G3250, 4 ГБ DDR

Вообще-то, не так уж и плохо. У меня в команде тестеров были ребята с железом послабее, и у них мод на базе OGSR работал.

Хотя это около минимальной для него планки... но запускаться и работать он должен.

 

По нетпакету к сожалению не подскажу. Я эту версию модуля Артоса уже не использовал. Сидел на более ранних-древних, а потом уже на OGSR пересел.

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

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

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

@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

 

 

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

@div готовый тестовый пример с вентилятором:
https://disk.yandex.ru/d/T2v4KZ0WfBOp4g
Внутри сейвы у Сидоровича и в подвале деревни после переноса (сделаны на Steam версии ТЧ, поэтому скорее всего не загрузятся), скриншоты для визуального подтверждения.

Для лёгкости понимания вставок упаковал 2 папки: оригинальную из Steam-версии и уже с изменениями. WinMerge или аналог покажет разницу между изменёнными файлами.

Не мудрствуя лукаво, повесил запуск телепорта вентилятора на апдейт актора, через 10 секунд после первого апдейта (чтобы успеть сбросить начальный ролик и увидеть телепорт глазами).
Дальше самостоятельно, код писать больше не буду. Имхо, технических сведений вполне достаточно, может просто не хватило внимательности при реализации.

  • Спасибо 1
  • Нравится 3
Ссылка на комментарий

@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

 

 

 

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

@div, ну тут одно из двух: либо дьявол в неучтённых мелочах, либо, как мы раньше писали, для NPC это не сработает.
Изучать и экспериментировать.

Ссылка на комментарий
10 минут назад, div сказал:

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

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

Полный список флагов можно посмотреть в том же m_netpk в конце файла, где "_G.object_flags = ..." и далее.

  

10 минут назад, div сказал:

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

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

Изменено пользователем Kirgudu
Ссылка на комментарий
10 минут назад, Kirgudu сказал:

либо, как мы раньше писали, для NPC это не сработает

Вообще я бы предложил. Для начала попробовать на совершенно простейшем объекте. Аптечке там или пачке патронов.

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

Подозрения что живого NPC оторвать малой кровью от AI-сетки, нельзя - очень сильны.

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

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

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

 

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

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

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

 

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

Ссылка на комментарий
18 минут назад, div сказал:

не знаю как их там прописывать

А зачем прописывать новый класс? Аптечка в игре и так уже есть. И пачка патронов есть. Можно и любой другой простой тип объекта.

В class_registrator ничего прописывать для этого не надо, классы объектов указаны в их конфиге.

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

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

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

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

Так, стоп. А разве Артос-модуль обязательно требует скриптового биндера серверного класса? se_...что-то там, для него обязательны?

Насколько помню, древние версии работали и без этого. Но возможно Артос уже после такое требование накрутил...

@Kirgudu прокомментируй?

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

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

@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 не стоит, нужен искать способ, как заморозить это значение?

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

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

Для этого надо не только отключать привязку к AI-сетке, но и отключать для него физику, что делает другой флаг (не скажу какой, у меня это получалось манипуляциями в движке, но доступный скриптово флаг для этого вроде тоже существует). При включенной физике объект упадет. При выключенной - на пули и другие коллизии он реагировать не будет тоже.

 

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

self.cb_netpk(self, packet)

А что внутри этого метода? Он ведь добавленный. В оригинале игры нет такого.

  • Нравится 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 час назад, Zander_driver сказал:

прокомментируй

Ну конечно. Иначе как раз переключение оффлайн-онлайн работать не будет.
А class_registrator в большинстве случаев нужен только затем, чтобы посмотреть, какой биндер и где искать.

1 час назад, div сказал:
data.object_flags = bit_xor(data.object_flags, 128)
data.object_flags = bit_or(data.object_flags, 128)

Потому что вызов данных команд в паре приводит к исходному положению дел. Ведь даже в комментарии поста

сказано, что первая - сброс флага, тогда как вторая - поднятие оного. В итоге флаг привязки к сетке после парного выполнения остаётся установленным.


Аптечки... честно говоря, не помню, есть ли у них биндер в принципе.

Изменено пользователем Kirgudu
Ссылка на комментарий
1 минуту назад, Kirgudu сказал:

Иначе как раз переключение оффлайн-онлайн работать не будет.

Ээм, а почему?

Оно же делается методами-флагами самого sobj-объекта. Во всяком случае, так можно сделать и в серверном биндере оно нуждаться не будет.

 

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

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

@Zander_driver, оговорился.
Не будет работать запись в абстрактную часть пакета, которая возможна только при выходе в онлайн. А это - STATE_Write.

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

В общем, если собрать увод объекта в оффлайн ручками самостоятельно, и возврат оттуда также ручками самостоятельно, то от ряда приблуд поздних Артосо-модулей, и от требований к class_registra-ции, можно избавиться.
Но работу с оффлайн-онлайн переходами придется писать самостоятельно в этом случае.

Только что, Kirgudu сказал:

А это - STATE_Write.

Но это ведь базовый метод, который можно вызывать у любого серверного объекта.
Зачем скриптовые биндеры?

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

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

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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