Rev 11 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "stdafx.h"
#include "X3Overlay.h"
#include "Hook/MyDirect3DDevice9.h"
#include "Render/DisplayMessage.h"
#include "Render/DisplayText.h"
#include "Render/DisplayCustom.h"
CX3Overlay::~CX3Overlay ()
{
if ( m_pDisplay )
delete m_pDisplay;
if ( m_lDisplays )
delete m_lDisplays;
if ( m_lPermDisplays )
delete m_lPermDisplays;
CoUninitialize();
}
void CX3Overlay::Init()
{
m_lDisplays = new CLinkList<CDisplay>;
m_lPermDisplays = new CLinkList<CDisplay>;
}
bool CX3Overlay::HaltMouse ()
{
if ( m_pDisplay )
return m_pDisplay->HaltMouse();
return COverlay::HaltMouse();
}
bool CX3Overlay::MouseClick ( int but )
{
if ( m_pDisplay )
return m_pDisplay->MouseClick ( but, true );
return false;
}
void CX3Overlay::MouseRelease ( int but )
{
if ( m_pDisplay )
m_pDisplay->MouseClick ( but, false );
}
CDisplay *CX3Overlay::FindDisplay(const CyString &name)
{
for ( CListNode<CDisplay> *node = m_lPermDisplays->Front(); node; node = node->next() )
{
if ( !node->Data() ) continue;
if ( node->Data()->CheckName(name) )
return node->Data();
}
return NULL;
}
void CX3Overlay::render(MyDirect3DDevice9 *device)
{
DWORD timeNow = timeGetTime();
device->SetVertexShader(0);
device->SetPixelShader(0);
// render are static objects
for ( CListNode<CDisplay> *node = m_lPermDisplays->Front(); node; node = node->next() )
{
if ( node->Data()->CheckTimeout(timeNow) )
node->DeleteData();
else
{
node->Data()->Update(timeNow);
node->Data()->render(device);
}
}
// remove any thats closed or timeout
m_lPermDisplays->RemoveEmpty();
// now render our main display
if ( m_pDisplay )
{
if ( m_pDisplay->CheckTimeout(timeNow) )
{
delete m_pDisplay;
m_pDisplay = NULL;
}
else
{
m_pDisplay->Update(timeNow);
m_pDisplay->render ( device );
}
}
CyStringList varibles;
// read the log files for the game
CFileIO File(m_sLogDir + "/log09005.txt");
if ( File.exists() )
{
CyStringList *lines = File.ReadLinesStr();
if ( lines )
{
for ( SStringList *str = lines->Head(); str; str = str->next )
{
CyString cmd = str->str.GetToken(":", 1, 1);
if ( cmd.Compare("MESSAGE") )
{
SMessages *m = new SMessages;
m->iTimeout = str->str.GetToken ( ":", 2, 2 ).ToInt();
m->iHeight = str->str.GetToken ( ":", 3, 3 ).ToInt();
m->sHeader = str->str.GetToken ( ":", 4, 4 );
m->sText = str->str.GetToken ( ":", 5 );
if ( !m->iHeight )
m->iHeight = 100;
if ( m->iTimeout != -1 )
m->iTimeout = timeNow + m->iTimeout;
CDisplayMessage *display = new CDisplayMessage ( this, device, "", m->sHeader, m->sText );
display->SetSize ( 520, m->iHeight, m_iWidth, m_iHeight );
display->SetTimeout ( m->iTimeout );
m_lDisplays->push_back ( display );
delete m;
}
else if ( cmd.Compare("ADDGUI") ) // ADDGUI:<name>:<timeout>:x:y:<TYPE>:args
{
CyString name = str->str.GetToken(":", 2, 2);
CyString guicmd = str->str.GetToken(":", 6, 6);
CDisplay *display = FindDisplay(name);
if ( guicmd.Compare("TEXT") )
{
if ( !display )
{
display = new CDisplayText(this, device, name, str->str.GetToken(":", 8));
m_lPermDisplays->push_back(display);
display->SetMaxSize(m_iWidth, m_iHeight);
display->SetSize(m_iWidth, m_iHeight);
}
display->SetLength(str->str.GetToken(":", 7, 7).ToInt());
((CDisplayText *)display)->SetText(str->str.GetToken(":", 8));
CDisplay::Log(CyString("Adding Text Gui Object: ") + str->str.GetToken(":", 8));
}
if ( display )
{
int iTimeout = str->str.GetToken ( ":", 3, 3 ).ToInt();
if ( iTimeout != -1 )
iTimeout = timeNow + iTimeout;
display->SetTimeout(iTimeout);
display->SetPosition(str->str.GetToken(":", 4, 4).ToInt(), str->str.GetToken(":", 5, 5).ToInt());
}
}
else if ( cmd.Compare("REMOVEGUI") )
{
CDisplay *d = FindDisplay(str->str.GetToken(":", 2, 2));
if ( d )
m_lPermDisplays->remove(d, true, true);
}
else if ( cmd.Compare("TEXTFILE") )
m_sTextfile = str->str.GetToken ( ":", 2, 2 );
else if ( cmd.Compare("LANGUAGE") )
m_sLang = str->str.GetToken ( ":", 2, 2 );
else if ( cmd.Compare("PURGE") )
{
size_t time = str->str.GetToken ( ":", 2, 2 ).ToLong();
if ( time == m_lCurrentTime )
m_lSend.Clear();
char buf[1000];
sprintf_s ( buf, 1000, "t/%s%s.xml", m_sLang.c_str(), m_sTextfile.c_str() );
remove ( buf );
}
else if ( cmd.Compare("CUSTOM") )
{
CyString filename = str->str.GetToken ( ":", 3 );
CyString name = str->str.GetToken ( ":", 2, 2 );
CDisplayCustom *display = new CDisplayCustom ( this, device, filename, name, m_iWidth, m_iHeight, &varibles );
display->SetMouse ( &m_iMouseX, &m_iMouseY );
m_lDisplays->push_back ( display );
}
else if ( cmd.Compare("VARIBLES") )
{
CyString rest = str->str.GetToken ( ":", 2, 2 );
if ( rest.Left(5).Compare("ARRAY") )
{
CyString vari = rest.GetToken ( "(", 2 );
vari.RemoveSpaces ();
if ( vari.Right(1) == ")" )
vari.Truncate ( -1 );
vari.RemoveSpaces ();
int num = 0;
CyString *varis = vari.SplitToken ( ',', &num );
for ( int i = 0; i < num; i++ )
{
CyString s = varis[i];
s.RemoveFirstSpace();
varibles.PushBack ( s );
}
CLEANSPLIT(varis, num)
}
}
}
delete lines;
}
File.remove();
}
if ( (!m_lDisplays->empty()) && (!m_pDisplay) )
{
m_pDisplay = m_lDisplays->First();
m_lDisplays->RemoveCurrent ();
}
}
void CX3Overlay::init (MyDirect3DDevice9 *device)
{
COverlay::init ( device );
m_pDisplay = NULL;
}
bool CX3Overlay::KeyDown ( int key )
{
if ( !m_pDisplay )
return false;
if ( key == DIK_NUMPADSTAR )
m_pDisplay->SwitchRender ();
if ( (m_pDisplay->GetTimeout() == -2) || ((m_pDisplay->GetTimeout() == -1) && (key == DIK_RETURN)) )
{
delete m_pDisplay;
m_pDisplay = NULL;
return true;
}
if ( m_pDisplay->CheckCloseEventKey ( key ) )
{
delete m_pDisplay;
m_pDisplay = NULL;
return true;
}
return false;
}
void CX3Overlay::Send ( CyString data )
{
m_lSend.PushBack ( data.GetToken ( ":", 2 ), data.GetToken ( ":", 1, 1 ) );
WriteTextFile ();
}
void CX3Overlay::WriteTextFile()
{
m_lCurrentTime = timeGetTime();
FILE *id;
char buf[1000];
sprintf_s ( buf, 1000, "t/%s%s.xml", m_sLang.c_str(), m_sTextfile.c_str() );
if ( !fopen_s ( &id, buf, "w" ) )
{
fputs ( "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n", id );
sprintf_s ( buf, 1000, "<language id=\"%s\">\r\n", m_sLang.c_str() );
fputs ( buf, id );
// write the page block
sprintf_s ( buf, 1000, "<page id=\"%s\" title=\"Custom Gui Send Data\">\r\n", m_sTextfile.c_str() );
fputs ( buf, id );
// write the current time, to check if its been used in game
sprintf_s ( buf, 1000, " <t id=\"1\">%ld</t>\r\n", m_lCurrentTime );
fputs ( buf, id );
// write the sent data
sprintf_s ( buf, 1000, " <t id=\"2\">%d</t>\r\n", m_lSend.Count() );
fputs ( buf, id );
int num = 10;
for ( SStringList *node = m_lSend.Head(); node; node = node->next, num += 10 )
{
sprintf_s ( buf, 1000, " <t id=\"%d\">%s</t>\r\n", num, node->data.c_str() );
fputs ( buf, id );
sprintf_s ( buf, 1000, " <t id=\"%d\">%s</t>\r\n", num + 1, node->str.GetToken ( ":", 1, 1 ).c_str() );
fputs ( buf, id );
CyString s = node->str.GetToken ( ":", 2 );
if ( !s.Empty() )
{
sprintf_s ( buf, 1000, " <t id=\"%d\">%s</t>\r\n", num + 2, s.c_str() );
fputs ( buf, id );
}
}
// finish the file
fputs ( "</page>\r\n", id );
fputs ( "</language>\r\n", id );
fclose ( id );
}
}