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

Roger571

Известный
58
31

Не особо понимаю с похмелья что тебе требуется в итоге, но попробуй

Вычисляешь угол между объектами с помощью atan2 и переводишь в кватернион.

C++:
void QuaternionFromAngle(float *fQuaternion, float fAngle)
{
    fAngle = DEGTORAD(fAngle);
    float fMatrix[3][3], c = cos(fAngle), s = sin(fAngle);

    // QuaternionRotateZ
    fMatrix[0][0] = c;
    fMatrix[0][1] = s;
    fMatrix[0][2] = 0.0;

    fMatrix[1][0] = -s;
    fMatrix[1][1] = c;
    fMatrix[1][2] = 0.0;

    fMatrix[2][0] = 0.0;
    fMatrix[2][1] = 0.0;
    fMatrix[2][2] = 1.0;

    // GetQuaternionFromMatrix
    fQuaternion[0] = sqrt(Max((float)0, 1.0f + fMatrix[0][0] + fMatrix[1][1] + fMatrix[2][2])) * 0.5f;
    fQuaternion[1] = sqrt(Max((float)0, 1.0f + fMatrix[0][0] - fMatrix[1][1] - fMatrix[2][2])) * 0.5f;
    fQuaternion[2] = sqrt(Max((float)0, 1.0f - fMatrix[0][0] + fMatrix[1][1] - fMatrix[2][2])) * 0.5f;
    fQuaternion[3] = sqrt(Max((float)0, 1.0f - fMatrix[0][0] - fMatrix[1][1] + fMatrix[2][2])) * 0.5f;

    fQuaternion[1] = static_cast < float > (_copysign(fQuaternion[1], fMatrix[2][1] - fMatrix[1][2]));
    fQuaternion[2] = static_cast < float > (_copysign(fQuaternion[2], fMatrix[0][2] - fMatrix[2][0]));
    fQuaternion[3] = static_cast < float > (_copysign(fQuaternion[3], fMatrix[1][0] - fMatrix[0][1]));
}

Пробуй, вроде должно работать
 

ishi

Известный
493
110
Есть функция для поиска последовательности строчных символов:
C++:
int findstring(void* where_, char* what, int whereSize)
{
    void* temp = malloc(strlen(what) + 1);
    int iterator = 0;
    char* yo = new char[strlen(what) + 1];
    yo = (char*)temp;
    char* tempptr = static_cast<char*>(where_);
    while (iterator <= whereSize)
    {
        memcpy(temp, tempptr + iterator, strlen(what));
        yo[strlen(what) + 1] = 0;
        if (strcmp((char*)temp, what) == 0)
        {
            free(temp);
            //delete yo;
            return iterator;
        }
            iterator++;
    }
    return -1;
}
Она копирует из области поиска по n байт длиною равной длине искомого, добавляет на конец 0 и сравнивает. И так, пока не кончится буфер.
Однако, я её раз 10 наверное прогнал по циклу вызвов с одинаковыми параметрами, и примерно 33-39 из 100 вызовов она возвращает ошибку(-1). Лично я тут не вижу ошибки в логике, но результат говорит об обратном.
Помогите понять, где косяк, плиз.
 

rraggerr

проверенный какой-то
1,626
848
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Есть функция для поиска последовательности строчных символов:
C++:
int findstring(void* where_, char* what, int whereSize)
{
    void* temp = malloc(strlen(what) + 1);
    int iterator = 0;
    char* yo = new char[strlen(what) + 1];
    yo = (char*)temp;
    char* tempptr = static_cast<char*>(where_);
    while (iterator <= whereSize)
    {
        memcpy(temp, tempptr + iterator, strlen(what));
        yo[strlen(what) + 1] = 0;
        if (strcmp((char*)temp, what) == 0)
        {
            free(temp);
            //delete yo;
            return iterator;
        }
            iterator++;
    }
    return -1;
}
Она копирует из области поиска по n байт длиною равной длине искомого, добавляет на конец 0 и сравнивает. И так, пока не кончится буфер.
Однако, я её раз 10 наверное прогнал по циклу вызвов с одинаковыми параметрами, и примерно 33-39 из 100 вызовов она возвращает ошибку(-1). Лично я тут не вижу ошибки в логике, но результат говорит об обратном.
Помогите понять, где косяк, плиз.
это проверка на то что "слово" есть в строчке "какое то слово" ?
 

