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

247 lines
5.0 KiB
C#

using System;
using Server;
using Server.Items;
using Server.Network;
using Server.Mobiles;
namespace Server.Engines.XmlSpawner2
{
public class XmlSaveItem : XmlAttachment
{
private class SaveItemPack : Container
{
public override int MaxWeight { get { return 0; }}
public SaveItemPack() : base( 0x9B2 )
{
}
public SaveItemPack( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
private Item m_SavedItem;
private Container m_Container;
private Mobile m_WasOwnedBy;
[CommandProperty( AccessLevel.GameMaster )]
public Container Container
{
get { return m_Container; }
}
[CommandProperty( AccessLevel.GameMaster )]
public Item SavedItem
{
get
{
// if the item has been moved off of the internal map, then forget about it
if(m_SavedItem != null && (m_SavedItem.Parent != m_Container || m_SavedItem.Deleted))
{
m_WasOwnedBy = null;
m_SavedItem = null;
}
return m_SavedItem;
}
set
{
// delete any existing item before assigning a new value
if(SavedItem != null)
{
SafeItemDelete(m_SavedItem);
//m_SavedItem.Delete();
m_SavedItem = null;
}
// dont allow saving the item if it is attached to it
if(value != AttachedTo)
{
m_SavedItem = value;
}
// automatically internalize any saved item
if(m_SavedItem != null)
{
AddToContainer(m_SavedItem);
}
}
}
[CommandProperty( AccessLevel.GameMaster )]
public bool RestoreItem
{
get{ return false; }
set
{
if(value == true && SavedItem != null && AttachedTo is IEntity && ((IEntity)AttachedTo).Map != Map.Internal && ((IEntity)AttachedTo).Map != null)
{
// move the item to the location of the object the attachment is attached to
if(AttachedTo is Item)
{
m_SavedItem.Map = ((Item)AttachedTo).Map;
m_SavedItem.Location = ((Item)AttachedTo).Location;
m_SavedItem.Parent = ((Item)AttachedTo).Parent;
} else
if(AttachedTo is Mobile)
{
m_SavedItem.Map = ((Mobile)AttachedTo).Map;
m_SavedItem.Location = ((Mobile)AttachedTo).Location;
m_SavedItem.Parent = null;
}
m_SavedItem = null;
m_WasOwnedBy = null;
}
}
}
[CommandProperty( AccessLevel.GameMaster )]
public Mobile WasOwnedBy { get{ return m_WasOwnedBy; } set { m_WasOwnedBy = value; } }
private void AddToContainer(Item item)
{
if(item == null) return;
if(m_Container == null)
{
m_Container = new SaveItemPack();
}
// need to place in a container to prevent internal map cleanup of the item
m_Container.DropItem(item);
m_Container.Internalize();
}
public Item GetItem()
{
Item returneditem = SavedItem;
m_SavedItem = null;
m_WasOwnedBy = null;
return returneditem;
}
// These are the various ways in which the message attachment can be constructed.
// These can be called via the [addatt interface, via scripts, via the spawner ATTACH keyword.
// Other overloads could be defined to handle other types of arguments
// a serial constructor is REQUIRED
public XmlSaveItem(ASerial serial) : base(serial)
{
}
[Attachable]
public XmlSaveItem()
{
m_Container = new SaveItemPack();
}
[Attachable]
public XmlSaveItem(string name)
{
Name = name;
}
public XmlSaveItem(string name, Item saveditem)
{
Name = name;
SavedItem = saveditem;
}
public XmlSaveItem(string name, Item saveditem, Mobile wasownedby)
{
Name = name;
SavedItem = saveditem;
WasOwnedBy = wasownedby;
}
public override void OnDelete()
{
base.OnDelete();
// delete the item
if(SavedItem != null)
{
//SavedItem.Delete();
SafeItemDelete(SavedItem);
}
if(m_Container != null)
{
SafeItemDelete(m_Container);
//m_Container.Delete();
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize(writer);
writer.Write( (int) 0 );
// version 0
if(SavedItem != null)
{
writer.Write(m_SavedItem);
}
else
{
writer.Write((Item)null);
}
writer.Write(m_WasOwnedBy);
writer.Write(m_Container);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
// version 0
m_SavedItem = reader.ReadItem();
m_WasOwnedBy = reader.ReadMobile();
m_Container = (Container)reader.ReadItem();
AddToContainer(m_SavedItem);
}
public override string OnIdentify(Mobile from)
{
if(from == null || from.AccessLevel == AccessLevel.Player) return null;
if(Expiration > TimeSpan.Zero)
{
return String.Format("{2}: Item {0} expires in {1} mins",SavedItem, Expiration.TotalMinutes, Name);
}
else
{
return String.Format("{1}: Item {0}",SavedItem, Name);
}
}
}
}