From 43ed0a93006e962a08144d9170bb118d427c5c04 Mon Sep 17 00:00:00 2001 From: Shanyu Juneja Date: Sat, 26 Feb 2022 18:50:48 +0100 Subject: [PATCH 1/3] Begun works on natural disasters sync --- .../Data/Disasters/DisasterCreateCommand.cs | 22 +++++ .../Data/Disasters/DisasterStartCommand.cs | 43 ++++++++++ .../Disasters/DisasterCreateHandler.cs | 32 ++++++++ .../Handler/Disasters/DisasterStartHandler.cs | 21 +++++ src/Extensions/DisastersExtension.cs | 82 +++++++++++++++++++ src/Helpers/DisasterHelper.cs | 61 ++++++++++++++ 6 files changed, 261 insertions(+) create mode 100644 src/Commands/Data/Disasters/DisasterCreateCommand.cs create mode 100644 src/Commands/Data/Disasters/DisasterStartCommand.cs create mode 100644 src/Commands/Handler/Disasters/DisasterCreateHandler.cs create mode 100644 src/Commands/Handler/Disasters/DisasterStartHandler.cs create mode 100644 src/Extensions/DisastersExtension.cs create mode 100644 src/Helpers/DisasterHelper.cs diff --git a/src/Commands/Data/Disasters/DisasterCreateCommand.cs b/src/Commands/Data/Disasters/DisasterCreateCommand.cs new file mode 100644 index 00000000..d0661546 --- /dev/null +++ b/src/Commands/Data/Disasters/DisasterCreateCommand.cs @@ -0,0 +1,22 @@ +using ProtoBuf; + +namespace CSM.Commands.Data.Disasters +{ + /// + /// Sent when a loan has been paid back. + /// + /// Sent by: + /// - EconomyHandler + [ProtoContract] + public class DisasterStartCommand : CommandBase + { + [ProtoMember(1)] + public ushort Id { get; set; } + + /// + /// The client id of the disconnected user (to clear caches). + /// + [ProtoMember(2)] + public int ClientId { get; set; } + } +} \ No newline at end of file diff --git a/src/Commands/Data/Disasters/DisasterStartCommand.cs b/src/Commands/Data/Disasters/DisasterStartCommand.cs new file mode 100644 index 00000000..796e5648 --- /dev/null +++ b/src/Commands/Data/Disasters/DisasterStartCommand.cs @@ -0,0 +1,43 @@ +using ProtoBuf; + +namespace CSM.Commands.Data.Disasters +{ + /// + /// Sent when a loan has been paid back. + /// + /// Sent by: + /// - EconomyHandler + [ProtoContract] + public class DisasterCreateCommand : CommandBase + { + [ProtoMember(1)] + public ushort Id { get; set; } + + [ProtoMember(2)] + public DisasterType Type { get; set; } + + [ProtoMember(3)] + public string Name { get; set; } + + [ProtoMember(4)] + public float TargetX { get; set; } + + [ProtoMember(5)] + public float TargetY { get; set; } + + [ProtoMember(6)] + public float TargetZ { get; set; } + + [ProtoMember(7)] + public float Angle { get; set; } + + [ProtoMember(8)] + public byte Intensity { get; set; } + + /// + /// The client id of the disconnected user (to clear caches). + /// + [ProtoMember(9)] + public int ClientId { get; set; } + } +} \ No newline at end of file diff --git a/src/Commands/Handler/Disasters/DisasterCreateHandler.cs b/src/Commands/Handler/Disasters/DisasterCreateHandler.cs new file mode 100644 index 00000000..78215da8 --- /dev/null +++ b/src/Commands/Handler/Disasters/DisasterCreateHandler.cs @@ -0,0 +1,32 @@ +using CSM.Commands.Data.Game; +using CSM.Helpers; + +namespace CSM.Commands.Handler.Disasters +{ + public class DisasterCreateHandler : CommandHandler + { + + public DisasterCreateHandler() + { + } + + protected override void Handle(DisasterCreateCommand command) + { + IgnoreHelper.StartIgnore(); + DisasterSettings settings = new DisasterSettings() + { + type = command.Type, + name = command.Name, + targetX = command.TargetX, + targetY = command.TargetY, + targetZ = command.TargetZ, + angle = command.Angle, + intensity = command.Intensity + }; + + ushort local = DisasterManager.instance.m_DisasterWrapper.CreateDisaster(settings); + DisablerHelper.receiveCreate(command.ClientId, command.Id, local); + IgnoreHelper.EndIgnore(); + } + } +} diff --git a/src/Commands/Handler/Disasters/DisasterStartHandler.cs b/src/Commands/Handler/Disasters/DisasterStartHandler.cs new file mode 100644 index 00000000..3d1197b6 --- /dev/null +++ b/src/Commands/Handler/Disasters/DisasterStartHandler.cs @@ -0,0 +1,21 @@ +using CSM.Commands.Data.Game; +using CSM.Helpers; + +namespace CSM.Commands.Handler.Disasters +{ + public class DisasterStartHandler : CommandHandler + { + + public DisasterCreateHandler() + { + } + + protected override void Handle(DisasterStartCommand command) + { + IgnoreHelper.StartIgnore(); + ushort local = DisablerHelper.getLocal(command.ClientId, command.Id); + DisasterManager.instance.m_DisasterWrapper.StartDisaster(local); + IgnoreHelper.EndIgnore(); + } + } +} diff --git a/src/Extensions/DisastersExtension.cs b/src/Extensions/DisastersExtension.cs new file mode 100644 index 00000000..0959f7cc --- /dev/null +++ b/src/Extensions/DisastersExtension.cs @@ -0,0 +1,82 @@ +using CSM.Commands; +using CSM.Injections; +using CSM.Networking; +using ICities; +using System; +using CSM.Helpers; + +namespace CSM.Extensions +{ + public class DisastersExtension : IDisasterExtension + { + private IDisaster manager; + + public void OnCreated(IDisaster disaster) + { + // Do nothing + this.manager = disaster; + } + + public void OnReleased() + { + // Do nothing + } + + public void OnDisasterCreated(ushort disasterID) + { + if (IgnoreHelper.IsIgnored()) + return; + + DisasterSettings settings = manager.GetDisasterSettings(disasterID); + + Command.SendToAll(new DisasterCreateCommand + { + Id = disasterID, + Type = settings.type, + Name = settings.name, + TargetX = settings.targetX, + TargetY = settings.targetY, + TargetZ = settings.targetZ, + Angle = settings.angle, + Intensity = settings.intensity, + ClientId = MultiplayerManager.Instance.CurrentClient.ClientId + }); + } + + public void OnDisasterStarted(ushort disasterID) + { + if (IgnoreHelper.IsIgnored()) + return; + + Command.SendToAll(new DisasterStartCommand + { + Id = disasterID, + ClientId = MultiplayerManager.Instance.CurrentClient.ClientId + }); + } + + public void OnDisasterDetected(ushort disasterID) + { + if (IgnoreHelper.IsIgnored()) + return; + } + + public void OnDisasterActivated(ushort disasterID) + { + if (IgnoreHelper.IsIgnored()) + return; + } + + public void OnDisasterDeactivated(ushort disasterID) + { + if (IgnoreHelper.IsIgnored()) + return; + } + + public void OnDisasterFinished(ushort disasterID) + { + if (IgnoreHelper.IsIgnored()) + return; + } + } +} diff --git a/src/Helpers/DisasterHelper.cs b/src/Helpers/DisasterHelper.cs new file mode 100644 index 00000000..29fee904 --- /dev/null +++ b/src/Helpers/DisasterHelper.cs @@ -0,0 +1,61 @@ +namespace CSM.Helpers +{ + public static class DisasterHelper + { + + private static Dictionary disasterClientMap = new Dictionary(); + + public static void receiveCreate(int client, ushort server, ushort client) + { + if (!disasterClientMap.ContainsKey(client)) + { + disasterClientMap.Add(client, new DisasterClient()); + } + + DisasterClient client = disasterClientMap[client]; + client.add(server, client); + } + + public static ushort getLocal(int client, ushort server) + { + DisasterClient client = disasterClientMap[client]; + return client.convertServerToLocal(server); + } + + public static class DisasterClient + { + private IDictionary localToServerMap = new IDictionary(); + private IDictionary serverToLocalMap = new IDictionary(); + + public ushort convertServerToLocal(ushort data) + { + return serverToLocalMap[data]; + } + + public ushort convertLocalToServer(ushort data) + { + return localToServerMap[data]; + } + + public void add(ushort server, ushort local) + { + localToServerMap.Add(local, server); + serverToLocalMap.Add(server, local); + } + + public void removeLocal(ushort local) + { + ushort server = convertLocalToServer(local); + localToServerMap.Remove(local); + serverToLocalMap.Remove(server); + } + + public void removeServer(ushort server) + { + ushort local = convertServerToLocal(server); + localToServerMap.Remove(local); + serverToLocalMap.Remove(server); + } + } + } +} From 5e2d3ba50e166b29663e291b1189689e6012337c Mon Sep 17 00:00:00 2001 From: Shanyu Juneja Date: Sat, 26 Feb 2022 18:53:25 +0100 Subject: [PATCH 2/3] Docs changes --- src/Commands/Data/Disasters/DisasterCreateCommand.cs | 4 ++-- src/Commands/Data/Disasters/DisasterStartCommand.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Commands/Data/Disasters/DisasterCreateCommand.cs b/src/Commands/Data/Disasters/DisasterCreateCommand.cs index d0661546..2cfc7726 100644 --- a/src/Commands/Data/Disasters/DisasterCreateCommand.cs +++ b/src/Commands/Data/Disasters/DisasterCreateCommand.cs @@ -3,10 +3,10 @@ namespace CSM.Commands.Data.Disasters { /// - /// Sent when a loan has been paid back. + /// Sent when a natural disaster is started /// /// Sent by: - /// - EconomyHandler + /// - DisasterHelper [ProtoContract] public class DisasterStartCommand : CommandBase { diff --git a/src/Commands/Data/Disasters/DisasterStartCommand.cs b/src/Commands/Data/Disasters/DisasterStartCommand.cs index 796e5648..9a47aeb4 100644 --- a/src/Commands/Data/Disasters/DisasterStartCommand.cs +++ b/src/Commands/Data/Disasters/DisasterStartCommand.cs @@ -3,10 +3,10 @@ namespace CSM.Commands.Data.Disasters { /// - /// Sent when a loan has been paid back. + /// Sent when a natural disaster is created /// /// Sent by: - /// - EconomyHandler + /// - DisasterExtension [ProtoContract] public class DisasterCreateCommand : CommandBase { From 2f06b69dfc6094e78eea143dd2cdcd7161f2d9af Mon Sep 17 00:00:00 2001 From: Shanyu Juneja Date: Sat, 26 Feb 2022 19:28:45 +0100 Subject: [PATCH 3/3] Added imports --- .../Data/Disasters/DisasterStartCommand.cs | 1 + .../Disasters/DisasterCreateHandler.cs | 5 +++-- .../Handler/Disasters/DisasterStartHandler.cs | 5 +++-- src/Extensions/DisastersExtension.cs | 1 + src/Helpers/DisasterHelper.cs | 22 ++++++++++--------- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/Commands/Data/Disasters/DisasterStartCommand.cs b/src/Commands/Data/Disasters/DisasterStartCommand.cs index 9a47aeb4..500f19be 100644 --- a/src/Commands/Data/Disasters/DisasterStartCommand.cs +++ b/src/Commands/Data/Disasters/DisasterStartCommand.cs @@ -1,4 +1,5 @@ using ProtoBuf; +using ICities; namespace CSM.Commands.Data.Disasters { diff --git a/src/Commands/Handler/Disasters/DisasterCreateHandler.cs b/src/Commands/Handler/Disasters/DisasterCreateHandler.cs index 78215da8..4531de70 100644 --- a/src/Commands/Handler/Disasters/DisasterCreateHandler.cs +++ b/src/Commands/Handler/Disasters/DisasterCreateHandler.cs @@ -1,5 +1,6 @@ -using CSM.Commands.Data.Game; +using CSM.Commands.Data.Disasters; using CSM.Helpers; +using ICities; namespace CSM.Commands.Handler.Disasters { @@ -25,7 +26,7 @@ protected override void Handle(DisasterCreateCommand command) }; ushort local = DisasterManager.instance.m_DisasterWrapper.CreateDisaster(settings); - DisablerHelper.receiveCreate(command.ClientId, command.Id, local); + DisasterHelper.receiveCreate(command.ClientId, command.Id, local); IgnoreHelper.EndIgnore(); } } diff --git a/src/Commands/Handler/Disasters/DisasterStartHandler.cs b/src/Commands/Handler/Disasters/DisasterStartHandler.cs index 3d1197b6..1d0cc789 100644 --- a/src/Commands/Handler/Disasters/DisasterStartHandler.cs +++ b/src/Commands/Handler/Disasters/DisasterStartHandler.cs @@ -1,3 +1,4 @@ +using CSM.Commands.Data.Disasters; using CSM.Commands.Data.Game; using CSM.Helpers; @@ -6,14 +7,14 @@ namespace CSM.Commands.Handler.Disasters public class DisasterStartHandler : CommandHandler { - public DisasterCreateHandler() + public DisasterStartHandler() { } protected override void Handle(DisasterStartCommand command) { IgnoreHelper.StartIgnore(); - ushort local = DisablerHelper.getLocal(command.ClientId, command.Id); + ushort local = DisasterHelper.getLocal(command.ClientId, command.Id); DisasterManager.instance.m_DisasterWrapper.StartDisaster(local); IgnoreHelper.EndIgnore(); } diff --git a/src/Extensions/DisastersExtension.cs b/src/Extensions/DisastersExtension.cs index 0959f7cc..a3d853a7 100644 --- a/src/Extensions/DisastersExtension.cs +++ b/src/Extensions/DisastersExtension.cs @@ -4,6 +4,7 @@ using ICities; using System; using CSM.Helpers; +using CSM.Commands.Data.Disasters; namespace CSM.Extensions { diff --git a/src/Helpers/DisasterHelper.cs b/src/Helpers/DisasterHelper.cs index 29fee904..0eca3d9e 100644 --- a/src/Helpers/DisasterHelper.cs +++ b/src/Helpers/DisasterHelper.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace CSM.Helpers { public static class DisasterHelper @@ -5,27 +7,27 @@ public static class DisasterHelper private static Dictionary disasterClientMap = new Dictionary(); - public static void receiveCreate(int client, ushort server, ushort client) + public static void receiveCreate(int id, ushort server, ushort client) { - if (!disasterClientMap.ContainsKey(client)) + if (!disasterClientMap.ContainsKey(id)) { - disasterClientMap.Add(client, new DisasterClient()); + disasterClientMap.Add(id, new DisasterClient()); } - DisasterClient client = disasterClientMap[client]; - client.add(server, client); + DisasterClient disaster = disasterClientMap[id]; + disaster.add(server, client); } public static ushort getLocal(int client, ushort server) { - DisasterClient client = disasterClientMap[client]; - return client.convertServerToLocal(server); + DisasterClient disaster = disasterClientMap[client]; + return disaster.convertServerToLocal(server); } - public static class DisasterClient + public class DisasterClient { - private IDictionary localToServerMap = new IDictionary(); - private IDictionary serverToLocalMap = new IDictionary(); + private IDictionary localToServerMap = new Dictionary(); + private IDictionary serverToLocalMap = new Dictionary(); public ushort convertServerToLocal(ushort data) {