From f7cbeacf4803058af4f43d37736e0eb3cce3d5b8 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Tue, 10 May 2022 11:57:37 -0700 Subject: [PATCH] fix: Fixes factions and makes it static (#993) --- Projects/Server/Serialization/Persistence.cs | 2 + .../Engines/Factions/Core/FactionSystem.cs | 120 ++++++++++++++++++ .../Engines/Factions/Core/Generator.cs | 2 +- .../Engines/Factions/Core/Persistance.cs | 91 ------------- .../Engines/Stealables/StealableArtifacts.cs | 7 +- 5 files changed, 129 insertions(+), 93 deletions(-) create mode 100644 Projects/UOContent/Engines/Factions/Core/FactionSystem.cs delete mode 100644 Projects/UOContent/Engines/Factions/Core/Persistance.cs diff --git a/Projects/Server/Serialization/Persistence.cs b/Projects/Server/Serialization/Persistence.cs index c4abd1458..8c76165c7 100644 --- a/Projects/Server/Serialization/Persistence.cs +++ b/Projects/Server/Serialization/Persistence.cs @@ -46,6 +46,8 @@ namespace Server ); } + public static void Unregister(string name) => _registry.RemoveWhere(entry => entry.Name == name); + public static void Load(string path) { // This should probably not be parallel since Mobiles must be loaded before Items diff --git a/Projects/UOContent/Engines/Factions/Core/FactionSystem.cs b/Projects/UOContent/Engines/Factions/Core/FactionSystem.cs new file mode 100644 index 000000000..e1513b0a4 --- /dev/null +++ b/Projects/UOContent/Engines/Factions/Core/FactionSystem.cs @@ -0,0 +1,120 @@ +using System; + +namespace Server.Factions; + +public static class FactionSystem +{ + public static bool Enabled { get; private set; } + + public static void Configure() + { + Enabled = ServerConfiguration.GetSetting("factions.enabled", false); + + if (Enabled) + { + GenericPersistence.Register("Factions", Serialize, Deserialize); + } + } + + // This does not do the actual work of removing faction stuff, only turns off the persistence. + public static void Disable() + { + if (!Enabled) + { + return; + } + + Persistence.Unregister("Factions"); + Enabled = false; + ServerConfiguration.SetSetting("factions.enabled", false); + } + + // This does not do the actual work of creating faction stuff, only turns on the persistence. + public static void Enable() + { + if (Enabled) + { + return; + } + + GenericPersistence.Register("Factions", Serialize, Deserialize); + Enabled = true; + ServerConfiguration.SetSetting("factions.enabled", true); + } + + private static void Serialize(IGenericWriter writer) + { + writer.WriteEncodedInt(0); // version + + var factions = Faction.Factions; + + for (var i = 0; i < factions.Count; i++) + { + factions[i].State.Serialize(writer); + } + + var towns = Town.Towns; + + for (var i = 0; i < towns.Count; i++) + { + towns[i].State.Serialize(writer); + } + } + + private static void Deserialize(IGenericReader reader) + { + var version = reader.ReadEncodedInt(); + + var count = reader.ReadEncodedInt(); + for (var i = 0; i < count; i++) + { + new FactionState(reader); + } + + count = reader.ReadEncodedInt(); + for (var i = 0; i < count; i++) + { + new TownState(reader); + } + } +} + +[ManualDirtyChecking] +[TypeAlias("Server.Factions.FactionPersistance")] +[Obsolete("Deprecated in favor of the static system. Only used for legacy deserialization")] +public class FactionPersistence : Item +{ + public FactionPersistence() + { + Delete(); + } + + public FactionPersistence(Serial serial) : base(serial) + { + } + + public override void Serialize(IGenericWriter writer) + { + } + + public override void Deserialize(IGenericReader reader) + { + base.Deserialize(reader); + + var version = reader.ReadInt(); + + int type; + + while ((type = reader.ReadEncodedInt()) != 0) + { + if (type == 1) + { + new FactionState(reader); + } + else if (type == 2) + { + new TownState(reader); + } + } + } +} diff --git a/Projects/UOContent/Engines/Factions/Core/Generator.cs b/Projects/UOContent/Engines/Factions/Core/Generator.cs index 13e255343..de45b99a8 100644 --- a/Projects/UOContent/Engines/Factions/Core/Generator.cs +++ b/Projects/UOContent/Engines/Factions/Core/Generator.cs @@ -11,7 +11,7 @@ namespace Server.Factions public static void GenerateFactions_OnCommand(CommandEventArgs e) { - new FactionPersistance(); + FactionSystem.Enable(); var factions = Faction.Factions; diff --git a/Projects/UOContent/Engines/Factions/Core/Persistance.cs b/Projects/UOContent/Engines/Factions/Core/Persistance.cs deleted file mode 100644 index 882ac72d0..000000000 --- a/Projects/UOContent/Engines/Factions/Core/Persistance.cs +++ /dev/null @@ -1,91 +0,0 @@ -namespace Server.Factions -{ - public class FactionPersistance : Item - { - public FactionPersistance() : base(1) - { - Movable = false; - - if (Instance?.Deleted == true) - { - Instance = this; - } - else - { - base.Delete(); - } - } - - public FactionPersistance(Serial serial) : base(serial) => Instance = this; - - public static FactionPersistance Instance { get; private set; } - - public override string DefaultName => "Faction Persistance - Internal"; - - public override void Serialize(IGenericWriter writer) - { - base.Serialize(writer); - - writer.Write(0); // version - - var factions = Faction.Factions; - - for (var i = 0; i < factions.Count; ++i) - { - writer.WriteEncodedInt((int)PersistedType.Faction); - factions[i].State.Serialize(writer); - } - - var towns = Town.Towns; - - for (var i = 0; i < towns.Count; ++i) - { - writer.WriteEncodedInt((int)PersistedType.Town); - towns[i].State.Serialize(writer); - } - - writer.WriteEncodedInt((int)PersistedType.Terminator); - } - - public override void Deserialize(IGenericReader reader) - { - base.Deserialize(reader); - - var version = reader.ReadInt(); - - switch (version) - { - case 0: - { - PersistedType type; - - while ((type = (PersistedType)reader.ReadEncodedInt()) != PersistedType.Terminator) - { - switch (type) - { - case PersistedType.Faction: - new FactionState(reader); - break; - case PersistedType.Town: - new TownState(reader); - break; - } - } - - break; - } - } - } - - public override void Delete() - { - } - - private enum PersistedType - { - Terminator, - Faction, - Town - } - } -} diff --git a/Projects/UOContent/Engines/Stealables/StealableArtifacts.cs b/Projects/UOContent/Engines/Stealables/StealableArtifacts.cs index d3e2d2219..5b2112386 100644 --- a/Projects/UOContent/Engines/Stealables/StealableArtifacts.cs +++ b/Projects/UOContent/Engines/Stealables/StealableArtifacts.cs @@ -19,7 +19,7 @@ public static class StealableArtifacts public static void Configure() { - GenericPersistence.Register("stealable-artifacts", Serialize, Deserialize); + GenericPersistence.Register("StealableArtifacts", Serialize, Deserialize); } private static void RemoveStealableArtifacts() @@ -426,12 +426,17 @@ public static class StealableArtifacts { private StealableArtifactsSpawner() { + Delete(); } public StealableArtifactsSpawner(Serial serial) : base(serial) { } + public override void Serialize(IGenericWriter writer) + { + } + public override void Deserialize(IGenericReader reader) { base.Deserialize(reader);