v0.0.1-Alpha (#42)

This commit is contained in:
Kamron Batman 2019-08-02 18:16:11 -07:00 committed by GitHub
parent d30f93c454
commit a36796c2c1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3552 changed files with 2476 additions and 15223 deletions

View file

@ -0,0 +1,30 @@
namespace Server.Items
{
public class BlackDyeTub : DyeTub
{
[Constructible]
public BlackDyeTub()
{
Hue = DyedHue = 0x0001;
Redyable = false;
}
public BlackDyeTub(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,30 @@
namespace Server.Items
{
public class BlazeDyeTub : DyeTub
{
[Constructible]
public BlazeDyeTub()
{
Hue = DyedHue = 0x489;
Redyable = false;
}
public BlazeDyeTub(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,218 @@
using Server.Gumps;
using Server.Network;
namespace Server.Items
{
public class CustomHueGroup
{
public CustomHueGroup(int name, int[] hues)
{
Name = name;
Hues = hues;
}
public CustomHueGroup(string name, int[] hues)
{
NameString = name;
Hues = hues;
}
public int Name{ get; }
public string NameString{ get; }
public int[] Hues{ get; }
}
public class CustomHuePicker
{
public static readonly CustomHuePicker SpecialDyeTub = new CustomHuePicker(new[]
{
/* Violet */
new CustomHueGroup(1018345, new[] { 1230, 1231, 1232, 1233, 1234, 1235 }),
/* Tan */
new CustomHueGroup(1018346, new[] { 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508 }),
/* Brown */
new CustomHueGroup(1018347, new[] { 2012, 2013, 2014, 2015, 2016, 2017 }),
/* Dark Blue */
new CustomHueGroup(1018348, new[] { 1303, 1304, 1305, 1306, 1307, 1308 }),
/* Forest Green */
new CustomHueGroup(1018349, new[] { 1420, 1421, 1422, 1423, 1424, 1425, 1426 }),
/* Pink */
new CustomHueGroup(1018350, new[] { 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626 }),
/* Red */
new CustomHueGroup(1018351, new[] { 1640, 1641, 1642, 1643, 1644 }),
/* Olive */
new CustomHueGroup(1018352, new[] { 2001, 2002, 2003, 2004, 2005 })
}, false, 1018344);
public static readonly CustomHuePicker LeatherDyeTub = new CustomHuePicker(new[]
{
/* Dull Copper */
new CustomHueGroup(1018332, new[] { 2419, 2420, 2421, 2422, 2423, 2424 }),
/* Shadow Iron */
new CustomHueGroup(1018333, new[] { 2406, 2407, 2408, 2409, 2410, 2411, 2412 }),
/* Copper */
new CustomHueGroup(1018334, new[] { 2413, 2414, 2415, 2416, 2417, 2418 }),
/* Bronze */
new CustomHueGroup(1018335, new[] { 2414, 2415, 2416, 2417, 2418 }),
/* Glden */
new CustomHueGroup(1018336, new[] { 2213, 2214, 2215, 2216, 2217, 2218 }),
/* Agapite */
new CustomHueGroup(1018337, new[] { 2425, 2426, 2427, 2428, 2429, 2430 }),
/* Verite */
new CustomHueGroup(1018338, new[] { 2207, 2208, 2209, 2210, 2211, 2212 }),
/* Valorite */
new CustomHueGroup(1018339, new[] { 2219, 2220, 2221, 2222, 2223, 2224 }),
/* Reds */
new CustomHueGroup(1018340, new[] { 2113, 2114, 2115, 2116, 2117, 2118 }),
/* Blues */
new CustomHueGroup(1018341, new[] { 2119, 2120, 2121, 2122, 2123, 2124 }),
/* Greens */
new CustomHueGroup(1018342, new[] { 2126, 2127, 2128, 2129, 2130 }),
/* Yellows */
new CustomHueGroup(1018343, new[] { 2213, 2214, 2215, 2216, 2217, 2218 })
}, true);
public CustomHuePicker(CustomHueGroup[] groups, bool defaultSupported)
{
Groups = groups;
DefaultSupported = defaultSupported;
}
public CustomHuePicker(CustomHueGroup[] groups, bool defaultSupported, int title)
{
Groups = groups;
DefaultSupported = defaultSupported;
Title = title;
}
public CustomHuePicker(CustomHueGroup[] groups, bool defaultSupported, string title)
{
Groups = groups;
DefaultSupported = defaultSupported;
TitleString = title;
}
public bool DefaultSupported{ get; }
public CustomHueGroup[] Groups{ get; }
public int Title{ get; }
public string TitleString{ get; }
}
public delegate void CustomHuePickerCallback<in T>(Mobile from, T state, int hue);
public class CustomHuePickerGump<T> : Gump
{
private CustomHuePickerCallback<T> m_Callback;
private CustomHuePicker m_Definition;
private Mobile m_From;
private T m_State;
public CustomHuePickerGump(Mobile from, CustomHuePicker definition, CustomHuePickerCallback<T> callback, T state) :
base(50, 50)
{
m_From = from;
m_Definition = definition;
m_Callback = callback;
m_State = state;
RenderBackground();
RenderCategories();
}
private int GetRadioID(int group, int index)
{
return index * m_Definition.Groups.Length + group;
}
private void RenderBackground()
{
AddPage(0);
AddBackground(0, 0, 450, 450, 5054);
AddBackground(10, 10, 430, 430, 3000);
if (m_Definition.TitleString != null)
AddHtml(20, 30, 400, 25, m_Definition.TitleString);
else if (m_Definition.Title > 0)
AddHtmlLocalized(20, 30, 400, 25, m_Definition.Title);
AddButton(20, 400, 4005, 4007, 1);
AddHtmlLocalized(55, 400, 200, 25, 1011036); // OKAY
if (m_Definition.DefaultSupported)
{
AddButton(200, 400, 4005, 4007, 2);
AddLabel(235, 400, 0, "DEFAULT");
}
}
private void RenderCategories()
{
CustomHueGroup[] groups = m_Definition.Groups;
for (int i = 0; i < groups.Length; ++i)
{
AddButton(30, 85 + i * 25, 5224, 5224, 0, GumpButtonType.Page, 1 + i);
if (groups[i].NameString != null)
AddHtml(55, 85 + i * 25, 200, 25, groups[i].NameString);
else
AddHtmlLocalized(55, 85 + i * 25, 200, 25, groups[i].Name);
}
for (int i = 0; i < groups.Length; ++i)
{
AddPage(1 + i);
int[] hues = groups[i].Hues;
for (int j = 0; j < hues.Length; ++j)
{
AddRadio(260, 90 + j * 25, 210, 211, false, GetRadioID(i, j));
AddLabel(278, 90 + j * 25, hues[j] - 1, "*****");
}
}
}
public override void OnResponse(NetState sender, RelayInfo info)
{
switch (info.ButtonID)
{
case 1: // Okay
{
int[] switches = info.Switches;
if (switches.Length > 0)
{
int index = switches[0];
int group = index % m_Definition.Groups.Length;
index /= m_Definition.Groups.Length;
if (group >= 0 && group < m_Definition.Groups.Length)
{
int[] hues = m_Definition.Groups[group].Hues;
if (index >= 0 && index < hues.Length)
m_Callback(m_From, m_State, hues[index]);
}
}
break;
}
case 2: // Default
{
if (m_Definition.DefaultSupported)
m_Callback(m_From, m_State, 0);
break;
}
}
}
}
}

View file

@ -0,0 +1,258 @@
using System.Collections.Generic;
using Server.ContextMenus;
using Server.Gumps;
using Server.Multis;
using Server.Targeting;
namespace Server.Items
{
public interface IDyable
{
bool Dye(Mobile from, DyeTub sender);
}
public class DyeTub : Item, ISecurable
{
private int m_DyedHue;
private bool m_Redyable;
[Constructible]
public DyeTub() : base(0xFAB)
{
Weight = 10.0;
m_Redyable = true;
}
public DyeTub(Serial serial) : base(serial)
{
}
public virtual CustomHuePicker CustomHuePicker => null;
public virtual bool AllowRunebooks => false;
public virtual bool AllowFurniture => false;
public virtual bool AllowStatuettes => false;
public virtual bool AllowLeather => false;
public virtual bool AllowDyables => true;
[CommandProperty(AccessLevel.GameMaster)]
public virtual bool Redyable
{
get => m_Redyable;
set => m_Redyable = value;
}
[CommandProperty(AccessLevel.GameMaster)]
public int DyedHue
{
get => m_DyedHue;
set
{
if (m_Redyable)
{
m_DyedHue = value;
Hue = value;
}
}
}
// Three metallic tubs now.
public virtual bool MetallicHues => false;
// Select the clothing to dye.
public virtual int TargetMessage => 500859;
// You can not dye that.
public virtual int FailMessage => 1042083;
[CommandProperty(AccessLevel.GameMaster)]
public SecureLevel Level{ get; set; }
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write((int)Level);
writer.Write(m_Redyable);
writer.Write(m_DyedHue);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
Level = (SecureLevel)reader.ReadInt();
goto case 0;
}
case 0:
{
m_Redyable = reader.ReadBool();
m_DyedHue = reader.ReadInt();
break;
}
}
}
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
{
base.GetContextMenuEntries(from, list);
SetSecureLevelEntry.AddTo(from, this, list);
}
public override void OnDoubleClick(Mobile from)
{
if (from.InRange(GetWorldLocation(), 1))
{
from.SendLocalizedMessage(TargetMessage);
from.Target = new InternalTarget(this);
}
else
{
from.SendLocalizedMessage(500446); // That is too far away.
}
}
private class InternalTarget : Target
{
private DyeTub m_Tub;
public InternalTarget(DyeTub tub) : base(1, false, TargetFlags.None)
{
m_Tub = tub;
}
protected override void OnTarget(Mobile from, object targeted)
{
if (targeted is Item item)
{
if (item.QuestItem)
{
from.SendLocalizedMessage(1151836); // You may not dye toggled quest items.
}
else if (item is IDyable dyable && m_Tub.AllowDyables)
{
if (!from.InRange(m_Tub.GetWorldLocation(), 1) || !from.InRange(item.GetWorldLocation(), 1))
from.SendLocalizedMessage(500446); // That is too far away.
else if (item.Parent is Mobile)
from.SendLocalizedMessage(500861); // Can't Dye clothing that is being worn.
else if (dyable.Dye(from, m_Tub))
from.PlaySound(0x23E);
}
else if ((FurnitureAttribute.Check(item) || item is PotionKeg) && m_Tub.AllowFurniture)
{
if (!from.InRange(m_Tub.GetWorldLocation(), 1) || !from.InRange(item.GetWorldLocation(), 1))
{
from.SendLocalizedMessage(500446); // That is too far away.
}
else
{
bool okay = item.IsChildOf(from.Backpack);
if (!okay)
{
if (item.Parent == null)
{
BaseHouse house = BaseHouse.FindHouseAt(item);
if (house == null || !house.HasLockedDownItem(item) && !house.HasSecureItem(item))
from.SendLocalizedMessage(501022); // Furniture must be locked down to paint it.
else if (!house.IsCoOwner(from))
from.SendLocalizedMessage(501023); // You must be the owner to use this item.
else
okay = true;
}
else
{
from.SendLocalizedMessage(
1048135); // The furniture must be in your backpack to be painted.
}
}
if (okay)
{
item.Hue = m_Tub.DyedHue;
from.PlaySound(0x23E);
}
}
}
else if ((item is Runebook || item is RecallRune) && m_Tub.AllowRunebooks)
{
if (!from.InRange(m_Tub.GetWorldLocation(), 1) || !from.InRange(item.GetWorldLocation(), 1))
{
from.SendLocalizedMessage(500446); // That is too far away.
}
else if (!item.Movable)
{
from.SendLocalizedMessage(1049776); // You cannot dye runes or runebooks that are locked down.
}
else
{
item.Hue = m_Tub.DyedHue;
from.PlaySound(0x23E);
}
}
else if (item is MonsterStatuette && m_Tub.AllowStatuettes)
{
if (!from.InRange(m_Tub.GetWorldLocation(), 1) || !from.InRange(item.GetWorldLocation(), 1))
{
from.SendLocalizedMessage(500446); // That is too far away.
}
else if (!item.Movable)
{
from.SendLocalizedMessage(1049779); // You cannot dye statuettes that are locked down.
}
else
{
item.Hue = m_Tub.DyedHue;
from.PlaySound(0x23E);
}
}
else if ((item is BaseArmor armor &&
(armor.MaterialType == ArmorMaterialType.Leather ||
armor.MaterialType == ArmorMaterialType.Studded) || item is ElvenBoots ||
item is WoodlandBelt) && m_Tub.AllowLeather)
{
if (!from.InRange(m_Tub.GetWorldLocation(), 1) || !from.InRange(item.GetWorldLocation(), 1))
{
from.SendLocalizedMessage(500446); // That is too far away.
}
else if (!item.Movable)
{
from.SendLocalizedMessage(1042419); // You may not dye leather items which are locked down.
}
else if (item.Parent is Mobile)
{
from.SendLocalizedMessage(500861); // Can't Dye clothing that is being worn.
}
else
{
item.Hue = m_Tub.DyedHue;
from.PlaySound(0x23E);
}
}
else
{
from.SendLocalizedMessage(m_Tub.FailMessage);
}
}
else
{
from.SendLocalizedMessage(m_Tub.FailMessage);
}
}
}
}
}

View file

@ -0,0 +1,70 @@
using Server.Engines.VeteranRewards;
namespace Server.Items
{
public class FurnitureDyeTub : DyeTub, IRewardItem
{
[Constructible]
public FurnitureDyeTub()
{
LootType = LootType.Blessed;
}
public FurnitureDyeTub(Serial serial) : base(serial)
{
}
public override bool AllowDyables => false;
public override bool AllowFurniture => true;
public override int TargetMessage => 501019; // Select the furniture to dye.
public override int FailMessage => 501021; // That is not a piece of furniture.
public override int LabelNumber => 1041246; // Furniture Dye Tub
[CommandProperty(AccessLevel.GameMaster)]
public bool IsRewardItem{ get; set; }
public override void OnDoubleClick(Mobile from)
{
if (IsRewardItem && !RewardSystem.CheckIsUsableBy(from, this))
return;
base.OnDoubleClick(from);
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Core.ML && IsRewardItem)
list.Add(1076217); // 1st Year Veteran Reward
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(IsRewardItem);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
IsRewardItem = reader.ReadBool();
break;
}
}
if (LootType == LootType.Regular)
LootType = LootType.Blessed;
}
}
}

View file

@ -0,0 +1,68 @@
using Server.Engines.VeteranRewards;
namespace Server.Items
{
public class LeatherDyeTub : DyeTub, IRewardItem
{
[Constructible]
public LeatherDyeTub()
{
LootType = LootType.Blessed;
}
public LeatherDyeTub(Serial serial) : base(serial)
{
}
public override bool AllowDyables => false;
public override bool AllowLeather => true;
public override int TargetMessage => 1042416; // Select the leather item to dye.
public override int FailMessage => 1042418; // You can only dye leather with this tub.
public override int LabelNumber => 1041284; // Leather Dye Tub
public override CustomHuePicker CustomHuePicker => CustomHuePicker.LeatherDyeTub;
[CommandProperty(AccessLevel.GameMaster)]
public bool IsRewardItem{ get; set; }
public override void OnDoubleClick(Mobile from)
{
if (IsRewardItem && !RewardSystem.CheckIsUsableBy(from, this))
return;
base.OnDoubleClick(from);
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Core.ML && IsRewardItem)
list.Add(1076218); // 2nd Year Veteran Reward
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(IsRewardItem);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
IsRewardItem = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,34 @@
namespace Server.Items
{
public class MetallicClothDyetub : DyeTub
{
[Constructible]
public MetallicClothDyetub()
{
LootType = LootType.Blessed;
}
public MetallicClothDyetub(Serial serial)
: base(serial)
{
}
public override int LabelNumber => 1152920; // Metallic Cloth ...
public override bool MetallicHues => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,77 @@
using Server.Gumps;
using Server.Network;
namespace Server.Items
{
public class MetallicHuePicker<T> : Gump
{
private CustomHuePickerCallback<T> m_Callback;
private Mobile m_From;
private T m_State;
public MetallicHuePicker(Mobile from, CustomHuePickerCallback<T> callback, T state)
: base(450, 450)
{
m_From = from;
m_Callback = callback;
m_State = state;
Render();
}
public void Render()
{
AddPage(0);
AddBackground(0, 0, 450, 450, 0x13BE);
AddBackground(10, 10, 430, 430, 0xBB8);
AddHtmlLocalized(55, 400, 200, 25, 1011036); // OKAY
AddButton(20, 400, 4005, 4007, 1);
AddButton(200, 400, 4005, 4007, 2);
AddLabel(235, 400, 0, "DEFAULT");
AddHtmlLocalized(55, 25, 200, 25, 1150063); // Base/Shadow Color
AddHtmlLocalized(260, 25, 200, 25, 1150064); // Highlight Color
for (int row = 0; row < 13; row++)
{
AddButton(30, 65 + row * 25, 0x1467, 0x1468, row + 1, GumpButtonType.Page, row + 1);
AddItem(50, 65 + row * 25, 0x1412, 2501 + row * 12 + (row == 12 ? 6 : 0));
}
for (int page = 1; page < 14; page++)
{
AddPage(page);
for (int row = 0; row < 12; row++)
{
int hue = 2501 + (page == 13 ? 6 : 0) + row +
12 * (page - 1); /* OSI just had to skip 6 unused hues, didnt they */
AddRadio(260, 65 + row * 25, 0xd2, 0xd3, false, hue);
AddItem(280, 65 + row * 25, 0x1412, hue);
}
}
}
public override void OnResponse(NetState sender, RelayInfo info)
{
switch (info.ButtonID)
{
case 1: // Okay
{
if (info.Switches.Length > 0) m_Callback(m_From, m_State, info.Switches[0]);
break;
}
case 2: // Default
{
m_Callback(m_From, m_State, 0);
break;
}
}
}
}
}

View file

@ -0,0 +1,44 @@
namespace Server.Items
{
public class MetallicLeatherDyeTub : LeatherDyeTub
{
[Constructible]
public MetallicLeatherDyeTub()
{
LootType = LootType.Blessed;
}
public MetallicLeatherDyeTub(Serial serial)
: base(serial)
{
}
public override CustomHuePicker CustomHuePicker => null;
public override int LabelNumber => 1153495; // Metallic Leather ...
public override bool MetallicHues => true;
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Core.ML && IsRewardItem)
list.Add(1076221); // 5th Year Veteran Reward
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,65 @@
using Server.Engines.VeteranRewards;
namespace Server.Items
{
public class RewardBlackDyeTub : DyeTub, IRewardItem
{
[Constructible]
public RewardBlackDyeTub()
{
Hue = DyedHue = 0x0001;
Redyable = false;
LootType = LootType.Blessed;
}
public RewardBlackDyeTub(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1006008; // Black Dye Tub
[CommandProperty(AccessLevel.GameMaster)]
public bool IsRewardItem{ get; set; }
public override void OnDoubleClick(Mobile from)
{
if (IsRewardItem && !RewardSystem.CheckIsUsableBy(from, this))
return;
base.OnDoubleClick(from);
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Core.ML && IsRewardItem)
list.Add(1076217); // 1st Year Veteran Reward
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(IsRewardItem);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
IsRewardItem = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,68 @@
using Server.Engines.VeteranRewards;
namespace Server.Items
{
public class RunebookDyeTub : DyeTub, IRewardItem
{
[Constructible]
public RunebookDyeTub()
{
LootType = LootType.Blessed;
}
public RunebookDyeTub(Serial serial) : base(serial)
{
}
public override bool AllowDyables => false;
public override bool AllowRunebooks => true;
public override int TargetMessage => 1049774; // Target the runebook or runestone to dye
public override int FailMessage => 1049775; // You can only dye runestones or runebooks with this tub.
public override int LabelNumber => 1049740; // Runebook Dye Tub
public override CustomHuePicker CustomHuePicker => CustomHuePicker.LeatherDyeTub;
[CommandProperty(AccessLevel.GameMaster)]
public bool IsRewardItem{ get; set; }
public override void OnDoubleClick(Mobile from)
{
if (IsRewardItem && !RewardSystem.CheckIsUsableBy(from, this))
return;
base.OnDoubleClick(from);
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Core.ML && IsRewardItem)
list.Add(1076220); // 4th Year Veteran Reward
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(IsRewardItem);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
IsRewardItem = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,64 @@
using Server.Engines.VeteranRewards;
namespace Server.Items
{
public class SpecialDyeTub : DyeTub, IRewardItem
{
[Constructible]
public SpecialDyeTub()
{
LootType = LootType.Blessed;
}
public SpecialDyeTub(Serial serial) : base(serial)
{
}
public override CustomHuePicker CustomHuePicker => CustomHuePicker.SpecialDyeTub;
public override int LabelNumber => 1041285; // Special Dye Tub
[CommandProperty(AccessLevel.GameMaster)]
public bool IsRewardItem{ get; set; }
public override void OnDoubleClick(Mobile from)
{
if (IsRewardItem && !RewardSystem.CheckIsUsableBy(from, this))
return;
base.OnDoubleClick(from);
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Core.ML && IsRewardItem)
list.Add(1076217); // 1st Year Veteran Reward
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(IsRewardItem);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
IsRewardItem = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,68 @@
using Server.Engines.VeteranRewards;
namespace Server.Items
{
public class StatuetteDyeTub : DyeTub, IRewardItem
{
[Constructible]
public StatuetteDyeTub()
{
LootType = LootType.Blessed;
}
public StatuetteDyeTub(Serial serial) : base(serial)
{
}
public override bool AllowDyables => false;
public override bool AllowStatuettes => true;
public override int TargetMessage => 1049777; // Target the statuette to dye
public override int FailMessage => 1049778; // You can only dye veteran reward statuettes with this tub.
public override int LabelNumber => 1049741; // Reward Statuette Dye Tub
public override CustomHuePicker CustomHuePicker => CustomHuePicker.LeatherDyeTub;
[CommandProperty(AccessLevel.GameMaster)]
public bool IsRewardItem{ get; set; }
public override void OnDoubleClick(Mobile from)
{
if (IsRewardItem && !RewardSystem.CheckIsUsableBy(from, this))
return;
base.OnDoubleClick(from);
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (Core.ML && IsRewardItem)
list.Add(1076221); // 5th Year Veteran Reward
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(IsRewardItem);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
IsRewardItem = reader.ReadBool();
break;
}
}
}
}
}

View file

@ -0,0 +1,34 @@
namespace Server.Items /* High seas, loot from merchant ship's hold, also a "uncommon" loot item */
{
public class WhiteClothDyeTub : DyeTub
{
[Constructible]
public WhiteClothDyeTub()
{
DyedHue = Hue = 0x9C2;
}
public WhiteClothDyeTub(Serial serial)
: base(serial)
{
}
public override int LabelNumber => 1149984; // White Cloth Dye Tub
public override bool Redyable => false;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,36 @@
namespace Server.Items
{
public class WhiteLeatherDyeTub : LeatherDyeTub /* OSI UO 13th anniv gift, from redeemable gift tickets */
{
[Constructible]
public WhiteLeatherDyeTub()
{
DyedHue = Hue = 0x9C2;
LootType = LootType.Blessed;
}
public WhiteLeatherDyeTub(Serial serial)
: base(serial)
{
}
public override int LabelNumber => 1149900; // White Leather Dye Tub
public override bool Redyable => false;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,30 @@
namespace Server.Items
{
[Flippable(0xec6, 0xec7)]
public class Dressform : Item
{
[Constructible]
public Dressform() : base(0xec6)
{
Weight = 10;
}
public Dressform(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,111 @@
using Server.HuePickers;
using Server.Targeting;
namespace Server.Items
{
public class Dyes : Item /* , IUsesRemaining */ /* TODO complete usesremaing */
{
/*
public bool ShowUsesRemaining { get { return false; } set { } }
[CommandProperty( AccessLevel.GameMaster )]
public virtual int UsesRemaining { get { return m_UsesRemaining; } set { m_UsesRemaining = value; } }
private int m_UsesRemaining;
*/
[Constructible]
public Dyes() : base(0xFA9)
{
Weight = 3.0;
/* m_UsesRemaining = 25; */
}
public Dyes(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
/* writer.Write( ( int )m_UsesRemaining ); */
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (Weight == 0.0)
Weight = 3.0;
/* m_UsesRemaining = ( version == 0 ) ? 25 : reader.ReadInt(); */
}
public override void OnDoubleClick(Mobile from)
{
from.SendLocalizedMessage(500856); // Select the dye tub to use the dyes on.
from.Target = new InternalTarget();
}
private class InternalTarget : Target
{
public InternalTarget() : base(1, false, TargetFlags.None)
{
}
public virtual void SetTubHue(Mobile from, DyeTub tub, int hue)
{
tub.DyedHue = hue;
}
protected override void OnTarget(Mobile from, object targeted)
{
if (targeted is DyeTub tub)
{
if (tub.Redyable)
{
if (tub.MetallicHues) /* OSI has three metallic tubs now */
from.SendGump(new MetallicHuePicker<DyeTub>(from, SetTubHue, tub));
else if (tub.CustomHuePicker != null)
from.SendGump(new CustomHuePickerGump<DyeTub>(from, tub.CustomHuePicker, SetTubHue, tub));
else
from.SendHuePicker(new InternalPicker(tub));
}
else if (tub is BlackDyeTub)
{
from.SendLocalizedMessage(1010092); // You can not use this on a black dye tub.
}
else
{
from.SendMessage("That dye tub may not be redyed.");
}
}
else
{
from.SendLocalizedMessage(500857); // Use this on a dye tub.
}
}
private class InternalPicker : HuePicker
{
private DyeTub m_Tub;
public InternalPicker(DyeTub tub) : base(tub.ItemID)
{
m_Tub = tub;
}
public override void OnResponse(int hue)
{
m_Tub.DyedHue = hue;
}
}
}
}
}

View file

@ -0,0 +1,119 @@
using Server.Targeting;
namespace Server.Items
{
public interface IScissorable
{
bool Scissor(Mobile from, Scissors scissors);
}
[Flippable(0xf9f, 0xf9e)]
public class Scissors : Item
{
[Constructible]
public Scissors() : base(0xF9F)
{
Weight = 1.0;
}
public Scissors(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
public override void OnDoubleClick(Mobile from)
{
from.SendLocalizedMessage(502434); // What should I use these scissors on?
from.Target = new InternalTarget(this);
}
public static bool CanScissor(Mobile from, IScissorable obj)
{
if (obj is Item item && item.Nontransferable)
{
from.SendLocalizedMessage(502440); // Scissors can not be used on that to produce anything.
return false;
}
// TODO: Move other general checks from the different implementations here
return true;
}
private class InternalTarget : Target
{
private 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 && !item.Movable)
{
if (item is IScissorable obj && (obj is PlagueBeastInnard || obj is PlagueBeastMutationCore))
if (CanScissor(from, obj) && obj.Scissor(from, m_Item))
from.PlaySound(0x248);
}
else if (targeted is IScissorable obj)
{
if (CanScissor(from, obj) && obj.Scissor(from, m_Item))
from.PlaySound(0x248);
}
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 obj && (obj is PlagueBeastInnard || obj is PlagueBeastMutationCore))
{
if (CanScissor(from, obj) && obj.Scissor(from, m_Item))
from.PlaySound(0x248);
}
else
{
base.OnNonlocalTarget(from, targeted);
}
}
}
}
}