Окей, давайте подумаем где хп может находиться. Для начала нужно найти его в самой игре. Заходим и видим что оно прямо перед носом:
Посмотреть вложение 269806
Теперь давайте подумаем как оно может рендерится?
1. Это может быть ArmorStand который телепортируется каждый раз когда игрок двигается
2. Это objective в scoreboard
Что ты нахрен несёшь? Скорборд это же табличка справа.
Объясню: у скорборда есть 3 типа отображения: list, sidebar (табличка справа), belowName (под ником игрока).
У большинства может появиться вопрос, откуда это всё? Метод getObjectiveDisplaySlot в классе net.minecraft.scoreboard.Scoreboard:
Посмотреть вложение 269807
Посмотреть вложение 269808
Окей, давайте проверять первый способ. Для каждой сущности (entity) есть свой класс рендера. Обычно, такие классы имеют название НазваниеСущности+"Renderer". Мы проверяем ArmorStand, поэтому ищем (Ctrl + Shift + N) класс с названием ArmorStandRenderer:
Неужели он есть, вот это я маг (нет)
Смотрим какие методы в нём есть и натыкаемся на метод canRenderName. Он возвращает true когда armorstand имеет customname. Хм, ну давайте заменим его тело на return false:
Применяем изменения (перезапуском клиента или hotswap'ом) и смотрим:
Над кейсами пропали надписи, а у игроков они остались. => делаем вывод, что это не armorstand.
Проверяем 2 догадку про scoreboard. Давайте получим scoreboard, если вы не знаете как то попробуйте перенести свои мысли на английский язык.
я хочу "получить scoreboard" -> "get scoreboard" -> "getScoreboard()". Ищем (Ctrl + Shift + F):
Так, получается, что мы может получить scoreboard имея world, а world можно получить из mc, который у нас есть. Окей, получили scoreboard, давайте посмотрим какие методы в нём есть и натыкаемся на getObjectivesForEntity (получи objectives для сущности (не знаю как правильнее перевести)).
Окей, пробуем. getObjectivesForEntity возвращает Map<ScoreObjective, Score>. Давайте перечислим их:
Теперь у нас есть два экземпляра: ScoreObjective и Score. Давайте посмотрим, что у них есть. Так, видим что у ScoreObjective есть getDisplayName(), а у Score есть getScorePoints(). Давайте выведим их:
Я так понимаю у большинства людей хп игрока используется очень много где (не только в таргетхуде), поэтому давайте менять переменную health у нашего target. Добавляйте это куда хотите, лично я добавлю это в килку:
if (target != тгдд) {
for (Map.Entry<ScoreObjective, Score> entry : mc.world.getScoreboard().getObjectivesForEntity(target.getName().getString()).entrySet()) {
ScoreObjective objective = entry.getKey();
Score score = entry.getValue();
target.setHealth(score.getScorePoints());
}
}
В этой базе у меня нету таргет худа, поэтому я просто отрисую хп текстом: