Files
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

233 lines
6.1 KiB
C#

using Server;
using System;
using Server.Mobiles;
using Server.Targeting;
using Server.Gumps;
using Server.Network;
using Server.Multis;
namespace Server.Items
{
public abstract class InterchangeableAddonDeed : BaseAddonDeed
{
// This will need to be further implemented in any derived class
public override BaseAddon Addon { get { return null; } }
public abstract int EastID { get; }
public abstract int SouthID { get; }
public InterchangeableAddonDeed()
{
}
public override void OnDoubleClick(Mobile from)
{
if ( IsChildOf( from.Backpack ) )
from.Target = new InternalTarget( this );
else
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}
private class InternalTarget : Target
{
public InterchangeableAddonDeed Deed { get; set; }
public InternalTarget(InterchangeableAddonDeed deed) : base( -1, true, TargetFlags.None )
{
Deed = deed;
}
protected override void OnTarget( Mobile from, object targeted )
{
IPoint3D p = targeted as IPoint3D;
Map map = from.Map;
if(p == null || map == null || Deed.Deleted)
return;
AddonFitResult result = AddonFitResult.Valid;
if(Deed.IsChildOf(from.Backpack))
{
BaseHouse house = null;
if ( !map.CanFit( p.X, p.Y, p.Z, 16, false, true, false ) )
result = AddonFitResult.Blocked;
else if ( !BaseAddon.CheckHouse( from, new Point3D(p), map, 16, ref house ) )
result = AddonFitResult.NotInHouse;
else
{
bool east = BaseAddon.IsWall(p.X - 1, p.Y, p.Z, map);
bool south = BaseAddon.IsWall(p.X, p.Y - 1, p.Z, map);
if(!south && !east)
result = AddonFitResult.NoWall;
else if (south && east)
from.SendGump(new AddonInterchangeableGump(from, Deed, p, map));
else
{
BaseAddon addon = Deed.DeployAddon(east, p, map);
house.Addons[addon] = from;
}
}
switch (result)
{
default: break;
case AddonFitResult.Blocked: from.SendLocalizedMessage(500269); break; // You cannot build that there.
case AddonFitResult.NotInHouse: from.SendLocalizedMessage(500274); break; // You can only place this in a house that you own!
case AddonFitResult.NoWall: from.SendLocalizedMessage(500268); break; // This object needs to be mounted on something.
}
}
else
{
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}
}
}
public virtual BaseAddon DeployAddon(bool east, IPoint3D p, Map map)
{
BaseAddon addon = Addon;
if(addon != null)
{
if(addon is InterchangeableAddon)
((InterchangeableAddon)addon).EastFacing = east;
Server.Spells.SpellHelper.GetSurfaceTop( ref p );
addon.MoveToWorld(new Point3D(p), map);
Delete();
}
return addon;
}
public InterchangeableAddonDeed(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public abstract class InterchangeableAddon : BaseAddon
{
private bool _EastFacing;
[CommandProperty(AccessLevel.GameMaster)]
public bool EastFacing
{
get
{
return _EastFacing;
}
set
{
if(Components.Count == 1)
{
if(value)
{
Components[0].ItemID = EastID;
}
else
{
Components[0].ItemID = SouthID;
}
}
_EastFacing = value;
}
}
public abstract int EastID { get; }
public abstract int SouthID { get; }
// This will need to be further implemented in any derived class
public override BaseAddonDeed Deed { get { return null; } }
public InterchangeableAddon(bool eastface = true, int loc = 0)
{
if(loc != 0)
AddComponent(new LocalizedAddonComponent(eastface ? EastID : SouthID, loc), 0, 0, 0);
else
AddComponent(new AddonComponent(eastface ? EastID : SouthID), 0, 0, 0);
}
public InterchangeableAddon(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class AddonInterchangeableGump : Gump
{
public InterchangeableAddonDeed Deed { get; private set; }
public IPoint3D Point { get; private set; }
public Map Map { get; private set; }
public AddonInterchangeableGump(Mobile user, InterchangeableAddonDeed deed, IPoint3D p, Map map) : base(50, 50)
{
Deed = deed;
Point = p;
Map = map;
AddGumpLayout();
}
public void AddGumpLayout()
{
AddBackground(0, 0, 300, 200, 2600);
AddHtmlLocalized(0, 15, 300, 16, 1152360, false, false); // <CENTER>Choose a banner:</CENTER>
Rectangle2D b = ItemBounds.Table[Deed.EastID];
AddItem(70 - b.Width / 2 - b.X, 75 - b.Height / 2 - b.Y, Deed.EastID);
b = ItemBounds.Table[Deed.SouthID];
AddItem(180 - b.Width / 2 - b.X, 75 - b.Height / 2 - b.Y, Deed.SouthID);
AddButton(75, 50, 2103, 2104, 1, GumpButtonType.Reply, 0);
AddButton(205, 50, 2103, 2104, 2, GumpButtonType.Reply, 0);
}
public override void OnResponse(NetState state, RelayInfo info)
{
if (!state.Mobile.InRange(Point, 3))
{
state.Mobile.SendLocalizedMessage(500251); // That location is too far away.
}
else if (info.ButtonID == 1)
{
Deed.DeployAddon(true, Point, Map);
}
else if (info.ButtonID == 2)
{
Deed.DeployAddon(false, Point, Map);
}
}
}
}