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

Soreso

Новичок
4
0
Попытался сделать получение координат кости и рисовать на них, но чё то не то

C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#define FUNC_IsVisible 0x536BC0
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();


bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
{
    if (SUCCEEDED(SF->getRender()->BeginRender())) // если рендерер готов к рисованию
    {
        for (int i = 0; i < SAMP_MAX_PLAYERS; i++)
        {
            actor_info *actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped;
            CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);

            float posX[15], posY[15];
            int counter = 0;

            CVector vPos[15];

            for (int i = 1; i <= 53; i++)
            {
                switch (i)
                {
                case 1:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 3:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 4:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 5:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 6:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 22:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 23:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 25:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 32:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 33:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 35:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 42:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 43:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 52:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 53:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                }

            }
            if (Ped->IsOnScreen())
            {
                for (int i = 0; i <= 14; i++) SF->getGame()->convert3DCoordsToScreen(vPos[i].fX, vPos[i].fY, vPos[i].fZ, &posX[i], &posY[i]);

                SF->getRender()->DrawLine(posX[0], posY[0], posX[1], posY[1], 2, 0xFFFFFFFF);
                SF->getRender()->DrawLine(posX[0], posY[0], posX[11], posY[11], 2, 0xFFFFFFFF);
                SF->getRender()->DrawLine(posX[0], posY[0], posX[13], posY[13], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[1], posY[1], posX[2], posY[2], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[2], posY[2], posX[5], posY[5], 2, 0xFFFFFFFF);
                SF->getRender()->DrawLine(posX[2], posY[2], posX[8], posY[8], 2, 0xFFFFFFFF);
                SF->getRender()->DrawLine(posX[2], posY[2], posX[3], posY[3], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[3], posY[3], posX[4], posY[4], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[5], posY[5], posX[6], posY[6], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[6], posY[6], posX[7], posY[7], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[8], posY[8], posX[9], posY[9], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[9], posY[9], posX[10], posY[10], 2, 0xFFFFFFFF);
            }

            SF->getRender()->EndRender(); // завершаем рисование
        }
    };
    return true; // возвращаем положительный результат
};

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->getSAMP()->registerChatCommand("stillobj", sasas);
        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;
}

В чём ошибка?
 

Неадекватная сова

Известный
Проверенный
281
227
Попытался сделать получение координат кости и рисовать на них, но чё то не то

C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#define FUNC_IsVisible 0x536BC0
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();


bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
{
    if (SUCCEEDED(SF->getRender()->BeginRender())) // если рендерер готов к рисованию
    {
        for (int i = 0; i < SAMP_MAX_PLAYERS; i++)
        {
            actor_info *actorInfo = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped;
            CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actorInfo);

            float posX[15], posY[15];
            int counter = 0;

            CVector vPos[15];

            for (int i = 1; i <= 53; i++)
            {
                switch (i)
                {
                case 1:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 3:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 4:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 5:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 6:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 22:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 23:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 25:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 32:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 33:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 35:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 42:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 43:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 52:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                case 53:
                    Ped->GetTransformedBonePosition((eBone)i, &vPos[counter]);
                    counter++;
                }

            }
            if (Ped->IsOnScreen())
            {
                for (int i = 0; i <= 14; i++) SF->getGame()->convert3DCoordsToScreen(vPos[i].fX, vPos[i].fY, vPos[i].fZ, &posX[i], &posY[i]);

                SF->getRender()->DrawLine(posX[0], posY[0], posX[1], posY[1], 2, 0xFFFFFFFF);
                SF->getRender()->DrawLine(posX[0], posY[0], posX[11], posY[11], 2, 0xFFFFFFFF);
                SF->getRender()->DrawLine(posX[0], posY[0], posX[13], posY[13], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[1], posY[1], posX[2], posY[2], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[2], posY[2], posX[5], posY[5], 2, 0xFFFFFFFF);
                SF->getRender()->DrawLine(posX[2], posY[2], posX[8], posY[8], 2, 0xFFFFFFFF);
                SF->getRender()->DrawLine(posX[2], posY[2], posX[3], posY[3], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[3], posY[3], posX[4], posY[4], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[5], posY[5], posX[6], posY[6], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[6], posY[6], posX[7], posY[7], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[8], posY[8], posX[9], posY[9], 2, 0xFFFFFFFF);

                SF->getRender()->DrawLine(posX[9], posY[9], posX[10], posY[10], 2, 0xFFFFFFFF);
            }

            SF->getRender()->EndRender(); // завершаем рисование
        }
    };
    return true; // возвращаем положительный результат
};

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->getSAMP()->registerChatCommand("stillobj", sasas);
        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;
}

В чём ошибка?
Код:
            for (int i = 0; i < SAMP_MAX_PLAYERS; i++) // перебор всех игроков
            {
#pragma region ValidPlayer
                // провер¤ем каждого игрока на валидность, зону стрима
                if (SF->getSAMP()->getPlayers()->iIsListed[i] != 1) continue;
                if (SF->getSAMP()->getPlayers()->pRemotePlayer[i] == NULL) continue;
                if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData == NULL) continue;
                if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor == NULL) continue;
                if (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped == NULL) continue;
                // Если игрок не существует или не в зоне стрима, то пропускаем
#pragma endregion ValidPlayer

Регистрация callback"а в mainloop для кого?
Код:
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
 

Harryss

Участник
233
26
Функция бесконечно вызывается mainloop'ом, флудит сообщением в чат, как беру оружие в руку. Как решить, если помимо mainloop'а нет подходящих мест для ее вызова?
C++:
void gun_func(void)
{
    int current_weapon = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
    if (current_weapon == 31)
    {
        SF->getSAMP()->getChat()->AddChatMessage(-1, "{FFFFFF}• {FFDA44}[SAMPFUNCS]: {FFFFFF}M4A1.");
    }
}

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;
        init = true;   
    }
    gun_func();
}
 
Последнее редактирование:

iAmerican

Известный
Друг
612
260
Функция бесконечно вызывается mainloop'ом, флудит сообщением в чат, как беру оружие в руку. Как решить, если помимо mainloop'а нет подходящих мест для ее вызова?
C++:
int iTempCurrentWeapon = -1;[/FONT]
void gun_func(void)
{

    int current_weapon = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;

    if (current_weapon == 31)
    {
        if (iTempCurrentWeapon != 31) 
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "{FFFFFF}• {FFDA44}[SAMPFUNCS]: {FFFFFF}M4A1.");
            iTempCurrentWeapon = 31;
        }
    }
    else 
    {
        iTempCurrentWeapon = -1;
    }
}
[FONT=Tahoma]
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;
        init = true;   
    }
    gun_func();
}

Как то так вроде. Не проверял
 
  • Нравится
Реакции: Harryss

Stiopko

Известный
Проверенный
307
218
Функция бесконечно вызывается mainloop'ом, флудит сообщением в чат, как беру оружие в руку. Как решить, если помимо mainloop'а нет подходящих мест для ее вызова?
C++:
void gun_func(void)
{
    int current_weapon = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
    if (current_weapon == 31)
    {
        SF->getSAMP()->getChat()->AddChatMessage(-1, "{FFFFFF}• {FFDA44}[SAMPFUNCS]: {FFFFFF}M4A1.");
    }
}

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;
        init = true;   
    }
    gun_func();
}
Попробуй вот так, не самый лудший вариант, можеш еще задержку(GetTickCount) поставить на gun_func().
C++:
void gun_func(void)
    {
        static unsigned char current_weapon = -1;
        if (SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon != current_weapon){
            if (current_weapon == 31) SF->getSAMP()->getChat()->AddChatMessage(-1, "{FFFFFF}• {FFDA44}[SAMPFUNCS]: {FFFFFF}M4A1.");
            current_weapon = SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon;
        }
    }

    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;
            init = true;
        }
        gun_func();
    }

Подскажите, для чего нужен #pragma region, и что он делает?
 
  • Нравится
Реакции: Harryss

jenekbueno

Известный
156
69
@FYP
в собе не срабатывает деструктор, в связи с этим появляются краши при /q
знающий человек или кто нибудь ещё, скажите пожалуйста адрес на начало функции деструктора игры или сампа

то что ниже, это не то
#define SAMP_HOOKENTER_CNETGAME_DESTR 0xB2893
#define SAMP_HOOKENTER_CNETGAME_DESTR2 0xB3A32
 
Последнее редактирование:

#Rin

Известный
Всефорумный модератор
1,214
1,044
@FYP
в собе не срабатывает деструктор, в связи с этим появляются краши при /q
знающий человек или кто нибудь ещё, скажите пожалуйста адрес на начало функции деструктора игры или сампа

то что ниже, это не то
#define SAMP_HOOKENTER_CNETGAME_DESTR 0xB2893
#define SAMP_HOOKENTER_CNETGAME_DESTR2 0xB3A32
В смысле не верные? Эти адреса подходят для SAMP 0.3.7 R1, только что проверил.
 

jenekbueno

Известный
156
69
поставил на них хук и вывожу там сообщение в чат, итог такой что они постоянно флудят, как будто это Present а не деструктор )
 

woksonal

Известный
Проверенный
268
154
@FYP
в собе не срабатывает деструктор, в связи с этим появляются краши при /q
знающий человек или кто нибудь ещё, скажите пожалуйста адрес на начало функции деструктора игры или сампа

то что ниже, это не то
#define SAMP_HOOKENTER_CNETGAME_DESTR 0xB2893
#define SAMP_HOOKENTER_CNETGAME_DESTR2 0xB3A32
00823bdb 212 _doexit
 

LUCHARE

Известный
Друг
545
702
как будто это Present а не деструктор
это действительно так, если не продолжить выполнение оригинального кода после хука (деструктор будет вызваться до тех пор, пока значение глобального объекта CNetGame не станет равно нулю)
 

Harryss

Участник
233
26
Шрифты подгружаются в скомпилированный плагин? Если у человека отсутствует шрифт в директории Win, ему не придется дополнительно скачивать его?
 

#Rin

Известный
Всефорумный модератор
1,214
1,044
Шрифты подгружаются в скомпилированный плагин? Если у человека отсутствует шрифт в директории Win, ему не придется дополнительно скачивать его?
Смотря как сделаешь, можно как и с директории windows грузить, так и в сам плагин запихать шрифт.