diff --git a/Scripts/Items/Addons/BaseAddonContainer.cs b/Scripts/Items/Addons/BaseAddonContainer.cs index c871f66f6..4d00a5c83 100644 --- a/Scripts/Items/Addons/BaseAddonContainer.cs +++ b/Scripts/Items/Addons/BaseAddonContainer.cs @@ -152,7 +152,7 @@ namespace Server.Items AddonComponent.ApplyLightTo( this ); } - public void DropItemsToGround() + public virtual void DropItemsToGround() { for ( int i = Items.Count - 1; i >= 0; i-- ) Items[ i ].MoveToWorld( Location ); diff --git a/Scripts/Items/Aquarium/Aquarium.cs b/Scripts/Items/Aquarium/Aquarium.cs index 4b8fe39d1..bf23cdda3 100644 --- a/Scripts/Items/Aquarium/Aquarium.cs +++ b/Scripts/Items/Aquarium/Aquarium.cs @@ -5,328 +5,362 @@ using Server; using Server.Items; using Server.Mobiles; using Server.Multis; +using Server.Network; using Server.Gumps; using Server.ContextMenus; namespace Server.Items { public class Aquarium : BaseAddonContainer - { + { + public static readonly TimeSpan EvaluationInterval = TimeSpan.FromDays( 1 ); + // items info private int m_LiveCreatures; - + [CommandProperty( AccessLevel.GameMaster )] public int LiveCreatures { get{ return m_LiveCreatures; } } - + [CommandProperty( AccessLevel.GameMaster )] public int DeadCreatures { get { int dead = 0; - + for ( int i = 0; i < Items.Count; i ++ ) { if ( Items[ i ] is BaseFish ) { BaseFish fish = (BaseFish) Items[ i ]; - + if ( fish.Dead ) dead += 1; } } - + return dead; } } - + [CommandProperty( AccessLevel.GameMaster )] public int MaxLiveCreatures { get { - int state = m_Food.State == (int) FoodState.Overfed ? 1 : (int) FoodState.Full - m_Food.State; - + int state = ( m_Food.State == (int) FoodState.Overfed ) ? 1 : (int) FoodState.Full - m_Food.State; + state += (int) WaterState.Strong - m_Water.State; - + state = (int) Math.Pow( state, 1.75 ); - - return MaxItems - state; + + return MaxItems - state; } - } - + } + [CommandProperty( AccessLevel.GameMaster )] public bool IsFull { - get{ return Items.Count >= MaxItems; } + get{ return ( Items.Count >= MaxItems ); } } - + // vacation info private int m_VacationLeft; - + [CommandProperty( AccessLevel.GameMaster )] public int VacationLeft { get{ return m_VacationLeft; } set{ m_VacationLeft = value; InvalidateProperties(); } } - + // aquarium state private AquariumState m_Food; private AquariumState m_Water; - + [CommandProperty( AccessLevel.GameMaster )] public AquariumState Food { get{ return m_Food; } + set{ m_Food = value; InvalidateProperties(); } } - + [CommandProperty( AccessLevel.GameMaster )] public AquariumState Water { get{ return m_Water; } - } - + set{ m_Water = value; InvalidateProperties(); } + } + [CommandProperty( AccessLevel.GameMaster )] public bool OptimalState { - get{ return m_Food.State == (int) FoodState.Full && m_Water.State == (int) WaterState.Strong; } + get{ return ( m_Food.State == (int) FoodState.Full && m_Water.State == (int) WaterState.Strong ); } } - + // events private List m_Events; private bool m_RewardAvailable; private bool m_EvaluateDay; - + public List Events { get{ return m_Events; } } - + [CommandProperty( AccessLevel.GameMaster )] public bool RewardAvailable { get{ return m_RewardAvailable; } set{ m_RewardAvailable = value; InvalidateProperties(); } } - + // evaluate timer private Timer m_Timer; - + public override BaseAddonContainerDeed Deed - { + { get - { - if ( ItemID == 0x3060 ) - return new AquariumEastDeed(); + { + if ( ItemID == 0x3062 ) + return new AquariumEastDeed(); else return new AquariumNorthDeed(); - } + } } - + + public override double DefaultWeight{ get{ return 10.0; } } + public Aquarium( int itemID ) : base( itemID ) { + Movable = false; + if ( itemID == 0x3060 ) AddComponent( new AddonContainerComponent( 0x3061 ), -1, 0, 0 ); - + if ( itemID == 0x3062 ) AddComponent( new AddonContainerComponent( 0x3063 ), 0, -1, 0 ); - + MaxItems = 30; - Weight = 10.0; - + m_Food = new AquariumState(); m_Water = new AquariumState(); - + m_Food.State = (int) FoodState.Full; m_Water.State = (int) WaterState.Strong; - - m_Food.Maintain = Utility.RandomMinMax( 1, 2 );; + + m_Food.Maintain = Utility.RandomMinMax( 1, 2 ); m_Food.Improve = m_Food.Maintain + Utility.RandomMinMax( 1, 2 ); - - m_Water.Maintain = Utility.RandomMinMax( 1, 3 );; - + + m_Water.Maintain = Utility.RandomMinMax( 1, 3 ); + m_Events = new List(); - - m_Timer = Timer.DelayCall( TimeSpan.FromHours( 24 ), TimeSpan.FromHours( 24 ), new TimerCallback( Evaluate ) ); + + m_Timer = Timer.DelayCall( EvaluationInterval, EvaluationInterval, new TimerCallback( Evaluate ) ); } public Aquarium( Serial serial ) : base( serial ) { } - + + public override void OnDelete() + { + if ( m_Timer != null ) + { + m_Timer.Stop(); + m_Timer = null; + } + } + public override void OnDoubleClick( Mobile from ) { ExamineAquarium( from ); - } - - public override bool OnDragDrop( Mobile from, Item dropped ) + } + + public virtual bool HasAccess( Mobile from ) { - bool truefalse = true; + if ( from == null || from.Deleted ) + return false; + else if ( from.AccessLevel >= AccessLevel.GameMaster ) + return true; BaseHouse house = BaseHouse.FindHouseAt( this ); - - if ( house == null || !house.IsCoOwner( from ) ) + + if ( house != null && house.IsCoOwner( from ) ) + return true; + + return false; + } + + public override bool OnDragDrop( Mobile from, Item dropped ) + { + if ( !HasAccess( from ) ) { from.SendLocalizedMessage( 1073821 ); // You do not have access to that item for use with the aquarium. return false; } - + if ( m_VacationLeft > 0 ) { from.SendLocalizedMessage( 1074427 ); // The aquarium is in vacation mode. return false; } - + + bool takeItem = true; + if ( dropped is FishBowl ) { FishBowl bowl = (FishBowl) dropped; - if( !bowl.Empty ) - { - if( AddFish( from, bowl.Fish ) ) - { - bowl.InvalidateProperties(); - InvalidateProperties(); - } - } - return false; - - } + if ( bowl.Empty || !AddFish( from, bowl.Fish ) ) + return false; + + bowl.InvalidateProperties(); + + takeItem = false; + } else if ( dropped is BaseFish ) { BaseFish fish = (BaseFish) dropped; - + if ( !AddFish( from, fish ) ) return false; - } + } else if ( dropped is VacationWafer ) - { - m_VacationLeft += 7; - ((Item) dropped).Delete(); - - from.SendLocalizedMessage( 1074428, "" + m_VacationLeft ); // The aquarium will be in vacation mode for ~1_DAYS~ days + { + m_VacationLeft = VacationWafer.VacationDays; + dropped.Delete(); + + from.SendLocalizedMessage( 1074428, m_VacationLeft.ToString() ); // The aquarium will be in vacation mode for ~1_DAYS~ days } else if ( dropped is AquariumFood ) - { - m_Food.Added += 1; - ((Item) dropped).Delete(); - - from.SendLocalizedMessage( 1074259, "" + 1 ); // ~1_NUM~ unit(s) of food have been added to the aquarium. - } + { + m_Food.Added += 1; + dropped.Delete(); + + from.SendLocalizedMessage( 1074259, "1" ); // ~1_NUM~ unit(s) of food have been added to the aquarium. + } else if ( dropped is BaseBeverage ) { - BaseBeverage beverage = (BaseBeverage) dropped; - + if ( beverage.IsEmpty || !beverage.Pourable || beverage.Content != BeverageType.Water ) { from.SendLocalizedMessage( 500840 ); // Can't pour that in there. return false; } - + m_Water.Added += 1; beverage.Quantity -= 1; - + from.PlaySound( 0x4E ); - from.SendLocalizedMessage( 1074260, "" + 1 ); // ~1_NUM~ unit(s) of water have been added to the aquarium. - truefalse = false; - } + from.SendLocalizedMessage( 1074260, "1" ); // ~1_NUM~ unit(s) of water have been added to the aquarium. + + takeItem = false; + } else if ( !AddDecoration( from, dropped ) ) - truefalse = false; - + { + takeItem = false; + } + from.CloseGump( typeof( AquariumGump ) ); InvalidateProperties(); - return truefalse; + if ( takeItem ) + from.PlaySound( 0x42 ); + + return takeItem; } - - public override void OnChop( Mobile from ) + + public override void DropItemsToGround() { - for ( int i = 0; i < Items.Count; i ++ ) + Point3D loc = GetWorldLocation(); + + for ( int i = Items.Count - 1; i >= 0; i-- ) { Item item = Items[ i ]; - - item.MoveToWorld( Location, Map ); - + + item.MoveToWorld( loc, Map ); + if ( item is BaseFish ) { BaseFish fish = (BaseFish) item; - + if ( !fish.Dead ) fish.StartTimer(); } } - - base.OnChop( from ); - } - + } + public override void GetProperties( ObjectPropertyList list ) - { + { base.GetProperties( list ); - + if ( m_VacationLeft > 0 ) - list.Add( 1074430, "{0}", m_VacationLeft ); // Vacation days left: ~1_DAYS - + list.Add( 1074430, m_VacationLeft.ToString() ); // Vacation days left: ~1_DAYS + if ( m_Events.Count > 0 ) - list.Add( 1074426, "{0}", m_Events.Count ); // ~1_NUM~ event(s) to view! - + list.Add( 1074426, m_Events.Count.ToString() ); // ~1_NUM~ event(s) to view! + if ( m_RewardAvailable ) list.Add( 1074362 ); // A reward is available! - + list.Add( 1074247, "{0}\t{1}", m_LiveCreatures, MaxLiveCreatures ); // Live Creatures: ~1_NUM~ / ~2_MAX~ - - if ( DeadCreatures > 0 ) - list.Add( 1074248, "{0}", DeadCreatures ); // Dead Creatures: ~1_NUM~ - - int decorations = Items.Count - m_LiveCreatures - DeadCreatures; + + int dead = DeadCreatures; + + if ( dead > 0 ) + list.Add( 1074248, dead.ToString() ); // Dead Creatures: ~1_NUM~ + + int decorations = Items.Count - m_LiveCreatures - dead; if ( decorations > 0 ) - list.Add( 1074249, "{0}", Items.Count - m_LiveCreatures - DeadCreatures ); // Decorations: ~1_NUM~ - - list.Add( 1074250, "#" + FoodNumber() ); // Food state: ~1_STATE~ - list.Add( 1074251, "#" + WaterNumber() ); // Water state: ~1_STATE~ - + list.Add( 1074249, decorations.ToString() ); // Decorations: ~1_NUM~ + + list.Add( 1074250, "#{0}", FoodNumber() ); // Food state: ~1_STATE~ + list.Add( 1074251, "#{0}", WaterNumber() ); // Water state: ~1_STATE~ + if ( m_Food.State == (int) FoodState.Dead ) - list.Add( 1074577, "{0}\t{1}", m_Food.Added, m_Food.Improve ); // Food Added: ~1_CUR~ Needed: ~2_NEED~ + list.Add( 1074577, "{0}\t{1}", m_Food.Added, m_Food.Improve ); // Food Added: ~1_CUR~ Needed: ~2_NEED~ else if ( m_Food.State == (int) FoodState.Overfed ) - list.Add( 1074577, "{0}\t{1}", m_Food.Added, m_Food.Maintain ); // Food Added: ~1_CUR~ Needed: ~2_NEED~ + list.Add( 1074577, "{0}\t{1}", m_Food.Added, m_Food.Maintain ); // Food Added: ~1_CUR~ Needed: ~2_NEED~ else list.Add( 1074253, "{0}\t{1}\t{2}", m_Food.Added, m_Food.Maintain, m_Food.Improve ); // Food Added: ~1_CUR~ Feed: ~2_NEED~ Improve: ~3_GROW~ - + if ( m_Water.State == (int) WaterState.Dead ) list.Add( 1074578, "{0}\t{1}", m_Water.Added, m_Water.Improve ); // Water Added: ~1_CUR~ Needed: ~2_NEED~ else if ( m_Water.State == (int) WaterState.Strong ) list.Add( 1074578, "{0}\t{1}", m_Water.Added, m_Water.Maintain ); // Water Added: ~1_CUR~ Needed: ~2_NEED~ else list.Add( 1074254, "{0}\t{1}\t{2}", m_Water.Added, m_Water.Maintain, m_Water.Improve ); // Water Added: ~1_CUR~ Maintain: ~2_NEED~ Improve: ~3_GROW~ - - //list.Add( 1073841, "{0}\t{1}\t{2}", Items.Count, MaxItems, TotalWeight ); // Contents: ~1_COUNT~/~2_MAXCOUNT~ items, ~3_WEIGHT~ stones } - + public override void GetContextMenuEntries( Mobile from, List list ) { base.GetContextMenuEntries( from, list ); - + if ( from.Alive ) { list.Add( new ExamineEntry( this ) ); - - if ( m_RewardAvailable ) - list.Add( new CollectRewardEntry( this ) ); - - if ( m_Events.Count > 0 ) - list.Add( new ViewEventEntry( this ) ); - - if ( m_VacationLeft > 0 ) - list.Add( new CancelVacationMode( this ) ); + + if ( HasAccess( from ) ) + { + if ( m_RewardAvailable ) + list.Add( new CollectRewardEntry( this ) ); + + if ( m_Events.Count > 0 ) + list.Add( new ViewEventEntry( this ) ); + + if ( m_VacationLeft > 0 ) + list.Add( new CancelVacationMode( this ) ); + } } - - if ( (int) from.AccessLevel > (int) AccessLevel.Counselor ) + + if ( from.AccessLevel >= AccessLevel.GameMaster ) { list.Add( new GMAddFood( this ) ); list.Add( new GMAddWater( this ) ); @@ -335,163 +369,174 @@ namespace Server.Items list.Add( new GMFill( this ) ); } } - + public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); - - writer.Write( 1 ); // Version - + + writer.Write( 2 ); // Version + // version 1 if ( m_Timer != null ) writer.Write( m_Timer.Next ); else - writer.Write( DateTime.Now + TimeSpan.FromHours( 24 ) ); - - // version 0 - writer.Write( (int) m_LiveCreatures ); + writer.Write( DateTime.Now + EvaluationInterval ); + + // version 0 + writer.Write( (int) m_LiveCreatures ); writer.Write( (int) m_VacationLeft ); - + m_Food.Serialize( writer ); m_Water.Serialize( writer ); - + writer.Write( (int) m_Events.Count ); - + for ( int i = 0; i < m_Events.Count; i ++ ) writer.Write( (int) m_Events[ i ] ); - + writer.Write( (bool) m_RewardAvailable ); } - + public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); - + int version = reader.ReadInt(); - + switch ( version ) { - case 1: + case 2: + case 1: + { DateTime next = reader.ReadDateTime(); - + if ( next < DateTime.Now ) - next = DateTime.Now; - - m_Timer = Timer.DelayCall( next - DateTime.Now, TimeSpan.FromHours( 24 ), new TimerCallback( Evaluate ) ); - - goto case 0; - case 0: + next = DateTime.Now; + + m_Timer = Timer.DelayCall( next - DateTime.Now, EvaluationInterval, new TimerCallback( Evaluate ) ); + + goto case 0; + } + case 0: + { m_LiveCreatures = reader.ReadInt(); m_VacationLeft = reader.ReadInt(); - + m_Food = new AquariumState(); m_Water = new AquariumState(); - + m_Food.Deserialize( reader ); m_Water.Deserialize( reader ); - + m_Events = new List(); - - int count = reader.ReadInt(); - + + int count = reader.ReadInt(); + for ( int i = 0; i < count; i ++ ) m_Events.Add( reader.ReadInt() ); - + m_RewardAvailable = reader.ReadBool(); - - break; + + break; + } + } + + if ( version < 2 ) + { + Weight = DefaultWeight; + Movable = false; } } - + #region Members public int FoodNumber() { if ( m_Food.State == (int) FoodState.Full ) return 1074240; - + if ( m_Food.State == (int) FoodState.Overfed ) return 1074239; - + return 1074236 + m_Food.State; } - + public int WaterNumber() { return 1074242 + m_Water.State; } - #endregion - + #endregion + #region Virtual members public virtual void KillFish( int amount ) { List toKill = new List(); - + for ( int i = 0; i < Items.Count; i ++ ) { if ( Items[ i ] is BaseFish ) { BaseFish fish = (BaseFish) Items[ i ]; - + if ( !fish.Dead ) toKill.Add( fish ); } - } - + } + while ( amount > 0 && toKill.Count > 0 ) { int kill = Utility.Random( toKill.Count ); - + toKill[ kill ].Kill(); - + toKill.RemoveAt( kill ); - + amount -= 1; m_LiveCreatures -= 1; - + if ( m_LiveCreatures < 0 ) m_LiveCreatures = 0; - + m_Events.Add( 1074366 ); // An unfortunate accident has left a creature floating upside-down. It is starting to smell. } } - + public virtual void Evaluate() - { + { if ( m_VacationLeft > 0 ) - { + { m_VacationLeft -= 1; } else if ( m_EvaluateDay ) - { + { // reset events m_Events = new List(); - + // food events - if ( - ( m_Food.Added < m_Food.Maintain && m_Food.State != (int) FoodState.Overfed && m_Food.State != (int) FoodState.Dead ) || - ( m_Food.Added >= m_Food.Improve && m_Food.State == (int) FoodState.Full ) + if ( + ( m_Food.Added < m_Food.Maintain && m_Food.State != (int) FoodState.Overfed && m_Food.State != (int) FoodState.Dead ) || + ( m_Food.Added >= m_Food.Improve && m_Food.State == (int) FoodState.Full ) ) m_Events.Add( 1074368 ); // The tank looks worse than it did yesterday. - - if ( - ( m_Food.Added >= m_Food.Improve && m_Food.State != (int) FoodState.Full && m_Food.State != (int) FoodState.Overfed ) || - ( m_Food.Added < m_Food.Maintain && m_Food.State == (int) FoodState.Overfed ) + + if ( + ( m_Food.Added >= m_Food.Improve && m_Food.State != (int) FoodState.Full && m_Food.State != (int) FoodState.Overfed ) || + ( m_Food.Added < m_Food.Maintain && m_Food.State == (int) FoodState.Overfed ) ) m_Events.Add( 1074367 ); // The tank looks healthier today. - + // water events if ( m_Water.Added < m_Water.Maintain && m_Water.State != (int) WaterState.Dead ) m_Events.Add( 1074370 ); // This tank can use more water. - + if ( m_Water.Added >= m_Water.Improve && m_Water.State != (int) WaterState.Strong ) m_Events.Add( 1074369 ); // The water looks clearer today. - + UpdateFoodState(); UpdateWaterState(); - + // reward if ( m_LiveCreatures > 0 ) - m_RewardAvailable = true; + m_RewardAvailable = true; } else { @@ -502,143 +547,167 @@ namespace Server.Items { BaseFish fish = null; int message = 0; - + switch ( Utility.Random( 6 ) ) { - case 0: + case 0: + { message = 1074371; // Brine shrimp have hatched overnight in the tank. - fish = new BrineShrimp(); + fish = new BrineShrimp(); break; - case 1: + } + case 1: + { message = 1074365; // A new creature has hatched overnight in the tank. fish = new Coral(); break; - case 2: + } + case 2: + { message = 1074365; // A new creature has hatched overnight in the tank. fish = new FullMoonFish(); break; - case 3: + } + case 3: + { message = 1074373; // A sea horse has hatched overnight in the tank. fish = new SeaHorseFish(); break; - case 4: + } + case 4: + { message = 1074365; // A new creature has hatched overnight in the tank. fish = new StrippedFlakeFish(); break; - case 5: + } + case 5: + { message = 1074365; // A new creature has hatched overnight in the tank. fish = new StrippedSosarianSwill(); break; + } } - + if ( Utility.RandomDouble() < 0.05 ) fish.Hue = m_FishHues[ Utility.Random( m_FishHues.Length ) ]; else if ( Utility.RandomDouble() < 0.5 ) fish.Hue = Utility.RandomMinMax( 0x100, 0x3E5 ); - - m_Events.Add( message ); + + if ( AddFish( fish ) ) + m_Events.Add( message ); + else + fish.Delete(); } - } - + } + // kill fish *grins* if ( m_LiveCreatures < MaxLiveCreatures ) { if ( Utility.RandomDouble() < 0.01 ) - KillFish( 1 ); + KillFish( 1 ); } else - KillFish( m_LiveCreatures - MaxLiveCreatures ); + { + KillFish( m_LiveCreatures - MaxLiveCreatures ); + } } - + m_EvaluateDay = !m_EvaluateDay; + InvalidateProperties(); } - + public virtual void GiveReward( Mobile to ) { if ( !m_RewardAvailable ) return; - - double max = ( m_LiveCreatures / (double) 30 ) * m_Decorations.Length + 1; - - int random = (int) Math.Log( Utility.RandomMinMax( 1, (int) Math.Pow( Math.E, max ) ) ); - - if ( random < 0 ) - random = 0; - - if ( random > m_Decorations.Length - 1 ) + + int max = (int) ( ( (double) m_LiveCreatures / 30 ) * m_Decorations.Length ); + + int random = ( max <= 0 ) ? 0 : Utility.Random( max ); + + if ( random >= m_Decorations.Length ) random = m_Decorations.Length - 1; - - Type reward = m_Decorations[ random ]; - + Item item; - - try{ item = Activator.CreateInstance( reward ) as Item; } - catch{ return; } - - if ( !to.PlaceInBackpack( item ) ) - to.SendLocalizedMessage( 1074361 ); // The reward could not be given. Make sure you have room in your pack. - else + + try { - to.SendLocalizedMessage( 1074360, "#" + item.LabelNumber ); // You receive a reward: ~1_REWARD~ - to.PlaySound( 0x5A3 ); + item = Activator.CreateInstance( m_Decorations[ random ] ) as Item; } - + catch + { + return; + } + + if ( item == null ) + return; + + if ( !to.PlaceInBackpack( item ) ) + { + item.Delete(); + to.SendLocalizedMessage( 1074361 ); // The reward could not be given. Make sure you have room in your pack. + return; + } + + to.SendLocalizedMessage( 1074360, String.Format( "#{0}", item.LabelNumber ) ); // You receive a reward: ~1_REWARD~ + to.PlaySound( 0x5A3 ); + m_RewardAvailable = false; - + InvalidateProperties(); } - + public virtual void UpdateFoodState() { if ( m_Food.Added < m_Food.Maintain ) - m_Food.State = m_Food.State <= 0 ? 0 : m_Food.State - 1; + m_Food.State = ( m_Food.State <= 0 ) ? 0 : m_Food.State - 1; else if ( m_Food.Added >= m_Food.Improve ) - m_Food.State = m_Food.State >= (int) FoodState.Overfed ? (int) FoodState.Overfed : m_Food.State + 1; - + m_Food.State = ( m_Food.State >= (int) FoodState.Overfed ) ? (int) FoodState.Overfed : m_Food.State + 1; + m_Food.Maintain = Utility.Random( (int) FoodState.Overfed + 1 - m_Food.State, 2 ); - + if ( m_Food.State == (int) FoodState.Overfed ) m_Food.Improve = 0; else - m_Food.Improve = m_Food.Maintain + 2; - - m_Food.Added = 0; - } - + m_Food.Improve = m_Food.Maintain + 2; + + m_Food.Added = 0; + } + public virtual void UpdateWaterState() { if ( m_Water.Added < m_Water.Maintain ) - m_Water.State = m_Water.State <= 0 ? 0 : m_Water.State - 1; + m_Water.State = ( m_Water.State <= 0 ) ? 0 : m_Water.State - 1; else if ( m_Water.Added >= m_Water.Improve ) - m_Water.State = m_Water.State >= (int) WaterState.Strong ? (int) WaterState.Strong : m_Water.State + 1; - + m_Water.State = ( m_Water.State >= (int) WaterState.Strong ) ? (int) WaterState.Strong : m_Water.State + 1; + m_Water.Maintain = Utility.Random( (int) WaterState.Strong + 2 - m_Water.State, 2 ); - + if ( m_Water.State == (int) WaterState.Strong ) m_Water.Improve = 0; else - m_Water.Improve = m_Water.Maintain + 2; - + m_Water.Improve = m_Water.Maintain + 2; + m_Water.Added = 0; - } - + } + public virtual bool RemoveItem( Mobile from, int at ) { if ( at < 0 && at >= Items.Count ) return false; - + Item item = Items[ at ]; - + if ( item is BaseFish ) { BaseFish fish = (BaseFish) item; - + FishBowl bowl; - + if ( (bowl = GetEmptyBowl( from )) != null ) { bowl.AddItem( fish ); - + from.SendLocalizedMessage( 1074511 ); // You put the creature into a fish bowl. } else @@ -649,12 +718,14 @@ namespace Server.Items return false; } else + { from.SendLocalizedMessage( 1074512 ); // You put the gasping creature into your pack. + } } - + if ( !fish.Dead ) - m_LiveCreatures -= 1; - } + m_LiveCreatures -= 1; + } else { if ( !from.PlaceInBackpack( item ) ) @@ -663,318 +734,327 @@ namespace Server.Items return false; } else + { from.SendLocalizedMessage( 1074513 ); // You put the item into your pack. + } } - + InvalidateProperties(); return true; } - + public virtual void ExamineAquarium( Mobile from ) { - if ( !from.InRange( this, 2 ) ) + if ( !from.InRange( GetWorldLocation(), 2 ) ) { - from.Say( 1019045 ); // I can't reach that. + from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that. return; } - - BaseHouse house = BaseHouse.FindHouseAt( this ); - - from.CloseGump( typeof( AquariumGump ) ); - if ( house != null && house.IsCoOwner( from ) ) - from.SendGump( new AquariumGump( this, true ) ); - else - from.SendGump( new AquariumGump( this, false ) ); - + from.CloseGump( typeof( AquariumGump ) ); + from.SendGump( new AquariumGump( this, HasAccess( from ) ) ); + from.PlaySound( 0x5A4 ); } - + + public virtual bool AddFish( BaseFish fish ) + { + return AddFish( null, fish ); + } + public virtual bool AddFish( Mobile from, BaseFish fish ) { if ( fish == null ) return false; - - if ( ( m_LiveCreatures == MaxLiveCreatures && !IsFull ) || fish.Dead ) + + if ( IsFull || m_LiveCreatures == MaxLiveCreatures || fish.Dead ) { - from.SendLocalizedMessage( 1073633 ); // The aquarium can not hold the creature. + if ( from != null ) + from.SendLocalizedMessage( 1073633 ); // The aquarium can not hold the creature. + return false; } - + AddItem( fish ); fish.StopTimer(); - + m_LiveCreatures += 1; - - from.SendLocalizedMessage( 1073632, "#" + fish.LabelNumber ); // You add the following creature to your aquarium: ~1_FISH~ + + if ( from != null ) + from.SendLocalizedMessage( 1073632, String.Format( "#{0}", fish.LabelNumber ) ); // You add the following creature to your aquarium: ~1_FISH~ InvalidateProperties(); - return true; + return true; } - + + public virtual bool AddDecoration( Item item ) + { + return AddDecoration( null, item ); + } + public virtual bool AddDecoration( Mobile from, Item item ) { if ( item == null ) return false; - + if ( IsFull ) { - from.SendLocalizedMessage( 1073636 ); // The decoration will not fit in the aquarium. + if ( from != null ) + from.SendLocalizedMessage( 1073636 ); // The decoration will not fit in the aquarium. + return false; } - + if ( !Accepts( item ) ) { - from.SendLocalizedMessage( 1073822 ); // The aquarium can not hold that item. + if ( from != null ) + from.SendLocalizedMessage( 1073822 ); // The aquarium can not hold that item. + return false; - } - + } + AddItem( item ); - - if ( item.LabelNumber != 0 ) - from.SendLocalizedMessage( 1073635, "#" + item.LabelNumber ); // You add the following decoration to your aquarium: ~1_NAME~ - else - from.SendLocalizedMessage( 1073635, item.Name ); // You add the following decoration to your aquarium: ~1_NAME~ + + if ( from != null ) + from.SendLocalizedMessage( 1073635, ( item.LabelNumber != 0 ) ? String.Format( "#{0}", item.LabelNumber ) : item.Name ); // You add the following decoration to your aquarium: ~1_NAME~ InvalidateProperties(); return true; } #endregion - + #region Static members public static FishBowl GetEmptyBowl( Mobile from ) { - if ( from.Backpack == null ) + if ( from == null || from.Backpack == null ) return null; - + Item[] items = from.Backpack.FindItemsByType( typeof( FishBowl ) ); - + for ( int i = 0; i < items.Length; i ++ ) { if ( items[ i ] is FishBowl ) { FishBowl bowl = (FishBowl) items[ i ]; - + if ( bowl.Empty ) return bowl; } } - + return null; } - + private static Type[] m_Decorations = new Type[] { typeof( FishBones ), - typeof( WaterloggedBoots ), - typeof( CaptainBlackheartsFishingPole ), - typeof( CraftysFishingHat ), - typeof( AquariumFishingNet ), + typeof( WaterloggedBoots ), + typeof( CaptainBlackheartsFishingPole ), + typeof( CraftysFishingHat ), + typeof( AquariumFishNet ), typeof( AquariumMessage ), - typeof( IslandStatue ), + typeof( IslandStatue ), typeof( Shell ), typeof( ToyBoat ) }; - + public static bool Accepts( Item item ) { if ( item == null ) return false; - - Type type = item.GetType(); - + + Type type = item.GetType(); + for ( int i = 0; i < m_Decorations.Length; i ++ ) { if ( type == m_Decorations[ i ] ) return true; } - + return false; - } - + } + private static int[] m_FishHues = new int[] { 0x1C2, 0x1C3, 0x2A3, 0x47E, 0x51D }; - + public static int[] FishHues { get{ return m_FishHues; } } #endregion - + #region Context entries private class ExamineEntry : ContextMenuEntry { private Aquarium m_Aquarium; - public ExamineEntry( Aquarium aquarium ) : base( 6235, 2 ) + public ExamineEntry( Aquarium aquarium ) : base( 6235, 2 ) // Examine Aquarium { m_Aquarium = aquarium; } - + public override void OnClick() { if ( m_Aquarium.Deleted ) return; - + m_Aquarium.ExamineAquarium( Owner.From ); } } - + private class CollectRewardEntry : ContextMenuEntry { private Aquarium m_Aquarium; - public CollectRewardEntry( Aquarium aquarium ) : base( 6237, 2 ) + public CollectRewardEntry( Aquarium aquarium ) : base( 6237, 2 ) // Collect Reward { m_Aquarium = aquarium; } - + public override void OnClick() { - if ( m_Aquarium.Deleted ) + if ( m_Aquarium.Deleted || !m_Aquarium.HasAccess( Owner.From ) ) return; - + m_Aquarium.GiveReward( Owner.From ); - m_Aquarium.InvalidateProperties(); } } - + private class ViewEventEntry : ContextMenuEntry { private Aquarium m_Aquarium; - public ViewEventEntry( Aquarium aquarium ) : base( 6239, 2 ) + public ViewEventEntry( Aquarium aquarium ) : base( 6239, 2 ) // View events { m_Aquarium = aquarium; } - + public override void OnClick() { - if ( m_Aquarium.Deleted ) + if ( m_Aquarium.Deleted || !m_Aquarium.HasAccess( Owner.From ) || m_Aquarium.Events.Count == 0 ) return; - + Owner.From.SendLocalizedMessage( m_Aquarium.Events[ 0 ] ); - + if ( m_Aquarium.Events[ 0 ] == 1074366 ) Owner.From.PlaySound( 0x5A2 ); - + m_Aquarium.Events.RemoveAt( 0 ); m_Aquarium.InvalidateProperties(); } } - + private class CancelVacationMode : ContextMenuEntry { private Aquarium m_Aquarium; - public CancelVacationMode( Aquarium aquarium ) : base( 6240, 2 ) + public CancelVacationMode( Aquarium aquarium ) : base( 6240, 2 ) // Cancel vacation mode { m_Aquarium = aquarium; } - + public override void OnClick() { - if ( m_Aquarium.Deleted ) + if ( m_Aquarium.Deleted || !m_Aquarium.HasAccess( Owner.From ) ) return; - + Owner.From.SendLocalizedMessage( 1074429 ); // Vacation mode has been cancelled. m_Aquarium.VacationLeft = 0; m_Aquarium.InvalidateProperties(); } } - + // GM context entries private class GMAddFood : ContextMenuEntry { private Aquarium m_Aquarium; - public GMAddFood( Aquarium aquarium ) : base( 6231, -1 ) + public GMAddFood( Aquarium aquarium ) : base( 6231, -1 ) // GM Add Food { m_Aquarium = aquarium; } - + public override void OnClick() { if ( m_Aquarium.Deleted ) return; - + m_Aquarium.Food.Added += 1; m_Aquarium.InvalidateProperties(); } } - + private class GMAddWater : ContextMenuEntry { private Aquarium m_Aquarium; - public GMAddWater( Aquarium aquarium ) : base( 6232, -1 ) + public GMAddWater( Aquarium aquarium ) : base( 6232, -1 ) // GM Add Water { m_Aquarium = aquarium; } - + public override void OnClick() { if ( m_Aquarium.Deleted ) return; - + m_Aquarium.Water.Added += 1; m_Aquarium.InvalidateProperties(); } } - + private class GMForceEvaluate : ContextMenuEntry { private Aquarium m_Aquarium; - public GMForceEvaluate( Aquarium aquarium ) : base( 6233, -1 ) + public GMForceEvaluate( Aquarium aquarium ) : base( 6233, -1 ) // GM Force Evaluate { m_Aquarium = aquarium; } - + public override void OnClick() { if ( m_Aquarium.Deleted ) return; - - m_Aquarium.Evaluate(); - m_Aquarium.InvalidateProperties(); + + m_Aquarium.Evaluate(); } } - + private class GMOpen : ContextMenuEntry { private Aquarium m_Aquarium; - public GMOpen( Aquarium aquarium ) : base( 6234, -1 ) + public GMOpen( Aquarium aquarium ) : base( 6234, -1 ) // GM Open Container { m_Aquarium = aquarium; } - + public override void OnClick() { if ( m_Aquarium.Deleted ) return; - + Owner.From.SendGump( new AquariumGump( m_Aquarium, true ) ); } } - + private class GMFill : ContextMenuEntry { private Aquarium m_Aquarium; - public GMFill( Aquarium aquarium ) : base( 6236, -1 ) + public GMFill( Aquarium aquarium ) : base( 6236, -1 ) // GM Fill Food and Water { m_Aquarium = aquarium; } - + public override void OnClick() { if ( m_Aquarium.Deleted ) return; - + m_Aquarium.Food.Added = m_Aquarium.Food.Maintain; m_Aquarium.Water.Added = m_Aquarium.Water.Maintain; m_Aquarium.InvalidateProperties(); @@ -982,12 +1062,12 @@ namespace Server.Items } #endregion } - + public class AquariumEastDeed : BaseAddonContainerDeed { - public override BaseAddonContainer Addon{ get{ return new Aquarium( 0x3060 ); } } + public override BaseAddonContainer Addon{ get{ return new Aquarium( 0x3062 ); } } public override int LabelNumber{ get{ return 1074501; } } // Large Aquarium (east) - + [Constructable] public AquariumEastDeed() : base() { @@ -1000,23 +1080,23 @@ namespace Server.Items public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); - + writer.Write( 0 ); // Version } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); - + int version = reader.ReadInt(); } } - + public class AquariumNorthDeed : BaseAddonContainerDeed { - public override BaseAddonContainer Addon{ get{ return new Aquarium( 0x3062 ); } } + public override BaseAddonContainer Addon{ get{ return new Aquarium( 0x3060 ); } } public override int LabelNumber{ get{ return 1074497; } } // Large Aquarium (north) - + [Constructable] public AquariumNorthDeed() : base() { @@ -1029,14 +1109,14 @@ namespace Server.Items public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); - + writer.Write( 0 ); // Version } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); - + int version = reader.ReadInt(); } } diff --git a/Scripts/Items/Aquarium/AquariumFishingNet.cs b/Scripts/Items/Aquarium/AquariumFishingNet.cs index bd5572582..373cb1740 100644 --- a/Scripts/Items/Aquarium/AquariumFishingNet.cs +++ b/Scripts/Items/Aquarium/AquariumFishingNet.cs @@ -6,226 +6,181 @@ using Server.Targeting; namespace Server.Items { - public class AquariumFishingNet : Item - { + public class AquariumFishNet : SpecialFishingNet + { public override int LabelNumber{ get{ return 1074463; } } // An aquarium fishing net - - private static int[] m_Hues = { 0x09B, 0x0CD, 0x0D3, 0x14D, 0x1DD, 0x1E9, 0x1F4, 0x373, 0x451, 0x47F, 0x489, 0x492, 0x4B5, 0x8AA }; - private static int[] m_WaterTiles = { 0x00A8, 0x00AB, 0x0136, 0x0137 }; - - private Mobile m_Player; - + [Constructable] - public AquariumFishingNet() : base( 0xDC8 ) + public AquariumFishNet() + { + ItemID = 0xDC8; + + if ( Hue == 0x8A0 ) + Hue = 0x240; + } + + protected override void AddNetProperties( ObjectPropertyList list ) + { + } + + // TODO + //public override bool RequireDeepWater { get { return false; } } + + protected override void FinishEffect( Point3D p, Map map, Mobile from ) + { + if ( Utility.RandomDouble() < 0.02 ) + { + from.SendLocalizedMessage( 1074487 ); // The creatures are too quick for you! + } + else + { + BaseFish fish = GiveFish( from ); + FishBowl bowl = Aquarium.GetEmptyBowl( from ); + + if ( bowl != null ) + { + fish.StopTimer(); + bowl.AddItem( fish ); + from.SendLocalizedMessage( 1074489 ); // A live creature jumps into the fish bowl in your pack! + Delete(); + return; + } + else + { + if ( from.PlaceInBackpack( fish ) ) + { + from.PlaySound( 0x5A2 ); + from.SendLocalizedMessage( 1074490 ); // A live creature flops around in your pack before running out of air. + + fish.Kill(); + Delete(); + return; + } + else + { + fish.Delete(); + + from.SendLocalizedMessage( 1074488 ); // You could not hold the creature. + } + } + } + + InUse = false; + Movable = true; + + if ( !from.PlaceInBackpack( this ) ) + { + if ( from.Map == null || from.Map == Map.Internal ) + Delete(); + else + MoveToWorld( from.Location, from.Map ); + } + } + + private BaseFish GiveFish( Mobile from ) + { + double skill = from.Skills.Fishing.Value; + + if ( ( skill / 100.0 ) >= Utility.RandomDouble() ) + { + int max = (int) skill / 5; + + if ( max > 20 ) + max = 20; + + switch ( Utility.Random( max ) ) + { + case 0: return new MinocBlueFish(); + case 1: return new Shrimp(); + case 2: return new FandancerFish(); + case 3: return new GoldenBroadtail(); + case 4: return new RedDartFish(); + case 5: return new AlbinoCourtesanFish(); + case 6: return new MakotoCourtesanFish(); + case 7: return new NujelmHoneyFish(); + case 8: return new Jellyfish(); + case 9: return new SpeckledCrab(); + case 10: return new LongClawCrab(); + case 11: return new AlbinoFrog(); + case 12: return new KillerFrog(); + case 13: return new VesperReefTiger(); + case 14: return new PurpleFrog(); + case 15: return new BritainCrownFish(); + case 16: return new YellowFinBluebelly(); + case 17: return new SpottedBuccaneer(); + case 18: return new SpinedScratcherFish(); + default: return new SmallMouthSuckerFin(); + } + } + + return new MinocBlueFish(); + } + + public AquariumFishNet( Serial serial ) : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } + + // Legacy code + public class AquariumFishingNet : Item + { + public override int LabelNumber{ get{ return 1074463; } } // An aquarium fishing net + + public AquariumFishingNet() { - Weight = 1.0; - - Hue = ( 0.01 > Utility.RandomDouble() ) ? Utility.RandomList( m_Hues ) : 0x240; } public AquariumFishingNet( Serial serial ) : base( serial ) - { + { } - + + private Item CreateReplacement() + { + Item result = new AquariumFishNet(); + result.Hue = Hue; + result.LootType = LootType; + result.Movable = Movable; + result.Name = Name; + result.QuestItem = QuestItem; + result.Visible = Visible; + + return result; + } + public override void OnDoubleClick( Mobile from ) { if ( !IsChildOf( from.Backpack ) ) { from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it. return; - } - - from.SendLocalizedMessage( 1010484 ); // Where do you wish to use the net? - from.BeginTarget( -1, true, TargetFlags.None, new TargetCallback( OnTarget ) ); - } - - public void OnTarget( Mobile from, object obj ) - { - m_Player = from; - - if ( Deleted ) - return; - - IPoint3D p3D = obj as IPoint3D; - - if ( p3D == null ) - return; - - Map map = from.Map; - - if ( map == null || map == Map.Internal ) - return; - - int x = p3D.X, y = p3D.Y; - - if ( !from.InRange( p3D, 6 ) ) - { - from.SendLocalizedMessage( 500976 ); // You need to be closer to the water to fish! } - else if ( FullValidation( map, x, y ) ) + + Item replacement = CreateReplacement(); + + if ( !from.PlaceInBackpack( replacement ) ) { - Point3D p = new Point3D( x, y, map.GetAverageZ( x, y ) ); - - Movable = false; - MoveToWorld( p, map ); - - from.Animate( 12, 5, 1, true, false, 0 ); - - Timer.DelayCall( TimeSpan.FromSeconds( 1.5 ), TimeSpan.FromSeconds( 1.0 ), 20, new TimerStateCallback( DoEffect ), new object[]{ p, 0 } ); - - from.SendLocalizedMessage( 1010487 ); // You plunge the net into the sea... + replacement.Delete(); + from.SendLocalizedMessage( 500720 ); // You don't have enough room in your backpack! } else { - from.SendLocalizedMessage( 1010485 ); // You can only use this net in deep water! - } - } - - public static bool FullValidation( Map map, int x, int y ) - { - bool valid = ValidateDeepWater( map, x, y ); - - for ( int j = 1, offset = 5; valid && j <= 5; ++j, offset += 5 ) - { - if ( !ValidateDeepWater( map, x + offset, y + offset ) ) - valid = false; - else if ( !ValidateDeepWater( map, x + offset, y - offset ) ) - valid = false; - else if ( !ValidateDeepWater( map, x - offset, y + offset ) ) - valid = false; - else if ( !ValidateDeepWater( map, x - offset, y - offset ) ) - valid = false; - } - - return valid; - } - - private static bool ValidateDeepWater( Map map, int x, int y ) - { - int tileID = map.Tiles.GetLandTile( x, y ).ID; - bool water = false; - - for ( int i = 0; !water && i < m_WaterTiles.Length; i += 2 ) - water = ( tileID >= m_WaterTiles[i] && tileID <= m_WaterTiles[i + 1] ); - - return water; - } - - private void DoEffect( object state ) - { - if ( Deleted ) - return; - - object[] states = (object[])state; - - Point3D p = (Point3D)states[0]; - int index = (int)states[1]; - - states[1] = ++index; - - if ( index == 1 ) - { - Effects.SendLocationEffect( p, Map, 0x352D, 16, 4 ); - Effects.PlaySound( p, Map, 0x364 ); - } - else if ( index <= 10 || index == 20 ) - { - for ( int i = 0; i < 3; ++i ) - { - int x, y; - - switch ( Utility.Random( 8 ) ) - { - default: - case 0: x = -1; y = -1; break; - case 1: x = -1; y = 0; break; - case 2: x = -1; y = +1; break; - case 3: x = 0; y = -1; break; - case 4: x = 0; y = +1; break; - case 5: x = +1; y = -1; break; - case 6: x = +1; y = 0; break; - case 7: x = +1; y = +1; break; - } - - Effects.SendLocationEffect( new Point3D( p.X + x, p.Y + y, p.Z ), Map, 0x352D, 16, 4 ); - } - - Effects.PlaySound( p, Map, 0x364 ); - - if ( index == 20 ) - FinishEffect( p ); - else - this.Z -= 1; - } - } - - private void FinishEffect( Point3D p ) - { - BaseFish fish = GiveFish( m_Player.Skills.Fishing.Base / 100 ); - - if ( fish != null ) - { - Item[] items = m_Player.Backpack.FindItemsByType( typeof( FishBowl ) ); - - foreach ( FishBowl bowl in items ) - { - if ( !bowl.Deleted && bowl.Empty ) - { - fish.StopTimer(); - bowl.AddItem( fish ); - bowl.InvalidateProperties(); - m_Player.SendLocalizedMessage( 1074489 ); // A live creature jumps into the fish bowl in your pack! - Delete(); - return; - } - } - - if ( !m_Player.PlaceInBackpack( fish ) ) - { - m_Player.SendLocalizedMessage( 500720 ); // You don't have enough room in your backpack! - fish.MoveToWorld( m_Player.Location, m_Player.Map ); - } - else - m_Player.SendLocalizedMessage( 1074490 ); // A live creature flops around in your pack before running out of air. - - fish.Kill(); Delete(); + from.Use( replacement ); } - else - { - Movable = true; - - if ( !m_Player.PlaceInBackpack( this ) ) - MoveToWorld( m_Player.Location, m_Player.Map ); - - m_Player.SendLocalizedMessage( 1074487 ); // The creatures are too quick for you! - } - } - - public BaseFish GiveFish( double skill ) - { - if ( 0.004 * skill > Utility.RandomDouble() ) return new Shrimp(); - if ( 0.008 * skill > Utility.RandomDouble() ) return new SmallMouthSuckerFin(); - if ( 0.008 * skill > Utility.RandomDouble() ) return new SpinedScratcherFish(); - if ( 0.022 * skill > Utility.RandomDouble() ) return new SpottedBuccaneer(); - if ( 0.022 * skill > Utility.RandomDouble() ) return new YellowFinBluebelly(); - if ( 0.030 * skill > Utility.RandomDouble() ) return new BritainCrownFish(); - if ( 0.030 * skill > Utility.RandomDouble() ) return new PurpleFrog(); - if ( 0.032 * skill > Utility.RandomDouble() ) return new VesperReefTiger(); - if ( 0.038 * skill > Utility.RandomDouble() ) return new KillerFrog(); - if ( 0.040 * skill > Utility.RandomDouble() ) return new AlbinoFrog(); - if ( 0.046 * skill > Utility.RandomDouble() ) return new LongClawCrab(); - if ( 0.052 * skill > Utility.RandomDouble() ) return new SpeckledCrab(); - if ( 0.058 * skill > Utility.RandomDouble() ) return new Jellyfish(); - if ( 0.062 * skill > Utility.RandomDouble() ) return new NujelmHoneyFish(); - if ( 0.064 * skill > Utility.RandomDouble() ) return new MakotoCourtesanFish(); - if ( 0.076 * skill > Utility.RandomDouble() ) return new AlbinoCourtesanFish(); - if ( 0.082 * skill > Utility.RandomDouble() ) return new RedDartFish(); - if ( 0.088 * skill > Utility.RandomDouble() ) return new MinocBlueFish(); - if ( 0.090 * skill > Utility.RandomDouble() ) return new GoldenBroadtail(); - if ( 0.148 * skill > Utility.RandomDouble() ) return new FandancerFish(); - - return null; } public override void Serialize( GenericWriter writer ) diff --git a/Scripts/Items/Aquarium/AquariumGump.cs b/Scripts/Items/Aquarium/AquariumGump.cs index 224db55df..68e6686a8 100644 --- a/Scripts/Items/Aquarium/AquariumGump.cs +++ b/Scripts/Items/Aquarium/AquariumGump.cs @@ -2,107 +2,91 @@ using System; using System.Collections; using Server.Gumps; using Server.Items; +using Server.Network; namespace Server.Items { public class AquariumGump : Gump - { + { private Aquarium m_Aquarium; - private bool m_Edit; - + public AquariumGump( Aquarium aquarium, bool edit ) : base( 100, 100 ) { m_Aquarium = aquarium; - m_Edit = edit; - + Closable = true; Disposable = true; Dragable = true; Resizable = false; - + AddPage( 0 ); AddBackground( 0, 0, 350, 323, 0xE10 ); AddImage( 0, 0, 0x2C96 ); - + if ( m_Aquarium.Items.Count == 0 ) return; - + for ( int i = 1; i <= m_Aquarium.Items.Count; i ++ ) - DisplayPage( i ); + DisplayPage( i, edit ); } - - public virtual void DisplayPage( int page ) + + public virtual void DisplayPage( int page, bool edit ) { - AddPage( page ); - - Item item = m_Aquarium.Items[ page - 1 ]; - + AddPage( page ); + + Item item = m_Aquarium.Items[ page - 1 ]; + // item name if ( item.LabelNumber != 0 ) - AddHtmlLocalized( 20, 217, 250, 20, item.LabelNumber, 0xFFFFFF, false, false ); // Name - - // item details + AddHtmlLocalized( 20, 217, 250, 20, item.LabelNumber, 0xFFFFFF, false, false ); // Name + + // item details if ( item is BaseFish ) - { - BaseFish fish = (BaseFish) item; - - if ( !fish.Dead && fish.ItemID > 0x3B0F ) - AddHtmlLocalized( 20, 239, 315, 20, 1074422, 0xFFFFFF, false, false ); // A very unusual live aquarium creature - else if ( !fish.Dead && fish.Hue > 0 ) - AddHtmlLocalized( 20, 239, 315, 20, 1074423, 0xFFFFFF, false, false ); // A live aquarium creature of unusual color - else if ( !fish.Dead ) - AddHtmlLocalized( 20, 239, 315, 20, 1073622, 0xFFFFFF, false, false ); // A live aquarium creature - else if ( fish.Dead && fish.ItemID > 0x3B0F ) - AddHtmlLocalized( 20, 239, 315, 20, 1074424, 0xFFFFFF, false, false ); // A very unusual dead aquarium creature - else if ( fish.Dead && fish.Hue > 0 ) - AddHtmlLocalized( 20, 239, 315, 20, 1074425, 0xFFFFFF, false, false ); // A dead aquarium creature of unusual color - else if ( fish.Dead ) - AddHtmlLocalized( 20, 239, 315, 20, 1073623, 0xFFFFFF, false, false ); // A dead aquarium creature - } + AddHtmlLocalized( 20, 239, 315, 20, ( (BaseFish) item ).GetDescription(), 0xFFFFFF, false, false ); else - { AddHtmlLocalized( 20, 239, 315, 20, 1073634, 0xFFFFFF, false, false ); // An aquarium decoration - } - + // item image - AddItem( 150, 80, item.ItemID, item.Hue ); - + AddItem( 150, 80, item.ItemID, item.Hue ); + // item number / all items - AddHtml( 20, 195, 250, 20, String.Format( "{1}", 0xFFFFFF, page + "/" + ( m_Aquarium.Items.Count ) ), false, false ); - + AddHtml( 20, 195, 250, 20, String.Format( "{0}/{1}", page, m_Aquarium.Items.Count ), false, false ); + // remove item - if ( m_Edit ) + if ( edit ) { AddBackground( 230, 195, 100, 26, 0x13BE ); AddButton( 235, 200, 0x845, 0x846, page, GumpButtonType.Reply, 0 ); AddHtmlLocalized( 260, 198, 60, 26, 1073838, 0x0, false, false ); // Remove } - + // next page if ( page < m_Aquarium.Items.Count ) { AddButton( 195, 280, 0xFA5, 0xFA7, 0, GumpButtonType.Page, page + 1 ); - AddHtmlLocalized( 230, 283, 100, 18, 1044045, 0xFFFFFF, false, false ); // NEXT PAGE + AddHtmlLocalized( 230, 283, 100, 18, 1044045, 0xFFFFFF, false, false ); // NEXT PAGE } - + // previous page if ( page > 1 ) { AddButton( 45, 280, 0xFAE, 0xFAF, 0, GumpButtonType.Page, page - 1 ); - AddHtmlLocalized( 80, 283, 100, 18, 1044044, 0xFFFFFF, false, false ); // PREV PAGE + AddHtmlLocalized( 80, 283, 100, 18, 1044044, 0xFFFFFF, false, false ); // PREV PAGE } } - - public override void OnResponse( Server.Network.NetState sender, RelayInfo info ) + + public override void OnResponse( NetState sender, RelayInfo info ) { if ( m_Aquarium == null || m_Aquarium.Deleted ) return; - - if ( info.ButtonID > 0 && info.ButtonID <= m_Aquarium.Items.Count && m_Edit ) + + bool edit = m_Aquarium.HasAccess( sender.Mobile ); + + if ( info.ButtonID > 0 && info.ButtonID <= m_Aquarium.Items.Count && edit ) m_Aquarium.RemoveItem( sender.Mobile, info.ButtonID - 1 ); - + if ( info.ButtonID > 0 ) - sender.Mobile.SendGump( new AquariumGump( m_Aquarium, m_Edit ) ); - } + sender.Mobile.SendGump( new AquariumGump( m_Aquarium, edit ) ); + } } } diff --git a/Scripts/Items/Aquarium/AquariumState.cs b/Scripts/Items/Aquarium/AquariumState.cs index 6a61217b0..17bc6aaaf 100644 --- a/Scripts/Items/Aquarium/AquariumState.cs +++ b/Scripts/Items/Aquarium/AquariumState.cs @@ -2,25 +2,25 @@ using System; using Server; namespace Server.Items -{ +{ public enum WaterState { Dead, Dying, Unhealthy, Healthy, - Strong, + Strong } - + public enum FoodState { Dead, Starving, Hungry, Full, - Overfed, + Overfed } - + [PropertyObject] public class AquariumState { @@ -28,58 +28,67 @@ namespace Server.Items private int m_Maintain; private int m_Improve; private int m_Added; - + [CommandProperty( AccessLevel.GameMaster )] public int State { get{ return m_State; } - set{ m_State = value; } + set + { + m_State = value; + + if ( m_State < 0 ) + m_State = 0; + + if ( m_State > 4 ) + m_State = 4; + } } - + [CommandProperty( AccessLevel.GameMaster )] public int Maintain { get{ return m_Maintain; } set{ m_Maintain = value; } } - + [CommandProperty( AccessLevel.GameMaster )] public int Improve { get{ return m_Improve; } set{ m_Improve = value; } } - + [CommandProperty( AccessLevel.GameMaster )] public int Added { get{ return m_Added; } set{ m_Added = value; } } - + public AquariumState() { } - + public override string ToString() { return "..."; } - + public virtual void Serialize( GenericWriter writer ) { writer.Write( 0 ); // version - + writer.Write( m_State ); writer.Write( m_Maintain ); writer.Write( m_Improve ); writer.Write( m_Added ); } - + public virtual void Deserialize( GenericReader reader ) { int version = reader.ReadInt(); - + m_State = reader.ReadInt(); m_Maintain = reader.ReadInt(); m_Improve = reader.ReadInt(); diff --git a/Scripts/Items/Aquarium/BaseFish.cs b/Scripts/Items/Aquarium/BaseFish.cs index b575c6ef4..bae0f909d 100644 --- a/Scripts/Items/Aquarium/BaseFish.cs +++ b/Scripts/Items/Aquarium/BaseFish.cs @@ -3,17 +3,19 @@ using Server; using Server.Items; namespace Server.Items -{ +{ public class BaseFish : Item { - private Timer m_Timer; - + private static readonly TimeSpan DeathDelay = TimeSpan.FromMinutes( 5 ); + + private Timer m_Timer; + [CommandProperty( AccessLevel.GameMaster )] public bool Dead { - get{ return ItemID == 0x3B0C; } + get{ return ( ItemID == 0x3B0C ); } } - + [Constructable] public BaseFish( int itemID ) : base( itemID ) { @@ -21,65 +23,59 @@ namespace Server.Items } public BaseFish( Serial serial ) : base( serial ) - { + { } - + public virtual void StartTimer() { if ( m_Timer != null ) m_Timer.Stop(); - - m_Timer = Timer.DelayCall( TimeSpan.FromMinutes( 5 ), new TimerCallback( Kill ) ); + + m_Timer = Timer.DelayCall( DeathDelay, new TimerCallback( Kill ) ); + + InvalidateProperties(); } - + public virtual void StopTimer() { if ( m_Timer != null ) m_Timer.Stop(); - + m_Timer = null; + + InvalidateProperties(); } - + + public override void OnDelete() + { + StopTimer(); + } + public virtual void Kill() { ItemID = 0x3B0C; StopTimer(); - + InvalidateProperties(); } - - public override bool DropToItem( Mobile from, Item target, Point3D p ) - { - if ( target is FishBowl || target is Aquarium ) - { - if ( base.DropToItem( from, target, p ) ) - { - StopTimer(); - - return true; - } - } - - return base.DropToItem( from, target, p ); + + public int GetDescription() + { + // TODO: This will never return "very unusual dead aquarium creature" due to the way it is killed + if ( ItemID > 0x3B0F ) + return Dead ? 1074424 : 1074422; // A very unusual [dead/live] aquarium creature + else if ( Hue != 0 ) + return Dead ? 1074425 : 1074423; // A [dead/live] aquarium creature of unusual color + + return Dead ? 1073623 : 1073622; // A [dead/live] aquarium creature } - + public override void GetProperties( ObjectPropertyList list ) { base.GetProperties( list ); - - if ( !Dead && ItemID > 0x3B0F ) - list.Add( 1074422 ); // A very unusual live aquarium creature - else if ( !Dead && Hue > 0 ) - list.Add( 1074423 ); // A live aquarium creature of unusual color - else if ( !Dead ) - list.Add( 1073622 ); // A live aquarium creature - else if ( Dead && ItemID > 0x3B0F ) - list.Add( 1074424 ); // A very unusual dead aquarium creature - else if ( Dead && Hue > 0 ) - list.Add( 1074425 ); // A dead aquarium creature of unusual color - else if ( Dead ) - list.Add( 1073623 ); // A dead aquarium creature - + + list.Add( GetDescription() ); + if ( !Dead && m_Timer != null ) list.Add( 1074507 ); // Gasping for air } @@ -96,7 +92,7 @@ namespace Server.Items base.Deserialize( reader ); int version = reader.ReadInt(); - + if ( !( Parent is Aquarium ) && !( Parent is FishBowl ) ) StartTimer(); } diff --git a/Scripts/Items/Aquarium/FishBowl.cs b/Scripts/Items/Aquarium/FishBowl.cs index c3249a1c7..81ee40b3e 100644 --- a/Scripts/Items/Aquarium/FishBowl.cs +++ b/Scripts/Items/Aquarium/FishBowl.cs @@ -6,77 +6,91 @@ using Server.ContextMenus; namespace Server.Items { - public class FishBowl : Container - { + public class FishBowl : BaseContainer + { public override int LabelNumber{ get{ return 1074499; } } // A fish bowl - + + [CommandProperty( AccessLevel.GameMaster )] public bool Empty { - get{ return Items.Count == 0; } + get{ return ( Items.Count == 0 ); } } - + + [CommandProperty( AccessLevel.GameMaster )] public BaseFish Fish { get { if ( Empty ) return null; - + if ( Items[ 0 ] is BaseFish ) return (BaseFish) Items[ 0 ]; - + return null; } } - + + public override double DefaultWeight { get { return 2.0; } } + [Constructable] public FishBowl() : base( 0x241C ) { - Hue = 0x47E; + Hue = 0x47E; MaxItems = 1; - Weight = 1; } public FishBowl( Serial serial ) : base( serial ) - { + { } - + public override void OnDoubleClick( Mobile from ) - { + { } - + public override bool OnDragDrop( Mobile from, Item dropped ) { - if ( dropped is BaseFish && Empty ) + if ( !IsAccessibleTo( from ) ) { - ((BaseFish) dropped).StopTimer(); - InvalidateProperties(); - - return base.OnDragDrop( from, dropped ); + from.SendLocalizedMessage( 502436 ); // That is not accessible. + return false; } - else + + if ( !( dropped is BaseFish ) ) { from.SendLocalizedMessage( 1074836 ); // The container can not hold that type of object. return false; } + + if ( base.OnDragDrop( from, dropped ) ) + { + ((BaseFish) dropped).StopTimer(); + InvalidateProperties(); + + return true; + } + + return false; } - - public override void GetProperties( ObjectPropertyList list ) + + public override void AddNameProperties( ObjectPropertyList list ) { - list.Add( 1074499 ); // A fish bowl - list.Add( 1072788, Weight.ToString() ); // Weight: ~1_WEIGHT~ stone - + base.AddNameProperties( list ); + if ( !Empty ) - list.Add( 1074494, "#" + Fish.LabelNumber ); // Contains: ~1_CREATURE~ - - list.Add( 1073841, "{0}\t{1}\t{2}", Items.Count, MaxItems, GetTotal( TotalType.Weight ) ); // Contents: ~1_COUNT~/~2_MAXCOUNT~ items, ~3_WEIGHT~ stones + { + BaseFish fish = Fish; + + if ( fish != null ) + list.Add( 1074494, "#{0}", fish.LabelNumber ); // Contains: ~1_CREATURE~ + } } - + public override void GetContextMenuEntries( Mobile from, List list ) { base.GetContextMenuEntries( from, list ); - - if ( !Empty ) + + if ( !Empty && IsAccessibleTo( from ) ) list.Add( new RemoveCreature( this ) ); } @@ -84,7 +98,7 @@ namespace Server.Items { base.Serialize( writer ); - writer.Write( (int) 0 ); // version + writer.Write( (int) 1 ); // version } public override void Deserialize( GenericReader reader ) @@ -92,33 +106,42 @@ namespace Server.Items base.Deserialize( reader ); int version = reader.ReadInt(); + + if ( version == 0 ) + Weight = DefaultWeight; } - + private class RemoveCreature : ContextMenuEntry { private FishBowl m_Bowl; - - public RemoveCreature( FishBowl bowl ) : base( 6242, 0 ) // Remove creature + + public RemoveCreature( FishBowl bowl ) : base( 6242, 3 ) // Remove creature { m_Bowl = bowl; } - + public override void OnClick() { - if ( m_Bowl == null || m_Bowl.Deleted ) + if ( m_Bowl == null || m_Bowl.Deleted || !m_Bowl.IsAccessibleTo( Owner.From ) ) return; - + BaseFish fish = m_Bowl.Fish; - + if ( fish != null ) { - if ( !Owner.From.PlaceInBackpack( fish ) ) + if ( fish.IsLockedDown ) + { + Owner.From.SendLocalizedMessage( 1010449 ); // You may not use this object while it is locked down. + } + else if ( !Owner.From.PlaceInBackpack( fish ) ) + { Owner.From.SendLocalizedMessage( 1074496 ); // There is no room in your pack for the creature. + } else { - Owner.From.SendLocalizedMessage( 1074495 ); // The creature has been removed from the fish bowl. + Owner.From.SendLocalizedMessage( 1074495 ); // The creature has been removed from the fish bowl. fish.StartTimer(); - m_Bowl.InvalidateProperties(); + m_Bowl.InvalidateProperties(); } } } diff --git a/Scripts/Items/Aquarium/Rewards/AquariumMessage.cs b/Scripts/Items/Aquarium/Rewards/AquariumMessage.cs index 174a08bfc..8cbd99125 100644 --- a/Scripts/Items/Aquarium/Rewards/AquariumMessage.cs +++ b/Scripts/Items/Aquarium/Rewards/AquariumMessage.cs @@ -5,22 +5,22 @@ using Server.Items; namespace Server.Items { public class AquariumMessage : MessageInABottle - { + { public override int LabelNumber{ get{ return 1073894; } } // Message in a Bottle - + [Constructable] public AquariumMessage() : base() { } public AquariumMessage( Serial serial ) : base( serial ) - { - } - - public override void GetProperties( ObjectPropertyList list ) { - base.GetProperties( list ); - + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + list.Add( 1073634 ); // An aquarium decoration } diff --git a/Scripts/Items/Aquarium/Rewards/CaptainBlackheartsFishingPole.cs b/Scripts/Items/Aquarium/Rewards/CaptainBlackheartsFishingPole.cs index 941f47f70..15736b7b4 100644 --- a/Scripts/Items/Aquarium/Rewards/CaptainBlackheartsFishingPole.cs +++ b/Scripts/Items/Aquarium/Rewards/CaptainBlackheartsFishingPole.cs @@ -5,22 +5,22 @@ using Server.Items; namespace Server.Items { public class CaptainBlackheartsFishingPole : FishingPole - { + { public override int LabelNumber{ get{ return 1074571; } } // Captain Blackheart's Fishing Pole - + [Constructable] public CaptainBlackheartsFishingPole() : base() { } public CaptainBlackheartsFishingPole( Serial serial ) : base( serial ) - { - } - - public override void GetProperties( ObjectPropertyList list ) { - base.GetProperties( list ); - + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + list.Add( 1073634 ); // An aquarium decoration } diff --git a/Scripts/Items/Aquarium/Rewards/CraftysFishingHat.cs b/Scripts/Items/Aquarium/Rewards/CraftysFishingHat.cs index e8390bc84..6dd76333f 100644 --- a/Scripts/Items/Aquarium/Rewards/CraftysFishingHat.cs +++ b/Scripts/Items/Aquarium/Rewards/CraftysFishingHat.cs @@ -5,22 +5,31 @@ using Server.Items; namespace Server.Items { public class CraftysFishingHat : BaseHat - { + { public override int LabelNumber{ get{ return 1074572; } } // Crafty's Fishing Hat - + + public override int BasePhysicalResistance{ get{ return 0; } } + public override int BaseFireResistance{ get{ return 5; } } + public override int BaseColdResistance{ get{ return 9; } } + public override int BasePoisonResistance{ get{ return 5; } } + public override int BaseEnergyResistance{ get{ return 5; } } + + public override int InitMinHits{ get{ return 20; } } + public override int InitMaxHits{ get{ return 30; } } + [Constructable] public CraftysFishingHat() : base( 0x1713 ) { } public CraftysFishingHat( Serial serial ) : base( serial ) - { - } - - public override void GetProperties( ObjectPropertyList list ) { - base.GetProperties( list ); - + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + list.Add( 1073634 ); // An aquarium decoration } diff --git a/Scripts/Items/Aquarium/Rewards/FishBones.cs b/Scripts/Items/Aquarium/Rewards/FishBones.cs index ed9aafd5d..37ce1dadf 100644 --- a/Scripts/Items/Aquarium/Rewards/FishBones.cs +++ b/Scripts/Items/Aquarium/Rewards/FishBones.cs @@ -4,23 +4,23 @@ using Server; namespace Server.Items { public class FishBones : Item - { + { public override int LabelNumber{ get{ return 1074601; } } // Fish bones - + public override double DefaultWeight{ get{ return 1.0; } } + [Constructable] public FishBones() : base( 0x3B0C ) { - Weight = 1; } public FishBones( Serial serial ) : base( serial ) - { - } - - public override void GetProperties( ObjectPropertyList list ) { - base.GetProperties( list ); - + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + list.Add( 1073634 ); // An aquarium decoration } diff --git a/Scripts/Items/Aquarium/Rewards/IslandStatue.cs b/Scripts/Items/Aquarium/Rewards/IslandStatue.cs index 35d8a3ef9..5cca7b399 100644 --- a/Scripts/Items/Aquarium/Rewards/IslandStatue.cs +++ b/Scripts/Items/Aquarium/Rewards/IslandStatue.cs @@ -7,20 +7,20 @@ namespace Server.Items public class IslandStatue : Item { public override int LabelNumber{ get{ return 1074600; } } // An island statue + public override double DefaultWeight{ get{ return 1.0; } } [Constructable] public IslandStatue() : base( 0x3B0F ) { - Weight = 1; } public IslandStatue( Serial serial ) : base( serial ) { } - public override void GetProperties( ObjectPropertyList list ) + public override void AddNameProperties( ObjectPropertyList list ) { - base.GetProperties( list ); + base.AddNameProperties( list ); list.Add( 1073634 ); // An aquarium decoration } diff --git a/Scripts/Items/Aquarium/Rewards/Shell.cs b/Scripts/Items/Aquarium/Rewards/Shell.cs index f1282d32e..c46d177c0 100644 --- a/Scripts/Items/Aquarium/Rewards/Shell.cs +++ b/Scripts/Items/Aquarium/Rewards/Shell.cs @@ -5,23 +5,23 @@ using Server.Items; namespace Server.Items { public class Shell : Item - { + { public override int LabelNumber{ get{ return 1074598; } } // A shell - + public override double DefaultWeight{ get{ return 1.0; } } + [Constructable] public Shell() : base( Utility.RandomList( 0x3B12, 0x3B13 ) ) { - Weight = 1; } public Shell( Serial serial ) : base( serial ) - { - } - - public override void GetProperties( ObjectPropertyList list ) { - base.GetProperties( list ); - + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + list.Add( 1073634 ); // An aquarium decoration } diff --git a/Scripts/Items/Aquarium/Rewards/ToyBoat.cs b/Scripts/Items/Aquarium/Rewards/ToyBoat.cs index 53e003825..0206e5ed8 100644 --- a/Scripts/Items/Aquarium/Rewards/ToyBoat.cs +++ b/Scripts/Items/Aquarium/Rewards/ToyBoat.cs @@ -6,23 +6,23 @@ namespace Server.Items { [FlipableAttribute( 0x14F3, 0x14F4 )] public class ToyBoat : Item - { + { public override int LabelNumber{ get{ return 1074363; } } // A toy boat - + public override double DefaultWeight{ get{ return 1.0; } } + [Constructable] - public ToyBoat() : base( 0x14F3 ) + public ToyBoat() : base( 0x14F4 ) { - Weight = 1; } public ToyBoat( Serial serial ) : base( serial ) - { - } - - public override void GetProperties( ObjectPropertyList list ) { - base.GetProperties( list ); - + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + list.Add( 1073634 ); // An aquarium decoration } diff --git a/Scripts/Items/Aquarium/Rewards/WaterloggedBoots.cs b/Scripts/Items/Aquarium/Rewards/WaterloggedBoots.cs index 1bd26523d..fd37b568c 100644 --- a/Scripts/Items/Aquarium/Rewards/WaterloggedBoots.cs +++ b/Scripts/Items/Aquarium/Rewards/WaterloggedBoots.cs @@ -4,14 +4,14 @@ using Server; namespace Server.Items { public class WaterloggedBoots : BaseShoes - { + { public override int LabelNumber{ get{ return 1074364; } } // Waterlogged boots - + [Constructable] public WaterloggedBoots() : base( 0x1711 ) { if ( Utility.RandomBool() ) - { + { // thigh boots ItemID = 0x1711; Weight = 4.0; @@ -25,13 +25,13 @@ namespace Server.Items } public WaterloggedBoots( Serial serial ) : base( serial ) - { - } - - public override void GetProperties( ObjectPropertyList list ) { - base.GetProperties( list ); - + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + list.Add( 1073634 ); // An aquarium decoration } diff --git a/Scripts/Items/Aquarium/VacationWafer.cs b/Scripts/Items/Aquarium/VacationWafer.cs index 9bf95e9a8..c61eb3463 100644 --- a/Scripts/Items/Aquarium/VacationWafer.cs +++ b/Scripts/Items/Aquarium/VacationWafer.cs @@ -5,24 +5,32 @@ using Server.Mobiles; namespace Server.Items { public class VacationWafer : Item - { + { + public const int VacationDays = 7; + public override int LabelNumber{ get{ return 1074431; } } // An aquarium flake sphere - + [Constructable] - public VacationWafer() : base( 0x971 ) + public VacationWafer() : base( 0x973 ) { } public VacationWafer( Serial serial ) : base( serial ) { - + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + + list.Add( 1074432, VacationDays.ToString() ); // Vacation days: ~1_DAYS~ } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); - writer.Write( (int) 0 ); // version + writer.Write( (int) 1 ); // version } public override void Deserialize( GenericReader reader ) @@ -30,6 +38,9 @@ namespace Server.Items base.Deserialize( reader ); int version = reader.ReadInt(); + + if ( version < 1 && ItemID == 0x971 ) + ItemID = 0x973; } } } diff --git a/Scripts/Items/Skill Items/Fishing/Misc/SpecialFishingNet.cs b/Scripts/Items/Skill Items/Fishing/Misc/SpecialFishingNet.cs index 12416e958..32c5996c2 100644 --- a/Scripts/Items/Skill Items/Fishing/Misc/SpecialFishingNet.cs +++ b/Scripts/Items/Skill Items/Fishing/Misc/SpecialFishingNet.cs @@ -11,6 +11,13 @@ namespace Server.Items private bool m_InUse; + [CommandProperty( AccessLevel.GameMaster )] + public bool InUse + { + get{ return m_InUse; } + set{ m_InUse = value; } + } + [Constructable] public SpecialFishingNet() : base( 0x0DCA ) { @@ -48,6 +55,11 @@ namespace Server.Items { base.GetProperties( list ); + AddNetProperties( list ); + } + + protected virtual void AddNetProperties( ObjectPropertyList list ) + { // as if the name wasn't enough.. list.Add( 1017410 ); // Special Fishing Net } @@ -100,6 +112,9 @@ namespace Server.Items } } + // TODO + //public virtual bool RequireDeepWater{ get{ return true; } } + public void OnTarget( Mobile from, object obj ) { if ( Deleted || m_InUse ) @@ -125,8 +140,11 @@ namespace Server.Items { Point3D p = new Point3D( x, y, map.GetAverageZ( x, y ) ); - for ( int i = 1; i < Amount; ++i ) // these were stackable before, doh - from.AddToBackpack( new SpecialFishingNet() ); + if ( GetType() == typeof( SpecialFishingNet ) ) + { + for ( int i = 1; i < Amount; ++i ) // these were stackable before, doh + from.AddToBackpack( new SpecialFishingNet() ); + } m_InUse = true; Movable = false; @@ -308,6 +326,10 @@ namespace Server.Items Hue = 0x481; } + protected override void AddNetProperties( ObjectPropertyList list ) + { + } + protected override int GetSpawnCount() { return base.GetSpawnCount() + 4; diff --git a/Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs b/Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs index 9fdf219b9..ee586e0d4 100644 --- a/Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs +++ b/Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs @@ -30,7 +30,7 @@ namespace Server.Mobiles Add( new GenericBuyInfo( typeof( FishingPole ), 15, 20, 0xDC0, 0 ) ); #region Mondain's Legacy - Add( new GenericBuyInfo( typeof( AquariumFishingNet ), 250, 20, 0xDC8, 0x240 ) ); + Add( new GenericBuyInfo( typeof( AquariumFishNet ), 250, 20, 0xDC8, 0x240 ) ); Add( new GenericBuyInfo( typeof( AquariumFood ), 62, 20, 0xEFC, 0 ) ); Add( new GenericBuyInfo( typeof( FishBowl ), 6312, 20, 0x241C, 0x482 ) ); Add( new GenericBuyInfo( typeof( VacationWafer ), 67, 20, 0x971, 0 ) );