Files
abysmal-isle/Scripts/Services/XmlSpawner/XmlSpawner Core/XmlQuest/XmlQuestBook.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

280 lines
7.9 KiB
C#

using System;
using Server;
using Server.Gumps;
using Server.Network;
using Server.Mobiles;
using System.IO;
using System.Collections.Generic;
using Server.Targeting;
using Server.Engines.PartySystem;
using System.Data;
using System.Xml;
/*
** XmlQuestBook class
**
*/
namespace Server.Items
{
[Flipable( 0x1E5E, 0x1E5F )]
public class PlayerQuestBoard : XmlQuestBook
{
public override bool IsDecoContainer
{
get { return false; }
}
public PlayerQuestBoard( Serial serial ) : base( serial )
{
}
[Constructable]
public PlayerQuestBoard() : base( 0x1e5e )
{
Movable = false;
Name = "Player Quest Board";
LiftOverride = true; // allow players to store books in it
}
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 class XmlQuestBook : Container
{
private PlayerMobile m_Owner;
private bool m_Locked;
[CommandProperty( AccessLevel.GameMaster )]
public PlayerMobile Owner
{ get{ return m_Owner; }
set { m_Owner = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool Locked
{ get{ return m_Locked; }
set { m_Locked = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool IsCompleted
{ get{
Item [] questitems = this.FindItemsByType(typeof(IXmlQuest));
if(questitems == null || questitems.Length <= 0)
return false;
for ( int i = 0; i < questitems.Length; ++i )
{
IXmlQuest q = questitems[i] as IXmlQuest;
// check completion and validity status of all quests held in the book
if(q == null || q.Deleted || !q.IsValid || !q.IsCompleted) return false;
}
return true;
}
}
public XmlQuestBook( Serial serial ) : base( serial )
{
}
[Constructable]
public XmlQuestBook(int itemid) : this( )
{
ItemID = itemid;
}
[Constructable]
public XmlQuestBook() : base( 0x2259 )
{
//LootType = LootType.Blessed;
Name = "QuestBook";
Hue = 100;
}
public override void OnDoubleClick( Mobile from )
{
if(!(from is PlayerMobile)) return;
if(from.AccessLevel >= AccessLevel.GameMaster)
{
base.OnDoubleClick(from);
}
from.SendGump( new XmlQuestBookGump( (PlayerMobile)from, this ) );
}
public override bool OnDragDrop( Mobile from, Item dropped )
{
if(dropped is IXmlQuest && !Locked)
{
return base.OnDragDrop(from,dropped);
} else
{
return false;
}
}
private void CheckOwnerFlag()
{
if(Owner != null && !Owner.Deleted)
{
// need to check to see if any other questtoken items are owned
// search the Owners top level pack for an xmlquest
List<Item> list = XmlQuest.FindXmlQuest(Owner);
if(list == null || list.Count == 0)
{
// if none remain then flag the ower as having none
Owner.SetFlag(XmlQuest.CarriedXmlQuestFlag,false);
}
}
}
public virtual void Invalidate()
{
if(Owner != null)
{
Owner.SendMessage(String.Format("{0} Quests invalidated - '{1}' removed", TotalItems,Name));
}
this.Delete();
}
public override void OnItemLifted(Mobile from, Item item)
{
base.OnItemLifted(from,item);
if(from is PlayerMobile && Owner == null)
{
Owner = from as PlayerMobile;
LootType = LootType.Blessed;
// flag the owner as carrying a questtoken assuming the book contains quests and then confirm it with CheckOwnerFlag
Owner.SetFlag(XmlQuest.CarriedXmlQuestFlag,true);
CheckOwnerFlag();
}
}
#if(NEWPARENT)
public override void OnAdded(IEntity parent)
#else
public override void OnAdded(object parent)
#endif
{
base.OnAdded(parent);
if(parent != null && parent is Container)
{
// find the parent of the container
// note, the only valid additions are to the player pack. Anything else is invalid. This is to avoid exploits involving storage or transfer of questtokens
object from = ((Container)parent).Parent;
// check to see if it can be added
if(from != null && from is PlayerMobile)
{
// if it was not owned then allow it to go anywhere
if(Owner == null)
{
Owner = from as PlayerMobile;
LootType = LootType.Blessed;
// could also bless all of the quests inside as well but not actually necessary since blessed containers retain their
// contents whether blessed or not, and when dropped the questtokens will be blessed
// flag the owner as carrying a questtoken
Owner.SetFlag(XmlQuest.CarriedXmlQuestFlag,true);
CheckOwnerFlag();
} else
if(from as PlayerMobile != Owner || parent is BankBox)
{
// tried to give it to another player or placed it in the players bankbox. try to return it to the owners pack
Owner.AddToBackpack(this);
}
} else
{
if(Owner != null)
{
// try to return it to the owners pack
Owner.AddToBackpack(this);
}
// allow placement into npcs or drop on their corpses when owner is null
else
if(!(from is Mobile) && !(parent is Corpse))
{
// in principle this should never be reached
// invalidate the token
CheckOwnerFlag();
Invalidate();
}
}
}
}
public override void OnDelete()
{
base.OnDelete();
CheckOwnerFlag();
}
public override bool OnDroppedToWorld(Mobile from,Point3D point)
{
bool returnvalue = base.OnDroppedToWorld(from,point);
from.SendGump( new XmlConfirmDeleteGump(from,this));
//CheckOwnerFlag();
//Invalidate();
return false;
//return returnvalue;
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( m_Owner);
writer.Write( m_Locked);
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
this.m_Owner = reader.ReadMobile() as PlayerMobile;
this.m_Locked = reader.ReadBool();
}
}
}