Malandrinus 615 Опубликовано 20 Января 2011 Garry_Galler, Только принято это делать на аглицком языке. А я всегда на русском пишу. Не настоящий программист, наверное =) Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 20 Января 2011 IQDDD, зачем так категорично? При освоении нового языка программирования знание любого другого весьма помогает. Тем более, что Lua в чём-то близок к Паскалю. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 21 Января 2011 Garry_Galler, Закрыть то таким способом окно можно, а вот открыть не получится. Окна инвентаря, пда, торговли, обыска создаются движком С торговлей несколько лучше. Есть метод актора switch_to_trade, который открывает окно торговли из разговора. Ну и разговор можно открыть: run_talk_dialog. пда и прочее - да, это никак. Кстати, знает ли кто, что как-бы пда открыть можно? Делается это в обучалках. "Ка-бы" потому, что толку от этого ноль, поскольку в этом режиме блокируется ввод. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 23 Января 2011 IQDDD, return без явного объявления возвращает nil, что в условий эквивалентно логической лжи. Это почти так. Иногда встречал вылеты в такой ситуации и смысл сообщения был в том, что "значения нет вообще", а не то, что оно равно nil. В частности, пусть есть функция fun1, принимающая bool. Пусть есть вторая fun2, просто с return. У меня иногда был вылет в такой ситуации: fun1(fun2()) Особенно, если fun1 - движковая, а не скриптовая. В общем, если нужно вернуть логическое значение - верните nil или false, но не "ничего". AKKK1, Для АМК. Спавн с выдачей SID_а: Есть только одна проблема. При этом sid не регистрируется в игре, т.е. он назначен объекту, а поиск по нему делать не выйдет (ну и соответственно в логике не будет работать). Причём, вроде даже не поможет вывести объект в оффлайн, поскольку регистрация происходит при создании/загрузке серверного объекта. Т.е. придётся ждать смены уровня или сохранения/загрузки. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 31 Января 2011 antreg, для окна диалога нужен объект-собеседник. Это принципиально хотя бы потому, что диалоги берутся из профиля собеседника, да и просто нужен объект и все тут. Если собеседник есть, то есть функция для открытия окна диалога, но собеседник должен быть в пределах кажется 3-х метров, чтобы это нормально работало. А если собеседника нет, то движковым диалогом попросту не воспользоваться. Пиши свой полностью скриптовый. Если ты имел в виду, что собеседник есть, но просто надо инициировать разговор скриптово, то думаю надо типа такого сделать: Рестриктор с логикой на вход актора. Там вызов функции, в которой уже вызывается диалог. Функцию не помню. Приводил в справочнике, посмотри там. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 31 Января 2011 antreg, тогда никак. Для вызова движкового окна диалога собеседник нужен обязательно. Ничто однако не мешает тебе написать полностью свой диалог. Муторно, естественно, но возможно. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 4 Февраля 2011 AKKK1, типа такого наверное: function talk_to_me() local npc = level.object_by_id(alife():story_object(<npc_sid>).id) db.actor:run_talk_dialog(npc) end здесь <npc_sid> - это story_id непися-невидимки рядом. Ну а уже неписю прописываешь нужные диалоги. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 20 Марта 2011 TRAMP14, А где можно получить полную таблицу clsid? Это не таблица, а userdata. Проще говоря, это такой же класс, как и все остальные экспортированные из движка классы, только содержащий одни константы. Нет способа узнать скриптом, сколько там полей. С другой стороны, там только те константы, которые зарегистрированы движком (и их там фиксированное количество) и те, которые добавлены туда скриптом class_registrator.script. Так что можно составить их список вручную. Полтергейст, Циклы "for k,v in pairs(tbl) do" неприменимы к одномерным таблицам (вместо k и v можно написать всё, что угодно). Признаться, не понял, что такое "одномерные таблицы". Функция pairs применима к абсолютно любой таблице. TRAMP14, что значит next(название таблицы)? это основы Lua. Значит надо смотреть здесь www.lua.ru Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 25 Марта 2011 TRAMP14, А можно как либо получить визуал непися? В ЗП есть функции get_visual_name и set_visual_name. Ну если не ЗП, то через нетпакет, как здесь уже объясняли. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 21 Мая 2011 Desertir, Такой вопрос, а как работает функция start_stop_menu класса CDialogHolder, т.е. прошу объяснить ее точное назначение. Как я понимаю она нужна для закрытия и открытия окон, но по конкретней пожалуйста. Да и вообще класс CDialogHolder для чего он нужен, для чего используется. Не полное описание, но минимальный набор приёмов использования есть в этом посте справочника. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 7 Июня 2011 Kirag, Заставить НПС смотреть туда и только туда, куда надо, плевать, под какой он схемой. Особенно по вертикали. насколько я понимаю, все схемы и состояния так или иначе сводятся к вызову одного из вариантов функции set_sight. Вот чуть более полное описание аргументов, чем сейчас в справочнике: // куда смотрит void set_sight(enum SightManager::ESightType <sight_type>, const vector*, DWORD dwLookOverDelay); void set_sight(enum SightManager::ESightType <sight_type>, const vector&, bool <torso_look???>); void set_sight(enum SightManager::ESightType <sight_type>, const vector*); void set_sight(enum SightManager::ESightType <sight_type>, bool <torso_look>, bool <path>); // на кого смотрит void set_sight(game_object* <object_to_look>); void set_sight(game_object* <object_to_look>, bool <torso_look>); void set_sight(game_object* <object_to_look>, bool <torso_look>, bool <fire_object>); void set_sight(game_object* <object_to_look>, bool <torso_look>, bool <fire_object>, bool <no_pitch>); Думаю, одна из них сработает так, как тебе надо. Однако с логикой всё равно может конфликтовать. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 15 Июня 2011 Massaraksh, Решил скриптово добавить новую консольную команду. Это не получится. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 11 Июля 2011 KD87, имеет другой скриптовый класс, нежели другие аномалии, несмотря на то, что движковый класс у них один. Зачем такое делать, мне не совсем понятно Ну к примеру, чтобы хранить какие-то данные в серверном классе. Да и вообще, мало ли кто добавит свой новый класс для какого угодно объекта. Мне однако интересно, как можно разрулить это автоматически. Получается, надо прочитать из секции имя сета, найти скриптовый серверный класс в class_registrator, потом разделить имя на модуль и имя класса, разпарсить модуль и найти объявление класса вида class "имя класса" (движковый класс) тогда можно найти собственно движковый класс и понять, как разбирать пакет. Perl я не знаю, но там кажется регулярные выражения рулят, так что это сделать несложно. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 11 Июля 2011 (изменено) KD87, По этой же причине мне неясно, как такое провернуть через class_registrator. Мы же всегда читаем имя секции в составе данных cse_abstract. Дальше можно остановиться, прочесть секцию в конфиге и узнать имя сета, прочесть class_registrator и по имени сета найти скриптовый класс, прочитать скрипт, найти объявление класса и узнать базовый движковый, ну и парсить данные дальше уже точно зная имя класса. И не надо заморачиваться на точное знание соответствий секций и классов. Надо конечно закешировать найденное соответствие, не делать же эту процедуру на каждый объект. Правда придётся подсовывать в придачу к папке конфига ещё и папку со скриптами. Изменено 11 Июля 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 12 Июля 2011 KD87, как определить остальные классы? движковые сеты надо конечно знать, но их фиксированное число. Я естественно говорил только о скриптовых. Но если подумать, то да, выходит, что надо ещё и вытаскивать из скриптов ту добавку, что они добавляют в нетпакет, а это уже автоматизированно не сделать. Если брать ситуацию со спавном солянки, имеем, что, zone_ogon имеет движковый класс ZS_MBALD. Скрипт лезет за подходящим сетом в class_registrator и находит там se_zone_anom. Но формат M_SPAWN в спавне-то именно cse_alife_anomalous_zone. Признаться, вот это само по себе вызывает вопросы. В аллспавн значит данные есть только до cse_anomalous_zone, между тем как se_zone_anom представляет собой cse_anomalous_zone + флажок 1 байт + время (при флажке == 1). Вот как может быть скриптовый класс se_zone_anom, если в спавне для него нет данных? Он прочитает пакет до конца cse_anomalous_zone и будет читать дальше, но дальше то нет ничего. Он прочитает не понять какое значение флажка, а потом ещё и может попытаться прочитать какое-то время. Вот это и странно. Это вообще работает? Нет ли здесь большого косяка? Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 19 Июля 2011 Kirag, Я же так понимаю, что при этом в неявном виде перебирается инвентарь? Если проверка такая одна, и хлама мало, так и черт бы с ним, а если их много, а в инвентаре хлама вагон? Или я ошибаюсь насчет перебора? не ошибаешься, там стоит цикл перебора. Это конечно движковый перебор, а не скриптовый, и не всех объектов на уровне, а только инвентаря, так что не столь уж и смертельно, но в самом деле лишнее. Тем более ты приводил и другие соображения и они также совершенно верны. Но ты сейчас интересную тему поднял. Есть некоторые функции, которые вроде и движковые, но достаточно тормозные. Достаточно небезобидный вызов - это к примеру вот это alife():object(id). Когда я ещё не лазил внутрь, то думал, что там сделано по уму - заведён массив указателей на 65536 позиций и объект берётся по индексу. А оказалось нет, тупой перебор. Опять же, это перебор движковый в линейном массиве, происходит относительно быстро. Но именно что относительно, поэтому крайне желательно избегать этого вызова и следовать стратегии "хранить объект и не искать его заново". Вызов level.object_by_id(id) в общем примерно такой же, просто перебирает клиентские объекты, а их естественно меньше. Но тоже желательно избегать. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 20 Июля 2011 KD87, работает ли accuracy() из game_object? Kirag, С НПС - не знаю, а db.actor:accuracy() используется, например, при определении, целится ли актор в принципе: Это функция, которая возвращает разброс в радианах при стрельбе из текущего ствола. Работает для сталкеров и актора, но по-разному. Для актора зависит от режима прицеливания, положения тела, скорости перемещения и точности текущего ствола. Для сталкеров зависит от ранга, положения тела, состояния прицеливания и состояния (не скорости) перемещения и НЕ зависит от оружия. P.S.: Это кстати не значит, что точность сталкеров при стрельбе не зависит от точности оружия. Просто эта функция так работает, а где и в комбинации с чем используется - я не знаю. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 29 Июля 2011 Kirag, По поводу flush такое чувство, что она сохраняет в файл не только то, что накопилось в консоли с прошлого вызова (как и следовало бы сделать по уму), а все целиком - с запуска игры. Так и есть, поэтому использовать это надо только в отладочных целях, ни в коем случае в релизной версии. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 3 Августа 2011 Artos, в качестве дополнения. В ЗП функция error_log рушит систему (как вероятно и задумывалось). Да и незачем заморачиваться в ЧН или ЗП с игровым логом, который тормозной и с ограничениями, при том, что можно выводить в произвольный файл через пространство имён io. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение
Malandrinus 615 Опубликовано 12 Сентября 2011 Artos, Как оптимально определить тип таблицы 'список' (list), т.е. типа: {"a","b","c","d"} или {1,5,2,4,3}? На мой взгляд нет такого способа. Ведь между этими таблицами нет никакой принципиальной разницы. Только в типе ключей и в наличии/отсутствии разрывов в последовательности ключей. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Поделиться этим сообщением Ссылка на сообщение