Wlad777 24 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 @Kirgudu, Уже понятнее, спасибо.А как мне этот массив получить то сначала? Вот заспавнены у меня на уровне, в разных местах, скажем 15 объектов секции [safemarker]. 1 --------------------------------- www.amk-zone.de Ссылка на комментарий
Romz 142 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 @Карлан, Да там фигня какая-то получается. В 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 Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Charsi 440 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 (изменено) @Romz, в таблице p_coord нет элементов с индексами "x" и "y". Напиши так local Xcoord = p_coord[1] local Ycoord = p_coord[2] Изменено 19 Августа 2015 пользователем Charsi 1 1 Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
Kirgudu 1 217 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 А как мне этот массив получить то сначала? Вот заспавнены у меня на уровне, в разных местах, скажем 15 объектов секции [safemarker]. Это уже зависит от задач и окружения. Можно перебрать все онлайновые объекты в db.storage, получить их секцию и сравнить с нужной. Можно вообще все серверные объекты перебрать (alife():object(i), где i = от 1 до 65534), только позицию у таких объектов надо будет брать не методом position(), а в свойстве .position. Но это затратные способы. Лучше организовать свою таблицу для таких объектов - такой вариант обсуждался здесь несколько страниц назад. А вообще, в скриптах примеров навалом. 1 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 @Charsi, Я затупил, признаю. Поправил, теперь всё работает. Romz, дублирую, математика там школьная, да. Скрипт приведенный тобою - плохой. А видео, которое ты привёл, это что за мод? Или скрипт? Где его откопать, для посмотреть на предмет вывода метки на высоте роста непися... 1 Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
UnLoaded 313 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 Я боюсь представить что у тебя за код в котором 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 секунд. Ссылка на комментарий
dsh 3 824 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 @UnLoaded, либо ты не все показал, либо у тебя что-то странное. Судя по использованию двух индексов, каждый элемент таблицы должен содержать таблицу, но не видно, что бы эти элементы инициализировались таблицами. Возможно lua сделает это за тебя, но кто знает, какие грабли в этом интеллекте будут. Я бы не надеялся на такой автоугадав. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
UnLoaded 313 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 Насчет тормозов с string.sub - отбой, дело в другом оказалось... Ссылка на комментарий
Карлан 1 049 Опубликовано 19 Августа 2015 Поделиться Опубликовано 19 Августа 2015 Возможно lua сделает это за тебя Не сделает. Насчет тормозов с string.sub - отбой, дело в другом оказалось... А я только хотел сделать шах и мат . @Romz, логично предположить что на своем канале я выкладываю свои работы, я тебе выше сказал что этот код я писал на ТЧ. Ссылка на комментарий
Romz 142 Опубликовано 20 Августа 2015 Поделиться Опубликовано 20 Августа 2015 Всем спасибо, разобрался. Окончательный вариант теперь выглядит так 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 Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Полтергейст 37 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 Есть у меня предположение по поводу того, зачем разрабы в ТЧ делали 2 класса для управления smart_terrain'ами. Видимо, планировалось в секции [smart_terrain] указывать type не в виде фиксированного значения, а в виде списка типов с condlist'ом для каждого, но позже от такого подхода почему-то отказались. Все данные о работах для одного из нескольких type удобнее хранить в отдельном объекте (xr_gulag.gulag), а не в самом smart_terrain. Для единственного и неизменного type такая громоздкая конструкция не несёт в себе ничего полезного. Недавно сам попытался сделать возможность использования нескольких type для одного смарта, и пришлось заново создавать новый класс для хранения работ одного типа взамен снесённого ранее xr_gulag.gulag. но тебе в любом случае придется создавать хотя-бы один конфиг что-бы писать туда все вызовы, а зачем это надо? У тебя что-то странное написалось. Не знаю, что имелось в виду, а написалось - странное.По сути, это даже не система событий, а управление универсальной для однотипных объектов частью скриптов в виде логики, похожей на привычную всем [logic] в конфигах. Эта логика не должна быть управляемой из логики объектов, и для её реализации потребуется вынести часть кода в виде отдельных функций. Да, решение немного странное и непривычное, но я думаю, что толк от него будет. Надо только правильно найти границы его применения.Что до синтаксиса - лучше использовать тот, что есть и не менять его совсем - это даст возможность редактировать эту логику тем, кто не очень разбирается в Lua и скриптах. Или же взять где-то готовый подходящий вариант, если condlist'ы не годятся. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 (изменено) Существующая система "логики" вполне сбалансирована по функционалу и синтаксису. (Оба хуже.) Попытка сохранить одно уродство - даст столь же уродливые "дополнения". Нет, сразу делать вменяемый функционал, и к нему - вменяемый, человекочитаемый синтаксис. То есть, не нашли ничего вменяемого - разбираем "по-старому". Изменено 21 Августа 2015 пользователем Dennis_Chikin 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Полтергейст 37 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 Не понял, что значит "оба хуже". сразу делать вменяемый функционал, и к нему - вменяемый, человекочитаемый синтаксис.Со своей изначальной задачей condlist'ы справляются. Проверить условия, выдать/снять infoportion, вызвать функцию - всё это делается. Что до синтаксиса - не хватает условия "или" (cond = {+info}{=func} section), а также не всё хорошо с передачей аргументов в функции. В остальном же эта конструкция со своей задачей справляется. Сделать что-то новое, чтобы оно было во всём лучше, вряд ли получится. Ссылка на комментарий
Zander_driver 10 334 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 Не понял, что значит "оба хуже". То и значит... что хуже. Сделать что-то новое, чтобы оно было во всём лучше, вряд ли получится. Почему? А давайте я за вас попробую ответить. Потому что страшно отойти от того что к корням приросло намертво. Страшно что Вася_Пупкин_Мододел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. Ссылка на комментарий
Полтергейст 37 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 То и значит... что хуже. Хуже чем что? Потому что страшно отойти от того что к корням приросло намертво. Не только это. Да, можно попытаться описать часть общей логики однотипных объектов другим способом, отличным от condlist'ов. Но я пока слабо представляю, какой может быть эта альтернатива. А способ описания игровой логики - той, что прописывается отдельно для каждого объекта в spawn_ini или smart_terrain - лучше вообще не трогать. Максимум - расширить тот, что имеется, оставив обратную совместимость. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 21 Августа 2015 Поделиться Опубликовано 21 Августа 2015 Ну, для начала, можно сразу развернуть строку в таблицу. Уйдет дикий оверхед, и оно станет читаемо. Заодно уберется нерабочее on_info = ... mysect on_timer = mysect и иже с ними. Аналогично - 10| 20| 30| 40| Аналогично - все кракозябры развернуть в анимация = ... звук ... Ну, if ... then ... elsе на 40 десятков условий - поменять на вменяемую таблицу же. Код и синтаксис здесь везде вполне очевидно связаны. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
vampirnik77 121 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 (изменено) Все Добрый День. Возник такой вопрос: вот у предметов существует контекстное меню("использовать", "выбросить"), можно ли добавить в это меню свой пункт? Изменено 22 Августа 2015 пользователем vampirnik77 1 Официальная страница проекта Neof-One Crew Ссылка на комментарий
Shredder 49 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 Конечно можно, берёшь исходники и вперёд. Иначе никак 1 Ссылка на комментарий
Полтергейст 37 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 Ну, для начала, можно сразу развернуть строку в таблицу. Попытался это себе представить и немного завис. Мы говорим о _реализации_ скрипта чтения логики и переключения секций, или о самом способе описания логики и его синтаксисе? Заодно уберется нерабочее on_info = ... mysect on_timer = mysect и иже с ними. Аналогично - 10| 20| 30| 40| Аналогично - все кракозябры развернуть в анимация = ... звук ... Опять же, без подробностей мне непонятно, что здесь имеется в виду. Если нужно избавиться от лишних строк (on_timer, on_signal, on_distance_что-тотам), можно без проблем упаковать эти же условия в одну строку on_info. Что до звуков с анимациями, то читается где-то в xr_meet, и к логике относится слабо. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 22 Августа 2015 Поделиться Опубликовано 22 Августа 2015 (изменено) О синтаксисе. Да, вот так вот прямо таблицей и писать. Так, как сейчас строку скрипт разворачивает, если идей лучше нет. еще раз: при разборе секции логики с on_что_попало при указании одинаковых секций оно разберется в последнее прочитанное из файла условие. То есть, можно сделать затычку (и получить несовместимость со всем, что раньше как-то работало), но это будет именно затычка. По хорошему, синтаксис здесь (для сложных условий, меняющих что-либо прямо по ходу проверки) тоже менять надо. Блин, вот помидорозасолочную кампанию закончу - и буду пробовать расписать. Изменено 22 Августа 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти