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

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


Сообщения - xanser

Страницы: 1 [2] 3 4 ... 40
16
Общие вопросы / Re: Лимиты Игры
« : Сентябрь 06, 2020, 09:18:30 am »
лимит TXD меняет 9 адрессов

Недостаточно менять 1385 на другое число 9 раз. Если ты посмотришь псевдокод (F5), что происходит по первому адресу 0x41065D, то увидишь еще и массив 0x94DDD0 CStreaming::ms_aInfoForModel, в нем 1385 раз присваивается m_nLoadState = 1. Увеличивая лимит, ты в цикле заставляешь массив вылезти за свои пределы и переписать другие существующие адреса после его окончания 0x974AFC. Это решаемо переопределением выделенной под массив памяти в другом месте, уже не в адресе 0x94DDD0, и переопределением всех ссылок в коде на этот массив на твой новый адрес (ниже покажу как), если ссылок не так много, но конкретно на этот массив ссылок огромная куча, достаточно нажать на нем X, ну штук 400, хочешь их все переписывать? Не знаю, как лимитаджустеры с этим справляются, я не уверен, что они вообще увеличивают лимит txd, у меня не увеличивают. Мне кажется, проще уложиться в 1385, укрупнив txd, но тебе видимо надо объединить несколько карт.
Код: C++
  1. //0x41065D
  2. do
  3.   {
  4.     v25 = *(_DWORD *)(CTxdStore::ms_pTxdPool + 4);
  5.     if ( *(_BYTE *)(v25 + v23) & 0x80 )
  6.       v26 = 0;
  7.     else
  8.       v26 = v22 + *(_DWORD *)CTxdStore::ms_pTxdPool;
  9.     if ( v26 )
  10.     {
  11.       v27 = (_DWORD *)(*(_BYTE *)(v25 + v23) & 0x80 ? 0 : v22 + *(_DWORD *)CTxdStore::ms_pTxdPool);
  12.       if ( *v27 )
  13.         CStreaming::ms_aInfoForModel[v24 + 6500].m_nLoadState = 1;        // v24 индекс массива, 1385 раз между адресами 0x94DDD0 и 0x974AFC, если увеличить 1385, то 0x974AFC съедет дальше
  14.     }
  15.     ++v23;
  16.     v22 += 28;
  17.     ++v24;        // 1385 раз вместе с v23
  18.   }
  19.   while ( v23 < 1385 );        // увеличение v23 повлияет на увеличение v24, что приведет к смещению адресов за пределы стандартного массива 0x94DDD0
лимит ID меня значения в 150 адрессах

О чем я выше и писал, огромная куча адресов и массивов, расширить это все сложно. Я пробовал это делать и с лимитом id http://forum.gtabuilder.ru/index.php?topic=407.msg2918#msg2918 и с лимитом оружия http://forum.gtabuilder.ru/index.php?topic=395.msg2738#msg2738, но понимаю, что до конца все проверить в такой куче я не смогу.

3 - лимит модей транспорта которые могут быть созданны в игре одновременно (он равен примерно 50, если создать больше игра зависает)

Тут мне кажется, можно создать до 110, поскольку это размер пула машин CPools::pVehiclePool->size http://forum.gtabuilder.ru/index.php?topic=280.msg1855#msg1855. У меня получалось вручную создать где-то 87 машин (+3 летающих самолета уже были, они в начале пула). Дальше начинаются проблемы, но больше с рендером, машины начинают пропадать, сам игрок не дорисовывается. Вылет происходит не в момент очередного создания, а после, как будто не хватает памяти на сами модели. Столько же однотипных машин можно создать парковкой, если создавать все модели разными, то прорисуется не больше 20. Те 80 штук, что припаркованы на картинке, тоже не всегда в порядке, если поставить id более тяжелых моделей, то их рендер будет страдать, а дальше возможен вылет. Но само создание работает.



Тут приведу пример, как расширить парковку и сделать ее более плотной. В отличие от вышеперечисленных лимитов это получается, потому что ссылок на массив не так много, и можно все переопределить. Лимит припаркованных машин на карте 185, увеличивается до размера DWORD. Также есть лимит видимых одновременно машин 10, увеличивается до 127, размер unsigned char. Плотность рядомстоящих машин зависит от диаметра col-а, а он зависит от длины машины. Это сделано для того, чтобы угол рядомстоящих машин был любым, например перпендикулярным, и они не втыкались друг в друга. Можно заменить на ширину авто, и тогда машины встанут ближе друг к другу, это будет красиво в случае параллельной парковки, но теряется универсальность при других углах, тут уже контроль углов со стороны разработчика карты, чтобы не было наслоений. Как видно из кода, увеличение самого лимита занимает не так много строк, как переопределение массивов этого размера, в чем вся и проблема увеличения для лимитов.

Код: C++
  1. class CCarGenerator {
  2. public:
  3.         DWORD id;
  4.         CVector pos;
  5.         DWORD angle;
  6.         WORD  color1;
  7.         WORD  color2;
  8.         BYTE  alarm;
  9.         BYTE  doorLock;
  10.         BYTE  field_1A;
  11.         BYTE  field_1B;
  12.         WORD  field_1C;
  13.         WORD  field_1E;
  14.         DWORD time;
  15.         DWORD ProcessedVehicleHandle;
  16.         WORD  field_28;
  17.         BYTE  field_2A;
  18.         BYTE  field_2B;
  19. };
  20.  
  21. DWORD CFG_ParkedLimit = 185;    // 65535?
  22. DWORD CFG_ParkedInView = 10;    // 127
  23. bool CFG_ParkedClosely = false; // true
  24.  
  25. static void SetCarGeneratorLimit() {
  26.        
  27.         CarGenerator = new CCarGenerator[CFG_ParkedLimit];      //создание нового массива парковки вместо стандартного 0xA0DC94
  28.  
  29.         Patch(0x4537A9, (DWORD)CarGenerator);           // переопределение всех ссылок на массив
  30.         Patch(0x5A6C5F, (DWORD)CarGenerator);
  31.         Patch(0x5A6CC3, (DWORD)CarGenerator);
  32.         Patch(0x5A69DB, (DWORD)CarGenerator);
  33.         Patch(0x5A6B16, (DWORD)CarGenerator);
  34.         Patch(0x5A69E6, (DWORD)&CarGenerator->pos.x);
  35.         Patch(0x5A6B22, (DWORD)&CarGenerator->pos.x);
  36.         Patch(0x5A69F1, (DWORD)&CarGenerator->pos.y);
  37.         Patch(0x5A6B2A, (DWORD)&CarGenerator->pos.y);
  38.         Patch(0x5A69FC, (DWORD)&CarGenerator->pos.z);
  39.         Patch(0x5A6B35, (DWORD)&CarGenerator->pos.z);
  40.         Patch(0x5A6A07, (DWORD)&CarGenerator->angle);
  41.         Patch(0x5A6B40, (DWORD)&CarGenerator->angle);
  42.         Patch(0x5A6A14, (DWORD)&CarGenerator->color1);
  43.         Patch(0x5A6B4C, (DWORD)&CarGenerator->color1);
  44.         Patch(0x5A6A21, (DWORD)&CarGenerator->color2);
  45.         Patch(0x5A6B5C, (DWORD)&CarGenerator->color2);
  46.         Patch(0x5A6A2A, (DWORD)&CarGenerator->alarm);
  47.         Patch(0x5A6B65, (DWORD)&CarGenerator->alarm);
  48.         Patch(0x5A6A33, (DWORD)&CarGenerator->doorLock);
  49.         Patch(0x5A6B6E, (DWORD)&CarGenerator->doorLock);
  50.         Patch(0x5A6A3C, (DWORD)&CarGenerator->field_1A);
  51.         Patch(0x5A6B77, (DWORD)&CarGenerator->field_1A);
  52.         Patch(0x5A6A49, (DWORD)&CarGenerator->field_1C);
  53.         Patch(0x5A6B85, (DWORD)&CarGenerator->field_1C);
  54.         Patch(0x5A6A56, (DWORD)&CarGenerator->field_1E);
  55.         Patch(0x5A6B95, (DWORD)&CarGenerator->field_1E);
  56.         Patch(0x5A6A61, (DWORD)&CarGenerator->time);
  57.         Patch(0x5A6BA1, (DWORD)&CarGenerator->time);
  58.         Patch(0x5A6A6C, (DWORD)&CarGenerator->ProcessedVehicleHandle);
  59.         Patch(0x5A6BAC, (DWORD)&CarGenerator->ProcessedVehicleHandle);
  60.         Patch(0x5A6A79, (DWORD)&CarGenerator->field_28);
  61.         Patch(0x5A6BB8, (DWORD)&CarGenerator->field_28);
  62.         Patch(0x5A6A85, (DWORD)&CarGenerator->field_2A);
  63.         Patch(0x5A6BC1, (DWORD)&CarGenerator->field_2A);
  64.  
  65.         Patch(0x5A6C16, (DWORD)CFG_ParkedLimit);        // лимит припаркованных машин на карте, до 65535?
  66.  
  67.         Patch(0x5A71D0, (BYTE)CFG_ParkedInView);        // лимит одновременно видимых припаркованных машин, до 127
  68.  
  69.         if (CFG_ParkedClosely)
  70.                 Patch(0x5A6FE2, (BYTE)0);               // замена проверки диаметра col-а (длины машины) на ширину машины, чтобы парковалось ближе
  71. }

