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

tanksoftik

Новичок
5
0
C++:
int AddParticle(FxSystem_c* particle,
    RwV3d* position,
    RwV3d* velocity,
    float unk,
    FxPrtMult_c* particleData,
    float a6,
    float brightness,
    float a8,
    int a9)
{

    particle->AddParticle(position, velocity, unk, particleData, a6, brightness, a8, a9);

    return 1;

}

C++:
        patch::RedirectCall(0x6DF303, AddParticle);
        patch::RedirectCall(0x6DEE83, AddParticle);
        patch::RedirectCall(0x6DF0C3, AddParticle);
функцию AddParticle что в ней передается брал фулл из ida

psevdocode:
int __thiscall FxSystem_c::AddParticle(
        FxSystem_c *particle,
        CVector *position,
        CVector *velocity,
        float unk,
        FxPrtMult_c *particleData,
        float a6,
        float brightness,
        float a8,
        int a9)
{
  int v10; // esi
  int result; // eax
  FxPrim_c *particlePrim; // ecx
  float v13; // [esp+18h] [ebp-8h]
  int i; // [esp+3Ch] [ebp+1Ch]

  v10 = (rand() * 0.000030517578 * 100.0);
  result = Fx_c::GetFxQuality(&g_fx);
  if ( result || v10 >= 50 )
  {
    result = Fx_c::GetFxQuality(&g_fx);
    if ( result != FX_MEDIUM || v10 >= 25 )
    {
      v13 = 1.0;
      if ( brightness < a8 )
        v13 = 1.0 - a8 + brightness;
      result = 0;
      for ( i = 0; result < particle->m_pBluePrint->m_nNumEmitters; i = ++result )
      {
        particlePrim = particle->PrimsList[result];
        if ( particlePrim->m_bEnabled )
        {
          (particlePrim->vtable->field_14)(
            particlePrim,
            position,
            velocity,
            LODWORD(unk),
            particleData,
            LODWORD(a6),
            COERCE_FLOAT(LODWORD(v13)),
            a9);
          result = i;
        }
      }
    }
  }
  return result;
}

но почему то крашит, пробовал пустую функцию делать все равно крашит
 

4el0ve4ik

Известный
Всефорумный модератор
1,556
1,354
C++:
int AddParticle(FxSystem_c* particle,
    RwV3d* position,
    RwV3d* velocity,
    float unk,
    FxPrtMult_c* particleData,
    float a6,
    float brightness,
    float a8,
    int a9)
{

    particle->AddParticle(position, velocity, unk, particleData, a6, brightness, a8, a9);

    return 1;

}

C++:
        patch::RedirectCall(0x6DF303, AddParticle);
        patch::RedirectCall(0x6DEE83, AddParticle);
        patch::RedirectCall(0x6DF0C3, AddParticle);
функцию AddParticle что в ней передается брал фулл из ida

psevdocode:
int __thiscall FxSystem_c::AddParticle(
        FxSystem_c *particle,
        CVector *position,
        CVector *velocity,
        float unk,
        FxPrtMult_c *particleData,
        float a6,
        float brightness,
        float a8,
        int a9)
{
  int v10; // esi
  int result; // eax
  FxPrim_c *particlePrim; // ecx
  float v13; // [esp+18h] [ebp-8h]
  int i; // [esp+3Ch] [ebp+1Ch]

  v10 = (rand() * 0.000030517578 * 100.0);
  result = Fx_c::GetFxQuality(&g_fx);
  if ( result || v10 >= 50 )
  {
    result = Fx_c::GetFxQuality(&g_fx);
    if ( result != FX_MEDIUM || v10 >= 25 )
    {
      v13 = 1.0;
      if ( brightness < a8 )
        v13 = 1.0 - a8 + brightness;
      result = 0;
      for ( i = 0; result < particle->m_pBluePrint->m_nNumEmitters; i = ++result )
      {
        particlePrim = particle->PrimsList[result];
        if ( particlePrim->m_bEnabled )
        {
          (particlePrim->vtable->field_14)(
            particlePrim,
            position,
            velocity,
            LODWORD(unk),
            particleData,
            LODWORD(a6),
            COERCE_FLOAT(LODWORD(v13)),
            a9);
          result = i;
        }
      }
    }
  }
  return result;
}

но почему то крашит, пробовал пустую функцию делать все равно крашит
Потому что нужно соглашение о вызове указать.
C++:
int __fastcall AddParticle(FxSystem_c* particle,
    void* unused,
    RwV3d* position,
    RwV3d* velocity,
    float unk,
    FxPrtMult_c* particleData,
    float a6,
    float brightness,
    float a8,
    int a9)
{

    particle->AddParticle(position, velocity, unk, particleData, a6, brightness, a8, a9);

    return 1;

}
Кстати почему ты возвращаешь единицу, а не то что тебе отдает оригинальная функция, это задумка или проёб?
 
  • Нравится
