Subversion Repositories spk

Rev

Rev 52 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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");
52 cycrow 98
	if ( File.exists() )
11 cycrow 99
	{
173 cycrow 100
		std::vector<Utils::String> lines;
101
		if(File.readLines(lines))
11 cycrow 102
		{
173 cycrow 103
			for(auto itr = lines.begin(); itr != lines.end(); itr++)
11 cycrow 104
			{
173 cycrow 105
				Utils::String cmd = itr->token(":", 1);
11 cycrow 106
				if ( cmd.Compare("MESSAGE") )
107
				{
108
					SMessages *m = new SMessages;
173 cycrow 109
					m->iTimeout = itr->token(":", 2).toInt();
110
					m->iHeight  = itr->token(":", 3).toInt();
111
					m->sHeader  = itr->token(":", 4);
112
					m->sText = itr->tokens(":", 5);
11 cycrow 113
 
114
					if ( !m->iHeight )
115
						m->iHeight = 100;
116
 
117
					if ( m->iTimeout != -1 )
118
						m->iTimeout = timeNow + m->iTimeout;
119
 
120
					CDisplayMessage *display = new CDisplayMessage ( this, device, "", m->sHeader, m->sText );
121
					display->SetSize ( 520, m->iHeight, m_iWidth, m_iHeight );
122
					display->SetTimeout ( m->iTimeout );
123
 
124
					m_lDisplays->push_back ( display );
125
					delete m;
126
				}
127
				else if ( cmd.Compare("ADDGUI") ) // ADDGUI:<name>:<timeout>:x:y:<TYPE>:args
128
				{
173 cycrow 129
					Utils::String name = itr->token(":", 2);
130
					Utils::String guicmd = itr->token(":", 6);
11 cycrow 131
					CDisplay *display = FindDisplay(name);
132
					if ( guicmd.Compare("TEXT") )
133
					{
134
						if ( !display )
135
						{
173 cycrow 136
							display = new CDisplayText(this, device, name, itr->tokens(":", 8));
11 cycrow 137
							m_lPermDisplays->push_back(display);
138
							display->SetMaxSize(m_iWidth, m_iHeight);
139
							display->SetSize(m_iWidth, m_iHeight);
140
						}
173 cycrow 141
						display->SetLength(itr->token(":", 7).toInt());
142
						((CDisplayText *)display)->SetText(itr->tokens(":", 8));
11 cycrow 143
 
173 cycrow 144
						CDisplay::Log(CyString("Adding Text Gui Object: ") + itr->tokens(":", 8));
11 cycrow 145
					}
146
 
147
					if ( display ) 
148
					{
173 cycrow 149
						int iTimeout = itr->token(":", 3).toInt();
11 cycrow 150
						if ( iTimeout != -1 )
151
							iTimeout = timeNow + iTimeout;
152
						display->SetTimeout(iTimeout);
173 cycrow 153
						display->SetPosition(itr->token(":", 4).toInt(), itr->token(":", 5).toInt());
11 cycrow 154
					}
155
				}
156
				else if ( cmd.Compare("REMOVEGUI") )
157
				{
173 cycrow 158
					CDisplay *d = FindDisplay(itr->token(":", 2));
11 cycrow 159
					if ( d )
160
						m_lPermDisplays->remove(d, true, true);
161
				}
162
				else if ( cmd.Compare("TEXTFILE") )
173 cycrow 163
					m_sTextfile = itr->token(":", 2);
11 cycrow 164
				else if ( cmd.Compare("LANGUAGE") )
173 cycrow 165
					m_sLang = itr->token(":", 2);
11 cycrow 166
				else if ( cmd.Compare("PURGE") )
167
				{
173 cycrow 168
					size_t time = itr->token(":", 2).toLong();
11 cycrow 169
					if ( time == m_lCurrentTime )
170
						m_lSend.Clear();
171
					char buf[1000];
172
					sprintf_s ( buf, 1000, "t/%s%s.xml", m_sLang.c_str(), m_sTextfile.c_str() );
173
					remove ( buf );
174
				}
175
				else if ( cmd.Compare("CUSTOM") )
176
				{
173 cycrow 177
					Utils::String filename = itr->tokens(":", 3);
178
					Utils::String name = itr->token(":", 2);
11 cycrow 179
					CDisplayCustom *display = new CDisplayCustom ( this, device, filename, name, m_iWidth, m_iHeight, &varibles );
180
					display->SetMouse ( &m_iMouseX, &m_iMouseY );
181
 
182
					m_lDisplays->push_back ( display );
183
				}
184
				else if ( cmd.Compare("VARIBLES") )
185
				{
173 cycrow 186
					Utils::String rest = itr->token(":", 2);
187
					if ( rest.left(5).Compare("ARRAY") )
11 cycrow 188
					{
173 cycrow 189
						Utils::String vari = rest.tokens("(", 2);
190
						vari.removeFirstSpace();
191
						vari.removeEndSpace();
192
						if ( vari.right(1) == ")" )
193
							vari.truncate ( -1 );
194
						vari.removeFirstSpace();
195
						vari.removeEndSpace();
11 cycrow 196
 
197
						int num = 0;
173 cycrow 198
						Utils::String *varis = vari.tokenise(",", &num);
11 cycrow 199
						for ( int i = 0; i < num; i++ )
200
						{
173 cycrow 201
							Utils::String s = varis[i];
202
							s.removeFirstSpace();
203
							varibles.PushBack ( CyString(s) );
11 cycrow 204
						}
205
 
206
						CLEANSPLIT(varis, num)
207
					}
208
				}
209
			}
210
		}
52 cycrow 211
		File.remove();
11 cycrow 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