]> git.deb.at Git - rhonda/impostor.git/commitdiff
Almost all RPC calls
authorAeonLucid <aeonlucid@outlook.com>
Fri, 23 Oct 2020 21:42:59 +0000 (23:42 +0200)
committerAeonLucid <aeonlucid@outlook.com>
Fri, 23 Oct 2020 21:42:59 +0000 (23:42 +0200)
13 files changed:
src/Impostor.Api/Innersloth/Net/InnerNetObject.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.PlayerInfo.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.TaskInfo.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs
src/Impostor.Api/ProjectRules.ruleset
src/Impostor.Server/Net/State/Game.Data.cs

index dc3458790d41b37f2821a836d83fd18b401cee71..d9912a814ba6ca7d3e4862024b5dcbd0e25d4f79 100644 (file)
@@ -11,8 +11,7 @@ namespace Impostor.Api.Innersloth.Net
 
         public SpawnFlags SpawnFlags { get; internal set; }
 
-        public abstract void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
-            IMessageReader reader);
+        public abstract void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader);
 
         public abstract bool Serialize(IMessageWriter writer, bool initialState);
 
index 8270e32c1cbebbd0f88f892c697d3a551699849c..40fc96f537fc6aa52723344a91d8b2d1c23f7a74 100644 (file)
@@ -52,7 +52,7 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
             }
             else
             {
-                _logger.LogWarning("InnerCustomNetworkTransform: Unknown rpc call {0}", call);
+                _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerCustomNetworkTransform), call);
             }
         }
 
index 71281389a84ede8c2204d76e6a8fc7266f4f1bee..a0bff8dfd6e167aa64172cf91cc553e15094b3d4 100644 (file)
@@ -1,24 +1,56 @@
-using Impostor.Api.Net;
+using System;
+using Impostor.Api.Net;
 using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.Logging;
 
 namespace Impostor.Api.Innersloth.Net.Objects.Components
 {
     public class InnerPlayerPhysics : InnerNetObject
     {
-        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
-            IMessageReader reader)
+        private readonly ILogger<InnerPlayerPhysics> _logger;
+
+        public InnerPlayerPhysics(ILogger<InnerPlayerPhysics> logger)
         {
-            throw new System.NotImplementedException();
+            _logger = logger;
+        }
+
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
+        {
+            if (call != RpcCalls.EnterVent && call != RpcCalls.ExitVent)
+            {
+                _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerPlayerPhysics), call);
+                return;
+            }
+
+            if (!sender.IsOwner(this))
+            {
+                throw new ImpostorCheatException($"Client sent {call} to an unowned {nameof(InnerPlayerControl)}.");
+            }
+
+            if (target != null)
+            {
+                throw new ImpostorCheatException($"Client sent {call} to a specific player instead of broadcast.");
+            }
+
+            if (!sender.Character.PlayerInfo.IsImpostor)
+            {
+                throw new ImpostorCheatException($"Client sent {call} as crewmate.");
+            }
+
+            var ventId = reader.ReadPackedUInt32();
+            var ventEnter = call == RpcCalls.EnterVent;
+
+            // TODO: Do stuff.
         }
 
         public override bool Serialize(IMessageWriter writer, bool initialState)
         {
-            throw new System.NotImplementedException();
+            throw new NotImplementedException();
         }
 
         public override void Deserialize(IClientPlayer sender, IMessageReader reader, bool initialState)
         {
-            throw new System.NotImplementedException();
+            throw new NotImplementedException();
         }
     }
 }
\ No newline at end of file
index a9590df8c9d47c5b91ffff7c57ac510eed12bd30..1e43cd54e781ff05c0d00577b799d4128eb39255 100644 (file)
@@ -2,22 +2,43 @@
 using System.Collections.Generic;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.Logging;
 
 namespace Impostor.Api.Innersloth.Net.Objects.Components
 {
     public class InnerVoteBanSystem : InnerNetObject
     {
+        private readonly ILogger<InnerVoteBanSystem> _logger;
         private readonly Dictionary<int, int[]> _votes;
 
-        public InnerVoteBanSystem()
+        public InnerVoteBanSystem(ILogger<InnerVoteBanSystem> logger)
         {
+            _logger = logger;
             _votes = new Dictionary<int, int[]>();
         }
 
-        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
-            IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
         {
-            throw new NotImplementedException();
+            if (call != RpcCalls.AddVote)
+            {
+                _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerVoteBanSystem), call);
+                return;
+            }
+
+            var clientId = reader.ReadInt32();
+            if (clientId != sender.Client.Id)
+            {
+                throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.AddVote)} as other client.");
+            }
+
+            if (target != null)
+            {
+                throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CastVote)} to wrong destinition, must be broadcast.");
+            }
+
+            var targetClientId = reader.ReadInt32();
+
+            // TODO: Use.
         }
 
         public override bool Serialize(IMessageWriter writer, bool initialState)
index 3cc8a837f64c06e34caca4fef2ace59df7931cd2..7ddd8a381c1851f2a70acaf7cdd51d895d4cc046 100644 (file)
@@ -14,6 +14,8 @@ namespace Impostor.Api.Innersloth.Net.Objects
                 PlayerId = playerId;
             }
 
+            public InnerPlayerControl Controller { get; internal set; }
+
             public byte PlayerId { get; }
 
             public string PlayerName { get; internal set; }
@@ -34,7 +36,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
 
             public DeathReason LastDeathReason { get; internal set; }
 
-            public List<TaskInfo> Tasks { get; private set; }
+            public List<TaskInfo> Tasks { get; internal set; }
 
             public void Serialize(IMessageWriter writer)
             {
index d1ef9f25fac1ddb01d07ce685de94fbfb4058377..cdca500b10b4b5880e17c500d8da3c4e656996a8 100644 (file)
@@ -6,9 +6,9 @@ namespace Impostor.Api.Innersloth.Net.Objects
     {
         public class TaskInfo
         {
-            public uint Id { get; private set; }
+            public uint Id { get; internal set; }
 
-            public bool Complete { get; private set; }
+            public bool Complete { get; internal set; }
 
             public void Serialize(IMessageWriter writer)
             {
index e7fafabc18249b7aede38d47bdab7b090595196b..2a4a3a8c5d4ea0e636b5d6fa76a451f0e1e556c0 100644 (file)
@@ -5,38 +5,31 @@ using Impostor.Api.Games;
 using Impostor.Api.Innersloth.Net.Objects.Components;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
 
 namespace Impostor.Api.Innersloth.Net.Objects
 {
     public partial class InnerGameData : InnerNetObject
     {
+        private readonly ILogger<InnerGameData> _logger;
         private readonly IGame _game;
         private readonly ConcurrentDictionary<byte, PlayerInfo> _allPlayers;
 
-        public InnerGameData(IGame game)
+        public InnerGameData(ILogger<InnerGameData> logger, IGame game, IServiceProvider serviceProvider)
         {
+            _logger = logger;
             _game = game;
             _allPlayers = new ConcurrentDictionary<byte, PlayerInfo>();
 
             Components.Add(this);
-            Components.Add(new InnerVoteBanSystem());
+            Components.Add(ActivatorUtilities.CreateInstance<InnerVoteBanSystem>(serviceProvider));
         }
 
         public int PlayerCount => _allPlayers.Count;
 
         public IReadOnlyDictionary<byte, PlayerInfo> Players => _allPlayers;
 
-        internal void AddPlayer(InnerPlayerControl control)
-        {
-            var playerId = control.PlayerId;
-            var playerInfo = new PlayerInfo(control.PlayerId);
-
-            if (_allPlayers.TryAdd(playerId, playerInfo))
-            {
-                control.PlayerInfo = playerInfo;
-            }
-        }
-
         public PlayerInfo? GetPlayerById(byte id)
         {
             if (id == byte.MaxValue)
@@ -49,7 +42,69 @@ namespace Impostor.Api.Innersloth.Net.Objects
 
         public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
         {
-            throw new NotImplementedException();
+            switch (call)
+            {
+                case RpcCalls.SetTasks:
+                {
+                    if (!sender.IsHost)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.SetTasks)} but was not a host.");
+                    }
+
+                    if (target != null)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.SetTasks)} to a specific player instead of broadcast.");
+                    }
+
+                    var playerId = reader.ReadByte();
+                    var taskTypeIds = reader.ReadBytesAndSize();
+
+                    SetTasks(playerId, taskTypeIds);
+                    break;
+                }
+
+                case RpcCalls.UpdateGameData:
+                {
+                    if (!sender.IsHost)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.SetTasks)} but was not a host.");
+                    }
+
+                    if (target != null)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.SetTasks)} to a specific player instead of broadcast.");
+                    }
+
+                    while (reader.Position < reader.Length)
+                    {
+                        var message = reader.ReadMessage();
+                        var player = GetPlayerById(message.Tag);
+                        if (player != null)
+                        {
+                            player.Deserialize(message);
+                        }
+                        else
+                        {
+                            var playerInfo = new PlayerInfo(message.Tag);
+
+                            playerInfo.Deserialize(reader);
+
+                            if (!_allPlayers.TryAdd(playerInfo.PlayerId, playerInfo))
+                            {
+                                throw new ImpostorException("Failed to add player to InnerGameData.");
+                            }
+                        }
+                    }
+
+                    break;
+                }
+
+                default:
+                {
+                    _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerGameData), call);
+                    break;
+                }
+            }
         }
 
         public override bool Serialize(IMessageWriter writer, bool initialState)
