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

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

необходимо получить доступ к полю 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
Изменено пользователем UnLoaded
  • Спасибо 1
Ссылка на комментарий

Ребят, привет.

Нуждаюсь в небольшой помощи.

Кто знает- ответьте, будьте добры.

Есть нужда в одной функции, которая при помощи math.random-а перебирает тайники стандартные(забитые в список переменной) и выдаёт при активации в диалоге.

Пример:

Есть у нас повторяющийся диалог, наподобие "что знаешь нового?"

При окончании диалога нужно выдать тайник. Но, чтобы каждый раз не один и тот же, а разные.

SHoC

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

@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}

твой массив.

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

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

 

В общем, есть скрипт который позволяет в игре видеть аи-сетку. Принцип такой: если актор движется, скрипт бездействует, если актор неподвижен, начинается сканирование аи-сетки. На апдейтах вызываемых раз в 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:

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

Изменено пользователем Zander_driver
  • Спасибо 2

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

                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

С таким отношением отпадает всякое желание вести сотрудничество.

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

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

 

 

 

С таким отношением отпадает всякое желание вести сотрудничество.

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

 

 

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

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

@Outfater, твой вопрос некорректен, советую почитать что-нибудь по рестрикторам, конкретно обрати внимание на обработку конфига логики, я думаю вопрос разрешится.

 

@Zander_driver, в параллельной теме как-раз это обсудили вот только что, по-моему даже с готовым примером. Общно, нужно полю fixed_bones присвоить основную кость и записать кастом дату, что-бы не шумело.

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

Столкнулся тут с одной интересной бякой, и возник вопрос а как ее избежать по-хорошему.

Суть проблемы: есть у нас некий игровой объект, у него в конфиге написано script_binding = какой_то_скрипт.какой_то_биндер,

а в файле какой_то_скрипт допустим затесалась синтаксическая ошибка. или в конфиге опечатка и имя файла написано неправильно, или вообще нету такого файла.

короче какой_то_скрипт = nil, а наш объект хочет себе биндер из этого скрипта. И что же происходит? А ничего. Игра идет себе спокойно дальше, а объект который должен биндиться, вовсе этого не делает, не получает никаких колбеков и соответственно они не вызываются, и т.д...

Ситуация противная прежде всего тем что нету никакой информации от движка, о том что что-то не так.

 

По поводу того как этого избежать, у меня пока единственная пришедшая в голову мысль - перебирать 65к объектов, брать их секцию, смотреть есть ли в ней ключ script_binding, и если есть то проверять а видит ли игра требуемый скрипт. и если не видит то вылетать с воплями на рабочий стол. а проверку эту запускать где-нибудь при переходе из одной локации в другую, чтоб не накладно было. Онлайновые объекты нам все равно для этой проверки не требуются.

Но может есть другие варианты?

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

Ну, огород нацелен скорее на более быстрое обнаружение причин неполадок в процессе разработки.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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, если речь только о проверке биндера, то ты же сам что-то такое изобретал, можно заваливать игру если объект биндера не подает признаков жизни. Вставь abort куда нужно (например можешь в ините ставить булево поле о инициировании, и если его нет заваливать игру), и в целом будет решено. Если цель выявить некорректные скрипты как файлы с различными модулями, то есть хороший вариант с песочницей на мотив ЗП, который не пропускает таких инвалидов. Если хочется перебирать, разумно будет составить таблицу биндеров и итерироваться по ней, там объектов будет наверняка меньше 65т.

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

В том, что я изобретал, биндер при создании регистрируется в системе мониторинга. при создании. Если он не создается - ничего не происходит.

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

 

в ините ставить булево поле о инициировании

у нас сам файл = nil. не будет никакого инита.

 

 

то есть хороший вариант с песочницей на мотив ЗП

а поподробнее, в чем принцип?

 

 

Если хочется перебирать, разумно будет составить таблицу биндеров

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

Изменено пользователем 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.

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

 

 

у нас сам файл = nil. не будет никакого инита.

Ты меня не понял. Флаг добавляешь в инит биндера, если он появляется у объекта - биндер существует, нет - валишь игру. Я не об объекте биндера.

 

 

а поподробнее, в чем принцип?

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

 

 

а на основе чего ее составить?

Очевидно на основе твоих биндеров, биндер выступает, к примеру, значением таблицы, ты проверяешь не только сам файл на nil, но сразу и биндер. Проверяешь не на объекте, а обычным луа, на как-раз таки ошибки этого синтаксиса, т.е. опуская саму функцию биндинга. Надеюсь понятно объяснил.

 

Извини, ухожу.

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

class CUIScriptWnd - Не могу сдвинуть окно вправо

self:SetWndRect(Frect():set(0,0,420,530)) - работает
self:SetWndRect(Frect():set(200,0,420,530)) - уже не работает

Изображение сдвинулось верно - всё на своих местах, без смещений.
Но, у элементов в правой части окна, которые оказались за пределами "старых" координат, исчезли калбаки,

не работают едитбоксы.  На наведение курсора кнопки и чекбоксы реагируют - подсвечиваются.
Левая часть окна работает нормально.

ХМЛ - просто россыпь в пределах "старых" координат, без фреймов и наложений. В скрипте ничего не аттачилось.
В моём понимании CUIScriptWnd главный в связке, а CScriptXmlInit драйвер-исполнитель, я дал команду главному и мимо.
Явно что-то упустил из вида, что ?

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

Знающие, подскажите: возможно ли скриптом вывести message_box с кнопками? И какую функцию пользовать: AddCustomStatic? Или какую другую?

Сталкер - наше всё!

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

@Simonov50,

Frect():set(x1, y1, x2, y2) - первые две - координаты верхнего левого угла, третья и четвёртая - нижнего правого. Вроде, так.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий
подскажите:

Загляни пожалуйста в личную переписку.

Сергей.

@Simonov50,

Frect():set(x1, y1, x2, y2) - первые две - координаты верхнего левого угла, третья и четвёртая - нижнего правого. Вроде, так.

Во первых не так,    а главное -  где ответ на  вопрос ?  

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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