private static void HandleToClient(string source, MessageReader packet) { var messageType = (MessageType)packet.Tag; Console.ForegroundColor = ConsoleColor.Cyan; //Console.WriteLine($"{source,-15} Client received: {packet.Tag,-2} {messageType}"); try { var reader = packet.GetHazelReader(); var body = reader.PeekToEnd(); if (SaveMessages) { File.WriteAllBytes(Path.Combine(MessageFolder, $"recv_{packet.Tag}_{allId++}.bin"), body); } switch (messageType) { case MessageType.ReselectServer: var reselect = ReselectServer.Deserialize(reader); DumpToConsole(reselect); break; case MessageType.Redirect: var redirect = Redirect.Deserialize(reader); DumpToConsole(redirect); break; case MessageType.HostGame: var host = HostGameResponse.Deserialize(reader); DumpToConsole(host); break; case MessageType.JoinGame: var join = JoinGameResponse.Deserialize(reader); DumpToConsole(join); break; case MessageType.GameData: var gamedata = GameData.Deserialize(reader); foreach (var item in gamedata) { HandleGameData(item, false); } //Directory.CreateDirectory("gamedata"); //File.WriteAllBytes(Path.Combine("gamedata", $"recv_data_{gamedataId++}.bin"), body); break; case MessageType.GameDataTo: var gamedatato = GameDataTo.Deserialize(reader); foreach (var item in gamedatato) { HandleGameDataTo(item, false); } break; case MessageType.JoinedGame: var joined = JoinedGame.Deserialize(reader); DumpToConsole(joined); break; case MessageType.AlterGame: var alter = AlterGameResponse.Deserialize(reader); DumpToConsole(alter); break; case MessageType.GetGameListV2: var gamelist = GetGameListV2Response.Deserialize(reader); DumpToConsole(gamelist); break; case MessageType.RemovePlayer: var removeplayer = RemovePlayerResponse.Deserialize(reader); DumpToConsole(removeplayer); break; case MessageType.StartGame: var start = StartGame.Deserialize(reader); DumpToConsole(start); if (BreakOnGameStart) { Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } break; case MessageType.EndGame: var end = EndGame.Deserialize(reader); DumpToConsole(end); if (BreakOnGameEnd) { Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } //Clear Entities to prevent collisions EntityTracker.entities.Clear(); break; default: Console.WriteLine($"Unhandled Message: {messageType} size: {body.Length}"); return; } if (reader.GetBytesLeft() > 0 && LogNotConsumed) { Console.WriteLine($"[{messageType}]{reader.GetBytesLeft()} bytes not cunsumed"); } } catch (Exception ex) { Console.WriteLine("Error handling ToClient: " + ex.Message); } }
// ParseNetMessage accepts input of raw bytes from a NetMessage. Parses and returns a Net message. public static INet Parse(ushort msgType, byte[] content) { INet msg = null; MsgType mt = (MsgType)msgType; switch (mt) { case MsgType.Multipart: msg = new Multipart(); break; case MsgType.Heartbeat: msg = new Heartbeat(); break; case MsgType.Connected: msg = new Connected(); break; case MsgType.Disconnected: msg = new Disconnected(); break; case MsgType.CreateAcct: msg = new CreateAcct(); break; case MsgType.CreateAcctResp: msg = new CreateAcctResp(); break; case MsgType.Login: msg = new Login(); break; case MsgType.LoginResp: msg = new LoginResp(); break; case MsgType.Character: msg = new Character(); break; case MsgType.ListGames: msg = new ListGames(); break; case MsgType.ListGamesResp: msg = new ListGamesResp(); break; case MsgType.CreateGame: msg = new CreateGame(); break; case MsgType.CreateGameResp: msg = new CreateGameResp(); break; case MsgType.JoinGame: msg = new JoinGame(); break; case MsgType.GameConnected: msg = new GameConnected(); break; case MsgType.GameMasterFrame: msg = new GameMasterFrame(); break; case MsgType.Entity: msg = new Entity(); break; case MsgType.MovePlayer: msg = new MovePlayer(); break; case MsgType.UseAbility: msg = new UseAbility(); break; case MsgType.AbilityResult: msg = new AbilityResult(); break; case MsgType.EndGame: msg = new EndGame(); break; } MemoryStream ms = new MemoryStream(content); msg.Deserialize(new BinaryReader(ms)); return(msg); }