You are not logged in.
Здравствуйте, скажите какие конкретно строчки нужно убрать в оригинальном GTA_SA.exe(US) чтобы игра не требовала диск. И возможно ли сделать cleo скрипт для того что бы игра запускалась, не изменяя оригинальный exe. И еще(наблюдение), когда я запускаю игру(оригинальный exe) через Deamon tools, не устанавливая cleo, игра идет хорошо, в обратном случае( когда установлен cleo), при загрузке она вылетает.
Last edited by turnik (28-01-2008 21:06)
Offline
listner написал :
Тоесть получается , что для изменения хандлинга автомобиля на свой достаточно в
.text:006B0BA8 0D0 mov [esi+384h], eaxвместо eax подать указатель на свою структуру хандлинга ?
Не совсем. Есть четыре типа хэндлинга: Vehicle, Flying, Bike и Boat; для каждого - своя структура
Для разных объектов нужно установить от одного до трех типов.
Для автомобиля, например, - Vehicle и Flying (показано в приведенном фрагменте). Плюс, отдельная переменная для флагов (+38Ch).
(Я не зря привел такой большой кусок кода)
Конструкторы СBike и CBoat я еще не разбирал (посмотрю завтра-послезавтра, как с текущими делами по работе разгребусь).
Самое же противное, что есть захардкоденные места. Т.е., любой потомок CEntity модержит modelIndex. В соответствующем CModelCars есть handlingIndex.
И есть несколько мест в коде, где обращаения к хэндлингу делаются не через vehicle->handlingStruct, а как
handling->vehicleHandling[((CModelCars *)models[vehicle->modelIndex])->handlingIndex].
Если учитывать такие тонкости, (т.е., не пытаться подсунуть "левый" хэндлинг для "гибридов"), все будет нормально.
Offline
2turnik:
Все зависит от того, какой exe-шник имеется в виду.
Если это оригинальный securom-protected exe - "убиранием строчек" не отделаться. Этот exe-шник зашифрован, и расшифровывается только после проверки диска (в ходе проверки получается ключ дешифровки).
Если это любой другой exe (hoodlum, paradox, compact...), то он требует не DVD, а файлы из каталога AUDIO\STREAMS, которые не копируются на винт инсталлятором. Если скопировать весь каталог AUDIO на винт - требовать диск он прекращает.
Offline
2listener:
Да, у меня оригинальный английский gta_sa.exe1.0, и действительно стоит securom-protected(SecuRom 7.00.00.0037). Получаеться, для такого ехе возможен только запуск при помощи образа. Все же если возможно, каким-то образом узнать ключ дешифровки и таким образом запустить игру без диска, то пожалуйста расскажите поподробней об этой процедуре. Кстати, если вдруг кому пригодиться мой ехе для экспериментов, могу куда-нибудь выложить. В любом случае, спасибо за внимание.
Offline
2turnik:
Если все было бы так просто, производители защит давно бы разорились....
Ключ занимает несколько килобайтов, плюс, в нем используется часть кода, который немного нетривиально перемешивается.
Проще пойти на www.gamecopyworld.com и взять уже расшифрованный exe-шник.
Offline
Переменная
dword_859D9C -> fFive ;ext. script trigger def. radius
хранит 5.0 - радиус, используемый по умолчанию, при регистрации внешних скриптов-триггеров опкодами 0928 и 0929.
Функции
sub_43D6A0 -> reset_player_destroyed_model_counters sub_46A930 -> init_external_script_trigger // находит свободный элемент массива и заполняет его sub_46A8C0 -> init_ext_script_triggers // инициализирует массив структур ext_script_triggers dummy_46B260 -> __init_ext_script_triggers // вызывает предыдущую .text:0084A740 unknown_libname_128 -> _init_script_triggers // вызывает предыдущую
Переменная
stru_A90CF0 -> ext_script_triggers
- массив структур extScriptTrigger (размером по 0x14 байт) в количестве 70 (0x46) штук.
Структура
00000000 extScriptTrigger struc ; (sizeof=0x14) 00000000 script_index dw ? 00000002 is_object db ? ; 1: object, 0: actor 00000003 type db ? 00000004 field_4 db ? 00000005 __pad db 3 dup(?) 00000008 radius dd ? ;; <- float 0000000C model dw ? 0000000E priority dw ? 00000010 field_10 dd ? 00000014 extScriptTrigger ends
хранит информацию о внешнем скрипте-триггере (заполняется опкодами 0928 и 0929)
PS:
Функция
.text:0084A740 unknown_libname_128 -> _init_script_triggers
входит в большую таблицу функций, начинающуюся с адреса 0x008A4000. Это, случаем, не "основной класс игры" (CGame) ?
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
2turnik:
Если все было бы так просто, производители защит давно бы разорились....
Ключ занимает несколько килобайтов, плюс, в нем используется часть кода, который немного нетривиально перемешивается.
Проще пойти на www.gamecopyworld.com и взять уже расшифрованный exe-шник.
Спасибо за разьяснения.
Offline
Nикто не знает адреса, в которых можно найти смещения
стандартных даммисов (например, фар или бензобака) от центра модели?
Соответственно, адрес должен быть расположен от указателя 0xB74494...
Offline
0xB74494 - указатель на пул машин, а думмисы относятся к самой модели. Поэтому, если где искать эти смещения, то скорее в районе 0x8E4CC0
Для чего тебе эти адреса?
Offline
2Axel218:
Начнем с того, что понятия "центр модели" просто нет. Есть начало координат, от которого считаются все смещения в модели.
В остальном, задачка несложная, хотя потребует немного экспериментов.
Какое-то время назад, я выкладывал исходники работы с моделями (ссылка есть в этом топике) - там есть почти все необходимое.
Есть массив modelPtrs (0xA9B0C8)
По номеру модели в нем находится ссылка на объект этой модели.
Чтобы не перебирать все варианты, считаем, что мы взяли ссылку на CModelCars.
В поле clump в ней лежит ссылка на корневой кламп модели.
Берем от него parent - это указатель на корневой фрейм всей иерархии компонентов модели.
Дальше, рекурсивно ищем фрейм нужного даммиса по имени (в тех исходниках, nodeName внутри фрейма еще не описан, зато описано, где лежит функция findFrameFromNameWithoutIdCB, которая, как раз, ищет фрейм по имени внутри иерархии).
Дальше начинаются эксперименты. Если нам повезло, координаты нашего найденного даммиса уже лежат в modelling.pos, и задача решена.
Если не повезло, то нужно проходить по всей иерархии от найденного фрейма до корня и преобразовывать эту несчастную точку по modelling каждого фрейма.
В общем, курить надо CModelCars::preprocessHierarchy - там все это точно есть, нужно только выбрать нужные куски.
Offline
2Seemann:
Эти адреса мне нужны для Великих Эксперементов
2listener:
Из того, что ты мне наговорил, я понял только около половины
Ну ничего, сейчас будем потихоньку разбираться...
Спасибо за ответ!
Offline
2Axel218:
Около половины - это очень хорошо. Во-первых, это писалось, примерно, после четрыех часов копания в потрохах RenderWare,
Во-вторых, если было бы непонятно все, объяснять дальше - было бы просто бесполезно.
Я сейчас "причесываю" свои исходники. В следующий раз там будут комментарии (на русском, но много), плюс, я потихоньку описываю RW-шные структуры так, как они используются в GTA (т.е., со всеми плагинами) - получается гораздо понятнее.
Offline
Ну теперь пару вытекающих вопросов. Должен предупредить, память San Andreas я копаю недолго, но с функциями/указателями и всем таким прочим небольшой опыт работы имею.
1. Что такое RenderWare?
2. Что надо скачивать-то? В этом топике куча твоих ссылок...
3. Лезем в массив 0xA9B0C8. Ищем по номеру модели указатель или что? В виде чего ссылка должна быть?
Я бы мог подробно объяснить, что именно меня затрудняет в поисках, но боюсь показаться полным криведко в этих делах....
Offline
2Axel218:
1. RenderWare - набор библиотек для написания игр. В частности, в GTA:SA, для графической части используется RenderWare Graphics.
http://en.wikipedia.org/wiki/Renderware
Ссылки на доки по рендервари и саму рендерварь можно найти в форуме.
2. Скачивать надо http://public.sannybuilder.com/sources/ … 071119.rar . В нем смотреть в ogModel.h и ogModel.cpp
3. 0xA9B0C8 -> CModelBase * modelPtrs[20000];
Индекс массива - objectId, элемент массива - ссылка на потомок CModelBase.
Для каждой секции .ide ('objs', 'tobj', ..., 'cars') - свой класс, унаследованный от CModelBase.
CModelBase. в числе всего прочего, является оберткой вокруг RwObject (в версии от 2007/11/19 - там union, в котором лежат ссылки на RpAtomic и RpClump) От него и надо копать.
Offline
Offline
Вопрос: Почему, когда я пытаюсь установить процедуре в своей Delphi'йской программе указатель на процедуру в SA, выскакивает грубейшее сообщение об ошибке доступа?
@ShowTextBox := Ptr($588BE0);
Версия игры подходит. Это 100%.
P.S. Оффтоп: классный дизайн на форуме, особенно удобная панель для быстрого добавления сообщения
Offline
@Axel218 - программа загружена в адресное пространство игры или нет? Если она запускается как обычный exe, то Ptr($588BE0) будет указывать на адрес внутри этой программы, а не SA. Соответственно когда ты вызовешь ShowTextBox, произойдет ошибка доступа.
Эта программа должна быть выполнена в виде библиотеки с расширением .asi или .cleo, чтобы игра загружала ее к себе при запуске (при наличии CLEO или ASI Loader), тогда Ptr($588BE0) будет указывать на нужное место.
Offline
Offline
Новая база. Начерно расписаны все методы CTask* (пока, в основном, как mXX).
Составлена диаграмма наследования всех сабклассов CTask (~320 классов, до пяти уровней вложенности), классов на 30 уже понятно назначение (но еще непонятно, как писать свои ).
http://public.sannybuilder.com/gtasa_ex … 080217.txt
Last edited by listener (17-02-2008 06:14)
Offline
Можно, просто размер текстуры увеличь раза в 2, и будет тебе счастье
Offline
Можно ли добиться улучшения детализации текстур? Если да то редактированием какого адреса памяти?
Можно , непосредственным редактированием RW SDK , хотя от этого только мороки больше , а одним адресом - никак
Можно, просто размер текстуры увеличь раза в 2, и будет тебе счастье
Если увеличить , то детализация не изменится , ухудшется качество .
Offline
Не увеличивая стандартную текстуру, а сделать другие более большие детализированные текстуры. Я имел ввиду именно это!
А про стандартные текстуры вообще ничего не говорю...
Offline
Вот ещё вопрос. Я пытался установить RemoteThread для SA. В WinAPI функция:
HANDLE CreateRemoteThread( HANDLE hProcess, // handle to process to create thread in LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes DWORD dwStackSize, // initial thread stack size, in bytes LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function LPVOID lpParameter, // pointer to argument for new thread DWORD dwCreationFlags, // creation flags LPDWORD lpThreadId // pointer to returned thread identifier );
Можете, плз, подсказать, что нужно указать для параметров lpStartAddress и lpParameter? И какой нужно указывать размер стека dwStackSize?
Offline
lpStartAddress - адрес функции, которая будет исполняться в новом потоке
lpParameter - параметр, который будет ей передан
dwStackSize - 0 (automatic)
А нафига? Не проще врезаться в CGame::Process и не думать о синхронизации? Там есть пара заглушек, вместо которых можно подключиться.
Offline