Releases: oraxen/hopper
Release list
v1.4.2
Fix
Hopper no longer overwrites a plugin that is already installed under a different filename. Before downloading a dependency, Hopper now reads plugin.yml / paper-plugin.yml from every jar in the plugins folder and skips the download if any of them declares the same plugin name.
This fixes cases where a server admin has a dev build or fork (for example, a custom ProtocolLib) that was being clobbered on every restart.
Details
- The scan excludes Hopper's own lockfile-tracked jar, so legitimate version upgrades still work when a constraint changes.
- When several jars declare the same plugin name, selection is deterministic: highest parsable version wins, with filename as tiebreaker.
- The descriptor is returned alongside the path so the jar is only opened once per match.
v1.4.1
What's Changed
Bug Fixes
- Fix Modrinth file selection for multi-platform packages: When resolving a dependency version with multiple files (e.g., CommandAPI with Paper.jar and Spigot.jar), Hopper now selects the appropriate file based on the detected platform instead of always picking the "primary" file.
This fixes an issue where Spigot servers would download the Paper variant of CommandAPI (or similar multi-platform plugins), which would fail to load due to Paper-specific classes.
How the fix works
- For single-file versions, returns immediately
- For multi-file versions, first tries to match platform-specific patterns in filename (e.g., "spigot" for Spigot servers)
- Falls back to avoiding incompatible platform patterns
- Final fallback to primary file or first file
Full Changelog: v1.4.0...v1.4.1
v1.4.0 - Configurable log levels
What's New
Introduces configurable log levels for controlling Hopper output verbosity.
Log Levels
- VERBOSE - Full output (all processing steps, version fetching, downloads, summaries)
- NORMAL (default) - Download progress and final loaded plugins summary
- QUIET - Only final result line (e.g.,
[Hopper] Loaded: CommandAPI 11.1.0, PacketEvents 2.11.1) - SILENT - No output at all (for embedding in other plugins)
Usage
// Bukkit
BukkitHopper.download(plugin, LogLevel.QUIET);
BukkitHopper.downloadAndLoad(plugin, LogLevel.SILENT);
// Paper Bootstrap
HopperBootstrap.create(context)
.require(Dependency.hangar("ProtocolLib").build())
.logLevel(LogLevel.QUIET)
.download();
// Core
Hopper.builder()
.pluginsFolder(path)
.logger(myLogger)
.logLevel(LogLevel.VERBOSE)
.build();v1.3.1 - Fix release publishing
Changes
- Fix version tag publishing - tags starting with
refs/tags/vnow correctly publish to releases instead of snapshots
v1.3.0 - Auto-detect Minecraft version
What's New
Automatic Minecraft Version Detection & Filtering
Hopper now automatically detects the server's Minecraft version and filters plugin dependencies to ensure compatibility. This ensures downloaded plugins are compatible with the specific MC version the server is running.
Priority Order:
- Per-dependency explicit setting (
.minecraftVersion("1.19.4")) - highest priority - Runtime auto-detection via Bukkit API - automatic
- No filtering (latest for all MC versions) - fallback
Features
- Auto-detection via Paper's
getMinecraftVersion()or by parsingBukkit.getBukkitVersion() - Global
MinecraftVersionutility for centralized version management - Transparent integration -
BukkitHopper.download()auto-detects and logs the MC version - Per-dependency override still supported via
.minecraftVersion("1.19.4") - Graceful fallback to no filtering if detection fails
Usage
// Automatic (recommended) - just use BukkitHopper as before
BukkitHopper.register(this, deps -> {
// These will automatically filter for the server's MC version
deps.require(Dependency.modrinth("packetevents").build());
deps.require(Dependency.hangar("ProtocolLib").minVersion("5.0.0").build());
// Explicit override still works
deps.require(Dependency.modrinth("old-plugin").minecraftVersion("1.19.4").build());
});
// Manual override if needed
BukkitHopper.setMinecraftVersion("1.20.4");Supported Sources
- Modrinth - filters by
game_versionsAPI parameter - Hangar - filters by
platformVersionAPI parameter
v1.2.0
What's New
Multi-Hash Support
- Support for SHA-256, SHA-512, SHA-1, and MD5 checksums
- Modrinth now uses native SHA-512 verification (fixing previous limitation)
- Lockfile backwards compatible with old
sha256field format
Platform-Aware Resolution
- New
Platformenum with automatic runtime detection - Detection order: Folia → Purpur → Paper → Spigot → Bukkit
- Hangar and Modrinth now query platform-specific variants
- Override with
.platform(Platform.SPIGOT)on any dependency builder
Usage Example
// Auto-detect platform (default)
Dependency.modrinth("packetevents").build();
// Override platform
Dependency.hangar("ProtocolLib")
.platform(Platform.PAPER)
.build();v1.1.2
Fixes
- Fix logger not being passed to Hopper.download():
BukkitHopper.download()was creating a Hopper instance with a logger configured but then calling the staticHopper.download()method which created a new instance without the logger. This caused all log messages during dependency processing to be silently discarded.
Improvements
- Add debug logging when no registration is found for a plugin (helps diagnose issues with plugin name mismatches)