Skip to content

Commit 1bdfe8d

Browse files
committed
Refactored Mirror events to use EventArgs classes instead of messy delegates
1 parent 686ebdc commit 1bdfe8d

25 files changed

Lines changed: 714 additions & 481 deletions

LabExtended/API/ExMap.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
using Utils;
3737
using Utils.Networking;
38+
using LabExtended.Events.Mirror;
3839

3940
#pragma warning disable CS8602 // Dereference of a possibly null reference.
4041

@@ -550,16 +551,16 @@ private static void OnRoundWaiting()
550551
}
551552

552553
// this is so stupid
553-
private static void OnIdentityDestroyed(NetworkIdentity identity, NetworkServer.DestroyMode mode)
554+
private static void OnDestroyingIdentity(MirrorDestroyingIdentityEventArgs args)
554555
{
555556
try
556557
{
557-
if (identity == null || mode is not NetworkServer.DestroyMode.Destroy)
558+
if (args.Identity == null || args.Mode is not NetworkServer.DestroyMode.Destroy)
558559
return;
559560

560561
Lockers.ForEach(l =>
561562
{
562-
if (l.netId != identity.netId)
563+
if (l.netId != args.Identity.netId)
563564
return;
564565

565566
for (var i = 0; i < l.Chambers.Length; i++)
@@ -571,9 +572,9 @@ private static void OnIdentityDestroyed(NetworkIdentity identity, NetworkServer.
571572
}
572573
});
573574

574-
Lockers.RemoveAll(x => x.netId == identity.netId);
575+
Lockers.RemoveAll(x => x.netId == args.Identity.netId);
575576

576-
if (identity.TryGetComponent<IInteractable>(out var interactable))
577+
if (args.Identity.TryGetComponent<IInteractable>(out var interactable))
577578
InteractableCollider.AllInstances.Remove(interactable);
578579
}
579580
catch (Exception ex)
@@ -641,7 +642,7 @@ internal static void Internal_Init()
641642
ItemPickupBase.OnBeforePickupDestroyed += OnPickupDestroyed;
642643
ItemPickupBase.OnPickupAdded += OnPickupCreated;
643644

644-
MirrorEvents.Destroying += OnIdentityDestroyed;
645+
MirrorEvents.Destroying += OnDestroyingIdentity;
645646

646647
InternalEvents.OnRoundWaiting += OnRoundWaiting;
647648

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using LabExtended.API;
2+
3+
using Mirror;
4+
5+
namespace LabExtended.Events.Mirror
6+
{
7+
/// <summary>
8+
/// Gets called after a new observer is added to an identity's observers list.
9+
/// </summary>
10+
public class MirrorAddedObserverEventArgs : MirrorIdentityEventArgs
11+
{
12+
/// <summary>
13+
/// Gets the player who was added. May be null if no instance was created for this connection.
14+
/// </summary>
15+
public ExPlayer? Observer { get; }
16+
17+
/// <summary>
18+
/// Gets the connection of the player who was added as observer.
19+
/// </summary>
20+
public NetworkConnectionToClient Connection { get; }
21+
22+
public MirrorAddedObserverEventArgs(NetworkIdentity identity, ExPlayer? observer, NetworkConnectionToClient connection) : base(identity)
23+
{
24+
Observer = observer;
25+
Connection = connection;
26+
}
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using LabExtended.API;
2+
3+
using Mirror;
4+
5+
namespace LabExtended.Events.Mirror
6+
{
7+
/// <summary>
8+
/// Gets called before a new observer is added to an identity's observers list.
9+
/// </summary>
10+
public class MirrorAddingObserverEventArgs : MirrorIdentityBooleanEventArgs
11+
{
12+
/// <summary>
13+
/// Gets the player who should be added. May be null if no instance was created for this connection.
14+
/// </summary>
15+
public ExPlayer? Observer { get; }
16+
17+
/// <summary>
18+
/// Gets the connection of the player to be added as observer.
19+
/// </summary>
20+
public NetworkConnectionToClient Connection { get; }
21+
22+
public MirrorAddingObserverEventArgs(NetworkIdentity identity, ExPlayer? observer, NetworkConnectionToClient connection) : base(identity)
23+
{
24+
Observer = observer;
25+
Connection = connection;
26+
}
27+
}
28+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Mirror;
2+
3+
namespace LabExtended.Events.Mirror
4+
{
5+
/// <summary>
6+
/// Gets called before Mirror destroys a network identity.
7+
/// </summary>
8+
public class MirrorDestroyedIdentityEventArgs : MirrorIdentityEventArgs
9+
{
10+
/// <summary>
11+
/// Gets the destroy mode.
12+
/// </summary>
13+
public NetworkServer.DestroyMode Mode { get; }
14+
15+
public MirrorDestroyedIdentityEventArgs(NetworkIdentity identity, NetworkServer.DestroyMode mode) : base(identity)
16+
{
17+
Mode = mode;
18+
}
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Mirror;
2+
3+
namespace LabExtended.Events.Mirror
4+
{
5+
/// <summary>
6+
/// Gets called before Mirror destroys a network identity.
7+
/// </summary>
8+
public class MirrorDestroyingIdentityEventArgs : MirrorIdentityBooleanEventArgs
9+
{
10+
/// <summary>
11+
/// Gets the destroy mode.
12+
/// </summary>
13+
public NetworkServer.DestroyMode Mode { get; }
14+
15+
public MirrorDestroyingIdentityEventArgs(NetworkIdentity identity, NetworkServer.DestroyMode mode) : base(identity)
16+
{
17+
Mode = mode;
18+
}
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Mirror;
2+
3+
namespace LabExtended.Events.Mirror
4+
{
5+
/// <summary>
6+
/// Base class for Mirror events with a network identity.
7+
/// </summary>
8+
public abstract class MirrorIdentityBooleanEventArgs : BooleanEventArgs
9+
{
10+
/// <summary>
11+
/// Gets the targeted network identity.
12+
/// </summary>
13+
public NetworkIdentity Identity { get; }
14+
15+
public MirrorIdentityBooleanEventArgs(NetworkIdentity identity)
16+
{
17+
Identity = identity;
18+
}
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Mirror;
2+
3+
namespace LabExtended.Events.Mirror
4+
{
5+
/// <summary>
6+
/// Base class for Mirror events with a network identity.
7+
/// </summary>
8+
public abstract class MirrorIdentityEventArgs : EventArgs
9+
{
10+
/// <summary>
11+
/// Gets the targeted network identity.
12+
/// </summary>
13+
public NetworkIdentity Identity { get; }
14+
15+
public MirrorIdentityEventArgs(NetworkIdentity identity)
16+
{
17+
Identity = identity;
18+
}
19+
}
20+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using LabExtended.API;
2+
3+
using Mirror;
4+
5+
namespace LabExtended.Events.Mirror
6+
{
7+
/// <summary>
8+
/// Gets called before an observer is removed from an identity's observers list.
9+
/// </summary>
10+
public class MirrorRemovedObserverEventArgs : MirrorIdentityBooleanEventArgs
11+
{
12+
/// <summary>
13+
/// Gets the player who should be removed. May be null if no instance was created for this connection.
14+
/// </summary>
15+
public ExPlayer? Observer { get; }
16+
17+
/// <summary>
18+
/// Gets the connection of the player to be removed as observer.
19+
/// </summary>
20+
public NetworkConnection Connection { get; }
21+
22+
public MirrorRemovedObserverEventArgs(NetworkIdentity identity, ExPlayer? observer, NetworkConnection connection) : base(identity)
23+
{
24+
Observer = observer;
25+
Connection = connection;
26+
}
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using LabExtended.API;
2+
3+
using Mirror;
4+
5+
namespace LabExtended.Events.Mirror
6+
{
7+
/// <summary>
8+
/// Gets called before an observer is removed from an identity's observers list.
9+
/// </summary>
10+
public class MirrorRemovingObserverEventArgs : MirrorIdentityBooleanEventArgs
11+
{
12+
/// <summary>
13+
/// Gets the player who should be removed. May be null if no instance was created for this connection.
14+
/// </summary>
15+
public ExPlayer? Observer { get; }
16+
17+
/// <summary>
18+
/// Gets the connection of the player to be removed as observer.
19+
/// </summary>
20+
public NetworkConnection Connection { get; }
21+
22+
public MirrorRemovingObserverEventArgs(NetworkIdentity identity, ExPlayer? observer, NetworkConnection connection) : base(identity)
23+
{
24+
Observer = observer;
25+
Connection = connection;
26+
}
27+
}
28+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using LabExtended.API;
2+
3+
using Mirror;
4+
5+
namespace LabExtended.Events.Mirror
6+
{
7+
/// <summary>
8+
/// Gets called before an RPC is sent to a player.
9+
/// </summary>
10+
public class MirrorSendingRpcEventArgs : MirrorIdentityBooleanEventArgs
11+
{
12+
/// <summary>
13+
/// Gets the player who will receive the RPC.
14+
/// </summary>
15+
public ExPlayer Player { get; internal set; }
16+
17+
/// <summary>
18+
/// Gets or sets the writer which contains the data of the RPC.
19+
/// </summary>
20+
public NetworkWriter Writer { get; set; }
21+
22+
/// <summary>
23+
/// Gets the behaviour sending the RPC.
24+
/// </summary>
25+
public NetworkBehaviour Behaviour { get; }
26+
27+
/// <summary>
28+
/// Gets the hash of the RPC method name.
29+
/// </summary>
30+
public int RpcHash { get; }
31+
32+
/// <summary>
33+
/// Gets the full name of the RPC method.
34+
/// </summary>
35+
public string RpcName { get; }
36+
37+
public MirrorSendingRpcEventArgs(ExPlayer player, NetworkWriter writer, NetworkBehaviour behaviour, int rpcHash, string rpcName) : base(behaviour.netIdentity)
38+
{
39+
Player = player;
40+
Writer = writer;
41+
Behaviour = behaviour;
42+
RpcHash = rpcHash;
43+
RpcName = rpcName;
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)