minecraft-src/net/minecraft/client/renderer/debug/ChunkDebugRenderer.java
2025-07-04 01:41:11 +03:00

136 lines
4.3 KiB
Java

package net.minecraft.client.renderer.debug;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
import com.mojang.blaze3d.vertex.PoseStack;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.CompletableFuture;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.Util;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientChunkCache;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.server.IntegratedServer;
import net.minecraft.core.SectionPos;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.chunk.LevelChunk;
import org.jetbrains.annotations.Nullable;
@Environment(EnvType.CLIENT)
public class ChunkDebugRenderer implements DebugRenderer.SimpleDebugRenderer {
final Minecraft minecraft;
private double lastUpdateTime = Double.MIN_VALUE;
private final int radius = 12;
@Nullable
private ChunkDebugRenderer.ChunkData data;
public ChunkDebugRenderer(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 > 3.0E9) {
this.lastUpdateTime = d;
IntegratedServer integratedServer = this.minecraft.getSingleplayerServer();
if (integratedServer != null) {
this.data = new ChunkDebugRenderer.ChunkData(integratedServer, camX, camZ);
} else {
this.data = null;
}
}
if (this.data != null) {
Map<ChunkPos, String> map = (Map<ChunkPos, String>)this.data.serverData.getNow(null);
double e = this.minecraft.gameRenderer.getMainCamera().getPosition().y * 0.85;
for (Entry<ChunkPos, String> entry : this.data.clientData.entrySet()) {
ChunkPos chunkPos = (ChunkPos)entry.getKey();
String string = (String)entry.getValue();
if (map != null) {
string = string + (String)map.get(chunkPos);
}
String[] strings = string.split("\n");
int i = 0;
for (String string2 : strings) {
DebugRenderer.renderFloatingText(
poseStack,
bufferSource,
string2,
SectionPos.sectionToBlockCoord(chunkPos.x, 8),
e + i,
SectionPos.sectionToBlockCoord(chunkPos.z, 8),
-1,
0.15F,
true,
0.0F,
true
);
i -= 2;
}
}
}
}
@Environment(EnvType.CLIENT)
final class ChunkData {
final Map<ChunkPos, String> clientData;
final CompletableFuture<Map<ChunkPos, String>> serverData;
ChunkData(final IntegratedServer integratedServer, final double x, final double z) {
ClientLevel clientLevel = ChunkDebugRenderer.this.minecraft.level;
ResourceKey<Level> resourceKey = clientLevel.dimension();
int i = SectionPos.posToSectionCoord(x);
int j = SectionPos.posToSectionCoord(z);
Builder<ChunkPos, String> builder = ImmutableMap.builder();
ClientChunkCache clientChunkCache = clientLevel.getChunkSource();
for (int k = i - 12; k <= i + 12; k++) {
for (int l = j - 12; l <= j + 12; l++) {
ChunkPos chunkPos = new ChunkPos(k, l);
String string = "";
LevelChunk levelChunk = clientChunkCache.getChunk(k, l, false);
string = string + "Client: ";
if (levelChunk == null) {
string = string + "0n/a\n";
} else {
string = string + (levelChunk.isEmpty() ? " E" : "");
string = string + "\n";
}
builder.put(chunkPos, string);
}
}
this.clientData = builder.build();
this.serverData = integratedServer.submit(() -> {
ServerLevel serverLevel = integratedServer.getLevel(resourceKey);
if (serverLevel == null) {
return ImmutableMap.of();
} else {
Builder<ChunkPos, String> builderx = ImmutableMap.builder();
ServerChunkCache serverChunkCache = serverLevel.getChunkSource();
for (int kx = i - 12; kx <= i + 12; kx++) {
for (int lx = j - 12; lx <= j + 12; lx++) {
ChunkPos chunkPosx = new ChunkPos(kx, lx);
builderx.put(chunkPosx, "Server: " + serverChunkCache.getChunkDebugData(chunkPosx));
}
}
return builderx.build();
}
});
}
}
}