Beispiel #1
0
        static StaticData()
        {
            foreach (var lane in Enum.GetValues(typeof(Lane)))
            {
                var laneCastedAsLane = (Lane) lane;
                // for order
                var orderTurretsList = Turrets.GetTurretsPosition(GameObjectTeam.Order, laneCastedAsLane).ToArray();
                var orderPolygons = new List<Geometry.Polygon>();
                for (var i = 0; i < orderTurretsList.Length - 1; i++)
                {
                    // circle around turrets
                    orderPolygons.Add(new Geometry.Circle(orderTurretsList[i], 950).ToPolygon());
                    // rectangle from this turret to next one
                    orderPolygons.Add(new Geometry.Rectangle(orderTurretsList[i],
                        orderTurretsList[i + 1], 700).ToPolygon());
                }
                // add a circle around last turret too
                orderPolygons.Add(new Geometry.Circle(orderTurretsList.LastOrDefault(), 950).ToPolygon());
                _teamOrderLaneZones.Add(laneCastedAsLane, orderPolygons.ClipperUnion().PathsToPolygon());
                // for team chaos
                var chaosTurretsList = Turrets.GetTurretsPosition(GameObjectTeam.Chaos, laneCastedAsLane).ToArray();
                var chaosPolygons = new List<Geometry.Polygon>();
                for (var i = 0; i < chaosTurretsList.Length - 1; i++)
                {
                    // circle around turrets
                    chaosPolygons.Add(new Geometry.Circle(chaosTurretsList[i], 950).ToPolygon());
                    // rectangle from this turret to next one
                    chaosPolygons.Add(new Geometry.Rectangle(chaosTurretsList[i],
                        chaosTurretsList[i + 1], 700).ToPolygon());
                }
                // add a circle around last turret too
                chaosPolygons.Add(new Geometry.Circle(chaosTurretsList.LastOrDefault(), 950).ToPolygon());
                _teamChaosLaneZones.Add(laneCastedAsLane, chaosPolygons.ClipperUnion().PathsToPolygon());
                // for neutral zones
                if (laneCastedAsLane != Lane.Base)
                {
                    var neutralCenter =
                        Turrets.GetTurretsPosition(GameObjectTeam.Neutral, laneCastedAsLane).LastOrDefault();
                    //#TODO should probably get the polygon end-point but cba
                    var blueTeamTurretPos =
                        Turrets.GetTurretsPosition(GameObjectTeam.Order, laneCastedAsLane)
                            .LastOrDefault()
                            .Extend(neutralCenter, 880);
                    var redTeamTurretPos =
                        Turrets.GetTurretsPosition(GameObjectTeam.Chaos, laneCastedAsLane)
                            .LastOrDefault()
                            .Extend(neutralCenter, 880);
                    var poly1 = new Geometry.Rectangle(blueTeamTurretPos, neutralCenter, 700);
                    var poly2 = new Geometry.Rectangle(neutralCenter, redTeamTurretPos, 700);
                    var union = new List<Geometry.Polygon> {poly1.ToPolygon(), poly2.ToPolygon()}.ClipperUnion();
                    _teamNeutralLaneZones.Add(laneCastedAsLane, union.PathsToPolygon());
                }
            }
            // add a polygon for each lane, without minding the team.
            foreach (var lane in Enum.GetValues(typeof(Lane)))
            {
                var laneCastedAsLane = (Lane) lane;
                if (laneCastedAsLane == Lane.Mid || laneCastedAsLane == Lane.Bot || laneCastedAsLane == Lane.Top)
                {
                    var polygons = new List<Geometry.Polygon>();
                    polygons.Add(_teamNeutralLaneZones.FirstOrDefault(entry => entry.Key == laneCastedAsLane).Value);
                    polygons.Add(_teamOrderLaneZones.FirstOrDefault(entry => entry.Key == laneCastedAsLane).Value);
                    polygons.Add(_teamChaosLaneZones.FirstOrDefault(entry => entry.Key == laneCastedAsLane).Value);
                    _wholeLanePolygon.Add(laneCastedAsLane, polygons.ClipperUnion().PathsToPolygon());
                }
            }
            /*
            // Here we WIPE the turret out from our lane if it's DELETED
            GameObject.OnDelete += (sender, deleteArgs) =>
            {
                if (sender == null)
                {
                    Logging.Log("[Polygon Cache] Turret was deleted but sender was null");
                }
                if (sender is Obj_AI_Turret)
                {
                    Logging.Log("[Polygon Cache] A turret was deleted");
                    // we gather some information about the dead turret
                    var teamLaneTuple = Turrets.GetTurretTeamAndLaneByPosition(sender.Position);
                    var team = teamLaneTuple.Item1;
                    var lane = teamLaneTuple.Item2;
                    var position = teamLaneTuple.Item3;
                    // check if its worth editing the lane poly
                    if (lane == Lane.Base || lane == Lane.Unknown)
                    {
                        // escape null refs produced by the code below :roto2_think:
                        return;
                    }
                    // we backup the lane to perform operations on its polygon
                    var backup = GetLanePolygon(team, lane);
                    if (backup != null)
                    {
                        Logging.Log("[Polygon Cache] backup of a deleted turret was created");
                    }
                    // do the work for each team separately (cuz when we wipe a team's region it should become neutral)
                    // first blue
                    if (team == GameObjectTeam.Order)
                    {
                        Logging.Log(
                            "[Polygon Cache] Attempting to remove lane from team order, the collection currently has " +
                            _teamChaosLaneZones.Count + " lanes");

                        _teamChaosLaneZones.Remove(lane);

                        Logging.Log("[Polygon Cache] Removed lane from team order, the collection currently has " +
                                    _teamChaosLaneZones.Count + " lanes");
                        // we first cut the first circle poly:
                        var turretCircle = new Geometry.Circle(position, 850).ToPolygon();
                        Logging.Log("[Polygon Cache] Trying to execute XOR");
                        try
                        {
                            var step1 = backup.ClipperXor(turretCircle).PathsToPolygon();
                            Logging.Log("[Polygon Cache] XOR executed succesfuly");

                            var allTurretsInLane = Turrets.GetTurretsPosition(team, lane);
                            var thisTurretIndex = allTurretsInLane.IndexOf(position);
                            // and add it to neutral zone
                            _teamNeutralLaneZones.Add(lane, turretCircle);
                            // then we remove the space between the removed turret and the one that should still be alive (if any)
                            if (thisTurretIndex - 1 >= 0)
                            {
                                var rectFromThisToNextAlive = new Geometry.Rectangle(position,
                                    allTurretsInLane[thisTurretIndex - 1], 700).ToPolygon();
                                var step2 = step1.ClipperXor(rectFromThisToNextAlive).PathsToPolygon();
                                _teamOrderLaneZones.Add(lane, step2);
                                _teamNeutralLaneZones.Add(lane, rectFromThisToNextAlive);
                                return;
                            }
                            _teamOrderLaneZones.Add(lane, step1);
                        }
                        catch (Exception e)
                        {
                            Logging.Log("[Polygon Cache] Caught Exception: " + e);
                        }
                    }
                    // then red
                    if (team == GameObjectTeam.Chaos)
                    {
                        _teamChaosLaneZones.Remove(lane);

                        // we first cut the first circle poly:
                        var turretCircle = new Geometry.Circle(position, 850).ToPolygon();
                        try
                        {
                            var step1 = backup.ClipperXor(turretCircle).PathsToPolygon();
                            var allTurretsInLane = Turrets.GetTurretsPosition(team, lane);
                            var thisTurretIndex = allTurretsInLane.IndexOf(position);
                            // and add it to neutral zone
                            _teamNeutralLaneZones.Add(lane, turretCircle);
                            // then we remove the space between the removed turret and the one that should still be alive (if any)
                            if (thisTurretIndex - 1 >= 0)
                            {
                                var rectFromThisToNextAlive = new Geometry.Rectangle(position,
                                    allTurretsInLane[thisTurretIndex - 1], 700).ToPolygon();
                                var step2 = step1.ClipperXor(rectFromThisToNextAlive).PathsToPolygon();
                                _teamChaosLaneZones.Add(lane, step2);
                                _teamNeutralLaneZones.Add(lane, rectFromThisToNextAlive);
                                return;
                            }
                            _teamChaosLaneZones.Add(lane, step1);
                        }
                        catch (Exception e)
                        {
                            Logging.Log("[Polygon Cache] Caugh Exception: " + e);
                        }
                    }
                }
            };*/
        }
