Exemplo n.º 1
0
        private void SetSlot(GameClient client, int sourceSlot, int targetSlot)
        {
            DOLCharacters source = null;
            DOLCharacters target = null;

            foreach (DOLCharacters character in client.Account.Characters)
            {
                if (source == null)
                {
                    if (character.AccountSlot == sourceSlot)
                        source = character;
                }

                if (target == null)
                {
                    if (character.AccountSlot == targetSlot)
                        target = character;
                }

                if (source != null && target != null)
                    break;
            }

            if (source == null)
            {
                EmptySlot(client, sourceSlot);
                return;
            }

            // It's important that we create a backup of each character before we start. If an error
            // occurs and / or the server crashes, we always have an character backup.
            DOLCharactersBackup sourceBackup = new DOLCharactersBackup(source);
            sourceBackup.DOLCharacters_ID += "-Rearranged"; // Easier for admins to find it.
            GameServer.Database.AddObject(sourceBackup);

            DOLCharactersBackup targetBackup = null;
            if (target != null)
            {
                targetBackup = new DOLCharactersBackup(target);
                targetBackup.DOLCharacters_ID += "-Rearranged"; // Easier for admins to find it.
                GameServer.Database.AddObject(targetBackup);
            }

            // Time to modify the slots.
            lock (client)
            {
                GameServer.Database.DeleteObject(source);
                if (target != null)
                    GameServer.Database.DeleteObject(target);

                source.AccountSlot = targetSlot;
                if (target != null)
                    target.AccountSlot = sourceSlot;

                GameServer.Database.AddObject(source);
                if (target != null)
                    GameServer.Database.AddObject(target);
            }

            GameServer.Database.DeleteObject(sourceBackup);
            if (targetBackup != null)
                GameServer.Database.DeleteObject(targetBackup);

            SlotChanged(client, source.Name, sourceSlot, source.AccountSlot);
        }
		public static bool CheckForDeletedCharacter(string accountName, GameClient client, int slot)
		{
			int charSlot = slot;

			if (accountName.EndsWith("-S")) charSlot = 100 + slot;
			else if (accountName.EndsWith("-N")) charSlot = 200 + slot;
			else if (accountName.EndsWith("-H")) charSlot = 300 + slot;

			DOLCharacters[] allChars = client.Account.Characters;

			if (allChars != null)
			{
				foreach (DOLCharacters character in allChars.ToArray())
				{
					if (character.AccountSlot == charSlot && client.ClientState == GameClient.eClientState.CharScreen)
					{
						if (log.IsWarnEnabled)
							log.WarnFormat("DB Character Delete:  Account {0}, Character: {1}, slot position: {2}, client slot {3}", accountName, character.Name, character.AccountSlot, slot);

						var characterRealm = (eRealm)character.Realm;
						
						if (allChars.Length < client.ActiveCharIndex && client.ActiveCharIndex > -1 && allChars[client.ActiveCharIndex] == character)
							client.ActiveCharIndex = -1;

						
						GameEventMgr.Notify(DatabaseEvent.CharacterDeleted, null, new CharacterEventArgs(character, client));

						if (Properties.BACKUP_DELETED_CHARACTERS)
						{
							var backupCharacter = new DOLCharactersBackup(character);
							backupCharacter.CustomParams.ForEach(param => GameServer.Database.AddObject(param));
							GameServer.Database.AddObject(backupCharacter);
							
							if (log.IsWarnEnabled)
								log.WarnFormat("DB Character {0} backed up to DOLCharactersBackup and no associated content deleted.", character.ObjectId);
						}
						else
						{
							// delete associated data

							try
							{
								var objs = GameServer.Database.SelectObjects<InventoryItem>(string.Format("OwnerID = '{0}'", GameServer.Database.Escape(character.ObjectId)));
								foreach (InventoryItem item in objs)
								{
									GameServer.Database.DeleteObject(item);
								}
							}
							catch (Exception e)
							{
								if (log.IsErrorEnabled)
									log.ErrorFormat("Error deleting char items, char OID={0}, Exception:{1}", character.ObjectId, e);
							}

							// delete quests
							try
							{
								var objs = GameServer.Database.SelectObjects<DBQuest>(string.Format("Character_ID = '{0}'", GameServer.Database.Escape(character.ObjectId)));
								foreach (DBQuest quest in objs)
								{
									GameServer.Database.DeleteObject(quest);
								}
							}
							catch (Exception e)
							{
								if (log.IsErrorEnabled)
									log.ErrorFormat("Error deleting char quests, char OID={0}, Exception:{1}", character.ObjectId, e);
							}

							// delete ML steps
							try
							{
								var objs = GameServer.Database.SelectObjects<DBCharacterXMasterLevel>(string.Format("Character_ID = '{0}'", GameServer.Database.Escape(character.ObjectId)));
								foreach (DBCharacterXMasterLevel mlstep in objs)
								{
									GameServer.Database.DeleteObject(mlstep);
								}
							}
							catch (Exception e)
							{
								if (log.IsErrorEnabled)
									log.ErrorFormat("Error deleting char ml steps, char OID={0}, Exception:{1}", character.ObjectId, e);
							}
						}

						string deletedChar = character.Name;

						GameServer.Database.DeleteObject(character);
						client.Account.Characters = null;
						client.Player = null;
						GameServer.Database.FillObjectRelations(client.Account);

						if (client.Account.Characters == null || client.Account.Characters.Length == 0)
						{
							if (log.IsInfoEnabled)
								log.InfoFormat("Account {0} has no more chars. Realm reset!", client.Account.Name);

							//Client has no more characters, so the client can choose the realm again!
							client.Account.Realm = 0;
						}

						GameServer.Database.SaveObject(client.Account);

						// Log deletion
						AuditMgr.AddAuditEntry(client, AuditType.Character, AuditSubtype.CharacterDelete, "", deletedChar);
						
						return true;
					}
				}
			}
			return false;
		}