using System; using Server; using System.Reflection; using Server.Targeting; using Server.Commands; namespace Server.Items { public class FlipCommandHandlers { public static void Initialize() { CommandSystem.Register( "Flip", AccessLevel.GameMaster, new CommandEventHandler( Flip_OnCommand ) ); } [Usage( "Flip" )] [Description( "Turns an item." )] public static void Flip_OnCommand( CommandEventArgs e ) { e.Mobile.Target = new FlipTarget(); } private class FlipTarget : Target { public FlipTarget() : base( -1, false, TargetFlags.None ) { } protected override void OnTarget( Mobile from, object targeted ) { if( targeted is Item ) { Item item = (Item)targeted; if( item.Movable == false && from.AccessLevel == AccessLevel.Player ) return; Type type = targeted.GetType(); FlipableAttribute[] AttributeArray = (FlipableAttribute[])type.GetCustomAttributes( typeof( FlipableAttribute ), false ); if( AttributeArray.Length == 0 ) { return; } FlipableAttribute fa = AttributeArray[0]; fa.Flip( (Item)targeted ); } } } } [AttributeUsage( AttributeTargets.Class )] public class DynamicFlipingAttribute : Attribute { public DynamicFlipingAttribute() { } } [AttributeUsage( AttributeTargets.Class )] public class FlipableAttribute : Attribute { private int[] m_ItemIDs; public int[] ItemIDs { get { return m_ItemIDs; } } public FlipableAttribute() : this( null ) { } public FlipableAttribute( params int[] itemIDs ) { m_ItemIDs = itemIDs; } public virtual void Flip( Item item ) { if( m_ItemIDs == null ) { try { MethodInfo flipMethod = item.GetType().GetMethod( "Flip", Type.EmptyTypes ); if( flipMethod != null ) flipMethod.Invoke( item, new object[0] ); } catch { } } else { int index = 0; for( int i = 0; i < m_ItemIDs.Length; i++ ) { if( item.ItemID == m_ItemIDs[i] ) { index = i + 1; break; } } if( index > m_ItemIDs.Length - 1 ) index = 0; item.ItemID = m_ItemIDs[index]; } } } }