ШPEK

Известный
1,474
525
Lua:
#include "stdafx.h"
#include <Windows.h>
#include <process.h>
#include <stdio.h>


#define REGISTER_CLIENT_COMMAND 0x65AC0
#define ADD_CHAT_MESSAGE 0x64520
#define pChat 0x21A0E4
#define pInput 0x21A0E8
#define memory_info 0x8A5A80
DWORD dwSamp;

void AddChatMessage(const char* msg)
{
    ((void(__thiscall *)(DWORD str, const char* text))(dwSamp + ADD_CHAT_MESSAGE))(*(DWORD*)(dwSamp + pChat), msg);
}

bool isInit()
{
    return ((bool(__thiscall *)())(dwSamp + 0x9BF70))();
}

void AddClientCommand(const char* cmd, void* func)
{
    ((void (__thiscall *)(DWORD str, const char* cmd, void* func))(dwSamp + REGISTER_CLIENT_COMMAND))(*(DWORD*)(dwSamp + pInput), cmd, func);
}

void core()
{
    char buf[40];
    sprintf_s(buf, "%u", *(DWORD*)(dwSamp + memory_info));
    AddChatMessage(buf);
}

void attach()
{
    dwSamp = (DWORD)GetModuleHandle(L"samp.dll");
    while (!dwSamp) {
        dwSamp = (DWORD)GetModuleHandle(L"samp.dll");
        Sleep(30);
    }
    dwSamp = (DWORD)GetModuleHandle(L"samp.dll");
    AddClientCommand("getmem", core);
}


BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) _beginthread((_beginthread_proc_type)attach, NULL, NULL);
    return TRUE;
}
Крашит игру. в MoonLoader'e проверял вызов AddChatMessage, всё работало. AddChatMessage и AddClientMessage -
это методы класса.
 

ishi

Известный
493
110
это проверка на то что "слово" есть в строчке "какое то слово" ?
Не совсем. Это для поиска в буфере, содержимое которого может не соответствовать строчному типу: на конце может не быть нуля, а сами символы могут не соответствовать кодировке искомого. Короче говоря: поиск в бинарном файле.


чем strstr не устраивает?
Не хочет искать дальше первого \0
 

ishi

Известный
493
110
Обновляю запрос.
Есть функция для поиска последовательности строчных символов:
C++:
int findstring(void* where_, char* what, int whereSize)
{
    void* temp = malloc(strlen(what) + 1);
    int iterator = 0;
    char* yo = new char[strlen(what) + 1];
    yo = (char*)temp;
    char* tempptr = static_cast<char*>(where_);
    while (iterator <= whereSize)
    {
        memcpy(temp, tempptr + iterator, strlen(what));
        yo[strlen(what) + 1] = 0;
        if (strcmp((char*)temp, what) == 0)
        {
            free(temp);
            //delete yo;
            return iterator;
        }
            iterator++;
    }
    return -1;
}
Она копирует из области поиска по n байт длиною равной длине искомого, добавляет на конец 0 и сравнивает. И так, пока не кончится буфер.
Однако, я её раз 10 наверное прогнал по циклу вызвов с одинаковыми параметрами, и примерно 33-39 из 100 вызовов она возвращает ошибку(-1). Лично я тут не вижу ошибки в логике, но результат говорит об обратном.
Помогите понять, где косяк, плиз.
В yo была утечка, исправив слепил это:
C++:
int findstring(void* where_, char* what, int whereSize)
{
    void* temp = malloc(strlen(what) + 1);
    int iterator = 0;
    char* yo = static_cast<char*>(temp) + strlen(what) + 1;
    char* tempptr = static_cast<char*>(where_);
    while (iterator <= whereSize)
    {
        memcpy(temp, tempptr + iterator, strlen(what));
        *yo = 0;
        if (strcmp((char*)temp, what) == 0)
        {
            free(temp);
            return iterator;
        }
            iterator++;
    }
    return -1;
}
Теперь из десяти запусков по 100 вызовов, 8-9 запусков идут без ошибок, а конкретно: ошибка вылетает первые <10 вызовов в первом, реже - во втором цикле вызовов.
Проблема определённо связана с памятью, но эта рандомность ошибок ставит меня в ступор. Где ещё? Что конфликтует? Неясная поляна.
Запрос помощи всё ещё актуален.
 

