private bool IsValidMatch(tnEndMatchEventParams i_Params)
    {
        int teamAHumanPlayers = i_Params.teamAHumanPlayers;
        int teamBHumanPlayers = i_Params.teamBHumanPlayers;

        return(teamAHumanPlayers > 0 || teamBHumanPlayers > 0);
    }
    private int GetMaxScoredGoals(tnEndMatchEventParams i_Params)
    {
        if (i_Params.scoreA == i_Params.scoreB)
        {
            return(i_Params.scoreA);
        }

        if (i_Params.scoreA > i_Params.scoreB)
        {
            if (i_Params.teamAHumanPlayers > 0 && i_Params.isTeamALocal)
            {
                return(i_Params.scoreA);
            }
            else
            {
                if (i_Params.teamBHumanPlayers > 0 && i_Params.isTeamBLocal)
                {
                    return(i_Params.scoreB);
                }
                else
                {
                    return(0);
                }
            }
        }
        else
        {
            // i_Params.scoreB > i_Params.scoreA

            if (i_Params.teamBHumanPlayers > 0 && i_Params.isTeamBLocal)
            {
                return(i_Params.scoreB);
            }
            else
            {
                if (i_Params.teamAHumanPlayers > 0 && i_Params.isTeamALocal)
                {
                    return(i_Params.scoreA);
                }
                else
                {
                    return(0);
                }
            }
        }
    }
    private int GetMinSufferedGoals(tnEndMatchEventParams i_Params)
    {
        if (i_Params.scoreA == i_Params.scoreB)
        {
            return(i_Params.scoreA);
        }

        if (i_Params.scoreA < i_Params.scoreB)
        {
            if (i_Params.teamAHumanPlayers > 0 && i_Params.isTeamALocal)
            {
                return(i_Params.scoreA);
            }
            else
            {
                if (i_Params.teamBHumanPlayers > 0 && i_Params.isTeamBLocal)
                {
                    return(i_Params.scoreB);
                }
                else
                {
                    return(int.MaxValue);
                }
            }
        }
        else
        {
            // i_Params.scoreB < i_Params.scoreA

            if (i_Params.teamBHumanPlayers > 0 && i_Params.isTeamBLocal)
            {
                return(i_Params.scoreB);
            }
            else
            {
                if (i_Params.teamAHumanPlayers > 0 && i_Params.isTeamALocal)
                {
                    return(i_Params.scoreA);
                }
                else
                {
                    return(int.MaxValue);
                }
            }
        }
    }
    private void OnMatchEnded(tnEndMatchEventParams i_Params)
    {
        if (!IsValidMatch(i_Params))
        {
            return;
        }

        StatsModule statsModule = GameServices.GetModuleMain <StatsModule>();

        if (statsModule == null)
        {
            return;
        }

        statsModule.UpdateIntStat(tnUserStatsId.s_MatchesPlayedStatId, 1, IntStatUpdateFunction.Add);

        if (i_Params.hasReferee)
        {
            statsModule.UpdateIntStat(tnUserStatsId.s_MatchesPlayedWithRefereeStatId, 1, IntStatUpdateFunction.Add);
        }

        int minSufferedGoals = GetMinSufferedGoals(i_Params);
        int maxScoredGoals   = GetMaxScoredGoals(i_Params);

        statsModule.UpdateIntStat(tnUserStatsId.s_MinSuffuredGoalsStatId, minSufferedGoals, IntStatUpdateFunction.Min);
        statsModule.UpdateIntStat(tnUserStatsId.s_MaxScoredGoalsStatId, maxScoredGoals, IntStatUpdateFunction.Max);

        bool result71 = (i_Params.scoreA == 7 && i_Params.scoreB == 1 && i_Params.teamAHumanPlayers > 0 && i_Params.isTeamALocal) || (i_Params.scoreA == 1 && i_Params.scoreB == 7 && i_Params.teamBHumanPlayers > 0 && i_Params.isTeamBLocal);

        statsModule.UpdateBoolStat(tnUserStatsId.s_Result71StatId, result71, BoolStatUpdateFunction.Add);

        bool realPool = (i_Params.ballId == s_Ball8Id && i_Params.stadiumId == s_PoolPalaceHashedId);

        statsModule.UpdateBoolStat(tnUserStatsId.s_RealPoolStatId, realPool, BoolStatUpdateFunction.Add);

        bool itaBeatsFrance = (i_Params.teamAId == s_ItaHashedId && i_Params.teamBId == s_FraHashedId && i_Params.teamAHumanPlayers > 0 && i_Params.isTeamALocal && i_Params.scoreA > i_Params.scoreB) ||
                              (i_Params.teamAId == s_FraHashedId && i_Params.teamBId == s_ItaHashedId && i_Params.teamBHumanPlayers > 0 && i_Params.isTeamBLocal && i_Params.scoreB > i_Params.scoreA);

        statsModule.UpdateBoolStat(tnUserStatsId.s_ItaBeatsFranceStatId, itaBeatsFrance, BoolStatUpdateFunction.Add);

        statsModule.StoreStats();
    }
    protected override void OnEndMatch()
    {
        base.OnEndMatch();

        bool online = !PhotonNetwork.offlineMode;
        tnEndMatchEventParams param = new tnEndMatchEventParams(online);

        param.SetGameModeId(gameModeId);
        param.SetBallId(ballId);
        param.SetStadiumId(stadiumId);
        param.SetHasReferee(hasReferee);
        param.SetGoldenGoalEnabled(goldenGoalEnabled);
        param.SetGoldenGoal(goldenGoal);

        // Compute human players.

        tnStandardMatchTeamResults teamAResults = (tnStandardMatchTeamResults)GetTeamResultsByIndex(0);

        if (teamAResults != null)
        {
            param.SetTeamAId(teamAResults.id);
            param.SetScoreA(teamAResults.score);
            param.SetTeamASize(teamAResults.charactersResultsCount);

            int humanPlayers = 0;

            if (!online)
            {
                for (int index = 0; index < teamAResults.charactersResultsCount; ++index)
                {
                    tnCharacterResults characterResults = teamAResults.GetCharacterResults(index);
                    if (characterResults != null)
                    {
                        if (characterResults.isHuman)
                        {
                            ++humanPlayers;
                        }
                    }
                }
            }
            else
            {
                humanPlayers = teamAResults.charactersResultsCount;
            }

            param.SetTeamAHumanPlayers(humanPlayers);
        }

        tnStandardMatchTeamResults teamBResults = (tnStandardMatchTeamResults)GetTeamResultsByIndex(1);

        if (teamBResults != null)
        {
            param.SetTeamBId(teamBResults.id);
            param.SetScoreB(teamBResults.score);
            param.SetTeamBSize(teamBResults.charactersResultsCount);

            int humanPlayers = 0;

            if (!online)
            {
                for (int index = 0; index < teamBResults.charactersResultsCount; ++index)
                {
                    tnCharacterResults characterResults = teamBResults.GetCharacterResults(index);
                    if (characterResults != null)
                    {
                        if (characterResults.isHuman)
                        {
                            ++humanPlayers;
                        }
                    }
                }
            }
            else
            {
                humanPlayers = teamBResults.charactersResultsCount;
            }

            param.SetTeamBHumanPlayers(humanPlayers);
        }

        // Compute local characters and teams.

        for (int index = 0; index < localCharactersCount; ++index)
        {
            GameObject character = GetLocalCharacterByIndex(index);

            if (character == null)
            {
                continue;
            }

            tnCharacterInfo characterInfo = character.GetComponent <tnCharacterInfo>();
            if (characterInfo != null)
            {
                int characterId = characterInfo.characterId;
                int teamId      = characterInfo.teamId;

                param.AddLocalCharacter(characterId);
                param.AddLocalTeam(teamId);
            }
        }

        // Raise event.

        Messenger.Broadcast <tnEndMatchEventParams>("MatchEnded", param);
    }