Tags
Creators
Details
V1.3.0
Compatibility
Changes
โจ Public Skill API
Other plugins can now register their own skill types instead of being limited to the built-in ones:
FPerk fperk = (FPerk) getServer().getPluginManager().getPlugin("FPerk");
fperk.getSkillRegistry().register(this, new MySkill());
A registered skill automatically inherits the icon, permission, cooldown and duration of whatever perk references it. Under the hood, all fourteen built-in behaviors (Fly, Heal, Keep Inventory, Auto Smelt, Anti Phantom, โฆ) now go through this same API, handled by a new SkillService that manages activation, deactivation, expiry, and restoration on join/respawn/server switch.
๐ Fixes
- Cooldowns and timed perks: the activation date was rewritten on every deactivation instead of being preserved, which reset the cooldown and the remaining duration each time. It's now stamped once, on activation.
/perk modify: the command now honours the boolean argument you pass instead of always toggling, and checks the perk's own permission โ previously, holdingfperk.modifygranted every perk regardless of its configured permission.- Perks listing a skill missing from
skill.ymlno longer crash the GUI when opened. skillFormatis now actually applied to skill lines in a perk's lore (the option existed in config but was never read).- Fixed the
{NewStatus}placeholder inmodify_perkto match what the language files use. lang_en.yml/lang_fr.yml: added the missingdatabaseerrorkey, fixed a leftover description from another plugin, and corrected a few French typos.perk.yml: fixed unit comments (delay in milliseconds, duration in seconds), removed the unimplementedbannedWorldoption, and gave the Heal perk its own permission instead of reusingfperk.fly.gui/mainGui.yml: default labels are now in English, matching the default language.
๐งช Tests
First automated test suite, built on JUnit 5, Mockito and MockBukkit โ covers the skill registry and handler contract, all configuration loaders, the shipped default files, storage against a real SQLite database, the built-in skills, and the SkillService lifecycle.
โ ๏ธ Internal
The old per-event listeners (BlockBreakListener, DeathListener, EntityDamageListener, EntityDamageByEntityListener, EntityTargetListener, PlayerChangedWorldListener, PlayerMoveListener, PlayerToggleFlightListener) and the EffectType enum are gone, replaced by the skill handler architecture above. No configuration changes needed on your end โ this only matters if you were hooking into FPerk's internals directly.
Full changelog: https://github.com/Florianpal1/FPerk/compare/V1.2.6...V1.3.0
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:AyZbyxH4:lQotrIjL"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:AyZbyxH4:lQotrIjL"
}

