Skip to content

Releases: oraxen/hopper

v1.4.2

Choose a tag to compare

@Th0rgal Th0rgal released this 21 Apr 12:59
f86df39

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

Choose a tag to compare

@Th0rgal Th0rgal released this 29 Dec 07:44
bebd981

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

  1. For single-file versions, returns immediately
  2. For multi-file versions, first tries to match platform-specific patterns in filename (e.g., "spigot" for Spigot servers)
  3. Falls back to avoiding incompatible platform patterns
  4. Final fallback to primary file or first file

Full Changelog: v1.4.0...v1.4.1

v1.4.0 - Configurable log levels

Choose a tag to compare

@Th0rgal Th0rgal released this 27 Dec 19:38
v1.4.0
a13887a

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

Choose a tag to compare

@Th0rgal Th0rgal released this 27 Dec 16:58
v1.3.1
98bbbce

Changes

  • Fix version tag publishing - tags starting with refs/tags/v now correctly publish to releases instead of snapshots

v1.3.0 - Auto-detect Minecraft version

Choose a tag to compare

@Th0rgal Th0rgal released this 27 Dec 16:07
v1.3.0
cff61c6

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:

  1. Per-dependency explicit setting (.minecraftVersion("1.19.4")) - highest priority
  2. Runtime auto-detection via Bukkit API - automatic
  3. No filtering (latest for all MC versions) - fallback

Features

  • Auto-detection via Paper's getMinecraftVersion() or by parsing Bukkit.getBukkitVersion()
  • Global MinecraftVersion utility 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_versions API parameter
  • Hangar - filters by platformVersion API parameter

v1.2.0

Choose a tag to compare

@Th0rgal Th0rgal released this 27 Dec 13:07
54f956b

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 sha256 field format

Platform-Aware Resolution

  • New Platform enum 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

Choose a tag to compare

@Th0rgal Th0rgal released this 27 Dec 12:20
v1.1.2
412a1c5

Fixes

  • Fix logger not being passed to Hopper.download(): BukkitHopper.download() was creating a Hopper instance with a logger configured but then calling the static Hopper.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)

1.1.1

Choose a tag to compare

@Th0rgal Th0rgal released this 27 Dec 10:06
395bf6d

What's Changed

  • Fix reflection to access protected JavaPlugin.getFile() method by @Th0rgal in #3

Full Changelog: 1.1.0...1.1.1

1.1.0

Choose a tag to compare

@Th0rgal Th0rgal released this 27 Dec 08:53
0770d96

What's Changed

  • Add auto-load feature for downloaded plugins by @Th0rgal in #2

Full Changelog: 1.0.0...1.1.0

1.0.0

Choose a tag to compare

@Th0rgal Th0rgal released this 27 Dec 07:30
bff76f8
Merge pull request #1 from oraxen/Th0rgal/maven-auto-publish

Add automatic Maven publishing on GitHub releases