using System;
using ACE.DatLoader;
using ACE.DatLoader.FileTypes;
using ACE.Entity;
using ACE.Entity.Enum;
using ACE.Entity.Enum.Properties;
using ACE.Entity.Models;
using ACE.Server.Entity;
using ACE.Server.Entity.Actions;
using ACE.Server.Factories;
using ACE.Server.Managers;
using ACE.Server.Network.GameEvent.Events;
using ACE.Server.Network.GameMessages.Messages;
namespace ACE.Server.WorldObjects
{
public class AdvocateFane : WorldObject
{
///
/// A new biota be created taking all of its values from weenie.
///
public AdvocateFane(Weenie weenie, ObjectGuid guid) : base(weenie, guid)
{
SetEphemeralValues();
}
///
/// Restore a WorldObject from the database.
///
public AdvocateFane(Biota biota) : base(biota)
{
SetEphemeralValues();
}
private void SetEphemeralValues()
{
CurrentMotionState = new Motion(MotionStance.NonCombat);
}
public override ActivationResult CheckUseRequirements(WorldObject activator)
{
if (!(activator is Player player))
return new ActivationResult(false);
if (player.Teleporting)
return new ActivationResult(false);
if (player.IsBusy)
return new ActivationResult(false);
if (IsBusy)
{
return new ActivationResult(new GameEventWeenieErrorWithString(player.Session, WeenieErrorWithString.The_IsCurrentlyInUse, Name));
}
return new ActivationResult(true);
}
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(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();
}
public void Reset()
{
IsBusy = false;
}
}
}