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

Vintik

Мечтатель
Проверенный
1,411
851
Спасибо за всё, но я так нифига и не понял.

Объясняю свою ситуацию. Я прочитал на различных форумах, как искать базовый адрес (ну + смещения и указатели) и начал искать базовый адрес информации игрока (SAMP), чтобы он него оттолкнуться и найти твой текущий ID (и я его нашёл). Выглядит оно примерно так (в кавычках БА): [samp.dll + 0x151434] + 0x2F1C -> указатель на ID. Теперь хочу написать на С++ программу, которая будет искать мой ID и сохранять его в какую-либо переменную (через ReadProcessMemory). Суть в том, что надо искать смещение для "samp.dll". Пожалуйста, покажите какой-либо готовый код (он же там не длинный), либо функцию, которая, зная хэндл ГТАшки, кидает мне БА сампа.длл. Буду очень благодарен =)
UP
 

_Vine_

Активный
154
57
C++:
bool CALLBACK incomingRPC(stRakNetHookParams * params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        size_t len;
        DWORD color;
        char zq_message[256];
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(color);
        params->bitStream->Read(len);
        params->bitStream->Read(zq_message, len);
        params->bitStream->ResetReadPointer();
        zq_message[len] = '\0';

        // strstr(zq_message, "[Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!")
        if (!strcmp(zq_message, "[Информация] {FFFFFF}Поздравляю! Теперь этот дом"))
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Вы купили дом за 1.3124 мс.");
        }
    };
    return true;
}
не работает, сообщение 100% правильное
Вроде бы код правильный. Проверь, вызывается ли incomingRPC вовсе.
 

Stiopko

Известный
Проверенный
307
218
В сф некоторых структурах есть массив matrix что в нем, для чего он?
 

Cake_

Известный
Проверенный
263
313
В сф некоторых структурах есть массив matrix что в нем, для чего он?
Это матрица, которая хранит в себе числовые характеристики, она представлена в виде 2 х мерной структуры, в сампе в ней хранятся всякие позиции/углы и т.д

В сф некоторых структурах есть массив matrix что в нем, для чего он?
Можно сказать классификация, насколько я помню
 
  • Нравится
Реакции: Stiopko

Stiopko

Известный
Проверенный
307
218
upload_2019-6-18_12-55-57.png

как можно узнать ModelID котороя приходит в вот этом(верхнем) пакете, но не по средствам перехвата RPC а через структуры
C++:
SAMPFUNCS, SF->getSAMP()->getInfo()->pPools->pObject->object[s]->iModel
вот это не то там хранится id модели которая приходит в вот этом пакете я спрашиваю потому что ModelID одинаковая а объекты разные потому что приходит пакет SetPlayerObjectMaterial, можно как то определить текущий modelID
upload_2019-6-18_12-56-35.png
 

atizoff

приобретаю кашель за деньги
Проверенный
1,295
1,177
Здрасте, как уменьшить sliderint?
upload_2019-6-18_19-10-49.png


C++:
ImGui::SliderInt("Fov", &Cvars::fov, 90, 180);
 

astap_

Известный
Всефорумный модератор
625
593
есть ли в собейте функция чтобы узнать ид игрока по нику? или самому сделать
в собейте нет. самому сделать несложно.
Код:
int getPlayerIDFromName(char *PlayerName)
{
    for (int id = 0; id <= SAMP_MAX_PLAYERS; id++)
    {
        if (strcmp(getPlayerName(id), PlayerName) != 0)
            continue;
        else return id;
    }
    return NULL;
}

const char *getPlayerName(int iPlayerID) //  samp.cpp
{
    if (g_Players == NULL || iPlayerID < 0 || iPlayerID > SAMP_MAX_PLAYERS)
        return NULL;

    if (iPlayerID < 0 || iPlayerID > SAMP_MAX_PLAYERS)
        return NULL;

    if (iPlayerID == g_Players->sLocalPlayerID)
        return g_Players->strLocalPlayerName.c_str();

    if (g_Players->pRemotePlayer[iPlayerID] == NULL)
        return NULL;

    return g_Players->pRemotePlayer[iPlayerID]->strPlayerName.c_str();
}
 
  • Нравится
Реакции: -raymond-

LUCHARE

Известный
Друг
545
687
как можно узнать ModelID котороя приходит в вот этом(верхнем) пакете, но не по средствам перехвата RPC а через структуры
без хуков никак. на основе пришедшего идентификатора модели сразу же создается текстура и информация о нем нигде не сохраняется
 
  • Нравится
Реакции: Stiopko

-raymond-

Известный
110
9
в собейте нет. самому сделать несложно.
Код:
int getPlayerIDFromName(char *PlayerName)
{
    for (int id = 0; id <= SAMP_MAX_PLAYERS; id++)
    {
        if (strcmp(getPlayerName(id), PlayerName) != 0)
            continue;
        else return id;
    }
    return NULL;
}

const char *getPlayerName(int iPlayerID) //  samp.cpp
{
    if (g_Players == NULL || iPlayerID < 0 || iPlayerID > SAMP_MAX_PLAYERS)
        return NULL;

    if (iPlayerID < 0 || iPlayerID > SAMP_MAX_PLAYERS)
        return NULL;

    if (iPlayerID == g_Players->sLocalPlayerID)
        return g_Players->strLocalPlayerName.c_str();

    if (g_Players->pRemotePlayer[iPlayerID] == NULL)
        return NULL;

    return g_Players->pRemotePlayer[iPlayerID]->strPlayerName.c_str();
}
мог бы не расписывать, сам знаю что парсить всех игроков надо, но все равно благодарю
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
597
810
При чём тут гуй к хукам ракнета?


Собейт установлен?

Почему тут просто "этот дом"? strcmp не ищет подстроки если чо я же писал тебе.
Скопируй полностью строку из chatlog.txt
Собейт не установлен, "этот дом" потому что пробовал полностью - тоже не работает.
 
  • Нравится
Реакции: Fomikus

Cake_

Известный
Проверенный
263
313
Собейт не установлен, "этот дом" потому что пробовал полностью - тоже не работает.
Как оно должно заработать если строка не полная ?! Уже сколько раз отвечал как работает функция strcmp и strstr
У кого-то руки не от туда растут, скорее всего

Собейт не установлен, "этот дом" потому что пробовал полностью - тоже не работает.
Приложи фулл код плагина
 

Receiver

🥩 Передай meat, всё в скип, я в темпе
Проверенный
597
810
Как оно должно заработать если строка не полная ?! Уже сколько раз отвечал как работает функция strcmp и strstr
У кого-то руки не от туда растут, скорее всего


Приложи фулл код плагина
C++:
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>

#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"

SAMPFUNCS *SF = new SAMPFUNCS();

bool CALLBACK incomingRPC(stRakNetHookParams * params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        size_t len;
        DWORD color;
        char message[256];
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(color);
        params->bitStream->Read(len);
        params->bitStream->Read(message, len);
        params->bitStream->ResetReadPointer();

        SF->getSAMP()->getChat()->AddChatMessage(-1, "DOM ne BAYED");
        // [Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!
        if (strcmp(message, "[Информация] {FFFFFF}Поздравляю! Теперь этот дом ваш") == 0)
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "DOM BAYED");
            char result[12];
            strcat(message, " [1.9741]");
            return 1;
        }
    };
    return 1;
}

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;
        if (!SF->getSAMP()->IsInitialized())
            return;

        SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
       

        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

всегда дом не байед блеать
 
  • Нравится
Реакции: Fomikus

_Vine_

Активный
154
57
C++:
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>

#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"

SAMPFUNCS *SF = new SAMPFUNCS();

bool CALLBACK incomingRPC(stRakNetHookParams * params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        size_t len;
        DWORD color;
        char message[256];
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(color);
        params->bitStream->Read(len);
        params->bitStream->Read(message, len);
        params->bitStream->ResetReadPointer();

        SF->getSAMP()->getChat()->AddChatMessage(-1, "DOM ne BAYED");
        // [Информация] {FFFFFF}Поздравляю! Теперь этот бизнес ваш!
        if (strcmp(message, "[Информация] {FFFFFF}Поздравляю! Теперь этот дом ваш") == 0)
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "DOM BAYED");
            char result[12];
            strcat(message, " [1.9741]");
            return 1;
        }
    };
    return 1;
}

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;
        if (!SF->getSAMP()->IsInitialized())
            return;

        SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
      

        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    switch (dwReasonForCall)
    {
        case DLL_PROCESS_ATTACH:
            SF->initPlugin(mainloop, hModule);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

всегда дом не байед блеать
Значит не правильная строка о покупке дома. Попробуй выводить переменную message в чат и копировать строку о покупке дома из нее