public void OnWorldPositionUpdatePacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldPositionUpdatePacket)
            {
                WorldPositionUpdatePacket request = (WorldPositionUpdatePacket)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    if (session.ActiveCharacterInfo != null)
                    {
                        ControllablePhysicsComponent controllablePhysicsComponent = (ControllablePhysicsComponent)session.ActiveCharacterReplica.GetComponent(ReplicaComponentId.ControllablePhysics);

                        controllablePhysicsComponent.Position            = request.Position;
                        controllablePhysicsComponent.Rotation            = request.Rotation;
                        controllablePhysicsComponent.IsSupported         = request.IsSupported;
                        controllablePhysicsComponent.IsOnRail            = request.IsOnRail;
                        controllablePhysicsComponent.LinearVelocity      = request.LinearVelocity;
                        controllablePhysicsComponent.AngularVelocity     = request.AngularVelocity;
                        controllablePhysicsComponent.LocalSpaceObjectId  = request.LocalSpaceObjectId;
                        controllablePhysicsComponent.LocalPosition       = request.LocalPosition;
                        controllablePhysicsComponent.LocalLinearVelocity = request.LocalLinearVelocity;

                        Server.Instance.GetReplicaManager(session.ActiveCharacterInfo.ZoneId).Update(session.ActiveCharacterReplica);
                    }
                }
            }
        }
예제 #2
0
        public void OnWorldCharacterListRequestPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldCharacterListRequestPacket)
            {
                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    Server.Instance.Logger.Log("A client requested the character list. address=" + e.SourceAddress + " port=" + e.SourcePort);

                    CharacterHelper.SaveCharacter(session);

                    Server.Instance.EventManager.Publish(new CharacterListRequestEvent(session));
                }
            }
        }
        public void OnGeneralVersionConfirmPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is GeneralVersionConfirmPacket)
            {
                GeneralVersionConfirmPacket request = (GeneralVersionConfirmPacket)e.Packet;

                if (e.DestinationPort == Server.Instance.AuthPort)
                {
                    request.RemoteConnectionType = 1;
                }
                else
                {
                    request.RemoteConnectionType = 4;
                }

                Server.Instance.SendGamePacket(request, GeneralPacketId.MSG_SERVER_VERSION_CONFIRM, e.SourceAddress, e.SourcePort);
            }
        }
        public void OnPlayerLoadedGameMessageReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is PlayerLoadedGameMessage)
            {
                PlayerLoadedGameMessage request = (PlayerLoadedGameMessage)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    if (session.ActiveCharacterInfo != null)
                    {
                        PlayerReadyGameMessage playerReady = new PlayerReadyGameMessage(session.ActiveCharacterInfo.CharacterId);

                        Server.Instance.SendGamePacket(playerReady, ClientPacketId.MSG_CLIENT_GAME_MSG, e.SourceAddress, e.SourcePort);
                    }
                }
            }
        }
예제 #5
0
        public void OnWorldValidationPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldValidationPacket)
            {
                WorldValidationPacket request = (WorldValidationPacket)e.Packet;

                string           username      = request.Username;
                string           sessionSecret = request.SessionKey;
                DisconnectReason dcReason      = DisconnectReason.NoReason;

                Session session = Server.Instance.SessionManager.GetSession(username);

                if (session != null)
                {
                    if (session.Secret == sessionSecret)
                    {
                        session.Address = e.SourceAddress;
                        session.Port    = e.SourcePort;
                    }
                    else
                    {
                        dcReason = DisconnectReason.InvalidSessionKey;
                    }
                }
                else
                {
                    dcReason = DisconnectReason.UnauthenticatedAccount;
                }

                if (dcReason != DisconnectReason.NoReason)
                {
                    GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket();

                    dcPacket.DisconnectReason = dcReason;

                    Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort);
                }

                Server.Instance.Logger.Log("A client requested to validate their session. address=" + e.SourceAddress + " port=" + e.SourcePort + " username="******" dcReason=" + dcReason);
            }
        }
        public void OnWorldCharacterDeleteRequestReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldCharacterDeleteRequestPacket)
            {
                WorldCharacterDeleteRequestPacket request = (WorldCharacterDeleteRequestPacket)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    Server.Instance.Scheduler.RunTaskAsync(

                        () =>
                    {
                        long characterId        = request.CharacterId;
                        string name             = String.Empty;
                        bool isOwnedByRequester = false;

                        MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                        try
                        {
                            mySqlHandle.Open();

                            List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId);

                            for (int i = 0; i < characterInfos.Count && !isOwnedByRequester; i++)
                            {
                                if (characterInfos[i].CharacterId == characterId)
                                {
                                    isOwnedByRequester = true;
                                    name = characterInfos[i].Name;

                                    mySqlHandle.CharactersDeleteCharacter(characterId);
                                }
                            }

                            mySqlHandle.Close();
                        }
                        catch (Exception exc)
                        {
                            Server.Instance.LogDatabaseError(exc);
                        }

                        mySqlHandle.Free();

                        Server.Instance.Logger.Log("A client requested to delete a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " name=" + name + " isOwnedByRequester=" + isOwnedByRequester);

                        if (!isOwnedByRequester)
                        {
                            GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket();

                            dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound;

                            Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort);
                        }
                    }

                        );
                }
            }
        }
        public void OnWorldCharacterRenameRequestPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldCharacterRenameRequestPacket)
            {
                WorldCharacterRenameRequestPacket request = (WorldCharacterRenameRequestPacket)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    Server.Instance.Scheduler.RunTaskAsync(

                        () =>
                    {
                        ClientCharacterRenameResponsePacket response = new ClientCharacterRenameResponsePacket();

                        response.CharacterRenameResult = CharacterRenameResult.DenyInvalidCustomName;

                        string oldName              = String.Empty;
                        string newName              = request.NewName;
                        long characterId            = request.CharacterId;
                        CharacterInfo characterInfo = null;

                        MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                        try
                        {
                            mySqlHandle.Open();

                            List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId);

                            for (int i = 0; i < characterInfos.Count && characterInfo == null; i++)
                            {
                                if (characterInfos[i].CharacterId == characterId)
                                {
                                    characterInfo = characterInfos[i];
                                }
                            }

                            if (characterInfo != null)
                            {
                                oldName = characterInfo.Name;

                                bool success = mySqlHandle.CharactersSetPendingName(characterId, newName);

                                if (success)
                                {
                                    response.CharacterRenameResult = CharacterRenameResult.Allow;
                                }
                                else
                                {
                                    response.CharacterRenameResult = CharacterRenameResult.DenyCustomNameTaken;

                                    mySqlHandle.CharactersUpdateLastLogout(characterId);
                                }
                            }

                            mySqlHandle.Close();
                        }
                        catch (Exception exc)
                        {
                            Server.Instance.LogDatabaseError(exc);
                        }

                        mySqlHandle.Free();

                        Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_CHARACTER_RENAME_RESPONSE, e.SourceAddress, e.SourcePort);

                        Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new CharacterListRequestEvent(session)));

                        Server.Instance.Logger.Log("A client requested to rename a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " oldName=" + oldName + " newName=" + newName + " isOwnedByRequester=" + (characterInfo != null));

                        if (characterInfo != null)
                        {
                            GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket();

                            dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound;

                            Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort);
                        }
                    }

                        );
                }
            }
        }
        public void OnAuthLoginRequestPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is AuthLoginRequestPacket)
            {
                AuthLoginRequestPacket request = (AuthLoginRequestPacket)e.Packet;

                string username        = request.Username;
                string password        = request.Password;
                string maintenanceText = null;

                if (File.Exists("./maintenance.txt"))
                {
                    string[] lines = File.ReadAllLines("./maintenance.txt");

                    maintenanceText = String.Empty;

                    for (int i = 0; i < lines.Length; i++)
                    {
                        if (i > 0)
                        {
                            maintenanceText += "\n";
                        }

                        maintenanceText += lines[i];
                    }
                }

                Server.Instance.Scheduler.RunTaskAsync(

                    () =>
                {
                    ClientLoginResponsePacket response = new ClientLoginResponsePacket();
                    AccountInfo accountInfo            = null;

                    MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                    try
                    {
                        mySqlHandle.Open();

                        accountInfo = mySqlHandle.AccountsGetAccountInfo(username);

                        if (accountInfo != null)
                        {
                            Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, accountInfo.PasswordSalt, accountInfo.PasswordIterations, HashAlgorithmName.SHA256);

                            byte[] passwordHash = pbkdf2.GetBytes(32);

                            if (passwordHash.SequenceEqual(accountInfo.PasswordHash))
                            {
                                response.LoginResult = LoginResult.Allow;
                            }
                            else
                            {
                                response.LoginResult = LoginResult.DenyInvalidCredentials;
                            }
                        }
                        else
                        {
                            response.LoginResult = LoginResult.DenyInvalidCredentials;
                        }

                        mySqlHandle.Close();
                    }
                    catch (Exception exc)
                    {
                        Server.Instance.LogDatabaseError(exc);
                    }

                    mySqlHandle.Free();

                    if (maintenanceText != null)
                    {
                        response.LoginResult = LoginResult.DenyCustomError;

                        response.CustomErrorMessage = maintenanceText;
                    }

                    if (response.LoginResult == LoginResult.Allow)
                    {
                        Session session = Server.Instance.SessionManager.CreateSession(e.SourceAddress, e.SourcePort, accountInfo);

                        response.SessionSecret = session.Secret;
                    }
                    else
                    {
                        response.SessionSecret = "AUTHENTICATION FAILED";
                    }

                    response.CharacterInstanceIp   = e.DestinationAddress;
                    response.ChatInstanceIp        = e.DestinationAddress;
                    response.CharacterInstancePort = Server.Instance.WorldPort;
                    response.ChatInstancePort      = Server.Instance.WorldPort;

                    Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_LOGIN_RESPONSE, e.SourceAddress, e.SourcePort);

                    Server.Instance.Logger.Log("A client requested to authenticate. address=" + e.SourceAddress + " port=" + e.SourcePort + " username="******" result=" + response.LoginResult);
                }

                    );
            }
        }
