число патронов над головой

Forever_Young

Новичок
Автор темы
15
3
Версия SA-MP
  1. Любая
ищу название данного мода. добавляет количество патронов над головой
434.jpg
 

ARMOR

Я креветка
Модератор
5,071
7,410
Написал что-то подобное. Патроны рисуются только при прицеливании, пока ты не целишься - ничего не отображается.

Демонстрация:

Установка: Закинуть в корень игры

Сурсня для тех кто захочет что-то изменить:
C++:
#include <Windows.h>
#include "plugin.h"
#include "CWorld.h"
#include "CCamera.h"
#include "CFont.h"
using namespace plugin;
// Получение дистанции от сущности до камеры. ==ВДОХНОВИЛСЯ== SAMP'ом
float GetDistanceToCamera(CEntity* pEntity)
{
    if (!pEntity) return 10000.f;
    CMatrix* pEntityMatrix = pEntity->GetMatrix();
    CMatrix cameraMatrix = TheCamera.m_mCameraMatrix;
    return sqrtf(
        (pEntityMatrix->pos.x - cameraMatrix.pos.x) * (pEntityMatrix->pos.x - cameraMatrix.pos.x)
        + (pEntityMatrix->pos.y - cameraMatrix.pos.y) * (pEntityMatrix->pos.y - cameraMatrix.pos.y)
        + (pEntityMatrix->pos.z - cameraMatrix.pos.z) * (pEntityMatrix->pos.z - cameraMatrix.pos.z)
    );
}
// Спиздил эту функцию настолько давно, что даже не помню где именно
CVector convertGameCoordsToScreen(CVector worldCoords)
{
    using CalcScreenCoors_t = bool(__cdecl*)(
        CVector*, CVector*, float*, float*);
    CVector screenCoords;
    auto gameFunction{ reinterpret_cast<CalcScreenCoors_t>(0x71DA00U) };
    float unusedParams[2U]{ 0 };
    gameFunction(&worldCoords, &screenCoords,
        &unusedParams[0U], &unusedParams[1U]);
    return screenCoords;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        Events::drawingEvent += []()
        {
            CPed* pPed = CWorld::Players[CWorld::PlayerInFocus].m_pPed;
            if (pPed)
            {
                if (TheCamera.m_aCams[TheCamera.m_nActiveCam].m_nMode == MODE_AIMWEAPON)
                {
                    RwV3d playerHeadPos{};
                    pPed->GetBonePosition(playerHeadPos, 8, true);
                    playerHeadPos.z = GetDistanceToCamera(pPed) * 0.047499999f + playerHeadPos.z + 0.2f;
                    CVector headScreenPos = convertGameCoordsToScreen(playerHeadPos);
                    int nTotalAmmo = pPed->m_aWeapons[pPed->m_nActiveWeaponSlot].m_nTotalAmmo;
                    eWeaponType nWeaponType = pPed->m_aWeapons[pPed->m_nActiveWeaponSlot].m_nType;
                    int nAmmoInClip = pPed->m_aWeapons[pPed->m_nActiveWeaponSlot].m_nAmmoInClip;
                    int nWeaponAmmoClip = CWeaponInfo::GetWeaponInfo(nWeaponType, pPed->GetWeaponSkill())->m_nAmmoClip;
                    std::string szAmmo{};
                    if (nWeaponAmmoClip <= 1 || nWeaponAmmoClip >= 1000)
                        szAmmo = std::to_string(nTotalAmmo);
                    else
                        szAmmo = std::to_string(nTotalAmmo - nAmmoInClip) + "-" + std::to_string(pPed->m_aWeapons[pPed->m_nActiveWeaponSlot].m_nAmmoInClip);
                    CFont::SetColor({255, 255, 255, 255});
                    CFont::SetScale(RsGlobal.maximumWidth * 0.0015625f * 0.2250000075f, RsGlobal.maximumHeight * 0.002232143f * 0.525f);
                    CFont::SetEdge(1);
                    CFont::SetDropColor({0, 0, 0, 255});
                    CFont::SetFontStyle(3);
                    CFont::PrintString(headScreenPos.x - (CFont::GetStringWidth(szAmmo.data(), true, true) * 0.5f), headScreenPos.y, szAmmo.data());
                }
            }
        };
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 

Вложения

  • AmmoOnHead.asi
    135 KB · Просмотры: 2
Последнее редактирование:
  • Нравится
Реакции: smarella

Jesse_Pinkman

Активный
245
65
Написал что-то подобное. Патроны рисуются только при прицеливании, пока ты не целишься - ничего не отображается.

Демонстрация:

Установка: Закинуть в корень игры

Сурсня для тех кто захочет что-то изменить:
C++:
#include <Windows.h>
#include "plugin.h"
#include "CWorld.h"
#include "CCamera.h"
#include "CFont.h"
using namespace plugin;
// Получение дистанции от сущности до камеры. ==ВДОХНОВИЛСЯ== SAMP'ом
float GetDistanceToCamera(CEntity* pEntity)
{
    if (!pEntity) return 10000.f;
    CMatrix* pEntityMatrix = pEntity->GetMatrix();
    CMatrix cameraMatrix = TheCamera.m_mCameraMatrix;
    return sqrtf(
        (pEntityMatrix->pos.x - cameraMatrix.pos.x) * (pEntityMatrix->pos.x - cameraMatrix.pos.x)
        + (pEntityMatrix->pos.y - cameraMatrix.pos.y) * (pEntityMatrix->pos.y - cameraMatrix.pos.y)
        + (pEntityMatrix->pos.z - cameraMatrix.pos.z) * (pEntityMatrix->pos.z - cameraMatrix.pos.z)
    );
}
// Спиздил эту функцию настолько давно, что даже не помню где именно
CVector convertGameCoordsToScreen(CVector worldCoords)
{
    using CalcScreenCoors_t = bool(__cdecl*)(
        CVector*, CVector*, float*, float*);
    CVector screenCoords;
    auto gameFunction{ reinterpret_cast<CalcScreenCoors_t>(0x71DA00U) };
    float unusedParams[2U]{ 0 };
    gameFunction(&worldCoords, &screenCoords,
        &unusedParams[0U], &unusedParams[1U]);
    return screenCoords;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        Events::drawingEvent += []()
        {
            CPed* pPed = CWorld::Players[CWorld::PlayerInFocus].m_pPed;
            if (pPed)
            {
                if (TheCamera.m_aCams[TheCamera.m_nActiveCam].m_nMode == MODE_AIMWEAPON)
                {
                    RwV3d playerHeadPos{};
                    pPed->GetBonePosition(playerHeadPos, 8, true);
                    playerHeadPos.z = GetDistanceToCamera(pPed) * 0.047499999f + playerHeadPos.z + 0.2f;
                    CVector headScreenPos = convertGameCoordsToScreen(playerHeadPos);
                    int nTotalAmmo = pPed->m_aWeapons[pPed->m_nActiveWeaponSlot].m_nTotalAmmo;
                    eWeaponType nWeaponType = pPed->m_aWeapons[pPed->m_nActiveWeaponSlot].m_nType;
                    int nAmmoInClip = pPed->m_aWeapons[pPed->m_nActiveWeaponSlot].m_nAmmoInClip;
                    int nWeaponAmmoClip = CWeaponInfo::GetWeaponInfo(nWeaponType, pPed->GetWeaponSkill())->m_nAmmoClip;
                    std::string szAmmo{};
                    if (nWeaponAmmoClip <= 1 || nWeaponAmmoClip >= 1000)
                        szAmmo = std::to_string(nTotalAmmo);
                    else
                        szAmmo = std::to_string(nTotalAmmo - nAmmoInClip) + "-" + std::to_string(pPed->m_aWeapons[pPed->m_nActiveWeaponSlot].m_nAmmoInClip);
                    CFont::SetColor({255, 255, 255, 255});
                    CFont::SetScale(RsGlobal.maximumWidth * 0.0015625f * 0.2250000075f, RsGlobal.maximumHeight * 0.002232143f * 0.525f);
                    CFont::SetEdge(1);
                    CFont::SetDropColor({0, 0, 0, 255});
                    CFont::SetFontStyle(3);
                    CFont::PrintString(headScreenPos.x - (CFont::GetStringWidth(szAmmo.data(), true, true) * 0.5f), headScreenPos.y, szAmmo.data());
                }
            }
        };
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
спасибо