Tags
Creators
Details
All versions
1.21.x-2.0.0
Release
Limited Spectator -NeoForge-1.21.x-2.0.09 months ago 166
Compatibility
Minecraft: Java Edition
1.21.1–1.21.11
Platform
NeoForge
Supported environments
Client and server
Changes
[2.0.0] - 2026-01-18
🚀 Multi-Loader Architecture Release
Major architectural overhaul introducing support for NeoForge, Fabric, and Quilt mod loaders with shared core logic.
Added
- Multi-Loader Support - Three separate builds for different mod loaders:
LimitedSpectator-neoforge-2.0.0.jar(171 KB) - Full configuration supportLimitedSpectator-fabric-2.0.0.jar(156 KB) - Hardcoded defaultsLimitedSpectator-quilt-2.0.0.jar(158 KB) - Uses Fabric API compatibility
- Core Abstraction Layer:
SpectatorConfiginterface - Loader-agnostic configuration contractSpectatorManagerclass - Shared business logic (100% code reuse)SpectatorStaterecord - Immutable state representationDistanceValidationResultrecord - Type-safe validation results
- Loader-Specific Adapters:
NeoForgeSpectatorConfig- Adapts NeoForge config to interfaceFabricSpectatorConfig- Hardcoded defaults for FabricQuiltSpectatorConfig- Delegates to Fabric config (composition pattern)
- Fabric Implementation:
LimitedSpectatorFabric- Fabric entry point with Fabric API integration- Command registration via
CommandRegistrationCallback.EVENT - Event handlers via
ServerTickEventsandServerPlayConnectionEvents
- Quilt Implementation:
LimitedSpectatorQuilt- Quilt entry point (100% Fabric API compatible)- Uses Fabric API for all events and commands
- Demonstrates perfect Fabric-Quilt compatibility
- Build System:
- Separate Gradle build files per loader (
build.gradle,build-fabric.gradle,build-quilt.gradle) - Source exclusions to prevent cross-loader compilation errors
- Java 21 toolchain configuration
- Separate Gradle build files per loader (
Changed
- Architecture: Refactored from monolithic NeoForge-only to multi-loader with shared core
- Code Organization:
- Core logic moved to loader-agnostic classes
- Loader-specific code isolated in separate packages
- Zero code duplication (>95% shared code)
- Logging: Replaced
System.out.printlnwith SLF4J Logger in Fabric/Quilt implementations - Build Process:
- NeoForge build excludes Fabric/Quilt sources
- Fabric build excludes NeoForge/Quilt sources
- Quilt build excludes NeoForge/Fabric entry points
Technical
- Thread-Safe State Management:
SpectatorManagerusesConcurrentHashMapfor multiplayer safety - Type-Safe Validation: Enum-based validation results prevent null pointer exceptions
- Backward Compatibility: Legacy HashMaps maintained with
@Deprecatedannotation - Dual-Write Strategy: Ensures external mods/mixins continue working
- Clean Separation: Zero loader dependencies in core business logic
Performance
- Shared
SpectatorManagerinstance across all loaders - Singleton pattern for config adapters
- Lazy configuration evaluation
- Minimal per-tick overhead (~0.01ms per spectator)
Documentation
- Updated README.md with multi-loader installation instructions
- Added loader comparison table
- Documented build commands for each loader
Migration Notes
- NeoForge users: No changes required - fully backward compatible with v1.x
- Fabric/Quilt users: New! Download the appropriate JAR for your loader
- Configuration: Only NeoForge version supports TOML config (Fabric/Quilt use hardcoded defaults)
Known Limitations
- Quilt version requires Fabric API (QSL support planned)
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:1h1Nfg72:BiC3xtGF"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:1h1Nfg72:BiC3xtGF"
}

