Пример #1
0
        public static bool Connect(ConnectionMode mode = ConnectionMode.Client)
        {
            if (IsConnected)
            {
                return(true);
            }

            var tooManyClientAttempts = ConnectionMode == ConnectionMode.Client && Client.ConnectionAttempts > 100;
            var tooManyServerAttempts = ConnectionMode == ConnectionMode.Server && Server.ServerStartAttempts > 40;

            if (tooManyClientAttempts || tooManyServerAttempts)
            {
                Log.Info("Failed to Connect too many times, Disabling Plugin");
                AutoFollow.DeselectPlugin();
            }

            if (ConnectionMode == ConnectionMode.Client)
            {
                Client.ClientInitialize();
            }
            else
            {
                Server.ServerInitialize();
            }

            return(IsConnected);
        }
Пример #2
0
        private static void UpdateDataAsServer()
        {
            var serverMessage = Player.CurrentMessage;

            serverMessage.LeaderId = AutoFollow.SelectLeader().OwnerId;
            AutoFollow.ClientMessages.ForEach(cm => cm.Value.LeaderId = serverMessage.LeaderId);
            AutoFollow.CurrentParty = new List <Message>(AutoFollow.ClientMessages.Values)
            {
                serverMessage
            };
            AutoFollow.CurrentFollowers = AutoFollow.CurrentParty.Where(o => o.IsFollower).ToList();
            var leader = AutoFollow.CurrentParty.FirstOrDefault(o => o.IsLeader);

            AutoFollow.CurrentLeader         = leader ?? new Message();
            AutoFollow.NumberOfConnectedBots = Service.GetSmoothedConnectedBotCount(AutoFollow.CurrentParty);
            AutoFollow.ServerMessage         = serverMessage;
        }
Пример #3
0
        public virtual async Task <bool> OutOfGameTask()
        {
            if (!AutoFollow.Enabled)
            {
                return(false);
            }

            // Pulse does fire while out of game. Need to be very careful how waits are handled.
            // Don't use long Coroutine.Sleeps out of game as it will prevent player updates for the duration.
            AutoFollow.Pulse();

            if (Service.IsConnected && AutoFollow.NumberOfConnectedBots == 0)
            {
                Log.Info("Waiting for bots to connect...");
                await Coroutine.Sleep(500);

                return(true);
            }

            if (DateTime.UtcNow < Coordination.WaitUntil)
            {
                Log.Debug("Waiting... (Generic OOC) Remaining={0}s", Coordination.WaitUntil.Subtract(DateTime.UtcNow).TotalSeconds);
                await Coroutine.Sleep(500);

                return(true);
            }

            if (!IsGameReady || ZetaDia.IsInGame || Party.IsLocked || !ZetaDia.Service.IsValid || !ZetaDia.Service.Hero.IsValid)
            {
                Log.Verbose("Waiting... (Invalid State)");
                await Coroutine.Sleep(500);

                return(true);
            }

            GameUI.SafeCheckClickButtons();

            if (AutoFollow.CurrentBehavior.GetType() == typeof(BaseBehavior) && !ProfileUtils.ProfileIsYarKickstart)
            {
                return(true);
            }

            return(false);
        }
Пример #4
0
        /// <summary>
        /// Move to another bot
        /// </summary>
        /// <param name="player">a player to move to</param>
        /// <param name="range">the closeness required</param>
        public static async Task <bool> MoveToPlayer(Message player, float range)
        {
            if (!ZetaDia.IsInGame || !player.IsInSameGame || !player.IsInSameWorld)
            {
                return(false);
            }

            if (player.Distance > range)
            {
                Log.Verbose("Moving to Player {0} CurrentDistance={1} DistanceRequired={2} ",
                            player.HeroAlias, player.Distance, range);

                await MoveTo(() => AutoFollow.GetUpdatedMessage(player), player.HeroAlias, range,
                             t =>
                {
                    if (!player.IsInSameWorld)
                    {
                        return(true);
                    }

                    if (t.Distance > Settings.Coordination.TeleportDistance && !RiftHelper.IsInGreaterRift)
                    {
                        return(true);
                    }

                    if (t.Distance < Settings.Coordination.CatchUpDistance && Targetting.RoutineWantsToAttackUnit())
                    {
                        return(true);
                    }

                    return(false);
                });

                return(true);
            }

            Log.Debug("Player {0} is close enough CurrentDistance={1} DistanceRequired={2} ",
                      player.HeroAlias, player.Distance, range);

            return(true);
        }
Пример #5
0
        private async Task <bool> DefaultOutOfGameChecks()
        {
            if (!AutoFollow.Enabled)
            {
                return(false);
            }

            if (!IsGameReady || Party.IsLocked)
            {
                Log.Verbose("Waiting (Invalid State)");
                await Coroutine.Sleep(1000);

                return(true);
            }

            // Pulse does not fire while out of game. Need to be very careful how waits are handled.
            // Don't use long Coroutine.Sleeps out of game as it will prevent player updates for the duration.

            AutoFollow.Pulse();

            if (!Player.IsServer && Service.IsConnected && AutoFollow.NumberOfConnectedBots == 0)
            {
                Log.Info("Waiting for connection initialization. ");
                await Coroutine.Sleep(500);

                return(true);
            }

            if (DateTime.UtcNow < Coordination.WaitUntil)
            {
                Log.Debug("Waiting... (Generic OOC) Remaining={0}s", Coordination.WaitUntil.Subtract(DateTime.UtcNow).TotalSeconds);
                await Coroutine.Sleep(500);

                return(true);
            }

            GameUI.SafeCheckClickButtons();
            return(false);
        }
Пример #6
0
        /// <summary>
        /// Move to another bot
        /// </summary>
        /// <param name="player">a player to move to</param>
        /// <param name="range">the closeness required</param>
        public static async Task <bool> MoveToPlayer(Message player, float range)
        {
            if (!ZetaDia.IsInGame || !player.IsInSameGame || !player.IsInSameWorld || player.IsInGreaterRift)
            {
                return(false);
            }

            if (player.Distance > range)
            {
                Log.Verbose("Moving to Player {0} CurrentDistance={1} DistanceRequired={2} ",
                            player.HeroName, player.Distance, range);

                await MoveTo(() => AutoFollow.GetUpdatedMessage(player), player.HeroName, range, t => !player.IsInSameWorld || t.Distance > Settings.Coordination.TeleportDistance);

                return(true);
            }

            Log.Debug("Player {0} is close enough CurrentDistance={1} DistanceRequired={2} ",
                      player.HeroName, player.Distance, range);

            return(true);
        }
Пример #7
0
        public static bool Connect(ConnectionMode mode = ConnectionMode.Client)
        {
            if (IsConnected)
            {
                return(true);
            }

            if (Server.ServerStartAttempts > 20 && Client.ConnectionAttempts > 20)
            {
                Log.Info("Failed to Connect too many times, Disabling Plugin");
                AutoFollow.DisablePlugin();
            }

            if (ConnectionMode == ConnectionMode.Client)
            {
                Client.ClientInitialize();
            }
            else
            {
                Server.ServerInitialize();
            }

            return(IsConnected);
        }
Пример #8
0
 public override void OnStart()
 {
     AutoFollow.AssignBehaviorByName(behaviorName);
     base.OnStart();
 }