Example #1
0
        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);
            }
        }
Example #2
0
        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;
            }
        }