Files
abysmal-isle/Scripts/SubSystem/ACC/ACC Yard System/Items/YardItem.cs
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

365 lines
9.9 KiB
C#

using System;
using System.Collections.Generic;
using Server.Items;
using Server.Multis;
namespace Server.ACC.YS
{
public class YardMultiInfo
{
public int ItemID;
public Point3D Offset;
public YardMultiInfo(int itemID, Point3D offset)
{
ItemID = itemID;
Offset = offset;
}
}
public class YardItem : YardPiece
{
#region Properties
private Mobile m_Placer;
public Mobile Placer
{
get { return m_Placer; }
set { m_Placer = value; }
}
private int m_Price;
[CommandProperty(AccessLevel.GameMaster)]
public int Price
{
get { return m_Price; }
set { m_Price = value; }
}
private BaseHouse m_House;
[CommandProperty(AccessLevel.GameMaster)]
public BaseHouse House
{
get { return m_House; }
set { m_House = value; }
}
private List<YardPiece> m_Pieces;
public List<YardPiece> Pieces
{
get
{
if (m_Pieces == null)
{
m_Pieces = new List<YardPiece>();
}
return m_Pieces;
}
set { m_Pieces = value; }
}
#endregion
#region Constructors
public YardItem(int itemID, Mobile from, string itemName, Point3D location, int price, BaseHouse house)
: base(itemID, from.Name + "'s " + itemName)
{
Price = price;
Placer = from;
Movable = false;
HasMoved = true;
MoveToWorld(location, from.Map);
if (house == null)
{
FindHouseOfPlacer();
}
else
{
House = house;
}
Pieces = new List<YardPiece>();
ParentYardItem = this;
Pieces.Add(this);
if (YardRegistry.YardMultiIDs.ContainsKey(ItemID) && YardRegistry.YardMultiIDs[ItemID] != null)
{
YardPiece piece;
foreach (YardMultiInfo info in YardRegistry.YardMultiIDs[ItemID])
{
piece = new YardPiece(info.ItemID, Name, this);
piece.HasMoved = true;
piece.MoveToWorld(new Point3D(Location.X + info.Offset.X,
Location.Y + info.Offset.Y,
Location.Z + info.Offset.Z),
from.Map);
Pieces.Add(piece);
}
}
for (int i = 0; i < Pieces.Count; i++)
{
Pieces[i].HasMoved = false;
}
}
public YardItem(Serial serial)
: base(serial)
{
}
#endregion
#region Overrides
public override void OnAfterDelete()
{
for (int i = 0; i < Pieces.Count; ++i)
{
Pieces[i].Delete();
}
}
public override void OnDoubleClick(Mobile from)
{
if (from.InRange(this.GetWorldLocation(), 10))
{
if (Placer == null || from == Placer || from.AccessLevel >= AccessLevel.GameMaster)
{
Refund();
}
else
{
from.SendMessage("Stay out of my yard!");
}
}
else
{
from.SendMessage("The item is too far away");
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)1); // version
//Version 1
if (House == null || House.Deleted)
{
writer.Write(false);
YardSystem.AddOrphanedItem(this);
}
else
{
writer.Write(true);
writer.Write(House);
}
//Version 0
writer.WriteMobile(Placer);
writer.Write(Price);
writer.WriteItemList(Pieces);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
if (reader.ReadBool())
{
House = reader.ReadItem() as BaseHouse;
}
goto case 0;
}
case 0:
{
Placer = reader.ReadMobile();
Price = reader.ReadInt();
Pieces = new List<YardPiece>();
foreach (YardPiece item in reader.ReadItemList())
{
Pieces.Add(item);
}
break;
}
}
if (House == null)
{
FindHouseOfPlacer();
if (House == null)
{
Refund();
}
}
}
#endregion
#region Methods
public void Refund()
{
Gold toGive = new Gold(Price);
if (Placer.BankBox.TryDropItem(Placer, toGive, false))
{
Delete();
Placer.SendLocalizedMessage(1060397, toGive.Amount.ToString()); // ~1_AMOUNT~ gold has been deposited into your bank box.
}
else
{
toGive.Delete();
Placer.SendMessage("Your bankbox is full!");
}
}
public void FindHouseOfPlacer()
{
if (Placer == null || House != null)
{
return;
}
IPooledEnumerable eable = Map.GetItemsInRange(Location, 20);
foreach (Item item in eable)
{
if (item is BaseHouse)
{
BaseHouse house = (BaseHouse)item;
if (house.Owner == Placer)
{
House = house;
return;
}
}
}
}
#endregion
}
public class YardPiece : Item
{
private YardItem m_ParentYardItem;
public YardItem ParentYardItem
{
get { return m_ParentYardItem; }
set { m_ParentYardItem = value; }
}
private bool m_HasMoved;
public bool HasMoved
{
get { return m_HasMoved; }
set { m_HasMoved = value; }
}
public YardPiece(int itemID, string name)
: this(itemID, name, null)
{
}
public YardPiece(int itemID, string name, YardItem multiParent)
: base(itemID)
{
Movable = false;
Name = name;
ItemID = itemID;
Light = LightType.Circle150;
if (multiParent != null)
{
ParentYardItem = multiParent;
}
}
public YardPiece(Serial serial)
: base(serial)
{
}
public override void OnAfterDelete()
{
if (ParentYardItem != null)
{
ParentYardItem.OnAfterDelete();
}
else
{
base.OnAfterDelete();
}
}
public override void OnDoubleClick(Mobile from)
{
if (ParentYardItem != null)
{
ParentYardItem.OnDoubleClick(from);
}
else
{
base.OnDoubleClick(from);
}
}
public override void OnLocationChange(Point3D oldLocation)
{
if (HasMoved)
{
base.OnLocationChange(oldLocation);
return;
}
int xOff = 0, yOff = 0, zOff = 0;
xOff = Location.X - oldLocation.X;
yOff = Location.Y - oldLocation.Y;
zOff = Location.Z - oldLocation.Z;
if (ParentYardItem != null && ParentYardItem.Pieces != null)
{
HasMoved = true;
for (int i = 0; i < ParentYardItem.Pieces.Count; i++)
{
if (!ParentYardItem.Pieces[i].HasMoved)
{
ParentYardItem.Pieces[i].HasMoved = true;
ParentYardItem.Pieces[i].MoveToWorld(new Point3D(ParentYardItem.Pieces[i].Location.X + xOff,
ParentYardItem.Pieces[i].Location.Y + yOff,
ParentYardItem.Pieces[i].Location.Z + zOff),
Map);
}
}
for (int i = 0; i < ParentYardItem.Pieces.Count; i++)
{
ParentYardItem.Pieces[i].HasMoved = false;
}
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(ParentYardItem);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 0:
{
ParentYardItem = reader.ReadItem() as YardItem;
break;
}
}
}
}
}