P-LifeSteal v2.0.0 — Complete Changelog
pom.xml
Build Configuration
Plugin version bumped from 1.9.6 → 2.0.0
Java version updated from 17 → 21
Maven Compiler source updated from 17 → 21
Maven Compiler target updated from 17 → 21
Server API changed from org.spigotmc:spigot-api:1.21.1-R0.1-SNAPSHOT → io.papermc.paper

aper-api:1.21.4-R0.1-SNAPSHOT
CommandAPI changed from dev.jorel:commandapi-bukkit-shade:9.5.3 (compile) → dev.jorel:commandapi-paper-core:11.0.0 (provided)
PlaceholderAPI version updated from 2.11.3 → 2.11.6
PlaceholderAPI repository URL fixed from
https://repo.extendedclip.com/content/repositories/placeholderapi/ →
https://repo.extendedclip.com/releases/
Sonatype repository replaced with PaperMC repository (
https://repo.papermc.io/repository/maven-public/)
maven-shade-plugin entirely removed (CommandAPI no longer shaded into JAR)
maven-jar-plugin outputDirectory fixed from hardcoded Windows path F:\newplugtesting\P-LifeSteal\target → platform-independent ${project.build.directory}
plugin.yml
Plugin Metadata
api-version updated from 1.18 → 1.21
Added softdepend: [PlaceholderAPI, CommandAPI]
Removed the old multi-line softdepend block for PlaceholderAPI
CommandAPIDependency.java
New File
New class eu.vibemc.lifesteal.other.CommandAPIDependency created
Checks if CommandAPI plugin is already installed on the server
If not found, auto-downloads CommandAPI-11.0.0-Paper.jar from GitHub releases
Provides clear restart instructions in the console if download was needed
Shows manual download URL if auto download fails
Main.java
Plugin Main Class
Removed import dev.jorel.commandapi.CommandAPIBukkitConfig
Removed import dev.jorel.commandapi.CommandAPIConfig
Removed CommandAPI.onLoad(new CommandAPIBukkitConfig(this).silentLogs(false)) from onLoad()
Added commandApiAvailable boolean field to track CommandAPI status
Added CommandAPIDependency.ensureInstalled() check in onLoad() triggers auto-download if needed
Added early return in onLoad() if CommandAPI is not available
Added graceful disable in onEnable() if CommandAPI is not loaded (shows restart message)
Added guard in onDisable() to skip recipe cleanup if CommandAPI wasn't available
Changed loadCommands() to use fully qualified class name to avoid ClassNotFoundError when CommandAPI isn't loaded
HeartsCommands.java
Heart Management Commands
Removed import dev.jorel.commandapi.arguments.PlayerArgument
Added import dev.jorel.commandapi.arguments.PlayerProfileArgument
Added import org.bukkit.profile.PlayerProfile
Added import java.util.List
add command: PlayerArgument("player") → PlayerProfileArgument("player")
add command: (Player) args.get("player")→ Bukkit.getPlayer(profiles.getFirst().getUniqueId())
set command: PlayerArgument("player") → PlayerProfileArgument("player")
set command: (Player) args.get("player")→ Bukkit.getPlayer(profiles.getFirst().getUniqueId())
remove command: PlayerArgument("player") → PlayerProfileArgument("player")
remove command: (Player) args.get("player")→ Bukkit.getPlayer(profiles.getFirst().getUniqueId())
check command: PlayerArgument("player") → PlayerProfileArgument("player")
check command: (Player) args.get("player")→ Bukkit.getPlayer(profiles.getFirst().getUniqueId())
ItemsCommands.java
Item Give Commands
Removed import dev.jorel.commandapi.arguments.PlayerArgument
Added import dev.jorel.commandapi.arguments.PlayerProfileArgument
Added import org.bukkit.profile.PlayerProfile
Added import java.util.List
extra_heart command: PlayerArgument("player") → PlayerProfileArgument("player")
extra_heart command: (Player) args.get("player")→ Bukkit.getPlayer(profiles.getFirst().getUniqueId())
revive_book command: PlayerArgument("player") → PlayerProfileArgument("player")
revive_book command: (Player) args.get("player") → Bukkit.getPlayer(profiles.getFirst().getUniqueId())
BansCommands.java
Ban Management Commands
Removed import dev.jorel.commandapi.arguments.OfflinePlayerArgument
Added import dev.jorel.commandapi.arguments.PlayerProfileArgument
Added import org.bukkit.Bukkit
Added import org.bukkit.profile.PlayerProfile
Added import java.util.List
remove command: OfflinePlayerArgument("player") → PlayerProfileArgument("player")
remove command: (OfflinePlayer) args.get("player") → Bukkit.getOfflinePlayer(profile.getUniqueId())
Attribute Renaming (MC 1.21.3+ API Change)
Attribute.GENERIC_MAX_HEALTH → Attribute.MAX_HEALTH