fix(codegen): Fixes bulk order deed hue and codegens (#647)

- [X] Codegens some Bulk Order stuff
- [X] Fixes deserializing with a class that requires the parent as a constructor argument


Closes #641
Closes #623
This commit is contained in:
Kamron Batman 2021-06-11 19:51:03 -07:00 • committed by GitHub
parent eb4e3ac070
commit 510d2e006b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 185 additions and 378 deletions

View file

@ -384,6 +384,8 @@ namespace Server.Accounting
}
_totalGameTime = reader.ReadTimeSpan();
Timer.DelayCall(AfterDeserialization);
}
/// <summary>

View file

@ -2,18 +2,15 @@ using System.Collections.Generic;
namespace Server.Engines.BulkOrders
{
public abstract class BaseBOD : Item
[Serializable(1)]
public abstract partial class BaseBOD : Item
{
private int m_AmountMax;
private BulkMaterialType m_Material;
private bool m_RequireExceptional;
public BaseBOD(int hue, int amountMax, bool requireExeptional, BulkMaterialType material) : this()
{
Hue = hue;
AmountMax = amountMax;
RequireExceptional = requireExeptional;
Material = material;
_amountMax = amountMax;
_requireExceptional = requireExeptional;
_material = material;
}
public BaseBOD() : base(Core.AOS ? 0x2258 : 0x14EF)
@ -22,47 +19,22 @@ namespace Server.Engines.BulkOrders
LootType = LootType.Blessed;
}
public BaseBOD(Serial serial) : base(serial)
{
}
public abstract bool Complete { get; }
[CommandProperty(AccessLevel.GameMaster)]
public sealed override int Hue { get; set; }
[SerializableField(0)]
[InvalidateProperties]
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
private int _amountMax;
[CommandProperty(AccessLevel.GameMaster)]
public int AmountMax
{
get => m_AmountMax;
set
{
m_AmountMax = value;
InvalidateProperties();
}
}
[SerializableField(1)]
[InvalidateProperties]
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
private bool _requireExceptional;
[CommandProperty(AccessLevel.GameMaster)]
public bool RequireExceptional
{
get => m_RequireExceptional;
set
{
m_RequireExceptional = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public BulkMaterialType Material
{
get => m_Material;
set
{
m_Material = value;
InvalidateProperties();
}
}
[SerializableField(1)]
[InvalidateProperties]
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
private BulkMaterialType _material;
public static BulkMaterialType GetRandomMaterial(BulkMaterialType start, double[] chances)
{
@ -141,38 +113,22 @@ namespace Server.Engines.BulkOrders
}
}
public override void Serialize(IGenericWriter writer)
[AfterDeserialization]
private void AfterDeserialization()
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
writer.Write(m_AmountMax);
writer.Write(m_RequireExceptional);
writer.Write((int)m_Material);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
switch (version)
{
case 0:
{
m_AmountMax = reader.ReadInt();
m_RequireExceptional = reader.ReadBool();
m_Material = (BulkMaterialType)reader.ReadInt();
break;
}
}
if (Parent == null && Map == Map.Internal && Location == Point3D.Zero)
{
Delete();
}
}
private void Deserialize(IGenericReader reader, int version)
{
AmountMax = reader.ReadInt();
RequireExceptional = reader.ReadBool();
Material = (BulkMaterialType)reader.ReadInt();
Timer.DelayCall(AfterDeserialization);
}
}
}

View file

@ -6,14 +6,12 @@ namespace Server.Engines.BulkOrders
{
RequireExceptional = bod.RequireExceptional;
if (bod is LargeTailorBOD)
DeedType = bod switch
{
DeedType = BODType.Tailor;
}
else if (bod is LargeSmithBOD)
{
DeedType = BODType.Smith;
}
LargeTailorBOD => BODType.Tailor,
LargeSmithBOD => BODType.Smith,
_ => DeedType
};
Material = bod.Material;
AmountMax = bod.AmountMax;
@ -68,16 +66,12 @@ namespace Server.Engines.BulkOrders
public Item Reconstruct()
{
LargeBOD bod = null;
if (DeedType == BODType.Smith)
LargeBOD bod = DeedType switch
{
bod = new LargeSmithBOD(AmountMax, RequireExceptional, Material, ReconstructEntries());
}
else if (DeedType == BODType.Tailor)
{
bod = new LargeTailorBOD(AmountMax, RequireExceptional, Material, ReconstructEntries());
}
BODType.Smith => new LargeSmithBOD(AmountMax, RequireExceptional, Material, ReconstructEntries()),
BODType.Tailor => new LargeTailorBOD(AmountMax, RequireExceptional, Material, ReconstructEntries()),
_ => null
};
for (var i = 0; bod?.Entries.Length >= i; ++i)
{

View file

@ -2,41 +2,30 @@ using Server.Mobiles;
namespace Server.Engines.BulkOrders
{
public abstract class LargeBOD : BaseBOD
[Serializable(0)]
public abstract partial class LargeBOD : BaseBOD
{
private LargeBulkEntry[] m_Entries;
[InvalidateProperties]
[SerializableField(0)]
private LargeBulkEntry[] _entries;
public LargeBOD(
int hue, int amountMax, bool requireExeptional, BulkMaterialType material, LargeBulkEntry[] entries
) : base(hue, amountMax, requireExeptional, material) =>
m_Entries = entries;
_entries = entries;
public LargeBOD()
{
}
public LargeBOD(Serial serial) : base(serial)
{
}
public LargeBulkEntry[] Entries
{
get => m_Entries;
set
{
m_Entries = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public override bool Complete
{
get
{
for (var i = 0; i < m_Entries.Length; ++i)
for (var i = 0; i < _entries.Length; ++i)
{
if (m_Entries[i].Amount < AmountMax)
if (_entries[i].Amount < AmountMax)
{
return false;
}
@ -66,9 +55,9 @@ namespace Server.Engines.BulkOrders
list.Add(1060656, AmountMax.ToString()); // amount to make: ~1_val~
for (var i = 0; i < m_Entries.Length; ++i)
for (var i = 0; i < _entries.Length; ++i)
{
list.Add(1060658 + i, "#{0}\t{1}", m_Entries[i].Details.Number, m_Entries[i].Amount); // ~1_val~: ~2_val~
list.Add(1060658 + i, "#{0}\t{1}", _entries[i].Details.Number, _entries[i].Amount); // ~1_val~: ~2_val~
}
}
@ -96,7 +85,7 @@ namespace Server.Engines.BulkOrders
public override void EndCombine(Mobile from, Item item)
{
if (!(item is SmallBOD small))
if (item is not SmallBOD small)
{
from.SendLocalizedMessage(1045159); // That is not a bulk order.
return;
@ -104,11 +93,11 @@ namespace Server.Engines.BulkOrders
LargeBulkEntry entry = null;
for (var i = 0; i < m_Entries.Length; ++i)
for (var i = 0; i < _entries.Length; ++i)
{
if (m_Entries[i].Details.Type == small.Type)
if (_entries[i].Details.Type == small.Type)
{
entry = m_Entries[i];
entry = _entries[i];
break;
}
}
@ -159,41 +148,5 @@ namespace Server.Engines.BulkOrders
}
}
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
writer.Write(m_Entries.Length);
for (var i = 0; i < m_Entries.Length; ++i)
{
m_Entries[i].Serialize(writer);
}
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
switch (version)
{
case 0:
{
m_Entries = new LargeBulkEntry[reader.ReadInt()];
for (var i = 0; i < m_Entries.Length; ++i)
{
m_Entries[i] = new LargeBulkEntry(this, reader);
}
break;
}
}
}
}
}

View file

@ -14,7 +14,7 @@ namespace Server.Engines.BulkOrders
Details = details;
}
public LargeBulkEntry(LargeBOD owner, IGenericReader reader)
public LargeBulkEntry(IGenericReader reader, LargeBOD owner)
{
Owner = owner;
m_Amount = reader.ReadInt();

View file

@ -1,6 +1,7 @@
namespace Server.Engines.BulkOrders
{
public class LargeSmithBOD : LargeBOD
[Serializable(0, false)]
public partial class LargeSmithBOD : LargeBOD
{
public static double[] m_BlacksmithMaterialChances =
{
@ -61,29 +62,11 @@ namespace Server.Engines.BulkOrders
{
}
public LargeSmithBOD(Serial serial) : base(serial)
{
}
public override int ComputeFame() => SmithRewardCalculator.Instance.ComputeFame(this);
public override int ComputeGold() => SmithRewardCalculator.Instance.ComputeGold(this);
public override RewardGroup GetRewardGroup() =>
SmithRewardCalculator.Instance.LookupRewards(SmithRewardCalculator.Instance.ComputePoints(this));
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
}

View file

@ -1,6 +1,7 @@
namespace Server.Engines.BulkOrders
{
public class LargeTailorBOD : LargeBOD
[Serializable(0, false)]
public partial class LargeTailorBOD : LargeBOD
{
public static double[] m_TailoringMaterialChances =
{
@ -87,29 +88,11 @@ namespace Server.Engines.BulkOrders
{
}
public LargeTailorBOD(Serial serial) : base(serial)
{
}
public override int ComputeFame() => TailorRewardCalculator.Instance.ComputeFame(this);
public override int ComputeGold() => TailorRewardCalculator.Instance.ComputeGold(this);
public override RewardGroup GetRewardGroup() =>
TailorRewardCalculator.Instance.LookupRewards(TailorRewardCalculator.Instance.ComputePoints(this));
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
}

View file

@ -4,7 +4,8 @@ using Server.Engines.Craft;
namespace Server.Engines.BulkOrders
{
public class SmallSmithBOD : SmallBOD
[Serializable(0, false)]
public partial class SmallSmithBOD : SmallBOD
{
public static double[] m_BlacksmithMaterialChances =
{
@ -63,10 +64,6 @@ namespace Server.Engines.BulkOrders
{
}
public SmallSmithBOD(Serial serial) : base(serial)
{
}
public override int ComputeFame() => SmithRewardCalculator.Instance.ComputeFame(this);
public override int ComputeGold() => SmithRewardCalculator.Instance.ComputeGold(this);
@ -165,19 +162,5 @@ namespace Server.Engines.BulkOrders
var entry = validEntries.RandomElement();
return new SmallSmithBOD(entry, material, amountMax, reqExceptional);
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
}

View file

@ -4,7 +4,8 @@ using Server.Engines.Craft;
namespace Server.Engines.BulkOrders
{
public class SmallTailorBOD : SmallBOD
[Serializable(0, false)]
public partial class SmallTailorBOD : SmallBOD
{
public static double[] m_TailoringMaterialChances =
{
@ -30,7 +31,6 @@ namespace Server.Engines.BulkOrders
return;
}
var hue = 0x483;
var amountMax = Utility.RandomList(10, 15, 20);
var material = useMaterials
@ -40,7 +40,7 @@ namespace Server.Engines.BulkOrders
var reqExceptional = Utility.RandomBool() || material == BulkMaterialType.None;
var entry = entries.RandomElement();
Hue = hue;
Hue = 0x483;
AmountMax = amountMax;
Type = entry.Type;
Number = entry.Number;
@ -56,10 +56,6 @@ namespace Server.Engines.BulkOrders
{
}
public SmallTailorBOD(Serial serial) : base(serial)
{
}
public override int ComputeFame() => TailorRewardCalculator.Instance.ComputeFame(this);
public override int ComputeGold() => TailorRewardCalculator.Instance.ComputeGold(this);
@ -168,19 +164,5 @@ namespace Server.Engines.BulkOrders
return null;
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
}

View file

@ -20,7 +20,8 @@ namespace Server.Items
bool CouldFit(IPoint3D p, Map map);
}
public abstract class BaseAddon : Item, IChoppable, IAddon
[Serializable(2, false)]
public abstract partial class BaseAddon : Item, IChoppable, IAddon
{
private CraftResource m_Resource;
@ -32,15 +33,12 @@ namespace Server.Items
Components = new List<AddonComponent>();
}
public BaseAddon(Serial serial) : base(serial)
{
}
public virtual bool RetainDeedHue => false;
public virtual BaseAddonDeed Deed => null;
public List<AddonComponent> Components { get; private set; }
[SerializableField(0, setter: "private")]
private List<AddonComponent> _components;
public virtual bool ShareHue => true;
@ -66,6 +64,7 @@ namespace Server.Items
}
[CommandProperty(AccessLevel.GameMaster)]
[SerializableField(1)]
public CraftResource Resource
{
get => m_Resource;
@ -77,6 +76,7 @@ namespace Server.Items
Hue = CraftResources.GetHue(m_Resource);
InvalidateProperties();
((ISerializable)this).MarkDirty();
}
}
}
@ -277,30 +277,9 @@ namespace Server.Items
}
}
public override void Serialize(IGenericWriter writer)
private void Deserialize(IGenericReader reader, int version)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(Components);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
switch (version)
{
case 1:
case 0:
{
Components = reader.ReadEntityList<AddonComponent>();
break;
}
}
Components = reader.ReadEntityList<AddonComponent>();
if (version < 1 && Weight == 0)
{

View file

@ -0,0 +1,18 @@
{
"version": 1,
"type": "Server.Engines.BulkOrders.BaseBOD",
"properties": [
{
"name": "AmountMax",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": []
},
{
"name": "RequireExceptional",
"type": "bool",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": []
}
]
}

View file

@ -0,0 +1,16 @@
{
"version": 0,
"type": "Server.Engines.BulkOrders.LargeBOD",
"properties": [
{
"name": "Entries",
"type": "Server.Engines.BulkOrders.LargeBulkEntry[]",
"rule": "ArrayMigrationRule",
"ruleArguments": [
"Server.Engines.BulkOrders.LargeBulkEntry",
"SerializationMethodSignatureMigrationRule",
"DeserializationRequiresParent"
]
}
]
}

View file

@ -0,0 +1,5 @@
{
"version": 0,
"type": "Server.Engines.BulkOrders.LargeSmithBOD",
"properties": []
}

View file

@ -0,0 +1,5 @@
{
"version": 0,
"type": "Server.Engines.BulkOrders.LargeTailorBOD",
"properties": []
}

View file

@ -0,0 +1,5 @@
{
"version": 0,
"type": "Server.Engines.BulkOrders.SmallSmithBOD",
"properties": []
}

View file

@ -0,0 +1,5 @@
{
"version": 0,
"type": "Server.Engines.BulkOrders.SmallTailorBOD",
"properties": []
}

View file

@ -0,0 +1,21 @@
{
"version": 2,
"type": "Server.Items.BaseAddon",
"properties": [
{
"name": "Components",
"type": "System.Collections.Generic.List\u003CServer.Items.AddonComponent\u003E",
"rule": "ListMigrationRule",
"ruleArguments": [
"Server.Items.AddonComponent",
"SerializableInterfaceMigrationRule"
]
},
{
"name": "Resource",
"type": "Server.Items.CraftResource",
"rule": "EnumMigrationRule",
"ruleArguments": []
}
]
}