diff --git a/src/Impostor.Server/Net/Inner/Objects/GameManager/InnerGameManager.cs b/src/Impostor.Server/Net/Inner/Objects/GameManager/InnerGameManager.cs index ee727f32..f51b0804 100644 --- a/src/Impostor.Server/Net/Inner/Objects/GameManager/InnerGameManager.cs +++ b/src/Impostor.Server/Net/Inner/Objects/GameManager/InnerGameManager.cs @@ -53,12 +53,20 @@ internal abstract class InnerGameManager : InnerNetObject, IInnerGameManager public override async ValueTask HandleRpcAsync(ClientPlayer sender, ClientPlayer? target, RpcCalls call, IMessageReader reader) { + // Let all logic components process this RPC. If at least one component handles it, return true. + var result = false; foreach (var logicComponent in _logicComponents) { - await logicComponent.HandleRpcAsync(call, reader); + result |= await logicComponent.HandleRpcAsync(call, reader); } - return true; + // If no component accepted it, try and find a custom RPC that can deal with it. + if (!result) + { + result |= await base.HandleRpcAsync(sender, target, call, reader); + } + + return result; } public override ValueTask SerializeAsync(IMessageWriter writer, bool initialState) diff --git a/src/Impostor.Server/Net/Inner/Objects/GameManager/Logic/GameLogicComponent.cs b/src/Impostor.Server/Net/Inner/Objects/GameManager/Logic/GameLogicComponent.cs index 6993ddb1..8ee662f8 100644 --- a/src/Impostor.Server/Net/Inner/Objects/GameManager/Logic/GameLogicComponent.cs +++ b/src/Impostor.Server/Net/Inner/Objects/GameManager/Logic/GameLogicComponent.cs @@ -6,9 +6,9 @@ namespace Impostor.Server.Net.Inner.Objects.GameManager.Logic; internal abstract class GameLogicComponent { - public virtual ValueTask HandleRpcAsync(RpcCalls callId, IMessageReader reader) + public virtual ValueTask HandleRpcAsync(RpcCalls callId, IMessageReader reader) { - throw new NotImplementedException($"Unhandled RpcCall {callId}"); + return ValueTask.FromResult(false); } public virtual ValueTask SerializeAsync(IMessageWriter writer, bool initialState)