Tags
Creators
Details
Licensed GPL-3.0-only
Published 6 days ago
Updated 2 days ago
All versions
1.1.1
Release
DreamVoice 1.1.1last month 2
Uploaded by
Compatibility
Minecraft: Java Edition
26.1.2
Platforms
Paper
Purpur
Spigot
Required content
Changes
Changelog 1.1.1
🐛 Bug Fixes & Network Stability
- Fixed VoiceChat VolumeCategory Packet Overflow (
String too big, max 16):- Resolved Netty serialization crash
EncoderException: String too big (was 24 bytes encoded, max 16)inAddCategoryPacketwhen players join the server. - Shortened SVC volume category display names to comply with Simple Voice Chat's strict 16-byte network limit (
"Projection / Body Anchor"→"Projection","Wiretap / Bug"→"Wiretap").
- Resolved Netty serialization crash
- Fixed VoiceWall Acoustic Diffraction & Attenuation Silence Bug:
- Resolved complete client silence during diffraction (-2 to -6 dB). Fixed the
EntitySoundPacketreconstruction inVoiceWallServiceImpl:entitySoundPacketBuilder()automatically copies all original packet metadata (channelId,sender,sequenceNumber,distance,entityUuid), avoiding packet corruption or null sender overrides in Simple Voice Chat's client mixer. - Added proactive
resetState()on Concentus Opus decoders and encoders when switching between line-of-sight and obstructed paths (> 400ms stream inactivity), preventing corrupted Linear Predictive Coding (LPC) state and silent dropped packets. - Cleaned up PCM processing to apply mathematically accurate dB gain without waveform distortion.
- Fixed client connection validation in
VoiceWallManager.isValidClient()by looking up active connections viaVoicechatServerApi.getConnectionOf(uuid)dynamically. - Filtered sound packet handling in
VoiceServiceImplto only processSoundPacketEvent.SOURCE_PROXIMITY, preventing infinite reflection loops. - Added immediate short-circuiting for 100% blocked walls (
totalDbLoss >= 99.0), dropping the packet directly and saving unnecessary CPU cycles.
- Resolved complete client silence during diffraction (-2 to -6 dB). Fixed the
- Fixed Inadvertent Environmental Cave Filter on Speakers:
- Fixed an issue where
autoEnvironmentenabled by default inVoiceFilterManagerwas automatically injectingCaveVoiceFilter(multi-tap delay reverb + low-pass filter) on indoor/underground maps (light level 0, Y < 55). - Added
hasExplicitFilters(UUID)toVoiceFilterService(API & Core) to distinguish between manual user-added filters and automatic environmental reverberation. - Updated
VoiceSpeakerServiceImplto only check for explicit filters, preventing environmental reverb from being applied when speaking through speakers. - Disabled
autoEnvironmentby default inVoiceFilterManager.
- Fixed an issue where
- Fixed VoiceWall Diffraction Blocked as 100% Soundproof (
BLOCKED):- Fixed an issue where players with open line-of-sight diffraction apertures (-2 to -6 dB in
/voicewall debug) were completely blocked withBLOCKED (100% Soundproof)when speaking. - Removed incorrect ternary override in
VoiceWallServiceImpl.processPlayerPair:VoiceRayCastalready accurately computes diffraction vs solid block attenuation per mode; overriding it forced all diffracted sound through apertures to 100.0 dB (silence) inSTRICT_BLOCKmode. - Synchronized mode resolution in
VoiceRayCastwithVoiceWallService.getMode(). - Stopped polluting
lineOfSightCachewith fake100.0dB entries when players exceed voice distance or cross worlds, preventing stale 100% blocked entries when players move closer. - Fixed LOS cache expiration bypass:
processVoiceConnectionsnow verifies cache expiration so that stationary players (e.g. standing near a door that opens or closes) have their acoustic line-of-sight recalculated automatically every 2 seconds. - Integrated
distanceparameter directly intovoiceWallconfiguration (config.json), with automatic fallback to rootdistance. - Enhanced
/voicewall infoto display the active max acoustic distance. - Bound
/voicewall debugtarget searching to the effective configured distance rather than a hardcoded radius.
- Fixed an issue where players with open line-of-sight diffraction apertures (-2 to -6 dB in
- Fixed Speaker Audio Crackling, Robotic Distortion ("Filter" Effect) & Self-Echo:
- Single Opus Decode Per Packet: Previously, when
VoiceWallor filters were active,VoiceSpeakerServiceImpl.processSingleListenerStreamwas callingvoiceService.getDecoder(senderUuid).decode(rawOpus)repeatedly in an inner loop for every listener on the sameOpusDecoderinstance. This severely corrupted the Opus decoder's adaptive LPC filter state, causing extreme robotic distortion, metallic phasing (sounding like an unwanted filter), and harsh digital crackling. Opus decoding is now performed strictly once per microphone packet and shared across all listeners. - Excluded Speaker from Self-Broadcast: Filtered out the sending player (
senderUuid) from receiving their own voice back throughLocationalAudioChannelandbroadcastToDedicatedChannels. Hearing one's own voice delayed by UDP round-trip time was causing severe acoustic comb-filtering, echo, and clipping. VoiceSpeakerServiceImpl.broadcastToDedicatedChannelsnow streams raw Opus bytes (channel.send(rawOpus)) instead of forwardingMicrophonePacket. This allows Simple Voice Chat to generate an uninterrupted, strictly linear sequence counter for the speaker channel, preventing client-side OpenAL jitter buffer resets, packet drops, and harsh crackling when speaking near speakers.- Restricted DSP transcoding (decode → filter → gain → limiter → encode) exclusively to listeners who actually require acoustic attenuation or voice filters.
- Removed experimental distance-based air damping low-pass filter from
VoiceSpeakerServiceImplto ensure clean audio transmission.
- Single Opus Decode Per Packet: Previously, when
- Real-Time Acoustic & VoiceWall Audio Debugger (
/voicewall debug):- Enhanced
/voicewall debugwith clean sound packet inspection: whenever a player receives voice audio, an Action Bar HUD displays the sender, exact dB loss, resulting volume percentage, PCM Root Mean Square (RMS signal strength before and after DSP), and whether the output is audible ([HEARD]) or silent ([SILENT]). - Displays direct notifications when audio is unattenuated (
DIRECT (0.0 dB, 100% Vol)) or completely blocked by soundproof walls (BLOCKED (100% Soundproof, loss=X.XdB)). - Removed emojis from all debug HUD and command feedback messages for a clean, professional interface.
- Enhanced
- Decoder Resource Cleanup:
- Ensured all Concentus Opus decoders are closed in
finallyblocks withinVoiceSpeakerServiceImplto avoid memory and resource leaks.
- Ensured all Concentus Opus decoders are closed in
⚡ Performance Optimizations & Audio Streaming
- Direct Opus Frame Streaming (
OpusAudioPlayer):- Eliminated the double-transcoding bottleneck during playback (previously: pure-Java Opus decoding to PCM, padding silence, then pure-Java Opus re-encoding to channels).
- Pre-recorded Opus frames from
VoiceRecordingare now streamed directly to SVCAudioChannel.send(opusData)at high precision (10ms scheduler) without Concentus re-encoding. - Dramatically reduces server CPU usage, completely eliminating audio buffer underruns, packet drops, and choppy audio during multi-speaker broadcasts.
- Faithful timeline preservation: All silences (initial pauses, intermediate silences between words, and trailing pauses) and total recording duration are preserved naturally according to recorded timestamps with near-zero CPU overhead.
- Optimized Batch Audio Playback:
- Broadcast playback across all speakers (
all) now streams pre-encoded Opus packets simultaneously across all speaker channels in a single pass. - Playing recordings to multiple player connections (
playRecordingTo(Collection<VoicechatConnection>, VoiceRecording)) now shares a single static audio channel and anOpusAudioPlayer.
- Broadcast playback across all speakers (
- Real-Time Asynchronous Microphone Event Dispatching:
MicrophonePacketEventis now explicitly asynchronous (super(true)) and dispatched directly on the VoiceChat network thread without enqueueing onto Bukkit's 20 TPS (50ms) tick loop.- Removes packet bundling/jitter, eliminating choppy playback and phase stuttering when speaking through speakers.
- Asynchronous Disk Persistence:
- Made
.dvbinary recording file writes asynchronous (CompletableFuture.runAsync) duringstopRecording,sliceRecording, and wiretap stops, preventing I/O lag spikes on the main thread.
- Made
📢 Speaker Command Enhancements & Looping
- Recording Loop Support:
- Added optional
[loop]parameter to voice recording playback:/speaker play record <speaker> <recording> [loop]/speaker play record all <recording> [loop]
- Added overloaded methods
playRecording(..., boolean loop)toVoiceSpeakerServiceandVoiceSpeakerServiceImpl.
- Added optional
- Bulk Target
allin Speaker Commands:- Added
allto tab-completion suggestions across all/speakersubcommands. - Commands now accept
allas the<speaker>argument to execute actions across every active speaker at once:/speaker remove all: Unregisters and removes all active speakers./speaker info all: Displays detailed configuration and audio state for every speaker./speaker mode all <global|restricted>: Sets the playback access mode for all speakers./speaker link all <player>: Authorizes a player on all speakers./speaker unlink all <player>: Revokes player speaking authorization on all speakers./speaker play record all <recording> [loop]: Broadcasts a voice recording across all speakers (with optional looping)./speaker play file all <fileName> [loop]: Plays a local audio file on all speakers simultaneously./speaker play url all <url> [loop]: Streams an online audio URL on all speakers simultaneously./speaker stop all: Stops playback on all active speakers.
- Keyword Reservation: Creating a speaker named
allis now prohibited to prevent command collisions.
- Added
🔌 Custom Events & Extensibility Suite
- Complete Custom Bukkit Event Catalog:
- Added 21 new strongly-typed Bukkit events extending
ToolsEventandToolsCancelEvent:- Speakers (
speaker.event):SpeakerRegisterEvent,SpeakerUnregisterEvent,SpeakerLinkPlayerEvent,SpeakerUnlinkPlayerEvent,SpeakerPlaySoundEvent,SpeakerStopSoundEvent. - Wiretaps (
wiretap.event):WiretapRegisterEvent,WiretapRemoveEvent,WiretapSubscribeEvent,WiretapUnsubscribeEvent. - Radios & Transmitters (
radio.event,transmitter.event):RadioChannelJoinEvent,RadioChannelLeaveEvent,RadioChannelCreateEvent,TransmitterToggleEvent. - Recordings & Cassettes (
recording.event):VoiceRecordingStartEvent,VoiceRecordingStopEvent,CassetteCreateEvent,CassettePlayEvent. - DSP Filters (
filter.event):VoiceFilterApplyEvent,VoiceFilterRemoveEvent. - VoiceWall Occlusion (
wall.event):VoiceWallOcclusionEvent.
- Speakers (
- Full Action Interceptability:
- Cancellable events allow third-party plugins to enforce gameplay permissions (e.g. requiring a physical walkie-talkie item to join a radio frequency, or checking for detective gadgets before listening to a wiretap).
VoiceWallOcclusionEventallows plugins to modify calculated decibel loss (lossDb) or cancel soundproofing entirely for custom powers, spectator modes, or supernatural mechanics.CassetteCreateEventenables customizing cassette item display names, lores, custom model data, and NBT tags before handing items to players.CassettePlayEventallows intercepting right-click playback to enforce audio player equipment or cooldowns.
- Added 21 new strongly-typed Bukkit events extending
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:WRYhkDTs:qoYggZzo"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:WRYhkDTs:qoYggZzo"
}

