public void ReadIncomingMsg() { NetIncomingMessage msg; while ((msg = server.ReadMessage()) != null) { switch (msg.MessageType) { case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.WarningMessage: case NetIncomingMessageType.ErrorMessage: Console.WriteLine(msg.ReadString()); break; case NetIncomingMessageType.StatusChanged: NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte(); if (status == NetConnectionStatus.Connected) { int id = GetUniqueClientId(); NetworkClient newClient = new NetworkClient(id, msg.SenderConnection); clientList.Add(msg.SenderConnection, newClient); Console.WriteLine(newClient.Pseudo + " connected"); ClientInfo ci = new ClientInfo(id); ci.Pseudo = newClient.Pseudo; SendPkt(ci, msg.SenderConnection, true); Player p = new Player(map, imageManager); map.AddPlayer(p); newClient.Player = p; SendFullWorldUpdate(msg.SenderConnection); SendFullClientInfo(msg.SenderConnection); } else if (status == NetConnectionStatus.Disconnected) { if (clientList.ContainsKey(msg.SenderConnection)) { NetworkClient c = clientList[msg.SenderConnection]; clientList.Remove(c.Connection); map.DeletePlayer(c.Player); Console.WriteLine("Client " + c.Pseudo + " disconnected"); ClientDisconnect cd = new ClientDisconnect(c.ClientId); SendPktToAll(cd, true); } } break; case NetIncomingMessageType.Data: ReadPacket(msg); break; default: Console.WriteLine("Unhandled type: " + msg.MessageType); break; } server.Recycle(msg); } }
private void ReadPacket(NetIncomingMessage msg) { switch (msg.PeekByte ()) { case Packet.CLIENTINFO: ClientInfo ci = ClientInfo.decode (ref msg); if(clientId == - 1){ clientId = ci.ClientId; } else if (ci.ClientId != clientId ){ if(otherClients.ContainsKey(ci.ClientId)){ NetworkClient c = otherClients[ci.ClientId]; c.Pseudo = ci.Pseudo; c.Player.Color = ci.Color; } else { NetworkClient newClient = new NetworkClient(ci.ClientId, null); newClient.Player = new Player(map, imageManager); newClient.Player.Color = ci.Color; newClient.Pseudo = ci.Pseudo; map.AddPlayer(newClient.Player); otherClients.Add(newClient.ClientId, newClient); } } break; case Packet.USERMESSAGE: UserMessage uMsg = UserMessage.decode(ref msg); if(uMsg.ClientId == clientId){ uMsgBuffer.clientCorrection(player, uMsg); } else { if(otherClients.ContainsKey(uMsg.ClientId)){ NetworkClient c = otherClients[uMsg.ClientId]; c.Player.LookAt(uMsg.EyePosition); c.Player.Layer = uMsg.Layer; if(VectorUtils.Distance(c.Player.Position, uMsg.Position) > 1){ c.Player.Position = uMsg.Position; } else c.Player.Position += (c.Player.Position - uMsg.Position) * 0.1F; return; } } break; case Packet.BLOCKUPDATE: BlockUpdate bu = BlockUpdate.decode(ref msg); if(bu.Added) map.ForceAddCube(bu.Position, bu.BlockType, bu.Layer); else map.DeleteCube(bu.Position, bu.Layer); break; case Packet.CLIENTDISCONNECT: ClientDisconnect cd = ClientDisconnect.decode(ref msg); if(otherClients.ContainsKey(cd.ClientId)){ NetworkClient c = otherClients[cd.ClientId]; otherClients.Remove(c.ClientId); map.DeletePlayer(c.Player); } break; case Packet.CHATMESSAGE: ChatMessage cm = ChatMessage.decode(ref msg); chat.addMsg(cm.Pseudo +": " + cm.Message); break; default: break; } }