Skip to content

Releases: BeyondSmash/bubblechat

v1.8.0

01 Jun 03:25

Choose a tag to compare

v1.8.0 — HyCitizens NPC bubbles + per-NPC colors

  • NPC speech bubbles: HyCitizens NPCs now show a BubbleChat speech bubble
    when a player interacts with them. Optional integration — only active when
    HyCitizens is installed; no effect otherwise.
  • /bchat npc: new in-game GUI to color NPC bubbles.
    • Lists the 5 nearest NPCs with compass direction + distance.
    • Full color picker with live bubble preview, HSV/RGB/Hex readouts, and
      light/dark mode.
    • WCAG contrast clamping keeps text readable; per-NPC colors are saved.
  • No changes to player bubbles.

v1.7.3 — Hytale Update 5 compatibility

  • Updated for Hytale Update 5 (server 0.5.x)
  • Fixed speech-bubble text floating above the bubble — Update 5 raised the
      height at which nameplates render, so the chat text has been re-seated to
      sit centered inside the bubble again
  • Rebuilt against the Update 5 server API; server requirement >=0.5.0 <0.6.0

v1.7.2

04 Apr 07:53

Choose a tag to compare

v1.7.2

Fixed

  • Player color override spawners (per-player/global color overrides) not being included in the combined particle packet — caused "Could not find particle system settings: BCO_*" errors and missing bubble backgrounds for players with color overrides
  • Light mode with no custom tint color rendering white-on-white (unreadable) — now falls back to dark mode bubble when no custom color is set

v1.7.1

Bug Fixes

  • Fixed multiplayer bubble backgrounds not showing — Base particle configs are now sent lazily as a single combined packet (base + yell + custom colors) on first chat, ensuring all viewers receive spawner/system definitions before bubble rendering
  • Fixed yell particle effect not workingsendYellParticle was silently crashing when called from the scheduler thread; moved back to world thread execution
  • Fixed text appearing above bubble on first chat — Custom color spawner registration no longer sends UpdateParticleSpawners during entity spawning; spawners are now built without broadcasting and included in the combined lazy packet
  • Fixed mouth expressions (visemes) not working — Switched from AnimationSlot.Face to AnimationSlot.Action, which properly supports dynamically registered ItemPlayerAnimations on player entities
  • Fixed mouth expressions not showing on first chat — Added 250ms delay before first mouth animation to let the client finish processing entity/particle spawning
  • Fixed yell spawners missing for remote players — Yell particle spawners/systems are now included in the combined lazy registration packet

Improvements

  • Reduced login stutter — Particle configs are no longer sent on connect; all asset updates are deferred to first chat
  • Single asset update on first chat — All particle spawners, systems, yell configs, custom colors, and mouth animations are merged into one combined packet per viewer instead of multiple separate updates
  • Instant text mode — Added /bchat text instant toggle; when enabled, all words in a line appear at once instead of revealing word-by-word

Internal

  • Blockyanim mouth animation duration increased from 3 to 60 ticks for smoother expression holds
  • Added thirdPersonFace field to mouth ItemAnimation registration for proper face-slot compatibility

v1.6.8

19 Mar 19:47

Choose a tag to compare

BubbleChat 1.6.8

Fixed

  • [AssetUpdate] messages no longer appear on join - particle configs are now sent lazily on first chat, so players who never chat see zero asset update messages
  • Entity tool props not restoring their scale after the first chat message - scale restoration now applies on every chat, not just the first
  • Item entity props (e.g. sword drops) placed via the entity tool never having their scale restored
  • Scale restoration is now effectively instant

v1.6.7

14 Mar 06:54

Choose a tag to compare

BubbleChat v1.6.7

Improved

  • Bubble text now tracks players at client frame rate — text entities are now client-side attached to the player (same as the bubble background particles), eliminating the previous 20ms server-side position update lag
  • Reduced server packet load — per-frame position update packets for text entities are no longer sent; a single attachment at spawn time replaces continuous tracking packets

v1.5.3

14 Mar 01:33

Choose a tag to compare

BubbleChat v1.5.3

Fixed

  • Chat bubbles not appearing when chat formatting plugins are installed - BubbleChat now registers its chat listener at the highest priority, ensuring it sees messages before other plugins (such as Elite Essentials) can cancel or modify them.

Thanks to user "DontActLikeMe" for bringing it to my attention

v1.5.2

12 Mar 06:48

Choose a tag to compare

v1.5.2

Fixed

  • Cross-world crash: Fixed IllegalStateException spam when a player enters a dungeon instance while their speech bubble is active. The captured world thread reference would become stale, causing thousands of errors per second.
  • Yell particle cross-world filter: Yell particles no longer attempt to send to viewers in different world instances.
  • Fade particle cross-world guard: Fade-out animation skips cleanly if the speaker has moved to a different world instance.
  • getViewers() safety net: Added defensive try-catch around viewer component lookups to handle any remaining cross-world race conditions gracefully.
  • Mouth animation hold duration: Repeated identical letters (e.g. "rrrrrrr") now hold the mouth expression for the full word duration instead of flashing briefly.
  • Mouth rest between words: Mouth now briefly closes during spaces between words for more natural-looking speech animation.

