ModernUO/Scripts/Items/Misc/InteriorDecorator.cs
daedalus 95de3595cd - You can't anymore place castles or keeps in Malas facet
(http://www.runuo.com/bugs/index.php?cmd=view&id=38)

- Unfilled commodity deeds now carry the etching "Unfilled"
(http://www.runuo.com/bugs/index.php?cmd=view&id=40)

- Empty scrolls can be deeded in a commodity deed
(http://www.uodemise.com/discussion/showthread.php?t=127485)

- Dying tubs, if locked down, can allow security level choices
(http://www.uodemise.com/discussion/showthread.php?t=128546)

- Changes in Energy Vortex skills: they'll have 120 wrestling (it was 100) and 100 tactics (it was 90)
(http://www.uodemise.com/discussion/showthread.php?t=122733)

- Wooden Footlockers now show the correct container gump
(http://www.uodemise.com/discussion/showthread.php?t=126452)

- Changes to Interior Decorator (still not includes the fix to turn paragon chests):
--> single item addons can be raised/lowered
--> the gump stays visible until target is cancelled
--> target won't be cancelled automatically when the decorator is used on a target
(http://www.uodemise.com/discussion/showthread.php?t=126668)

- Doom Lever Puzzle item list changed to generics
(http://www.uodemise.com/discussion/showthread.php?t=130396)

- Morphed forms will check now the current skill level: the morph effect is lost if skill level goes under the minimum required.
(http://www.uodemise.com/discussion/showthread.php?t=116542)

- Mage NPC vendors now buy necro scrolls; the price of scrolls got tweaked (= raised) to match OSI
(http://www.runuo.com/bugs/index.php?cmd=view&id=90)
(http://www.runuo.com/bugs/index.php?cmd=view&id=113)

- You can't anymore discord NPC vendors
(http://www.runuo.com/bugs/index.php?cmd=view&id=33)

- Removing a rune from runebook won't change the default rune set
(http://www.runuo.com/bugs/index.php?cmd=view&id=41)

- Various runebook security changes (see link for the list)
(http://www.runuo.com/bugs/index.php?cmd=view&id=39)

- You can't use the Sacrifice virtue while hidden
(http://www.runuo.com/bugs/index.php?cmd=view&id=42)

- Added the Deceit Brazier: doubleclicking it will summon a random "britannian" monster (check [props for delays)
(http://www.uodemise.com/discussion/showthread.php?t=123805)

- Casting spells will raise also the secondary skill associated (example: Necro and SpiritSpeak)
(http://www.runuo.com/bugs/index.php?cmd=view&id=43)

- Word of Death changes:
--> the "pitful damage" is much powerful now
--> you have to bring the target health below (5*arcanefocus)% to strike the powerful blast of 300 chaos damage
--> the damage is influenced by SDI
(http://www.runuo.com/bugs/index.php?cmd=view&id=36)

- Teleporters generated by [telgen got corrected for the Wrong dungeon
(http://www.runuo.com/bugs/index.php?cmd=view&id=34)
2009-11-09 19:29:19 +00:00

265 lines
No EOL
7.6 KiB
C#

using System;
using Server;
using Server.Network;
using Server.Regions;
using Server.Multis;
using Server.Gumps;
using Server.Targeting;
namespace Server.Items
{
public enum DecorateCommand
{
None,
Turn,
Up,
Down
}
public class InteriorDecorator : Item
{
private DecorateCommand m_Command;
[CommandProperty( AccessLevel.GameMaster )]
public DecorateCommand Command{ get{ return m_Command; } set{ m_Command = value; InvalidateProperties(); } }
[Constructable]
public InteriorDecorator() : base( 0xFC1 )
{
Weight = 1.0;
LootType = LootType.Blessed;
}
public override int LabelNumber{ get{ return 1041280; } } // an interior decorator
public InteriorDecorator( Serial serial ) : base( serial )
{
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_Command != DecorateCommand.None )
list.Add( 1018322 + (int)m_Command ); // Turn/Up/Down
}
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();
}
public override void OnDoubleClick( Mobile from )
{
if ( !CheckUse( this, from ) )
return;
if ( from.FindGump( typeof( InteriorDecorator.InternalGump ) ) == null )
from.SendGump( new InternalGump( this ) );
if ( m_Command != DecorateCommand.None )
from.Target = new InternalTarget( this );
}
public static bool InHouse( Mobile from )
{
BaseHouse house = BaseHouse.FindHouseAt( from );
return ( house != null && house.IsCoOwner( from ) );
}
public static bool CheckUse( InteriorDecorator tool, Mobile from )
{
/*if ( tool.Deleted || !tool.IsChildOf( from.Backpack ) )
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
else*/
if ( !InHouse( from ) )
from.SendLocalizedMessage( 502092 ); // You must be in your house to do this.
else
return true;
return false;
}
private class InternalGump : Gump
{
private InteriorDecorator m_Decorator;
public InternalGump( InteriorDecorator decorator ) : base( 150, 50 )
{
m_Decorator = decorator;
AddBackground( 0, 0, 200, 200, 2600 );
AddButton( 50, 45, ( decorator.Command == DecorateCommand.Turn ? 2154 : 2152 ), 2154, 1, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 90, 50, 70, 40, 1018323, false, false ); // Turn
AddButton( 50, 95, ( decorator.Command == DecorateCommand.Up ? 2154 : 2152 ), 2154, 2, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 90, 100, 70, 40, 1018324, false, false ); // Up
AddButton( 50, 145, ( decorator.Command == DecorateCommand.Down ? 2154 : 2152 ), 2154, 3, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 90, 150, 70, 40, 1018325, false, false ); // Down
}
public override void OnResponse( NetState sender, RelayInfo info )
{
DecorateCommand command = DecorateCommand.None;
switch ( info.ButtonID )
{
case 1: command = DecorateCommand.Turn; break;
case 2: command = DecorateCommand.Up; break;
case 3: command = DecorateCommand.Down; break;
}
if ( command != DecorateCommand.None )
{
m_Decorator.Command = command;
sender.Mobile.SendGump( new InternalGump( m_Decorator ) );
sender.Mobile.Target = new InternalTarget( m_Decorator );
}
else
Target.Cancel( sender.Mobile );
}
}
private class InternalTarget : Target
{
private InteriorDecorator m_Decorator;
public InternalTarget( InteriorDecorator decorator ) : base( -1, false, TargetFlags.None )
{
CheckLOS = false;
m_Decorator = decorator;
}
protected override void OnTargetNotAccessible( Mobile from, object targeted )
{
OnTarget( from, targeted );
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( targeted is Item && InteriorDecorator.CheckUse( m_Decorator, from ) )
{
BaseHouse house = BaseHouse.FindHouseAt( from );
Item item = (Item)targeted;
bool isDecorableComponent = false;
if ( item is AddonComponent )
if ( ((AddonComponent)item).Addon.Components.Count == 1 && Core.SE )
isDecorableComponent = true;
if ( house == null || !house.IsCoOwner( from ) )
{
from.SendLocalizedMessage( 502092 ); // You must be in your house to do this.
}
else if ( item.Parent != null || !house.IsInside( item ) )
{
from.SendLocalizedMessage( 1042270 ); // That is not in your house.
}
else if ( !house.IsLockedDown( item ) && !house.IsSecure( item ) && !isDecorableComponent )
{
if ( item is AddonComponent && m_Decorator.Command == DecorateCommand.Up )
from.SendLocalizedMessage( 1042274 ); // You cannot raise it up any higher.
else if ( item is AddonComponent && m_Decorator.Command == DecorateCommand.Down )
from.SendLocalizedMessage( 1042275 ); // You cannot lower it down any further.
else
from.SendLocalizedMessage( 1042271 ); // That is not locked down.
}
else if ( item is VendorRentalContract )
{
from.SendLocalizedMessage( 1062491 ); // You cannot use the house decorator on that object.
}
else if ( item.TotalWeight + item.PileWeight > 100 )
{
from.SendLocalizedMessage( 1042272 ); // That is too heavy.
}
else
{
switch ( m_Decorator.Command )
{
case DecorateCommand.Up: Up( item, from ); break;
case DecorateCommand.Down: Down( item, from ); break;
case DecorateCommand.Turn: Turn( item, from ); break;
}
}
}
from.Target = new InternalTarget( m_Decorator );
}
protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType )
{
if ( cancelType == TargetCancelType.Canceled )
from.CloseGump( typeof( InteriorDecorator.InternalGump ) );
}
private static void Turn( Item item, Mobile from )
{
FlipableAttribute[] attributes = (FlipableAttribute[])item.GetType().GetCustomAttributes( typeof( FlipableAttribute ), false );
if( attributes.Length > 0 )
attributes[0].Flip( item );
else
from.SendLocalizedMessage( 1042273 ); // You cannot turn that.
}
private static void Up( Item item, Mobile from )
{
int floorZ = GetFloorZ( item );
if ( floorZ > int.MinValue && item.Z < (floorZ + 15) ) // Confirmed : no height checks here
item.Location = new Point3D( item.Location, item.Z + 1 );
else
from.SendLocalizedMessage( 1042274 ); // You cannot raise it up any higher.
}
private static void Down( Item item, Mobile from )
{
int floorZ = GetFloorZ( item );
if ( floorZ > int.MinValue && item.Z > GetFloorZ( item ) )
item.Location = new Point3D( item.Location, item.Z - 1 );
else
from.SendLocalizedMessage( 1042275 ); // You cannot lower it down any further.
}
private static int GetFloorZ( Item item )
{
Map map = item.Map;
if ( map == null )
return int.MinValue;
Tile[] tiles = map.Tiles.GetStaticTiles( item.X, item.Y, true );
int z = int.MinValue;
for ( int i = 0; i < tiles.Length; ++i )
{
Tile tile = tiles[i];
ItemData id = TileData.ItemTable[tile.ID & 0x3FFF];
int top = tile.Z; // Confirmed : no height checks here
if ( id.Surface && !id.Impassable && top > z && top <= item.Z )
z = top;
}
return z;
}
}
}
}