PRoConEvents.MULTIbalancer.MoveLoop C# (CSharp) Method

MoveLoop() public method

public MoveLoop ( ) : void
return void
        public void MoveLoop()
        {
            try {
            while (fIsEnabled) {
            MoveInfo move = null;
            lock (fMoveQ) {
                while (fMoveQ.Count == 0) {
                    Monitor.Wait(fMoveQ);
                    if (!fIsEnabled) return;
                }
                move = fMoveQ.Dequeue();
            }

            // Check abort flag
            if (move.aborted) {
                DebugUnswitch("ABORTING original move for ^b" + move.Name + "^n to " + move.DestinationName + ", newer move in progress");
                continue;
            }

            // Sending before messages
            Yell(move.Name, move.YellBefore);
            Chat(move.Name, move.ChatBefore, (move.For == MoveType.Balance || move.For == MoveType.Unswitch || QuietMode)); // player only if balancing or unswitching or Quiet

            // Stash for check later
            lock (fMoveStash) {
                fMoveStash.Clear();
                fMoveStash.Add(move);
            }

            // Pause
            Thread.Sleep(Convert.ToInt32(move.Delay*1000));
            if (!fIsEnabled) return;

            // Player may have started another move during the delay, check and abort
            lock (fMoveStash) {
                if (fMoveStash.Count == 0) {
                    DebugUnswitch("ABORTING original move for ^b" + move.Name + "^n to " + move.DestinationName + ", new move pending");
                    continue;
                }
                fMoveStash.Clear();
            }
            lock (fMoveQ) {
                foreach (MoveInfo mi in fMoveQ) {
                    if (mi.Name == move.Name) {
                        DebugUnswitch("ABORTING original move for ^b" + move.Name + "^n to " + move.DestinationName + ", now moving to " + mi.DestinationName);
                        continue;
                    }
                }
            }

            // Make sure player is dead
            if (!EnableLoggingOnlyMode) {
                ServerCommand("admin.killPlayer", move.Name);
                DebugWrite("^b^1ADMIN KILL^0 " + move.Name, 4);
            } else {
                DebugWrite("^9(SIMULATING) ^b^1ADMIN KILL^0 " + move.Name, 4);
            }

            // Pause
            Thread.Sleep(1*1000);
            if (!fIsEnabled) return;

            // Move player
            StartMoveImmediate(move, false);
            }
            } catch (ThreadAbortException) {
            fAborted = true;
            return;
            } catch (Exception e) {
            ConsoleException(e);
            } finally {
            if (!fAborted) ConsoleWrite("^bMoveLoop^n thread stopped", 0);
            }
        }
MULTIbalancer