Свой сервер

Прятки: датапак для игры с друзьями

Водящий ждёт с закрытыми глазами, остальные прячутся, над хотбаром — таймер раунда. Ники прячущихся не видны сквозь стены, найденные переходят к водящему. Датапак для Minecraft 1.21.9 — 26.3, роли и старт — без прав оператора.

Фора и раунд

Фора прячущимся

Длина раунда

Как играть

Датапак · 1.21.9 — 26.3

1. Водящий пишет в чат

/trigger seeker

2. Любой начинает раунд

/trigger start
Фора
30 с
Раунд
5 мин
Скачать датапак
Что внутри архива — 15 файлов

data/minecraft/tags/function/load.json

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

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

data/minecraft/tags/function/tick.json

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

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

data/hideseek/function/load.mcfunction

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

scoreboard objectives add hideseek dummy
scoreboard objectives add seeker trigger "Стать водящим"
scoreboard objectives add start trigger "Начать прятки"
scoreboard objectives add hideseek_hurt minecraft.custom:minecraft.damage_taken
team add hideseek_seekers
team modify hideseek_seekers color red
team add hideseek_hiders
team modify hideseek_hiders color green
team modify hideseek_hiders nametagVisibility hideForOtherTeams
team modify hideseek_hiders friendlyFire false
tellraw @a ["",{"text":"Прятки загружены. Водящий — "},{"text":"/trigger seeker","color":"red","click_event":{"action":"run_command","command":"/trigger seeker"}},{"text":", начать — "},{"text":"/trigger start","color":"gold","click_event":{"action":"run_command","command":"/trigger start"}},{"text":"."}]

data/hideseek/function/tick.mcfunction

Каждый тик: роли, старт, кого нашли и не кончились ли прячущиеся.

scoreboard players enable @a seeker
scoreboard players enable @a start
execute as @a[scores={seeker=1..}] run function hideseek:role
execute as @a[scores={start=1..}] run function hideseek:start
execute if score #running hideseek matches 1 as @a[tag=hideseek_hider,scores={hideseek_hurt=1..}] at @s if entity @a[tag=hideseek_seeker,distance=..6] run function hideseek:found
scoreboard players reset @a hideseek_hurt
execute if score #running hideseek matches 1 unless entity @a[tag=hideseek_hider] run function hideseek:seekers_win

data/hideseek/function/role.mcfunction

Игрок стал водящим (до старта раунда).

scoreboard players set @s seeker 0
execute if score #running hideseek matches 1 run return run tellraw @s {"text":"Раунд уже идёт."}
tag @s add hideseek_seeker
team join hideseek_seekers @s
tellraw @a ["",{"selector":"@s"},{"text":" — водящий."}]

data/hideseek/function/round/start.mcfunction

Старт отсчёта: 300 с полосой босса.

bossbar remove hideseek:round
bossbar add hideseek:round {"text":"До конца раунда"}
bossbar set hideseek:round color green
bossbar set hideseek:round max 300
scoreboard players set #round hideseek 300
function hideseek:round/second

data/hideseek/function/round/second.mcfunction

Раз в секунду: полоса и надпись «мм:сс», по нулю — конец.

execute if score #round hideseek matches ..0 run return run function hideseek:round/end
bossbar set hideseek:round players @a
execute store result bossbar hideseek:round value run scoreboard players get #round hideseek
scoreboard players operation #m hideseek = #round hideseek
scoreboard players operation #s hideseek = #round hideseek
scoreboard players set #60 hideseek 60
scoreboard players operation #m hideseek /= #60 hideseek
scoreboard players operation #s hideseek %= #60 hideseek
execute if score #s hideseek matches 10.. run bossbar set hideseek:round name ["",{"text":"До конца раунда "},{"score":{"name":"#m","objective":"hideseek"}},{"text":":"},{"score":{"name":"#s","objective":"hideseek"}}]
execute if score #s hideseek matches ..9 run bossbar set hideseek:round name ["",{"text":"До конца раунда "},{"score":{"name":"#m","objective":"hideseek"}},{"text":":0"},{"score":{"name":"#s","objective":"hideseek"}}]
scoreboard players remove #round hideseek 1
schedule function hideseek:round/second 1s

data/hideseek/function/round/end.mcfunction

Время вышло: полосу убрать, дальше — своё.

bossbar remove hideseek:round
function hideseek:hiders_win

data/hideseek/function/round/stop.mcfunction

Остановить отсчёт.

schedule clear hideseek:round/second
bossbar remove hideseek:round

data/hideseek/function/start.mcfunction

Старт: все не водящие — прячутся, у них 30 с.

scoreboard players set @s start 0
execute unless entity @a[tag=hideseek_seeker] run return run tellraw @s ["",{"text":"Сначала кто-то должен стать водящим: "},{"text":"/trigger seeker","color":"red","click_event":{"action":"run_command","command":"/trigger seeker"}}]
tag @a[tag=!hideseek_seeker] add hideseek_hider
team join hideseek_hiders @a[tag=hideseek_hider]
scoreboard players set #running hideseek 1
title @a title {"text":"Прячьтесь!"}
title @a subtitle {"text":"Водящий выйдет через 30 с"}
execute as @a[tag=hideseek_seeker] run attribute @s minecraft:movement_speed base set 0
execute as @a[tag=hideseek_seeker] run attribute @s minecraft:jump_strength base set 0
effect give @a[tag=hideseek_seeker] minecraft:blindness 30 0 true
schedule function hideseek:release 30s

data/hideseek/function/glow.mcfunction

Последняя минута: прячущиеся светятся сквозь стены.

effect give @a[tag=hideseek_hider] minecraft:glowing 60 0 true
title @a actionbar {"text":"Последняя минута — прячущиеся светятся!","color":"yellow"}

data/hideseek/function/release.mcfunction

Фора вышла: водящему вернуть скорость, пошёл отсчёт раунда.

execute as @a[tag=hideseek_seeker] run attribute @s minecraft:movement_speed base reset
execute as @a[tag=hideseek_seeker] run attribute @s minecraft:jump_strength base reset
title @a title {"text":"Водящий вышел!"}
function hideseek:round/start
schedule function hideseek:glow 240s

data/hideseek/function/found.mcfunction

Прячущегося нашли: становится водящим.

tag @s remove hideseek_hider
tellraw @a ["",{"selector":"@s"},{"text":" найден!"}]
effect clear @s minecraft:glowing
tag @s add hideseek_seeker
team join hideseek_seekers @s

data/hideseek/function/hiders_win.mcfunction

Время вышло, кто-то не найден — победа прячущихся.

title @a title {"text":"Прячущиеся победили!","color":"green"}
scoreboard players set #running hideseek 0
schedule clear hideseek:glow
tag @a remove hideseek_hider
tag @a remove hideseek_seeker
team empty hideseek_hiders
team empty hideseek_seekers

data/hideseek/function/seekers_win.mcfunction

Прячущихся не осталось — победа водящих.

function hideseek:round/stop
title @a title {"text":"Всех нашли!","color":"red"}
scoreboard players set #running hideseek 0
schedule clear hideseek:glow
tag @a remove hideseek_hider
tag @a remove hideseek_seeker
team empty hideseek_hiders
team empty hideseek_seekers

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

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

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

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

    В одиночной игре — saves/<мир>/datapacks, на сервере — world/datapacks. Лучше карта с домами и закоулками.

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

    /reload — в чате появятся кнопки «стать водящим» и «начать».

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

  • Найти — значит ударить. Прячущийся найден, когда получил урон, а водящий стоит ближе 6 блоков: падение в другом конце карты не считается.
  • Ники не выдают. Надпись над прячущимся не видна чужой команде — ни сквозь стены, ни из-за угла.
  • Победа — сама. Нашли всех — победили водящие, время раунда вышло — прячущиеся. Полоса над хотбаром показывает, сколько осталось.
  • Права не нужны. Роли и старт — через /trigger, его может писать любой игрок.

Охота на одного с компасом — манхант, свой таймер для ивента — таймер на экране. Сервера с прятками — в мониторинге.

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

Как играть в прятки в Майнкрафте?

Поставьте датапак в мир. Водящий пишет /trigger seeker, раунд начинает /trigger start: водящий ждёт с закрытыми глазами, остальные прячутся, над хотбаром — таймер раунда.

Как скрыть ник над головой в прятках?

Датапак ставит прячущихся в команду, ник которой не виден чужим: водящий не увидит надпись сквозь стены.

Как понять, что игрока нашли?

Водящий бьёт прячущегося: урон рядом с водящим — значит, найден. Найденный становится водящим или выбывает — по выбору.