package net.minecraft.client.renderer.debug; import com.google.common.collect.Maps; import com.google.common.collect.Ordering; import com.google.common.collect.Sets; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; 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.phys.AABB; @Environment(EnvType.CLIENT) public class NeighborsUpdateRenderer implements DebugRenderer.SimpleDebugRenderer { private final Minecraft minecraft; private final Map> lastUpdate = Maps.newTreeMap(Ordering.natural().reverse()); NeighborsUpdateRenderer(Minecraft minecraft) { this.minecraft = minecraft; } public void addUpdate(long gameTime, BlockPos pos) { Map map = (Map)this.lastUpdate.computeIfAbsent(gameTime, long_ -> Maps.newHashMap()); int i = (Integer)map.getOrDefault(pos, 0); map.put(pos, i + 1); } @Override public void render(PoseStack poseStack, MultiBufferSource bufferSource, double camX, double camY, double camZ) { long l = this.minecraft.level.getGameTime(); int i = 200; double d = 0.0025; Set set = Sets.newHashSet(); Map map = Maps.newHashMap(); VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.lines()); Iterator>> iterator = this.lastUpdate.entrySet().iterator(); while (iterator.hasNext()) { Entry> entry = (Entry>)iterator.next(); Long long_ = (Long)entry.getKey(); Map map2 = (Map)entry.getValue(); long m = l - long_; if (m > 200L) { iterator.remove(); } else { for (Entry entry2 : map2.entrySet()) { BlockPos blockPos = (BlockPos)entry2.getKey(); Integer integer = (Integer)entry2.getValue(); if (set.add(blockPos)) { AABB aABB = new AABB(BlockPos.ZERO).inflate(0.002).deflate(0.0025 * m).move(blockPos.getX(), blockPos.getY(), blockPos.getZ()).move(-camX, -camY, -camZ); ShapeRenderer.renderLineBox(poseStack, vertexConsumer, aABB.minX, aABB.minY, aABB.minZ, aABB.maxX, aABB.maxY, aABB.maxZ, 1.0F, 1.0F, 1.0F, 1.0F); map.put(blockPos, integer); } } } } for (Entry entry : map.entrySet()) { BlockPos blockPos2 = (BlockPos)entry.getKey(); Integer integer2 = (Integer)entry.getValue(); DebugRenderer.renderFloatingText(poseStack, bufferSource, String.valueOf(integer2), blockPos2.getX(), blockPos2.getY(), blockPos2.getZ(), -1); } } }