Это популярное сообщение. Malandrinus 615 Опубликовано 8 Июля 2009 Это популярное сообщение. Поделиться Опубликовано 8 Июля 2009 (изменено) В данной теме собраны сведения по скриптовой модели сталкера: функции и классы, методы и свойства, взаимосвязь классов и последовательность работы с ними, связь работы классов и файлов конфигураций. К наполнению темы приглашаются все желающие. В наполнении темы непосредственно участвовали и существенно мне помогли: @Monnoroch, @Kolmogor, @Unnamed Black Wolf, @меченый(стрелок), @IQDDD, @Kirag, @Taroz, @dan, @7.9, @Garry_Galler, @AKKK1, @Bak и много других людей. Скрытый текст Скрытый текст класс alife_simulator. Базовые операции с серверными объектами. Пространства имён. Глобальные функции для большого числа задач. "Создание своего класса" и "Наследование от экспортированных классов". Базовые сведения об объектно-ориентированном программировании для сталкера. Необходимо прочитать, для понимания темы про биндер и некоторых других. В одном посте: Общие слова об архитектуре и скриптовой модели сталкера "Класс object_binder" расширение онлайновых объектов, колбеки, сохранение состояния. "Класс net_packet" Регистрация скриптовых классов с помощью object_factory Серверные классы. Часть 1 Иерархия серверных классов, описание не закончено. Серверные классы. Часть 2 Картинка структуры наследования и несколько заключительных слов Клиентские классы Скрытый текст Класс game_object Интерфейс ко всем онлайновым (клиентским объектам) Класс hit для нанесения урона скриптом и другая информация (IQDDD) Некоторая информация по управлению путями патрулирования здесь (Kirag) и здесь (Taroz) Неполная информация по управлению памятью неписей с примером здесь (Bak) Физическая оболочка объектов (Garry_Galler) Пост о выборе (подборе) оружия НПС и стрельбы (*Shoker*) Скрытый текст Управление заданиями Класс CGameTask и другие вспомогательные классы и функции. Управление инфопорциями Функции, колбеки, форматы файлов Список специальных системных инфопорций (Unnamed Black Wolf) Система профилей и алгоритм генерации имён. Форматы файлов, функции Дополнительная информация по параметрам профилей terrain_sect (Kolmogor) Диалоги. Часть 1 Форматы файлов, базовые сведения Диалоги. Часть 2 Скриптовые диалоги Диалоги. Часть 3 Тематическая подборка функций управления диалогами Скрытый текст Функции времени Тематическая подборка функций, связанных с управлением игровым временем. Класс CTime Вспомогательный класс для управления игровым временем Полезная скриптовая функция с использованием CTime (Garry_Galler) Скрытый текст class ini_file (меченый(стрелок)) Класс FS и CSavedGameWrapper Бинарный доступ к файлам, в том числе в игровых архивах, управление сохранёнными играми. Скрипт уровня. Забытая фишка с колбеком на заход на уровень Класс vector Некоторая полезная информация о разных вещах (меченый(стрелок)) "Класс render_device" Направление и положение камеры, характеристики экрана, программная пауза игры и др. Некоторая информация о различиях между ТЧ и ЗП в системе оконных классов и колбеков. (lekzd) Неплохо бы развить эту тему! Некоторая полезная информация о скриптовых функциях из модуля _g.script. (lekzd) Также требует развития! Полезные функции для работы с графом игры (Garry_Galler) В одном посте: Класс profile_timer Отладочные измерения скорости работы фрагментов программы Класс client_spawn_manager Колбек на выход в онлайн без использования биндера. Работа с консолью. Класс CConsole Анимации цвета. Класс color_animator Всякие моргающие элементы в окнах и пр. Управление постэффектами. Скриптовые постэффекты. Класс effector Класс sound_object. Проигрывание звуков в игре в произвольном месте, от произвольного объекта, в голове актора. (Shadows) Пост удалён автором (прим. Kirgudu) Скрытый текст Оконные классы Некоторая общая информация о создании окон Список методов, XML-тегов и событий для оконных классов (ТЧ/ЧН/ЗП) (Norman Eisenherz) Представление материала в моих статьях оптимизировано для онлайнового просмотра. Если кому не хочется лазить по спойлерам, а нужно просмотреть текст какого-либо поста "потоком", то могу рекомендовать просмотр в режиме "текстовая версия". В этом же режиме удобно сохранять содержимое темы на диск. (прим. Malandrinus) Изменено 30 Июля пользователем Kirgudu 5 5 16 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
KD87 718 Опубликовано 10 Октября 2011 Поделиться Опубликовано 10 Октября 2011 7.9, с инвентарностью - никак. Все инвентарные объекты имеют и мировую модель, вот вся эта физика и относится к ней. Кстати, upd:torque и upd:force вряд ли работают (по крайней мере в ЗП). В оригинальном спавне все 24 байта, отведенные под эти переменные заполнены случайным мусором. То ли глюк xrAI, то ли он их специально так корежит. Ссылка на комментарий
*Shoker* 322 Опубликовано 11 Октября 2011 Поделиться Опубликовано 11 Октября 2011 (изменено) Тема не совсем об этом, но в другой теме это просто потеряется. Может кому пригодится - http://dl.dropbox.com/u/23885395/sm_wpns.script Скрипт для отлова выстрела из оружия. Работает тока с перехватчиком нажатия клавиш, который может отследить, что нажата\зажата кнопка стрельбы (а какая именно кнопка отвечает за стрельбу, это уже другая задача, при желании тоже решаемая, по умолчанию это левая клавиша мыши) В частности я пользовался этим - http://www.darkstalker.ru/forum/viewtopic.php?id=7 Есть ещё keyloger от kstn (у меня он перестал давно работать) и вроде как правки движка существуют. В sm_wpns.script находится только та часть, которая отвечает за контроль патронов в оружии и следит, чтобы колбек на стрельбу не сработал, если например открыт инвентарь (защита от разрядки оружия, т.к жмётся левая кнопка мыши, и кол-во патронов тоже меняется) Для работы необходимо поставить функцию sm_wpns.update() на, собстно, апдейт. А в скрипте, где у вас отлавливается момент зажатия кнопки стрельбы - sm_wpns.left_btn_clicked = true Точность практически стопроцентная, есть защита на случаи, если апдейт идёт медленнее, чем игрок стреляет. По крайнем мере у меня с лагами и бешеным RPM стрельбы ни одного патрона не потерялось. Работает с любым стрелковым оружием, будь то автомат или однозарядное РПГ, лишь бы питалось от патронов. Не работает с гранатами, биноклями, ножами (хотя его не проверил) да и вообще со всем, где счётчик патронов не меняется, хотя при желании, можно доработать. Сам скрипт прост, но зачем занаво изобретать велосипед. Изменено 11 Октября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Malandrinus 615 Опубликовано 11 Октября 2011 Автор Поделиться Опубликовано 11 Октября 2011 Для нажатий клавиш есть колбеки для ТЧ и ЧН в модифицированных dll. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
*Shoker* 322 Опубликовано 11 Октября 2011 Поделиться Опубликовано 11 Октября 2011 (изменено) Эх, забыл совсем... в ЗП работать не будет, т.к там вырезали функцию level.main_input_receiver(), а ею я проверяю, что не открыто никакого UI Так что её придётся как то заменить. В принципе она нужна, чтобы сделать защиту от срабатывания колбека на выстрел в момент разрядки оружия в инвенторе. Я уже делал её без использования level.main_input_receiver() (скрипт проверял, что в инвенторе новый предмет появлялся, не важно какой секции, и на 1 апдейт блочил срабатывание колбека на выстрел), там был тока глюк со сменой оружия в инвенторе, если кликнуть двойным шелчком мыши на оружие, т.к менялось оружие и патроны в нём + была нажата левая кнопка мыши, скрипт считал, что это был выстрел. Это можно предотвратить, если сравнивать ещё id текущего и предыдущего оружия, но я этим заниматься уже не буду. Так что в принципе после переделки, на ЗП работать будет тоже, просто чутка более громоздко. С ТЧ-ЧН работать должно. Сам тестировал на ЧН. Изменено 11 Октября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 11 Октября 2011 Поделиться Опубликовано 11 Октября 2011 *Shoker* ИМХО, скрипт 'отлова' ... сыроват. Уже говорил, что при смене режима стрельбы на подствольник - будет врать. При смене типа патронов (<Y>) - так же будет врать, если кол-во нового типа будет меньше. При использовании в слотах иных чем оружейные типы предметов (тех же артефактов/капсул при активации) - будут баги. ... и т.п. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 12 Октября 2011 Поделиться Опубликовано 12 Октября 2011 (изменено) Artos Дельные замечания... к сожалению их исправление потребовало больше усилий, чем я думал, также пришлось использовать нет-пакеты. http://dl.dropbox.com/u/23885395/sm_wpns.rar - в архиве две версии, для ТЧ-ЧН и для ТЧ-ЗП (более громоздкая) Также был использован скрипт для разбора нет-пакета из Simbion Mod-а от Artos'а Всё это добро тестировалось в ЧН, и я не могу дать гарантии, что скрипт sm_net_utils.script не устарел или будет корректно работать в ТЧ\ЗП Напоминаю, что скрипт работает лишь в связке с программой для отлова нажатия клавиш\кнопок мыши в игре. Новое в версии: Теперь в колбек стрельбы, помимо самого оружия, передаётся: Вторым аргументом - секция используемого патрона (есть тонкости с дробовиками, также определяет тип гранат в подстволе) Третим аргументом - true, если выстрел был из подствольника Четвёртым - таблица с разобранными параметрами оружия из его нет-пакета Исправлен баг со сменой патрона, и максимально минимизирована вероятность ошибки при стрельбе из подствола (см. ниже) 1) Баг, который не смог побороть, если в подствольном гранатомёте останется 1 граната, а в обойме 0 патронов (или обратная ситуация, когда в магазине 1 патрон, а в подстволе 0), то если зажать кнопку стрельбы, и жать на кнопку V (вкл\выкл гранатомёт) то каждое второе нажатие на V будет засчитываться как выстрел. Думаю что баг связан с особенностью определения того, что включён режим гранатомёта. К счастью, вероятность повторить баг случайно довольно низкая, т.к для него нужно слишком много условий. 2) В дробовики можно зарядить одновременно разные типы патронов, но скрипт определяет только последний заряженный тип патрона, так что если например в Винчестр зарядить 2 жекана, 2 дротика и 2 дроби, то все 6 выстрелов зачтутся как дробь. 3) Существует маленькая, но всё же вероятность не срабатывания колбека на выстрел. От чего зависет - не выяснил. Случается крайне редко с автоматами. А вот с ружьём один раз вышло около 4 пропусков. Подозреваю это связано с плохой работой используемого мной кейлогера, и некоторые нажатия на кнопку выстрела просто не срабатывают\опаздывают или не успевают обработаться скриптом. Во время стрельбы, каждый апдейт разбирается нет-пакет оружия. Я багов и тормозов не заметил, но не факт что какая то бяка не вылезет во время длительной игры. Также всё это тестировалось под ЧН, корректная работа скрипта sm_net_utils в ТЧ/ЗП не гарантируется, и возможно его придётся заменить на другой аналог. В любом случае, мне стопроцентная точность не нужна, поэтому дальше работать над скриптом я не буду, но если у кого то появятся идеи, как излечить данные баги\улучшить скрипт, то я попробую их реализовать. PS: Artos, хотел спросить, при разборе update-пакета оружия я нашёл в твоём скрипте (m_net_utils.script, не уверен, что последней версии) флаг updgrenade_mode, но он мне возвращал значение nil, так что пришлось проверку на подствольник делать через weapon_state, это не совсем корректно, но выстрел из гранаты определяет точно. Ты не знаешь, для чего тогда этот флаг? И почему он не работает. Изменено 12 Октября 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 12 Октября 2011 Поделиться Опубликовано 12 Октября 2011 *Shoker*, зря ты вместо топиков по ковыряниям в скриптах стал "увековечивать" в топике-справочнике ... Во-первых, там, где требуется скорость выполнения вычислений порой использование стандартных библиотек и избыточно и приводит к протере скорости. По сути тебе всего то требуется считывать последние параметры из нет-пакета оружия, что можно было гораздо проще организовать. Модуль нет-пакетов, использованный тобою, полностью рабочий для ТЧ/ЧН/ЗП. Параметр 'updgrenade_mode', о котором ты срашиваешь, никуда не делся с 2008 года. Он относится к оружию, которое имеет подствольник или возможность его установки. Как раз этот параметр мог бы помочь еще более оптимизировать скорость, т.к. и оружие не класса 'cse_alife_item_weapon_magazined_w_gl' или с параметром не равным 1 (подствольник штатно не установлен) и т.п. - можно не проверять на подствольные заряды. Чтобы получать параметры типа 'upd' (UPDATE_Read|UPDATE_Write) - требуется вызывать с флагом 'true': local p = sm_net_utils.Get_Data_Weapon(sobj,true) --/ полный пакет В общем, подобные функции, на которую ты замахнулся, не могут быть простыми, т.к. имеют множество и входных условий и вариаций, и пишутся исходя из потребностей и возможностей конкретного мода. ИМХО. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Kirag 39 Опубликовано 13 Октября 2011 Поделиться Опубликовано 13 Октября 2011 (изменено) Кстати, об update-пакете. Считать данные оттуда - без вопросов, а вот получалось ли у кого-нибудь данные туда результативно записать? Допустим, спавн оружия. В state-пакет вписываю, что надо, и спавнится с нужным визуалом, типом-количеством патронов и т.д. - все прекрасно работает. Пытаюсь одновременно в update-пакет прописать тот же updgrenade_mode - толку ноль, все равно спавнится в обычном режиме, с выкл подстволом. Режим стрельбы тоже только по умолчанию, что бы не вписывал. Причем сразу после записи (в тот же момент времени) пытался update-пакет считать снова - вроде все и прекрасно записалось, да только толку с того ноль - на состоянии оружия не отражается. Может, с update-пакетом надо как-то по-другому работать, чем со state-пакетом? P.S. В корректности разбора update-пакета полностью уверен, учитывал и класс оружия, и порядок следования данных, результаты чтения тоже вполне ожидаемые. Artos Попробую с НПС. Хотя, у них же еще и state-здоровье есть, непонятно, которое из них срабатывает... Изменено 14 Октября 2011 пользователем Kirag Мои работы: Ночные прицелы + смена ножевого слота AI вертолетов + ПЗРК Soul Cube Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем. Ссылка на комментарий
Artos 99 Опубликовано 13 Октября 2011 Поделиться Опубликовано 13 Октября 2011 (изменено) Kirag, насчет оружия и update-пакетов для него - только что в топике по скриптованию есть информация для размышлений и сведений. А вот на вопрос: " а вот получалось ли у кого-нибудь данные туда результативно записать?" - могу ответить утвердительно. Тот же параметр здоровья (health + upd:health) для неписей (хоть в он-лайне, хоть в офлайне) очень помогает и убивать и ранить и оживлять. Изменено 13 Октября 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AndreySol 215 Опубликовано 6 Ноября 2011 Поделиться Опубликовано 6 Ноября 2011 (изменено) CUIWindow - базовый класс для всех остальных оконных классов Вопрос такой возник по базовым методам оконных классов: local hud = get_hud() local cs = hud:GetCustomStatic("hud_show_time") if cs == nil then hud:AddCustomStatic("hud_time_static", true) hud:AddCustomStatic("hud_show_time", true) cs = hud:GetCustomStatic("hud_show_time") end local time_h = level.get_time_hours() local time_m = level.get_time_minutes() local msg = string.format("%02d:%02d", time_h, time_m) if cs ~= nil then cs:wnd():SetText(msg) -- это работает cs:wnd():SetTextColor(100,250,10,10) -- это работает cs:wnd():SetWndPos(100, 200) -- это работает cs:wnd():Show(false) -- а вот это не работает !!! end есть какое-то объяснение такой не любви движка к этому методу класса ? И еще, вышеуказанным способом local hud = get_hud() local cs = hud:GetCustomStatic("static_weapon") if cs == nil then ...................... получить доступ к любому базовому статику на худе не получается, cs всегда == nil. У меня по крайней мере. В чем проблема ? И еще, будет или нет дополнение описания этого базового класса ? К примеру методы SetAutoDelete(bool); bool IsAutoDelete(); для чего они ? Изменено 6 Ноября 2011 пользователем AndreySol Ссылка на комментарий
Malandrinus 615 Опубликовано 11 Ноября 2011 Автор Поделиться Опубликовано 11 Ноября 2011 AndreySol, local cs = hud:GetCustomStatic("hud_show_time") ... cs:wnd():Show(false) -- а вот это не работает !!! есть какое-то объяснение такой не любви движка к этому методу класса ? кастомстатики, создаваемые через ui_custom_msgs.xml, - достаточно специфические. Если нужны с ними изыски, то лучше всего непосредственно в ui_custom_msgs.xml ничего не создавать, только пустое окно без текстуры и вообще всего. А само наполнение сделать отдельно и поместить на статик с помощью AttachChild. С этим окном уже все операции будут работать без проблем. И еще, вышеуказанным способом ... получить доступ к любому базовому статику на худе не получается, cs всегда == nil. Я ничего не понял. Что такое базовый статик? SetAutoDelete(bool); bool IsAutoDelete(); для чего они ? ставят/снимают флажок автоудаления окна при его отсоединении от родительского или удалении родительского. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
AndreySol 215 Опубликовано 12 Ноября 2011 Поделиться Опубликовано 12 Ноября 2011 в xml-файлах описания окна ивентаря есть такой статик <dragdrop_belt x="645" y="136" width="410" height="60" cell_width = "60" cell_height="60" rows_num="1" cols_num="5"/> какой из оконных классов используется для этого статика ? Ссылка на комментарий
Malandrinus 615 Опубликовано 13 Ноября 2011 Автор Поделиться Опубликовано 13 Ноября 2011 AndreySol, в xml-файлах описания окна ивентаря есть такой статик <dragdrop_belt x="645" y="136" width="410" height="60" cell_width = "60" cell_height="60" rows_num="1" cols_num="5"/> какой из оконных классов используется для этого статика ? Первое, это не статик. Статик - это вполне конкретный класс CUIStatic, один из многих оконных классов. Второе, класс для этого элемента не экспортирован и никак в скриптах не доступен. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
AndreySol 215 Опубликовано 13 Ноября 2011 Поделиться Опубликовано 13 Ноября 2011 (изменено) класс для этого элемента не экспортирован и никак в скриптах не доступен. Весело ! А как тогда реализовать подобный функционал ? Особенно, с учетом того, что скорее всего, события начала перетаскивания\сброса объекта то-же не доступны для скриптера ? никак не реализовать, бывает и такое в модостроении =) Изменено 13 Ноября 2011 пользователем malandrinus Ссылка на комментарий
_Призрак_ 11 Опубликовано 14 Ноября 2011 Поделиться Опубликовано 14 Ноября 2011 Список параметров с пояснениями, которые можно указать в xml файлах. Там где знал что означают параметры ставил коментарий db_click - Не используется (Мысли: возможно устанавливает возможность записи в editBox только после дабл клика, а не после одиночного клика) numonly - (bool) установка возможности вводить только цифры в EditBox. float - (bool) установка возможности вводить только цифры с плавающей запятой(float) password - (bool) установка скрытия вводимых символов под знаком звёздочка (*) max_symb_count - (int) Максимальное поличество символов accel - (string) событие клика кнопки, при нажатии указанной клавиши на клавиатуре. shadow_offset_x - (int) позиция тени shadow_offset_y - (int) позиция тени hint - (string) установка всплывающей подсказки при наведении. check_mode - (bool) x_offset y_offset frames duration columns frame_width frame_height cyclic autoplay accel - (string) событие клика кнопки, при нажатии указанной клавиши на клавиатуре. accel_ext - (string) Видимо выход shadow_offset_x - (int) Смещение тени по х shadow_offset_y - (int) Смещение тени по у push_off_x - (int) Смещение при нажатии по х push_off_y - (int) Смещение при нажатии по х hint - (string) установка всплывающей подсказки при наведении. list_length - (int) Длина списка. Зачем указывается - без понятия always_show_scroll - (bool) Всегда показывать скрол бар vertical - (bool) вертикальная линия или горизонтальная align - (string - (l, c, r)) выравнивание текста по горизонтали относительно виджета. Где: "l" --по левому краю "c" --по центру "r" --по правому краю item_height - (int) Высота каждого элемента active_bg - (bool) Назначение неизвестно, используется, но используется только в положении 0 scroll_profile - (string) Используется только со значением pda always_show_scroll - (bool) Всегда показывать скрол always_hide_scroll - (bool) Никогда не показывать скролл flip_vert - (bool) horz - (bool) горизонтальный или вертикальный min - (int) Минимальное положение max - (int) Максимальное положение pos - (int) Начальная позиция inertion - Не используется right_ident - (int) left_ident - (int) top_indent - (int) bottom_indent - (int) vert_interval - (int) Возможно интервал, на сколько пикселей опускается лист при скролле scroll_profile - (string) Используется только со значением pda flip_vert - (bool) always_show_scroll - (bool) Всегда показывать скрол can_select - (bool) Возможно возможность выбрать элемент heading - (bool) light_anim - (string) la_cyclic la_text la_texture la_alpha xform_anim xform_anim_cyclic highlight_text - (bool) Преобразует строчные буквы в заглавные hA - (int) hR - (int) hG - (int) hB - (int) clipper - (bool) обрезание элементов виджета, если они выходят за пределы его размеров. complex_mode - (bool) Возможность установки нескольких строк radio - (bool) Возможность установки нескольких элементов is_integer - (bool) invert - (bool) step - (float) Размер шага Freedom Ссылка на комментарий
Real Wolf 34 Опубликовано 16 Ноября 2011 Поделиться Опубликовано 16 Ноября 2011 open_inventory_box Данная функция была добавлена в r17. Судя по названию и коду, должна открывать инвентарь. Но как именно её использовать кто-нибудь знает? И передавать нужно серверный объект того ящика, который хотим открыть? Ссылка на комментарий
Artos 99 Опубликовано 16 Ноября 2011 Поделиться Опубликовано 16 Ноября 2011 Real Wolf, не нужно путать справочник по 'штаным' классам/функциям оригинальных игр с различными расширителями. Твой вопрос уместен в топике "X-Ray extensions" "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 334 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 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. Ссылка на комментарий
Полтергейст 38 Опубликовано 6 Декабря 2011 Поделиться Опубликовано 6 Декабря 2011 (изменено) В дополнение к таблице соответствия серверных и клиентских классов (пост №29): в файле xr_game.dll ближе к концу есть упоминания соответствий серверных и клиентских классов (причём внутри движка имена этих классов могут отличаться от тех, что экспортированы в LUA). Кроме этого, классы делятся на парные и непарные. Непарные остаются без соответстия, т.е. они "чисто серверные" или "чисто клиентские". Если я правильно понял, непарные классы наследованы от неэкспортируемого класса CObjectItemSingle, парные - от CObjectItemClientServer. Вырезка из файла xr_game.dll (убраны нечитаемые символы) под спойлером. CObjectItemClientServerSingleMp<class CActor,class CActorMP,class CSE_ALifeCreatureActor,class CSE_ActorMP>::server_object CObjectItemSingle<class CLevel,1>::server_object CObjectItemSingle<class CGamePersistent,1>::server_object CObjectItemSingle<class CHUDManager,1>::server_object CObjectItemSingle<class game_sv_Single,1>::server_object CObjectItemSingle<class game_sv_Deathmatch,1>::server_object CObjectItemSingle<class game_sv_TeamDeathmatch,1>::server_object CObjectItemSingle<class game_sv_ArtefactHunt,1>::server_object CObjectItemSingle<class game_cl_Single,1>::server_object CObjectItemSingle<class game_cl_Deathmatch,1>::server_object CObjectItemSingle<class game_cl_TeamDeathmatch,1>::server_object CObjectItemSingle<class game_cl_ArtefactHunt,1>::server_object CObjectItemSingle<class CUIGameSP,1>::server_object CObjectItemSingle<class CUIGameDM,1>::server_object CObjectItemSingle<class CUIGameTDM,1>::server_object CObjectItemSingle<class CUIGameAHunt,1>::server_object CObjectItemSingle<class CSE_ALifeGroupTemplate<class CSE_ALifeMonsterBase>,0>::client_object CObjectItemSingle<class CSE_ALifeGraphPoint,0>::client_object CObjectItemSingle<class CSE_ALifeOnlineOfflineGroup,0>::client_object CObjectItemClientServer<class CSpectator,class CSE_Spectator>::server_object CObjectItemClientServer<class CAI_Flesh,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CChimera,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CAI_Dog,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CAI_Stalker,class CSE_ALifeHumanStalker>::server_object CObjectItemClientServer<class CAI_Bloodsucker,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CAI_Boar,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CAI_PseudoDog,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPsyDog,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPsyDogPhantom,class CSE_ALifePsyDogPhantom>::server_object CObjectItemClientServer<class CBurer,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPseudoGigant,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CController,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPoltergeist,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CZombie,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CFracture,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CSnork,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CCat,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CTushkano,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPhantom,class CSE_ALifeCreaturePhantom>::server_object CObjectItemClientServer<class CAI_Trader,class CSE_ALifeTrader>::server_object CObjectItemClientServer<class CAI_Crow,class CSE_ALifeCreatureCrow>::server_object CObjectItemClientServer<class CCar,class CSE_ALifeCar>::server_object CObjectItemClientServer<class CHelicopter,class CSE_ALifeHelicopter>::server_object CObjectItemClientServer<class CMercuryBall,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CBlackDrops,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CBlackGraviArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CBastArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CDummyArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CZudaArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CThornArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CFadedBall,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CElectricBall,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CRustyHairArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CGalantineArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CGraviArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CWeaponMagazined,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponMagazinedWGrenade,class CSE_ALifeItemWeaponMagazinedWGL>::server_object CObjectItemClientServer<class CWeaponFN2000,class CSE_ALifeItemWeaponMagazinedWGL>::server_object CObjectItemClientServer<class CWeaponAK74,class CSE_ALifeItemWeaponMagazinedWGL>::server_object CObjectItemClientServer<class CWeaponLR300,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponHPSA,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponPM,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponFORT,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponBinoculars,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponShotgun,class CSE_ALifeItemWeaponShotGun>::server_object CObjectItemClientServer<class CWeaponSVD,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponSVU,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponRPG7,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponVal,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponVintorez,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponWalther,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponUSP45,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponGroza,class CSE_ALifeItemWeaponMagazinedWGL>::server_object CObjectItemClientServer<class CWeaponKnife,class CSE_ALifeItemWeapon>::server_object CObjectItemClientServer<class CWeaponBM16,class CSE_ALifeItemWeaponShotGun>::server_object CObjectItemClientServer<class CWeaponRG6,class CSE_ALifeItemWeaponShotGun>::server_object CObjectItemClientServer<class CWeaponAmmo,class CSE_ALifeItemAmmo>::server_object CObjectItemClientServer<class CScope,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CSilencer,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CGrenadeLauncher,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CBolt,class CSE_ALifeItemBolt>::server_object CObjectItemClientServer<class CMedkit,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CAntirad,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CFoodItem,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CBottleItem,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CExplosiveItem,class CSE_ALifeItemExplosive>::server_object CObjectItemClientServer<class CInfoDocument,class CSE_ALifeItemDocument>::server_object CObjectItemClientServer<class CInventoryItemObject,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CScientificOutfit,class CSE_ALifeItemCustomOutfit>::server_object CObjectItemClientServer<class CStalkerOutfit,class CSE_ALifeItemCustomOutfit>::server_object CObjectItemClientServer<class CMilitaryOutfit,class CSE_ALifeItemCustomOutfit>::server_object CObjectItemClientServer<class CExoOutfit,class CSE_ALifeItemCustomOutfit>::server_object CObjectItemClientServer<class CF1,class CSE_ALifeItemGrenade>::server_object CObjectItemClientServer<class CRGD5,class CSE_ALifeItemGrenade>::server_object CObjectItemClientServer<class CExplosiveRocket,class CSE_Temporary>::server_object CObjectItemClientServer<class CMPPlayersBag,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CCustomZone,class CSE_ALifeCustomZone>::server_object CObjectItemClientServer<class CMosquitoBald,class CSE_ALifeAnomalousZone>::server_object CObjectItemClientServer<class CMincer,class CSE_ALifeAnomalousZone>::server_object CObjectItemClientServer<class CRadioactiveZone,class CSE_ALifeAnomalousZone>::server_object CObjectItemClientServer<class CHairsZone,class CSE_ALifeZoneVisual>::server_object CObjectItemClientServer<class CLevelChanger,class CSE_ALifeLevelChanger>::server_object CObjectItemClientServer<class CScriptZone,class CSE_ALifeSpaceRestrictor>::server_object CObjectItemClientServer<class CSmartZone,class CSE_ALifeSmartZone>::server_object CObjectItemClientServer<class CTeamBaseZone,class CSE_ALifeTeamBaseZone>::server_object CObjectItemClientServer<class CTorridZone,class CSE_ALifeTorridZone>::server_object CObjectItemClientServer<class CSpaceRestrictor,class CSE_ALifeSpaceRestrictor>::server_object CObjectItemClientServer<class CAmebaZone,class CSE_ALifeZoneVisual>::server_object CObjectItemClientServer<class CNoGravityZone,class CSE_ALifeAnomalousZone>::server_object CObjectItemClientServer<class CSimpleDetector,class CSE_ALifeItemDetector>::server_object CObjectItemClientServer<class CTorch,class CSE_ALifeItemTorch>::server_object CObjectItemClientServer<class CPda,class CSE_ALifeItemPDA>::server_object CObjectItemClientServer<class CProjector,class CSE_ALifeObjectProjector>::server_object CObjectItemClientServer<class CWeaponMounted,class CSE_ALifeMountedWeapon>::server_object CObjectItemClientServer<class CWeaponStatMgun,class CSE_ALifeStationaryMgun>::server_object CObjectItemClientServer<class CHangingLamp,class CSE_ALifeObjectHangingLamp>::server_object CObjectItemClientServer<class CPhysicObject,class CSE_ALifeObjectPhysic>::server_object CObjectItemClientServer<class CScriptObject,class CSE_ALifeDynamicObjectVisual>::server_object CObjectItemClientServer<class CBreakableObject,class CSE_ALifeObjectBreakable>::server_object CObjectItemClientServer<class CClimableObject,class CSE_ALifeObjectClimable>::server_object CObjectItemClientServer<class CPhysicsSkeletonObject,class CSE_ALifePHSkeletonObject>::server_object CObjectItemClientServer<class CDestroyablePhysicsObject,class CSE_ALifeObjectPhysic>::server_object CObjectItemClientServer<class CInventoryBox,class CSE_InventoryBox>::server_object Как видно, клиентскому классу CZombie соответствует серверный CSE_ALifeMonsterBase. Изменено 6 Декабря 2011 пользователем Полтергейст Ссылка на комментарий
AndreySol 215 Опубликовано 10 Декабря 2011 Поделиться Опубликовано 10 Декабря 2011 в классе CUIListWnd есть метод ShowSelectedItem(...). Работает, но отображение выделения эл-та не соответствует высоте самого эл-та. Это можно побороть ? Добавлено через 16 мин.: класс Frect - 6 переменных, ф-ция set инициализирует только 4. Какие из них ? Зачем две остальных. Как это использовать ? Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти