Files
SA-MP/saco/chatwindow.cpp
T
2026-08-01 19:13:05 +07:00

176 lines
3.6 KiB
C++

#include "main.h"
extern CConfig *pConfig;
//----------------------------------------------------
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);
}
}