Files
abysmal-isle/Scripts/Items/Tools/Scissors.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

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);
}
}
}
}
}