{"id":139781,"date":"2026-06-08T09:54:27","date_gmt":"2026-06-08T06:54:27","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/"},"modified":"2026-06-08T09:54:27","modified_gmt":"2026-06-08T06:54:27","slug":"sim-chat","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/","title":{"rendered":"sim-chat"},"content":{"rendered":"<p># Sim Chat<\/p>\n<p>A Minecraft Forge mod that adds a slack\/discord-style chat interface for dialogues. Designed for modpack creators to script conversations via datapacks and commands.<\/p>\n<p>## Features<\/p>\n<p>&#8211; **Slack\/Discord-style UI**: Sidebar with conversation list, chat history panel with message bubbles<br \/>\n&#8211; **Team-based conversations**: Players share conversation history within their team<br \/>\n&#8211; **Datapack-driven dialogues**: Define dialogue trees in JSON, loaded as datapack resources<br \/>\n&#8211; **Action buttons**: Clickable response options that trigger commands or continue dialogue<br \/>\n&#8211; **Conditional actions**: Show\/hide buttons based on data, scores, or KubeJS callbacks<br \/>\n&#8211; **Template system**: Dynamic text with player names, team data, world info<br \/>\n&#8211; **Typing indicators**: Simulated typing delay before messages appear<br \/>\n&#8211; **Toast notifications**: Non-intrusive popups when new messages arrive<br \/>\n&#8211; **Custom avatars**: Load PNG images from config folder for sender portraits<br \/>\n&#8211; **Team data storage**: Store values, states, and scores per-team<br \/>\n&#8211; **KubeJS integration**: Register custom callbacks for conditions and templates<br \/>\n&#8211; **SQLite storage**: Persistent message history with lazy loading for large conversations<br \/>\n&#8211; **Scalable**: Handles 100k+ messages with smooth scrolling and instant UI response<\/p>\n<p>## Dependencies<\/p>\n<p>&#8211; Requires the `sqlite_jdbc` library mod (`minecraft-sqlite-jdbc`) on both client and server<\/p>\n<p>## Storage<\/p>\n<p>Conversation history is stored in a SQLite database at `<world>\/data\/simchat\/simchat.db`. This provides:<\/p>\n<p>&#8211; **Scalability**: Handles 100k+ messages efficiently with lazy loading<br \/>\n&#8211; **Persistence**: Data survives server restarts and world reloads<br \/>\n&#8211; **Inspectability**: Messages stored as human-readable JSON (viewable in any SQLite browser)<\/p>\n<p>## Commands<\/p>\n<p>### Basic Commands<\/p>\n<p>&#8220;`<br \/>\n\/simchat send <player> <dialogueId>    &#8211; Send dialogue to player<br \/>\n\/simchat system <player> <entityId> <message>  &#8211; Send system message<br \/>\n\/simchat clear <player> [entityId]     &#8211; Clear chat history<br \/>\n\/simchat open <player> [entityId]      &#8211; Open chat screen for player<br \/>\n\/simchat openmessage <messageId>       &#8211; Open chat to a specific message<br \/>\n\/simchat reload                        &#8211; Reload KubeJS callbacks<br \/>\n&#8220;`<\/p>\n<p>### Team Commands<\/p>\n<p>&#8220;`<br \/>\n\/simchat team create <name>            &#8211; Create a new team<br \/>\n\/simchat team invite [player]          &#8211; Invite player (or broadcast to all if omitted)<br \/>\n\/simchat team join <teamId>            &#8211; Join a team by ID<br \/>\n\/simchat team list                     &#8211; List all teams<br \/>\n\/simchat team info                     &#8211; Show current team info<br \/>\n\/simchat team title <newTitle>         &#8211; Change team name<br \/>\n\/simchat team color <color>            &#8211; Change team color (name only)<br \/>\n&#8220;`<\/p>\n<p>Available colors: `black`, `dark_blue`, `dark_green`, `dark_aqua`, `dark_red`, `dark_purple`, `gold`, `gray`, `dark_gray`, `blue`, `green`, `aqua`, `red`, `light_purple`, `yellow`, `white`<\/p>\n<p>### Data Commands<\/p>\n<p>Store values per-team for tracking progress, scores, states. All commands accept an optional `[target]` parameter (player name or team ID\/title) to operate on a specific team:<\/p>\n<p>&#8220;`<br \/>\n\/simchat data get <key> [target]       &#8211; Get value<br \/>\n\/simchat data set <key> <value> [target]   &#8211; Set value (auto-detects numbers)<br \/>\n\/simchat data add <key> <amount> [target]  &#8211; Add to numeric value<br \/>\n\/simchat data remove <key> [target]    &#8211; Remove key<br \/>\n\/simchat data list [target]            &#8211; List all data<br \/>\n&#8220;`<\/p>\n<p>Examples:<br \/>\n&#8220;`<br \/>\n\/simchat data get gold                 &#8211; Get your team&#8217;s gold<br \/>\n\/simchat data get gold Steve           &#8211; Get Steve&#8217;s team&#8217;s gold<br \/>\n\/simchat data set rank vip &#8220;Team Alpha&#8221;    &#8211; Set string on Team Alpha<br \/>\n\/simchat data set gold 100             &#8211; Set number (auto-detected)<br \/>\n\/simchat data add points 10 abc1234    &#8211; Add 10 points to team abc1234<br \/>\n&#8220;`<\/p>\n<p>### Callback Commands<\/p>\n<p>&#8220;`<br \/>\n\/simchat callback list                 &#8211; List registered KubeJS callbacks<br \/>\n\/simchat callback run <name> [player]  &#8211; Execute callback and show result<br \/>\n&#8220;`<\/p>\n<p>## Datapack Format<\/p>\n<p>Dialogues are loaded from: `data\/<namespace>\/simchat\/<path>.json`<\/p>\n<p>Example: `data\/mypack\/simchat\/contractor\/greeting.json`<\/p>\n<p>&#8220;`json<br \/>\n{<br \/>\n  &#8220;entityId&#8221;: &#8220;contractor&#8221;,<br \/>\n  &#8220;entityName&#8221;: &#8220;Director Vex&#8221;,<br \/>\n  &#8220;entitySubtitle&#8221;: &#8220;Helion Industries&#8221;,<br \/>\n  &#8220;text&#8221;: &#8220;Hello {player:name}! Your team ({team:title}) has completed {data:contracts_done} contracts.&#8221;,<br \/>\n  &#8220;actions&#8221;: [<br \/>\n    {<br \/>\n      &#8220;label&#8221;: &#8220;Accept Contract (+{data:reward} credits)&#8221;,<br \/>\n      &#8220;commands&#8221;: [<br \/>\n        &#8220;simchat data add contracts_done 1&#8221;,<br \/>\n        &#8220;give @s emerald 10&#8221;<br \/>\n      ],<br \/>\n      &#8220;reply&#8221;: &#8220;I&#8217;ll take the job.&#8221;,<br \/>\n      &#8220;nextState&#8221;: &#8220;mypack:contractor\/contract_details&#8221;,<br \/>\n      &#8220;condition&#8221;: &#8220;data:has_clearance&#8221;<br \/>\n    },<br \/>\n    {<br \/>\n      &#8220;label&#8221;: &#8220;Decline&#8221;,<br \/>\n      &#8220;reply&#8221;: &#8220;Not interested.&#8221;,<br \/>\n      &#8220;condition&#8221;: &#8220;!data:forced_contract&#8221;<br \/>\n    }<br \/>\n  ]<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>### Dialogue Fields<\/p>\n<p>| Field | Type | Description |<br \/>\n|&#8212;&#8212;-|&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `entityId` | string | Unique entity identifier (used for avatar lookup and conversation grouping) |<br \/>\n| `entityName` | string | Display name shown in chat |<br \/>\n| `entitySubtitle` | string | Optional subtitle (company, title) |<br \/>\n| `text` | string | Message content (supports templates) |<br \/>\n| `actions` | array | Response buttons (optional) |<\/p>\n<p>### Action Fields<\/p>\n<p>| Field | Type | Description |<br \/>\n|&#8212;&#8212;-|&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `label` | string | Button text (supports templates) |<br \/>\n| `commands` | array | Commands to run when clicked |<br \/>\n| `reply` | string | Player&#8217;s reply shown in chat (supports templates) |<br \/>\n| `nextState` | string | Dialogue ID to trigger after this action |<br \/>\n| `condition` | string | Condition that must be true to show button |<br \/>\n| `itemsVisual` | array | Items to display on button |<br \/>\n| `itemsInput` | array | Items required from player (checked before enabling) |<br \/>\n| `itemsOutput` | array | Items given to player |<\/p>\n<p>### Item Format<\/p>\n<p>&#8220;`json<br \/>\n{<br \/>\n  &#8220;item&#8221;: &#8220;minecraft:diamond&#8221;,<br \/>\n  &#8220;count&#8221;: 5<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>## Templates<\/p>\n<p>Templates work in `entityName`, `entitySubtitle`, `text`, `label`, `reply`, and `commands`.<\/p>\n<p>Prefix with `{compile:&#8230;}` (default) to resolve on the server when the message is created, or `{runtime:&#8230;}` to resolve on the client when the message is displayed. Runtime templates are stored and resolved client-side; the server only sees the compiled text. Runtime values refresh when the chat opens, when new messages arrive, or via the Refresh button.<\/p>\n<p>Use `{resolver:name}` syntax in text, labels, and replies:<\/p>\n<p>| Template | Description | Example |<br \/>\n|&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;|<br \/>\n| `{player:name}` | Player&#8217;s username | &#8220;Steve&#8221; |<br \/>\n| `{player:uuid}` | Player&#8217;s UUID | &#8220;069a79f4&#8230;&#8221; |<br \/>\n| `{team:id}` | Team ID | &#8220;a1b2c3d&#8221; |<br \/>\n| `{team:title}` | Team name | &#8220;The Builders&#8221; |<br \/>\n| `{team:memberCount}` | Number of team members | &#8220;3&#8221; |<br \/>\n| `{team:color}` | Team color name | &#8220;dark_blue&#8221; |<br \/>\n| `{data:keyname}` | Team data value | &#8220;42&#8221; |<br \/>\n| `{world:day}` | Current world day | &#8220;15&#8221; |<br \/>\n| `{world:time}` | Time of day (0-24000) | &#8220;6000&#8221; |<br \/>\n| `{world:dimension}` | Dimension ID | &#8220;minecraft:overworld&#8221; |<br \/>\n| `{world:weather}` | Weather state | &#8220;clear&#8221;, &#8220;rain&#8221;, &#8220;thunder&#8221; |<br \/>\n| `{kjs:callbackName}` | KubeJS callback result | (any value) |<\/p>\n<p>Example:<br \/>\n&#8220;`json<br \/>\n{<br \/>\n  &#8220;text&#8221;: &#8220;Day {world:day}: Hello {player:name}! You have {data:points} points.&#8221;<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>## Conditions<\/p>\n<p>Use conditions to show\/hide action buttons. Prefix with `!` to negate.<\/p>\n<p>| Condition | Description |<br \/>\n|&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `data:keyname` | True if team data is truthy (exists, non-zero, non-empty) |<br \/>\n| `kjs:callbackName` | True if KubeJS callback returns truthy |<br \/>\n| `score:objectiveName` | True if player&#8217;s scoreboard score > 0 |<br \/>\n| `permission:level` | True if player has permission level |<\/p>\n<p>Examples:<br \/>\n&#8220;`json<br \/>\n{<br \/>\n  &#8220;actions&#8221;: [<br \/>\n    {<br \/>\n      &#8220;label&#8221;: &#8220;VIP Option&#8221;,<br \/>\n      &#8220;condition&#8221;: &#8220;data:is_vip&#8221;<br \/>\n    },<br \/>\n    {<br \/>\n      &#8220;label&#8221;: &#8220;Regular Option&#8221;,<br \/>\n      &#8220;condition&#8221;: &#8220;!data:is_vip&#8221;<br \/>\n    },<br \/>\n    {<br \/>\n      &#8220;label&#8221;: &#8220;Admin Only&#8221;,<br \/>\n      &#8220;condition&#8221;: &#8220;permission:2&#8221;<br \/>\n    }<br \/>\n  ]<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>## KubeJS Integration<\/p>\n<p>Register callbacks in `kubejs\/server_scripts\/simchat.js`:<\/p>\n<p>&#8220;`javascript<br \/>\n\/\/ Clear old callbacks on reload<br \/>\nSimChat.clearCallbacks()<\/p>\n<p>\/\/ Register a condition callback<br \/>\nSimChat.registerCallback(&#8216;hasEnoughGold&#8217;, ctx => {<br \/>\n    return ctx.player.persistentData.getInt(&#8216;gold&#8217;) >= 100<br \/>\n})<\/p>\n<p>\/\/ Register a template callback<br \/>\nSimChat.registerCallback(&#8216;goldAmount&#8217;, ctx => {<br \/>\n    return ctx.player.persistentData.getInt(&#8216;gold&#8217;)<br \/>\n})<\/p>\n<p>\/\/ Register using team data<br \/>\nSimChat.registerCallback(&#8216;isVeteran&#8217;, ctx => {<br \/>\n    return ctx.team &#038;&#038; ctx.team.data.missions_completed >= 10<br \/>\n})<\/p>\n<p>\/\/ Time-based callback<br \/>\nSimChat.registerCallback(&#8216;greeting&#8217;, ctx => {<br \/>\n    let time = ctx.player.level.dayTime % 24000<br \/>\n    if (time < 6000) return 'Good morning'\n    if (time < 12000) return 'Good afternoon'\n    return 'Good evening'\n})\n\nSimChat.logStatus() \/\/ Log callback count\n```\n\n### Callback Context\n\nAvailable in callbacks via `ctx`:\n\n```javascript\n\/\/ Player (KubeJS wrapped - full access)\nctx.player\nctx.player.persistentData\nctx.player.level.dayTime\nctx.player.inventory\n\n\/\/ Team (null if no team)\nctx.team.id\nctx.team.title\nctx.team.memberCount\nctx.team.data           \/\/ Map of all team data\nctx.team.data.keyname   \/\/ Access specific key\nctx.team.hasData('key') \/\/ Boolean check\n\n\/\/ Entity (null if no entity context)\nctx.entity.id\nctx.entity.displayName\nctx.entity.messageCount\nctx.entity.lastMessage\nctx.entity.isTyping\n```\n\n### Usage in Dialogues\n\n```json\n{\n  \"text\": \"{kjs:greeting}, {player:name}! You have {kjs:goldAmount} gold.\",\n  \"actions\": [\n    {\n      \"label\": \"Buy Item (100 gold)\",\n      \"condition\": \"kjs:hasEnoughGold\",\n      \"commands\": [\"simchat data add purchases 1\"]\n    }\n  ]\n}\n```\n\n## Entity Files\n\nPlace entity configs and avatars in: `config\/simchat\/entities\/`\n\nEach entity can have:\n- `<entityId>.json` &#8211; Config with name, subtitle, avatar settings<br \/>\n&#8211; `<entityId>.png` &#8211; Avatar image (any size, displayed at 36&#215;36)<\/p>\n<p>Example: `config\/simchat\/entities\/merchant.json`<\/p>\n<p>&#8220;`json<br \/>\n{<br \/>\n  &#8220;name&#8221;: &#8220;Merchant Bob&#8221;,<br \/>\n  &#8220;subtitle&#8221;: &#8220;Ironwood Trading Co.&#8221;,<br \/>\n  &#8220;avatar&#8221;: &#8220;merchant&#8221;<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>| Field | Description |<br \/>\n|&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `name` | Default display name |<br \/>\n| `subtitle` | Default subtitle |<br \/>\n| `avatar` | Avatar ID (defaults to entityId) |<\/p>\n<p>### Defaults<\/p>\n<p>Create `default.json` and\/or `default.png` as fallbacks for entities without specific files.<\/p>\n<p>All entity files hot-reload when modified.<\/p>\n<p>## Configuration<\/p>\n<p>### Client Config (`simchat-client.toml`)<\/p>\n<p>| Option | Default | Description |<br \/>\n|&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `notificationSound` | `minecraft:block.note_block.bell` | Sound on new message |<br \/>\n| `notificationVolume` | `0.5` | Sound volume (0.0-1.0) |<br \/>\n| `showToasts` | `true` | Show toast popups |<br \/>\n| `toastDuration` | `5.0` | Toast display time (seconds) |<br \/>\n| `sidebarWidth` | `240` | Conversation list width |<br \/>\n| `sidebarSortMode` | `0` | Sort: 0=recent, 1=alphabetical |<br \/>\n| `chatBackgroundColor` | `0xDD12121F` | Chat panel background (ARGB hex) |<br \/>\n| `lazyLoadBatchSize` | `30` | Messages to request when scrolling up |<br \/>\n| `lazyLoadThreshold` | `100` | Pixels from top before loading older messages |<br \/>\n| `closedCacheSize` | `400` | Messages to keep cached per conversation when chat closes |<\/p>\n<p>### Common Config (`simchat-common.toml`)<\/p>\n<p>| Option | Default | Description |<br \/>\n|&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `minDelay` | `0.3` | Minimum typing delay (seconds) |<br \/>\n| `maxDelay` | `3.0` | Maximum typing delay (seconds) |<br \/>\n| `charsPerSecond` | `100.0` | Simulated typing speed |<br \/>\n| `permissions.*` | `4` | Per-command permission levels (0-4) |<br \/>\n| `permissions.openmessage` | `0` | Allow opening message links |<br \/>\n| `teamJoin.joinBehavior` | `join_largest` | `join_largest`, `join_smallest`, `join_random`, `create_new` |<br \/>\n| `teamJoin.joinSizeCap` | `-1` | Auto-join cap (-1 disables, creates new if none eligible) |<br \/>\n| `initialMessageCount` | `30` | Messages per conversation on initial sync |<br \/>\n| `maxLazyLoadBatchSize` | `100` | Server-side cap for lazy load requests |<\/p>\n<p>### Color Overrides (`simchat-client.toml`)<\/p>\n<p>Color settings live under the `[colors]` section and accept ARGB hex strings (e.g. `0xFF88AAFF`). Example:<\/p>\n<p>&#8220;`toml<br \/>\n[ui]<br \/>\nchatBackgroundColor = &#8220;0x8047BAFF&#8221;<\/p>\n<p>[colors]<br \/>\nsidebarBackgroundColor = &#8220;0xFF1B2230&#8221;<br \/>\nheaderTextColor = &#8220;0xFFBBD7FF&#8221;<br \/>\nmessageTextColor = &#8220;0xFFE8F1FF&#8221;<br \/>\ncontextMenuBgColor = &#8220;0xFF202030&#8221;<br \/>\ntoastBackgroundColor = &#8220;0xFF243048&#8221;<br \/>\n&#8220;`<\/p>\n<p>Available color keys (all optional):<\/p>\n<p>&#8211; `sidebarBackgroundColor`<br \/>\n&#8211; `dividerColor`<br \/>\n&#8211; `dividerHoverColor`<br \/>\n&#8211; `headerTextColor`<br \/>\n&#8211; `headerSubtitleColor`<br \/>\n&#8211; `emptyStateTextColor`<br \/>\n&#8211; `headerSeparatorColor`<br \/>\n&#8211; `refreshButtonColor`<br \/>\n&#8211; `refreshButtonHoverColor`<br \/>\n&#8211; `refreshTextColor`<br \/>\n&#8211; `sortButtonColor`<br \/>\n&#8211; `sortButtonHoverColor`<br \/>\n&#8211; `sortTextColor`<br \/>\n&#8211; `compactHintColor`<br \/>\n&#8211; `scrollbarColor`<br \/>\n&#8211; `inputBgColor`<br \/>\n&#8211; `outputBgColor`<br \/>\n&#8211; `disabledBgColor`<br \/>\n&#8211; `playerNameColor`<br \/>\n&#8211; `entityNameColor`<br \/>\n&#8211; `subtitleColor`<br \/>\n&#8211; `dayTextColor`<br \/>\n&#8211; `messageTextColor`<br \/>\n&#8211; `disabledTextColor`<br \/>\n&#8211; `whiteTextColor`<br \/>\n&#8211; `systemTextColor`<br \/>\n&#8211; `buttonDefaultColor`<br \/>\n&#8211; `buttonHoverColor`<br \/>\n&#8211; `borderDisabledColor`<br \/>\n&#8211; `borderHoverColor`<br \/>\n&#8211; `borderDefaultColor`<br \/>\n&#8211; `focusBorderColor`<br \/>\n&#8211; `contextMenuBgColor`<br \/>\n&#8211; `contextMenuBorderColor`<br \/>\n&#8211; `contextMenuTextColor`<br \/>\n&#8211; `contextMenuHighlightColor`<br \/>\n&#8211; `inputValidColor`<br \/>\n&#8211; `inputInvalidColor`<br \/>\n&#8211; `inputFieldBgColor`<br \/>\n&#8211; `inputFieldBorderColor`<br \/>\n&#8211; `inputFieldBorderFocusedColor`<br \/>\n&#8211; `inputCursorColor`<br \/>\n&#8211; `inputSendEnabledColor`<br \/>\n&#8211; `inputSendDisabledColor`<br \/>\n&#8211; `toastSenderColor`<br \/>\n&#8211; `toastPreviewColor`<br \/>\n&#8211; `toastBackgroundColor`<br \/>\n&#8211; `toastBorderColor`<br \/>\n&#8211; `toastHintColor`<\/p>\n<p>## Keybinds<\/p>\n<p>| Key | Action |<br \/>\n|&#8212;&#8211;|&#8212;&#8212;&#8211;|<br \/>\n| `;` (semicolon) | Open chat screen |<\/p>\n<p>## JSON Schema<\/p>\n<p>Validate your dialogues with the JSON schema at [`schemas\/dialogue.schema.json`](schemas\/dialogue.schema.json).<\/p>\n<p>VS Code setup:<br \/>\n&#8220;`json<br \/>\n{<br \/>\n  &#8220;$schema&#8221;: &#8220;https:\/\/raw.githubusercontent.com\/YardenZamir\/sim-chat\/main\/schemas\/dialogue.schema.json&#8221;,<br \/>\n  &#8220;entityId&#8221;: &#8220;&#8230;&#8221;,<br \/>\n  &#8230;<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>## License<\/p>\n<p>MIT<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A chatclient inside minecraft with databack driven simulated conversations and dialog<\/p>\n","protected":false},"featured_media":139782,"template":"","meta":{"_minecraft_slug":"sim-chat","_minecraft_project_id":"oYh7N7U3","_minecraft_author":"Yarden-zamir","_minecraft_license":"MIT","_minecraft_downloads":857,"_minecraft_follows":0,"_minecraft_client_side":"required","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"sim-chat.zip","_minecraft_size_bytes":2273045,"_minecraft_version_count":11,"_minecraft_updated_at":"2026-05-15T19:30:21.904635Z","_minecraft_date_created":"2026-01-16T03:03:42.170721Z","_minecraft_date_modified":"2026-01-27T07:40:33.842911Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/sim-chat","_minecraft_icon_attachment_id":139782,"_minecraft_imported_at":"2026-06-08T06:54:27+00:00","_minecraft_import_hash":"938dfb0e11092a6f593b30a700a02e02","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[104],"mod_loader":[106],"minecraft_version":[36],"class_list":["post-139781","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-forge","mod_loader-forge","minecraft_version-1-20-1"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>sim-chat - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"sim-chat - Minecraft\" \/>\n<meta property=\"og:description\" content=\"A chatclient inside minecraft with databack driven simulated conversations and dialog\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/sim-chat\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/sim-chat\\\/\",\"name\":\"sim-chat - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/sim-chat\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/sim-chat\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/sim-chat-icon-346aeb8154bc51bf1cbb4b38f2a4527cce3df101.png\",\"datePublished\":\"2026-06-08T06:54:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/sim-chat\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/sim-chat\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/sim-chat\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/sim-chat-icon-346aeb8154bc51bf1cbb4b38f2a4527cce3df101.png\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/sim-chat-icon-346aeb8154bc51bf1cbb4b38f2a4527cce3df101.png\",\"width\":64,\"height\":64},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/sim-chat\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"sim-chat\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"sim-chat - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/","og_locale":"en_US","og_type":"article","og_title":"sim-chat - Minecraft","og_description":"A chatclient inside minecraft with databack driven simulated conversations and dialog","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/","name":"sim-chat - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/sim-chat-icon-346aeb8154bc51bf1cbb4b38f2a4527cce3df101.png","datePublished":"2026-06-08T06:54:27+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/sim-chat-icon-346aeb8154bc51bf1cbb4b38f2a4527cce3df101.png","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/sim-chat-icon-346aeb8154bc51bf1cbb4b38f2a4527cce3df101.png","width":64,"height":64},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/sim-chat\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"sim-chat"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/139781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/139782"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=139781"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=139781"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=139781"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=139781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}