О проекте
Разработка FreeZone 3.0 была начата в конце 2015го года в связи с невозможностью исправить проблемы версии 2.0 без переписывания большей части кода. Платформой для FreeZone 3.0 традиционно стала версия игры S.T.A.L.K.E.R. - Чистое Небо 1.5.10, как игра с самым популярным мультиплеером.
Основными целями проекта являются:
- Повышение комфорта игры на сервере для игроков
- Исправление оригинальных ошибок и недочетов игры
- Введение в игру нового функционала.
Следует отметить, что, несмотря на возможное сходство задач со связкой CCS/SACE, они во многом различны.
Во-первых, FreeZone на данный момент - чисто серверное решение, не требующее никаких изменений на стороне клиента.
Во-вторых, FreeZone исправляет ошибки путем патчинга непосредственно по месту их нахождения в коде игры. Вынесение функциональности FreeZone в отдельную DLL дает гибкость в выборе механизма подключения этой DLL к серверу.
Важно отметить, что использование FreeZone не может заменить использование CCS, равно как и наоборот. Использовать их лучше всего в связке, они взаимодополняют друг друга.
Далее следует описание ключевых особенностей FreeZone 3.0.
1.Система голосований.
Одним из первых исправлений игры была переделка системы голосований в игре. Наверняка многие игроки помнят многочисленные ее проблемы, среди которых:
- Некорректный подсчет числа голосов: проваленное голосование могло быть признано сервером успешным
- Не срабатывающие голосования на бан и кик: даже после успешного результата голосования читер при правильно сформированном нике мог безнаказанно играть дальше.
- Не работала опция sv_vote_participants, заставляющая учитывать при подсчете голосов только явно проголосовавших игроков.
- Злоупотребление строковым транслятором игры позволяло создать ситуацию, когда игрока в принципе невозможно было поставить на голосование стандартными средствами игры.
После изучения исходников стало ясно, что ситуация с голосованиями даже печальнее, чем можно было подумать. Было выяснено, что игрок мог подменить действие, выполняющееся по итогом голосования (например, игроки видят, что идет голсование о смене погоды, а при успешном завершении оказывалось, что произошел бан игрока) либо даже при удачном стечении обстоятельств устроить обвал сервера. Усугубляло ситуацию то, что CCS ровным счетом никак не противодействовал найденным проблемам и уязвимостям.
Описанные проблемы были исправлены во FreeZone, но этим дело не ограничилось.
Во-первых, некоторые игроки часто злоупотребляли возможностью неограниченное число раз менять свое решение при голосовании. В результате такого частого изменения мнений, область событий на экране полностью забивалась сообщениями о том, что игрок решил проголосовать по-другому. Теперь подобный флуд автоматически блокируется.
Во-вторых, добавлен механизм досрочного прекращения голосования. Например, если процент проголосовавших против настолько велик, что все остальные не проголосовавшие игроки не смогут повлиять на реузльтат голосования, то продолжать его не имеет смысла. Теперь оно в подобной ситуации завершается автоматически.
В-третьих, введен минимальный интервал между началом голосований игроком. В игре были нередки случаи, когда игрок без перерыва спамил однотипными голосованиями, не давая другим игрокам начать свои. Теперь же, после начала голосования игроком все его попытки начать еще одно голосование автоматически пресекаются в течение указанного в конфиге времени.
В-четвертых, добавлены новые голосования: на лимит времени (512 в маске голсований) и лимит фрагов (256 в маске голсований)
2. Ники игроков.
Следует отметить, что FreeZone запрещает брать ники, содержащие не-латинские символы. Подобные ники автоматически транслитерируются при подключении игрока. Сделано это по следующим соображениям:
1) Спецсимволы в нике могут приводить к изменению цвета в консоли сервера. Мелочь, а неприятно.
2) Проблемы с голосованиями при особым образом сформированныъ никах. Хотя непосредственно эта правка и не направлена на исправление голосования, но она способствует уорректному функционированию игры
3) Защита от игроков, "маскирующихся" под других играющих на сервере путем изменения символа одной раскладки на визуально эквивалентный символ из другой. Например, английская с может быть заменена читером на русскую, что гарантированно вызовет путаницу среди игроков и, возможно, администраторов.
3. Чат.
Следующей подвергшейся реформированию подсистемой стала подсистема голосований. Первым делом, было решено, что текущая цветовая схема нелогична. Новая цветовая схема выглядит так:
- Ники в сообщениях игроков, отправляемые в общий чат, имеют белый цвет независимо от команды
- Ники в сообщениях игроков, отправляемых в командный чат, имеют синий цвет для чата "наемников" и зеленый для чата "свободы". Таким образом, свободовцы будут видеть сообщения в своем командном чате зелеными, а наемники - синими. Исключение в данном случае - радмины. Так как радмин имеет право видет сообщения во всех чатах сразу (общем, своем командном и чужом командном), то цвета командных сообщений своей и чужой команды будут различаться.
- Ник администратора сервера всегда отображается красным для большей заметности.
Далее, нам показалось достаточно спорным то, что сообщения мертвых игроков могут видеть только такие же мертвые и наблюдатели. С одной стороны, это может быть оправдано тем, что наблюдатель может "сливать" местоположение противников живым своим товарищам, но с другой нередкой является ситуация, когда игрок набирает сообщение, а его в это время убивают.
Так как одним из направлений является повышение комфорта игры на сервере, то было решено ввести опцию общего чата для живых и мертвых: теперь игра не делает никаких различий между ними, считая всех игроков "живыми". Как и практически все остальное, эта опция может быть отключена в конфиге.
Следующим шагом к усовершенствованию чата игры стало введение для игрока нового вида наказаний, называемого mute (отключение чата), так как в игре встречаются достаточно экспрессивные игроки, которые любят обругать кого-нибудь, начать перепалку в чате и т.п. Раньше такое решалось киком или баном игрока на усмотрение администратора. Мы посчитали, что это как-то слишком жестко, и ввели возможность просто отключить игроку возможность чата. При попытке таким игроком написать сообщение ему будет выдаваться предупреждение о том, что писать в чат он не может. Сообщение, которое написал игрок с отключенным чатом, сможет увидеть только администратор сервера.
Mute назначается через консоль (командой fz_muteplayer) или через GUI Панели управления FreeZone. Кроме того, дабы снять с администратора сервера лишнюю нагрузку, mute чата может назначаться автоматически. Условиями автоматического назначения во FreeZone 3.0 являются флуд (большое количество часто повторяющихся бессмысленных сообщений) и нецензурная ругань. Для распознавания матов FreeZone 3.0 обладает встроенным автоматическим цензором, через который проходит каждое сообщение каждого игрока (исключение - сообщения администратора сервера, цензуре они не подлежат). Цензор построен на основе обработчика регулярных выражений. Список регулярных выражений хранится в файле fz_censored.ini. В случае необходимости файл может быть отредактирован в любое время. После редактирования для перезагрузки списка необходимо выполнить команду fz_reload_banned_words в консоли сервера.
Правильность работы цензора можно проверить в любое время из Панели управления FreeZone. Для этого в опциях необходимо выбрать Check censor, в верхнее поле ввести проверяемую фразу, нажать ОК. В нижнем появится результат: true, если фраза признана нецензурной, и false в противном случае.
4.Рация
Ранее было неоднократно замечено, что некоторые несознательные игроки злоупотребляли использованием голосовых сообщений (рации). Злоупотребление выражалось в бесконечном потоке однотипных сообщений, отправляемых игроком в чат и забивающих эфир. Мало того, что это просто действовало на нервы и снижало комфорт от игры, так подобные действия еще и позволяли врагам на слух вычислять положение противников, в команде которых начался приступ флуда. Теперь подобное поведение блокируется сервером. Параметры блокировки настраиваются в основном конфиге FreeZone:
speech_series_for_mute– задает высказываний в «серии», при превышении которого считается, что игрок начал флудить.
vote_mute_interval – задает интервал времени (в миллисекундах) между двумя сообщениями в рацию, меньше которого будет считаться, что они относятся к одной «серии». Если два соседних сообщения в рацию отправлены с интервалом времени больше указанного – считается, что они относятся к разным «сериям».
speech_mute_time – время блокировки рации для игрока (в миллисекундах) при обнаружении серии флуда.
5.Команды чата
Еще одной особенностью FreeZone является введение в игру системы команд чата. Все команды чата начинаются с символа /. Для того, чтобы увидеть список всех поддерживаемых сервером команд, нужно ввести в чат команду /help.
На момент написания этого руководства, поддерживаются следующие команды чата:
/sace – отобразить список игроков, у которых подтверждено наличие античита SACE3
/updrate – отобразить текущую частоту обновления игрока. При вызове с числовым аргументом – задать новую частоту обновления. Частота обновления определяет, как часто сервер отсылает игроку апдейт-пакеты. Чем выше частота – тем плавне идет игра у игрока, но тем выше нагрузка на интернет-канал. При слабом (плохом, низкоскоростном) соединении высокая частота обновления может быть причиной лагов и фризов.
6.Загрузка карт клиенту
Одной из немаловажных возможностей, которые становятся доступны администратору игрового сервера при установке FreeZone, является автоматическая загрузка текущей карты игроку. В отличие от античита SACE3, в который встроена аналогичная функция, для загрузки карты через FreeZone клиенту не требуется устанавливать абсолютно НИКАКОГО дополнительного программного обеспечения. Все, что необходимо для успешной загрузки и установки карты – запущенная игра и немного свободного времени.
ВАЖНО! При наличии у клиента античита SACE3 возможности по загрузке карт FreeZone работать не будут. SACE3 самостоятельно загрузит текущую карту из своего хранилища, если она в нем окажется доступна. Если же текущая нестандартная карта отсутствует в хранилище, то игрок не сможет присоединиться к текущей игровой сессии на сервере. Это особенность самого античита SACE3, который не позволяет игрокам использовать карты со сторонних ресурсов. Для присоединения к игре в таком случае игроку следует запустить игру без SACE3 (ключ –wosace в ярлыке) и воспользоваться возможностями, предоставляемыми FreeZone.
С точки зрения игрока, процесс скачки карты выглядит следующим образом:
1) Он выбирает в мастерлисте сервер и пытается присоединиться к нему
2) Сервер его отключает, выводя сообщение об отсутствии карты. В нижней части экрана игрока появляется полоса, отражающая ход загрузки карты
3) После завершения загрузки карты, игра автоматически заново присоединяется к игровому серверу.
Для активирования функции автоматической загрузки карты необходимо:
1) В основном конфиге FreeZone включить (выставить в true) опцию enable_map_downloader
2) Там же, в параметре reconnect_string ввести строку вида start -client(%ip%/port=%port%), где на место ip подставить ВНЕШНИЙ ip-адрес сервера, а на месте %port% - ВНЕШНИЙ порт. Это необходимо для того, чтобы клиент знал, куда ему подключаться после загрузки карты.
3) Теперь необходимо настроить ссылки, по которым клиент может качать карты. Это делается в файле fz_download_links.ini. Для каждой нестандартной карты, существующей на сервере, в этот файл необходимо прописать строку вида %mapname%=%link%, например:
mp_pool_new = http://mysite.com/map.db
ВАЖНО! Необходимо указывать ПРЯМУЮ ссылку на файл, являющийся несжатым db-архивом с картой! В случае некорректно указанной ссылки возможно зависание клиента при попытке скачивания!
Для удобства игрока скачанная карта может быть использована повторно, без необходимости повторной её загрузки. Чтобы использовать эту возможность, необходимо в файле fz_download_links.ini указать строку с CRC32 архива с картой. Это делается следующим образом (пример):
%crc32_mp_industrial_1.0% = 6E74c5d4
То есть, сначала указывается префикс %crc32, затем через символ нижнего подчеркивания – название карты, ее версия, затем завершающий символ %, знак равенства и значение CRC32.
Для интересующихся: когда FreeZone распознает этот параметр, производится проверка наличия уже скачанного файла на клиенте и расчет его контрольной суммы. Если контрольная сумма этого файла совпадает с указанной в конфиге – считается, что карты одинаковы, и происходит монтирование этого архива и дальнейшая загрузка игры. Если же контрольная сумма не указана или не совпадает с имеющейся, то загрузка карты будет произведена заново.
Отметим еще один момент касательно загрузки карт. Зачастую при загрузке требуется указать описание карты на разных языках в отдельных XMLах. Чтобы эти описания успешно прогрузились клиентом, в fz_download_links.ini для каждой карты с описанием в XMLах следует прописать название XMLа, в котором это описание находится. Делается это таким образом (пример для «Пожарной станции 2012»):
%xml_mp_2012cs_1.0%=mp_2012cs.xml
Но если XML-файл совершенно новый и не заменяет ни одного из оригинальных, возникает другая проблема. Если предполагается игра на сервере игроков с лозными локалями игры (например, rus и eng), то для КАЖДОЙ из этих локалей должен существовать файл с таким названием, в противном случае игра просто вылетит. Возможный обход проблемы – размещать новые строки в уже существующем XMLе и указывать в fz_download_links именно его. В таком случае этот XML будет просто перезагружен с добавлением новых строк в транслятор игры при их наличии. Если же их не окажется там – ничего страшного не произойдет.
Дополнение: описанный механизм позволяет успешно загружать клиенту в архиве с картой и другой контент (моды). Данная особенность не является штатным использованием технологии и потому тщательно не тестировалась. Используйте на свой страх и риск!
7.Другие особенности.
Во-первых, была предпринята попытка исправления бага с пролетом мимо магазина. Баг возникает из-за того, что команды на переход в наблюдателя после смерти и спавн из режима наблюдателя имеют одинаковый код в пакете. Из-за этого, когда игрок после смерти быстро совершает несколько кликов (необязательно преднамеренно, например, он в момент смерти мог стрелять из пистолета и после нее рефлекторно сделать еще пару выстрелов), на каждый клик отправляется такой пакет. По задумке разрабов, после получения первого пакета сервер переводит игрока в режим наблюдателя и отправляет ему пакет с подтверждением этого режима. Когда игрок в режиме наблюдателя, то отправка пакетов по нажатию клавиши стрельбы не происходит, такой пакет отправляется только при спавне игрока. Но теперь представим, что у игрока пинг в 200мс. Что происходит:
1) Игрок получает уведомление о смерти, но продолжает стрелять. После первого выстрела в мертвом состоянии клиент отправляется пакет о переводе игрока в режим наблюдателя. Но игрок кликает на мышь повторно. Клиент еще не получил сообщение о переходе в наблюдателя, и отправляет серверу… второй пакет для перевода клиента в режим наблюдателя (который идентичен пакету спавна).
2) Сервер получает первый пакет, переводит игрока в режим наблюдателя и отправляет последнему подтверждение этого. Но вслед за этим ему тут же приходит второй такой же пакет! Сервер видит, что игрок уже в режиме наблюдателя, и думает, что игрок хочет заспавниться. При этом по понятным причинам пакета на формирование закупки серверу не приходило, потому игрок спавнится с предметами по умолчанию (то есть голым). Сервер спавнит игрока и отправляет клиенту пакет.
3) Клиент скопом получает два пакета: первый о переходе в наблюдателя, второй – о спавне с пустым рюкзаком. Имеем баг.
Собственно, исходя из описанного механизма, следует и решение этой проблемы: после перевода игрока в режим наблюдателя блокировать на некоторое время (оптимально пингу, умноженному на 2) спавн игрока, игнорируя второй и последующий пакеты. Тогда пакет о переходе в режим наблюдателя гарантированно достигнет клиента и пролета мимо магазина не произойдет. Именно так защита от этого и реализована во FreeZone. Время блокировки респавна задается параметром конфига player_ready_signal_interval.
Следующая особенность – это сброс числа сообщений о высоком пинге. Если пинг у игрока в целом небольшой, но изредка прыгает выше лимита, то мы считаем, что отключать его через 5 предупреждений будет не очень правильно. Потому в параметре ping_warnings_max_interval задается время после получения последнего предупреждения о превышении пинга, через которое происходит обнуление счетчика превышений.
Кроме того, для внеcения разнообразия в игру были придуманы опции подмены визуалов и предметов игроков. Для их включения в основной конфиг FreeZone надо прописать, соответственно:
use_skins_change = true
use_item_change = true
После этого необходимо задать, какие визуалы и предметы на какие менять. Для визуалов игроков параметры будут иметь вид:
team_%idteam%_skin_%idskin%
Где на месте %idteam% стоит число, обозначающее номер команды, а на месте %idskin% - число, обозначающее номер скина. Номера скинов изменяются от 0 до 5, а номера команд – от 0 до 2. 0 – это игроки в дезматче, 1 – свобода, 2 – наемники. В значении параметра указывается путь в геймдате до ogf-файла со скином.
Указанные параметры не действуют на игроков в броне, так как визуал таких игроков определяется параметрами самой брони!
Аналогичным образом меняются и покупаемые предметы. Для этого используются параметры вида team_%idteam%_item_%oldsection%, где %oldsection% - имя заменяемой секции. Значение параметра – имя секции, на которую будет заменен этот предмет.