[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 |
|
---|
| 12 | char MariusLogin[32]={0};
|
---|
| 13 | unsigned char MariusPassword[16]={0};
|
---|
| 14 |
|
---|
| 15 | m_room RoomList[64] = {0};
|
---|
| 16 | unsigned char RoomListGotten = 0;
|
---|
| 17 |
|
---|
| 18 | unsigned char MariusNet_LoggedIn = 0;
|
---|
| 19 |
|
---|
| 20 | unsigned char MsNet_Running = 0;
|
---|
| 21 | int Marius_Socket = -1;
|
---|
| 22 | int Room_Socket = -1;
|
---|
| 23 | sockaddr_in RoomAddr = {0};
|
---|
| 24 | int PlayerID = 0;
|
---|
| 25 |
|
---|
| 26 | m_gameinfo StaticGameList[64] = {0};
|
---|
| 27 | enum
|
---|
| 28 | {
|
---|
| 29 | glAddGame,
|
---|
| 30 | glRemoveGame,
|
---|
| 31 | glUpdateGame,
|
---|
| 32 | };
|
---|
| 33 |
|
---|
| 34 | /*
|
---|
| 35 |
|
---|
| 36 | RGBA green = {0, 0xFF, 0, 0};
|
---|
| 37 | RGBA red = {0, 0, 0xFF, 0};
|
---|
| 38 |
|
---|
| 39 | RGBA grey = {0x80,0x80,0x80,0x80};
|
---|
| 40 | */
|
---|
| 41 | extern RGBA red;
|
---|
| 42 | //extern RGBA blue;
|
---|
| 43 | RGBA blue = {0xFF, 0, 0, 0};
|
---|
| 44 | RGBA cyan = {0xFF, 0xFF, 0, 0};
|
---|
| 45 | RGBA white = {0xFF, 0xFF, 0xFF, 0};
|
---|
| 46 | extern RGBA green;
|
---|
| 47 | extern RGBA grey;
|
---|
| 48 |
|
---|
| 49 | typedef struct
|
---|
| 50 | {
|
---|
| 51 | uint16_t x;
|
---|
| 52 | uint16_t y;
|
---|
| 53 |
|
---|
| 54 | } IMtPoint2D;
|
---|
| 55 | void* DrawInstance = 0;
|
---|
| 56 | void 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 |
|
---|
| 97 | int 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 |
|
---|
| 106 | int PacketCached = 0;
|
---|
| 107 | int 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 |
|
---|
| 194 | sockaddr_in Marius_Server;
|
---|
| 195 |
|
---|
| 196 |
|
---|
| 197 | unsigned 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 |
|
---|
| 214 | void 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 |
|
---|
| 222 | void 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 |
|
---|
| 245 | char EncryptionTypes[][32] =
|
---|
| 246 | {
|
---|
| 247 | "Plaintext",
|
---|
| 248 | "Braindead Simple",
|
---|
| 249 | };
|
---|
| 250 |
|
---|
| 251 | enum {
|
---|
| 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 |
|
---|
| 270 | static 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 | };
|
---|
| 302 | void 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 |
|
---|
| 329 | void 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 |
|
---|
| 344 | void 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 |
|
---|
| 368 | void 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 |
|
---|
| 382 | int 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 |
|
---|
| 398 | void 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 |
|
---|
| 457 | int 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 |
|
---|
| 477 | int 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 |
|
---|
| 572 | DWORD 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 |
|
---|
| 768 | uint16_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 |
|
---|
| 778 | unsigned 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 |
|
---|