Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Информация (Показать) Общая (Показать) Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Скрипты (Показать) Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика (Показать) Логика со вступлением и четырьмя частями: Просмотр (Показать) ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Читать рекомендуется. (Показать) Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
UnLoaded 313 Опубликовано 23 Июня 2015 Поделиться Опубликовано 23 Июня 2015 (изменено) Winsor писал(а): необходимо получить доступ к полю my_field биндера. local obj_bind = obj:binded_object() -- здесь obj - клиентский объект if obj_bind then .... obj_bind.my_field -- получаем нужные данные -- .... obj_bind:get_params() -- вариант с ф-цией -- endlocal 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 endfunction 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} 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}local t = {1,2,3,4,5,6,7,8,9,10} твой массив. Изменено 25 Июня 2015 пользователем Nazgool 1 Ссылка на комментарий
Zander_driver 10 345 Опубликовано 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------------------------------------------ --- отображение аи-сетки на худе при использовании пушки мододела ------------------------------------------ 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 thenif 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 Zander_driver писал(а): Печально что тут так "активно" помогают... уже сам разобрался. оффтоп (Показать) Так лето ведь, народ попы на морях греет... Ссылка на комментарий
Сталкер-Стрелок 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 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 345 Опубликовано 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 Zander_driver писал(а): чтобы физ.объект был приклеен к террейну локации ля-ля.fixed_bones = "link" 1 Ссылка на комментарий
Zander_driver 10 345 Опубликовано 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 345 Опубликовано 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 345 Опубликовано 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 Zander_driver писал(а): у нас сам файл = nil. не будет никакого инита. Ты меня не понял. Флаг добавляешь в инит биндера, если он появляется у объекта - биндер существует, нет - валишь игру. Я не об объекте биндера. Zander_driver писал(а): а поподробнее, в чем принцип? Да тут, понимаешь, в двух словах не пояснишь, возьми готовый вариант и попробуй погонять корректные и некорректные скрипты, поймешь алгоритм где заваливается работа этой системы. Какие конкретно у тебя цели я не знаю, но у меня, например, вполне симпатично все работает. Zander_driver писал(а): а на основе чего ее составить? Очевидно на основе твоих биндеров, биндер выступает, к примеру, значением таблицы, ты проверяешь не только сам файл на 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 533 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 Знающие, подскажите: возможно ли скриптом вывести message_box с кнопками? И какую функцию пользовать: AddCustomStatic? Или какую другую? Сталкер - наше всё! Ссылка на комментарий
UnLoaded 313 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 AndrewMor писал(а): возможно ли скриптом вывести message_box с кнопками? Тебе в сторону CUIMessageBoxEx, в "Справочнике по ф-циям и классам" есть. Ссылка на комментарий
naxac 2 507 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 @Simonov50, Frect():set(x1, y1, x2, y2) - первые две - координаты верхнего левого угла, третья и четвёртая - нижнего правого. Вроде, так. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Simonov50 2 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 (изменено) AndrewMor писал(а): подскажите: Загляни пожалуйста в личную переписку. Сергей. 28.06.2015 в 17:17, naxac сказал: @Simonov50, Frect():set(x1, y1, x2, y2) - первые две - координаты верхнего левого угла, третья и четвёртая - нижнего правого. Вроде, так. Во первых не так, а главное - где ответ на вопрос ? Изменено 28 Июня 2015 пользователем Simonov50 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти