HyChatter - [NEW] Bubblechat feature is out to try in beta version!

Chat mod with Global/Region/Party + custom channels, anti-spam moderation, optional multi-server GLOBAL chat forwarding and discord bridge.

File Details

HyChatter-1.0.6.jar

  • B
  • Feb 27, 2026
  • 134.53 KB
  • 22
  • Early Access

File Name

HyChatter-1.0.6.jar

Supported Versions

  • Early Access

Fixed

  • moderateInbound()
    Removed erroneous logic that cleared and reloaded per-player default chat from disk every time inbound (e.g. cross-server) messages were moderated when the censor word cache was empty. Inbound moderation now only rebuilds the moderation cache when needed and censors the message; it no longer touches player default chat state.

Performance

  • Mention regex
    Replaced repeated Pattern.compile("@([A-Za-z0-9_-]{2,32})") in mention handling (ping, highlight, confirm) with a single static MENTION_PATTERN. Avoids compiling the same regex many times per message when mentions are enabled.

  • Censor / URL parsing

    • § color stripping in buildCensorReplacement() now uses a static SECTION_SIGN_COLOR_PATTERN instead of replaceAll(...) compiling a new pattern per censored match.
    • URL host extraction in extractHost() now uses a static URL_HOST_PATTERN instead of compiling on each call.
  • Player default chat saves
    Player default chat (/hychatter chatdefault) is now saved with a 2-second debounce (same pattern as mute persistence). Rapid changes no longer trigger a disk write on every change; config reload still flushes pending saves before reloading.

  • Name → player lookup
    Added a cache (lowercase name → PlayerRef, UUID → name) updated on player connect/disconnect and populated for already-online players on startup. findOnlinePlayerByName() uses the cache first (O(1)) and only scans when needed. Reduces cost of @mentions and commands that resolve players by name.

  • GLOBAL chat list
    For GLOBAL channel, the player list is no longer copied into a new ArrayList; the code uses Universe.get().getPlayers() directly when only iterating, avoiding an extra allocation per message.

  • CustomChannelManager locking
    Replaced a single global synchronized lock with finer-grained locking: a createDeleteLock for create/rename/delete (and deleteAllOwnedBy), and per-channel synchronized(ch) for addMember, removeMember, invite, acceptInvite, requestJoin, approveRequest, leave, and transferOwner. Reduces contention when multiple custom channels are used at once.

Added

  • HyDiscordX compatibility
    Optional integration with HyDiscordX (Discord ↔ Hytale bridge). When HyDiscordX is installed and compatibility is enabled, messages on selected channels can be relayed to the Discord chat bridge.

    • Config (HyChatter.json5):
    • hyDiscordXCompatEnabled (default: true) — turn relay to Discord on or off.
    • hyDiscordXBridgeChannels (default: ["GLOBAL"]) — which channels to relay ("GLOBAL", "REGION", "PARTY"). By default only global chat is sent to Discord.
    • Implementation: Reflection-based bridge (HyDiscordXBridge) so HyChatter runs with or without HyDiscordX; no hard dependency. Calls HyDiscordX’s webhook chat path to send player name and message (with &/§ color codes stripped) to the configured Discord channel.
    • Wiki: HyDiscordX Wiki

Format loosely follows Keep a Changelog.