package net.minecraft.data.info; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.nio.file.Path; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.data.PackOutput.Target; import net.minecraft.network.ProtocolInfo; import net.minecraft.network.protocol.configuration.ConfigurationProtocols; import net.minecraft.network.protocol.game.GameProtocols; import net.minecraft.network.protocol.handshake.HandshakeProtocols; import net.minecraft.network.protocol.login.LoginProtocols; import net.minecraft.network.protocol.status.StatusProtocols; public class PacketReport implements DataProvider { private final PackOutput output; public PacketReport(PackOutput output) { this.output = output; } @Override public CompletableFuture run(CachedOutput output) { Path path = this.output.getOutputFolder(Target.REPORTS).resolve("packets.json"); return DataProvider.saveStable(output, this.serializePackets(), path); } private JsonElement serializePackets() { JsonObject jsonObject = new JsonObject(); ((Map)Stream.of( HandshakeProtocols.SERVERBOUND_TEMPLATE, StatusProtocols.CLIENTBOUND_TEMPLATE, StatusProtocols.SERVERBOUND_TEMPLATE, LoginProtocols.CLIENTBOUND_TEMPLATE, LoginProtocols.SERVERBOUND_TEMPLATE, ConfigurationProtocols.CLIENTBOUND_TEMPLATE, ConfigurationProtocols.SERVERBOUND_TEMPLATE, GameProtocols.CLIENTBOUND_TEMPLATE, GameProtocols.SERVERBOUND_TEMPLATE ) .map(ProtocolInfo.DetailsProvider::details) .collect(Collectors.groupingBy(ProtocolInfo.Details::id))) .forEach((connectionProtocol, list) -> { JsonObject jsonObject2 = new JsonObject(); jsonObject.add(connectionProtocol.id(), jsonObject2); list.forEach(details -> { JsonObject jsonObject2x = new JsonObject(); jsonObject2.add(details.flow().id(), jsonObject2x); details.listPackets((packetType, i) -> { JsonObject jsonObject2xx = new JsonObject(); jsonObject2xx.addProperty("protocol_id", i); jsonObject2x.add(packetType.id().toString(), jsonObject2xx); }); }); }); return jsonObject; } @Override public String getName() { return "Packet Report"; } }