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

Справочник по функциям и классам

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

IQDDD,

Как работает level.vertex_in_direction? Конкретно алгоритм действия движка.

а луну с неба? Нужен алгоритм - дизассемблер в руки и вперёд =)

 

Что непонятно то с этой функцией? Выдаёт вертекс под точкой.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Можно представить любую локацию как карту с графом, где вершины - level vertex'ы. С исходным вертексом и направлением более-менее понятно. А вот с третьим параметром не очень. Возможно, что движок тупо отсчитывает от данного в вертекса в таком-то направлении такое-то расстояние и выбирает ближайший к получившейся точке level vertex. Тогда вызов level.vertex_in_direction(lv,dir,dis) в модуле level эквивалентен:

function vertex_in_direction(lv,dir,dis)
local pos=vertex_position(lv)
dir=dir:normalize()
pos:add(dir*dis)
return position_to_vertex(pos) -- где position_to_vertex(pos) возвращает ближайший к точке pos level vertex.
end

Я прав?

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

IQDDD,

Возможно, что движок тупо отсчитывает от данного в вертекса в таком-то направлении такое-то расстояние и выбирает ближайший к получившейся точке level vertex.

Так и есть. Я подробно алгоритм поиска вертекса не исследовал, но вроде как координата Y (вертикальная) игнорируется. Кроме того, если под точкой сетки нет, то всё равно возвращается какой-то вертекс, ближайший или нет - не знаю.

В ЗП, кстати, есть функция, которая просто возвращает вертекс по координатам без всей этой возни со стартовым вертексом, направлением и расстоянием. Хотя знак равенства между этими функциями я бы не ставил. Если думать о том, как этот алгоритм может быть реализован, то можно прийти в выводу, что функция эта весьма затратная, поскольку вертексов может быть под миллион и больше. vertex_in_direction возможно ищёт от текущего и на этом экономит, а как работает та функция из ЗП - могу только догадываться.

 

И ещё. Граф уровня - это никакой не граф. Сетка уровня - это попросту невидимая поверхность, состоящая из мелких строго прямоугольных клеточек одинакового размера, натянутая на геометрию. Если актор и физические объекты взаимодействуют с реальной геометрией, то неписи ходят вот по этой невидимой поверхности. Это просто кажется, что они ходят по реальной геометрии. Процесс компиляции сетки собственно и заключается в том, чтобы создать такую поверхность, совмещённую с реальной геометрией.

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий
В ЗП, кстати, есть функция, которая просто возвращает вертекс по координатам

Если думать о том, как этот алгоритм может быть реализован, то можно прийти в выводу, что функция эта весьма затратная, поскольку вертексов может быть под миллион и больше. vertex_in_direction возможно ищёт от текущего и на этом экономит, а как работает та функция из ЗП - могу только догадываться.

Сложность можно оценить по бардаковским исходникам - в сталкере думаю точно такая же функция используется.

Например, функция xr_level_ai::vertex_id в xr_level_ai.cxx. Левел-вертекс ищется двоичным поиском - поэтому на миллионе вертексов итераций будет максимум 20 :) Причем в самих итерациях только сравнение и все.

Так что функция получается быстрая - собственно такой формат аи-сетки для этого и делали :)

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

Здравствуйте! Возникли небольшие идеи переделки ПДА, но само построение его я не смог найти в скриптах, подскажите пожалуйста кто знает в каком скрипте можно отредактировать ПДА, если есть такой ...

Возможно глупый вопрос, возможно я тупанул но интересует очень ...

 

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

Byurrer походу скриптов ПДА нет, я всё перерыл, не одного упоминания можеш подредактировать XMLки в config=>ui=>все начинающиеся pda

Ссылка на комментарий
Так что функция получается быстрая - собственно такой формат аи-сетки для этого и делали smile.gif

А какой это "такой формат аи-сетки"? И что значит двоичный поиск?

 

Если думать о том, как этот алгоритм может быть реализован, то можно прийти в выводу, что функция эта весьма затратная, поскольку вертексов может быть под миллион и больше.

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

Ссылка на комментарий
TRAMP14, да с xml то это понятно, но нужна сама начинка ПДА!

Вскрывай движок и редай. Я перерыл все скрипты и конфиги - упоминания нет (искал в отдельности - рамку, контакты и тп). Следовательно всё это добро выводит движок. Или есть вариант что у меня не Сталкер ТЧ а Контр-Страйк

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

Kolmogor,

Левел-вертекс ищется двоичным поиском - поэтому на миллионе вертексов итераций будет максимум 20 :) Причем в самих итерациях только сравнение и все.

Так что функция получается быстрая - собственно такой формат аи-сетки для этого и делали :)

