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

Byte

Потрачен
115
32
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
пытаюсь поставить хук на UpdateNetwork, но когда отправляю ракнет пакеты ничего не работает
zalupa code:
void CNetGame__UpdateNetwork__HOOK(const decltype(CNetGame__UpdateNetwork_Hook) & hook, void * _this) {
  Packet * packet = nullptr;
  uint8_t * localdata = nullptr;
  uint8_t state {};

  for (packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive(); packet; packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive()) {
    localdata = packet -> data;

    switch (state) {
    localdata = packet->data;
   
    if(*localdata == 40) state = localdata[5];
    case 223: {
      RakNet::BitStream bs((unsigned char * ) packet -> data, packet -> length, false);

      uint8_t packetID;
      uint32_t rpcID;
      bs.Read(packetID);
      bs.Read(rpcID);

      if (rpcID == 15) {
        sampapi::v037r3::RefChat() -> AddChatMessage("я тормоз", 0xFFFFFFFF, "я тормоз");
        return;
      }
      break;
    }
    default:
      break;
    }
  }

  return hook.call_trampoline(_this);
}


void hooks::install_tormoz_updatenetwork_hook() {
    CNetGame__UpdateNetwork_Hook.set_dest(0xAF20);
    CNetGame__UpdateNetwork_Hook.set_cb(&CNetGame__UpdateNetwork__HOOK);
    CNetGame__UpdateNetwork_Hook.install();
}
C++:
void CNetGame__UpdateNetwork__HOOK(const decltype(CNetGame__UpdateNetwork_Hook) & hook, void * _this) {
  Packet * packet = nullptr;

  for (packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive(); packet; packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive()) {
    uint8_t packetID = packet->data[0];
    
    if (packetID == 40) {
      RakNet::BitStream bs((unsigned char*)packet->data, packet->length, false);
      bs.Read(packetID);
      
      uint16_t rpcID;
      bs.Read(rpcID);
      
      if (rpcID == 15) {
        sampapi::v037r3::RefChat()->AddChatMessage("RPC 15 получен", 0xFFFFFFFF, "Отладка");
      }
    }
    
    else if (packetID == 223) {
      sampapi::v037r3::RefChat()->AddChatMessage("Пакет 223 получен", 0xFFFFFFFF, "Отладка");
    }
  }

  return hook.call_trampoline(_this);
}

void hooks::install_tormoz_updatenetwork_hook() {
    CNetGame__UpdateNetwork_Hook.set_dest(0xAF20);
    CNetGame__UpdateNetwork_Hook.set_cb(&CNetGame__UpdateNetwork__HOOK);
    CNetGame__UpdateNetwork_Hook.install();
}

state не устанавливается перед switch, а внутри первого case
 
  • Влюблен
Реакции: vmprotect

tanksoftik

Участник
35
7
Как вообще работают лимиты самп на машины? И как их можно снять? Просто смотрел idb самп на скины лимит 20к и его видно, а на машины так и не нашел где стоит лимит и что надо патчить
 

вайега52

Налуашил состояние
Модератор
2,975
3,092
Как вообще работают лимиты самп на машины? И как их можно снять? Просто смотрел idb самп на скины лимит 20к и его видно, а на машины так и не нашел где стоит лимит и что надо патчить
1745248803518.png
 
  • Вау
  • Нравится
Реакции: tanksoftik и vmprotect

writeline

Новичок
28
9
Подскажите адрес координат игрока пожалуйста.

с++:
HRESULT APIENTRY hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
    if (!bInit)
        InitializeD3D(pDevice);

    if (bInit && pDevice)
    {
        stCoordinates coords = GetPlayerCoordinates();
        char buffer[128];
        sprintf_s(buffer, "X: %.2f, Y: %.2f, Z: %.2f", coords.fX, coords.fY, coords.fZ);
        DrawText(buffer, 10, 10, D3DCOLOR_ARGB(255, 255, 255, 255));
    }

    return oEndScene ? oEndScene(pDevice) : D3D_OK;
}