@@ -65,7 +120,8 @@ namespace Impostor.Api.Innersloth.Net.Objects
 
                 for (var i = 0; i < num; i++)
                 {
-                    var playerInfo = new PlayerInfo(reader.ReadByte());
+                    var playerId = reader.ReadByte();
+                    var playerInfo = new PlayerInfo(playerId);
 
                     playerInfo.Deserialize(reader);
 
@@ -77,25 +133,41 @@ namespace Impostor.Api.Innersloth.Net.Objects
             }
             else
             {
-                throw new NotImplementedException("This shouldn't happen, according to Among Us disassembly..");
-
-                // var num = reader.ReadByte();
-                //
-                // for (var i = 0; i < num; i++)
-                // {
-                //     var id = reader.ReadByte();
-                //     var player = GetPlayerById(id);
-                //     if (player != null)
-                //     {
-                //         player.Deserialize(reader);
-                //     }
-                //     else
-                //     {
-                //         var playerInfo = new PlayerInfo(id);
-                //         playerInfo.Deserialize(reader);
-                //         _allPlayers.Add(playerInfo);
-                //     }
-                // }
+                throw new NotImplementedException("This shouldn't happen, according to Among Us disassembly.");
+            }
+        }
+
+        internal void AddPlayer(InnerPlayerControl control)
+        {
+            var playerId = control.PlayerId;
+            var playerInfo = new PlayerInfo(control.PlayerId);
+
+            if (_allPlayers.TryAdd(playerId, playerInfo))
+            {
+                control.PlayerInfo = playerInfo;
+            }
+        }
+
+        private void SetTasks(byte playerId, ReadOnlyMemory<byte> taskTypeIds)
+        {
+            var player = GetPlayerById(playerId);
+            if (player == null)
+            {
+                _logger.LogTrace("Could not set tasks for playerId {0}.", playerId);
+                return;
+            }
+
+            if (player.Disconnected)
+            {
+                return;
+            }
+
+            player.Tasks = new List<TaskInfo>(taskTypeIds.Length);
+
+            for (var i = 0; i < taskTypeIds.Length; i++)
+            {
+                player.Tasks.Add(new TaskInfo());
+                player.Tasks[i].Id = (uint)i;
             }
         }
     }
index e0661f89bb9213ac04afb21158156c0c945c1bd3..78bebd447365bf2bdb405ca7389e935133aac7c2 100644 (file)
@@ -15,8 +15,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
             Components.Add(this);
         }
 
-        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
-            IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
         {
             throw new System.NotImplementedException();
         }
index 19e636e6f98bfbbc1ff618267728776325516f3a..d742dc12500819ca0f43139e2fa58f02bf252561 100644 (file)
@@ -4,17 +4,20 @@ using Impostor.Api.Games;
 using Impostor.Api.Innersloth.Data;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.Logging;
 
 namespace Impostor.Api.Innersloth.Net.Objects
 {
     public partial class InnerMeetingHud : InnerNetObject
     {
+        private readonly ILogger<InnerMeetingHud> _logger;
         private readonly IGame _game;
         private readonly IGameNet _gameNet;
         private PlayerVoteArea[] _playerStates;
 
-        public InnerMeetingHud(IGame game)
+        public InnerMeetingHud(ILogger<InnerMeetingHud> logger, IGame game)
         {
+            _logger = logger;
             _game = game;
             _gameNet = game.GameNet;
             _playerStates = null;
@@ -36,10 +39,73 @@ namespace Impostor.Api.Innersloth.Net.Objects
                 .ToArray();
         }
 
-        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
-            IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
         {
-            throw new NotImplementedException();
+            switch (call)
+            {
+                case RpcCalls.Close:
+                {
+                    if (!sender.IsHost)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.Close)} but was not a host.");
+                    }
+
+                    if (target != null)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.Close)} to a specific player instead of broadcast.");
+                    }
+
+                    break;
+                }
+
+                case RpcCalls.VotingComplete:
+                {
+                    if (!sender.IsHost)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.VotingComplete)} but was not a host.");
+                    }
+
+                    if (target != null)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.VotingComplete)} to a specific player instead of broadcast.");
+                    }
+
+                    var states = reader.ReadBytesAndSize();
+                    var playerId = reader.ReadByte();
+                    var tie = reader.ReadBoolean();
+                    break;
+                }
+
+                case RpcCalls.CastVote:
+                {
+                    var srcPlayerId = reader.ReadByte();
+                    if (srcPlayerId != sender.Character.PlayerId)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CastVote)} to an unowned {nameof(InnerPlayerControl)}.");
+                    }
+
+                    // Host broadcasts vote to others.
+                    if (sender.IsHost && target != null)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CastVote)} to a specific player instead of broadcast.");
+                    }
+
+                    // Player sends vote to host.
+                    if (target == null || !target.IsHost)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CastVote)} to wrong destinition, must be host.");
+                    }
+
+                    var targetPlayerId = reader.ReadByte();
+                    break;
+                }
+
+                default:
+                {
+                    _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerMeetingHud), call);
+                    break;
+                }
+            }
         }
 
         public override bool Serialize(IMessageWriter writer, bool initialState)
index 998fc4f1c1b400c9bccfd262688ef2c7339647af..018fbc0da8b8ba457b19ae3cca215dd80bfc2a15 100644 (file)
@@ -51,6 +51,11 @@ namespace Impostor.Api.Innersloth.Net.Objects
                         throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CompleteTask)} to an unowned {nameof(InnerPlayerControl)}.");
                     }
 
+                    if (target != null)
+                    {
+                        throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.CompleteTask)} to a specific player instead of broadcast.");
+                    }
+
                     var index = reader.ReadPackedUInt32();
                     break;
                 }
@@ -231,7 +236,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
                     if (!sender.Character.PlayerInfo.IsImpostor)
                     {
                         // TODO: Uncomment
-                        // throw new ImpostorHackException($"Client sent {nameof(RpcCalls.MurderPlayer)} as crewmate.");
+                        // throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.MurderPlayer)} as crewmate.");
                     }
 
                     var player = reader.ReadNetObject<InnerPlayerControl>(_game);
@@ -270,7 +275,6 @@ namespace Impostor.Api.Innersloth.Net.Objects
                     var player = _game.GameNet.GameData.GetPlayerById(playerId);
 
                     // Meeting started by "player", can also be null.
-                    Console.WriteLine("ads");
                     break;
                 }
 
@@ -346,8 +350,10 @@ namespace Impostor.Api.Innersloth.Net.Objects
                 }
 
                 default:
-                    _logger.LogWarning("InnerPlayerControl: Unknown rpc call {0}", call);
+                {
+                    _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerPlayerControl), call);
                     break;
+                }
             }
         }
 
index 1992552b72c927e09023a7539f0f4b2330402094..f3960d91bbeb415d851292cc36216872296ee1b8 100644 (file)
@@ -5,16 +5,19 @@ using Impostor.Api.Innersloth.Net.Objects.Systems;
 using Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Messages;
