rendered paste bodystruct 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();
}