[Гайд] Команда /scoreboard [1/2]
Итак, давайте попробуем определиться с тем, для чего нужна эта замечательная команда. Упрощённое определение находится ниже.
Сегодня мы разберём подкоманду objectives. Она нужна для сбора игровой статистики. Это значит, что те, или иные действия в игре будут суммироваться и записываться в наш счёт.
Итак, давайте создадим нашу первую статистику:
/scoreboard objectives add <названиеСтатистики> <критерийСтатистики>[отображаемоеИмяСтатистики]
Обязательные и дополнительные параметры:
Просмотреть все имеющиеся в системе счета:
/scoreboard objectives list
Удалить статистику:
/scoreboard objectives remove
Сейчас мы разобрали самые простые команды, которые потребуются нам в первую очередь. Теперь давайте попробуем вручную изменить значение созданного ранее счёта:
/scoreboard players set <Игрок>
Добавить определённое количество очков в статистику:
/scoreboard players add <Игрок>
Удалить определённое количество очков из статистики:
/scoreboard players remove <Игрок>
Полностью сбросить значения всех счетов игрока:
/scoreboard players reset
Теперь давайте попробуем вывести значения переменных на экран. Например, для создания PvP арены или похожих механизмов:
/scoreboard objectives setdisplay <Место/Слот>[названиеСтатистики]
Теперь давайте рассмотрим те самые критерии для статистик. Они разобраны ниже.
Значения статистик также могут быть проверены командой /testfor с помощью параметров score_<названиеСтатистики>=X и score_<названиеСтатистики>_min=X. Сами параметры разобраны ниже.
Итак, вот так выглядит сама формула:
формула для расчета здоровья мобов
Теперь для каждого значения в формуле нам нужно создать событие в системе счета игровых событий для того, чтобы при помощи скорборд определять эти значения в игре или начислять в эти значения очки.
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
Итак, все необходимые события для подсчета данных в формуле мы задали. Теперь организуем командами саму механику подсчета данных, чтобы игра их считала и выводила результат на индикатор
/scoreboard players tag @e[type=!Player,r=20] add Indicator
/scoreboard players operation @e[tag=Indicator,r=5] DTake += @p Dp
3. Далее нам нужно сразу сбросить очки урона игрока в событии на нанесение им урона мобу. Это нужно для того, чтобы количество его очков с каждым тактом дальше не прибавлялось мобу в событие урона. Т.е игрок нанес урон мобу ударом, количество нанесенного урона игроком прибавилось к урону моба один раз после удара. Очки нанесенного урона игроком сбросились, их больше нет и они больше не прибавляются с каждым игровым тактом в событие урона мобу. Если мы этого не сбросим очки, то нанесенный ударом игрока урон будет плюсоваться мобу каждый такт, даже если игрок его больше не трогает, так как вся наша схема подключена по цепи к генератору импульсов, который создает первый командный блок, находящийся в режиме повторения.
/scoreboard players reset @a[score_Dp_min=1] Dp
4. Следующей командой мы у мобов с тэгом Indicator удаляем этот тэг, чтобы у моба не было этого тэга. Так как он будет снова даваться после десяти тактов только мобу, получившему урон, и именно мобу с этим тэгом будет вновь прибавляться в событие очки урона, полученные от игрока.
/scoreboard players tag @e[tag=Indicator] remove Indicator
5. Теперь всем мобам в радиусе 20 блоков от игрока откроем счет в событиях на предыдущее и на максимальное здоровье моба. Счет мы устанавливаем затем, что нам нужны значения в этих событиях у мобов, чтобы подставлять их в формулу. Счет мы задаем путем прибавления всем мобам в радиусе 20 блоков от игрока по нулю очков в этих событиях. Это очень удобно. С одной стороны этими командами мы открываем счет мобам в этих событиях, а с другой стороны в последствии эти команды не будут влиять на изменения этих значений, так как прибавляют по нулю очков. И поэтому мы можем без последствий влиять на этот счет другими нужными командами и событиями.
/scoreboard players add @e[type=!Player,r=20] PreH 0
/scoreboard players add @e[type=!Player,r=20] MaxH 0
6. Далее при помощи команды мы выполняем первое действие в формуле: вычитаем из предыдущего здоровья моба полученный им урон и получаем фактическое здоровье моба после удара по нему
7. Далее сразу сбрасываем значение полученного мобом урона, чтобы оно постоянно не вычиталось из предыдущего здоровья моба PreH
/scoreboard players reset @e[score_DTake_min=1,type=!Player] DTake
/scoreboard players tag @e[score_PreH_min=1,type=!Player] add percent
9. После этого мобам с этим тэгом устанавливаем очки в событии ActH (фактическое здоровье моба) равным количеству очков в событии PreH (предыдущее здоровье моба).
/scoreboard players operation @e[r=0,c=1,type=!Player] ActH = @e[r=0,c=1,type=!Player] PreH
/scoreboard players operation @e[r=0,c=1,type=!Player] ActH *= 100 100
11. Далее у моба с тэгом percent делим фактическое здоровье, которое он имеет в данным момент на максимальное значение здоровье, которое у него было при спауне по умолчанию либо которое было задано при спауне командой.
/scoreboard players operation @e[r=0,c=1,type=!Player] ActH /= @e[r=0,c=1,type=!Player] MaxH
12. И также следующей командой мы удаляем у моба с тэгом percent этот тэг
[b]/scoreboard players tag @e[tag=percent] remove percent
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


