ModernUO/Scripts/Items/Deeds/HolidayTreeDeed.cs
2018-08-19 21:28:24 +08:00

160 lines
3.9 KiB
C#

using System;
using Server;
using Server.Items;
using Server.Gumps;
using Server.Multis;
using Server.Network;
using Server.Targeting;
namespace Server.Items
{
public class HolidayTreeDeed : Item
{
public override int LabelNumber => 1041116; // a deed for a holiday tree
[Constructible]
public HolidayTreeDeed() : base( 0x14F0 )
{
Hue = 0x488;
Weight = 1.0;
LootType = LootType.Blessed;
}
public HolidayTreeDeed( 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();
LootType = LootType.Blessed;
}
public bool ValidatePlacement( Mobile from, Point3D loc )
{
if ( from.AccessLevel >= AccessLevel.GameMaster )
return true;
if ( !from.InRange( this.GetWorldLocation(), 1 ) )
{
from.SendLocalizedMessage( 500446 ); // That is too far away.
return false;
}
if ( DateTime.UtcNow.Month != 12 )
{
from.SendLocalizedMessage( 1005700 ); // You will have to wait till next December to put your tree back up for display.
return false;
}
Map map = from.Map;
if ( map == null )
return false;
BaseHouse house = BaseHouse.FindHouseAt( loc, map, 20 );
if ( house == null || !house.IsFriend( from ) )
{
from.SendLocalizedMessage( 1005701 ); // The holiday tree can only be placed in your house.
return false;
}
if ( !map.CanFit( loc, 20 ) )
{
from.SendLocalizedMessage( 500269 ); // You cannot build that there.
return false;
}
return true;
}
public void BeginPlace( Mobile from, HolidayTreeType type )
{
from.BeginTarget( -1, true, TargetFlags.None, new TargetStateCallback( Placement_OnTarget ), type );
}
public void Placement_OnTarget( Mobile from, object targeted, object state )
{
if ( !(targeted is IPoint3D p) )
return;
Point3D loc = new Point3D( p );
if ( p is StaticTarget target )
loc.Z -= TileData.ItemTable[target.ItemID].CalcHeight; /* NOTE: OSI does not properly normalize Z positioning here.
* A side affect is that you can only place on floors (due to the CanFit call).
* That functionality may be desired. And so, it's included in this script.
*/
if ( ValidatePlacement( from, loc ) )
EndPlace( from, (HolidayTreeType) state, loc );
}
public void EndPlace( Mobile from, HolidayTreeType type, Point3D loc )
{
this.Delete();
HolidayTree tree = new HolidayTree( from, type, loc );
BaseHouse.FindHouseAt( tree )?.Addons.Add( tree );
}
public override void OnDoubleClick( Mobile from )
{
from.CloseGump( typeof( HolidayTreeChoiceGump ) );
from.SendGump( new HolidayTreeChoiceGump( from, this ) );
}
}
public class HolidayTreeChoiceGump : Gump
{
private Mobile m_From;
private HolidayTreeDeed m_Deed;
public HolidayTreeChoiceGump( Mobile from, HolidayTreeDeed deed ) : base( 200, 200 )
{
m_From = from;
m_Deed = deed;
AddPage( 0 );
AddBackground( 0, 0, 220, 120, 5054 );
AddBackground( 10, 10, 200, 100, 3000 );
AddButton( 20, 35, 4005, 4007, 1, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 55, 35, 145, 25, 1018322, false, false ); // Classic
AddButton( 20, 65, 4005, 4007, 2, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 55, 65, 145, 25, 1018321, false, false ); // Modern
}
public override void OnResponse( NetState sender, RelayInfo info )
{
if ( m_Deed.Deleted )
return;
switch ( info.ButtonID )
{
case 1:
{
m_Deed.BeginPlace( m_From, HolidayTreeType.Classic );
break;
}
case 2:
{
m_Deed.BeginPlace( m_From, HolidayTreeType.Modern );
break;
}
}
}
}
}