#include #include #include #include "CSAMPFUNCS.h" CSAMPFUNCS *SF = new CSAMPFUNCS(); stFontInfo *rFont; float vect3_length(const float in[3]) { return sqrtf(in[0] * in[0] + in[1] * in[1] + in[2] * in[2]); } void vect3_vect3_sub(const float in1[3], const float in2[3], float out[3]) { int i; for (i = 0; i < 3; i++) out[i] = in1[i] - in2[i]; } void CalcScreenCoors(D3DXVECTOR3 *vecWorld, D3DXVECTOR3 *vecScreen) { /** C++-ifyed function 0x71DA00, formerly called by CHudSA::CalcScreenCoors **/ // Get the static view matrix as D3DXMATRIX D3DXMATRIX m((float *)(0xB6FA2C)); // Get the static virtual screen (x,y)-sizes DWORD *dwLenX = (DWORD *)(0xC17044); DWORD *dwLenY = (DWORD *)(0xC17048); //DWORD *dwLenZ = (DWORD*)(0xC1704C); //double aspectRatio = (*dwLenX) / (*dwLenY); // Do a transformation vecScreen->x = (vecWorld->z * m._31) + (vecWorld->y * m._21) + (vecWorld->x * m._11) + m._41; vecScreen->y = (vecWorld->z * m._32) + (vecWorld->y * m._22) + (vecWorld->x * m._12) + m._42; vecScreen->z = (vecWorld->z * m._33) + (vecWorld->y * m._23) + (vecWorld->x * m._13) + m._43; // Get the correct screen coordinates double fRecip = (double)1.0 / vecScreen->z; //(vecScreen->z - (*dwLenZ)); vecScreen->x *= (float)(fRecip * (*dwLenX)); vecScreen->y *= (float)(fRecip * (*dwLenY)); } float vect3_dist(const float in1[3], const float in2[3]) { float dist[3]; vect3_vect3_sub(in1, in2, dist); return vect3_length(dist); } bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) { if (SUCCEEDED(SF->getRender()->BeginRender())) { if (!SF->getGame()->isGTAMenuActive()) { actor_info *self = SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped; if (self != nullptr) { char rText[32]; // buf float fObjPos[3]; float fScreen[2]; D3DXVECTOR3 eobjpos, escreen; for (int i = 0; i < MAX_OBJECTS; i++) { if (SF->getSAMP()->getInfo()->pPools->pPool_Object->IsObjectExists(i)) { object_info *obj = SF->getSAMP()->getInfo()->pPools->pPool_Object->object[i]->pGTAObject; if (obj == nullptr) continue; fObjPos[0] = obj->base.matrix[4 * 3]; fObjPos[1] = obj->base.matrix[4 * 3 + 1]; fObjPos[2] = obj->base.matrix[4 * 3 + 2]; if (vect3_dist(fObjPos, &self->base.matrix[4 * 3]) > 30.0) continue; eobjpos.x = fObjPos[0]; eobjpos.y = fObjPos[1]; eobjpos.z = fObjPos[2]; CalcScreenCoors(&eobjpos, &escreen); fScreen[0] = escreen.x; fScreen[1] = escreen.y; fScreen[2] = escreen.z; if (fScreen[2] < 1.f) continue; sprintf(rText, "Object %d, model %d", i, obj->base.model_alt_id); rFont->Print(rText, D3DCOLOR_XRGB(255, 255, 255), fScreen[0], fScreen[1], true); } } } } SF->getRender()->EndRender(); } return 1; } void CALLBACK mainloop( void ) { static bool init = false; if( !init ) { if( !SF->getSAMP()->IsInitialized() ) return; rFont = SF->getRender()->CreateNewFont("Trebuchet MS", 9, FCR_BORDER && FCR_BOLD); SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present); init = true; } } BOOL APIENTRY DllMain( HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved ) { switch ( dwReasonForCall ) { case DLL_PROCESS_ATTACH: SF->initPlugin( mainloop, hModule ); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }