struct CViewMatrix { DWORD m_dwUnknown[46]; float* m_pflMatrix; // + 0xB8 DWORD m_dwUnknown1[11]; float m_flXPos; // + 0xE8 float m_flYPos; // + 0xEC float m_flZPos; // + 0xF0 }; struct CGameVec { DWORD m_dwUnknown[33]; float* m_pflMatrix; // + 0x84 DWORD m_dwUnknown1[11]; float m_flXPos; // + 0xB4 float m_flYPos; // + 0xB8 float m_flZPos; // + 0xBC }; struct CInfo { DWORD m_dwUnkown; CGameVec* m_pPosition; //0004 }; typedef struct CPlayer { DWORD m_dwUnknown[22]; int m_iKitID; // + 0x58 DWORD m_dwUnknown1[2]; char m_szName[28]; // + 0x64 CInfo* m_pInfo; // + 0x80 CViewMatrix* m_pViewMatrix; // + 0x84 DWORD m_dwUnknown2[11]; BOOL m_bAlive; // + 0xB4 DWORD m_dwUnknown3[2]; float m_flFOV; // + 0xC0 DWORD m_dwUnknown4[20]; int m_iTeam; // + 0xD8 DWORD m_dwUnknown5[16]; BOOL m_bTakingFlag; // + 0x11C DWORD m_dwUnknown6[23]; BOOL m_bRunning; // + 0x17C DWORD m_dwUnknown7[45]; int m_iAmmo; // + 0x234 DWORD m_dwUnknown8[8]; }; int NewCalcScreen(const float* in, float* out, float flFov, float* mainViewOrigin, float* mainViewAngles, int displayCenterX, int displayCenterY ) { float aim[3]; float newaim[3]; float view[3]; float tmp[3]; float num; if( flFov == 0.0f ) return false; VectorSubtract(in,mainViewOrigin,aim); MakeVector(mainViewAngles,view); if ( VectorAngle(view,aim) > ( flFov/ 1.8 ) ) { return false; } VectorRotateZ(aim,-mainViewAngles[1],newaim);// yaw VectorRotateY(newaim,-mainViewAngles[0],tmp);// pitch VectorRotateX(tmp,-mainViewAngles[2],newaim);// roll //they are behind us!@~!#@!$@!$ if (newaim[0] <= 0) { return false; } num = (float)((displayCenterX/newaim[0])*(120.0/flFov - 1.0/3.0)); out[0] = displayCenterX - num*newaim[1]; out[1] = displayCenterY - num*newaim[2]; return true; } bool bWorldtoScreenx( IDirect3DDevice9* pDevice, CPlayer* pPlayer, CPlayer* pLocalPlayer, D3DXVECTOR3* pScreen ) { float flLocalPos[3], flRemotePos[3]; float flScreen[3], flViewAngles[3]; D3DVIEWPORT9 Viewport; if( SUCCEEDED( pDevice->GetViewport( &Viewport ) ) == false ) return false; flRemotePos[0] = pPlayer->m_pInfo->m_pPosition->m_flXPos; flRemotePos[1] = pPlayer->m_pInfo->m_pPosition->m_flYPos; flRemotePos[2] = pPlayer->m_pInfo->m_pPosition->m_flZPos; flLocalPos[0] = pLocalPlayer->m_pInfo->m_pPosition->m_flXPos; flLocalPos[1] = pLocalPlayer->m_pInfo->m_pPosition->m_flYPos; flLocalPos[2] = pLocalPlayer->m_pInfo->m_pPosition->m_flZPos; flViewAngles[0] = 90; // have fun finding the viewangles :P flViewAngles[1] = 90; flViewAngles[2] = 0.0f; bool bReturn = NewCalcScreen( flRemotePos, flScreen, pLocalPlayer->m_flFOV, flLocalPos, flViewAngles, Viewport.Width / 2, Viewport.Height / 2 ); pScreen->x = flScreen[0]; pScreen->y = flScreen[1]; return bReturn; } char g_szClassList[7][20] = { "SpecialOp", "Sniper", "Assault", "Support", "Engineer", "Medic", "AntiTank" }; HRESULT APIENTRY hkIDirect3DDevice9::EndScene() { char szFormatString[100] = { 0 }; if ( g_pPlayerManager == NULL ) return m_pD3Ddev->EndScene(); CPlayer *pLocalPlayer = g_pPlayerManager->pGetLocalPlayer();// pGetPlayerByIndex( 0 ); if ( pLocalPlayer == NULL ) return m_pD3Ddev->EndScene(); for ( int i = 0; i <= 255; i++ ) { CPlayer *pPlayer = g_pPlayerManager->pGetPlayerByIndex( i ); if ( pPlayer != NULL ) { D3DXVECTOR3 vecScreen; if ( pPlayer->m_bAlive && bWorldtoScreenx( m_pD3Ddev, pPlayer, pLocalPlayer, &vecScreen ) ) { sprintf( szFormatString, "%s [%s]", pPlayer->m_szName, g_szClassList[ pPlayer->m_iKitID ] ); g_pD3DFont->AddFont( vecScreen.x, vecScreen.y, ( pPlayer->m_iTeam == 1 )? 0x0000FFFF: 0xFF0000FF, FT_BORDER, szFormatString ); } } } if( g_pD3DFont ) g_pD3DFont->RenderAll(); return m_pD3Ddev->EndScene(); }