MAATRIX GAMES / Блог / Terraria — TShock config.json полностью

Terraria — TShock config.json полностью

MAATRIX GAMES

Базовый serverconfig.txt ты уже настроил, сервер поднялся, TShock работает — но дальше начинается зона, где 90% админов просто копируют чужой config.json целиком, не понимая половины ключей. А потом удивляются, почему инвазия из десяти зомби превращается в толпу на полсотни голов, или почему игрок с легитимным Zenith в руках внезапно ловит кик за "превышение урона". Разберём файл по-настоящему: где он живёт, что реально делает DisableSpewLogs, как считается InvasionMultiplier, какие пороги стоят за античит-модулем Bouncer и как TShock на самом деле хранит права — там не всё так, как кажется по названиям в интернете.

Где живёт config.json и как применять правки

Файл лежит в tshock/config.json рядом с исполняемым файлом сервера — если запускаешь TShock через dotnet TShock.Server.dll, ищи его в рабочей директории, в подпапке tshock. При первом запуске сервер создаёт его сам со значениями по умолчанию:

cd /opt/tshock/tshock
nano config.json

Рядом лежит sscconfig.json — отдельный конфиг Server Side Characters, не путай его с основным файлом: часть настроек, которая на первый взгляд должна быть в config.json (лимиты HP/MP при SSC), на самом деле живёт там.

Главная грабля — обычный JSON: одна лишняя запятая или незакрытая скобка — и сервер либо не стартует, либо тихо откатывается к дефолтам. Перед сохранением прогоняй файл через валидатор:

python3 -m json.tool config.json > /dev/null && echo "OK"

Ошибка укажет примерную строку, где парсер споткнулся. Перед серьёзной правкой всегда делай cp config.json config.json.bak.

Применить изменения можно двумя путями: /reload в консоли (или в игре с правом tshock.cfg.reload) подхватывает большинство ключей на лету, но тип хранилища (StorageType), порт REST API и сам сетевой порт требуют полного перезапуска — sudo systemctl restart tshock, если настраивал автозапуск так же, как в статье про поднятие сервера Terraria.

DisableSpewLogs и что вообще происходит с логами

DisableSpewLogs (булево, по умолчанию true) — самый непонятный по названию ключ в файле. Он не отключает логирование, а блокирует показ служебного "спама" игрокам с правом tshock.log (обычно админы). При true такие строки идут только в консоль и файл лога, не всплывая в игровом чате. Хочешь, чтобы модераторы видели поток событий прямо в чате с телефона — ставь false, но готовься к менее читаемому чату в пиковые моменты.

Рядом стоит настроить связанные ключи:

  • AnnounceSave — объявление о сохранении мира всем игрокам; на активном сервере с частым автосейвом лучше false.
  • LogPath — папка текстовых логов (по умолчанию tshock/logs).
  • UseSqlLogs / RevertToTextLogsOnSqlFailures — логирование в БД вместо файлов, со страховкой на случай недоступности БД.
  • DisplayIPToAdmins / EnableGeoIP — показывают IP и геолокацию игрока админам при входе; удобно для модерации, но подумай о приватности на публичном сервере.

Логи пригодятся не только для модерации — если после установки плагина сервер начинает падать, разбор tshock/logs первый шаг, как в статье про краши плагинов на TShock.

Поднять сервер Terraria за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

InvasionMultiplier: как на самом деле считается размер нашествия

InvasionMultiplier (целое, по умолчанию 1) управляет масштабом инвазий — Goblin Army, Pirate Invasion, Old One's Army. Формула: размер волны = 100 + (multiplier × количество активных игроков с HP выше 200). При дефолте и трёх прокачанных игроках итоговая волна — около 103 условных единиц силы (не число мобов буквально, а внутренний счётчик, из которого движок выводит конкретных мобов).

Практический вывод: маленький сервер на 2-4 игрока, где инвазии кажутся вечными — понижай множитель вплоть до 0. Десяток ветеранов сносят Goblin Army за 40 секунд и жалуются, что скучно — подними.

Смежные параметры спавна:

  • InfiniteInvasion — не даёт счётчику инвазии уменьшаться, событие идёт до победы над всеми волнами; ощутимая нагрузка на CPU при большом числе NPC.
  • DefaultMaximumSpawns (5) и DefaultSpawnRate (600) — уже не инвазии, а фоновый спавн: сколько существ держится в мире и с какой задержкой в тиках появляются новые.
  • StatueSpawn200 / StatueSpawn600 / StatueSpawnWorld (3 / 6 / 10) — лимиты NPC, заспавненных статуями, в радиусе 200 и 600 тайлов и по миру целиком. Ферма на статуях внезапно останавливается — почти всегда упираешься в один из этих лимитов.
  • AnonymousBossInvasions — скрывает от игроков, кто именно призвал босса или начал инвазию командой.

Античит Bouncer: пороги, которые реально ловят читеров

Встроенный модуль защиты называется Bouncer, и бо́льшая часть его поведения — набор количественных порогов, а не один тумблер. Ключевой переключатель — RangeChecks (по умолчанию true): проверка, что игрок физически в радиусе от тайла, который он ломает или ставит. Отключай только для теста конкретной проблемы, никогда не держи выключенной на боевом сервере — прямая дыра для тайл-хаков и телепорт-читов.

ПараметрДефолтЧто ловит
TileKillThreshold60/секСлишком быстрое разрушение тайлов (х-рей боты, авто-майнеры)
TilePlaceThreshold20/секСлишком быстрая массовая постройка
ProjectileThreshold50/секСпам снарядами сверх разумного для легитимного оружия
HealOtherThreshold—Подозрительно частые пакеты лечения других игроков
MaxDamage1175Урон за удар выше теоретического потолка ванильного оружия
MaxProjDamage—То же самое, но для урона от снарядов

При превышении порога Bouncer по умолчанию просто отменяет действие (тайл не ломается, урон не засчитывается), а KickOnDamageThresholdBroken добавляет кик при срабатывании по урону — эффективно против явных дамаг-хаков, но рискованно на серверах с активным PvP.

Нюанс: пороги считаются от "разумного максимума", а не от точной механики конкретной версии игры, поэтому массовые взрывы динамитом или ракетницами толпой игроков нередко ложно цепляют TileKillThreshold — тайлы ломаются лавиной за долю секунды, и Bouncer видит паттерн бота. Разбор такой ситуации — в статье Terraria лагает при массовых взрывах. Поднимай пороги постепенно: каждое увеличение снижает чувствительность защиты.

MaxDamage: 1175 ориентирован на потолок урона топовых крит-сборок вроде Zenith. Если у тебя плагины на усиление оружия, планку придётся поднимать вручную — иначе легитимные крит-удары начнут отменяться сервером.

Права и группы: как на самом деле устроены permissions

Тут стоит разрушить частое заблуждение: в актуальных версиях TShock нет плоского файла permissions.json, который открываешь в редакторе и правишь руками, как config.json. Группы и права хранятся в базе tshock.sqlite (тип хранилища — ключ StorageType: sqlite или mysql; для MySQL рядом настраиваются MySqlHost, MySqlUsername, MySqlPassword, MySqlDbName — подробнее в статье про MySQL под игровые плагины). Работать с правами напрямую через SQL — плохая идея, для этого есть команды.

Из коробки сервер создаёт минимум три группы: guest (незарегистрированные, базовые права на чат — ключ DefaultGuestGroupName), default (зарегистрированные, наследует guest плюс варпы — ключ DefaultRegistrationGroupName) и superadmin (все права, обычно только владельцу). Управление — командами:

/group add moder default tshock.admin.kick,tshock.admin.mute
/group addperm moder tshock.admin.ban
/group delperm moder tshock.admin.mute
/user group Vasya moder

Права — строки вида категория.подкатегория.действие: tshock.admin.kick, tshock.admin.ban, tshock.world.time, tshock.npc.startinvasion, tshock.tp.self. Группа наследует права от родительской (parent) — moder из примера получает всё, что есть у default, плюс своё. Чтобы явно запретить унаследованное право, перед ним ставится !: !tshock.tp.self отменит телепортацию, даже если родитель её разрешает.

Ближе всего к интуитивному "permissions.json" — структура, которую отдаёт REST API TShock на запрос /v2/groups/read (при включённом RestApiEnabled): JSON с полями name, parent, chatcolor, permissions (прямые права), negatedpermissions и totalpermissions (с учётом наследования). Пригодится для внешней панели управления или снимка прав для бэкапа без прямого доступа к базе. Общий разбор систем прав на игровых серверах, не только TShock — в статье Permissions-плагины: настройка групп и прав.

Менее очевидные параметры, о которых часто забывают

  • SpawnProtection / SpawnProtectionRadius (радиус по умолчанию 10) — запрет строить и ломать тайлы у точки спавна мира; про защиту территории — статья про защиту от гриферов.
  • RegionProtectChests / RegionProtectGemLocks — распространяют build-права региона на сундуки и гем-замки внутри него.
  • ServerSideInventory (экспериментально, false) и ServerSideInventorySave (15 минут) — серверное хранение инвентаря против дюпа при рассинхроне клиент-сервер. Тестируй на копии мира перед включением на боевом.
  • LogonDiscardThreshold (250 мс) — работает вместе с SSI, отсекает быстрый выброс предмета сразу после логина.
  • RememberLeavePos — запоминает точку выхода игрока (по IP) и возвращает туда при следующем входе вместо общего спавна.
  • BCryptWorkFactor (5-31) и HashAlgorithm (sha512/sha256/md5) — хеширование паролей регистрации; для большинства серверов дефолт трогать не нужно.
  • BackupInterval / BackupKeepFor (минуты, 0 — выключено) — встроенный автобэкап мира. Для продакшена лучше держать отдельное внешнее резервное копирование.
  • KickOnMediumcoreDeath / BanOnHardcoreDeath и текстовые пары *Reason — жёсткие ролевые режимы, где смерть персонажа кикает или банит навсегда. Предупреждай об этом в MOTD.

Поднять сервер Terraria за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

После правки config.json сервер не стартует вообще.

В 9 случаях из 10 — синтаксическая ошибка JSON (лишняя запятая, незакрытая скобка). Прогони файл через python3 -m json.tool config.json — валидатор укажет примерную строку проблемы. Восстановиться поможет заранее сделанная копия config.json.bak.

Изменил порог анти-чита, а он не применился.

Часть ключей подхватывается командой /reload, но не все — тип хранилища, сетевой порт и порт REST API требуют полного перезапуска процесса, а не только /reload.

Где искать permissions.json, все гайды его упоминают?

Такого файла в актуальных версиях TShock нет — права хранятся в базе (tshock.sqlite или MySQL, ключ StorageType), а управляются командами /group. Ближайший JSON-снимок группы можно получить через REST API-эндпоинт /v2/groups/read.

Легитимные игроки ловят кик от анти-чита при обычной игре.

Чаще всего это TileKillThreshold или MaxDamage — массовые взрывы или крит-сборки вроде Zenith подходят близко к дефолтным лимитам. Поднимай порог постепенно и проверяй логи в tshock/logs, а не отключай RangeChecks целиком.

Можно ли одновременно держать высокий InvasionMultiplier и низкий DefaultMaximumSpawns?

Да, это разные системы: множитель считает силу конкретно инвазионных волн, а DefaultMaximumSpawns ограничивает фоновый спавн обычных мобов вне ивентов. Настраиваются полностью независимо друг от друга.