ped on screen

Smeruxa

Известный
Автор темы
1,303
683
sampfuncs 5.5.1
Я забадался, не знаю как проверить, находится ли игрок на экране, или нет, подскажите пожалуйста
Ошибок в этом коде компилятор не находит, но при запуске функции - крашит игру, не знаю как правильно найти педа
проблема в строчках 11-14
C++:
for (int i = 0; i <= SF->getSAMP()->getPlayers()->maxPlayerID; i++) {
                if (SF->getSAMP()->getPlayers()->IsPlayerDefined(i, true)) {
                    D3DCOLOR player_color = SF->getSAMP()->getPlayers()->GetPlayerColor(i);
                    OnFootData* foot = SF->getSAMP()->getPlayers()->GetOnFootData(i);
                    CVector player_original = { foot->position[0], foot->position[1], foot->position[2] };
                    CVector my_pos = *PEDSELF->GetPosition();
                    CVector player_converted;
                    CVector my_converted;
                    SF->getGame()->convert3DCoordsToScreen(player_original.fX, player_original.fY, player_original.fZ, &player_converted.fX, &player_converted.fY);
                    SF->getGame()->convert3DCoordsToScreen(my_pos.fX, my_pos.fY, my_pos.fZ, &my_converted.fX, &my_converted.fY);
                    actor_info* actor = SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer[i]->data->sampActor->gtaPed;
                    if (actor != nullptr) {
                        CPed* Ped = GAME->GetPools()->GetPed((DWORD*)actor);
                        if (Ped->IsOnScreen())
                            SF->getRender()->DrawLine(my_converted.fX, my_converted.fY, player_converted.fX, player_converted.fY, 1, (player_color & 0x00FFFFFF) | (255 << 24));
                    }
                }
            }
 
Решение
фунции такой нет ConvertGameToScreen, немного переписал твой код на мой sampfuncs, внимание на 10 строку

конвертирование это "кастом" функция была. и вопрос что не так с 10 строкой, а и имгуи рендер можеш заменить сф версию, я так сделал потому что мне удобнее было

UPD: я понял о чем ты, вот функция

C++:
CVector ConvertGametoScreen(CVector WorldPosition) {
    CVector ScreenPosition;
    D3DXMATRIX m((float*)(0xB6FA2C));
    DWORD* dwLenfX = (DWORD*)(0xC17044);
    DWORD* dwLenfY = (DWORD*)(0xC17048);

    ScreenPosition.fX = (WorldPosition.fZ * m._31) + (WorldPosition.fY * m._21) + (WorldPosition.fX * m._11) + m._41;
    ScreenPosition.fY = (WorldPosition.fZ * m._32) + (WorldPosition.fY * m._22) + (WorldPosition.fX * m._12) +...

Smeruxa

Известный
Автор темы
1,303
683
попробуй убрать пробел 11 и 13 строчка
чтоб было так
CPed*Ped = GAME->GetPools()->GetPed((DWORD*)actor);
actor_info*actor = SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer->data->sampActor->gtaPed;
if (actor != nullptr) {
не знаю чем оно должно было помочь, но я попробовал - 0 разницы

@MISTER_GONWIK
 
Последнее редактирование:

Smeruxa

Известный
Автор темы
1,303
683
Ну так ты проверь не выходят ли screen координаты за рамки размера окна гта
а вообще подключи дебаггер и посмотри в чем именно проблема
Я уже это делал, оно не работает, рисует тех, кого нет
В этом коде pointX, pointY это экранные координаты игроков
C++:
if (pointX >= 0 && pointX < screenWidth && pointY >= 0 && pointY < screenHeight)
 

Z3roKwq

Известный
294
157
работает со всем (игроки, тачки, объекты и подобное)

C++:
if (npcScreenPosition.z > 1.f)
   // на экране
else
   // за пределами экрана

UPD а крашит скорее всего из за того что ты пытаешся получить пед не существуещего игрока, вроде как то так надо "SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer(тут должны быть квадратные скобочки с i, но они пропадают) != nullptr", непомню уже и наверно лучше делать проверку как я написал, вместо SF->getSAMP()->getPlayers()->IsPlayerDefined(i, true), потому что лично у меня крашило из за того что это проверка не работает
 
Последнее редактирование:

Smeruxa

Известный
Автор темы
1,303
683
работает со всем (игроки, тачки, объекты и подобное)

C++:
if (npcScreenPosition.z > 1.f)
   // на экране
else
   // за пределами экрана

UPD а крашит скорее всего из за того что ты пытаешся получить пед не существуещего игрока, вроде как то так надо "SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer(тут должны быть квадратные скобочки с i, но они пропадают) != nullptr", непомню уже и наверно лучше делать проверку как я написал, вместо SF->getSAMP()->getPlayers()->IsPlayerDefined(i, true), потому что лично у меня крашило из за того что это проверка не работает
screen position с координатой Z???

UPD сделал как ты сказал, проверку на ремот поставил, по итогу у меня ни к одному педу линия не проводится
C++:
RemotePlayer* actor = SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer[i];
                    if (actor != nullptr) {
                        actor_info* new_actor = actor->data->sampActor->gtaPed;
                        if (new_actor != nullptr) {
                            CPed* Ped = GAME->GetPools()->GetPed((DWORD*)new_actor);
                            if (Ped != nullptr && Ped->IsOnScreen())
                                SF->getRender()->DrawLine(my_converted.fX, my_converted.fY, player_converted.fX, player_converted.fY, 1, (player_color & 0x00FFFFFF) | (255 << 24));
                        }
                    }
 
Последнее редактирование:

Z3roKwq

Известный
294
157
screen position с координатой Z???
давно с сф не работал, получилось, что получилось


C++:
void renderPlayers() {
    for (int i = 0; i < 1004; i++) {
        if (SF->getSAMP()->getPlayers()->isListed[i] && SF->getSAMP()->getPlayers()->remotePlayerInfo[i] != nullptr && i != SF->getSAMP()->getPlayers()->localPlayerInfo.id) {
            CVector myPedPositionWorld = *PEDSELF->GetPosition();
            CVector pedPositionWorld = *reinterpret_cast<CVector*>(SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos);
            CVector myPedPositionScreen = ConvertGametoScreen(myPedPositionWorld);
            CVector pedPositionScreen = ConvertGametoScreen(pedPositionWorld);

            if (pedPositionScreen.fZ > 1.f) {
                ImGui::GetBackgroundDrawList()->AddLine({ myPedPositionScreen.fX, myPedPositionScreen.fY }, { pedPositionScreen.fX, pedPositionScreen.fY }, -1);
            }
        }
    }
}
 

Smeruxa

Известный
Автор темы
1,303
683
давно с сф не работал, получилось, что получилось


C++:
void renderPlayers() {
    for (int i = 0; i < 1004; i++) {
        if (SF->getSAMP()->getPlayers()->isListed[i] && SF->getSAMP()->getPlayers()->remotePlayerInfo[i] != nullptr && i != SF->getSAMP()->getPlayers()->localPlayerInfo.id) {
            CVector myPedPositionWorld = *PEDSELF->GetPosition();
            CVector pedPositionWorld = *reinterpret_cast<CVector*>(SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos);
            CVector myPedPositionScreen = ConvertGametoScreen(myPedPositionWorld);
            CVector pedPositionScreen = ConvertGametoScreen(pedPositionWorld);

            if (pedPositionScreen.fZ > 1.f) {
                ImGui::GetBackgroundDrawList()->AddLine({ myPedPositionScreen.fX, myPedPositionScreen.fY }, { pedPositionScreen.fX, pedPositionScreen.fY }, -1);
            }
        }
    }
}
фунции такой нет ConvertGameToScreen, немного переписал твой код на мой sampfuncs, внимание на 10 строку
C++:
for (int i = 0; i < 1004; i++) {
                if (SF->getSAMP()->getPlayers()->remotePlayersInfo.isListed[i] && SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer[i] != nullptr && i != SF->getSAMP()->getPlayers()->localPlayerInfo.id) {
                    CVector myPedPositionWorld = *PEDSELF->GetPosition();
                    CVector pedPositionWorld = *reinterpret_cast<CVector*>(SF->getSAMP()->getPlayers()->remotePlayersInfo.remotePlayer[i]->data->onFootPos);
                    CVector2D my;
                    CVector2D ped;
                    SF->getGame()->convert3DCoordsToScreen(myPedPositionWorld.fX, myPedPositionWorld.fY, myPedPositionWorld.fZ, &my.fX, &my.fY);
                    SF->getGame()->convert3DCoordsToScreen(pedPositionWorld.fX, pedPositionWorld.fY, pedPositionWorld.fZ, &my.fX, &my.fY);

                    if (pedPositionScreen.fZ > 1.f) { // что делать тут?
                        ImGui::GetBackgroundDrawList()->AddLine({ my.fX, my.fY }, { ped.fX, ped.fY }, -1);
                    }
                }
            }
 

Z3roKwq

Известный
294
157
фунции такой нет ConvertGameToScreen, немного переписал твой код на мой sampfuncs, внимание на 10 строку

конвертирование это "кастом" функция была. и вопрос что не так с 10 строкой, а и имгуи рендер можеш заменить сф версию, я так сделал потому что мне удобнее было

UPD: я понял о чем ты, вот функция

C++:
CVector ConvertGametoScreen(CVector WorldPosition) {
    CVector ScreenPosition;
    D3DXMATRIX m((float*)(0xB6FA2C));
    DWORD* dwLenfX = (DWORD*)(0xC17044);
    DWORD* dwLenfY = (DWORD*)(0xC17048);

    ScreenPosition.fX = (WorldPosition.fZ * m._31) + (WorldPosition.fY * m._21) + (WorldPosition.fX * m._11) + m._41;
    ScreenPosition.fY = (WorldPosition.fZ * m._32) + (WorldPosition.fY * m._22) + (WorldPosition.fX * m._12) + m._42;
    ScreenPosition.fZ = (WorldPosition.fZ * m._33) + (WorldPosition.fY * m._23) + (WorldPosition.fX * m._13) + m._43;

    double fRecip = (double)1.0 / ScreenPosition.fZ;
    ScreenPosition.fX *= (float)(fRecip * (*dwLenfX));
    ScreenPosition.fY *= (float)(fRecip * (*dwLenfY));

    return ScreenPosition;
}
 
  • Нравится
Реакции: Smeruxa

Smeruxa

Известный
Автор темы
1,303
683
давно с сф не работал, получилось, что получилось


C++:
void renderPlayers() {
    for (int i = 0; i < 1004; i++) {
        if (SF->getSAMP()->getPlayers()->isListed[i] && SF->getSAMP()->getPlayers()->remotePlayerInfo[i] != nullptr && i != SF->getSAMP()->getPlayers()->localPlayerInfo.id) {
            CVector myPedPositionWorld = *PEDSELF->GetPosition();
            CVector pedPositionWorld = *reinterpret_cast<CVector*>(SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos);
            CVector myPedPositionScreen = ConvertGametoScreen(myPedPositionWorld);
            CVector pedPositionScreen = ConvertGametoScreen(pedPositionWorld);

            if (pedPositionScreen.fZ > 1.f) {
                ImGui::GetBackgroundDrawList()->AddLine({ myPedPositionScreen.fX, myPedPositionScreen.fY }, { pedPositionScreen.fX, pedPositionScreen.fY }, -1);
            }
        }
    }
}
Спасибо большое
 
  • Нравится
Реакции: Z3roKwq