DWORD WINAPI HookThread(LPVOID lpParam)
{
    //D3D
    while (!pDevice)
    {
        pDevice = *(LPDIRECT3DDEVICE9*)0xC97C28;
        Sleep(100);
    }

    DWORD* pVTable = *(DWORD**)pDevice;

    DWORD oldProtect;
    VirtualProtect(&pVTable[42], sizeof(DWORD), PAGE_EXECUTE_READWRITE, &oldProtect);
    oEndScene = (HRESULT(APIENTRY*)(LPDIRECT3DDEVICE9))pVTable[42];
    pVTable[42] = (DWORD)hkEndScene;
    VirtualProtect(&pVTable[42], sizeof(DWORD), oldProtect, &oldProtect);

    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{
    if (reason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);

        // pCoordinates = (stCoordinates*) ТУТ АДРЕС;

        CreateThread(NULL, 0, HookThread, NULL, 0, NULL);
    }
    return TRUE;
}
 

tanksoftik

Участник
35
7
Подскажите адрес координат игрока пожалуйста.

с++:
HRESULT APIENTRY hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
    if (!bInit)
        InitializeD3D(pDevice);

    if (bInit && pDevice)
    {
        stCoordinates coords = GetPlayerCoordinates();
        char buffer[128];
        sprintf_s(buffer, "X: %.2f, Y: %.2f, Z: %.2f", coords.fX, coords.fY, coords.fZ);
        DrawText(buffer, 10, 10, D3DCOLOR_ARGB(255, 255, 255, 255));
    }

    return oEndScene ? oEndScene(pDevice) : D3D_OK;
}

DWORD WINAPI HookThread(LPVOID lpParam)
{
    //D3D
    while (!pDevice)
    {
        pDevice = *(LPDIRECT3DDEVICE9*)0xC97C28;
        Sleep(100);
    }

    DWORD* pVTable = *(DWORD**)pDevice;

    DWORD oldProtect;
    VirtualProtect(&pVTable[42], sizeof(DWORD), PAGE_EXECUTE_READWRITE, &oldProtect);
    oEndScene = (HRESULT(APIENTRY*)(LPDIRECT3DDEVICE9))pVTable[42];
    pVTable[42] = (DWORD)hkEndScene;
    VirtualProtect(&pVTable[42], sizeof(DWORD), oldProtect, &oldProtect);

    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{
    if (reason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);

        // pCoordinates = (stCoordinates*) ТУТ АДРЕС;

        CreateThread(NULL, 0, HookThread, NULL, 0, NULL);
    }
    return TRUE;
}
 
  • Нравится
Реакции: writeline

Loku

Известный
31
7
Does someone know why I do always get 65535? I basically want to get the IDs of the players in my vehicle. I get it while I'm in the car without passengers.
C++:
    auto myVehicle = playerPool->GetLocalPlayer()->m_nCurrentVehicle; //gives correct samp id
    if (pVehiclePool->m_bNotEmpty[myVehicle])
    {
        samp::CVehicle* pSampVehicle = pVehiclePool->m_pObject[myVehicle];
        CVehicle* pVehicle = pSampVehicle->m_pGameVehicle;
        auto idDriver = playerPool->Find(pVehicle->m_pDriver); // always 65565
    }
I have also tested:
Код:
  auto myVehicle = playerPool->GetLocalPlayer()->m_nCurrentVehicle;
    if (pVehiclePool->m_bNotEmpty[myVehicle])
    {
        CVehicle* pVehicle = pVehiclePool->m_pGameObject[myVehicle];
        auto idDriver = playerPool->Find(pVehicle->m_pDriver);
    }

The goal would be getting this:
C++:
std::vector<int> GetIDPlayersFromCurrentVehicle() {
    samp::CVehiclePool* pVehiclePool = samp::RefNetGame()->GetVehiclePool();
    samp::CPlayerPool* playerPool = samp::RefNetGame()->GetPlayerPool();

    std::vector<int> playerIDs;
    auto myVehicle = playerPool->GetLocalPlayer()->m_nCurrentVehicle;
    if (pVehiclePool->m_bNotEmpty[myVehicle]) {
        CVehicle* pVehicle = pVehiclePool->m_pGameObject[myVehicle];
        auto idDriver = playerPool->Find(pVehicle->m_pDriver);

        if (idDriver != 65535) {
            playerIDs.push_back(idDriver);
        }

        unsigned char numPassengers = pVehicle->m_nNumPassengers;
        for (unsigned char i = 0; i < numPassengers; ++i) {
            CPed* passenger = pVehicle->m_apPassengers[i];
            if (passenger) {
                auto idPassenger = playerPool->Find(passenger);
                if (idPassenger != 65535) {
                    playerIDs.push_back(idPassenger);
                }
            }
        }

    }

    return playerIDs;
}
 
Последнее редактирование:

swlm

Участник
47
15
что за функция? RemovePlayerFromVehicle откуда она, только конкретно, из гта или из самп клиента

Такой вопрос, по поводу лимита CarMods в игре.
Пытаюсь снять лимит, так-вот, кто-то может объяснить кратко, почему например в этих исходниках происходит reallocate на массив с каким-то прибавлением байтов, fastman92.
Это из-за того, что какой-то тип данных имеет определённый размер в байтах?
Почему например, если я укажу + 1, то может произойти краш, или что-то ещё.
 

pastow

Активный
205
68
как рисовать картинку в имгуи меню? у меня имгуи дх11 киеро хук
 

вайега52

Налуашил состояние
Модератор
2,975
3,092
как рисовать картинку в имгуи меню? у меня имгуи дх11 киеро хук
 
  • Нравится
Реакции: pastow

thelupa1488

Новичок
13
3
Здравствуйте, сделал хук "0x33BA0" (Внешний) отправки пакета серверу, но не пойму, как прочитать агрумент с bitstream
Чтобы его потом передать классу BitStream
1746946221822.png
 

moreveal

Известный
968
699
Здравствуйте, сделал хук "0x33BA0" (Внешний) отправки пакета серверу, но не пойму, как прочитать агрумент с bitstream
Посмотреть вложение 270028
C++:
struct BitStream {
    int    numberOfBitsUsed;
    int    numberOfBitsAllocated;
    int    readOffset;
    uint8_t *data;
    bool  copyData;
    uint8_t  stackData[256];
};
кастишь к указателю на эту структуру и работаешь с ней:

C++:
// int pBitStream - аргумент с твоей функции
auto bitStream = reinterpret_cast<BitStream*>(pBitStream);

(боюсь спросить почему у тебя это внутри фрейма имгуи)
 

thelupa1488

Новичок
13
3
C++:
struct BitStream {
    int    numberOfBitsUsed;
    int    numberOfBitsAllocated;
    int    readOffset;
    uint8_t *data;
    bool  copyData;
    uint8_t  stackData[256];
};
кастишь к указателю на эту структуру и работаешь с ней:

C++:
// int pBitStream - аргумент с твоей функции
auto bitStream = reinterpret_cast<BitStream*>(pBitStream);

(боюсь спросить почему у тебя это внутри фрейма имгуи)
Спасибо большое, только ты написал под internal, но попробую её на external
А на счёт ImGui, это вывод для внешнего окна, не самого меню (Просто для теста, чтобы рядом было :))
1746946921159.png
 

tanksoftik

Участник
35
7
как можно реализовать функцию convertScreenCoordsToWorld3D с луа на плюсы
чат гпт выдовал такой код

C++:
#include <plugin.h>
#include <game_sa/CCamera.h>
#include <game_sa/CWorld.h>
#include <game_sa/CColPoint.h>

bool ConvertScreenCoordsToWorld3D(float screenX, float screenY, float& outX, float& outY, float& outZ)
{
    auto viewMatrix = *(RwMatrix*)0xB6FA2C;
    CCamera* cam = TheCamera;

    float screenW = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17044));
    float screenH = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17048));

    float nx = (2.0f * screenX / screenW) - 1.0f;
    float ny = 1.0f - (2.0f * screenY / screenH); // перевёрнутый Y

    CVector forward(viewMatrix.at.x, viewMatrix.at.y, viewMatrix.at.z);
    CVector right(viewMatrix.right.x, viewMatrix.right.y, viewMatrix.right.z);
    CVector up(viewMatrix.up.x, viewMatrix.up.y, viewMatrix.up.z);

    float fov = cam->m_fFOV;
    float aspect = screenW / screenH;
    float fovRad = fov * 3.14159f / 180.0f;
    float tanFov = tanf(fovRad / 2.0f);

    CVector rayDir = forward + right * nx * aspect * tanFov + up * ny * tanFov;
    rayDir.Normalise();

    CVector camPos = *cam->GetGameCamPosition();
    CVector rayEnd = camPos + rayDir * 3000.0f; // дальность луча

    CColPoint col;
    CEntity* pHitEntity = nullptr;

    // трассировка с фильтрацией воды и прочего
    if (CWorld::ProcessLineOfSight(
            camPos, rayEnd, col, pHitEntity,
            true, true, true, true, false, true, false))
    {
        outX = col.m_vecPoint.x;
        outY = col.m_vecPoint.y;
        outZ = col.m_vecPoint.z;
        return true;
    }

    return false;
}
но он работает очень плохо и неправильно
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
368
805
как можно реализовать функцию convertScreenCoordsToWorld3D с луа на плюсы
чат гпт выдовал такой код

C++:
#include <plugin.h>
#include <game_sa/CCamera.h>
#include <game_sa/CWorld.h>
#include <game_sa/CColPoint.h>

bool ConvertScreenCoordsToWorld3D(float screenX, float screenY, float& outX, float& outY, float& outZ)
{
    auto viewMatrix = *(RwMatrix*)0xB6FA2C;
    CCamera* cam = TheCamera;

    float screenW = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17044));
    float screenH = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17048));

    float nx = (2.0f * screenX / screenW) - 1.0f;
    float ny = 1.0f - (2.0f * screenY / screenH); // перевёрнутый Y

    CVector forward(viewMatrix.at.x, viewMatrix.at.y, viewMatrix.at.z);
    CVector right(viewMatrix.right.x, viewMatrix.right.y, viewMatrix.right.z);
    CVector up(viewMatrix.up.x, viewMatrix.up.y, viewMatrix.up.z);

    float fov = cam->m_fFOV;
    float aspect = screenW / screenH;
    float fovRad = fov * 3.14159f / 180.0f;
    float tanFov = tanf(fovRad / 2.0f);

    CVector rayDir = forward + right * nx * aspect * tanFov + up * ny * tanFov;
    rayDir.Normalise();

    CVector camPos = *cam->GetGameCamPosition();
    CVector rayEnd = camPos + rayDir * 3000.0f; // дальность луча

    CColPoint col;
    CEntity* pHitEntity = nullptr;

    // трассировка с фильтрацией воды и прочего
    if (CWorld::ProcessLineOfSight(
            camPos, rayEnd, col, pHitEntity,
            true, true, true, true, false, true, false))
    {
        outX = col.m_vecPoint.x;
        outY = col.m_vecPoint.y;
        outZ = col.m_vecPoint.z;
        return true;
    }

    return false;
}
но он работает очень плохо и неправильно

либо самопальная хуета, которую я отрыл когда-то очень давно

C++:
void CalcScreenCoors(CVector* vecWorld, CVector* vecScreen)
    {
        D3DXMATRIX m((float*)(0xB6FA2C));

        DWORD* dwLenX = (DWORD*)(0xC17044);
        DWORD* dwLenY = (DWORD*)(0xC17048);

        vecScreen->x = (vecWorld->z * m._31) + (vecWorld->y * m._21) + (vecWorld->x * m._11) + m._41;
        vecScreen->y = (vecWorld->z * m._32) + (vecWorld->y * m._22) + (vecWorld->x * m._12) + m._42;
        vecScreen->z = (vecWorld->z * m._33) + (vecWorld->y * m._23) + (vecWorld->x * m._13) + m._43;

        double    fRecip = (double)1.0 / vecScreen->z;
        vecScreen->x *= (float)(fRecip * (*dwLenX));
        vecScreen->y *= (float)(fRecip * (*dwLenY));
    }

    void CalcWorldCoors(CVector* vecScreen, CVector* vecWorld)
    {
        D3DXMATRIXA16 m((float*)(0xB6FA2C));

        D3DXMATRIXA16 minv;
        memset(&minv, 0, sizeof(D3DXMATRIXA16));
        m._44 = 1.0f;

        D3DXMatrixInverse(&minv, NULL, &m);

        DWORD* dwLenX = (DWORD*)(0xC17044);
        DWORD* dwLenY = (DWORD*)(0xC17048);

        float fRecip = 1.0f / vecScreen->z;
        vecScreen->x /= fRecip * (*dwLenX);
        vecScreen->y /= fRecip * (*dwLenY);

        vecWorld->x = vecScreen->z * minv._31 + vecScreen->y * minv._21 + vecScreen->x * minv._11 + minv._41;
        vecWorld->y = vecScreen->z * minv._32 + vecScreen->y * minv._22 + vecScreen->x * minv._12 + minv._42;
        vecWorld->z = vecScreen->z * minv._33 + vecScreen->y * minv._23 + vecScreen->x * minv._13 + minv._43;
    }