using System; using System.Collections.Generic; using System.Linq; using Server.ContextMenus; using Server.Gumps; using Server.Items; using Server.Network; namespace Server.Mobiles { public class HordeMinionFamiliar : BaseFamiliar { private DateTime m_NextPickup; public HordeMinionFamiliar() { Body = 776; BaseSoundID = 0x39D; SetStr(100); SetDex(110); SetInt(100); SetHits(70); SetStam(110); SetMana(0); SetDamage(5, 10); SetDamageType(ResistanceType.Physical, 100); SetResistance(ResistanceType.Physical, 50, 60); SetResistance(ResistanceType.Fire, 50, 55); SetResistance(ResistanceType.Poison, 25, 30); SetResistance(ResistanceType.Energy, 25, 30); SetSkill(SkillName.Wrestling, 70.1, 75.0); SetSkill(SkillName.Tactics, 50.0); ControlSlots = 1; Container pack = Backpack; pack?.Delete(); pack = new Backpack(); pack.Movable = false; pack.Weight = 13.0; AddItem(pack); } public HordeMinionFamiliar(Serial serial) : base(serial) { } public override string CorpseName => "a horde minion corpse"; public override bool DisplayWeight => true; public override string DefaultName => "a horde minion"; public override void OnThink() { base.OnThink(); if (DateTime.UtcNow < m_NextPickup) return; m_NextPickup = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(5, 10)); Container pack = Backpack; if (pack == null) return; IEnumerable eable = GetItemsInRange(2).Where(item => item.Movable && item.Stackable); int pickedUp = 0; foreach (Item item in eable) { if (!pack.CheckHold(this, item, false, true)) return; NextActionTime = Core.TickCount; Lift(item, item.Amount, out bool rejected, out LRReason _); if (rejected) continue; Drop(this, Point3D.Zero); if (++pickedUp == 3) break; } } private void ConfirmRelease_Callback(Mobile from, bool okay) { if (okay) EndRelease(from); } public override void BeginRelease(Mobile from) { if (Backpack?.Items.Count > 0) from.SendGump(new WarningGump(1060635, 30720, 1061672, 32512, 420, 280, okay => ConfirmRelease_Callback(from, okay))); else EndRelease(from); } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); } #region Pack Animal Methods public override bool OnBeforeDeath() { if (!base.OnBeforeDeath()) return false; PackAnimal.CombineBackpacks(this); return true; } public override DeathMoveResult GetInventoryMoveResultFor(Item item) { return DeathMoveResult.MoveToCorpse; } public override bool IsSnoop(Mobile from) { if (PackAnimal.CheckAccess(this, from)) return false; return base.IsSnoop(from); } public override bool OnDragDrop(Mobile from, Item item) { if (CheckFeed(from, item)) return true; if (PackAnimal.CheckAccess(this, from)) { AddToBackpack(item); return true; } return base.OnDragDrop(from, item); } public override bool CheckNonlocalDrop(Mobile from, Item item, Item target) { return PackAnimal.CheckAccess(this, from); } public override bool CheckNonlocalLift(Mobile from, Item item) { return PackAnimal.CheckAccess(this, from); } public override void OnDoubleClick(Mobile from) { PackAnimal.TryPackOpen(this, from); } public override void GetContextMenuEntries(Mobile from, List list) { base.GetContextMenuEntries(from, list); PackAnimal.GetContextMenuEntries(this, from, list); } #endregion } }