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

swlm

Участник
52
18
Есть одна очень бесячая проблема - при частом ALT + TAB без плагина III.VC.SA.WindowedMode игра в какой-то момент перестаёт разворачиваться, есть ли 100% гарантированный фикс этой проблемы?

И есть какая-то стабильная версия DirectX-9? Потому-что какие-то скрипты ведут себя очень странно на других компьютерах, ну например у меня всё отлично, а у других случаются какие-то краши, хотя у всех все те-же плагины, а происходит иногда какая-то дичь...
 
Последнее редактирование:
  • Эм
Реакции: 0xFF

swlm

Участник
52
18
Почему-то Object 0 is valid не выводится, но по сути должно же..
Я что-то упустил?

C++:
typedef void** samp_objects_array;
typedef uintptr_t* samp_objects_pool;
typedef void* samp_object_ptr;

samp_objects_array CMultiplayer::GetSampObjects()
{
    DWORD sampDLL = (DWORD)GetModuleHandleA("samp.dll");
    if (!sampDLL) return nullptr;

    DWORD sampInfo = *(DWORD*)(sampDLL + 0x26E8DC);
    if (!sampInfo) return nullptr;

    DWORD pPools = *(DWORD*)(sampInfo + 0x3DE);
    if (!pPools) return nullptr;

    DWORD pObjectPool = *(DWORD*)(pPools + 0x14);
    if (!pObjectPool) return nullptr;

    void** objects_array = reinterpret_cast<void**>(pObjectPool + 0xFA4);
    return objects_array;
}

samp_objects_array objects_array = CMultiplayer::GetSampObjects();
if (objects_array != nullptr) {
    samp_object_ptr object = objects_array[0];
    if (object != nullptr) {
        printf("Object 0 is valid!\n");
    }
}
 

leqwe

Новичок
3
0
помогите с моей функцией mark target, она работает, но при нажатии пкм таргет рисуется на миллисекунду и сразу исчезает:

C++:
if (gMarkTarget && sCurrent.gamePed) {
    sAimHudTick = GetTickCount64();
    auto* net = sampapi::v037r1::RefNetGame();
    if (net && net->GetPlayerPool()) {
        auto* lp = net->GetPlayerPool()->GetLocalPlayer();
        if (lp) {
            if (sCurrent.sampPlayerId >= 0)
                lp->m_cameraTarget.m_nPlayer = (unsigned short)sCurrent.sampPlayerId;
            *reinterpret_cast<::CPed**>(*reinterpret_cast<int*>(0xB6F5F0) + 0x79C) = sCurrent.gamePed;
        }
    }
}
 

swlm

Участник
52
18
помогите с моей функцией mark target, она работает, но при нажатии пкм таргет рисуется на миллисекунду и сразу исчезает:

C++:
if (gMarkTarget && sCurrent.gamePed) {
    sAimHudTick = GetTickCount64();
    auto* net = sampapi::v037r1::RefNetGame();
    if (net && net->GetPlayerPool()) {
        auto* lp = net->GetPlayerPool()->GetLocalPlayer();
        if (lp) {
            if (sCurrent.sampPlayerId >= 0)
                lp->m_cameraTarget.m_nPlayer = (unsigned short)sCurrent.sampPlayerId;
            *reinterpret_cast<::CPed**>(*reinterpret_cast<int*>(0xB6F5F0) + 0x79C) = sCurrent.gamePed;
        }
    }
}
так в цикл закинь игровой, game_loop
 

writeline

Новичок
28
9
Пробую изменить размеры радара, при открытии сцены игры крашит, в чём может быть проблема? 🧐



с++:
const float RadarWidth = 1.8f;   // NewWidth
const float RadarHeight = 1.8f;  // NewHeight

