void ParseAndProcess(NetPacket np) { INet parsedMsg = Messages.Parse(np.message_type, np.Content()); // Read from message queue and process! // Send updates to each object. switch ((MsgType)np.message_type) { case MsgType.Multipart: Multipart mpmsg = (Multipart)parsedMsg; // 1. If this group doesn't exist, create it if (!this.multipart_cache.ContainsKey(mpmsg.GroupID)) { this.multipart_cache[mpmsg.GroupID] = new Multipart[mpmsg.NumParts]; } // 2. Insert message into group this.multipart_cache[mpmsg.GroupID][mpmsg.ID] = mpmsg; // 3. Check if all messages exist bool complete = true; int totalContent = 0; foreach (Multipart m in this.multipart_cache[mpmsg.GroupID]) { if (m == null) { complete = false; break; } totalContent += m.Content.Length; } // 4. if so, group up bytes and call 'messages.parse' on the content if (complete) { byte[] content = new byte[totalContent]; int co = 0; foreach (Multipart m in this.multipart_cache[mpmsg.GroupID]) { System.Buffer.BlockCopy(m.Content, 0, content, co, m.Content.Length); co += m.Content.Length; } NetPacket newpacket = NetPacket.fromBytes(content); if (newpacket == null) { Debug.LogError("Multipart message content parsing failed... we done goofed"); } this.ParseAndProcess(newpacket); } // 5. clean up! break; case MsgType.LoginResp: LoginResp lr = ((LoginResp)parsedMsg); characters.Add(lr.Character); accounts.Add(lr.AccountID); break; case MsgType.CreateAcctResp: CreateAcctResp car = ((CreateAcctResp)parsedMsg); accounts.Add(car.AccountID); characters.Add(car.Character); break; case MsgType.ListGamesResp: ListGamesResp resp = ((ListGamesResp)parsedMsg); for (int j = 0; j < resp.IDs.Length; j++) { GameInstance ni = new GameInstance(); ni.ID = resp.IDs[j]; ni.Name = resp.Names[j]; } break; case MsgType.GameConnected: GameConnected gc = ((GameConnected)parsedMsg); // TODO: handle connecting to a game! break; case MsgType.CreateGameResp: CreateGameResp cgr = ((CreateGameResp)parsedMsg); GameInstance gi = new GameInstance(); gi.Name = cgr.Name; gi.ID = cgr.Game.ID; gi.entities = cgr.Game.Entities; games.Add(gi); Debug.Log("Added game: " + gi.Name); break; case MsgType.GameMasterFrame: GameMasterFrame gmf = ((GameMasterFrame)parsedMsg); Debug.Log("masterframe for gameID:" + gmf.ID.ToString()); for (int i = 0; i < games.Count; i++) { if (games[i].ID == gmf.ID) { Debug.Log("Updating game entities"); games[i].entities = gmf.Entities; } } break; } }
private void ListGamesImpl(ListGamesReq req, ListGamesResp resp) { resp.Games = Server.GameManager .ListGames(Server.TeamRegistry.GetTeam(req.Auth.TeamName)) .Select(g => new EnGameInfo(g)).ToList(); }
// 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); }