private bool HandlePayload(NetworkPayload payload)
        {
            if ((_state != ConnectionState.LoggedIn || !IsLoggedIn) && payload.Type != PayloadType.Auth)
            {
                ConsoleWrite("ERROR: AUTH not competed. Closing connection");
                return false;
            }
            _lastActivity = DateTime.Now;

            switch (payload.Type)
            {
                case PayloadType.Move:
                    if (payload.Params.Count() == 3)
                    {
                        string who = payload.Params[0]; // should be "self". TODO: fix security
                        int col = int.Parse(payload.Params[1]);
                        int row = int.Parse(payload.Params[2]);
                        LoggedInUser.MoveTo(new Position2D(col, row));
                    }
                    else
                    {
                        ConsoleWrite("Error on command mv. Unknown parameter count: " + payload.Params.Count());
                    }
                    break;
                case PayloadType.Message:
                    // Message
                    _lastActivity = DateTime.Now;
                    if (payload.Params.Any())
                    {
                        if (payload.Params[0].Trim().Length > 0)
                        {
                            FadingWorldsServer.Instance.TCPPool.SendPayloadToAll(new NetworkPayload
                            {
                                Type = PayloadType.Message,
                                Params = {LoggedInUser.ToString(), payload.Params[0]}
                            });
                            //FadingWorldsServer.Instance.TCPPool.SendMessageToAll("ms|" + LoggedInUser + "|" + payload.Params[0].Trim());
                        }
                        else
                        {
                            // Empty message
                        }
                    }
                    else
                    {
                        // no parameters??
                    }

                    break;
                case PayloadType.Auth:
                    if (!payload.Params.Any())
                    {
                        ConsoleWrite("Missing parametres to auth command");
                        return false;
                    }

                    switch (payload.Command)
                    {
                        case  PayloadCommand.Helo:
                            if (payload.Params.Count == 1)
                            {
                                string version = payload.Params[0];
                                _clientVersion = version;

                                //check for outdated version
                                //if (version == "1.0.0.0")
                                //{
                                //    SendCommand("au|oldversion");
                                //    return false;
                                //}
                                ConsoleWrite("Client connecting with version " + _clientVersion);
                                SendPayload(new NetworkPayload()
                                {
                                    Type = PayloadType.Auth,
                                    Command = PayloadCommand.AuthPlease,
                                    Params = { _server.Version }
                                });
                               // SendCommand("au|authplease");
                                return true;
                            }
                            else
                            {
                                ConsoleWrite("Missing version to auth helo command");
                                return false;
                            }

                        case PayloadCommand.Login:
                            if (payload.Params.Count == 2)
                            {
                                string username = payload.Params[0];
                                string password = payload.Params[1];
                                //string ip = _client.Client.RemoteEndPoint.ToString().Split(':')[0];

                                // Check if user exists
                                var users =
                                    FadingWorldsServer.Instance.UserDB.Users.Where(
                                        e => e.Username.ToLower().Equals(username.ToLower()));
                                if (!users.Any())
                                {
                                    ConsoleWrite("Unknown user: "******"sy|logged-in-on-another-location");
                                        FadingWorldsServer.Instance.TCPPool.DisconnectUser(username);
                                    }

                                    if (login.Health <= 0)
                                    {
                                        login.Reset();
                                    }

                                    LoggedInUser = login;
                                    _state = ConnectionState.LoggedIn;
                                    ConsoleWrite("Username: "******"au|ok|" + ConnectionID);
                                    if (LoggedInUser.Position.IsInvalid)
                                    {
                                        LoggedInUser.Position =
                                            FadingWorldsServer.Instance.TheGrid.FindRandomEmptyGrassBlock();
                                    }

                                    return true;
                                }
                                else
                                {
                                    ConsoleWrite("Invalid password!");
                                    SendPayload(new NetworkPayload()
                                    {
                                        Type = PayloadType.Auth,
                                        Command = PayloadCommand.Fail,

                                    });
                                    //SendCommand("au|failed");
                                    return false;
                                }
                            }
                            else
                            {
                                ConsoleWrite("wrong number of args");
                                SendPayload(new NetworkPayload()
                                {
                                    Type = PayloadType.Auth,
                                    Command = PayloadCommand.Fail,

                                });
                                return false;
                                // wrong number of args
                            }

                            //case "version":
                            //  if (parms.Length == 2) {
                            //    string version = parms[1];
                            //    _clientVersion = version;
                            //    ConsoleWrite("	- Version: " + _clientVersion);
                            //    SendCommand("au|ok");
                            //    return true;
                            //    //_parentProcess.PreDB.ResetObject(lgn);
                            //  }
                            //  else {
                            //    ConsoleWrite("wrong number of args");
                            //    SendCommand("au|failed");
                            //    return false;
                            //  }

                        default:
                            ConsoleWrite("unknown format on auth command ");
                            SendPayload(new NetworkPayload()
                            {
                                Type = PayloadType.Auth,
                                Command = PayloadCommand.Fail,

                            });
                            return false;
                    }
                case PayloadType.Data:

                    switch (payload.Command)
                    {
                        case PayloadCommand.GetMap:
                            SendPayload(new NetworkPayload()
                            {
                                Type = PayloadType.Data,
                                Command = PayloadCommand.Map,
                                Params =
                                {
                                    FadingWorldsServer.Instance.TheGrid.Width+"",
                                    FadingWorldsServer.Instance.TheGrid.Height+"",
                                    FadingWorldsServer.Instance.TheGrid.DumpMapBlocks()
                                }

                            });
                            break;
                        case PayloadCommand.MapLoaded:
                            SendPayload(new NetworkPayload()
                            {
                                Type = PayloadType.Data,
                                Command = PayloadCommand.PleaseLoadGame,

                            });
                           // SendCommand("da|pleaseloadgame");
                            break;
                        case PayloadCommand.GameLoaded:
                            //FadingWorldsServer.Instance.TCPPool.SendMessageToAllButUser(LoggedInUser.Username,
                            //    "us|login|" + LoggedInUser.MakeDump());
                            FadingWorldsServer.Instance.TCPPool.SendPayloadToAllButUser(LoggedInUser.Username, new NetworkPayload()
                            {
                                Type = PayloadType.User,
                                Command = PayloadCommand.Login,
                                Params = { LoggedInUser.MakeDump() }
                            });
                           // SendCommand("da|initplayer|" + LoggedInUser.MakeDump());
                            SendPayload(new NetworkPayload()
                            {
                                Type = PayloadType.Data,
                                Command = PayloadCommand.InitPlayer,
                                Params = { LoggedInUser.MakeDump() }

                            });
                            foreach (Entity entity in FadingWorldsServer.Instance.GameObjects)
                            {
                                SendPayload(new NetworkPayload()
                                {
                                    Type = PayloadType.Data,
                                    Command = PayloadCommand.InitEntity,
                                    Params = { entity.MakeDump()}

                                });
                               // SendCommand("da|initentity|" + entity.MakeDump());
                            }
                            SendUserList();
                            FadingWorldsServer.Instance.TheGrid.GetBlockAt(LoggedInUser.Position)
                                .Entities.Add(LoggedInUser);
                            break;
                    }

                    break;
                case PayloadType.Quit: // Pure quit message
                    ConsoleWrite("Got quit command, so returning false on request.");
                    return false;
                case PayloadType.System:
                    if (payload.Command == PayloadCommand.Pong)
                    {
                        ConsoleWrite("Replied to ping");
                    }
                    break;
                case PayloadType.Attack:
                    if (payload.Params.Count == 3)
                    {
                        string mobId = payload.Params[0];
                        int mobX = int.Parse(payload.Params[1]);
                        int mobY = int.Parse(payload.Params[2]);
                        ConsoleWrite("Player " + LoggedInUser.Id + " doing an attack move on " + mobId);
                        LoggedInUser.TryAttack(mobId);
                        //MoveResult x = LoggedInUser.MoveTo(new Position2D(mobX, mobY));

                        //if (subCode == "po")
                        //{
                        //  ConsoleWrite("Replied to ping");
                        //}
                    }
                    break;
                case PayloadType.PrivateMessage:
                    if (payload.Params.Count() == 2)
                    {
                        string target = payload.Params[0];
                        string message = payload.Params[1];
                        SendPayload(new NetworkPayload()
                        {
                            Type = PayloadType.Message,
                            Params = { "system", "<<pm to " + LoggedInUser + ":" + message }
                        });
                       // SendCommand("ms|system|<<pm to " + LoggedInUser + ":" + message);
                        FadingWorldsServer.Instance.TCPPool.SendPayloadToUser(target, new NetworkPayload()
                        {
                            Type = PayloadType.Message,
                            Params = { "system", ">>pm from " + LoggedInUser + ":" + message }
                        });
                        //FadingWorldsServer.Instance.TCPPool.SendMessageToUser(target,
                        //    "system|>>pm from " + LoggedInUser + ":" + message);
                    }
                    else
                    {
                        SendPayload(new NetworkPayload()
                        {
                            Type = PayloadType.Message,
                            Params = { "system", "i'm afraid you need more than that" }
                        });
                        //SendCommand("ms|system|i'm afraid you need more than that");
                    }
                    break;

                default:
                    ConsoleWrite("ParseGuiCommand():  Sent unknown opCode: " + payload.Type);
                    SendPayload(new NetworkPayload()
                    {
                        Type = PayloadType.Message,

                        Params = { "system", "Unknown Command" }

                    });
                    //SendCommand("ms|system|unknown-cmd");
                    break;
            }
            // Default to success
            return true;
        }
        public void Close()
        {
            ConsoleWrite("Starting to close connection");
            SendPayload(new NetworkPayload
            {
                Type = PayloadType.Message,
                Params = { "system", "Connection is being closed." }
            });

            if (LoggedInUser != null)
            {
                FadingWorldsServer.Instance.RemoveEntity(LoggedInUser);
            }
            _client.Client.Close();
            _client.Close();
            var a = this;
            FadingWorldsServer.Instance.TCPPool.Remove(ref a);
            if (!_isClosed && IsLoggedIn && LoggedInUser != null)
            {
                _isClosed = true;
                FadingWorldsServer.Instance.TCPPool.SendPayloadToAll(new NetworkPayload
                {
                    Type = PayloadType.User,
                    Command = PayloadCommand.Logout,
                    Params = { LoggedInUser.Id }
                });

                SendUserList();
            }
            LoggedInUser = null;
        }