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

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

@Kirgudu, Уже понятнее, спасибо.

А как мне этот массив получить то сначала?

 

Вот заспавнены у меня на уровне, в разных местах, скажем 15 объектов секции [safemarker].

  • Полезно 1

---------------------------------

www.amk-zone.de

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

@Карлан, Да там фигня какая-то получается. В point_projection(point) координаты точки экрана высчитываются. Я LOG засунул в скрипт и значения в логе получил.

Но вот здесь должны считаться координаты

                    local p_coord = point_projection(npc_base_pos)
                    local Xcoord = p_coord.x
                    local Ycoord = p_coord.y

А они не считываются. Xcoord и Ycoord почему-то равны nil

    return {x, y} в point_projection(point) должна вернуть координаты, а она этого не делает... Или я не так их пытаюсь получить.

  • Полезно 1

Шаман - СисАдмин

Всяко-разно: для ЧН

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

@Romz, в таблице p_coord нет элементов с индексами "x" и "y". Напиши так

                    local Xcoord = p_coord[1]
                    local Ycoord = p_coord[2]
Изменено пользователем Charsi
  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

А как мне этот массив получить то сначала?

Вот заспавнены у меня на уровне, в разных местах, скажем 15 объектов секции [safemarker].

Это уже зависит от задач и окружения.

Можно перебрать все онлайновые объекты в db.storage, получить их секцию и сравнить с нужной.

Можно вообще все серверные объекты перебрать (alife():object(i), где i = от 1 до 65534), только позицию у таких объектов надо будет брать не методом position(), а в свойстве .position.

Но это затратные способы. Лучше организовать свою таблицу для таких объектов - такой вариант обсуждался здесь несколько страниц назад.

А вообще, в скриптах примеров навалом.

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

@Charsi, Я затупил, признаю. Поправил, теперь всё работает.


 

 

Romz, дублирую, математика там школьная, да. Скрипт приведенный тобою - плохой.
А видео, которое ты привёл, это что за мод? Или скрипт? Где его откопать, для посмотреть на предмет вывода метки на высоте роста непися...
  • Полезно 1

Шаман - СисАдмин

Всяко-разно: для ЧН

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

 

 

Я боюсь представить что у тебя за код в котором sub дает ощутимую нагрузку

local det_list = {} - табличка

заполняется табличка:

det_list[1][1] = "detector_simple_f"

det_list[2][1] = "detector_advances_f"

det_list[3][1] = "detector_elite_f"

получаем нужный кусок строки из этой таблички:

local set_sect = string.sub(det_list[2][1], 1, string.len(det_list[2][1]) - 2) - подтормаживание до 1.5 секунд.

Ссылка на комментарий
@UnLoaded, либо ты не все показал, либо у тебя что-то странное. Судя по использованию двух индексов, каждый элемент таблицы должен содержать таблицу, но не видно, что бы эти элементы инициализировались таблицами. Возможно lua сделает это за тебя, но кто знает, какие грабли в этом интеллекте будут. Я бы не надеялся на такой автоугадав.
Ссылка на комментарий

 

 

Возможно lua сделает это за тебя

Не сделает.

 

 

 

Насчет тормозов с string.sub - отбой, дело в другом оказалось...

А я только хотел сделать шах и мат :(.

 

@Romz, логично предположить что на своем канале я выкладываю свои работы, я тебе выше сказал что этот код я писал на ТЧ.

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

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

function point_projection(point, cfix)
--[[
взято с амк-форума
]]
local dev = device()
local scr_w = dev.width
local scr_h = dev.height

local fov2 = (dev.fov/2) * (math.pi/180)
local scr_dist = 0.5 * scr_h / math.tan(fov2)

local ppp = vector():sub(point, dev.cam_pos)
ppp.y = ppp.y + cfix -- поправка на высоту объекта
local dp = dev.cam_dir:dotproduct(ppp)

local x = 512 + dev.cam_right:dotproduct(ppp) * scr_dist / dp * (1024/scr_w)
local y = 384 - dev.cam_top:dotproduct(ppp) * scr_dist / dp * (768/scr_h)

return {x, y}
end
--Функция учитывает возможное разрешение экрана, режим зума и то, что камера может наклоняться. Можно использовать в различных целеуказателях.

 

function update_mark()
--Базовые параметры о ГГ
local cam_pos = device().cam_pos
local act_pos = db.actor:position()
local act_dir = device().cam_dir
local hud = get_hud()

--Убрать все метки если проигрывается катсцена или есть инфопорция "hide_all_ui_mark"
local hide_all_mark = false
if not db.actor:object("detector_fenix") or (act_pos:distance_to_sqr(cam_pos) > 4) or (has_alife_info("hide_all_ui_mark")) then
hide_all_mark = true
end

--Угол обзора ГГ
local fov = math.floor(device().fov+0.02)

--Функции обновления меток на экране
update_npc( act_pos, act_dir, fov, hud, hide_all_mark)
update_anom( act_pos, act_dir, fov, hud, hide_all_mark)
update_art( act_pos, act_dir, fov, hud, hide_all_mark)
update_monstr( act_pos, act_dir, fov, hud, hide_all_mark)
end

 

И, собственно, функция вывода метки объекта

function update_npc( act_pos, act_dir, fov, hud, hide_all_mark)
local index_mark = 1
local cfix = 1.7 -- поправка на высоту объекта

--Обновление/добавление меток НПС
if not hide_all_mark then
for id_base, npc_base_pos in pairs(npc_base_table) do
local dist = act_pos:distance_to_sqr(npc_base_pos)
if dist < 900 then
local npc_pos = vector():set(npc_base_pos.x,npc_base_pos.y,npc_base_pos.z)
local npc_dir = npc_pos:sub(act_pos)
local yaw = yaw_degree3d(act_dir, npc_dir)
if yaw < fov then
if index_mark < 33 then

local p_coord = point_projection(npc_base_pos, cfix)
local Xcoord = math.floor(p_coord[1])
local Ycoord = math.floor(p_coord[2])

if index_mark > npc_last_mark then
hud:AddCustomStatic("npc_hud_mark_"..tostring(index_mark))
npc_mark_table[index_mark] = hud:GetCustomStatic("npc_hud_mark_"..tostring(index_mark)):wnd()
end
npc_mark_table[index_mark]:SetWndRect(Frect():set(Xcoord-8,Ycoord-8,Xcoord+8,Ycoord+8))
index_mark = index_mark + 1
end
end
end
end
end

npc_last_mark = index_mark - 1

--Удаление лишних меток НПС
if index_mark < 33 then
for i=index_mark,32 do
if npc_mark_table[i] then
hud:RemoveCustomStatic("npc_hud_mark_"..tostring(i))
npc_mark_table[i] = nil
end
end
end

--Очистка таблицы НПС
if index_mark == 1 then
npc_nul_mark_time = npc_nul_mark_time + 1
if npc_nul_mark_time > 100 then
npc_base_table = {}
npc_nul_mark_time = 0
end
else
npc_nul_mark_time = 0
end

end

 

 

  • Полезно 1

Шаман - СисАдмин

Всяко-разно: для ЧН

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

Есть у меня предположение по поводу того, зачем разрабы в ТЧ делали 2 класса для управления smart_terrain'ами. Видимо, планировалось в секции [smart_terrain] указывать type не в виде фиксированного значения, а в виде списка типов с condlist'ом для каждого, но позже от такого подхода почему-то отказались. Все данные о работах для одного из нескольких type удобнее хранить в отдельном объекте (xr_gulag.gulag), а не в самом smart_terrain. Для единственного и неизменного type такая громоздкая конструкция не несёт в себе ничего полезного. Недавно сам попытался сделать возможность использования нескольких type для одного смарта, и пришлось заново создавать новый класс для хранения работ одного типа взамен снесённого ранее xr_gulag.gulag.

 

но тебе в любом случае придется создавать хотя-бы один конфиг что-бы писать туда все вызовы, а зачем это надо?

 

У тебя что-то странное написалось. Не знаю, что имелось в виду, а написалось - странное.
По сути, это даже не система событий, а управление универсальной для однотипных объектов частью скриптов в виде логики, похожей на привычную всем [logic] в конфигах. Эта логика не должна быть управляемой из логики объектов, и для её реализации потребуется вынести часть кода в виде отдельных функций. Да, решение немного странное и непривычное, но я думаю, что толк от него будет. Надо только правильно найти границы его применения.Что до синтаксиса - лучше использовать тот, что есть и не менять его совсем - это даст возможность редактировать эту логику тем, кто не очень разбирается в Lua и скриптах. Или же взять где-то готовый подходящий вариант, если condlist'ы не годятся.
Ссылка на комментарий

Существующая система "логики" вполне сбалансирована по функционалу и синтаксису. (Оба хуже.)

Попытка сохранить одно уродство - даст столь же уродливые "дополнения".

 

Нет, сразу делать вменяемый функционал, и к нему - вменяемый, человекочитаемый синтаксис.

 

То есть, не нашли ничего вменяемого - разбираем "по-старому".

Изменено пользователем Dennis_Chikin
  • Нравится 1
Ссылка на комментарий

Не понял, что значит "оба хуже".

 

сразу делать вменяемый функционал, и к нему - вменяемый, человекочитаемый синтаксис.
Со своей изначальной задачей condlist'ы справляются. Проверить условия, выдать/снять infoportion, вызвать функцию - всё это делается. Что до синтаксиса - не хватает условия "или" (cond = {+info}{=func} section), а также не всё хорошо с передачей аргументов в функции. В остальном же эта конструкция со своей задачей справляется. Сделать что-то новое, чтобы оно было во всём лучше, вряд ли получится.
Ссылка на комментарий

 

 

Не понял, что значит "оба хуже".

То и значит... что хуже.

 

 

Сделать что-то новое, чтобы оно было во всём лучше, вряд ли получится.

Почему?

 

А давайте я за вас попробую ответить. Потому что страшно отойти от того что к корням приросло намертво. Страшно что Вася_Пупкин_Мододел611 ковыряющий логику и под страшные обещания по секрету у знакомых копирующий скрипты вида if фигня or другая фигня or простыня всякой ерунды then простыня на 100500 бесполезных действий которые можно было заменить одной строкой -

Страшно что вот этот Вася Пупкин не поймет как пользоваться вашим творением.

 

Хотите огорчу? Он и пытаться не будет. Даже если вы сделаете все один в один как ему привычно - он просто не будет пользоваться новым, старое же привычно.

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

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

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

 

 

То и значит... что хуже.

Хуже чем что?

 

 

Потому что страшно отойти от того что к корням приросло намертво.

Не только это. Да, можно попытаться описать часть общей логики однотипных объектов другим способом, отличным от condlist'ов. Но я пока слабо представляю, какой может быть эта альтернатива. А способ описания игровой логики - той, что прописывается отдельно для каждого объекта в spawn_ini или smart_terrain - лучше вообще не трогать. Максимум - расширить тот, что имеется, оставив обратную совместимость.

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

Ну, для начала, можно сразу развернуть строку в таблицу. Уйдет дикий оверхед, и оно станет читаемо. Заодно уберется нерабочее on_info = ... mysect  on_timer = mysect и иже с ними.

Аналогично - 10| 20| 30| 40|

Аналогично - все кракозябры развернуть в анимация = ... звук ...

 

Ну, if ... then ... elsе  на 40 десятков условий - поменять на вменяемую таблицу же.

 

Код и синтаксис здесь везде вполне очевидно связаны.

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

Все Добрый День. Возник такой вопрос: вот у предметов существует контекстное меню("использовать", "выбросить"), можно ли добавить в это меню свой пункт?

Изменено пользователем vampirnik77
  • Полезно 1
Ссылка на комментарий

 

 

Ну, для начала, можно сразу развернуть строку в таблицу.

Попытался это себе представить и немного завис. Мы говорим о _реализации_ скрипта чтения логики и переключения секций, или о самом способе описания логики и его синтаксисе?

 

 

 

Заодно уберется нерабочее on_info = ... mysect  on_timer = mysect и иже с ними. Аналогично - 10| 20| 30| 40| Аналогично - все кракозябры развернуть в анимация = ... звук ...

Опять же, без подробностей мне непонятно, что здесь имеется в виду. Если нужно избавиться от лишних строк (on_timer, on_signal, on_distance_что-тотам), можно без проблем упаковать эти же условия в одну строку on_info. Что до звуков с анимациями, то читается где-то в xr_meet, и к логике относится слабо. 

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

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

 

еще раз: при разборе секции логики с on_что_попало при указании одинаковых секций оно разберется в последнее прочитанное из файла условие. То есть, можно сделать затычку (и получить несовместимость со всем, что раньше как-то работало), но это будет именно затычка. По хорошему, синтаксис здесь (для сложных условий, меняющих что-либо прямо по ходу проверки) тоже менять надо.

 

Блин, вот помидорозасолочную кампанию закончу - и буду пробовать расписать.

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

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

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

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

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

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

Войти

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

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

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