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

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


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

Rolan, что за реклама какого-то сайта в архиве? Вы это сделали или Колмогор? (исходник)

Rolan, ясно.

Изменено пользователем C2D
BfioH.png

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

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

зачем начиная с ЧН многие примочки были вшиты в файлы движка?

Я хоть и не имею отношения к ПЫСам, но рискну предположить что это было сделано из-за более навороченной графики.

И вот почему: скрипты - это LUA, а LUA - это интерпретатор. А как известно, быстродействие не числится среди достоинств интерпретаторов.

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

 

Какие проги выдают подобные ошибки? IDA, Periscope, Bubble Chamber, Sourcer - каждый выдал ошибки, потому что в dll-ках натыкали breakpointы

Это Int 03h которые?

Я далеко не хакер и даже не программер, но это меня заинтриговало.

Запустил я из интересу OllyDbg, начал пошаговую отладку. Я не ставил цель разобраться в работе движка, просто было интересно нарвусь на Int03 или нет. Так вот, за полтора часа нажимания F7 (даже запустилась заставка игры), ни одного раза дебагер не попал на эти Int03!

Дальше усердствовать не стал - через 4 часа идти на работу, а тут еще и спать хочется.

Рискну предположить, что эти прерывания были введены чтобы вызвать вылет игры, если по каким-то причинам будет вычислен неверный адрес перехода (ведь там очень часто используются команды типа call eax).

 

Так что только, с разрешения.

Ну, можно например выложить на файлообменник, а линк озаглавить как-нибудь нейтрально, типа "мои размышления".

Было бы желание. :rolleyes:

 

2 Kolmogor

Вы где-то писали, что многое можно вернуть в ЗП скриптами.

Вам виднее, вопрос в другом - какой ценой?

Вспомним AMK-мод, как я понимаю там почти весь мод построен на скриптах.

Даже на нынешних компах, в случае большого скопления НПС или табунчика "бешеных электричек" наблюдаются не хилые лаги.

А что будет с ЗП, если все это туда перетащить? Слайд-шоу.

 

Другое дело, если бы удалось скажем LAU и физикой нагрузить 2-е ядро процессора :blink: (ведь сейчас многоядерников гораздо больше, чем 2 года назад).

Вот тут уже можно было бы скриптов писать-не переписать. :rolleyes:

 

Удачи.

 

ЗЫ. Забыл сказать что использовал xrEngine из NoDVD.

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

Инструкция по изменению плотности травы. Параметр меньше 0.02 не ставить - Колмогор писал что начинает лагать

1. Открываем айда

2. Открываем айда_виев

3. Теперь ищем что нам нужно найти. Нам сейчас нужно найти r__detail_density? Тогда жмем ctrl+t и вводим r__detail_density

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

fld ds:flt_10064400 --нижнее ограничение равное 0.6

or dword_1007CACC, 8

sub esp, 8

fstp [esp+30h+var_2C]

mov ecx, offset unk_1007CA9C

fld ds:flt_10064380 --верхнее ограничение равное 0.2

fstp [esp+30h+var_30]

push offset aSs ; "ЪЩЩ>"

push offset aR__detail_dens ; "r__detail_density"

call ds:??0CCC_Float@@QAE@PBDPAMMM@Z ; CCC_Float::CCC_Float(char const *,float *,float,float)

push offset sub_1005E080 ; void (__cdecl *)()

call _atexit

add esp, 4

 

 

Если вы заметили, то что бы трава стала плотней нужно уменьшить параметр, а что-бы травы стало меньше нужно параметр увеличить

5. Нам нужно увеличить плотность травы: следовательно нужно изменить верхнее ограничение. Как это сделать? Есть 3 варианта:

 

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

 

Второй: взять другую уже существующую переменную. Хороший вариант которым я и воспользовался. Но и тут есть недочет - переменных в ддлке не так уж и много и можно просто не найти нужную

 

Третий: создать переменную. Отличный вариант. Единственный минус - я не знаю как это сделать

 

Я пошел по второму пути. Два раза шелкнув на ds:flt_10064380 айда отправила меня в дебри под названием .rdata. Там я нашел переменную которая называлась - flt_1006452C и которая имела значение 0.0720999

Вообще-то, как я понял, flt_1006452C - не является названием переменной. Это так сказать сборка из 2 показателей - (тип числа)_(оффсет) В нашем случае это число типа float которое находится в 1006452C. Ну чтож приступим к редактированию!

6. Отправляем в самое начало файла. Как? Сверху есть что-то типа статус бара - строка состоящая из синего,серого,черного цвета. Нажимаем там в любом месте мышкой и ведем влево до конца

7. Опять ищем r__detail_density. Находим в этой функции fld ds:flt_10064338. Дальше самое интересное. Жмем на ХЕКС_ВИЕВ и там у нас выделяются какие-то цифры. Это наше 10064338 только написано наоборот. Сравните:

38 43 06 10

10 06 43 38

Похоже, не правда?

Начинаем редактировать. нам нужно поменять 4338 на 452C т.к. в этом и есть различие. Жмем правой кнопкой мыши на этих цифрах и выбираем пункт Edit. Меняем 38 43 на 2С 45. Дальше жмем где нибудь в коде. Это нужно сделать обязательно. После этого жмем правой кнопкой мыши и выбираем commit changes. Но айда не меняет исходный файл. В нашем случае мы можем только создать файл изменений. Делается это так - Файл - Produce file - Create DIF file. Назовем его test. DIF файл можно открыть при помощи блокнота и посмотреть что вы сделали. Теперь так сказать соединит этот файл и дллку. Это можно сделать при помощи bpatch. Качаем и смотрим и запускаем bpatch.cmd. Я думаю что вы сможете его изменить сами если нужно будет. Там все элементарно.

 

Огромное спасибо Kolmogor'у и malandrinus'у. Если бы не они, я бы ничего не сделал. Спасибо вам еще раз

Спасибо и Ролану с которым я очень много беседовал и тоже узнал много чего

 

Кстати у меня вопрос. Как создать новую переменную? Колмогор сказал что либо найти пустое место, либо создать новый сектор. Пытаться найти пустое место опасно - оно может быть зарезервированно. А как сделать новый сектор?

Изменено пользователем _Призрак_
  • Полезно 1

Freedom

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

Rolan,

Вот он , xrGame от ЗП на сцене!

Я ценю ваши старания, но давайте таки определимся. Это не исходники. Исходники - это то, что писали разработчики, и они их никому не давали. А это - сгенерированный идой текст. Его нетрудно получить самому. Загружаем в IDA pro вашу dll и делаем

File -> Produce File -> Create C File...

Толку от этого текста чуть менее, чем ничего. Потеряна информация о типах, точных сигнатурах и именах функций, именах аргументов функций, шаблонах C++ и ещё куча всего. Существенная часть функций не распознана (поскольку ссылки на них сделаны не вызовами, а косвенные). Комментариев в этом тексте естественно нет (хотя не факт, что они и в исходниках были =). Отсутствует деление на файлы (а между прочим в одном только xrgame.dll файлов исходного текста несколько тысяч). Читать этот текст и извлечь из него полезную информацию невозможно. Это не значит, что декомпилятор hex-ray из IDA бесполезен. Напротив, полезен весьма, но использовать его имеет смысл точечно. Вот нашли функцию, которая делает что-то (и вы знаете что именно), тогда уже именно эту функцию и пытаетесь декомпилить, чтобы понять, как именно она делает то, что делает. И это не избавит от необходимости смотреть в окно дизассемблера, уж поверьте.

 

С практической точки зрения более интересным и информативным представляется разбор файлов билда MP 2947, которые шли с отладочными дампами.

 

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

 

 

AK74,

рискну предположить что это было сделано из-за более навороченной графики.

И вот почему: скрипты - это LUA, а LUA - это интерпретатор. А как известно, быстродействие не числится среди достоинств интерпретаторов.

И имхо, вполне разумно, то что в предыдущих версиях игры реализовывалось скриптами "ввести" в код движка, а высвободившееся ресурсы CPU "отдать" графике.

Для начала, Lua здесь используется в связке с JIT копилятором. Т.е. интерпретируется текст только при первом исполнении, затем уже исполняется скомпилированный код. Такой же принцип используется в исполняемой среде .NET. Естественно, это помедленнее будет, чем код движка, но не так уж драматически медленней. И потом на скриптовую часть не ложится большая нагрузка (естественно до тех пор, пока какой-либо новичок не начнёт делать при каждом апдейте перебор всех объектов =).

 

Потом, утверждение о "переносе функций из скриптов в движок" - это ерунда из того-же разряда, что и разговоры о протекторах и прерываниях. Я утверждаю, что движок в той части, что соответствует xrgame.dll (т.е. вся игровая логика) практически мало изменился за все три игры. В лучшем случае была проведена работа по исправлению ошибок и может быть некоторой оптимизации. Практически все функции, которые были экспортированы в ЧН и ЗП по сравнению с ТЧ - это функции, которые там имелись изначально (т.е. ещё в ТЧ), просто были экспортированы в Lua и даны в распоряжение скриптёров. Т.е. выходит картина с точностью до наоборот - в новых версиях движка скриптёру предоставляются потенциально более широкие полномочия.

 

 

Это Int 03h которые?

Вот ведь...

Господа, есть форумы и тьма их, на которых только тем и занимаются, что обсуждают ломание всяких защит и прочее в этом роде. Но обсуждать это здесь, при том, что никаких защит тут нет - это уже не смешно даже.

 

Другое дело, если бы удалось скажем LAU и физикой нагрузить 2-е ядро процессора

Это к сожалению невозможно. Совсем. Всё, что можно сделать в этом направлении, уже сделали разработчики.

 

_Призрак_,

Вообще-то, как я понял, flt_1006452C - не является названием переменной. Это так сказать сборка из 2 показателей - (тип числа)_(оффсет) В нашем случае это число типа float которое находится в 1006452C.

Это всё-таки именно имя, не более. Только учтите, что в IDA есть только адреса ячеек памяти, поэтому это просто метка адреса. Имя метки IDA определяет при первичном анализе. Если по каким-то причинам IDA сочла, что по этому адресу лежит 4-х байтовый float, то имя составляется как flt_virtual_address. В дальнейшем вы можете изменить как это имя, так и интерпретацию содержимого памяти по этому адресу.

 

как сделать новый сектор?

Есть замечательная утилита PE Tools, которая позволяет это сделать.

 

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

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

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

 

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

Народ, может все-таки подскажет кто, почему в HEX View может быть недоступно редактирование?

(IDA Pro 5.2.0.908 + Hex-Rays 1.0) В контекстном меню Hех View только Сopy и Sunhronize winh -> IDA View,

и никакого намека на Data format" -> "Single Float (32 bit)

 

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

nuklia,

может версия не та? Попробуй найти 5.5

 

 

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

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

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

 

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

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

AK74,

И потом на скриптовую часть не ложится большая нагрузка (естественно до тех пор, пока какой-либо новичок не начнёт делать при каждом апдейте перебор всех объектов =).

Намек понял :rolleyes: , но я даже еще не лез в скрипты.

Впрочем, бог с нами, с новичками.

Возьмем AMK-мод:

1 Выброс, как я понимаю, чисто скриптовое "дитя", т.к в оригинале его не было.

Свалка, Депо: 27 НПС. Во время Выброса, практически невозможно даже шевелится.

2. В том же Депо, при отсутствии Выброса, никакого дискомфорта не ощущается. Даже в перестрелках с бандюками.

3. Набившая всем оскомину Электрохимера - тоже скрипты, как я понимаю.

Стайка в 10 штук, при заходе на Радар, практически парализовала игру.

4. Возле Барьера носятся гораздо большее количество стандартных зверей (в том числе и простые химеры), но фризов не возникает (кроме моментов их спавна).

Разница между ситуациями 1 и 2 - работа скриптов Выброса и скриптов заставляющих НПС реагировать на Выброс.

Разница между ситуациями 3 и 4 - собственно скрипты ЭХ.

5. Теперь ЗП.

Как я понимаю, здесь Выброс и реакция НПС на него "зашиты" в движок.

Никакого дискомфорта во время Выброса я не заметил, хотя сама игра более требовательна к ресурсам CPU.

6. Подключил к АМК-ЗП локи из ЧН(локи не заселял), восстановил прежние(ЧН) левелченджеры, накатил "ржавчину" и постэффекты.

Спавнюсь на ТД - ровное прохождение, не единого лага. Прогулки по локам ЧН тоже ровные. Перехожу с Кордона на Болота, наваливаются 3 соски,

еле отмахнулся. Не потому что я тормоз, лаги мешали прицелиться.

Таки в чем разница, между описанными выше ситуациями? По моему,все таки в скриптах(не в качестве, а в их наличии и количестве).

Поймите правильно, это не критика мода и не тупое желание поспорить. Я просто пытаюсь понять причины.

 

