예제 #1
0
        public void CharacterDeletionRequestMessageFrame(WorldClient client, CharacterDeletionRequestMessage characterDeletionRequestMessage)
        {
            var character = CharacterRepository.Instance.GetCharacterById((int)characterDeletionRequestMessage.characterId);

            //character.IsDeleted = true;

            if (character.Guild != null)
            {
                //character.Guild.IsDeleted = true;
                var guild = GuildRepository.Instance.GetGuildById(character.Guild.Id);

                foreach (var member in character.Guild.GuildMembers)
                {
                    DatabaseManager.Instance.Delete <Burning.Emu.World.Entity.GuildMember>(GuildMemberRepository.Instance.Collection, member);
                }
                DatabaseManager.Instance.Delete <Guild>(GuildRepository.Instance.Collection, guild);
            }


            DatabaseManager.Instance.Delete <CharacterCharacteristic>(CharacterCharacteristicRepository.Instance.Collection, character.Characteristics);
            DatabaseManager.Instance.Delete <Inventory>(InventoryRepository.Instance.Collection, character.Inventory);

            //delete shortcuts
            foreach (var shortcutBar in character.CharacterShortcutBars)
            {
                DatabaseManager.Instance.Delete <CharacterShortcut>(CharacterShortcutRepository.Instance.Collection, shortcutBar);
            }

            DatabaseManager.Instance.Delete <Character>(CharacterRepository.Instance.Collection, character);

            this.SendCharacterListMessage(client);
        }
        public static void HandleCharacterDeletionRequestMessage(WorldClient client, CharacterDeletionRequestMessage message)
        {
            if (!IPCAccessor.Instance.IsConnected)
            {
                client.Send(new CharacterDeletionErrorMessage(1));
                client.DisconnectLater(1000);
            }
            else
            {
                CharacterRecord characterRecord = client.Characters.Find((CharacterRecord entry) => entry.Id == message.characterId);
                if (characterRecord == null)
                {
                    client.Send(new CharacterDeletionErrorMessage(1));
                    client.DisconnectLater(1000);
                }
                else
                {
                    Stump.Server.WorldServer.Game.Guilds.GuildMember guildMember = Singleton <GuildManager> .Instance.TryGetGuildMember(characterRecord.Id);

                    if (guildMember != null && guildMember.IsBoss)
                    {
                        client.Send(new CharacterDeletionErrorMessage(1));
                        client.DisconnectLater(1000);
                    }
                    else
                    {
                        string secretAnswerHash = message.secretAnswerHash;
                        if (Singleton <ExperienceManager> .Instance.GetCharacterLevel(characterRecord.Experience) <= 20 || (client.Account.SecretAnswer != null && secretAnswerHash == (message.characterId + "~" + client.Account.SecretAnswer).GetMD5()))
                        {
                            if (client.Account.DeletedCharactersCount > CharacterHandler.MaxDayCharacterDeletion)
                            {
                                client.Send(new CharacterDeletionErrorMessage(2));
                            }
                            else
                            {
                                Singleton <CharacterManager> .Instance.DeleteCharacterOnAccount(characterRecord, client);

                                CharacterHandler.SendCharactersListMessage(client);
                                BasicHandler.SendBasicNoOperationMessage(client);
                            }
                        }
                        else
                        {
                            client.Send(new CharacterDeletionErrorMessage(3));
                        }
                    }
                }
            }
        }
        public static void HandleCharacterDeletionRequest(CharacterDeletionRequestMessage message, WorldClient client)
        {
            if (!WorldServer.Instance.IsStatus(ServerStatusEnum.ONLINE))
            {
                client.Send(new CharacterDeletionErrorMessage((sbyte)CharacterDeletionErrorEnum.DEL_ERR_NO_REASON));

                return;
            }

            if (!client.InGame)
            {
                MessagePool.SendRequest <OnCharacterDeletionResultMessage>(TransitionServerManager.Instance.AuthServer,
                                                                           new OnCharacterDeletionMessage {
                    CharacterId = (long)message.characterId,
                },
                                                                           delegate(OnCharacterDeletionResultMessage msg) { ProcessDeletion(msg.Succes, client, (long)message.characterId); });
            }
        }
