239 lines
6.5 KiB
C#
239 lines
6.5 KiB
C#
#region References
|
|
using System;
|
|
using Server.Targeting;
|
|
using Server.Engines.Craft;
|
|
#endregion
|
|
|
|
namespace Server.Items
|
|
{
|
|
public interface IScissorable
|
|
{
|
|
bool Scissor(Mobile from, Scissors scissors);
|
|
}
|
|
|
|
[Flipable(0xf9f, 0xf9e)]
|
|
public class Scissors : Item, ICraftable, IQuality, IUsesRemaining
|
|
{
|
|
private int m_UsesRemaining;
|
|
private Mobile m_Crafter;
|
|
private ItemQuality m_Quality;
|
|
private bool m_ShowUsesRemaining;
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public int UsesRemaining { get { return m_UsesRemaining; } set { m_UsesRemaining = value; InvalidateProperties(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public Mobile Crafter { get { return m_Crafter; } set { m_Crafter = value; InvalidateProperties(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public bool ShowUsesRemaining { get { return m_ShowUsesRemaining; } set { m_ShowUsesRemaining = value; InvalidateProperties(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public ItemQuality Quality
|
|
{
|
|
get { return m_Quality; }
|
|
set
|
|
{
|
|
UnscaleUses();
|
|
m_Quality = value;
|
|
ScaleUses();
|
|
}
|
|
}
|
|
|
|
public bool PlayerConstructed { get { return false; } }
|
|
|
|
[Constructable]
|
|
public Scissors()
|
|
: base(0xF9F)
|
|
{
|
|
Weight = 1.0;
|
|
|
|
m_UsesRemaining = 50;
|
|
|
|
if (Siege.SiegeShard)
|
|
m_ShowUsesRemaining = true;
|
|
}
|
|
|
|
public override void AddCraftedProperties(ObjectPropertyList list)
|
|
{
|
|
if (m_Crafter != null)
|
|
list.Add(1050043, m_Crafter.TitleName); // crafted by ~1_NAME~
|
|
|
|
if (m_Quality == ItemQuality.Exceptional)
|
|
list.Add(1060636); // exceptional
|
|
}
|
|
|
|
public override void AddUsesRemainingProperties(ObjectPropertyList list)
|
|
{
|
|
if (Siege.SiegeShard)
|
|
{
|
|
list.Add(1060584, m_UsesRemaining.ToString()); // uses remaining: ~1_val~
|
|
}
|
|
}
|
|
|
|
public Scissors(Serial serial)
|
|
: base(serial)
|
|
{ }
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
|
|
writer.Write(2); // version
|
|
|
|
writer.Write(m_ShowUsesRemaining);
|
|
|
|
writer.Write(m_UsesRemaining);
|
|
writer.Write(m_Crafter);
|
|
writer.Write((int)m_Quality);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
|
|
int version = reader.ReadInt();
|
|
|
|
switch(version)
|
|
{
|
|
case 2:
|
|
m_ShowUsesRemaining = reader.ReadBool();
|
|
goto case 1;
|
|
case 1:
|
|
m_UsesRemaining = reader.ReadInt();
|
|
m_Crafter = reader.ReadMobile();
|
|
m_Quality = (ItemQuality)reader.ReadInt();
|
|
break;
|
|
case 0:
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
public void ScaleUses()
|
|
{
|
|
m_UsesRemaining = (m_UsesRemaining * GetUsesScalar()) / 100;
|
|
InvalidateProperties();
|
|
}
|
|
|
|
public void UnscaleUses()
|
|
{
|
|
m_UsesRemaining = (m_UsesRemaining * 100) / GetUsesScalar();
|
|
}
|
|
|
|
public int GetUsesScalar()
|
|
{
|
|
if (m_Quality == ItemQuality.Exceptional)
|
|
return 200;
|
|
|
|
return 100;
|
|
}
|
|
|
|
public override void OnDoubleClick(Mobile from)
|
|
{
|
|
from.SendLocalizedMessage(502434); // What should I use these scissors on?
|
|
|
|
from.Target = new InternalTarget(this);
|
|
}
|
|
|
|
#region ICraftable Members
|
|
public int OnCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, ITool tool, CraftItem craftItem, int resHue)
|
|
{
|
|
Quality = (ItemQuality)quality;
|
|
|
|
if (makersMark)
|
|
Crafter = from;
|
|
|
|
return quality;
|
|
}
|
|
#endregion
|
|
|
|
private class InternalTarget : Target
|
|
{
|
|
private readonly Scissors m_Item;
|
|
|
|
public InternalTarget(Scissors item)
|
|
: base(2, false, TargetFlags.None)
|
|
{
|
|
m_Item = item;
|
|
}
|
|
|
|
protected override void OnTarget(Mobile from, object targeted)
|
|
{
|
|
if (m_Item.Deleted)
|
|
{
|
|
return;
|
|
}
|
|
|
|
/*if ( targeted is Item && !((Item)targeted).IsStandardLoot() )
|
|
{
|
|
from.SendLocalizedMessage( 502440 ); // Scissors can not be used on that to produce anything.
|
|
}
|
|
else */
|
|
if (Core.AOS && targeted == from)
|
|
{
|
|
from.SendLocalizedMessage(1062845 + Utility.Random(3));
|
|
//"That doesn't seem like the smartest thing to do." / "That was an encounter you don't wish to repeat." / "Ha! You missed!"
|
|
}
|
|
else if (Core.SE && Utility.RandomDouble() > .20 && (from.Direction & Direction.Running) != 0 &&
|
|
(Core.TickCount - from.LastMoveTime) < from.ComputeMovementSpeed(from.Direction))
|
|
{
|
|
from.SendLocalizedMessage(1063305); // Didn't your parents ever tell you not to run with scissors in your hand?!
|
|
}
|
|
else if (targeted is Item && !((Item)targeted).Movable)
|
|
{
|
|
if (targeted is IScissorable && (targeted is PlagueBeastInnard || targeted is PlagueBeastMutationCore))
|
|
{
|
|
IScissorable obj = (IScissorable)targeted;
|
|
|
|
if (obj.Scissor(from, m_Item))
|
|
{
|
|
from.PlaySound(0x248);
|
|
|
|
if (Siege.SiegeShard)
|
|
{
|
|
Siege.CheckUsesRemaining(from, m_Item);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (targeted is IScissorable)
|
|
{
|
|
IScissorable obj = (IScissorable)targeted;
|
|
|
|
if (obj.Scissor(from, m_Item))
|
|
{
|
|
from.PlaySound(0x248);
|
|
|
|
if (Siege.SiegeShard)
|
|
{
|
|
Siege.CheckUsesRemaining(from, m_Item);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage(502440); // Scissors can not be used on that to produce anything.
|
|
}
|
|
}
|
|
|
|
protected override void OnNonlocalTarget(Mobile from, object targeted)
|
|
{
|
|
if (targeted is IScissorable && (targeted is PlagueBeastInnard || targeted is PlagueBeastMutationCore))
|
|
{
|
|
IScissorable obj = (IScissorable)targeted;
|
|
|
|
if (obj.Scissor(from, m_Item))
|
|
{
|
|
from.PlaySound(0x248);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
base.OnNonlocalTarget(from, targeted);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|