Автор Тема: Выкладываем наработки по анализу кода, дизассемблированные базы, адреса  (Прочитано 31297 раз)

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Вам это может показаться глупым, но я столкнулся с проблемой выяснения типа транспорта, в котором не сидит игрок, а поскольку смещение 0x29C не отображает инфу о вертолетах и самолете - пришлось расковырять стандартные опкоды и добыть это:
Код: C++
  1. 005BAA80                         ; CVehicle::GetVehicleAppearance(void)
Отправляем стракт транспорта, получаем его тип:
1 - Car
2 - Bike
3 - Heli
4 - Boat
5 - Plane


Использование в CLEO:
Код: Text
  1. 0A97: 1@ = car 0@ struct
  2. 0AA7: call_function 0x5BAA80 num_params 1 pop 1 1@ 2@
в 2@ записывается тип(см. выше)
« Последнее редактирование: Июнь 07, 2017, 04:03:46 pm от Shagg_E »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Расковырял "отрывание" колес, но одно колесо(левое заднее) стабильно не хочет "отрываться".
SCM-функция:
См. обновленную версию ниже

Сначала думал, что код неправильный, но после кучи перепроверок ничего не добился, поэтому левое заднее колесо, видимо, так и останется "намертво" прикрученным к транспорту. Ах да! на байках, вертолетах, самолете и лодках не применять! Это может привести к вылету игры.

Применений всему этому делу можно придумать множество, например - "прокачать" аварии транспорта:
! No longer available
« Последнее редактирование: Июнь 07, 2017, 03:48:33 pm от Shagg_E »

Оффлайн SpitFire

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Нужно просто получить структуру авто и добавить смещение, не нужно вызывать никакой функции. Потом прочитать значение.

в CLEO это выглядит так:
Код: XML
  1. Actor.StorePos($PLAYER_ACTOR, 1@, 2@, 3@)
  2. 05F0: 0@ = random_vehicle_near_point 1@ 2@ 3@ in_radius 5.0 find_next 0 pass_wrecked 0 //IF and SET
  3. 05E7: 4@ = car 0@ struct
  4. 4@ += 0x29C
  5. 05E0: 5@ = read_memory 4@ size 1 virtual_protect 0 // Это значение и есть тип авто
  6. Далее, колёса
  7. 05E7: 4@ = car 0@ struct
  8. 4@ += 0x2A5
  9. 05DF: write_memory 4@ size 1 value 2 virtual_protect 0 // Левое переднее
  10. 05E7: 4@ = car 0@ struct
  11. 4@ += 0x2A6
  12. 05DF: write_memory 4@ size 1 value 2 virtual_protect 0 // Левое заднее
  13. 05E7: 4@ = car 0@ struct
  14. 4@ += 0x2A7
  15. 05DF: write_memory 4@ size 1 value 2 virtual_protect 0 // Правое переднее
  16. 05E7: 4@ = car 0@ struct
  17. 4@ += 0x2A8
  18. 05DF: write_memory 4@ size 1 value 2 virtual_protect 0 // Правое заднее

Оффлайн SpitFire

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Единственное, что я не знаю как сделать, так это как "обновить" авто. Коллизии на колёсах не будет, но они будут видны.

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Нужно просто получить структуру авто и добавить смещение, не нужно вызывать никакой функции. Потом прочитать значение.
Я так и сделал для того, чтобы убрать коллизию колес. Но чтобы "заспавнить" оторваное колесо и заставить "исчезнуть" оригинальное - пришлось копошить функции

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
пришлось копошить функции

В sdk есть же всё это.



Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\common.h"
  3. #include "extensions\KeyCheck.h"
  4. #include "game_vc\CFont.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class MyPlugin {
  9. public:
  10.     MyPlugin() {
  11.         static RwObject *atomic;
  12.  
  13.         Events::drawingEvent += [] {
  14.             CVehicle *vehicle = FindPlayerVehicle();
  15.             if (vehicle && vehicle->m_dwVehicleClass == VEHICLE_AUTOMOBILE) {
  16.                 CAutomobile *automobile = reinterpret_cast<CAutomobile *>(vehicle);
  17.  
  18.                 CFont::SetScale(0.5f, 1.0f);
  19.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  20.                 CFont::SetJustifyOn();
  21.                 CFont::SetFontStyle(1);
  22.                 CFont::SetPropOn();
  23.                 CFont::SetWrapx(600.0f);
  24.                 wchar_t text[32];
  25.                 swprintf(text, L"LeftFrontWheelStatus %d", automobile->stDamage.GetWheelStatus(0));
  26.                 CFont::PrintString(10.0f, 10.0f, text);
  27.                 swprintf(text, L"LeftRearWheelStatus %d", automobile->stDamage.GetWheelStatus(1));
  28.                 CFont::PrintString(10.0f, 30.0f, text);
  29.                 swprintf(text, L"RightFrontWheelStatus %d", automobile->stDamage.GetWheelStatus(2));
  30.                 CFont::PrintString(10.0f, 50.0f, text);
  31.                 swprintf(text, L"RightRearWheelStatus %d", automobile->stDamage.GetWheelStatus(3));
  32.                 CFont::PrintString(10.0f, 70.0f, text);
  33.                                
  34.                 KeyCheck::Update();
  35.                
  36.                 if (KeyCheck::CheckWithDelay(VK_F6, 500)) {
  37.                     if (vehicle->IsComponentPresent(6)) {
  38.                         automobile->stDamage.SetWheelStatus(1, 2);
  39.                         automobile->SpawnFlyingComponent(6, 1);
  40.                         atomic = 0;
  41.                         RwFrameForAllObjects(automobile->m_aCarNodes[6], reinterpret_cast<RwObjectCallBack >(GetCurrentAtomicObjectCB), &atomic);
  42.                         if (atomic)
  43.                             atomic->flags = 0;
  44.                     }
  45.                 }
  46.  
  47.                 if (KeyCheck::CheckWithDelay(VK_F7, 500)) {
  48.                     if (vehicle->IsComponentPresent(6))
  49.                         automobile->Fix();
  50.                 }
  51.             }
  52.         };
  53.     }
  54. } myPlugin;
  55.  

Коллизия колеса восстанавливается
Код: C++
  1. automobile->stDamage.SetWheelStatus(1, 0);

Только само колесо при этом не появляется. Надо смотреть CAutomobile::Fix. Там есть это, но самому разобрать этот момент не вышло. Надеюсь, что DK подскажет.  ;)

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
В sdk есть же всё это.
Ну, мне нужно было в CLEO и я нашел - no problem ;D Кроме этого самого левого заднего колеса, которое вызывает краш..

Только само колесо при этом не появляется. Надо смотреть CAutomobile::Fix. Там есть это, но самому разобрать этот момент не вышло. Надеюсь, что DK подскажет.  ;)
Так я же раскопал адреса(см. код скрипта). Так же, как колесо скрывается(значение 0), его можно и "вернуть"(1). А еще оно тоже становится видимым при вкл/выкл повтора.

Вопрос лишь в том, почему с тремя колесами всё отлично, а заднее левое вызывает краш? Судя по комменту kenking, при использовании sdk всё работает нормально, но меня это не устраивает(это не дает ответа на вопрос, что с этим колесом/моим кодом не так)
« Последнее редактирование: Июнь 07, 2017, 01:18:34 pm от Shagg_E »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
У тебя там смещение неправильное для этого колеса. См. здесь https://sannybuilder.com/forums/viewtopic.php?pid=25844#p25844.

И нумерация колёс правильно будет 0-3 

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
У тебя там смещение неправильное для этого колеса. См. здесь https://sannybuilder.com/forums/viewtopic.php?pid=25844#p25844.

И нумерация колёс правильно будет 0-3 
За смещение спс(осталось найти правильный номер этого колеса, как компонента для создания объекта-клона)

А по поводу нумерации - я её сам выдумал для scm функции(это значения не имеет)

UPD: Нашел!
Номер заднего левого колеса для "клонирования" - 6(очень странно, ибо остальные имеют номера 1, 3, 4).

---------------------------------------------------------------------------------------------------------------

ОБНОВЛЕННАЯ ФУНКЦИЯ(последняя версия 08.06.2017):
Вызов такой же(продублирую):
Код: Text
  1. 0AB1: call_scm_func @DETACHWHEEL 2 0@ 1 1@ // CarHandle, WheelNumber(1 - left front, 2 - left rear, 3 - right front, 4 - right rear), GetDetachedWheelStruct
, где 0@ - хэндл машины, 1 - номер колеса:
1 - left front
2 - left rear
3 - right front
4 - right rear
, а 1@ - struct "оторваного" колеса("клонированного" на самом деле)
Сама функция(спасибо kenking за таблицы компонентов!):
Код: Text
  1. :DETACHWHEEL
  2. 0039:   1@ == 1
  3. jf @DETACHWHEEL_LEFTREARCHECK
  4. 0006: 2@ = 4 // clone left front wheel
  5. 0006: 3@ = 0x2A5 // remove left front wheel's colision
  6. 0006: 4@ = 0x3A4 // hide left front wheel
  7. jump @DETACHWHEEL_DETACHWHEEL
  8.  
  9. :DETACHWHEEL_LEFTREARCHECK
  10. 0039:   1@ == 2
  11. jf @DETACHWHEEL_RIGHTFRONTCHECK
  12. 0006: 2@ = 6 // clone left rear wheel
  13. 0006: 3@ = 0x2A6 // remove left rear wheel's colision
  14. 0006: 4@ = 0x3AC // hide left rear wheel
  15. jump @DETACHWHEEL_DETACHWHEEL
  16.  
  17. :DETACHWHEEL_RIGHTFRONTCHECK
  18. 0039:   1@ == 3
  19. jf @DETACHWHEEL_RIGHTREARCHECK
  20. 0006: 2@ = 1 // clone right front wheel
  21. 0006: 3@ = 0x2A7 // remove right front wheel's colision
  22. 0006: 4@ = 0x398 // hide right front wheel
  23. jump @DETACHWHEEL_DETACHWHEEL
  24.  
  25. :DETACHWHEEL_RIGHTREARCHECK
  26. 0039:   1@ == 4
  27. jf @DETACHWHEEL_RETURN
  28. 0006: 2@ = 3 // clone right rear wheel
  29. 0006: 3@ = 0x2A8 // remove right rear wheel's colision
  30. 0006: 4@ = 0x3A0 // hide right rear wheel
  31.  
  32. :DETACHWHEEL_DETACHWHEEL
  33. ////////Hiding original wheel(getting parameters):
  34. 0A97: 5@ = car 0@ struct
  35. 0085: 6@ = 5@
  36. //Offset:
  37. //0x398______wheel_rf_dummy_________правое переднее колесо
  38. //0x39C______wheel_rm_dummy________правое среднее колесо
  39. //0x3A0______wheel_rb_dummy________правое заднее колесо
  40. //0x3A4______wheel_lf_dummy_________левое переднее колесо
  41. //0x3A8______wheel_lm_dummy________левое среднее колесо
  42. //0x3AC______wheel_lb_dummy________левое заднее колесо
  43. //0x3B0______bump_front_dummy_______передний бампер
  44. //0x3B4______bump_rear_dummy_______задний бампер
  45. //0x3B8______wing_rf_dummy__________правое переднее крыло
  46. //0x3BC______wing_rr_dummy_________правое заднее крыло
  47. //0x3C0______door_rf_dummy_________правая передняя дверь
  48. //0x3C4______door_rr_dummy_________правая задняя дверь
  49. //0x3C8______wing_lf_dummy__________левое переднее крыло
  50. //0x3CC______wing_lr_dummy_________левое заднее крыло
  51. //0x3D0______door_lf_dummy__________левая передняя дверь
  52. //0x3D4______door_lr_dummy__________левая задняя дверь
  53. //0x3D8______bonnet_dummy__________ капот
  54. //0x3DC______boot_dummy___________багажник
  55. //0x3E0______windscreen_dummy_______лобовое стекло
  56. 005A: 6@ += 4@
  57. 0006: 7@ = 0
  58. 0AC7: 8@ = var 7@ offset
  59. 0A8D: 6@ = read_memory 6@ size 4 virtual_protect 1
  60. 0AA5: call 0x6453B0 num_params 3 pop 3 8@ 0x59F1E0 6@
  61. 8039:   NOT 7@ == 0
  62. jf @DETACHWHEEL_RETURN
  63. ////////Making clone of wheel:
  64. //first parameter - collision and physics of component:
  65. //0 - 241, car_bumper
  66. //1 - 245, car_wheel
  67. //2 - 240, car_door
  68. //3 - 243, car_bonnet
  69. //4 - 244, car_boot
  70. //5 - 242, car_panel
  71. //second parameter - vehicle component:
  72. //  CAR_NODE_NONE = 0
  73. //  CAR_WHEEL_RF = 1
  74. //  CAR_WHEEL_RM = 2
  75. //  CAR_WHEEL_RB = 3
  76. //  CAR_WHEEL_LF = 4
  77. //  CAR_WHEEL_LM = 5
  78. //  CAR_WHEEL_LB = 6
  79. //  CAR_BUMP_FRONT = 7
  80. //  CAR_BUMP_REAR = 8
  81. //  CAR_WING_RF = 9
  82. //  CAR_WING_RR = 10
  83. //  CAR_DOOR_RF = 11
  84. //  CAR_DOOR_RR = 12
  85. //  CAR_WING_LF = 13
  86. //  CAR_WING_LR = 14
  87. //  CAR_DOOR_LF = 15
  88. //  CAR_DOOR_LR = 16
  89. //  CAR_BONNET = 17
  90. //  CAR_BOOT = 18
  91. //  CAR_WINDSCREEN = 19
  92. 0AA8: call_function_method 0x59AAA0 struct 5@ num_params 2 pop 0 1 2@ 15@
  93. ////////Hiding original wheel:
  94. 000A: 7@ += 0x02
  95. 0A8C: write_memory 7@ size 1 value 0 virtual_protect 1
  96. ////////Removing original wheel's colision:
  97. 005A: 5@ += 3@
  98. 0A8C: write_memory 5@ size 1 value 2 virtual_protect 1
  99.  
  100. :DETACHWHEEL_RETURN
  101. 0AB2: ret 1 15@
« Последнее редактирование: Июнь 08, 2017, 05:39:38 pm от Shagg_E »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
осталось найти правильный номер этого колеса, как компонента для создания объекта-клона
Если я правильно понял, то ты про это:
Код: C++
  1. enum eCarNodes {
  2.     CAR_NODE_NONE = 0,
  3.     CAR_WHEEL_RF = 1,
  4.     CAR_WHEEL_RM = 2,
  5.     CAR_WHEEL_RB = 3,
  6.     CAR_WHEEL_LF = 4,
  7.     CAR_WHEEL_LM = 5,
  8.     CAR_WHEEL_LB = 6,
  9.     CAR_BUMP_FRONT = 7,
  10.     CAR_BUMP_REAR = 8,
  11.     CAR_WING_RF = 9,
  12.     CAR_WING_RR = 10,
  13.     CAR_DOOR_RF = 11,
  14.     CAR_DOOR_RR = 12,
  15.     CAR_WING_LF = 13,
  16.     CAR_WING_LR = 14,
  17.     CAR_DOOR_LF = 15,
  18.     CAR_DOOR_LR = 16,
  19.     CAR_BONNET = 17,
  20.     CAR_BOOT = 18,
  21.     CAR_WINDSCREEN = 19,
  22.     CAR_NUM_NODES
  23. };

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Если я правильно понял, то ты про это:
Ох, shi...!
Спасибо, добавил в функцию. Теоретически, теперь через неё можно отделять любой компонент(если добавить варианты, помимо 4х колес)


UPD: Последняя проблема, которую осталось решить - это вопрос "почему, если "отделять" колесо вручную, оторваная версия становится больше в размерах и флипает некоторые фейсы, когда как при взрыве авто таких проблем не наблюдается?". Иначе говоря - с чем связаны эти глюки с рендером колеса и с чего оно такое огромное:
« Последнее редактирование: Июнь 07, 2017, 03:55:34 pm от Shagg_E »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Оказывается, функция 0x59AAA0 (создающая "клон" отрываемого компонента) возвращает struct этого "клона", что позволяет в дальнейшем, например, взять под управление оторванное колесо!

Обновил функцию, а на возможный вопрос "да где это может, блин, пригодиться?" скоро отвечу видеодемонстрацией финальной версии CarRec, который, к слову, уже почти закончен.

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Теоретически, теперь через неё можно отделять любой компонент(если добавить варианты, помимо 4х колес)
Не только теоретически, но и практически.

Оказывается, функция 0x59AAA0 (создающая "клон" отрываемого компонента) возвращает struct этого "клона", что позволяет в дальнейшем, например, взять под управление оторванное колесо!
Я же написал уже, что в sdk есть такое дело.
Код: C++
  1. CObject* SpawnFlyingComponent(int nodeIndex, unsigned int collisionType);

Почему бы не посмотреть там? Хотя с другой стороны, так не будет приятных открытий, сделанных самостоятельно.  ;)

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Я же написал уже, что в sdk есть такое дело.
Код: C++
  1. CObject* SpawnFlyingComponent(int nodeIndex, unsigned int collisionType);

Почему бы не посмотреть там? Хотя с другой стороны, так не будет приятных открытий, сделанных самостоятельно.  ;)

Речь не об открытиях функций(так-то в современных idb базах они почти все уже открыты), а об их применении в скриптинге.

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Да я про эту твою фразу  ;)
Цитировать
Оказывается, функция 0x59AAA0 (создающая "клон" отрываемого компонента) возвращает struct этого "клона"

Если бы посмотрел в sdk, то увидел бы сразу функция возвращает что-то и что именно или не возвращает. Да ладно, забей. Это я так просто.  :)

Жду с интересом показа применения в твоём моде.