17
Решил я наделать скинов для своего персонажа. Можно всех посмотреть здесь https://cloud.mail.ru/public/2sRc/2JTQm9rX7.
Каждый скин обладает своими способностями или даже сверх-способностями. Если по-быстрому, проверить скин можно так:

Код: C++
  1. class CBaseModelInfo {
  2. public:
  3.         /*0x000*/       DWORD           vtable;
  4.         /*0x004*/       char            name[21];
  5.         /*0x019*/       char            _019[0x02C - 0x019];
  6.         /*0x02C*/
  7. };
  8. auto ModelInfo = (CBaseModelInfo **)0x92D4C8;
  9. if (!_strcmpi(ModelInfo[0]->name, "player6")) {}

Например, этот персонаж приобретает аццкое бессмертие по ночам и бронебойность своего транспорта.



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



Ну и кто еще не видел, с помощью смены скинов можно сделать вполне годный парашют. Так что тема интересная, жаль мало фанатов "в живых" осталось.

https://www.youtube.com/watch?v=uGbYzQQJ7Uo

18
Может кто выложит свежую базу на сегодня?

19
Скриптинг / Re: Пулы
« : Июнь 20, 2020, 04:04:15 pm »

20
Функции, которые вы написали, нет в "CCamera.h", может просто ещё не добавляли в репозиторий.

Поищи по адресам в CCamera.cpp, у меня другие названия.

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

Функция 0x46A494 устанавливает точку, в которую камера смотрит.

21
Ради чего столько мучений? По идее ты переписываешь стандартный скрипт на другом языке, вся последовательность команд должна быть та же самая. И что будет в результате, та же самая игра, только с вероятными проблемами. Какие функции с камерой подсказать? Ну вот например (в SDK аналогично):

Код: C++
  1. void CCamera::SetBehindPlayer() {
  2.         ((void(__thiscall *)(CCamera *))0x46BADE)(this);
  3. }
  4. void CCamera::Restore() {
  5.         ((void(__thiscall *)(CCamera *))0x46BC7D)(this);
  6. }
  7. void CCamera::SetPosition(CVector pos, CVector rotation) {
  8.         ((void(__thiscall *)(CCamera *, CVector *, CVector *))0x46BA72)(this, &pos, &rotation);
  9. }
  10. void CCamera::SetTarget(CVector point, signed int mode, signed int flag) {
  11.         ((void(__thiscall *)(CCamera *, CVector *, signed int, signed int))0x46A494)(this, &point, mode, flag);
  12. }
  13. void CCamera::SetRadius(float value, bool flag) {
  14.         this->nearClipPlain = value;
  15.         this->nearClipPlainOn = flag;
  16. }
  17.  
  18. auto Camera = (CCamera *)0x7E4688;
  19. // установка камеры
  20. Camera->SetRadius(0.02f, 1);
  21.  
  22. Camera->cams[Camera->activeCam].target.x = Camera->pos.x + (float)(-X1 * cos(U) + Y1 * sin(U));
  23. Camera->cams[Camera->activeCam].target.y = Camera->pos.y + (float)(-Y1 * cos(U) - X1 * sin(U));
  24. Camera->cams[Camera->activeCam].target.z = Camera->cams[Camera->activeCam].target.z + R0 * Mouse->Y / 100;
  25.  
  26. Camera->pos.x = Camera->cams[Camera->activeCam].target.x + R2*(float)(X1 * cos(U) - Y1 * sin(U));
  27. Camera->pos.y = Camera->cams[Camera->activeCam].target.y + R2*(float)(Y1 * cos(U) + X1 * sin(U));
  28. Camera->pos.z = Camera->pos.z - R0 * Mouse->Y / 100;
  29.  
  30.  
  31. Camera->SetPosition(Camera->pos, CVector(0, 0, 0));
  32. Camera->SetTarget(Camera->cams[Camera->activeCam].target, 2, 1);
  33.  
  34. // восстановление камеры
  35. Camera->SetRadius(0.9f, 0);
  36. Camera->Restore();
  37. Camera->SetBehindPlayer();
  38.  

22
Идеи / Re: Зеркало заднего вида
« : Февраль 13, 2020, 04:31:34 am »
Видимо там ответы на все вопросы. Вроде эти исходники https://github.com/gtco-op/vc-coop

23
А как  изменить  значения адрес памяти 0x41079F в sdk plugin, всегда понять на маленькой примере.

kenking выше отвечал: http://forum.gtabuilder.ru/index.php?topic=502.msg3856#msg3856

Не все подряд имеет смысл делать через lua. В данном случае стоит сделать отдельный плагин на с++ и загружать через какой-нибудь loader до начала игры, чтобы инициализация всех первоначальных параметров уже подхватила изменения. Ты проверь для начала увеличение Streaming Memory через Limit Adjuster, а то может тебе оно и не надо. А для работы с адресами памяти в lua может и есть какие-то функции, этого я уже не знаю.

И ты вот скидываешь огромные куски кода на lua, но я не вижу на форуме ни одного человека, который был бы в теме этого языка. Sektor делал целый раздел Vice Lua, может туда лучше писать, хотя сомневаюсь, что кто-то тебе подскажет хоть что-то. Пока интересующихся этим особо нет.

24
А как увеличить SStreaming memory в sdk?

Значение хранится здесь: 0x41079F, равное StreamMemory * 1024 * 1024 (изначально 68157440 = 65 * 1024 * 1024). Тут надо уточнить, что изменение нужно делать до начала игры, не знаю, умеет ли это lua. Иначе это делается LimitAdjuster-ом через редактирование exe.

пед  выполняет  анимацию, но как её сбросить?
Если не в цикле, то анимация сама должна останавливаться.

25
Идеи / Re: Смена текстур транспорта
« : Февраль 01, 2020, 08:02:12 am »
Вобщем-то все делалось ради этого:


26
Программы / Re: GTA VC Seter - Идеи по разработке.
« : Февраль 01, 2020, 07:40:21 am »
Нужно будет не только убрать лишние пункты меню, но и сдвинуть координаты оставшихся. Можно даже переопределить команды и распределить иначе разделы. Я когда-то этим занимался, но недавно, возвращаясь к этому, понял, что возиться уже неохота. Выложил на сайт свой вариант компактного меню для глобальных модов, там убрано все лишнее по максимуму. http://gtabuilder.ru/gta_vc/mods/asi_plugins/470-kompaktnoe-menyu.html

27
Идеи / Re: Смена текстур транспорта
« : Январь 29, 2020, 11:46:55 am »
Поправил немного первоначальный код. Теперь то, что показано на видео, работает без ошибок. Просьба потестить. Моим способом перезагрузка модели работает, если ее сильно не мучить и дать пару секунд на смену. Каждый раз при смене игра вынуждена заново вызывать RequestModel и LoadRequestModels. Но созданные скины существуют одновременно. В примере смена скинов встроена в место создания танка в трафике при 6 звездах с периодичностью в 5 секунд. Другие машины можно аналогично встраивать например в функцию парковки или еще куда в зависимости от условий, положения игрока и т.д. Можно например таким способом сделать разные скины полицейским машинам на разных островах проверкой x-координаты игрока. Хотел было сделать мод, чтобы на первом острове ездили полиции с альфа-текстурой, но там поправлена еще и сама модель. Чуть позже покажу видео моего применения этого. Вариант с одной txd и remap-ом внутри нее я пока не знаю, как сделать.

Спустя три года: КОД НЕ СОВСЕМ ВЕРНЫЙ, ТАК ДЕЛАТЬ НЕ НАДО!

28
На видео текстуры не пропадают, там лоды, которые не успевают меняться на нормальные модели из-за увеличенной нагрузки модами. Попробуй увеличить Streaming memory. Анимацию персонажей можно задавать функцией 0x405640 CAnimManager::BlendAnimation. Во вложении коды анимаций, которые я себе выписал. Например 14 код - падение вперед, CAnimManager::BlendAnimation(PlayerPed->rwObject, 0, 14, 10000.0f);

29
Я пробовал добавлять дополнительное оружие, расширить список. Оно даже появилось в игре, но вместе с ним добавилось столько проблем и ошибок, что "игра не стоит свеч". Лучше все-таки переделать что-то стандартное.

30
Общие вопросы / Re: Изменение иконки exe файла
« : Январь 21, 2020, 03:49:09 pm »
Я использовал программу Reshacker. Главное после замены проверять, чтобы размер exe-файла не изменился, иначе съедут адреса. Заменяется иконка размера 32х32 256 цветов, улучшить качество иконки не получится.

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