public static void StartEngine(ILazyEngine engine) { _engine = engine; Clear(); foreach (MainState mainState in _engine.States) { AddState(mainState); } lock (States) { States.Add(new StateIdle()); LastState = States[States.Count() - 1]; //Set the last state to StateIdle } States.Sort(); Logging.Write("[Engine]Initializing"); Paused = false; Running = true; // Leave it as a background thread. _workerThread = new Thread(Run) { IsBackground = true }; _workerThread.Name = "Engine"; _workerThread.SetApartmentState(ApartmentState.STA); _workerThread.Start(); Logging.Write("[Engine]Started bot thread"); }
public static void AddState(MainState state) { if (States == null) { States = new List <MainState>(); } if (!States.Contains(state)) { States.Add(state); } }
public static void StopEngine() { if (!Running) { return; } Running = false; if (_workerThread.IsAlive) { _workerThread.Abort(); } // Clear out the thread object and let the garbage collector get it _workerThread = null; States = null; LastState = null; _engine = null; GC.Collect(); }
private static void Run() { try { while (Running) { try { if (Paused) { _engine.Pause(); while (Paused) { Thread.Sleep(100); } _engine.Resume(); } while (ChatQueu.QueueCount != 0) { _engine.Pause(); KeyHelper.ChatboxSendText(ChatQueu.GetItem); Thread.Sleep(100); _engine.Resume(); } foreach (MainState state in States.Where(state => state.NeedToRun)) { if (LastState != state) { if (StateChange != null) { StateChange(new object(), new NotifyStateChanged(state.Name())); Logging.Debug("State changed: " + state.Name()); } } state.DoWork(); LastState = state; break; } } catch (ThreadAbortException) { } catch (ThreadStateException h) { Logging.Write("Thread in odd state, restarting: " + h); } catch (Exception e) { if (ObjectManager.InGame) { Logging.Write("[Engine] Exception " + e); } Thread.Sleep(4000); } Thread.Sleep(1); Application.DoEvents(); } } catch (ThreadAbortException) { } catch (Exception e) { Logging.Write("[Engine]Botting error: " + e); } finally { Running = false; } }