예제 #9
0
        public void OnWorldLoginRequestPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldLoginRequestPacket)
            {
                WorldLoginRequestPacket request = (WorldLoginRequestPacket)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    Server.Instance.Scheduler.RunTaskAsync(

                        () =>
                    {
                        long characterId            = request.CharacterId;
                        CharacterInfo characterInfo = null;

                        MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                        try
                        {
                            mySqlHandle.Open();

                            List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId);

                            for (int i = 0; i < characterInfos.Count && characterInfo == null; i++)
                            {
                                if (characterInfos[i].CharacterId == characterId)
                                {
                                    characterInfo = characterInfos[i];
                                }
                            }

                            mySqlHandle.Close();
                        }
                        catch (Exception exc)
                        {
                            Server.Instance.LogDatabaseError(exc);
                        }

                        mySqlHandle.Free();

                        if (characterInfo != null)
                        {
                            if (session.ActiveCharacterInfo == null || session.ActiveCharacterInfo.CharacterId == characterInfo.CharacterId)
                            {
                                if (characterInfo.ZoneId == 0)
                                {
                                    characterInfo.ZoneId = 1000;
                                }

                                session.ActiveCharacterInfo = characterInfo;
                            }

                            ClientLoadStaticZonePacket response = new ClientLoadStaticZonePacket();

                            response.ZoneId        = characterInfo.ZoneId;
                            response.CloneId       = characterInfo.CloneId;
                            response.ZoneChecksum  = Server.Instance.ZoneChecksumCache.GetZoneChecksum(characterInfo.ZoneId);
                            response.EditorEnabled = (characterInfo.EditorLevel) > 0 ? (byte)1 : (byte)0;
                            response.EditorLevel   = characterInfo.EditorLevel;
                            response.Position      = characterInfo.Position;

                            Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_LOAD_STATIC_ZONE, e.SourceAddress, e.SourcePort);
                        }
                        else
                        {
                            GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket();

                            dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound;

                            Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort);
                        }
                    }

                        );
                }
            }
        }
