예제 #1
0
 // Token: 0x06000434 RID: 1076 RVA: 0x00017138 File Offset: 0x00015338
 private void OnAddTrackingProjectile(TrackingProjectileEventArgs args)
 {
     try
     {
         TrackingProjectile projectile   = args.Projectile;
         Entity             target       = projectile.Target;
         EntityHandle?      entityHandle = (target != null) ? new EntityHandle?(target.Handle) : null;
         if (!(((entityHandle != null) ? new uint?(entityHandle.GetValueOrDefault()) : null) != base.Owner.HeroHandle))
         {
             Unit unit = projectile.Source as Unit;
             if (!(unit == null))
             {
                 Unit9 unit2 = EntityManager9.GetUnit(unit.Handle);
                 if (!(unit2 == null))
                 {
                     this.projectiles[projectile] = unit2.GetAttackDamage(base.Owner, 2, 0f);
                 }
             }
         }
     }
     catch (Exception ex)
     {
         Logger.Error(ex, null);
     }
 }
예제 #2
0
        public static Vector3 AutoAttackDodge_ZipToAroundCircle(TrackingProjectile P, Hero me)
        {
            var    zipTarget = new Vector3(0, 0, 0);
            double X;
            double Y;
            double k;

            switch (P.Source.Name)
            {
            case "npc_dota_hero_obsidian_destroyer":
            {
                if (me.Rotation < 0)
                {
                    k = me.RotationRad + Math.PI / 2;
                }
                else
                {
                    k = me.RotationRad - Math.PI / 2;
                }
                X           = me.Position.X + 100 * Math.Cos(k);
                Y           = me.Position.Y + 100 * Math.Sin(k);
                zipTarget.X = Convert.ToSingle(X);
                zipTarget.Y = Convert.ToSingle(Y);
                zipTarget.Z = me.Position.Z;
                break;
            }

            default:
            {
                break;
            }
            }
            return(zipTarget);
        }
예제 #3
0
 public void AddProjectile(TrackingProjectile projectile, Unit9 target)
 {
     this.Drawer.Dispose(AbilityObstacleDrawer.Type.Rectangle);
     this.Projectile = projectile;
     this.Target     = target;
     this.IsUpdated  = true;
 }
예제 #4
0
    public override void Shoot()
    {
        TrackingProjectile cannonBall = Instantiate(ProjectilePrefab, FirePoint.transform.position, Quaternion.identity) as TrackingProjectile;

        cannonBall.Damage = GetDamageInstance();
        cannonBall.Target = Target.transform;
    }
예제 #5
0
        // Token: 0x060002C4 RID: 708 RVA: 0x00011870 File Offset: 0x0000FA70
        private bool MoveToProjectile(Unit9 target)
        {
            if (!this.CanMove())
            {
                return(false);
            }
            TrackingProjectile trackingProjectile = ObjectManager.TrackingProjectiles.FirstOrDefault(delegate(TrackingProjectile x)
            {
                if (x.IsValid)
                {
                    Entity source             = x.Source;
                    EntityHandle?entityHandle = (source != null) ? new EntityHandle?(source.Handle) : null;
                    if (((entityHandle != null) ? new uint?(entityHandle.GetValueOrDefault()) : null) == base.Owner.Handle)
                    {
                        Entity target3 = x.Target;
                        return(target3 != null && target3.IsValid);
                    }
                }
                return(false);
            });

            if (trackingProjectile == null)
            {
                return(false);
            }
            Entity  target2           = trackingProjectile.Target;
            Vector3 predictedPosition = target.GetPredictedPosition(trackingProjectile.Position.Distance2D(target2.Position, false) / (float)trackingProjectile.Speed + Game.Ping / 1000f);
            Vector3 position          = Vector3Extensions.Extend2D(target2.Position, predictedPosition, -base.Owner.Distance(target2.Position));

            base.Owner.BaseUnit.Move(position);
            return(true);
        }
예제 #6
0
        private bool IsValid(TrackingProjectile projectile)
        {
            if (this.heroesOnly && !(projectile.Source is Hero))
            {
                return(false);
            }

            return(true);
        }
