public override void Initialize() { Priority = SkillPriority.Medium; Range = 60; PreCast = new SkillPreCast(SkillPrecastFlags.CheckCanCast | SkillPrecastFlags.CheckPlayerIncapacitated); ClusterConditions.Add(new SkillClusterConditions(4d, Range, 3, false, useRadiusDistance: true)); var IntersectingUnitTargetConditions = new UnitTargetConditions { TrueConditionFlags = TargetProperties.None, MaximumDistance = Range, Criteria = (unit) => unit.TargetInfo.IntersectingUnits > 2 }; SingleUnitCondition.Add(IntersectingUnitTargetConditions); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, Range, falseConditionalFlags: TargetProperties.Normal)); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.Summoner, Range, falseConditionalFlags: TargetProperties.LowHealth)); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.AvoidanceSummoner, Range, falseConditionalFlags: TargetProperties.LowHealth)); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.Debuffing, Range, falseConditionalFlags: TargetProperties.LowHealth)); FCombatMovement = v => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Settings.General.OutOfCombatMovement && !FunkyGame.Hero.Class.bWaitingForSpecial && FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > Range) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, Range)); } return(v); } return(Vector3.Zero); }; FOutOfCombatMovement = v => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > Range) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, Range)); } return(v); } return(Vector3.Zero); }; }
public override void Initialize() { WaitVars = new WaitLoops(1, 1, true); Range = 48; Priority = SkillPriority.High; PreCast = new SkillPreCast((SkillPrecastFlags.CheckPlayerIncapacitated | SkillPrecastFlags.CheckCanCast)); ClusterConditions.Add(new SkillClusterConditions(5d, 48f, 2, false, minDistance: 15f)); FcriteriaCombat = (u) => { return((FunkyBaseExtension.Settings.Wizard.bTeleportFleeWhenLowHP && (FunkyGame.Hero.dCurrentHealthPct < 0.5d) || (FunkyGame.Targeting.Cache.RequiresAvoidance)) || (FunkyBaseExtension.Settings.Wizard.bTeleportIntoGrouping && LastConditionPassed == ConditionCriteraTypes.Cluster) || (!FunkyBaseExtension.Settings.Wizard.bTeleportFleeWhenLowHP && !FunkyBaseExtension.Settings.Wizard.bTeleportIntoGrouping)); }; FCombatMovement = v => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (!FunkyGame.Hero.Class.bWaitingForSpecial && FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 25f) { if (fDistanceFromTarget > 50f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 50f)); } return(v); } return(Vector3.Zero); }; FOutOfCombatMovement = v => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > 50f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 50f)); } return(v); } return(Vector3.Zero); }; }
public override void Initialize() { WaitVars = new WaitLoops(0, 1, true); Cost = 15; Range = 50; Priority = SkillPriority.High; PreCast = new SkillPreCast((SkillPrecastFlags.CheckPlayerIncapacitated | SkillPrecastFlags.CheckCanCast | SkillPrecastFlags.CheckEnergy)); ClusterConditions.Add(new SkillClusterConditions(5d, 48f, 2, false)); //TestCustomCombatConditionAlways=true, FcriteriaCombat = (u) => ((FunkyBaseExtension.Settings.Wizard.bTeleportFleeWhenLowHP && FunkyGame.Hero.dCurrentHealthPct < 0.5d) || (FunkyBaseExtension.Settings.Wizard.bTeleportIntoGrouping && FunkyGame.Targeting.Cache.Clusters.AbilityClusterCache(combatClusterCondition).Count > 0 && FunkyGame.Targeting.Cache.Clusters.AbilityClusterCache(combatClusterCondition)[0].Midpoint.Distance(FunkyGame.Hero.Position) > 15f) || (!FunkyBaseExtension.Settings.Wizard.bTeleportFleeWhenLowHP && !FunkyBaseExtension.Settings.Wizard.bTeleportIntoGrouping)); FCombatMovement = v => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (!FunkyGame.Hero.Class.bWaitingForSpecial && FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 25f) { if (fDistanceFromTarget > 50f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 50f)); } return(v); } return(Vector3.Zero); }; FOutOfCombatMovement = v => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 10f) { if (fDistanceFromTarget > 50f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 50f)); } return(v); } return(Vector3.Zero); }; }
public override void Initialize() { WaitVars = new WaitLoops(0, 0, true); Priority = SkillPriority.High; PreCast = new SkillPreCast((SkillPrecastFlags.CheckCanCast)); if (Equipment.CheckLegendaryItemCount(LegendaryItemTypes.RaimentoftheJadeHarvester, 6)) { IsSpecialMovementSkill = true; } //IsSpecialMovementSkill = true; //IsBuff=true; //FcriteriaBuff=() => FunkyBaseExtension.Settings.General.OutOfCombatMovement; //Use buff at location (no prediction required!) FOutOfCombatMovement = (v) => v; FCombatMovement = (v) => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (!FunkyGame.Hero.Class.bWaitingForSpecial && FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > 35f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 35f)); } else { return(v); } } return(Vector3.Zero); }; Range = 6; ClusterConditions.Add(new SkillClusterConditions(7d, 30f, 4, false, 0, ClusterProperties.None, 10f, true)); FcriteriaCombat = (u) => ((LastConditionPassed == ConditionCriteraTypes.Cluster) || (FunkyGame.Hero.dCurrentHealthPct <= 0.35d) || (RuneIndex == 3 && FunkyGame.Hero.dCurrentEnergyPct < 0.25d) || (FunkyGame.Targeting.Cache.Environment.FleeTriggeringUnits.Count > 0) || (FunkyGame.Targeting.Cache.Environment.TriggeringAvoidances.Count > 0) || (FunkyGame.Hero.bIsIncapacitated || FunkyGame.Hero.bIsRooted)); }
public override void Initialize() { Range = 45; Cost = 25; Priority = SkillPriority.High; PreCast = new SkillPreCast(SkillPrecastFlags.CheckCanCast); ClusterConditions.Add(new SkillClusterConditions(5d, 45, 6, true)); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, maxdistance: 45, MinimumHealthPercent: 0.95d, falseConditionalFlags: TargetProperties.Normal)); FCombatMovement = (v) => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (!FunkyGame.Hero.Class.bWaitingForSpecial && FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > 45f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 45f)); } else { return(v); } } return(Vector3.Zero); }; FOutOfCombatMovement = (v) => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > 45f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 45f)); } else { return(v); } } return(Vector3.Zero); }; }
public override void Initialize() { Range = 45; Priority = SkillPriority.Medium; PreCast = new SkillPreCast(SkillPrecastFlags.CheckPlayerIncapacitated | SkillPrecastFlags.CheckCanCast); ClusterConditions.Add(new SkillClusterConditions(6d, Range, 2, true, useRadiusDistance: true)); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, falseConditionalFlags: TargetProperties.Normal)); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, falseConditionalFlags: TargetProperties.LowHealth)); FCombatMovement = (v) => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (!FunkyGame.Hero.Class.bWaitingForSpecial && FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > Range) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, Range)); } else { return(v); } } return(Vector3.Zero); }; FOutOfCombatMovement = (v) => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > Range) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, Range)); } else { return(v); } } return(Vector3.Zero); }; }
public override void Initialize() { Range = 5; Cost = 10; Priority = SkillPriority.High; PreCast = new SkillPreCast((SkillPrecastFlags.CheckCanCast)); //We want to preform zig-zag movements when using rune Ramming Speed or Nightmare if (RuneIndex == 0 || RuneIndex == 4) { IsSpecialMovementSkill = true; } //return location (no prediction required!) FOutOfCombatMovement = (v) => v; FCombatMovement = (v) => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (!FunkyGame.Hero.Class.bWaitingForSpecial && FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 5f) { if (fDistanceFromTarget > 45f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 45f)); } else { return(v); } } return(Vector3.Zero); }; ClusterConditions.Add(new SkillClusterConditions(5d, 50, 7, true)); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, maxdistance: 35, MinimumHealthPercent: 0.95d, falseConditionalFlags: TargetProperties.Normal)); //Reduced cool down.. lets use it more! if (Hotbar.PassivePowers.Contains(SNOPower.X1_Crusader_Passive_LordCommander)) { SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, maxdistance: 50, MinimumHealthPercent: 0d, falseConditionalFlags: TargetProperties.Weak)); } }
public override void Initialize() { Cooldown = 400; WaitVars = new WaitLoops(1, 2, true); Cost = 8; SecondaryEnergy = true; Range = 20; Priority = SkillPriority.Medium; PreCast = new SkillPreCast((SkillPrecastFlags.CheckPlayerIncapacitated | SkillPrecastFlags.CheckCanCast | SkillPrecastFlags.CheckEnergy | SkillPrecastFlags.CheckRecastTimer)); //SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, 10); //UnitsWithinRangeConditions=new Tuple<RangeIntervals, int>(RangeIntervals.Range_6, 1); FCombatMovement = v => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (!FunkyGame.Hero.Class.bWaitingForSpecial && FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 18f && (LastUsedMilliseconds >= FunkyBaseExtension.Settings.DemonHunter.iDHVaultMovementDelay)) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, Math.Max(fDistanceFromTarget, 35f))); } return(Vector3.Zero); }; FOutOfCombatMovement = v => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 18f && (LastUsedMilliseconds >= FunkyBaseExtension.Settings.DemonHunter.iDHVaultMovementDelay)) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, Math.Max(fDistanceFromTarget, 35f))); } return(Vector3.Zero); }; }
public override void Initialize() { Range = 40; Priority = SkillPriority.Medium; PreCast = new SkillPreCast(SkillPrecastFlags.CheckCanCast | SkillPrecastFlags.CheckPlayerIncapacitated | SkillPrecastFlags.CheckRecastTimer); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.Ranged, mindistance: 30)); SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, mindistance: 30, falseConditionalFlags: TargetProperties.Normal)); if (Equipment.CheckLegendaryItemCount(LegendaryItemTypes.Jawbreaker)) { SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None, mindistance: 35)); ClusterConditions.Add(new SkillClusterConditions(7d, 50f, 1, true, 0, ClusterProperties.None, 35f, false)); } //Rainments of Thousand Storms Full Set Bonus (Explosion of lightning) if (Equipment.CheckLegendaryItemCount(LegendaryItemTypes.RaimentofaThousandStorms, 6)) { //Boss! SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.Boss, MinimumHealthPercent: 0.95d)); //Clusters that are at least 15 yards away ClusterConditions.Add(new SkillClusterConditions(6d, 40f, 7, true)); //Clusters of Non-Normal Units ClusterConditions.Add(new SkillClusterConditions(6d, 40f, 2, true, clusterflags: ClusterProperties.Elites)); } //Sunwoko CDR Build if (Equipment.CheckLegendaryItemCount(LegendaryItemTypes.MonkeyKingsGarb, 4) && RuneIndex == 4) { ExecutionType = SkillExecutionFlags.Location | SkillExecutionFlags.ClusterLocationNearest; Cooldown = 4000; SingleUnitCondition.Add(new UnitTargetConditions(TargetProperties.None)); } FCombatMovement = (v) => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4) { if (fDistanceFromTarget > 50f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 50f)); } return(v); } return(Vector3.Zero); }; FOutOfCombatMovement = (v) => { float fDistanceFromTarget = FunkyGame.Hero.Position.Distance(v); if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, v.Z) <= 4 && fDistanceFromTarget >= 20f) { if (fDistanceFromTarget > 50f) { return(MathEx.CalculatePointFrom(v, FunkyGame.Hero.Position, 50f)); } else { return(v); } } return(Vector3.Zero); }; }
///<summary> ///Runs raycasting and intersection tests to validate LOS. ///</summary> public bool LOSTest(Vector3 PositionToTestFrom, Vector3 objposition, bool NavRayCast = true, bool searchGridRayCast = false, bool ServerObjectIntersection = true, NavCellFlags Flags = NavCellFlags.None, bool ContinueOnFailures = true) { LastLOSCheck = DateTime.Now; bool Failed = false; if (NavRayCast) { //This is a basic raycast test to see if we have clear view of the object. if (PositionToTestFrom.Z > objposition.Z) { RayCast = Navigation.Navigation.CanRayCast(PositionToTestFrom, objposition); } else { RayCast = Navigation.Navigation.CanRayCast(objposition, PositionToTestFrom); } if (!RayCast.Value) { Failed = true; if (!ContinueOnFailures) { return(false); } } } if (searchGridRayCast) { Vector2 hitpos; //Must check the Z difference.. (so we don't get false-positive result) if (PositionToTestFrom.Z > objposition.Z) { SearchGridRayCast = !Navigator.SearchGridProvider.Raycast(PositionToTestFrom.ToVector2(), objposition.ToVector2(), out hitpos); } else { SearchGridRayCast = !Navigator.SearchGridProvider.Raycast(objposition.ToVector2(), PositionToTestFrom.ToVector2(), out hitpos); } if (!SearchGridRayCast.Value) { Failed = true; if (!ContinueOnFailures) { return(false); } } } if (ServerObjectIntersection) { //This test uses the obstacle cache to check objects for intersection if (FunkyBaseExtension.Difference(FunkyGame.Hero.Position.Z, objposition.Z) > 1f) { //Get actual height using MGP objposition.Z = Navigation.Navigation.MGP.GetHeight(objposition.ToVector2()); } ObjectIntersection = ObjectCache.Obstacles.Values.OfType <CacheServerObject>() .Any(obstacle => obstacle.RAGUID != Obj.RAGUID && obstacle.Obstacletype.HasValue && obstacle.Obstacletype.Value == ObstacleType.ServerObject && obstacle.TestIntersection(PositionToTestFrom, objposition, false)); if (!Failed && ObjectIntersection.Value) { Failed = true; if (!ContinueOnFailures) { return(false); } } } if (!Flags.Equals(NavCellFlags.None)) { //Raycast test to validate it can preform the path -- walk/projectile bool NavTest = Navigation.Navigation.CanRayCast(PositionToTestFrom, objposition, Flags); if (Flags.HasFlag(NavCellFlags.AllowWalk)) { NavCellWalk = NavTest; } if (Flags.HasFlag(NavCellFlags.AllowProjectile)) { NavCellProjectile = NavTest; } if (!Failed && !NavTest) { Failed = true; } } //this.LastVectorTested=PositionToTestFrom; return(!Failed); }