Реакции: tanksoftik

tanksoftik

Новичок
5
0
C++:
int __fastcall AddParticle(FxSystem_c* particle,
    void* unused,
    RwV3d* position,
    RwV3d* velocity,
    float unk,
    FxPrtMult_c* particleData,
    float a6,
    float brightness,
    float a8,
    int a9)
{

    particleData->m_color.red = 1;
    particleData->m_color.green = 0;
    particleData->m_color.blue = 0;

    particle->AddParticle(position, velocity, unk, particleData, a6, brightness, a8, a9);

    return 1;

}
как теперь можно получить CVehicle что бы получать нужный color или же activated
 

4el0ve4ik

Известный
Всефорумный модератор
1,556
1,354
C++:
int __fastcall AddParticle(FxSystem_c* particle,
    void* unused,
    RwV3d* position,
    RwV3d* velocity,
    float unk,
    FxPrtMult_c* particleData,
    float a6,
    float brightness,
    float a8,
    int a9)
{

    particleData->m_color.red = 1;
    particleData->m_color.green = 0;
    particleData->m_color.blue = 0;

    particle->AddParticle(position, velocity, unk, particleData, a6, brightness, a8, a9);

    return 1;

}
как теперь можно получить CVehicle что бы получать нужный color или же activated
Сделать прослойку где ты будешь передавать в регистр edx тот самый CVehicle*, в таком варианте он у тебя будет приходить вторым аргументом, который сейчас обзывается: void* unused. Это самый простой вариант.
 
  • Нравится
Реакции: whyega52

vmprotect

Известный
382
241
Короче, как сделать, чтобы хук на LoadTxd редиректил в два разных адреса, в зависимости от того, какой txd'шник грузится? типа

Один FONT.TXD - 0x7320B0
Второй zalupa.txd - какой-то другой адрес

С++:
bool __cdecl TestHOOK(const decltype(CTxdStore__LoadTxd_Hook)& hook, int index, const char* filename) {
    if (strcmp(filename, (char*)0x86A648) == 0) {
        return hook.call_trampoline(index, "FONT.TXD"); 
    } else if(strcmp(filename, (char*)0x0000) == 0) {
        return hook.call_trampoline(index, "zalupa.txd");
    }

    return hook.call_trampoline(index, filename);
}
void install_fucking_hook() {
  
    CTxdStore__LoadTxd_Hook.set_dest(0x7320B0);
    CTxdStore__LoadTxd_Hook.set_cb(TestHOOK);
    CTxdStore__LoadTxd_Hook.install();
}

а то я пытался делать в разных функциях, то оно работает только в одном из них а не все, допустим шрифт заменяется а другой txd нет
 
  • Ха-ха
Реакции: hhhaaauuu764

ARMOR

Я будто попал в другое измерение
Модератор
5,020
7,102
как можно изменить handling для определенного cvehicle
Кажись у каждого CVehicle есть поле с хендлингом

 

ARMOR

Я будто попал в другое измерение
Модератор
5,020
7,102
Короче, как сделать, чтобы хук на LoadTxd редиректил в два разных адреса, в зависимости от того, какой txd'шник грузится? типа

Один FONT.TXD - 0x7320B0
Второй zalupa.txd - какой-то другой адрес

С++:
bool __cdecl TestHOOK(const decltype(CTxdStore__LoadTxd_Hook)& hook, int index, const char* filename) {
    if (strcmp(filename, (char*)0x86A648) == 0) {
        return hook.call_trampoline(index, "FONT.TXD");
    } else if(strcmp(filename, (char*)0x0000) == 0) {
        return hook.call_trampoline(index, "zalupa.txd");
    }

    return hook.call_trampoline(index, filename);
}
void install_fucking_hook() {
 
    CTxdStore__LoadTxd_Hook.set_dest(0x7320B0);
    CTxdStore__LoadTxd_Hook.set_cb(TestHOOK);
    CTxdStore__LoadTxd_Hook.install();
}

а то я пытался делать в разных функциях, то оно работает только в одном из них а не все, допустим шрифт заменяется а другой txd нет
У ктхуков в контексте кажись есть метод для получения указателя на return_address. Можешь попробовать его изменить
 

TokyoQq

Новичок
16
4
Кажись у каждого CVehicle есть поле с хендлингом

при изменении меняется для всей модели а мне надо как то сделать для определеного CVehicle
 
Последнее редактирование:

NikitosikSSS

Новичок
2
0
1. Можно ли как то реализовать функцию увеличение хитбокса? Есть ли в сампе, какая то функция для этого
 

writeline

Новичок
22
8
1744175940428.png


Есть какая либо реализация вывода координат в углу экрана как на скрине?
 
  • Эм
Реакции: Smeruxa