ALF

Известный
Проверенный
320
539
Обновляю запрос.
В yo была утечка, исправив слепил это:
C++:
int findstring(void* where_, char* what, int whereSize)
{
    void* temp = malloc(strlen(what) + 1);
    int iterator = 0;
    char* yo = static_cast<char*>(temp) + strlen(what) + 1;
    char* tempptr = static_cast<char*>(where_);
    while (iterator <= whereSize)
    {
        memcpy(temp, tempptr + iterator, strlen(what));
        *yo = 0;
        if (strcmp((char*)temp, what) == 0)
        {
            free(temp);
            return iterator;
        }
            iterator++;
    }
    return -1;
}
Теперь из десяти запусков по 100 вызовов, 8-9 запусков идут без ошибок, а конкретно: ошибка вылетает первые <10 вызовов в первом, реже - во втором цикле вызовов.
Проблема определённо связана с памятью, но эта рандомность ошибок ставит меня в ступор. Где ещё? Что конфликтует? Неясная поляна.
Запрос помощи всё ещё актуален.
в отладчике посмотри
 

_Vine_

Активный
154
57
Обновляю запрос.
В yo была утечка, исправив слепил это:
C++:
int findstring(void* where_, char* what, int whereSize)
{
    void* temp = malloc(strlen(what) + 1);
    int iterator = 0;
    char* yo = static_cast<char*>(temp) + strlen(what) + 1;
    char* tempptr = static_cast<char*>(where_);
    while (iterator <= whereSize)
    {
        memcpy(temp, tempptr + iterator, strlen(what));
        *yo = 0;
        if (strcmp((char*)temp, what) == 0)
        {
            free(temp);
            return iterator;
        }
            iterator++;
    }
    return -1;
}
Теперь из десяти запусков по 100 вызовов, 8-9 запусков идут без ошибок, а конкретно: ошибка вылетает первые <10 вызовов в первом, реже - во втором цикле вызовов.
Проблема определённо связана с памятью, но эта рандомность ошибок ставит меня в ступор. Где ещё? Что конфликтует? Неясная поляна.
Запрос помощи всё ещё актуален.
У тебя 3 ошибки в коде.
C++:
char* yo = static_cast<char*>(temp) + strlen(what) + 1;
+ 1 не нужен, так ты будешь получать указатель на конец строки + 1, а это не только может приводить к неправильному результату функции, но и изменять данные в чужой выделенной памяти и приводить к сбою программы
C++:
while (iterator <= whereSize)
Тут должен быть оператор <, а не <=, ибо так ты будешь сверять символы включая терминальный ноль, а это приведет к неправильному результату
И перед return -1 ты забыл освобождать выделенную память temp
То есть твоя функция должна выглядеть так
C++:
int findstring(void* where_, char* what, int whereSize) {
    void* temp = malloc(strlen(what) + 1);
    int iterator = 0;
    char* yo = static_cast<char*>(temp) + strlen(what);
    char* tempptr = static_cast<char*>(where_);
    while (iterator < whereSize) {
        memcpy(temp, tempptr + iterator, strlen(what));
        *yo = 0;
        if (strcmp((char*)temp, what) == 0) {
            free(temp);
            return iterator;
        }
        iterator++;
    }
    free(temp);
    return -1;
}

И вообще, можно было бы реализовать функцию и без промежуточного буфера temp, не знаю зачем ты это сделал.
Или вовсе использовать strstr, раз уже используешь strcmp.
C++:
int findstring(const char *str1, const char *str2) {
    int str1_len = strlen(str1);
    int str2_len = strlen(str2);
    for (int i = 0; i < str1_len; i++) {
        bool compare = true;
        for (int k = 0; i < str2_len; k++) {
            if (str1[i + k] != str2[k]) {
                compare = false;
                break;
            }
        }
        if (compare)
            return i;
    }
    return -1;
}
 

enziweee

Участник
28
33
в общем проблема, пытаюсь отрендерить линию от головы до пуза, в итоге линия строится нормально только на первого попавшегося в радиусе стрима актера, на остальных выходит кривота, как исправлять?

C++:
for (int i = 0; i < MAX_PLAYERS; i++)
        {
            CPlayerPool * pPlayerPool = pNetGame->GetPlayerPool();
            CRemotePlayer * pRemote;

            if (pPlayerPool->GetPlayer(i))
            {
                pRemote = pPlayerPool->GetPlayer(i);
                if (pRemote->m_pPed)
                {
                    SAMP::CPed * pRemotePed = pRemote->m_pPed; // Handle REMOTE Player
                    SAMP::CPed * pLocalPed = SAMP::pGame->m_pPlayerPed; // Handle LOCAL Player

                    if (!pRemotePed->IsDead() || !pLocalPed->IsDead())
                    {
                        SAMP::CVector  pRemoteFirstBoneVector;
                        pRemotePed->GetBonePosition(BONE_HEAD, &pRemoteFirstBoneVector);

                        SAMP::CVector pRemoteSecondBoneVector;
                        pRemotePed->GetBonePosition(BONE_SPINE1, &pRemoteSecondBoneVector);

                        D3DXVECTOR3 pRemoteFirstBoneDX;
                        pRemoteFirstBoneDX.x = pRemoteFirstBoneVector.x;
                        pRemoteFirstBoneDX.y = pRemoteFirstBoneVector.y;
                        pRemoteFirstBoneDX.z = pRemoteFirstBoneVector.z;

                        D3DXVECTOR3 pRemoteSecondBoneDX;
                        pRemoteSecondBoneDX.x = pRemoteSecondBoneVector.x;
                        pRemoteSecondBoneDX.y = pRemoteSecondBoneVector.y;
                        pRemoteSecondBoneDX.z = pRemoteSecondBoneVector.z;

                        D3DXVECTOR3 firstCalculated;
                        D3DXVECTOR3 secondCalculated;

                        CalcScreenCoors(&pRemoteFirstBoneDX, &firstCalculated);
                        CalcScreenCoors(&pRemoteSecondBoneDX, &secondCalculated);

                        draw.Line(firstCalculated.x, firstCalculated.y, secondCalculated.x, secondCalculated.y, D3DCOLOR_ARGB(255, 255, 255, 255));
                        //draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
                    }
                }
            }
        }
Eu-xFuZUfxU.jpg
 

rraggerr

проверенный какой-то
1,626
848
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
в общем проблема, пытаюсь отрендерить линию от головы до пуза, в итоге линия строится нормально только на первого попавшегося в радиусе стрима актера, на остальных выходит кривота, как исправлять?

C++:
for (int i = 0; i < MAX_PLAYERS; i++)
        {
            CPlayerPool * pPlayerPool = pNetGame->GetPlayerPool();
            CRemotePlayer * pRemote;

            if (pPlayerPool->GetPlayer(i))
            {
                pRemote = pPlayerPool->GetPlayer(i);
                if (pRemote->m_pPed)
                {
                    SAMP::CPed * pRemotePed = pRemote->m_pPed; // Handle REMOTE Player
                    SAMP::CPed * pLocalPed = SAMP::pGame->m_pPlayerPed; // Handle LOCAL Player

                    if (!pRemotePed->IsDead() || !pLocalPed->IsDead())
                    {
                        SAMP::CVector  pRemoteFirstBoneVector;
                        pRemotePed->GetBonePosition(BONE_HEAD, &pRemoteFirstBoneVector);

                        SAMP::CVector pRemoteSecondBoneVector;
                        pRemotePed->GetBonePosition(BONE_SPINE1, &pRemoteSecondBoneVector);

                        D3DXVECTOR3 pRemoteFirstBoneDX;
                        pRemoteFirstBoneDX.x = pRemoteFirstBoneVector.x;
                        pRemoteFirstBoneDX.y = pRemoteFirstBoneVector.y;
                        pRemoteFirstBoneDX.z = pRemoteFirstBoneVector.z;

                        D3DXVECTOR3 pRemoteSecondBoneDX;
                        pRemoteSecondBoneDX.x = pRemoteSecondBoneVector.x;
                        pRemoteSecondBoneDX.y = pRemoteSecondBoneVector.y;
                        pRemoteSecondBoneDX.z = pRemoteSecondBoneVector.z;

                        D3DXVECTOR3 firstCalculated;
                        D3DXVECTOR3 secondCalculated;

                        CalcScreenCoors(&pRemoteFirstBoneDX, &firstCalculated);
                        CalcScreenCoors(&pRemoteSecondBoneDX, &secondCalculated);

                        draw.Line(firstCalculated.x, firstCalculated.y, secondCalculated.x, secondCalculated.y, D3DCOLOR_ARGB(255, 255, 255, 255));
                        //draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
                    }
                }
            }
        }
Eu-xFuZUfxU.jpg
попробуй добавить проверку на
if (CalcScreenCoors)
и на
GetBonePosition
и еще у тебя ошибки, кароче на
C++:
if (pLocalPed->IsDead())
return;
for (int i = 0; i <= 1000; i++)
        {
            CPlayerPool * pPlayerPool = pNetGame->GetPlayerPool();
            CRemotePlayer * pRemote;
if (pPlayerPool && pPlayerPool->GetPlayer(i))
            {
                pRemote = pPlayerPool->GetPlayer(i);
                if (pRemote->m_pPed)
                {
                    SAMP::CPed * pRemotePed = pRemote->m_pPed; // Handle REMOTE Player
                    SAMP::CPed * pLocalPed = SAMP::pGame->m_pPlayerPed; // Handle LOCAL Player

                    if (pRemotePed && pLocalPed && !pRemotePed->IsDead() )
                    {
                        SAMP::CVector  pRemoteFirstBoneVector;
                        if (!pRemotePed->GetBonePosition(BONE_HEAD, &pRemoteFirstBoneVector))
continue;

                        SAMP::CVector pRemoteSecondBoneVector;
                       if (!pRemotePed->GetBonePosition(BONE_SPINE1, &pRemoteSecondBoneVector))
                           continue;

                        D3DXVECTOR3 pRemoteFirstBoneDX;
                        pRemoteFirstBoneDX.x = pRemoteFirstBoneVector.x;
                        pRemoteFirstBoneDX.y = pRemoteFirstBoneVector.y;
                        pRemoteFirstBoneDX.z = pRemoteFirstBoneVector.z;

                        D3DXVECTOR3 pRemoteSecondBoneDX;
                        pRemoteSecondBoneDX.x = pRemoteSecondBoneVector.x;
                        pRemoteSecondBoneDX.y = pRemoteSecondBoneVector.y;
                        pRemoteSecondBoneDX.z = pRemoteSecondBoneVector.z;

                        D3DXVECTOR3 firstCalculated;
                        D3DXVECTOR3 secondCalculated;

                       if (!CalcScreenCoors(&pRemoteFirstBoneDX, &firstCalculated))
                           continue;
                       if (CalcScreenCoors(&pRemoteSecondBoneDX, &secondCalculated))
                           continue;

                        draw.Line(firstCalculated.x, firstCalculated.y, secondCalculated.x, secondCalculated.y, D3DCOLOR_ARGB(255, 255, 255, 255));
                        //draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
                    }
                }
            }
        }