UnLoaded 313 Опубликовано 23 Июня 2015 Поделиться Опубликовано 23 Июня 2015 (изменено) необходимо получить доступ к полю my_field биндера. local obj_bind = obj:binded_object() -- здесь obj - клиентский объект if obj_bind then .... obj_bind.my_field -- получаем нужные данные -- .... obj_bind:get_params() -- вариант с ф-цией -- end Точно не помню, но если напрямую не будет доступа к my_field, то добавь в нужном биндере ф-цию получения параметров: function my_binder:get_params() local ret_value = self.my_field return ret_value end Изменено 23 Июня 2015 пользователем UnLoaded 1 Ссылка на комментарий
Dniwe 3 Опубликовано 24 Июня 2015 Поделиться Опубликовано 24 Июня 2015 Ребят, привет. Нуждаюсь в небольшой помощи. Кто знает- ответьте, будьте добры. Есть нужда в одной функции, которая при помощи math.random-а перебирает тайники стандартные(забитые в список переменной) и выдаёт при активации в диалоге. Пример: Есть у нас повторяющийся диалог, наподобие "что знаешь нового?" При окончании диалога нужно выдать тайник. Но, чтобы каждый раз не один и тот же, а разные. SHoC Ссылка на комментарий
Nazgool 250 Опубликовано 25 Июня 2015 Поделиться Опубликовано 25 Июня 2015 (изменено) @Dniwe, local t = {1,2,3,4,5,6,7,8,9,10} local t_used = 0 function get_my_rnd(tab) local t_len = #tab t_used = (t_used == t_len and 1) or (t_used + 1) local index = math.random(t_used, t_len) local value = tab[index] tab[t_used], tab[index] = value, tab[t_used] return value end get_my_rnd(t) ... Вместо local t = {1,2,3,4,5,6,7,8,9,10} твой массив. Изменено 25 Июня 2015 пользователем Nazgool 1 Ссылка на комментарий
Zander_driver 10 333 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 (изменено) Нужна помощь тех кто хорошо разбирается в функциях для работы с векторами. Задача вроде бы и простая, но что-то я в этих самых функциях запутался... В общем, есть скрипт который позволяет в игре видеть аи-сетку. Принцип такой: если актор движется, скрипт бездействует, если актор неподвижен, начинается сканирование аи-сетки. На апдейтах вызываемых раз в 100 мс, функция scanning порциями перебирает вертексы аи-сетки, выясняя их позицию и расстояние от актора. размер порций с помощью profile_timer подбирается так чтобы забирать не более 50% процессорного времени, потребляемого игрой. В ходе сканирования отбираются те вертексы, которые находятся от актора ближе заданной дистанции, заносятся в отдельную таблицу, затем с помощью функции point_projection (кстати, взятой в чистом виде с страниц этого форума), вычисляется проекция координат вертекса на экран, и передается в скрипт занимающийся собственно отображением информации на худе. ------------------------------------------ --- отображение аи-сетки на худе при использовании пушки мододела ------------------------------------------ local actor_position = nil local actor_movement = nil local current_level = nil local current_vertex = nil local count_vertexes_per_iterate = 500 local time_of_iteration = 50 local system_status = 0 -- 0 - не инициализовано; 1 - актор движется, пассивно; --- 2 - актор неподвижен, активное сканирование; --- 3 - актор неподвижен, показ результатов. local vertex_bufer = {} local pred_vertexes = 0 local allfound_vertexes = nil local scan_distance = 20 --- дистанция сканирования аи-сетки function initiate_system(pos, level) -- нетспавн актора actor_position = pos current_level = level system_status = 1 local levelconfig = anom_system.get_level_config(level) pred_vertexes = levelconfig.max_lv end function update(delta) --- апдейт раз в 100 мс. local new_pos = db.actor:position() if actor_position then actor_movement = actor_position:distance_to(new_pos) if actor_movement > 0.01 then lv_monitor.clear_data() else lv_monitor.activate(delta) end end actor_position = new_pos end function clear_data() vertex_bufer = {} system_status = 1 current_level = string.lower(level.name()) hud_system.update_visvertexes({}) hud_system.set_tutorial("") end function activate(delta) --- наличие пушки мододела лучше проверять не здесь. if system_status == 1 then -- start system_status = 2 current_vertex = 1 lv_monitor.scanning(delta) elseif system_status == 2 then -- work in progress lv_monitor.scanning(delta) elseif system_status == 3 then -- show results lv_monitor.monitor(delta) end end function scanning(delta) local self_timer = profile_timer() self_timer:start() local process_end = false local vertex_start_process = current_vertex local vertex_end_process = vertex_start_process + count_vertexes_per_iterate if vertex_end_process > pred_vertexes then vertex_end_process = pred_vertexes + 1 end while current_vertex < vertex_end_process and not process_end do local vpos = level.vertex_position(current_vertex) if current_vertex < pred_vertexes then local vdis = actor_position:distance_to(vpos) if vdis < scan_distance then table.insert(vertex_bufer, {current_vertex, vpos}) end else process_end = true allfound_vertexes = pred_vertexes system_status = 3 hud_system.set_tutorial(string.format("Сканирование завершено. Всего вертексов на локации: %i; Вертексов в радиусе 20 м: %i.", allfound_vertexes, #vertex_bufer)) end current_vertex = current_vertex + 1 end local percent_process = nil if allfound_vertexes then percent_process = round(100 * (current_vertex / allfound_vertexes)) else percent_process = round(100 * (current_vertex / (pred_vertexes + 1))) end hud_system.set_tutorial(string.format("Идет сканирование АИ-сетки... %i процентов.", percent_process)) self_timer:stop() time_of_iteration = self_timer:time() if time_of_iteration < 30000 or time_of_iteration > 70000 then count_vertexes_per_iterate = round(count_vertexes_per_iterate * (50000 / time_of_iteration)) end end function monitor(delta) local vt = {} for k, v in pairs(vertex_bufer) do local screenpos = lv_monitor.point_projection(v[2]) if screenpos and screenpos[1] > 0 and screenpos[1] < 1024 and screenpos[2] > 0 and screenpos[2] < 768 then table.insert(vt, {screenpos, v[1], actor_position:distance_to(v[2])}) end end hud_system.update_visvertexes(vt) end function point_projection(point) --[[ взято с амк-форума, ]] 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) 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 Проблема вот в чем: сама функция point_projection, и последующая проверка ее результата if screenpos and screenpos[1] > 0 and screenpos[1] < 1024 and screenpos[2] > 0 and screenpos[2] < 768 then в функции monitor, не отсекает вертексы находящиеся за спиной актора. т.е. получается, что мы как бы смотрим по направлению взгляда ГГ, а так же в противоположном направлении по оси зрения. И для отображения на худ передаются вертексы, "попавшие в поле зрения" по обеим осям. hud_system.update_visvertexes(vt) - передача данных на худ, если что. (в функции monitor) Получается вот такое: http://i.imgur.com/8OZDnml.jpg Как мне координаты расположенные за спиной актора отсечь в данном случае? Upd: Печально что тут так "активно" помогают... уже сам разобрался. Изменено 27 Июня 2015 пользователем Zander_driver 2 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
UnLoaded 313 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 Печально что тут так "активно" помогают... уже сам разобрался. Так лето ведь, народ попы на морях греет... Ссылка на комментарий
Сталкер-Стрелок 12 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 @Zander_driver, твои претензии совершенно не уместны , к примеру я вообще поста не видел. Сам разобрался - молодец, но все же подскажу свой вариант: local vdis = actor_position:distance_to(vpos) local function check() local function in_f( v1, v2 ) return (math.acos((v1.x*v2.x + v1.y*v2.y + v1.z*v2.z)/(math.sqrt(v1.x*v1.x + v1.y*v1.y + v1.z*v1.z )*math.sqrt(v2.x*v2.x + v2.y*v2.y + v2.z*v2.z)))*57.2957) end local yaw = in_f(device().cam_dir, vpos:sub(db.actor:position())) return yaw < 35 end if vdis < scan_distance and check() then table.insert(vertex_bufer, {current_vertex, vpos}) end С таким отношением отпадает всякое желание вести сотрудничество. Ссылка на комментарий
Zander_driver 10 333 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 При спавне физ.объекта скриптом, напомните какому ключу, какое значение надо присвоить в его нетпакете, чтобы физ.объект был приклеен к террейну локации, а не катался по ней как перекати-поле. С таким отношением отпадает всякое желание вести сотрудничество. А что я такого сказал? можно подумать я от вас лично требовал немедленного ответа. Ну разобрался я в вопросе раньше чем вы успели ответить - что ж теперь поделать, так получилось. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Сталкер-Стрелок 12 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 @Outfater, твой вопрос некорректен, советую почитать что-нибудь по рестрикторам, конкретно обрати внимание на обработку конфига логики, я думаю вопрос разрешится. @Zander_driver, в параллельной теме как-раз это обсудили вот только что, по-моему даже с готовым примером. Общно, нужно полю fixed_bones присвоить основную кость и записать кастом дату, что-бы не шумело. 1 Ссылка на комментарий
UnLoaded 313 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 чтобы физ.объект был приклеен к террейну локации ля-ля.fixed_bones = "link" 1 Ссылка на комментарий
Zander_driver 10 333 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 Столкнулся тут с одной интересной бякой, и возник вопрос а как ее избежать по-хорошему. Суть проблемы: есть у нас некий игровой объект, у него в конфиге написано script_binding = какой_то_скрипт.какой_то_биндер, а в файле какой_то_скрипт допустим затесалась синтаксическая ошибка. или в конфиге опечатка и имя файла написано неправильно, или вообще нету такого файла. короче какой_то_скрипт = nil, а наш объект хочет себе биндер из этого скрипта. И что же происходит? А ничего. Игра идет себе спокойно дальше, а объект который должен биндиться, вовсе этого не делает, не получает никаких колбеков и соответственно они не вызываются, и т.д... Ситуация противная прежде всего тем что нету никакой информации от движка, о том что что-то не так. По поводу того как этого избежать, у меня пока единственная пришедшая в голову мысль - перебирать 65к объектов, брать их секцию, смотреть есть ли в ней ключ script_binding, и если есть то проверять а видит ли игра требуемый скрипт. и если не видит то вылетать с воплями на рабочий стол. а проверку эту запускать где-нибудь при переходе из одной локации в другую, чтоб не накладно было. Онлайновые объекты нам все равно для этой проверки не требуются. Но может есть другие варианты? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
UnLoaded 313 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 @Zander_driver На мой взгляд: а стоит-ли городить такие огороды, вместо того, чтоб проверить один раз всё при тестировании мода\внесении правок, и как говорится "спать спокойно" ? 1 Ссылка на комментарий
Zander_driver 10 333 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 Ну, огород нацелен скорее на более быстрое обнаружение причин неполадок в процессе разработки. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Сталкер-Стрелок 12 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 @Zander_driver, если речь только о проверке биндера, то ты же сам что-то такое изобретал, можно заваливать игру если объект биндера не подает признаков жизни. Вставь abort куда нужно (например можешь в ините ставить булево поле о инициировании, и если его нет заваливать игру), и в целом будет решено. Если цель выявить некорректные скрипты как файлы с различными модулями, то есть хороший вариант с песочницей на мотив ЗП, который не пропускает таких инвалидов. Если хочется перебирать, разумно будет составить таблицу биндеров и итерироваться по ней, там объектов будет наверняка меньше 65т. Ссылка на комментарий
Zander_driver 10 333 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 (изменено) если речь только о проверке биндера, то ты же сам что-то такое изобретал, можно заваливать игру если объект биндера не подает признаков жизни. В том, что я изобретал, биндер при создании регистрируется в системе мониторинга. при создании. Если он не создается - ничего не происходит. Можно конечно судить о нерабочести биндера по тому что он отсутствует в мониторинге, при наличии требующих его объектов. Но все же это не совсем то... это не вылет на раб стол с воплем что "вот тут плохо". а просто надо заметить что нет того, что должно быть. в ините ставить булево поле о инициировании у нас сам файл = nil. не будет никакого инита. то есть хороший вариант с песочницей на мотив ЗП а поподробнее, в чем принцип? Если хочется перебирать, разумно будет составить таблицу биндеров а на основе чего ее составить? успешно состоявшийся вызов инита нам скажет о том что биндер работает, но неработающий - промолчит же. ничего никуда не сообщит. Изменено 27 Июня 2015 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Сталкер-Стрелок 12 Опубликовано 27 Июня 2015 Поделиться Опубликовано 27 Июня 2015 у нас сам файл = nil. не будет никакого инита. Ты меня не понял. Флаг добавляешь в инит биндера, если он появляется у объекта - биндер существует, нет - валишь игру. Я не об объекте биндера. а поподробнее, в чем принцип? Да тут, понимаешь, в двух словах не пояснишь, возьми готовый вариант и попробуй погонять корректные и некорректные скрипты, поймешь алгоритм где заваливается работа этой системы. Какие конкретно у тебя цели я не знаю, но у меня, например, вполне симпатично все работает. а на основе чего ее составить? Очевидно на основе твоих биндеров, биндер выступает, к примеру, значением таблицы, ты проверяешь не только сам файл на nil, но сразу и биндер. Проверяешь не на объекте, а обычным луа, на как-раз таки ошибки этого синтаксиса, т.е. опуская саму функцию биндинга. Надеюсь понятно объяснил. Извини, ухожу. Ссылка на комментарий
Simonov50 2 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 class CUIScriptWnd - Не могу сдвинуть окно вправо self:SetWndRect(Frect():set(0,0,420,530)) - работаетself:SetWndRect(Frect():set(200,0,420,530)) - уже не работает Изображение сдвинулось верно - всё на своих местах, без смещений.Но, у элементов в правой части окна, которые оказались за пределами "старых" координат, исчезли калбаки, не работают едитбоксы. На наведение курсора кнопки и чекбоксы реагируют - подсвечиваются.Левая часть окна работает нормально. ХМЛ - просто россыпь в пределах "старых" координат, без фреймов и наложений. В скрипте ничего не аттачилось.В моём понимании CUIScriptWnd главный в связке, а CScriptXmlInit драйвер-исполнитель, я дал команду главному и мимо.Явно что-то упустил из вида, что ? Ссылка на комментарий
AndrewMor 527 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 Знающие, подскажите: возможно ли скриптом вывести message_box с кнопками? И какую функцию пользовать: AddCustomStatic? Или какую другую? Сталкер - наше всё! Ссылка на комментарий
UnLoaded 313 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 возможно ли скриптом вывести message_box с кнопками? Тебе в сторону CUIMessageBoxEx, в "Справочнике по ф-циям и классам" есть. Ссылка на комментарий
naxac 2 445 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 @Simonov50, Frect():set(x1, y1, x2, y2) - первые две - координаты верхнего левого угла, третья и четвёртая - нижнего правого. Вроде, так. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Simonov50 2 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 (изменено) подскажите: Загляни пожалуйста в личную переписку. Сергей. @Simonov50, Frect():set(x1, y1, x2, y2) - первые две - координаты верхнего левого угла, третья и четвёртая - нижнего правого. Вроде, так. Во первых не так, а главное - где ответ на вопрос ? Изменено 28 Июня 2015 пользователем Simonov50 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти