
Список изменений
✨ 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
