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:
parent
e0225c6e59
commit
f2de2fbb77
34 changed files with 721 additions and 970 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue