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

Редактирование движка X-Ray


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

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 не было.

Изменено пользователем SkyLoader
Ссылка на комментарий

SkyLoader,

надо искать в xrGame.dll из билда mp 2947. Там в комплекте имеются файлы с расширением *.pdb для каждого экзешника или библиотеки. При открытии файла идой в первый раз она спросит, загружать ли отладочную информацию. Надо ответить, что загружать. В этом случае ида уже не будет искать функции, типы и прочее, а просто возмёт это из этих файлов. Там безымянных или нераспознанных функций не будет вообще, и каждая функция будет иметь точную информацию о типе возвращаемого значения, типах и даже именах аргументов.

Вот теперь уже и можете искать функции по имени. Можно сделать "jump to function" и там с помощью "search" найти функцию по тем иенам, что я давал. А можно просто отсортировать функции по именам в окошке слева и тогда найти её в списке тоже будет несложно.

 

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

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

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

 

Ссылка на комментарий

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

 

Ссылка на комментарий

Доброго всем времени суток.

Может кому пригодится:

из билда mp 2947. Там в комплекте имеются файлы с расширением *.pdb для каждого экзешника или библиотеки.

Более того, эти же pdb-файлы из билда, частично, подходят и для ЗП, причем даже больше чем для ТЧ.

Удачи.

Ссылка на комментарий

AK74,

ну как они могут подходить? Ведь файлы PDB содержат привязки строк кода к бинарным файлам. Изменились бинарные файлы - всё, соответствие порушено. Даже если скомпилировать тот-же исходник с другими настройками, уже не подойдёт. А здесь мы говорим о новой версии движка.

Т.е. НЕ подходят никаким боком.

 

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

 

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

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

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

 

Ссылка на комментарий

Доброго всем времени суток.

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 вылетает с ошибкой, поэтому сравнить не могу.

Это я и подразумевал под "частично, подходят и для ЗП".

Впрочем, чего зря спорить - проделайте это сами и все увидите, много времени не займет.

Удачи.

Ссылка на комментарий

malandrinus, ясно, спс.

Я посмотрел, что при умирании ГГ происходит этот CActor::cam_Set(ACTOR_DEFS::EActorCameras). Есть некие апдейты камеры (cam_update). Правда, там мало информации.

Ссылка на комментарий

AK74,

2947 это и есть ТЧ. такой билд у одного из первых патчей ТЧ. Поэтому pdb от него не могут подходить к ТЧ меньше чем к ЗП.

 

pdb-файл не может подходить частично - он или подгрузится к исполняемому модулю или нет. Почему ты при декомпиляции ЗП частично не подгрузил pdb, чтобы получить такой же результат, как в 2947 - ведь функции одинаковые?

 

Malandrinus именно про это и говорил, что много функций одинаковых, много похожих. И информацию полученную из 2947 с pdb, можно использовать для понимая ЗП

 

 

Ссылка на комментарий

Глубокий поклон мастерам кодерам.

Если движок роете то мож кто разобрался с классами нпц оружия итд.?

Возможно ли добавить своего монстра со своей логикой?

Или скажем новый класс оружия или одона?

 

ПС. если это нубский бред - трите

Ссылка на комментарий

Товарищи!

Вами не было замечено, что в ЧН и ЗП скрипты обрабатываются быстрее?

В ТЧ используется lua5.1, а в ЧН и ЗП - lua.JIT.1.1.4

lua.JIT.1.1.4 - Должен работать быстрее lua5.1

Зачем я это написал... фз...

Ссылка на комментарий

JIT = "Just In Time" компилятор "на лету". Ссылка для информации. Если вкратце, то суть в том, что вместо обычной интерпретации байткода при каждом исполнении при первом проходе функция компилируется в машинный код и затем исполняется. При всех последующих выполнениях функции уже исполняется компилированная версия. Такая же технология используется в среде выполнения .NET.

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

 

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

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

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

 

Ссылка на комментарий

Тема безусловно очень интересная - но я позволю себе высказать одно сомнение и одно предложение:

Для собственного удовлетворения конечно интересно и самодостаточно производит изменения в движке игры, но как эти изменения донести до пользователя? Насколько допустимо с правовой стороны распространять "ломанный" вариант лицензионного продукта?

Предложение - производить изменения не в физическом теле файла x-ray, а в виртуальном.

Ссылка на комментарий

Есть ли способ ускорения загрузки? Игра грузится очень долго. Лог по вашей теме кину потом, пока помогите с этим плиз )

Выводы модмейкера:

1)Вылетает - это хорошо. Значит, работает :)

2) Если хочешь сделать что-то хорошо, делай сам!

3) Если падёшь духом, падёт и мод.

4) Он живой... :o

Ссылка на комментарий

Сяк,

с точки зрения создателей игры нет никакой разницы меняется движок, скрипты или что-то ещё. Любые изменения противоречат лицензии. Таким образом, любое модостроение под сингл является незаконным и возможно лишь в силу того, что фирма-разработчик закрывает на это глаза.

Насчёт виртуальности если честно не понял.

 

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

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

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

 

Ссылка на комментарий
Сяк,

с точки зрения создателей игры нет никакой разницы меняется движок, скрипты или что-то ещё. Любые изменения противоречат лицензии.

Я не согласен. Т.к. изменение скриптов не предполагает возможности запуска игры без лицензионного диска. А изменение движка - предполагает.

 

Ссылка на комментарий

malandrinus, Менять в виртуальной памяти, когда запущен процесс. Как вариант fov в памяти...

 

 

Что-то кончается, что-то начинается...

Ссылка на комментарий

Шип, а где тогда в ТЧ либа jit'а? В ЧН и ЗП она есть, а в ТЧ нету...

Читал, что luajit - это добавка к lua и содержит его самого.

Поэтому в ЧН и ЗП нет либы xrLua.dll, т.к. его заменяет LuaJIT.dll.

Ссылка на комментарий

Вы соглашаетесь с запретом на обратное ассемблирование, декомпиляцию, инженерный анализ и создание дериватов на основе данного программного обеспечения. Все права, не указанные в настоящем Соглашении, остаются за Лицензиаром.

Вы признаете и соглашаетесь с тем, что данное программное обеспечение, включая любые входящие в него изображения, фотографии, анимацию, видео-, аудио- и музыкальные фрагменты, а также текст и документацию, является собственностью Лицензиара и/или автора(ов)

Из лецензионного соглашения

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

Ну это как с машинами-поставил спойлер или залез в движок-с гарантии снимают

Изменено пользователем gruber
Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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