//User select character to log in game public static void CharacterSelect(Connection pConn, byte[] data) { if (Program.DEBUG_recv_stage1 || Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::CharacterSelect Recv select char packet"); } if (pConn.client.Status != Client.STATUS.CharSelect) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::CharacterSelect - Error recv CharacterSelect beafore login, close connection"); } pConn.Close(); return; } int playerID = BitConverter.ToInt32(data, Program.receivePrefixLength); Database.Player p = pConn.client.GetPlayer(playerID); if (p == null) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::CharacterSelect Selected non existing player!"); } pConn.Close(); return; } else { //tell correct GameServer about new player login in //send to the User data about connection to GameServer //close connection with succesful transfered connection to GameServer and save it to the GameClient dictionary ( already connected and in game) WorldConnectionListener.GameServer gs = Worlds.GetServer(p.PosX, p.PosY); if (gs != null && gs.Connected) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::CharacterSelect Selected world: " + gs.Name + " size: [" + gs.StartX.ToString() + "," + gs.StartY.ToString() + "::" + gs.EndX.ToString() + "," + gs.EndY.ToString() + "]"); } if (InGameUsers.Exists(p.PlayerUID))// erro add this user to inGame list then close connection { pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.NOT_ALLOWED)); if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::CharacterSelect User already exists in game!"); } } else// send to client info about GameServer and send info to Game server about client { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::CharacterSelect Transfer connection to correct GameServer for selected player name: " + p.PlayerName); } byte[] guid = System.Guid.NewGuid().ToByteArray(); byte key = (byte)Program.rnd.Next(Program.maxGameServerStartKeyValue); gs.connection.Send(new Packet.GameServerSend.User_Login(pConn.client.UserID, playerID, guid, key)); pConn.Send(new Packet.SendPacketHandlers.GameServer(gs.UserIP, gs.UserPort, key, guid, gs.GridSize, gs.TileSizeX, gs.TileSizeY, gs.Xmultiplikator, gs.Ymultiplikator)); } } else { Output.WriteLine("RecvPacketHandlers::CharacterSelect Thers no Game Server for position [" + p.PosX.ToString() + "," + p.PosY.ToString() + "]"); pConn.Send(new Packet.SendPacketHandlers.GameServerBusy()); //pConn.Close(); } //finally close current connection pConn.Close(); } }
public static void Login(Connection pConn, byte[] data) { byte[] tmpPW; byte[] tmpID; byte[] cryptID; byte[] cryptPW; byte idLength; byte pwLength; int userID = -1; if (pConn.client.Status != Client.STATUS.Login) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login - Error recv login beafore Init, close connection"); } pConn.Close(); return; } if (Program.DEBUG_recv_stage1 || Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Recv login packet"); } pwLength = data[Program.receivePrefixLength]; if (pwLength < 3) //if (pwLength != 8) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Login fail"); } pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.NOT_ALLOWED)); pConn.client.NumberOfLoginTrys++; if (pConn.client.NumberOfLoginTrys > 3) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Too many fail trys, close connection"); } pConn.Close(); } return; } tmpPW = new byte[pwLength]; Array.Copy(data, Program.receivePrefixLength + 1, tmpPW, 0, pwLength); idLength = data[Program.receivePrefixLength + pwLength + 1]; if (idLength < 3 || idLength > 8) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Login fail [1]"); } pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.NOT_ALLOWED)); pConn.client.NumberOfLoginTrys++; if (pConn.client.NumberOfLoginTrys > 3) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Too many fail trys, close connection"); } pConn.Close(); } return; } tmpID = new byte[idLength]; Array.Copy(data, Program.receivePrefixLength + pwLength + 2, tmpID, 0, idLength); cryptID = Crypt.Aes.AES_Encrypt(tmpID, Encoding.ASCII.GetBytes(Program.aesKey), Encoding.ASCII.GetBytes(Program.aesSalt)); cryptPW = Crypt.Aes.AES_Encrypt(tmpPW, Encoding.ASCII.GetBytes(Program.aesKey), Encoding.ASCII.GetBytes(Program.aesSalt)); if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Recv Login: "******" PW: " + Encoding.ASCII.GetString(tmpPW)); } if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Recv Crypted Login: "******" PW: " + LoginServer.ByteArrayToHex(cryptPW)); } userID = Database.DB_Acces.Login(cryptID, cryptPW); if (userID < 0) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Login fail [2] Error: " + userID.ToString()); } pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.WRONGID)); pConn.client.NumberOfLoginTrys++; if (pConn.client.NumberOfLoginTrys > 3) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Too many fail trys, close connection"); } pConn.Close(); } } else {// LOGIN IS OK if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Login is OK UserID: " + userID.ToString()); } if (Users.Exists(userID))//User currently loged in... { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login User already LOGED IN!"); } Connection tmpCon; Users.Remove(userID, out tmpCon); if (tmpCon != null) { tmpCon.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.CURRENTLY_LOGGED)); tmpCon.Close(); } } if (InGameUsers.Exists(userID)) { //send to correct GameServer info about user log in -> game server will close corensponding connection //next we should recv from game server info about closed connection and then we remove userID from InGameUsers list //but for now we allow user to continue if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login UserID: " + userID.ToString() + " already IN GAME!"); } } pConn.client.UserID = userID; if (!Users.Add(userID, pConn))// add this new succesfull login to the loged user list { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Error trying add new user"); } pConn.Close(); } List <Database.Player> lPlayers = Database.DB_Acces.PlayerList(userID); pConn.client.AddPlayer(lPlayers); pConn.Send(new SendPacketHandlers.BeginPlayerList(userID)); foreach (Database.Player row in lPlayers) { if (Program.DEBUG_recv) { Output.WriteLine("RecvPacketHandlers::Login Found in DB player character name: " + row.PlayerName); } MemoryStream stream = new MemoryStream(); BinaryWriter streamWriter = new BinaryWriter(stream); streamWriter.Write((int)row.PlayerPID); streamWriter.Write((string)row.PlayerName); streamWriter.Write((int)row.Strength); streamWriter.Write((int)row.Health); streamWriter.Write((int)row.Intel); streamWriter.Write((int)row.Wisdom); streamWriter.Write((int)row.Agility); streamWriter.Write((int)row.PosX); streamWriter.Write((int)row.PosY); streamWriter.Write((int)row.PosZ); streamWriter.Write((int)row.Race); streamWriter.Write((int)row.Job); streamWriter.Write((int)row.Level); streamWriter.Write((int)row.FaceType); streamWriter.Write((int)row.HairType); streamWriter.Write((int)row.Experience); streamWriter.Write((int)row.ActHealth); streamWriter.Write((int)row.ActMana); streamWriter.Write((int)row.ActRage); streamWriter.Write((int)row.HeadArmor); streamWriter.Write((int)row.GlovesArmor); streamWriter.Write((int)row.ChestArmor); streamWriter.Write((int)row.ShortsArmor); streamWriter.Write((int)row.BootsArmor); streamWriter.Write((int)row.LeftHand); streamWriter.Write((int)row.RightHand); pConn.Send(new SendPacketHandlers.Player(stream.ToArray())); } pConn.Send(new SendPacketHandlers.EndPlayerList()); pConn.client.Status = Client.STATUS.CharSelect; } }