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; }