Added

  • Troubleshooting section in documentation — covers "players unable to join" (caused by other plugins' improperly sized textures) and vanilla texture warnings.

Changed

  • Credits: Added Jalatxe for testing & feedback.

v1.5.1 — Cross-World Thread Safety Fix

  • Fixed crash when players in dungeon instances triggered yell particles — sendYellParticle() was calling store.getComponent() on viewers in different world instances, causing IllegalStateException: Assert not in thread! on the default world thread
  • Fixed cascading failures that prevented players with weaker hardware/connections from joining servers running both BubbleChat and dungeon mods

v1.5.0 - Animalese

11 Mar 08:10

Choose a tag to compare

BubbleChat v1.5.0

New: Animalese Voice System

  • 8 distinct voice types: Bright, Warm, Deep, Soft, Sharp, Mellow, Raspy, Squeaky
  • 208 formant-synthesized audio samples (8 voices × 26 letters)
  • Per-character playback synced to word reveal timing (50–80ms per letter)
  • Pitch control with 13 presets (0.5x–2.0x)
  • Yell pitch boost: words ending with ! get 1.2x pitch (stacks with ALL CAPS for ~1.44x)
  • Proximity audio within configurable range (default 5 blocks)
  • Per-player volume overrides

New: Per-Player Animalese Mute

  • Mute specific players' voice audio while still seeing their bubbles
  • New "Animalese Muted" section on the Hidden & Muted page
  • Permanent mute (no expiry) with one-click unmute
  • Section auto-hides when server has animalese disabled

New: Voice Settings Page

  • Dedicated UI from /bchat vc → Voice Settings
  • Speaker settings: Animalese toggle, Voice Type, Pitch
  • Viewer settings: Volume (Muted–100%), Audio Range (1–30 blocks)
  • Live preview with text input and 3 preset phrases
  • "Playing..." button feedback while preview is active
  • Reset button to restore all voice settings to defaults

New: Quick Command

  • /bchat vc on|off for fast animalese toggle

Known Limitations / Future Updates

  • Head rotation animation: Subtle head sway during speech is not currently possible — the Face animation slot overrides camera-driven head look direction, and the Hytale animation system does not support additive blending (or not sure how to). Will revisit when/if the API adds proper blend mode support.
  • Voice chat proximity indicator: The voice chat system is entirely native C# client-side (opus.dll, rnnoise.dll). No server-side API surface exists to detect who is speaking or display custom indicators. Will revisit if Hytale exposes voice chat events to the server.

v1.1.0

10 Mar 10:51

Choose a tag to compare

v1.1.0

New Features

  • RP Channels — Private roleplay channels with PIN-based joining. Up to 3 channel slots per player. Chat prefixes (rp1, rp2, rp3) to send to specific channels, pbc to force public
  • Dual Visibility — Players in a channel can opt to show bubbles publicly while also sending [RP] text to channel members
  • Channel Confirmation UI — Optional confirmation prompt before switching channels via chat prefix
  • Per-channel Bubble Colors — Distinct tint colors for rp1/rp2/rp3 channels with per-viewer overrides
  • RP Cull Distance — Separate cull distance setting for RP channel bubbles (default 10M)
  • Yell Bubble Range — Separate range for yell-amplified bubble visibility (default 50M)
  • Yell Particle Range — Separate range for yell particle effect visibility (default 75M)
  • Channels Settings Page — New GUI page for managing channel slots, dual visibility, and confirmation toggle
  • Enable/Disable Toggle — Added enable/disable toggle to the main settings page (replaces yell on/off toggle)
  • BubbleChat API — Added UUID-based hasActiveBubble(UUID) overload for cross-plugin reflection
  • BusyBubble API — New BusyBubbleAPI class in ThinkingBubble for cross-plugin communication

Bug Fixes

  • NullPointerException on connect — Added null checks for particleSpawners and particleSystems fields before batching, preventing NPE when cached packets have null maps
  • Particle config log spam — Batched all particle spawner/system packets into 2 combined packets on connect (down from 11+ individual sends), reducing [AssetUpdate] client log messages
  • Channel chat crash — Fixed store.getComponent() called from async chat handler thread instead of world thread, causing silent assertion failure that blocked all channel messages
  • Text persists after bubble expires — Fixed despawn packets sent to wrong viewer set because activeSpeech.remove() was called before getViewers(), breaking channel isolation lookup
  • Dual visibility one-sided — Fixed [RP] text not reaching channel members due to race condition between deferred world.execute() delivery and synchronous vanilla target removal
  • Channel members missing dual-visibility bubble — Fixed getViewers() filtering out channel members from dual-visibility bubbles that should be visible to everyone
  • BusyBubble coexists with BubbleChat — Added bidirectional priority: speech bubbles clear thinking bubbles on send, thinking bubbles won't spawn while a speech bubble is active
  • BusyBubble reflection silently failing — Fixed method lookup targeting PlayerRef parameter instead of UUID, causing the suppression check to always return false
  • Cross-world bubble visibility — Added world UUID check in getViewers() to skip viewers in different world instances (e.g. dungeon portals)

Optimizations

  • getViewers() — Cached prefsStorage.getPrefs() once per viewer (was called up to 4 times per viewer)
  • sendYellParticle() — Cached viewer prefs once per viewer instead of 2 separate lookups
  • performDespawn() / clearSpeech() — Replaced stream().mapToInt().toArray() with direct int[] construction via shared collectDespawnIds() helper
  • clearSpeech() — Eliminated duplicate despawnIds list building (was built twice — before and after state removal)

Compatibility

  • BusyBubble — Full bidirectional priority: speech bubbles clear any active thinking bubble on send, and thinking bubbles won't spawn while a speech bubble is active. When a UI opens, any active speech bubble is also cleared.

v1.0.2

09 Mar 02:25

Choose a tag to compare

  • Fixed scheduler race condition on player connect that could prevent particle configs from loading
  • Added error handling to player connect flow for improved stability on heavily-modded servers