minecraft-src/net/minecraft/client/renderer/debug/BreezeDebugRenderer.java
2025-07-04 02:00:41 +03:00

98 lines
4.6 KiB
Java

package net.minecraft.client.renderer.debug;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.network.protocol.common.custom.BreezeDebugPayload.BreezeInfo;
import net.minecraft.util.ARGB;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.joml.Matrix4f;
@Environment(EnvType.CLIENT)
public class BreezeDebugRenderer {
private static final int JUMP_TARGET_LINE_COLOR = ARGB.color(255, 255, 100, 255);
private static final int TARGET_LINE_COLOR = ARGB.color(255, 100, 255, 255);
private static final int INNER_CIRCLE_COLOR = ARGB.color(255, 0, 255, 0);
private static final int MIDDLE_CIRCLE_COLOR = ARGB.color(255, 255, 165, 0);
private static final int OUTER_CIRCLE_COLOR = ARGB.color(255, 255, 0, 0);
private static final int CIRCLE_VERTICES = 20;
private static final float SEGMENT_SIZE_RADIANS = (float) (Math.PI / 10);
private final Minecraft minecraft;
private final Map<Integer, BreezeInfo> perEntity = new HashMap();
public BreezeDebugRenderer(Minecraft minecraft) {
this.minecraft = minecraft;
}
public void render(PoseStack poseStack, MultiBufferSource buffer, double xOffset, double yOffset, double zOffset) {
LocalPlayer localPlayer = this.minecraft.player;
localPlayer.level()
.getEntities(EntityType.BREEZE, localPlayer.getBoundingBox().inflate(100.0), breeze -> true)
.forEach(
breeze -> {
Optional<BreezeInfo> optional = Optional.ofNullable((BreezeInfo)this.perEntity.get(breeze.getId()));
optional.map(BreezeInfo::attackTarget)
.map(integer -> localPlayer.level().getEntity(integer))
.map(entity -> entity.getPosition(this.minecraft.getDeltaTracker().getGameTimeDeltaPartialTick(true)))
.ifPresent(vec3 -> {
drawLine(poseStack, buffer, xOffset, yOffset, zOffset, breeze.position(), vec3, TARGET_LINE_COLOR);
Vec3 vec32 = vec3.add(0.0, 0.01F, 0.0);
drawCircle(poseStack.last().pose(), xOffset, yOffset, zOffset, buffer.getBuffer(RenderType.debugLineStrip(2.0)), vec32, 4.0F, INNER_CIRCLE_COLOR);
drawCircle(poseStack.last().pose(), xOffset, yOffset, zOffset, buffer.getBuffer(RenderType.debugLineStrip(2.0)), vec32, 8.0F, MIDDLE_CIRCLE_COLOR);
drawCircle(poseStack.last().pose(), xOffset, yOffset, zOffset, buffer.getBuffer(RenderType.debugLineStrip(2.0)), vec32, 24.0F, OUTER_CIRCLE_COLOR);
});
optional.map(BreezeInfo::jumpTarget)
.ifPresent(
blockPos -> {
drawLine(poseStack, buffer, xOffset, yOffset, zOffset, breeze.position(), blockPos.getCenter(), JUMP_TARGET_LINE_COLOR);
DebugRenderer.renderFilledBox(
poseStack, buffer, AABB.unitCubeFromLowerCorner(Vec3.atLowerCornerOf(blockPos)).move(-xOffset, -yOffset, -zOffset), 1.0F, 0.0F, 0.0F, 1.0F
);
}
);
}
);
}
private static void drawLine(
PoseStack poseStack, MultiBufferSource buffer, double xOffset, double yOffset, double zOffset, Vec3 fromPos, Vec3 toPos, int color
) {
VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.debugLineStrip(2.0));
vertexConsumer.addVertex(poseStack.last(), (float)(fromPos.x - xOffset), (float)(fromPos.y - yOffset), (float)(fromPos.z - zOffset)).setColor(color);
vertexConsumer.addVertex(poseStack.last(), (float)(toPos.x - xOffset), (float)(toPos.y - yOffset), (float)(toPos.z - zOffset)).setColor(color);
}
private static void drawCircle(Matrix4f pose, double xOffset, double yOffset, double zOffset, VertexConsumer consumer, Vec3 pos, float radius, int color) {
for (int i = 0; i < 20; i++) {
drawCircleVertex(i, pose, xOffset, yOffset, zOffset, consumer, pos, radius, color);
}
drawCircleVertex(0, pose, xOffset, yOffset, zOffset, consumer, pos, radius, color);
}
private static void drawCircleVertex(
int index, Matrix4f pose, double xOffset, double yOffset, double zOffset, VertexConsumer consumer, Vec3 circleCenter, float radius, int color
) {
float f = index * (float) (Math.PI / 10);
Vec3 vec3 = circleCenter.add(radius * Math.cos(f), 0.0, radius * Math.sin(f));
consumer.addVertex(pose, (float)(vec3.x - xOffset), (float)(vec3.y - yOffset), (float)(vec3.z - zOffset)).setColor(color);
}
public void clear() {
this.perEntity.clear();
}
public void add(BreezeInfo breeze) {
this.perEntity.put(breeze.id(), breeze);
}
}