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 }; }
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}"); } } }); }