예제 #10
0
        public void OnWorldCharacterCreateRequestPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldCharacterCreateRequestPacket)
            {
                WorldCharacterCreateRequestPacket request = (WorldCharacterCreateRequestPacket)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    long characterId = Server.Instance.ObjectIdGenerator.GenerateGlobalId();

                    CharacterInfo characterInfo = new CharacterInfo(characterId, session.ActiveAccountInfo.AccountId);

                    string name;

                    if (Server.Instance.PredefinedNameCache != null)
                    {
                        name  = Server.Instance.PredefinedNameCache.GetFirstName(request.PredefinedNameFirst);
                        name += Server.Instance.PredefinedNameCache.GetMiddleName(request.PredefinedNameMiddle);
                        name += Server.Instance.PredefinedNameCache.GetLastName(request.PredefinedNameLast);
                    }
                    else
                    {
                        name = characterId.ToString();
                    }

                    characterInfo.Name         = name;
                    characterInfo.HeadColor    = request.HeadColor;
                    characterInfo.Head         = request.Head;
                    characterInfo.ChestColor   = request.ChestColor;
                    characterInfo.Chest        = request.Chest;
                    characterInfo.Legs         = request.Legs;
                    characterInfo.HairStyle    = request.HairStyle;
                    characterInfo.HairColor    = request.HairColor;
                    characterInfo.LeftHand     = request.LeftHand;
                    characterInfo.RightHand    = request.RightHand;
                    characterInfo.EyebrowStyle = request.EyebrowStyle;
                    characterInfo.EyesStyle    = request.EyesStyle;
                    characterInfo.MouthStyle   = request.MouthStyle;
                    characterInfo.ZoneId       = 0;
                    characterInfo.CloneId      = 0;
                    characterInfo.LastLogout   = (ulong)DateTime.Now.Subtract(Time.UnixEpoch).TotalSeconds;

                    if (Server.Instance.GetZone(1000) != null)
                    {
                        characterInfo.Position = Server.Instance.GetZone(1000).SpawnPosition;
                        characterInfo.Rotation = Server.Instance.GetZone(1000).SpawnRotation;
                    }
                    else
                    {
                        characterInfo.Position = JVector.Zero;
                        characterInfo.Rotation = new JQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
                    }

                    Server.Instance.Scheduler.RunTaskAsync(

                        () =>
                    {
                        ClientCharacterCreateResponsePacket response = new ClientCharacterCreateResponsePacket();

                        response.CharacterCreationResult = CharacterCreateResult.DenyInvalidCustomName;

                        MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                        try
                        {
                            mySqlHandle.Open();

                            bool success = mySqlHandle.CharactersCreateCharacter(characterInfo);

                            if (success)
                            {
                                if (!String.IsNullOrEmpty(request.CustomName))
                                {
                                    success = mySqlHandle.CharactersSetPendingName(characterId, request.CustomName);
                                }

                                if (success)
                                {
                                    response.CharacterCreationResult = CharacterCreateResult.Allow;
                                }
                                else
                                {
                                    response.CharacterCreationResult = CharacterCreateResult.DenyCustomNameTaken;

                                    mySqlHandle.CharactersDeleteCharacter(characterId);
                                }
                            }
                            else
                            {
                                response.CharacterCreationResult = CharacterCreateResult.DenyPredefinedNameTaken;
                            }

                            mySqlHandle.Close();
                        }
                        catch (Exception exc)
                        {
                            Server.Instance.LogDatabaseError(exc);
                        }

                        mySqlHandle.Free();

                        Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_CHARACTER_CREATE_RESPONSE, e.SourceAddress, e.SourcePort);

                        Server.Instance.Logger.Log("A client requested to create a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " predefinedName=" + name + " customName=" + request.CustomName + " result=" + response.CharacterCreationResult);

                        if (response.CharacterCreationResult == CharacterCreateResult.Allow)
                        {
                            Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new CharacterListRequestEvent(session)));
                        }
                        else
                        {
                            Server.Instance.ObjectIdGenerator.FreeObjectId(characterId);
                        }
                    }

                        );
                }
            }
        }
