minecraft-src/net/minecraft/client/renderer/debug/SupportBlockRenderer.java
2025-07-04 03:45:38 +03:00

102 lines
3.5 KiB
Java

package net.minecraft.client.renderer.debug;
import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.vertex.PoseStack;
import java.util.Collections;
import java.util.List;
import java.util.function.DoubleSupplier;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.Util;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.ShapeRenderer;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.shapes.CollisionContext;
@Environment(EnvType.CLIENT)
public class SupportBlockRenderer implements DebugRenderer.SimpleDebugRenderer {
private final Minecraft minecraft;
private double lastUpdateTime = Double.MIN_VALUE;
private List<Entity> surroundEntities = Collections.emptyList();
public SupportBlockRenderer(Minecraft minecraft) {
this.minecraft = minecraft;
}
@Override
public void render(PoseStack poseStack, MultiBufferSource bufferSource, double camX, double camY, double camZ) {
double d = Util.getNanos();
if (d - this.lastUpdateTime > 1.0E8) {
this.lastUpdateTime = d;
Entity entity = this.minecraft.gameRenderer.getMainCamera().getEntity();
this.surroundEntities = ImmutableList.copyOf(entity.level().getEntities(entity, entity.getBoundingBox().inflate(16.0)));
}
Player player = this.minecraft.player;
if (player != null && player.mainSupportingBlockPos.isPresent()) {
this.drawHighlights(poseStack, bufferSource, camX, camY, camZ, player, () -> 0.0, 1.0F, 0.0F, 0.0F);
}
for (Entity entity2 : this.surroundEntities) {
if (entity2 != player) {
this.drawHighlights(poseStack, bufferSource, camX, camY, camZ, entity2, () -> this.getBias(entity2), 0.0F, 1.0F, 0.0F);
}
}
}
private void drawHighlights(
PoseStack poseStack,
MultiBufferSource buffer,
double camX,
double camY,
double camZ,
Entity entity,
DoubleSupplier biasGetter,
float red,
float green,
float blue
) {
entity.mainSupportingBlockPos.ifPresent(blockPos -> {
double j = biasGetter.getAsDouble();
BlockPos blockPos2 = entity.getOnPos();
this.highlightPosition(blockPos2, poseStack, camX, camY, camZ, buffer, 0.02 + j, red, green, blue);
BlockPos blockPos3 = entity.getOnPosLegacy();
if (!blockPos3.equals(blockPos2)) {
this.highlightPosition(blockPos3, poseStack, camX, camY, camZ, buffer, 0.04 + j, 0.0F, 1.0F, 1.0F);
}
});
}
private double getBias(Entity entity) {
return 0.02 * (String.valueOf(entity.getId() + 0.132453657).hashCode() % 1000) / 1000.0;
}
private void highlightPosition(
BlockPos pos, PoseStack poseStack, double camX, double camY, double camZ, MultiBufferSource buffer, double bias, float red, float green, float blue
) {
double d = pos.getX() - camX - 2.0 * bias;
double e = pos.getY() - camY - 2.0 * bias;
double f = pos.getZ() - camZ - 2.0 * bias;
double g = d + 1.0 + 4.0 * bias;
double h = e + 1.0 + 4.0 * bias;
double i = f + 1.0 + 4.0 * bias;
ShapeRenderer.renderLineBox(poseStack, buffer.getBuffer(RenderType.lines()), d, e, f, g, h, i, red, green, blue, 0.4F);
DebugRenderer.renderVoxelShape(
poseStack,
buffer.getBuffer(RenderType.lines()),
this.minecraft.level.getBlockState(pos).getCollisionShape(this.minecraft.level, pos, CollisionContext.empty()).move(pos),
-camX,
-camY,
-camZ,
red,
green,
blue,
1.0F,
false
);
}
}