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

korsarsan

Участник
82
31
Имеются проблемы с выводом hp другого персонажа
Вот этот код постоянно выводит значение 1000
C++:
CPed* aPed = CPools::GetPed(pSAMP->getPlayers()->pRemotePlayer[iPlayerID]->pPlayerData->pSAMP_Actor->ulGTAEntityHandle);
        float fbarr = aPed->m_fHealth;
А этот код показывает hp не точно, там постоянно меньше чем на самом деле есть, причем как то рандомно, когда hp 100 он покажет 100, но по мере уменьшения оно становится все менее точно.
C++:
float fHealth = pSAMP->getPlayers()->pRemotePlayer[iPlayerID]->pPlayerData->fActorHealth;
Может кто знает как нормально вывести hp другого перса
 

#Northn

Известный
Всефорумный модератор
2,660
2,613
Вот этот код постоянно выводит значение 1000
C++:
CPed* aPed = CPools::GetPed(pSAMP->getPlayers()->pRemotePlayer[iPlayerID]->pPlayerData->pSAMP_Actor->ulGTAEntityHandle);
float fbarr = aPed->m_fHealth;
так устроен самп. он хранит значения здоровьев в своих пулах
А этот код показывает hp не точно, там постоянно меньше чем на самом деле есть, причем как то рандомно, когда hp 100 он покажет 100, но по мере уменьшения оно становится все менее точно.
C++:
float fHealth = pSAMP->getPlayers()->pRemotePlayer[iPlayerID]->pPlayerData->fActorHealth;
всё дело в том, как калкор хранит значения хп и брони в синхронизации. не исправить
 
  • Клоун
  • Грустно
Реакции: Fott и korsarsan
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
#include <Windows.h>
#include <detours/detours.h>
#include <iostream>

static HMODULE(WINAPI* TrueLoadLibrary)(LPCWSTR lpLibFileName) = LoadLibraryW;

HMODULE WINAPI DetouredLoadLibrary(LPCWSTR lpLibFileName)
{
    HMODULE res = TrueLoadLibrary(lpLibFileName);
    MessageBoxW(NULL, lpLibFileName, L"Detoured!", MB_OK | MB_ICONEXCLAMATION);
    return res;
}

void SetGlobalHook()
{
    // Получение адреса оригинальной функции LoadLibraryW из kernel32.dll
    TrueLoadLibrary = reinterpret_cast<HMODULE(WINAPI*)(LPCWSTR)>(GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryW"));

    // Установка хука
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)TrueLoadLibrary, DetouredLoadLibrary);
    DetourTransactionCommit();
}

// Функция для удаления глобального хука
void RemoveGlobalHook()
{
    // Удаление хука
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourDetach(&(PVOID&)TrueLoadLibrary, DetouredLoadLibrary);
    DetourTransactionCommit();
}

int main()
{
    // Установка глобального хука
    SetGlobalHook();

    // Ждем нажатия клавиши перед удалением хука
    std::cout << "Press any key to remove the hook..." << std::endl;
    std::cin.get();

    // Удаление глобального хука
    RemoveGlobalHook();

    return 0;
}
не работает глобально, что не так? есть такая же версия только в формате длл и без
C++:
TrueLoadLibrary = reinterpret_cast<HMODULE(WINAPI*)(LPCWSTR)>(GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryW"));
и все работает
 

F0RQU1N and

Известный
1,292
502
C++:
#include <Windows.h>
#include <detours/detours.h>
#include <iostream>

static HMODULE(WINAPI* TrueLoadLibrary)(LPCWSTR lpLibFileName) = LoadLibraryW;

HMODULE WINAPI DetouredLoadLibrary(LPCWSTR lpLibFileName)
{
    HMODULE res = TrueLoadLibrary(lpLibFileName);
    MessageBoxW(NULL, lpLibFileName, L"Detoured!", MB_OK | MB_ICONEXCLAMATION);
    return res;
}

void SetGlobalHook()
{
    // Получение адреса оригинальной функции LoadLibraryW из kernel32.dll
    TrueLoadLibrary = reinterpret_cast<HMODULE(WINAPI*)(LPCWSTR)>(GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryW"));

    // Установка хука
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)TrueLoadLibrary, DetouredLoadLibrary);
    DetourTransactionCommit();
}

// Функция для удаления глобального хука
void RemoveGlobalHook()
{
    // Удаление хука
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourDetach(&(PVOID&)TrueLoadLibrary, DetouredLoadLibrary);
    DetourTransactionCommit();
}

int main()
{
    // Установка глобального хука
    SetGlobalHook();

    // Ждем нажатия клавиши перед удалением хука
    std::cout << "Press any key to remove the hook..." << std::endl;
    std::cin.get();

    // Удаление глобального хука
    RemoveGlobalHook();

    return 0;
}
не работает глобально, что не так? есть такая же версия только в формате длл и без
C++:
TrueLoadLibrary = reinterpret_cast<HMODULE(WINAPI*)(LPCWSTR)>(GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryW"));
и все работает
а в чем смысл? ты же в своем приложении хукаешь
 
  • Нравится
Реакции: colby57
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.