source: Daodan/src/flatline/Mariusnet.c@ 954

Last change on this file since 954 was 881, checked in by alloc, 11 years ago

Daodan: Some flatline cleanups

File size: 20.3 KB
RevLine 
[876]1
2#include <winsock2.h>
3#include "stdint.h"
4#include "Flatline_Net.h"
5#include "Flatline_Win32.h"
6#include "Flatline_Client.h"
7#include "Mariusnet_Defs.h"
[877]8#include "../Daodan_Console.h"
9#include "../Oni_Symbols.h"
[876]10#include <stdio.h>
11
12char MariusLogin[32]={0};
13unsigned char MariusPassword[16]={0};
14
15m_room RoomList[64] = {0};
16unsigned char RoomListGotten = 0;
17
18unsigned char MariusNet_LoggedIn = 0;
19
20unsigned char MsNet_Running = 0;
21int Marius_Socket = -1;
22int Room_Socket = -1;
23sockaddr_in RoomAddr = {0};
24int PlayerID = 0;
25
26m_gameinfo StaticGameList[64] = {0};
27enum
28{
29 glAddGame,
30 glRemoveGame,
31 glUpdateGame,
32};
33
34/*
35
36RGBA green = {0, 0xFF, 0, 0};
37RGBA red = {0, 0, 0xFF, 0};
38
39RGBA grey = {0x80,0x80,0x80,0x80};
40*/
41extern RGBA red;
42//extern RGBA blue;
43RGBA blue = {0xFF, 0, 0, 0};
44RGBA cyan = {0xFF, 0xFF, 0, 0};
45RGBA white = {0xFF, 0xFF, 0xFF, 0};
46extern RGBA green;
47extern RGBA grey;
48
49typedef struct
50{
51 uint16_t x;
52 uint16_t y;
53
54} IMtPoint2D;
55void* DrawInstance = 0;
56void MSNet_DrawGames()
57{
58
59 if(!DrawInstance){
60 void* TSFFTahoma;
61 TMrInstance_GetDataPtr( 'TSFF', "Tahoma", &TSFFTahoma);
62 TSrContext_New( TSFFTahoma, 7, 1, 1, 0, &DrawInstance);
63 }
64 if(DrawInstance){
65 const int white = 0x00FFFFFF;
66 const int green = 0x0000FF00;
67 const int red = 0x00FF0000;
68 const int blue = 0x000000FF;
69 int i;
70 char DrawString[255];
71 const int LineHeight = 15;
72 IMtPoint2D StartLocation = {500, 20};
73 IMtPoint2D DrawLocation = StartLocation;
74 TSrContext_SetShade(DrawInstance, white);
75 TSrContext_DrawText(DrawInstance, "Mariusnet Games:", 255, 0, &DrawLocation);
76 TSrContext_SetShade(DrawInstance, white);
77 DrawLocation.y += LineHeight;
78
79 for(i = 0; i < 64; i++)
80 {
81
82 if(StaticGameList[i].gameID)
83 {
84 DrawLocation.x = StartLocation.x - 10;
85 sprintf(DrawString, "%i.", i );
86 TSrContext_DrawText(DrawInstance, DrawString, 255, 0, &DrawLocation);
87 DrawLocation.x += 20;
88 TSrContext_DrawText(DrawInstance, StaticGameList[i].g.Buffer, 255, 0, &DrawLocation);
89 DrawLocation.y += LineHeight;
90 }
91 }
92
93 }
94}
95
96
97int MariusNet_OutgoingPacketWrapper(int socket, const sockaddr* address, marius_packet* data, short datalen)
98{
99 data->header.PacketSize = htonl(datalen);
100 //NetUDPSocket_Send( socket, address, (char*)data, sizeof(marius_header) );
101 //datalen -= sizeof(marius_header);
102 //(char*)data += sizeof(marius_header);
103 return NetUDPSocket_Send( socket, address, (char*)data, datalen);
104}
105
106int PacketCached = 0;
107int MariusNet_IncomingPacketWrapper(int socket, char buffer[], int bufferlength, int flags)
108{
109 int inSize = 0;
110 unsigned fullSize = -1;
111 static char cacheBuffer[1440] = {0};
112 unsigned char NeedMoreData = 0;
113 if(PacketCached)
114 {
115 unsigned int PacketSize = ntohl(((marius_packet*)cacheBuffer)->header.PacketSize);
116 /*
117 if(ntohs(((marius_packet*)cacheBuffer)->header.PacketSignature) != 0xDEAD)
118 {
119 PacketCached = PacketSize = 0;
120 NeedMoreData = 1;
121 }
122 */
123
124
125
126 if(PacketCached >= PacketSize)
127 {
128 memcpy( buffer, cacheBuffer, PacketSize );
129 PacketCached -= PacketSize;
130 }
131 else
132 {
133 memcpy( buffer, cacheBuffer, PacketCached );
134 inSize += PacketCached;
135 NeedMoreData = 1;
136 PacketCached = 0;
137 }
138 if(PacketCached < 0)
139 {
140 DDrConsole_PrintF("Warning, took too much from cache");
141 PacketCached = 0;
142 }
143 else if (PacketCached > 0)// && ntohs((short*)(cacheBuffer + PacketSize)) == 0xDEAD)
144 {
145 memcpy( cacheBuffer, cacheBuffer + PacketSize, PacketCached );
146 }
147 else
148 {
149 memset(cacheBuffer, 0, 1440);
150 }
151
152 if(!NeedMoreData) return PacketSize;
153
154 }
155 do
156 {
157 int tempSize = recv(socket, buffer + inSize, bufferlength, flags);
158 if(tempSize == SOCKET_ERROR)
159 {
160 NetCatchError();
161 return SOCKET_ERROR;
162 }
163
164 if(fullSize == -1)
165 {
166 if(ntohs(((marius_packet*)buffer)->header.PacketSignature) != 0xDEAD)
167 {
168 DDrConsole_PrintF("Bad header signature...closing Mariusnet connection");
169 return SOCKET_ERROR;
170 }
171 fullSize = ntohl(((marius_packet*)buffer)->header.PacketSize);
172 }
173 inSize += tempSize;
174
175 }
176 while(inSize < fullSize);
177
178 //double packet madness
179 if(inSize > fullSize
180 && ntohs(*(short*)(buffer + fullSize)) == 0xDEAD
181 && ntohl(((marius_packet*)(buffer + fullSize))->header.PacketSize) > 0
182 && inSize - fullSize > sizeof(marius_header)
183 )
184 {
185 memcpy(cacheBuffer, buffer + fullSize, inSize - fullSize);
186
187 PacketCached = inSize - fullSize;
188 }
189 else PacketCached = 0;
190 return inSize;
191}
192
193
194sockaddr_in Marius_Server;
195
196
197unsigned char MariusNet_Initialize()
198{
199 hostent* host_info = 0;
200 //host_info = gethostbyname("myth.mariusnet.com");
201
202 host_info = gethostbyname("metaserver.lhowon.org");
203 if(!host_info)
204 {
205 DDrConsole_PrintF("Error, could not resolve myth.mariusnet.com");
206 return 1;
207 }
208 Marius_Server.sin_port = htons(6321);
209 Marius_Server.sin_family = AF_INET;
210 Marius_Server.sin_addr.S_un.S_addr = *(ULONG*)host_info->h_addr_list[0];
211 return 0;
212}
213
214void Initialize_MPacket( marius_packet* packet, short ID )
215{
216 memset( packet, 0, sizeof(marius_packet) );
217 packet->header.PacketSignature = htons(0xDEAD);
218 packet->header.PacketId = htons(ID);
219
220}
221
222void Initialize_LoginPacket( marius_packet* packet)
223{
224 int NameSize = 0;
225 int TeamSize = 0;
226 char (*test)[] = packet;
227 Initialize_MPacket(packet, pt_PlayerLogin);
228
229 packet->login.UpdateAppearance = 1;
230 packet->login.Platform = htons(1);
231 strncpy(packet->login.LoginId, MariusLogin, 32);
232 packet->login.EncryptionType = htons(1);
233 strcpy(packet->login.AppName, "MARATHON" ); //ONI ;)
234 strncpy(packet->login.BuildDate, __DATE__, 32 );
235 strncpy(packet->login.BuildTime, __TIME__, 32 );
236
237
238 packet->login.PlayerInfo.clientVersion = htons(5000);
239 NameSize = sprintf(packet->login.PlayerInfo.Name, MariusLogin);
240 //TeamSize = sprintf(packet->login.PlayerInfo.Name + NameSize, "TCTF") + 1;
241
242 packet->login.PlayerInfoSize = htons(40 + NameSize + TeamSize);
243}
244
245char EncryptionTypes[][32] =
246{
247 "Plaintext",
248 "Braindead Simple",
249};
250
251enum {
252 SyntaxError,
253 GamesNotAllowed,
254 InvalidVersion,
255 BadUserOrPassword,
256 UserNotLoggedIn,
257 BadMetaserverVersion,
258 UserAlreadyLoggedIn,
259 UnknownGameType,
260 LoginSuccessful,
261 LogoutSuccessful,
262 PlayerNotInRoom,
263 GameAlreadyExists,
264 AccountAlreadyLoggedIn,
265 RoomFull,
266 AccountLocked,
267 NotSupported
268};
269
270static const char* sRoomNames[] = {
271 "Crows Bridge",
272 "Otter Ferry",
273 "White Falls",
274 "Silvermines",
275 "Shoal",
276 "Madrigal",
277 "Tyr",
278 "Ash",
279 "Scales",
280 "Covenant",
281 "Muirthemne",
282 "Seven Gates",
283 "Bagrada",
284 "The Barrier",
285 "Forest Heart",
286 "The Ermine",
287 "The Dire Marsh",
288 "The Highlands",
289 "The Drowned Kingdom",
290 "The Great Devoid",
291 "Shiver",
292 "The Caterthuns",
293 "Soulblighter",
294 "Balor",
295 "Sons of Myrgard",
296 "Heart of the Stone",
297 "Arrival",
298 "Ingue Ferroque",
299 "Vimy Ridge",
300 "Stilwell Road"
301};
302void MSNet_LoginError_Output( int code )
303{
304 switch(code)
305 {
306 case(BadUserOrPassword):
307 DDrConsole_PrintF( "Login denied: bad username or password." );
308 break;
309 case(UserAlreadyLoggedIn):
310 DDrConsole_PrintF( "Login denied: that user is already logged in.");
311 break;
312 case(AccountAlreadyLoggedIn):
313 DDrConsole_PrintF( "Login denied: that account is already logged in.");
314 break;
315 case(RoomFull):
316 DDrConsole_PrintF( "Login denied: room is full!?");
317 break;
318 case(AccountLocked):
319 DDrConsole_PrintF( "Login denied: your account is locked.");
320 break;
321 default:
322 DDrConsole_PrintF("There was a problem connecting to the server"
323 "that tracks Internet games. Please try again later.");
324 break;
325 }
326
327}
328
329void MSNet_HandleChat( m_message* msg )
330{
331 //BGRA *cough*
332 /*RGBA chatcolor;
333 chatcolor.R = (msg->PrimaryColor.Red);
334 chatcolor.G = (msg->PrimaryColor.Green);
335 chatcolor.B = (msg->PrimaryColor.Blue);
336 chatcolor.A = 0;*/
337 char Message[1024];
338 int NameLen = /*THIS MIGHT BE BAD*/ snprintf( Message, 1024, "%s", msg->Message ) + 1;
339 /*THIS MIGHT BE BAD*/ snprintf( Message, 1024 - NameLen, "%s: %s", Message, msg->Message + NameLen );
340 //DDrConsole_PrintColored( msg->Message, 0, chatcolor,white );
341 DDrConsole_Print(Message);
342}
343
344void MSNet_SendChat( char* msg )
345{
346 marius_packet mPacket = {0};
347 int len;
348 if(!MsNet_Running || !MariusNet_LoggedIn) return;
349
350 Initialize_MPacket(&mPacket, pt_ChatMessage);
351
352
353 mPacket.message.SecondaryColor.Red = mPacket.message.SecondaryColor.Flags = -1;
354
355
356
357 //mPacket.message.Message = 'Gumby';
358 len = sprintf(mPacket.message.Message, "O %s", msg );
359 mPacket.message.Message[1] = 0;
360 mPacket.message.SenderId = htonl(PlayerID);
361 //mPacket.message.TargetId = -1;
362 MariusNet_OutgoingPacketWrapper(Room_Socket, (sockaddr*)&RoomAddr, (char*)&mPacket,
363 sizeof(marius_header) + sizeof(m_message) - (255 - len) );
364
365
366}
367
368void MSNet_RoomExit()
369{
370 if(MariusNet_LoggedIn)
371 {
372 if( Room_Socket != -1) closesocket(Room_Socket);
373 memset(StaticGameList, 0, sizeof(m_gameinfo) * 64);
374 MsNet_Running = 0;
375 MariusNet_LoggedIn = 0;
376
377 }
378 return;
379}
380
381
382int MSNet_Cleanup()
383{
384 if( Marius_Socket != -1) closesocket(Marius_Socket);
385 Marius_Socket = -1;
386 if( Room_Socket != -1) closesocket(Room_Socket);
387 Room_Socket = -1;
388 memset(RoomList, 0, sizeof(m_room) * 64 );
389 memset(StaticGameList, 0, sizeof(m_gameinfo) * 64);
390 DDrConsole_PrintF("The metaserver connection will now close." );
391 MsNet_Running = 0;
392 MariusNet_LoggedIn = 0;
393 return 1;
394}
395
396
397
398void MSNet_HandleGameList( m_gameinfo* PacketGames, int PacketSize )
399{
400 m_gameinfo TempGameList[64] = {0};
401 int i, k;
402 for( i = 0; PacketSize > 0; i++ )
403 {
404 int ThisSize = sizeof(m_gameinfo) + ntohs(PacketGames->len) - sizeof(m_gamedescription);
405
406 memcpy(TempGameList + i,PacketGames, sizeof(m_gameinfo) - 128);
407
408 /*THIS MIGHT BE BAD*/ snprintf( TempGameList[i].g.Buffer, 128, "%s", PacketGames->g.Buffer);
409 PacketSize -= ThisSize;
410 PacketGames = (m_gameinfo*)((char*)PacketGames + ThisSize);
411
412 }
413 for( i = 0; TempGameList[i].gameID; i++)
414 {
415 int DesiredID = 0;
416 switch(TempGameList[i].verb)
417 {
418 case(glRemoveGame):
419 //Remove game from list
420 DDrConsole_PrintF("%s has ended", TempGameList[i].g.Buffer);
421 for(k = 0; k < 64; k++)
422 {
423 if(TempGameList[i].gameID == StaticGameList[k].gameID)
424 {
425 memset(StaticGameList + k, 0, sizeof(m_gameinfo) );
426 break;
427 }
428
429 }
430 break;
431
432 case(glAddGame):
433 //Add game to list
434 DDrConsole_PrintF("%s has started", TempGameList[i].g.Buffer);
435 case(glUpdateGame):
436 //Update list
437
438 //If updating, look for the game to update, otherwise look for empty
439 if(TempGameList[i].verb) DesiredID = TempGameList[i].gameID;
440 for(k = 0; k < 64; k++)
441 {
442 if(DesiredID == StaticGameList[k].gameID)
443 {
444 memcpy(StaticGameList + k, TempGameList + i, sizeof(m_gameinfo) );
445 break;
446 }
447
448 }
449 break;
450 break;
451 }
452 //TempGame
453 }
454 //Do stuff with the games.
455}
456
457int MSNet_CreateGame( m_announcegame* Game )
458{
459 marius_packet mPacket;
460 Initialize_MPacket(&mPacket, 104);
461 mPacket.newgame = *Game;
462 MariusNet_OutgoingPacketWrapper(Room_Socket, (sockaddr*)&RoomAddr, (char*)&mPacket,
463 sizeof(marius_header) + sizeof(m_announcegame));
464}
465
466 /*
467 Initialize_MPacket(&mPacket, 104);
468 mPacket.newgame.g.maxplayers = -1;
469 mPacket.newgame.g.clientversion = htonl(0xc136e436);
470 mPacket.newgame.g.maxteams = -1;
471 //sprintf(mPacket.newgame.g.Buffer, "Oni!");
472 memcpy(mPacket.newgame.g.Buffer, "Blam!\0This is Oni, bitch.\0", 50);
473 sent_bytes = MariusNet_OutgoingPacketWrapper(Room_Socket, (sockaddr*)&RoomAddr, (char*)&mPacket,
474 sizeof(marius_header) + sizeof(m_announcegame) + 50);
475 */
476
477int MSNet_Room_Join( short Room, char* Key)
478{
479 marius_packet mPacket = {0};
480
481 char incomingData[1400] = {0};
482 marius_packet* incomingPacket = (marius_packet*)incomingData;
483 int sent_bytes = 0;
484
485 sockaddr_in SockAddr;
486 RoomAddr.sin_port = RoomList[Room].Port;
487 RoomAddr.sin_family = AF_INET;
488 RoomAddr.sin_addr.S_un.S_addr = RoomList[Room].IPAddress;
489
490 Room_Socket = NetTCPSocket_Create(RoomList[Room].Port, &SockAddr);
491
492 DDrConsole_PrintF("Joining room %hi", Room);
493
494 if(Room_Socket == -1)
495 {
496 DDrConsole_PrintF("Failed to initialize room socket!");
497 return MSNet_Cleanup();
498 }
499
500 if(connect( Room_Socket, (sockaddr *)&RoomAddr, sizeof(sockaddr_in)))
501 {
502 NetCatchError();
503 MariusNet_LoggedIn = 0;
504 return MSNet_Cleanup();
505 }
506
507 Initialize_MPacket(&mPacket, pt_ChatRoomLogin);
508 memcpy(mPacket.chatroom_join.RoomKey, Key, 32);
509 strcpy(mPacket.chatroom_join.Name, MariusLogin);
510 sent_bytes = MariusNet_OutgoingPacketWrapper(Room_Socket, (sockaddr*)&RoomAddr, (char*)&mPacket,
511 sizeof(marius_header) + 33 + strlen(MariusLogin));
512
513
514
515 Initialize_MPacket(&mPacket, pt_RoomPlayerInfo);
516 mPacket.player_info.clientVersion = htons(5000);
517 sprintf(mPacket.player_info.Name, MariusLogin);
518 sent_bytes = MariusNet_OutgoingPacketWrapper(Room_Socket, (sockaddr*)&RoomAddr, (char*)&mPacket,
519 sizeof(marius_header) + 40 + strlen(MariusLogin));
520
521 if(MariusNet_IncomingPacketWrapper(Room_Socket, incomingData, 1400, 0) == SOCKET_ERROR)
522 {
523 return MSNet_Cleanup();
524 }
525
526 if(ntohs(incomingPacket->header.PacketId)== pt_LoginInfo)
527 {
528 //DDrConsole_PrintF("Login failed: %s", incomingPacket->login_denied.DenialMessage );
529 MSNet_LoginError_Output(ntohl(incomingPacket->login_denied.code));
530 return MSNet_Cleanup();
531 }
532
533 MariusNet_LoggedIn = 1;
534
535
536 while(1)
537 {
538 if(MariusNet_IncomingPacketWrapper(Room_Socket, incomingData, 1400, 0) == SOCKET_ERROR)
539 {
540 return 0;
541 }
542 switch(ntohs(incomingPacket->header.PacketId))
543 {
544 case pt_RoomList:
545 case pt_PlayerInfo:
546 case pt_PlayerList:
547 //Do nothing for now
548 break;
549 case pt_GameList:
550 MSNet_HandleGameList( incomingPacket->gamelist.Games,
551 ntohl(incomingPacket->header.PacketSize) - sizeof(marius_header));
552 break;
553 case pt_BlueBarMsg:
554 DDrConsole_PrintColored(incomingPacket->motd.Message, 0, cyan, grey );
555 break;
556 case pt_ChatMessage:
557 MSNet_HandleChat(&incomingPacket->message);
558 break;
559 case pt_KeepAlive:
560 MariusNet_OutgoingPacketWrapper(Room_Socket, (sockaddr*)&RoomAddr, incomingData,
561 sizeof(marius_header));
562 break;
563 default:
564 DDrConsole_PrintF("Got packet of type %hi", ntohs(incomingPacket->header.PacketId));
565 break;
566 }
567 }
568
569 return 0;
570}
571
572DWORD WINAPI MSNet_Handler(void* unused)
573{
574 int Port = 4156;
575
576
577 char RoomToken[33] = {0};
578 int i = 0;
579
580
581
582 sockaddr_in Marius_Addr = {0};
583 if(MsNet_Running)
584 {
585 DDrConsole_PrintF("The metaserver handler is already running!");
586 }
587 MsNet_Running = 1;
588
589 if(MariusNet_LoggedIn)
590 {
591 DDrConsole_PrintF("You're already logged in!");
592 return MSNet_Cleanup();
593 }
594
595 NetPlatform_Initalize();
596
597
598 if(MariusNet_Initialize())
599 {
600 return MSNet_Cleanup();
601 }
602
603 //Horribly set up.
604 while( (Marius_Socket == -1 || Marius_Socket == 0 )&& Port < 6641)
605 {
606
607 //Marius_Socket = NetTCPSocket_Create(Port, &Marius_Addr);
608 //NetUDPSocket_Close( Marius_Socket );
609 Marius_Socket = NetTCPSocket_Create(Port, &Marius_Addr);
610 //Port++;
611 }
612
613 if(Marius_Socket != -1)
614 {
615 unsigned char incomingData[1400] = {0};
616 short incomingLength = 0;
617 marius_packet* incomingPacket = &incomingData;
618 //Initialize
619 marius_packet mPacket;
620 int sent_bytes;
621 Initialize_LoginPacket(&mPacket);
622
623 DDrConsole_PrintF("Logging into Mariusnet <%s>...", inet_ntoa(Marius_Server.sin_addr));
624 if(connect( Marius_Socket, &Marius_Server, sizeof(sockaddr_in)))
625 {
626 NetCatchError();
627 return MSNet_Cleanup();
628 }
629 DDrConsole_PrintF("Sending Player Info...");
630 sent_bytes = MariusNet_OutgoingPacketWrapper(Marius_Socket, (sockaddr*)&Marius_Server, (char*)&mPacket,
631 sizeof(marius_header) + sizeof(m_player_login) - (sizeof(m_player_info) - ntohs(mPacket.login.PlayerInfoSize) ) );
632 /*
633 if(!NetUDPSocket_Recieve(Marius_Socket, (sockaddr*)&Marius_Addr,incomingData, &incomingLength))
634 {
635 DDrConsole_PrintF("Data: %s Length %i", incomingData, incomingLength);
636 return 0;
637 }
638 */
639 if(MariusNet_IncomingPacketWrapper(Marius_Socket, incomingData, 1400, 0) == SOCKET_ERROR)
640 {
641 return MSNet_Cleanup();
642 }
643
644 if(ntohs(incomingPacket->header.PacketId)== pt_EncryptionKey)
645 {
646 //recv( Marius_Socket, incomingData, 1440, 0);
647 DDrConsole_PrintF("Encryption Type %s", EncryptionTypes[ntohs(incomingPacket->salt.EncryptionType)] );
648
649 Initialize_MPacket(&mPacket, pt_Password);
650 if(incomingPacket->salt.EncryptionType)
651 {
652
653 unsigned char* Hash = mPacket.password.passHash;
654 unsigned char* Salt = incomingPacket->salt.salt;
655 unsigned char Pass[16] = {0};
656
657 memset(Pass, 0x23, 16);
658 strcpy(Pass, MariusPassword );
659
660 for( i = 0; i < 16; i++ ) Hash[i] = Pass[i]^Salt[i];
661 for( i = 1; i < 16; i++ ) Hash[i] = Hash[i]^Hash[i-1];
662 for( i = 1; i < 16; i++ )
663 {
664 short value = ~( Hash[i]*Hash[i-1] );
665 Hash[i] = (unsigned char) value;
666
667 }
668 }
669 else
670 {
671 strncpy(mPacket.password.passHash, MariusPassword, 16);
672 }
673
674 DDrConsole_PrintF("Sending Password...");
675 sent_bytes = MariusNet_OutgoingPacketWrapper(Marius_Socket, (sockaddr*)&Marius_Server, (char*)&mPacket, sizeof(marius_header) + sizeof(m_password) );
676
677 if(!NetUDPSocket_Recieve(Marius_Socket, (sockaddr*)&Marius_Addr,incomingData, &incomingLength))
678 {
679 return MSNet_Cleanup();
680 }
681 DDrConsole_PrintF("Password ACK!");
682 if(ntohs(incomingPacket->header.PacketId)== pt_PasswordAck)
683 {
684
685 Initialize_MPacket(&mPacket, pt_Localization);
686 mPacket.localization.one = htonl(1);
687 mPacket.localization.two = htonl(2);
688 mPacket.localization.three = htonl(3);
689 mPacket.localization.zero = 0;
690 sent_bytes = MariusNet_OutgoingPacketWrapper(Marius_Socket, (sockaddr*)&Marius_Server, (char*)&mPacket, sizeof(marius_header) + sizeof(m_localization) );
691
692 if(MariusNet_IncomingPacketWrapper(Marius_Socket, incomingData, 1400, 0) == SOCKET_ERROR)
693 {
694 return MSNet_Cleanup();
695 }
696 }
697 }
698
699 if(ntohs(incomingPacket->header.PacketId)== pt_UserLoggedIn)
700 {
701 PlayerID = ntohl(incomingPacket->login_success.userID);
702 //Not sure if this is a string or byte array, so I allocated 33 bytes,
703 //so it always zero terminates.
704 memcpy(RoomToken, incomingPacket->login_success.Token, 32);
705 DDrConsole_PrintF("Logged into Mariusnet!");
706 //strcpy_s( player_name, 32, MariusLogin );
707 strncpy(player_name,MariusLogin,32);
708 }
709 else if(ntohs(incomingPacket->header.PacketId)== pt_LoginInfo)
710 {
711 //DDrConsole_PrintF("Login failed: %s", incomingPacket->login_denied.DenialMessage );
712 MSNet_LoginError_Output(ntohl(incomingPacket->login_denied.code));
713 return MSNet_Cleanup();
714 }
715 else
716 {
717 return MSNet_Cleanup();
718 }
719
720
721 do
722 {
723 if(MariusNet_IncomingPacketWrapper(Marius_Socket, incomingData, 1400, 0) == SOCKET_ERROR)
724 {
725 return MSNet_Cleanup();
726 }
727 if(ntohs(incomingPacket->header.PacketId)== pt_RoomList)
728 {
729 DDrConsole_PrintF("Got room list!");
730 RoomListGotten = 1;
731 memcpy(RoomList, incomingPacket->roomlist.Rooms,
732 ntohl(incomingPacket->header.PacketSize) - sizeof(marius_header));
733 }
734 else if(ntohs(incomingPacket->header.PacketId)== pt_PlayerInfo)
735 {
736 //What do we do with this?!
737 DDrConsole_PrintF("Got player info!");
738 }
739 else
740 {
741 DDrConsole_PrintF("Invalid packet type %hi", ntohs(incomingPacket->header.PacketId));
742 return MSNet_Cleanup();
743 }
744 }
745 while(PacketCached || !RoomListGotten);
746
747 for(i = 0; i < 64, RoomList[i].IPAddress != 0 ; i++)
748 {
749 int IP = ntohl(RoomList[i].IPAddress);
750 DDrConsole_PrintF("Room %i %s IP %s Port %hi Players %hi",
751 i,
752 sRoomNames[ntohs(RoomList[i].RoomIndex)],
753 inet_ntoa(*(in_addr*)&IP),
754 ntohs(RoomList[i].Port),
755 ntohs(RoomList[i].PlayerCount)
756 );
757 }
758
759 closesocket(Marius_Socket);
760
761 MSNet_Room_Join( 0, RoomToken );
762
763
764 }
765 return 0;
766}
767
768uint16_t ONICALL mnet_joingame(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
769{
770 int index = args[0].val.value_int32;
771 if(index >= 0)
772 {
773 FLcConnect(StaticGameList[index].ipAddress, StaticGameList[index].port);
774 }
775 return 0;
776}
777
778unsigned char MSNet_Login(char* username, char* password)
779{
780 /*THIS MIGHT BE BAD*/ snprintf(MariusLogin, 32, "%s", username);
781 /*THIS MIGHT BE BAD*/ snprintf(MariusPassword, 16, "%s", password);
782 CreateThread(NULL, 0, MSNet_Handler, NULL, 0, 0);
783
784 return 0;
785}
786
Note: See TracBrowser for help on using the repository browser.