26.1.2
Compatibility
Changes
Range bans are powerful, but a single 192.168.. can quietly sweep up dozens of legitimate players. This release lets you see exactly who a range would hit — before you ban it. /ipdy ip now understands wildcards and shows every account inside a range, grouped by country.
⭐ New: Wildcard Range Lookup /ipdy ip <ip> now accepts trailing wildcards to inspect a whole range instead of a single address:
/ipdy ip 190.1.2.3 — single IP → exact lookup (GeoIP + VPN + accounts), unchanged /ipdy ip 190.1.2.* — /24 range (256 IPs) → every account in that block /ipdy ip 190.1.. — /16 range (65,536 IPs) → every account across the block /ipdy ip 190...* — /8 range (16.7M IPs) → every account across the block
Each range lookup reports:
📍 The exact range it covers (190.1.2.0 – 190.1.2.255)
👥 How many accounts would be affected, across how many distinct IPs
🌍 A country breakdown — e.g. United States: 8, Germany: 4, Chile: 2 — so you can spot when a range crosses regions and would catch unrelated players
🖱️ A clickable, paginated account list — click a name fo its exact lookup Why it matters: run the range as a lookup first (/ipdy ip 127.0.0.*), read who and what it touches, then decide whether to /ipdy ban. No more blind range bans that collateral-damage real players.
Tip: add a page number to browse long results → /ipdy ip 190.1.. 2
🔒 Security & Reliability GeoIP over HTTPS — player IP addresses (PII) are no longer sent to the geolocation provider in cleartext. On by default, configurable. Injection-hardened range queries — strict allow-list pattern validation, fully parameterized SQL with LIKE ... ESCAPE, an exact numeric range re-check, and a configurable result cap so a broad pattern can Per-player command cooldown — /ipdy ip and /ipdy check are rate-limited per user (console exempt). Username sanitization — attacker-controlled names on offline-mode / Bedrock servers can no longer inject color or format codes into staff-facing output. Safer imports — /ipdy import validates that every ban d range, or CIDR before inserting it. Graceful shutdown — coroutine teardown is time-bounded, so a stuck GeoIP request can never freeze /reload or server stop.
🔌 Integrations Now Live Public API (IPDynamicAPI via Bukkit ServicesManager) and the PlaceholderAPI expansion (9 placeholders) are now registered and working. Placeholders are served from an async-warmed cache — zero blocking I/O on the main thread.
🧹 Under the Hood Unified pagination, de-duplicated IP utilities, dead-code cleanup, and a shared coroutine error handler (commands no longer fail silently). Range lookups are covered by unit tests.
✅ Compatibility Minecraft / Paper: 1.17.x – 26.2.x (Spigot supported) Folia: supported Bedrock (Floodgate / Geyser): supported Java: 17 or higher PlaceholderAPI: optional IPDynamic loads on the new 26.x server line (26.1.x / 26.2.x) through Paper's forward compatibility — the same jar keeps working from 1.17 up to the latest release.
📦 Installation Download IPDynamic.jar below. Drop it into your server's plugins/ folder. Restart. Existing databases upgrade automatically — no data Run /ipdy help in-game for the full command reference.
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:fRqinjfY:83S0MOVq"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:fRqinjfY:83S0MOVq"
}

