/// <summary> /// Wrapper method used for increasing totalXP and then using the amount granted by HandleActionRaiseSkill /// </summary> public void AwardSkillXP(Skill skill, uint amount, bool alertPlayer = false) { var playerSkill = GetCreatureSkill(skill); if (playerSkill.AdvancementClass < SkillAdvancementClass.Trained || playerSkill.IsMaxRank) { return; } amount = Math.Min(amount, playerSkill.ExperienceLeft); GrantXP(amount, XpType.Emote, ShareType.None); var raiseChain = new ActionChain(); raiseChain.AddDelayForOneTick(); raiseChain.AddAction(this, () => { HandleActionRaiseSkill(skill, amount); }); raiseChain.EnqueueChain(); if (alertPlayer) { Session.Network.EnqueueSend(new GameMessageSystemChat($"You've earned {amount:N0} experience in your {playerSkill.Skill.ToSentence()} skill.", ChatMessageType.Broadcast)); } }
public static void HandleCharacterForcedDelete(Session session, params string[] parameters) { var characterName = string.Join(" ", parameters); var foundPlayer = PlayerManager.FindByName(characterName, out var isOnline); if (foundPlayer == null) { CommandHandlerHelper.WriteOutputInfo(session, $"There is no character named {characterName} in the database.", ChatMessageType.Broadcast); return; } if (isOnline && foundPlayer is Player player) { player.Character.DeleteTime = (ulong)Time.GetUnixTime(); player.Character.IsDeleted = true; player.CharacterChangesDetected = true; player.Session.LogOffPlayer(true); PlayerManager.HandlePlayerDelete(player.Character.Id); var success = PlayerManager.ProcessDeletedPlayer(player.Character.Id); if (success) { CommandHandlerHelper.WriteOutputInfo(session, $"Successfully {(isOnline ? "booted and " : "")}deleted character {foundPlayer.Name} (0x{foundPlayer.Guid}).", ChatMessageType.Broadcast); } else { CommandHandlerHelper.WriteOutputInfo(session, $"Unable to {(isOnline ? "boot and " : "")}delete character {foundPlayer.Name} (0x{foundPlayer.Guid}) due to PlayerManager failure.", ChatMessageType.Broadcast); } } else { var existingCharId = foundPlayer.Guid.Full; //DatabaseManager.Shard.BaseDatabase.GetCharacterStubByName(foundPlayer.Name).Id; DatabaseManager.Shard.GetCharacter(existingCharId, character => { if (character != null) { character.DeleteTime = (ulong)Time.GetUnixTime(); character.IsDeleted = true; DatabaseManager.Shard.SaveCharacter(character, new ReaderWriterLockSlim(), result => { if (result) { var deleteOfflineChain = new ActionChain(); deleteOfflineChain.AddAction(WorldManager.ActionQueue, () => PlayerManager.HandlePlayerDelete(character.Id)); deleteOfflineChain.AddDelayForOneTick(); deleteOfflineChain.AddAction(WorldManager.ActionQueue, () => { var success = PlayerManager.ProcessDeletedPlayer(character.Id); if (success) { CommandHandlerHelper.WriteOutputInfo(session, $"Successfully {(isOnline ? "booted and " : "")}deleted character {foundPlayer.Name} (0x{foundPlayer.Guid}).", ChatMessageType.Broadcast); } else { CommandHandlerHelper.WriteOutputInfo(session, $"Unable to {(isOnline ? "boot and " : "")}delete character {foundPlayer.Name} (0x{foundPlayer.Guid}) due to PlayerManager failure.", ChatMessageType.Broadcast); } }); deleteOfflineChain.EnqueueChain(); } else { CommandHandlerHelper.WriteOutputInfo(session, $"Unable to {(isOnline ? "boot and " : "")}delete character {foundPlayer.Name} (0x{foundPlayer.Guid}) due to shard database SaveCharacter failure.", ChatMessageType.Broadcast); } }); } else { CommandHandlerHelper.WriteOutputInfo(session, $"Unable to {(isOnline ? "boot and " : "")}delete character {foundPlayer.Name} (0x{foundPlayer.Guid}) due to shard database GetCharacter failure.", ChatMessageType.Broadcast); } }); } }