public void updateActionBar(Player player) {
        new BukkitRunnable() {
            @Override
            public void run() {
                if (!player.isOnline()) {
                    this.cancel();
                    return;
                }
                PlayerStats stats = PLmmorpgIFR.getScoreboard().playerStatsMap.get(player.getName());
                if (stats == null) {
                    this.cancel();
                    return;
                }
                StringBuilder actionBar = new StringBuilder();
                if (!skillModeActive.getOrDefault(player, false)) {
                    String health = getHealthInNumbers(player);
                    String healthMax = getMaxHealthInNumber(player);
                    String negativeSpaces = createNegativeSpaces(20 - health.length());
                    String downSpaces = createDownSpaces(1);
                    String actionBarMessage = downSpaces + negativeSpaces + health + " / " + healthMax + " ❤";
                    actionBar.append(actionBarMessage);
                } else {
                    String health = getHealthInNumbers(player);
                    String healthMax = getMaxHealthInNumber(player);
                    String negativeSpaces = createNegativeSpaces(20 - health.length());
                    String actionBarMessage = negativeSpaces + health + " / " + healthMax + " ❤";
                    actionBar.append(actionBarMessage);
                    String currentSelectedSkill = selectedSkillName.getOrDefault(player, "");
                    for (int i = 0; i < 8; i++) {
                        Skills skill = stats.getSkillAtSlot(i);
                        if (skill != null) {
                            long remainingCooldown = stats.getRemainingCooldown(skill);
                            ChatColor color = skill.getName().equals(currentSelectedSkill) ? ChatColor.YELLOW :
                                    (remainingCooldown > 0 ? ChatColor.RED : ChatColor.GREEN);
                            actionBar.append(color).append(skill.getName());
                            if (remainingCooldown > 0) {
                                actionBar.append("(").append(remainingCooldown / 1000).append("s)");
                            }
                            actionBar.append(" ");
                        } else {
                            actionBar.append(ChatColor.GRAY).append("- ");
                        }
                    }
                }
                player.sendActionBar(actionBar.toString());
            }
        }.runTaskTimer(PLmmorpgIFR.getInstance(), 0L, 1L);
    }

    private static String getHealthInNumbers(Player player) {
        double health = player.getHealth();
        return String.valueOf((int) health);
    }

    private static String getMaxHealthInNumber(Player player) {
        double healthMax = player.getMaxHealth();
        return String.valueOf((int) healthMax);
    }

    private static String createDownSpaces(int count) {
        return new String(new char[count]).replace('\0', '');
    }

    private static String createNegativeSpaces(int count) {
        return new String(new char[count]).replace('\0', '\uF805');
    }

переписать код, добавив Kyori API для изменения шрифта бара сердец, не затрагивая Negative Space