private void OnCreate(InGameObject inGameObject) { if (!Game.IsInGame) { return; } if (ZanderHero.CharName != "Zander") { return; } var baseObject = inGameObject.Get <BaseGameObject>(); if (baseObject != null && baseObject.TeamId == ZanderHero.BaseObject.TeamId) { if (inGameObject.ObjectName.Equals(SpaceCloneName)) { SpaceClone = inGameObject; } else if (inGameObject.ObjectName.Equals(EX2CloneName)) { EX2Clone = inGameObject; } else if (inGameObject.ObjectName.Equals(UltiCloneName)) { UltiClone = inGameObject; } } }
private static void InGameObject_OnCreate(InGameObject inGameObject) { var baseTypes = inGameObject.GetBaseTypes().ToArray(); if (baseTypes.Contains("CurveProjectile") || baseTypes.Contains("CurveProjectile2")) { var data = AbilityDatabase.Get(inGameObject.ObjectName); if (data == null) { return; } var pos = LocalPlayer.Instance.Pos(); var projectile = inGameObject.Get <CurveProjectileObject>(); var closest = GeometryLib.NearestPointOnFiniteLine(projectile.Position, projectile.TargetPosition, pos); if (pos.Distance(closest) > 6) { return; } var tp = new TrackedCurveProjectile(projectile, data); AddAfterFrame.Add(tp); } }
private static void HealSelf() { InGameObject cloneToUse = null; if (UltiClone != null && ZanderHero.Distance(UltiClone.Get <MapGameObject>().Position) <= M1Range) { cloneToUse = UltiClone; } else if (EX2Clone != null && ZanderHero.Distance(EX2Clone.Get <MapGameObject>().Position) <= M1Range) { cloneToUse = EX2Clone; } else if (SpaceClone != null && ZanderHero.Distance(SpaceClone.Get <MapGameObject>().Position) <= M1Range) { cloneToUse = SpaceClone; } if (cloneToUse != null) { LocalPlayer.EditAimPosition = true; var pred = TestPrediction.GetNormalLinePrediction(cloneToUse.Get <MapGameObject>().Position, ZanderHero, M1Range, M1Speed, M1Radius, true); if (pred.CanHit && MiscUtils.CanCast(AbilitySlot.Ability1)) { LocalPlayer.Aim(pred.CastPosition); LocalPlayer.PressAbility(AbilitySlot.Ability1, true); } } }
private static void OnCreateHandler(InGameObject gameObject) { if (gameObject == null) { Console.WriteLine("[AbilityTracker#OnCreateHandler] GameObject is null, please report this to Hoyer"); return; } if (LocalPlayer.Instance == null) { Console.WriteLine("[AbilityTracker#OnCreateHandler] LocalPlayer is null, please report this to Hoyer"); return; } var baseTypes = gameObject.GetBaseTypes(); if (!baseTypes.Contains("BaseObject")) { return; } var baseObj = gameObject.Get <BaseGameObject>(); if (baseObj != null && baseObj.TeamId != LocalPlayer.Instance.BaseObject.TeamId) { EnemyObjectSpawn.Invoke(gameObject); } }
private static bool EnemyProjectileGoingToHitUnit(InGameObject unit, out Projectile closestProj) { var unitPos = unit.Get <MapGameObject>().Position; var unitRadius = unit.Get <SpellCollisionObject>().SpellCollisionRadius; var enemyProjs = EntitiesManager.ActiveProjectiles.Where(x => x.BaseObject.TeamId != KaanHero.BaseObject.TeamId).OrderBy(x => x.MapObject.Position.Distance(unitPos)); foreach (var enemyProj in enemyProjs) { if (Geometry.CircleVsThickLine(unitPos, unitRadius, enemyProj.StartPosition, enemyProj.CalculatedEndPosition, enemyProj.Radius, false)) { closestProj = enemyProj; return(true); } } closestProj = null; return(false); }
private void OnCreate(InGameObject gameObject) { if (!Game.IsInGame) { return; } var matchedSpecial = SpecialCircleObjects.FirstOrDefault(x => x.Name.Equals(gameObject.ObjectName)); if (matchedSpecial != null) { var baseObject = gameObject.Get <BaseGameObject>(); if (baseObject != null && baseObject.TeamId != JadeHero.BaseObject.TeamId) { matchedSpecial.Active = true; matchedSpecial.Position = gameObject.Get <MapGameObject>().Position; } } }
private static void InGameObject_OnCreate(InGameObject inGameObject) { var data = AbilityDatabase.GetObstacle(inGameObject.ObjectName); if (data == null) { return; } AddAfterFrame.Add(new TrackedObstacleObject(inGameObject.Get <MapGameObject>(), data)); }
private static void InGameObject_OnCreate(InGameObject inGameObject) { if (inGameObject.GetBaseTypes().Contains("TravelBuff")) { var travelObj = inGameObject.Get <TravelBuffObject>(); var data = travelObj.Data(); if (data == null || data.AbilityType != AbilityType.CircleJump) { return; } if (LocalPlayer.Instance.Pos().Distance(travelObj.TargetPosition) > 5) { return; } var tcj = new TrackedCircularJump(travelObj, data); AddAfterFrame.Add(tcj); } }
private static void InGameObject_OnCreate(InGameObject inGameObject) { if (inGameObject.GetBaseTypes().Contains("Throw")) { var throwObj = inGameObject.Get <ThrowObject>(); var data = throwObj.Data(); if (data == null) { return; } if (LocalPlayer.Instance.Pos().Distance(throwObj.TargetPosition) > 5) { return; } var tto = new TrackedThrowObject(throwObj, data); AddAfterFrame.Add(tto); } }
private static void InGameObject_OnCreate(InGameObject inGameObject) { var baseTypes = inGameObject.GetBaseTypes().ToArray(); if (baseTypes.Contains("Dash")) { var dashObj = inGameObject.Get <DashObject>(); var data = dashObj.Data(); if (data == null) { return; } var pos = LocalPlayer.Instance.Pos(); var closest = GeometryLib.NearestPointOnFiniteLine(dashObj.StartPosition, dashObj.TargetPosition, pos); if (pos.Distance(closest) > 5) { return; } var dash = new TrackedDash(dashObj, data); AddAfterFrame.Add(dash); } }
/// <summary> /// Gets the prediction. /// </summary> /// <param name="fromPos">Position where projectile gets fired from.</param> /// <param name="targetUnit">The target unit.</param> /// <param name="range">The ability range.</param> /// <param name="speed">The ability speed.</param> /// <param name="radius">The ability radius (for collision).</param> /// <param name="fixedDelay">The fixed delay. If greater than 0, will use this fixed delay for calculations instead of getting normal best position prediction</param> /// <param name="maxEnemyReactionTime">The maximum enemy reaction time in seconds to calculate HitChance.</param> /// <param name="checkCollision">If set to <c>true</c> [check collision].</param> /// <param name="ignoreFlags">The ignore flags for collision calculations.</param> /// <returns>TestOutput</returns> public static TestOutput GetPrediction(Vector2 fromPos, InGameObject targetUnit, float range, float speed, float radius = 0f, float fixedDelay = 0f, float maxEnemyReactionTime = 1.75f, bool checkCollision = false, CollisionFlags ignoreFlags = CollisionFlags.Bush | CollisionFlags.NPCBlocker) { MapGameObject mapGameObject = targetUnit.Get <MapGameObject>(); NetworkMovementObject networkMovementObject = targetUnit.Get <NetworkMovementObject>(); if (mapGameObject == null) { Logs.Error("TestPrediction: Object of name " + targetUnit.ObjectName + " has no MapGameObject model"); return(new TestOutput() { CanHit = false, Hitchance = TestHitchance.Impossible, CastPosition = Vector2.Zero, }); } var targetPos = mapGameObject.Position; if (networkMovementObject == null) { Logs.Error("TestPrediction: Object of name " + targetUnit.ObjectName + " has no NetworkMovementObject model"); return(new TestOutput() { CanHit = targetPos.Distance(fromPos) <= range ? true : false, Hitchance = targetPos.Distance(fromPos) <= range ? TestHitchance.VeryHigh : TestHitchance.OutOfRange, HitchancePercentage = targetPos.Distance(fromPos) <= range ? 100f : 0f, CastPosition = targetPos, }); } var targetVelocity = networkMovementObject.Velocity; var targetRadius = targetUnit.Get <SpellCollisionObject>().SpellCollisionRadius; //TODO: Check if MapCollisionRadius is better if (fixedDelay < float.Epsilon) //No fixed delay { var predPos = GetStandardPrediction(fromPos, targetPos, speed, targetVelocity); if (predPos == Vector2.Zero) { return(new TestOutput() { CanHit = false, Hitchance = TestHitchance.Impossible, CastPosition = Vector2.Zero, }); } TestOutput solution = new TestOutput() { CanHit = true, CastPosition = predPos, }; var targetCollision = CollisionSolver.CheckThickLineCollision(targetPos, solution.CastPosition, targetRadius); if (targetCollision != null && targetCollision.IsColliding) { solution.CastPosition = targetCollision.CollisionPoint; } if (solution.CastPosition.Distance(fromPos) > range) { solution.CanHit = false; solution.Hitchance = TestHitchance.OutOfRange; } if (checkCollision) { solution.CollisionResult = CollisionSolver.CheckThickLineCollision(fromPos, solution.CastPosition, radius < float.Epsilon ? 0.01f : radius, ignoreFlags); if (solution.CollisionResult.IsColliding) { solution.CanHit = false; solution.Hitchance = TestHitchance.Collision; } } solution.HitchancePercentage = GetHitchance(fromPos, solution.CastPosition, speed, maxEnemyReactionTime, false); solution.Hitchance = GetHitchanceEnum(solution.HitchancePercentage); return(solution); } else //WITH fixed delay { var predPos = GetFixedDelayPrediction(targetPos, fixedDelay, targetVelocity); TestOutput solution = new TestOutput() { CanHit = true, CastPosition = predPos, }; var targetCollision = CollisionSolver.CheckThickLineCollision(targetPos, solution.CastPosition, targetRadius); if (targetCollision != null && targetCollision.IsColliding) { solution.CastPosition = targetCollision.CollisionPoint; } if (solution.CastPosition.Distance(fromPos) > range) { solution.CanHit = false; solution.Hitchance = TestHitchance.OutOfRange; } solution.HitchancePercentage = GetHitchance(fromPos, solution.CastPosition, fixedDelay, maxEnemyReactionTime, true); solution.Hitchance = GetHitchanceEnum(solution.HitchancePercentage); return(solution); } }
public static int EnemiesAroundAlive(this InGameObject gameObj, float distance) { return(EntitiesManager.EnemyTeam.Count(x => !x.Living.IsDead && x.Distance(gameObj.Get <MapGameObject>().Position) <= distance)); }
private static void HealOthers() { var possibleAllies = EntitiesManager.LocalTeam.Where(x => !x.IsLocalPlayer && !x.Living.IsDead); //var allyToHealM1 = possibleAllies.Where(x => x.Distance(ZanderHero) < M1Range) // .OrderBy(x => x.Living.Health) // .FirstOrDefault(x => x.Living.Health < x.Living.MaxRecoveryHealth); var allyToHealEX1 = possibleAllies.Where(x => x.Distance(ZanderHero) < EX1Range) .OrderBy(x => x.Living.Health) .FirstOrDefault(x => x.HasHardCC() && x.EnemiesAroundAlive(5f) > 0); var nearMouseAllyZander = TargetSelector.GetAlly(TargetingMode.NearMouse, M1Range); var nearMouseAllySpace = SpaceClone == null ? null : TargetSelector.GetAlly(TargetingMode.NearMouse, M1Range, SpaceClone.Get <MapGameObject>().Position); var nearMouseAllyEX2 = EX2Clone == null ? null : TargetSelector.GetAlly(TargetingMode.NearMouse, M1Range, EX2Clone.Get <MapGameObject>().Position); var nearMouseAllyUlti = UltiClone == null ? null : TargetSelector.GetAlly(TargetingMode.NearMouse, M1Range, UltiClone.Get <MapGameObject>().Position); var isCastingOrChanneling = ZanderHero.AbilitySystem.IsCasting || ZanderHero.IsChanneling; if (isCastingOrChanneling && LastAbilityFired == null) { LastAbilityFired = CastingIndexToSlot(ZanderHero.AbilitySystem.CastingAbilityIndex); } var myPos = ZanderHero.MapObject.Position; if (isCastingOrChanneling) { LocalPlayer.EditAimPosition = true; switch (LastAbilityFired) { case AbilitySlot.Ability1: if (nearMouseAllyZander != null) { var pred = TestPrediction.GetNormalLinePrediction(myPos, nearMouseAllyZander, M1Range, M1Speed, M1Radius, true); if (pred.CanHit) { LocalPlayer.Aim(pred.CastPosition); } else { LocalPlayer.PressAbility(AbilitySlot.Interrupt, true); } } else if (nearMouseAllyUlti != null) { var pred = TestPrediction.GetNormalLinePrediction(UltiClone.Get <MapGameObject>().Position, nearMouseAllyUlti, M1Range, M1Speed, M1Radius, true); if (pred.CanHit) { LocalPlayer.Aim(pred.CastPosition); } else { LocalPlayer.PressAbility(AbilitySlot.Interrupt, true); } } else if (nearMouseAllySpace != null) { var pred = TestPrediction.GetNormalLinePrediction(SpaceClone.Get <MapGameObject>().Position, nearMouseAllySpace, M1Range, M1Speed, M1Radius, true); if (pred.CanHit) { LocalPlayer.Aim(pred.CastPosition); } else { LocalPlayer.PressAbility(AbilitySlot.Interrupt, true); } } else if (nearMouseAllyEX2 != null) { var pred = TestPrediction.GetNormalLinePrediction(EX2Clone.Get <MapGameObject>().Position, nearMouseAllyEX2, M1Range, M1Speed, M1Radius, true); if (pred.CanHit) { LocalPlayer.Aim(pred.CastPosition); } else { LocalPlayer.PressAbility(AbilitySlot.Interrupt, true); } } break; case AbilitySlot.EXAbility1: if (allyToHealEX1 != null) { var pred = TestPrediction.GetPrediction(myPos, allyToHealEX1, EX1Range, 0f, EX1Radius, EX1AirTime); if (pred.CanHit) { LocalPlayer.Aim(pred.CastPosition); } } break; } } else { LocalPlayer.EditAimPosition = false; LastAbilityFired = null; } if (HealMenu.GetBoolean("heal.useEX1.CC") && MiscUtils.CanCast(AbilitySlot.EXAbility1)) { if (LastAbilityFired == null && allyToHealEX1 != null && allyToHealEX1.Living.HealthPercent <= HealMenu.GetSlider("heal.useEX1.CC.minHealth")) { var pred = TestPrediction.GetPrediction(myPos, allyToHealEX1, EX1Range, 0f, EX1Radius, EX1AirTime); if (pred.CanHit) { LocalPlayer.PressAbility(AbilitySlot.EXAbility1, true); } } } if (HealMenu.GetBoolean("heal.useM1") && MiscUtils.CanCast(AbilitySlot.Ability1)) { if (LastAbilityFired == null) { if (nearMouseAllyUlti != null) { var pred = TestPrediction.GetNormalLinePrediction(UltiClone.Get <MapGameObject>().Position, nearMouseAllyUlti, M1Range, M1Speed, M1Radius, true); if (pred.CanHit) { LocalPlayer.PressAbility(AbilitySlot.Ability1, true); } } else if (nearMouseAllyZander != null) { var pred = TestPrediction.GetNormalLinePrediction(myPos, nearMouseAllyZander, M1Range, M1Speed, M1Radius, true); if (pred.CanHit) { LocalPlayer.PressAbility(AbilitySlot.Ability1, true); } } else if (nearMouseAllySpace != null) { var pred = TestPrediction.GetNormalLinePrediction(SpaceClone.Get <MapGameObject>().Position, nearMouseAllySpace, M1Range, M1Speed, M1Radius, true); if (pred.CanHit) { LocalPlayer.PressAbility(AbilitySlot.Ability1, true); } } else if (nearMouseAllyEX2 != null) { var pred = TestPrediction.GetNormalLinePrediction(EX2Clone.Get <MapGameObject>().Position, nearMouseAllyEX2, M1Range, M1Speed, M1Radius, true); if (pred.CanHit) { LocalPlayer.PressAbility(AbilitySlot.Ability1, true); } } } } }