template<typename T>
bool SafeWrite(void* address, T value)
{
    DWORD oldProtect;
    if (VirtualProtect(address, sizeof(T), PAGE_EXECUTE_READWRITE, &oldProtect))
    {
        *reinterpret_cast<T*>(address) = value;
        VirtualProtect(address, sizeof(T), oldProtect, &oldProtect);
        return true;
    }
    return false;
}

void SetRadarSize()
{
    //height
    uintptr_t widthAddresses[] = { 0x5834C2, 0x58A449, 0x58A7E9, 0x58A840, 0x58A943, 0x58A99D };
    for (auto addr : widthAddresses)
        SafeWrite<float>(reinterpret_cast<void*>(addr), RadarWidth);

    //width
    uintptr_t heightAddresses[] = { 0x58A47D, 0x58A632, 0x58A6AB, 0x58A70E, 0x58A801, 0x58A8AB, 0x58A921, 0x58A9D5, 0x5834F6 };
    for (auto addr : heightAddresses)
        SafeWrite<float>(reinterpret_cast<void*>(addr), RadarHeight);
}

Крашит как только должен появится радар
 
Последнее редактирование:

Winstаl

Известный
1,011
426
Пробую изменить размеры радара, при открытии сцены игры крашит, в чём может быть проблема? 🧐



с++:
const float RadarWidth = 1.8f;   // NewWidth
const float RadarHeight = 1.8f;  // NewHeight

template<typename T>
bool SafeWrite(void* address, T value)
{
    DWORD oldProtect;
    if (VirtualProtect(address, sizeof(T), PAGE_EXECUTE_READWRITE, &oldProtect))
    {
        *reinterpret_cast<T*>(address) = value;
        VirtualProtect(address, sizeof(T), oldProtect, &oldProtect);
        return true;
    }
    return false;
}

void SetRadarSize()
{
    //height
    uintptr_t widthAddresses[] = { 0x5834C2, 0x58A449, 0x58A7E9, 0x58A840, 0x58A943, 0x58A99D };
    for (auto addr : widthAddresses)
        SafeWrite<float>(reinterpret_cast<void*>(addr), RadarWidth);

    //width
    uintptr_t heightAddresses[] = { 0x58A47D, 0x58A632, 0x58A6AB, 0x58A70E, 0x58A801, 0x58A8AB, 0x58A921, 0x58A9D5, 0x5834F6 };
    for (auto addr : heightAddresses)
        SafeWrite<float>(reinterpret_cast<void*>(addr), RadarHeight);
}

Крашит как только должен появится радар
Ты указатель на переменные должен передавать, а не их значение, вроде как.
 
  • Нравится
Реакции: writeline

zytrix

Потрачен
3
1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как именно в сампе работает сериализация пакетов?(acks если быть точным)
 
  • Ха-ха
Реакции: Sargon

0xff65

Участник
36
2
Приветствую, каким образом можно реализовать что бы цикл повторялся не бесконечно, а не более 2 раз? - при нажатии на кнопку 50

C++:
#include "plugin.h"
#include "CWorld.h"
#include "CCamera.h"
#include "extensions/ScriptCommands.h"

using namespace plugin;

class Project5 {
public:
    std::unordered_map<std::uint8_t, std::vector<std::uint8_t>> vKeys = {
        {49, {31, 30}},
        {50, {22, 23, 24}},
        {51, {25, 27, 26}},
        {52, {29}},
        {53, {34, 33}}
    };

    Project5() {
        Events::drawingEvent += [this] {
            if (!isPlayerPlaying() || isInputActive())
                return;

            for (const auto& [key, weapons] : vKeys) {
                if (KeyPressed(key)) {
                    printf("Key: %d\n", key);
                    CPed* pPed = CWorld::Players[CWorld::PlayerInFocus].m_pPed;
                    std::uint32_t nHandle = CPools::GetPedRef(pPed);
                    for (std::uint8_t nWeapon : weapons) {
                        printf("Weapon: %d\n", nWeapon);
                        if (Command<Commands::HAS_CHAR_GOT_WEAPON>(nHandle, nWeapon)) {
                            Command<Commands::SET_CURRENT_CHAR_WEAPON>(nHandle, 0);
                            Command<Commands::SET_CURRENT_CHAR_WEAPON>(nHandle, nWeapon);
                            break;
                        }
                    }
                }
            }
            };
    }

    bool isPlayerPlaying() {
        return CWorld::Players[CWorld::PlayerInFocus].m_pPed != nullptr;
    }

    bool isInputActive() {
        CPed* pPed = CWorld::Players[CWorld::PlayerInFocus].m_pPed;
        return (pPed && pPed->m_pVehicle);
    }
} Project5Plugin;
 

0x9

Участник
31
7
появилась необходимось хука объектов но стандартный хук плагин сдк не работает

Код:
plugin::Events::objectRenderEvent.before += [](CEntity* o) {
        cout << "o " << o << endl;
    };
в консоль попросту не выводятся объекты
 

MSIshka

Участник
73
11
Почему не срабатывает хук чата?

C++:
using ChatFunc_t = void(__thiscall*)(void* thisptr, uint32_t type, const char* text, const char* prefix, uint32_t color, uint32_t pcolor);
ChatFunc_t g_origChatFunc = nullptr;

void __fastcall ChatDetour(void* thisptr, void* edx, uint32_t type, const char* text, const char* prefix, uint32_t color, uint32_t pcolor) {
    std::string texta = text ? text : "";
    std::string prefixa = prefix ? prefix : "";

    bool shouldHide = ProcessSpecialMessage(texta);

    if (!shouldHide) {
        std::string colorHex = ARGBtoRGB(color);
        if (type == 2) {
            std::string prefixColorHex = ARGBtoRGB(pcolor);
            texta = "{" + prefixColorHex + "}" + prefixa + " {" + colorHex + "}" + texta;
        }
        std::string finalMessage = "{" + colorHex + "}" + GetCurrentTimeString() + " " + texta;
        ExecuteJSOnCEF(finalMessage);
    }

    if (g_origChatFunc) g_origChatFunc(thisptr, type, text, prefix, color, pcolor);
}

bool InstallChatHook() {
    HMODULE samp = GetModuleHandleA("samp.dll");

    uintptr_t addr = reinterpret_cast<uintptr_t>(samp) + 0x64010;
    if (MH_CreateHook(reinterpret_cast<LPVOID>(addr), &ChatDetour, reinterpret_cast<LPVOID*>(&g_origChatFunc)) != MH_OK) return false;
    if (MH_EnableHook(reinterpret_cast<LPVOID>(addr)) != MH_OK) return false;
    return true;
}

void __fastcall ActivateChatBlocker(void* thisptr) {
    return;
}


bool InstallActivateChatHook() {
    HMODULE samp = GetModuleHandleA("samp.dll");
    if (!samp) return false;

    uintptr_t addr = reinterpret_cast<uintptr_t>(samp) + 0x657E0;

    if (MH_CreateHook(reinterpret_cast<LPVOID>(addr),
        reinterpret_cast<LPVOID>(&ActivateChatBlocker),
        nullptr) != MH_OK) return false;

    return MH_EnableHook(reinterpret_cast<LPVOID>(addr)) == MH_OK;
}

DWORD WINAPI PluginThread(LPVOID) {
    while (!GetModuleHandleA("samp.dll")) {
        Sleep(100);
    }
    LoadSettings();

    if (MH_Initialize() != MH_OK) {
        OutputDebugStringA("MinHook init failed\n");
        return 1;
    }

    if (!InstallChatHook()) {
        OutputDebugStringA("Chat hook failed\n");
    }

    if (!InstallActivateChatHook()) {
        OutputDebugStringA("Activate chat hook failed\n");
    }
    MH_Uninitialize();
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        CreateThread(nullptr, 0, PluginThread, nullptr, 0, nullptr);
        break;
    case DLL_PROCESS_DETACH:
        g_running = false;
        break;
    }
    return TRUE;
}
 

