promotional bannermobile promotional banner

Simply Speakers

Allows players to play custom audio from a local URL in-game using a speaker block.
Back to Files

Simply Speakers 0.8.3 - NeoForge 1.21.1

File namesimplyspeakers-neoforge-1.21.1-0.8.3.jar
Uploader
NsTutNsTut
Uploaded
Aug 28, 2026
Downloads
439
Size
442.7 KB
Mod Loaders
NeoForge
File ID
8753232
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:simply-speakers-1267397:8753232"

Learn more about Curse Maven

What's new

Simply Speakers 0.8.3

Changed

  • Centralized Server Playback Management: Listener tracking and range scanning moved out of SpeakerBlockEntity and ProxySpeakerBlockEntity into a new ServerPlaybackManager driven by ServerSpeakerRegistry, closing issue #10.
  • Persistent Emitter Snapshots: The registry now retains ServerEmitter descriptors (position, network key, range, volume, dropoff, proxy flag, active intent) that survive chunk unloads, so speaker lifecycle is decoupled from chunk loading state.
  • Central Subscription Indexes: The manager maintains bidirectional player-to-emitter and emitter-to-player mappings and dispatches PlayAudioPacketS2C/StopAudioPacketS2C directly, with the shared ServerPlaybackPlanner (backed by ListenerRangePolicy) deciding every subscription transition.
  • Dimension-Transition Safety: Scans iterate all online players and compare dimensions, so moving between dimensions cleanly stops subscriptions instead of leaving orphaned audio.
  • Sable Compatibility Preserved: The 1.21.1 manager resolves emitter and listener positions through SpeakerSpatialResolver.resolveLogical, so moving plot bodies with speakers keep working.

Fixed

  • Unloaded Speaker Chunk Continuity: A speaker whose vanilla chunk unloads while players remain in range no longer strands listeners; the centralized scan keeps playing and, crucially, sends StopAudioPacketS2C when those listeners eventually leave range.
  • Orphaned Listener Lifecycle: Listener exit no longer depends on a ticking block entity, fixing stuck audio when speaker chunks unload on servers with large (128–512 block) speaker ranges.
  • Natural EOF While Unloaded: Non-looping audio now ends server-side in the centralized scan even when the speaker's chunk is unloaded, instead of playing indefinitely.
  • Clean Player Disconnects: Disconnecting players are purged from all subscription indexes immediately, preventing stale hysteresis state across reconnects.

Development

  • Pure Decision Core: Added ServerPlaybackPlanner and ServerEmitter to version-independent common code, with unit tests covering unloaded-chunk continuity, exit hysteresis, dimension changes, disconnects, and emitter shutdown (issue #10 roadmap item 6).
  • Structural Wiring Tests: Added ServerPlaybackManagerWiringTest verifying manager/registry/loader wiring across all supported versions, and updated existing BE wiring tests to enforce delegation to the central manager.
  • Block Entity Simplification: SpeakerBlockEntity and ProxySpeakerBlockEntity no longer hold listeningPlayers sets or per-BE scan loops; they only publish emitter snapshots and delegate stop dispatch.

This mod has no additional files