Register

Автор Тема: Clear buffer  (Прочитано 2196 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн aldaril

  • Постоялец
  • *
  • Сообщений: 169
  • Карма: 2
  • Пол: Мужской
Clear buffer
« : 09.06.05, 12:05:44 »
Всем магам известна ситуация, когда игрок наспамил кучу кастов и ждет своей участи, в то время, когда пора уносить ноги. Еще более известна эта ситуация для атакеров.

Меня просили (не в этом мире) некоторое время назад сделать возможным очистку своих же раннее веденных команд. Наконец то руки дошли, тесты провел, все работает на ура.

Итак, сам патч
File comm.c
Function read_from_descriptor

ищем в функции
   for ( ; ; )
   {
...
       nRead = recv( d->descriptor, d->inbuf + iStart, sizeof(d->inbuf) - 10 - iStart, 0 );
// сразу же после чтения из дескриптора вставляем код:
       if ( strstr( d->inbuf + iStart, "###" ) )
       {
         memset( d->inbuf, 0, MAX_INBUF_SIZE );
         iStart = 0;
         memset( d->incomm, 0, MAX_INPUT_LENGTH );
         d->incomm[0] = '\n';
       }

Что требуется от игрока:
ввести в мад последовательность из трех диезов: ###
Как и почему это работает ?
В связи с тем, что задача состоит как раз в очистке всего ранее введенного, то простая имплементация команды типа do_xxx нам не подходит, т.к. в тот момент, пока Смауг дойдет до нее, весь спам уже закончится.
Мне необходимо было использовать перехват на самом раннем этапе, а именно, когда на сетевом уровне из сокета читается информация.
итак, мы проверям, нет ли в полученной от игрока последовательности, которую мы будем считать управляющей. В нашем примере, это ###
Если такова последовательность найдена, мы вычищаем все, что было получено до этого от игрока (это важно, иначе все ранее введенное попадет на обработку дальше), а так же вычищаем буфер, где уже скопился высланный игроком спам в мад
Таким образом, когда после обработки read_from_descriptor код дойдет следующим шагом к read_from_buffer (куда стекается стеково все введенные игроком команды), буфер уже будет очищен, и мы избавляемся от спама

Отдельно к вопросу о сжатии.
Я проверял код для случая с компрессией в MCCP. Для этого трассировал в кодах каждлый полученный от игрока байт. Результат мне понравился: символы ### не сжимались, а значит, мы вполне можем использовать их как управляющие.

Я постарался сколь можно подробнее описать принцип действия, а так же выкладываю для всех кому интересно.

Будет ли внедрено 5 строчек в арду, думаю зависит от вас, нужно ли это вам. Если да, тогда просите Мориса. Думаю, он не откажет.

Я же не отказал тем, кто меня попросил про это на будущее ;)

Всем удачной охоты, старик Алд.

Оффлайн aaaa

  • Победитель нежити
  • **
  • Сообщений: 548
  • Карма: 0
Clear buffer
« Ответ #1 : 09.06.05, 12:52:32 »
Буфер в реализован как стек? Интересно.
43690

Оффлайн Локхорн

  • Громогласный
  • ******
  • Сообщений: 3420
  • Карма: 4
  • Псевдомудрое и как бы мыслящее
    • http://oper.ru
Clear buffer
« Ответ #2 : 09.06.05, 12:56:24 »
Цитировать
Всем магам известна ситуация, когда игрок наспамил кучу кастов и ждет своей участи, в то время, когда пора уносить ноги. Еще более известна эта ситуация для атакеров.

Меня просили (не в этом мире) некоторое время назад сделать возможным очистку своих же раннее веденных команд. Наконец то руки дошли, тесты провел, все работает на ура.

СПАСИБО! :up::kruto:



Цитировать
Будет ли внедрено 5 строчек в арду, думаю зависит от вас, нужно ли это вам. Если да, тогда просите Мориса. Думаю, он не откажет.

Ещё как нужно! Маст дан! *и прочие вопли...
bash: Помоему, у геймеров есть только один инстинкт - инстинкт автосохранения

Оффлайн aldaril

  • Постоялец
  • *
  • Сообщений: 169
  • Карма: 2
  • Пол: Мужской
Clear buffer
« Ответ #3 : 09.06.05, 12:59:21 »
аааа
Стек - первый вошел - первый ушел
Читать именно в таком контексте
Непосредственно буфер хранимых команд - это массивы.
Их мы и очищаем

Оффлайн aaaa

  • Победитель нежити
  • **
  • Сообщений: 548
  • Карма: 0
Clear buffer
« Ответ #4 : 09.06.05, 13:13:08 »
Я всегда думал, что стек - последний пришел - первый ушел (last in first out - LIFO), а первый пришел - первый ушел (first in first out - FIFO) - это очередь. То, что реализовано, как массив - обычное явление.
43690

Оффлайн Локхорн

  • Громогласный
  • ******
  • Сообщений: 3420
  • Карма: 4
  • Псевдомудрое и как бы мыслящее
    • http://oper.ru
Clear buffer
« Ответ #5 : 09.06.05, 13:15:25 »
Да, ладно вам. Главное - Пашет?!
bash: Помоему, у геймеров есть только один инстинкт - инстинкт автосохранения

Оффлайн aaaa

  • Победитель нежити
  • **
  • Сообщений: 548
  • Карма: 0
Clear buffer
« Ответ #6 : 09.06.05, 13:18:28 »
Куда оно денется то? Главное, что пашет независимо от компресии.
43690