Merge branch 'main' into addon-tutorial

This commit is contained in:
Leath Cooper 2024-12-18 20:13:11 -05:00
commit 48e0179c25
16 changed files with 742 additions and 623 deletions

View file

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

View file

@ -34,6 +34,9 @@ Blocker 0x21A4
6082 144 -15
6082 145 -15
6082 146 -15
5920 168 16
5920 169 16
5920 170 16
6058 88 29
6058 89 29
6058 90 29
@ -138,4 +141,4 @@ Static 0x179A
3446 548 -5
3456 538 -5
3472 512 -5
3488 580 -5
3488 580 -5

View file

@ -1450,19 +1450,19 @@
"back": false
},
{
"src": { "map": "Felucca", "loc": [5905, 97, 0] },
"dst": { "map": "Felucca", "loc": [5977, 169, 0] },
"src": { "map": "Felucca", "loc": [5919, 168, 22] },
"dst": { "map": "Felucca", "loc": [6083, 144, -20] },
"back": false
},
{
"src": { "map": "Felucca", "loc": [5906, 96, 0] },
"dst": { "map": "Felucca", "loc": [5977, 169, 0] },
"src": { "map": "Felucca", "loc": [5919, 169, 22] },
"dst": { "map": "Felucca", "loc": [6083, 145, -20] },
"back": false
},
{
"src": { "map": "Felucca", "loc": [5906, 4069, 26] },
"dst": { "map": "Felucca", "loc": [2494, 3576, 5] },
"back": true
"src": { "map": "Felucca", "loc": [5919, 170, 22] },
"dst": { "map": "Felucca", "loc": [6083, 146, -20] },
"back": false
},
{
"src": { "map": "Felucca", "loc": [5918, 1410, -29] },
@ -1715,19 +1715,19 @@
"back": false
},
{
"src": { "map": "Felucca", "loc": [6039, 204, 22] },
"dst": { "map": "Felucca", "loc": [6050, 227, 44] },
"src": { "map": "Felucca", "loc": [6083, 144, -20] },
"dst": { "map": "Felucca", "loc": [5918, 168, 22] },
"back": false
},
{
"src": { "map": "Felucca", "loc": [6040, 192, 12] },
"dst": { "map": "Felucca", "loc": [6059, 88, 24] },
"back": true
"src": { "map": "Felucca", "loc": [6083, 145, -20] },
"dst": { "map": "Felucca", "loc": [5918, 169, 22] },
"back": false
},
{
"src": { "map": "Felucca", "loc": [6040, 193, 12] },
"dst": { "map": "Felucca", "loc": [6059, 89, 24] },
"back": true
"src": { "map": "Felucca", "loc": [6083, 146, -20] },
"dst": { "map": "Felucca", "loc": [5918, 170, 22] },
"back": false
},
{
"src": { "map": "Felucca", "loc": [6040, 194, 12] },
@ -3555,18 +3555,18 @@
"back": false
},
{
"src": { "map": "Trammel", "loc": [5882, 243, 0] },
"dst": { "map": "Trammel", "loc": [1998, 81, 5] },
"src": { "map": "Trammel", "loc": [5919, 168, 22] },
"dst": { "map": "Trammel", "loc": [6083, 144, -20] },
"back": false
},
{
"src": { "map": "Trammel", "loc": [5899, 1411, 43] },
"dst": { "map": "Trammel", "loc": [1630, 3320, 0] },
"src": { "map": "Trammel", "loc": [5919, 169, 22] },
"dst": { "map": "Trammel", "loc": [6083, 145, -20] },
"back": false
},
{
"src": { "map": "Trammel", "loc": [5900, 1411, 42] },
"dst": { "map": "Trammel", "loc": [1630, 3320, 0] },
"src": { "map": "Trammel", "loc": [5919, 170, 22] },
"dst": { "map": "Trammel", "loc": [6083, 146, -20] },
"back": false
},
{
@ -3805,18 +3805,18 @@
"back": false
},
{
"src": { "map": "Trammel", "loc": [6031, 1499, 42] },
"dst": { "map": "Trammel", "loc": [1491, 1640, 24] },
"src": { "map": "Trammel", "loc": [6083, 144, -20] },
"dst": { "map": "Trammel", "loc": [5918, 168, 22] },
"back": false
},
{
"src": { "map": "Trammel", "loc": [6031, 1501, 42] },
"dst": { "map": "Trammel", "loc": [1491, 1642, 24] },
"src": { "map": "Trammel", "loc": [6083, 145, -20] },
"dst": { "map": "Trammel", "loc": [5918, 169, 22] },
"back": false
},
{
"src": { "map": "Trammel", "loc": [6039, 204, 22] },
"dst": { "map": "Trammel", "loc": [6050, 227, 44] },
"src": { "map": "Trammel", "loc": [6083, 146, -20] },
"dst": { "map": "Trammel", "loc": [5918, 170, 22] },
"back": false
},
{

View file

@ -39,7 +39,7 @@
<PackageReference Include="System.IO.Hashing" Version="9.0.0" />
<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>
<AdditionalFiles Include="Migrations/*.v*.json" />

View file

@ -26,7 +26,7 @@ public class TithingGump : StaticGump<TithingGump>
// AddLabel(57, 274, 0, "Gold:");
builder.AddLabelPlaceholder(87, 274, 53, "goldOffer");
builder.AddHtmlLocalized(57, 274, 50, 20, 1079251); // Tithe:
builder.AddHtmlLocalized(137, 274, 50, 20, 1079251); // Tithe:
// AddLabel(137, 274, 0, "Tithe:");
builder.AddLabelPlaceholder(172, 274, 53, "titheOffer");

View file

@ -14,6 +14,8 @@ namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class DisguiseKit : Item
{
public override int LabelNumber => 1041078; // a disguise kit
[Constructible]
public DisguiseKit() : base(0xE05) => Weight = 1.0;

View file

@ -1,3 +1,4 @@
using System.Collections.Generic;
using ModernUO.Serialization;
using Server.Multis;
@ -16,7 +17,8 @@ public partial class HolidayTree : Item, IAddon
[SerializedCommandProperty(AccessLevel.GameMaster)]
private Mobile _placer;
private Item[] _components;
[SerializableField(1, setter: "private")]
private List<Item> _components;
public HolidayTree(Mobile from, HolidayTreeType type, Point3D loc) : base(1)
{
@ -25,75 +27,72 @@ public partial class HolidayTree : Item, IAddon
Placer = from;
var index = 0;
switch (type)
{
case HolidayTreeType.Classic:
{
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, index++);
AddOrnament(0, 0, 9, 0xF18, index++);
AddOrnament(0, 0, 15, 0xF20, index++);
AddOrnament(0, 0, 19, 0xF17, index++);
AddOrnament(0, 0, 20, 0xF24, index++);
AddOrnament(0, 0, 20, 0xF1F, index++);
AddOrnament(0, 0, 20, 0xF19, index++);
AddOrnament(0, 0, 21, 0xF1B, index++);
AddOrnament(0, 0, 28, 0xF2F, index++);
AddOrnament(0, 0, 30, 0xF23, index++);
AddOrnament(0, 0, 32, 0xF2A, index++);
AddOrnament(0, 0, 33, 0xF30, index++);
AddOrnament(0, 0, 34, 0xF29, index++);
AddOrnament(0, 1, 7, 0xF16, index++);
AddOrnament(0, 1, 7, 0xF1E, index++);
AddOrnament(0, 1, 12, 0xF0F, index++);
AddOrnament(0, 1, 13, 0xF13, index++);
AddOrnament(0, 1, 18, 0xF12, index++);
AddOrnament(0, 1, 19, 0xF15, index++);
AddOrnament(0, 1, 25, 0xF28, index++);
AddOrnament(0, 1, 29, 0xF1A, index++);
AddOrnament(0, 1, 37, 0xF2B, index++);
AddOrnament(1, 0, 13, 0xF10, index++);
AddOrnament(1, 0, 14, 0xF1C, index++);
AddOrnament(1, 0, 16, 0xF14, index++);
AddOrnament(1, 0, 17, 0xF26, index++);
AddOrnament(1, 0, 22, 0xF27, index);
AddOrnament(0, 0, 2, 0xF22);
AddOrnament(0, 0, 9, 0xF18);
AddOrnament(0, 0, 15, 0xF20);
AddOrnament(0, 0, 19, 0xF17);
AddOrnament(0, 0, 20, 0xF24);
AddOrnament(0, 0, 20, 0xF1F);
AddOrnament(0, 0, 20, 0xF19);
AddOrnament(0, 0, 21, 0xF1B);
AddOrnament(0, 0, 28, 0xF2F);
AddOrnament(0, 0, 30, 0xF23);
AddOrnament(0, 0, 32, 0xF2A);
AddOrnament(0, 0, 33, 0xF30);
AddOrnament(0, 0, 34, 0xF29);
AddOrnament(0, 1, 7, 0xF16);
AddOrnament(0, 1, 7, 0xF1E);
AddOrnament(0, 1, 12, 0xF0F);
AddOrnament(0, 1, 13, 0xF13);
AddOrnament(0, 1, 18, 0xF12);
AddOrnament(0, 1, 19, 0xF15);
AddOrnament(0, 1, 25, 0xF28);
AddOrnament(0, 1, 29, 0xF1A);
AddOrnament(0, 1, 37, 0xF2B);
AddOrnament(1, 0, 13, 0xF10);
AddOrnament(1, 0, 14, 0xF1C);
AddOrnament(1, 0, 16, 0xF14);
AddOrnament(1, 0, 17, 0xF26);
AddOrnament(1, 0, 22, 0xF27);
break;
}
case HolidayTreeType.Modern:
{
ItemID = 0x1B7E;
_components = new Item[23];
AddOrnament(0, 0, 2, 0xF2F, index++);
AddOrnament(0, 0, 2, 0xF20, index++);
AddOrnament(0, 0, 2, 0xF22, index++);
AddOrnament(0, 0, 5, 0xF30, index++);
AddOrnament(0, 0, 5, 0xF15, index++);
AddOrnament(0, 0, 5, 0xF1F, index++);
AddOrnament(0, 0, 5, 0xF2B, index++);
AddOrnament(0, 0, 6, 0xF0F, index++);
AddOrnament(0, 0, 7, 0xF1E, index++);
AddOrnament(0, 0, 7, 0xF24, index++);
AddOrnament(0, 0, 8, 0xF29, index++);
AddOrnament(0, 0, 9, 0xF18, index++);
AddOrnament(0, 0, 14, 0xF1C, index++);
AddOrnament(0, 0, 15, 0xF13, index++);
AddOrnament(0, 0, 15, 0xF20, index++);
AddOrnament(0, 0, 16, 0xF26, index++);
AddOrnament(0, 0, 17, 0xF12, index++);
AddOrnament(0, 0, 18, 0xF17, index++);
AddOrnament(0, 0, 20, 0xF1B, index++);
AddOrnament(0, 0, 23, 0xF28, index++);
AddOrnament(0, 0, 25, 0xF18, index++);
AddOrnament(0, 0, 25, 0xF2A, index++);
AddOrnament(0, 1, 7, 0xF16, index);
_components = new List<Item>(23);
AddOrnament(0, 0, 2, 0xF2F);
AddOrnament(0, 0, 2, 0xF20);
AddOrnament(0, 0, 2, 0xF22);
AddOrnament(0, 0, 5, 0xF30);
AddOrnament(0, 0, 5, 0xF15);
AddOrnament(0, 0, 5, 0xF1F);
AddOrnament(0, 0, 5, 0xF2B);
AddOrnament(0, 0, 6, 0xF0F);
AddOrnament(0, 0, 7, 0xF1E);
AddOrnament(0, 0, 7, 0xF24);
AddOrnament(0, 0, 8, 0xF29);
AddOrnament(0, 0, 9, 0xF18);
AddOrnament(0, 0, 14, 0xF1C);
AddOrnament(0, 0, 15, 0xF13);
AddOrnament(0, 0, 15, 0xF20);
AddOrnament(0, 0, 16, 0xF26);
AddOrnament(0, 0, 17, 0xF12);
AddOrnament(0, 0, 18, 0xF17);
AddOrnament(0, 0, 20, 0xF1B);
AddOrnament(0, 0, 23, 0xF28);
AddOrnament(0, 0, 25, 0xF18);
AddOrnament(0, 0, 25, 0xF2A);
AddOrnament(0, 1, 7, 0xF16);
break;
}
}
@ -107,24 +106,24 @@ public partial class HolidayTree : Item, IAddon
public override void OnAfterDelete()
{
for (var i = 0; i < _components.Length; ++i)
foreach (var c in _components)
{
_components[i]?.Delete();
c?.Delete();
}
_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);
_components[index] = item;
_components.Add(item);
}
private void Deserialize(IGenericReader reader, int version)
@ -133,8 +132,6 @@ public partial class HolidayTree : Item, IAddon
var count = reader.ReadInt();
_components = new Item[count];
for (var i = 0; i < count; ++i)
{
var item = reader.ReadEntity<Item>();
@ -149,7 +146,8 @@ public partial class HolidayTree : Item, IAddon
[AfterDeserialization(false)]
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();
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.
}
[SerializationGenerator(0, false)]
private partial class Ornament : Item
[SerializationGenerator(1, false)]
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)]
private partial class TreeTrunk : Item
[SerializationGenerator(1, false)]
public partial class TreeTrunk : Item
{
[SerializableField(0)]
private HolidayTree _tree;
public TreeTrunk(HolidayTree tree, int itemID) : base(itemID)
@ -208,5 +232,22 @@ public partial class HolidayTree : Item, IAddon
_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,
"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,
"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",
"type": "Server.Mobile",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Components",
"type": "System.Collections.Generic.List\u003CServer.Item\u003E",
"rule": "ListMigrationRule",
"ruleArguments": [
"Server.Item",
"SerializableInterfaceMigrationRule"
]
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -291,7 +291,7 @@ namespace Server.Misc
if (karma <= ke.m_Karma || j == karmaEntries.Length - 1)
{
if (karma >= 10000)
if (fame >= 10000)
{
if (beheld.Female)
{

View file

@ -80,7 +80,7 @@ public class BloodOathSpell : NecromancerSpell, ITargetingSpell<Mobile>
m.FixedParticles(0x375A, 1, 17, 9919, 33, 7, EffectLayer.Waist);
m.FixedParticles(0x3728, 1, 13, 9502, 33, 7, (EffectLayer)255);
var duration = TimeSpan.FromSeconds((GetDamageSkill(Caster) - GetResistSkill(m)) / 8 + 8);
var duration = TimeSpan.FromSeconds((GetDamageSkill(Caster) - GetResistSkill(m)) / 80 + 8);
m.CheckSkill(SkillName.MagicResist, 0.0, 120.0); // Skill check for gain
var timer = new ExpireTimer(Caster, m, duration);
@ -101,28 +101,28 @@ public class BloodOathSpell : NecromancerSpell, ITargetingSpell<Mobile>
public static bool RemoveCurse(Mobile target)
{
if (_table.Remove(target, out var timer))
if (!_table.Remove(target, out var timer))
{
var caster = timer.Caster;
if (_oathTable.Remove(caster))
{
caster.SendLocalizedMessage(1061620); // Your Blood Oath has been broken.
}
if (_oathTable.Remove(target))
{
target.SendLocalizedMessage(1061620); // Your Blood Oath has been broken.
}
timer.Stop();
BuffInfo.RemoveBuff(caster, BuffIcon.BloodOathCaster);
BuffInfo.RemoveBuff(target, BuffIcon.BloodOathCurse);
return true;
return false;
}
return false;
var caster = timer.Caster;
if (_oathTable.Remove(caster))
{
caster.SendLocalizedMessage(1061620); // Your Blood Oath has been broken.
}
if (_oathTable.Remove(target))
{
target.SendLocalizedMessage(1061620); // Your Blood Oath has been broken.
}
timer.Stop();
BuffInfo.RemoveBuff(caster, BuffIcon.BloodOathCaster);
BuffInfo.RemoveBuff(target, BuffIcon.BloodOathCurse);
return true;
}
public static Mobile GetBloodOath(Mobile m) =>
@ -130,8 +130,8 @@ public class BloodOathSpell : NecromancerSpell, ITargetingSpell<Mobile>
private class ExpireTimer : Timer
{
private Mobile _target;
private DateTime _end;
private readonly Mobile _target;
private readonly DateTime _end;
public Mobile Caster { get; }
@ -147,8 +147,7 @@ public class BloodOathSpell : NecromancerSpell, ITargetingSpell<Mobile>
protected override void OnTick()
{
if (Caster.Deleted || _target.Deleted || !Caster.Alive || !_target.Alive ||
Core.Now >= _end)
if (Caster.Deleted || _target.Deleted || !Caster.Alive || !_target.Alive || Core.Now >= _end)
{
RemoveCurse(_target);
}

View file

@ -47,7 +47,7 @@
<PackageReference Include="Zstd.Binaries" Version="1.6.0" />
<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>
<AdditionalFiles Include="Migrations/*.v*.json" />