예제 #7
0
        public ProjectileObstacle(EvadableAbility ability, TrackingProjectile projectile, Unit9 target)
            : base(ability)
        {
            //todo improve

            this.Projectile = projectile;
            this.Target     = target;
            this.Speed      = ability.ActiveAbility.Speed;
        }
 /// <summary>
 ///     The projectile added.
 /// </summary>
 /// <param name="projectile">
 ///     The projectile.
 /// </param>
 public void ProjectileAdded(TrackingProjectile projectile)
 {
     this.StartTime = Game.RawGameTime - Game.AvgPing / 1000;
     this.AbilitySkill.AreaOfEffect.AbilityProjectile(projectile);
     foreach (var particleObserver in this.projectileObservers)
     {
         particleObserver.OnNext(this);
     }
 }
예제 #9
0
 public virtual void AddProjectile(TrackingProjectile projectile, Unit9 target)
 {
     if (this.TargetableObstacle != null && this.EndCastTime + 0.5f > GameManager.RawGameTime)
     {
         this.TargetableObstacle.AddProjectile(projectile, target);
     }
     else
     {
         var projectileObstacle = new ProjectileObstacle(this, projectile, target);
         this.Pathfinder.AddObstacle(projectileObstacle);
     }
 }
예제 #10
0
        public StormHammerAoeObstacle(StormHammerEvadable ability, TrackingProjectile projectile, Unit9 target)
            : this(ability)
        {
            const int RadiusIncrease = 50;
            const int RangeIncrease  = 100;

            this.Speed           = ability.RangedAbility.Speed;
            this.Radius          = ability.RangedAbility.Radius + RadiusIncrease;
            this.Range           = ability.RangedAbility.Range + RangeIncrease;
            this.EndObstacleTime = GameManager.RawGameTime + (this.Range / this.Speed);

            this.AddProjectile(projectile, target);
        }
예제 #11
0
        public override void AddProjectile(TrackingProjectile projectile, Unit9 target)
        {
            if (this.targetableObstacle != null && this.EndCastTime + 0.5f > GameManager.RawGameTime)
            {
                this.targetableObstacle.AddProjectile(projectile, target);
                this.stormHammerAoeObstacle.AddProjectile(projectile, target);
            }
            else
            {
                var projectileObstacle = new ProjectileObstacle(this, projectile, target);
                this.Pathfinder.AddObstacle(projectileObstacle);

                var aoeObstacle = new StormHammerAoeObstacle(this, projectile, target);
                this.Pathfinder.AddObstacle(aoeObstacle);
            }
        }
예제 #12
0
        public static Vector3 AutoAttackDodge_ZipTo(TrackingProjectile P, Hero me, float D)
        {
            var    zipTarget = new Vector3(0, 0, 0);
            double X;
            double Y;

            switch (P.Source.Name)
            {
            case "npc_dota_hero_obsidian_destroyer":
            {
                X           = me.Position.X + D * Math.Cos(me.RotationRad);
                Y           = me.Position.Y + D * Math.Sin(me.RotationRad);
                zipTarget.X = Convert.ToSingle(X);
                zipTarget.Y = Convert.ToSingle(Y);
                zipTarget.Z = me.Position.Z;
                break;
            }

            case "queenofpain_scream_of_pain":
            {
                X           = me.Position.X + D * Math.Cos(me.RotationRad);
                Y           = me.Position.Y + D * Math.Sin(me.RotationRad);
                zipTarget.X = Convert.ToSingle(X);
                zipTarget.Y = Convert.ToSingle(Y);
                zipTarget.Z = me.Position.Z;
                break;
            }

            case "npc_dota_hero_centaur":
            {
                X           = me.Position.X + D * Math.Cos(me.RotationRad);
                Y           = me.Position.Y + D * Math.Sin(me.RotationRad);
                zipTarget.X = Convert.ToSingle(X);
                zipTarget.Y = Convert.ToSingle(Y);
                zipTarget.Z = me.Position.Z;
                break;
            }

            default:
            {
                break;
            }
            }

            return(zipTarget);
        }
    override protected void fireProjectile(GameObject bullet, Transform player)
    {
        if (channeler == null)
        {
            channeler = player.FindChild("channeler");
        }
        TrackingProjectile proj = bullet.GetComponent <TrackingProjectile>();

        proj.SetOnCollision(onCollision, onCollisionTargets);
        proj.maxTurn = projManeuverability;
        bullet.transform.position = channeler.position;

        float   angle     = 45 * Mathf.Sign(player.localScale.x);
        Vector3 facingDir = player.right * Mathf.Sign(player.localScale.x);
        Vector3 firingDir = Quaternion.AngleAxis(angle, Vector3.forward) * facingDir;

        bullet.transform.right = firingDir;
        //bullet.rigidbody2D.AddForce(firingDir*bulletVelocity);
    }
