Другое С/С++ Вопрос - Ответ

checkdasound

Известный
Проверенный
963
409
Какие флаги есть для неуязвимости персонажа через CPed + 0x42?
Знаю только сумму всех: 204
 

Неадекватная сова

Известный
Проверенный
208
147
Какие флаги есть для неуязвимости персонажа через CPed + 0x42?
Знаю только сумму всех: 204
#define PedSoft 0x01
#define FreezePed 0x02
#define BulletProtect 0x04
#define FireProtect 0x08
#define CollisionProtect 0x10
#define MeleeProtect 0x20
#define Unc_7bit 0x40
#define ExplosionProtect 0x80
 
  • Нравится
Реакции: checkdasound

checkdasound

Известный
Проверенный
963
409
Почему меня телепортирует на "спавн сампа" (центр карты вроде как), вместо тп на метку?
Код нахождения координат метки и функцию нахождения координаты z брал из собейта.
Честно говоря, я не разбираюсь в ассемблере, поэтому даже не знаю с чем это связано.
C++:
#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0
#define FUNC_FindGroundZForCoord 0x569660

void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране.
{
   ((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}

float FindGroundZForPosition(float fX, float fY)
{
   //DEBUG_TRACE("FLOAT CWorldSA::FindGroundZForPosition(FLOAT fX, FLOAT fY)");
   DWORD dwFunc = FUNC_FindGroundZForCoord;
   FLOAT fReturn = 0;
   _asm
   {
       push   fY
       push   fX
       call   dwFunc
       fstp   fReturn
       add       esp, 8
   }
   return fReturn;
}

void teleport(float posX, float posY, float posZ)
{
   float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : nullptr;
   position[0] = posX;
   position[1] = posY;
   position[2] = posZ;
}

void teleport_target_blip()
{
   if ((*(int *)0xBA6774 != 0))
   {
       float mapPos[3];
       for (int i = 0; i < (0xAF * 0x28); i += 0x28)
       {
           if (*(short *)(0xBA873D + i) == 4611)
           {
               float *pos = (float *)(0xBA86F8 + 0x28 + i);
               mapPos[0] = *pos;
               mapPos[1] = *(pos + 1);
               mapPos[2] = FindGroundZForPosition(mapPos[0], mapPos[1]) + 2.0f;

               teleport(mapPos[0], mapPos[1], mapPos[2]);
           }
       }
   }
   else AddMessageJumpQ("~r~HA KAPTE HET METKU", 2000, NULL, false);
}
 

SR_team

like pancake
BH Team
4,795
6,468
Почему меня телепортирует на "спавн сампа" (центр карты вроде как), вместо тп на метку?
Код нахождения координат метки и функцию нахождения координаты z брал из собейта.
Честно говоря, я не разбираюсь в ассемблере, поэтому даже не знаю с чем это связано.
C++:
#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0
#define FUNC_FindGroundZForCoord 0x569660

void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране.
{
   ((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}

float FindGroundZForPosition(float fX, float fY)
{
   //DEBUG_TRACE("FLOAT CWorldSA::FindGroundZForPosition(FLOAT fX, FLOAT fY)");
   DWORD dwFunc = FUNC_FindGroundZForCoord;
   FLOAT fReturn = 0;
   _asm
   {
       push   fY
       push   fX
       call   dwFunc
       fstp   fReturn
       add       esp, 8
   }
   return fReturn;
}

void teleport(float posX, float posY, float posZ)
{
   float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : nullptr;
   position[0] = posX;
   position[1] = posY;
   position[2] = posZ;
}

void teleport_target_blip()
{
   if ((*(int *)0xBA6774 != 0))
   {
       float mapPos[3];
       for (int i = 0; i < (0xAF * 0x28); i += 0x28)
       {
           if (*(short *)(0xBA873D + i) == 4611)
           {
               float *pos = (float *)(0xBA86F8 + 0x28 + i);
               mapPos[0] = *pos;
               mapPos[1] = *(pos + 1);
               mapPos[2] = FindGroundZForPosition(mapPos[0], mapPos[1]) + 2.0f;

               teleport(mapPos[0], mapPos[1], mapPos[2]);
           }
       }
   }
   else AddMessageJumpQ("~r~HA KAPTE HET METKU", 2000, NULL, false);
}
Да там и не нужен ассемблер, просто разраб соба выебывался. Всю функцию можно заменить вот таким вот вызовом в одну строку:
C++:
float fZ = ((float(__cdecl*)(float,float))FUNC_FindGroundZForCoord)(fX, fY);
 
Последнее редактирование:
  • Нравится
Реакции: bottom_text и checkdasound

#Rin

Известный
Всефорумный модератор
1,214
1,043
Как определить версию сампа без SF API?
По сигнатуре байтов.
Запускаешь нужные тебе версии сампа, и ищешь места которые различаются между версиями.
Например строку с выводом сообщения о версии самп в чат.
 
  • Нравится
Реакции: checkdasound

-raymond-

Известный
110
9
подскажите ид клавишы RIGHT SHIFT, гуглил нигде не могу найти, есть только просто SHIFT
 

-raymond-

Известный
110
9
почему вместо русского текста вопросы?
SisOMdf.png