private float GetRequiredTime(Unit9 ally, Vector3 movePosition, float remainingTime, out DodgeAbility speedBuffAbility) { var turnTime = ally.GetTurnTime(movePosition); var distance = ally.Distance(movePosition); var speed = ally.Speed; var requiredTime = turnTime + (distance / speed); if (remainingTime > requiredTime) { speedBuffAbility = null; return(requiredTime); } speedBuffAbility = this.dodgeAbilities.Where(x => x.CanBeCasted(ally, null, null)) .OrderByDescending(x => x.SpeedBuffAbility.GetSpeedBuff(ally)) .FirstOrDefault(); if (speedBuffAbility == null) { return(requiredTime); } return(turnTime + (distance / (speed + speedBuffAbility.SpeedBuffAbility.GetSpeedBuff(ally)))); }
private bool?UseSingleBlink(Unit9 owner, IEnumerable <OldBlinkAbility> blinkAbilities, Vector3 position, float distance) { foreach (var blinkAbility in blinkAbilities) { if (blinkAbility.Blink.Range < distance) { continue; } switch (blinkAbility.Blink.BlinkType) { case BlinkType.Blink: { if (!blinkAbility.Use(position)) { return(false); } if (blinkAbility.Ability.Speed <= 0) { return(true); } return(null); } case BlinkType.Leap: { if (owner.GetAngle(position) > 0.2) { owner.BaseUnit.Move(owner.Position.Extend2D(position, 25)); this.OrbwalkSleeper.Sleep(owner.Handle, owner.GetTurnTime(position)); return(null); } if (!blinkAbility.Use(owner)) { return(false); } if (blinkAbility.Ability.Speed <= 0) { return(true); } return(null); } } } return(false); }
// Token: 0x06000046 RID: 70 RVA: 0x0000F638 File Offset: 0x0000D838 public PredictionOutput9 GetSimplePrediction(PredictionInput9 input) { Unit9 target = input.Target; Vector3 position = input.Target.Position; Unit9 caster = input.Caster; bool isVisible = target.IsVisible; float num = input.Delay; PredictionOutput9 predictionOutput = new PredictionOutput9 { Target = target }; if (target.Equals(caster)) { predictionOutput.HitChance = HitChance.High; predictionOutput.TargetPosition = position; predictionOutput.CastPosition = position; return(predictionOutput); } if (input.RequiresToTurn) { num += caster.GetTurnTime(position); } if (input.Speed > 0f) { num += caster.Distance(position) / input.Speed; } Vector3 predictedPosition = target.GetPredictedPosition(num); predictionOutput.TargetPosition = predictedPosition; predictionOutput.CastPosition = predictedPosition; if (!isVisible) { predictionOutput.HitChance = HitChance.Low; return(predictionOutput); } if (target.IsStunned || target.IsRooted || target.IsHexed) { predictionOutput.HitChance = HitChance.Immobile; return(predictionOutput); } if (!target.IsMoving && !caster.IsVisibleToEnemies) { predictionOutput.HitChance = HitChance.High; return(predictionOutput); } predictionOutput.HitChance = ((num > 0.5f) ? HitChance.Medium : HitChance.High); return(predictionOutput); }
public override float GetRequiredTime(Unit9 ally, Unit9 enemy, IObstacle obstacle) { var remainingTime = obstacle.GetEvadeTime(ally, true) - this.ActiveAbility.CastPoint; this.tree = this.trees .Where( x => x.IsValid && x.IsAlive && ally.Distance(x.Position) < this.ActiveAbility.CastRange && (GameManager.RawGameTime > this.ultEndTime || x.Distance2D(this.ultPosition) < this.ult.Radius - 50)) .OrderBy(x => x.Distance2D(this.FountainPosition)) .FirstOrDefault(x => ally.GetTurnTime(x.Position) + 0.1f < remainingTime); if (this.tree == null) { return(9999); } return(this.ActiveAbility.GetCastDelay(this.tree.Position) + 0.15f); }
// Token: 0x060008C7 RID: 2247 RVA: 0x00027A9C File Offset: 0x00025C9C private bool?UseSingleBlink(Unit9 owner, IEnumerable <OldBlinkAbility> blinkAbilities, Vector3 position, float distance) { foreach (OldBlinkAbility oldBlinkAbility in blinkAbilities) { if (oldBlinkAbility.Blink.Range >= distance) { BlinkType blinkType = oldBlinkAbility.Blink.BlinkType; if (blinkType != null) { if (blinkType == 1) { if ((double)owner.GetAngle(position, false) > 0.2) { owner.BaseUnit.Move(Vector3Extensions.Extend2D(owner.Position, position, 25f)); base.OrbwalkSleeper.Sleep(owner.Handle, owner.GetTurnTime(position)); return(null); } if (!oldBlinkAbility.Use(owner)) { return(new bool?(false)); } if (oldBlinkAbility.Ability.Speed <= 0f) { return(new bool?(true)); } return(null); } } else { if (!oldBlinkAbility.Use(position)) { return(new bool?(false)); } if (oldBlinkAbility.Ability.Speed <= 0f) { return(new bool?(true)); } return(null); } } } return(new bool?(false)); }
public override float GetRequiredTime(Unit9 ally, Unit9 enemy, IObstacle obstacle) { var additionalTime = 0f; this.position = Vector3.Zero; switch (obstacle.EvadableAbility) { case HomingMissileEvadable _: { var missilePosition = ((HomingMissileObstacle)obstacle).Position; this.position = ally.Position.Extend2D(missilePosition, 199); additionalTime += ally.GetTurnTime(this.position); break; } case PhantomsEmbraceEvadable _: { var casterPosition = obstacle.Caster.Position; var range = 225 + (50 * this.Ability.Level); this.position = ally.Position.Extend2D(casterPosition, range); additionalTime += ally.GetTurnTime(this.position) + 0.07f; break; } case ChargeOfDarknessEvadable _: { var spiritBreakerPosition = obstacle.Caster.Position; var range = 175 + (50 * this.Ability.Level); this.position = ally.Position.Extend2D(spiritBreakerPosition, range); additionalTime += ally.GetTurnTime(this.position) + 0.3f; break; } case TargetableProjectileEvadable projectile: { if (!projectile.IsDisjointable) { this.position = ally.Position.Extend2D(enemy.Position, 199); additionalTime += ally.GetTurnTime(this.position); } if (obstacle.EvadableAbility.Ability.Id == AbilityId.sven_storm_bolt) { this.position = ally.InFront(300); } additionalTime += 0.05f; break; } case LinearProjectileEvadable _: case ConeProjectileEvadable _: case AreaOfEffectEvadable _ when obstacle.EvadableAbility.Ability.Id == AbilityId.venomancer_poison_nova: { var path = this.pathfinder.GetPathFromObstacle(ally, ally.Speed, ally.Position, 69, out var success); if (!success) { return(69); } this.position = path.Last(); additionalTime += ally.GetTurnTime(this.position) + 0.05f; break; } case AreaOfEffectEvadable _: { //todo more aoe spells with speed var pathAoe = this.pathfinder.GetPathFromObstacle(ally, ally.Speed, ally.Position, 69, out var success); if (!success) { return(69); } var safePosition = pathAoe.Last().Extend2D(this.Owner.Position, -50); switch (obstacle.EvadableAbility.Ability.Id) { case AbilityId.nevermore_requiem: { if (ally.Distance(enemy.Position) < 600) { this.position = safePosition; } else { var jumpPosition = ally.Position.Extend2D(enemy.Position, 600); this.position = this.Owner.Distance(jumpPosition) > this.Owner.Distance(safePosition) ? safePosition : jumpPosition; } additionalTime += ally.GetTurnTime(this.position) + 0.15f; break; } case AbilityId.tidehunter_ravage: { if (ally.Distance(enemy.Position) < 600) { this.position = safePosition; } else { var jumpPosition = ally.Position.Extend2D(enemy.Position, 600); this.position = this.Owner.Distance(jumpPosition) > this.Owner.Distance(safePosition) ? safePosition : jumpPosition; } additionalTime += ally.GetTurnTime(this.position) + 0.1f; break; } } break; } } if (this.position.IsZero) { this.position = ally.InFront(ally.IsMoving ? 190 : 90); } return(this.ActiveAbility.GetHitTime(ally) + additionalTime); }