예제 #1
0
        private static Unit GetClosestCreep(CreepWaves creepWave)
        {
            float[] distance = { float.MaxValue };
            Unit    closest  = null;

            try
            {
                var creeps = creepWave.Creeps;
                foreach (var creep in creeps.Where(creep => creep.IsValidTarget() && distance[0] > creepWave.meepo.Distance2D(creep.Position))
                         )
                {
                    distance[0] = creepWave.meepo.Distance2D(creep.Position);
                    closest     = creep;
                }
                return(closest ?? ObjectManager
                       .GetEntities <Unit>(
                           ).Where(
                           x => x.IsAlive && x.IsVisible && x.IsValidTarget() && x.Team != me.Team &&
                           (x.ClassID == ClassID.CDOTA_BaseNPC_Barracks ||
                            x.ClassID == ClassID.CDOTA_BaseNPC_Tower ||
                            x.ClassID == ClassID.CDOTA_BaseNPC_Building
                           ) && x.Distance2D(creepWave.Position) < 2000)
                       .OrderBy(x => x.Distance2D(creepWave.meepo))
                       .DefaultIfEmpty(null)
                       .FirstOrDefault());
            }
            catch (Exception)
            {
                // ignore errors
            }
            return(closest);
        }
예제 #2
0
        private void OnEntityAdded(object sender, Creep creep)
        {
            if (!creep.IsValid || creep.Team == myTeam || creep.UnitType != 1152)
            {
                return;
            }

            var wave = CreepWaves.FirstOrDefault(x => !x.IsSpawned && x.Creeps.Any(z => z.Distance2D(creep) < 300));

            if (wave != null)
            {
                wave.Creeps.Add(creep);
            }
            else
            {
                var laneData = lanePaths.GetLaneData(creep.Position);
                if (laneData == null)
                {
                    return;
                }

                var newWave = new CreepWave(laneData.Value, creep.Team);
                newWave.Creeps.Add(creep);

                CreepWaves.Add(newWave);
            }
        }
예제 #3
0
 private void SpawnCreepWaves()
 {
     foreach (var creepWave in CreepWaves.Where(x => !x.IsSpawned))
     {
         creepWave.Spawn();
     }
 }
예제 #4
0
 private void AddCreepWaves()
 {
     foreach (var wave in Waves)
     {
         CreepWaves.Add(new CreepWave(wave));
     }
     WaveGenerator = new WaveGenerator(CreepWaves);
 }
예제 #5
0
        public void Dispose()
        {
            IsActive = false;

            Entity.OnBoolPropertyChange  -= OnBoolPropertyChange;
            Entity.OnInt32PropertyChange -= OnInt32PropertyChange;

            EntityManager <Creep> .EntityAdded   -= OnEntityAdded;
            EntityManager <Creep> .EntityRemoved -= OnEntityRemoved;

            CreepWaves.Clear();
        }
예제 #6
0
        private static Vector3 GetNextWave(CreepWaves creepWave)
        {
            float[] distance = { float.MaxValue };
            var     p        = 0;
            var     coords   = creepWave.Coords.ToArray();

            for (var i = 0; i < coords.Length; i++)
            {
                if (coords[i].Distance2D(creepWave.meepo.Position) < distance[0])
                {
                    distance[0] = coords[i].Distance2D(creepWave.meepo.Position);
                    p           = i + 1 < coords.Length ? i + 1 : i;
                }
            }
            return(coords[p]);
        }
예제 #7
0
        private void OnEntityRemoved(object sender, Creep creep)
        {
            if (!creep.IsValid || creep.Team == myTeam || creep.UnitType != 1152)
            {
                return;
            }

            var wave = CreepWaves.FirstOrDefault(x => x.Creeps.Contains(creep));

            if (wave == null)
            {
                return;
            }

            wave.Creeps.Remove(creep);

            if (wave.Creeps.Any(x => x.IsValid))
            {
                return;
            }

            CreepWaves.Remove(wave);
        }
예제 #8
0
        private static Vector3 GetClosestWave(CreepWaves creepWave)
        {
            var pos = new Vector3();

            try
            {
                float[] distance = { float.MaxValue };
                foreach (var position in creepWave.Coords)
                {
                    if (!(position.Distance2D(creepWave.Position) < distance[0]))
                    {
                        continue;
                    }
                    distance[0] = position.Distance2D(creepWave.Position);
                    pos         = position;
                }
                return(pos);
            }
            catch (Exception)
            {
                Console.WriteLine("Error GetClosestWave");
            }
            return(pos);
        }
예제 #9
0
        private void OnEntityRemoved(object sender, Creep creep)
        {
            if (!creep.IsValid || creep.Team == myTeam || creep.ClassId != ClassId.CDOTA_BaseNPC_Creep_Lane &&
                creep.ClassId != ClassId.CDOTA_BaseNPC_Creep_Siege)
            {
                return;
            }

            var wave = CreepWaves.FirstOrDefault(x => x.Creeps.Contains(creep));

            if (wave == null)
            {
                return;
            }

            wave.Creeps.Remove(creep);

            if (wave.Creeps.Any(x => x.IsValid))
            {
                return;
            }

            CreepWaves.Remove(wave);
        }