예제 #4
0
        public static void HandleCharacterDeletionRequestMessage(Client client, CharacterDeletionRequestMessage message)
        {
            CharacterRecord characterRecord = client.Account.Characters.FirstOrDefault(character => character.Id == message.characterId);

            if (characterRecord != null)
            {
                if (characterRecord.Level >= 20 ? Functions.CipherSecretAnswer(message.characterId, client.Account.SecretAnswer) != message.secretAnswerHash : Functions.CipherSecretAnswer(message.characterId, "000000000000000000") != message.secretAnswerHash)
                {
                    client.Send(new CharacterDeletionErrorMessage((sbyte)CharacterDeletionErrorEnum.DEL_ERR_BAD_SECRET_ANSWER));
                }
                else
                {
                    characterRecord.Delete();
                    client.Account.Characters.Remove(characterRecord);
                    SendCharactersListMessage(client, false);
                }
            }
            else
            {
                client.Send(new CharacterDeletionErrorMessage((sbyte)CharacterDeletionErrorEnum.DEL_ERR_NO_REASON));
            }
        }
        public static void HandleCharacterDeletion(CharacterDeletionRequestMessage message, WorldClient client) // finish this
        {
            CharacterRecord deletedCharacter = CharacterRecord.GetCharacterRecordById(message.characterId);

            if (deletedCharacter == null)
            {
                return;
            }
            StatsRecord.GetStatsRecord(message.characterId).RemoveElement();
            CharacterRecord.Characters.Remove(deletedCharacter);
            client.Characters.Remove(deletedCharacter);
            deletedCharacter.RemoveElement();
            CharacterItemRecord.RemoveAll(message.characterId);
            GeneralShortcutRecord.RemoveAll(message.characterId);
            CharacterSpellRecord.RemoveAll(message.characterId);
            CharacterJobRecord.RemoveAll(message.characterId);
            BidShopGainRecord.RemoveAll(message.characterId);
            CharacterGuildRecord.RemoveAll(message.characterId); // Si il est meneur de guilde?
            BidShopItemRecord.RemoveAll(message.characterId);
            Logger.Log("Character " + deletedCharacter.Name + " deleted");

            client.Send(new CharactersListMessage(client.Characters.ConvertAll <CharacterBaseInformations>(x => x.GetBaseInformation()), false));
        }
예제 #6
0
        public static void HandleCharacterDeletionRequestMessage(WorldClient client, CharacterDeletionRequestMessage message)
        {
            var character = client.Characters.Find(entry => entry.Id == message.characterId);

            /* check null */
            if (character == null)
            {
                client.Send(new CharacterDeletionErrorMessage((int)CharacterDeletionErrorEnum.DEL_ERR_NO_REASON));
                client.DisconnectLater(1000);
                return;
            }

            var secretAnswerHash = message.secretAnswerHash;

            /* Level < 20 or > 20 and Good secret Answer */
            if (ExperienceManager.Instance.GetCharacterLevel(character.Experience, character.PrestigeRank) <= 20 || (client.Account.SecretAnswer != null &&
                                                                                                                     secretAnswerHash == (message.characterId + "~" + client.Account.SecretAnswer).GetMD5()))
            {
                /* Too many character deletion */
                if (client.Account.DeletedCharactersCount > MaxDayCharacterDeletion)
                {
                    client.Send(new CharacterDeletionErrorMessage((int)CharacterDeletionErrorEnum.DEL_ERR_TOO_MANY_CHAR_DELETION));
                    return;
                }

                character.DeletedDate = DateTime.Now;
                CharacterManager.Instance.Database.Update(character);

                SendCharactersListWithRemodelingMessage(client);
                BasicHandler.SendBasicNoOperationMessage(client);
            }
            else
            {
                client.Send(new CharacterDeletionErrorMessage((int)CharacterDeletionErrorEnum.DEL_ERR_BAD_SECRET_ANSWER));
            }
        }
예제 #7
0
        /**
         * Handle character deletion frame
         */
        public Task CharacterDeletion(GameClient client, CharacterDeletionRequestMessage characterDeletionRequestMessage)
        {
            var character = this._characterRepository.Entities().Values.FirstOrDefault(x =>
                                                                                       x.Id == characterDeletionRequestMessage.characterId && x.AccountId == 1);

            //check if accountid and characterId are linked
            if (character == null)
            {
                client.Disconnect();
                return(null);
            }

            //if level > 20 need valid answer for delete character
            var exceptedSecretAnswerHash = CryptographyHelper.Md5(character.Id.ToString() + "~000000000000000000");

            if (character.Level >= CharacterManager.CONFIRM_DELETION_LVL)
            {
                exceptedSecretAnswerHash = CryptographyHelper.Md5(character.Id.ToString() + "~" + "DELETE"); //@IPC in future
                if (exceptedSecretAnswerHash == characterDeletionRequestMessage.secretAnswerHash)
                {
                    this._characterRepository.DeleteEntity(character);
                }
            }
            else
            {
                if (exceptedSecretAnswerHash == characterDeletionRequestMessage.secretAnswerHash)
                {
                    this._characterRepository.DeleteEntity(character);
                }
            }


            ApproachFrames.SendCharactersListMessage(client);

            return(Task.CompletedTask);
        }
예제 #8
0
 public void CharacterDeletionRequestMessageFrame(GameClient client,
                                                  CharacterDeletionRequestMessage characterDeletionRequestMessage)
 {
     Container.Instance().Resolve <ICharacterManager>()
     .CharacterDeletion(client, characterDeletionRequestMessage);
 }