Page 1 of 1

Задержка при колдовании сидя, очистка стека

Posted: 29 Jul 2013, 14:40
by Циянэ
Пару вопросов.

1) Для чего нужна задержка при колдовании сидя сопровождающуюся вот таким вот сообщением: Вы не можете это сделать сидя! Длиной в целый раунд боя. Немного непонятно что именно регулирует ета задержка, тем более если она лечится обрывом связи и вводу НУЖНЫХ команд (встать и только потом колдовать).

2) Можно ли очистить стек команд не прибегая к дисконнекту. (на примере клиента JMC если дело в клиенте.)

Re: Задержка при колдовании сидя, очистка стека

Posted: 29 Jul 2013, 14:41
by Mandos
К сожалению, не могу ответить ни на один.
Думается мне, что проблема со стеком на стороне сервера, однако это можно отдельно изучить.
Начните с клиентской стороны в любом случае.
К сожалению, боюсь что всё, что касается т.н. "лагов" в движке сделано так, что фиг там что поправишь.

Re: Задержка при колдовании сидя, очистка стека

Posted: 29 Jul 2013, 15:50
by Экрил
есть команда Очистить, прописанная в Командах. но не имеющая справки, в других мадах насколько помнится эта команда позиционировалась именно для очистки памяти стека команд
но в адаманте она никогда не работала, хотя вполне может быть просто отключен функционал

Re: Задержка при колдовании сидя, очистка стека

Posted: 29 Jul 2013, 15:54
by Mandos
Экрил wrote:есть команда Очистить, прописанная в Командах. но не имеющая справки, в других мадах насколько помнится эта команда позиционировалась именно для очистки памяти стека команд
но в адаманте она никогда не работала, хотя вполне может быть просто отключен функционал


Я боюсь, что при нашей реализации circle она будет стоять в очереди...
Щаз посмотрим.
У нас
if (isname(m[0], "очистить clear")) {
if (ch->http_proxy) {
free(ch->http_proxy);
ch->http_proxy = NULL;
}

прокси скидывает для кодов

Re: Задержка при колдовании сидя, очистка стека

Posted: 29 Jul 2013, 16:01
by Mandos
ЗЫ. Давайте дождемся ответов про то, каковы задержки если логиниться сразу всем скопом.
Метод конечно не лучший, но тут такие дебри в которые лезть страшно :)

Re: Задержка при колдовании сидя, очистка стека

Posted: 29 Jul 2013, 16:10
by Экрил
"прокси очистить " так использовали для очистки прокси, просто дубль команды?

Re: Задержка при колдовании сидя, очистка стека

Posted: 29 Jul 2013, 16:15
by Mandos
Экрил wrote:"прокси очистить " так использовали для очистки прокси, просто дубль команды?

Я поискал прочие "очистить", ничего не нашел вроде.
Щаз еще смотрю...
Похоже очищает экран
case SCMD_CLEAR:
send_to_char("\033[H\033[J", ch);
break;

Re: Задержка при колдовании сидя, очистка стека

Posted: 10 Aug 2013, 01:43
by keynor

Code: Select all

# src/comm.c
for (d = descriptor_list; d; d = next_d) {
...
  if (d->character) {
    GET_WAIT_STATE(d->character) -= (GET_WAIT_STATE(d->character) > 0);

    if (GET_WAIT_STATE(d->character))
      continue;
  }
...
}

обработка команд происходит ниже проверки GET_WAIT_STATE, если есть "лаг", то команды просто не обрабатываются до следующей итерации Главного цикла.
Плюс к тому, Главный Цикл крутится с некоторой частотой. В CIrcle 3.x это 100мс, сколько у А-Муда я не знаю.

Вот так выглядит кусок кода в Циркуле 3.х (1999-х годов :), который, может быть, не изменился в AMUD и который надо переписывать для "очистки стека команд"

Code: Select all

    /* Process commands we just read from process_input */
    for (d = descriptor_list; d; d = next_d) {
      next_d = d->next;

      /*
       * Not combined to retain --(d->wait) behavior. -gg 2/20/98
       * If no wait state, no subtraction.  If there is a wait
       * state then 1 is subtracted. Therefore we don't go less
       * than 0 ever and don't require an 'if' bracket. -gg 2/27/99
       */
      if (d->character) {
        GET_WAIT_STATE(d->character) -= (GET_WAIT_STATE(d->character) > 0);

        if (GET_WAIT_STATE(d->character))
          continue;
      }

      if (!get_from_q(&d->input, comm, &aliased))
        continue;

      if (d->character) {
   /* Reset the idle timer & pull char back from void if necessary */
   d->character->char_specials.timer = 0;
   if (STATE(d) == CON_PLAYING && GET_WAS_IN(d->character) != NOWHERE) {
     if (IN_ROOM(d->character) != NOWHERE)
       char_from_room(d->character);
     char_to_room(d->character, GET_WAS_IN(d->character));
     GET_WAS_IN(d->character) = NOWHERE;
     act("$n has returned.", TRUE, d->character, 0, 0, TO_ROOM);
   }
        GET_WAIT_STATE(d->character) = 1;
      }
      d->has_prompt = FALSE;

      if (d->str)      /* Writing boards, mail, etc. */
   string_add(d, comm);
      else if (d->showstr_count) /* Reading something w/ pager */
   show_string(d, comm);
      else if (STATE(d) != CON_PLAYING) /* In menus, etc. */
   nanny(d, comm);
      else {         /* else: we're playing normally. */
   if (aliased)      /* To prevent recursive aliases. */
     d->has_prompt = TRUE;   /* To get newline before next cmd output. */
   else if (perform_alias(d, comm, sizeof(comm)))    /* Run it through aliasing system */
     get_from_q(&d->input, comm, &aliased);
   command_interpreter(d->character, comm); /* Send it to interpreter */
      }
    }

Re: Задержка при колдовании сидя, очистка стека

Posted: 12 Aug 2013, 12:42
by Mandos
Да, там что-то подобное наверняка.
Насколько я помню лаги именно "Сверху" спускаются. И это чудовищно неудобно.
К сожалению, переписывать я это не готов, т.е. переписать то я могу, а вот кто будет отлаживать :) ?
Ей богу, лучше не трогать.

Re: Задержка при колдовании сидя, очистка стека

Posted: 12 Aug 2013, 21:17
by keynor
проще уже не спамить, чем мараться этим кодом, это косметические изменения. там еще. наверно, все хорошо сделано с кодировками, если хотеть по-русски команду делать.

Re: Задержка при колдовании сидя, очистка стека

Posted: 14 Aug 2013, 04:38
by keynor
кусок кода берет свое начало из DIKU, так его и не меняли. Если лаг -- пропускаем любую входящую обработку сокета.