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

[SoC] Ковыряемся в файлах


Halford

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

malandrinus, а у меня при попытке получить что-нибудь из рюкзака через object_by_id идёт nil. Да и ваш эксперимент свидетельствует как раз о том, что в рюкзаке всё серверное. Ведь что такое рюкзак для игры? Это упоминание в виде иконок об объектах, которыми может пользоваться актор. Самих объектов в игровом мире нет. Есть только лишь иконки да худ. А вы при выкидывании видите только худ. Разве не так? Вот ещё довод: single построен на базе мультиплеера. Вряд ли в мультиплеере содержимое рюкзака будет у клиента. Скорее у сервера во избежание читёрства.

Начну с конца. Мультиплей мне не интересен, посему много о нём не знаю. Но слышал неоднократно о том, что читерят там по-чёрному =)

С инвентарём ты как-то усложняешь. Объект остаётся объектом даже при помещении в инвентарь. И в онлайне остаётся. Более того, как я писал выше, статус инвентарного объекта привязан к статусу объекта контейнера. В частности, на этом основан аддон (не помню уже чей) для лечения фризов. Фризы связаны с переходом в онлайн немерянного числа пачек патронов, которые обычно распиханы по нычкам. Так там все ящики помещались принудительно в онлайн и соответственно всё нахомяченное барахло в них тоже было постоянно в онлайне.

Когда-то я тоже думал, что логично было бы при помещении предмета в инвентарь/ящик убирать его с концами в оффлайн. И был немало удивлён, что это не так.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
Почему лог иногда после вылета стирается ПОЛНОСТЬЮ?То есть че это значить может?

Он не то чтобы полностью стирается, он просто не успевает записаться. После некоторых вылетов игра просто рушится, а тот лог, который забуферизировался в памяти, писать уже некому. Есть такая консольная команда "flush". Она записывает на диск лог, который накопился на данный момент. Но проблему это не решает. Что уже накопилось запишется, но узнать в какой момент рухнула программа и по какой причине всё равно будет невозможно.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
А вообще есть идеи по природе вылета?

Это может быть что угодно. Как правило, вылет без лога бывают при неправильных аргументах в вызовах функций самой игры. Например, значение nil в вызове

get_console():execute(nil)

приведёт к вылету без лога. Вообще-то можно кинуть камешек в разработчиков - такого быть по идее не должно.

 

Еще вопрос:

Можно ли из ЭТОГО хоть какую-то информацию извлечь?

Ничего не даёт.

xrGame.dll - это основная часть движка. Равносильно указанию "ошибка произошла в игре"

XRLUA.DLL - скорее всего адаптированная под игру скрипт-машина Lua. "Что-то со скриптами" =)

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
xrCore.dll - какбы то что всем движет

xrCore.dll маленький очень. xrGame.dll имеет размер почти 6 Мб, а xrCore.dll не больше одного. Да ещё, если в него заглянуть, больше чем наполовину забит нулями и всякими сообщениями. Кроме того, именно в xrGame.dll находятся все классы, с которыми идёт работа в игре.

А собственно какая разница!? проблему это всё равно не решит.

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
Но она не действует, в идли состояние висит и всё.

Какие идеи есть?

Почитать статью на Wiki Спавн телепортов через скрипт

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

Taroz,

 

заспавнить рабочую аномалию с помощью функций АМК

local shapes = {}
shapes[1]={}
shapes[1].shtype=0
shapes[1].radius = 4
shapes[1].center = vector():set(0,0,0)

amk_anoms.spawn_anomaly("amk_zone_mincer_weak", pos, gvid, lvid, shapes, "on")

надо только задать pos, gvid, lvid

 

Если разбираться, то там созданная аномалия перепаковывается с помощью нетпакетов. Ну и кажется в самом классе аномалии ещё накручено.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
а чем не подходит обычный спавн аномалии через стандратную функцию спавна аномалий?

Ну, как было не раз отмечено, при спавне аномалии через create она появляется, но толку с неё, что радости с фальшивых ёлочных игрушек =)

Т.е. видимость есть, но аномалия не работает, сталкеры её не обходят и т.д.

 

Попробуй для примера сделать так:

local actor_gvid = db.actor:game_vertex_id()
local actor_lvid = db.actor:level_vertex_id()
local actor_pos = db.actor:position()
alife():create("amk_zone_mincer_weak", actor_pos, actor_lvid, actor_gvid)

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
стандратную функцию спавна аномалий

А что это за функция?

 

Есть ли способ определить здоровье НПС в данный момент?

З.Ы. obj.health - не писать,это прирост здоровья а не оно само.

Да оно это =) просто на запись - это прирост, а на чтение - само здоровье

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

Господа, нет ли у кого английской версии сталкера? Мне нужен для теста файл архива *.db от этой версии. Разумеется, самый маленький, какой только найдётся. Хочу протестировать работоспособность своих плагинов для Total Commander.

 

апдейт актора падает из-за не критичной ошибки в скрипте или из-за большой нагрузки

Подтверждаю. И не только актора, но и любой другой. Экспериментировал недавно с объектом биндера для гранаты. Первый апдейт шёл, и больше не было. Выяснил, что причиной был вызов функции в апдейте гранаты alife():object() куда передавалось по ошибке вместо id значение nil. Причём игра не висла и не рушилась. Просто прекращал работать апдейт.

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
Привожу не конкретный пример, но достаточный для понимания:

Допустим ведем Круглова, им рулит ГУЛАГ(так ведь?), вдруг видим впереди э.х. обращаемся к Круглову, просим задержатся на 20 мин(5, 10), с функциями у меня плоховато, возможно ли сделать данное, что бы он в тот же иг остановился, запустился таймер, по окончании пошел дальше по гулагу.

На мой взгляд об этом написано в статье на Wiki Логика NPC. Там во второй части описано создание небольшого мода. Чтобы по диалогу неписи начинали лечить ГГ аптечками. Как раз то, что надо.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

Кто знает, можно ли вставить новую локацию, не начиная новую игру?

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
нет, так как полюбасу аллспавн надо будет менять, нуно начинать гаму по-новому (в свой мод добавил пять карт от Кости, полностью аллспавн пришлось перековыривать)

А что будет, если изменить аллспавн (но только добавляя в него новое, не изменяя старое) и продолжить игру?

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
Скажи, а ты не разбирался с функцией function visible_for_map() для сталкеров?

Она задествована в stalker_generic.script в function reset_show_spot(npc, scheme, st, section)

Как она работает для миникарты и что из нее можно еще выжать?

Ну, судя по всему, скрывает метку на карте. Не удаляет, а именно скрывает. Это вариант с аргументом

sobj:visible_for_map(true/false)

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

local is_spot_shown = sobj:visible_for_map()

 

Вроде так.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
Промблема с acdc. Я распаковал алл спаун АМК прог. acdc_10004_amk. Обратной запаковки не происходит( даже не меняя ничего). Той ли программой распаковываю, если нет дайте ссылочку пожалуйста.

Часом не из ReadME.txt строчку для распаковки скопировал? Там какая-то ошибка странная, похоже буква "c" не латинская, а русская

попробуй вот так:

acdc_10004_amk -c all.ltx -o all.spawn

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
вот и я о том же, как бы сделать так, что б атаковал, без ковыряния движка :)

Ну в принципе можно заставить его чем-то плеваться в актора или, скажем, разрядами шибать, или ещё чем там сверху можно =)

Но основная проблема не в этом. Нет и не было в движке физики полёта с анализом столкновений и прочим. Все неписи перемещаются строго по сетке, т.е. в любом случае по земле. Вороны и вертолёты летают достаточно высоко, чтобы избежать коллизий с объектами уровня (а иначе будет видно, что никаких коллизий нет вообще).

Впрочем, думаю, что при некотором старании можно попытаться имитировать низкий полёт. Если можно сделать анимацию объекта, оторванного от земли на некоторое расстояние, то будет впечатление, что монстр летит, хотя он будет на самом деле так же ходить по сетке.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
Так сто лет буду настраивать эту вспышку.
то-ли у старых, то-ли у специальных билдов есть такая консольная команда hud_adjust_mode. В этом режиме как раз и настраивается худ ствола. Возможно, стоит просто найти этот билд и настраивать в нём.

 

Насколько я понимаю, для каждого агрумента из ... устанавливается какой-то entity_action. А потом, если есть объект, ему командуется какой-то из них (а который?). В общем, в результате понимание - ноль.

 

Вероятно, к этому имеют отношение такие методы game_object:

action_count() const;

action() const;

command(const entity_action*, boolean);

reset_action_queue();

action_by_index(number);

set_queue_size(number);

Т.е. действий может быть несколько и они выстраиваются в очередь (на исполнение?).

 

Я накопал, что к классу entity_action прилагаются служебные классы act, anim, cond, look, move, object, particle, sound (а к ним ещё несколько), которые нужны для задания его свойств. Судя по всему entity_action совмещает в себе одновременно несколько действий (идти туда-то, таким-то образом, смотря в определённом направлении, проигрывая анимацию, партикл и т.п.) С условием окончания не ясно. То ли это условие. когда закончить действие, то ли команда на окончание действия. Непонятно.

 

Всё это хозяйство прилагается к скриптовым схемам управления персонажами. Вероятно, можно попытаться заспавнить непися, свободного от логики и попытаться его подёргать этими методами.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
Народ, как понимать такие записи в lua_help:

 

move (enum MonsterSpace::EScriptMonsterMoveAction, vector&, number);

 

Понятно, что вторым аргументом должен быть вектор, а третьим - число (что за вектор и число - другой вопрос)

А что такое этот загадочный enum - enum MonsterSpace::EScriptMonsterMoveAction? Как здесь сложить концы с концами и понять, что же нужно передавать в функцию(или что оно там на самом деле, не метод точно)

Это вот такое перечисление (суть набор именованных констант) языка C++:

enum MonsterSpace::EScriptMonsterMoveAction {
    eMA_WalkFwd,
    eMA_WalkBkwd,
    eMA_Run,
    eMA_Drag,
    eMA_Jump,
    eMA_Steal,
};

Ему соответствуют константы, определённые в том-же классе move:

move.walk_fwd
move.walk_bkwd
move.run_fwd
move.drag
move.jump
move.steal

Про третий аргумент знаю только, что он имеет тип float

 

И еще, правильно ли я понимаю, что аргументы со звездочкой типа

move (enum MonsterSpace::EScriptMonsterMoveAction, game_object*, number);

сами собой подразумеваются и в явном виде их указывать не нужно?

Не так. Это просто значок указателя на объект. Здесь должен заметить, что все описания из lua_help.script имеют характер неточный и до крайности условный. Они не соответствуют никакому языку, ни C++ ни Lua. Там часто упоминаются внутренние типы данных, как в примере выше, остаются хвосты от исходной структуры экспортированных классов, как с этими указателями. Зато по#ерены типы возвращаемых значений (и вообще наличие возвращаемого значения), а типы данных чисел сведены к единственному number, что лишает это описание существенной части информации.

Что касается звёздочек. Сперва небольшой ликбез по Lua. В этом языке есть встроенные типы данных: nil, строки, числа, логические, таблицы, функции, потоки. Эти типы данных описаны в самом стандарте языка. Кроме этих есть ещё т.н. пользовательский тип данных. Физически этот тип данных всегда представляет собой указатель. На что он там указывает, дело второе. Выражение type(obj) для переменных пользовательского типа всегда возвращает строку "userdata". Все объекты, экспортированные из движка, как раз и представляют собой такие объекты.

