### Summary * Refactors AI so it is easier to read and maintain * Fixes NPC speed issues * Fixes pet sector AI issue that was causing stuttering * Fixes direction snapping for Melee/Mage AI * Refactors pet orders * Refactors speech commands * Removes scale speed by dex for HS+ (it was a stupid feature anyways)
141 lines
3.3 KiB
C#
141 lines
3.3 KiB
C#
using System.Runtime.CompilerServices;
|
|
|
|
namespace Server.Mobiles;
|
|
|
|
public class VendorAI : BaseAI
|
|
{
|
|
// Guards! A villan attacks me!
|
|
// Guards! Help!
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
private static int GetRandomGuardMessage() => Utility.RandomBool() ? 1005305 : 501603;
|
|
|
|
public VendorAI(BaseCreature m) : base(m)
|
|
{
|
|
}
|
|
|
|
public override bool DoActionWander()
|
|
{
|
|
DebugSay("I'm fine");
|
|
|
|
if (Mobile.Combatant != null)
|
|
{
|
|
this.DebugSayFormatted($"{Mobile.Combatant.Name} is attacking me");
|
|
|
|
Mobile.Say(GetRandomGuardMessage());
|
|
Action = ActionType.Flee;
|
|
}
|
|
else if (Mobile.FocusMob != null)
|
|
{
|
|
this.DebugSayFormatted($"{Mobile.FocusMob.Name} has talked to me");
|
|
|
|
Action = ActionType.Interact;
|
|
}
|
|
else
|
|
{
|
|
Mobile.Warmode = false;
|
|
|
|
base.DoActionWander();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool DoActionInteract()
|
|
{
|
|
var customer = Mobile.FocusMob;
|
|
|
|
if (Mobile.Combatant != null)
|
|
{
|
|
this.DebugSayFormatted($"{Mobile.Combatant.Name} is attacking me");
|
|
|
|
Mobile.Say(GetRandomGuardMessage());
|
|
|
|
Action = ActionType.Flee;
|
|
|
|
return true;
|
|
}
|
|
|
|
if (customer?.Deleted != false || customer.Map != Mobile.Map)
|
|
{
|
|
DebugSay("My customer has disappeared");
|
|
|
|
Mobile.FocusMob = null;
|
|
|
|
Action = ActionType.Wander;
|
|
}
|
|
else if (customer.InRange(Mobile, Mobile.RangeFight))
|
|
{
|
|
this.DebugSayFormatted($"I am with {customer.Name}");
|
|
|
|
Mobile.Direction = Mobile.GetDirectionTo(customer);
|
|
}
|
|
else
|
|
{
|
|
this.DebugSayFormatted($"{customer.Name} is gone");
|
|
|
|
Mobile.FocusMob = null;
|
|
Action = ActionType.Wander;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool DoActionGuard()
|
|
{
|
|
Mobile.FocusMob = Mobile.Combatant;
|
|
return base.DoActionGuard();
|
|
}
|
|
|
|
public override bool HandlesOnSpeech(Mobile from)
|
|
{
|
|
if (from.InRange(Mobile, 4))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return base.HandlesOnSpeech(from);
|
|
}
|
|
|
|
// Temporary
|
|
public override void OnSpeech(SpeechEventArgs e)
|
|
{
|
|
base.OnSpeech(e);
|
|
|
|
var from = e.Mobile;
|
|
|
|
if (Mobile is BaseVendor vendor && from.InRange(Mobile, Core.AOS ? 1 : 4) && !e.Handled)
|
|
{
|
|
if (e.HasKeyword(0x14D)) // *vendor sell*
|
|
{
|
|
e.Handled = true;
|
|
|
|
vendor.VendorSell(from);
|
|
vendor.FocusMob = from;
|
|
}
|
|
else if (e.HasKeyword(0x3C)) // *vendor buy*
|
|
{
|
|
e.Handled = true;
|
|
|
|
vendor.VendorBuy(from);
|
|
vendor.FocusMob = from;
|
|
}
|
|
else if (WasNamed(e.Speech))
|
|
{
|
|
if (e.HasKeyword(0x177)) // *sell*
|
|
{
|
|
e.Handled = true;
|
|
|
|
vendor.VendorSell(from);
|
|
}
|
|
else if (e.HasKeyword(0x171)) // *buy*
|
|
{
|
|
e.Handled = true;
|
|
|
|
vendor.VendorBuy(from);
|
|
}
|
|
|
|
vendor.FocusMob = from;
|
|
}
|
|
}
|
|
}
|
|
}
|