+using Microsoft.Extensions.Logging;
 
 namespace Impostor.Api.Innersloth.Net.Objects
 {
     public class InnerShipStatus : InnerNetObject
     {
+        private readonly ILogger<InnerShipStatus> _logger;
         private readonly IGame _game;
         private readonly Dictionary<SystemTypes, ISystemType> _systems;
 
-        public InnerShipStatus(IGame game)
+        public InnerShipStatus(ILogger<InnerShipStatus> logger, IGame game)
         {
+            _logger = logger;
             _game = game;
 
             _systems = new Dictionary<SystemTypes, ISystemType>
@@ -39,8 +42,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
             Components.Add(this);
         }
 
-        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call,
-            IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer? target, RpcCalls call, IMessageReader reader)
         {
             switch (call)
             {
@@ -67,6 +69,12 @@ namespace Impostor.Api.Innersloth.Net.Objects
 
                     break;
                 }
+
+                default:
+                {
+                    _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerShipStatus), call);
+                    break;
+                }
             }
         }
 
index a380f5c510cd12d1d36aeb7a702449163b11721b..4ba23c2fcf68519c6a0f6d67bb3f49e6dd8d0593 100644 (file)
@@ -4,6 +4,8 @@
     </Rules>
     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.CSharp.DocumentationRules">
         <Rule Id="SA1600" Action="None" />
+        <Rule Id="SA1601" Action="None" />
+        <Rule Id="SA1602" Action="None" />
         <Rule Id="SA1633" Action="None" />
     </Rules>
     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.CSharp.ReadabilityRules">
index d502d965849a166b2827bf29b55096c0a41ad406..ce1e37d37f0e5d850234fa589eaedbddf5dd39fe 100644 (file)
@@ -1,15 +1,12 @@
 using System;
 using System.Collections.Generic;
-using System.Runtime.InteropServices;
 using System.Threading;
 using System.Threading.Tasks;
-using Impostor.Api;
 using Impostor.Api.Innersloth.Data;
 using Impostor.Api.Innersloth.Net;
 using Impostor.Api.Innersloth.Net.Objects;
 using Impostor.Api.Innersloth.Net.Objects.Components;
 using Impostor.Api.Net.Messages;
-using Impostor.Api.Net.Messages.C2S;
 using Impostor.Api.Net.Messages.S2C;
 using Impostor.Hazel;
 using Microsoft.Extensions.DependencyInjection;
@@ -50,7 +47,7 @@ namespace Impostor.Server.Net.State
         private int _gamedataInitialized;
         private bool _gamedataFakeReceived;
 
-        internal void OnSpawn(InnerNetObject netObj)
+        private void OnSpawn(InnerNetObject netObj)
         {
             switch (netObj)
             {
@@ -87,19 +84,24 @@ namespace Impostor.Server.Net.State
                     }
 
                     // Hook up InnerPlayerControl <-> InnerPlayerControl.PlayerInfo.
-                    control.PlayerInfo = GameNet.GameData.GetPlayerById(control.PlayerId);
+                    control.PlayerInfo = GameNet.GameData.GetPlayerById(control.PlayerId)!;
 
                     if (control.PlayerInfo == null)
                     {
                         GameNet.GameData.AddPlayer(control);
                     }
 
+                    if (control.PlayerInfo != null)
+                    {
+                        control.PlayerInfo!.Controller = control;
+                    }
+
                     break;
                 }
             }
         }
 
-        internal void OnDestroy(InnerNetObject netObj)
+        private void OnDestroy(InnerNetObject netObj)
         {
             switch (netObj)
             {
@@ -228,14 +230,7 @@ namespace Impostor.Server.Net.State
                         var netId = reader.ReadPackedUInt32();
                         if (_allObjectsFast.TryGetValue(netId, out var obj))
                         {
-                            // TODO: Remove try catch.
-                            try
-                            {
-                                obj.HandleRpc(sender, target, (RpcCalls) reader.ReadByte(), reader);
-                            }
-                            catch (NotImplementedException)
-                            {
-                            }
+                            obj.HandleRpc(sender, target, (RpcCalls) reader.ReadByte(), reader);
                         }
                         else
                         {