All versions
1.1
Release
HomeLimiter 1.17 months ago 20
Compatibility
Minecraft: Java Edition
1.21.x
1.20.x
Platforms
Paper
Purpur
Spigot
Changes
HomeLimiter Changelog
v1.1
Bug Fixes
- Fixed
/sethomealias detection — the old version incorrectly listened for/ehome(which is the teleport alias) when tracking new home creation. It now correctly listens for/esethome. - Fixed home creation timestamps being overwritten — re-running
/sethomeon an existing home used to reset its timestamp, which could cause the wrong homes to get locked when enforcing limits. The timestamp is now preserved on re-set (INSERT OR IGNOREinstead ofINSERT OR REPLACE). - Fixed locked home restoration losing original creation time — when a home was restored from the locked list, it was saved with the current time instead of the original creation time. The original timestamp is now carried through correctly.
- Fixed
onDisablenot checking if connection is already closed — could throw an exception on shutdown in some cases.
Improvements
- Overhauled home limit calculation — the old system read limits from a custom
groups.*section inconfig.ymland picked the highest-weighted LuckPerms group. The new system reads directly from Essentials' ownsethome-multipleconfig section and checksessentials.sethome.multiple.<key>permissions in LuckPerms, making it fully compatible with existing Essentials setups without any extra configuration. - Enforcement is now fully async/main-thread safe — the old
enforce()ran entirely on the main thread, blocking it during DB reads. The new version choreographs work across threads: DB reads happen async, all Essentials API calls happen on the main thread, and DB writes are flushed async at the end. - Bulk DB timestamp loading — instead of querying the database once per home during enforcement, all timestamps for a player are now loaded in a single query upfront.
- All DB mutations are batched — locking and restoration no longer write to the database mid-enforcement. Changes are collected and flushed in one async pass at the end, reducing DB contention.
- SQLite WAL mode and busy timeout enabled —
PRAGMA journal_mode=WALandPRAGMA busy_timeout=5000are now set on startup, allowing concurrent reads during writes and preventing instant failures on a locked write. - Context-aware permission queries — online players now use full contextual
QueryOptions(respecting world/gamemode contexts) when checking LuckPerms permissions, with a fallback to static options for offline players. - Re-enforce on LP data recalculate — LuckPerms'
UserDataRecalculateEventnow triggers enforcement directly instead of going through asafeEnforcewrapper, simplifying the code path. /reloadnow requires permission — thehomelimiter.adminpermission is checked before allowing a config reload. Previously any player could run it.- Tab completion now requires permission — tab completion for
/hl reloadis now gated behindhomelimiter.adminas well. - Startup scan delay uses
long—delay-ticksis now read as alonginstead ofint, preventing overflow on very large configured values.
Code Cleanup
- Removed unused
findOfflineByName()helper method. - Removed unused
import net.luckperms.api.model.group.Group. - Replaced the
safeEnforce()wrapper with inline error handling in the async callback. - Replaced the
LockedHomestatic class with aLockedHomeRecordrecord for DB mutation staging. - Orphan timestamp cleanup is now handled inline during enforcement instead of in a separate
cleanupOrphans()method. - Added section comments throughout for readability.
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:eT7gbibF:8zkOadpD"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:eT7gbibF:8zkOadpD"
}

