136 lines
4.3 KiB
Java
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();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|