Exemplo n.º 1
0
    public static PacketWriter MatchResults(RpsResult result, RpsChoice playerChoice, RpsChoice opponentChoice)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.RockPaperScissors);

        pWriter.Write(RpsPacketMode.MatchResults);
        pWriter.Write(result);
        pWriter.Write(playerChoice);
        pWriter.Write(opponentChoice);
        return(pWriter);
    }
    private static void HandleSelectRpsChoice(GameSession session, PacketReader packet)
    {
        session.Player.RPSSelection = (RpsChoice)packet.ReadInt();

        // delay for 1 sec for opponent to update their selection
        Task.Run(async() =>
        {
            await Task.Delay(1000);
        });

        // confirm if opponent is still in the map
        Player opponent = session.FieldManager.State.Players
                          .FirstOrDefault(x => x.Value.Value.CharacterId == session.Player.RPSOpponentId).Value?.Value;

        if (opponent == null)
        {
            return;
        }

        // handle choices
        RpsResult[,] resultMatrix =
        {
            {
                RpsResult.Draw, RpsResult.Lose, RpsResult.Win
            },
            {
                RpsResult.Win, RpsResult.Draw, RpsResult.Lose
            },
            {
                RpsResult.Lose, RpsResult.Win, RpsResult.Draw
            }
        };

        RpsResult result = resultMatrix[(int)session.Player.RPSSelection, (int)opponent.RPSSelection];

        RPS rpsEvent = DatabaseManager.Events.FindRockPaperScissorsEvent();

        if (rpsEvent is null)
        {
            return;
        }

        Item voucher = session.Player.Inventory.GetById(rpsEvent.VoucherId);

        if (voucher is null)
        {
            return;
        }

        session.Player.Inventory.ConsumeItem(session, voucher.Uid, 1);

        GameEventUserValue dailyMatches = GameEventHelper.GetUserValue(session.Player, rpsEvent.Id,
                                                                       TimeInfo.Tomorrow(), GameEventUserValueType.RPSDailyMatches);

        int.TryParse(dailyMatches.EventValue, out int dailyMatchCount);

        dailyMatchCount++;

        dailyMatches.UpdateValue(session, dailyMatchCount);
        session.Send(RockPaperScissorsPacket.MatchResults(result, session.Player.RPSSelection, opponent.RPSSelection));
    }