function Relog(CharIndex: integer = -1): boolean;   // релогается на персонажа с указанным номером
var i: integer;                                     // (по умолчанию заходит на того же что и был)
begin
  result:= false; 
  if (CharIndex > 6) then exit;                               // выходим, если некорректный индекс персонажа
  while (User.InCombat) do delay(99);                         // ждем пока не выйдем из боя

  // если у нас есть поток на дисконнект, то меняем глобальную
  // переменную, чтобы он перестал работать на время релога
  // gBlockDisconnectThread:= true;                           
  if Engine.Restart then                                      // если удалось сделать рестарт, то
    while (Engine.Status = lsOnline) do delay(999);           // ждем, пока не выйдем на панель выбора персонажей
  Delay(5000);                                                // ждем дополнительно 5 сек для прогрузки
  if (CharIndex = -1) then begin                              // если индекс персонажа не был указан, то
    if Engine.GameStart() then                                // заходим на того же персонажа что и был
      while (Engine.Status <> lsOnline) do delay(999);        // и ждем входа в игру
  end else begin                                              // если же индекс персонажа был указан, то
    if Engine.GameStart(CharIndex) then                       // заходим на персонажа с указанным номером
      while (Engine.Status <> lsOnline) do delay(999);        // и аналогично ждем входа в игру
  end; 
  Delay(5000);                                                // ждем дополнительное время для прогрузки
  // gBlockDisconnectThread:= false;                          // включаем обратно поток проверки дисконнекта, если таковой имеется
  
  result:= true;
end;


begin
  // code ...
  Relog();         // релогнется и зайдет на того же персонажа
  // or
  Relog(3);        // релогнется и зайдет на 4го персонажа (индексы 0-6)
end.