Minecraft Game Modes
On a Lifesteal SMP, killing a player steals one of their hearts. Die to a player and you lose a heart; kill one and you gain it. Run out of hearts and you're eliminated until someone revives you. Underneath, it's a survival server, so everything in the advanced SMP guide still applies. Lifesteal adds a layer of rules that decide whether your server feels exciting or just cruel.
What you'll build: a Paper survival server with LifeStealZ, heart rules you've chosen on purpose, craftable hearts and a revive beacon, eliminations with a clear way back, a grace period for new players, combat-log protection, alt detection, a pre-generated map, backups and a plan for seasons.
Time: 2–3 hours for setup, plus an evening testing kills, withdrawals and revives with a friend.
Before you start:
- A Minecraft server on the panel running Paper, with a pinned Minecraft version on Startup. See Paper and Purpur servers.
- Memory: 4–6 GB for up to ~30 players, 6–8 GB for more.
- You can use Console and Files, and install plugins.
- A second Minecraft account (or a friend) to test kills. You can't test heart stealing alone.
Choose a lifesteal plugin
| Plugin | Where | Notes |
|---|---|---|
| LifeStealZ (ZetaPlugins) | Modrinth, Hangar | The most complete free option. Supports current releases (the Modrinth page lists 1.19 through 26.x) on Paper, Purpur and Spigot. Custom heart items and recipes, revive item and revive beacon, grace period, anti-alt, WorldGuard flag, PlaceholderAPI, SQLite or MySQL/MariaDB, Discord webhooks. Docs at docs.zetaplugins.com. This guide uses it. |
| SimpleLifesteal | Hangar | Smaller, newer releases for current Paper. |
LifeSteal (ls-smp) |
Modrinth | Hearts, eliminations, revive mechanics and custom items. |
| LifestealCore | BuiltByBit (paid) | Paid all-in-one. |
There are many lifesteal plugins and most do the same core loop. Check the download page lists your Minecraft version and was updated recently. Install only one: two lifesteal plugins will both take hearts on every kill.
Install the plugins
| Plugin | Why |
|---|---|
| LifeStealZ | Hearts, eliminations, revives. |
| LuckPerms | Ranks and permissions. |
| EssentialsX (+ Vault) | /spawn, homes, /tpa, an economy if you want one. |
| WorldGuard + WorldEdit | Protect spawn; LifeStealZ adds a heartloss flag. |
| CoreProtect | Logs every block, chest and kill-related item change. |
| Chunky | Pre-generate the map. |
| PvPManager or CombatLogX | Combat tagging and newbie protection. |
| Grim | Free anti-cheat. |
| LibertyBans | Bans and alt detection. |
| PlaceholderAPI (optional) | Show hearts on a scoreboard or tab list. |
- Open Minecraft Plugins, search each one and choose the download icon. Upload anything not on Modrinth through Files →
plugins→ Upload. - Restart from Console.
- Run
plugins: all green. - Run
lifestealz help. If it lists commands, LifeStealZ loaded. Its files are now inplugins/LifeStealZ/:config.yml(rules),items.yml(hearts, revive items, recipes) andstorage.yml(database).
Decide your heart rules
Stop the server, then open plugins/LifeStealZ/config.yml in Files. These are the decisions that shape your server:
| Option | Default | Suggested | Why |
|---|---|---|---|
startHearts |
10 | 10 | Vanilla health. |
maxHearts |
20 | 15–20 | One player can't become unkillable. Lower values keep fights closer. |
heartsPerKill |
1 | 1 | Hearts moved from victim to killer. |
minHearts |
0 | 0 | At this many hearts a player is eliminated. The file says to change it only if you know what you're doing. |
looseHeartsToNature |
true | your choice | Lose a heart to mobs, falling, lava. true is brutal for new players; many servers set false so only PvP matters. |
heartsPerNaturalDeath |
1 | 1 | How many hearts a natural death costs, if the option above is on. |
looseHeartsToPlayer |
true | true | The whole point. |
dropHeartsPlayer |
false | false | false gives the heart straight to the killer. true drops it as an item anyone can grab. |
dropHeartsNatural |
true | true | Hearts lost to nature drop as an item, so you can go back for them. |
dropHeartsIfMax |
true | true | If the killer is already at max, the heart drops as an item instead of being wasted. |
announceElimination |
true | true | Eliminations are the server's drama. |
heartRewardOnElimination |
true | true | The final kill still gives the killer a heart. |
preventTotems |
false | your choice | Totems make players much harder to kill. |
preventCrystalPVP |
false | true on most servers | End crystal PvP kills in a split second and dominates lifesteal. |
preventRespawnAnchors |
false | true | Anchor explosions in the Overworld are another instant-kill weapon. |
preventBeds |
false | true | Same for beds in the Nether and End. |
preventCustomItemsInItemFrames |
true | true | Prevents a known duplication route. Leave it on. |
A balanced starting config:
startHearts: 10
maxHearts: 20
heartsPerKill: 1
heartsPerNaturalDeath: 1
minHearts: 0
looseHeartsToNature: false
looseHeartsToPlayer: true
dropHeartsPlayer: false
dropHeartsNatural: true
dropHeartsIfMax: true
announceElimination: true
heartRewardOnElimination: true
preventTotems: false
preventCrystalPVP: true
preventRespawnAnchors: true
preventBeds: true
preventCustomItemsInItemFrames: true
Change only the values you mean to change, keep the rest of the file as generated, and save. Start the server and check the console for YAML errors (a red error at start-up usually means a missing space after a colon).
Withdrawing and crafting hearts
Withdraw
Players turn hearts into items with /withdrawheart [amount]. They lose one max heart per item and receive a heart item they can trade, store, or give to a teammate.
| Option | Default | Suggested | Why |
|---|---|---|---|
allowDyingFromWithdraw |
true | false | With true, a player at 1 heart can withdraw it (with /withdrawheart 1 confirm) and eliminate themselves. |
minWithdrawHearts |
0 | 3 | The lowest a player can withdraw down to. Stops panic withdrawals before a fight. |
The permission is lifestealz.withdraw, given to everyone by default. Remove it in LuckPerms if you don't want trading: lp group default permission set lifestealz.withdraw false.
Use
Right-click a heart item to gain its hearts. heartCooldown (milliseconds, default 0) adds a delay between uses so players can't eat a stack mid-fight; 5000 (5 seconds) is a fair value. healOnHeartUse (default false) decides whether using a heart also heals.
Craft
Heart items are defined in items.yml. The default heart is called defaultheart. Each item has a customItemType (heart, revive, revivebeacon or none), a material, a name, and optional crafting recipes:
crystalheart:
name: "&dCrystal Heart"
lore:
- "&7Right-click to gain hearts"
material: "NETHER_STAR"
enchanted: true
customItemType: "heart"
customHeartValue: 1
minHearts: 0
maxHearts: 15
requirePermission: false
craftable: true
whitelistedWorlds: []
recipes:
1:
rowOne: ["DIAMOND_BLOCK", "NETHERITE_INGOT", "DIAMOND_BLOCK"]
rowTwo: ["NETHERITE_INGOT", "TOTEM_OF_UNDYING", "NETHERITE_INGOT"]
rowThree: ["DIAMOND_BLOCK", "NETHERITE_INGOT", "DIAMOND_BLOCK"]
invulnerable: true
despawnable: false
maxHearts: 15here means the crafted heart only works while the player has 15 or fewer, so crafting alone can't reach the server maximum: the last hearts must be won in PvP.invulnerable: trueanddespawnable: falsestop hearts burning in lava or vanishing.- Recipe entries can be materials,
AIR, another custom item's ID, or a tag such as#wool.
Price the recipe from how rare you want hearts to be. A cheap recipe turns the server into a crafting race; an expensive one (netherite, totems) makes hearts something a group works towards. Players see recipes in game with /lifestealz recipe.
Restart after editing items.yml, then test: craft the heart, use it, and check /hearts.
Revives: the way back
Revives are what keep eliminated players around. LifeStealZ offers:
- A revive item (
customItemType: revive): right-click it to revive an eliminated player. - A revive beacon (
customItemType: revivebeacon): placed down, it revives a player over a timer, with a laser and particle ring that everyone nearby can see. Recent versions make the beacon the default revive item.
Beacon options in items.yml:
| Option | What it does | Suggested |
|---|---|---|
reviveTime |
Seconds the beacon takes | 30–120. Longer makes it a defend-the-beacon event. |
allowBreakingBeaconWhileReviving |
Whether enemies can break it to cancel | true for drama, false for a casual server. |
showLaser, showParticleRing, particleColor |
Visuals | Leave on: it tells everyone a revive is happening. |
In config.yml:
| Option | Default | Suggested |
|---|---|---|
reviveHearts |
1 | 3. Coming back on one heart means dying again immediately. |
maxRevives |
-1 (unlimited) | -1, or 2–3 per season on hardcore servers. |
showBossbar |
false | true while a beacon is running. |
Staff can revive directly with /revive <player>. Add bypass (with the lifestealz.bypassrevivelimit permission) to ignore the revive limit.
Elimination without locking people out forever
By default, LifeStealZ bans an eliminated player from joining until they're revived. That's dramatic, and it's also the number one reason lifesteal servers lose players: someone eliminated on day two, with no friends to revive them, never comes back.
Pick one of these approaches and write it in your rules:
Option A: revives are easy enough to reach
Keep the default ban, but make the revive beacon a realistic mid-game craft, and keep maxRevives unlimited. Eliminated players depend on their friends. Works well for servers with established groups.
Option B: a timed ban instead
LifeStealZ's config describes this pattern: turn off its own ban and run your own commands instead.
disablePlayerBanOnElimination: true
eliminationCommands:
- "ban &player& 1d Eliminated - back tomorrow"
&player& is replaced with the eliminated player's name. The example uses LibertyBans' /ban <player> <duration> <reason> syntax; adjust it to your ban plugin.
Option C: amnesty
Keep the default ban, and revive everyone on a schedule: a weekly "revive day", or at the start of each season. Staff run /revive <player> for each eliminated player. Announce it in Discord so eliminated players know when to return.
Whichever you choose:
- Turn on the elimination webhook so eliminations post to Discord:
webhook.elimination: trueand your Discord webhook URL inwebhook.url. It keeps eliminated players in the community. - Keep a list of eliminated players for the next amnesty or season reset.
- Never make eliminations permanent with no way back. The server needs players more than it needs the stakes.
Protect new players
A new player with iron armour is a free heart for anyone. Without protection, veterans farm newcomers and newcomers quit.
LifeStealZ grace period
gracePeriod:
enabled: true
duration: 1800
announce: true
playSound: true
damageFromPlayers: false
damageToPlayers: false
useHearts: false
looseHearts: false
gainHearts: false
allowWithdraw: false
duration is measured in seconds (check the comment above it in your file); 1800 gives 30 minutes. During grace the player can't take or deal PvP damage, or gain or lose hearts. Staff can end or restart a player's grace with /lifestealz graceperiod <player> skip or reset.
Heart gain cooldown
Stops one player farming the same victim, or a group passing kills around:
heartGainCooldown:
enabled: true
cooldown: 300000
dropOnCooldown: true
preventPickup: true
cooldown is in milliseconds (300000 = 5 minutes).
PvPManager newbie protection
PvPManager can also protect new players for a set time (players check or end it with /newbie). Use either PvPManager's or LifeStealZ's grace period, not both, so players get one clear timer.
Spawn
Make spawn a no-PvP, no-heart-loss area with WorldGuard:
rg define spawn
rg flag spawn pvp deny
rg flag spawn heartloss deny
(Select the area with //wand first.) heartloss is the flag LifeStealZ adds; run rg flags spawn and look on the last page if you want to set it through the menu.
Combat logging
If players can log out mid-fight, they keep their hearts and the fight means nothing.
- PvPManager (free, very actively maintained): tags both players when they fight, punishes logging out while tagged, and stops tagged players running into protected areas. Players see their tag time with
/pvptag. - CombatLogX (free): another modular combat tagger. It needs its BlueSlimeCore dependency installed too.
Set the combat tag to 15–30 seconds, and make the punishment for logging out while tagged death, so the heart transfers as if the player had been killed.
Check it works: hit your test account, log it out, log it back in. It should be dead and down a heart.
Stop alt accounts
An alt is a second account. On lifesteal, alts are used to farm hearts (kill your own alt for free hearts) or to dodge elimination.
LifeStealZ anti-alt is on by default and logs attempts. To actually stop farming, set:
antiAlt: enabled: true logAttempt: true preventKill: true sendMessage: truepreventKillstops kills that look like alt farming from moving hearts.LibertyBans:
/alts <player>shows suspected alts, staff are notified when a banned player's alt joins, and IP bans block a banned player's alts automatically.CoreProtect:
/co lookup u:<player> t:7d a:sessionshows logins, useful for spotting two accounts that always play together.Write the rule down: "one account per person; alt farming is a ban".
Players sharing a house or network will share an IP. Check before banning.
PvP balance
Lifesteal lives or dies on whether fights feel fair.
- Crystals, anchors and beds: turn them off with the
prevent...options in step 3 unless your community specifically wants crystal PvP. - Maximum hearts: 20 hearts is double health. If a few players run away with the server, lower
maxHeartsto 15. - Mace and other burst weapons: newer Minecraft versions add weapons that can kill in one hit. Decide whether to allow them, and limit enchantment levels with a plugin if needed.
- Combat style: if your players want 1.8-style combat, see PvP servers for OldCombatMechanics.
- Anti-cheat: install Grim and watch its alerts for the first week. Kill aura and reach are what cost honest players hearts.
- Bounties and events: a bounty on the top-hearts player, or a weekly PvP event at spawn, keeps fights happening between players who'd otherwise avoid each other.
The world
Border and pre-generation
A smaller map means players meet, which is the point of lifesteal.
| Players | Border radius |
|---|---|
| Up to 20 | 2,000–3,000 |
| 20–60 | 3,000–5,000 |
| 60+ | 5,000–7,500 |
worldborder center 0 0
worldborder set 6000
chunky world world
chunky worldborder
chunky start
That's a 3,000-block radius. Pre-generate overnight, and do the Nether too. Pre-generate
A shrinking border for end-of-season
For the final week, shrink the border to force everyone together: worldborder set 1000 86400 shrinks it to 1,000 wide over 86,400 seconds (one day). Announce it well ahead.
Settings
| File | Setting | Value |
|---|---|---|
server.properties |
view-distance |
8 |
server.properties |
simulation-distance |
6 |
server.properties |
difficulty |
hard or normal |
config/paper-world-defaults.yml |
environment.optimize-explosions |
true |
config/paper-world-defaults.yml |
chunks.entity-per-chunk-save-limit |
experience_orb: 16, arrow: 16 |
Permissions plan
lp group default permission set lifestealz.withdraw true
lp group default permission set lifestealz.viewhearts true
lp group default permission set lifestealz.admin.revive false
lp creategroup mod
lp creategroup admin
lp group mod permission set lifestealz.admin.revive true
lp group admin parent add mod
lp group admin permission set lifestealz.admin.setlife true
lp group admin permission set lifestealz.admin.giveitem true
lp group admin permission set lifestealz.admin.eliminate true
lp group admin permission set lifestealz.admin.reload true
lp group admin permission set lifestealz.admin.graceperiod true
lp createtrack staff
lp track staff append mod
lp track staff append admin
| Node | Allows |
|---|---|
lifestealz.withdraw |
/withdrawheart |
lifestealz.viewhearts |
/hearts |
lifestealz.admin.revive |
/revive |
lifestealz.admin.setlife |
/lifestealz hearts set <player> <amount> (also add, remove, get) |
lifestealz.admin.giveitem |
/lifestealz giveItem <player> <item> <amount> |
lifestealz.admin.eliminate |
/eliminate <player> |
lifestealz.admin.graceperiod |
/lifestealz graceperiod |
lifestealz.bypass |
Exempts a player from heart rules (not given to anyone by default, not even ops) |
Keep admin heart commands to as few people as possible, and log their use: every /lifestealz hearts set changes the game for everyone. Use CoreProtect's a:command lookups to audit them.
Storage and backups
LifeStealZ stores hearts and elimination status in SQLite by default. For a single server that's fine. If you run more than one server, or want the data outside the server files, switch to MySQL/MariaDB:
In the panel, open Databases → Create Database, name it
lifestealz. DatabasesStop the server and edit
plugins/LifeStealZ/storage.yml:type: "MySQL" host: "10.11.30.202" port: 3306 database: "s22_lifestealz" username: "u22_xxxxxxxx" password: "the-password-from-the-panel"Use the values from your database's details. The comments in the file list the accepted
typevalues. To move existing data, see the Data Migration page in the LifeStealZ docs first.
Backup schedule
| Schedule | Cron (UTC) | Tasks |
|---|---|---|
| Backup every 6 hours | 0 */6 * * * |
Send Command save-all, then Create Backup (offset 10 s) |
| Daily restart | 0 9 * * * |
say warnings at 5 min and 1 min, then Restart |
Set Only when server is online to off for the backup. Check Backups the next day. Backup schedules
Seasons
Lifesteal works best in seasons of 1–2 months: hearts concentrate in a few players over time, and a reset brings everyone back.
End of season:
- Announce the end date two weeks ahead. Run a final event (shrinking border, a last revive day).
- Record the winners: most hearts, most kills (PlaceholderAPI leaderboards make this easy).
- Lock a final backup and Download it.
Reset:
- Stop the server.
- In Files, rename or delete
world,world_netherandworld_the_end. - Reset LifeStealZ data: delete its player database (the SQLite file in
plugins/LifeStealZ/, or the tables in your MySQL database). Keepconfig.ymlanditems.yml. - Unban everyone who was banned for elimination (LibertyBans
/unban <player>if you used option B). - Change
level-seedinserver.propertiesif you want a new map, start the server, pre-generate, then open.
Launch checklist
- [ ] Paper on a pinned version; only one lifesteal plugin;
pluginsall green. - [ ] Heart rules decided: start, max, natural deaths, crystals/anchors/beds.
- [ ] Withdraw floor set (
allowDyingFromWithdraw: false,minWithdrawHearts). - [ ] Heart recipe priced; tested crafting and using one.
- [ ] Revive beacon recipe and
reviveHeartsset; tested a full revive with a second account. - [ ] Elimination approach chosen (A, B or C) and written in
/rules. - [ ]
lifestealz.admin.revivedenied to players. - [ ] Grace period and heart gain cooldown on.
- [ ] Spawn protected with
pvp denyandheartloss deny. - [ ] Combat tagging tested (log out mid-fight = death).
- [ ] Anti-alt
preventKill: true; LibertyBans installed. - [ ] Grim running; CoreProtect running.
- [ ] World border set; map pre-generated.
- [ ] Discord elimination webhook working.
- [ ] Backups every 6 hours and a daily restart, tested with Run now; a locked launch backup.
Common problems
| Problem | Likely cause | Fix |
|---|---|---|
| Players eliminate themselves withdrawing hearts | allowDyingFromWithdraw: true |
Set it to false and set minWithdrawHearts. |
| Eliminated players never come back | Default ban with no realistic revive | Use option A, B or C from step 6. |
| Players lose hearts to fall damage and quit | looseHeartsToNature: true |
Set it to false, or keep dropHeartsNatural: true so they can recover it. |
| New players farmed for hearts | No grace period | Enable gracePeriod; add a heart gain cooldown. |
| Players kill their own alts for hearts | Anti-alt only logging | Set antiAlt.preventKill: true; ban alt farming. |
| Players log out to save hearts | No combat tag | Install PvPManager or CombatLogX; punish with death. |
| Hearts given twice per kill | Two lifesteal plugins installed | Remove one. |
| Heart items duplicated | An item frame or exploit | Keep preventCustomItemsInItemFrames: true; update plugin and Paper; keep unsupported-settings off. |
| Heart items burn or despawn | Item settings | invulnerable: true and despawnable: false in items.yml. |
Anyone can run /revive |
Default permission | lp group default permission set lifestealz.admin.revive false. |
| Config changes don't apply | Edited while running | Stop, edit, start; or lifestealz reload for small changes. |
| Players die in spawn | No heartloss/pvp flags |
Add the WorldGuard region in step 7. |
| Crystal PvP dominates | Crystals allowed | preventCrystalPVP: true. |
Going further
- Scoreboards: show hearts with LifeStealZ's PlaceholderAPI placeholders (listed in its docs under PlaceholderAPI).
- Custom items: extra heart tiers (worth 2 hearts, only usable below 10) or a revive item with a different recipe.
- Teams: a teams or claims plugin turns lifesteal into a group game, but make sure claims don't block PvP or heart drops in ways you didn't intend.
- Bedrock players: Bedrock crossplay. Grim exempts Geyser players, so watch them with other tools.
- LifeStealZ's full docs (commands, config, custom items, migration, API) are at docs.zetaplugins.com.

