using Server; using System; using Server.Mobiles; using System.Collections.Generic; using System.Linq; using Server.Commands; namespace Server.Items { public class MoonstonePowerGeneratorAddon : BaseAddon { public override bool ShareHue { get { return false; } } public Timer ActiveTimer { get; set; } public InternalComponent Activator1 { get; set; } public InternalComponent Activator2 { get; set; } [CommandProperty(AccessLevel.GameMaster)] public bool Activated { get; set; } [CommandProperty(AccessLevel.GameMaster)] public bool SetActive { get { return Activated; } set { if (value) { if (ActiveTimer != null) { ActiveTimer.Stop(); ActiveTimer = null; } Activated = true; CheckNetwork(); } } } public bool Link { get; set; } public MoonstonePowerGenerator Generator { get; set; } [Constructable] public MoonstonePowerGeneratorAddon(bool link) { AddonComponent c = new AddonComponent(39759); c.Hue = 2955; AddComponent(c, 0, 0, 0); c = new AddonComponent(39759); c.Hue = 2955; AddComponent(c, -1, 0, 0); c = new AddonComponent(39759); c.Hue = 2955; AddComponent(c, 1, 0, 0); c = new AddonComponent(39759); c.Hue = 2955; AddComponent(c, 0, -1, 0); c = new AddonComponent(39759); c.Hue = 2955; AddComponent(c, 0, 1, 0); c = new AddonComponent(39818); c.Hue = 2955; AddComponent(c, -1, -1, 0); c = new AddonComponent(39818); c.Hue = 2955; AddComponent(c, -1, 1, 0); c = new AddonComponent(39818); c.Hue = 2955; AddComponent(c, 1, -1, 0); c = new AddonComponent(39818); c.Hue = 2955; AddComponent(c, 1, 1, 0); Activator1 = new InternalComponent(40158); Activator2 = new InternalComponent(40203); AddComponent(Activator1, 0, -1, 5); AddComponent(Activator2, 0, 1, 5); AddComponent(new LocalizedAddonComponent(40155, 1156623), 1, 0, 5); AddComponent(new LocalizedAddonComponent(40155, 1156623), -1, 0, 5); AddComponent(new LocalizedAddonComponent(40156, 1156628), -1, 0, 10); AddComponent(new LocalizedAddonComponent(40156, 1156628), 1, 0, 10); //AddComponent(new LocalizedAddonComponent(40147, 1124171), 0, 0, 5); AddComponent(new LocalizedAddonComponent(40157, 1124171), 0, 0, 20); Generator = new MoonstonePowerGenerator(this); Link = link; if (link) Generators.Add(this); } public override void OnLocationChange(Point3D oldlocation) { base.OnLocationChange(oldlocation); if (Generator != null && !Generator.Deleted) { Generator.MoveToWorld(new Point3D(this.X, this.Y, this.Z + 5), this.Map); } } public override void OnMapChange() { base.OnMapChange(); if (Generator != null && !Generator.Deleted) { Generator.Map = this.Map; } } public override void OnComponentUsed(AddonComponent component, Mobile from) { if (!Activated && component != null && component is InternalComponent && from.InRange(component.Location, 2)) { InternalComponent comp = component as InternalComponent; if (!comp.Active) { comp.Active = true; comp.WhoActivated = from; if (Activator1.Active && Activator2.Active && Activator1.WhoActivated != Activator2.WhoActivated) { if (ActiveTimer != null) { ActiveTimer.Stop(); ActiveTimer = null; } Activated = true; CheckNetwork(); } else if (ActiveTimer == null) ActiveTimer = Timer.DelayCall(TimeSpan.FromSeconds(1), Reset); } } } private void Reset() { if (Activator1 != null) Activator1.Active = false; if (Activator2 != null) Activator2.Active = false; ActiveTimer = null; } public class InternalComponent : LocalizedAddonComponent { private bool _Active; [CommandProperty(AccessLevel.GameMaster)] public bool Active { get { return _Active; } set { if (!_Active && value) { ItemID = ActiveID; Effects.PlaySound(this.Location, this.Map, 0x051); } else if (_Active && !value) { ItemID = InactiveID; WhoActivated = null; Effects.PlaySound(this.Location, this.Map, 0x051); } _Active = value; } } public Mobile WhoActivated { get; set; } public int ActiveID { get; set; } public int InactiveID { get; set; } public InternalComponent(int itemid) : base(itemid, 1156624) { InactiveID = itemid; if (itemid == 40203) ActiveID = 40158; else ActiveID = 40203; } public InternalComponent(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); writer.Write(ActiveID); writer.Write(InactiveID); writer.Write(_Active); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int v = reader.ReadInt(); ActiveID = reader.ReadInt(); InactiveID = reader.ReadInt(); Active = reader.ReadBool(); MoonstonePowerGeneratorAddon chamber = Addon as MoonstonePowerGeneratorAddon; if (chamber != null) { if (chamber.Activator1 == null) chamber.Activator1 = this; else chamber.Activator2 = this; } } } public override void Delete() { base.Delete(); if (Generators.Contains(this)) Generators.Remove(this); } public static void Configure() { Generators = new List(); } public static void Initialize() { bool active = true; foreach (MoonstonePowerGeneratorAddon c in Generators) { if (!c.Activated) { active = false; break; } } if (!active) { ResetGenerators(true); } else if (Boss == null) { ResetGenerators(); } CommandSystem.Register("ActivateChambers", AccessLevel.Administrator, e => { if (Boss == null) { Generators.ForEach(c => c.Activated = true); CheckNetwork(); } }); CommandSystem.Register("MorphChamberItems", AccessLevel.Administrator, e => { MorphItems(); }); } public static List Generators { get; set; } public static Zipactriotl Boss { get; set; } public static readonly Point3D GroundZero = new Point3D(896, 2304, -19); public static void CheckNetwork() { bool allactive = true; foreach (MoonstonePowerGeneratorAddon c in Generators) { if (!c.Activated) { allactive = false; break; } } if (allactive) { Boss = new Zipactriotl(true); Boss.MoveToWorld(new Point3D(899, 2303, -20), Map.TerMur); foreach (var c in Generators.Where(c => c.Generator != null)) { c.Generator.CanSpawn = true; } MorphItems(); } } public static void MorphItems() { IPooledEnumerable eable = Map.TerMur.GetItemsInRange(GroundZero, 15); foreach (Item item in eable) { if (item.ItemID == 40161) item.ItemID = 40159; else if (item.ItemID == 40142) item.ItemID = 40173; else if (item.ItemID == 40169) item.ItemID = 40174; else if (item.ItemID == 40165) item.ItemID = 40160; else if (item.ItemID == 40159) item.ItemID = 40161; else if (item.ItemID == 40173) item.ItemID = 40142; else if (item.ItemID == 40174) item.ItemID = 40169; else if (item.ItemID == 40160) item.ItemID = 40165; } eable.Free(); } public static void ResetGenerators(bool startup = false) { Generators.ForEach(c => { c.Activated = false; c.Reset(); if (c.Generator == null || c.Generator.Deleted) { c.Generator = new MoonstonePowerGenerator(c); c.Generator.MoveToWorld(new Point3D(c.X, c.Y, c.Z + 5), c.Map); } c.Generator.CanSpawn = false; c.Components.ForEach(comp => { if (!comp.Visible) comp.Visible = true; }); }); if(!startup) MorphItems(); if (Boss != null) Boss = null; } public MoonstonePowerGeneratorAddon(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); writer.Write(Activated); writer.Write(Link); writer.Write(Generator); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int v = reader.ReadInt(); Activated = reader.ReadBool(); if (reader.ReadBool()) { Generators.Add(this); Link = true; } Generator = reader.ReadItem() as MoonstonePowerGenerator; if (Generator != null) Generator.Addon = this; } } public class MoonstonePowerGenerator : DamageableItem { public override int LabelNumber { get { return 1156854; } } // Moonstone Power Generator public List Spawn; public Timer Timer { get; set; } private bool _CanSpawn; [CommandProperty(AccessLevel.GameMaster)] public bool CanSpawn { get { return _CanSpawn; } set { _CanSpawn = value; if (_CanSpawn) { Spawn = new List(); if (Timer != null) { Timer.Stop(); Timer = null; } Timer = Timer.DelayCall(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30), OnTick); Timer.Start(); } else { if (Timer != null) { Timer.Stop(); Timer = null; } } } } [CommandProperty(AccessLevel.GameMaster)] public MoonstonePowerGeneratorAddon Addon { get; set; } [Constructable] public MoonstonePowerGenerator(MoonstonePowerGeneratorAddon addon = null) : base(40147, 40153) { Addon = addon; Level = ItemLevel.Average; Name = "Moonstone Power Generator"; } public void OnTick() { if (Spawn.Count >= 7 || this.Deleted || this.Map == null) return; IPooledEnumerable eable = this.Map.GetMobilesInRange(this.Location, 8); foreach (Mobile m in eable) { if (m is PlayerMobile || (m is BaseCreature && ((BaseCreature)m).GetMaster() is PlayerMobile)) { DoSpawn(); break; } } eable.Free(); } private void DoSpawn() { if (Spawn.Count >= 7 || this.Deleted || this.Map == null) return; BaseCreature bc = new IgnisFatalis(); int x = Utility.RandomBool() ? 2 : -2; int y = Utility.RandomBool() ? 2 : -2; bc.MoveToWorld(new Point3D(this.X + x, this.Y + y, this.Map.GetAverageZ(x, y)), this.Map); Spawn.Add(bc); } public override void OnDamage(int amount, Mobile from, bool willkill) { base.OnDamage(amount, from, willkill); int oldhits = Hits; if (this.ItemID == IDHalfHits && this.Hits <= (HitsMax * .10)) { ItemID = 40154; } if (0.033 > Utility.RandomDouble()) { from.PrivateOverheadMessage(Server.Network.MessageType.Regular, 0x23, 1156855, from.NetState); // *Arcing energy from the generator zaps you!* AOS.Damage(from, Utility.RandomMinMax(50, 100), 0, 0, 0, 0, 100); from.FixedParticles(0x3818, 1, 11, 0x13A8, 0, 0, EffectLayer.Waist); Effects.PlaySound(this.Location, this.Map, 0x1DC); } } public override void OnAfterDestroyed() { Effects.PlaySound(this.Location, this.Map, 0x665); if (Spawn != null) { Spawn.ForEach(bc => { if(bc != null && bc.Alive) bc.Kill(); }); Spawn.Clear(); Spawn.TrimExcess(); Spawn = null; } if (Timer != null) { Timer.Stop(); Timer = null; } if (Addon != null) { AddonComponent comp = Addon.Components.FirstOrDefault(c => c.ItemID == 40157); if (comp != null) comp.Visible = false; } base.OnAfterDestroyed(); } public MoonstonePowerGenerator(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int v = reader.ReadInt(); } } }