public static void HandleBestow(Session session, params string[] parameters) { var charName = string.Join(" ", parameters).Trim(); var level = parameters[parameters.Length - 1]; if (!int.TryParse(level, out var advocateLevel) || advocateLevel < 1 || advocateLevel > 7) { session.Network.EnqueueSend(new GameMessageSystemChat($"{level} is not a valid advocate level.", ChatMessageType.Broadcast)); return; } var advocateName = charName.TrimEnd((" " + level).ToCharArray()); var playerToFind = PlayerManager.FindByName(advocateName); if (playerToFind != null) { if (playerToFind is Player player) { //if (!Advocate.IsAdvocate(player)) //{ // session.Network.EnqueueSend(new GameMessageSystemChat($"{playerToFind.Name} is not an Advocate.", ChatMessageType.Broadcast)); // return; //} if (player.IsPK || PropertyManager.GetBool("pk_server").Item) { session.Network.EnqueueSend(new GameMessageSystemChat($"{playerToFind.Name} in a Player Killer and cannot be an Advocate.", ChatMessageType.Broadcast)); return; } if (session.Player.AdvocateLevel <= player.AdvocateLevel) { session.Network.EnqueueSend(new GameMessageSystemChat($"You cannot change {playerToFind.Name}'s Advocate status because they are equal to or out rank you.", ChatMessageType.Broadcast)); return; } if (advocateLevel >= session.Player.AdvocateLevel && !session.Player.IsAdmin) { session.Network.EnqueueSend(new GameMessageSystemChat($"You cannot bestow {playerToFind.Name}'s Advocate rank to {advocateLevel} because that is equal to or higher than your rank.", ChatMessageType.Broadcast)); return; } if (advocateLevel == player.AdvocateLevel) { session.Network.EnqueueSend(new GameMessageSystemChat($"{playerToFind.Name}'s Advocate rank is already at level {advocateLevel}.", ChatMessageType.Broadcast)); return; } if (!Advocate.CanAcceptAdvocateItems(player, advocateLevel)) { session.Network.EnqueueSend(new GameMessageSystemChat($"You cannot change {playerToFind.Name}'s Advocate status because they do not have capacity for the advocate items.", ChatMessageType.Broadcast)); return; } if (Advocate.Bestow(player, advocateLevel)) { session.Network.EnqueueSend(new GameMessageSystemChat($"{playerToFind.Name} is now an Advocate, level {advocateLevel}.", ChatMessageType.Broadcast)); } else { session.Network.EnqueueSend(new GameMessageSystemChat($"Advocate bestowal of {playerToFind.Name} failed.", ChatMessageType.Broadcast)); } } else { session.Network.EnqueueSend(new GameMessageSystemChat($"{playerToFind.Name} is not online. Cannot complete bestowal process.", ChatMessageType.Broadcast)); } } else { session.Network.EnqueueSend(new GameMessageSystemChat($"{advocateName} was not found in the database.", ChatMessageType.Broadcast)); } }
public override void ActOnUse(WorldObject activator) { if (!(activator is Player player)) { return; } if (IsBusy) { player.Session.Network.EnqueueSend(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.The_IsCurrentlyInUse, Name)); return; } IsBusy = true; player.IsBusy = true; if (player.AdvocateQuest || player.PkLevel != PKLevel.NPK || player is Admin || player.WeenieType == WeenieType.Admin || player is Sentinel || player.WeenieType == WeenieType.Sentinel) // PlayerKillers, Admins and Sentinels can't be Advocates. { var actionChain = new ActionChain(); var failMotion = UseTargetFailureAnimation != MotionCommand.Invalid ? UseTargetFailureAnimation : MotionCommand.Twitch2; EnqueueBroadcastMotion(new Motion(this, failMotion)); var motionTable = DatManager.PortalDat.ReadFromDat <MotionTable>(MotionTableId); var useTime = motionTable.GetAnimationLength(failMotion); player.LastUseTime += useTime; actionChain.AddDelaySeconds(useTime); actionChain.AddAction(player, () => { player.IsBusy = false; Reset(); }); actionChain.EnqueueChain(); return; } var faneTimer = new ActionChain(); if (player.CombatMode != CombatMode.NonCombat) { var stanceTime = player.SetCombatMode(CombatMode.NonCombat); faneTimer.AddDelaySeconds(stanceTime); player.LastUseTime += stanceTime; } var useMotion = UseTargetSuccessAnimation != MotionCommand.Invalid ? UseUserAnimation : MotionCommand.BowDeep; var animTime = player.EnqueueMotion(faneTimer, useMotion); player.LastUseTime += animTime; var successMotion = UseTargetSuccessAnimation != MotionCommand.Invalid ? UseTargetSuccessAnimation : MotionCommand.Twitch1; var successTime = EnqueueMotion(faneTimer, successMotion); player.LastUseTime += successTime; faneTimer.AddAction(player, () => { player.AdvocateQuest = true; player.Session.Network.EnqueueSend(new GameMessageSystemChat(GetProperty(PropertyString.UseMessage), ChatMessageType.Broadcast)); if (UseCreateItem != null) { var useCreateItem = WorldObjectFactory.CreateNewWorldObject(UseCreateItem.Value); if (useCreateItem != null) { player.TryCreateInInventoryWithNetworking(useCreateItem); } } if (PropertyManager.GetBool("advocate_fane_auto_bestow").Item) { Advocate.Bestow(player, (int)PropertyManager.GetDouble("advocate_fane_auto_bestow_level").Item); } }); faneTimer.AddAction(player, () => { player.IsBusy = false; Reset(); }); faneTimer.EnqueueChain(); }