SkyLoader 53 Опубликовано 15 Ноября 2010 Поделиться Опубликовано 15 Ноября 2010 (изменено) malandrinus, вот, что я нашел в Гейм.длл: .text:1027B45F push offset aOnkeyboardrele; "OnKeyboardRelease" .text:1027B464 push offset loc_1027B639 .text:1027B469 xor eax, eax .text:1027B46B push eax .text:1027B46C mov eax, offset sub_1027B881 .text:1027B471 push eax .text:1027B472 push offset aOnkeyboardpres; "OnKeyboardPress" .text:1027B477 push offset nullsub_40 .text:1027B47C xor eax, eax .text:1027B47E push eax .text:1027B47F mov eax, offset sub_1027B877 .text:1027B484 push eax А в искэр_гейм.екзе нашел только это: CDemoRecord::IR_OnKeyboardPress(int)+CAr ..., а CActor::IR_OnKeyboardPress не было. Изменено 15 Ноября 2010 пользователем SkyLoader Ссылка на комментарий
Malandrinus 615 Опубликовано 15 Ноября 2010 Поделиться Опубликовано 15 Ноября 2010 SkyLoader, надо искать в xrGame.dll из билда mp 2947. Там в комплекте имеются файлы с расширением *.pdb для каждого экзешника или библиотеки. При открытии файла идой в первый раз она спросит, загружать ли отладочную информацию. Надо ответить, что загружать. В этом случае ида уже не будет искать функции, типы и прочее, а просто возмёт это из этих файлов. Там безымянных или нераспознанных функций не будет вообще, и каждая функция будет иметь точную информацию о типе возвращаемого значения, типах и даже именах аргументов. Вот теперь уже и можете искать функции по имени. Можно сделать "jump to function" и там с помощью "search" найти функцию по тем иенам, что я давал. А можно просто отсортировать функции по именам в окошке слева и тогда найти её в списке тоже будет несложно. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
SkyLoader 53 Опубликовано 17 Ноября 2010 Поделиться Опубликовано 17 Ноября 2010 malandrinus, ясно. Я посмотрел эти функции, они большие. Я, правда, не очень понимаю, о чем они и чем могут мне помочь. Ссылка на комментарий
Malandrinus 615 Опубликовано 19 Ноября 2010 Поделиться Опубликовано 19 Ноября 2010 SkyLoader, посмотрел эти функции, они большие. Я, правда, не очень понимаю, о чем они и чем могут мне помочь. ида даёт такой прототип этой функции: void __thiscall CActor__IR_OnKeyboardPress(CActor *this, int cmd); что означает на самом деле такой: void CActor::IR_OnKeyboardPress(int cmd); тип аргумента - неопределённый int, но можно предположить, что это одна из констант-действий из key_bindings. Функции большие, действительно. Это на самом деле хорошо. Думается мне, что там как раз и происходит обработка действий нажатия на клавиши. Скорее всего там в коде стояло что-то вроде такого: switch (cmd){ case <команда стрелять>: // делаем выстрел break; case <команда прыгать>: // выполняем прыжок break; // и т.д. } Это довольно нудно расшифровывать, поскольку оператор switch компилируется по-разному в зависимости от режима оптимизации и внутри превращается в весьма запутанную и неоднозначную конструкцию. Но что и где делается можно иногда понять и так по именам вызываемых функций. К примеру, стоят вызовы CInventory::Action(int,uint). Это явно какие-то действия с предметами в слотах. А вот это CActor::cam_Set(ACTOR_DEFS::EActorCameras) похоже на действия с камерой актора. Вероятно как раз и есть переключение режимов. Где-то там есть и изменение расстояния от актора до камеры. Если нужно найти параметры камеры, то отсюда надо начинать копать. Лезть в эти функции и пытаться понять, откуда они берут данные или куда пишут, какие ещё функции вызывают и т.д. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
AK74 4 Опубликовано 21 Ноября 2010 Поделиться Опубликовано 21 Ноября 2010 Доброго всем времени суток. Может кому пригодится: из билда mp 2947. Там в комплекте имеются файлы с расширением *.pdb для каждого экзешника или библиотеки. Более того, эти же pdb-файлы из билда, частично, подходят и для ЗП, причем даже больше чем для ТЧ. Удачи. Ссылка на комментарий
Malandrinus 615 Опубликовано 21 Ноября 2010 Поделиться Опубликовано 21 Ноября 2010 AK74, ну как они могут подходить? Ведь файлы PDB содержат привязки строк кода к бинарным файлам. Изменились бинарные файлы - всё, соответствие порушено. Даже если скомпилировать тот-же исходник с другими настройками, уже не подойдёт. А здесь мы говорим о новой версии движка. Т.е. НЕ подходят никаким боком. Информацию косвенно можно использовать, поскольку архитектура движка в целом не изменилась. Но только косвенно использовать: смотреть на старый (его легче изучать), затем сопоставлять с новыми версиями, которые уже без отладочной информации. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
AK74 4 Опубликовано 23 Ноября 2010 Поделиться Опубликовано 23 Ноября 2010 Доброго всем времени суток. malandrinus, камрад! Я ведь свое утверждение тоже не с бодуна придумал oid __thiscall PAPI__ParticleAction__ParticleAction(PAPI::ParticleAction *this) { this->vtable = PAPI__ParticleAction___vftable_; this->m_Flags.flags = 0; } // 1000E148: using guessed type int (*PAPI__ParticleAction___vftable_[4])(); //----- (10001030) -------------------------------------------------------- void __thiscall PAPI__ParticleAction__ParticleAction(PAPI::ParticleAction *this, PAPI::ParticleAction *__that) { this->vtable = PAPI__ParticleAction___vftable_; this->m_Flags.flags = __that->m_Flags.flags; this->type = __that->type; } // 1000E148: using guessed type int (*PAPI__ParticleAction___vftable_[4])(); //----- (10001050) -------------------------------------------------------- void __thiscall PAPI__pDomain__pDomain(PAPI::pDomain *this) { ; } //----- (10001060) -------------------------------------------------------- int __thiscall PAPI__pDomain__operator_(int this, int a2) { int result; // eax@1 result = this; *(_DWORD *)this = *(_DWORD *)a2; *(_DWORD *)(this + 4) = *(_DWORD *)(a2 + 4); *(_DWORD *)(this + 8) = *(_DWORD *)(a2 + 8); *(_DWORD *)(this + 12) = *(_DWORD *)(a2 + 12); *(_DWORD *)(this + 16) = *(_DWORD *)(a2 + 16); *(_DWORD *)(this + 20) = *(_DWORD *)(a2 + 20); *(_DWORD *)(this + 24) = *(_DWORD *)(a2 + 24); *(_DWORD *)(this + 28) = *(_DWORD *)(a2 + 28); *(_DWORD *)(this + 32) = *(_DWORD *)(a2 + 32); *(_DWORD *)(this + 36) = *(_DWORD *)(a2 + 36); *(_DWORD *)(this + 40) = *(_DWORD *)(a2 + 40); *(_DWORD *)(this + 44) = *(_DWORD *)(a2 + 44); *(_DWORD *)(this + 48) = *(_DWORD *)(a2 + 48); *(_DWORD *)(this + 52) = *(_DWORD *)(a2 + 52); *(_DWORD *)(this + 56) = *(_DWORD *)(a2 + 56); *(_DWORD *)(this + 60) = *(_DWORD *)(a2 + 60); *(_DWORD *)(this + 64) = *(_DWORD *)(a2 + 64); return result; } //----- (100010D0) -------------------------------------------------------- void __thiscall PAPI__PAAvoid__PAAvoid(PAPI::PAAvoid *this) { this->baseclass_0.m_Flags.flags = 0; this->baseclass_0.vtable = &PAPI__PAAvoid___vftable_; } // 1000E184: using guessed type int (__stdcall *PAPI__PAAvoid___vftable_)(int effect, float dt); //----- (100010E0) -------------------------------------------------------- void __thiscall PAPI__PAAvoid__PAAvoid(PAPI::PAAvoid *this, PAPI::PAAvoid *__that) { this->baseclass_0.vtable = PAPI__ParticleAction___vftable_; this->baseclass_0.m_Flags.flags = __that->baseclass_0.m_Flags.flags; this->baseclass_0.type = __that->baseclass_0.type; this->baseclass_0.vtable = &PAPI__PAAvoid___vftable_; memcpy(&this->positionL, &__that->positionL, sizeof(this->positionL)); memcpy(&this->position, &__that->position, 0x50u); } //----- (10001550) -------------------------------------------------------- int __thiscall PAPI__ParticleAction__ParticleAction(int this) { int result; // eax@1 result = this; *(_DWORD *)this = PAPI__ParticleAction___vftable_; *(_DWORD *)(this + 4) = 0; return result; } // 1000E164: using guessed type int (*PAPI__ParticleAction___vftable_[4])(); //----- (10001560) -------------------------------------------------------- int __thiscall PAPI__ParticleAction__ParticleAction(int this, int a2) { int result; // eax@1 result = this; *(_DWORD *)this = PAPI__ParticleAction___vftable_; *(_DWORD *)(this + 4) = *(_DWORD *)(a2 + 4); *(_DWORD *)(this + 8) = *(_DWORD *)(a2 + 8); return result; } // 1000E164: using guessed type int (*PAPI__ParticleAction___vftable_[4])(); //----- (10001580) -------------------------------------------------------- int __thiscall PAPI__ParticleAction__operator_(int this, int a2) { int result; // eax@1 result = this; *(_DWORD *)(this + 4) = *(_DWORD *)(a2 + 4); *(_DWORD *)(this + 8) = *(_DWORD *)(a2 + 8); return result; } //----- (100015A0) -------------------------------------------------------- void *__thiscall PAPI__pDomain__pDomain(void *this) { return this; } //----- (100015B0) -------------------------------------------------------- int __thiscall PAPI__pDomain__operator_(int this, int a2) { int result; // eax@1 result = this; *(_DWORD *)this = *(_DWORD *)a2; *(float *)(this + 4) = *(float *)(a2 + 4); *(float *)(this + 8) = *(float *)(a2 + 8); *(float *)(this + 12) = *(float *)(a2 + 12); *(float *)(this + 16) = *(float *)(a2 + 16); *(float *)(this + 20) = *(float *)(a2 + 20); *(float *)(this + 24) = *(float *)(a2 + 24); *(float *)(this + 28) = *(float *)(a2 + 28); *(float *)(this + 32) = *(float *)(a2 + 32); *(float *)(this + 36) = *(float *)(a2 + 36); *(float *)(this + 40) = *(float *)(a2 + 40); *(float *)(this + 44) = *(float *)(a2 + 44); *(float *)(this + 48) = *(float *)(a2 + 48); *(float *)(this + 52) = *(float *)(a2 + 52); *(float *)(this + 56) = *(float *)(a2 + 56); *(float *)(this + 60) = *(float *)(a2 + 60); *(float *)(this + 64) = *(float *)(a2 + 64); return result; } //----- (10001620) -------------------------------------------------------- int __thiscall PAPI__PAAvoid__PAAvoid(int this) { int result; // eax@1 result = this; *(_DWORD *)(this + 4) = 0; *(_DWORD *)this = &PAPI__PAAvoid___vftable_; return result; } // 1000E178: using guessed type int (__stdcall *PAPI__PAAvoid___vftable_)(float, int, int); //----- (10001630) -------------------------------------------------------- int __thiscall PAPI__PAAvoid__PAAvoid(int this, int a2) { int result; // eax@1 result = this; *(_DWORD *)this = PAPI__ParticleAction___vftable_; *(_DWORD *)(this + 4) = *(_DWORD *)(a2 + 4); *(_DWORD *)(this + 8) = *(_DWORD *)(a2 + 8); *(_DWORD *)this = &PAPI__PAAvoid___vftable_; memcpy((void *)(this + 12), (const void *)(a2 + 12), 0x44u); memcpy((void *)(this + 80), (const void *)(a2 + 80), 0x50u); return result; } Очевидно, что если подправить типы данных, то некоторые функции окажутся идентичными, не смотря на то что живут по разным адресам. Ту же самую картинку (в смысле совпадения) я встречал и xrNetServer.c. Билдовые xrGame.c и xrRender_R1.c мне получить не удалось - IDA вылетает с ошибкой, поэтому сравнить не могу. Это я и подразумевал под "частично, подходят и для ЗП". Впрочем, чего зря спорить - проделайте это сами и все увидите, много времени не займет. Удачи. Ссылка на комментарий
SkyLoader 53 Опубликовано 23 Ноября 2010 Поделиться Опубликовано 23 Ноября 2010 malandrinus, ясно, спс. Я посмотрел, что при умирании ГГ происходит этот CActor::cam_Set(ACTOR_DEFS::EActorCameras). Есть некие апдейты камеры (cam_update). Правда, там мало информации. Ссылка на комментарий
Kolmogor 5 Опубликовано 23 Ноября 2010 Поделиться Опубликовано 23 Ноября 2010 AK74, 2947 это и есть ТЧ. такой билд у одного из первых патчей ТЧ. Поэтому pdb от него не могут подходить к ТЧ меньше чем к ЗП. pdb-файл не может подходить частично - он или подгрузится к исполняемому модулю или нет. Почему ты при декомпиляции ЗП частично не подгрузил pdb, чтобы получить такой же результат, как в 2947 - ведь функции одинаковые? Malandrinus именно про это и говорил, что много функций одинаковых, много похожих. И информацию полученную из 2947 с pdb, можно использовать для понимая ЗП Ссылка на комментарий
CAHCAHbl4 22 Опубликовано 24 Ноября 2010 Поделиться Опубликовано 24 Ноября 2010 Глубокий поклон мастерам кодерам. Если движок роете то мож кто разобрался с классами нпц оружия итд.? Возможно ли добавить своего монстра со своей логикой? Или скажем новый класс оружия или одона? ПС. если это нубский бред - трите Ссылка на комментарий
DiXares 1 Опубликовано 27 Ноября 2010 Поделиться Опубликовано 27 Ноября 2010 Товарищи! Вами не было замечено, что в ЧН и ЗП скрипты обрабатываются быстрее? В ТЧ используется lua5.1, а в ЧН и ЗП - lua.JIT.1.1.4 lua.JIT.1.1.4 - Должен работать быстрее lua5.1 Зачем я это написал... фз... Ссылка на комментарий
Шип 0 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 DiXares, lua.JIT.1.1.4 - это всего-лишь компилятор языка, а не сам язык, он участвует в связи скриптов с двигом. Естессно, в ТЧ он старее. Ссылка на комментарий
Malandrinus 615 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 JIT = "Just In Time" компилятор "на лету". Ссылка для информации. Если вкратце, то суть в том, что вместо обычной интерпретации байткода при каждом исполнении при первом проходе функция компилируется в машинный код и затем исполняется. При всех последующих выполнениях функции уже исполняется компилированная версия. Такая же технология используется в среде выполнения .NET. Такой компилятор используется во всех версиях движка, так что особой разницы в скорости выполнения нет. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Сяк 59 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 Тема безусловно очень интересная - но я позволю себе высказать одно сомнение и одно предложение: Для собственного удовлетворения конечно интересно и самодостаточно производит изменения в движке игры, но как эти изменения донести до пользователя? Насколько допустимо с правовой стороны распространять "ломанный" вариант лицензионного продукта? Предложение - производить изменения не в физическом теле файла x-ray, а в виртуальном. Ссылка на комментарий
SibireaStalker 0 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 Есть ли способ ускорения загрузки? Игра грузится очень долго. Лог по вашей теме кину потом, пока помогите с этим плиз ) Выводы модмейкера: 1)Вылетает - это хорошо. Значит, работает 2) Если хочешь сделать что-то хорошо, делай сам! 3) Если падёшь духом, падёт и мод. 4) Он живой... Ссылка на комментарий
Malandrinus 615 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 Сяк, с точки зрения создателей игры нет никакой разницы меняется движок, скрипты или что-то ещё. Любые изменения противоречат лицензии. Таким образом, любое модостроение под сингл является незаконным и возможно лишь в силу того, что фирма-разработчик закрывает на это глаза. Насчёт виртуальности если честно не понял. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Сяк 59 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 Сяк, с точки зрения создателей игры нет никакой разницы меняется движок, скрипты или что-то ещё. Любые изменения противоречат лицензии. Я не согласен. Т.к. изменение скриптов не предполагает возможности запуска игры без лицензионного диска. А изменение движка - предполагает. Ссылка на комментарий
Vano_Santuri 33 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 malandrinus, Менять в виртуальной памяти, когда запущен процесс. Как вариант fov в памяти... Что-то кончается, что-то начинается... Ссылка на комментарий
DiXares 1 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 Шип, а где тогда в ТЧ либа jit'а? В ЧН и ЗП она есть, а в ТЧ нету... Читал, что luajit - это добавка к lua и содержит его самого. Поэтому в ЧН и ЗП нет либы xrLua.dll, т.к. его заменяет LuaJIT.dll. Ссылка на комментарий
gruber 2 481 Опубликовано 28 Ноября 2010 Поделиться Опубликовано 28 Ноября 2010 (изменено) Вы соглашаетесь с запретом на обратное ассемблирование, декомпиляцию, инженерный анализ и создание дериватов на основе данного программного обеспечения. Все права, не указанные в настоящем Соглашении, остаются за Лицензиаром. Вы признаете и соглашаетесь с тем, что данное программное обеспечение, включая любые входящие в него изображения, фотографии, анимацию, видео-, аудио- и музыкальные фрагменты, а также текст и документацию, является собственностью Лицензиара и/или автора(ов) Из лецензионного соглашения По сути распаковка архивов уже взлом-другое дело ,что если сделано это было для некомерческого использования,то наказание,максимум расторжение лицензии по инициативе правоабладателя Ну это как с машинами-поставил спойлер или залез в движок-с гарантии снимают Изменено 28 Ноября 2010 пользователем gruber Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти