fix: Cleans up entity persistence. Generalizes Mobiles/Items/Guilds (#1528)

### Summary
- [X] Fixed a bug where entity persistence was serialized out of order, causing world corruption.
- [X] Fixed LastSerialized not being utilized properly and dangling references still becoming an issue.
- [X] Added a new `GenericEntityPersistence<T>` type to encapsulate `ISerializable` serialization.
- [X] Removing the custom logic and moved Items, Mobiles, Guilds, and Accounts  to GenericEntityPersistence.
- [X] Changed serialization to use the singleton pattern to reduce calling methods from stored variables.
This commit is contained in:
Kamron Batman 2023-10-01 22:10:47 -07:00 • committed by GitHub
parent e0225c6e59
commit f2de2fbb77
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 721 additions and 970 deletions

View file

@ -28,12 +28,23 @@ public enum VirtueName
Honesty
}
public static class VirtueSystem
public class VirtueSystem : GenericPersistence
{
private static readonly ILogger logger = LogFactory.GetLogger(typeof(VirtueSystem));
private static readonly Dictionary<PlayerMobile, VirtueContext> _playerVirtues = new();
private static VirtueSystem _virtueSystemPersistence;
public static void Configure()
{
_virtueSystemPersistence = new VirtueSystem();
}
public VirtueSystem() : base("Virtues", 10)
{
}
private static void FixVirtue(Mobile m, int[] virtueValues)
{
if (m is not PlayerMobile pm)
@ -52,11 +63,6 @@ public static class VirtueSystem
}
}
public static void Configure()
{
GenericPersistence.Register("Virtues", Serialize, Deserialize);
}
public static void Initialize()
{
var migrations = Mobile.VirtueMigrations;
@ -69,7 +75,7 @@ public static class VirtueSystem
}
}
private static void Serialize(IGenericWriter writer)
public override void Serialize(IGenericWriter writer)
{
writer.WriteEncodedInt(0); // version
@ -81,7 +87,7 @@ public static class VirtueSystem
}
}
private static void Deserialize(IGenericReader reader)
public override void Deserialize(IGenericReader reader)
{
reader.ReadEncodedInt(); // version
@ -99,10 +105,10 @@ public static class VirtueSystem
}
}
public static VirtueContext GetVirtues(this PlayerMobile from) =>
public static VirtueContext GetVirtues(PlayerMobile from) =>
_playerVirtues.TryGetValue(from, out var context) ? context : null;
public static VirtueContext GetOrCreateVirtues(this PlayerMobile from)
public static VirtueContext GetOrCreateVirtues(PlayerMobile from)
{
ref VirtueContext context = ref CollectionsMarshal.GetValueRefOrAddDefault(_playerVirtues, from, out bool exists);
if (!exists)
@ -114,11 +120,11 @@ public static class VirtueSystem
}
public static bool IsHighestPath(PlayerMobile from, VirtueName virtue) =>
from.GetVirtues()?.GetValue((int)virtue) >= GetMaxAmount(virtue);
GetVirtues(from)?.GetValue((int)virtue) >= GetMaxAmount(virtue);
public static VirtueLevel GetLevel(Mobile from, VirtueName virtue)
{
var v = (from as PlayerMobile)?.GetVirtues()?.GetValue((int)virtue) ?? 0;
var v = GetVirtues(from as PlayerMobile)?.GetValue((int)virtue) ?? 0;
int vl;
if (v < 4000)
@ -137,7 +143,7 @@ public static class VirtueSystem
return (VirtueLevel)vl;
}
public static string GetName(this VirtueName virtue) =>
public static string GetName(VirtueName virtue) =>
virtue switch
{
VirtueName.Humility => "Humility",
@ -151,7 +157,7 @@ public static class VirtueSystem
_ => ""
};
public static string GetLowerCaseName(this VirtueName virtue) =>
public static string GetLowerCaseName(VirtueName virtue) =>
virtue switch
{
VirtueName.Humility => "humility",
@ -240,7 +246,7 @@ public static class VirtueSystem
public static bool Atrophy(PlayerMobile from, VirtueName virtue, int amount = 1)
{
var virtues = from.GetVirtues();
var virtues = GetVirtues(from);
if (virtues == null)
{
return false;
@ -268,7 +274,7 @@ public static class VirtueSystem
public static void AwardVirtue(PlayerMobile pm, VirtueName virtue, int amount)
{
var virtues = pm.GetOrCreateVirtues();
var virtues = GetOrCreateVirtues(pm);
if (virtue == VirtueName.Compassion)
{
if (virtues.CompassionGains > 0 && Core.Now > virtues.NextCompassionDay)
@ -285,7 +291,7 @@ public static class VirtueSystem
}
var gainedPath = false;
var virtueName = virtue.GetName();
var virtueName = GetName(virtue);
if (Award(pm, virtue, amount, ref gainedPath))
{
@ -331,7 +337,7 @@ public static class VirtueSystem
}
}
public static void CheckAtrophies(this PlayerMobile pm)
public static void CheckAtrophies(PlayerMobile pm)
{
SacrificeVirtue.CheckAtrophy(pm);
JusticeVirtue.CheckAtrophy(pm);