2025-11-24 22:52:51 +03:00

118 lines
5.2 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.google.common.collect.ImmutableMap
* com.google.common.collect.ImmutableMap$Builder
* org.jspecify.annotations.Nullable
*/
package net.minecraft.client.renderer.debug;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientChunkCache;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraft.client.renderer.debug.DebugRenderer;
import net.minecraft.client.server.IntegratedServer;
import net.minecraft.core.SectionPos;
import net.minecraft.gizmos.Gizmos;
import net.minecraft.gizmos.TextGizmo;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.Util;
import net.minecraft.util.debug.DebugValueAccess;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.phys.Vec3;
import org.jspecify.annotations.Nullable;
public class ChunkDebugRenderer
implements DebugRenderer.SimpleDebugRenderer {
private final Minecraft minecraft;
private double lastUpdateTime = Double.MIN_VALUE;
private final int radius = 12;
private @Nullable ChunkData data;
public ChunkDebugRenderer(Minecraft minecraft) {
this.minecraft = minecraft;
}
@Override
public void emitGizmos(double camX, double camY, double camZ, DebugValueAccess debugValues, Frustum frustum, float partialTicks) {
double time = Util.getNanos();
if (time - this.lastUpdateTime > 3.0E9) {
this.lastUpdateTime = time;
IntegratedServer server = this.minecraft.getSingleplayerServer();
this.data = server != null ? new ChunkData(this, server, camX, camZ) : null;
}
if (this.data != null) {
Map serverData = this.data.serverData.getNow(null);
double y = this.minecraft.gameRenderer.getMainCamera().position().y * 0.85;
for (Map.Entry<ChunkPos, String> entry : this.data.clientData.entrySet()) {
ChunkPos pos = entry.getKey();
Object value = entry.getValue();
if (serverData != null) {
value = (String)value + (String)serverData.get(pos);
}
String[] parts = ((String)value).split("\n");
int yOffset = 0;
for (String part : parts) {
Gizmos.billboardText(part, new Vec3(SectionPos.sectionToBlockCoord(pos.x, 8), y + (double)yOffset, SectionPos.sectionToBlockCoord(pos.z, 8)), TextGizmo.Style.whiteAndCentered().withScale(2.4f)).setAlwaysOnTop();
yOffset -= 2;
}
}
}
}
private final class ChunkData {
private final Map<ChunkPos, String> clientData;
private final CompletableFuture<Map<ChunkPos, String>> serverData;
private ChunkData(ChunkDebugRenderer chunkDebugRenderer, IntegratedServer server, double camX, double camZ) {
ClientLevel clientLevel = chunkDebugRenderer.minecraft.level;
ResourceKey<Level> dimension = clientLevel.dimension();
int cx = SectionPos.posToSectionCoord(camX);
int cz = SectionPos.posToSectionCoord(camZ);
ImmutableMap.Builder builder = ImmutableMap.builder();
ClientChunkCache clientChunkSource = clientLevel.getChunkSource();
for (int x = cx - 12; x <= cx + 12; ++x) {
for (int z = cz - 12; z <= cz + 12; ++z) {
ChunkPos pos = new ChunkPos(x, z);
Object result = "";
LevelChunk clientChunk = clientChunkSource.getChunk(x, z, false);
result = (String)result + "Client: ";
if (clientChunk == null) {
result = (String)result + "0n/a\n";
} else {
result = (String)result + (clientChunk.isEmpty() ? " E" : "");
result = (String)result + "\n";
}
builder.put((Object)pos, result);
}
}
this.clientData = builder.build();
this.serverData = server.submit(() -> {
ServerLevel serverLevel = server.getLevel(dimension);
if (serverLevel == null) {
return ImmutableMap.of();
}
ImmutableMap.Builder serverBuilder = ImmutableMap.builder();
ServerChunkCache serverChunkSource = serverLevel.getChunkSource();
for (int x = cx - 12; x <= cx + 12; ++x) {
for (int z = cz - 12; z <= cz + 12; ++z) {
ChunkPos pos = new ChunkPos(x, z);
serverBuilder.put((Object)pos, (Object)("Server: " + serverChunkSource.getChunkDebugData(pos)));
}
}
return serverBuilder.build();
});
}
}
}