From cbd45b53b8116d2f56d297c7226059a31a658ab4 Mon Sep 17 00:00:00 2001 From: xavier Date: Sun, 23 Oct 2011 03:38:07 +0000 Subject: [PATCH] added:ML aquariums, ML potions,runebook and spellbook makers mark, two new runic tools, NPC vendor updates --- Scripts/Items/Aquarium/Aquarium.cs | 1035 +++++++++++++++++ Scripts/Items/Aquarium/AquariumFishingNet.cs | 245 ++++ Scripts/Items/Aquarium/AquariumFood.cs | 35 + Scripts/Items/Aquarium/AquariumGump.cs | 108 ++ Scripts/Items/Aquarium/AquariumState.cs | 89 ++ Scripts/Items/Aquarium/BaseFish.cs | 104 ++ .../Aquarium/Fish/AlbinoCourtesanFish.cs | 33 + Scripts/Items/Aquarium/Fish/AlbinoFrog.cs | 34 + .../Items/Aquarium/Fish/BritainCrownFish.cs | 33 + Scripts/Items/Aquarium/Fish/FandancerFish.cs | 33 + .../Items/Aquarium/Fish/GoldenBroadtail.cs | 33 + Scripts/Items/Aquarium/Fish/Jellyfish.cs | 33 + Scripts/Items/Aquarium/Fish/KillerFrog.cs | 33 + Scripts/Items/Aquarium/Fish/LongClawCrab.cs | 34 + .../Aquarium/Fish/MakotoCourtesanFish.cs | 33 + Scripts/Items/Aquarium/Fish/MinocBlueFish.cs | 33 + .../Items/Aquarium/Fish/NujelmHoneyFish.cs | 33 + Scripts/Items/Aquarium/Fish/PurpleFrog.cs | 34 + Scripts/Items/Aquarium/Fish/RedDartFish.cs | 33 + Scripts/Items/Aquarium/Fish/Shrimp.cs | 33 + .../Aquarium/Fish/SmallMouthSuckerFin.cs | 33 + Scripts/Items/Aquarium/Fish/SpeckledCrab.cs | 33 + .../Aquarium/Fish/SpinedScratcherFish.cs | 33 + .../Items/Aquarium/Fish/SpottedBuccaneer.cs | 33 + .../Items/Aquarium/Fish/VesperReefTiger.cs | 33 + .../Items/Aquarium/Fish/YellowFinBluebelly.cs | 33 + Scripts/Items/Aquarium/FishBowl.cs | 127 ++ .../Items/Aquarium/Reward Fish/BrineShrimp.cs | 33 + Scripts/Items/Aquarium/Reward Fish/Coral.cs | 33 + .../Aquarium/Reward Fish/FullMoonFish.cs | 33 + .../Items/Aquarium/Reward Fish/SeaHorse.cs | 33 + .../Aquarium/Reward Fish/StrippedFlakeFish.cs | 33 + .../Reward Fish/StrippedSosarianSwill.cs | 33 + .../Items/Aquarium/Rewards/AquariumMessage.cs | 41 + .../Rewards/CaptainBlackheartsFishingPole.cs | 41 + .../Aquarium/Rewards/CraftysFishingHat.cs | 41 + Scripts/Items/Aquarium/Rewards/FishBones.cs | 41 + .../Items/Aquarium/Rewards/IslandStatue.cs | 42 + Scripts/Items/Aquarium/Rewards/Shell.cs | 42 + Scripts/Items/Aquarium/Rewards/ToyBoat.cs | 43 + .../Aquarium/Rewards/WaterloggedBoots.cs | 52 + Scripts/Items/Aquarium/VacationWafer.cs | 35 + .../Minor Artifacts/ML/BrightsightLenses.cs | 48 + .../Items/Minor Artifacts/ML/WildfireBow.cs | 2 +- Scripts/Items/Minor Artifacts/ML/Windsong.cs | 4 +- .../Carpenter Items/TaxidermyKit.cs | 9 +- .../Skill Items/Magical/Misc/PotionKeg.cs | 22 +- .../Skill Items/Magical/Potions/BasePotion.cs | 15 +- .../BaseConfusionBlastPotion.cs | 2 +- .../Magical/Potions/DarkglowPotion.cs | 39 + .../Magical/Potions/InvisibilityPotion.cs | 111 ++ .../Magical/Potions/ParasiticPotion.cs | 39 + Scripts/Items/Skill Items/Magical/Runebook.cs | 23 +- .../Items/Skill Items/Magical/Spellbook.cs | 52 +- .../Skill Items/Tools/RunicDovetailSaw.cs | 33 +- Scripts/Mobiles/Vendors/GenericSell.cs | 6 + Scripts/Mobiles/Vendors/NPC/AnimalTrainer.cs | 6 + Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs | 9 + Scripts/Mobiles/Vendors/SBInfo/SBHolyMage.cs | 2 +- 59 files changed, 3351 insertions(+), 53 deletions(-) create mode 100644 Scripts/Items/Aquarium/Aquarium.cs create mode 100644 Scripts/Items/Aquarium/AquariumFishingNet.cs create mode 100644 Scripts/Items/Aquarium/AquariumFood.cs create mode 100644 Scripts/Items/Aquarium/AquariumGump.cs create mode 100644 Scripts/Items/Aquarium/AquariumState.cs create mode 100644 Scripts/Items/Aquarium/BaseFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/AlbinoCourtesanFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/AlbinoFrog.cs create mode 100644 Scripts/Items/Aquarium/Fish/BritainCrownFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/FandancerFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/GoldenBroadtail.cs create mode 100644 Scripts/Items/Aquarium/Fish/Jellyfish.cs create mode 100644 Scripts/Items/Aquarium/Fish/KillerFrog.cs create mode 100644 Scripts/Items/Aquarium/Fish/LongClawCrab.cs create mode 100644 Scripts/Items/Aquarium/Fish/MakotoCourtesanFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/MinocBlueFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/NujelmHoneyFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/PurpleFrog.cs create mode 100644 Scripts/Items/Aquarium/Fish/RedDartFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/Shrimp.cs create mode 100644 Scripts/Items/Aquarium/Fish/SmallMouthSuckerFin.cs create mode 100644 Scripts/Items/Aquarium/Fish/SpeckledCrab.cs create mode 100644 Scripts/Items/Aquarium/Fish/SpinedScratcherFish.cs create mode 100644 Scripts/Items/Aquarium/Fish/SpottedBuccaneer.cs create mode 100644 Scripts/Items/Aquarium/Fish/VesperReefTiger.cs create mode 100644 Scripts/Items/Aquarium/Fish/YellowFinBluebelly.cs create mode 100644 Scripts/Items/Aquarium/FishBowl.cs create mode 100644 Scripts/Items/Aquarium/Reward Fish/BrineShrimp.cs create mode 100644 Scripts/Items/Aquarium/Reward Fish/Coral.cs create mode 100644 Scripts/Items/Aquarium/Reward Fish/FullMoonFish.cs create mode 100644 Scripts/Items/Aquarium/Reward Fish/SeaHorse.cs create mode 100644 Scripts/Items/Aquarium/Reward Fish/StrippedFlakeFish.cs create mode 100644 Scripts/Items/Aquarium/Reward Fish/StrippedSosarianSwill.cs create mode 100644 Scripts/Items/Aquarium/Rewards/AquariumMessage.cs create mode 100644 Scripts/Items/Aquarium/Rewards/CaptainBlackheartsFishingPole.cs create mode 100644 Scripts/Items/Aquarium/Rewards/CraftysFishingHat.cs create mode 100644 Scripts/Items/Aquarium/Rewards/FishBones.cs create mode 100644 Scripts/Items/Aquarium/Rewards/IslandStatue.cs create mode 100644 Scripts/Items/Aquarium/Rewards/Shell.cs create mode 100644 Scripts/Items/Aquarium/Rewards/ToyBoat.cs create mode 100644 Scripts/Items/Aquarium/Rewards/WaterloggedBoots.cs create mode 100644 Scripts/Items/Aquarium/VacationWafer.cs create mode 100644 Scripts/Items/Minor Artifacts/ML/BrightsightLenses.cs create mode 100644 Scripts/Items/Skill Items/Magical/Potions/DarkglowPotion.cs create mode 100644 Scripts/Items/Skill Items/Magical/Potions/InvisibilityPotion.cs create mode 100644 Scripts/Items/Skill Items/Magical/Potions/ParasiticPotion.cs diff --git a/Scripts/Items/Aquarium/Aquarium.cs b/Scripts/Items/Aquarium/Aquarium.cs new file mode 100644 index 000000000..80e0d607c --- /dev/null +++ b/Scripts/Items/Aquarium/Aquarium.cs @@ -0,0 +1,1035 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Server; +using Server.Items; +using Server.Mobiles; +using Server.Multis; +using Server.Gumps; +using Server.ContextMenus; + +namespace Server.Items +{ + public class Aquarium : BaseAddonContainer + { + // 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; + + state += (int) WaterState.Strong - m_Water.State; + + state = (int) Math.Pow( state, 1.75 ); + + return MaxItems - state; + } + } + + [CommandProperty( AccessLevel.GameMaster )] + public bool IsFull + { + 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; } + } + + [CommandProperty( AccessLevel.GameMaster )] + public AquariumState Water + { + get{ return m_Water; } + } + + [CommandProperty( AccessLevel.GameMaster )] + public bool OptimalState + { + 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(); + else + return new AquariumNorthDeed(); + } + } + + public Aquarium( int itemID ) : base( itemID ) + { + 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.Improve = m_Food.Maintain + Utility.RandomMinMax( 1, 2 ); + + m_Water.Maintain = Utility.RandomMinMax( 1, 3 );; + + m_Events = new List(); + + m_Timer = Timer.DelayCall( TimeSpan.FromHours( 24 ), TimeSpan.FromHours( 24 ), new TimerCallback( Evaluate ) ); + } + + public Aquarium( Serial serial ) : base( serial ) + { + } + + public override void OnDoubleClick( Mobile from ) + { + ExamineAquarium( from ); + } + + public override bool OnDragDrop( Mobile from, Item dropped ) + { + BaseHouse house = BaseHouse.FindHouseAt( this ); + + if ( house == null || !house.IsCoOwner( 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; + } + + if ( dropped is FishBowl ) + { + FishBowl bowl = (FishBowl) dropped; + + if ( bowl.Empty ) + return false; + + if ( AddFish( from, bowl.Fish ) ) + bowl.InvalidateProperties(); + + return 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 + } + 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. + } + 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. + return false; + } + else if ( !AddDecoration( from, dropped ) ) + return false; + + InvalidateProperties(); + + from.CloseGump( typeof( AquariumGump ) ); + + return true; + } + + public override void OnChop( Mobile from ) + { + for ( int i = 0; i < Items.Count; i ++ ) + { + Item item = Items[ i ]; + + item.MoveToWorld( Location, 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 + + if ( m_Events.Count > 0 ) + list.Add( 1074426, "{0}", m_Events.Count ); // ~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; + + 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~ + + 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~ + 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~ + 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 ( (int) from.AccessLevel > (int) AccessLevel.Counselor ) + { + list.Add( new GMAddFood( this ) ); + list.Add( new GMAddWater( this ) ); + list.Add( new GMForceEvaluate( this ) ); + list.Add( new GMOpen( this ) ); + list.Add( new GMFill( this ) ); + } + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( 1 ); // 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( (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: + 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: + 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(); + + for ( int i = 0; i < count; i ++ ) + m_Events.Add( reader.ReadInt() ); + + m_RewardAvailable = reader.ReadBool(); + + break; + } + } + + #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 + + #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 ) + ) + 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 ) + ) + 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; + } + else + { + // new fish + if ( OptimalState && m_LiveCreatures < MaxLiveCreatures ) + { + if ( Utility.RandomDouble() < 0.005 * m_LiveCreatures ) + { + BaseFish fish = null; + int message = 0; + + switch ( Utility.Random( 6 ) ) + { + case 0: + message = 1074371; // Brine shrimp have hatched overnight in the tank. + fish = new BrineShrimp(); + break; + case 1: + message = 1074365; // A new creature has hatched overnight in the tank. + fish = new Coral(); + break; + case 2: + message = 1074365; // A new creature has hatched overnight in the tank. + fish = new FullMoonFish(); + break; + case 3: + message = 1074373; // A sea horse has hatched overnight in the tank. + fish = new SeaHorseFish(); + break; + case 4: + message = 1074365; // A new creature has hatched overnight in the tank. + fish = new StrippedFlakeFish(); + break; + 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 ); + } + } + + // kill fish *grins* + if ( m_LiveCreatures < MaxLiveCreatures ) + { + if ( Utility.RandomDouble() < 0.01 ) + KillFish( 1 ); + } + else + KillFish( m_LiveCreatures - MaxLiveCreatures ); + } + + m_EvaluateDay = !m_EvaluateDay; + } + + 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 ) + 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 + { + to.SendLocalizedMessage( 1074360, "#" + 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; + 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.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; + } + + public virtual void UpdateWaterState() + { + if ( m_Water.Added < m_Water.Maintain ) + 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.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.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 + { + if ( !from.PlaceInBackpack( fish ) ) + { + from.SendLocalizedMessage( 1074514 ); // You have no place to put it. + return false; + } + else + from.SendLocalizedMessage( 1074512 ); // You put the gasping creature into your pack. + } + + if ( !fish.Dead ) + m_LiveCreatures -= 1; + } + else + { + if ( !from.PlaceInBackpack( item ) ) + { + from.SendLocalizedMessage( 1074514 ); // You have no place to put it. + 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 ) ) + { + from.Say( 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.PlaySound( 0x5A4 ); + } + + public virtual bool AddFish( Mobile from, BaseFish fish ) + { + if ( fish == null ) + return false; + + if ( ( m_LiveCreatures == MaxLiveCreatures && !IsFull ) || fish.Dead ) + { + 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~ + return true; + } + + 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. + return false; + } + + if ( !Accepts( item ) ) + { + 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~ + + return true; + } + #endregion + + #region Static members + public static FishBowl GetEmptyBowl( Mobile from ) + { + if ( 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( AquariumMessage ), + typeof( IslandStatue ), + typeof( Shell ), + typeof( ToyBoat ) + }; + + public static bool Accepts( Item item ) + { + if ( item == null ) + return false; + + 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 ) + { + 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 ) + { + m_Aquarium = aquarium; + } + + public override void OnClick() + { + if ( m_Aquarium.Deleted ) + return; + + m_Aquarium.GiveReward( Owner.From ); + m_Aquarium.InvalidateProperties(); + } + } + + private class ViewEventEntry : ContextMenuEntry + { + private Aquarium m_Aquarium; + + public ViewEventEntry( Aquarium aquarium ) : base( 6239, 2 ) + { + m_Aquarium = aquarium; + } + + public override void OnClick() + { + if ( m_Aquarium.Deleted ) + 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 ) + { + m_Aquarium = aquarium; + } + + public override void OnClick() + { + if ( m_Aquarium.Deleted ) + 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 ) + { + 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 ) + { + 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 ) + { + m_Aquarium = aquarium; + } + + public override void OnClick() + { + if ( m_Aquarium.Deleted ) + return; + + m_Aquarium.Evaluate(); + m_Aquarium.InvalidateProperties(); + } + } + + private class GMOpen : ContextMenuEntry + { + private Aquarium m_Aquarium; + + public GMOpen( Aquarium aquarium ) : base( 6234, -1 ) + { + 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 ) + { + 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(); + } + } + #endregion + } + + public class AquariumEastDeed : BaseAddonContainerDeed + { + public override BaseAddonContainer Addon{ get{ return new Aquarium( 0x3060 ); } } + public override int LabelNumber{ get{ return 1074501; } } // Large Aquarium (east) + + [Constructable] + public AquariumEastDeed() : base() + { + } + + public AquariumEastDeed( Serial serial ) : base( serial ) + { + } + + 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 int LabelNumber{ get{ return 1074497; } } // Large Aquarium (north) + + [Constructable] + public AquariumNorthDeed() : base() + { + } + + public AquariumNorthDeed( Serial serial ) : base( serial ) + { + } + + 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 new file mode 100644 index 000000000..28f64bc51 --- /dev/null +++ b/Scripts/Items/Aquarium/AquariumFishingNet.cs @@ -0,0 +1,245 @@ +using System; +using Server; +using Server.Mobiles; +using Server.Items; +using Server.Targeting; + +namespace Server.Items +{ + public class AquariumFishingNet : Item + { + 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 ) + { + Weight = 1.0; + + if ( 0.01 > Utility.RandomDouble() ) + Hue = Utility.RandomList( m_Hues ); + } + + public AquariumFishingNet( Serial serial ) : base( serial ) + { + } + + 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 ) ) + { + 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... + } + 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 ) + { + 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(); + } + 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 ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Items/Aquarium/AquariumFood.cs b/Scripts/Items/Aquarium/AquariumFood.cs new file mode 100644 index 000000000..dc8020769 --- /dev/null +++ b/Scripts/Items/Aquarium/AquariumFood.cs @@ -0,0 +1,35 @@ +using System; +using Server; +using Server.Mobiles; + +namespace Server.Items +{ + public class AquariumFood : Item + { + public override int LabelNumber{ get{ return 1074819; } } // Aquarium food + + [Constructable] + public AquariumFood() : base( 0xEFC ) + { + } + + public AquariumFood( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/AquariumGump.cs b/Scripts/Items/Aquarium/AquariumGump.cs new file mode 100644 index 000000000..224db55df --- /dev/null +++ b/Scripts/Items/Aquarium/AquariumGump.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections; +using Server.Gumps; +using Server.Items; + +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 ); + } + + public virtual void DisplayPage( int page ) + { + 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 + 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 + } + else + { + AddHtmlLocalized( 20, 239, 315, 20, 1073634, 0xFFFFFF, false, false ); // An aquarium decoration + } + + // item image + 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 ); + + // remove item + if ( m_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 + } + + // 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 + } + } + + public override void OnResponse( Server.Network.NetState sender, RelayInfo info ) + { + if ( m_Aquarium == null || m_Aquarium.Deleted ) + return; + + if ( info.ButtonID > 0 && info.ButtonID <= m_Aquarium.Items.Count && m_Edit ) + m_Aquarium.RemoveItem( sender.Mobile, info.ButtonID - 1 ); + + if ( info.ButtonID > 0 ) + sender.Mobile.SendGump( new AquariumGump( m_Aquarium, m_Edit ) ); + } + } +} diff --git a/Scripts/Items/Aquarium/AquariumState.cs b/Scripts/Items/Aquarium/AquariumState.cs new file mode 100644 index 000000000..6a61217b0 --- /dev/null +++ b/Scripts/Items/Aquarium/AquariumState.cs @@ -0,0 +1,89 @@ +using System; +using Server; + +namespace Server.Items +{ + public enum WaterState + { + Dead, + Dying, + Unhealthy, + Healthy, + Strong, + } + + public enum FoodState + { + Dead, + Starving, + Hungry, + Full, + Overfed, + } + + [PropertyObject] + public class AquariumState + { + private int m_State; + 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; } + } + + [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(); + m_Added = reader.ReadInt(); + } + } +} diff --git a/Scripts/Items/Aquarium/BaseFish.cs b/Scripts/Items/Aquarium/BaseFish.cs new file mode 100644 index 000000000..b575c6ef4 --- /dev/null +++ b/Scripts/Items/Aquarium/BaseFish.cs @@ -0,0 +1,104 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Items +{ + public class BaseFish : Item + { + private Timer m_Timer; + + [CommandProperty( AccessLevel.GameMaster )] + public bool Dead + { + get{ return ItemID == 0x3B0C; } + } + + [Constructable] + public BaseFish( int itemID ) : base( itemID ) + { + StartTimer(); + } + + 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 ) ); + } + + public virtual void StopTimer() + { + if ( m_Timer != null ) + m_Timer.Stop(); + + m_Timer = null; + } + + 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 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 + + if ( !Dead && m_Timer != null ) + list.Add( 1074507 ); // Gasping for air + } + + 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(); + + if ( !( Parent is Aquarium ) && !( Parent is FishBowl ) ) + StartTimer(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/AlbinoCourtesanFish.cs b/Scripts/Items/Aquarium/Fish/AlbinoCourtesanFish.cs new file mode 100644 index 000000000..cb88b5242 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/AlbinoCourtesanFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class AlbinoCourtesanFish : BaseFish + { + public override int LabelNumber{ get{ return 1074592; } } // Albino Courtesan Fish + + [Constructable] + public AlbinoCourtesanFish() : base( 0x3B04 ) + { + } + + public AlbinoCourtesanFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/AlbinoFrog.cs b/Scripts/Items/Aquarium/Fish/AlbinoFrog.cs new file mode 100644 index 000000000..2f21d0f82 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/AlbinoFrog.cs @@ -0,0 +1,34 @@ +using System; +using Server; + +namespace Server.Items +{ + public class AlbinoFrog : BaseFish + { + public override int LabelNumber{ get{ return 1073824; } } // An Albino Frog + + [Constructable] + public AlbinoFrog() : base( 0x3B0D ) + { + Hue = 0x47E; + } + + public AlbinoFrog( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/BritainCrownFish.cs b/Scripts/Items/Aquarium/Fish/BritainCrownFish.cs new file mode 100644 index 000000000..2519570a2 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/BritainCrownFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class BritainCrownFish : BaseFish + { + public override int LabelNumber{ get{ return 1074589; } } // Britain Crown Fish + + [Constructable] + public BritainCrownFish() : base( 0x3AFF ) + { + } + + public BritainCrownFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/FandancerFish.cs b/Scripts/Items/Aquarium/Fish/FandancerFish.cs new file mode 100644 index 000000000..561171a02 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/FandancerFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class FandancerFish : BaseFish + { + public override int LabelNumber{ get{ return 1074591; } } // Fandancer Fish + + [Constructable] + public FandancerFish() : base( 0x3B02 ) + { + } + + public FandancerFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/GoldenBroadtail.cs b/Scripts/Items/Aquarium/Fish/GoldenBroadtail.cs new file mode 100644 index 000000000..575f39df1 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/GoldenBroadtail.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class GoldenBroadtail : BaseFish + { + public override int LabelNumber{ get{ return 1073828; } } // A Golden Broadtail + + [Constructable] + public GoldenBroadtail() : base( 0x3B03 ) + { + } + + public GoldenBroadtail( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/Jellyfish.cs b/Scripts/Items/Aquarium/Fish/Jellyfish.cs new file mode 100644 index 000000000..7bf6ada1f --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/Jellyfish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class Jellyfish : BaseFish + { + public override int LabelNumber{ get{ return 1074593; } } // Jellyfish + + [Constructable] + public Jellyfish() : base( 0x3B0E ) + { + } + + public Jellyfish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/KillerFrog.cs b/Scripts/Items/Aquarium/Fish/KillerFrog.cs new file mode 100644 index 000000000..8c00daa0a --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/KillerFrog.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class KillerFrog : BaseFish + { + public override int LabelNumber{ get{ return 1073825; } } // A Killer Frog + + [Constructable] + public KillerFrog() : base( 0x3B0D ) + { + } + + public KillerFrog( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/LongClawCrab.cs b/Scripts/Items/Aquarium/Fish/LongClawCrab.cs new file mode 100644 index 000000000..fa66aa59e --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/LongClawCrab.cs @@ -0,0 +1,34 @@ +using System; +using Server; + +namespace Server.Items +{ + public class LongClawCrab : BaseFish + { + public override int LabelNumber{ get{ return 1073827; } } // A Long Claw Crab + + [Constructable] + public LongClawCrab() : base( 0x3AFC ) + { + Hue = 0x527; + } + + public LongClawCrab( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/MakotoCourtesanFish.cs b/Scripts/Items/Aquarium/Fish/MakotoCourtesanFish.cs new file mode 100644 index 000000000..a6602a6df --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/MakotoCourtesanFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class MakotoCourtesanFish : BaseFish + { + public override int LabelNumber{ get{ return 1073835; } } // A Makoto Courtesan Fish + + [Constructable] + public MakotoCourtesanFish() : base( 0x3AFD ) + { + } + + public MakotoCourtesanFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/MinocBlueFish.cs b/Scripts/Items/Aquarium/Fish/MinocBlueFish.cs new file mode 100644 index 000000000..c0aeec711 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/MinocBlueFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class MinocBlueFish : BaseFish + { + public override int LabelNumber{ get{ return 1073829; } } // A Minoc Blue Fish + + [Constructable] + public MinocBlueFish() : base( 0x3AFE ) + { + } + + public MinocBlueFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/NujelmHoneyFish.cs b/Scripts/Items/Aquarium/Fish/NujelmHoneyFish.cs new file mode 100644 index 000000000..379aff281 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/NujelmHoneyFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class NujelmHoneyFish : BaseFish + { + public override int LabelNumber{ get{ return 1073830; } } // A Nujel'm Honey Fish + + [Constructable] + public NujelmHoneyFish() : base( 0x3B06 ) + { + } + + public NujelmHoneyFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/PurpleFrog.cs b/Scripts/Items/Aquarium/Fish/PurpleFrog.cs new file mode 100644 index 000000000..4fbef36e0 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/PurpleFrog.cs @@ -0,0 +1,34 @@ +using System; +using Server; + +namespace Server.Items +{ + public class PurpleFrog : BaseFish + { + public override int LabelNumber{ get{ return 1073823; } } // A Purple Frog + + [Constructable] + public PurpleFrog() : base( 0x3B0D ) + { + Hue = 0x4FA; + } + + public PurpleFrog( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/RedDartFish.cs b/Scripts/Items/Aquarium/Fish/RedDartFish.cs new file mode 100644 index 000000000..0fc6b63da --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/RedDartFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class RedDartFish : BaseFish + { + public override int LabelNumber{ get{ return 1073834; } } // A Red Dart Fish + + [Constructable] + public RedDartFish() : base( 0x3B00 ) + { + } + + public RedDartFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/Shrimp.cs b/Scripts/Items/Aquarium/Fish/Shrimp.cs new file mode 100644 index 000000000..557a03cc5 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/Shrimp.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class Shrimp : BaseFish + { + public override int LabelNumber{ get{ return 1074596; } } // Shrimp + + [Constructable] + public Shrimp() : base( 0x3B14 ) + { + } + + public Shrimp( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/SmallMouthSuckerFin.cs b/Scripts/Items/Aquarium/Fish/SmallMouthSuckerFin.cs new file mode 100644 index 000000000..8a10a883d --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/SmallMouthSuckerFin.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class SmallMouthSuckerFin : BaseFish + { + public override int LabelNumber{ get{ return 1074590; } } // Small Mouth Sucker Fin + + [Constructable] + public SmallMouthSuckerFin() : base( 0x3B01 ) + { + } + + public SmallMouthSuckerFin( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/SpeckledCrab.cs b/Scripts/Items/Aquarium/Fish/SpeckledCrab.cs new file mode 100644 index 000000000..339492751 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/SpeckledCrab.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class SpeckledCrab : BaseFish + { + public override int LabelNumber{ get{ return 1073826; } } // A Speckled Crab + + [Constructable] + public SpeckledCrab() : base( 0x3AFC ) + { + } + + public SpeckledCrab( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/SpinedScratcherFish.cs b/Scripts/Items/Aquarium/Fish/SpinedScratcherFish.cs new file mode 100644 index 000000000..293820ef4 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/SpinedScratcherFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class SpinedScratcherFish : BaseFish + { + public override int LabelNumber{ get{ return 1073832; } } // A Spined Scratcher Fish + + [Constructable] + public SpinedScratcherFish() : base( 0x3B05 ) + { + } + + public SpinedScratcherFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/SpottedBuccaneer.cs b/Scripts/Items/Aquarium/Fish/SpottedBuccaneer.cs new file mode 100644 index 000000000..bbcb7386f --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/SpottedBuccaneer.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class SpottedBuccaneer : BaseFish + { + public override int LabelNumber{ get{ return 1073833; } } // A Spotted Buccaneer + + [Constructable] + public SpottedBuccaneer() : base( 0x3B09 ) + { + } + + public SpottedBuccaneer( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/VesperReefTiger.cs b/Scripts/Items/Aquarium/Fish/VesperReefTiger.cs new file mode 100644 index 000000000..bb3915a83 --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/VesperReefTiger.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class VesperReefTiger : BaseFish + { + public override int LabelNumber{ get{ return 1073836; } } // A Vesper Reef Tiger + + [Constructable] + public VesperReefTiger() : base( 0x3B08 ) + { + } + + public VesperReefTiger( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Fish/YellowFinBluebelly.cs b/Scripts/Items/Aquarium/Fish/YellowFinBluebelly.cs new file mode 100644 index 000000000..7f7d8100f --- /dev/null +++ b/Scripts/Items/Aquarium/Fish/YellowFinBluebelly.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class YellowFinBluebelly : BaseFish + { + public override int LabelNumber{ get{ return 1073831; } } // A Yellow Fin Bluebelly + + [Constructable] + public YellowFinBluebelly() : base( 0x3B07 ) + { + } + + public YellowFinBluebelly( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/FishBowl.cs b/Scripts/Items/Aquarium/FishBowl.cs new file mode 100644 index 000000000..c3249a1c7 --- /dev/null +++ b/Scripts/Items/Aquarium/FishBowl.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using Server; +using Server.Mobiles; +using Server.ContextMenus; + +namespace Server.Items +{ + public class FishBowl : Container + { + public override int LabelNumber{ get{ return 1074499; } } // A fish bowl + + public bool Empty + { + get{ return Items.Count == 0; } + } + + public BaseFish Fish + { + get + { + if ( Empty ) + return null; + + if ( Items[ 0 ] is BaseFish ) + return (BaseFish) Items[ 0 ]; + + return null; + } + } + + [Constructable] + public FishBowl() : base( 0x241C ) + { + 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 ) + { + ((BaseFish) dropped).StopTimer(); + InvalidateProperties(); + + return base.OnDragDrop( from, dropped ); + } + else + { + from.SendLocalizedMessage( 1074836 ); // The container can not hold that type of object. + return false; + } + } + + public override void GetProperties( ObjectPropertyList list ) + { + list.Add( 1074499 ); // A fish bowl + list.Add( 1072788, Weight.ToString() ); // Weight: ~1_WEIGHT~ stone + + 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 + } + + public override void GetContextMenuEntries( Mobile from, List list ) + { + base.GetContextMenuEntries( from, list ); + + if ( !Empty ) + list.Add( new RemoveCreature( this ) ); + } + + 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(); + } + + private class RemoveCreature : ContextMenuEntry + { + private FishBowl m_Bowl; + + public RemoveCreature( FishBowl bowl ) : base( 6242, 0 ) // Remove creature + { + m_Bowl = bowl; + } + + public override void OnClick() + { + if ( m_Bowl == null || m_Bowl.Deleted ) + return; + + BaseFish fish = m_Bowl.Fish; + + if ( fish != null ) + { + 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. + fish.StartTimer(); + m_Bowl.InvalidateProperties(); + } + } + } + } + } +} diff --git a/Scripts/Items/Aquarium/Reward Fish/BrineShrimp.cs b/Scripts/Items/Aquarium/Reward Fish/BrineShrimp.cs new file mode 100644 index 000000000..7567d0889 --- /dev/null +++ b/Scripts/Items/Aquarium/Reward Fish/BrineShrimp.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class BrineShrimp : BaseFish + { + public override int LabelNumber{ get{ return 1074415; } } // Brine shrimp + + [Constructable] + public BrineShrimp() : base( 0x3B11 ) + { + } + + public BrineShrimp( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Reward Fish/Coral.cs b/Scripts/Items/Aquarium/Reward Fish/Coral.cs new file mode 100644 index 000000000..83f48651f --- /dev/null +++ b/Scripts/Items/Aquarium/Reward Fish/Coral.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class Coral : BaseFish + { + public override int LabelNumber{ get{ return 1074588; } } // Coral + + [Constructable] + public Coral() : base( Utility.RandomList( 0x3AF9, 0x3AFA, 0x3AFB ) ) + { + } + + public Coral( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Reward Fish/FullMoonFish.cs b/Scripts/Items/Aquarium/Reward Fish/FullMoonFish.cs new file mode 100644 index 000000000..91533f2e9 --- /dev/null +++ b/Scripts/Items/Aquarium/Reward Fish/FullMoonFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class FullMoonFish : BaseFish + { + public override int LabelNumber{ get{ return 1074597; } } // A Full Moon Fish + + [Constructable] + public FullMoonFish() : base( 0x3B15 ) + { + } + + public FullMoonFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Reward Fish/SeaHorse.cs b/Scripts/Items/Aquarium/Reward Fish/SeaHorse.cs new file mode 100644 index 000000000..95742ef89 --- /dev/null +++ b/Scripts/Items/Aquarium/Reward Fish/SeaHorse.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class SeaHorseFish : BaseFish + { + public override int LabelNumber{ get{ return 1074414; } } // A sea horse + + [Constructable] + public SeaHorseFish() : base( 0x3B10 ) + { + } + + public SeaHorseFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Reward Fish/StrippedFlakeFish.cs b/Scripts/Items/Aquarium/Reward Fish/StrippedFlakeFish.cs new file mode 100644 index 000000000..52003ca7a --- /dev/null +++ b/Scripts/Items/Aquarium/Reward Fish/StrippedFlakeFish.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class StrippedFlakeFish : BaseFish + { + public override int LabelNumber{ get{ return 1074595; } } // Stripped Flake Fish + + [Constructable] + public StrippedFlakeFish() : base( 0x3B0A ) + { + } + + public StrippedFlakeFish( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Reward Fish/StrippedSosarianSwill.cs b/Scripts/Items/Aquarium/Reward Fish/StrippedSosarianSwill.cs new file mode 100644 index 000000000..15ffbf499 --- /dev/null +++ b/Scripts/Items/Aquarium/Reward Fish/StrippedSosarianSwill.cs @@ -0,0 +1,33 @@ +using System; +using Server; + +namespace Server.Items +{ + public class StrippedSosarianSwill : BaseFish + { + public override int LabelNumber{ get{ return 1074594; } } // Stripped Sosarian Swill + + [Constructable] + public StrippedSosarianSwill() : base( 0x3B0A ) + { + } + + public StrippedSosarianSwill( 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Rewards/AquariumMessage.cs b/Scripts/Items/Aquarium/Rewards/AquariumMessage.cs new file mode 100644 index 000000000..174a08bfc --- /dev/null +++ b/Scripts/Items/Aquarium/Rewards/AquariumMessage.cs @@ -0,0 +1,41 @@ +using System; +using Server; +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 ); + + list.Add( 1073634 ); // An aquarium decoration + } + + 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Rewards/CaptainBlackheartsFishingPole.cs b/Scripts/Items/Aquarium/Rewards/CaptainBlackheartsFishingPole.cs new file mode 100644 index 000000000..941f47f70 --- /dev/null +++ b/Scripts/Items/Aquarium/Rewards/CaptainBlackheartsFishingPole.cs @@ -0,0 +1,41 @@ +using System; +using Server; +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 ); + + list.Add( 1073634 ); // An aquarium decoration + } + + 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Rewards/CraftysFishingHat.cs b/Scripts/Items/Aquarium/Rewards/CraftysFishingHat.cs new file mode 100644 index 000000000..e8390bc84 --- /dev/null +++ b/Scripts/Items/Aquarium/Rewards/CraftysFishingHat.cs @@ -0,0 +1,41 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Items +{ + public class CraftysFishingHat : BaseHat + { + public override int LabelNumber{ get{ return 1074572; } } // Crafty's Fishing Hat + + [Constructable] + public CraftysFishingHat() : base( 0x1713 ) + { + } + + public CraftysFishingHat( Serial serial ) : base( serial ) + { + } + + public override void GetProperties( ObjectPropertyList list ) + { + base.GetProperties( list ); + + list.Add( 1073634 ); // An aquarium decoration + } + + 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Rewards/FishBones.cs b/Scripts/Items/Aquarium/Rewards/FishBones.cs new file mode 100644 index 000000000..ed9aafd5d --- /dev/null +++ b/Scripts/Items/Aquarium/Rewards/FishBones.cs @@ -0,0 +1,41 @@ +using System; +using Server; + +namespace Server.Items +{ + public class FishBones : Item + { + public override int LabelNumber{ get{ return 1074601; } } // Fish bones + + [Constructable] + public FishBones() : base( 0x3B0C ) + { + Weight = 1; + } + + public FishBones( Serial serial ) : base( serial ) + { + } + + public override void GetProperties( ObjectPropertyList list ) + { + base.GetProperties( list ); + + list.Add( 1073634 ); // An aquarium decoration + } + + 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Rewards/IslandStatue.cs b/Scripts/Items/Aquarium/Rewards/IslandStatue.cs new file mode 100644 index 000000000..35d8a3ef9 --- /dev/null +++ b/Scripts/Items/Aquarium/Rewards/IslandStatue.cs @@ -0,0 +1,42 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Items +{ + public class IslandStatue : Item + { + public override int LabelNumber{ get{ return 1074600; } } // An island statue + + [Constructable] + public IslandStatue() : base( 0x3B0F ) + { + Weight = 1; + } + + public IslandStatue( Serial serial ) : base( serial ) + { + } + + public override void GetProperties( ObjectPropertyList list ) + { + base.GetProperties( list ); + + list.Add( 1073634 ); // An aquarium decoration + } + + 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Rewards/Shell.cs b/Scripts/Items/Aquarium/Rewards/Shell.cs new file mode 100644 index 000000000..f1282d32e --- /dev/null +++ b/Scripts/Items/Aquarium/Rewards/Shell.cs @@ -0,0 +1,42 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Items +{ + public class Shell : Item + { + public override int LabelNumber{ get{ return 1074598; } } // A shell + + [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 ); + + list.Add( 1073634 ); // An aquarium decoration + } + + 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Rewards/ToyBoat.cs b/Scripts/Items/Aquarium/Rewards/ToyBoat.cs new file mode 100644 index 000000000..53e003825 --- /dev/null +++ b/Scripts/Items/Aquarium/Rewards/ToyBoat.cs @@ -0,0 +1,43 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Items +{ + [FlipableAttribute( 0x14F3, 0x14F4 )] + public class ToyBoat : Item + { + public override int LabelNumber{ get{ return 1074363; } } // A toy boat + + [Constructable] + public ToyBoat() : base( 0x14F3 ) + { + Weight = 1; + } + + public ToyBoat( Serial serial ) : base( serial ) + { + } + + public override void GetProperties( ObjectPropertyList list ) + { + base.GetProperties( list ); + + list.Add( 1073634 ); // An aquarium decoration + } + + 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/Rewards/WaterloggedBoots.cs b/Scripts/Items/Aquarium/Rewards/WaterloggedBoots.cs new file mode 100644 index 000000000..1bd26523d --- /dev/null +++ b/Scripts/Items/Aquarium/Rewards/WaterloggedBoots.cs @@ -0,0 +1,52 @@ +using System; +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; + } + else + { + // boots + ItemID = 0x170B; + Weight = 3.0; + } + } + + public WaterloggedBoots( Serial serial ) : base( serial ) + { + } + + public override void GetProperties( ObjectPropertyList list ) + { + base.GetProperties( list ); + + list.Add( 1073634 ); // An aquarium decoration + } + + 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(); + } + } +} diff --git a/Scripts/Items/Aquarium/VacationWafer.cs b/Scripts/Items/Aquarium/VacationWafer.cs new file mode 100644 index 000000000..9bf95e9a8 --- /dev/null +++ b/Scripts/Items/Aquarium/VacationWafer.cs @@ -0,0 +1,35 @@ +using System; +using Server; +using Server.Mobiles; + +namespace Server.Items +{ + public class VacationWafer : Item + { + public override int LabelNumber{ get{ return 1074431; } } // An aquarium flake sphere + + [Constructable] + public VacationWafer() : base( 0x971 ) + { + } + + public VacationWafer( 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(); + } + } +} diff --git a/Scripts/Items/Minor Artifacts/ML/BrightsightLenses.cs b/Scripts/Items/Minor Artifacts/ML/BrightsightLenses.cs new file mode 100644 index 000000000..826b0ce9b --- /dev/null +++ b/Scripts/Items/Minor Artifacts/ML/BrightsightLenses.cs @@ -0,0 +1,48 @@ +using System; +using Server; + +namespace Server.Items +{ + public class BrightsightLenses : ElvenGlasses + { + public override int LabelNumber{ get{ return 1075039; } } // Brightsight Lenses + + public override int BasePhysicalResistance{ get{ return 9; } } + public override int BaseFireResistance{ get{ return 29; } } + public override int BaseColdResistance{ get{ return 7; } } + public override int BasePoisonResistance{ get{ return 8; } } + public override int BaseEnergyResistance{ get{ return 7; } } + + public override int InitMinHits{ get{ return 255; } } + public override int InitMaxHits{ get{ return 255; } } + + [Constructable] + public BrightsightLenses() : base() + { + Hue = 0x501; + + Attributes.NightSight = 1; + Attributes.RegenMana = 3; + + WeaponAttributes.SelfRepair = 3; + } + + public BrightsightLenses( 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(); + } + } +} diff --git a/Scripts/Items/Minor Artifacts/ML/WildfireBow.cs b/Scripts/Items/Minor Artifacts/ML/WildfireBow.cs index 9ded7b683..491819c7d 100644 --- a/Scripts/Items/Minor Artifacts/ML/WildfireBow.cs +++ b/Scripts/Items/Minor Artifacts/ML/WildfireBow.cs @@ -18,7 +18,7 @@ namespace Server.Items SkillBonuses.SetValues( 0, SkillName.Archery, 10 ); WeaponAttributes.ResistFireBonus = 25; - Velocity = 15; + Velocity = 15; } public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy, out int chaos, out int direct ) diff --git a/Scripts/Items/Minor Artifacts/ML/Windsong.cs b/Scripts/Items/Minor Artifacts/ML/Windsong.cs index bb0cdd150..60723224d 100644 --- a/Scripts/Items/Minor Artifacts/ML/Windsong.cs +++ b/Scripts/Items/Minor Artifacts/ML/Windsong.cs @@ -13,12 +13,12 @@ namespace Server.Items [Constructable] public Windsong() : base() { - Hue = 0xAC; + Hue = 0xF7; Attributes.WeaponDamage = 35; WeaponAttributes.SelfRepair = 3; - Velocity = 25; + Velocity = 25; } public Windsong( Serial serial ) : base( serial ) diff --git a/Scripts/Items/Skill Items/Carpenter Items/TaxidermyKit.cs b/Scripts/Items/Skill Items/Carpenter Items/TaxidermyKit.cs index 3bfc13b49..ccb3f9c89 100644 --- a/Scripts/Items/Skill Items/Carpenter Items/TaxidermyKit.cs +++ b/Scripts/Items/Skill Items/Carpenter Items/TaxidermyKit.cs @@ -196,12 +196,6 @@ namespace Server.Items [CommandProperty( AccessLevel.GameMaster )] public int AddonNumber{ get{ return m_AddonNumber; } set{ m_AddonNumber = value; InvalidateProperties(); } } - [CommandProperty( AccessLevel.GameMaster )] - public Mobile Hunter{ get{ return m_Hunter; } set{ m_Hunter = value; InvalidateProperties(); } } - - [CommandProperty( AccessLevel.GameMaster )] - public int AnimalWeight{ get{ return m_AnimalWeight; } set{ m_AnimalWeight = value; InvalidateProperties(); } } - public override int LabelNumber{ get{ return m_AddonNumber; } } [Constructable] @@ -388,9 +382,10 @@ namespace Server.Items } public TrophyDeed( TaxidermyKit.TrophyInfo info, Mobile hunter, int animalWeight ) - : this( info.NorthID + 7, info.NorthID, info.DeedNumber, info.AddonNumber, hunter, animalWeight ) + : this( info.NorthID + 7, info.NorthID, info.DeedNumber, info.AddonNumber ) { } + public TrophyDeed( Serial serial ) : base( serial ) { } diff --git a/Scripts/Items/Skill Items/Magical/Misc/PotionKeg.cs b/Scripts/Items/Skill Items/Magical/Misc/PotionKeg.cs index bce3d2322..16c533739 100644 --- a/Scripts/Items/Skill Items/Magical/Misc/PotionKeg.cs +++ b/Scripts/Items/Skill Items/Magical/Misc/PotionKeg.cs @@ -93,13 +93,13 @@ namespace Server.Items public override int LabelNumber { get - { - if ( m_Held == 0 ) - return 1041084; // A specially lined keg for potions. - else if( m_Type >= PotionEffect.Conflagration ) - return 1072658 + (int) m_Type - (int) PotionEffect.Conflagration; - else - return ( 1041620 + (int)m_Type ); + { + if( m_Held > 0 && ( int )m_Type >= ( int )PotionEffect.Conflagration ) + { + return 1072658 + ( int )m_Type - ( int )PotionEffect.Conflagration; + } + + return (m_Held > 0 ? 1041620 + (int)m_Type : 1041641); } } @@ -230,6 +230,14 @@ namespace Server.Items } else if ( m_Held == 0 ) { + #region Mondain's Legacy + if ( (int) pot.PotionEffect >= (int) PotionEffect.Invisibility ) + { + from.SendLocalizedMessage( 502232 ); // The keg is not designed to hold that type of object. + return false; + } + #endregion + if ( GiveBottle( from, toHold ) ) { m_Type = pot.PotionEffect; diff --git a/Scripts/Items/Skill Items/Magical/Potions/BasePotion.cs b/Scripts/Items/Skill Items/Magical/Potions/BasePotion.cs index 5b797c9c8..171841bba 100644 --- a/Scripts/Items/Skill Items/Magical/Potions/BasePotion.cs +++ b/Scripts/Items/Skill Items/Magical/Potions/BasePotion.cs @@ -32,7 +32,10 @@ namespace Server.Items MaskOfDeath, // Mask of Death is not available in OSI but does exist in cliloc files MaskOfDeathGreater, // included in enumeration for compatability if later enabled by OSI ConfusionBlast, - ConfusionBlastGreater + ConfusionBlastGreater, + Invisibility, + Parasitic, + Darkglow, } public abstract class BasePotion : Item, ICraftable, ICommodity @@ -78,11 +81,10 @@ namespace Server.Items if ( handTwo is BaseWeapon ) handOne = handTwo; - - if ( handOne is BaseRanged ) + if ( handTwo is BaseRanged ) { - BaseRanged ranged = (BaseRanged) handOne; - + BaseRanged ranged = (BaseRanged) handTwo; + if ( ranged.Balanced ) return true; } @@ -234,6 +236,9 @@ namespace Server.Items if ( pack != null ) { + if ( (int) PotionEffect >= (int) PotionEffect.Invisibility ) + return 1; + List kegs = pack.FindItemsByType(); for ( int i = 0; i < kegs.Count; ++i ) diff --git a/Scripts/Items/Skill Items/Magical/Potions/Confusion Blast Potions/BaseConfusionBlastPotion.cs b/Scripts/Items/Skill Items/Magical/Potions/Confusion Blast Potions/BaseConfusionBlastPotion.cs index a808556a9..c1679562a 100644 --- a/Scripts/Items/Skill Items/Magical/Potions/Confusion Blast Potions/BaseConfusionBlastPotion.cs +++ b/Scripts/Items/Skill Items/Magical/Potions/Confusion Blast Potions/BaseConfusionBlastPotion.cs @@ -102,7 +102,7 @@ namespace Server.Items foreach ( Mobile mobile in map.GetMobilesInRange( loc, Radius ) ) { - if ( mobile is BaseCreature && ( Notoriety.Compute ( from, mobile ) != Notoriety.Innocent )) + if ( mobile is BaseCreature ) { BaseCreature mon = (BaseCreature) mobile; diff --git a/Scripts/Items/Skill Items/Magical/Potions/DarkglowPotion.cs b/Scripts/Items/Skill Items/Magical/Potions/DarkglowPotion.cs new file mode 100644 index 000000000..cfa1813e2 --- /dev/null +++ b/Scripts/Items/Skill Items/Magical/Potions/DarkglowPotion.cs @@ -0,0 +1,39 @@ +using System; +using Server; + +namespace Server.Items +{ + public class DarkglowPotion : BasePoisonPotion + { + public override Poison Poison{ get{ return Poison.Greater; } } /* MUST be restored when prerequisites are done */ + + public override double MinPoisoningSkill{ get{ return 95.0; } } + public override double MaxPoisoningSkill{ get{ return 100.0; } } + + public override int LabelNumber{ get{ return 1072849; } } // Darkglow Poison + + [Constructable] + public DarkglowPotion() : base( PotionEffect.Darkglow ) + { + Hue = 0x96; + } + + public DarkglowPotion( 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(); + } + } +} diff --git a/Scripts/Items/Skill Items/Magical/Potions/InvisibilityPotion.cs b/Scripts/Items/Skill Items/Magical/Potions/InvisibilityPotion.cs new file mode 100644 index 000000000..41d4eae94 --- /dev/null +++ b/Scripts/Items/Skill Items/Magical/Potions/InvisibilityPotion.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections; +using Server; + +namespace Server.Items +{ + public class InvisibilityPotion : BasePotion + { + public override int LabelNumber{ get{ return 1072941; } } // Potion of Invisibility + + [Constructable] + public InvisibilityPotion() : base( 0xF0A, PotionEffect.Invisibility ) + { + Hue = 0x48D; + } + + public InvisibilityPotion( Serial serial ) : base( serial ) + { + } + + public override void Drink( Mobile from ) + { + if ( from.Hidden ) + { + from.SendLocalizedMessage( 1073185 ); // You are already unseen. + return; + } + + if ( HasTimer( from ) ) + { + from.SendLocalizedMessage( 1073186 ); // An invisibility potion is already taking effect on your person. + return; + } + + Consume(); + m_Table[ from ] = Timer.DelayCall( TimeSpan.FromSeconds( 2 ), new TimerStateCallback( Hide_Callback ), from ); + PlayDrinkEffect( from ); + } + + private static void Hide_Callback( object obj ) + { + if ( obj is Mobile ) + Hide( (Mobile) obj ); + } + + public static void Hide( Mobile m ) + { + Effects.SendLocationParticles( EffectItem.Create( new Point3D( m.X, m.Y, m.Z + 16 ), m.Map, EffectItem.DefaultDuration ), 0x376A, 10, 15, 5045 ); + m.PlaySound( 0x3C4 ); + + m.Hidden = true; + + BuffInfo.RemoveBuff( m, BuffIcon.HidingAndOrStealth ); + BuffInfo.AddBuff( m, new BuffInfo( BuffIcon.Invisibility, 1075825 ) ); //Invisibility/Invisible + + RemoveTimer( m ); + + Timer.DelayCall( TimeSpan.FromSeconds( 30 ), new TimerStateCallback( EndHide_Callback ), m ); + } + + private static void EndHide_Callback( object obj ) + { + if ( obj is Mobile ) + EndHide( (Mobile) obj ); + } + + public static void EndHide( Mobile m ) + { + m.RevealingAction(); + RemoveTimer( m ); + } + + private static Hashtable m_Table = new Hashtable(); + + public static bool HasTimer( Mobile m ) + { + return m_Table[ m ] != null; + } + + public static void RemoveTimer( Mobile m ) + { + Timer t = (Timer) m_Table[ m ]; + + if ( t != null ) + { + t.Stop(); + m_Table.Remove( m ); + } + } + + public static void Iterrupt( Mobile m ) + { + m.SendLocalizedMessage( 1073187 ); // The invisibility effect is interrupted. + RemoveTimer( m ); + } + + 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(); + } + } +} diff --git a/Scripts/Items/Skill Items/Magical/Potions/ParasiticPotion.cs b/Scripts/Items/Skill Items/Magical/Potions/ParasiticPotion.cs new file mode 100644 index 000000000..aec34bbde --- /dev/null +++ b/Scripts/Items/Skill Items/Magical/Potions/ParasiticPotion.cs @@ -0,0 +1,39 @@ +using System; +using Server; + +namespace Server.Items +{ + public class ParasiticPotion : BasePoisonPotion + { + public override Poison Poison{ get{ return Poison.Greater; } } /* public override Poison Poison{ get{ return Poison.Darkglow; } } MUST be restored when prerequisites are done */ + + public override double MinPoisoningSkill{ get{ return 95.0; } } + public override double MaxPoisoningSkill{ get{ return 100.0; } } + + public override int LabelNumber{ get{ return 1072848; } } // Parasitic Poison + + [Constructable] + public ParasiticPotion() : base( PotionEffect.Parasitic ) + { + Hue = 0x17C; + } + + public ParasiticPotion( 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(); + } + } +} diff --git a/Scripts/Items/Skill Items/Magical/Runebook.cs b/Scripts/Items/Skill Items/Magical/Runebook.cs index 731d1c922..3d564cffd 100644 --- a/Scripts/Items/Skill Items/Magical/Runebook.cs +++ b/Scripts/Items/Skill Items/Magical/Runebook.cs @@ -15,6 +15,15 @@ namespace Server.Items { public static readonly TimeSpan UseDelay = TimeSpan.FromSeconds( 7.0 ); + private BookQuality m_Quality; + + [CommandProperty( AccessLevel.GameMaster )] + public BookQuality Quality + { + get{ return m_Quality; } + set{ m_Quality = value; InvalidateProperties(); } + } + private List m_Entries; private string m_Description; private int m_CurCharges, m_MaxCharges; @@ -169,7 +178,9 @@ namespace Server.Items { base.Serialize( writer ); - writer.Write( (int) 2 ); + writer.Write( (int) 3 ); + + writer.Write( (byte) m_Quality ); writer.Write( m_Crafter ); @@ -199,6 +210,11 @@ namespace Server.Items switch ( version ) { + case 3: + { + m_Quality = (BookQuality) reader.ReadByte(); + goto case 2; + } case 2: { m_Crafter = reader.ReadMobile(); @@ -272,6 +288,9 @@ namespace Server.Items public override void GetProperties( ObjectPropertyList list ) { base.GetProperties( list ); + + if ( m_Quality == BookQuality.Exceptional ) + list.Add( 1063341 ); // exceptional if ( m_Crafter != null ) list.Add( 1050043, m_Crafter.Name ); // crafted by ~1_NAME~ @@ -452,6 +471,8 @@ namespace Server.Items if ( makersMark ) Crafter = from; + m_Quality = (BookQuality) ( quality - 1 ); + return quality; } diff --git a/Scripts/Items/Skill Items/Magical/Spellbook.cs b/Scripts/Items/Skill Items/Magical/Spellbook.cs index b6ec8c5d7..af0f1c724 100644 --- a/Scripts/Items/Skill Items/Magical/Spellbook.cs +++ b/Scripts/Items/Skill Items/Magical/Spellbook.cs @@ -20,8 +20,31 @@ namespace Server.Items Arcanist } + public enum BookQuality + { + Regular, + Exceptional, + } + public class Spellbook : Item, ICraftable, ISlayer { + private string m_EngravedText; + private BookQuality m_Quality; + + [CommandProperty( AccessLevel.GameMaster )] + public string EngravedText + { + get{ return m_EngravedText; } + set{ m_EngravedText = value; InvalidateProperties(); } + } + + [CommandProperty( AccessLevel.GameMaster )] + public BookQuality Quality + { + get{ return m_Quality; } + set{ m_Quality = value; InvalidateProperties(); } + } + public static void Initialize() { EventSink.OpenSpellbookRequest += new OpenSpellbookRequestEventHandler( EventSink_OpenSpellbookRequest ); @@ -552,6 +575,12 @@ namespace Server.Items public override void GetProperties( ObjectPropertyList list ) { base.GetProperties( list ); + + if ( m_Quality == BookQuality.Exceptional ) + list.Add( 1063341 ); // exceptional + + if ( m_EngravedText != null ) + list.Add( 1072305, m_EngravedText ); // Engraved: ~1_INSCRIPTION~ if ( m_Crafter != null ) list.Add( 1050043, m_Crafter.Name ); // crafted by ~1_NAME~ @@ -689,7 +718,12 @@ namespace Server.Items { base.Serialize( writer ); - writer.Write( (int) 3 ); // version + writer.Write( (int) 5 ); // version + + writer.Write( (byte) m_Quality ); + + writer.Write( (string) m_EngravedText ); + writer.Write( m_Crafter ); writer.Write( (int)m_Slayer ); @@ -710,6 +744,18 @@ namespace Server.Items switch ( version ) { + case 5: + { + m_Quality = (BookQuality) reader.ReadByte(); + + goto case 4; + } + case 4: + { + m_EngravedText = reader.ReadString(); + + goto case 3; + } case 3: { m_Crafter = reader.ReadMobile(); @@ -808,7 +854,7 @@ namespace Server.Items 1 // 1 property : 1/4 : 25% }; - public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue ) + public virtual int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue ) { int magery = from.Skills.Magery.BaseFixedPoint; @@ -851,6 +897,8 @@ namespace Server.Items if ( makersMark ) Crafter = from; + m_Quality = (BookQuality) ( quality - 1 ); + return quality; } } diff --git a/Scripts/Items/Skill Items/Tools/RunicDovetailSaw.cs b/Scripts/Items/Skill Items/Tools/RunicDovetailSaw.cs index 0c598620e..b259840fb 100644 --- a/Scripts/Items/Skill Items/Tools/RunicDovetailSaw.cs +++ b/Scripts/Items/Skill Items/Tools/RunicDovetailSaw.cs @@ -1,8 +1,9 @@ +using System; +using Server; using Server.Engines.Craft; namespace Server.Items { - [FlipableAttribute( 0x1028, 0x1029 )] public class RunicDovetailSaw : BaseRunicTool { public override CraftSystem CraftSystem{ get{ return DefCarpentry.CraftSystem; } } @@ -15,40 +16,20 @@ namespace Server.Items if ( index >= 1 && index <= 6 ) return 1072633 + index; - - return 1011196; // dovetail saw + + return 1024137; // dovetail saw } } - - public override void AddNameProperties( ObjectPropertyList list ) - { - base.AddNameProperties( list ); - - int index = CraftResources.GetIndex( Resource ); - - if ( index >= 1 && index <= 6 ) - return; - - if ( !CraftResources.IsStandard( Resource ) ) - { - int num = CraftResources.GetLocalizationNumber( Resource ); - - if ( num > 0 ) - list.Add( num ); - else - list.Add( CraftResources.GetName( Resource ) ); - } - } - + [Constructable] - public RunicDovetailSaw( CraftResource resource ) : base( resource, 0x1029 ) + public RunicDovetailSaw( CraftResource resource ) : base( resource, 0x1028 ) { Weight = 2.0; Hue = CraftResources.GetHue( resource ); } [Constructable] - public RunicDovetailSaw( CraftResource resource, int uses ) : base( resource, uses, 0x1029 ) + public RunicDovetailSaw( CraftResource resource, int uses ) : base( resource, uses, 0x1028 ) { Weight = 2.0; Hue = CraftResources.GetHue( resource ); diff --git a/Scripts/Mobiles/Vendors/GenericSell.cs b/Scripts/Mobiles/Vendors/GenericSell.cs index 085611769..135f3cf7e 100644 --- a/Scripts/Mobiles/Vendors/GenericSell.cs +++ b/Scripts/Mobiles/Vendors/GenericSell.cs @@ -104,6 +104,9 @@ namespace Server.Mobiles public bool IsSellable( Item item ) { + if ( item.QuestItem ) + return false; + //if ( item.Hue != 0 ) //return false; @@ -112,6 +115,9 @@ namespace Server.Mobiles public bool IsResellable( Item item ) { + if ( item.QuestItem ) + return false; + //if ( item.Hue != 0 ) //return false; diff --git a/Scripts/Mobiles/Vendors/NPC/AnimalTrainer.cs b/Scripts/Mobiles/Vendors/NPC/AnimalTrainer.cs index 45f6a7d4d..498c72f2b 100644 --- a/Scripts/Mobiles/Vendors/NPC/AnimalTrainer.cs +++ b/Scripts/Mobiles/Vendors/NPC/AnimalTrainer.cs @@ -290,6 +290,12 @@ namespace Server.Mobiles { SayTo( from, 502673 ); // I can not stable summoned creatures. } +/* + else if ( pet.Allured ) + { + SayTo( from, 1048053 ); // You can't stable that! + } +*/ else if ( (pet is PackLlama || pet is PackHorse || pet is Beetle) && (pet.Backpack != null && pet.Backpack.Items.Count > 0) ) { SayTo( from, 1042563 ); // You need to unload your pet. diff --git a/Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs b/Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs index 3b6a1d282..a810822dc 100644 --- a/Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs +++ b/Scripts/Mobiles/Vendors/SBInfo/SBFisherman.cs @@ -28,6 +28,15 @@ namespace Server.Mobiles Add( new GenericBuyInfo( typeof( Fish ), 6, 80, 0x9CE, 0 ) ); Add( new GenericBuyInfo( typeof( Fish ), 6, 80, 0x9CF, 0 ) ); Add( new GenericBuyInfo( typeof( FishingPole ), 15, 20, 0xDC0, 0 ) ); + + #region Mondain's Legacy + Add( new GenericBuyInfo( typeof( AquariumFishingNet ), 250, 20, 0xDC8, 0 ) ); + 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 ) ); + Add( new GenericBuyInfo( typeof( AquariumNorthDeed ), 150000, 1, 0x14F0, 0 ) ); + Add( new GenericBuyInfo( typeof( AquariumEastDeed ), 150000, 1, 0x14F0, 0 ) ); + #endregion } } diff --git a/Scripts/Mobiles/Vendors/SBInfo/SBHolyMage.cs b/Scripts/Mobiles/Vendors/SBInfo/SBHolyMage.cs index 5e69dccf2..d44027c33 100644 --- a/Scripts/Mobiles/Vendors/SBInfo/SBHolyMage.cs +++ b/Scripts/Mobiles/Vendors/SBInfo/SBHolyMage.cs @@ -55,7 +55,7 @@ namespace Server.Mobiles else if ( i > 6 ) --itemID; - Add( new GenericBuyInfo( types[ i ], 12 + ( ( i / 8 ) * 10 ), 20, itemID, 0 ) ); + Add( new GenericBuyInfo( types[i], 12 + ((i / 8) * 10), 20, itemID, 0 ) ); } } }