Автор Тема: Тип полёта гранаты  (Прочитано 2399 раз)

Оффлайн SpitFire

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Тип полёта гранаты
« : Июнь 17, 2016, 06:12:15 pm »
0x7DB888 здесь начинается array у всего метательного оружия в GTA - Vice City. Размер между элементами составляет 0x1C, Число элементов - 0x20. Я нашёл много чего отсюда, но не могу найти, где пишется тип полёта? Например, я хочу запускать молотов или гранату, как ракету, именно сам запуск.
« Последнее редактирование: Июнь 17, 2016, 06:28:18 pm от Tommi4kaVar4etti »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Тип полёта гранаты
« Ответ #1 : Июнь 18, 2016, 06:27:58 pm »
То, о чем ты говоришь 0x7DB888, это массив из CProjectileInfo
Код: ASM
  1. 00000000 CProjectileInfo struc ; (sizeof=0x1C)
  2. 00000000 type            dd ?
  3. 00000004 Entity          dd ?
  4. 00000008 time            dd ?
  5. 0000000C exist           db ?
  6. 0000000D __padding       db 3 dup(?)
  7. 00000010 point           RwV3d ?
  8. 0000001C CProjectileInfo ends
  9.  

Кроме этого тебе понадобится еще массив 0x94B708, это CProjectile
Код: ASM
  1. 00000000 CProjectile     struc ; (sizeof=0x194)
  2. 00000000 __parent        CObject ?
  3. 00000194 CProjectile     ends

Массив хранит ссылки на созданные объекты метательного оружия, объекты имеют физику, в которой задан вектор скорости, см. классы CObject, CPhysical, направлением скорости можно управлять, изменить физику, например направить их по прямой, подобно ракете. Этот код пуляет гранаты прямо по оси Y, тебе останется пересчитать вектор через направление камеры.

Код: C++
  1. auto ProjectilesInfo = (CProjectilesInfo *) 0x7DB888;
  2. auto Projectiles = (CObject **) 0x94B708;
  3. for (int i=0; i<32; i++)
  4.         if ((ProjectilesInfo[i].exist)&&(Projectiles[i]))
  5.                 {
  6.                         Projectiles[i]->physical.velocity.x = 0;
  7.                         Projectiles[i]->physical.velocity.y = 1;
  8.                         Projectiles[i]->physical.velocity.z = 0;
  9.                 }
« Последнее редактирование: Июнь 18, 2016, 06:33:10 pm от xanser »

Оффлайн SpitFire

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Re: Тип полёта гранаты
« Ответ #2 : Июнь 18, 2016, 10:02:35 pm »
тебе останется пересчитать вектор через направление камеры.

Хм, и как это сделать?

А за Указатель на метательные большое спасибо.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Тип полёта гранаты
« Ответ #3 : Июнь 19, 2016, 09:16:09 am »
Хм, и как это сделать?

Смотря что именно ты пытаешься сделать, может тебе и не камера нужна, вектор направления камеры - это разница между координатами, куда она смотрит, и координатами ее положения, как-то так

Код: C++
  1. Camera->cams[Camera->activeCam].target.x - Camera->pos.x

Оффлайн SpitFire

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Re: Тип полёта гранаты
« Ответ #4 : Июнь 19, 2016, 09:53:23 am »
Врят-ли у меня хватит опыта отправить гранату прямо в прицел, мне нужно хотя-бы изменить направление, дабы граната летела прямо, а не вверх.

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Тип полёта гранаты
« Ответ #5 : Июнь 19, 2016, 05:50:05 pm »
Ну, я думаю, нужен код типа такого:
0A8D: 1@ = read_memory 0x7E46B8 size 4 virtual_protect 0  // Camera X float
0A8D: 2@ = read_memory 0x7E46BC size 4 virtual_protect 0  // Camera Y float
0A8D: 3@ = read_memory 0x7E46C0 size 4 virtual_protect 0  // Camera Z float
04C4: create_coordinate 4@ 5@ 6@ from_actor $PLAYER_ACTOR offset 0.0 0.0 1.0  // или так, или искать адреса camera point
0063: 1@ -= 4@  // Camera point X vector
0063: 2@ -= 5@  // Camera point Y vector
0063: 3@ -= 6@  // Camera point Z vector
0007: 0@ = 1.0 // Camera point vector multiplayer
006B: 1@ *= 0@
006B: 2@ *= 0@
006B: 3@ *= 0@
Т.е. с помощью 0@ можно регулировать длину вектора, если потребуется

P.S. Вот кстати по поводу прицела: сам хотел бы знать, как высчитать вектор к прицелу, поскольку, в отличии от всех нормальных игр, в Вайсе прицел почему-то не по центру экрана
« Последнее редактирование: Июнь 19, 2016, 05:53:41 pm от Shagg_E »