0xff65

Участник
36
2
int count = 0;

if (count > 2) return;
if(key == 50)
count++;
Не работает совсем

C++:
#include "plugin.h"
#include "CWorld.h"
#include "CCamera.h"
#include "extensions/ScriptCommands.h"

using namespace plugin;

class Project5 {
public:
    std::unordered_map<std::uint8_t, std::vector<std::uint8_t>> vKeys = {
        {49, {31, 30}},
        {50, {22, 23, 24}},
        {51, {25, 27, 26}},
        {52, {29}},
        {53, {34, 33}}
    };
    int count = 0;

    Project5() {
        Events::drawingEvent += [this] {
            if (!isPlayerPlaying() || isInputActive())
                return;

            for (const auto& [key, weapons] : vKeys) {
                if (key == 50) {
                    if (count > 2)
                        continue;
                    if (KeyPressed(key)) {
                        count++;
                        printf("Key: %d\n", key);
                        CPed* pPed = CWorld::Players[CWorld::PlayerInFocus].m_pPed;
                        std::uint32_t nHandle = CPools::GetPedRef(pPed);
                        for (std::uint8_t nWeapon : weapons) {
                            printf("Weapon: %d\n", nWeapon);
                            if (Command<Commands::HAS_CHAR_GOT_WEAPON>(nHandle, nWeapon)) {
                                Command<Commands::SET_CURRENT_CHAR_WEAPON>(nHandle, 0);
                                Command<Commands::SET_CURRENT_CHAR_WEAPON>(nHandle, nWeapon);
                                break;
                            }
                        }
                    }
                } else {
                    if (KeyPressed(key)) {
                        printf("Key: %d\n", key);
                        CPed* pPed = CWorld::Players[CWorld::PlayerInFocus].m_pPed;
                        std::uint32_t nHandle = CPools::GetPedRef(pPed);
                        for (std::uint8_t nWeapon : weapons) {
                            printf("Weapon: %d\n", nWeapon);
                            if (Command<Commands::HAS_CHAR_GOT_WEAPON>(nHandle, nWeapon)) {
                                Command<Commands::SET_CURRENT_CHAR_WEAPON>(nHandle, 0);
                                Command<Commands::SET_CURRENT_CHAR_WEAPON>(nHandle, nWeapon);
                                break;
                            }
                        }
                    }
                }
            }
        };
    }

    bool isPlayerPlaying() {
        return CWorld::Players[CWorld::PlayerInFocus].m_pPed != nullptr;
    }

    bool isInputActive() {
        CPed* pPed = CWorld::Players[CWorld::PlayerInFocus].m_pPed;
        return (pPed && pPed->m_pVehicle);
    }
} Project5Plugin;
 
Последнее редактирование:

MSIshka

Участник
73
11
Почему вместо text отправляется @text" ? Хотя через samp::RefChat()->AddMessage(0xFFFFFFFF, text.data()); отправляется всё нормально.

C++:
void __stdcall js_sendMessage(WebFrame frame, const char* name, const char** argv, int argc) {
    if (!argv || argc < 1 || !argv[0]) return;
    //namespace samp = sampapi::v037r1;
    std::string text = argv[0];
    typedef int(__stdcall * SendCommand)(const char*);
    typedef int(__stdcall * SendText)(const char*);
    static SendCommand sendCommand = (SendCommand)((DWORD)GetModuleHandleA("samp.dll") + 0x65C60);
    static SendText    sendText = (SendText)((DWORD)GetModuleHandleA("samp.dll") + 0x57F0);

    if (text[0] == '/')
        sendCommand(text.data());
    else
        sendText(text.data());
}

Как с помощью samp api использовать sampProcessChatInput?
 
Последнее редактирование: