В данной новости я вам подробно опишу в текстовом варианте и покажу в видео довольно хитрый механизм для расчета здоровья моба и. отображения его на ин- дикаторе. Добавление индикаторов здоровья .над мобами не требует никаких мо- дов и. плагинов, .всё работает на .довольно .небольшом. механизме .в .ванильном майнкрафте .с версии .1.9 .вплоть .до последней на .данный .момент версии .игры 1.12. ....................................................................................................................................
Автор формулы для рассчета - англоязычный ютубер .ReduxRedstone, .и она счи- тает и отображает. процент .здоровья .любого .моба, как заспауненного. игроком, так и созданного командой, включая мобов-боссов......................................................
Итак, вот так выглядит сама формула:
Ind=((PreH-DTake)*100)/MaxH
Теперь под спойлером я опишу весь .процесс создания механизма, обеспечиваю- щего условия для расчета здоровья по
где: PreH - previous health (предыдущее здоровье моба) DTake - Damage taken (полученный мобом урон) MaxH - maximum health (максимальное здоровье моба по умолчанию) ActH - actual health (фактическое здоровье моба, разность между предыдущим здоровьем моба до удара и полученным при ударе уроном)
Теперь для каждого значения в формуле нам нужно создать событие в системе счета игровых событий для того, чтобы при помощи скорборд определять эти значения в игре или начислять в эти значения очки.
1. Событие для значения фактического здоровья:
/scoreboard objectives add ActH dummy
2. Событие для предыдущего здоровья моба6
/scoreboard objectives add PreH dummy
3. Событие, определяющее наносимый игроком урон мобу:
/scoreboard objectives add DTake dummy
4. Событие для числа 100:
/scoreboard objectives add 100 dummy
5. Событие для максимального здоровья моба, которое у него может быть по умолчанию:
/scoreboard objectives add MaxH dummy
еще создадим событие, в котором игра будет считать урон, нанесенный игроком мобу. В этом событии критерий damageDealt сам будет считать наносимый игроком урон. Это значение и будет основополагающим для всех остальных расчетов в формуле.
6. /scoreboard objectives add Dp stat.damageDealt
и установим сразу же 100 очков для созданного события с именем 100 фиктивному игроку, которого также назовем цифрой 100
7. /scoreboard players set 100 100 100
Итак, все необходимые события для подсчета данных в формуле мы задали. Теперь организуем командами саму механику подсчета данных, чтобы игра их считала и выводила результат на индикатор
1. Добавим всем мобам в радиусе 20 блоков от игрока, которые получили урон тэг Indicator. Тэг этот будет придаваться мобам в момент, когда после получения ими урона пройдет 10 тактов, т.е полсекунды, ни раньше, ни позже. Это нужно для того, чтобы после получения урона мобам тэг придался только один раз, а не постоянно присуждался мобу с каждым игровым тактом.
2. Далее, относительно игрока, у которого в событии на нанесение урона минимум одно очко, т.е игрок нанес урон мобу ударом, мы командой мобу с тэгом Indicator, находящемуся в радиусе пяти блоков от игрока в событие, которое будет считать причиненный мобу урон прибавляем урон, нанесенный игроком. Т.е ударил игрок моба рукой нанеся ему 2 единицы урона, мобу установится в событие на получение урона 2 очка, либо игрок ударил моба мечом, нанеся ему 30 единиц урона, тогда мобу установится в событие на получение урона 30 единиц. Для чего нужна такая операция прибавления количества очков в событие на получение урона мобом DTake равному количетсву очков в событии нанесения урона игроком Dp? В скорборд нет критерия, который считал бы урон, получаемым мобами. А критерий, который считает нанесенный игроком урон есть. Поэтому мы этой операцией и устанавливаем в первое событие очки, полученные во втором событии, тем самым самостоятельно командой считаем урон, полученный мобом. Недостаток состоит в том, что в данном случае мобу в событие будут прибавляться лишь очки урона, полученные от игрока. Урон здоровью моба от падения, горения, стрелы и зелий прибавляться в событие не будет.
3. Далее нам нужно сразу сбросить очки урона игрока в событии на нанесение им урона мобу. Это нужно для того, чтобы количество его очков с каждым тактом дальше не прибавлялось мобу в событие урона. Т.е игрок нанес урон мобу ударом, количество нанесенного урона игроком прибавилось к урону моба один раз после удара. Очки нанесенного урона игроком сбросились, их больше нет и они больше не прибавляются с каждым игровым тактом в событие урона мобу. Если мы этого не сбросим очки, то нанесенный ударом игрока урон будет плюсоваться мобу каждый такт, даже если игрок его больше не трогает, так как вся наша схема подключена по цепи к генератору импульсов, который создает первый командный блок, находящийся в режиме повторения.
/scoreboard players reset @a[score_Dp_min=1] Dp
4. Следующей командой мы у мобов с тэгом Indicator удаляем этот тэг, чтобы у моба не было этого тэга. Так как он будет снова даваться после десяти тактов только мобу, получившему урон, и именно мобу с этим тэгом будет вновь прибавляться в событие очки урона, полученные от игрока.
/scoreboard players tag @e[tag=Indicator] remove Indicator
5. Теперь всем мобам в радиусе 20 блоков от игрока откроем счет в событиях на предыдущее и на максимальное здоровье моба. Счет мы устанавливаем затем, что нам нужны значения в этих событиях у мобов, чтобы подставлять их в формулу. Счет мы задаем путем прибавления всем мобам в радиусе 20 блоков от игрока по нулю очков в этих событиях. Это очень удобно. С одной стороны этими командами мы открываем счет мобам в этих событиях, а с другой стороны в последствии эти команды не будут влиять на изменения этих значений, так как прибавляют по нулю очков. И поэтому мы можем без последствий влиять на этот счет другими нужными командами и событиями.
6. Далее при помощи команды мы выполняем первое действие в формуле: вычитаем из предыдущего здоровья моба полученный им урон и получаем фактическое здоровье моба после удара по нему
8. Следующим действием мы всем мобам, у которых значение в событии PreH (предыдущее здоровье) более 1 добавляем тэг percent, чтобы последующие действия выполнялись только относительно мобов с таким тэгом
/scoreboard players tag @e[score_PreH_min=1,type=!Player] add percent
9. После этого мобам с этим тэгом устанавливаем очки в событии ActH (фактическое здоровье моба) равным количеству очков в событии PreH (предыдущее здоровье моба).
10. Тем самым появляется счет в событии ActH (фактическое здоровье моба) - этот счет в формуле является разностью между Pre (предыдущим здоровьем моба) и DTake (полученным уроном) и отражает фактическое здоровье моба ActH. Мы можем теперь этот счет использовать в дальнейших действиях в формуле. Умножаем теперь этот счет на счет фиктивного игрока под именем "100" в событии под названием "100". Ранее мы задали этому фиктивному игроку в этом событии счет равным 100. То есть фактически мы выполняем следующее действие в формуле и умножаем фактическое здоровье моба на 100
11. Далее у моба с тэгом percent делим фактическое здоровье, которое он имеет в данным момент на максимальное значение здоровье, которое у него было при спауне по умолчанию либо которое было задано при спауне командой.
12. И также следующей командой мы удаляем у моба с тэгом percent этот тэг
[b]/scoreboard players tag @e[tag=percent] remove percent
13. Мы выполнили все действия, чтобы формула работала и считала здоровье. Теперь нам нужно задать значения максимального здоровья Maxh и предыдущего здоровья моба до удара PreH. Для примера возьмем здоровье зомби - его здоровье равно 10 сердец, то есть 20 единиц. Так как формула учитывает здоровье до десятых долей, нужно умножить на 10 здоровье моба, то есть в формуле для этих событий мы зададим значение 200.
scoreboard players set @e[type=zombie,score_MaxH=0,score_MaxH_min=0] Maxh 200
scoreboard players set @e[type=zombie,score_PreH=0,score_PreH_min=0] PreH 200
Все значения в формуле заданы. Теперь нам нужно поставить цепочку из команд- ных блоков, которые. будут менять индикатор .здоровья над мобом в зависимости от процента. оставшегося. у .него .здоровья.. В случае. для .зомби .для .100 % здо- ровья - 20 единиц - мы установим ему индикатор из десяти квадратиков, . каждый командный блок будет менять индикатор здоровья при его уменьшении на 5 %......
Для разных мобов можно устанавливать разные индикаторы .и назначать каждому квадратику в индикаторе разный процент здоровья. Мы, из примера выше, задава- ли одному. квадратику на индикаторе. 5 % здоровья. .Курице, например, с ее 4-мя единицами здоровья можно сделать. индикатор из четырех квадратиков и для каж- дого квадратика установить значение в 25 % здоровья. .Так можно создавать и мо- бов-боссов, устанавливая им при спауне. нужное здоровье. и, .соответственно, де- лая разным его индикатор.................................................................................................
Для всех, кто хочет лучше. во всем разобраться и. использовать это в .любых своих мирах и картах,. я сделал подробный. видеотуториал, а .также сохранил .структуру всего механизма из видео в файл-структуру, который вы можете загрузить в любом из своих миров.. Ну и оставляю ссылку на канал .англоязычного ютубера,. который придумал эту замечательную формулу.............................................................................