1 #include "Lobby2Message.h"
2 #include "RakPeerInterface.h"
3 #include "RakNetworkFactory.h"
4 #include "MessageIdentifiers.h"
5 #include "Lobby2Client.h"
6 #include "Kbhit.h"
7 #include "RakSleep.h"
8 #include "RoomsErrorCodes.h"
9 #include "DS_Queue.h"
10 #include <ctype.h>
11 #include <stdlib.h>
12 #include "LinuxStrings.h"
13 
14 static const int NUM_CONNECTIONS=2;
15 RakNet::Lobby2Client lobby2Client[NUM_CONNECTIONS];
16 RakNet::Lobby2MessageFactory messageFactory;
17 RakNet::RakString testUserName[NUM_CONNECTIONS];
18 RakPeerInterface *rakPeer[NUM_CONNECTIONS];
19 struct AutoExecutionPlanNode
20 {
AutoExecutionPlanNodeAutoExecutionPlanNode21 	AutoExecutionPlanNode() {}
AutoExecutionPlanNodeAutoExecutionPlanNode22 	AutoExecutionPlanNode(int i, RakNet::Lobby2MessageID o) {instanceNumber=i; operation=o;}
23 	int instanceNumber;
24 	RakNet::Lobby2MessageID operation;
25 };
26 DataStructures::Queue<AutoExecutionPlanNode> executionPlan;
27 
PrintCommands(RakNet::Lobby2MessageFactory * messageFactory)28 void PrintCommands(RakNet::Lobby2MessageFactory *messageFactory)
29 {
30 	unsigned int i;
31 	for (i=0; i < RakNet::L2MID_COUNT; i++)
32 	{
33 		RakNet::Lobby2Message *m = messageFactory->Alloc((RakNet::Lobby2MessageID)i);
34 		if (m)
35 		{
36 			printf("%i. %s", i+1, m->GetName());
37 			if (m->RequiresAdmin())
38 				printf(" (Admin command)");
39 			if (m->RequiresRankingPermission())
40 				printf(" (Ranking server command)");
41 			printf("\n");
42 			messageFactory->Dealloc(m);
43 		}
44 
45 	}
46 }
47 
48 void ExecuteCommand(RakNet::Lobby2MessageID command, RakNet::RakString userName, int instanceNumber);
49 struct Lobby2ClientSampleCB : public RakNet::Lobby2Printf
50 {
ExecuteDefaultResultLobby2ClientSampleCB51 	virtual void ExecuteDefaultResult(RakNet::Lobby2Message *message) {
52 		message->DebugPrintf();
53 		if (message->resultCode==RakNet::REC_SUCCESS && executionPlan.Size())
54 		{
55 			AutoExecutionPlanNode aepn = executionPlan.Pop();
56 			ExecuteCommand(aepn.operation, RakNet::RakString("user%i", aepn.instanceNumber), aepn.instanceNumber);
57 		}
58 	}
59 } callback[NUM_CONNECTIONS];
60 
main()61 int main()
62 {
63 	printf("This sample creates two Lobby2Clients.\n");
64 	printf("They both connect to the server and performs queued operations on startup.");
65 	printf("(RANKING AND CLANS NOT YET DONE).\n");
66 	printf("Difficulty: Advanced\n\n");
67 
68 	RakNet::Lobby2ResultCodeDescription::Validate();
69 
70 	/// Do all these operations in this order once we are logged in.
71 	/// This is for easier testing.
72 	/// This plan will create the database, register two users, and log them both in
73 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_System_CreateDatabase), __FILE__, __LINE__ );
74 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_System_CreateTitle), __FILE__, __LINE__ );
75 
76 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_CDKey_Add), __FILE__, __LINE__ );
77 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_System_RegisterProfanity), __FILE__, __LINE__ );
78 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Client_RegisterAccount), __FILE__, __LINE__ );
79 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Client_RegisterAccount), __FILE__, __LINE__ );
80 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_System_SetEmailAddressValidated), __FILE__, __LINE__ );
81 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_System_SetEmailAddressValidated), __FILE__, __LINE__ );
82 // 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Client_Login), __FILE__, __LINE__ );
83 // 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Client_Login), __FILE__, __LINE__ );
84 // 	/// Create 2 clans
85 // 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_Create), __FILE__, __LINE__ );
86 // 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_Create), __FILE__, __LINE__ );
87 // 	// Invite to both
88 // 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SendJoinInvitation), __FILE__, __LINE__ );
89 // 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SendJoinInvitation), __FILE__, __LINE__ );
90 // 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_RejectJoinInvitation), __FILE__, __LINE__ );
91 // 	// Download invitations this clan has sent
92 // 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_DownloadInvitationList), __FILE__, __LINE__ );
93 
94 	/*
95 
96 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Client_SetPresence), __FILE__, __LINE__ );
97 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Client_GetAccountDetails), __FILE__, __LINE__ );
98 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Client_PerTitleIntegerStorage), __FILE__, __LINE__ );
99 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Client_PerTitleIntegerStorage), __FILE__, __LINE__ );
100 
101 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Client_StartIgnore), __FILE__, __LINE__ );
102 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Client_GetIgnoreList), __FILE__, __LINE__ );
103 
104 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Friends_SendInvite), __FILE__, __LINE__);
105 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Friends_AcceptInvite), __FILE__, __LINE__);
106 
107 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Ranking_SubmitMatch));
108 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Ranking_SubmitMatch));
109 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Ranking_UpdateRating));
110 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Ranking_GetRating));
111 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Ranking_WipeRatings));
112 	*/
113 // 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_Create), __FILE__, __LINE__ );
114 // 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_Get), __FILE__, __LINE__ );
115 	/*
116 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SetProperties));
117 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SetMyMemberProperties));
118 	*/
119 	/*
120 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SendJoinInvitation));
121 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_WithdrawJoinInvitation));
122 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_DownloadInvitationList));
123 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SendJoinInvitation));
124 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_RejectJoinInvitation));
125 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SendJoinInvitation));
126 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_AcceptJoinInvitation));
127 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SetSubleaderStatus));
128 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_SetMemberRank));
129 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_GrantLeader));
130 	*/
131 
132 	/*
133 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_SendJoinRequest));
134 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_WithdrawJoinRequest));
135 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_AcceptJoinRequest));
136 	*/
137 
138 //	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_SendJoinRequest));
139 //	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_DownloadRequestList));
140 	// TODO - test from here
141 	/*
142 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_RejectJoinRequest));
143 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_AcceptJoinRequest));
144 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_SendJoinRequest));
145 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_AcceptJoinRequest));
146 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_KickAndBlacklistUser));
147 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_SendJoinRequest));
148 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_GetBlacklist));
149 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_UnblacklistUser));
150 	executionPlan.Push(AutoExecutionPlanNode(1, RakNet::L2MID_Clans_SendJoinRequest));
151 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_AcceptJoinRequest));
152 	executionPlan.Push(AutoExecutionPlanNode(0, RakNet::L2MID_Clans_GetMembers));
153 	*/
154 
155 	/*
156 	// TODO
157 	L2MID_Clans_CreateBoard,
158 		L2MID_Clans_DestroyBoard,
159 		L2MID_Clans_CreateNewTopic,
160 		L2MID_Clans_ReplyToTopic,
161 		L2MID_Clans_RemovePost,
162 		L2MID_Clans_GetBoards,
163 		L2MID_Clans_GetTopics,
164 		L2MID_Clans_GetPosts,
165 		*/
166 
167 
168 	char ip[30], serverPort[30], clientPort[30];
169 	int i;
170 	for (i=0; i < NUM_CONNECTIONS; i++)
171 		rakPeer[i]=RakNetworkFactory::GetRakPeerInterface();
172 //	puts("Enter the rakPeer1 port to listen on");
173 	clientPort[0]=0;
174 	SocketDescriptor socketDescriptor(atoi(clientPort),0);
175 	//gets(clientPort);
176 	if (clientPort[0]==0)
177 		strcpy(clientPort, "0");
178 
179 //	puts("Enter IP to connect to");;
180 	ip[0]=0;
181 	//gets(ip)
182 	if (ip[0]==0)
183 		strcpy(ip, "127.0.0.1");
184 
185 //	puts("Enter the port to connect to");
186 	serverPort[0]=0;
187 	//gets(serverPort);
188 	if (serverPort[0]==0)
189 		strcpy(serverPort, "61111");
190 
191 	for (i=0; i < NUM_CONNECTIONS; i++)
192 	{
193 		rakPeer[i]->Startup(1,30,&socketDescriptor, 1);
194 		rakPeer[i]->Connect(ip, atoi(serverPort), 0,0);
195 
196 		rakPeer[i]->AttachPlugin(&lobby2Client[i]);
197 		lobby2Client[i].SetMessageFactory(&messageFactory);
198 		lobby2Client[i].SetCallbackInterface(&callback[i]);
199 		testUserName[i]=RakNet::RakString("user%i", i);
200 	}
201 
202 	Packet *packet;
203 	// Loop for input
204 	while (1)
205 	{
206 		for (i=0; i < NUM_CONNECTIONS; i++)
207 		{
208 			RakPeerInterface *peer = rakPeer[i];
209 			for (packet=peer->Receive(); packet; peer->DeallocatePacket(packet), packet=peer->Receive())
210 			{
211 				switch (packet->data[0])
212 				{
213 				case ID_DISCONNECTION_NOTIFICATION:
214 					// Connection lost normally
215 					printf("ID_DISCONNECTION_NOTIFICATION\n");
216 					break;
217 				case ID_ALREADY_CONNECTED:
218 					// Connection lost normally
219 					printf("ID_ALREADY_CONNECTED\n");
220 					break;
221 				case ID_CONNECTION_BANNED: // Banned from this server
222 					printf("We are banned from this server.\n");
223 					break;
224 				case ID_CONNECTION_ATTEMPT_FAILED:
225 					printf("Connection attempt failed\n");
226 					break;
227 				case ID_NO_FREE_INCOMING_CONNECTIONS:
228 					// Sorry, the server is full.  I don't do anything here but
229 					// A real app should tell the user
230 					printf("ID_NO_FREE_INCOMING_CONNECTIONS\n");
231 					break;
232 				case ID_MODIFIED_PACKET:
233 					// Cheater!
234 					printf("ID_MODIFIED_PACKET\n");
235 					break;
236 				case ID_INVALID_PASSWORD:
237 					printf("ID_INVALID_PASSWORD\n");
238 					break;
239 				case ID_CONNECTION_LOST:
240 					// Couldn't deliver a reliable packet - i.e. the other system was abnormally
241 					// terminated
242 					printf("ID_CONNECTION_LOST\n");
243 					break;
244 				case ID_CONNECTION_REQUEST_ACCEPTED:
245 					// This tells the rakPeer1 they have connected
246 					printf("ID_CONNECTION_REQUEST_ACCEPTED\n");
247 					int j;
248 					for (j=0; j < NUM_CONNECTIONS; j++)
249 						lobby2Client[j].SetServerAddress(packet->systemAddress);
250 					if (i==NUM_CONNECTIONS-1)
251 					{
252 						PrintCommands(&messageFactory);
253 						printf("Enter instance number 1 to %i followed by command number.\n", NUM_CONNECTIONS);
254 
255 						if (executionPlan.Size())
256 						{
257 							/// Execute the first command now that both clients have connected.
258 							AutoExecutionPlanNode aepn = executionPlan.Pop();
259 							ExecuteCommand(aepn.operation, RakNet::RakString("user%i", aepn.instanceNumber), aepn.instanceNumber);
260 						}
261 					}
262 					break;
263 				case ID_LOBBY2_SERVER_ERROR:
264 					{
265 						RakNet::BitStream bs(packet->data,packet->length,false);
266 						bs.IgnoreBytes(2); // ID_LOBBY2_SERVER_ERROR and error code
267 						printf("ID_LOBBY2_SERVER_ERROR: ");
268 						if (packet->data[1]==RakNet::L2SE_UNKNOWN_MESSAGE_ID)
269 						{
270 							unsigned int messageId;
271 							bs.Read(messageId);
272 							printf("L2SE_UNKNOWN_MESSAGE_ID %i", messageId);
273 						}
274 						else
275 							printf("Unknown");
276 						printf("\n");
277 					}
278 
279 					break;
280 				}
281 			}
282 		}
283 
284 
285 		// This sleep keeps RakNet responsive
286 		RakSleep(30);
287 
288 		if (kbhit())
289 		{
290 			char ch = getch();
291 			if (ch <= '0' || ch > '9')
292 			{
293 				printf("Bad instance number\n");
294 				continue;
295 			}
296 			int instanceNumber = ch - 1 - '0';
297 			if (instanceNumber >= NUM_CONNECTIONS)
298 			{
299 				printf("Enter between 1 and %i to pick the instance of RakPeer to run\n", 1+NUM_CONNECTIONS);
300 				continue;
301 			}
302 
303 			printf("Enter message number or 'quit' to quit.\n");
304 			char str[128];
305 			gets(str);
306 			if (_stricmp(str, "quit")==0)
307 			{
308 				printf("Quitting.\n");
309 				break;
310 			}
311 			else
312 			{
313 				int command = atoi(str);
314 				if (command <=0 || command > RakNet::L2MID_COUNT)
315 				{
316 					printf("Invalid message index %i. Commands:\n", command);
317 					PrintCommands(&messageFactory);
318 				}
319 				else
320 				{
321 					ExecuteCommand((RakNet::Lobby2MessageID)(command-1), RakNet::RakString("user%i", instanceNumber), instanceNumber);
322 				}
323 			}
324 		}
325 	}
326 
327 	for (i=0; i < NUM_CONNECTIONS; i++)
328 		RakNetworkFactory::DestroyRakPeerInterface(rakPeer[i]);
329 	return 0;
330 }
331 /// In a real application these parameters would be filled out from application data
332 /// Here I've just hardcoded everything for fast testing
ExecuteCommand(RakNet::Lobby2MessageID command,RakNet::RakString userName,int instanceNumber)333 void ExecuteCommand(RakNet::Lobby2MessageID command, RakNet::RakString userName, int instanceNumber)
334 {
335 	RakNet::Lobby2Message *m = messageFactory.Alloc(command);
336 	RakAssert(m);
337 	printf("Executing %s (message %i)\n", m->GetName(), command+1);
338 	// If additional requires are needed to test the command, stick them here
339 	switch (m->GetID())
340 	{
341 	case RakNet::L2MID_System_CreateTitle:
342 		{
343 			RakNet::System_CreateTitle *arg = (RakNet::System_CreateTitle *) m;
344 			arg->requiredAge=22;
345 			arg->titleName="Test Title Name";
346 			arg->titleSecretKey="Test secret key";
347 		}
348 		break;
349 	case RakNet::L2MID_System_DestroyTitle:
350 		{
351 			RakNet::System_DestroyTitle *arg = (RakNet::System_DestroyTitle *) m;
352 			arg->titleName="Test Title Name";
353 		}
354 		break;
355 	case RakNet::L2MID_System_GetTitleRequiredAge:
356 		{
357 			RakNet::System_GetTitleRequiredAge *arg = (RakNet::System_GetTitleRequiredAge *) m;
358 			arg->titleName="Test Title Name";
359 		}
360 		break;
361 	case RakNet::L2MID_System_GetTitleBinaryData:
362 		{
363 			RakNet::System_GetTitleBinaryData *arg = (RakNet::System_GetTitleBinaryData *) m;
364 			arg->titleName="Test Title Name";
365 		}
366 		break;
367 	case RakNet::L2MID_System_RegisterProfanity:
368 		{
369 			RakNet::System_RegisterProfanity *arg = (RakNet::System_RegisterProfanity *) m;
370 			arg->profanityWords.Insert("Bodily Functions", __FILE__, __LINE__ );
371 			arg->profanityWords.Insert("Racial Epithet", __FILE__, __LINE__ );
372 			arg->profanityWords.Insert("Euphemism treadmill", __FILE__, __LINE__ );
373 		}
374 		break;
375 	case RakNet::L2MID_System_BanUser:
376 		{
377 			RakNet::System_BanUser *arg = (RakNet::System_BanUser *) m;
378 			arg->durationHours=12;
379 			arg->banReason="Ban Reason";
380 			arg->userName=userName;
381 		}
382 		break;
383 	case RakNet::L2MID_System_UnbanUser:
384 		{
385 			RakNet::System_UnbanUser *arg = (RakNet::System_UnbanUser *) m;
386 			arg->reason="Unban Reason";
387 			arg->userName=userName;
388 		}
389 		break;
390 	case RakNet::L2MID_CDKey_Add:
391 		{
392 			RakNet::CDKey_Add *arg = (RakNet::CDKey_Add *) m;
393 			arg->cdKeys.Insert("Test CD Key", __FILE__, __LINE__ );
394 			arg->cdKeys.Insert("Test CD Key 2", __FILE__, __LINE__ );
395 			arg->titleName="Test Title Name";
396 		}
397 		break;
398 	case RakNet::L2MID_CDKey_GetStatus:
399 		{
400 			RakNet::CDKey_GetStatus *arg = (RakNet::CDKey_GetStatus *) m;
401 			arg->cdKey="Test CD Key";
402 			arg->titleName="Test Title Name";
403 		}
404 		break;
405 	case RakNet::L2MID_CDKey_Use:
406 		{
407 			RakNet::CDKey_Use *arg = (RakNet::CDKey_Use *) m;
408 			arg->cdKey="Test CD Key";
409 			arg->titleName="Test Title Name";
410 			arg->userName=userName;
411 		}
412 		break;
413 	case RakNet::L2MID_CDKey_FlagStolen:
414 		{
415 			RakNet::CDKey_FlagStolen *arg = (RakNet::CDKey_FlagStolen *) m;
416 			arg->cdKey="Test CD Key";
417 			arg->titleName="Test Title Name";
418 			arg->wasStolen=true;
419 		}
420 		break;
421 	case RakNet::L2MID_Client_Login:
422 		{
423 			RakNet::Client_Login *arg = (RakNet::Client_Login *) m;
424 			arg->titleName="Test Title Name";
425 			arg->titleSecretKey="Test secret key";
426 			arg->userPassword="asdf";
427 			arg->userName=userName;
428 		}
429 		break;
430 	case RakNet::L2MID_Client_SetPresence:
431 		{
432 			RakNet::Client_SetPresence *arg = (RakNet::Client_SetPresence *) m;
433 			arg->presence.isVisible=true;
434 			arg->presence.status=RakNet::Lobby2Presence::IN_LOBBY;
435 			arg->presence.titleName="Test Title Name";
436 		}
437 		break;
438 	case RakNet::L2MID_Client_RegisterAccount:
439 		{
440 			RakNet::Client_RegisterAccount *arg = (RakNet::Client_RegisterAccount *) m;
441 			arg->createAccountParameters.ageInDays=9999;
442 			arg->createAccountParameters.firstName="Firstname";
443 			arg->createAccountParameters.lastName="Lastname";
444 			arg->createAccountParameters.password="asdf";
445 			arg->createAccountParameters.passwordRecoveryQuestion="1+2=?";
446 			arg->createAccountParameters.passwordRecoveryAnswer="3";
447 			arg->createAccountParameters.emailAddress="username@provider.com";
448 			arg->createAccountParameters.homeCountry="United States";
449 			arg->createAccountParameters.homeState="california";
450 			arg->createAccountParameters.sex_male=true;
451 			arg->userName=userName;
452 			arg->cdKey="Test CD Key";
453 			arg->titleName="Test Title Name";
454 		}
455 		break;
456 	case RakNet::L2MID_System_SetEmailAddressValidated:
457 		{
458 			RakNet::System_SetEmailAddressValidated *arg = (RakNet::System_SetEmailAddressValidated *) m;
459 			arg->validated=true;
460 			arg->userName=userName;
461 		}
462 		break;
463 	case RakNet::L2MID_Client_ValidateHandle:
464 		{
465 			RakNet::Client_ValidateHandle *arg = (RakNet::Client_ValidateHandle *) m;
466 			arg->userName=userName;
467 		}
468 		break;
469 
470 	case RakNet::L2MID_System_DeleteAccount:
471 		{
472 			RakNet::System_DeleteAccount *arg = (RakNet::System_DeleteAccount *) m;
473 			arg->userName=userName;
474 			arg->password="asdf";
475 		}
476 		break;
477 
478 	case RakNet::L2MID_System_PruneAccounts:
479 		{
480 			RakNet::System_PruneAccounts *arg = (RakNet::System_PruneAccounts *) m;
481 			arg->deleteAccountsNotLoggedInDays=1;
482 		}
483 		break;
484 
485 	case RakNet::L2MID_Client_GetEmailAddress:
486 		{
487 			RakNet::Client_GetEmailAddress *arg = (RakNet::Client_GetEmailAddress *) m;
488 			arg->userName=userName;
489 		}
490 		break;
491 
492 	case RakNet::L2MID_Client_GetPasswordRecoveryQuestionByHandle:
493 		{
494 			RakNet::Client_GetPasswordRecoveryQuestionByHandle *arg = (RakNet::Client_GetPasswordRecoveryQuestionByHandle *) m;
495 			arg->userName=userName;
496 		}
497 		break;
498 
499 	case RakNet::L2MID_Client_GetPasswordByPasswordRecoveryAnswer:
500 		{
501 			RakNet::Client_GetPasswordByPasswordRecoveryAnswer *arg = (RakNet::Client_GetPasswordByPasswordRecoveryAnswer *) m;
502 			arg->userName=userName;
503 			arg->passwordRecoveryAnswer="3";
504 		}
505 		break;
506 
507 	case RakNet::L2MID_Client_ChangeHandle:
508 		{
509 			RakNet::Client_ChangeHandle *arg = (RakNet::Client_ChangeHandle *) m;
510 			arg->userName=userName;
511 			arg->newHandle="New user handle";
512 		}
513 		break;
514 
515 	case RakNet::L2MID_Client_UpdateAccount:
516 		{
517 			RakNet::Client_UpdateAccount *arg = (RakNet::Client_UpdateAccount *) m;
518 		}
519 		break;
520 
521 	case RakNet::L2MID_Client_GetAccountDetails:
522 		{
523 			RakNet::Client_GetAccountDetails *arg = (RakNet::Client_GetAccountDetails *) m;
524 		}
525 		break;
526 
527 	case RakNet::L2MID_Client_StartIgnore:
528 		{
529 			RakNet::Client_StartIgnore *arg = (RakNet::Client_StartIgnore *) m;
530 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
531 		}
532 		break;
533 
534 	case RakNet::L2MID_Client_StopIgnore:
535 		{
536 			RakNet::Client_StopIgnore *arg = (RakNet::Client_StopIgnore *) m;
537 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
538 		}
539 		break;
540 
541 	case RakNet::L2MID_Client_GetIgnoreList:
542 		{
543 			RakNet::Client_GetIgnoreList *arg = (RakNet::Client_GetIgnoreList *) m;
544 		}
545 		break;
546 
547 	case RakNet::L2MID_Client_PerTitleIntegerStorage:
548 		{
549 			RakNet::Client_PerTitleIntegerStorage *arg = (RakNet::Client_PerTitleIntegerStorage *) m;
550 			arg->titleName="Test Title Name";
551 			arg->slotIndex=0;
552 			arg->conditionValue=1.0;
553 			arg->addConditionForOperation=RakNet::Client_PerTitleIntegerStorage::PTISC_GREATER_THAN;
554 			arg->inputValue=0.0;
555 			static int runCount=0;
556 			if (runCount++%2==0)
557 				arg->operationToPerform=RakNet::Client_PerTitleIntegerStorage::PTISO_WRITE;
558 			else
559 				arg->operationToPerform=RakNet::Client_PerTitleIntegerStorage::PTISO_READ;
560 		}
561 		break;
562 
563 	case RakNet::L2MID_Friends_SendInvite:
564 		{
565 			RakNet::Friends_SendInvite *arg = (RakNet::Friends_SendInvite *) m;
566 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
567 			arg->subject="Friends_SendInvite subject";
568 			arg->body="Friends_SendInvite body";
569 		}
570 		break;
571 
572 	case RakNet::L2MID_Friends_AcceptInvite:
573 		{
574 			RakNet::Friends_AcceptInvite *arg = (RakNet::Friends_AcceptInvite *) m;
575 			arg->targetHandle=RakNet::RakString("user%i", 0);
576 			arg->subject="Friends_AcceptInvite subject";
577 			arg->body="Friends_AcceptInvite body";
578 			arg->emailStatus=0;
579 		}
580 		break;
581 
582 	case RakNet::L2MID_Friends_RejectInvite:
583 		{
584 			RakNet::Friends_RejectInvite *arg = (RakNet::Friends_RejectInvite *) m;
585 			arg->targetHandle=RakNet::RakString("user%i", 0);
586 			arg->subject="L2MID_Friends_RejectInvite subject";
587 			arg->body="L2MID_Friends_RejectInvite body";
588 			arg->emailStatus=0;
589 		}
590 		break;
591 
592 	case RakNet::L2MID_Friends_GetInvites:
593 		{
594 			RakNet::Friends_GetInvites *arg = (RakNet::Friends_GetInvites *) m;
595 		}
596 		break;
597 
598 	case RakNet::L2MID_Friends_GetFriends:
599 		{
600 			RakNet::Friends_GetFriends *arg = (RakNet::Friends_GetFriends *) m;
601 		}
602 		break;
603 
604 	case RakNet::L2MID_Friends_Remove:
605 		{
606 			RakNet::Friends_Remove *arg = (RakNet::Friends_Remove *) m;
607 			arg->targetHandle=RakNet::RakString("user%i", 0);
608 			arg->subject="L2MID_Friends_Remove subject";
609 			arg->body="L2MID_Friends_Remove body";
610 			arg->emailStatus=0;
611 		}
612 		break;
613 
614 	case RakNet::L2MID_BookmarkedUsers_Add:
615 		{
616 			RakNet::BookmarkedUsers_Add *arg = (RakNet::BookmarkedUsers_Add *) m;
617 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
618 			arg->type=0;
619 			arg->description="L2MID_BookmarkedUsers_Add description";
620 		}
621 		break;
622 	case RakNet::L2MID_BookmarkedUsers_Remove:
623 		{
624 			RakNet::BookmarkedUsers_Remove *arg = (RakNet::BookmarkedUsers_Remove *) m;
625 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
626 			arg->type=0;
627 		}
628 		break;
629 	case RakNet::L2MID_BookmarkedUsers_Get:
630 		{
631 			RakNet::BookmarkedUsers_Get *arg = (RakNet::BookmarkedUsers_Get *) m;
632 		}
633 		break;
634 
635 	case RakNet::L2MID_Emails_Send:
636 		{
637 			RakNet::Emails_Send *arg = (RakNet::Emails_Send *) m;
638 			arg->recipients.Insert(RakNet::RakString("user%i", instanceNumber+1), __FILE__, __LINE__ );
639 			arg->recipients.Insert(RakNet::RakString("user%i", instanceNumber+2), __FILE__, __LINE__ );
640 			arg->subject="L2MID_Emails_Send subject";
641 			arg->body="L2MID_Emails_Send body";
642 			arg->status=0;
643 		}
644 		break;
645 
646 	case RakNet::L2MID_Emails_Get:
647 		{
648 			RakNet::Emails_Get *arg = (RakNet::Emails_Get *) m;
649 		}
650 		break;
651 
652 	case RakNet::L2MID_Emails_Delete:
653 		{
654 			RakNet::Emails_Delete *arg = (RakNet::Emails_Delete *) m;
655 			arg->emailId=1;
656 		}
657 		break;
658 
659 	case RakNet::L2MID_Emails_SetStatus:
660 		{
661 			RakNet::Emails_SetStatus *arg = (RakNet::Emails_SetStatus *) m;
662 			arg->emailId=2;
663 			arg->updateStatusFlag=true;
664 			arg->updateMarkedRead=true;
665 			arg->newStatusFlag=1234;
666 			arg->isNowMarkedRead=true;
667 		}
668 		break;
669 
670 	case RakNet::L2MID_Ranking_SubmitMatch:
671 		{
672 			RakNet::Ranking_SubmitMatch *arg = (RakNet::Ranking_SubmitMatch *) m;
673 			arg->gameType="Match game type";
674 			arg->titleName="Test Title Name";
675 			arg->submittedMatch.matchNote="Ranking match note";
676 			arg->submittedMatch.matchParticipants.Insert(RakNet::MatchParticipant("user0", 5.0f), __FILE__, __LINE__ );
677 			arg->submittedMatch.matchParticipants.Insert(RakNet::MatchParticipant("user1", 10.0f), __FILE__, __LINE__ );
678 		}
679 		break;
680 
681 	case RakNet::L2MID_Ranking_GetMatches:
682 		{
683 			RakNet::Ranking_GetMatches *arg = (RakNet::Ranking_GetMatches *) m;
684 			arg->gameType="Match game type";
685 			arg->titleName="Test Title Name";
686 		}
687 		break;
688 
689 	case RakNet::L2MID_Ranking_GetMatchBinaryData:
690 		{
691 			RakNet::Ranking_GetMatchBinaryData *arg = (RakNet::Ranking_GetMatchBinaryData *) m;
692 			arg->matchID=1;
693 		}
694 		break;
695 
696 	case RakNet::L2MID_Ranking_GetTotalScore:
697 		{
698 			RakNet::Ranking_GetTotalScore *arg = (RakNet::Ranking_GetTotalScore *) m;
699 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber);
700 			arg->gameType="Match game type";
701 			arg->titleName="Test Title Name";
702 		}
703 		break;
704 
705 	case RakNet::L2MID_Ranking_WipeScoresForPlayer:
706 		{
707 			RakNet::Ranking_WipeScoresForPlayer *arg = (RakNet::Ranking_WipeScoresForPlayer *) m;
708 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber);
709 			arg->gameType="Match game type";
710 			arg->titleName="Test Title Name";
711 		}
712 		break;
713 
714 	case RakNet::L2MID_Ranking_WipeMatches:
715 		{
716 			RakNet::Ranking_WipeMatches *arg = (RakNet::Ranking_WipeMatches *) m;
717 			arg->gameType="Match game type";
718 			arg->titleName="Test Title Name";
719 		}
720 		break;
721 
722 	case RakNet::L2MID_Ranking_PruneMatches:
723 		{
724 			RakNet::Ranking_PruneMatches *arg = (RakNet::Ranking_PruneMatches *) m;
725 			arg->pruneTimeDays=1;
726 		}
727 		break;
728 
729 	case RakNet::L2MID_Ranking_UpdateRating:
730 		{
731 			RakNet::Ranking_UpdateRating *arg = (RakNet::Ranking_UpdateRating *) m;
732 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber);
733 			arg->gameType="Match game type";
734 			arg->titleName="Test Title Name";
735 			arg->targetRating=1234.0f;
736 		}
737 		break;
738 
739 	case RakNet::L2MID_Ranking_WipeRatings:
740 		{
741 			RakNet::Ranking_WipeRatings *arg = (RakNet::Ranking_WipeRatings *) m;
742 			arg->gameType="Match game type";
743 			arg->titleName="Test Title Name";
744 		}
745 		break;
746 
747 	case RakNet::L2MID_Ranking_GetRating:
748 		{
749 			RakNet::Ranking_GetRating *arg = (RakNet::Ranking_GetRating *) m;
750 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber);
751 			arg->gameType="Match game type";
752 			arg->titleName="Test Title Name";
753 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber);
754 		}
755 		break;
756 
757 	case RakNet::L2MID_Clans_Create:
758 		{
759 			RakNet::Clans_Create *arg = (RakNet::Clans_Create *) m;
760 			static int idx=0;
761 			arg->clanHandle=RakNet::RakString("Clan handle %i", idx++);
762 			arg->failIfAlreadyInClan=false;
763 			arg->requiresInvitationsToJoin=true;
764 			arg->description="Clan Description";
765 			arg->binaryData->binaryData=new char[10];
766 			strcpy(arg->binaryData->binaryData,"Hello");
767 			arg->binaryData->binaryDataLength=10;
768 		}
769 		break;
770 
771 	case RakNet::L2MID_Clans_SetProperties:
772 		{
773 			RakNet::Clans_SetProperties *arg = (RakNet::Clans_SetProperties *) m;
774 			arg->clanHandle="Clan handle";
775 			arg->description="Updated description";
776 		}
777 		break;
778 
779 	case RakNet::L2MID_Clans_GetProperties:
780 		{
781 			RakNet::Clans_GetProperties *arg = (RakNet::Clans_GetProperties *) m;
782 			arg->clanHandle="Clan handle";
783 		}
784 		break;
785 
786 	case RakNet::L2MID_Clans_SetMyMemberProperties:
787 		{
788 			RakNet::Clans_SetMyMemberProperties *arg = (RakNet::Clans_SetMyMemberProperties *) m;
789 			arg->clanHandle="Clan handle";
790 			arg->description="Updated description";
791 		}
792 		break;
793 
794 	case RakNet::L2MID_Clans_GrantLeader:
795 		{
796 			RakNet::Clans_GrantLeader *arg = (RakNet::Clans_GrantLeader *) m;
797 			arg->clanHandle="Clan handle";
798 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
799 		}
800 		break;
801 
802 	case RakNet::L2MID_Clans_SetSubleaderStatus:
803 		{
804 			RakNet::Clans_SetSubleaderStatus *arg = (RakNet::Clans_SetSubleaderStatus *) m;
805 			arg->clanHandle="Clan handle";
806 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
807 			arg->setToSubleader=true;
808 		}
809 		break;
810 
811 	case RakNet::L2MID_Clans_SetMemberRank:
812 		{
813 			RakNet::Clans_SetMemberRank *arg = (RakNet::Clans_SetMemberRank *) m;
814 			arg->clanHandle="Clan handle";
815 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
816 			arg->newRank=666;
817 		}
818 		break;
819 
820 	case RakNet::L2MID_Clans_GetMemberProperties:
821 		{
822 			RakNet::Clans_GetMemberProperties *arg = (RakNet::Clans_GetMemberProperties *) m;
823 			arg->clanHandle="Clan handle";
824 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber);
825 		}
826 		break;
827 
828 	case RakNet::L2MID_Clans_ChangeHandle:
829 		{
830 			RakNet::Clans_ChangeHandle *arg = (RakNet::Clans_ChangeHandle *) m;
831 			arg->oldClanHandle="Clan handle";
832 			arg->newClanHandle="New Clan handle";
833 		}
834 		break;
835 
836 	case RakNet::L2MID_Clans_Leave:
837 		{
838 			RakNet::Clans_Leave *arg = (RakNet::Clans_Leave *) m;
839 			arg->clanHandle="Clan handle";
840 			arg->dissolveIfClanLeader=false;
841 			arg->subject="L2MID_Clans_Leave";
842 			arg->emailStatus=0;
843 		}
844 		break;
845 
846 	case RakNet::L2MID_Clans_Get:
847 		{
848 			RakNet::Clans_Get *arg = (RakNet::Clans_Get *) m;
849 		}
850 		break;
851 
852 	case RakNet::L2MID_Clans_SendJoinInvitation:
853 		{
854 			RakNet::Clans_SendJoinInvitation *arg = (RakNet::Clans_SendJoinInvitation *) m;
855 			static int idx=0;
856 			arg->clanHandle=RakNet::RakString("Clan handle %i", idx++);
857 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
858 			arg->subject="L2MID_Clans_SendJoinInvitation";
859 		}
860 		break;
861 
862 	case RakNet::L2MID_Clans_WithdrawJoinInvitation:
863 		{
864 			RakNet::Clans_WithdrawJoinInvitation *arg = (RakNet::Clans_WithdrawJoinInvitation *) m;
865 			arg->clanHandle="Clan handle";
866 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
867 			arg->subject="L2MID_Clans_WithdrawJoinInvitation";
868 		}
869 		break;
870 
871 	case RakNet::L2MID_Clans_AcceptJoinInvitation:
872 		{
873 			RakNet::Clans_AcceptJoinInvitation *arg = (RakNet::Clans_AcceptJoinInvitation *) m;
874 			static int idx=0;
875 			arg->clanHandle=RakNet::RakString("Clan handle %i", idx++);
876 			arg->subject="L2MID_Clans_AcceptJoinInvitation";
877 			arg->failIfAlreadyInClan=false;
878 		}
879 		break;
880 
881 	case RakNet::L2MID_Clans_RejectJoinInvitation:
882 		{
883 			RakNet::Clans_RejectJoinInvitation *arg = (RakNet::Clans_RejectJoinInvitation *) m;
884 			static int idx=0;
885 			arg->clanHandle=RakNet::RakString("Clan handle %i", idx++);
886 			arg->subject="L2MID_Clans_WithdrawJoinInvitation";
887 		}
888 		break;
889 
890 	case RakNet::L2MID_Clans_DownloadInvitationList:
891 		{
892 			RakNet::Clans_DownloadInvitationList *arg = (RakNet::Clans_DownloadInvitationList *) m;
893 		}
894 		break;
895 
896 	case RakNet::L2MID_Clans_SendJoinRequest:
897 		{
898 			RakNet::Clans_SendJoinRequest *arg = (RakNet::Clans_SendJoinRequest *) m;
899 			arg->clanHandle="Clan handle";
900 			arg->subject="L2MID_Clans_SendJoinRequest";
901 		}
902 		break;
903 
904 	case RakNet::L2MID_Clans_WithdrawJoinRequest:
905 		{
906 			RakNet::Clans_WithdrawJoinRequest *arg = (RakNet::Clans_WithdrawJoinRequest *) m;
907 			arg->clanHandle="Clan handle";
908 			arg->subject="L2MID_Clans_WithdrawJoinRequest";
909 		}
910 		break;
911 
912 	case RakNet::L2MID_Clans_AcceptJoinRequest:
913 		{
914 			RakNet::Clans_AcceptJoinRequest *arg = (RakNet::Clans_AcceptJoinRequest *) m;
915 			arg->clanHandle="Clan handle";
916 			arg->requestingUserHandle=RakNet::RakString("user%i", instanceNumber+1);
917 			arg->subject="L2MID_Clans_AcceptJoinRequest";
918 		}
919 		break;
920 
921 	case RakNet::L2MID_Clans_RejectJoinRequest:
922 		{
923 			RakNet::Clans_RejectJoinRequest *arg = (RakNet::Clans_RejectJoinRequest *) m;
924 			arg->clanHandle="Clan handle";
925 			arg->requestingUserHandle=RakNet::RakString("user%i", instanceNumber+1);
926 		}
927 		break;
928 
929 	case RakNet::L2MID_Clans_DownloadRequestList:
930 		{
931 			RakNet::Clans_DownloadRequestList *arg = (RakNet::Clans_DownloadRequestList *) m;
932 		}
933 		break;
934 
935 	case RakNet::L2MID_Clans_KickAndBlacklistUser:
936 		{
937 			RakNet::Clans_KickAndBlacklistUser *arg = (RakNet::Clans_KickAndBlacklistUser *) m;
938 			arg->clanHandle="Clan handle";
939 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
940 			arg->kick=true;
941 			arg->blacklist=true;
942 		}
943 		break;
944 
945 	case RakNet::L2MID_Clans_UnblacklistUser:
946 		{
947 			RakNet::Clans_UnblacklistUser *arg = (RakNet::Clans_UnblacklistUser *) m;
948 			arg->clanHandle="Clan handle";
949 			arg->targetHandle=RakNet::RakString("user%i", instanceNumber+1);
950 		}
951 		break;
952 
953 	case RakNet::L2MID_Clans_GetBlacklist:
954 		{
955 			RakNet::Clans_GetBlacklist *arg = (RakNet::Clans_GetBlacklist *) m;
956 			arg->clanHandle="Clan handle";
957 		}
958 		break;
959 
960 	case RakNet::L2MID_Clans_GetMembers:
961 		{
962 			RakNet::Clans_GetMembers *arg = (RakNet::Clans_GetMembers *) m;
963 			arg->clanHandle="Clan handle";
964 		}
965 		break;
966 
967 	case RakNet::L2MID_Clans_CreateBoard:
968 		{
969 			RakNet::Clans_CreateBoard *arg = (RakNet::Clans_CreateBoard *) m;
970 		}
971 		break;
972 
973 	case RakNet::L2MID_Clans_DestroyBoard:
974 		{
975 			RakNet::Clans_DestroyBoard *arg = (RakNet::Clans_DestroyBoard *) m;
976 		}
977 		break;
978 
979 	case RakNet::L2MID_Clans_CreateNewTopic:
980 		{
981 			RakNet::Clans_CreateNewTopic *arg = (RakNet::Clans_CreateNewTopic *) m;
982 		}
983 		break;
984 
985 	case RakNet::L2MID_Clans_ReplyToTopic:
986 		{
987 			RakNet::Clans_ReplyToTopic *arg = (RakNet::Clans_ReplyToTopic *) m;
988 		}
989 		break;
990 
991 	case RakNet::L2MID_Clans_RemovePost:
992 		{
993 			RakNet::Clans_RemovePost *arg = (RakNet::Clans_RemovePost *) m;
994 		}
995 		break;
996 
997 	case RakNet::L2MID_Clans_GetBoards:
998 		{
999 			RakNet::Clans_GetBoards *arg = (RakNet::Clans_GetBoards *) m;
1000 		}
1001 		break;
1002 
1003 	case RakNet::L2MID_Clans_GetTopics:
1004 		{
1005 			RakNet::Clans_GetTopics *arg = (RakNet::Clans_GetTopics *) m;
1006 		}
1007 		break;
1008 
1009 	case RakNet::L2MID_Clans_GetPosts:
1010 		{
1011 			RakNet::Clans_GetPosts *arg = (RakNet::Clans_GetPosts *) m;
1012 		}
1013 		break;
1014 	}
1015 	lobby2Client[instanceNumber].SendMsg(m);
1016 	messageFactory.Dealloc(m);
1017 }
1018