HTTPS
https://git.nageyqma.icu/nageyqma/blade-addons-next.git
SSH
git@git.nageyqma.icu:nageyqma/blade-addons-next.git
HTTPS 链接可直接 git clone;推送代码请使用 SSH。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
package blade.addon.features.dungeon.f7.dragons;
import blade.addon.utils.Constants;
import blade.addon.utils.Location;
import blade.addon.utils.config.values.Floor7;
import blade.addon.utils.data.EntityUtil;
import blade.addon.utils.events.Events;
import blade.addon.utils.rendering.RenderUtils;
import blade.addon.utils.rendering.RenderingEvents;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderContext;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
import net.minecraft.world.phys.Vec3;
import java.util.concurrent.ConcurrentLinkedQueue;
public class DragonHealth {
static class DataHolder {
EnderDragon dragon;
float health;
public DataHolder(EnderDragon dragon, float health) {
this.dragon = dragon;
this.health = health;
}
}
static final ConcurrentLinkedQueue<DataHolder> dragons = new ConcurrentLinkedQueue<>();
public static void init() {
Events.ON_ENTITY_SPAWNED.register((entity, world) -> {
if (!Location.inDungeon()) return false;
if (entity instanceof EnderDragon dragon) {
dragons.add(new DataHolder(dragon, dragon.getHealth()));
}
return false;
});
ClientTickEvents.END_LEVEL_TICK.register(world -> dragons.removeIf(dataHolder -> dataHolder.dragon.isRemoved()));
RenderingEvents.FILLED.register(DragonHealth::render);
Events.ON_LOCATION_CHANGE.register(newLocation -> {
reset();
return false;
});
}
private static void reset() {
dragons.clear();
}
private static int getColor(float health) {
if (health >= 7.5e8) return Constants.GREEN;
if (health >= 5e8) return Constants.YELLOW;
if (health >= 2.5e8) return Constants.GOLD;
return Constants.RED;
}
private static void render(LevelRenderContext context, PoseStack matrixStack, VertexConsumer consumer) {
if (!Floor7.dragonHealth) return;
dragons.forEach(dataHolder -> {
EnderDragon dragon = dataHolder.dragon;
float currHealth = dragon.getHealth();
if (currHealth != 1024.0f) {
dataHolder.health = currHealth;
}
float health = dataHolder.health;
if (health == 0) return;
Vec3 pos = EntityUtil.getLerpedPos(dragon);
RenderUtils.renderText(context, matrixStack, Component.literal(RenderUtils.formatNumber(health)).withColor(getColor(health)), pos, 5);
});
}
}