Zander_driver 10 333 Опубликовано 29 Ноября 2011 Может быть я где-то и ошибаюсь, но помоему обнаружил неувязку в сведениях шапки темы. Тут читаем: int parent() –- кому принадлежит. Для предметов в инвентаре и в ящиках. Если никому, то -1 Из этого можно сделать вывод что parent() возвращает id того, кому принадлежит. Совсем недавно один код у меня не заработал так как ожидалось, дальнейшее разбирательство обнаружило следующий факт: type(obj:parent()) возвратило "userdata" в то время как obj был клиентским объектом артефакта. Далее, обнаружилось что следующий код очень даже рабочий: local obj = level.object_by_id(b) local parent = obj:parent() local sectp = parent:section() news_manager.send_tip(db.actor, sectp, nil, nil, 5000) Версия игры - ТЧ 1.0004 Получается, parent возвращает *game_object того объекта, которому принадлежит данный. Добавлено через 40 мин.: Кстати еще. Для ничейного артефакта, лежащего на земле, obj:parent() вернул nil. А не -1. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 333 Опубликовано 12 Декабря 2011 Читают очень-очень многое... А вот то о чем я писал тут, так и не исправили. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 333 Опубликовано 19 Августа 2012 В общем все равно элемент остается под окном инвентаря, А выводить свое окно после открытия инвентаря или на апдейте не пробовали? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 333 Опубликовано 1 Декабря 2014 function bone_position(string) const [скрыть] vector bone_position(string bone_name) const возвращает координаты кости. Принимает один аргумент - имя кости. Может быть применен к любому объекту, но модель объекта при этом должна иметь тип MT_SKELETON_ANIM или MT_SKELETON_RIGID, короче, иметь эти самые кости Допустим я прочитал из нет-пакета объекта его визуал, узнал что за модель. Чтобы применять этот метод - как мне узнать имена всех имеющихся в данной модели костей? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 333 Опубликовано 25 Января 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 333 Опубликовано 4 Апреля 2015 (изменено) Я тут соорудил у себя такое: скриптовый элемент худа, позволяющий вести мониторинг состояния различных биндеров и др.объектов, пользующихся апдейтом. В реальном времени можно наблюдать, сколько у нас в игре таких объектов, сколько они жрут процессорного времени на свой апдейт, и как вообще поживают, не зависли ли часом. Единственный момент, из-за того что выведение на худ вызывается внутри апдейта актора, система не обнаруживает зависание его биндера. Это делается извне, другими средствами. Хотя если у кого-то биндер актора зависнет это сразу станет видно по тому, что показания этой системы обо всех категориях объектов перестанут меняться.Решил выложить - вдруг кому пригодится, потому что держать именно эту систему до выхода "Судьбы Зоны" - смысла не вижу, вряд ли ТАМ она кому-то после релиза понадобится. Собственно код: local mks_count = 1000000 --- число микросекунд в одной секунде. profile_timer работает в микросекундах, если кто забыл. local binders = {} --- таблица хранящая контроллеры биндеров по категориям. --[[ ПРИМЕР ПОДКЛЮЧЕНИЯ БИНДЕРА: (или любого объекта у которого есть апдейт) в метод __init() добавляем в конец: self.tm_id = time_monitor.register_binder("xr_motivator") -- вместо xr_motivator свое имя скрипта в метод update(delta) time_monitor.binder_update_start("xr_motivator", self.tm_id) ... ваши действия ... time_monitor.binder_update_end("xr_motivator", self.tm_id) ]] function register_binder(binder_type) local btt = binders[binder_type] if btt then local new_id = #btt + 1 binders[binder_type][new_id] = time_monitor.binder_controller() return new_id else binders[binder_type] = {} binders[binder_type][1] = time_monitor.binder_controller() return 1 end end function binder_update_start(binder_type, id) binders[binder_type][id]:start() end function binder_update_end(binder_type, id) binders[binder_type][id]:stop() end function self_update() for k, v in pairs(binders) do for i, j in pairs(v) do j:set_0() end end end function clear() for k, v in pairs(binders) do local t = {} for i, j in pairs(v) do table.insert(t, i) end local a = 1 while t[a] ~= nil do local vk = t[a] v[vk] = nil a = a + 1 end end end function get_data() local r = {} local engine_time = mks_count for k, v in pairs(binders) do local count_normal = 0 local count_broken = 0 local stime = 0 for i, j in pairs(v) do local d = j:get() if d[1] or k == "actor_binder" then count_normal = count_normal + 1 stime = stime + d[2] else count_broken = count_broken + 1 end end local R_color = round(255 * stime / 50000) if R_color > 255 then R_color = 255 end local G_color = round((200000 - stime) * 0.00127) if G_color < 0 then G_color = 0 end if G_color > 255 then G_color = 255 end local B_color = round((100000 - stime) * 0.00255) if B_color < 0 then B_color = 0 end if B_color > 255 then B_color = 255 end if count_broken ~= 0 then B_color = 0 end r[k] = { [1] = string.format("Objects online: %i; Objects broken: %i; CPU Time: %G", count_normal, count_broken, stime / mks_count), [2] = {255, R_color, G_color, B_color} } engine_time = engine_time - stime end --r["engine"] = string.format("Engine CPU Time: %G", engine_time / mks_count) return r end class "binder_controller" function binder_controller:__init() self.status = true self.time = 0 self.timer = nil end function binder_controller:__finalize() self.timer = nil end function binder_controller:start() self.timer = profile_timer() self.timer:start() self.status = false end function binder_controller:stop() self.timer:stop() self.time = self.time + self.timer:time() self.status = true self.timer = nil end function binder_controller:get() return {self.status, self.time} end function binder_controller:set_0() self.time = 0 end local hud_statics = {} local hardware_monitor_timer = 0 local hardware_time_lcnt = nil function hardware_time_monitor(delta) local bar_back = "htm_back" if hud_statics[bar_back] then if hardware_monitor_timer > 1000 then local dt = time_monitor.get_data() hardware_time_lcnt = #dt time_monitor.self_update() local a = 1 for k, v in pairs(dt) do if hud_statics["htm_line_"..tostring(a)] then local nclr = v[2] hud_statics["htm_line_"..tostring(a)]:SetTextColor(nclr[1], nclr[2], nclr[3], nclr[4]) hud_statics["htm_line_"..tostring(a)]:SetFont(GetFontLetterica16Russian()) hud_statics["htm_line_"..tostring(a)]:SetText(string.format("%s:: %s",k,v[1])) else hud_statics["htm_line_"..tostring(a)] = CUIStatic() hud_statics["htm_line_"..tostring(a)]:Init(0, a * 18, 20, 16) hud_statics["htm_line_"..tostring(a)]:InitTexture("empty_texture") hud_statics["htm_line_"..tostring(a)]:SetStretchTexture(true) hud_statics[bar_back]:AttachChild(hud_statics["htm_line_"..tostring(a)]) end a = a + 1 end else hardware_monitor_timer = hardware_monitor_timer + delta if hardware_time_lcnt then local a = 1 while a < hardware_time_lcnt do if hud_statics["htm_line_"..tostring(a)] then --- не здесь else hud_statics["htm_line_"..tostring(a)] = CUIStatic() hud_statics["htm_line_"..tostring(a)]:Init(0, a * 18, 20, 16) hud_statics["htm_line_"..tostring(a)]:InitTexture("empty_texture") hud_statics["htm_line_"..tostring(a)]:SetStretchTexture(true) hud_statics[bar_back]:AttachChild(hud_statics["htm_line_"..tostring(a)]) end a = a + 1 end end end else hud_statics[bar_back] = CUIStatic() hud_statics[bar_back]:Init(600, 20, 156, 24) hud_statics[bar_back]:InitTexture("empty_texture") hud_statics[bar_back]:SetStretchTexture(true) get_hud():AddDialogToRender(hud_statics[bar_back]) end end После этого, в апдейт актора (или в под-систему, занимающуюся апдейтами на пониженных частотах, у кого есть), добавляем вызов hud_system.hardware_time_monitor(delta) Текстуру "empty_texture" можно создать в любом xml-файле описаний текстур, описав пустой участок, или подставить свое название текстуры какое хотите. И собственно все, можно пользоваться. Как подключить биндер/любой класс объекта к системе, смотрим инструкцию в time_monitor.script: ПРИМЕР ПОДКЛЮЧЕНИЯ БИНДЕРА: (или любого объекта у которого есть апдейт) в метод __init() добавляем в конец: self.tm_id = time_monitor.register_binder("xr_motivator") -- вместо xr_motivator свое имя скрипта в метод update(delta) time_monitor.binder_update_start("xr_motivator", self.tm_id) -- в самое начало функции. вместо xr_motivator свое имя скрипта ... ваши действия ... time_monitor.binder_update_end("xr_motivator", self.tm_id) -- в самый конец функции. вместо xr_motivator свое имя скрипта Собственно скриншот как это выглядит в игре (Судьба Зоны) Значения обновляются раз в секунду, цвет строчек меняется динамически в зависимости от состояния соответствующей категории объектов. Чем больше жрет - тем ближе к красно-оранжевому цвету. Чем меньше - тем ближе к светло-голубоватому. Цвет меняется для тех объектов среди которых есть "сломанные" - объекты у которых метод update отправил начальный вызов, но не добрался до финального. т.е. возможно произошел выход из функции где-то посередине, а возможно - зависание. Изменено 4 Апреля 2015 пользователем Zander_driver 1 3 7 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение
Zander_driver 10 333 Опубликовано 16 Февраля 2023 15.02.2023 в 22:37, Tiran_ua сказал: Внимание вопрос: как запросить (sis, inv_name) в xml формате для вставки в диалог? Сложно понять, что именно надо, и в каком виде оно в вашей "некой функции" могло бы быть извлечено. Стандартные методы работы с названиями итемов выглядят как-то так: local name = game.translate_string(system_ini():r_string(section, "inv_name")) 1 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Поделиться этим сообщением Ссылка на сообщение