Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/Commands/Data/Disasters/DisasterCreateCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using ProtoBuf;

namespace CSM.Commands.Data.Disasters
{
/// <summary>
/// Sent when a natural disaster is started
/// </summary>
/// Sent by:
/// - DisasterHelper
[ProtoContract]
public class DisasterStartCommand : CommandBase
{
[ProtoMember(1)]
public ushort Id { get; set; }

/// <summary>
/// The client id of the disconnected user (to clear caches).
/// </summary>
[ProtoMember(2)]
public int ClientId { get; set; }
}
}
44 changes: 44 additions & 0 deletions src/Commands/Data/Disasters/DisasterStartCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using ProtoBuf;
using ICities;

namespace CSM.Commands.Data.Disasters
{
/// <summary>
/// Sent when a natural disaster is created
/// </summary>
/// Sent by:
/// - DisasterExtension
[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; }

/// <summary>
/// The client id of the disconnected user (to clear caches).
/// </summary>
[ProtoMember(9)]
public int ClientId { get; set; }
}
}
33 changes: 33 additions & 0 deletions src/Commands/Handler/Disasters/DisasterCreateHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using CSM.Commands.Data.Disasters;
using CSM.Helpers;
using ICities;

namespace CSM.Commands.Handler.Disasters
{
public class DisasterCreateHandler : CommandHandler<DisasterCreateCommand>
{

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);
DisasterHelper.receiveCreate(command.ClientId, command.Id, local);
IgnoreHelper.EndIgnore();
}
}
}
22 changes: 22 additions & 0 deletions src/Commands/Handler/Disasters/DisasterStartHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using CSM.Commands.Data.Disasters;
using CSM.Commands.Data.Game;
using CSM.Helpers;

namespace CSM.Commands.Handler.Disasters
{
public class DisasterStartHandler : CommandHandler<DisasterStartCommand>
{

public DisasterStartHandler()
{
}

protected override void Handle(DisasterStartCommand command)
{
IgnoreHelper.StartIgnore();
ushort local = DisasterHelper.getLocal(command.ClientId, command.Id);
DisasterManager.instance.m_DisasterWrapper.StartDisaster(local);
IgnoreHelper.EndIgnore();
}
}
}
83 changes: 83 additions & 0 deletions src/Extensions/DisastersExtension.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using CSM.Commands;
using CSM.Injections;
using CSM.Networking;
using ICities;
using System;
using CSM.Helpers;
using CSM.Commands.Data.Disasters;

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;
}
}
}
63 changes: 63 additions & 0 deletions src/Helpers/DisasterHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using System.Collections.Generic;

namespace CSM.Helpers
{
public static class DisasterHelper
{

private static Dictionary<int, DisasterClient> disasterClientMap = new Dictionary<int, DisasterClient>();

public static void receiveCreate(int id, ushort server, ushort client)
{
if (!disasterClientMap.ContainsKey(id))
{
disasterClientMap.Add(id, new DisasterClient());
}

DisasterClient disaster = disasterClientMap[id];
disaster.add(server, client);
}

public static ushort getLocal(int client, ushort server)
{
DisasterClient disaster = disasterClientMap[client];
return disaster.convertServerToLocal(server);
}

public class DisasterClient
{
private IDictionary<ushort, ushort> localToServerMap = new Dictionary<ushort, ushort>();
private IDictionary<ushort, ushort> serverToLocalMap = new Dictionary<ushort, ushort>();

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);
}
}
}
}