• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос Проблема с отрисовкой скелета

  • Автор темы Автор темы Yakro
  • Дата начала Дата начала
Новичок
Новичок
Статус
Оффлайн
Регистрация
16 Ноя 2021
Сообщения
1
Реакции
0
Есть у меня вот такой замечательный код для отрисовки боксов, нейма и скелета:
C++:
Expand Collapse Copy
for (int i = 1; i < 64; i++) {
        uintptr_t entityList = M::R<uintptr_t>(Vars::client + O::dwEntityList);
        if (!entityList) return;

        uintptr_t list_entry1 = M::R<uintptr_t>(entityList + ((8 * (i & 0x7FFF) >> 9) + 16));
        if (!list_entry1) continue;

        uintptr_t playerController = M::R<uintptr_t>(list_entry1 + (120) * (i & 0x1FF));
        if (!playerController) continue;

        uint32_t playerPawn = M::R<uint32_t>(playerController + O::m_hPlayerPawn);
        if (!playerPawn) continue;

        uintptr_t list_entry2 = M::R<uintptr_t>(entityList + (0x8 * ((playerPawn & 0x7FFF) >> 9) + 16));
        if (!list_entry2) continue;

        uintptr_t pCSPlayerPawnPtr = M::R<uintptr_t>(list_entry2 + (120) * (playerPawn & 0x1FF));
        if (!pCSPlayerPawnPtr) continue;

        uintptr_t sceneNode = M::R<uintptr_t>(pCSPlayerPawnPtr + O::m_pGameSceneNode);
        if (!sceneNode) continue;

        uintptr_t boneMatrix = M::R<uintptr_t>(sceneNode + O::m_modelState + 0x80);
        if (!boneMatrix) continue;

        struct CSEntity {
            char name[128];
        };

        int health = M::R<int>(pCSPlayerPawnPtr + O::m_iHealth);
        if (!health) continue;
        int team = M::R<int>(pCSPlayerPawnPtr + O::m_iTeamNum);
        if (!team) continue;
        CSEntity playerName = M::R<CSEntity>(playerController + O::m_iszPlayerName);
        if (!playerName.name) continue;
        
        if (MenuVars::Visuals::teamCheck)
            if (team == localTeam) continue;

        if (pCSPlayerPawnPtr == localPawn) continue;
        if (health <= 0 || health > 100) continue;

        Vec3 pos = M::R<Vec3>(pCSPlayerPawnPtr + O::m_vOldOrigin);
        if (!pos.x) continue;
        Vec3 feetPos = { pos.x, pos.y, pos.z - 5.0f };
        Vec3 headPos = M::R<Vec3>(boneMatrix + 6 * 32);
        if (!headPos.x) continue;
        headPos.z += 8.f;
        Vec2 feet, head;

        if (MenuVars::Visuals::esp) {
            if (pos.WorldToScreen(feet, viewMatrix) && headPos.WorldToScreen(head, viewMatrix))
            {
                ImVec2 dif = ImVec2((feet.y - head.y) / 4, 0);
                if (feet.x > head.x) {
                    auto ox = feet.x;
                    feet.x = head.x;
                    head.x = ox;
                }
                pDrawList->AddRect(fl(ImVec2(head.x + dif.x + 1, head.y - 1)), fl(ImVec2(feet.x - dif.x - 1, feet.y + 1)), ImColor(0, 0, 0, 200), 0, 0, 1);
                pDrawList->AddRect(fl(ImVec2(head.x + dif.x - 1, head.y + 1)), fl(ImVec2(feet.x - dif.x + 1, feet.y - 1)), ImColor(0, 0, 0, 200), 0, 0, 1);
                pDrawList->AddRect(fl(ImVec2(head.x + dif.x, head.y)), fl(ImVec2(feet.x - dif.x, feet.y)), MenuVars::Visuals::espColor, 0, 0, 1);
            }
        }
        if (MenuVars::Visuals::nameEsp) {
            if (pos.WorldToScreen(feet, viewMatrix) && headPos.WorldToScreen(head, viewMatrix))
            {
                ImVec2 dif = ImVec2((feet.y - head.y) / 4, 0);
                if (feet.x > head.x) {
                    auto ox = feet.x;
                    feet.x = head.x;
                    head.x = ox;
                }
                pDrawList->AddText(fl(ImVec2(feet.x - ImGui::CalcTextSize(playerName.name).x / 2 + 1, head.y - ImGui::CalcTextSize(playerName.name).y - 5 + 1)), ImColor(0, 0, 0, 200), playerName.name);
                pDrawList->AddText(fl(ImVec2(feet.x - ImGui::CalcTextSize(playerName.name).x / 2, head.y - ImGui::CalcTextSize(playerName.name).y - 5)), ImColor(255, 255, 255), playerName.name);
            }
        }
        if (MenuVars::Visuals::skeleton) {
            BodyPart bodyParts[13];
            for (int i = 0; i < 13; i++) {
                int boneIndex = boneMapping[i];
                Vec3 oldPos = bodyParts[i].oldPosition;
                bodyParts[i].position = M::R<Vec3>(boneMatrix + boneIndex * 32);
                if (!bodyParts[i].position) continue;
                bodyParts[i].isValid = bodyParts[i].position.WorldToScreen(bodyParts[i].screenPos, viewMatrix);
            }//bad hands after respawn

            for (const auto& conn : connections) {
                const BodyPart& p1 = bodyParts[conn.first];
                const BodyPart& p2 = bodyParts[conn.second];

                if (p1.isValid && p2.isValid) {
                    ImVec2 screenP1(p1.screenPos.x, p1.screenPos.y);
                    ImVec2 screenP2(p2.screenPos.x, p2.screenPos.y);
                    pDrawList->AddLine(screenP1, screenP2, MenuVars::Visuals::espSkeleton);
                }
            }

            if (bodyParts[2].isValid) {
                ImVec2 head(bodyParts[2].screenPos.x, bodyParts[2].screenPos.y);
                pDrawList->AddCircle(head, 3.0f, MenuVars::Visuals::espSkeleton);
            }
        }
    }

Проблема код заключается в том, что при смерти противника на каком либо подобии дезмача, после респавна на доли секунд отрисовываются старые координаты рук, все остальные (плечи, боди, ноги, голова) рисуются как надо. Код дебажил, и пришел к такому выводу.

Вот такая вот хуйня:
jBJ1VwW.png
 
Назад
Сверху Снизу