예제 #11
0
        public void OnWorldLevelLoadCompletePacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldLevelLoadCompletePacket)
            {
                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    if (session.ActiveCharacterInfo != null)
                    {
                        WriteOnlyBinaryLdf ldfMap = new WriteOnlyBinaryLdf();

                        ldfMap.AddWideString("name", session.ActiveCharacterInfo.Name);
                        ldfMap.AddBoolean("editor_enabled", session.ActiveCharacterInfo.EditorLevel > 0);
                        ldfMap.AddInt32("editor_level", session.ActiveCharacterInfo.EditorLevel);
                        ldfMap.AddInt32("template", 1);
                        ldfMap.AddInt32("gmlevel", session.ActiveCharacterInfo.GmLevel);
                        ldfMap.AddUInt64("objid", (ulong)session.ActiveCharacterInfo.CharacterId);
                        ldfMap.AddFloat("position.x", session.ActiveCharacterInfo.Position.X);
                        ldfMap.AddFloat("position.y", session.ActiveCharacterInfo.Position.Y);
                        ldfMap.AddFloat("position.z", session.ActiveCharacterInfo.Position.Z);
                        ldfMap.AddFloat("rotation.x", session.ActiveCharacterInfo.Rotation.X);
                        ldfMap.AddFloat("rotation.y", session.ActiveCharacterInfo.Rotation.Y);
                        ldfMap.AddFloat("rotation.z", session.ActiveCharacterInfo.Rotation.Z);
                        ldfMap.AddFloat("rotation.w", session.ActiveCharacterInfo.Rotation.W);

                        ClientCreateCharacterPacket response = new ClientCreateCharacterPacket();

                        response.LdfMap = ldfMap;

                        Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_CREATE_CHARACTER, e.SourceAddress, e.SourcePort);

                        Replica character = new Replica(session.ActiveCharacterInfo.CharacterId, null, 1, 0);

                        character.Name = session.ActiveCharacterInfo.Name;

                        ControllablePhysicsComponent controllablePhysicsComponent = new ControllablePhysicsComponent();

                        controllablePhysicsComponent.Position = session.ActiveCharacterInfo.Position;
                        controllablePhysicsComponent.Rotation = session.ActiveCharacterInfo.Rotation;

                        character.AddComponent(controllablePhysicsComponent);

                        DestructibleComponent destructibleComponent = new DestructibleComponent();

                        character.AddComponent(destructibleComponent);

                        StatsComponent statsComponent = new StatsComponent();

                        statsComponent.IsSmashable = false;
                        statsComponent.FactionIds.Add(1);
                        statsComponent.CurrentHealth      = session.ActiveCharacterInfo.CurrentHealth;
                        statsComponent.CurrentArmor       = session.ActiveCharacterInfo.CurrentArmor;
                        statsComponent.CurrentImagination = session.ActiveCharacterInfo.CurrentImagination;
                        statsComponent.MaxHealth          = session.ActiveCharacterInfo.MaxHealth;
                        statsComponent.MaxArmor           = session.ActiveCharacterInfo.MaxArmor;
                        statsComponent.MaxImagination     = session.ActiveCharacterInfo.MaxImagination;

                        character.AddComponent(statsComponent);

                        CharacterComponent characterComponent = new CharacterComponent();

                        characterComponent.CharacterInfo = session.ActiveCharacterInfo;
                        characterComponent.AccountInfo   = session.ActiveAccountInfo;

                        character.AddComponent(characterComponent);

                        InventoryComponent inventoryComponent = new InventoryComponent();

                        character.AddComponent(inventoryComponent);

                        SkillComponent skillComponent = new SkillComponent();

                        character.AddComponent(skillComponent);

                        RenderComponent renderComponent = new RenderComponent();

                        character.AddComponent(renderComponent);

                        BbbComponent bbbComponent = new BbbComponent();

                        character.AddComponent(bbbComponent);

                        ReplicaManager thingManager = Server.Instance.GetReplicaManager(session.ActiveCharacterInfo.ZoneId);

                        thingManager.AddPlayer(session, character);

                        ServerDoneLoadingAllObjectGameMessage serverDoneLoadingAllObjects = new ServerDoneLoadingAllObjectGameMessage(session.ActiveCharacterInfo.CharacterId);

                        Server.Instance.SendGamePacket(serverDoneLoadingAllObjects, ClientPacketId.MSG_CLIENT_GAME_MSG, e.SourceAddress, e.SourcePort);
                    }
                    else
                    {
                        GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket();

                        dcPacket.DisconnectReason = DisconnectReason.CharacterCorruption;

                        Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort);
                    }
                }
            }
        }