Перейти к содержимому

sim-chat

Чат-клиент внутри Minecraft с симуляцией диалогов и разговоров на основе данных

Forge
Загрузчики
Forge
Скачиваний на Modrinth
1,1 тыс.
Подписчиков на Modrinth
0
версий
11
Обновлён
27 января 202627 янв.
Опубликован
в 2026

Коротко о моде

Работает на Forge
Для Minecraft 1.20.1
Нужен и в игре, и на сервере
Последняя версия — 0.12.0 от 27 января 2026
Лицензия MIT — бесплатно
Где нужен
В игреобязателенНа сервереобязателен

Нужен и в игре, и на сервере

Версии игры1.20.1
Описание переведено автоматическиПоказать оригинал (EN)

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"
    }
  ]
}

Поля диалога

ПолеТипОписание
entityIdstringУникальный идентификатор сущности (используется для поиска аватара и группировки диалогов)
entityNamestringОтображаемое имя в чате
entitySubtitlestringНеобязательный подзаголовок (компания, должность)
textstringСодержимое сообщения (поддерживает шаблоны)
actionsarrayКнопки ответа (необязательно)

Поля действия

ПолеТипОписание
labelstringТекст кнопки (поддерживает шаблоны)
commandsarrayКоманды, выполняемые при нажатии
replystringОтвет игрока, отображаемый в чате (поддерживает шаблоны)
nextStatestringID диалога, запускаемого после этого действия
conditionstringУсловие, которое должно быть истинным для отображения кнопки
itemsVisualarrayПредметы для отображения на кнопке
itemsInputarrayПредметы, требуемые от игрока (проверяются перед активацией)
itemsOutputarrayПредметы, выдаваемые игроку

Формат предмета

{
  "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Подзаголовок по умолчанию
avatarID аватара (по умолчанию — entityId)

Значения по умолчанию

Создайте default.json и/или default.png как запасные варианты для сущностей без отдельных файлов.

Все файлы сущностей перезагружаются на лету при изменении.

Конфигурация

Клиентский конфиг (simchat-client.toml)

ОпцияПо умолчаниюОписание
notificationSoundminecraft:block.note_block.bellЗвук при новом сообщении
notificationVolume0.5Громкость звука (0.0-1.0)
showToaststrueПоказывать всплывающие уведомления
toastDuration5.0Время отображения уведомления (секунды)
sidebarWidth240Ширина списка бесед
sidebarSortMode0Сортировка: 0=по недавним, 1=по алфавиту
chatBackgroundColor0xDD12121FФон панели чата (ARGB hex)
lazyLoadBatchSize30Количество сообщений для запроса при прокрутке вверх
lazyLoadThreshold100Пикселей от верха до загрузки старых сообщений
closedCacheSize400Количество сообщений, кэшируемых на беседу при закрытии чата

Общий конфиг (simchat-common.toml)

ОпцияПо умолчаниюОписание
minDelay0.3Минимальная задержка набора (секунды)
maxDelay3.0Максимальная задержка набора (секунды)
charsPerSecond100.0Имитируемая скорость набора
permissions.*4Уровни прав на команды (0-4)
permissions.openmessage0Разрешить открытие ссылок в сообщениях
teamJoin.joinBehaviorjoin_largestjoin_largest, join_smallest, join_random, create_new
teamJoin.joinSizeCap-1Лимит авто-вступления (-1 отключает, создаёт новую, если нет подходящих)
initialMessageCount30Сообщений на беседу при начальной синхронизации
maxLazyLoadBatchSize100Серверный лимит на запросы ленивой загрузки

Переопределение цветов (simchat-client.toml)

Настройки цветов находятся в секции [colors] и принимают ARGB hex-строки (например, 0xFF88AAFF). Пример:

[ui]
chatBackgroundColor = "0x8047BAFF"

[colors]
sidebarBackgroundColor = "0xFF1B2230"
headerTextColor = "0xFFBBD7FF"
messageTextColor = "0xFFE8F1FF"
contextMenuBgColor = "0xFF202030"
toastBackgroundColor = "0xFF243048"

Доступные ключи цветов (все необязательные):

  • sidebarBackgroundColor
  • dividerColor
  • dividerHoverColor
  • headerTextColor
  • headerSubtitleColor
  • emptyStateTextColor
  • headerSeparatorColor
  • refreshButtonColor
  • refreshButtonHoverColor
  • refreshTextColor
  • sortButtonColor
  • sortButtonHoverColor
  • sortTextColor
  • compactHintColor
  • scrollbarColor
  • inputBgColor
  • outputBgColor
  • disabledBgColor
  • playerNameColor
  • entityNameColor
  • subtitleColor
  • dayTextColor
  • messageTextColor
  • disabledTextColor
  • whiteTextColor
  • systemTextColor
  • buttonDefaultColor
  • buttonHoverColor
  • borderDisabledColor
  • borderHoverColor
  • borderDefaultColor
  • focusBorderColor
  • contextMenuBgColor
  • contextMenuBorderColor
  • contextMenuTextColor
  • contextMenuHighlightColor
  • inputValidColor
  • inputInvalidColor
  • inputFieldBgColor
  • inputFieldBorderColor
  • inputFieldBorderFocusedColor
  • inputCursorColor
  • inputSendEnabledColor
  • inputSendDisabledColor
  • toastSenderColor
  • toastPreviewColor
  • toastBackgroundColor
  • toastBorderColor
  • toastHintColor

Горячие клавиши

КлавишаДействие
; (точка с запятой)Открыть экран чата

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 на сервере?

Нужен и в игре, и на сервере

Лицензия и источник
MIT Licenseможно свободно использовать и распространять с указанием автора
Оригинал — Modrinth↗Файлы — без изменений, проверены по SHA-512Это ваш мод? Правообладателям

Сайт использует cookie: необходимые — для входа и темы, а также счётчики посещений Яндекс Метрика и LiveInternet — по ним мы видим, как пользуются сайтом. Рекламных cookie у нас нет. Подробнее