Releases: BeyondSmash/bubblechat
Releases · BeyondSmash/bubblechat
v1.8.0
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
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 working —
sendYellParticlewas 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
UpdateParticleSpawnersduring entity spawning; spawners are now built without broadcasting and included in the combined lazy packet - Fixed mouth expressions (visemes) not working — Switched from
AnimationSlot.FacetoAnimationSlot.Action, which properly supports dynamically registeredItemPlayerAnimationson 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 instanttoggle; 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
thirdPersonFacefield to mouthItemAnimationregistration for proper face-slot compatibility
v1.6.8
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
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
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
v1.5.2
Fixed
- Cross-world crash: Fixed
IllegalStateExceptionspam 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 callingstore.getComponent()on viewers in different world instances, causingIllegalStateException: 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
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|offfor 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
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,pbcto 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
BusyBubbleAPIclass in ThinkingBubble for cross-plugin communication
Bug Fixes
- NullPointerException on connect — Added null checks for
particleSpawnersandparticleSystemsfields 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 beforegetViewers(), 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
PlayerRefparameter instead ofUUID, 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 directint[]construction via sharedcollectDespawnIds()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
- 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