Пример #1
0
        public IHttpActionResult GetNearPlayer(int PlayerID, bool Competitive, float percent)
        {
            Graph <Player, Match, string> graph = new Graph <Player, Match, string>((Match e) => { return(e.Weight != 0 ? 1 / e.Weight : float.MaxValue); });

            PlayerGame currentPlayer = db.PlayerGames.Where(x => x.IDGamer == PlayerID).FirstOrDefault();

            foreach (var m in db.Matches.ToArray())
            {
                var p1 = db.PlayerGames.Where(x => x.IDGamer == m.IdPlayer1 && x.IDGame == (int)Games.Overwatch).FirstOrDefault();
                var p2 = db.PlayerGames.Where(x => x.IDGamer == m.IdPlayer2 && x.IDGame == (int)Games.Overwatch).FirstOrDefault();

                if (p1 != null && p2 != null)
                {
                    graph.AddVertice(m.Player1, p1.IdAPI);
                    graph.AddVertice(m.Player2, p2.IdAPI);
                    graph.AddAresta(p1.IdAPI, p2.IdAPI, m);
                }
            }

            OwPlayer    owPlayer = OwAPI.GetPlayer(currentPlayer.IdAPI, region.us, PlayerID);
            careerStats career   = Competitive ? owPlayer.compCareer : owPlayer.quickCareer;
            float       perc     = percent / 100.0f;

            owFilter filter = new owFilter
            {
                competitive = Competitive,
                damage      = new float[] { career.allDamageDone *(1.0f - perc), career.allDamageDone *(1.0f + perc) },
                rating      = new int[] { (int)(owPlayer.profile.rating * (1.0f - perc)), (int)(owPlayer.profile.rating * (1.0f + perc)) },
                elimination = new int[] { (int)(career.eliminations * (1.0f - perc)), (int)(career.eliminations * (1.0f + perc)) },
            };

            var             sorted  = graph.ShortPath(currentPlayer.IdAPI).OrderBy(x => x.Value).Skip(1).Take(graph.vertCount);
            List <OwPlayer> players = new List <OwPlayer>(sorted.Count());

            foreach (var v in sorted)
            {
                OwPlayer pp = OwAPI.GetPlayer(v.Key, region.us, 0);
                if (filterPlayer(pp, filter))
                {
                    players.Add(pp);
                }
            }

            return(Ok(players));
        }
