Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - xanser

Страницы: 1 2 [3] 4
31
Бывают случаи, когда авторы создают полезные плагины, но не делятся исходным кодом. Мне например не хочется использовать чужие плагины в своем моде, спрашивать разрешение авторов включать их в свою сборку, поэтому стараюсь все писать сам. Но как раздобыть необходимый адрес, если код закрыт. Если с CLEO-скриптами все просто, их можно открыть и посмотреть, вытащить оттуда все полезное, то с ASI-плагинами поможет только IDA PRO.

Многие знают плагин Img Limit Adjuster, но как он работает.
Сначала пойдем честным путем (я так и сделал). Подключение img-архива происходит в default.dat или gta_vc.dat командой CDIMAGE, отсюда легко это найти в IDA



На рисунке видно, что лимит img-архивов задается не ограничением количества CDIMAGE_COUNT, а размером памяти, выделенной под их названия CDIMAGE_NAMES и соответственно под сам массив указателей CDIMAGES. Получаем максимум 8 архивов, кроме gta3.img, больше просто некуда записать.

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

Код: C++
  1. void *CDIMAGE_NAMES; CDIMAGE_NAMES = VirtualAlloc(NULL,0x4000,MEM_COMMIT,PAGE_READWRITE);
  2. void *CDIMAGES;      CDIMAGES      = VirtualAlloc(NULL,0x1000,MEM_COMMIT,PAGE_READWRITE);

Осталось перенаправить все первоначальные ссылки (их легко увидеть, нажав X в IDA), которые были на 0x6F7488 CDIMAGE_NAMES и 0x6F76D0 CDIMAGES на новые области

Код: C++
  1. WriteDWORD((DWORD*)0x4081D2,(DWORD)CDIMAGE_NAMES);
  2. WriteDWORD((DWORD*)0x40823A,(DWORD)CDIMAGE_NAMES);
  3. WriteDWORD((DWORD*)0x408801,(DWORD)CDIMAGE_NAMES);
  4. WriteDWORD((DWORD*)0x40818B,(DWORD)CDIMAGES);
  5. WriteDWORD((DWORD*)0x408199,(DWORD)CDIMAGES);
  6. WriteDWORD((DWORD*)0x4081C7,(DWORD)CDIMAGES);
  7. WriteDWORD((DWORD*)0x408215,(DWORD)CDIMAGES);
  8. WriteDWORD((DWORD*)0x408221,(DWORD)CDIMAGES);
  9. WriteDWORD((DWORD*)0x40851B,(DWORD)CDIMAGES);
  10. WriteDWORD((DWORD*)0x4086E1,(DWORD)CDIMAGES);
  11. WriteDWORD((DWORD*)0x4087E2,(DWORD)CDIMAGES);
  12. WriteDWORD((DWORD*)0x4087EE,(DWORD)CDIMAGES);
  13. WriteDWORD((DWORD*)0x40885B,(DWORD)CDIMAGES);
  14. WriteDWORD((DWORD*)0x408869,(DWORD)CDIMAGES);

На всякий случай моя процедура WriteDWORD, которая просто пишет в адрес 4 байта

Код: C++
  1. void WriteDWORD(DWORD *Address, DWORD Value)
  2. {
  3.     DWORD OldProtect;   VirtualProtect(Address,sizeof(DWORD),PAGE_READWRITE,&OldProtect);
  4.     *Address = Value;   VirtualProtect(Address,sizeof(DWORD),OldProtect,&OldProtect);
  5. }

Теперь лимит img-архивов ограничивается только выделенной под них областью памяти.

Теперь о реверсе существующего плагина IMG Limit Adjuster. Я использовал это, только чтобы проверить свои описанные выше догадки, но те кто не догадаются, смогут с чего-то начать. Можно открыть плагин в IDA, сразу появится основная функция и действительно в ней видно, что автор руководствовался точно такой же логикой, два раза выделяется память VirtualAlloc и дальше перебрасываются на нее все ссылки через VirtualProtect. Это и означает, что адрес, переданный в качестве параметра в VirtualProtect будет меняться, их и смотрим.



Кстати, достаточно выделить память один раз и правильно распределить, по 64 байта под названия, по 4 под указатели.
P.S. А еще лучше обойтись динамическими массивами.

32
Идеи / Авиация - что можно улучшить
« : Март 29, 2014, 06:35:18 pm »
Что сделано на сегодняшний день с пассажирским самолетом? Наверное ничего.

1. Нужно сделать нормальную коллизию, чтобы врезаться в него, высаживаться на него с вертолета.
Как вариант убрать стандартные самолеты и использовать их с коллизией и путями, но по принципу яхты Кортеза, где есть коллизия. Я как-то пускал ее по городу, сносит все живое. Тут вроде понадобится еще object.dat, чтобы с него не падать.

2. Нужно сделать салон и возможность летать на нем пассажиром с другими педами, это думаю просто, зная его координаты.

3. Возможность его уничтожать, эта мысль пришла после просмотра этого видео (1:56), как вариант перенести на него взрыв deaddodo

GTA 3 Beta - German PS 2 TV-Trailer

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

34
Идеи / Система залпового огня
« : Март 19, 2014, 08:39:16 pm »
Есть некоторые задумки по этому поводу. А может на GTA уже делали что-то подобное?
В общем-то нужно взять и пульнуть ракету в нужной точке, также как с вертолета или базуки.


35
Идеи / Луна и ночное небо
« : Март 07, 2014, 11:04:53 am »
Вот решил сделать свой вариант секретной фишки выстрела в луну, теперь с луной шутки плохи:

gta moon


Еще думаю сделать что-то со звездами, например заменить созвездие R* на созвездие большой медведицы и еще добавить настоящих созвездий.
По пути я вернул правильные пропорции луны и всем небесным объектам.

36
Ура, я снова модератор, можно продолжать работу, а что было?

37
Идеи / Океан 10000x10000 (Реализовано)
« : Февраль 23, 2014, 08:57:49 pm »
То, что я вижу сложно назвать океаном. Прорисовка внутренней воды ограничена по расстоянию, внешний периметр образует заметные углы. Хотелось бы наблюдать воду до горизонта, хотя бы до границ скайбокса, точнее сферы. Думаю реально расширить внешний периметр и увеличить дисстанцию прорисовки внутреннего. Речь не идет о плавании, только о видимости.


38
Программирование / Trails - вызов на лету
« : Февраль 19, 2014, 05:19:31 pm »
Вот такую фишку хочу сделать, суть в сочетании эффекта опьянения, вызывающего пошатывание и blur-эффекта или trails, делающего мир красочнее, ну все как жизни после выпитого.

Drunk trails


У меня пока кривая активация trails на лету (с выбросом в меню), может мы совместными усилиями доведем до ума.
Пока вызов trails возможен только в меню, чтобы игра не вылетела. Даже если этого пунта нет там, можно сделать так:

Код: C++
  1. *(BYTE *)0x869642 = 1; // выход в меню
  2. *(BYTE *)0x697D54 = 1; // trails on

Проблема в том, что меню нужно после этого закрыть вручную, в этот момент и происходит активация. Как бы описать функцию, которая должна запускаться на выходе из меню, чтобы все происходило сразу в игре без вызова меню. Я вроде нашел, что все зависит от этого указателя 0x9753A4 __MBlur, он при каждом вызове trails меняет значение. Я пробовал его устанавливать по предыдущему значению, trails включаются сразу без меню, но как-то криво, потому что должно быть уже новое значение. Вот такой вариант активирует кривой trails без меню:

Код: C++
  1. *(DWORD *)0x9753A4 = ?; // можно попробовать его предыдущее значение, но это неправильно
  2. *(BYTE *)0x697D54 = 1; // trails on

Если разбираться, то единственное место, где он устанавливается это:

Код: C++
  1. 0x55D08B         mov     ds:__MBlur, eax

Вобщем мне кажется если будет этот указатель, будет trails, только не могу сообразить как это правильно сделать.
С отключением trails проблем нет:

Код: C++
  1. *(BYTE *)0x697D54 = 0; // trails off
  2. и вызов функции 0x55CDF0 BlurDestroy

39
Общие вопросы / Friendly fire
« : Февраль 14, 2014, 05:21:19 am »
В стремлении к реализму было бы здорово отключить так называемый friendly fire, чтоб копы, попадая друг в друга, страдали от своих же пуль

40
Общие вопросы / MenuFix - мой вариант меню
« : Январь 15, 2014, 12:55:24 pm »
Хотел спросить как убрать вывод черной рамки в меню, но уже научился благодаря этому форуму.
Надо занупить вызов _drawRect по адресам:
0x4A2831
0x4A292B
0x4A2A34
0x4A2DB9
0x4A2EB3
0x4A2FC2
0x4A30D1



41
Программирование / Альтернатива скриптингу
« : Декабрь 13, 2013, 01:51:39 pm »
Решил поделиться своим подходом. Я не люблю скриптить, поэтому решил вычистить под ноль все скрипты и использовать опкоды непосредственно в с++. В будущем надеюсь заменить опкоды на функции, насколько возможно.
Это запуск игры без сриптов, если можно так сказать, где определены координаты игрока и расставлено оружие средствами с++:



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

Код: C++
  1. DEFINE VERSION VICE 1.5
  2.  
  3. 0002: jump гг_HEAD
  4. DEFINE MEMORY 34329
  5.  
  6. :_HEAD
  7. 0002: jump гг_MAIN
  8. DEFINE MISSIONS 0
  9.  
  10. :_MAIN
  11.  
  12. 016A: fade 0 0 ms
  13. 0053: $PLAYER_CHAR = create_player #NULL at 0.0 0.0 0.0
  14. 01F5: $PLAYER_ACTOR = create_emulated_actor_from_player $PLAYER_CHAR
  15. 0001: wait 0 ms
  16. 016A: fade 1 (back) 1000 ms
  17.  
  18. :_WAIT
  19. 0001: wait 10000 ms
  20. 0002: jump гг_WAIT
  21.  

После этого у нас создан указатель на игрока. Со всем остальным мы можем работать в плагине.
Подключаем к своему проекту исходники спидометра Spookie, в частности GameScripting.cpp и GameScripting.h. Там уже есть примеры опкодов, я определил свои для минимально необходимого запуска игры:

Код: C++
  1. const SCRIPT_COMMAND set_camera                         = { 0x03CB, "fff" };            // x, y, z
  2. const SCRIPT_COMMAND refresh_game_renderer              = { 0x04E4, "ff" };             // x,y
  3. const SCRIPT_COMMAND set_player_angle                   = { 0x0171, "vf" };             // PLAYER_CHAR pointer, angle
  4. const SCRIPT_COMMAND set_camera_behind_player           = { 0x0373, "" };               //
  5. const SCRIPT_COMMAND set_current_time                   = { 0x00C0, "ii" };             // Hours, Minutes
  6. const SCRIPT_COMMAND create_weapon_pickup               = { 0x032B, "iiifffv" };        // id, type, ammo, x, y, z, pickup pointer
  7.  

Адрес в фигурных скобках это и есть опкод, дальше идет форматная строка типов параметров опкода, думаю из примеров легко понять как их ставить.
Ну и теперь можно скриптить что угодно в своем плагине, используя весь функционал с++, чтение настроек из файлов, классы, массивы и т.д.
Вот пример начала игры с расставленными пикапами оружия, добавьте к этому припаркованные авто, плотность траффика, локации банд и прочее и получите полноценную игру.
Единственный открытый вопрос - это как писать миссии при таком подходе и работать с сэйвами, но для глобальных модов, где обычно используется чистый мэйн это неактуально. Можно придумать свой механизм управления миссиями средствами с++.

Код: C++
  1. #include "stdafx.h"
  2. #include "GameScripting.h"
  3.  
  4. bool NewGame = true;
  5.  
  6. DWORD   *dwPlayerChar   = (DWORD *) 0x821288;
  7. DWORD   *dwPlayerActor  = (DWORD *) 0x82128C;
  8. DWORD   *dwPlayer       = (DWORD *) 0x94AD28;
  9.  
  10. //--------------------------------------------------------------------------------
  11. //
  12. void TestPlayer()
  13. {
  14.         if (*dwPlayer)
  15.         {
  16.                 if (NewGame)    // Опкоды при старте игры
  17.                 {      
  18.                         NewGame = false;       
  19.  
  20.                         BYTE  *bPlayerBlock = (BYTE*)(*dwPlayer);                      
  21.                         float *X = (float*)(bPlayerBlock+0x34);
  22.                         float *Y = (float*)(bPlayerBlock+0x38);
  23.                         float *Z = (float*)(bPlayerBlock+0x3C);
  24.                        
  25.                         *X = 155.0f;    *Y = -510.0f;   *Z = 13.0f;
  26.  
  27.                         ScriptCommand(&set_camera, *X, *Y, *Z);
  28.                         ScriptCommand(&refresh_game_renderer,*X, *Y);
  29.                         ScriptCommand(&set_player_angle,dwPlayerChar, 230.0f);
  30.                         ScriptCommand(&set_camera_behind_player);
  31.                         ScriptCommand(&set_current_time,10,0);
  32.                         for (int i=0;i<10;i++)  
  33.                         {
  34.                                 DWORD generated;
  35.                                 ScriptCommand(&create_weapon_pickup,274+i,2,100,*X+8-i*0.1f,*Y-2*i,*Z,&generated);
  36.                         }
  37.                 }
  38.                 // Тут любые опкоды игрового процесса, выполняющиеся в цикле по времени
  39.         }
  40.         else NewGame = true;
  41. };
  42.  
  43. //--------------------------------------------------------------------------------
  44. //
  45. BOOL APIENTRY DllMain( HMODULE hModule,
  46.                        DWORD  ul_reason_for_call,
  47.                        LPVOID lpReserved
  48.                      )
  49. {
  50.     switch (ul_reason_for_call)
  51.     {
  52.     case DLL_PROCESS_ATTACH:
  53.                
  54.         SetTimer(0,0, 10, (TIMERPROC)TestPlayer);
  55.  
  56.         break;
  57.     case DLL_THREAD_ATTACH:
  58.     case DLL_THREAD_DETACH:
  59.     case DLL_PROCESS_DETACH:
  60.         break;
  61.     }
  62.     return TRUE;
  63. }
  64.  

