EzLifesteal
EzLifesteal is a configurable Lifesteal plugin for Paper, Spigot, Folia, and Bukkit servers. It ships with flexible heart rules, fast storage, hologram/scoreboard overlays, PlaceholderAPI hooks, and built-in smurf protection.
Highlights
- Works with Paper 26.1 (Java 25) and stays friendly with Paper, Spigot, Folia, and Bukkit. The jar includes the `folia-supported` marker.
- Saves player data asynchronously to YAML files or MySQL so leaderboards, profiles, and shutdown saves stay smooth.
- Control hearts per world: set default, minimum, and maximum hearts, adjust kill rewards and death penalties, pick zero-heart behaviour, allow or block worlds, make per-world overrides, and let mobs drop hearts with per-entity permissions.
- Optional kill streak rewards can hand out money, run console commands, give items, and broadcast wins when players hit streak milestones, with Vault support for economy payouts.
- Combat logout protection tags PvP combat for a configurable window and punishes quitters so duels stay fair.
- Built-in overlays show action-bar or boss-bar updates. `/lifesteal top` leaderboards, the hologram, and PlaceholderAPI placeholders share live standings anywhere.
- `/lifesteal hologram place` drops a self-updating leaderboard that survives restarts and can be cleared with one command. The scoreboard wildcard (`lifesteal.scoreboard.*`) makes it easy to hand out place/remove access.
- Need competitive seasons? Install the companion EzSeasons plugin for automatic heart resets, start/end scheduling, countdowns, and reminder broadcasts. EzLifesteal now hooks into its public API automatically, so no extra bridge jars are required.
- Revive banned players when a teammate right-clicks a beacon block with a voucher item. The plugin validates the item, restores the target, and plays the revive animation. Admins whitelist existing beacons or use /beacon spawn to have the plugin place one automatically.
- Beacon spawn subsystem: the plugin places BEACON blocks in the world on a schedule or on demand at random or explicit coordinates. Each beacon tracks its own lifecycle — optional WorldGuard protection region, optional EzCountdown warm-up timer, availability broadcast with title, particles, and fireworks, and automatic expiry removal.
- Optional TeamsAPI integration skips heart transfers when the killer and victim share a team. Toggle via team-kill-bypass-with-teams-api in lifesteal-core.yml.
- Smurf detection watches for players farming the same target or rotating killers, keeps history GUIs ready, and only alerts trusted staff.
- `admin.yml` lists staff by ops, permission nodes, UUIDs, or names, chooses if admins bypass heart gain or loss, and decides whether smurf alerts stay admin-only.
- Translate player messages quickly with built-in English and Dutch files in
Code (Text):
languages/*.yml
.
- `/lifesteal` staff commands make it easy to add, remove, reset, revive, or reset all hearts without touching storage files.
- Atomic team-bank persistence rollback (1.1.1) — profile rollback when a team-bank save fails, preventing inconsistent player/bank state.
- Added focused unit tests to exercise team-bank rollback and atomicity paths (JaCoCo patch-coverage fix).
- Dependency bumps: WorldEdit, WorldGuard, EzCountdown, Testcontainers, JUnit, Awaitility, SLF4J, and others.
Storage & reliability
[*]MySQL mode creates its table on startup (`uuid`/`hearts`) and uses `ON DUPLICATE KEY UPDATE` so repeat saves stay safe.
[*]Use `/lifesteal reload` to refresh configuration, messages, admin rules, storage backends, overlays, and PlaceholderAPI hooks without restarting.
[/LIST]
EzSeasons & smurf defence
- EzSeasons lets you set a season length with `length-days` or pick exact `start`/`end` timestamps, including optional recurring windows.
- Broadcast reminders and show the countdown with `/season` from the EzSeasons plugin while EzLifesteal handles smurf protection and automatically resets hearts when the season rolls over.
- Smurf detection logs kills per killer and victim, watches for rotating killer rings, saves alert and kill history, and lets you exempt trusted players.
- Give moderators `lifesteal.alert` and edit `smurf.yml` to tweak thresholds or exempt trusted UUIDs.
Requirements
- Java 25 runtime (matches Paper 26.1 requirements).
- Paper, Spigot, Folia, or Bukkit 26.1 or newer.
- Optional: PlaceholderAPI for placeholders, MySQL 8+ for database storage.
- Optional: Vault plus an economy provider for kill streak currency rewards.
- Optional: WorldGuard for automatic region protection around plugin-spawned beacons.
- Optional: EzCountdown for a visible countdown timer during beacon warm-up. Falls back to a built-in Bukkit timer when absent.
- Optional: TeamsAPI for team-kill bypass between teammates.
Quick start
- Place the jar in your server's `plugins` folder and restart the server.
- Choose `YAML` (default) or `MYSQL` storage in `storage.yml`. Set the default language in `config.yml`. Adjust heart rules in `lifesteal-core.yml`, world scoping in `lifesteal-worlds.yml`, and overlays in `features.yml`. Install EzSeasons if you want scheduled resets.
- Review `admin.yml` to decide who counts as staff, whether they bypass heart gain or loss, and who receives smurf alerts.
- Use `/lifesteal reload` after configuration changes and give your staff the permissions listed below.
- Run `/lifesteal test <kill|death>` on a staging server to check kill and death flows before you go live.
Commands & permissions
Player commands include
/lifesteal,
/lifesteal top,
/lifesteal transfer, and
/lifesteal shop. Staff commands cover heart management, reviving players, reloading config, and moderation. A dedicated
/beacon command shortcuts all beacon subcommands (
add,
remove,
list,
clear,
spawn,
despawn,
spawns). Shortcut bundles —
lifesteal.player,
lifesteal.mod, and
lifesteal.admin — cover the most common permission setups.
See the full
Commands reference and
Permissions list in the documentation.
Configuration
Configuration is split across focused YAML files under
plugins/EzLifesteal/. Heart rules live in
lifesteal-core.yml, world scoping in
lifesteal-worlds.yml, mob rewards in
lifesteal-mobs.yml, overlays in
features.yml, and beacon spawn settings in
revive-beacon.yml. Use
/lifesteal reload to pick up changes without restarting.
See the
Configuration overview for the full file list and per-file references.
Admin & smurf detection
Staff are defined in
admin.yml by ops, permission node, or explicit UUID/name lists. Enable bypass flags to let them watch gameplay without losing hearts. Smurf detection watches kill patterns within a configurable time window and alerts staff holding the
lifesteal.alert permission.
Full details:
admin.yml reference ·
smurf.yml reference
Configuration presets
- Casual SMP: Raises the minimum hearts and disables zero-heart bans so everyone can keep playing.
Code (Text):
# lifesteal-core.yml
default-hearts: 12.0
min-hearts: 6.0
max-hearts: 30.0
hearts-per-kill: 1.0
hearts-lost-on-death: 1.0
ban-when-zero-hearts: false
- Hardcore grind: Every fight is dangerous — players lose two hearts on death, gain half a heart on kills, and get banned at zero hearts, with tougher rules in the Nether.
Code (Text):
# lifesteal-core.yml
default-hearts: 8.0
min-hearts: 1.0
max-hearts: 16.0
hearts-per-kill: 0.5
hearts-lost-on-death: 2.0
ban-when-zero-hearts: true
# lifesteal-worlds.yml
world-overrides:
world_nether:
hearts-per-kill: 0.25
hearts-lost-on-death: 3.0
PlaceholderAPI
- Install PlaceholderAPI alongside EzLifesteal. The expansion registers automatically and caches lookups briefly to stay responsive.
- Player-centric placeholders: %ezlifesteal_hearts% / %ezlifesteal_current_hearts% (stored hearts), %ezlifesteal_default_hearts%, %ezlifesteal_min_hearts%, and %ezlifesteal_max_hearts%.
- Leaderboard placeholders: %ezlifesteal_top_<position>_hearts%, %ezlifesteal_top_<position>_current_hearts%, %ezlifesteal_top_<position>_name%, and %ezlifesteal_top_<position>_uuid%.
Under the hood
- Hearts stay saved across restarts, reloads, and world switches, and reapply instantly on join, quit, PvP, or admin tweaks.
- Health scaling can be toggled separately from heart totals so you can keep the vanilla HUD or use scaled hearts.
- Background storage work and scheduled overlay updates keep the main thread responsive even during big migrations or resets.
- Mob rewards support fractional payouts, per-entity permissions, and world allow/deny lists so you can shape lifesteal progress everywhere.
Revive Beacon & Beacon Spawn
- Banned players can be revived when a teammate right-clicks a beacon block with a voucher item. Configure the item, distance, and animation in revive-beacon.yml.
- Admins whitelist existing beacon blocks with /lifesteal beacon add, or have the plugin place a tracked beacon with /beacon spawn [world x y z]. Omit coordinates to let the plugin pick a random location within the configured XZ bounding box.
- The beacon spawn subsystem manages the full lifecycle: placement → optional WorldGuard protection region → optional EzCountdown warm-up timer → AVAILABLE state → expiry removal. Set expiry-minutes: 0 to keep beacons indefinitely.
- WorldGuard (optional): a protection region is created around each spawned beacon with a configurable radius and flag overrides (deny-build, deny-pvp, deny-mob-damage, deny-explosions). Silently skipped when WorldGuard is absent.
- EzCountdown (optional): shows warm-up progress via ACTION_BAR, BOSS_BAR, CHAT, TITLE, or SCOREBOARD. Falls back to an internal Bukkit task when absent.
- When a beacon becomes claimable, the plugin fires a server-wide broadcast, title overlay, particles, and fireworks. Fully configurable under revive-beacon.spawn.availability-event.
Heart Objects
- Create configurable heart items in `hearts.yml` to represent physical heart objects (custom tier, value, material, texture and optional NBT). These items can be given to players, sold, or consumed to add hearts.
- Default items are provided in `hearts.yml` inside the plugin jar. Edit `plugins/EzLifesteal/hearts.yml` to add or change objects.
- Use `/lifesteal giveheart <player> <heartId|tier> [amount]` to grant a player one or more heart objects. If the player's inventory is full the item will drop at their feet.
- Typical use-cases: optional drops on kill instead of instant heart gain, or natural drops alongside instant gain; heart-based economy and trading; auctioning or gifting rare heart items.
Need support or want a new feature? Join the discussion and tell us what to add next!