fix: Fix HolidayTree not serializing components (#2024)

This commit is contained in:
Reetus 2024-12-17 23:59:50 +07:00 committed by GitHub
parent d9e5ec91e1
commit f33e218c0b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 163 additions and 77 deletions

View file

@ -3,7 +3,7 @@
"isRoot": true, "isRoot": true,
"tools": { "tools": {
"modernuoschemagenerator": { "modernuoschemagenerator": {
"version": "2.12.10", "version": "2.12.13",
"commands": [ "commands": [
"ModernUOSchemaGenerator" "ModernUOSchemaGenerator"
] ]

View file

@ -39,7 +39,7 @@
<PackageReference Include="System.IO.Hashing" Version="9.0.0" /> <PackageReference Include="System.IO.Hashing" Version="9.0.0" />
<PackageReference Include="ModernUO.Serialization.Annotations" Version="2.9.1" /> <PackageReference Include="ModernUO.Serialization.Annotations" Version="2.9.1" />
<PackageReference Include="ModernUO.Serialization.Generator" Version="2.12.10" /> <PackageReference Include="ModernUO.Serialization.Generator" Version="2.12.13" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<AdditionalFiles Include="Migrations/*.v*.json" /> <AdditionalFiles Include="Migrations/*.v*.json" />

View file

@ -1,3 +1,4 @@
using System.Collections.Generic;
using ModernUO.Serialization; using ModernUO.Serialization;
using Server.Multis; using Server.Multis;
@ -16,7 +17,8 @@ public partial class HolidayTree : Item, IAddon
[SerializedCommandProperty(AccessLevel.GameMaster)] [SerializedCommandProperty(AccessLevel.GameMaster)]
private Mobile _placer; private Mobile _placer;
private Item[] _components; [SerializableField(1, setter: "private")]
private List<Item> _components;
public HolidayTree(Mobile from, HolidayTreeType type, Point3D loc) : base(1) public HolidayTree(Mobile from, HolidayTreeType type, Point3D loc) : base(1)
{ {
@ -25,75 +27,72 @@ public partial class HolidayTree : Item, IAddon
Placer = from; Placer = from;
var index = 0;
switch (type) switch (type)
{ {
case HolidayTreeType.Classic: case HolidayTreeType.Classic:
{ {
ItemID = 0xCD7; ItemID = 0xCD7;
_components = new Item[28]; _components = new List<Item>(28);
AddItem(0, 0, 0, new TreeTrunk(this, 0xCD6));
AddItem(0, 0, 0, new TreeTrunk(this, 0xCD6), index++); AddOrnament(0, 0, 2, 0xF22);
AddOrnament(0, 0, 9, 0xF18);
AddOrnament(0, 0, 2, 0xF22, index++); AddOrnament(0, 0, 15, 0xF20);
AddOrnament(0, 0, 9, 0xF18, index++); AddOrnament(0, 0, 19, 0xF17);
AddOrnament(0, 0, 15, 0xF20, index++); AddOrnament(0, 0, 20, 0xF24);
AddOrnament(0, 0, 19, 0xF17, index++); AddOrnament(0, 0, 20, 0xF1F);
AddOrnament(0, 0, 20, 0xF24, index++); AddOrnament(0, 0, 20, 0xF19);
AddOrnament(0, 0, 20, 0xF1F, index++); AddOrnament(0, 0, 21, 0xF1B);
AddOrnament(0, 0, 20, 0xF19, index++); AddOrnament(0, 0, 28, 0xF2F);
AddOrnament(0, 0, 21, 0xF1B, index++); AddOrnament(0, 0, 30, 0xF23);
AddOrnament(0, 0, 28, 0xF2F, index++); AddOrnament(0, 0, 32, 0xF2A);
AddOrnament(0, 0, 30, 0xF23, index++); AddOrnament(0, 0, 33, 0xF30);
AddOrnament(0, 0, 32, 0xF2A, index++); AddOrnament(0, 0, 34, 0xF29);
AddOrnament(0, 0, 33, 0xF30, index++); AddOrnament(0, 1, 7, 0xF16);
AddOrnament(0, 0, 34, 0xF29, index++); AddOrnament(0, 1, 7, 0xF1E);
AddOrnament(0, 1, 7, 0xF16, index++); AddOrnament(0, 1, 12, 0xF0F);
AddOrnament(0, 1, 7, 0xF1E, index++); AddOrnament(0, 1, 13, 0xF13);
AddOrnament(0, 1, 12, 0xF0F, index++); AddOrnament(0, 1, 18, 0xF12);
AddOrnament(0, 1, 13, 0xF13, index++); AddOrnament(0, 1, 19, 0xF15);
AddOrnament(0, 1, 18, 0xF12, index++); AddOrnament(0, 1, 25, 0xF28);
AddOrnament(0, 1, 19, 0xF15, index++); AddOrnament(0, 1, 29, 0xF1A);
AddOrnament(0, 1, 25, 0xF28, index++); AddOrnament(0, 1, 37, 0xF2B);
AddOrnament(0, 1, 29, 0xF1A, index++); AddOrnament(1, 0, 13, 0xF10);
AddOrnament(0, 1, 37, 0xF2B, index++); AddOrnament(1, 0, 14, 0xF1C);
AddOrnament(1, 0, 13, 0xF10, index++); AddOrnament(1, 0, 16, 0xF14);
AddOrnament(1, 0, 14, 0xF1C, index++); AddOrnament(1, 0, 17, 0xF26);
AddOrnament(1, 0, 16, 0xF14, index++); AddOrnament(1, 0, 22, 0xF27);
AddOrnament(1, 0, 17, 0xF26, index++);
AddOrnament(1, 0, 22, 0xF27, index);
break; break;
} }
case HolidayTreeType.Modern: case HolidayTreeType.Modern:
{ {
ItemID = 0x1B7E; ItemID = 0x1B7E;
_components = new Item[23];
AddOrnament(0, 0, 2, 0xF2F, index++); _components = new List<Item>(23);
AddOrnament(0, 0, 2, 0xF20, index++); AddOrnament(0, 0, 2, 0xF2F);
AddOrnament(0, 0, 2, 0xF22, index++); AddOrnament(0, 0, 2, 0xF20);
AddOrnament(0, 0, 5, 0xF30, index++); AddOrnament(0, 0, 2, 0xF22);
AddOrnament(0, 0, 5, 0xF15, index++); AddOrnament(0, 0, 5, 0xF30);
AddOrnament(0, 0, 5, 0xF1F, index++); AddOrnament(0, 0, 5, 0xF15);
AddOrnament(0, 0, 5, 0xF2B, index++); AddOrnament(0, 0, 5, 0xF1F);
AddOrnament(0, 0, 6, 0xF0F, index++); AddOrnament(0, 0, 5, 0xF2B);
AddOrnament(0, 0, 7, 0xF1E, index++); AddOrnament(0, 0, 6, 0xF0F);
AddOrnament(0, 0, 7, 0xF24, index++); AddOrnament(0, 0, 7, 0xF1E);
AddOrnament(0, 0, 8, 0xF29, index++); AddOrnament(0, 0, 7, 0xF24);
AddOrnament(0, 0, 9, 0xF18, index++); AddOrnament(0, 0, 8, 0xF29);
AddOrnament(0, 0, 14, 0xF1C, index++); AddOrnament(0, 0, 9, 0xF18);
AddOrnament(0, 0, 15, 0xF13, index++); AddOrnament(0, 0, 14, 0xF1C);
AddOrnament(0, 0, 15, 0xF20, index++); AddOrnament(0, 0, 15, 0xF13);
AddOrnament(0, 0, 16, 0xF26, index++); AddOrnament(0, 0, 15, 0xF20);
AddOrnament(0, 0, 17, 0xF12, index++); AddOrnament(0, 0, 16, 0xF26);
AddOrnament(0, 0, 18, 0xF17, index++); AddOrnament(0, 0, 17, 0xF12);
AddOrnament(0, 0, 20, 0xF1B, index++); AddOrnament(0, 0, 18, 0xF17);
AddOrnament(0, 0, 23, 0xF28, index++); AddOrnament(0, 0, 20, 0xF1B);
AddOrnament(0, 0, 25, 0xF18, index++); AddOrnament(0, 0, 23, 0xF28);
AddOrnament(0, 0, 25, 0xF2A, index++); AddOrnament(0, 0, 25, 0xF18);
AddOrnament(0, 1, 7, 0xF16, index); AddOrnament(0, 0, 25, 0xF2A);
AddOrnament(0, 1, 7, 0xF16);
break; break;
} }
} }
@ -107,24 +106,24 @@ public partial class HolidayTree : Item, IAddon
public override void OnAfterDelete() public override void OnAfterDelete()
{ {
for (var i = 0; i < _components.Length; ++i) foreach (var c in _components)
{ {
_components[i]?.Delete(); c?.Delete();
} }
_components = null; _components = null;
} }
private void AddOrnament(int x, int y, int z, int itemID, int index) private void AddOrnament(int x, int y, int z, int itemID)
{ {
AddItem(x + 1, y + 1, z + 11, new Ornament(itemID), index); AddItem(x + 1, y + 1, z + 11, new Ornament(this, itemID));
} }
private void AddItem(int x, int y, int z, Item item, int index) private void AddItem(int x, int y, int z, Item item)
{ {
item.MoveToWorld(new Point3D(Location.X + x, Location.Y + y, Location.Z + z), Map); item.MoveToWorld(new Point3D(Location.X + x, Location.Y + y, Location.Z + z), Map);
_components[index] = item; _components.Add(item);
} }
private void Deserialize(IGenericReader reader, int version) private void Deserialize(IGenericReader reader, int version)
@ -133,8 +132,6 @@ public partial class HolidayTree : Item, IAddon
var count = reader.ReadInt(); var count = reader.ReadInt();
_components = new Item[count];
for (var i = 0; i < count; ++i) for (var i = 0; i < count; ++i)
{ {
var item = reader.ReadEntity<Item>(); var item = reader.ReadEntity<Item>();
@ -149,7 +146,8 @@ public partial class HolidayTree : Item, IAddon
[AfterDeserialization(false)] [AfterDeserialization(false)]
private void AfterDeserialization() private void AfterDeserialization()
{ {
if (BaseHouse.FindHouseAt(this) == null) // Bug with older trees, or trees that belong to a house that doesn't exist should be redeeded.
if (_components == null || _components.Count == 0 || BaseHouse.FindHouseAt(this) == null)
{ {
var deed = new HolidayTreeDeed(); var deed = new HolidayTreeDeed();
deed.MoveToWorld(Location, Map); deed.MoveToWorld(Location, Map);
@ -179,17 +177,43 @@ public partial class HolidayTree : Item, IAddon
from.SendLocalizedMessage(503393); // A deed for the tree has been placed in your backpack. from.SendLocalizedMessage(503393); // A deed for the tree has been placed in your backpack.
} }
[SerializationGenerator(0, false)] [SerializationGenerator(1, false)]
private partial class Ornament : Item public partial class Ornament : Item
{ {
public Ornament(int itemID) : base(itemID) => Movable = false; [SerializableField(0)]
private HolidayTree _tree;
public override int LabelNumber => 1041118; // a tree ornament public Ornament(HolidayTree tree, int itemID) : base(itemID)
{
Movable = false;
_tree = tree;
}
public override int LabelNumber => 1041118; // a tree ornaments
[AfterDeserialization]
private void AfterDeserialization()
{
if (_tree == null)
{
Timer.DelayCall(Delete); // There was an issue and old trees will be regenerated
}
else
{
_tree._components.Add(this);
}
}
private void MigrateFrom(V0Content content)
{
}
} }
[SerializationGenerator(0, false)] [SerializationGenerator(1, false)]
private partial class TreeTrunk : Item public partial class TreeTrunk : Item
{ {
[SerializableField(0)]
private HolidayTree _tree; private HolidayTree _tree;
public TreeTrunk(HolidayTree tree, int itemID) : base(itemID) public TreeTrunk(HolidayTree tree, int itemID) : base(itemID)
@ -208,5 +232,22 @@ public partial class HolidayTree : Item, IAddon
_tree.OnDoubleClick(from); _tree.OnDoubleClick(from);
} }
} }
[AfterDeserialization]
private void AfterDeserialization()
{
if (_tree == null)
{
Timer.DelayCall(Delete); // There was an issue and old trees will be regenerated
}
else
{
_tree._components.Add(this);
}
}
private void MigrateFrom(V0Content content)
{
}
} }
} }

View file

@ -1,4 +1,11 @@
{ {
"version": 0, "version": 0,
"type": "Server.Items.HolidayTree.Ornament" "type": "Server.Items.HolidayTree.Ornament",
"properties": [
{
"name": "Tree",
"type": "Server.Items.HolidayTree",
"rule": "SerializableInterfaceMigrationRule"
}
]
} }

View file

@ -0,0 +1,11 @@
{
"version": 1,
"type": "Server.Items.HolidayTree.Ornament",
"properties": [
{
"name": "Tree",
"type": "Server.Items.HolidayTree",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -1,4 +1,11 @@
{ {
"version": 0, "version": 0,
"type": "Server.Items.HolidayTree.TreeTrunk" "type": "Server.Items.HolidayTree.TreeTrunk",
"properties": [
{
"name": "Tree",
"type": "Server.Items.HolidayTree",
"rule": "SerializableInterfaceMigrationRule"
}
]
} }

View file

@ -0,0 +1,11 @@
{
"version": 1,
"type": "Server.Items.HolidayTree.TreeTrunk",
"properties": [
{
"name": "Tree",
"type": "Server.Items.HolidayTree",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -6,6 +6,15 @@
"name": "Placer", "name": "Placer",
"type": "Server.Mobile", "type": "Server.Mobile",
"rule": "SerializableInterfaceMigrationRule" "rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Components",
"type": "System.Collections.Generic.List\u003CServer.Item\u003E",
"rule": "ListMigrationRule",
"ruleArguments": [
"Server.Item",
"SerializableInterfaceMigrationRule"
]
} }
] ]
} }

View file

@ -47,7 +47,7 @@
<PackageReference Include="Zstd.Binaries" Version="1.6.0" /> <PackageReference Include="Zstd.Binaries" Version="1.6.0" />
<PackageReference Include="ModernUO.Serialization.Annotations" Version="2.9.1" /> <PackageReference Include="ModernUO.Serialization.Annotations" Version="2.9.1" />
<PackageReference Include="ModernUO.Serialization.Generator" Version="2.12.10" /> <PackageReference Include="ModernUO.Serialization.Generator" Version="2.12.13" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<AdditionalFiles Include="Migrations/*.v*.json" /> <AdditionalFiles Include="Migrations/*.v*.json" />