Пример #2
0
        bool filterPlayer(OwPlayer p, owFilter filter)
        {
            bool ret = true;

            if (filter.role == 1)
            {
                ret = p.profile.tank_rating > 0;
            }
            else if (filter.role == 2)
            {
                ret = p.profile.damage_rating > 0;
            }
            else if (filter.role == 4)
            {
                ret = p.profile.support_rating > 0;
            }
            else if (filter.role == 3)
            {
                ret = (p.profile.tank_rating > 0 || p.profile.damage_rating > 0);
            }
            else if (filter.role == 5)
            {
                ret = (p.profile.tank_rating > 0 || p.profile.support_rating > 0);
            }
            else if (filter.role == 6)
            {
                ret = (p.profile.damage_rating > 0 || p.profile.support_rating > 0);
            }

            if (!ret)
            {
                return(false);
            }

            //rating
            if (filter.rating != null)
            {
                if (filter.rating.Length > 1)
                {
                    if (filter.rating[1] == -1)
                    {
                        ret = p.profile.rating > filter.rating[0];
                    }
                    else if (filter.rating[1] > -1 && filter.rating[0] > -1)
                    {
                        ret = (p.profile.rating > filter.rating[0] && p.profile.rating < filter.rating[1]);
                    }
                    else if (filter.rating[0] == -1)
                    {
                        ret = p.profile.rating < filter.rating[1];
                    }
                }
                else
                {
                    ret = p.profile.rating == filter.rating[0];
                }
            }

            if (!ret)
            {
                return(false);
            }
            //level
            if (filter.level != null)
            {
                int l = p.profile.level + p.profile.prestige * 100;
                if (filter.level.Length > 1)
                {
                    if (filter.level[1] == -1)
                    {
                        ret = l > filter.level[0];
                    }
                    else if (filter.level[1] > -1 && filter.level[0] > -1)
                    {
                        ret = (l > filter.level[0] && l < filter.level[1]);
                    }
                    else if (filter.level[0] == -1)
                    {
                        ret = l < filter.level[1];
                    }
                }
                else
                {
                    ret = l == filter.level[0];
                }
            }

            if (filter.competitive)
            {
                if (p.compCareer == null)
                {
                    return(false);
                }
                if (!ret)
                {
                    return(false);
                }
                //damage quick
                if (filter.damage != null)
                {
                    if (filter.damage.Length > 1)
                    {
                        if (filter.damage[1] == -1)
                        {
                            ret = p.compCareer.allDamageDone > filter.damage[0];
                        }
                        else if (filter.damage[1] > -1 && filter.damage[0] > -1)
                        {
                            ret = (p.compCareer.allDamageDone > filter.damage[0] && p.compCareer.allDamageDone < filter.damage[1]);
                        }
                        else if (filter.damage[0] == -1)
                        {
                            ret = p.compCareer.allDamageDone < filter.damage[1];
                        }
                    }
                    else
                    {
                        ret = p.compCareer.allDamageDone == filter.damage[0];
                    }
                }

                if (!ret)
                {
                    return(false);
                }
                //elimination quick
                if (filter.elimination != null)
                {
                    if (filter.elimination.Length > 1)
                    {
                        if (filter.elimination[1] == -1)
                        {
                            ret = p.compCareer.eliminations > filter.elimination[0];
                        }
                        else if (filter.elimination[1] > -1 && filter.elimination[0] > -1)
                        {
                            ret = (p.compCareer.eliminations > filter.elimination[0] && p.compCareer.eliminations < filter.elimination[1]);
                        }
                        else if (filter.elimination[0] == -1)
                        {
                            ret = p.compCareer.eliminations < filter.elimination[1];
                        }
                    }
                    else
                    {
                        ret = p.compCareer.eliminations == filter.elimination[0];
                    }
                }

                if (!ret)
                {
                    return(false);
                }
                //healing quick
                if (filter.healing != null)
                {
                    if (filter.healing.Length > 1)
                    {
                        if (filter.healing[1] == -1)
                        {
                            ret = p.compCareer.healingDone > filter.healing[0];
                        }
                        else if (filter.healing[1] > -1 && filter.healing[0] > -1)
                        {
                            ret = (p.compCareer.healingDone > filter.healing[0] && p.compCareer.healingDone < filter.healing[1]);
                        }
                        else if (filter.healing[0] == -1)
                        {
                            ret = p.compCareer.healingDone < filter.healing[1];
                        }
                    }
                    else
                    {
                        ret = p.compCareer.healingDone == filter.healing[0];
                    }
                }

                if (!ret)
                {
                    return(false);
                }
                //objtime quick
                if (filter.objTime != null)
                {
                    if (filter.objTime.Length > 1)
                    {
                        if (filter.objTime[1] == null)
                        {
                            ret = TimeSpan.Compare(p.compCareer.objectiveTime, filter.objTime[0]) > 0;
                        }
                        else if (filter.objTime[1] != null && filter.objTime[0] != null)
                        {
                            ret = (TimeSpan.Compare(p.compCareer.objectiveTime, filter.objTime[0]) > 0 && TimeSpan.Compare(p.compCareer.objectiveTime, filter.objTime[1]) < 0);
                        }
                        else if (filter.objTime[0] != null)
                        {
                            ret = TimeSpan.Compare(p.compCareer.objectiveTime, filter.objTime[1]) < 0;
                        }
                    }
                    else
                    {
                        ret = TimeSpan.Compare(p.compCareer.objectiveTime, filter.objTime[0]) == 0;
                    }
                }

                if (!ret)
                {
                    return(false);
                }
                //onfire quick
                if (filter.onfire != null)
                {
                    if (filter.onfire.Length > 1)
                    {
                        if (filter.onfire[1] == null)
                        {
                            ret = TimeSpan.Compare(p.compCareer.timeSpentOnFire, filter.onfire[0]) > 0;
                        }
                        else if (filter.onfire[1] != null && filter.onfire[0] != null)
                        {
                            ret = (TimeSpan.Compare(p.compCareer.timeSpentOnFire, filter.onfire[0]) > 0 && TimeSpan.Compare(p.compCareer.timeSpentOnFire, filter.onfire[1]) < 0);
                        }
                        else if (filter.onfire[0] != null)
                        {
                            ret = TimeSpan.Compare(p.compCareer.timeSpentOnFire, filter.onfire[1]) < 0;
                        }
                    }
                    else
                    {
                        ret = TimeSpan.Compare(p.compCareer.timeSpentOnFire, filter.onfire[0]) == 0;
                    }
                }
            }
            else
            {
                if (p.quickCareer == null)
                {
                    return(false);
                }
                if (!ret)
                {
                    return(false);
                }
                //damage quick
                if (filter.damage != null)
                {
                    if (filter.damage.Length > 1)
                    {
                        if (filter.damage[1] == -1)
                        {
                            ret = p.quickCareer.allDamageDone > filter.damage[0];
                        }
                        else if (filter.damage[1] > -1 && filter.damage[0] > -1)
                        {
                            ret = (p.quickCareer.allDamageDone > filter.damage[0] && p.quickCareer.allDamageDone < filter.damage[1]);
                        }
                        else if (filter.damage[0] == -1)
                        {
                            ret = p.quickCareer.allDamageDone < filter.damage[1];
                        }
                    }
                    else
                    {
                        ret = p.quickCareer.allDamageDone == filter.damage[0];
                    }
                }

                if (!ret)
                {
                    return(false);
                }
                //elimination quick
                if (filter.elimination != null)
                {
                    if (filter.elimination.Length > 1)
                    {
                        if (filter.elimination[1] == -1)
                        {
                            ret = p.quickCareer.eliminations > filter.elimination[0];
                        }
                        else if (filter.elimination[1] > -1 && filter.elimination[0] > -1)
                        {
                            ret = (p.quickCareer.eliminations > filter.elimination[0] && p.quickCareer.eliminations < filter.elimination[1]);
                        }
                        else if (filter.elimination[0] == -1)
                        {
                            ret = p.quickCareer.eliminations < filter.elimination[1];
                        }
                    }
                    else
                    {
                        ret = p.quickCareer.eliminations == filter.elimination[0];
                    }
                }

                if (!ret)
                {
                    return(false);
                }
                //healing quick
                if (filter.healing != null)
                {
                    if (filter.healing.Length > 1)
                    {
                        if (filter.healing[1] == -1)
                        {
                            ret = p.quickCareer.healingDone > filter.healing[0];
                        }
                        else if (filter.healing[1] > -1 && filter.healing[0] > -1)
                        {
                            ret = (p.quickCareer.healingDone > filter.healing[0] && p.quickCareer.healingDone < filter.healing[1]);
                        }
                        else if (filter.healing[0] == -1)
                        {
                            ret = p.quickCareer.healingDone < filter.healing[1];
                        }
                    }
                    else
                    {
                        ret = p.quickCareer.healingDone == filter.healing[0];
                    }
                }

                if (!ret)
                {
                    return(false);
                }
                //objtime quick
                if (filter.objTime != null)
                {
                    if (filter.objTime.Length > 1)
                    {
                        if (filter.objTime[1] == null)
                        {
                            ret = TimeSpan.Compare(p.quickCareer.objectiveTime, filter.objTime[0]) > 0;
                        }
                        else if (filter.objTime[1] != null && filter.objTime[0] != null)
                        {
                            ret = (TimeSpan.Compare(p.quickCareer.objectiveTime, filter.objTime[0]) > 0 && TimeSpan.Compare(p.quickCareer.objectiveTime, filter.objTime[1]) < 0);
                        }
                        else if (filter.objTime[0] != null)
                        {
                            ret = TimeSpan.Compare(p.quickCareer.objectiveTime, filter.objTime[1]) < 0;
                        }
                    }
                    else
                    {
                        ret = TimeSpan.Compare(p.quickCareer.objectiveTime, filter.objTime[0]) == 0;
                    }
                }

                if (!ret)
                {
                    return(false);
                }
                //onfire quick
                if (filter.onfire != null)
                {
                    if (filter.onfire.Length > 1)
                    {
                        if (filter.onfire[1] == null)
                        {
                            ret = TimeSpan.Compare(p.quickCareer.timeSpentOnFire, filter.onfire[0]) > 0;
                        }
                        else if (filter.onfire[1] != null && filter.onfire[0] != null)
                        {
                            ret = (TimeSpan.Compare(p.quickCareer.timeSpentOnFire, filter.onfire[0]) > 0 && TimeSpan.Compare(p.quickCareer.timeSpentOnFire, filter.onfire[1]) < 0);
                        }
                        else if (filter.onfire[0] != null)
                        {
                            ret = TimeSpan.Compare(p.quickCareer.timeSpentOnFire, filter.onfire[1]) < 0;
                        }
                    }
                    else
                    {
                        ret = TimeSpan.Compare(p.quickCareer.timeSpentOnFire, filter.onfire[0]) == 0;
                    }
                }
            }

            return(ret);
        }