Minecraft — это кубики для всех воз­растов. А из кубиков при дол­жном желании мож­но соб­рать что угод­но. Сегод­ня я покажу, как реали­зовать нес­коль­ко популяр­ных алго­рит­мов встро­енны­ми средс­тва­ми игры, что­бы ты мог смот­реть, как игра игра­ет в игру, играя в игру.

О кле­точ­ных авто­матах слы­шали все, вклю­чая школь­ников. Самый извес­тный — игра «Жизнь» — был запущен уже при­мер­но вез­де, и даже в Minecraft умель­цы его уже запус­кали. Толь­ко вот все про­екты были огромны­ми, а прин­ципы работы ник­то не объ­яснял.

По­это­му я решил соз­дать свою реали­зацию, которая хоть и не пре­тен­дует на опти­маль­ность, но зато пол­ностью понят­на. По дороге раз­берем глав­ные коман­ды, на осно­ве которых мож­но реали­зовать в «Май­нкраф­те» поч­ти любой алго­ритм.

 

Команды

Все без исклю­чения коман­ды в игре обра­баты­вает сер­вер. Команд в стан­дар­тной немоди­фици­рован­ной и акту­аль­ной на дан­ный момент вер­сии Minecraft 1.21 все­го 68. Из них широко исполь­зуют­ся в механиз­мос­тро­ении око­ло десяти.

Ко­ман­ды в Minecraft мож­но выпол­нять в двух раз­ных мес­тах: в чате и в коман­дном бло­ке. Дли­на коман­ды в чате огра­ниче­на, кро­ме того, боль­шинс­тво команд дос­тупны толь­ко адми­нам (опе­рато­рам) сер­вера. И если вто­рая проб­лема в оди­ноч­ной игре не сто­ит, то спра­вить­ся с огра­ниче­нием по дли­не помога­ет толь­ко коман­дный блок.

Меж­ду спо­соба­ми запус­ка есть и еще два отли­чия: во‑пер­вых, перед коман­дой в чате обя­затель­но нуж­но ста­вить слеш (/), в то вре­мя как в коман­дном бло­ке это не тре­бует­ся; во‑вто­рых, для команд в чате по умол­чанию опре­делен исполни­тель (в коман­дных бло­ках его нуж­но ука­зывать явно).

Для начала пред­лагаю получить тот самый коман­дный блок. Пиши в чат /give @p command_block либо прос­то поищи в инвента­ре в твор­ческом режиме. Еще не зна­ешь, как в него перек­лючить­ся? Наж­ми F3 + F4 и кноп­кой F4 лис­тай режимы, пока не дой­дешь до твор­ческо­го.

Те­перь раз­берем­ся с тем, кто будет исполни­телем коман­ды. Этот параметр зовет­ся селек­тором и исполь­зует­ся поч­ти в каж­дой коман­де.

 

Селекторы (@)

Се­лек­торы отве­чают за то, кто будет исполни­телем (или кому будет адре­сова­на коман­да). Оче­вид­но, что целью или исполни­телем может быть толь­ко сущ­ность, но менее оче­вид­но, что сущ­ности — это не толь­ко игро­ки и живот­ные, но и, к при­меру, летящие стре­лы, выб­рошен­ные пред­меты, куриные яйца, пада­ющие бло­ки и даже кар­тины и стой­ки для бро­ни (хоть они и выг­лядят как бло­ки).

info

Еще сущес­тву­ют бло­ки‑сущ­ности, но их мы в этой статье рас­смат­ривать не будем, пос­коль­ку селек­торами на них ука­зать нель­зя и их осо­бые свой­ства в механиз­мах исполь­зуют­ся ред­ко.

Обыч­но селек­торы обоз­нача­ются все­го дву­мя сим­волами, пер­вый из которых — @. Селек­тором может быть ник­нейм игро­ка или иден­тифика­тор сущ­ности (GUID), а может быть и выраже­ние, которое при исполне­нии раз­вернет­ся в иден­тифика­тор цели. В игре есть сле­дующие общие селек­торы:

  • @r — слу­чай­ный игрок;
  • @s — исполни­тель коман­ды;
  • @p — бли­жай­ший игрок;
  • @a — все игро­ки;
  • @e — все сущ­ности.

Как ты видишь, поч­ти все селек­торы ссы­лают­ся на игро­ков, но в некото­рых ситу­ациях нуж­но работать не с игро­ками. Что делать тог­да? Тут в дело всту­пают уточ­няющие селек­торы, которые ука­зыва­ются в квад­ратных скоб­ках пос­ле самого селек­тора (без про­бела, дол­жно получить­ся в духе @e[type=player]). Пос­коль­ку уточ­няющие селек­торы очень важ­ны в любом механиз­ме, рас­смот­рим каж­дый из них попод­робнее. Разуме­ется, их мож­но ком­биниро­вать меж­ду собой.

type

Пер­вый и самый час­то исполь­зуемый селек­тор. Пос­ле type= нуж­но написать тип сущ­ности‑адре­сата. Нап­ример, ты хочешь выб­рать всех жителей — в таком слу­чае ты напишешь type=villager. Но если вдруг ты захочешь выб­рать все стре­лы, то уже баналь­ное type=arrow не пой­дет, потому что в игре при­сутс­тву­ют три типа сущ­ностей‑стрел.

Пер­вый вари­ант решения проб­лемы — сде­лать три коман­дных бло­ка, по одно­му на каж­дый тип стрел (обыч­ные, с эффекта­ми и спек­траль­ные).

Вто­рой вари­ант — исполь­зовать теги, которые пре­дус­мотри­тель­но наз­начены каж­дой сущ­ности, бло­ку и даже струк­туре в игре. Нап­ример, тег #minecraft:arrows ука­зыва­ет на стре­лы всех типов. Для тегов уже важ­но ука­зывать прос­транс­тво имен, к которо­му они при­над­лежат (оно ука­зыва­ется перед дво­ето­чием).

Для все­го осталь­ного прос­транс­тво имен тоже мож­но ука­зывать, но не всег­да оно обя­затель­но, потому что все стан­дар­тные игро­вые ресур­сы находят­ся в прос­транс­тве имен minecraft, которое и исполь­зует­ся по умол­чанию, если не ука­зано явно.

Еще мож­но исполь­зовать вос­кли­цатель­ный знак для отри­цания — к при­меру, type=!player будет озна­чать «все сущ­ности, кро­ме игро­ков».

scores

Поз­воля­ет обра­тить­ся к сущ­ности с опре­делен­ным зна­чени­ем задан­ного scoreboard — их мы под­робно раз­берем ниже. В общем виде будет выг­лядеть так:

@e{scores={"Название счетчика"=m..n}}

Здесь m и n — ниж­няя и вер­хняя допус­тимые гра­ницы счет­чика.

distance

Этот параметр поз­воля­ет ука­зать рас­сто­яние от исполни­теля коман­ды до целевой сущ­ности. Зада­ется оно диапа­зоном m..n, где m и n могут быть дроб­ными и любое из них может отсутс­тво­вать (тог­да соот­ветс­тву­ющий пре­дел не будет задан). Пред­положим, тебе надо выб­рать все стой­ки для бро­ни на рас­сто­янии боль­ше 10 бло­ков от тебя, но мень­ше 24,3. Тог­да ты напишешь:

@e[type=armor_stand,distance=10..24.3]

limit

Ог­раничи­вает количес­тво выбира­емых сущ­ностей, то есть будет выб­рано не боль­ше чем limit целей. Нап­ример, если на сер­вере три челове­ка, а ты хочешь обра­тить­ся к двум слу­чай­ным, пиши @a[limit=2].

nbt

Поз­воля­ет обра­тить­ся к сущ­ности с опре­делен­ным NBT. Что такое NBT? Читай даль­ше!

 

NBT-теги

Каж­дый объ­ект в игре опи­сыва­ется в фор­мате NBT-тегов (Named Binary Tag — име­нован­ный дво­ичный тег). Это очень обширная тема, на которую не хва­тит и целой статьи, поэто­му здесь я рас­смот­рю толь­ко самые базовые понятия.

Хо­тя в про­цес­се обыч­ной игры непос­редс­твен­ное вза­имо­дей­ствие с NBT не пре­дус­мотре­но, ты можешь задей­ство­вать эти теги в коман­дах при работе с игро­вым миром неп­редус­мотрен­ными раз­работ­чиком спо­соба­ми. В целом любые изме­нения в любую часть мира или в любой пред­мет мож­но внес­ти прос­то редак­тирова­нием NBT соот­ветс­тву­ющих объ­ектов.

Нап­ример, ты хочешь выдать себе алмазную кир­ку с зачаро­вани­ем эффектив­ности 40-го уров­ня. Тог­да ты дол­жен написать сле­дующее:

/give @p diamond_pickaxe{Enchantments:[{id:efficiency,lvl:40}]}

Как видишь, NBT зада­ется в виде обыч­ного JSON, но, пос­коль­ку эта часть игры скры­та от рядово­го игро­ка, авто­допол­нение тут не работа­ет и докумен­тация отсутс­тву­ет для боль­шей час­ти стан­дар­тно­го Minecraft, а моды не пок­рыты вооб­ще. Что делать в таком слу­чае?

Пос­мотреть или отре­дак­тировать NBT любой час­ти мира поможет NBTExplorer. Если хочешь пос­мотреть в NBT-парамет­ры какого‑нибудь хит­рого пред­мета, сох­раняй мир, на котором у тебя есть пред­мет с нуж­ным NBT, и ковыряй экс­пло­рером.

Интерфейс NBTExplorer
Ин­терфейс NBTExplorer

Нап­ример, недав­но мне нуж­но было выдать коман­дой ору­жие из мода Timeless Classics and Zero (один из золотых модов, упо­мяну­тых в прош­лой статье по Minecraft). Дело осложня­лось тем, что все виды ору­жия име­ли оди­нако­вый ID (tacz:modern_kinetic_gun), а кон­крет­ный вид задавал­ся допол­нитель­ным тегом.

Но даже ког­да я задал этот тег, стре­лять пуш­ка все рав­но отка­зыва­лась, потому что надо было задать еще нес­коль­ко парамет­ров, которые не были докумен­тирова­ны вооб­ще ниг­де. Без NBTExplorer или дру­гого спо­соба под­смот­реть NBT задача была бы нереша­емой, а с ними получи­лось выяс­нить, что обя­затель­ный к ука­занию режим стрель­бы может быть любым, и я смог сде­лать пис­толет, стре­ляющий оче­редя­ми.

Что­бы ско­пиро­вать пред­мет со все­ми NBT, клик­ни по нему в инвента­ре колеси­ком мыши, удер­живая Ctrl. Клик без зажато­го Ctrl ско­пиру­ет блок без тегов. Нап­ример, если ты клик­нешь колеси­ком по коман­дно­му бло­ку, в который вве­дена коман­да, ско­пиру­ется пус­той коман­дный блок, а если будешь при этом дер­жать Ctrl — он ско­пиру­ется сра­зу с коман­дой. Это полез­но, ког­да в механиз­ме исполь­зует­ся мно­го похожих коман­дных бло­ков. Но работа­ет это, разуме­ется, с любыми бло­ками, а не толь­ко с коман­дны­ми.

Волшебная палочка

Еще одно при­мене­ние пря­мого редак­тирова­ния NBT — пос­трой­ка карт. Все зна­ют, как слож­но порой ори­енти­ровать блок так, как тебе нуж­но. Вмес­то того что­бы ломать блок и под­бирать положе­ние, мож­но исполь­зовать палоч­ку отладки. Она поз­воля­ет менять сос­тояние бло­ка, не ломая его, в обход всех игро­вых пра­вил, в том чис­ле не обновляя сосед­ние. Исполь­зует­ся она так: левой кноп­кой мыши выбира­ешь изме­няемый параметр, пра­вой зада­ешь его зна­чение.

Как же заполу­чить эту палоч­ку? В пос­ледних вер­сиях ее мож­но най­ти в инвента­ре кре­ати­ва, но в общем слу­чае она выда­ется коман­дой /give @p debug_stick.

Так, нап­ример, мож­но сде­лать воду в аду (как ты зна­ешь, стан­дар­тны­ми спо­соба­ми помес­тить ее там невоз­можно). Для это­го нуж­но пос­тавить под­мос­тки (они же стро­итель­ные леса), взять палоч­ку отладки, прок­ликать левой кноп­кой мыши до парамет­ра waterlogged и поменять его на true. При этом бло­ки не обновля­ются, так что нуж­но при­нудить наш отре­дак­тирован­ный блок обно­вить­ся — для это­го дос­таточ­но прос­то пос­тавить рядом любой блок.

Вода в аду
Во­да в аду

Мож­но соз­давать и дру­гие невоз­можные струк­туры, нап­ример висящие друг на дру­ге рычаги или ков­ры, опи­рающиеся на кноп­ки, висящие на ков­рах.

Парящие рычаги
Па­рящие рычаги
 

Координаты

Ко­орди­наты в Minecraft зада­ются тре­мя чис­лами. Пос­мотреть их мож­но в меню отладки, которое откры­вает­ся по нажатию F3, или с помощью модов (нап­ример, мини‑кар­ты). Сис­тема коор­динат очень прос­тая, потому что мир изме­ряет­ся пря­моуголь­ной сет­кой, а не по пик­селям, как в боль­шинс­тве игр.

Тут смотришь координаты
Тут смот­ришь коор­динаты

Ко­орди­наты счи­тают­ся от цен­тра мира, и их нап­равле­ние мож­но опре­делить по трем цвет­ным полос­кам в цен­тре экра­на (они вид­ны толь­ко при вклю­чен­ном меню отладки). Важ­ное отли­чие от дру­гих игр — высота зада­ется коор­динатой Y, а не Z.

В боль­шинс­тве слу­чаев абсо­лют­ные коор­динаты неудоб­ны, потому что ты хочешь откла­дывать рас­сто­яния от задан­ной точ­ки, а не от цен­тра мира. Тог­да при­годит­ся вто­рой тип коор­динат — отно­ситель­ные. Они работа­ют так же, как и абсо­лют­ные, толь­ко точ­кой отсче­та счи­тает­ся не центр мира, а исполни­тель коман­ды.

Нап­ример, если ты хочешь зас­павнить кри­пера на три бло­ка выше себя, выпол­ни /summon creeper ~ ~3 ~. Коор­динаты всег­да идут в поряд­ке X Y Z, и, если сме­щение не ука­зано, оно по умол­чанию счи­тает­ся рав­ным нулю. Конеч­но же, сме­щение может быть и отри­цатель­ным (нап­ример, ~-2).

Аб­солют­ные и отно­ситель­ные коор­динаты мож­но сме­шивать в рам­ках одной коман­ды, то есть часть коор­динат мож­но задать отно­ситель­ными, а часть — абсо­лют­ными и все будет работать.

info

У всех сущ­ностей высотой в два бло­ка, вклю­чая игро­ков, мобов и стой­ки для бро­ни, основным бло­ком счи­тает­ся ниж­ний — блок ног. То есть, ког­да ты ссы­лаешь­ся на сущ­ность, для тебя она вся находит­ся в сво­ем ниж­нем бло­ке.

Кро­ме абсо­лют­ных и отно­ситель­ных коор­динат, есть еще один тип, который поз­воля­ет задавать коор­динаты отно­ситель­но взгля­да сущ­ности. Я соз­натель­но говорю о сущ­ностях в целом, а не толь­ко об игро­ках, потому что нап­равле­ние взгля­да име­ет каж­дая сущ­ность, даже выб­рошен­ный пред­мет. Обоз­нача­ются такие коор­динаты сим­волом ^.

Нап­ример, коман­да /setblock ^3 ^5 ^10 stone уста­новит камень на три бло­ка левее тво­его взгля­да, на пять выше и на десять даль­ше его источни­ка. Неоче­вид­ный момент: источник взгля­да находит­ся по коор­динатам сущ­ности, то есть взгляд игро­ка будет рас­счи­тывать­ся от его ног. Что? Да!

Где это мож­но исполь­зовать — воп­рос хороший. В голову при­ходит раз­ве что какой‑нибудь скри­мер, но в реаль­ном кар­тос­тро­ении это поч­ти не при­меня­ется. Если есть еще идеи — пиши в ком­мента­риях!

 

Собственно команды

Ес­ли рядовой игрок поль­зует­ся стан­дар­тны­ми игро­выми механи­ками, то каж­дый ува­жающий себя кар­тодел или админ сер­вера обя­зан уметь поль­зовать­ся коман­дами. И если с прос­тей­шими, вро­де уста­нов­ки погоды или игро­вого режима, зна­комы прак­тичес­ки все (а если нез­накомы — про­чита­ют в до­кумен­тации), то более прод­винутые коман­ды, исполь­зуемые в стро­итель­стве карт, мы раз­берем отдель­но.

 

execute

Ко­ман­дой execute мож­но каз­нить любого игро­ка выпол­нять дру­гие коман­ды, изме­няя их исполни­теля, добав­ляя усло­вия и так далее. Все без исклю­чения слож­ные алго­рит­мы реали­зуют­ся толь­ко с помощью этой коман­ды. В уме­лых руках она прев­раща­ется в гроз­ное ору­жие, хотя она во мно­гом напоми­нает нун­чаки: выг­лядит эффек­тно, но тре­бует годы боли, что­бы научить­ся поль­зовать­ся. Не добав­ляет прос­тоты и то, что син­таксис силь­но поменял­ся в вер­сии 1.13, так что ста­рые гай­ды уже нес­коль­ко лет как не помога­ют. Общий син­таксис нового execute сле­дующий:

/execute <операция> <аргумент>

Да­вай раз­берем пять с полови­ной самых важ­ных опе­раций.

run

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии