Ejemplo n.º 1
0
        protected override void SetupStates()
        {
            var stoppedState   = new StoppedState(this);
            var followingState = new FollowingTarget(this, tryingToOpenDoorSound,
                                                     () => brokeDoorPercentage, timeToWaitWhenWalkingAndSeePlayer);
            var walkAroundState = new WalkAroundState(this, tryingToOpenDoorSound,
                                                      () => brokeDoorPercentage, timeToWaitWhenWalkingAndSeePlayer,
                                                      () => numberOfFlagsToLookAt,
                                                      () => numberOfFlagsToSkip);
            var killingTargetState = new KillingTargetState(this, macheteSound);

            var seenTargetTransition = new TargetOnSightTransition(this, followingState, seeYou);
            var targetIsCloseToKill  = new TargetIsClose(this, killingTargetState, distanceToKillTarget, () => coolDownAfterCloseDoor > minKillCoolDownAfterCloseDoor);
            var targetUnreachable    = new TargetUnreachable(this, walkAroundState);
            var targetGiveUp         = new TargetGiveUp(this, walkAroundState, () => timeToGiveUp);

            stoppedState.SetTransitions(seenTargetTransition);
            followingState.SetTransitions(
                targetIsCloseToKill,
                targetUnreachable,
                targetGiveUp);
            walkAroundState.SetTransitions(seenTargetTransition);
            SetFirstState(walkAroundState);

            allStates = new State[] { stoppedState, followingState, walkAroundState, killingTargetState };
        }
Ejemplo n.º 2
0
        public void Start()
        {
            m_running = true;

            Task.Run(async() =>
            {
                while (m_running)
                {
                    await Task.Delay(2500);
                    await WriteCommand(4, "ping");

                    if (m_lastPong.Ticks == 0)
                    {
                        continue;
                    }

                    if ((DateTime.UtcNow - m_lastPong) > TimeSpan.FromSeconds(15))
                    {
                        if (!m_errored)
                        {
                            TargetUnreachable?.Invoke();
                        }

                        m_errored = true;
                    }
                    else
                    {
                        m_errored = false;
                    }
                }
            });

            Task.Run(async() =>
            {
                while (m_running)
                {
                    try
                    {
                        var(success, err, message) = m_socket.RecvMsg();

                        if (success)
                        {
                            var cmd = Serializer.Deserialize <BaseCommand>(new MemoryStream(message.AsSpan().ToArray()));

                            if (cmd != null)
                            {
                                await HandleCommand(cmd);
                            }
                        }
                    }
                    catch (Exception e) { CitizenFX.Core.Debug.WriteLine($"{e}"); }
                }
            });
        }