mirror of
https://github.com/dashr9230/SA-MP.git
synced 2026-10-10 11:43:04 +08:00
249 lines
5.2 KiB
C++
249 lines
5.2 KiB
C++
|
|
#include "main.h"
|
|
|
|
extern CConfig *pConfig;
|
|
extern CCmdWindow *pCmdWindow;
|
|
extern CGame *pGame;
|
|
|
|
//----------------------------------------------------
|
|
|
|
CChatWindow::CChatWindow(IDirect3DDevice9 *pD3DDevice, CFontRender *pFontRender, CHAR *szChatLogFile)
|
|
{
|
|
int x=0;
|
|
|
|
m_pD3DDevice = pD3DDevice;
|
|
m_pFontRender = pFontRender;
|
|
field_8 = 2;
|
|
|
|
// Create a sprite to use when drawing text
|
|
D3DXCreateSprite(pD3DDevice,&field_63A6);
|
|
D3DXCreateSprite(pD3DDevice,&field_63AA);
|
|
|
|
// Init the chat window lines to 0
|
|
while(x!=MAX_MESSAGES) {
|
|
memset(&m_ChatWindowEntries[x],0,sizeof(CHAT_WINDOW_ENTRY));
|
|
x++;
|
|
}
|
|
|
|
m_dwChatTextColor = D3DCOLOR_ARGB(255,255,255,255);
|
|
m_dwChatInfoColor = D3DCOLOR_ARGB(255,136,170,98);
|
|
m_dwChatDebugColor = D3DCOLOR_ARGB(255,169,196,228);
|
|
|
|
field_0 = 10;
|
|
m_bTimestamp = 0;
|
|
|
|
if(szChatLogFile && strlen(szChatLogFile))
|
|
{
|
|
memset(&field_11[0],0,sizeof(field_11));
|
|
strncpy(field_11,szChatLogFile,MAX_PATH);
|
|
|
|
FILE *f = fopen(field_11, "w");
|
|
if(f)
|
|
{
|
|
field_D = 1;
|
|
fclose(f);
|
|
}
|
|
}
|
|
|
|
field_63BE = 0;
|
|
field_63BA = NULL;
|
|
field_63B6 = NULL;
|
|
field_63D2 = GetTickCount();
|
|
field_63DE = 1;
|
|
m_pScrollBar = NULL;
|
|
m_pGameUI = NULL;
|
|
field_11A = 0;
|
|
|
|
CreateFonts();
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CChatWindow::CreateFonts()
|
|
{
|
|
D3DSURFACE_DESC desc;
|
|
HRESULT hr;
|
|
|
|
field_63B2 = 1;
|
|
|
|
if(field_63BE) {
|
|
field_63BE->Release();
|
|
field_63BE = NULL;
|
|
}
|
|
|
|
if(field_63BA) {
|
|
field_63BA->Release();
|
|
field_63BA = NULL;
|
|
}
|
|
|
|
if(field_63B6) {
|
|
field_63B6->Release();
|
|
field_63B6 = NULL;
|
|
}
|
|
|
|
m_pD3DDevice->GetDisplayMode(0,&field_63C2);
|
|
|
|
if(pConfig->GetIntVariable("directmode")) {
|
|
AddDebugMessage("ChatWindow: Using direct drawing mode.");
|
|
FUNC_10067120();
|
|
field_63B2 = 0;
|
|
return;
|
|
}
|
|
|
|
// the render target has to cover the whole screen
|
|
if(field_63C2.Width <= 1024) {
|
|
hr = D3DXCreateTexture(m_pD3DDevice,1024,512,1,D3DUSAGE_RENDERTARGET,
|
|
D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&field_63BA);
|
|
} else {
|
|
hr = D3DXCreateTexture(m_pD3DDevice,2048,1024,1,D3DUSAGE_RENDERTARGET,
|
|
D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&field_63BA);
|
|
}
|
|
|
|
if(hr < 0) {
|
|
AddDebugMessage("ChatWindow: Can't create a render surface texture. Will use direct mode.");
|
|
field_63B2 = 0;
|
|
return;
|
|
}
|
|
|
|
field_63BA->GetSurfaceLevel(0,&field_63BE);
|
|
field_63BE->GetDesc(&desc);
|
|
|
|
if(D3DXCreateRenderToSurface(m_pD3DDevice,desc.Width,desc.Height,desc.Format,
|
|
TRUE,D3DFMT_D16,&field_63B6) < 0)
|
|
{
|
|
AddDebugMessage("ChatWindow: Can't create a render to surface. Will use direct mode.");
|
|
FUNC_10067120();
|
|
field_63B2 = 0;
|
|
return;
|
|
}
|
|
|
|
FUNC_10067120();
|
|
|
|
field_63D6 = 0;
|
|
m_bRedraw = 1;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
// MATCH
|
|
void CChatWindow::ResetDialogControls(CDXUTDialog *pGameUI)
|
|
{
|
|
m_pGameUI = pGameUI;
|
|
|
|
if(pGameUI) {
|
|
m_pScrollBar = new CDXUTScrollBar(pGameUI);
|
|
pGameUI->AddControl(m_pScrollBar);
|
|
m_pScrollBar->SetVisible(true);
|
|
m_pScrollBar->SetEnabled(true);
|
|
|
|
FUNC_10067200();
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
//----------------------------------------------------
|
|
|
|
int CChatWindow::AddDebugMessage(CHAR * szFormat, ...)
|
|
{
|
|
char szBuffer[512];
|
|
va_list va;
|
|
va_start(va, szFormat);
|
|
memset(szBuffer, 0, sizeof(szBuffer));
|
|
vsprintf(szBuffer, szFormat, va);
|
|
|
|
char *p = szBuffer;
|
|
if(szBuffer[0])
|
|
{
|
|
do
|
|
{
|
|
if(*p > 0 && *p < 32)
|
|
*p = 32;
|
|
}
|
|
while(*++p);
|
|
}
|
|
|
|
return sub_10067BE0(8, szBuffer, 0, m_dwChatDebugColor, 0);
|
|
}
|
|
// MATCH
|
|
void CChatWindow::FUNC_10067200()
|
|
{
|
|
if(m_pScrollBar) {
|
|
m_pScrollBar->SetLocation(10,40);
|
|
m_pScrollBar->SetSize(20,((field_63E2+1)*field_0)-60);
|
|
m_pScrollBar->SetTrackRange(1,MAX_MESSAGES);
|
|
m_pScrollBar->SetPageSize(field_0);
|
|
m_pScrollBar->SetTrackPos(MAX_MESSAGES-field_0);
|
|
}
|
|
}
|
|
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CChatWindow::SetPageSize(int iPageSize)
|
|
{
|
|
if(iPageSize >= 10 && iPageSize <= MAX_MESSAGES) {
|
|
field_0 = iPageSize;
|
|
FUNC_10067200();
|
|
m_bRedraw = 1;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CChatWindow::ReplaceControlChars(char *szString)
|
|
{
|
|
if(*szString)
|
|
{
|
|
do
|
|
{
|
|
if(*szString > 0 && *szString < 32)
|
|
*szString = 32;
|
|
}
|
|
while(*++szString);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CChatWindow::PageUp()
|
|
{
|
|
if(field_8 && m_pScrollBar && !pGame->sub_100A0920() && !pCmdWindow->IsImeActive()) {
|
|
int iPos = m_pScrollBar->GetTrackPos()-field_0;
|
|
if(iPos < 1) iPos = 1;
|
|
m_pScrollBar->SetTrackPos(iPos);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CChatWindow::PageDown()
|
|
{
|
|
if(field_8 && m_pScrollBar && !pGame->sub_100A0920() && !pCmdWindow->IsImeActive()) {
|
|
int iPos = m_pScrollBar->GetTrackPos();
|
|
if(iPos == 1)
|
|
iPos = field_0;
|
|
else
|
|
iPos += field_0;
|
|
if(iPos > MAX_MESSAGES) iPos = MAX_MESSAGES;
|
|
m_pScrollBar->SetTrackPos(iPos);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CChatWindow::FUNC_10067390()
|
|
{
|
|
if(m_pScrollBar)
|
|
m_pScrollBar->SetTrackPos(MAX_MESSAGES-10);
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CChatWindow::OnMouseWheel(int nDelta)
|
|
{
|
|
if(field_8 && m_pScrollBar) {
|
|
int nScrollLines;
|
|
SystemParametersInfo(SPI_GETWHEELSCROLLLINES,0,&nScrollLines,0);
|
|
m_pScrollBar->Scroll(-(nDelta*nScrollLines));
|
|
}
|
|
}
|