diff --git a/Scripts/Engines/Harvest/Fishing.cs b/Scripts/Engines/Harvest/Fishing.cs index 73ae65308..da3a617b1 100644 --- a/Scripts/Engines/Harvest/Fishing.cs +++ b/Scripts/Engines/Harvest/Fishing.cs @@ -246,7 +246,7 @@ namespace Server.Engines.Harvest { Item preLoot = null; - switch ( Utility.Random( 7 ) ) + switch ( Utility.Random( 8 ) ) { case 0: // Body parts { @@ -288,7 +288,16 @@ namespace Server.Engines.Harvest preLoot = new ShipwreckedItem( Utility.Random( 0xFC4, 9 ) ); break; } - case 5: // Misc + case 5: //Hats + { + if ( Utility.RandomBool() ) + preLoot = new SkullCap(); + else + preLoot = new TricorneHat(); + + break; + } + case 6: // Misc { int[] list = new int[] { @@ -299,13 +308,22 @@ namespace Server.Engines.Harvest 0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4 // barrel staves }; - preLoot = new ShipwreckedItem( Utility.RandomList( list ) ); + if ( Utility.Random( list.Length + 1 ) == 0 ) + preLoot = new Candelabra(); + else + preLoot = new ShipwreckedItem( Utility.RandomList( list ) ); + break; } } if ( preLoot != null ) + { + if ( preLoot is IShipwreckedItem ) + ( (IShipwreckedItem)preLoot ).IsShipwreckedItem = true; + return preLoot; + } LockableContainer chest; diff --git a/Scripts/Gumps/ResurrectGump.cs b/Scripts/Gumps/ResurrectGump.cs index 178142182..f39df6ed3 100644 --- a/Scripts/Gumps/ResurrectGump.cs +++ b/Scripts/Gumps/ResurrectGump.cs @@ -10,10 +10,10 @@ namespace Server.Gumps { public enum ResurrectMessage { - ChaosShrine=0, - VirtueShrine=1, - Healer=2, - Generic=3, + ChaosShrine = 0, + VirtueShrine = 1, + Healer = 2, + Generic = 3, } public class ResurrectGump : Gump diff --git a/Scripts/Items/Books/BaseBook.cs b/Scripts/Items/Books/BaseBook.cs index 6ff616815..2068209d5 100644 --- a/Scripts/Items/Books/BaseBook.cs +++ b/Scripts/Items/Books/BaseBook.cs @@ -3,6 +3,8 @@ using System.IO; using System.Text; using Server; using Server.Network; +using Server.Gumps; +using Server.Multis; namespace Server.Items { @@ -51,12 +53,13 @@ namespace Server.Items } } - public class BaseBook : Item + public class BaseBook : Item, ISecurable { private string m_Title; private string m_Author; private BookPageInfo[] m_Pages; private bool m_Writable; + private SecureLevel m_SecureLevel; [CommandProperty( AccessLevel.GameMaster )] public string Title @@ -177,7 +180,11 @@ namespace Server.Items if ( content == null || !content.IsMatch( m_Pages ) ) flags |= SaveFlags.Content; - writer.Write( (int) 3 ); // version + + + writer.Write( (int) 4 ); // version + + writer.Write( (int)m_SecureLevel ); writer.Write( (byte) flags ); @@ -204,6 +211,11 @@ namespace Server.Items switch ( version ) { + case 4: + { + m_SecureLevel = (SecureLevel)reader.ReadInt(); + goto case 3; + } case 3: case 2: { @@ -324,7 +336,7 @@ namespace Server.Items Mobile from = state.Mobile; BaseBook book = World.FindItem( pvSrc.ReadInt32() ) as BaseBook; - if ( book == null || !book.Writable || !from.InRange( book.GetWorldLocation(), 1 ) ) + if ( book == null || !book.Writable || !from.InRange( book.GetWorldLocation(), 1 ) || !book.IsAccessibleTo( from ) ) return; pvSrc.Seek( 4, SeekOrigin.Current ); // Skip flags and page count @@ -341,7 +353,7 @@ namespace Server.Items Mobile from = state.Mobile; BaseBook book = World.FindItem( pvSrc.ReadInt32() ) as BaseBook; - if ( book == null || !book.Writable || !from.InRange( book.GetWorldLocation(), 1 ) ) + if ( book == null || !book.Writable || !from.InRange( book.GetWorldLocation(), 1 ) || !book.IsAccessibleTo( from ) ) return; pvSrc.Seek( 4, SeekOrigin.Current ); // Skip flags and page count @@ -369,7 +381,7 @@ namespace Server.Items Mobile from = state.Mobile; BaseBook book = World.FindItem( pvSrc.ReadInt32() ) as BaseBook; - if ( book == null || !book.Writable || !from.InRange( book.GetWorldLocation(), 1 ) ) + if ( book == null || !book.Writable || !from.InRange( book.GetWorldLocation(), 1 ) || !book.IsAccessibleTo( from ) ) return; int pageCount = pvSrc.ReadUInt16(); @@ -408,6 +420,23 @@ namespace Server.Items } } } + + #region ISecurable Members + + [CommandProperty( AccessLevel.GameMaster )] + public SecureLevel Level + { + get + { + return m_SecureLevel; + } + set + { + m_SecureLevel = value; + } + } + + #endregion } public sealed class BookPageDetails : Packet diff --git a/Scripts/Items/Clothing/BaseClothing.cs b/Scripts/Items/Clothing/BaseClothing.cs index 8bc812efe..fef52e0cc 100644 --- a/Scripts/Items/Clothing/BaseClothing.cs +++ b/Scripts/Items/Clothing/BaseClothing.cs @@ -639,21 +639,7 @@ namespace Server.Items { List attrs = new List(); - if ( DisplayLootType ) - { - if ( LootType == LootType.Blessed ) - attrs.Add( new EquipInfoAttribute( 1038021 ) ); // blessed - else if ( LootType == LootType.Cursed ) - attrs.Add( new EquipInfoAttribute( 1049643 ) ); // cursed - } - - #region Factions - if ( m_FactionState != null ) - attrs.Add( new EquipInfoAttribute( 1041350 ) ); // faction item - #endregion - - if ( m_Quality == ClothingQuality.Exceptional ) - attrs.Add( new EquipInfoAttribute( 1018305 - (int)m_Quality ) ); + AddEquipInfoAttributes( from, attrs ); int number; @@ -675,6 +661,25 @@ namespace Server.Items from.Send( new DisplayEquipmentInfo( this, eqInfo ) ); } + public virtual void AddEquipInfoAttributes( Mobile from, List attrs ) + { + if ( DisplayLootType ) + { + if ( LootType == LootType.Blessed ) + attrs.Add( new EquipInfoAttribute( 1038021 ) ); // blessed + else if ( LootType == LootType.Cursed ) + attrs.Add( new EquipInfoAttribute( 1049643 ) ); // cursed + } + + #region Factions + if ( m_FactionState != null ) + attrs.Add( new EquipInfoAttribute( 1041350 ) ); // faction item + #endregion + + if ( m_Quality == ClothingQuality.Exceptional ) + attrs.Add( new EquipInfoAttribute( 1018305 - (int)m_Quality ) ); + } + #region Serialization private static void SetSaveFlag( ref SaveFlag flags, SaveFlag toSet, bool setIf ) { diff --git a/Scripts/Items/Clothing/Hats.cs b/Scripts/Items/Clothing/Hats.cs index 70329f445..b0ee196f9 100644 --- a/Scripts/Items/Clothing/Hats.cs +++ b/Scripts/Items/Clothing/Hats.cs @@ -1,10 +1,21 @@ using System; using Server.Engines.Craft; +using Server.Network; +using System.Collections.Generic; namespace Server.Items { - public abstract class BaseHat : BaseClothing + public abstract class BaseHat : BaseClothing, IShipwreckedItem { + private bool m_IsShipwreckedItem; + + [CommandProperty( AccessLevel.GameMaster )] + public bool IsShipwreckedItem + { + get { return m_IsShipwreckedItem; } + set { m_IsShipwreckedItem = value; } + } + public BaseHat( int itemID ) : this( itemID, 0 ) { } @@ -21,7 +32,9 @@ namespace Server.Items { base.Serialize( writer ); - writer.Write( (int) 0 ); // version + writer.Write( (int) 1 ); // version + + writer.Write( m_IsShipwreckedItem ); } public override void Deserialize( GenericReader reader ) @@ -29,6 +42,31 @@ namespace Server.Items base.Deserialize( reader ); int version = reader.ReadInt(); + + switch ( version ) + { + case 1: + { + m_IsShipwreckedItem = reader.ReadBool(); + break; + } + } + } + + public override void AddEquipInfoAttributes( Mobile from, List attrs ) + { + base.AddEquipInfoAttributes( from, attrs ); + + if( m_IsShipwreckedItem ) + attrs.Add( new EquipInfoAttribute( 1041645 ) ); // recovered from a shipwreck + } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + + if ( m_IsShipwreckedItem ) + list.Add( 1041645 ); // recovered from a shipwreck } public override int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue ) diff --git a/Scripts/Items/Containers/LockableContainer.cs b/Scripts/Items/Containers/LockableContainer.cs index 1bca76852..380a2a5b6 100644 --- a/Scripts/Items/Containers/LockableContainer.cs +++ b/Scripts/Items/Containers/LockableContainer.cs @@ -5,7 +5,7 @@ using Server.Engines.Craft; namespace Server.Items { - public abstract class LockableContainer : TrapableContainer, ILockable, ILockpickable, ICraftable//, ITelekinesisable + public abstract class LockableContainer : TrapableContainer, ILockable, ILockpickable, ICraftable, IShipwreckedItem { private bool m_Locked; private int m_LockLevel, m_MaxLockLevel, m_RequiredSkill; @@ -121,7 +121,9 @@ namespace Server.Items { base.Serialize( writer ); - writer.Write( (int) 5 ); // version + writer.Write( (int) 6 ); // version + + writer.Write( m_IsShipwreckedItem ); writer.Write( (bool) m_TrapOnLockpick ); @@ -142,6 +144,12 @@ namespace Server.Items switch ( version ) { + case 6: + { + m_IsShipwreckedItem = reader.ReadBool(); + + goto case 5; + } case 5: { m_TrapOnLockpick = reader.ReadBool(); @@ -332,6 +340,21 @@ namespace Server.Items } } + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + + if ( m_IsShipwreckedItem ) + list.Add( 1041645 ); // recovered from a shipwreck + } + + public override void OnSingleClick( Mobile from ) + { + base.OnSingleClick( from ); + + LabelTo( from, 1041645 ); //recovered from a shipwreck + } + #region ICraftable Members public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue ) @@ -372,5 +395,18 @@ namespace Server.Items } #endregion + + #region IShipwreckedItem Members + + private bool m_IsShipwreckedItem; + + [CommandProperty( AccessLevel.GameMaster )] + public bool IsShipwreckedItem + { + get { return m_IsShipwreckedItem; } + set { m_IsShipwreckedItem = value; } + } + #endregion + } } \ No newline at end of file diff --git a/Scripts/Items/Lights/Candelabra.cs b/Scripts/Items/Lights/Candelabra.cs index d22dd3164..ea7a1dc2e 100644 --- a/Scripts/Items/Lights/Candelabra.cs +++ b/Scripts/Items/Lights/Candelabra.cs @@ -3,7 +3,7 @@ using Server; namespace Server.Items { - public class Candelabra : BaseLight + public class Candelabra : BaseLight, IShipwreckedItem { public override int LitItemID{ get { return 0xB1D; } } public override int UnlitItemID{ get { return 0xA27; } } @@ -24,13 +24,51 @@ namespace Server.Items public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); - writer.Write( (int) 0 ); + writer.Write( (int) 1 ); + + writer.Write( m_IsShipwreckedItem ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); + + switch ( version ) + { + case 1: + { + m_IsShipwreckedItem = reader.ReadBool(); + break; + } + } } + + public override void AddNameProperties( ObjectPropertyList list ) + { + base.AddNameProperties( list ); + + if ( m_IsShipwreckedItem ) + list.Add( 1041645 ); // recovered from a shipwreck + } + + public override void OnSingleClick( Mobile from ) + { + base.OnSingleClick( from ); + + LabelTo( from, 1041645 ); //recovered from a shipwreck + } + + #region IShipwreckedItem Members + + private bool m_IsShipwreckedItem; + + [CommandProperty( AccessLevel.GameMaster )] + public bool IsShipwreckedItem + { + get { return m_IsShipwreckedItem; } + set { m_IsShipwreckedItem = value; } + } + #endregion } } \ No newline at end of file diff --git a/Scripts/Items/Skill Items/Fishing/Misc/ShipwreckedItem.cs b/Scripts/Items/Skill Items/Fishing/Misc/ShipwreckedItem.cs index cfd409852..5d1eb6c73 100644 --- a/Scripts/Items/Skill Items/Fishing/Misc/ShipwreckedItem.cs +++ b/Scripts/Items/Skill Items/Fishing/Misc/ShipwreckedItem.cs @@ -2,7 +2,12 @@ using System; namespace Server.Items { - public class ShipwreckedItem : Item, IDyable + public interface IShipwreckedItem + { + bool IsShipwreckedItem { get; set; } + } + + public class ShipwreckedItem : Item, IDyable, IShipwreckedItem { public ShipwreckedItem( int itemID ) : base( itemID ) { @@ -57,5 +62,20 @@ namespace Server.Items from.SendLocalizedMessage( sender.FailMessage ); return false; } + + #region IShipwreckedItem Members + + public bool IsShipwreckedItem + { + get + { + return true; //It's a ShipwreckedItem item. 'Course it's gonna be a Shipwreckeditem + } + set + { + } + } + + #endregion } } \ No newline at end of file diff --git a/Scripts/Misc/Notoriety.cs b/Scripts/Misc/Notoriety.cs index a60ab2105..a4ea30781 100644 --- a/Scripts/Misc/Notoriety.cs +++ b/Scripts/Misc/Notoriety.cs @@ -277,7 +277,7 @@ namespace Server.Misc return Notoriety.Enemy; } - if( target.Kills >= 5 || (target.Body.IsMonster && IsSummoned( target as BaseCreature ) && !(target is BaseFamiliar) && !(target is Golem)) || (target is BaseCreature && (((BaseCreature)target).AlwaysMurderer || ((BaseCreature)target).IsAnimatedDead)) ) + if ( target.Kills >= 5 || ( target.Body.IsMonster && IsSummoned( target as BaseCreature ) && !( target is BaseFamiliar ) && !( target is ArcaneFey ) && !( target is Golem ) ) || ( target is BaseCreature && ( ( (BaseCreature)target ).AlwaysMurderer || ( (BaseCreature)target ).IsAnimatedDead ) ) ) return Notoriety.Murderer; if( target.Criminal ) diff --git a/Scripts/Misc/ShardPoller.cs b/Scripts/Misc/ShardPoller.cs index 582daf9fc..0b82e7c52 100644 --- a/Scripts/Misc/ShardPoller.cs +++ b/Scripts/Misc/ShardPoller.cs @@ -151,7 +151,7 @@ namespace Server.Misc get { return "shard poller"; } } - [Constructable] + [Constructable( AccessLevel.Administrator )] public ShardPoller() : base( 0x1047 ) { m_Duration = TimeSpan.FromHours( 24.0 ); diff --git a/Scripts/Mobiles/Special/Serado.cs b/Scripts/Mobiles/Special/Serado.cs index e872a3a9a..227057102 100644 --- a/Scripts/Mobiles/Special/Serado.cs +++ b/Scripts/Mobiles/Special/Serado.cs @@ -88,7 +88,6 @@ namespace Server.Mobiles ScaleResistances(); DoCounter( attacker ); - } private void ScaleResistances() diff --git a/Scripts/Multis/BaseHouse.cs b/Scripts/Multis/BaseHouse.cs index befe2895c..86f0a10d1 100644 --- a/Scripts/Multis/BaseHouse.cs +++ b/Scripts/Multis/BaseHouse.cs @@ -1013,8 +1013,6 @@ namespace Server.Multis return true; else if ( item is Clock ) return true; - else if ( item is BaseBook ) - return true; else if ( item is BaseInstrument ) return true; else if ( item is Dyes || item is DyeTub ) diff --git a/Scripts/Multis/HouseFoundation.cs b/Scripts/Multis/HouseFoundation.cs index d17ee1a50..860742f49 100644 --- a/Scripts/Multis/HouseFoundation.cs +++ b/Scripts/Multis/HouseFoundation.cs @@ -913,7 +913,12 @@ namespace Server.Multis } else if ( cost < 0 ) { - if ( Banker.Deposit( from, -cost ) ) + if ( this.Deleted ) { + from.SendLocalizedMessage( 1060397, ( -cost ).ToString() ); // ~1_AMOUNT~ gold has been deposited into your bank box. (let them think it worked) + using ( StreamWriter op = new StreamWriter( "customexploiters.log", true ) ) + op.WriteLine( "{0}\t{1}\t{2}\tLocation: {3}", from.Account, from.NetState != null ? from.NetState.ToString() : "null account", from.RawName, from.Location.ToString() ); + } + else if ( Banker.Deposit( from, -cost ) ) from.SendLocalizedMessage( 1060397, ( -cost ).ToString() ); // ~1_AMOUNT~ gold has been deposited into your bank box. else return;