Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        /// <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));
        }