Всем магам известна ситуация, когда игрок наспамил кучу кастов и ждет своей участи, в то время, когда пора уносить ноги. Еще более известна эта ситуация для атакеров.
Меня просили (не в этом мире) некоторое время назад сделать возможным очистку своих же раннее веденных команд. Наконец то руки дошли, тесты провел, все работает на ура.
Итак, сам патч
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 строчек в арду, думаю зависит от вас, нужно ли это вам. Если да, тогда просите Мориса. Думаю, он не откажет.
Я же не отказал тем, кто меня попросил про это на будущее ;)
Всем удачной охоты, старик Алд.