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

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


Сообщения - xanser

Страницы: 1 2 [3] 4 5 ... 40
31
Такое ощущение как будто он защит в exe.
В этом ты прав:
674, doc_crane_cab0, crate, 1, 50, 132           // башня крана docks.ide            0068E848
681, doc_crane_cab01, crate, 1, 50, 132         // башня крана docks.ide            0068E84C
682, doc_crane_cab02, crate, 1, 50, 132         // башня крана docks.ide            0068E850
683, doc_crane_cab03, crate, 1, 50, 132         // башня крана docks.ide            0068E854
668, boatcranelg0, crate, 1, 50, 132                // башня крана docks.ide            0068E858
842, LODnetopa0, lod_docks, 1, 1000, 132      // башня крана docks.ide            0068E85C

Можно отключить рендер определенной модели в определенном радиусе

Можно отключить рендер модели еще так:
Код: C++
  1. void CEntity::Render() {
  2.         ((void(__thiscall *)(CEntity *))0x4887D0)(this);
  3. }
  4. class EntityRender {
  5.         static void __fastcall SetEntityRender(CEntity * Entity) {
  6.                 if (Entity->id != 1234)    // disable render model with id 1234
  7.                         Entity->Render();
  8.         }
  9. public:
  10.         EntityRender() {
  11.                 Patch(0x6865C0, (int)SetEntityRender);
  12.                 Patch(0x686610, (int)SetEntityRender);
  13.                 Patch(0x68B394, (int)SetEntityRender);
  14.                 Patch(0x68B610, (int)SetEntityRender);
  15.                 Patch(0x68F6E8, (int)SetEntityRender);
  16.                 Patch(0x691610, (int)SetEntityRender);
  17.                 Patch(0x69CA28, (int)SetEntityRender);
  18.         }
  19. } _EntityRender;
  20.  
  21.  

32
Общие вопросы / Re: Ошибка
« : Январь 13, 2020, 06:13:39 am »

Может уже неактуально, но я сегодня схватил такую же ошибку. У меня причина - некорректное название модели машины в carcols.dat, поправил - все пошло. Для теста можно вообще удалить цвета машин, в игре они будут просто черные (например танк).

33
Ты упоминал, что тебе нужно заменять не один объект, а целые районы. Нужно будет выгрузить кучу объектов карты и загрузить заново по сути из альтернативного gta_vc.dat, который подцепит альтернативные ide с другими моделями на те же самые id. В итоге даже если все получится, ты получишь в игре очередную полосу загрузки, как в начале. Может сразу заложить разные версии gta_vc.dat и подменять их до полосы загрузки при старте игры в зависимости от каких-то условий.

34
Можно еще менять прозрачность модели Entity->SetRwObjectAlpha(alpha). Пример как заменять модели неба по времени с плавным переходом между ними. По факту все модели существуют одновременно, только с разной прозрачностью.
Код: C++
  1. void CEntity::SetRwObjectAlpha(int alpha) {
  2.         ((void(__thiscall *)(CEntity *, int))0x487990)(this, alpha);
  3. }
  4.  
  5. class EntityPreRender {
  6.         static bool isSky(CEntity * Entity) {
  7.                 for (int i = 0; i < DAT_Sky; i++)            // DAT_Sky - sky model count
  8.                         if (Entity->id == IPL_Sky[i]) {      // IPL_Sky[i] - array of sky model id
  9.                                 switch (i) {
  10.                                 case 1:
  11.                                         Entity->SetRwObjectAlpha(int(255 * ((((HOUR > 4) && (HOUR < 8)) || ((HOUR > 17) && (HOUR < 23))) + ((HOUR == 4) || (HOUR == 17)) * ((MINUTE * 60 + SECOND) / 3600.0f) + ((HOUR == 8) || (HOUR == 23)) * (1 - (MINUTE * 60 + SECOND) / 3600.0f))));
  12.                                         break;
  13.                                 case 2:
  14.                                         Entity->SetRwObjectAlpha(int(255 * (((HOUR < 5) || (HOUR > 22)) + (HOUR == 22) * ((MINUTE * 60 + SECOND) / 3600.0f) + (HOUR == 5) * (1 - (MINUTE * 60 + SECOND) / 3600.0f))));
  15.                                         break;
  16.                                 default:
  17.                                         Entity->SetRwObjectAlpha(int(255 * (((HOUR > 7) && (HOUR < 18)) + (HOUR == 7) * ((MINUTE * 60 + SECOND) / 3600.0f) + (HOUR == 18) * (1 - (MINUTE * 60 + SECOND) / 3600.0f))));
  18.                                         break;
  19.                                 }
  20.                                 return true;
  21.                         }
  22.                 return false;
  23.         }
  24.  
  25.         static void __stdcall SetEntityEvents(CEntity * Entity) {
  26.                 if ((ModelInfo[Entity->id])->num2dEffects)
  27.                         Entity->ProcessLights();    // original code
  28.                 if (isSky(Entity)) {
  29.                         Entity->matrix.UpdateRw();
  30.                         Entity->UpdateRwFrame();
  31.                 }
  32.         }
  33.  
  34. public:
  35.         EntityPreRender() {
  36.                 Inject(0x488819, 0x488833, (int)SetEntityEvents, ASM_PUSH_EBX);
  37.         }
  38. } _EntityPreRender;

35
Моды / Re: Ранее не опубликованное
« : Декабрь 07, 2019, 11:43:51 am »
Отличное обобщение работы, увиденное как всегда восхищает. Единственно, не успевал прочитать все на экране, слишком быстро исчезает, приходилось ставить на паузу. Вот такой раздел я и предлагал сделать, только на самом сайте. Хочется собрать что-то подобное по своим творческим изысканиям, только нужно время подвести промежуточные итоги. Надеюсь, другие подхватят задумку, а то сайт плесенью зарос.
Shagg_E, тебе желаю успешно завершить все проекты и не останавливаться на достигнутом.

36
Можно ли как-то переместить солнце на юг, как это сделано вроде как в тройке?


Мод размещен на сайте http://gtabuilder.ru/gta_vc/mods/asi_plugins/469-dvizhenie-solnca.html

38
Моды / Ку, зараза!
« : Октябрь 29, 2019, 12:10:39 pm »
Землянин, здравствуй! Уверен, ты когда-нибудь зайдешь и в эту тему на задворках безжизненного форума. Хочу представить свой мод, посвященный известному фильму. Картинки можно посмотреть тут .



Хотелось обсудить не столько этот мод (в нем ничего особенного), сколько поделиться методами создания, которые могут пригодиться другим.

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

Карта сделана самостоятельным лодом размером 10000х10000, он не привязан ни к какому объекту, поэтому виден всегда. В данном случае подошла простая текстура высот, определившая в 3dmax-e холмистость, ее можно продолжить редактировать в z-modeler-e, например импортировав через 3ds. Размер dff-файла получился 2 Мб, что не так критично для готовой карты. Далее нужно сделать соприкосновение с картой, чтобы по ней ездить. Созданы "затычки" для поверхности через каждые 200x200 метров, состоящие из одного микро-полигона, который скрывается под лод-картой, он просто нужен, чтобы был. Далее col-файл этого полигона отличается от него самого. В этом основная фишка - col-файл "затычки" повторяет лод в пределах соответствующего ему участка через каждые 200х200, размер обусловлен лимитом осязаемой коллизии в пределах 300 метров. На это у меня ушло несколько дней - разбить лод на 20 колов по высоте и 20 по ширине карты, всего 400 колов. Тут бы хотелось узнать у знатоков скриптов 3dmax-а, может как-то можно автоматизировать подобную разбивку. Хорошо бы для произвольной карты сделать независимый от сетки распил по 200х200, потому что при доработке карты скорее всего изменится и кол дорабатываемого участка.



Расставить участки поверхности (их 400) в ipl файле тоже дело недолгое, в результате за неделю готовая простая карта. Если делать город, могу предложить вместо одного лода использовать, скажем, четыре размером 1000х1000, или размером еще меньше в зависимости от детализации рельефа и желаемого размера dff-файла. Думаю, такой способ ускорит создание карт.

39
Программирование / Re: Сложные модели объектов
« : Сентябрь 17, 2019, 04:35:17 am »
А персонажа-часы можно застрелить, он убежит от выстрелов? :P Так-то можно и машину закрепить в виде тряпки, ох как все костыльно выходит. Для часов есть еще вариант рендерить стрелки примитивами по аналогии как рендерится мусор. Я так сделал рендер мультика при появлении экрана, а вот тряпки таким способом получатся только плоскими. Есть у меня еще игрушки-вертолетики с вращающимися винтами, собранные из разных кусков-моделей. Что бы такое универсальное для всего этого придумать...


40
Программирование / Re: Сложные модели объектов
« : Сентябрь 16, 2019, 01:46:19 pm »
Решил продолжить тему. Сделал одной моделью часы со стрелками на здании полицейского участка, показывают игровое время. Как было предложено выше, использовал секцию [hier] в ide для иерархии и окончания компонентов в модели _L0, _L1, _L2, прописал модель в object.dat, только так все это заработало. Поиск компонентов модели использован аналогично транспорту, предложен DK в одной из тем, не помню где, через функцию RwFrameForAllChildren(parent, 0x5411E0, data).

Мод во вложении, собран "на коленке" только для тестов и не является дополнением к оригинальной игре!!!
Из минусов:
1. В секции [hier] нет возможности настраивать дальность и флаги прозрачности.
2. В секции [hier] лимит на 5 записей, все они нужны для кат-сцен.
3. Из-за расположения в [hier] объект исчезает и больше никогда не появляется, как только камера/игрок отдаляется за радиус примерно в 130 метров от объекта. Это главный минус, поэтому предложенный вариант кажется не имеет развития. Придется вернуться к варианту с лавочками и секции [objs], который не имеет иерархии, но при этом у лавок как-то происходит смена моделей при поломке. С этим бы хотелось разобраться и вызывать "на лету".


41
Давненько хотелось видеть в игре другую траекторию движения солнца

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

42
Делюсь информацией по адресам координат прямоугольника, который задает "непромокаемость" салона лодки, вода в этом месте не рендерится, и салон может погружаться ниже уровня воды без подтопления. При замене модели лодки этот прямоугольник остается стандартным и портит картину. Вот адреса координат для замены, по 4 координаты x, y, z для каждой лодки. Для лодки 202 координат 8, там задано два прямоугольника. Для лодки 223 координат я не обнаружил. Если скриптом менять, то например замена первой точки 136 лодки выглядит так:

Код: Text
  1. 05DF: write_memory 0x5A5166 size 4 value -1.3 virtual_protect 1  // x
  2. 05DF: write_memory 0x5A5170 size 4 value -1.016 virtual_protect 1  // y
  3. 05DF: write_memory 0x5A517A size 4 value 0.51 virtual_protect 1  // z

// 136
0x5A5166   -1.3
0x5A5170   -1.016
0x5A517A   0.51
0x5A5184   1.3
0x5A518E   -1.016
0x5A5198   0.51
0x5A51A2   -1.3
0x5A51AC   -2.832
0x5A51B6   0.51
0x5A51C0   1.3
0x5A51CA   -2.832
0x5A51D4   0.51
// 160
0x5A4FE6     -1.45
0x5A4FF0     1.9
0x5A4FFA     0.96
0x5A5004     1.45
0x5A500E     1.9
0x5A5018     0.96
0x5A5022     -1.45
0x5A502C     -3.75
0x5A5036     0.96
0x5A5040     1.45
0x5A504A     -3.75
0x5A5054     0.96
// 176
0x5A51E6   -1.222
0x5A51F0   2.004
0x5A51FA   1.409
0x5A5204   1.222
0x5A520E   2.004
0x5A5218   1.409
0x5A5222   -1.24
0x5A522C   -1.367
0x5A5236   0.846
0x5A5240   1.24
0x5A524A   -1.367
0x5A5254   0.846
// 182
0x5A4EE6   -1.15
0x5A4EF0   3.61
0x5A4EFA   1.03
0x5A4F04   1.15
0x5A4F0E   3.61
0x5A4F18   1.03
0x5A4F22   -1.15
0x5A4F2C   0.06
0x5A4F36   1.03
0x5A4F40   1.15
0x5A4F4A   0.06
0x5A4F54   1.03
// 183
0x5A4F66   -1.9
0x5A4F70   2.83
0x5A4F7A   1.0
0x5A4F84   1.9
0x5A4F8E   2.83
0x5A4F98   1.0
0x5A4FA2   -1.66
0x5A4FAC   -4.48
0x5A4FB6   0.83
0x5A4FC0   1.66
0x5A4FCA   -4.48
0x5A4FD4   0.83
// 184
0x5A52E6   -1.886
0x5A52F0   -2.347
0x5A52FA   0.787
0x5A5304   1.886
0x5A530E   -2.347
0x5A5318   0.787
0x5A5322   -1.886
0x5A532C   -4.67
0x5A5336   0.842
0x5A5340   1.886
0x5A534A   -4.67
0x5A5354   0.842
// 202
0x5A50E6   -0.663
0x5A50F0   3.565
0x5A50FA   0.382
0x5A5104   0.663
0x5A510E   3.565
0x5A5118   0.382
0x5A5122   -1.087
0x5A512C   0.831
0x5A5136   0.381
0x5A5140   1.087
0x5A514A   0.831
0x5A5154   0.381
// 202 - 2
0x5A5447   -1.087
0x5A5451   0.831
0x5A545B   0.381
0x5A5465   1.087
0x5A546F   0.831
0x5A5479   0.381
0x5A5483   -1.097
0x5A548D   -2.977
0x5A5497   0.381
0x5A54A1   1.097
0x5A54AB   -2.977
0x5A54B5   0.381
// 203
0x5A5066   -0.797
0x5A5070   1.641
0x5A507A   0.573
0x5A5084   0.797
0x5A508E   1.641
0x5A5098   0.573
0x5A50A2   -0.865
0x5A50AC   -1.444
0x5A50B6   0.509
0x5A50C0   0.865
0x5A50CA   -1.444
0x5A50D4    0.509
// 214
0x5A5266   -1.246
0x5A5270   -1.373
0x5A527A   0.787
0x5A5284   1.246
0x5A528E   -1.373
0x5A5298   0.787
0x5A52A2   -1.023
0x5A52AC   -5.322
0x5A52B6   0.787
0x5A52C0   1.023
0x5A52CA   -5.322
0x5A52D4   0.787

43
Справочная информация / Re: Нижний цвет неба
« : Август 01, 2019, 11:46:42 am »
Дополнение:
Есть предел прорисовки верхнего цвета неба на высоте 3000.0. Если нужно разместить локацию выше с сохранением привычного отображения цвета, то это меняется в адресе 0x69950C. Актуально для "параллельных миров". Может быть наоборот захочется увидеть другое небо без мелькающих остатков синего, тогда стоит отключить вызов функции 0x4A600B

44
Общие вопросы / Re: Части Тела
« : Июль 20, 2019, 07:30:13 am »
Shagg_E, как-то раз по по твоему совету я сделал вид от первого лица в машине, поместив камеру в голову игрока, а саму голову и выступающие части тела скрыл, масштабируя их в ноль. Можно масштабировать и любыми другими коэффициентами. Код у меня такой:

Код: C++
  1. class CPedBody {                       
  2. public:
  3.         RwMatrix * Root;
  4.         RwMatrix * Pelvis;      // 1
  5.         RwMatrix * Spine;       // 17
  6.         RwMatrix * Spine1;
  7.         RwMatrix * Neck;
  8.         RwMatrix * Head;        // 2
  9.         RwMatrix * RClavicle;   // 16
  10.         RwMatrix * RUpperArm;   // 4
  11.         RwMatrix * RForeArm;    // 14
  12.         RwMatrix * RHand;       // 6
  13.         RwMatrix * RFinger;
  14.         RwMatrix * LClavicle;   // 15
  15.         RwMatrix * LUpperArm;   // 3
  16.         RwMatrix * LForeArm;    // 13
  17.         RwMatrix * LHand;       // 5
  18.         RwMatrix * LFinger;
  19.         RwMatrix * LThigh;      // 7
  20.         RwMatrix * LCalf;       // 12
  21.         RwMatrix * LFoot;       // 9
  22.         RwMatrix * RThigh;      // 8
  23.         RwMatrix * RCalf;       // 11
  24.         RwMatrix * RFoot;       // 10
  25.         static DWORD * GetAnimHierarchyFromSkinClump(RwObject *);
  26.         static RwMatrix * RpHAnimHierarchyGetMatrixArray(DWORD *);
  27.         static DWORD RpHAnimIDGetIndex(DWORD *, DWORD);
  28.         bool GetComponents(RwObject *);
  29.         void HideComponent(RwMatrix *);
  30. };
  31.  
  32. enum PED_FRAME {
  33.         PED_FRAME_ROOT = 0,
  34.         PED_FRAME_PELVIS = 1,
  35.         PED_FRAME_SPINE = 2,
  36.         PED_FRAME_SPINE1 = 3,
  37.         PED_FRAME_NECK = 4,
  38.         PED_FRAME_HEAD = 5,
  39.         PED_FRAME_RCLAVICLE = 21,
  40.         PED_FRAME_RUPPER_ARM = 22,
  41.         PED_FRAME_RFORE_ARM = 23,
  42.         PED_FRAME_RHAND = 24,
  43.         PED_FRAME_RFINGER = 25,
  44.         PED_FRAME_LCLAVICLE     = 31,
  45.         PED_FRAME_LUPPER_ARM = 32,
  46.         PED_FRAME_LFORE_ARM     = 33,
  47.         PED_FRAME_LHAND = 34,
  48.         PED_FRAME_LFINGER = 35,
  49.         PED_FRAME_LTHIGH = 41,
  50.         PED_FRAME_LCALF = 42,
  51.         PED_FRAME_LFOOT = 43,
  52.         PED_FRAME_RTHIGH = 51,
  53.         PED_FRAME_RCALF = 52,
  54.         PED_FRAME_RFOOT = 53
  55. };
  56.  
  57. void CPed::PreRender() {
  58.         ((void(__thiscall *)(CPed *))0x4FE4C0)(this);
  59. }
  60.  
  61. DWORD * CPedBody::GetAnimHierarchyFromSkinClump(RwObject * object) {
  62.         return ((DWORD *(__cdecl *)(RwObject *))0x57F250)(object);
  63. }
  64. RwMatrix * CPedBody::RpHAnimHierarchyGetMatrixArray(DWORD * _) {
  65.         return ((RwMatrix *(__cdecl *)(DWORD *))0x646370)(_);
  66. }
  67. DWORD CPedBody::RpHAnimIDGetIndex(DWORD * _1, DWORD _2) {
  68.         return ((DWORD(__cdecl *)(DWORD *, DWORD))0x646390)(_1, _2);
  69. }
  70. bool CPedBody::GetComponents(RwObject * object) {
  71.         DWORD * BodyHierarchy = GetAnimHierarchyFromSkinClump(object);
  72.         RwMatrix * BodyMatrix = RpHAnimHierarchyGetMatrixArray(BodyHierarchy);
  73.         this->Root = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_ROOT)];
  74.         this->Pelvis = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_PELVIS)];
  75.         this->Spine = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_SPINE)];
  76.         this->Spine1 = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_SPINE1)];
  77.         this->Neck = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_NECK)];
  78.         this->Head = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_HEAD)];
  79.         this->RClavicle = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_RCLAVICLE)];
  80.         this->RUpperArm = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_RUPPER_ARM)];
  81.         this->RForeArm = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_RFORE_ARM)];
  82.         this->RHand = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_RHAND)];
  83.         this->RFinger = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_RFINGER)];
  84.         this->LClavicle = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_LCLAVICLE)];
  85.         this->LUpperArm = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_LUPPER_ARM)];
  86.         this->LForeArm = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_LFORE_ARM)];
  87.         this->LHand = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_LHAND)];
  88.         this->LFinger = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_LFINGER)];
  89.         this->LThigh = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_LTHIGH)];
  90.         this->LCalf = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_LCALF)];
  91.         this->LFoot = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_LFOOT)];
  92.         this->RThigh = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_RTHIGH)];
  93.         this->RCalf = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_RCALF)];
  94.         this->RFoot = &BodyMatrix[RpHAnimIDGetIndex(BodyHierarchy, PED_FRAME_RFOOT)];
  95.         return ((this->Head->right.x != 1.0f) || (this->Head->right.y != 0.0f) || (this->Head->right.z != 0.0f) ||
  96.                 (this->Head->up.x != 0.0f) || (this->Head->up.y != 1.0f) || (this->Head->up.z != 0.0f) ||
  97.                 (this->Head->at.x != 0.0f) || (this->Head->at.y != 0.0f) || (this->Head->at.z != 1.0f));
  98. }
  99. void CPedBody::HideComponent(RwMatrix * component) {
  100.         component->right.x = component->right.y = component->right.z = component->up.x = component->up.y = component->up.z = component->at.x = component->at.y = component->at.z = 0.0f;
  101.         component->pos.x = this->Root->pos.x;
  102.         component->pos.y = this->Root->pos.y;
  103.         component->pos.z = this->Root->pos.z;
  104. }

Код: C++
  1. CPedBody PlayerBody;
  2. PlayerBody.GetComponents(PlayerPed->rwObject);  // это в начале и при смене скина

Дальше такой класс:

Код: C++
  1. class PedPreRender {
  2.         static void __fastcall HidePlayerHead(CPed * Ped) {
  3.                 PlayerPed->PreRender();  // восстанавливаем стандартный вызов PedPreRender()
  4.                 if ((Camera->cams[Camera->activeCam].view == CAMERA_VIEW_CAR_1ST_PERSON) && (!GameKeys->PrevWeapon_LookLeft) && (!GameKeys->NextWeapon_LookRight)) {
  5.                         PlayerBody.HideComponent(PlayerBody.Head);
  6.                         PlayerBody.HideComponent(PlayerBody.Neck);
  7.                         PlayerBody.HideComponent(PlayerBody.Spine1);
  8.                         PlayerBody.HideComponent(PlayerBody.LClavicle);
  9.                         PlayerBody.HideComponent(PlayerBody.RClavicle);
  10.                         PlayerBody.HideComponent(PlayerBody.LUpperArm);
  11.                         PlayerBody.HideComponent(PlayerBody.RUpperArm);
  12.                 }
  13.         }
  14. public:
  15.         PedPreRender() {
  16.                 Patch(0x694DA0, (int)HidePlayerHead);
  17.         }
  18. } _PedPreRender;

Восстанавливать скрытые компоненты не нужно, игра сама это делает при следующем кадре

45
Общие вопросы / Re: Части Тела
« : Июль 19, 2019, 10:26:15 am »
Нупить многовато, надо убирать все FindPlayerPed() и IsPlayer(), и неизвестно какие будут последствия. Могу предложить такой вариант - вызвать свою функцию, например InflictPlayerDamage вместо этого участка:
Код: ASM
  1. .text:00525C01 6A 00                   push    0               ; a2
  2. .text:00525C03 E8 18 65 F9 FF          call    _Z13FindPlayerPedv ; FindPlayerPed(void)
  3. .text:00525C08 89 C1                   mov     ecx, eax        ; this
  4. .text:00525C0A E8 E1 C0 00 00          call    _ZN10CPlayerPed14AnnoyPlayerPedEb ; CPlayerPed::AnnoyPlayerPed(bool)
  5.  

Сначала нужно передать в свою функцию пострадавшую часть тела, это параметр a5 в функции CPed::InflictDamage. Получить его для своей функции можно, скопировав такую строчку:

Код: ASM
  1. .text:00526215 8B 4C 24 70             mov     ecx, [esp+60h+arg_C]

Пишем ее в заменяемый участок:

Код: C++
  1. Patch(0x525C01, 0x8B);
  2. Patch(0x525C02, 0x4C);
  3. Patch(0x525C03, 0x24);
  4. Patch(0x525C04, 0x70);

Теперь в ecx пострадавшая часть тела. Дальше вызываются команды push ecx и call [адрес функции InflictPlayerDamage]

Код: C++
  1. Patch(0x525C05, 0x51);        // push ecx
  2. Patch(0x525C06, 0xE8);        // call
  3. Patch(0x525C07, (int)InflictPlayerDamage);        // address

Остальные адреса нупятся с 0x525C0B по 0x525C0F

Сама функция InflictPlayerDamage выглядит примерно так:

Код: C++
  1. static void __stdcall InflictPlayerDamage(int part) {
  2.         if ((part > 1) && (part < 7))
  3.                 switch (part) {
  4.                 case 2:
  5.                         PlayerPed->SpawnFlyingComponent(3);
  6.                         PlayerPed->SetDie(19, 10000.0f, 0);
  7.                         break;
  8.                 case 3:
  9.                         PlayerPed->SpawnFlyingComponent(4);
  10.                         PlayerPed->SetDie(20, 10000.0f, 0);
  11.                         break;
  12.                 case 4:
  13.                         PlayerPed->SpawnFlyingComponent(7);
  14.                         PlayerPed->SetDie(21, 10000.0f, 0);
  15.                         break;
  16.                 case 5:
  17.                         PlayerPed->SpawnFlyingComponent(8);
  18.                         PlayerPed->SetDie(22, 10000.0f, 0);
  19.                         break;
  20.                 case 6:
  21.                         PlayerPed->SpawnFlyingComponent(2);
  22.                         PlayerPed->SetDie(17, 10000.0f, 0);
  23.                         break;
  24.                 }
  25.         else
  26.                 PlayerPed->AnnoyPlayerPed();
  27.         }

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


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