Ну может быть. Типа заранее отсортировать по X, затем по Z, затем по Y. Но тогда должен возникать побочный эффект. Если не нашли узел точно, то будет найден не ближайший, а первый в ряду, т.е. скорее всего ближайший по X (или может Z), находящийся с краю локации. Надо будет при случае проверить.

 

IQDDD,

А какой это "такой формат аи-сетки"?

Там просто линейный массив из всех узлов. Каждый узел представляет собой два целых числа - это так хранятся координаты в упакованном виде. Смысл в том, что вся сетка вписана в прямоугольный параллелепипед (бокс по-простому). На высоту даётся 2 байта, т.е. по высоте имеется ровно 65536 уровней, соответственно, разрешение сетки по высоте определяется как <высота бокса> / 65536. По X и Z задаётся примерно постоянный шаг (что-то около 0.25 игровых метра, хотя вроде это можно менять). Соответственно, может быть Nx = <сторона по X> / 0.25 и Nz = <сторона по Z> / 0.25 возможных координат по каждой оси, а всего Nx * Nz, но не больше, чем влазит в 24 разряда. Теперь обе координаты X и Z пакуются в одно целое в 24 бита. Дальше все эти элементы - упакованная Y и XZ, дополнительная информация по укрытиям и привязке к узлам графа - всё сохраняется в виде линейного массива в файлах. По всей видимости ещё и отсортировано заранее.

 

И что значит двоичный поиск?

Двоичный поиск

 

 

Byurrer,

да с xml то это понятно, но нужна сама начинка ПДА!

Всё это внутри движка.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Byurrer

Обязательно ковырять движок. Для не сложным модификаций можно создавать кнопки, картинки и т.д. в пда через скрипты

 

Раз уж отписался, то не знаете, есть ли функция закрытия/открытия инвенторя(пда)?

Изменено пользователем _Призрак_

Freedom

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

Kolmogor,

malandrinus

 

Извените за оф топ но

Возможно-ли чисто теоритически построение 3D АИ-сетки?

 

Базовые ноды на земле имеют соединение (утрирую) вперед, назад, лево, право, верх.

Второй уровень вперед, назад, лево, право, верх, низ .

3 уровень вперед, назад, лево, право, верх, низ и.т.д.

получается один столбик но таких столбиков может быть столькоже сколько и нодов на земле (террейне)

Впринципе можно добавить соединение по диоганали с соседних уровней сетки.

 

Справятся с таким средние по современным меркам PC?

 

 

Еще раз извеняюсь за оф топ.

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

_Призрак_,

есть ли функция закрытия/открытия инвенторя(пда)?

вроде нет.

AKKK1,

Возможно-ли чисто теоритически построение 3D АИ-сетки?

Посчитай сам, сколько потребуется памяти на такую сетку. Да и зачем? Сетка нужна для "навигации" неписей по земле. Навигация в пространстве требует совершенно другого подхода.

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

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий
есть ли функция закрытия/открытия инвенторя(пда)?

Вот так я закрывал окно торговли

--// поставить вызов OnTrade(info_id)  в начало функции actor_binder:info_callback(npc, info_id)  - файл bind_stalker.script

local UITradeWnd

function OnTrade(info_id)
   if info_id =="ui_trade" then
   UITradeWnd = level.main_input_receiver()
   elseif info_id == "ui_trade_hide" then
   UITradeWnd = nil
   end
end

--// вызов функции закрывает окно торговли - можно ставить куда угодно -хоть на апдейт
function HideTradeWnd()
    if UITradeWnd then 
    UITradeWnd:GetHolder():start_stop_menu(UITradeWnd, true)
    end 
end

Если вместо инфопоршней на открытие\закрытие окна торговли указать инфопоршни на открытие\закрытие пда -"ui_pda" и "ui_pda_hide - или окна инвентаря - ui_inventory\ui_inventory_hide - будет тоже самое.

TRAMP14

Движком - но вполне поддается редактированию в конфиге. Например можно сделать, чтобы шкала заполнялась\убывала не горизонтально, а вертикально, размеры поменять, координаты, и т.д . Вот с цветом вроде никак.

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

Ни кто не в курсе, рабочий ли метод move_to(const vector&, const vector&) из класса партиклов? Я попробовал его применить:

Particle:move_to(vector():set(-210,-20,-142), vector():set(-244,-24,-133))

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

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

Stalk15,

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

 

Если кто сможет выяснить условия работы этого метода - обязательно отпишитесь здесь.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

У меня такой вопросик:

 

Как функция can_switch_online() работает для смартов? Проверяет наличие NPC из смарта в онлайне или вызывает для них такую же функцию? Или как-то ещё?

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

Функции can_switch_online/offline по идее определяют возможность перехода в онлайн/оффлайн самого объекта. Как это будет в данном случае влиять на неписей, приписанных к смарту, понятия не имею.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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