Code:
void PrintText(char pString [], int x, int y, D3DCOLOR col, ID3DXFont *font)
{
RECT FontRect = { x, y, x + 500, y + 30 };
font->DrawText(NULL, pString, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);
}
bool WorldToScreen(LPDIRECT3DDEVICE9 pDevice, CONST D3DXVECTOR3 &vWorld, D3DXVECTOR3 *pScreen)
{
CILTDrawPrim *pDrawPrimitive = *(CILTDrawPrim **)DrawPrimitivo;
D3DVIEWPORT9 D3DViewport = {0};
D3DXMATRIX matrixProjection, matrixView, matrixWorld;
pDevice->GetTransform(D3DTS_VIEW, &matrixView);
pDevice->GetTransform(D3DTS_PROJECTION, &matrixProjection);
pDevice->GetTransform(D3DTS_WORLD, &matrixWorld);
pDevice->GetViewport(&D3DViewport);
D3DXVec3Project(pScreen, &vWorld, &D3DViewport, &pDrawPrimitive->Projection, &pDrawPrimitive->View, &pDrawPrimitive->World);
return(pScreen->z < 1.0f);
}
FLOAT GetDistance(D3DXVECTOR3 Local, D3DXVECTOR3 Target)
{
FLOAT fResult[3];
SubtractVector(Target, Local, fResult);
return (sqrt((fResult[0] * fResult[0]) + (fResult[1] * fResult[1]) + (fResult[2] * fResult[2])) / 100);
}
VOID cBase::DrawLine(INT x1, INT y1, INT x2, INT y2, D3DCOLOR color, LPDIRECT3DDEVICE9 pDevice)
{
struct Vertex
{
FLOAT x, y, z, rhw;
DWORD dwColor;
FLOAT u, v;
} V[2] = {
{(FLOAT)(x1), (FLOAT)(y1), 0.0f, 1.0f, color, 0.0f, 0.0f},
{(FLOAT)(x2), (FLOAT)(y2), 0.0f, 1.0f, color, 0.0f, 0.0f},
};
pDevice->DrawPrimitiveUP(D3DPT_LINESTRIP, 2, V, sizeof(Vertex));
}
void DrawLine(LONG Xa, LONG Ya, LONG Xb, LONG Yb, DWORD dwWidth, D3DCOLOR Color)
{
D3DXVECTOR2 vLine[2];
Directx.pLine->SetAntialias(0);
Directx.pLine->SetWidth(dwWidth);
Directx.pLine->Begin();
vLine[0][0] = Xa;
vLine[0][1] = Ya;
vLine[1][0] = Xb;
vLine[1][1] = Yb;
Directx.pLine->Draw(vLine, 2, Color);
Directx.pLine->End();
}
VOID ESP(INT Names, INT Lines, INT Distances, INT Boxes, INT Warning, LPDIRECT3DDEVICE9 pDevice)
{
pDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
INT CenterX = (GetSystemMetrics(0) / 2) - 1;
INT CenterY = (GetSystemMetrics(1) / 2) - 1;
CHAR CName[50];
CHAR CDistance[50];
if((*(BYTE *)GameStatus == 1) && (Names || Lines || Distances || Boxes || Warning))
{
GetPlayerByIndex = (lpGetPlayerByIndex)PlayerByIndex;
unsigned long ulThis = *(unsigned long *)ClientInfoMgr;
GetLocalPlayer = (lpGetLocalPlayer)LocalPlayer;
cGameClientShell *pGameClientShell = *(cGameClientShell **)GCS;
for(INT i = 0; i < 24; i++)
{
cPlayerInfo *pLocal = GetLocalPlayer(ulThis);
cPlayerInfo *pPlayer = GetPlayerByIndex(ulThis, i, 0);
cCharacterFX *PlayerFX = (cCharacterFX *)pGameClientShell->GetSFXMgr()->SFXList[0x18].List[i];
if (pPlayer != 0 && pPlayer->Object != 0 && pPlayer->pIsDead == 0)
{
sprintf(CName, "%s", pPlayer->pName);
D3DXVECTOR3 vPos, vFootScreen, vScreen;
vPos.x = pPlayer->Object->Pos.x;
vPos.y = pPlayer->Object->yBound2;
vPos.z = pPlayer->Object->Pos.z;
if(WorldToScreen(pDevice, vPos, &vScreen))
{
if(pPlayer->pTeam != pLocal->pTeam)
{
if(Names)
{
PrintText(CName, vScreen.x - 16, vScreen.y - 22, Red, Directx.pFont);
}
if(Lines)
{
Base.DrawLine(CenterX, CenterY, vScreen.x, vScreen.y, Red, pDevice);
}
if(Distances)
{
sprintf(CDistance, "%0.2f metros", GetDistance(pLocal->Object->Pos, pPlayer->Object->Pos));
Directx.Texto(vScreen.x, vScreen.y +15, Cyan, Directx.pFont, CDistance);
}
}
if(pPlayer->pTeam == pLocal->pTeam /*&& pLocal->Index != PlayerFX->Index*/)
{
if(Names == 2)
{
PrintText(CName, vScreen.x - 16, vScreen.y - 22, Blue, Directx.pFont);
}
if(Lines == 2)
{
Base.DrawLine(CenterX, CenterY, vScreen.x, vScreen.y, Blue, pDevice);
}
if(Distances == 2)
{
sprintf(CDistance, "%0.2f metros", GetDistance(pLocal->Object->Pos, pPlayer->Object->Pos));
Directx.Texto(vScreen.x, vScreen.y +15, Cyan, Directx.pFont, CDistance);
}
}
}
}
}
}
}
#endif