sim-chat
Чат-клиент внутри Minecraft с симуляцией диалогов и разговоров на основе данных
- Загрузчики
- Forge
- Скачиваний на Modrinth
- 1,1 тыс.
- Подписчиков на Modrinth
- 0
- версий
- 11
- Обновлён
- 27 января 202627 янв.
- Опубликован
- в 2026
Коротко о моде
Нужен и в игре, и на сервере
Sim Chat
Мод для Minecraft Forge, добавляющий интерфейс чата в стиле Slack/Discord для диалогов. Создан для авторов модпаков, чтобы писать сценарии разговоров через датапаки и команды.
Возможности
- Интерфейс в стиле Slack/Discord: боковая панель со списком бесед, панель истории чата с пузырями сообщений
- Беседы на основе команд: игроки делят историю беседы внутри своей команды
- Диалоги на основе датапаков: деревья диалогов задаются в JSON и загружаются как ресурсы датапака
- Кнопки действий: кликабельные варианты ответа, запускающие команды или продолжающие диалог
- Условные действия: показ/скрытие кнопок на основе данных, счётов или колбэков KubeJS
- Система шаблонов: динамический текст с именами игроков, данными команды, информацией о мире
- Индикаторы набора текста: имитация задержки перед появлением сообщений
- Всплывающие уведомления: ненавязчивые попапы при появлении новых сообщений
- Свои аватары: загрузка PNG-изображений из папки конфига для портретов отправителей
- Хранение данных команды: сохранение значений, состояний и счётов для каждой команды
- Интеграция с KubeJS: регистрация своих колбэков для условий и шаблонов
- Хранилище SQLite: постоянная история сообщений с ленивой загрузкой для больших бесед
- Масштабируемость: справляется со 100k+ сообщений с плавной прокруткой и мгновенным откликом интерфейса
Зависимости
- Требует библиотечный мод
sqlite_jdbc(minecraft-sqlite-jdbc) и на клиенте, и на сервере
Хранилище
История бесед хранится в базе данных SQLite по пути `/data/simchat/simchat.db`. Это обеспечивает:
- Масштабируемость: эффективно обрабатывает 100k+ сообщений благодаря ленивой загрузке
- Постоянство: данные переживают перезапуски сервера и перезагрузки мира
- Просматриваемость: сообщения хранятся в виде читаемого JSON (можно открыть в любом браузере SQLite)
Команды
Основные команды
/simchat send <player> <dialogueId> - Отправить диалог игроку
/simchat system <player> <entityId> <message> - Отправить системное сообщение
/simchat clear <player> [entityId] - Очистить историю чата
/simchat open <player> [entityId] - Открыть экран чата игроку
/simchat openmessage <messageId> - Открыть чат на конкретном сообщении
/simchat reload - Перезагрузить колбэки KubeJSКоманды команд
/simchat team create <name> - Создать новую команду
/simchat team invite [player] - Пригласить игрока (или всем, если не указан)
/simchat team join <teamId> - Присоединиться к команде по ID
/simchat team list - Список всех команд
/simchat team info - Показать информацию о текущей команде
/simchat team title <newTitle> - Изменить название команды
/simchat team color <color> - Изменить цвет команды (только название)Доступные цвета: black, dark_blue, dark_green, dark_aqua, dark_red, dark_purple, gold, gray, dark_gray, blue, green, aqua, red, light_purple, yellow, white
Команды данных
Храните значения для каждой команды, чтобы отслеживать прогресс, счёты, состояния. Все команды принимают необязательный параметр [target] (имя игрока или ID/название команды), чтобы работать с конкретной командой:
/simchat data get <key> [target] - Получить значение
/simchat data set <key> <value> [target] - Задать значение (числа определяются автоматически)
/simchat data add <key> <amount> [target] - Прибавить к числовому значению
/simchat data remove <key> [target] - Удалить ключ
/simchat data list [target] - Показать все данныеПримеры:
/simchat data get gold - Получить золото вашей команды
/simchat data get gold Steve - Получить золото команды Steve
/simchat data set rank vip "Team Alpha" - Задать строку для Team Alpha
/simchat data set gold 100 - Задать число (определяется автоматически)
/simchat data add points 10 abc1234 - Прибавить 10 очков команде abc1234
### Команды обратного вызова
/simchat callback list - Показать список зарегистрированных KubeJS-колбэков /simchat callback run [player] - Выполнить колбэк и показать результат
## Формат датапака
Диалоги загружаются из: `data/<namespace>/simchat/<path>.json`
Пример: `data/mypack/simchat/contractor/greeting.json`
```json
{
"entityId": "contractor",
"entityName": "Director Vex",
"entitySubtitle": "Helion Industries",
"text": "Hello {player:name}! Your team ({team:title}) has completed {data:contracts_done} contracts.",
"actions": [
{
"label": "Accept Contract (+{data:reward} credits)",
"commands": [
"simchat data add contracts_done 1",
"give @s emerald 10"
],
"reply": "I'll take the job.",
"nextState": "mypack:contractor/contract_details",
"condition": "data:has_clearance"
},
{
"label": "Decline",
"reply": "Not interested.",
"condition": "!data:forced_contract"
}
]
}Поля диалога
| Поле | Тип | Описание |
|---|---|---|
entityId | string | Уникальный идентификатор сущности (используется для поиска аватара и группировки диалогов) |
entityName | string | Отображаемое имя в чате |
entitySubtitle | string | Необязательный подзаголовок (компания, должность) |
text | string | Содержимое сообщения (поддерживает шаблоны) |
actions | array | Кнопки ответа (необязательно) |
Поля действия
| Поле | Тип | Описание |
|---|---|---|
label | string | Текст кнопки (поддерживает шаблоны) |
commands | array | Команды, выполняемые при нажатии |
reply | string | Ответ игрока, отображаемый в чате (поддерживает шаблоны) |
nextState | string | ID диалога, запускаемого после этого действия |
condition | string | Условие, которое должно быть истинным для отображения кнопки |
itemsVisual | array | Предметы для отображения на кнопке |
itemsInput | array | Предметы, требуемые от игрока (проверяются перед активацией) |
itemsOutput | array | Предметы, выдаваемые игроку |
Формат предмета
{
"item": "minecraft:diamond",
"count": 5
}Шаблоны
Шаблоны работают в entityName, entitySubtitle, text, label, reply и commands.
Префикс {compile:...} (по умолчанию) разрешается на сервере при создании сообщения, а {runtime:...} — на клиенте при отображении сообщения. Runtime-шаблоны хранятся и разрешаются на стороне клиента; сервер видит только скомпилированный текст. Runtime-значения обновляются при открытии чата, при поступлении новых сообщений или через кнопку обновления.
Используйте синтаксис {resolver:name} в тексте, метках и ответах:
| Шаблон | Описание | Пример |
|---|---|---|
{player:name} | Имя игрока | "Steve" |
{player:uuid} | UUID игрока | "069a79f4..." |
{team:id} | ID команды | "a1b2c3d" |
{team:title} | Название команды | "The Builders" |
{team:memberCount} | Количество участников команды | "3" |
{team:color} | Название цвета команды | "dark_blue" |
{data:keyname} | Значение данных команды | "42" |
{world:day} | Текущий день мира | "15" |
{world:time} | Время суток (0-24000) | "6000" |
{world:dimension} | ID измерения | "minecraft:overworld" |
{world:weather} | Состояние погоды | "clear", "rain", "thunder" |
{kjs:callbackName} | Результат KubeJS-колбэка | (любое значение) |
Пример:
{
"text": "Day {world:day}: Hello {player:name}! You have {data:points} points."
}Условия
Используйте условия для показа/скрытия кнопок действий. Префикс ! для отрицания.
| Условие | Описание |
|---|---|
data:keyname | Истинно, если данные команды истинны (существуют, не ноль, не пусты) |
kjs:callbackName | Истинно, если KubeJS-колбэк возвращает истину |
score:objectiveName | Истинно, если счёт игрока в таблице очков > 0 |
permission:level | Истинно, если у игрока есть уровень разрешений |
Примеры:
{
"actions": [
{
"label": "VIP Option",
"condition": "data:is_vip"
},
{
"label": "Regular Option",
"condition": "!data:is_vip"
},
{
"label": "Admin Only",
"condition": "permission:2"
}
]
}Интеграция с KubeJS
Зарегистрируйте колбэки в kubejs/server_scripts/simchat.js:
// Очистить старые колбэки при перезагрузке
SimChat.clearCallbacks()
// Зарегистрировать колбэк-условие
SimChat.registerCallback('hasEnoughGold', ctx => {
return ctx.player.persistentData.getInt('gold') >= 100
})
// Зарегистрировать колбэк-шаблон
SimChat.registerCallback('goldAmount', ctx => {
return ctx.player.persistentData.getInt('gold')
})
// Регистрация с использованием данных команды
SimChat.registerCallback('isVeteran', ctx => {
return ctx.team && ctx.team.data.missions_completed >= 10
})
// Колбэк на основе времени
SimChat.registerCallback('greeting', ctx => {
let time = ctx.player.level.dayTime % 24000
if (time < 6000) return 'Good morning'
if (time < 12000) return 'Good afternoon'
return 'Good evening'
})
SimChat.logStatus() // Вывести количество колбэковКонтекст колбэка
Доступно в колбэках через ctx:
// Игрок (обёртка KubeJS — полный доступ)
ctx.player
ctx.player.persistentData
ctx.player.level.dayTime
ctx.player.inventory
// Команда (null, если команды нет)
ctx.team.id
ctx.team.title
ctx.team.memberCount
ctx.team.data // Map всех данных команды
ctx.team.data.keyname // Доступ к конкретному ключу
ctx.team.hasData('key') // Проверка на наличие
// Сущность (null, если нет контекста сущности)
ctx.entity.id
ctx.entity.displayName
ctx.entity.messageCount
ctx.entity.lastMessage
ctx.entity.isTypingИспользование в диалогах
{
"text": "{kjs:greeting}, {player:name}! You have {kjs:goldAmount} gold.",
"actions": [
{
"label": "Buy Item (100 gold)",
"condition": "kjs:hasEnoughGold",
"commands": ["simchat data add purchases 1"]
}
]
}Файлы сущностей
Поместите конфиги сущностей и аватары в: config/simchat/entities/
Каждая сущность может иметь:
- `.json` — конфиг с именем, подзаголовком, настройками аватара
- `.png` — изображение аватара (любой размер, отображается 36x36)
Пример: config/simchat/entities/merchant.json
{
"name": "Merchant Bob",
"subtitle": "Ironwood Trading Co.",
"avatar": "merchant"
}| Поле | Описание |
|---|---|
name | Отображаемое имя по умолчанию |
subtitle | Подзаголовок по умолчанию |
avatar | ID аватара (по умолчанию — entityId) |
Значения по умолчанию
Создайте default.json и/или default.png как запасные варианты для сущностей без отдельных файлов.
Все файлы сущностей перезагружаются на лету при изменении.
Конфигурация
Клиентский конфиг (simchat-client.toml)
| Опция | По умолчанию | Описание |
|---|---|---|
notificationSound | minecraft:block.note_block.bell | Звук при новом сообщении |
notificationVolume | 0.5 | Громкость звука (0.0-1.0) |
showToasts | true | Показывать всплывающие уведомления |
toastDuration | 5.0 | Время отображения уведомления (секунды) |
sidebarWidth | 240 | Ширина списка бесед |
sidebarSortMode | 0 | Сортировка: 0=по недавним, 1=по алфавиту |
chatBackgroundColor | 0xDD12121F | Фон панели чата (ARGB hex) |
lazyLoadBatchSize | 30 | Количество сообщений для запроса при прокрутке вверх |
lazyLoadThreshold | 100 | Пикселей от верха до загрузки старых сообщений |
closedCacheSize | 400 | Количество сообщений, кэшируемых на беседу при закрытии чата |
Общий конфиг (simchat-common.toml)
| Опция | По умолчанию | Описание |
|---|---|---|
minDelay | 0.3 | Минимальная задержка набора (секунды) |
maxDelay | 3.0 | Максимальная задержка набора (секунды) |
charsPerSecond | 100.0 | Имитируемая скорость набора |
permissions.* | 4 | Уровни прав на команды (0-4) |
permissions.openmessage | 0 | Разрешить открытие ссылок в сообщениях |
teamJoin.joinBehavior | join_largest | join_largest, join_smallest, join_random, create_new |
teamJoin.joinSizeCap | -1 | Лимит авто-вступления (-1 отключает, создаёт новую, если нет подходящих) |
initialMessageCount | 30 | Сообщений на беседу при начальной синхронизации |
maxLazyLoadBatchSize | 100 | Серверный лимит на запросы ленивой загрузки |
Переопределение цветов (simchat-client.toml)
Настройки цветов находятся в секции [colors] и принимают ARGB hex-строки (например, 0xFF88AAFF). Пример:
[ui]
chatBackgroundColor = "0x8047BAFF"
[colors]
sidebarBackgroundColor = "0xFF1B2230"
headerTextColor = "0xFFBBD7FF"
messageTextColor = "0xFFE8F1FF"
contextMenuBgColor = "0xFF202030"
toastBackgroundColor = "0xFF243048"Доступные ключи цветов (все необязательные):
sidebarBackgroundColordividerColordividerHoverColorheaderTextColorheaderSubtitleColoremptyStateTextColorheaderSeparatorColorrefreshButtonColorrefreshButtonHoverColorrefreshTextColorsortButtonColorsortButtonHoverColorsortTextColorcompactHintColorscrollbarColorinputBgColoroutputBgColordisabledBgColorplayerNameColorentityNameColorsubtitleColordayTextColormessageTextColordisabledTextColorwhiteTextColorsystemTextColorbuttonDefaultColorbuttonHoverColorborderDisabledColorborderHoverColorborderDefaultColorfocusBorderColorcontextMenuBgColorcontextMenuBorderColorcontextMenuTextColorcontextMenuHighlightColorinputValidColorinputInvalidColorinputFieldBgColorinputFieldBorderColorinputFieldBorderFocusedColorinputCursorColorinputSendEnabledColorinputSendDisabledColortoastSenderColortoastPreviewColortoastBackgroundColortoastBorderColortoastHintColor
Горячие клавиши
| Клавиша | Действие |
|---|---|
; (точка с запятой) | Открыть экран чата |
JSON-схема
Проверяйте свои диалоги с помощью JSON-схемы по адресу schemas/dialogue.schema.json.
Настройка VS Code:
{
"$schema": "https://raw.githubusercontent.com/YardenZamir/sim-chat/main/schemas/dialogue.schema.json",
"entityId": "...",
...
}Лицензия
MIT
Частые вопросы
Как установить sim-chat?
Установите Forge под свою версию Minecraft, скачайте sim-chat под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть sim-chat?
У sim-chat есть сборки для Minecraft 1.20.1.
Нужен ли sim-chat на сервере?
Нужен и в игре, и на сервере