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..188af687 --- /dev/null +++ b/src/Commands/Handler/Buildings/BuildingUpdateFlagsHandler.cs @@ -0,0 +1,19 @@ +using System; +using CSM.Commands.Data.Buildings; +using CSM.Helpers; +using CSM.Injections; + +namespace CSM.Commands.Handler.Buildings +{ + public class BuildingUpdateFlagsHandler : CommandHandler + { + 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..837e8253 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,39 @@ 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; + } + + __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(); + + Command.SendToAll(new BuildingUpdateFlagsCommand() + { + Building = building, + ChangeMask = changeMask + }); + } + } }