Ejemplo n.º 1
0
        //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();
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }