/// <summary> /// Performs automatic mounting/dismounting. /// </summary> /// <param name="characterToWatch"></param> /// <returns></returns> private async Task <bool> PerformMountDismount(BattleCharacter characterToWatch) { if (characterToWatch.IsMounted != Core.Me.IsMounted || characterToWatch.IsCasting && characterToWatch.CastingSpellId == Action.Mount) { if (!Core.Me.InCombat) { // Mount up! if (characterToWatch.IsMounted || characterToWatch.CastingSpellId == Action.Mount) { LogHelper.Instance.Log( "[{0}] Mounting...", CallStackHelper.Instance.GetCaller()); await CommonTasks.MountUp(); return(await Task.FromResult(true)); } } // Dismount - but only when close to the leader! if (characterToWatch.Distance2D() <= BotBase.Instance.FollowDistance + 0.5f) { LogHelper.Instance.Log( "[{2}] Dismounting, {0} <= {1}...", characterToWatch.Distance2D(), BotBase.Instance.FollowDistance + 0.5f, CallStackHelper.Instance.GetCaller()); await CommonTasks.StopAndDismount(); return(await Task.FromResult(true)); } } return(await Task.FromResult(false)); }
private double Priority(BattleCharacter battleCharacter) { var weight = 1000.0; weight -= battleCharacter.Distance2D(_distance) / 2.25; weight += battleCharacter.ClassLevel / 1.25; weight += 100 - battleCharacter.CurrentHealthPercent; if (PartyManager.IsInParty && !PartyManager.IsPartyLeader) { if (PartyManager.PartyLeader.IsInObjectManager) { if (PartyManager.PartyLeader.BattleCharacter.HasTarget) { if (battleCharacter.ObjectId == PartyManager.PartyLeader.BattleCharacter.TargetGameObject.ObjectId) { weight += 600; } } } } if (battleCharacter.HasTarget && battleCharacter.TargetCharacter == Core.Me) { weight += 50; } if (!battleCharacter.InCombat) { weight -= 5; } else { weight += 50; } if (Core.Target != null && Core.Target.ObjectId == battleCharacter.ObjectId) { weight += 10; } if (battleCharacter.InCombat && battleCharacter.Location.Distance2D(Core.Me.Location) < 5) { weight *= 1.5; } if (battleCharacter.Distance2D(_distance) > 25) { weight /= 2; } if ((battleCharacter.NpcId == Mobs.PalaceHornet || battleCharacter.NpcId == Mobs.PalaceSlime) && battleCharacter.InCombat) { return(weight * 100.0); } return(weight); }
private double Priority(BattleCharacter battleCharacter) { var weight = 1000.0; var distance2D = battleCharacter.Distance2D(_location); weight -= distance2D / 2.25; weight += battleCharacter.ClassLevel / 1.25; weight += 100 - battleCharacter.CurrentHealthPercent; var battleCharacterInCombat = battleCharacter.InCombat; if ((battleCharacter.NpcId == Mobs.PalaceHornet || battleCharacter.NpcId == Mobs.PalaceSlime) && battleCharacterInCombat) { return(weight * 100.0); } if (PartyManager.IsInParty && !PartyManager.IsPartyLeader) { if (battleCharacter.IsTargetingMyPartyMember()) { weight += 100; } } if (battleCharacter.HasTarget && battleCharacter.TargetCharacter == Core.Me) { weight += 50; } if (!battleCharacterInCombat) { weight -= 5; } else { weight += 50; } if (_targetObject != null && _targetObject.ObjectId == battleCharacter.ObjectId) { weight += 10; } if (battleCharacterInCombat && distance2D < 5) { weight *= 1.5; } if (distance2D > 25) { weight /= 2; } return(weight); }
/// <summary> /// Core mechanics for the follow logic that are the same across all currently implemented FollowModes. /// </summary> /// <param name="characterToFollow"></param> /// <returns></returns> private async Task <bool> PerformFollowLogic(BattleCharacter characterToFollow) { // Sprint when the leader sprints if (PerformAutoSprint(characterToFollow)) { return(await Task.FromResult(true)); } // Automatically mount/dismount if (await PerformMountDismount(characterToFollow)) { return(await Task.FromResult(true)); } // Can't do mount stuff when I am under attack, you silly carbuncle! if (Core.Me.InCombat && !Core.Me.IsMounted) { return(await Task.FromResult(false)); } if (await PerformFlightTakeOff(characterToFollow)) { return(await Task.FromResult(true)); } // Party leader too far away, auto move closer to them. if (characterToFollow.Distance2D() > MaxDistance) { if (await PerformNavigation(characterToFollow)) { return(await Task.FromResult(true)); } } Navigator.PlayerMover.MoveStop(); return(await Task.FromResult(false)); }