Bukkit 1.20.1 怪物头上显示血量插件
要在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 著作权归作者所有。请勿转载和采集!