Beispiel #2
0
        static StaticData()
        {
            foreach (var lane in Enum.GetValues(typeof(Lane)))
            {
                var laneCastedAsLane = (Lane)lane;
                // for order
                var orderTurretsList = Turrets.GetTurretsPosition(GameObjectTeam.Order, laneCastedAsLane).ToArray();
                var orderPolygons    = new List <Geometry.Polygon>();
                for (var i = 0; i < orderTurretsList.Length - 1; i++)
                {
                    // circle around turrets
                    orderPolygons.Add(new Geometry.Circle(orderTurretsList[i], 950).ToPolygon());
                    // rectangle from this turret to next one
                    orderPolygons.Add(new Geometry.Rectangle(orderTurretsList[i],
                                                             orderTurretsList[i + 1], 700).ToPolygon());
                }
                // add a circle around last turret too
                orderPolygons.Add(new Geometry.Circle(orderTurretsList.LastOrDefault(), 950).ToPolygon());
                _teamOrderLaneZones.Add(laneCastedAsLane, orderPolygons.ClipperUnion().PathsToPolygon());
                // for team chaos
                var chaosTurretsList = Turrets.GetTurretsPosition(GameObjectTeam.Chaos, laneCastedAsLane).ToArray();
                var chaosPolygons    = new List <Geometry.Polygon>();
                for (var i = 0; i < chaosTurretsList.Length - 1; i++)
                {
                    // circle around turrets
                    chaosPolygons.Add(new Geometry.Circle(chaosTurretsList[i], 950).ToPolygon());
                    // rectangle from this turret to next one
                    chaosPolygons.Add(new Geometry.Rectangle(chaosTurretsList[i],
                                                             chaosTurretsList[i + 1], 700).ToPolygon());
                }
                // add a circle around last turret too
                chaosPolygons.Add(new Geometry.Circle(chaosTurretsList.LastOrDefault(), 950).ToPolygon());
                _teamChaosLaneZones.Add(laneCastedAsLane, chaosPolygons.ClipperUnion().PathsToPolygon());
                // for neutral zones
                if (laneCastedAsLane != Lane.Base)
                {
                    var neutralCenter =
                        Turrets.GetTurretsPosition(GameObjectTeam.Neutral, laneCastedAsLane).LastOrDefault();
                    //#TODO should probably get the polygon end-point but cba
                    var blueTeamTurretPos =
                        Turrets.GetTurretsPosition(GameObjectTeam.Order, laneCastedAsLane)
                        .LastOrDefault()
                        .Extend(neutralCenter, 880);
                    var redTeamTurretPos =
                        Turrets.GetTurretsPosition(GameObjectTeam.Chaos, laneCastedAsLane)
                        .LastOrDefault()
                        .Extend(neutralCenter, 880);
                    var poly1 = new Geometry.Rectangle(blueTeamTurretPos, neutralCenter, 700);
                    var poly2 = new Geometry.Rectangle(neutralCenter, redTeamTurretPos, 700);
                    var union = new List <Geometry.Polygon> {
                        poly1.ToPolygon(), poly2.ToPolygon()
                    }.ClipperUnion();
                    _teamNeutralLaneZones.Add(laneCastedAsLane, union.PathsToPolygon());
                }
            }
            // add a polygon for each lane, without minding the team.
            foreach (var lane in Enum.GetValues(typeof(Lane)))
            {
                var laneCastedAsLane = (Lane)lane;
                if (laneCastedAsLane == Lane.Mid || laneCastedAsLane == Lane.Bot || laneCastedAsLane == Lane.Top)
                {
                    var polygons = new List <Geometry.Polygon>();
                    polygons.Add(_teamNeutralLaneZones.FirstOrDefault(entry => entry.Key == laneCastedAsLane).Value);
                    polygons.Add(_teamOrderLaneZones.FirstOrDefault(entry => entry.Key == laneCastedAsLane).Value);
                    polygons.Add(_teamChaosLaneZones.FirstOrDefault(entry => entry.Key == laneCastedAsLane).Value);
                    _wholeLanePolygon.Add(laneCastedAsLane, polygons.ClipperUnion().PathsToPolygon());
                }
            }

            /*
             * // Here we WIPE the turret out from our lane if it's DELETED
             * GameObject.OnDelete += (sender, deleteArgs) =>
             * {
             *  if (sender == null)
             *  {
             *      Logging.Log("[Polygon Cache] Turret was deleted but sender was null");
             *  }
             *  if (sender is Obj_AI_Turret)
             *  {
             *      Logging.Log("[Polygon Cache] A turret was deleted");
             *      // we gather some information about the dead turret
             *      var teamLaneTuple = Turrets.GetTurretTeamAndLaneByPosition(sender.ServerPosition);
             *      var team = teamLaneTuple.Item1;
             *      var lane = teamLaneTuple.Item2;
             *      var position = teamLaneTuple.Item3;
             *      // check if its worth editing the lane poly
             *      if (lane == Lane.Base || lane == Lane.Unknown)
             *      {
             *          // escape null refs produced by the code below :roto2_think:
             *          return;
             *      }
             *      // we backup the lane to perform operations on its polygon
             *      var backup = GetLanePolygon(team, lane);
             *      if (backup != null)
             *      {
             *          Logging.Log("[Polygon Cache] backup of a deleted turret was created");
             *      }
             *      // do the work for each team separately (cuz when we wipe a team's region it should become neutral)
             *      // first blue
             *      if (team == GameObjectTeam.Order)
             *      {
             *          Logging.Log(
             *              "[Polygon Cache] Attempting to remove lane from team order, the collection currently has " +
             *              _teamChaosLaneZones.Count + " lanes");
             *
             *          _teamChaosLaneZones.Remove(lane);
             *
             *          Logging.Log("[Polygon Cache] Removed lane from team order, the collection currently has " +
             *                      _teamChaosLaneZones.Count + " lanes");
             *          // we first cut the first circle poly:
             *          var turretCircle = new Geometry.Circle(position, 850).ToPolygon();
             *          Logging.Log("[Polygon Cache] Trying to execute XOR");
             *          try
             *          {
             *              var step1 = backup.ClipperXor(turretCircle).PathsToPolygon();
             *              Logging.Log("[Polygon Cache] XOR executed succesfuly");
             *
             *              var allTurretsInLane = Turrets.GetTurretsPosition(team, lane);
             *              var thisTurretIndex = allTurretsInLane.IndexOf(position);
             *              // and add it to neutral zone
             *              _teamNeutralLaneZones.Add(lane, turretCircle);
             *              // then we remove the space between the removed turret and the one that should still be alive (if any)
             *              if (thisTurretIndex - 1 >= 0)
             *              {
             *                  var rectFromThisToNextAlive = new Geometry.Rectangle(position,
             *                      allTurretsInLane[thisTurretIndex - 1], 700).ToPolygon();
             *                  var step2 = step1.ClipperXor(rectFromThisToNextAlive).PathsToPolygon();
             *                  _teamOrderLaneZones.Add(lane, step2);
             *                  _teamNeutralLaneZones.Add(lane, rectFromThisToNextAlive);
             *                  return;
             *              }
             *              _teamOrderLaneZones.Add(lane, step1);
             *          }
             *          catch (Exception e)
             *          {
             *              Logging.Log("[Polygon Cache] Caught Exception: " + e);
             *          }
             *      }
             *      // then red
             *      if (team == GameObjectTeam.Chaos)
             *      {
             *          _teamChaosLaneZones.Remove(lane);
             *
             *          // we first cut the first circle poly:
             *          var turretCircle = new Geometry.Circle(position, 850).ToPolygon();
             *          try
             *          {
             *              var step1 = backup.ClipperXor(turretCircle).PathsToPolygon();
             *              var allTurretsInLane = Turrets.GetTurretsPosition(team, lane);
             *              var thisTurretIndex = allTurretsInLane.IndexOf(position);
             *              // and add it to neutral zone
             *              _teamNeutralLaneZones.Add(lane, turretCircle);
             *              // then we remove the space between the removed turret and the one that should still be alive (if any)
             *              if (thisTurretIndex - 1 >= 0)
             *              {
             *                  var rectFromThisToNextAlive = new Geometry.Rectangle(position,
             *                      allTurretsInLane[thisTurretIndex - 1], 700).ToPolygon();
             *                  var step2 = step1.ClipperXor(rectFromThisToNextAlive).PathsToPolygon();
             *                  _teamChaosLaneZones.Add(lane, step2);
             *                  _teamNeutralLaneZones.Add(lane, rectFromThisToNextAlive);
             *                  return;
             *              }
             *              _teamChaosLaneZones.Add(lane, step1);
             *          }
             *          catch (Exception e)
             *          {
             *              Logging.Log("[Polygon Cache] Caugh Exception: " + e);
             *          }
             *      }
             *  }
             * };*/
        }