예제 #14
0
        public static Vector3 SpellDodge_ZipFront(TrackingProjectile P, Hero me, float D)
        {
            var    zipTarget = new Vector3(0, 0, 0);
            double X;
            double Y;

            if (P.Source.Name == "npc_dota_hero_queenofpain" && P.Speed == 900)
            {
                X           = me.Position.X + D * Math.Cos(me.RotationRad);
                Y           = me.Position.Y + D * Math.Sin(me.RotationRad);
                zipTarget.X = Convert.ToSingle(X);
                zipTarget.Y = Convert.ToSingle(Y);
                zipTarget.Z = me.Position.Z;
            }
            else
            {
                zipTarget = me.Position;
            }
            return(zipTarget);
        }
예제 #15
0
 /// <summary>
 ///     The distance between two projectiles
 /// </summary>
 /// <param name="p1">
 ///     The p 1.
 /// </param>
 /// <param name="p2">
 ///     The p 2.
 /// </param>
 /// <returns>
 ///     The <see cref="float" />.
 /// </returns>
 public static float Distance2D(this TrackingProjectile p1, TrackingProjectile p2)
 {
     return p1.Position.Distance2D(p2.Position);
 }
예제 #16
0
 /// <summary>
 ///     The distance between two projectiles
 /// </summary>
 /// <param name="p1">
 ///     The p 1.
 /// </param>
 /// <param name="p2">
 ///     The p 2.
 /// </param>
 /// <returns>
 ///     The <see cref="float" />.
 /// </returns>
 public static float Distance2D(this TrackingProjectile p1, TrackingProjectile p2)
 {
     return(p1.Position.Distance2D(p2.Position));
 }
예제 #17
0
 public void AddProjectile(TrackingProjectile projectile)
 {
     this.Projectile = projectile;
 }
예제 #18
0
 public TrackingProjectileCommand(TrackingProjectile tp)
 {
     m_MoveSpeed    = tp.moveSpeed;
     m_VisionRadius = tp.visionRadius;
 }
예제 #19
0
 public void AddProjectile(TrackingProjectile projectile, Unit9 target)
 {
     this.Projectile = projectile;
     this.Target     = target;
     this.IsUpdated  = true;
 }
예제 #20
0
 public static bool IsAutoAttackProjectile(this TrackingProjectile projectile)
 {
     return((projectile.Flags & 256) != 0);
 }
예제 #21
0
        private static void AutoAttackDodge(Hero enemy, Hero me, int ZipDistance, int DistanceInPosition, int projectileDistanceThreshold, TrackingProjectile attackProjectile, bool projectileInAir)
        {
            var zip = me.Spellbook.SpellR;

            if (enemy.IsAttacking() && ObjectManager.GetEntities <Hero>()
                .Where(x => Distance2D(x, enemy) < enemy.AttackRange + 150 && x.Team == me.Team) // Valid targets within range (over slightly to account for movement during abilityphase)
                .OrderBy(x => RadiansToFace(enemy, x))                                           // Orders targets based on radians required to be facing exactly
                .FirstOrDefault() == me &&
                Distance2D(enemy, me) > DistanceInPosition &&
                (!projectileInAir)
                // || (projectileInAir && Distance2D(attackProjectile.Position, me.Position) > projectileDistanceThreshold))
                )
            {
                var zipTarget = ZipZap.ZipFacingDirection(me, ZipDistance);
                if (Utils.SleepCheck("AutoAttackDodge"))
                {
                    me.Stop();
                    PowerTread.changePowerTread();
                    zip.UseAbility(zipTarget);
                    Utils.Sleep(1000, "AutoAttackDodge");
                }
            }
        }
예제 #22
0
 /// <summary>
 ///     The distance between projectile and entity.
 /// </summary>
 /// <param name="projectile">
 ///     The projectile.
 /// </param>
 /// <param name="entity">
 ///     The entity.
 /// </param>
 /// <returns>
 ///     The <see cref="float" />.
 /// </returns>
 public static float Distance2D(this TrackingProjectile projectile, Entity entity)
 {
     return(projectile.Position.Distance2D(entity.Position));
 }
예제 #23
0
 /// <summary>
 ///     The projectile added.
 /// </summary>
 /// <param name="projectile">
 ///     The projectile.
 /// </param>
 public void ProjectileAdded(TrackingProjectile projectile)
 {
     this.StartTime = Game.RawGameTime - Game.AvgPing / 1000;
     this.AbilitySkill.AreaOfEffect.AbilityProjectile(projectile);
     this.abilityProjectileProvider.Next(this);
 }
