Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }