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

183 lines
4.9 KiB
C#

using System;
using System.Collections.Generic;
using Server.Items;
using Server.Mobiles;
namespace Server.Engines.Quests
{
public abstract class BaseQuestItem : Item
{
private bool m_InDelivery;
private int m_Duration;
private BaseQuest m_Quest;
private Timer m_Timer;
public BaseQuestItem(int itemID)
: base(itemID)
{
this.LootType = LootType.Blessed;
if (this.Lifespan > 0)
this.StartTimer();
}
public BaseQuestItem(Serial serial)
: base(serial)
{
}
public virtual Type[] Quests
{
get
{
return null;
}
}
public virtual int Lifespan
{
get
{
return 0;
}
}
public int Duration
{
get
{
return this.m_Duration;
}
set
{
this.m_Duration = value;
this.InvalidateProperties();
}
}
public BaseQuest Quest
{
get
{
return this.m_Quest;
}
set
{
this.m_Quest = value;
}
}
public override void OnDoubleClick(Mobile from)
{
if (!this.IsChildOf(from.Backpack) && this.Movable)
{
from.SendLocalizedMessage(1060640); // The item must be in your backpack to use it.
return;
}
if (!(from is PlayerMobile))
return;
PlayerMobile player = (PlayerMobile)from;
if (QuestHelper.InProgress(player, this.Quests))
return;
if (QuestHelper.QuestLimitReached(player))
return;
// check if this quester can offer quest chain (already started)
foreach (KeyValuePair<QuestChain, BaseChain> pair in player.Chains)
{
BaseChain chain = pair.Value;
if (chain != null && chain.Quester != null && chain.Quester.IsAssignableFrom(this.GetType()))
{
BaseQuest quest = QuestHelper.RandomQuest(player, new Type[] { chain.CurrentQuest }, this);
if (quest != null)
{
player.CloseGump(typeof(MondainQuestGump));
player.SendGump(new MondainQuestGump(quest));
return;
}
}
}
BaseQuest questt = QuestHelper.RandomQuest(player, this.Quests, this);
if (questt != null)
{
player.CloseGump(typeof(MondainQuestGump));
player.SendGump(new MondainQuestGump(questt));
}
else
player.SendLocalizedMessage(1075141); // You are too busy with other tasks at this time.
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (this.m_Duration > 0)
list.Add(1072517, this.m_Duration.ToString()); // Lifespan: ~1_val~ seconds
if (!this.QuestItem)
list.Add(1072351); // Quest Item
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((int)this.m_Duration);
writer.Write((bool)this.m_InDelivery);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
this.m_Duration = reader.ReadInt();
this.m_InDelivery = reader.ReadBool();
if (this.m_Duration > 0)
this.StartTimer();
}
public virtual void StartTimer()
{
if (this.m_Timer != null)
return;
this.m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10), new TimerCallback(Slice));
}
public virtual void StopTimer()
{
if (this.m_Timer != null)
this.m_Timer.Stop();
this.m_Timer = null;
}
public virtual void Slice()
{
if (this.m_Duration + 10 < this.Lifespan)
this.m_Duration += 10;
else
{
this.StopTimer();
if (this.Parent is Backpack)
{
Backpack pack = (Backpack)this.Parent;
if (pack.Parent is PlayerMobile)
QuestHelper.RemoveStatus((PlayerMobile)pack.Parent, this);
}
this.Delete();
}
}
}
}