| 11 | cycrow | 1 | #include "stdafx.h"
 | 
        
           |  |  | 2 | #include "X3Overlay.h"
 | 
        
           |  |  | 3 |   | 
        
           |  |  | 4 | #include "Hook/MyDirect3DDevice9.h"
 | 
        
           |  |  | 5 | #include "Render/DisplayMessage.h"
 | 
        
           |  |  | 6 | #include "Render/DisplayText.h"
 | 
        
           |  |  | 7 | #include "Render/DisplayCustom.h"
 | 
        
           |  |  | 8 |   | 
        
           |  |  | 9 | CX3Overlay::~CX3Overlay ()
 | 
        
           |  |  | 10 | {
 | 
        
           |  |  | 11 | 	if ( m_pDisplay )
 | 
        
           |  |  | 12 | 		delete m_pDisplay;
 | 
        
           |  |  | 13 | 	if ( m_lDisplays )
 | 
        
           |  |  | 14 | 		delete m_lDisplays;
 | 
        
           |  |  | 15 | 	if ( m_lPermDisplays )
 | 
        
           |  |  | 16 | 		delete m_lPermDisplays;
 | 
        
           |  |  | 17 |     CoUninitialize();
 | 
        
           |  |  | 18 | }
 | 
        
           |  |  | 19 |   | 
        
           |  |  | 20 | void CX3Overlay::Init()
 | 
        
           |  |  | 21 | {
 | 
        
           |  |  | 22 | 	m_lDisplays = new CLinkList<CDisplay>;
 | 
        
           |  |  | 23 | 	m_lPermDisplays = new CLinkList<CDisplay>;
 | 
        
           |  |  | 24 | }
 | 
        
           |  |  | 25 |   | 
        
           |  |  | 26 | bool CX3Overlay::HaltMouse () 
 | 
        
           |  |  | 27 | { 
 | 
        
           |  |  | 28 | 	if ( m_pDisplay ) 
 | 
        
           |  |  | 29 | 		return m_pDisplay->HaltMouse(); 
 | 
        
           |  |  | 30 | 	return COverlay::HaltMouse(); 
 | 
        
           |  |  | 31 | }
 | 
        
           |  |  | 32 |   | 
        
           |  |  | 33 | bool CX3Overlay::MouseClick ( int but )
 | 
        
           |  |  | 34 | {
 | 
        
           |  |  | 35 | 	if ( m_pDisplay )
 | 
        
           |  |  | 36 | 		return m_pDisplay->MouseClick (  but, true );
 | 
        
           |  |  | 37 | 	return false;
 | 
        
           |  |  | 38 | }
 | 
        
           |  |  | 39 |   | 
        
           |  |  | 40 | void CX3Overlay::MouseRelease ( int but )
 | 
        
           |  |  | 41 | {
 | 
        
           |  |  | 42 | 	if ( m_pDisplay )
 | 
        
           |  |  | 43 | 		m_pDisplay->MouseClick (  but, false );
 | 
        
           |  |  | 44 | }
 | 
        
           |  |  | 45 |   | 
        
           |  |  | 46 | CDisplay *CX3Overlay::FindDisplay(const CyString &name)
 | 
        
           |  |  | 47 | {
 | 
        
           |  |  | 48 | 	for ( CListNode<CDisplay> *node = m_lPermDisplays->Front(); node; node = node->next() )
 | 
        
           |  |  | 49 | 	{
 | 
        
           |  |  | 50 | 		if ( !node->Data() ) continue;
 | 
        
           |  |  | 51 | 		if ( node->Data()->CheckName(name) )
 | 
        
           |  |  | 52 | 			return node->Data();
 | 
        
           |  |  | 53 | 	}
 | 
        
           |  |  | 54 | 	return NULL;
 | 
        
           |  |  | 55 | }
 | 
        
           |  |  | 56 |   | 
        
           |  |  | 57 |   | 
        
           |  |  | 58 | void CX3Overlay::render(MyDirect3DDevice9 *device)
 | 
        
           |  |  | 59 | {
 | 
        
           |  |  | 60 | 	DWORD timeNow = timeGetTime();
 | 
        
           |  |  | 61 | 	device->SetVertexShader(0);
 | 
        
           |  |  | 62 | 	device->SetPixelShader(0);
 | 
        
           |  |  | 63 |   | 
        
           |  |  | 64 | 	// render are static objects
 | 
        
           |  |  | 65 | 	for ( CListNode<CDisplay> *node = m_lPermDisplays->Front(); node; node = node->next() )
 | 
        
           |  |  | 66 | 	{
 | 
        
           |  |  | 67 | 		if ( node->Data()->CheckTimeout(timeNow) )
 | 
        
           |  |  | 68 | 			node->DeleteData();
 | 
        
           |  |  | 69 | 		else
 | 
        
           |  |  | 70 | 		{
 | 
        
           |  |  | 71 | 			node->Data()->Update(timeNow);
 | 
        
           |  |  | 72 | 			node->Data()->render(device);
 | 
        
           |  |  | 73 | 		}
 | 
        
           |  |  | 74 | 	}
 | 
        
           |  |  | 75 | 	// remove any thats closed or timeout
 | 
        
           |  |  | 76 | 	m_lPermDisplays->RemoveEmpty();
 | 
        
           |  |  | 77 |   | 
        
           |  |  | 78 |   | 
        
           |  |  | 79 | 	// now render our main display
 | 
        
           |  |  | 80 | 	if ( m_pDisplay )
 | 
        
           |  |  | 81 | 	{
 | 
        
           |  |  | 82 | 		if ( m_pDisplay->CheckTimeout(timeNow) )
 | 
        
           |  |  | 83 | 		{
 | 
        
           |  |  | 84 | 			delete m_pDisplay;
 | 
        
           |  |  | 85 | 			m_pDisplay = NULL;
 | 
        
           |  |  | 86 | 		}
 | 
        
           |  |  | 87 | 		else
 | 
        
           |  |  | 88 | 		{
 | 
        
           |  |  | 89 | 			m_pDisplay->Update(timeNow);
 | 
        
           |  |  | 90 | 			m_pDisplay->render ( device );
 | 
        
           |  |  | 91 | 		}
 | 
        
           |  |  | 92 | 	}
 | 
        
           |  |  | 93 |   | 
        
           |  |  | 94 | 	CyStringList varibles;
 | 
        
           |  |  | 95 |   | 
        
           |  |  | 96 | 	// read the log files for the game
 | 
        
           |  |  | 97 | 	CFileIO File(m_sLogDir + "/log09005.txt");
 | 
        
           |  |  | 98 | 	if ( File.Exists() )
 | 
        
           |  |  | 99 | 	{
 | 
        
           |  |  | 100 | 		CyStringList *lines = File.ReadLinesStr();
 | 
        
           |  |  | 101 | 		if ( lines )
 | 
        
           |  |  | 102 | 		{
 | 
        
           |  |  | 103 |   | 
        
           |  |  | 104 | 			for ( SStringList *str = lines->Head(); str; str = str->next )
 | 
        
           |  |  | 105 | 			{
 | 
        
           |  |  | 106 | 				CyString cmd = str->str.GetToken(":", 1, 1);
 | 
        
           |  |  | 107 | 				if ( cmd.Compare("MESSAGE") )
 | 
        
           |  |  | 108 | 				{
 | 
        
           |  |  | 109 | 					SMessages *m = new SMessages;
 | 
        
           |  |  | 110 | 					m->iTimeout = str->str.GetToken ( ":", 2, 2 ).ToInt();
 | 
        
           |  |  | 111 | 					m->iHeight  = str->str.GetToken ( ":", 3, 3 ).ToInt();
 | 
        
           |  |  | 112 | 					m->sHeader = str->str.GetToken ( ":", 4, 4 );
 | 
        
           |  |  | 113 | 					m->sText = str->str.GetToken ( ":", 5 );
 | 
        
           |  |  | 114 |   | 
        
           |  |  | 115 | 					if ( !m->iHeight )
 | 
        
           |  |  | 116 | 						m->iHeight = 100;
 | 
        
           |  |  | 117 |   | 
        
           |  |  | 118 | 					if ( m->iTimeout != -1 )
 | 
        
           |  |  | 119 | 						m->iTimeout = timeNow + m->iTimeout;
 | 
        
           |  |  | 120 |   | 
        
           |  |  | 121 | 					CDisplayMessage *display = new CDisplayMessage ( this, device, "", m->sHeader, m->sText );
 | 
        
           |  |  | 122 | 					display->SetSize ( 520, m->iHeight, m_iWidth, m_iHeight );
 | 
        
           |  |  | 123 | 					display->SetTimeout ( m->iTimeout );
 | 
        
           |  |  | 124 |   | 
        
           |  |  | 125 | 					m_lDisplays->push_back ( display );
 | 
        
           |  |  | 126 | 					delete m;
 | 
        
           |  |  | 127 | 				}
 | 
        
           |  |  | 128 | 				else if ( cmd.Compare("ADDGUI") ) // ADDGUI:<name>:<timeout>:x:y:<TYPE>:args
 | 
        
           |  |  | 129 | 				{
 | 
        
           |  |  | 130 | 					CyString name = str->str.GetToken(":", 2, 2);
 | 
        
           |  |  | 131 | 					CyString guicmd = str->str.GetToken(":", 6, 6);
 | 
        
           |  |  | 132 | 					CDisplay *display = FindDisplay(name);
 | 
        
           |  |  | 133 | 					if ( guicmd.Compare("TEXT") )
 | 
        
           |  |  | 134 | 					{
 | 
        
           |  |  | 135 | 						if ( !display )
 | 
        
           |  |  | 136 | 						{
 | 
        
           |  |  | 137 | 							display = new CDisplayText(this, device, name, str->str.GetToken(":", 8));
 | 
        
           |  |  | 138 | 							m_lPermDisplays->push_back(display);
 | 
        
           |  |  | 139 | 							display->SetMaxSize(m_iWidth, m_iHeight);
 | 
        
           |  |  | 140 | 							display->SetSize(m_iWidth, m_iHeight);
 | 
        
           |  |  | 141 | 						}
 | 
        
           |  |  | 142 | 						display->SetLength(str->str.GetToken(":", 7, 7).ToInt());
 | 
        
           |  |  | 143 | 						((CDisplayText *)display)->SetText(str->str.GetToken(":", 8));
 | 
        
           |  |  | 144 |   | 
        
           |  |  | 145 | 						CDisplay::Log(CyString("Adding Text Gui Object: ") + str->str.GetToken(":", 8));
 | 
        
           |  |  | 146 | 					}
 | 
        
           |  |  | 147 |   | 
        
           |  |  | 148 | 					if ( display ) 
 | 
        
           |  |  | 149 | 					{
 | 
        
           |  |  | 150 | 						int iTimeout = str->str.GetToken ( ":", 3, 3 ).ToInt();
 | 
        
           |  |  | 151 | 						if ( iTimeout != -1 )
 | 
        
           |  |  | 152 | 							iTimeout = timeNow + iTimeout;
 | 
        
           |  |  | 153 | 						display->SetTimeout(iTimeout);
 | 
        
           |  |  | 154 | 						display->SetPosition(str->str.GetToken(":", 4, 4).ToInt(), str->str.GetToken(":", 5, 5).ToInt());
 | 
        
           |  |  | 155 | 					}
 | 
        
           |  |  | 156 | 				}
 | 
        
           |  |  | 157 | 				else if ( cmd.Compare("REMOVEGUI") )
 | 
        
           |  |  | 158 | 				{
 | 
        
           |  |  | 159 | 					CDisplay *d = FindDisplay(str->str.GetToken(":", 2, 2));
 | 
        
           |  |  | 160 | 					if ( d )
 | 
        
           |  |  | 161 | 						m_lPermDisplays->remove(d, true, true);
 | 
        
           |  |  | 162 | 				}
 | 
        
           |  |  | 163 | 				else if ( cmd.Compare("TEXTFILE") )
 | 
        
           |  |  | 164 | 					m_sTextfile = str->str.GetToken ( ":", 2, 2 );
 | 
        
           |  |  | 165 | 				else if ( cmd.Compare("LANGUAGE") )
 | 
        
           |  |  | 166 | 					m_sLang = str->str.GetToken ( ":", 2, 2 );
 | 
        
           |  |  | 167 | 				else if ( cmd.Compare("PURGE") )
 | 
        
           |  |  | 168 | 				{
 | 
        
           |  |  | 169 | 					size_t time = str->str.GetToken ( ":", 2, 2 ).ToLong();
 | 
        
           |  |  | 170 | 					if ( time == m_lCurrentTime )
 | 
        
           |  |  | 171 | 						m_lSend.Clear();
 | 
        
           |  |  | 172 | 					char buf[1000];
 | 
        
           |  |  | 173 | 					sprintf_s ( buf, 1000, "t/%s%s.xml", m_sLang.c_str(), m_sTextfile.c_str() );
 | 
        
           |  |  | 174 | 					remove ( buf );
 | 
        
           |  |  | 175 | 				}
 | 
        
           |  |  | 176 | 				else if ( cmd.Compare("CUSTOM") )
 | 
        
           |  |  | 177 | 				{
 | 
        
           |  |  | 178 | 					CyString filename = str->str.GetToken ( ":", 3 );
 | 
        
           |  |  | 179 | 					CyString name = str->str.GetToken ( ":", 2, 2 );
 | 
        
           |  |  | 180 | 					CDisplayCustom *display = new CDisplayCustom ( this, device, filename, name, m_iWidth, m_iHeight, &varibles );
 | 
        
           |  |  | 181 | 					display->SetMouse ( &m_iMouseX, &m_iMouseY );
 | 
        
           |  |  | 182 |   | 
        
           |  |  | 183 | 					m_lDisplays->push_back ( display );
 | 
        
           |  |  | 184 | 				}
 | 
        
           |  |  | 185 | 				else if ( cmd.Compare("VARIBLES") )
 | 
        
           |  |  | 186 | 				{
 | 
        
           |  |  | 187 | 					CyString rest = str->str.GetToken ( ":", 2, 2 );
 | 
        
           |  |  | 188 | 					if ( rest.Left(5).Compare("ARRAY") )
 | 
        
           |  |  | 189 | 					{
 | 
        
           |  |  | 190 | 						CyString vari = rest.GetToken ( "(", 2 );
 | 
        
           |  |  | 191 | 						vari.RemoveSpaces ();
 | 
        
           |  |  | 192 | 						if ( vari.Right(1) == ")" )
 | 
        
           |  |  | 193 | 							vari.Truncate ( -1 );
 | 
        
           |  |  | 194 | 						vari.RemoveSpaces ();
 | 
        
           |  |  | 195 |   | 
        
           |  |  | 196 | 						int num = 0;
 | 
        
           |  |  | 197 | 						CyString *varis = vari.SplitToken ( ',', &num );
 | 
        
           |  |  | 198 | 						for ( int i = 0; i < num; i++ )
 | 
        
           |  |  | 199 | 						{
 | 
        
           |  |  | 200 | 							CyString s = varis[i];
 | 
        
           |  |  | 201 | 							s.RemoveFirstSpace();
 | 
        
           |  |  | 202 | 							varibles.PushBack ( s );
 | 
        
           |  |  | 203 | 						}
 | 
        
           |  |  | 204 |   | 
        
           |  |  | 205 | 						CLEANSPLIT(varis, num)
 | 
        
           |  |  | 206 | 					}
 | 
        
           |  |  | 207 | 				}
 | 
        
           |  |  | 208 | 			}
 | 
        
           |  |  | 209 | 			delete lines;
 | 
        
           |  |  | 210 | 		}
 | 
        
           |  |  | 211 | 		File.Remove();
 | 
        
           |  |  | 212 | 	}
 | 
        
           |  |  | 213 |   | 
        
           |  |  | 214 | 	if ( (!m_lDisplays->empty()) && (!m_pDisplay) )
 | 
        
           |  |  | 215 | 	{
 | 
        
           |  |  | 216 | 		m_pDisplay = m_lDisplays->First();
 | 
        
           |  |  | 217 |   | 
        
           |  |  | 218 | 		m_lDisplays->RemoveCurrent ();
 | 
        
           |  |  | 219 | 	}
 | 
        
           |  |  | 220 | }
 | 
        
           |  |  | 221 |   | 
        
           |  |  | 222 |   | 
        
           |  |  | 223 | void CX3Overlay::init (MyDirect3DDevice9 *device)
 | 
        
           |  |  | 224 | {
 | 
        
           |  |  | 225 | 	COverlay::init ( device );
 | 
        
           |  |  | 226 |   | 
        
           |  |  | 227 | 	m_pDisplay = NULL;
 | 
        
           |  |  | 228 | }
 | 
        
           |  |  | 229 |   | 
        
           |  |  | 230 |   | 
        
           |  |  | 231 | bool CX3Overlay::KeyDown ( int key )
 | 
        
           |  |  | 232 | {
 | 
        
           |  |  | 233 | 	if ( !m_pDisplay )
 | 
        
           |  |  | 234 | 		return false;
 | 
        
           |  |  | 235 |   | 
        
           |  |  | 236 | 	if ( key == DIK_NUMPADSTAR )
 | 
        
           |  |  | 237 | 		m_pDisplay->SwitchRender ();
 | 
        
           |  |  | 238 |   | 
        
           |  |  | 239 | 	if ( (m_pDisplay->GetTimeout() == -2) || ((m_pDisplay->GetTimeout() == -1) && (key == DIK_RETURN)) )
 | 
        
           |  |  | 240 | 	{
 | 
        
           |  |  | 241 | 		delete m_pDisplay;
 | 
        
           |  |  | 242 | 		m_pDisplay = NULL;
 | 
        
           |  |  | 243 | 		return true;
 | 
        
           |  |  | 244 | 	}
 | 
        
           |  |  | 245 |   | 
        
           |  |  | 246 | 	if ( m_pDisplay->CheckCloseEventKey ( key ) )
 | 
        
           |  |  | 247 | 	{
 | 
        
           |  |  | 248 | 		delete m_pDisplay;
 | 
        
           |  |  | 249 | 		m_pDisplay = NULL;
 | 
        
           |  |  | 250 | 		return true;
 | 
        
           |  |  | 251 | 	}
 | 
        
           |  |  | 252 |   | 
        
           |  |  | 253 | 	return false;
 | 
        
           |  |  | 254 | }
 | 
        
           |  |  | 255 |   | 
        
           |  |  | 256 | void CX3Overlay::Send ( CyString data )
 | 
        
           |  |  | 257 | {
 | 
        
           |  |  | 258 | 	m_lSend.PushBack ( data.GetToken ( ":", 2 ), data.GetToken ( ":", 1, 1 ) );
 | 
        
           |  |  | 259 | 	WriteTextFile ();
 | 
        
           |  |  | 260 | }
 | 
        
           |  |  | 261 |   | 
        
           |  |  | 262 |   | 
        
           |  |  | 263 | void CX3Overlay::WriteTextFile()
 | 
        
           |  |  | 264 | {
 | 
        
           |  |  | 265 | 	m_lCurrentTime = timeGetTime();
 | 
        
           |  |  | 266 |   | 
        
           |  |  | 267 | 	FILE *id;
 | 
        
           |  |  | 268 | 	char buf[1000];
 | 
        
           |  |  | 269 | 	sprintf_s ( buf, 1000, "t/%s%s.xml", m_sLang.c_str(), m_sTextfile.c_str() );
 | 
        
           |  |  | 270 | 	if ( !fopen_s ( &id, buf, "w" ) )
 | 
        
           |  |  | 271 | 	{
 | 
        
           |  |  | 272 | 		fputs ( "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n", id );
 | 
        
           |  |  | 273 | 		sprintf_s ( buf, 1000, "<language id=\"%s\">\r\n", m_sLang.c_str() );
 | 
        
           |  |  | 274 | 		fputs ( buf, id );
 | 
        
           |  |  | 275 |   | 
        
           |  |  | 276 | 		// write the page block
 | 
        
           |  |  | 277 | 		sprintf_s ( buf, 1000, "<page id=\"%s\" title=\"Custom Gui Send Data\">\r\n", m_sTextfile.c_str() );
 | 
        
           |  |  | 278 | 		fputs ( buf, id );
 | 
        
           |  |  | 279 |   | 
        
           |  |  | 280 | 		// write the current time, to check if its been used in game
 | 
        
           |  |  | 281 | 		sprintf_s ( buf, 1000, "  <t id=\"1\">%ld</t>\r\n", m_lCurrentTime );
 | 
        
           |  |  | 282 | 		fputs ( buf, id );
 | 
        
           |  |  | 283 |   | 
        
           |  |  | 284 | 		// write the sent data
 | 
        
           |  |  | 285 | 		sprintf_s ( buf, 1000, "  <t id=\"2\">%d</t>\r\n", m_lSend.Count() );
 | 
        
           |  |  | 286 | 		fputs ( buf, id );
 | 
        
           |  |  | 287 |   | 
        
           |  |  | 288 | 		int num = 10;
 | 
        
           |  |  | 289 | 		for ( SStringList *node = m_lSend.Head(); node; node = node->next, num += 10 )
 | 
        
           |  |  | 290 | 		{
 | 
        
           |  |  | 291 | 			sprintf_s ( buf, 1000, "  <t id=\"%d\">%s</t>\r\n", num, node->data.c_str() );
 | 
        
           |  |  | 292 | 			fputs ( buf, id );
 | 
        
           |  |  | 293 | 			sprintf_s ( buf, 1000, "  <t id=\"%d\">%s</t>\r\n", num + 1, node->str.GetToken ( ":", 1, 1 ).c_str() );
 | 
        
           |  |  | 294 | 			fputs ( buf, id );
 | 
        
           |  |  | 295 | 			CyString s = node->str.GetToken ( ":", 2 );
 | 
        
           |  |  | 296 | 			if ( !s.Empty() )
 | 
        
           |  |  | 297 | 			{
 | 
        
           |  |  | 298 | 				sprintf_s ( buf, 1000, "  <t id=\"%d\">%s</t>\r\n", num + 2, s.c_str() );
 | 
        
           |  |  | 299 | 				fputs ( buf, id );
 | 
        
           |  |  | 300 | 			}
 | 
        
           |  |  | 301 | 		}
 | 
        
           |  |  | 302 |   | 
        
           |  |  | 303 | 		// finish the file
 | 
        
           |  |  | 304 | 		fputs ( "</page>\r\n", id );
 | 
        
           |  |  | 305 | 		fputs ( "</language>\r\n", id );
 | 
        
           |  |  | 306 | 		fclose ( id );
 | 
        
           |  |  | 307 | 	}
 | 
        
           |  |  | 308 | }
 | 
        
           |  |  | 309 |   | 
        
           |  |  | 310 |   |