#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;
}