예제 #24
0
        public override void AddProjectile(TrackingProjectile projectile, Unit9 target)
        {
            var projectileObstacle = new ProjectileObstacle(this, projectile, target);

            this.Pathfinder.AddObstacle(projectileObstacle);
        }
예제 #25
0
        // Token: 0x060002E6 RID: 742 RVA: 0x00011E14 File Offset: 0x00010014
        public override bool Combo(TargetManager targetManager, ComboModeMenu comboModeMenu)
        {
            AbilityHelper abilityHelper = new AbilityHelper(targetManager, comboModeMenu, this);
            Unit9         target        = targetManager.Target;

            if (abilityHelper.UseAbility(this.hex, true))
            {
                return(true);
            }
            if (abilityHelper.CanBeCasted(this.vortex, true, true, true, true) && (target.CanBecomeMagicImmune || target.CanBecomeInvisible) && abilityHelper.UseAbility(this.vortex, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.bloodthorn, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.orchid, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.nullifier, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.dagon, true))
            {
                return(true);
            }
            if (abilityHelper.UseAbility(this.shiva, true))
            {
                return(true);
            }
            bool flag = base.Owner.CanAttack(target, 25f) && base.Owner.HasModifier("modifier_storm_spirit_overload");
            TrackingProjectile trackingProjectile = ObjectManager.TrackingProjectiles.FirstOrDefault(delegate(TrackingProjectile x)
            {
                Entity source             = x.Source;
                EntityHandle?entityHandle = (source != null) ? new EntityHandle?(source.Handle) : null;
                if (((entityHandle != null) ? new uint?(entityHandle.GetValueOrDefault()) : null) == this.Handle)
                {
                    Entity target = x.Target;
                    entityHandle  = ((target != null) ? new EntityHandle?(target.Handle) : null);
                    if (((entityHandle != null) ? new uint?(entityHandle.GetValueOrDefault()) : null) == target.Handle)
                    {
                        return(ProjectileExtensions.IsAutoAttackProjectile(x));
                    }
                }
                return(false);
            });

            if (flag)
            {
                if (trackingProjectile == null)
                {
                    return(false);
                }
                int num = (target.IsMoving && target.GetAngle(trackingProjectile.Position, false) > 1.5f) ? 250 : 450;
                if (trackingProjectile.Position.Distance2D(trackingProjectile.TargetPosition, false) > (float)num)
                {
                    return(false);
                }
            }
            else
            {
                if (trackingProjectile != null)
                {
                    Ability9 ability = base.Owner.Abilities.FirstOrDefault((Ability9 x) => x.Id == AbilityId.storm_spirit_overload);
                    if (ability != null)
                    {
                        int   attackDamage = base.Owner.GetAttackDamage(target, 0, 0f);
                        int   damage       = ability.GetDamage(target);
                        float health       = target.Health;
                        if ((float)attackDamage < health && (float)(attackDamage + damage) > health)
                        {
                            if (abilityHelper.CanBeCasted(this.remnant, false, false, true, true) && abilityHelper.ForceUseAbility(this.remnant, true, true))
                            {
                                return(true);
                            }
                            if (abilityHelper.CanBeCasted(this.ball, false, false, true, true) && trackingProjectile.Position.Distance2D(trackingProjectile.TargetPosition, false) / (float)trackingProjectile.Speed > this.ball.Ability.CastPoint && abilityHelper.ForceUseAbility(this.ball, true, true))
                            {
                                return(true);
                            }
                        }
                    }
                }
                if (abilityHelper.UseAbility(this.vortex, true))
                {
                    base.ComboSleeper.ExtendSleep(0.1f);
                    BallLightning ballLightning = this.ball;
                    if (ballLightning != null)
                    {
                        ballLightning.Sleeper.Sleep(1f);
                    }
                    return(true);
                }
                if (abilityHelper.UseAbility(this.remnant, true))
                {
                    base.ComboSleeper.ExtendSleep(0.1f);
                    BallLightning ballLightning2 = this.ball;
                    if (ballLightning2 != null)
                    {
                        ballLightning2.Sleeper.Sleep(1f);
                    }
                    return(true);
                }
            }
            return(abilityHelper.UseAbility(this.ball, true));
        }
예제 #26
0
 public static bool IsAutoAttackProjectile(this TrackingProjectile projectile)
 {
     return(projectile.IsAttack);
 }