42
Идеи / Тяжелая техника (число колес)
« : Декабрь 12, 2013, 12:52:55 pm »
Максимальное число колес - шесть. Умельцы при моделировании придумали обзывать колесами сразу весь мост, увеличив число колес до 12, хотя при пробивании одной стороны видимо спускает весь мост.
А как быть с машинками по 7-8 колес с каждой стороны, наверняка каждому хотелось бы заиметь в игру Тополь-М.


43
Идеи / Интерактивный конструктор города
« : Декабрь 04, 2013, 03:01:36 pm »
Это даже не мод, а скорее инструмент для мапперов. Я когда-то его даже реализовал, но ничего не сохранилось. Со временем собираюсь восстановить, но может кто-то сделает по-своему.

Как мы знаем, все объекты карты города определены в ide файлах, а в ipl файлах прописано их расположение на карте. Единственный пока способ их расставить, это использовать программу типа MooMapper, проверить в игре, не понравилось, опять открыть, исправить, проверить, такая рутина. Более того, если img архив разделен на несколько своих, то программа уже с ними работать не может.

Вот мой способ:
Прямо в игре создаем любой объект карты по его id из ide файла (не помню опкод), например прямо перед игроком, или листаем все подряд объекты пока не увидим нужный скажем дом или забор. Дальше крутим-вертим его как нам хочется, ставим куда нужно и сразу оцениваем, нравится ли нам на карте его расположение, если все в порядке, подтверждаем выбор и у нас формируется строка для ipl файла с его координатами и углом. Таким образом, можно наставить прямо в игре кучу динамических объектов и получить готовый ipl файл, который прописываем перед следующим запуском игры куда нужно и объекты на карте уже стоят на своих местах.

Я таким способом засадил целый лес, причем сделал это в разы быстрее, чем через MooMapper, просто бегал по карте и сажал сосны



44
Программирование / Свободные адреса памяти
« : Декабрь 04, 2013, 02:16:11 pm »
Возникла ситуация, когда понадобилось хранить в игре собственные переменные, созданные плагином, значения которых бы считывало какое-то внешнее приложение, либо другой плагин, вобщем нужно организовать информационный обмен через область памяти самой игры.
Примером новой информации может быть пробег и запас топлива всех авто в городе. Скорее всего подсунуть эти переменные в класс CVehicle уже некуда, поэтому есть ли свободные адреса памяти, в которых можно смело хранить свою информацию, чтобы считывать другим плагином. Я раньше находил пустые блоки 00 00 00 00 00 00 00..., но хранил там информацию на свой страх и риск.
Какая-то фишка может стать новым стандартом игры, под которую остальные смогут писать что-то еще, точно зная откуда считать эту информацию. Нужны 100% неиспользуемые области статической памяти игры.

45
Идеи / Трансформация
« : Ноябрь 27, 2013, 11:39:30 am »
Особого практического применения я пока в этом не вижу, за исключением может быть примера из SA, где игрок накачивался или толстел.
Но если разрабатывать специализированные моды на эту тему, то вот пара идей, может кто-то возмется.

Трансформация игрока (Hulk Mod)



Тут просто перебираем скины/модели игрока, имитируя анимацию. Я пробовал добавлять дополнительные скины, кроме 12-ти стандартных Player-Play12, например Play13, Play14 и т.д. все работает. Для Халка можно поставить имунитет ко взрывам, пулям, бесконечный бег. Прыжки можно отслеживать и корректировать координаты, чтобы можно было прыгать через дома. Силу удара тоже можно увеличить, чтобы люди разлетались, а при ударе по машине можно делать еще микровзрыв, так чтобы тачку сносило. Вобщем повеселиться, разрушая все вокруг.


Трансформация из тачки в игрока (Transformer Mod)



Тут посложнее. Надо иметь машину, куски той же машины в виде отдельных объектов, которые будут перемещаться и вращаться друг относительно друга. Когда все куски встанут на свои места, просто меняем их на скин/модель игрока-трансформера. Что касается роста, то игрок теперь должен быть с дом, тут можно попробовать увеличить скелет (как это отразится на игровом процессе я не проверял), либо попробовать смасштабировать игрока через память. Тут видео, где добрались до масштабирования объектов:

Minimega-Cheetah (GTA:VC)

Страницы: 1 2 [3] 4