Свой сервер

Lifesteal в Майнкрафте датапаком

Датапак Lifesteal для Minecraft 1.21.9 — 26.3: убил игрока — забрал его сердце, умер — потерял своё. Сердце можно вынуть предметом, отдать другу или скрафтить, а у кого сердца кончились — выбывает. Ставится в готовый мир или на сервер, без плагинов.

Сердца

На старте

Максимум

Сердце сверх максимума падает в инвентарь предметом — его отдают другу.

Смерть

Сердце теряется

Минимум

Сердца кончились

На нуле игрок выбывает и смотрит наблюдателем.

Предмет «Сердце»

Вынуть своё сердце предметом — /trigger withdraw, съесть — ПКМ. Сердце возрождения возвращает выбывшего друга с 3 сердцами.

Сердца в игре

Датапак · 1.21.9 — 26.3

На старте — 10 сердец

Максимум — 20 сердец

Старт
10
Максимум
20
Ноль
выбывание

Вынуть сердце — любой игрок

/trigger withdraw

Новый сезон (права оператора)

/function lifesteal:reset
Скачать датапак
Что внутри архива — 22 файла

data/minecraft/tags/function/load.json

Тег load: игра зовёт эти функции при загрузке мира и после /reload.

{
  "values": [
    "lifesteal:load"
  ]
}

data/minecraft/tags/function/tick.json

Тег tick: эти функции идут каждый тик — 20 раз в секунду.

{
  "values": [
    "lifesteal:tick"
  ]
}

data/lifesteal/function/load.mcfunction

При загрузке мира: счета, триггер и сердца в списке игроков.

scoreboard objectives add lifesteal dummy {"text":"❤","color":"red"}
scoreboard objectives add ls_season dummy
scoreboard objectives add ls_hp dummy
scoreboard objectives add ls_deaths deathCount
scoreboard objectives add ls_kills playerKillCount
scoreboard objectives add ls_eat minecraft.used:minecraft.nether_star
scoreboard objectives add withdraw trigger "Вынуть сердце"
scoreboard objectives add ls_revive minecraft.used:minecraft.heart_of_the_sea
scoreboard objectives setdisplay list lifesteal
scoreboard objectives setdisplay below_name lifesteal
execute unless score #season lifesteal matches 1.. run scoreboard players set #season lifesteal 1
tellraw @a ["",{"text":"Lifesteal загружен. ","color":"red"},{"text":"Убил игрока — забрал сердце, умер — потерял. Вынуть сердце — "},{"text":"/trigger withdraw","color":"gold","click_event":{"action":"run_command","command":"/trigger withdraw"}},{"text":"."}]

data/lifesteal/function/tick.mcfunction

Каждый тик: новички, убийства, смерти, сердца из рук и здоровье.

scoreboard players enable @a withdraw
execute as @a unless score @s ls_season = #season lifesteal run function lifesteal:join
execute as @a[scores={ls_kills=1..}] run function lifesteal:kill
execute as @a[scores={ls_deaths=1..}] run function lifesteal:died
execute as @a[scores={withdraw=1..}] run function lifesteal:withdraw
execute as @a[scores={ls_eat=1..}] run function lifesteal:eat
execute as @a[scores={ls_revive=1..}] run function lifesteal:revive
execute as @e[type=player,tag=!ls_out,scores={lifesteal=1..}] run function lifesteal:sync

data/lifesteal/function/join.mcfunction

Новый игрок или новый сезон: 10 сердец.

scoreboard players operation @s ls_season = #season lifesteal
scoreboard players set @s lifesteal 10
scoreboard players reset @s ls_kills
scoreboard players reset @s ls_deaths
execute if entity @s[tag=ls_out] run gamemode survival @s
tag @s remove ls_out
tellraw @s ["",{"text":"У вас "},{"text":"10 сердец","color":"red"},{"text":". Больше 20 не бывает."}]

data/lifesteal/function/sync.mcfunction

Здоровье — сердца × 2: сверить атрибут со счётом.

execute store result score @s ls_hp run attribute @s minecraft:max_health base get
scoreboard players operation #want lifesteal = @s lifesteal
scoreboard players operation #want lifesteal += @s lifesteal
execute unless score @s ls_hp = #want lifesteal run function lifesteal:apply

data/lifesteal/function/apply.mcfunction

Поставить здоровье по счёту сердец.

execute store result storage lifesteal:hp value int 2 run scoreboard players get @s lifesteal
function lifesteal:apply/set with storage lifesteal:hp

data/lifesteal/function/apply/set.mcfunction

Макрос: база максимального здоровья.

$attribute @s minecraft:max_health base set $(value)

data/lifesteal/function/kill.mcfunction

Убил игрока: +1 сердце, на 20 — предмет «Сердце».

scoreboard players remove @s ls_kills 1
execute if score @s ls_kills matches 1.. run function lifesteal:kill
execute if score @s lifesteal matches 20.. run return run function lifesteal:spare
scoreboard players add @s lifesteal 1
playsound minecraft:entity.player.levelup master @s ~ ~ ~ 1 1.5
tellraw @s ["",{"text":"+1 сердце","color":"red"},{"text":" — теперь "},{"score":{"name":"@s","objective":"lifesteal"},"color":"red"},{"text":"."}]

data/lifesteal/function/spare.mcfunction

Сердце сверх максимума — предметом.

give @s minecraft:nether_star[minecraft:custom_name={"text":"Сердце","color":"red","italic":false},minecraft:lore=[{"text":"ПКМ — +1 сердце к здоровью","color":"gray","italic":false}],minecraft:custom_data={"lifesteal":"heart"},minecraft:enchantment_glint_override=true,minecraft:consumable={"consume_seconds":1.0,"animation":"bow","sound":"minecraft:block.beacon.power_select","has_consume_particles":false}]
tellraw @s ["",{"text":"Больше 20 сердец не бывает — "},{"text":"Сердце","color":"red"},{"text":" в инвентаре: отдайте другу."}]

data/lifesteal/function/died.mcfunction

Смерть: −1 сердце, на нуле — выбывание.

scoreboard players reset @s ls_deaths
scoreboard players remove @s lifesteal 1
tellraw @s ["",{"text":"−1 сердце","color":"red"},{"text":" — осталось "},{"score":{"name":"@s","objective":"lifesteal"},"color":"red"},{"text":"."}]
execute if score @s lifesteal matches ..0 run function lifesteal:out

data/lifesteal/function/out.mcfunction

Ноль сердец: наблюдатель.

tag @s add ls_out
gamemode spectator @s
title @s title {"text":"Сердца кончились","color":"red"}
title @s subtitle {"text":"Друг может вернуть вас Сердцем возрождения"}
tellraw @a ["",{"selector":"@s","color":"red"},{"text":" теряет последнее сердце и выбывает."}]

data/lifesteal/function/revive.mcfunction

Съел «Сердце возрождения»: вернуть ближайшего выбывшего.

scoreboard players reset @s ls_revive
execute unless entity @a[tag=ls_out] run return run function lifesteal:revive/none
tag @s add ls_saver
execute at @s as @a[tag=ls_out,sort=nearest,limit=1] run function lifesteal:revive/back
tag @s remove ls_saver

data/lifesteal/function/revive/none.mcfunction

Возвращать некого — предмет обратно.

give @s minecraft:heart_of_the_sea[minecraft:custom_name={"text":"Сердце возрождения","color":"aqua","italic":false},minecraft:lore=[{"text":"ПКМ — вернуть ближайшего выбывшего","color":"gray","italic":false}],minecraft:custom_data={"lifesteal":"revive"},minecraft:enchantment_glint_override=true,minecraft:consumable={"consume_seconds":1.0,"animation":"bow","sound":"minecraft:block.beacon.power_select","has_consume_particles":false}]
tellraw @s {"text":"Выбывших нет — Сердце возрождения вернулось."}

data/lifesteal/function/revive/back.mcfunction

Выбывший — обратно в выживание к спасителю, 3 сердца.

tag @s remove ls_out
scoreboard players set @s lifesteal 3
gamemode survival @s
tp @s @a[tag=ls_saver,limit=1]
tellraw @a ["",{"selector":"@s","color":"green"},{"text":" возвращается в игру с 3 сердцами."}]

data/lifesteal/function/withdraw.mcfunction

/trigger withdraw — вынуть своё сердце предметом (прав не нужно).

scoreboard players set @s withdraw 0
execute if score @s lifesteal matches ..1 run return run tellraw @s {"text":"Вынуть нельзя: последнее сердце остаётся.","color":"gray"}
scoreboard players remove @s lifesteal 1
give @s minecraft:nether_star[minecraft:custom_name={"text":"Сердце","color":"red","italic":false},minecraft:lore=[{"text":"ПКМ — +1 сердце к здоровью","color":"gray","italic":false}],minecraft:custom_data={"lifesteal":"heart"},minecraft:enchantment_glint_override=true,minecraft:consumable={"consume_seconds":1.0,"animation":"bow","sound":"minecraft:block.beacon.power_select","has_consume_particles":false}]
tellraw @s ["",{"text":"Сердце вынуто — осталось "},{"score":{"name":"@s","objective":"lifesteal"},"color":"red"},{"text":". Съесть обратно — ПКМ."}]

data/lifesteal/function/eat.mcfunction

Съел «Сердце»: +1 сердце.

scoreboard players reset @s ls_eat
execute if score @s lifesteal matches 20.. run return run function lifesteal:full
scoreboard players add @s lifesteal 1
tellraw @s ["",{"text":"+1 сердце","color":"red"},{"text":" — теперь "},{"score":{"name":"@s","objective":"lifesteal"},"color":"red"},{"text":"."}]

data/lifesteal/function/full.mcfunction

Сердце на максимуме — обратно в инвентарь.

give @s minecraft:nether_star[minecraft:custom_name={"text":"Сердце","color":"red","italic":false},minecraft:lore=[{"text":"ПКМ — +1 сердце к здоровью","color":"gray","italic":false}],minecraft:custom_data={"lifesteal":"heart"},minecraft:enchantment_glint_override=true,minecraft:consumable={"consume_seconds":1.0,"animation":"bow","sound":"minecraft:block.beacon.power_select","has_consume_particles":false}]
tellraw @s {"text":"У вас уже 20 сердец — больше не бывает. Сердце вернулось."}

data/lifesteal/function/give.mcfunction

/function lifesteal:give — сердце себе (оператору).

give @s minecraft:nether_star[minecraft:custom_name={"text":"Сердце","color":"red","italic":false},minecraft:lore=[{"text":"ПКМ — +1 сердце к здоровью","color":"gray","italic":false}],minecraft:custom_data={"lifesteal":"heart"},minecraft:enchantment_glint_override=true,minecraft:consumable={"consume_seconds":1.0,"animation":"bow","sound":"minecraft:block.beacon.power_select","has_consume_particles":false}]

data/lifesteal/function/reset.mcfunction

/function lifesteal:reset — новый сезон: всем по 10 сердец (оператору).

scoreboard players add #season lifesteal 1
tellraw @a ["",{"text":"Новый сезон Lifesteal: ","color":"red"},{"text":"у всех снова 10 сердец."}]

data/lifesteal/recipe/heart.json

Рецепт: «Сердце» на верстаке.

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    "ABA",
    "BCB",
    "ABA"
  ],
  "key": {
    "A": "minecraft:diamond_block",
    "B": "minecraft:gold_block",
    "C": "minecraft:netherite_ingot"
  },
  "result": {
    "id": "minecraft:nether_star",
    "count": 1,
    "components": {
      "minecraft:custom_name": {
        "text": "Сердце",
        "color": "red",
        "italic": false
      },
      "minecraft:lore": [
        {
          "text": "ПКМ — +1 сердце к здоровью",
          "color": "gray",
          "italic": false
        }
      ],
      "minecraft:custom_data": {
        "lifesteal": "heart"
      },
      "minecraft:enchantment_glint_override": true,
      "minecraft:consumable": {
        "consume_seconds": 1.0,
        "animation": "bow",
        "sound": "minecraft:block.beacon.power_select",
        "has_consume_particles": false
      }
    }
  }
}

data/lifesteal/recipe/revive.json

Рецепт: «Сердце возрождения» на верстаке.

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    "ABA",
    "BCB",
    "ABA"
  ],
  "key": {
    "A": "minecraft:diamond_block",
    "B": "minecraft:nether_star",
    "C": "minecraft:totem_of_undying"
  },
  "result": {
    "id": "minecraft:heart_of_the_sea",
    "count": 1,
    "components": {
      "minecraft:custom_name": {
        "text": "Сердце возрождения",
        "color": "aqua",
        "italic": false
      },
      "minecraft:lore": [
        {
          "text": "ПКМ — вернуть ближайшего выбывшего",
          "color": "gray",
          "italic": false
        }
      ],
      "minecraft:custom_data": {
        "lifesteal": "revive"
      },
      "minecraft:enchantment_glint_override": true,
      "minecraft:consumable": {
        "consume_seconds": 1.0,
        "animation": "bow",
        "sound": "minecraft:block.beacon.power_select",
        "has_consume_particles": false
      }
    }
  }
}

Крафт сердца

Рецепты добавляет датапак — они появятся в книге рецептов. Сердце с верстака такое же, как вынутое: ПКМ — и +1 сердце.

Сердце
Сердце возрождения

Как поставить

  1. Скачайте датапак

    Распаковывать не нужно: игра читает его прямо из zip.

  2. Положите в мир

    В одиночной игре (по сети) — saves/<мир>/datapacks, на сервере — world/datapacks. Подойдёт и уже созданный мир.

  3. Перезагрузите

    /reload — у каждого игрока станет 10 сердец, число видно в списке игроков и под ником.

Что нужно знать

  • Убийство засчитывает игра. Сердце забирает и тот, кто столкнул в лаву или с обрыва: игра помнит, кто ударил последним в ближайшие секунды.
  • Сердце отнимает любая смерть — от мобов, лавы и падения тоже. Только убийство игроком отдаёт его убийце.
  • «Сердце» — звезда Незера с подписью. Обычная звезда от Иссушителя не съедается, а сердце из пака на максимуме возвращается в инвентарь.
  • Возрождение. Выбывший подлетает наблюдателем к другу, тот съедает Сердце возрождения — и ближайший выбывший возвращается рядом в выживание с 3 сердцами.
  • Новый сезон. /function lifesteal:reset — у всех снова 10 сердец, в том числе у тех, кто сейчас не в игре: они начнут заново при входе.

Сыграть в Lifesteal с сотнями людей — на серверах Lifesteal в мониторинге, что значит этот режим — в вики. Здоровье и урон руками — генератор атрибутов, ещё игра для друзей — Мардер Мистери.

Частые вопросы

Как сделать Lifesteal в Майнкрафте без плагинов?

Скачайте датапак и положите его в папку datapacks мира или сервера, затем /reload. У каждого игрока появится запас сердец: убийство игрока забирает у него сердце, смерть отнимает своё.

Как вынуть сердце в Lifesteal?

Командой /trigger withdraw — права оператора не нужны. Сердце становится предметом: его отдают другу или съедают обратно правой кнопкой мыши. Последнее сердце вынуть нельзя.

Что будет, когда кончатся сердца?

Игрок выбывает и смотрит наблюдателем. Друг может вернуть его Сердцем возрождения из пака. Можно выбрать и бан — кнопкой для оператора — или минимум: тогда сердца не кончаются совсем.