SA:MP SpawnScreen в 0.3.7 R1

Mr. Reznitskiy

Известный
Автор темы
37
1
Версия SA-MP
  1. 0.3.7 (R1)
  2. 0.3.7-R3
Всем знакомый экран при запуске сампа.
Не могу найти похожее или хотя бы float координат в R1 через IDA.
В R3 такой код. Помогите пожалуйста

R3 SpawnScreen:
text:00008679                         ; ---------------------------------------------------------------------------
.text:00008679
.text:00008679                         loc_8679:                               ; CODE XREF: CNetGame::SpawnScreen(void)+1A↑j
.text:00008679 68 33 33 8A 42                          push    428A3333h
.text:0000867E 68 E9 CC FE C4                          push    0C4FECCE9h
.text:00008683 68 9D A1 8D 44                          push    448DA19Dh       ; struct sampapi::CVector
.text:00008688 E8 83 89 FF FF                          call    ?GetPlayerPed@CGame@@QAEPAVCPed@@XZ
.text:0000868D 8B C8                                   mov     ecx, eax        ; this
.text:0000868F E8 9C 62 09 00                          call    ?Teleport@CEntity@@QAEXVCVector@sampapi@@@Z
.text:00008694
.text:00008694                         loc_8694:                               ; CODE XREF: CNetGame::SpawnScreen(void)+37↑j
.text:00008694 A1 F4 E8 26 00                          mov     eax, g_Game
.text:00008699 8B 48 04                                mov     ecx, [eax+4]    ; this
.text:0000869C 6A 00                                   push    0               ; float
.text:0000869E 6A 00                                   push    0               ; float
.text:000086A0 6A 00                                   push    0               ; float
.text:000086A2 68 00 00 B4 42                          push    42B40000h       ; float
.text:000086A7 68 00 80 FE C4                          push    0C4FE8000h      ; float
.text:000086AC 68 00 A0 88 44                          push    4488A000h       ; float
.text:000086B1 E8 BA 49 09 00                          call    ?Set@CCamera@@QAEXVCVector@sampapi@@0@Z
.text:000086B6 8B 0D F4 E8 26 00                       mov     ecx, g_Game
.text:000086BC 8B 49 04                                mov     ecx, [ecx+4]    ; this
.text:000086BF 6A 02                                   push    2               ; int
.text:000086C1 68 00 00 A0 41                          push    41A00000h       ; float
.text:000086C6 68 00 A0 C2 C4                          push    0C4C2A000h      ; float
.text:000086CB 68 00 00 C0 43                          push    43C00000h       ; float
.text:000086D0 E8 FB 49 09 00                          call    ?PointAt@CCamera@@QAEXVCVector@sampapi@@H@Z
.text:000086D5 8B 0D F4 E8 26 00                       mov     ecx, g_Game     ; this
.text:000086DB 6A 01                                   push    1               ; char
.text:000086DD E8 4E 7D 09 00                          call    ?SetWorldWeather@CGame@@QAEXD@Z
.text:000086E2 8B 0D F4 E8 26 00                       mov     ecx, g_Game     ; this
.text:000086E8 6A 00                                   push    0               ; int
.text:000086EA E8 91 8F 09 00                          call    ?EnableHUD@CGame@@QAEXH@Z
.text:000086EF C3                                      retn
.text:000086EF                         ?SpawnScreen@CNetGame@@QAEXXZ endp
 
Последнее редактирование:

Mr. Reznitskiy

Известный
Автор темы
37
1
Это че за такой экран запуска сампа уникальный на р1, он везде одинаковый и явно не содержит координат
Снимок экрана 2026-04-27 125950.png
Это примерно есть и в R3 и в R5 и 03DL.
Наглядно флоаты координат камеры самой и куда она направлена. В R1 и близко такого нет имеется ввиду по архитектуре вызовов или по порядку байтов. Ну я перечислил самые банальные способы поиска. Я в любом случае чайник и вот хочу найти

Это че за такой экран запуска сампа уникальный на р1, он везде одинаковый и явно не содержит координат
я банально их хочу запатчить чтобы свои координаты применять
 

chromiusj

Известный
Модератор
6,014
4,331
может быть стоит начать поиск с этой точки? я не обладаю серьезными навыками реверса, но если поискать по стеку вызовов с соседними функциями, то это как будто-бы самая наиблизкая:
Код:
.poop1:102DB60F ; =============== S U B R O U T I N E =======================================
.poop1:102DB60F
.poop1:102DB60F ; Attributes: noreturn
.poop1:102DB60F
.poop1:102DB60F ; int __cdecl sub_102DB60F(float, float, int, int, int, int)
.poop1:102DB60F sub_102DB60F    proc near               ; CODE XREF: sub_1023659A↑j
.poop1:102DB60F
.poop1:102DB60F var_1C          = byte ptr -1Ch
.poop1:102DB60F arg_0           = dword ptr  4
.poop1:102DB60F arg_4           = dword ptr  8
.poop1:102DB60F arg_14          = dword ptr  18h
.poop1:102DB60F
.poop1:102DB60F                 mov     [esp+arg_4], 0C4FE8000h ; float
.poop1:102DB617                 pusha
.poop1:102DB618                 mov     [esp+20h+arg_0], 4488A000h ; sampapi::CVector
.poop1:102DB620                 mov     [esp+20h+var_1C], 96h
.poop1:102DB625                 lea     esp, [esp+24h]
.poop1:102DB629                 call    ?Set@CCamera@@QAEXVCVector@sampapi@@0@Z ; CCamera::Set(sampapi::CVector,sampapi::CVector)
.poop1:102DB62E                 push    ebp
.poop1:102DB62F                 mov     [esp-18h+arg_14], 0E2268FE3h
.poop1:102DB636                 lea     ecx, [ebp-15546725h]
.poop1:102DB63C                 pushf
.poop1:102DB63D                 mov     ecx, g_Game
.poop1:102DB643                 push    ecx
.poop1:102DB644                 pushf
.poop1:102DB645                 jmp     loc_102CDC28
.poop1:102DB645 sub_102DB60F    endp ; sp-analysis failed
.poop1:102DB645
Смотрим анализ вызова функций Ccamera::Set, смотрим входящие аргументы, сверяем с вызовом оригинала на R3, и проверяем на R1. Переходим к функции, которая до конца адекватно не декомпилировалась:
Код:
// positive sp value has been detected, the output may be wrong!
int __cdecl __noreturn sub_102DB60F(float a1, float a2, int a3, int a4, int a5, int a6)
{
  CCamera *v6; // ecx
  struct sampapi::CVector v7; // [esp+4h] [ebp-18h]
  struct sampapi::CVector v8; // [esp+10h] [ebp-Ch]

  *&v7.x = 0xC4FE80004488A000ui64;
  CCamera::Set(v6, v7, v8);
  __readeflags();
  __readeflags();
  JUMPOUT(0x102CDC28);
}
Оригинал на R3:
Код:
void __thiscall CNetGame::SpawnScreen(CNetGame *this)
{
  struct CPed *PlayerPed; // eax
  CPed *v2; // eax
  struct CPed *v3; // eax
  _BYTE v4[24]; // [esp-18h] [ebp-18h] BYREF

  PlayerPed = CGame::GetPlayerPed(g_Game);
  if ( sub_100AB5E0(PlayerPed) )
  {
    *&v4[20] = 1118137300;
    *&v4[12] = 0xC4FE90004488ACCDui64;
    v2 = CGame::GetPlayerPed(g_Game);
    CPed::WarpFromVehicle(v2, *&v4[12]);
  }
  else
  {
    *&v4[20] = 1116353331;
    *&v4[12] = 0xC4FECCE9448DA19Dui64;
    v3 = CGame::GetPlayerPed(g_Game);
    CEntity::Teleport(v3, *&v4[12]);
  }
  memset(&v4[12], 0, 12);
  *&v4[8] = 1119092736;
  *v4 = 0xC4FE80004488A000ui64;
  CCamera::Set(g_Game->m_pCamera, *v4, *&v4[12]);
  *&v4[16] = 1101004800;
  *&v4[8] = 0xC4C2A00043C00000ui64;
  CCamera::PointAt(g_Game->m_pCamera, *&v4[8], 2);
  CGame::SetWorldWeather(g_Game, 1);
  CGame::EnableHUD(g_Game, 0);
}
 
  • Нравится
Реакции: Mr. Reznitskiy