Terraria — TShock config.json полностью
Базовый serverconfig.txt ты уже настроил, сервер поднялся, TShock работает — но дальше начинается зона, где 90% админов просто копируют чужой config.json целиком, не понимая половины ключей. А потом удивляются, почему инвазия из десяти зомби превращается в толпу на полсотни голов, или почему игрок с легитимным Zenith в руках внезапно ловит кик за "превышение урона". Разберём файл по-настоящему: где он живёт, что реально делает DisableSpewLogs, как считается InvasionMultiplier, какие пороги стоят за античит-модулем Bouncer и как TShock на самом деле хранит права — там не всё так, как кажется по названиям в интернете.
Содержание
- Где живёт config.json и как применять правки
- DisableSpewLogs и что вообще происходит с логами
- InvasionMultiplier: как на самом деле считается размер нашествия
- Античит Bouncer: пороги, которые реально ловят читеров
- Права и группы: как на самом деле устроены permissions
- Менее очевидные параметры, о которых часто забывают
Где живёт 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): проверка, что игрок физически в радиусе от тайла, который он ломает или ставит. Отключай только для теста конкретной проблемы, никогда не держи выключенной на боевом сервере — прямая дыра для тайл-хаков и телепорт-читов.
| Параметр | Дефолт | Что ловит |
|---|---|---|
TileKillThreshold | 60/сек | Слишком быстрое разрушение тайлов (х-рей боты, авто-майнеры) |
TilePlaceThreshold | 20/сек | Слишком быстрая массовая постройка |
ProjectileThreshold | 50/сек | Спам снарядами сверх разумного для легитимного оружия |
HealOtherThreshold | — | Подозрительно частые пакеты лечения других игроков |
MaxDamage | 1175 | Урон за удар выше теоретического потолка ванильного оружия |
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 ограничивает фоновый спавн обычных мобов вне ивентов. Настраиваются полностью независимо друг от друга.