private void OnAddTrackingProjectile(TrackingProjectileAddedEventArgs args) { if (!this.Menu.AbilitySettings.IsCounterEnabled(this.Ability.Name)) { return; } try { var projectile = args.TrackingProjectile; if (projectile.Target?.Handle != this.Owner.Handle) { return; } var source = projectile.Source as Unit; if (source == null) { return; } var unit = EntityManager9.GetUnit(source.Handle); if (unit == null) { return; } this.projectiles[projectile] = unit.GetAttackDamage(this.Owner, DamageValue.Maximum); } catch (Exception e) { Logger.Error(e); } }
private void OnAddTrackingProjectile(TrackingProjectileAddedEventArgs args) { try { var projectile = args.TrackingProjectile; if (projectile.IsAutoAttackProjectile()) { return; } var target = EntityManager9.GetUnit(projectile.Target.Handle); if (target == null || target.Team != this.myTeam) { return; } var source = projectile.Source; if (source != null) { //// enemy ability, but added though ally //// might add some ability prediction problems... //var thoughAlly = target.Team == this.myTeam && source.Team == this.myTeam; //var ability = this.evadableAbilities.OfType<IProjectile>() // .FirstOrDefault( // x => (int)x.ActiveAbility.Speed == projectile.Speed && x.ActiveAbility.TimeSinceCasted < 1.5f // && (thoughAlly || x.ActiveAbility.Owner.Handle == source.Handle)); var ability = this.evadableAbilities .Where( x => x.Ability.Owner.Handle == source.Handle && (x.Ability.TimeSinceCasted < 1.5f + (x.Ability is IChanneled channeled ? channeled.ChannelTime : 0) || x.Ability.BaseAbility.IsHidden)) .OfType <IProjectile>() .FirstOrDefault(x => (int)x.ActiveAbility.Speed == projectile.Speed); ability?.AddProjectile(projectile, target); return; } var predictedAbilities = this.evadableAbilities.Where( x => !x.Ability.Owner.IsVisible || x.Ability.TimeSinceCasted < 1.5f /*+ x.AdditionalDelay*/) .OfType <IProjectile>() .Where(x => (int)x.ActiveAbility.Speed == projectile.Speed) .ToList(); if (predictedAbilities.Count == 1) { predictedAbilities[0].AddProjectile(projectile, target); } } catch (Exception e) { Logger.Error(e); } }
private void OnAddTrackingProjectile(TrackingProjectileAddedEventArgs args) { if (args.IsCollection) { return; } try { if (!this.Menu.AbilitySettings.IsCounterEnabled(this.Ability.Name)) { return; } var projectile = args.TrackingProjectile; if (projectile == null || projectile.Source == null) { return; } if (projectile.Target?.Handle != this.Ability.Owner.Handle) { return; } var unit = EntityManager9.GetUnit(projectile.Source.Handle); if (unit == null || unit.Team == this.Ability.Owner.Team) { return; } if (this.Ability.CanBeCasted()) { this.ActiveAbility.UseAbility(false, true); } } catch (Exception e) { Logger.Error(e); } }
private void OnAddTrackingProjectile(TrackingProjectileAddedEventArgs e) { try { var source = e.TrackingProjectile.Source; if (source?.IsValid != true) { return; } var controllable = this.controllableUnits.Find(x => x.Handle == source.Handle); if (controllable == null) { return; } controllable.MoveSleeper.Reset(); } catch (Exception ex) { Logger.Error(ex); } }
private void ProjectileManager_TrackingProjectileAdded(TrackingProjectileAddedEventArgs e) { var trackingProjectile = e.TrackingProjectile; Console.WriteLine("TrackingProjectileAdded: " + trackingProjectile.Source + " " + trackingProjectile.Target + " " + trackingProjectile.TargetPosition + " " + trackingProjectile.Handle); }
private void OnAddTrackingProjectile(TrackingProjectileAddedEventArgs e) { try { var projectile = e.TrackingProjectile; if (!projectile.IsAutoAttackProjectile()) { return; } var source = this.unitManager.GetUnit(projectile.Source); if (source?.IsControllable != false) { return; } var target = projectile.Target; if (target == null) { return; } var allUnits = this.unitManager.Units.ToList(); var damages = allUnits.SelectMany(x => x.IncomingDamage).OfType <RangedDamage>().ToList(); var damage = damages.LastOrDefault( x => x.Projectile == null && !x.IsPredicted && x.MinDamage > 0 && x.Source.Unit.Handle == source.Unit.Handle && x.Target.Unit.Handle == target.Handle); if (damage != null) { if (GameManager.RawGameTime < damage.HitTime) { damage.AddProjectile(projectile); } } else { damage = damages.Find(x => x.Projectile == null && x.Source.Unit.Handle == source.Unit.Handle); if (damage != null) { //wrong projectile target damage.Delete(); this.AttackCanceled?.Invoke(this, damage); } var newTarget = allUnits.Find(x => x.Unit.Handle == target.Handle); if (newTarget == null) { return; } damage = (RangedDamage)source.AddDamage(newTarget, 0, false, true); damage.AddProjectile(projectile); } } catch (Exception ex) { Logger.Error(ex); } }