public override async ValueTask <bool> HandleRpc(ClientPlayer sender, ClientPlayer?target, RpcCalls call, IMessageReader reader) { if (!await TestRpc(sender, target, call, Rpcs)) { return(false); } switch (call) { case RpcCalls.CloseDoorsOfType: { if (target == null || !target.IsHost) { if (await sender.Client.ReportCheatAsync(RpcCalls.CloseDoorsOfType, $"Client sent {nameof(RpcCalls.CloseDoorsOfType)} to wrong destinition, must be host")) { return(false); } } if (!sender.Character.PlayerInfo.IsImpostor) { if (await sender.Client.ReportCheatAsync(RpcCalls.CloseDoorsOfType, $"Client sent {nameof(RpcCalls.CloseDoorsOfType)} as crewmate")) { return(false); } } Rpc27CloseDoorsOfType.Deserialize(reader, out var systemType); break; } case RpcCalls.RepairSystem: { if (target == null || !target.IsHost) { if (await sender.Client.ReportCheatAsync(RpcCalls.RepairSystem, $"Client sent {nameof(RpcCalls.RepairSystem)} to wrong destinition, must be host")) { return(false); } } Rpc28RepairSystem.Deserialize(reader, _game, out var systemType, out var player, out var amount); if (systemType == SystemTypes.Sabotage && !sender.Character.PlayerInfo.IsImpostor) { if (await sender.Client.ReportCheatAsync(RpcCalls.RepairSystem, $"Client sent {nameof(RpcCalls.RepairSystem)} for {systemType} as crewmate")) { return(false); } } break; } } return(true); }
public override async ValueTask <bool> HandleRpcAsync(ClientPlayer sender, ClientPlayer?target, RpcCalls call, IMessageReader reader) { if (!await ValidateCmd(call, sender, target)) { return(false); } switch (call) { case RpcCalls.CloseDoorsOfType: { if (!await ValidateImpostor(call, sender, sender.Character !.PlayerInfo)) { return(false); } Rpc27CloseDoorsOfType.Deserialize(reader, out var systemType); break; } case RpcCalls.RepairSystem: { Rpc28RepairSystem.Deserialize(reader, Game, out var systemType, out var player, out var amount); if (systemType == SystemTypes.Sabotage && !await ValidateImpostor(call, sender, sender.Character !.PlayerInfo)) { return(false); } if (player != null) { await _eventManager.CallAsync(new PlayerRepairSystemEvent(Game, sender, player, systemType, amount)); } break; } default: return(await UnregisteredCall(call, sender)); } return(true); }
public override async ValueTask <bool> HandleRpcAsync(ClientPlayer sender, ClientPlayer?target, RpcCalls call, IMessageReader reader) { if (!await ValidateCmd(call, sender, target)) { return(false); } switch (call) { case RpcCalls.CloseDoorsOfType: { if (!await ValidateImpostor(call, sender, sender.Character !.PlayerInfo)) { return(false); } Rpc27CloseDoorsOfType.Deserialize(reader, out SystemTypes systemType); break; } case RpcCalls.RepairSystem: { Rpc28RepairSystem.Deserialize(reader, Game, out SystemTypes systemType, out IInnerPlayerControl? player, out byte amount); if (systemType == SystemTypes.Sabotage && !await ValidateImpostor(call, sender, sender.Character !.PlayerInfo)) { return(false); } break; } default: return(await base.HandleRpcAsync(sender, target, call, reader)); } return(true); }