nageyqma·git
HTTPS https://git.nageyqma.icu/nageyqma/blade-addons-next.git SSH git@git.nageyqma.icu:nageyqma/blade-addons-next.git

HTTPS 链接可直接 git clone;推送代码请使用 SSH。

3.4 KB · 90 行raw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
package blade.addon.features.highlight;

import blade.addon.features.dungeon.HidePlayers;
import blade.addon.utils.Constants;
import blade.addon.utils.Location;
import blade.addon.utils.config.values.Dungeons;
import blade.addon.utils.data.EntityUtil;
import blade.addon.utils.dungeon.DungeonClass;
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.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;

import java.util.concurrent.ConcurrentLinkedQueue;

public class TeammateHighlight {

    private static final ConcurrentLinkedQueue<Player> teammates = new ConcurrentLinkedQueue<>();

    public static void init() {

        Events.ON_ENTITY_TRACKED.register((entity, world) -> {
            if (!Location.inDungeon()) return false;
            if (entity instanceof Player player) {
                if (EntityUtil.isARealPlayer(player) && !EntityUtil.isClientPlayer(player) && !teammates.contains(player)) {
                    teammates.add(player);
                }
            }
            return false;
        });

        Events.ON_LOCATION_CHANGE.register(location -> {
            teammates.clear();
            return false;
        });

        ClientTickEvents.END_CLIENT_TICK.register(client -> teammates.removeIf(Entity::isRemoved));

        RenderingEvents.LINE_NO_DEPTH.register(TeammateHighlight::renderOutline);
        RenderingEvents.TEXT.register(TeammateHighlight::renderText);
    }

    private static boolean shouldRender(Player player) {
        if (Dungeons.dontHighlightHiddenTeammates && HidePlayers.shouldHidePlayers(player)) return false;
        if (Dungeons.dontHighlightVisibleTeammates && !HidePlayers.shouldHidePlayers(player)) return false;
        return true;
    }

    private static void renderOutline(LevelRenderContext context, PoseStack matrixStack, VertexConsumer consumer) {
        if (!Dungeons.highlightTeammates) return;

        teammates.forEach(player -> {
            if (!shouldRender(player)) return;
            DungeonClass clazz = DungeonClass.getClass(player);
            if (clazz == null) return;

            int color = DungeonClass.getColor(clazz);

            float[] rgba = RenderUtils.toFloats(color);
            RenderUtils.renderOutlinedBox(matrixStack, consumer, EntityUtil.getBox(player), rgba);

        });
    }

    private static void renderText(LevelRenderContext context, PoseStack matrixStack, VertexConsumer consumer) {
        if (!Dungeons.renderClassName) return;

        teammates.forEach(player -> {
            if (!shouldRender(player)) return;
            DungeonClass clazz = DungeonClass.getClass(player);
            if (clazz == null) return;

            int color = DungeonClass.getColor(clazz);

            Component text = Component.literal(player.getName().getString()).withColor(color).append(Component.literal(" [" + DungeonClass.getChar(clazz) + "]").withColor(Constants.YELLOW));
            Vec3 pos = EntityUtil.getLerpedPos(player);
            RenderUtils.renderText(context, matrixStack, text, pos.x(), pos.y() + 2.75, pos.z(), 2);

        });
    }

}