Найти в Дзене
Reality_Editor

Minecraft - гайд к моду Hex Casting. Часть 3

Вторая часть здесь: Четвертая часть: В этой части гайда я решил поэтапно рассказать, как создавать сложные заклинания на парочке примеров. Но перед этим хочу порекомендовать вам пару видео от Water_waterovich с полным обзором рун Hex Casting и Hexal: https://vk.com/video-226797395_456239017
https://vk.com/video-226797395_456239019 Так же хочу посоветовать статьи, где автор выкладывает уже свои варианты заклинаний Hex Casting: https://dzen.ru/sone1 Начнем с концепции будущего заклинания. Хочется блинк превратить в нормальное заклинание, что бы можно было его записать в книгу. Напомню, что блинк телепортирует указанную сущность в направлении взгляда, на указанное расстояние. Значит заклинание должно каким-то образом определять расстояние до препятствий. То есть нам нужно вычислять расстояние от игрового персонажа до блока, на который он смотрит. Возьмем вектор этого блока и вычтем вектор игрока, модуль результирующего вектора и будет искомым расстоянием. Тогда заклинание будет выглядеть
Оглавление

Вторая часть здесь:

Четвертая часть:

В этой части гайда я решил поэтапно рассказать, как создавать сложные заклинания на парочке примеров.

Но перед этим хочу порекомендовать вам пару видео от Water_waterovich с полным обзором рун Hex Casting и Hexal:

https://vk.com/video-226797395_456239017
https://vk.com/video-226797395_456239019

Так же хочу посоветовать статьи, где автор выкладывает уже свои варианты заклинаний Hex Casting:

https://dzen.ru/sone1

Начнем с концепции будущего заклинания. Хочется блинк превратить в нормальное заклинание, что бы можно было его записать в книгу. Напомню, что блинк телепортирует указанную сущность в направлении взгляда, на указанное расстояние. Значит заклинание должно каким-то образом определять расстояние до препятствий. То есть нам нужно вычислять расстояние от игрового персонажа до блока, на который он смотрит. Возьмем вектор этого блока и вычтем вектор игрока, модуль результирующего вектора и будет искомым расстоянием. Тогда заклинание будет выглядеть так:

Но тут сразу появляется проблема. После использования такого заклинания игровой персонаж окажется внутри того блока, на который он смотрит. Это нужно исправить. Для решения проблемы придется научится менять направления взгляда игрового персонажа. Значит нам нужно использовать руну из мода HexKinetics:

-2

Во-первых, будем вычитать вектор относительно ног игрового персонажа, а не головы. А во-вторых прибавим еще нормаль, это нужно что бы телепортироваться рядом с блоком, а не внутри него. Внесем в заклинание эти изменения:

-3

Из-за того, что мы взяли координаты относительно ног, на пол игровой персонаж телепортируется очень хорошо, при телепортации к стене тоже не возникает никаких проблем, а вот при телепортации к потолку голова игрового персонажа окажется внутри блока, после чего он вывалится вниз. Не особо критичная проблема, но все же хотелось бы это исправить.

Итак, у нас уже есть заклинание, которым в принципе можно пользоваться, но хотелось бы большего: по возможности исправить недочеты, добавить возможность телепортации за блок, и учесть ситуацию когда нет преград в виде блоков.

На ситуации, когда перед игровым персонажем нет препятствия, особо заострять внимания не будем. В этом случае можно телепортироваться на максимально возможное расстояние, и эту возможность добавим в самом конце.

Возможность телепортироваться за блок можно реализовать через Shift.

Прежде чем заниматься условиями давайте для начала определимся куда их будем вставлять и на что они будут влиять. Для этого разобьем заклинание на несколько кусков и добавим альтернативные варианты:

-4

Как видите вариант телепортации на 31 блок я сюда пока не добавлял. На этом этапе еще мне хочется кое что тут подсократить, что бы что бы одно звено в цепочке ликвидировать:

-5

Заметим, что тут у нас всего две "развилки". Далее предлагаю собирать отдельные куски в один список вот таким способом:

-6

Когда с этим разобрались пришло время подготовить условия. По идее у нас будет 4 условия:

1 Проверяем, смотрит-ли игровой персонаж на блок или нет.

2 Проверяем смотрит-ли игровой персонаж на боковую грань блока. Для этого у вектора нормали нужно сравнить координату Y с нулем.

3 Проверяем смотрит-ли игровой персонаж на верхнюю или нижнюю грань блока. Для этого у вектора нормали нужно сравнить координату Y с единицей.

4 Проверяем использовался-ли Shift во время каста заклинания. Для этого сравним рост игрового персонажа с 1,5.

-7

Так как здесь много повторяющихся рун, в будущем я это попытаюсь упростить.

Для определения по какому пути пойти в первой "развилке" придется использовать сразу три последних условия. Но пока давайте определим как объединить 3 и 4 условия. Для этого давайте составим таблицу истинности для этих двух условий:

-8

Треугольник в таблице со стрелочкой означает будем ли мы брать координаты относительно головы или ног:

-9

Что бы составить таблицу я просто рассматривал каждую ситуацию отдельно и ставил 1 или 0, в зависимости от того что мне подходило. На этом этапе частично решается проблема, когда голова оказывалась внутри блока. И тут нам повезло, для получения последней колонки существует руна:

-10

Поэтому далее будем брать именно эту колонку. Тогда эти два условия можно объединить вот так:

-11

Ну а теперь добавим в таблицу условие номер 2:

-12

Координата Y не может быть одновременно нулем и единицей, поэтому эти два варианта вычеркиваем. Да и вообще на мой взгляд когда Y=0 координаты удобнее брать только относительно ног.

Теперь нам нужно подобрать какое-то логическое выражение, которое будет соответствовать этой таблице. При этом что будет вместо прочерков не имеет значения, все равно эти две строчки никогда не будут использоваться. У меня получилось вот такое логическое выражение ¬A+(B⊕C) или можно записать его вот так: A' ∨ (B ⊕ C)

Правильность логического выражения можно проверить в каком-нибудь онлайн калькуляторе булевых выражений. Например в этом:

https://boolean-calculator.ru/

Так же существуют онлайн калькуляторы для упрощения булевых выражений, например этот:

https://mrexam.ru/mathlogic

Теперь давайте составим это условие в Hex Casting:

-13

На второй "развилке" все намного проще, там все будет зависеть от того, была-ли нажата клавиша Shift во время каста заклинания. То есть там достаточно измерить только рост.

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

-14

Искать в чате руны которые неправильно нарисованы намного удобнее, у них не будет нормального названия. Так же, если в ошибке указано название руны, которая привела к этой ошибке, то эту руну тоже проще искать, когда все заклинание есть в чате.

Собрав все куски в одну кучу мы получим нечто подобное:

-15

Здесь я выделил одинаковые куски "кода" от повторения которых можно попытаться избавится.

Итоговое заклинание, которое у меня получилось выглядит так:

-16

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

Заклинание бура и не только

Наверное вы у меня уже видели готовые варианты заклинания бура, но в этом разделе я попытаюсь научить вас создавать подобные заклинания самостоятельно. Попутно попробую рассмотреть и другие заклинания которые работают на схожих принципах.

Итак в планах у нас создать заклинание, которое будет ломать несколько блоков за один каст. Только какое заклинание для нас наиболее удобно мы пока не знаем, поэтому мы будем рассматривать разные варианты.

Игровой персонаж будет указывать взглядом на центральный блок относительно которого заклинание будет ломать и все остальные блоки. Что бы знать какие блоки заклинание должно сломать нам нужен будет список векторов, составленных относительно центрального блока. Тогда первоначальный прототип заклинания будет выглядеть как-то так:

-17

Если вы не против записать список векторов вручную, то это заклинание уже готово к использованию. И часто этот метод вполне себе применим, если к примеру вместо того, что бы ломать блоки нам наоборот нужно что-то построить. Подобную ситуация уже мною рассматривалась в заклинании, которое создавало портал в Незер. Но таким можно строить например и пирамиды, для маяков примерно таким заклинанием:

-18

Железные блоки для пирамиды при этом будут браться прямиком из подпространственного хранилища. Да и заклинание для морского маяка будет аналогичным. Создание списка векторов для подобных конструкций можете посмотреть в разделе "Карманный портал в Незер", здесь я подробно на этом останавливаться не буду. Так же должен вас предупредить, что создавать подобные списки стоит относительно центра симметрии конструкции, которую собираетесь строить заклинанием. В случае пирамиды, когда нет центра симметрии, начало отсчета стоит расположить где то на оси симметрии, например на вершине пирамиды.

Вернемся к нашему буру. Если мы не хотим вручную записывать каждый вектор, то нужно что бы этот список за нас составляло само заклинание. Тут есть разные подходы, и что бы их рассмотреть в качестве примера для начала возьмем квадрат 3 на 3. Список векторов для такого бура будет следующий:

-19

Заметим, что такой бур не симметричен во всех направлениях. с такими координатами наш бур будет нормально работать только в доль оси Z. В будущем придется добавить в заклинание поворот бура вдоль осей X и Y.

А сейчас давайте рассмотрим несколько способов создать такой список. Можно конечно просто рунами записать эти вектора:

-20

Только если с 9 векторами это не особо сложно сделать, но скажем для бура 3х3х3 нужно будет записать уже 27 векторов, что значительно сложнее.

Второй способ вот такой:

-21

Тут с масштабированием чуть получше, но не на много.

Третий способ вот такой:

-22

Тут с масштабированием все замечательно, можно делать бур хоть 5 на 5, хоть 9 на 9 на 9. Единственная проблема невооруженным взглядом непонятно что тут происходит. Поэтому мы остановимся именно на нем, и будем разбираться как тут что работает.

Но нам нужно не только список из векторов собрать, но и сделать так что бы заклинание правильно работало во всех направлениях. Обратите внимание на список векторов. Координата Z во всех векторах равна 0, и как я уже сказал выше, наш бур пока работает правильно именно вдоль оси Z. Получается, что бы развернуть бур вдоль оси Х нужно координату Z поменять с Х. Ну а если мы поменяем Z с Y, то бур будет работать корректно уже вдоль оси Y. Как это сделать?

Помните вот эту руну:

-23

Мы всегда можем разделить вектор на 3 числа поменять какие-то из них местами, а затем собрать эти числа снова в вектор. В заклинании это будет выглядеть примерно так:

-24

Осталось сделать так, что бы цифра для перестановки выбиралась автоматически в зависимости от того в какую сторону направлен взгляд игрового персонажа.

Можно конечно создать по условию на каждое направление например так:

-25

Но потом нам еще и цифру выбирать надо будет в зависимости от условия. Из-за этого заклинание значительно увеличится в размерах.

Предлагаю вообще обойтись без всяких условий, а сразу определять цифру. Предположим у нас есть 3 цифры для перестановки на каждую из осей X, Y и Z, пусть это будет 0, 2 и 5. Предупреждаю, конкретно эти цифры сейчас я выбрал рандомно. Давайте объединим их в вектор (0; 2; 5). Теперь если мы скалярно умножим этот вектор с единичным вектором направления взгляда, пусть это будет (0; -1; 0), то в данном случае получим -2. Осталось взять модуль от этого числа и у нас в руках нужная перестановка.

-26

Вернемся к созданию списка векторов. Начнем с того, что мы хотим три какие-то числа объединить в вектор:

-27

На место каждого из чисел нам надо подставлять -1, 0 или 1. Давайте эти три числа объединим в список и сохраним в памяти, а потом при необходимости будем брать этот список из памяти:

-28

Теперь давайте составим цикл для начала только с третьим числом:

-29

Думаю тут пока все просто, только в конце не забываем удалить два нуля которые стояли в самом начале, ведь они сами собой никуда не исчезнут, а в дальнейшем будут мешать.

Теперь давайте к тому, что получилось добавим цикл для второго числа:

-30

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

В результате у нас получатся как раз список с теми девятью векторами, которые нам нужны. Только здесь они составлены относительно направления по X а не Z.

Но мы ведь можем и для первой цифры добавить такой же цикл:

-31

В результате у нас уже получится 27 векторов в виде куба 3 на 3 на 3. Но самое интересное состоит в том, что просто изменив начальный список, который мы сохранили в память, мы сможем увеличить этот куб. Например если мы запомним вот такой список [-2; -1; 0; 1; 2], то в результате получим куб 5 на 5 на 5.

Так же туже руну ломания блоков мы можем теперь вставить после руны объединения цифр в вектор, правда там нужно будет сложить вектора прежде чем их ломать, но это тоже не проблема.

С помощью этого метода можно не только сделать бур но и заклинание которое строит перед вами стену из магических блоков. Давайте займемся этим заклинанием прямо сейчас, а к буру вернемся потом.

Будем строить стену на расстоянии 2 блоков от игрового персонажа, а значит на этом расстоянии нам нужно задать координаты блока в качестве точки отсчета. Для этого к вектору игрока нужно прибавить вектор направления взгляда длинной 2 блока:

-32

По умолчанию стена будет направлена вдоль оси X, а значит вектор с цифрами для перестановок должен быть таким: (0; 2; 5)

-33

Руна, которую я обвел овалом, это ноль от координаты X для векторов из списка. Так же обратите внимание на эту руну:

-34

Перед циклами остались йоты, поэтому и количество мусора который придется удалять возросло.

Так же советую рисовать заклинания для начала на этом сайте:

master-bw3.github.io

Там есть очень удобная полоса прокрутки:

-35

Используя ее вы сможете увидеть, что происходит у вас в стеке на каждом этапе, даже внутри цикла. Понимать, что находится у вас в стеке очень полезный навык для создания заклинаний подобной сложности.

В таком заклинании создания стены из магических блоков остается серьезный недостаток: если на месте появления блока есть помеха, то появится ошибка и дальнейшее выполнение заклинания прервется. Можно конечно перед установкой магического блока использовать руну, которая ломает блоки. Но мы пойдем другим путем, и для проверки наличия помехи будем использовать вот эту руну из Hexal:

-36

Давайте прикинем как будет выглядеть условие, для проверки наличия блока:

-37

В случае отсутствия блоков на указанных координатах руна сортировки отправить в стек "Воздух". В этом случае следующая за ней руна очищение Авгура выдаст False, в любом другом случае будет True. Поэтому когда будет False, заклинание должно устанавливать блок.

-38

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

Вернемся к созданию бура 3 на 3. Будем строить его вдоль оси Z и посмотрим что изменится. Во первых надо определить вектор с номерами для перестановок (5; 1; 0). Блок начала отсчета определяется просто направлением взгляда игрового персонажа:

-39

Тогда само заклинание бура будет таким:

-40

Обратите внимание куда переместился ноль для координаты Z. Как и в прошлый раз, его я обвел овалом.

На последок сделаем бур 5 на 5 на 5. Такой бур симметричен во всех направлениях, поэтому перестановки делать не надо, главное в качестве начала отсчета взять центральный болк:

-41

Тогда само заклинание будет таким:

-42

Давайте теперь попробуем вообще окружить игрового персонажа стенами 3 на 3 со всех сторон. За основу возьмем заклинание которое создает стену 3х3 с проверкой наличия препятствий. Координаты Y и Z будут сформированы комбинацией всех возможных вариантов цифр -1, 0 и 1. А на координату X будем подставлять -2 и 2. Добавим третий цикл с этими двумя цифрами. В результате получим координаты для формирования дувх стен 3х3 вдоль оси X. Осталось повторить то же самое для осей Y и Z. Для этого добавим еще один цикл в котором будут использоваться номера перестановки 0, 2 и 5.

-43

Обратите внимание, что список [0, 2, 5] я не могу запомнить в вороньем разуме, так как место там уже занято. Если формировать этот список прямо на месте применения, внутри других циклов, то заклинание будет формировать один и тот же список множество раз. Если вы стремитесь писать код правильно, то подобных желательно избегать. Поэтому я формирую этот список один раз в самом начале, а потом перекидываю его в нужное место с пятой позиции в стеке.

Куб

Следующая цель: нарисовать в воздухе прямоугольный параллелепипед произвольного размера:

-44

Для начала стоит определиться, как мы будем задавать размеры этой прямоугольной конструкции. В дальнейшем буду называть эту конструкцию просто кубом для простоты. Нам нужно задать длину вдоль координаты X, ширину - вдоль Z, и высоту - вдоль Y. А значить мы можем из этих трех чисел сформировать вектор, который будет совпадать с диагональю куба. Этот вектор просто сохраним в кулон:

-45

При необходимости просто будем доставать его от туда.

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

Если использовать размещение из комбинаторики цифр 1 и 0 по трем позициям и сформируем из этих троек вектора то получим:

-46

Это и будут координаты вершин единичного куба. С помощью рун сформировать подобный список основываясь на предыдущем опыте из этой статьи несложно:

-47

Терь каждую единичку в этом списке нужно домножить на длину, ширину или высоту соответственно. К сожалению подходящей руны в Hex Casting для этой задачи нет. Мы можем попытаться решить проблему с теми рунами, которые имеем, или можем поискать подходящую руну среди дополнений к Hex Casting. Рассмотрим оба варианта.

Если использовать руны только из Hex Casting, то на первый взгляд есть несколько подходов.

Во-первых, мы можем "расчленить" записанный вектор и единичный из списка на три числа. А потом перемножить соответствующие числа. Иксы с иксами, игреки с игреками и тп. Проблема в том, что у нас в общей сложности 6 цифр и перемножать надо будет первую цифру с четвертой, вторую с пятой, а третью с шестой. А это значит что эти пары нужно будет вытаскивать на верх стека, так как только там мы их можем перемножить.

Но при желании это можно сделать. Предположим у нас есть вектор (5, 6, 7) и какой-то произвольный единичный, тогда перемножить соответствующие координаты этих двух векторов мы можем например так:

-48

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

Можно еще попытаться добиться подобного результата с помощью скалярного или векторного умножения. Давайте попробуем.

Если поэкспериментировать со скалярным умножением, то мы можем получить нечто подобное:

-49

Но если взять единичный вектор с несколькими единицами, например (1, 0, 1) то скалярное произведение приемлемого результата не даст.

Давайте рассмотрим векторное произведение. Для начала давайте загуглим формулу векторного умножения:

-50

Возможно для вас будет более наглядным вот такой вариант:

-51

Возможно вам будет полезным иметь представление о векторном перемножении единичных векторов:

-52

Что бы уметь быстро находить результат без этой таблицы полезно помнить о таком треугольнике:

-53

Просто находите те вектора которые перемножаете в этом треугольнике, а результатом тогда будет третий вектор треугольника, только с неопределенным знаком. А что бы определить знак нужно определить движетесь вы по стрелочке или против нее. Например если первый множитель (1, 0, 0), а второй множитель будет находится против направления стрелочки относительно первого, то есть (0, 0, 1), то результатом будет (0, -1, 0).

И так чего же мы можем добиться с помощью векторного умножения?

-54

Забавно, что если объединить скалярное и векторное умножение, и использовав их в нужных ситуациях, то мы бы наверное даже могли бы добиться того результата, которого хотим, но для этого явно потребуется слишком сложная конструкция.

Отрицательный результат, тоже результат.))

А есть-ли подходящая руна среди многочисленных дополнений к Hex Casting?

Конечно есть:

-55

Эта руна из дополнения HexKinetics и в дальнейшем я буду использовать именно ее.

С координатами вершин куба разобрались. Подсвечивать их будем Вот этой руной из дополнения Hexal:

-56

Самое интересное в этой руне то, что если мы подадим на ее "вход" список векторов, то она соединит эти вектора линиями, а ведь это как раз то, что нам надо! Давайте незамедлительно это и попробуем.

-57

И в результате у нас получается... Вот это:

-58

Ну это и не удивительно, во первых вершины стоят в неправильном порядке, да и потом, каждая вершина должна повторяться раза по 2 минимум, что бы сформировать достаточно ребер.

Не знаю как вам, а мне в первую очередь хочется избавиться как минимум от центрального ребра кубоподобного многогранника. Для этого я разобью большой список, на два по меньше:

-59

Получится вот такое заклинание:

-60

И с помощь него мы получаем:

-61

Давайте попробуем выправить оставшиеся диагонали. Для этого поменяем в списках пару координат:

-62

В итоге получим такое заклинание:

-63

Это приводит нас к вот такому результату:

-64

Это уже больше похоже на куб, но все же нужно понять как из этого получить что-то похожее на объект кубической формы.

Куб можно поделить вот на такие части:

-65

Получается левую половину нам нужно перевернуть. Поэтому для левого куска мы будем менять первые два вектора местами (это 6 перестановка), а для правой - последние два вектора (1 перестановка). А различать левый и правый кусок мы будем с помощью координаты X:

-66

Получится следующее:

-67

Остается добавить передний и задний части куба. Для этого давайте развернем конструкцию на -90°, а потом сдвинем по иксу на +1.

-68

Если загуглить как сделать угловой поворот для вектора, то скорее всего наткнемся на матрицы поворота:

-69

Выбираем матрицу для вращения вокруг оси Y, и подставляем вместо альфа -90°, тогда:

-70

А если добавить еще и сдвиг по X на +1, тогда:

-71

Получается в координате Z нам надо поменять знак, прибавить 1, а потом Х и Z поменять местами:

-72

Проверим правильно ли это работает в формировании списков:

-73

Теперь попробуем сформировать итоговое заклинание:

-74

При попытке его скастовать выскакивает ошибку. Ищем руну, которая указана в ошибке:

-75

И посмотрим заодно, что остается в стеке после ошибки:

-76

После этих действий мне становится очевидно, что я где-то забыл мусор удалить. На месте вопросительного знака не хватает этой руны:

-77

Исправляем, проверяем... Опять ошибка. Алгоритм тот же: ищем руну, которая указана в ошибке.

-78

Проверяем, что остается в стеке после ошибки:

-79

Ошибка из-за 12 перестановки... А зачем я ее вообще добавил?.. Убираем нафиг, и о чудо, все работает как надо.

-80

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

Можно список вершин разбить на четыре списка по два вектора в каждом:

-81

Соберем это в полноценное заклинание:

-82

И посмотрим как оно будет работать:

-83

Ребра вдоль оси Z уже есть, теперь надо добавить ребра вдоль X и Y. Для этого добавим еще один цикл с перестановками [0, 1, 5].

-84

Итоговое заклинание в этом случае получается покороче:

-85

Проверяем что получилось:

-86

Это заклинание намного короче, а делает то же самое. Так зачем же я добавил тупиковые и более сложные пути? На самом деле хотелось познакомить вас с матрицами поворота и тому подобным. А так же это довольно поучительная история, не делайте моих ошибок, старайтесь искать самый простой путь к цели, если таких путей несколько.

Четвертая часть: