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

tanksoftik

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

с++:
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

Известный
33
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

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

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

pastow

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

вайега52

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

thelupa1488

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

moreveal

Известный
988
720
Здравствуйте, сделал хук "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
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
369
822
как можно реализовать функцию 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;
    }
 

moreveal

Известный
988
720
как можно реализовать функцию 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;
}
но он работает очень плохо и неправильно
напрямую с мунлодера спиздил взял, пусть тебе и скинули уже ответ, но зато оно идентично луашному convertScreenCoordsToWorld3D:
C++:
#include <d3d9.h>
#include <d3dx9.h>

void convertScreenCoordsToWorld3D(float screenX, float screenY, float depth, float* outX, float* outY, float* outZ)
{
    static const uintptr_t pGameCamera = 0x0B6F028;
    static const uintptr_t pRsGlobal   = 0x0C17040;

    D3DXMATRIX cameraMatrix;
    std::memcpy(&cameraMatrix, reinterpret_cast<void*>(pGameCamera + 0xA04), sizeof(D3DXMATRIX));

    cameraMatrix._44 = 1.0f;
    D3DXMATRIX inverseMatrix;
    if (!D3DXMatrixInverse(&inverseMatrix, nullptr, &cameraMatrix))
        return;

    int screenWidth  = *reinterpret_cast<int*>(pRsGlobal + 4);
    int screenHeight = *reinterpret_cast<int*>(pRsGlobal + 8);
    if (screenWidth <= 0 || screenHeight <= 0 || depth == 0.0f)
        return;

    double invDepth = 1.0 / static_cast<double>(depth);
    double normX = static_cast<double>(screenX) / (screenWidth * invDepth);
    double normY = static_cast<double>(screenY) / (screenHeight * invDepth);

    auto dx = static_cast<float>(normX);
    auto dy = static_cast<float>(normY);
    auto dz = depth;

    *outX = inverseMatrix._11 * dx + inverseMatrix._21 * dy + inverseMatrix._31 * dz + inverseMatrix._41;
    *outY = inverseMatrix._12 * dx + inverseMatrix._22 * dy + inverseMatrix._32 * dz + inverseMatrix._42;
    *outZ = inverseMatrix._13 * dx + inverseMatrix._23 * dy + inverseMatrix._33 * dz + inverseMatrix._43;
}
 
Последнее редактирование:
  • Нравится
Реакции: вайега52 и ARMOR

0xff65

Участник
36
2
Приветствую, пытаюсь собрать plugin-sdk. Возникает такая проблема -
Код:
1>CCoronas.cpp
1>D:\plugin-sdk-master\safetyhook\safetyhook.hpp(38,10): fatal error C1083: Не удается открыть файл включение: expected: No such file or directory,
1>CCover.cpp
1>D:\plugin-sdk-master\safetyhook\safetyhook.hpp(38,10): fatal error C1083: Не удается открыть файл включение: expected: No such file or directory,
1>CCoverPoint.cpp
1>D:\plugin-sdk-master\safetyhook\safetyhook.hpp(38,10): fatal error C1083: Не удается открыть файл включение: expected: No such file or directory,
1>CCredits.cpp
1>D:\plugin-sdk-master\safetyhook\safetyhook.hpp(38,10): fatal error C1083: Не удается открыть файл включение: expected:
Сборка выполняется на Visual Studio 19
 

san0

Известный
Друг
412
275
Приветствую, пытаюсь собрать plugin-sdk. Возникает такая проблема -
Код:
1>CCoronas.cpp
1>D:\plugin-sdk-master\safetyhook\safetyhook.hpp(38,10): fatal error C1083: Не удается открыть файл включение: expected: No such file or directory,
1>CCover.cpp
1>D:\plugin-sdk-master\safetyhook\safetyhook.hpp(38,10): fatal error C1083: Не удается открыть файл включение: expected: No such file or directory,
1>CCoverPoint.cpp
1>D:\plugin-sdk-master\safetyhook\safetyhook.hpp(38,10): fatal error C1083: Не удается открыть файл включение: expected: No such file or directory,
1>CCredits.cpp
1>D:\plugin-sdk-master\safetyhook\safetyhook.hpp(38,10): fatal error C1083: Не удается открыть файл включение: expected:
Сборка выполняется на Visual Studio 19
std::expected это часть редакции стандарта C++23 (https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0323r12.html).
В MSVC(CL) он доступен начиная с Visual Studio 2022 17.3 (_MSC_VER >= 1933) (https://github.com/microsoft/STL/commit/b7ba3ad82f330d606fc9b317940304223308ac8b).

Сам проект должен быть настроен с использованием /std:c++23preview или /std:c++latest (https://learn.microsoft.com/en-us/cpp/build/reference/std-specify-language-standard-version). А для проверке на этапе сборки можно воспользоваться макросом __cpp_lib_expected
(https://en.cppreference.com/w/cpp/feature_test#cpp_lib_expected).

Если такая функциональность нужна в том окружении, где последние реализации недоступны, то можно воспользоваться похожими абстракциями из популярных библиотек типа StatusOr<T> из abseil или checked из Boost.Outcome. И кстати не стоит забывать за возможность поставить относительно портабельный и легковесный mingw (https://www.mingw-w64.org/, https://github.com/mstorsjo/llvm-mingw/releases), хотя думаю там также могут быть понадобиться модификации кода.

В Вашем случае полагаю проще будет или поставить любой бекпорт:

Либо просто взять старую версию plugin-sdk:
История изменений => https://github.com/DK22Pac/plugin-sdk/commits/master/safetyhook/safetyhook.cpp
Предыдущий коммит до добавления safetyhook => https://github.com/DK22Pac/plugin-sdk/tree/380105ec5242cdb3a0cbc18505b151308dd85b53

И конечно можно еще сделать git revert (https://git-scm.com/docs/git-revert) в master ветке, отменив кокретно добавление этой библиотеки, но это требует небольшого знания системы контроля версий, а также потребует некоторых изменений в коде, тем более что Вы не указали контекст использования (например, safetyhook - осознанный выбор в связи с поддержкой 64 битной трилогии которая unreal engine)