Inheritance: System.EventArgs
        public void Update()
        {
            NetIncomingMessage message;

            while ((message = _netServer.ReadMessage()) != null)
            {
                switch (message.MessageType)
                {
                    case NetIncomingMessageType.Data:
                        PacketType packetType = (PacketType)message.ReadInt16();

                        if (_packetHandlers.ContainsKey(packetType))
                        {
                            var eventArgs = new PacketReceivedEventArgs(message, message.SenderConnection);

                            foreach (var handler in _packetHandlers[packetType])
                                handler.Invoke(eventArgs);
                        }
                        break;

                    case NetIncomingMessageType.ConnectionApproval:
                        message.SenderConnection.Approve();
                        break;

                    case NetIncomingMessageType.StatusChanged:
                        if (message.SenderConnection.Status == NetConnectionStatus.Connected)
                        {
                            Console.WriteLine("Established connection with {0}.", message.SenderConnection.ToString());

                            if (this.Connection_Received != null)
                                this.Connection_Received.Invoke(this, new ConnectionEventArgs(message.SenderConnection));
                        }
                        else if (message.SenderConnection.Status == NetConnectionStatus.Disconnected)
                        {
                            Console.WriteLine("Lost connection with {0}.", message.SenderConnection.ToString());

                            if (this.Connection_Lost != null)
                                this.Connection_Lost.Invoke(this, new ConnectionEventArgs(message.SenderConnection));
                        }
                        break;

                    case NetIncomingMessageType.DiscoveryRequest:
                        NetOutgoingMessage response = _netServer.CreateMessage();
                        _netServer.SendDiscoveryResponse(response, message.SenderEndPoint);
                        break;

                    case NetIncomingMessageType.DebugMessage:
                        Console.WriteLine(message.ReadString());
                        break;

                    case NetIncomingMessageType.WarningMessage:
                        Console.WriteLine(message.ReadString());
                        break;

                    case NetIncomingMessageType.ErrorMessage:
                        Console.WriteLine(message.ReadString());
                        break;
                }
            }
        }
        private void HandlePlayerRegister(PacketReceivedEventArgs args)
        {
            var username = args.Message.ReadString();
            var password = args.Message.ReadString();

            var player = this.GetPlayer(args.Connection.RemoteUniqueIdentifier);
            player.Name = username;
            player.Password = password;

            var registrationOkay = this.RegisterPlayer(player);

            Packet packet = new Packet(PacketType.RegistrationPacket);
            packet.Message.Write(registrationOkay);

            if (registrationOkay)
            {
                packet.Message.Write("Your account has been registered, logging in now...");
                packet.Message.Write(args.Connection.RemoteUniqueIdentifier);
                player.Connection.SendMessage(packet.Message, NetDeliveryMethod.ReliableOrdered, (int)ChannelTypes.WORLD);
                player.EnterGame();
            }
            else
            {
                packet.Message.Write("Your account has failed to register...");
            }
        }
        private void HandlePlayerMovement(PacketReceivedEventArgs args)
        {
            Vector vector = args.Message.ReadVector();
            byte direction = args.Message.ReadByte();

            var player = this.GetPlayer(args.Connection.RemoteUniqueIdentifier);
            player.MoveTo(vector, direction);
        }
        private void HandlePlayerLogin(PacketReceivedEventArgs args)
        {
            string username = args.Message.ReadString();
            string password = args.Message.ReadString();

            var player = this.GetPlayer(args.Connection.RemoteUniqueIdentifier);
            player.Name = username;
            player.Password = password;

            bool loginOkay = this.LoginPlayer(args.Connection.RemoteUniqueIdentifier);

            Packet packet = new Packet(PacketType.LoginPacket);
            packet.Message.Write(loginOkay);

            if (loginOkay)
            {
                packet.Message.Write("Login sucess!");
                packet.Message.Write(args.Connection.RemoteUniqueIdentifier);
                player.Connection.SendMessage(packet.Message, NetDeliveryMethod.ReliableOrdered, (int)ChannelTypes.WORLD);

                player.EnterGame();
            }
            else
            {
                // Login failure.
            }
        }
        private void HandlePickupItem(PacketReceivedEventArgs args)
        {
            Vector vector = args.Message.ReadVector();

            var player = this.GetPlayer(args.Connection.RemoteUniqueIdentifier);
            player.TryPickupItem(vector);
        }
        private void HandleMapCheck(PacketReceivedEventArgs args)
        {
            var player = this.GetPlayer(args.Connection.RemoteUniqueIdentifier);

            var response = args.Message.ReadBoolean();

            if (response == false)
            {
                Packet packet = new Packet(PacketType.MapDataPacket);
                packet.Message.Write(player.Map.GetMapData());

                player.Connection.SendMessage(packet.Message, NetDeliveryMethod.ReliableOrdered, (int)ChannelTypes.WORLD);
                return;
            }

            // The player is now in the map.
            // Set their inMap variable to true.
            // This is to make sure they're able to actually see the map before any map updates occur.
            player.InMap = true;

            player.SendPlayerData();

            // Send all of the players...
            foreach (var mapPlayer in player.Map.GetPlayers())
            {
                if (mapPlayer == player) continue;

                Packet packet = new Packet(PacketType.PlayerDataPacket);
                packet.Message.Write(mapPlayer.GetPlayerData());
                player.Connection.SendMessage(packet.Message, NetDeliveryMethod.ReliableOrdered, (int)ChannelTypes.WORLD);
            }

            // Send all of the items currently spawned in the map.
            foreach (var mapItem in player.Map.GetMapItems())
            {
                Packet packet = new Packet(PacketType.SpawnMapItemPacket);
                packet.Message.Write(mapItem.Item.Name);
                packet.Message.Write(mapItem.Item.TextureNumber);
                packet.Message.Write(mapItem.Position);
                packet.Message.Write(mapItem.SpawnDuration);
                player.Connection.SendMessage(packet.Message, NetDeliveryMethod.ReliableOrdered, (int)ChannelTypes.WORLD);
            }
        }
        private void HandleDropItem(PacketReceivedEventArgs args)
        {
            var slotNum = args.Message.ReadInt32();

            var player = this.GetPlayer(args.Connection.RemoteUniqueIdentifier);
            player.DropItem(slotNum);
        }
        private void HandleChatMessage(PacketReceivedEventArgs args)
        {
            var player = this.GetPlayer(args.Connection.RemoteUniqueIdentifier);

            var chatMessage = player.Name + " says: " + args.Message.ReadString();

            Packet packet = new Packet(PacketType.ChatMessagePacket);
            packet.Message.Write(chatMessage);
            player.Map.SendPacket(packet, NetDeliveryMethod.Unreliable, ChannelTypes.CHAT);
        }