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