From: miniduikboot Date: Thu, 13 Jun 2024 18:52:25 +0000 (+0200) Subject: Accept RPC's called on GameManager X-Git-Tag: v1.10.0~21^2 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=da0ee81b5d944c195dbb41dc42db450598393aba;p=rhonda%2Fimpostor.git Accept RPC's called on GameManager Previously Impostor would just throw when a method was called on a GameManager, but this caused issues with client mods that did just this, even through vanilla never calls an RPC on GameManager. This commit changes that throw statement to pass the exception to the custom message handler/anticheat instead, which is also how it works for the other NetObjects --- diff --git a/src/Impostor.Server/Net/Inner/Objects/GameManager/InnerGameManager.cs b/src/Impostor.Server/Net/Inner/Objects/GameManager/InnerGameManager.cs index ee727f3..f51b080 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 6993ddb..8ee662f 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)