📄 fraginfo.cpp
字号:
//*********************************************************************************
#include <stdio.h>
#include "FragInfo.h"
#include "cpp_client_de.h"
#include "TeamMgr.h"
#include "BloodClientShell.h"
#define FRAG_NAME_PIXEL_WIDTH 145
//*********************************************************************************
CFragInfo::CFragInfo()
{
m_pClients = DNULL;
m_pClientDE = DNULL;
m_pFont = DNULL;
m_pCursor = DNULL;
for (int i = 0; i < NUM_FRAG_PICS; i++)
{
m_hFragPics[i] = 0;
}
m_hFragBar = 0;
m_hFragTable = 0;
m_nFragTableX = 0;
m_nFragTableY = 0;
m_nFragTableHeight = 0;
m_nFragTableMaxDisp = 0;
m_nScreenWidth = 0;
m_nScreenHeight = 0;
m_hTransColor = 0;
}
//*********************************************************************************
CFragInfo::~CFragInfo()
{
if (!m_pClientDE) return;
CLIENT_INFO* ptr = DNULL;
while (m_pClients)
{
ptr = m_pClients->pNext;
m_pClientDE->FreeString (m_pClients->hstrName);
delete m_pClients;
m_pClients = ptr;
}
if (m_pFont)
delete m_pFont;
if (m_pCursor)
delete m_pCursor;
for (int i = 0; i < NUM_FRAG_PICS; i++)
{
if(m_hFragPics[i]) { m_pClientDE->DeleteSurface(m_hFragPics[i]); m_hFragPics[i] = 0; }
}
if(m_hFragBar) { m_pClientDE->DeleteSurface(m_hFragBar); m_hFragBar = 0; }
if(m_hFragTable) { m_pClientDE->DeleteSurface(m_hFragTable); m_hFragTable = 0; }
}
//*********************************************************************************
void CFragInfo::Init (CClientDE* pClientDE, CTeamMgr* pTeamMgr)
{
// Sanity checks
ASSERT(pClientDE);
ASSERT(pTeamMgr);
// Setup main pointers
m_pClientDE = pClientDE;
m_pTeamMgr = pTeamMgr;
// Setup surfaces
m_hFragPics[0] = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/c_frag.pcx");
m_hFragPics[1] = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/o_frag.pcx");
m_hFragPics[2] = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/i_frag.pcx");
m_hFragPics[3] = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/g_frag.pcx");
#ifdef _ADDON
m_hFragPics[4] = m_pClientDE->CreateSurfaceFromBitmap("interface_ao/fragbar/mc_frag.pcx");
m_hFragPics[5] = m_pClientDE->CreateSurfaceFromBitmap("interface_ao/fragbar/fc_frag.pcx");
m_hFragPics[6] = m_pClientDE->CreateSurfaceFromBitmap("interface_ao/fragbar/sd_frag.pcx");
m_hFragPics[7] = m_pClientDE->CreateSurfaceFromBitmap("interface_ao/fragbar/p_frag.pcx");
#endif
m_hFragPics[FRAG_PIC_VOICE] = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/v_frag.pcx");
m_hFragPics[FRAG_PIC_UNKNOWN] = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/u_frag.pcx");
m_hFragBar = m_pClientDE->CreateSurfaceFromBitmap("interface/fragbar/fragbar.pcx");
// Setup fonts
m_pFont = new CoolFont();
m_pFont->Init(m_pClientDE, "interface/fragbar/frag_font_1.pcx");
m_pFont->LoadXWidths("interface/fragbar/frag_font_1.fnt");
// Setup cursor
m_pCursor = new CoolFontCursor();
m_pCursor->SetFont(m_pFont);
// Setup transparency color
m_hTransColor = m_pClientDE->SetupColor1(1.0f, 0.0f, 1.0f, DFALSE);
// Setup starting team id for single column drawing
m_nTeamID = 0;
}
//*********************************************************************************
void CFragInfo::AddClient (HSTRING hstrName, DDWORD nID, int nFragCount, DBYTE byCharacter)
{
if (!m_pClientDE) return;
// if we already have this client in the list, just return
CLIENT_INFO* pDup = m_pClients;
while (pDup)
{
if (pDup->nID == nID) return;
pDup = pDup->pNext;
}
// create the new object
CLIENT_INFO* pNew = new CLIENT_INFO;
if (!pNew) return;
pNew->nID = nID;
pNew->hstrName = m_pClientDE->CopyString(hstrName);
pNew->nFrags = nFragCount;
pNew->byCharacter = byCharacter;
m_pClientDE->CPrint(m_pClientDE->GetStringData(hstrName));
// if we don't have a list yet, set the list pointer to the new object
if (!m_pClients)
{
m_pClients = pNew;
return;
}
// we do have a list - add the new object at the end
CLIENT_INFO* ptr = m_pClients;
while (ptr->pNext)
{
ptr = ptr->pNext;
}
ptr->pNext = pNew;
pNew->pPrev = ptr;
// Add zero frags so that the player will get sorted properly...
DDWORD dwLocalID = 0;
m_pClientDE->GetLocalClientID(&dwLocalID);
AddFrags(dwLocalID, nID, 0);
}
//*********************************************************************************
void CFragInfo::RemoveClient (DDWORD nID)
{
if (!m_pClientDE || !m_pClients) return;
// find the client
CLIENT_INFO* ptr = m_pClients;
while (ptr)
{
if (ptr->nID == nID) break;
ptr = ptr->pNext;
}
if (!ptr) return;
// remove the client from the list
if (ptr->pNext) ptr->pNext->pPrev = ptr->pPrev;
if (ptr->pPrev) ptr->pPrev->pNext = ptr->pNext;
if (m_pClients == ptr) m_pClients = ptr->pNext;
m_pClientDE->FreeString (ptr->hstrName);
delete ptr;
}
//*********************************************************************************
CLIENT_INFO* CFragInfo::GetClientInfo(DDWORD dwID)
{
// Sanity checks...
if (!m_pClients) return(NULL);
// Find the client...
CLIENT_INFO* ptr = m_pClients;
while (ptr)
{
if (ptr->nID == dwID) return(ptr);
ptr = ptr->pNext;
}
// If we get here, we didn't find the client...
return(NULL);
}
//*********************************************************************************
void CFragInfo::RemoveAllClients()
{
if (!m_pClientDE) return;
CLIENT_INFO* ptr = DNULL;
while (m_pClients)
{
ptr = m_pClients->pNext;
m_pClientDE->FreeString (m_pClients->hstrName);
delete m_pClients;
m_pClients = ptr;
}
}
//*********************************************************************************
void CFragInfo::AddFrag (DDWORD nLocalID, DDWORD nID)
{
if (!m_pClientDE || !m_pClients) return;
// find the client
CLIENT_INFO* ptr = m_pClients;
while (ptr)
{
if (ptr->nID == nID)
{
// add to the frag count
ptr->nFrags++;
break;
}
ptr = ptr->pNext;
}
if (!ptr) return;
// put this client in the correct position in the list (most frags to least frags)
CLIENT_INFO* pCurrent = ptr;
while (ptr->pPrev && pCurrent->nFrags > ptr->pPrev->nFrags) ptr = ptr->pPrev;
if (ptr == pCurrent) return;
// we found a new position - remove current from the list
pCurrent->pPrev->pNext = pCurrent->pNext;
if (pCurrent->pNext) pCurrent->pNext->pPrev = pCurrent->pPrev;
// put us back in in the correct position
if (!ptr->pPrev)
{
m_pClients = pCurrent;
}
pCurrent->pPrev = ptr->pPrev;
pCurrent->pNext = ptr;
if (ptr->pPrev) ptr->pPrev->pNext = pCurrent;
ptr->pPrev = pCurrent;
}
//*********************************************************************************
void CFragInfo::AddFrags (DDWORD nLocalID, DDWORD nID, int nFrags)
{
if (!m_pClientDE || !m_pClients) return;
// find the client
CLIENT_INFO* ptr = m_pClients;
while (ptr)
{
if (ptr->nID == nID)
{
// add to the frag count
ptr->nFrags += nFrags;
break;
}
ptr = ptr->pNext;
}
if (!ptr) return;
// put this client in the correct position in the list (most frags to least frags)
CLIENT_INFO* pCurrent = ptr;
while (ptr->pPrev && pCurrent->nFrags > ptr->pPrev->nFrags) ptr = ptr->pPrev;
if (ptr == pCurrent) return;
// we found a new position - remove current from the list
pCurrent->pPrev->pNext = pCurrent->pNext;
if (pCurrent->pNext) pCurrent->pNext->pPrev = pCurrent->pPrev;
// put us back in in the correct position
if (!ptr->pPrev)
{
m_pClients = pCurrent;
}
pCurrent->pPrev = ptr->pPrev;
pCurrent->pNext = ptr;
if (ptr->pPrev) ptr->pPrev->pNext = pCurrent;
ptr->pPrev = pCurrent;
}
//*********************************************************************************
void CFragInfo::RemoveFrag (DDWORD nLocalID, DDWORD nID)
{
if (!m_pClientDE || !m_pClients) return;
// find the client
CLIENT_INFO* ptr = m_pClients;
while (ptr)
{
if (ptr->nID == nID)
{
// remove from the frag count
ptr->nFrags--;
break;
}
ptr = ptr->pNext;
}
if (!ptr) return;
// put this client in the correct position in the list (most frags to least frags)
CLIENT_INFO* pCurrent = ptr;
while (ptr->pNext && pCurrent->nFrags < ptr->pNext->nFrags) ptr = ptr->pNext;
if (ptr == pCurrent) return;
// we found a new position - remove current from the list
pCurrent->pNext->pPrev = pCurrent->pPrev;
if (pCurrent->pPrev) pCurrent->pPrev->pNext = pCurrent->pNext;
if (m_pClients == pCurrent) m_pClients = pCurrent->pNext;
// put us back in in the correct position
pCurrent->pPrev = ptr;
pCurrent->pNext = ptr->pNext;
if (ptr->pNext) ptr->pNext->pPrev = pCurrent;
ptr->pNext = pCurrent;
}
//*********************************************************************************
DDWORD CFragInfo::GetNumClients()
{
if (!m_pClientDE) return 0;
CLIENT_INFO* ptr = m_pClients;
DDWORD nCount = 0;
while (ptr)
{
nCount++;
ptr = ptr->pNext;
}
return nCount;
}
//*********************************************************************************
char* CFragInfo::GetPlayerName (DDWORD nID)
{
if (!m_pClientDE) return DNULL;
CLIENT_INFO* ptr = m_pClients;
while (ptr)
{
if (ptr->nID == nID) return m_pClientDE->GetStringData (ptr->hstrName);
ptr = ptr->pNext;
}
return DNULL;
}
//*********************************************************************************
DBYTE CFragInfo::GetPlayerCharacter (DDWORD nID)
{
if (!m_pClientDE) return DNULL;
CLIENT_INFO* ptr = m_pClients;
while (ptr)
{
if (ptr->nID == nID) return ptr->byCharacter;
ptr = ptr->pNext;
}
return 0;
}
//*********************************************************************************
void CFragInfo::Draw (DBOOL bDrawSingleFragCount, DBOOL bDrawAllFragCounts)
{
if (!m_pClientDE) return;// || (!bDrawSingleFragCount && !bDrawAllFragCounts)) return;
// make sure we're in a network game
int nGameMode = 0;
m_pClientDE->GetGameMode(&nGameMode);
if (nGameMode == STARTGAME_NORMAL || nGameMode == GAMEMODE_NONE) return;
// Update resolution stuff
AdjustRes();
// Draw the team or normal frag table as necessary
if (g_pBloodClientShell->IsMultiplayerTeamBasedGame())
{
DrawTeams();
}
else
{
UpdateFragTable();
HSURFACE hScreen = m_pClientDE->GetScreenSurface();
m_pClientDE->DrawSurfaceToSurfaceTransparent(hScreen, m_hFragTable, DNULL, m_nFragTableX, m_nFragTableY, m_hTransColor);
}
}
//*********************************************************************************
void CFragInfo::Draw (DBOOL bDrawSingleFragCount, DBOOL bDrawAllFragCounts, HSURFACE hSurf)
{
if (!m_pClientDE) return;// || (!bDrawSingleFragCount && !bDrawAllFragCounts)) return;
// make sure we're in a network game
int nGameMode = 0;
m_pClientDE->GetGameMode(&nGameMode);
if (nGameMode == STARTGAME_NORMAL || nGameMode == GAMEMODE_NONE) return;
// Update resolution stuff
AdjustRes();
// Draw the team or normal frag table as necessary
if (g_pBloodClientShell->IsMultiplayerTeamBasedGame())
{
DrawTeams();
}
else
{
UpdateFragTable();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -