using System; namespace Server.Items { public class EnhancedBandage : Bandage { public static int HealingBonus => 10; public override int LabelNumber => 1152441; // enhanced bandage [Constructible] public EnhancedBandage() : this( 1 ) { } [Constructible] public EnhancedBandage( int amount ) : base( amount ) { Hue = 0x8A5; } public EnhancedBandage( Serial serial ) : base( serial ) { } public override bool Dye( Mobile from, DyeTub sender ) { return false; } public override void AddNameProperties( ObjectPropertyList list ) { base.AddNameProperties( list ); list.Add( 1075216 ); // these bandages have been enhanced } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.WriteEncodedInt( 0 ); //version } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadEncodedInt(); } } [FlippableAttribute( 0x2AC0, 0x2AC3 )] public class FountainOfLife : BaseAddonContainer { public override BaseAddonContainerDeed Deed => new FountainOfLifeDeed( m_Charges ); public override bool OnDragLift( Mobile from ) { return false; } public virtual TimeSpan RechargeTime => TimeSpan.FromDays( 1 ); public override int LabelNumber => 1075197; // Fountain of Life public override int DefaultGumpID => 0x484; public override int DefaultDropSound => 66; public override int DefaultMaxItems => 125; private int m_Charges; [CommandProperty( AccessLevel.GameMaster )] public int Charges { get => m_Charges; set { m_Charges = Math.Min( value, 10 ); InvalidateProperties(); } } private Timer m_Timer; [Constructible] public FountainOfLife() : this( 10 ) { } [Constructible] public FountainOfLife( int charges ) : base( 0x2AC0 ) { m_Charges = charges; m_Timer = Timer.DelayCall( RechargeTime, RechargeTime, new TimerCallback( Recharge ) ); } public FountainOfLife( Serial serial ) : base( serial ) { } public override bool OnDragDrop( Mobile from, Item dropped ) { if ( dropped is Bandage ) { bool allow = base.OnDragDrop( from, dropped ); if ( allow ) Enhance( from ); return allow; } else { from.SendLocalizedMessage( 1075209 ); // Only bandages may be dropped into the fountain. return false; } } public override bool OnDragDropInto( Mobile from, Item item, Point3D p ) { if ( item is Bandage ) { bool allow = base.OnDragDropInto( from, item, p ); if ( allow ) Enhance( from ); return allow; } else { from.SendLocalizedMessage( 1075209 ); // Only bandages may be dropped into the fountain. return false; } } public override void AddNameProperties( ObjectPropertyList list ) { base.AddNameProperties( list ); list.Add( 1075217, m_Charges.ToString() ); // ~1_val~ charges remaining } public override void OnDelete() { m_Timer?.Stop(); base.OnDelete(); } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.WriteEncodedInt( 0 ); //version writer.Write( m_Charges ); writer.Write( (DateTime)m_Timer.Next ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadEncodedInt(); m_Charges = reader.ReadInt(); DateTime next = reader.ReadDateTime(); if ( next < DateTime.UtcNow ) m_Timer = Timer.DelayCall( TimeSpan.Zero, RechargeTime, new TimerCallback( Recharge ) ); else m_Timer = Timer.DelayCall( next - DateTime.UtcNow, RechargeTime, new TimerCallback( Recharge ) ); } public void Recharge() { m_Charges = 10; Enhance( null ); } public void Enhance( Mobile from ) { for( int i = Items.Count - 1; i >= 0 && m_Charges > 0; --i ) { if ( Items[i] is EnhancedBandage ) continue; if ( Items[i] is Bandage bandage ) { Item enhanced; if ( bandage.Amount > m_Charges ) { bandage.Amount -= m_Charges; enhanced = new EnhancedBandage( m_Charges ); m_Charges = 0; } else { enhanced = new EnhancedBandage( bandage.Amount ); m_Charges -= bandage.Amount; bandage.Delete(); } if ( from == null || !TryDropItem( from, enhanced, false ) ) // try stacking first DropItem( enhanced ); } } InvalidateProperties(); } } public class FountainOfLifeDeed : BaseAddonContainerDeed { public override int LabelNumber => 1075197; // Fountain of Life public override BaseAddonContainer Addon => new FountainOfLife( m_Charges ); private int m_Charges; [CommandProperty( AccessLevel.GameMaster )] public int Charges { get => m_Charges; set { m_Charges = Math.Min( value, 10 ); InvalidateProperties(); } } [Constructible] public FountainOfLifeDeed() : this( 10 ) { } [Constructible] public FountainOfLifeDeed( int charges ) { LootType = LootType.Blessed; m_Charges = charges; } public FountainOfLifeDeed( Serial serial ) : base( serial ) { } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.WriteEncodedInt( 0 ); //version writer.Write( m_Charges ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadEncodedInt(); m_Charges = reader.ReadInt(); } } }