Безотносительно Lua, с точки зрения языка C++ объект (например vector, хотя внутри он называется не так) может передаваться в функцию по ссылке

void fun(_vector3<float>&); // _vector3<float> - это как раз и есть внутреннее имя класса, который экспортирован в Lua как vector

или по указателю

void fun(_vector3<float>*);

технически это одно и тоже, поскольку в обоих случаях передаётся адрес объекта. А сточки зрения Lua вообще нет разницы, запишете ли вы описание функции

так: fun(vector*)

так: fun(vector&)

или так: fun(vector)

Поскольку vector - это по любому пользовательский объект (указатель, помните?), и по любому в Lua передаётся как 4 байта.

Так что если увидите звёздочку или амперсанд, то относитесь к этому проще.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение

Я как раз закончил предварительный разбор некоторой инфы по внутренним потрохам игры. Итак.

Основной источник информации - билд 2945, в котором разрабы оставили вместе с библиотеками движка ещё и файлы с отладочной информацией. Это файлы *.pdb

В этих файлах содержится информация, необходимая для отладки: прототипы классов и функций, перечисления и имена локальных переменных и констант. Также в этом файле содержится привязка кода к строкам исходного текста (но не сами исходники, не надейтесь=)

Я откопал утилитку, которая делает дамп всего содержимого файла pdb. Дамп для xrGame.dll вышел немаленьким - 250 Мб первостатейного мусора. Немного почистил (регулярные выражения - великая вещь) получилось 12 Мб. Выделил список экспортированных классов, выделил список всех перечислений.

Теперь по крайней мере можно в этом что-то осмысленно искать. Можно точно сказать, какой тип возвращает функция или метод, что принимает, что возвращает (и возвращает ли), точный состав перечислений (тем более, что именно под этими именами они упоминаются в lua_help.script). Можно сказать, можно ли создавать в Lua свой класс на основе данного, или он для этого не предназначен.

 

Не обольщайтесь, это конечно дополнительная информация, но в конечном итоге не намного больше, чем собственно в lua_help.script

 

Держите в общем:

 

Исходный дамп В архиве 3.8 Мб, распакованный 250 Мб. Море шлака. Зато это всё, что было.

Очищенное от основного мусора В архиве 514 Кб, распакованный 12 Мб. Все классы и перечисления должны были остаться, удалил основной мусор, затрудняющий восприятие и поиск. Что-то могло попасть под раздачу (из-за автоматизации процесса)

Только перечисления В архиве 27 Кб, распакованный 182 Кб. Ясно из названия. Включает все, а не только использованные в скриптах перечисления.

Только экспортированные классы В архиве 51 Кб, распакованный 925 Кб. Попытался оставить полные определения только тех классов, которые входят в список экспортированных. Опять же, что-то могло попасть под раздачу и пропасть (см. исходный файл)

Все перечисленные файлы содержат множество дублирующих записей. Это связано с тем, что в файле pdb запись включается столько раз, сколько она упоминается по коду. Пытался с этим бороться, но безуспешно. С другой стороны, больше не меньше =)

Наконец,

список экспортированных классов Это достаточно объективная информация. Позволяет узнать не только какие классы экспортированы, но и можно ли от класса наследовать в Lua. В двух вариантах: один содержит исходные определения luabind, а второй немного почищен для большего удобства.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
Чем можно изменить путь текстуры в файле .ogf? (можно 3дс максом, но согласитесь это долго и муторно...) Пробовал блокнотом - вылетает (количество символов не изменял)

Не уверен, что блокнот всё остальное кроме той строки оставил в том же виде, как было. Он же воспринимает весь файл как текст и не факт, что при сохранении сохраняет в том же виде произвольный набор байтов.

Надо использовать hex-редактор. Сгодится любой, какой найдёшь.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
distance_between - такого метода вроде нету в ТЧ.

Это не метод, а глобальная функция в модуле _G

function distance_between(obj1, obj2)
    return obj1:position():distance_to(obj2:position())
end

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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