diff --git a/Data/Regions.xml b/Data/Regions.xml index 57cd9e871..0f0c016c8 100644 --- a/Data/Regions.xml +++ b/Data/Regions.xml @@ -26,6 +26,12 @@ + + + + + + @@ -461,12 +467,6 @@ - - - - - - @@ -771,9 +771,9 @@ - - - + + + diff --git a/Scripts/Commands/Generic/Commands/Commands.cs b/Scripts/Commands/Generic/Commands/Commands.cs index a03307920..8eb6a331b 100644 --- a/Scripts/Commands/Generic/Commands/Commands.cs +++ b/Scripts/Commands/Generic/Commands/Commands.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.Sockets; using Server; using Server.Accounting; +using Server.Engines.Help; using Server.Items; using Server.Gumps; using Server.Mobiles; @@ -44,7 +45,8 @@ namespace Server.Commands.Generic Register( new DismountCommand() ); Register( new AddCommand() ); Register( new AddToPackCommand() ); - Register( new TellCommand() ); + Register( new TellCommand( true ) ); + Register( new TellCommand( false ) ); Register( new PrivSoundCommand() ); Register( new IncreaseCommand() ); Register( new OpenBrowserCommand() ); @@ -350,14 +352,28 @@ namespace Server.Commands.Generic public class TellCommand : BaseCommand { - public TellCommand() + private bool m_InGump; + + public TellCommand( bool inGump ) { + m_InGump = inGump; + AccessLevel = AccessLevel.Counselor; Supports = CommandSupport.AllMobiles; - Commands = new string[]{ "Tell" }; ObjectTypes = ObjectTypes.Mobiles; - Usage = "Tell \"text\""; - Description = "Sends a system message to a targeted player."; + + if ( inGump ) + { + Commands = new string[]{ "Message", "Msg" }; + Usage = "Message \"text\""; + Description = "Sends a message to a targeted player."; + } + else + { + Commands = new string[]{ "Tell" }; + Usage = "Tell \"text\""; + Description = "Sends a system message to a targeted player."; + } } public override void Execute( CommandEventArgs e, object obj ) @@ -365,9 +381,12 @@ namespace Server.Commands.Generic Mobile mob = (Mobile)obj; Mobile from = e.Mobile; - CommandLogging.WriteLine( from, "{0} {1} telling {2} \"{3}\"", from.AccessLevel, CommandLogging.Format( from ), CommandLogging.Format( mob ), e.ArgString ); + CommandLogging.WriteLine( from, "{0} {1} {2} {3} \"{4}\"", from.AccessLevel, CommandLogging.Format( from ), m_InGump ? "messaging" : "telling", CommandLogging.Format( mob ), e.ArgString ); - mob.SendMessage( e.ArgString ); + if ( m_InGump ) + mob.SendGump( new MessageSentGump( mob, from.Name, e.ArgString ) ); + else + mob.SendMessage( e.ArgString ); } } diff --git a/Scripts/Commands/Generic/Commands/DesignInsert.cs b/Scripts/Commands/Generic/Commands/DesignInsert.cs new file mode 100644 index 000000000..35bfa29e5 --- /dev/null +++ b/Scripts/Commands/Generic/Commands/DesignInsert.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Server; +using Server.Gumps; +using Server.Items; +using Server.Multis; +using Server.Targeting; + +namespace Server.Commands.Generic +{ + public class DesignInsertCommand : BaseCommand + { + public static void Initialize() + { + TargetCommands.Register( new DesignInsertCommand() ); + } + + public DesignInsertCommand() + { + AccessLevel = AccessLevel.GameMaster; + Supports = CommandSupport.Single | CommandSupport.Area; + Commands = new string[] { "DesignInsert" }; + ObjectTypes = ObjectTypes.Items; + Usage = "DesignInsert [allItems=false]"; + Description = "Inserts multiple targeted items into a customizable house's design."; + } + + #region Single targeting mode + public override void Execute( CommandEventArgs e, object obj ) + { + Target t = new DesignInsertTarget( new List(), ( e.Length < 1 || !e.GetBoolean( 0 ) ) ); + t.Invoke( e.Mobile, obj ); + } + + private class DesignInsertTarget : Target + { + private List m_Foundations; + private bool m_StaticsOnly; + + public DesignInsertTarget( List foundations, bool staticsOnly ) + : base( -1, false, TargetFlags.None ) + { + m_Foundations = foundations; + m_StaticsOnly = staticsOnly; + } + + protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType ) + { + if ( m_Foundations.Count != 0 ) + { + from.SendMessage( "Your changes have been committed. Updating..." ); + + foreach ( HouseFoundation house in m_Foundations ) + house.Delta( ItemDelta.Update ); + } + } + + protected override void OnTarget( Mobile from, object obj ) + { + HouseFoundation house; + DesignInsertResult result = ProcessInsert( obj as Item, m_StaticsOnly, out house ); + + switch ( result ) + { + case DesignInsertResult.Valid: + { + if ( m_Foundations.Count == 0 ) + from.SendMessage( "The item has been inserted into the house design. Press ESC when you are finished." ); + else + from.SendMessage( "The item has been inserted into the house design." ); + + if ( !m_Foundations.Contains( house ) ) + m_Foundations.Add( house ); + + break; + } + case DesignInsertResult.InvalidItem: + { + from.SendMessage( "That cannot be inserted. Try again." ); + break; + } + case DesignInsertResult.NotInHouse: + case DesignInsertResult.OutsideHouseBounds: + { + from.SendMessage( "That item is not inside a customizable house. Try again." ); + break; + } + } + + from.Target = new DesignInsertTarget( m_Foundations, m_StaticsOnly ); + } + } + #endregion + + #region Area targeting mode + public override void ExecuteList( CommandEventArgs e, ArrayList list ) + { + e.Mobile.SendGump( new WarningGump( 1060637, 30720, String.Format( "You are about to insert {0} objects. This cannot be undone without a full server revert.

Continue?", list.Count ), 0xFFC000, 420, 280, new WarningGumpCallback( OnConfirmCallback ), new object[] { e, list, ( e.Length < 1 || !e.GetBoolean( 0 ) ) } ) ); + AddResponse( "Awaiting confirmation..." ); + } + + private void OnConfirmCallback( Mobile from, bool okay, object state ) + { + object[] states = (object[])state; + CommandEventArgs e = (CommandEventArgs)states[0]; + ArrayList list = (ArrayList)states[1]; + bool staticsOnly = (bool)states[2]; + + bool flushToLog = false; + + if ( okay ) + { + List foundations = new List(); + flushToLog = ( list.Count > 20 ); + + for ( int i = 0; i < list.Count; ++i ) + { + HouseFoundation house; + DesignInsertResult result = ProcessInsert( list[i] as Item, staticsOnly, out house ); + + switch ( result ) + { + case DesignInsertResult.Valid: + { + AddResponse( "The item has been inserted into the house design." ); + + if ( !foundations.Contains( house ) ) + foundations.Add( house ); + + break; + } + case DesignInsertResult.InvalidItem: + { + LogFailure( "That cannot be inserted." ); + break; + } + case DesignInsertResult.NotInHouse: + case DesignInsertResult.OutsideHouseBounds: + { + LogFailure( "That item is not inside a customizable house." ); + break; + } + } + } + + foreach ( HouseFoundation house in foundations ) + house.Delta( ItemDelta.Update ); + } + else + { + AddResponse( "Command aborted." ); + } + + Flush( from, flushToLog ); + } + #endregion + + public enum DesignInsertResult + { + Valid, + InvalidItem, + NotInHouse, + OutsideHouseBounds + } + + public static DesignInsertResult ProcessInsert( Item item, bool staticsOnly, out HouseFoundation house ) + { + house = null; + + if ( item == null || item is BaseMulti || item is HouseSign || ( staticsOnly && !( item is Static ) ) ) + return DesignInsertResult.InvalidItem; + + house = BaseHouse.FindHouseAt( item ) as HouseFoundation; + + if ( house == null ) + return DesignInsertResult.NotInHouse; + + int x = item.X - house.X; + int y = item.Y - house.Y; + int z = item.Z - house.Z; + + if ( !TryInsertIntoState( house.CurrentState, item.ItemID, x, y, z ) ) + return DesignInsertResult.OutsideHouseBounds; + + TryInsertIntoState( house.DesignState, item.ItemID, x, y, z ); + item.Delete(); + + return DesignInsertResult.Valid; + } + + private static bool TryInsertIntoState( DesignState state, int itemID, int x, int y, int z ) + { + MultiComponentList mcl = state.Components; + + if ( x < mcl.Min.X || y < mcl.Min.Y || x > mcl.Max.X || y > mcl.Max.Y ) + return false; + + mcl.Add( itemID, x, y, z ); + state.OnRevised(); + + return true; + } + } +} diff --git a/Scripts/Commands/Generic/Implementors/SerialCommandImplementor.cs b/Scripts/Commands/Generic/Implementors/SerialCommandImplementor.cs index da8aa4d70..7ff08d6ee 100644 --- a/Scripts/Commands/Generic/Implementors/SerialCommandImplementor.cs +++ b/Scripts/Commands/Generic/Implementors/SerialCommandImplementor.cs @@ -48,6 +48,40 @@ namespace Server.Commands.Generic } else { + switch ( command.ObjectTypes ) + { + case ObjectTypes.Both: + { + if ( !(obj is Item) && !(obj is Mobile) ) + { + e.Mobile.SendMessage( "This command does not work on that." ); + return; + } + + break; + } + case ObjectTypes.Items: + { + if ( !(obj is Item) ) + { + e.Mobile.SendMessage( "This command only works on items." ); + return; + } + + break; + } + case ObjectTypes.Mobiles: + { + if ( !(obj is Mobile) ) + { + e.Mobile.SendMessage( "This command only works on mobiles." ); + return; + } + + break; + } + } + string[] oldArgs = e.Arguments; string[] args = new string[oldArgs.Length - 2]; diff --git a/Scripts/Engines/Help/PageQueueGump.cs b/Scripts/Engines/Help/PageQueueGump.cs index 562eb2152..7e1236d71 100644 --- a/Scripts/Engines/Help/PageQueueGump.cs +++ b/Scripts/Engines/Help/PageQueueGump.cs @@ -637,7 +637,7 @@ namespace Server.Engines.Help m_Entry.AddResponse( state.Mobile, "[Go Sender]" ); m.MoveToWorld( m_Entry.Sender.Location, m_Entry.Sender.Map ); - m.SendMessage( "You have been teleported to that pages sender." ); + m.SendMessage( "You have been teleported to that page's sender." ); Resend( state ); } @@ -664,7 +664,7 @@ namespace Server.Engines.Help m_Entry.AddResponse( state.Mobile, "[Go Handler]" ); m.MoveToWorld( h.Location, h.Map ); - m.SendMessage( "You have been teleported to that pages handler." ); + m.SendMessage( "You have been teleported to that page's handler." ); Resend( state ); } } diff --git a/Scripts/Items/Skill Items/Magical/Runebook.cs b/Scripts/Items/Skill Items/Magical/Runebook.cs index 3d564cffd..63d055ad6 100644 --- a/Scripts/Items/Skill Items/Magical/Runebook.cs +++ b/Scripts/Items/Skill Items/Magical/Runebook.cs @@ -337,7 +337,7 @@ namespace Server.Items return; } - if ( DateTime.Now < NextUse ) + if ( DateTime.Now < m_NextUse ) { from.SendLocalizedMessage( 502406 ); // This book needs time to recharge. return; @@ -352,7 +352,8 @@ namespace Server.Items public virtual void OnTravel() { - NextUse = DateTime.Now + UseDelay; + if ( !Core.SA ) + m_NextUse = DateTime.Now + UseDelay; } public override void OnAfterDuped( Item newItem ) diff --git a/Scripts/Mobiles/Animals/Mounts/Ridgeback.cs b/Scripts/Mobiles/Animals/Mounts/Ridgeback.cs index 2a3f22330..63c6105e1 100644 --- a/Scripts/Mobiles/Animals/Mounts/Ridgeback.cs +++ b/Scripts/Mobiles/Animals/Mounts/Ridgeback.cs @@ -45,6 +45,11 @@ namespace Server.Mobiles MinTameSkill = 83.1; } + public override bool OverrideBondingReqs() + { + return true; + } + public override double GetControlChance( Mobile m, bool useBaseSkill ) { return 1.0; diff --git a/Scripts/Mobiles/Animals/Mounts/SavageRidgeback.cs b/Scripts/Mobiles/Animals/Mounts/SavageRidgeback.cs index 88a98affb..eb3a76231 100644 --- a/Scripts/Mobiles/Animals/Mounts/SavageRidgeback.cs +++ b/Scripts/Mobiles/Animals/Mounts/SavageRidgeback.cs @@ -45,6 +45,11 @@ namespace Server.Mobiles MinTameSkill = 83.1; } + public override bool OverrideBondingReqs() + { + return true; + } + public override double GetControlChance( Mobile m, bool useBaseSkill ) { return 1.0; diff --git a/Scripts/Mobiles/Animals/Mounts/ScaledSwampDragon.cs b/Scripts/Mobiles/Animals/Mounts/ScaledSwampDragon.cs index 2127cb7e0..6afdcbe78 100644 --- a/Scripts/Mobiles/Animals/Mounts/ScaledSwampDragon.cs +++ b/Scripts/Mobiles/Animals/Mounts/ScaledSwampDragon.cs @@ -44,6 +44,11 @@ namespace Server.Mobiles MinTameSkill = 93.9; } + public override bool OverrideBondingReqs() + { + return true; + } + public override double GetControlChance( Mobile m, bool useBaseSkill ) { return 1.0; diff --git a/Scripts/Mobiles/Vendors/BaseVendor.cs b/Scripts/Mobiles/Vendors/BaseVendor.cs index 67f07aa0b..b7bf68c0b 100644 --- a/Scripts/Mobiles/Vendors/BaseVendor.cs +++ b/Scripts/Mobiles/Vendors/BaseVendor.cs @@ -752,16 +752,14 @@ namespace Server.Mobiles if ( dropped is SmallBOD || dropped is LargeBOD ) { - if( Core.ML ) - { - if( ((PlayerMobile)from).NextBODTurnInTime > DateTime.Now ) - { - SayTo( from, 1079976 ); // - return false; - } - } + PlayerMobile pm = from as PlayerMobile; - if ( !IsValidBulkOrder( dropped ) || !SupportsBulkOrders( from ) ) + if ( Core.ML && pm != null && pm.NextBODTurnInTime > DateTime.Now ) + { + SayTo( from, 1079976 ); // You'll have to wait a few seconds while I inspect the last order. + return false; + } + else if ( !IsValidBulkOrder( dropped ) ) { SayTo( from, 1045130 ); // That order is for some other shopkeeper. return false; @@ -796,10 +794,8 @@ namespace Server.Mobiles OnSuccessfulBulkOrderReceive( from ); - if( Core.ML ) - { - ((PlayerMobile)from).NextBODTurnInTime = DateTime.Now + TimeSpan.FromSeconds( 10.0 ); - } + if ( Core.ML && pm != null ) + pm.NextBODTurnInTime = DateTime.Now + TimeSpan.FromSeconds( 10.0 ); dropped.Delete(); return true; diff --git a/Scripts/Multis/HouseFoundation.cs b/Scripts/Multis/HouseFoundation.cs index e2f8145e7..dc5677d74 100644 --- a/Scripts/Multis/HouseFoundation.cs +++ b/Scripts/Multis/HouseFoundation.cs @@ -792,8 +792,6 @@ namespace Server.Multis PacketHandlers.RegisterEncoded( 0x1A, true, new OnEncodedPacketReceive( Designer_Revert ) ); - CommandSystem.Register( "DesignInsert", AccessLevel.GameMaster, new CommandEventHandler( DesignInsert_OnCommand ) ); - EventSink.Speech += new SpeechEventHandler( EventSink_Speech ); } @@ -1413,101 +1411,6 @@ namespace Server.Multis } } - [Usage( "DesignInsert" )] - [Description( "Inserts multiple targeted items into a customizable houses design." )] - public static void DesignInsert_OnCommand( CommandEventArgs e ) - { - e.Mobile.Target = new DesignInsertTarget( null ); - e.Mobile.SendMessage( "Target an item to insert it into the house design." ); - } - - private class DesignInsertTarget : Target - { - private HouseFoundation m_Foundation; - - public DesignInsertTarget( HouseFoundation foundation ) - : base( -1, false, TargetFlags.None ) - { - m_Foundation = foundation; - } - - protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType ) - { - if( m_Foundation != null ) - { - from.SendMessage( "Your changes have been committed. Updating..." ); - - m_Foundation.Delta( ItemDelta.Update ); - } - } - - protected override void OnTarget( Mobile from, object obj ) - { - Item item = obj as Item; - - if( item == null ) - { - from.Target = new DesignInsertTarget( m_Foundation ); - from.SendMessage( "That is not an item. Try again." ); - } - else - { - HouseFoundation house = BaseHouse.FindHouseAt( item ) as HouseFoundation; - - if( house == null ) - { - from.Target = new DesignInsertTarget( m_Foundation ); - from.SendMessage( "That item is not inside a customizable house. Try again." ); - } - else if( m_Foundation != null && house != m_Foundation ) - { - from.Target = new DesignInsertTarget( m_Foundation ); - from.SendMessage( "That item is not inside the current house; all targeted items must reside in the same house. You may cancel this target and repeat the command." ); - } - else - { - DesignState state = house.CurrentState; - MultiComponentList mcl = state.Components; - - int x = item.X - house.X; - int y = item.Y - house.Y; - int z = item.Z - house.Z; - - if( x >= mcl.Min.X && y >= mcl.Min.Y && x <= mcl.Max.X && y <= mcl.Max.Y ) - { - mcl.Add( item.ItemID, x, y, z ); - item.Delete(); - - state.OnRevised(); - - state = house.DesignState; - mcl = state.Components; - - if( x >= mcl.Min.X && y >= mcl.Min.Y && x <= mcl.Max.X && y <= mcl.Max.Y ) - { - mcl.Add( item.ItemID, x, y, z ); - state.OnRevised(); - } - - from.Target = new DesignInsertTarget( house ); - - if( m_Foundation == null ) - from.SendMessage( "The item has been inserted into the house design. Press ESC when you are finished." ); - else - from.SendMessage( "The item has been inserted into the house design." ); - - m_Foundation = house; - } - else - { - from.Target = new DesignInsertTarget( m_Foundation ); - from.SendMessage( "That item is not inside a customizable house. Try again." ); - } - } - } - } - } - private static void TraceValidity( NetState state, int itemID ) { try @@ -1572,7 +1475,7 @@ namespace Server.Multis /* Client closed his house design window * - Remove design context * - Notify the client that customization has ended - * - Refresh client with current visable design state + * - Refresh client with current visible design state * - If a signpost is needed, add it * - Eject all from house * - Restore relocated entities diff --git a/Scripts/Spells/Spellweaving/Items/ArcaneFocus.cs b/Scripts/Spells/Spellweaving/Items/ArcaneFocus.cs index 6c1e62265..c54ec10da 100644 --- a/Scripts/Spells/Spellweaving/Items/ArcaneFocus.cs +++ b/Scripts/Spells/Spellweaving/Items/ArcaneFocus.cs @@ -16,6 +16,18 @@ namespace Server.Items set { m_StrengthBonus = value; } } + [Constructable] + public ArcaneFocus() + : this( TimeSpan.FromHours( 1 ), 1 ) + { + } + + [Constructable] + public ArcaneFocus( int lifeSpan, int strengthBonus ) + : this( TimeSpan.FromSeconds( lifeSpan ), strengthBonus ) + { + } + public ArcaneFocus( TimeSpan lifeSpan, int strengthBonus ) : base( 0x3155, lifeSpan ) { LootType = LootType.Blessed;