обсуждать это здесь, при том, что никаких защит тут нет - это уже не смешно даже.

Но именно это я и пытался объяснить. Что если человек именно в Int03 увидел протекторы, то оно не страшнее пугала огородного.

 

2 ALL. В простых случаях, для определения чем упакована (не путать с защитой) та или иная прога, я пользуюсь сканером DrWeb, с включением детального лога.

2 Модераторам. Не считайте рекламой, просто обмен опытом.

Могут ли другие антивирусы дать такого же рода информацию - не знаю, не пользовался.

И это не удивительно, ведь именно программеры антивирусных компаний и являются одними из лучших спецов по реверс-инжениренгу(надеюсь, страстно желающим повозится в кишках игры, намек ясен?).

 

Это к сожалению невозможно. Совсем. Всё, что можно сделать в этом направлении, уже сделали разработчики.

"Какая жаль" (с) М.Задорнов.

 

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

AK74

Тут смотря как сделать выброс. Дело в том что через двигатель можно сделать все что угодно - начиная от супер-пупер выброса и заканчивая просто передачей денег, ведь двигатель - это набор циферок. А скрипты могут тоже многое, но не всегда то что нужно. Поэтому используются обходные пути, которые тоже потребляют ресурсы. Поэтому если сравнивать падение FPS при выбросе в ЗП и в ТЧ - ЗП явно будет лидером. Но если сравнивать какую-то простую вещь - вывод 100 строк в лог - разница я думаю будет небольшая

 

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

Изменено пользователем _Призрак_

Freedom

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

2 _Призрак_

Наверное Вы не поверите :D , но об этом я догадываюсь.

Речь не Выбросах, ЭХ и пр, как таковых. И даже не о качестве написания скриптов.

Те случаи что я приводил, кроме 5 и 6 конечно :), я привел лишь в качестве всем известных примеров, когда скрипты могут потреблять не малое количество ресурсов.

 

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

Попробовал на ЗП плотность травы увеличивать, так-же нашел и указал другую переменную со значением dd 0.2 -

плотность судя по движку плотности травы увеличилась процентов на 30. Ковырял xrRender_r1 (идет для статического освещения).

А родная переменная несколько раз применяется в других функциях(проверяется установкой курсора на имени

переменной fit_xxxxxxx и нажатием клавиши Х)

Вот только не нашел чтото bpatch - dll-ку пришлось править в НЕХ-ке - благо в файле отличий указан адрес и что на что менять,

может кто даст ссылку на bpatch.

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

_Призрак_,

точнее malandrinus'а bpatch

Не моя =) Это вроде бы известная GNU утилита. Хотя я о ней не знал сам, пока не потребовалось найти, чем применять dif файлы.

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

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

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

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

 

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

Добавление к моей инструкции.

 

Иногда требуется создать новую переменную. Но как это сделать? Искать неиспользованное место в дллке? Опасно. Это место может быть зарезервировано. Что же делать? Есть выход - создать свой сектор, куда мы будем пихать свои данные

Для создание нового сектора нам потребуется программка Stud PE. Колмогор и malandrinus рекомендовали PE tools, но к сожалению у меня при задании RAM памяти дллка больше не читалась. Итак:

1. Открываем Stud PE

2. file -> Open PE file -> выбираем нашу дллку

3. Выбираем вкладку Sections

4. Правой кнопкой мыши - New section

5. Выбираем имя секции (лучше не понтоваться и выбрать 4-5 значное имя без чисел)

6. Выбираем виртуал и рам сайз. С размером лучше не шаманить - для начала хватит 0000001

7. В селектион дата ставим fill section with NULL bytes и жмем add

 

Теперь как работать с новой переменной.

В айда в конце файла находим нашу секцию. Правой кнопкой мыши - Data

В Хексе вводим любое число. Я ввел 04 02 01 3C

Перемещаемся в айда_виев и видем что-то типа такого:

.pmod:10086000 db 4

.pmod:10086001 db 2

.pmod:10086002 db 1

.pmod:10086003 db 3Ch ; <

 

 

Для того что-бы айда поняла что это одно число жмем 2 раза d. Ну а дальше для красоты жмем Edit -> Operant type ->Number -> Floating point.

Дальше ссылаемся на нашу переменную откуда нужно и все.

 

Freedom

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

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

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

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

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

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

Войти

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

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

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