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

Шурик

Активный
216
42
zemWnn2.jpg


Что за дичь? Происходит при запуске потока.
 

Шурик

Активный
216
42
C++:
bool IsPlayerOnScreen(int id)
{
    bool value;
    if (SF->getSAMP()->getPlayers()->IsPlayerDefined(id, true))
    {
        DWORD dwFunc = 0x536BC0;
        DWORD dwThis = (DWORD)SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTAEntity;
        _asm
        {
            mov        ecx, dwThis
            call    dwFunc
            mov        value, al
        }
    }
    return value;
}
int GetVehicleSpeed(int id)
{
    int speed;
    CVector vector;
    if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->state == 50)
    {
        vector.fX -= SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->speed[0];
        vector.fY -= SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->speed[1];
        vector.fZ -= SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->speed[2];
        speed = (int)sqrt(pow(vector.fX, 2) + pow(vector.fY, 2) + pow(vector.fZ, 2)) * 125;
    }
    return speed;
}

void thread_radar(int max)
{
    while (access)
    {
        if (SF->getGame()->isGTAMenuActive())
            continue;
        bool status = false;
        for (int id = 0; id < SAMP_MAX_PLAYERS; id++)
        {
            if (SF->getSAMP()->getPlayers()->sLocalPlayerID == id)
                continue;
            else if (SF->getSAMP()->getPlayers()->iIsListed[id] != 1)
                continue;
            else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id] == NULL)
                continue;
            else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData == NULL)
                continue;
            else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor == NULL)
                continue;
            else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->state != 50)
                continue;
            else if (SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped->vehicle->passengers[0] != SF->getSAMP()->getPlayers()->pRemotePlayer[id]->pPlayerData->pSAMP_Actor->pGTA_Ped)
                continue;
            else if(IsPlayerOnScreen(id))
            {
                int speed = GetVehicleSpeed(id);
                if (speed > max)
                {
                    status = true;
                    SF->getSAMP()->getChat()->AddChatMessage(-1, "• {FFA500}[Радиолокатор] {FFFFFF}%s превысил допустимую скорость [%i км/ч]", SF->getSAMP()->getPlayers()->GetPlayerName(id), speed);
                }
            }
        }
        Sleep(status ? 15000 : 1000);
    }
}

access = true;
P.S. Этот поток иногда включается, а иногда делает ту херь
??
 
Последнее редактирование:

w0odcr3st

Новичок
14
1
Как можно в синглплеере напрямую грузиться на карту в обход меню? Желательно с нужным сейвом, но это уже не так важно
 

nt_qwark

Участник
30
1
Может накидать кто функу спидхака? Т.е. жмем допустим ALT, и машина ускоряется не по вектору движ. а тупо вперед, по вектору направления машины
(C++/C#)
 

CleanLegend

Известный
Всефорумный модератор
474
927

CleanLegend

Известный
Всефорумный модератор
474
927
Я не хотел писать SF плагин, я хотел пример реализации посредством стандартных средств C++/C# (WinApi etc)
Сам смысл реализации показан в сурсах, для реализации без сф тебе нужно узнать адрес скорости машины.
Адреса Памяти (SA) — GTAModding.ru(http://gtamodding.ru/wiki/%D0%90%D0%B4%D1%80%D0%B5%D1%81%D0%B0_%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%B8_(SA))
 

SR_team

like pancake
BH Team
4,707
6,347
Я делаю так:
C++:
auto id = CallFunc::thiscall<int>(pPlayerPool, g_handle.dwSAMP + 0x10420, ped);
Но ты можешь делать так:
C++:
using namespace std::placeholders;
std::function<WORD(CPed *ped)> stPlayerPool__getPlayerIdByCPed = std::bind((WORD(__thiscall*)(stPlayerPool*, CPed*))((DWORD)GetModuleHandle("samp.dll") + 0x10420), pPlayerPool, _1);
// После чего вызываешь функцию очень просто:
auto id = stPlayerPool__getPlayerIdByCPed(ped);
 
  • Нравится
Реакции: C&J

_Vine_

Активный
154
57
Почему при создании нового потока с бесконечным циклом сильно нагружается ЦП и как это исправить?
При одном потоке нагружается до 50%, при двух до 100%
C++:
#define  _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#pragma comment(lib, "User32.lib")
SAMPFUNCS *SF = new SAMPFUNCS();

void ThreadOne()
{
    while (true)
    {

    }
}
void ThreadTwo()
{
    while (true)
    {

    }
}

void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr || GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME || !SF->getSAMP()->IsInitialized())
            return;
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadOne, 0, 0, 0);
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadTwo, 0, 0, 0);
        init = true;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved) {
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}