要在Bukkit 1.20.1中实现怪物头上显示血量,你需要使用Bukkit的实体标签功能来实现。以下是一个示例代码:

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntitySpawnEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.*;

import java.util.HashMap;
import java.util.Map;

public class HealthBarPlugin extends JavaPlugin implements Listener {

    private Scoreboard scoreboard;
    private Map<Entity, Objective> entityObjectives;

    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
        scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
        entityObjectives = new HashMap<>();
    }

    @EventHandler
    public void onEntitySpawn(EntitySpawnEvent event) {
        // 创建一个新的目标对象
        Objective objective = scoreboard.registerNewObjective('healthbar', 'health');
        objective.setDisplaySlot(DisplaySlot.BELOW_NAME);
        objective.setDisplayName(ChatColor.RED + '❤');

        // 将目标对象与实体相关联
        Entity entity = event.getEntity();
        if (entity instanceof LivingEntity) {
            LivingEntity livingEntity = (LivingEntity) entity;
            entityObjectives.put(entity, objective);
            livingEntity.setHealth(livingEntity.getMaxHealth()); // 初始化血量
        }
    }

    @EventHandler
    public void onEntityDamage(EntityDamageByEntityEvent event) {
        Entity entity = event.getEntity();
        if (entity instanceof LivingEntity) {
            LivingEntity livingEntity = (LivingEntity) entity;
            Objective objective = entityObjectives.get(entity);
            if (objective != null) {
                Score score = objective.getScore(livingEntity.getName());
                score.setScore((int) livingEntity.getHealth());
            }
        }
    }

    @EventHandler
    public void onEntityDeath(EntityDeathEvent event) {
        Entity entity = event.getEntity();
        Objective objective = entityObjectives.get(entity);
        if (objective != null) {
            objective.unregister(); // 移除目标对象
            entityObjectives.remove(entity);
        }
    }

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        // 更新所有实体的血量显示
        for (Map.Entry<Entity, Objective> entry : entityObjectives.entrySet()) {
            Entity entity = entry.getKey();
            Objective objective = entry.getValue();
            if (entity.isValid()) {
                Score score = objective.getScore(entity.getName());
                score.setScore((int) ((LivingEntity) entity).getHealth());
            } else {
                objective.unregister(); // 移除无效的实体目标对象
                entityObjectives.remove(entity);
            }
        }
    }
}

这个插件会在怪物生成时创建一个新的Scoreboard目标对象,并将其与实体相关联。当怪物受到伤害时,会更新目标对象的分数来显示最新的血量。当怪物死亡时,会移除目标对象。当玩家加入游戏时,会更新所有实体的血量显示。

请注意,这只是一个简单的示例代码,可能需要根据你的具体需求进行修改和优化。


原文地址: https://www.cveoy.top/t/topic/fw2L 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录