Rev 52 | 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 objectsfor ( 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 timeoutm_lPermDisplays->RemoveEmpty();// now render our main displayif ( 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 gameCFileIO File(m_sLogDir + "/log09005.txt");if ( File.exists() ){std::vector<Utils::String> lines;if(File.readLines(lines)){for(auto itr = lines.begin(); itr != lines.end(); itr++){Utils::String cmd = itr->token(":", 1);if ( cmd.Compare("MESSAGE") ){SMessages *m = new SMessages;m->iTimeout = itr->token(":", 2).toInt();m->iHeight = itr->token(":", 3).toInt();m->sHeader = itr->token(":", 4);m->sText = itr->tokens(":", 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{Utils::String name = itr->token(":", 2);Utils::String guicmd = itr->token(":", 6);CDisplay *display = FindDisplay(name);if ( guicmd.Compare("TEXT") ){if ( !display ){display = new CDisplayText(this, device, name, itr->tokens(":", 8));m_lPermDisplays->push_back(display);display->SetMaxSize(m_iWidth, m_iHeight);display->SetSize(m_iWidth, m_iHeight);}display->SetLength(itr->token(":", 7).toInt());((CDisplayText *)display)->SetText(itr->tokens(":", 8));CDisplay::Log(CyString("Adding Text Gui Object: ") + itr->tokens(":", 8));}if ( display ){int iTimeout = itr->token(":", 3).toInt();if ( iTimeout != -1 )iTimeout = timeNow + iTimeout;display->SetTimeout(iTimeout);display->SetPosition(itr->token(":", 4).toInt(), itr->token(":", 5).toInt());}}else if ( cmd.Compare("REMOVEGUI") ){CDisplay *d = FindDisplay(itr->token(":", 2));if ( d )m_lPermDisplays->remove(d, true, true);}else if ( cmd.Compare("TEXTFILE") )m_sTextfile = itr->token(":", 2);else if ( cmd.Compare("LANGUAGE") )m_sLang = itr->token(":", 2);else if ( cmd.Compare("PURGE") ){size_t time = itr->token(":", 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") ){Utils::String filename = itr->tokens(":", 3);Utils::String name = itr->token(":", 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") ){Utils::String rest = itr->token(":", 2);if ( rest.left(5).Compare("ARRAY") ){Utils::String vari = rest.tokens("(", 2);vari.removeFirstSpace();vari.removeEndSpace();if ( vari.right(1) == ")" )vari.truncate ( -1 );vari.removeFirstSpace();vari.removeEndSpace();int num = 0;Utils::String *varis = vari.tokenise(",", &num);for ( int i = 0; i < num; i++ ){Utils::String s = varis[i];s.removeFirstSpace();varibles.PushBack ( CyString(s) );}CLEANSPLIT(varis, num)}}}}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 blocksprintf_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 gamesprintf_s ( buf, 1000, " <t id=\"1\">%ld</t>\r\n", m_lCurrentTime );fputs ( buf, id );// write the sent datasprintf_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 filefputs ( "</page>\r\n", id );fputs ( "</language>\r\n", id );fclose ( id );}}