From 6b1bcd5d93bffc7b7ace7be3ab799df79d9dd1a9 Mon Sep 17 00:00:00 2001 From: Naeem Al Noman Date: Sat, 4 Apr 2020 11:30:57 +0800 Subject: [PATCH 1/2] UpdateFlags Injection to fix abandoned statuses --- .../Buildings/BuildingUpdateFlagsCommand.cs | 25 +++++++++++ .../Buildings/BuildingUpdateFlagsHandler.cs | 22 ++++++++++ src/Injections/BuildingHandler.cs | 44 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/Commands/Data/Buildings/BuildingUpdateFlagsCommand.cs create mode 100644 src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs diff --git a/src/Commands/Data/Buildings/BuildingUpdateFlagsCommand.cs b/src/Commands/Data/Buildings/BuildingUpdateFlagsCommand.cs new file mode 100644 index 00000000..2143961c --- /dev/null +++ b/src/Commands/Data/Buildings/BuildingUpdateFlagsCommand.cs @@ -0,0 +1,25 @@ +using ProtoBuf; + +namespace CSM.Commands.Data.Buildings +{ + /// + /// Called when any building needs to update its flags (Construction Status, Needs Status) + /// + /// Sent by: + /// - BuildingHandler + [ProtoContract] + public class BuildingUpdateFlagsCommand : CommandBase + { + /// + /// The id of the building that was rebuilt. + /// + [ProtoMember(1)] + public ushort Building { get; set; } + + /// + /// The Mask of Flags that is passed to UpdateFlags function + /// + [ProtoMember(2)] + public Building.Flags ChangeMask { get; set; } + } +} diff --git a/src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs b/src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs new file mode 100644 index 00000000..68e30137 --- /dev/null +++ b/src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs @@ -0,0 +1,22 @@ +using System; +using CSM.Commands.Data.Buildings; +using CSM.Helpers; +using CSM.Injections; + +namespace CSM.Commands.Handler.Buildings +{ + public class BuildingUpdateFlagsHandler : CommandHandler + { + private static object rebuildClickedDelegate; + private static Type delegateType = null; + + protected override void Handle(BuildingUpdateFlagsCommand command) + { + IgnoreHelper.StartIgnore(); + + BuildingManager.instance.UpdateFlags(command.Building, command.ChangeMask); + + IgnoreHelper.EndIgnore(); + } + } +} diff --git a/src/Injections/BuildingHandler.cs b/src/Injections/BuildingHandler.cs index 7491e261..25555fa5 100644 --- a/src/Injections/BuildingHandler.cs +++ b/src/Injections/BuildingHandler.cs @@ -6,6 +6,7 @@ using CSM.Helpers; using HarmonyLib; using UnityEngine; +using ColossalFramework; namespace CSM.Injections { @@ -398,4 +399,47 @@ public static void Prefix(ushort buildingID, ref Building data, bool historical, }); } } + + [HarmonyPatch(typeof(BuildingManager))] + [HarmonyPatch("UpdateFlags")] + public class UpgradeFlags + { + public static void Prefix(ushort building, ref Building.Flags changeMask, out bool __state) + { + if (IgnoreHelper.IsIgnored()) + { + __state = false; + return; + } + + Building b = BuildingManager.instance.m_buildings.m_buffer[building]; + Debug.Log("Initial B Status: " + (b.m_flags.IsFlagSet(Building.Flags.Abandoned) ? "Abandoned": "Not Abandoned")); + Debug.Log("Initial B Flags: " + b.m_flags); + Debug.Log("Mask: " + changeMask); + __state = true; + + + ArrayHandler.StartCollecting(); + IgnoreHelper.StartIgnore(); + } + + public static void Postfix(ushort building, ref Building.Flags changeMask, ref bool __state) + { + if (!__state) + return; + + IgnoreHelper.EndIgnore(); + ArrayHandler.StopCollecting(); + + Building b = BuildingManager.instance.m_buildings.m_buffer[building]; + Debug.Log("Later B Status: " + (b.m_flags.IsFlagSet(Building.Flags.Abandoned) ? "Abandoned" : "Not Abandoned")); + Debug.Log("Later B Flags: " + b.m_flags); + + Command.SendToAll(new BuildingUpdateFlagsCommand() + { + Building = building, + ChangeMask = changeMask + }); + } + } } From 147eaa58397d492c391d5b6bad3f32c800069fc6 Mon Sep 17 00:00:00 2001 From: Naeem Al Noman Date: Sat, 4 Apr 2020 11:35:35 +0800 Subject: [PATCH 2/2] Remove unnecessary stuff --- .../Handler/Buildings/BuildingUpdateFlagsHandler.cs | 3 --- src/Injections/BuildingHandler.cs | 8 -------- 2 files changed, 11 deletions(-) diff --git a/src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs b/src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs index 68e30137..188af687 100644 --- a/src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs +++ b/src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs @@ -7,9 +7,6 @@ namespace CSM.Commands.Handler.Buildings { public class BuildingUpdateFlagsHandler : CommandHandler { - private static object rebuildClickedDelegate; - private static Type delegateType = null; - protected override void Handle(BuildingUpdateFlagsCommand command) { IgnoreHelper.StartIgnore(); diff --git a/src/Injections/BuildingHandler.cs b/src/Injections/BuildingHandler.cs index 25555fa5..837e8253 100644 --- a/src/Injections/BuildingHandler.cs +++ b/src/Injections/BuildingHandler.cs @@ -412,10 +412,6 @@ public static void Prefix(ushort building, ref Building.Flags changeMask, out bo return; } - Building b = BuildingManager.instance.m_buildings.m_buffer[building]; - Debug.Log("Initial B Status: " + (b.m_flags.IsFlagSet(Building.Flags.Abandoned) ? "Abandoned": "Not Abandoned")); - Debug.Log("Initial B Flags: " + b.m_flags); - Debug.Log("Mask: " + changeMask); __state = true; @@ -431,10 +427,6 @@ public static void Postfix(ushort building, ref Building.Flags changeMask, ref b IgnoreHelper.EndIgnore(); ArrayHandler.StopCollecting(); - Building b = BuildingManager.instance.m_buildings.m_buffer[building]; - Debug.Log("Later B Status: " + (b.m_flags.IsFlagSet(Building.Flags.Abandoned) ? "Abandoned" : "Not Abandoned")); - Debug.Log("Later B Flags: " + b.m_flags); - Command.SendToAll(new BuildingUpdateFlagsCommand() { Building = building,