DumpUtil class

Пакет: com.hypixel.hytale.server.core.util

Файл: com/hypixel/hytale/server/core/util/DumpUtil.java

Поля (141)

МодификаторыТипИмя
long maxx
Map var0
ConcurrentHashMap var0
ConcurrentHashMap var0
BsonDocument var1
Collection var1
Collection var1
int var1
Universe var1
HytaleServer var1
List var1
List var1
HytaleServerConfig var1
RuntimeMXBean var1
MemoryMXBean var1
SecurityManager var1
ClassLoadingMXBean var1
ClassLoader var1
ClassLoader var1
var1
Path var10
long var10
PacketHandler.PingInfo var10
StackTraceElement[] var10
ISystem var10
long var11
long var11
HistoricMetric var11
HistoricMetric var11
DumpUtil.PlayerTextData var12
long var12
long[] var12
long var13
String var13
double var14
long var14
long var14
String var15
String var16
long var16
long var16
String var16
String var17
PacketHandler.PingInfo var17
StackTraceElement[] var17
double var17
long var18
long var19
long var19
BsonDocument var2
CompletableFuture[] var2
CompletableFuture[] var2
Path var2
Path var2
int var2
ShutdownReason var2
BsonDocument var2
OperatingSystemMXBean var2
PacketHandler.PingInfo var20
long[] var20
HistoricMetric var21
long[] var21
StringBuilder var21
long var21
long var22
StringBuilder var22
double var22
long var23
var23
long[] var23
long var24
long[] var24
StringBuilder var25
long[] var27
long[] var28
String var29
BsonArray var3
FileOutputStream var3
var3
String var3
long var3
long var3
Map var3
long var3
StringBuilder var30
int var32
long var33
long var35
PacketStatsRecorder.PacketStatsEntry var38
PacketStatsRecorder.RecentStats var39
Object var4
var4
var4
var4
Path var4
var4
HistoricMetric var4
boolean var4
Long2ObjectMap var4
WorldGenTimingsCollector var42
PacketStatsRecorder var46
int var49
Store var5
int var5
long[] var5
Map var5
long var5
long var51
long var54
HistoricMetric var55
long[] var56
long var57
long var59
var59
BsonDocument var6
MovementStatesComponent var6
int var6
BsonDocument var6
Map var6
ThreadMXBean var6
int var61
long var62
long var64
PacketStatsRecorder.PacketStatsEntry var65
PacketStatsRecorder.RecentStats var66
long var67
long var68
BsonDocument var7
MovementManager var7
long var7
List var7
ThreadInfo[] var7
ComponentRegistry.Data var7
BsonArray var8
CameraManager var8
long var8
HistoricMetric var8
HistoricMetric[] var8
double var9
long[] var9
Thread var9

Методы (41)

МодификаторыВозвратСигнатура
public record PlayerTextDatarecord PlayerTextData(@Nonnull UUID uuid, @Nullable String movementStates, @Nullable String movementManager, @Nullable String cameraManager)
for for(ClassTransformer var3 : var1)
for for(PluginBase var3 : var1)
for for(int var10 = 0; var10 < var9.length; var10++)
for for(int var58 = 0; var58 < var56.length; var58++)
for for(int var26 = 0; var26 < 512; var26++)
for for(int var37 = 0; var37 < 512; var37++)
for for(PlayerRef var9 : var7)
for for(ThreadInfo var8 : var7)
for for(StackTraceElement var14 : var10)
for for(StackTraceElement var21 : var17)
for for(int var13 = 0; var13 < var12.length; var13++)
abstract for for(int var9 = 0; var9 < var7.getSystemSize()
if if(var7 != null)
if if(var4 != null)
if if(var1)
if if(var3 != null)
if if(var2 != null)
if if(var46 != null)
if if(var61 > 0)
if if(var32 > 0)
if if(var42 != null)
if if(var2 instanceof com.sun.management.OperatingSystemMXBean var5)
if if(var9 == null)
if if(var9 instanceof InitStackThread)
if if(var1 != null)
if if(var20 > 0)
if if(var6 > 0L)
if if(var18 > 0.0)
if if(var14 > 0L)
if if(var11 != null)
if if(var3 > 0L)
if if(var1 != null)
static void printComponentStorevoid printComponentStore(@Nonnull PrintWriter var0, int var1, int var2, String var3, long var4, @Nonnull Store<?> var6)
static void printIndentedvoid printIndented(@Nonnull PrintWriter var0, @Nonnull String var1, @Nonnull String var2)
static void printPacketStatsvoid printPacketStats(@Nonnull PrintWriter var0, @Nonnull String var1, @Nonnull String var2, int var3, long var4, long var6, long var8, long var10, long var12, long var14, double var16, double var18, int var20)
static void sectionvoid section(String var0, @Nonnull Runnable var1, @Nonnull PrintWriter var2)
static void writevoid write(@Nonnull PrintWriter var0)
static void writeClassLoadervoid writeClassLoader(@Nonnull PrintWriter var0, @Nullable ClassLoader var1)
abstract writeClassLoader writeClassLoader(var0, var1)
static void writeMemoryUsagevoid writeMemoryUsage(@Nonnull PrintWriter var0, String var1, @Nonnull MemoryUsage var2)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.util;

class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.common.util.FormatUtil;
class="kw">import com.hypixel.hytale.common.util.StringUtil;
class="kw">import com.hypixel.hytale.component.ComponentRegistry;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.metric.ArchetypeChunkData;
class="kw">import com.hypixel.hytale.component.system.ISystem;
class="kw">import com.hypixel.hytale.logger.backend.HytaleFileHandler;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.metrics.InitStackThread;
class="kw">import com.hypixel.hytale.metrics.MetricsRegistry;
class="kw">import com.hypixel.hytale.metrics.metric.HistoricMetric;
class="kw">import com.hypixel.hytale.plugin.early.ClassTransformer;
class="kw">import com.hypixel.hytale.plugin.early.EarlyPluginLoader;
class="kw">import com.hypixel.hytale.protocol.io.PacketStatsRecorder;
class="kw">import com.hypixel.hytale.protocol.packets.connection.PongType;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.HytaleServerConfig;
class="kw">import com.hypixel.hytale.server.core.ShutdownReason;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.CameraManager;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.movement.MovementManager;
class="kw">import com.hypixel.hytale.server.core.entity.movement.MovementStatesComponent;
class="kw">import com.hypixel.hytale.server.core.io.PacketHandler;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.PluginBase;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.WorldGenTimingsCollector;
class="kw">import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
class="kw">import java.io.BufferedWriter;
class="kw">import java.io.FileOutputStream;
class="kw">import java.io.IOException;
class="kw">import java.io.OutputStreamWriter;
class="kw">import java.io.PrintWriter;
class="kw">import java.lang.management.ClassLoadingMXBean;
class="kw">import java.lang.management.GarbageCollectorMXBean;
class="kw">import java.lang.management.ManagementFactory;
class="kw">import java.lang.management.MemoryMXBean;
class="kw">import java.lang.management.MemoryPoolMXBean;
class="kw">import java.lang.management.MemoryUsage;
class="kw">import java.lang.management.OperatingSystemMXBean;
class="kw">import java.lang.management.RuntimeMXBean;
class="kw">import java.lang.management.ThreadInfo;
class="kw">import java.lang.management.ThreadMXBean;
class="kw">import java.nio.charset.StandardCharsets;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.Paths;
class="kw">import java.time.Instant;
class="kw">import java.time.LocalDateTime;
class="kw">import java.time.ZoneId;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collection;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.CompletionException;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.concurrent.TimeoutException;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bouncycastle.util.io.TeeOutputStream;
class="kw">import org.bson.BsonArray;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonString;
class="kw">import org.bson.BsonValue;

class="kw">public class DumpUtil {
   class="kw">public DumpUtil() {
   }

   @Nonnull
   class="kw">public class="kw">static Path dumpToJson() class="kw">throws IOException {
      Map var0 = collectPlayerComponentMetrics();
      BsonDocument var1 = HytaleServer.METRICS_REGISTRY.dumpToBson(HytaleServer.get()).asDocument();
      BsonDocument var2 = Universe.METRICS_REGISTRY.dumpToBson(Universe.get()).asDocument();
      BsonArray var3 = new BsonArray();

      for (PlayerRef var5 : Universe.get().getPlayers()) {
         BsonDocument var6 = PlayerRef.METRICS_REGISTRY.dumpToBson(var5).asDocument();
         BsonDocument var7 = var0.get(var5.getUuid());
         if (var7 != null) {
            var6.putAll(var7);
         }

         var3.add(var6);
      }

      var2.put("Players", var3);
      var1.put("Universe", var2);
      BsonArray var8 = new BsonArray();

      for (ClassTransformer var11 : EarlyPluginLoader.getTransformers()) {
         var8.add(new BsonString(var11.getClass().getName()));
      }

      var1.put("EarlyPlugins", var8);
      Path var10 = MetricsRegistry.createDumpPath(".dump.json");
      Files.writeString(var10, BsonUtil.toJson(var1));
      class="kw">return var10;
   }

   @Nonnull
   class="kw">private class="kw">static Map<UUID, BsonDocument> collectPlayerComponentMetrics() {
      ConcurrentHashMap var0 = new ConcurrentHashMap<>();
      Collection var1 = Universe.get().getWorlds().values();
      CompletableFuture[] var2 = var1.stream().map(var1x -> CompletableFuture.runAsync(() -> {
         for (PlayerRef var3 : var1x.getPlayerRefs()) {
            BsonValue var4 = PlayerRef.COMPONENT_METRICS_REGISTRY.dumpToBson(var3);
            var0.put(var3.getUuid(), var4.asDocument());
         }
      }, var1x).orTimeout(30L, TimeUnit.SECONDS)).toArray(CompletableFuture[]::new);
      CompletableFuture.allOf(var2).join();
      class="kw">return var0;
   }

   @Nonnull
   class="kw">public class="kw">static Map<UUID, DumpUtil.PlayerTextData> collectPlayerTextData() {
      ConcurrentHashMap var0 = new ConcurrentHashMap<>();
      Collection var1 = Universe.get().getWorlds().values();
      CompletableFuture[] var2 = var1.stream()
         .map(
            var1x -> CompletableFuture.runAsync(
                  () -> {
                     for (PlayerRef var3 : var1x.getPlayerRefs()) {
                        Ref var4 = var3.getReference();
                        if (var4 != null) {
                           Store var5 = var4.getStore();
                           MovementStatesComponent var6 = var5.getComponent(var4, MovementStatesComponent.getComponentType());
                           MovementManager var7 = var5.getComponent(var4, MovementManager.getComponentType());
                           CameraManager var8 = var5.getComponent(var4, CameraManager.getComponentType());
                           var0.put(
                              var3.getUuid(),
                              new DumpUtil.PlayerTextData(
                                 var3.getUuid(),
                                 var6 != null ? var6.getMovementStates().toString() : null,
                                 var7 != null ? var7.toString() : null,
                                 var8 != null ? var8.toString() : null
                              )
                           );
                        }
                     }
                  },
                  var1x
               )
               .orTimeout(30L, TimeUnit.SECONDS)
         )
         .toArray(CompletableFuture[]::new);
      CompletableFuture.allOf(var2).join();
      class="kw">return var0;
   }

   @Nonnull
   class="kw">public class="kw">static Path dump(boolean var0, boolean var1) {
      Path var2 = createDumpPath(var0, "dump.txt");
      FileOutputStream var3 = null;

      Object var4;
      try {
         var3 = new FileOutputStream(var2.toFile());
         if (var1) {
            var4 = new TeeOutputStream(var3, System.err);
         } else {
            var4 = var3;
         }
      } catch (IOException var13) {
         var13.printStackTrace();
         System.err.println();
         System.err.println("FAILED TO GET OUTPUT STREAM FOR " + var2);
         System.err.println("FAILED TO GET OUTPUT STREAM FOR " + var2);
         System.err.println();
         var4 = System.err;
      }

      try {
         write(new PrintWriter(new BufferedWriter(new OutputStreamWriter(var4, StandardCharsets.UTF_8)), true));
      } class="kw">finally {
         if (var3 != null) {
            try {
               var3.close();
            } catch (IOException var12) {
            }
         }
      }

      class="kw">return var2;
   }

   @Nonnull
   class="kw">public class="kw">static Path createDumpPath(boolean var0, String var1) {
      Path var2 = Paths.get("dumps");

      try {
         if (!Files.exists(var2)) {
            Files.createDirectories(var2);
         }
      } catch (IOException var6) {
         var6.printStackTrace();
      }

      String var3 = (var0 ? "crash-" : "") + HytaleFileHandler.LOG_FILE_DATE_FORMAT.format(LocalDateTime.now(ZoneId.systemDefault()));
      Path var4 = var2.resolve(var3 + "." + var1);
      int var5 = 0;

      while (Files.exists(var4)) {
         var4 = var2.resolve(var3 + "_" + var5++ + "." + var1);
      }

      class="kw">return var4;
   }

   class="kw">private class="kw">static void write(@Nonnull PrintWriter var0) {
      int var1 = 200;
      int var2 = 20;
      long var3 = System.nanoTime();
      section(
         "Summary",
         () -> {
            Universe var1 = Universe.get();
            var0.println("World Count: " + var1.getWorlds().size());

            for (World var3 : var1.getWorlds().values()) {
               var0.println("- " + var3.getName());
               HistoricMetric var4 = var3.getBufferedTickLengthMetricSet();
               long[] var5 = var4.getPeriodsNanos();
               int var6 = var5.length - 1;
               long var7 = var5[var6];
               double var9 = var4.getAverage(var6);
               long var11 = var4.calculateMax(var6);
               long var13 = var4.calculateMin(var6);
               String var15 = FormatUtil.timeUnitToString(var7, TimeUnit.NANOSECONDS, true);
               String var16 = FormatUtil.simpleTimeUnitFormat(var13, var9, var11, TimeUnit.NANOSECONDS, TimeUnit.MILLISECONDS, 3);
               String var17 = FormatUtil.simpleTimeUnitFormat(var3.getTickStepNanos(), TimeUnit.NANOSECONDS, 3);
               var0.printf("\tTick (%s): %s (Limit: %s)\n", var15, var16, var17);
               var0.printf("\tPlayer count: %d\n", var3.getPlayerCount());
            }

            var0.println("Player count: " + var1.getPlayerCount());

            for (PlayerRef var19 : var1.getPlayers()) {
               var0.printf("- %s (%s)\n", var19.getUsername(), var19.getUuid());
               PacketHandler.PingInfo var20 = var19.getPacketHandler().getPingInfo(PongType.Raw);
               HistoricMetric var21 = var20.getPingMetricSet();
               long var22 = var21.calculateMin(1);
               long var8 = (long)var21.getAverage(1);
               long var10 = var21.calculateMax(1);
               var0.println(
                  "\tPing(raw) Min: "
                     + FormatUtil.timeUnitToString(var22, PacketHandler.PingInfo.TIME_UNIT)
                     + ", Avg: "
                     + FormatUtil.timeUnitToString(var8, PacketHandler.PingInfo.TIME_UNIT)
                     + ", Max: "
                     + FormatUtil.timeUnitToString(var10, PacketHandler.PingInfo.TIME_UNIT)
               );
            }
         },
         var0
      );
      section("Server Lifecycle", () -> {
         HytaleServer var1 = HytaleServer.get();
         var0.println("Boot Timestamp: " + var1.getBoot());
         var0.println("Boot Start (nanos): " + var1.getBootStart());
         var0.println("Booting: " + var1.isBooting());
         var0.println("Booted: " + var1.isBooted());
         var0.println("Shutting Down: " + var1.isShuttingDown());
         ShutdownReason var2 = var1.getShutdownReason();
         if (var2 != null) {
            var0.println("Shutdown Reason: " + var2);
         }
      }, var0);
      section("Early Plugins", () -> {
         List var1 = EarlyPluginLoader.getTransformers();
         var0.println("Class Transformer Count: " + var1.size());

         for (ClassTransformer var3 : var1) {
            var0.println("- " + var3.getClass().getName() + " (priority=" + var3.priority() + ")");
         }
      }, var0);
      section("Plugins", () -> {
         List var1 = HytaleServer.get().getPluginManager().getPlugins();
         var0.println("Plugin Count: " + var1.size());

         for (PluginBase var3 : var1) {
            boolean var4 = var3 class="kw">instanceof JavaPlugin var5 && var5.getClassLoader().isInServerClassPath();
            var0.println("- " + var3.getIdentifier() + (var4 ? " [Builtin]" : " [External]"));
            var0.println("\tType: " + var3.getType().getDisplayName());
            var0.println("\tState: " + var3.getState());
            var0.println("\tManifest:");
            BsonDocument var6 = PluginManifest.CODEC.encode(var3.getManifest()).asDocument();
            printIndented(var0, BsonUtil.toJson(var6), "\t\t");
         }
      }, var0);
      section("Server Config", () -> {
         HytaleServerConfig var1 = HytaleServer.get().getConfig();
         BsonDocument var2 = HytaleServerConfig.CODEC.encode(var1).asDocument();
         printIndented(var0, BsonUtil.toJson(var2), "\t");
      }, var0);
      Map var5 = collectPlayerTextData();
      section(
         "Server Info",
         () -> {
            var0.println("HytaleServer:");
            var0.println("\t- " + HytaleServer.get());
            var0.println("\tBooted: " + HytaleServer.get().isBooting());
            var0.println("\tShutting Down: " + HytaleServer.get().isShuttingDown());
            var0.println();
            var0.println("Worlds: ");
            Map var6 = Universe.get().getWorlds();
            var6.forEach(
               (var6x, var7x) -> {
                  var0.println("- " + var6x + ":");
                  var0.println("\t" + var7x);
                  HistoricMetric var8 = var7x.getBufferedTickLengthMetricSet();
                  long[] var9 = var8.getPeriodsNanos();

                  for (int var10 = 0; var10 < var9.length; var10++) {
                     long var11 = var9[var10];
                     String var13 = FormatUtil.timeUnitToString(var11, TimeUnit.NANOSECONDS, true);
                     double var14 = var8.getAverage(var10);
                     long var16 = var8.calculateMin(var10);
                     long var18 = var8.calculateMax(var10);
                     var0.println(
                        "\tTick ("
                           + var13
                           + "): Min: "
                           + FormatUtil.simpleTimeUnitFormat(var16, TimeUnit.NANOSECONDS, 3)
                           + ", Avg: "
                           + FormatUtil.simpleTimeUnitFormat(Math.round(var14), TimeUnit.NANOSECONDS, 3)
                           + "ns, Max: "
                           + FormatUtil.simpleTimeUnitFormat(var18, TimeUnit.NANOSECONDS, 3)
                     );
                     long[] var20 = var8.getTimestamps(var10);
                     long[] var21 = var8.getValues(var10);
                     StringBuilder var22 = new StringBuilder();
                     var22.append("\tTick Graph ").append(var13).append(":\n");
                     StringUtil.generateGraph(
                        var22,
                        var1,
                        var2,
                        var3 - var11,
                        var3,
                        0.0,
                        Math.max(var18, var7x.getTickStepNanos()),
                        var0x -> FormatUtil.simpleTimeUnitFormat(MathUtil.fastCeil(var0x), TimeUnit.NANOSECONDS, 3),
                        var20.length,
                        var1x -> var20[var1x],
                        var1x -> var21[var1x]
                     );
                     var0.println(var22);
                  }

                  var0.println("\tPlayers: ");

                  for (Player var43 : var7x.getPlayers()) {
                     var0.println("\t- " + var43);
                     DumpUtil.PlayerTextData var12 = var5.get(var43.getUuid());
                     var0.println("\t\tMovement States: " + (var12 != null ? var12.movementStates() : "N/A"));
                     var0.println("\t\tMovement Manager: " + (var12 != null ? var12.movementManager() : "N/A"));
                     var0.println("\t\tPage Manager: " + var43.getPageManager());
                     var0.println("\t\tHud Manager: " + var43.getHudManager());
                     var0.println("\t\tCamera Manager: " + (var12 != null ? var12.cameraManager() : "N/A"));
                     var0.println("\t\tChunk Tracker:");

                     for (String var52 : var43.getPlayerRef().getChunkTracker().getLoadedChunksDebug().split("\n", 0)) {
                        var0.println("\t\t\t" + var52);
                     }

                     var0.println("\t\tQueued Packets Count: " + var43.getPlayerConnection().getQueuedPacketsCount());
                     var0.println("\t\tPing:");

                     for (PongType var53 : PongType.values()) {
                        PacketHandler.PingInfo var17 = var43.getPlayerConnection().getPingInfo(var53);
                        var0.println("\t\t- " + var53.name() + ":");
                        HistoricMetric var55 = var17.getPingMetricSet();
                        long var19 = (long)var55.getAverage(1);
                        long var59 = var55.calculateMin(1);
                        long var23 = var55.calculateMax(1);
                        var0.println("\t\t\tPing: Min: " + var59 + ", Avg: " + var19 + ", Max: " + var23);
                        var0.println(
                           "\t\t\t      Min: "
                              + FormatUtil.timeUnitToString(var59, PacketHandler.PingInfo.TIME_UNIT)
                              + ", Avg: "
                              + FormatUtil.timeUnitToString(var19, PacketHandler.PingInfo.TIME_UNIT)
                              + ", Max: "
                              + FormatUtil.timeUnitToString(var23, PacketHandler.PingInfo.TIME_UNIT)
                        );
                        long[] var56 = var55.getPeriodsNanos();

                        for (int var58 = 0; var58 < var56.length; var58++) {
                           var59 = var56[var58];
                           var23 = var55.calculateMin(1);
                           long maxx = var55.calculateMax(1);
                           long[] var27 = var55.getTimestamps(var58);
                           long[] var28 = var55.getValues(var58);
                           String var29 = FormatUtil.timeUnitToString(var59, TimeUnit.NANOSECONDS, true);
                           StringBuilder var30 = new StringBuilder();
                           var30.append("\t\t\tPing Graph ").append(var29).append(":\n");
                           StringUtil.generateGraph(
                              var30,
                              var1,
                              var2,
                              var3 - var59,
                              var3,
                              var23,
                              maxx,
                              var0x -> FormatUtil.timeUnitToString(MathUtil.fastCeil(var0x), PacketHandler.PingInfo.TIME_UNIT),
                              var27.length,
                              var1x -> var27[var1x],
                              var1x -> var28[var1x]
                           );
                           var0.println(var30);
                        }

                        var0.println(
                           "\t\t\tPacket Queue: Min: "
                              + var17.getPacketQueueMetric().getMin()
                              + ", Avg: "
                              + (long)var17.getPacketQueueMetric().getAverage()
                              + ", Max: "
                              + var17.getPacketQueueMetric().getMax()
                        );
                     }

                     var0.println();
                     PacketStatsRecorder var46 = var43.getPlayerConnection().getPacketStatsRecorder();
                     if (var46 != null) {
                        int var49 = 30;
                        long var51 = 0L;
                        long var54 = 0L;
                        long var57 = 0L;
                        int var61 = 0;
                        long var62 = 0L;
                        long var24 = 0L;
                        var0.println("\t\tPackets Sent:");

                        for (int var26 = 0; var26 < 512; var26++) {
                           PacketStatsRecorder.PacketStatsEntry var65 = var46.getEntry(var26);
                           if (var65.getSentCount() > 0) {
                              var51 += var65.getSentCount();
                              var54 += var65.getSentUncompressedTotal();
                              var57 += var65.getSentCompressedTotal() > 0L ? var65.getSentCompressedTotal() : var65.getSentUncompressedTotal();
                              var0.println("\t\t\t" + var65.getName() + " (" + var26 + "):");
                              printPacketStats(
                                 var0,
                                 "\t\t\t\t",
                                 "Total",
                                 var65.getSentCount(),
                                 var65.getSentUncompressedTotal(),
                                 var65.getSentCompressedTotal(),
                                 var65.getSentUncompressedMin(),
                                 var65.getSentUncompressedMax(),
                                 var65.getSentCompressedMin(),
                                 var65.getSentCompressedMax(),
                                 var65.getSentUncompressedAvg(),
                                 var65.getSentCompressedAvg(),
                                 0
                              );
                              PacketStatsRecorder.RecentStats var66 = var65.getSentRecently();
                              if (var66.count() > 0) {
                                 var61 += var66.count();
                                 var62 += var66.uncompressedTotal();
                                 var24 += var66.compressedTotal() > 0L ? var66.compressedTotal() : var66.uncompressedTotal();
                                 printPacketStats(
                                    var0,
                                    "\t\t\t\t",
                                    "Recent",
                                    var66.count(),
                                    var66.uncompressedTotal(),
                                    var66.compressedTotal(),
                                    var66.uncompressedMin(),
                                    var66.uncompressedMax(),
                                    var66.compressedMin(),
                                    var66.compressedMax(),
                                    (double)var66.uncompressedTotal() / var66.count(),
                                    var66.compressedTotal() > 0L ? (double)var66.compressedTotal() / var66.count() : 0.0,
                                    var49
                                 );
                              }
                           }
                        }

                        var0.println("\t\t\t--- Summary ---");
                        var0.println(
                           "\t\t\t\tTotal: "
                              + var51
                              + " packets, "
                              + FormatUtil.bytesToString(var54)
                              + " serialized, "
                              + FormatUtil.bytesToString(var57)
                              + " wire"
                        );
                        if (var61 > 0) {
                           var0.println(
                              String.format(
                                 "\t\t\t\tRecent: %d packets (%.1f/sec), %s serialized, %s wire",
                                 var61,
                                 (double)var61 / var49,
                                 FormatUtil.bytesToString(var62),
                                 FormatUtil.bytesToString(var24)
                              )
                           );
                        }

                        var0.println();
                        long var64 = 0L;
                        long var67 = 0L;
                        long var68 = 0L;
                        int var32 = 0;
                        long var33 = 0L;
                        long var35 = 0L;
                        var0.println("\t\tPackets Received:");

                        for (int var37 = 0; var37 < 512; var37++) {
                           PacketStatsRecorder.PacketStatsEntry var38 = var46.getEntry(var37);
                           if (var38.getReceivedCount() > 0) {
                              var64 += var38.getReceivedCount();
                              var67 += var38.getReceivedUncompressedTotal();
                              var68 += var38.getReceivedCompressedTotal() > 0L ? var38.getReceivedCompressedTotal() : var38.getReceivedUncompressedTotal();
                              var0.println("\t\t\t" + var38.getName() + " (" + var37 + "):");
                              printPacketStats(
                                 var0,
                                 "\t\t\t\t",
                                 "Total",
                                 var38.getReceivedCount(),
                                 var38.getReceivedUncompressedTotal(),
                                 var38.getReceivedCompressedTotal(),
                                 var38.getReceivedUncompressedMin(),
                                 var38.getReceivedUncompressedMax(),
                                 var38.getReceivedCompressedMin(),
                                 var38.getReceivedCompressedMax(),
                                 var38.getReceivedUncompressedAvg(),
                                 var38.getReceivedCompressedAvg(),
                                 0
                              );
                              PacketStatsRecorder.RecentStats var39 = var38.getReceivedRecently();
                              if (var39.count() > 0) {
                                 var32 += var39.count();
                                 var33 += var39.uncompressedTotal();
                                 var35 += var39.compressedTotal() > 0L ? var39.compressedTotal() : var39.uncompressedTotal();
                                 printPacketStats(
                                    var0,
                                    "\t\t\t\t",
                                    "Recent",
                                    var39.count(),
                                    var39.uncompressedTotal(),
                                    var39.compressedTotal(),
                                    var39.uncompressedMin(),
                                    var39.uncompressedMax(),
                                    var39.compressedMin(),
                                    var39.compressedMax(),
                                    (double)var39.uncompressedTotal() / var39.count(),
                                    var39.compressedTotal() > 0L ? (double)var39.compressedTotal() / var39.count() : 0.0,
                                    var49
                                 );
                              }
                           }
                        }

                        var0.println("\t\t\t--- Summary ---");
                        var0.println(
                           "\t\t\t\tTotal: "
                              + var64
                              + " packets, "
                              + FormatUtil.bytesToString(var67)
                              + " serialized, "
                              + FormatUtil.bytesToString(var68)
                              + " wire"
                        );
                        if (var32 > 0) {
                           var0.println(
                              String.format(
                                 "\t\t\t\tRecent: %d packets (%.1f/sec), %s serialized, %s wire",
                                 var32,
                                 (double)var32 / var49,
                                 FormatUtil.bytesToString(var33),
                                 FormatUtil.bytesToString(var35)
                              )
                           );
                        }

                        var0.println();
                     }
                  }

                  var0.println("\tComponent Stores:");

                  try {
                     CompletableFuture.runAsync(() -> {
                        printComponentStore(var0, var1, var2, "Chunks", var3, var7x.getChunkStore().getStore());
                        printComponentStore(var0, var1, var2, "Entities", var3, var7x.getEntityStore().getStore());
                     }, var7x).orTimeout(30L, TimeUnit.SECONDS).join();
                  } catch (CompletionException var40) {
                     if (!(var40.getCause() class="kw">instanceof TimeoutException)) {
                        var40.printStackTrace();
                        var0.println("\t\tFAILED TO DUMP COMPONENT STORES! EXCEPTION!");
                     } else {
                        var0.println("\t\tFAILED TO DUMP COMPONENT STORES! TIMEOUT!");
                     }
                  }

                  var0.println();
                  var0.println();
                  WorldGenTimingsCollector var42 = var7x.getChunkStore().getGenerator().getTimings();
                  var0.println("\tWorld Gen Timings: ");
                  if (var42 != null) {
                     var0.println("\t\tChunk Count: " + var42.getChunkCounter());
                     var0.println("\t\tChunk Time: " + var42.getChunkTime());
                     var0.println("\t\tZone Biome Result Time: " + var42.zoneBiomeResult());
                     var0.println("\t\tPrepare Time: " + var42.prepare());
                     var0.println("\t\tBlock Generation Time: " + var42.blocksGeneration());
                     var0.println("\t\tCave Generation Time: " + var42.caveGeneration());
                     var0.println("\t\tPrefab Generation: " + var42.prefabGeneration());
                     var0.println("\t\tQueue Length: " + var42.getQueueLength());
                     var0.println("\t\tGenerating Count: " + var42.getGeneratingCount());
                  } else {
                     var0.println("\t\tNo Timings Data Collected!");
                  }
               }
            );
            List var7 = Universe.get().getPlayers().stream().filter(var0x -> var0x.getReference() == null).toList();
            if (!var7.isEmpty()) {
               var0.println();
               var0.println("Players not in world (" + var7.size() + "):");

               for (PlayerRef var9 : var7) {
                  var0.println("- " + var9.getUsername() + " (" + var9.getUuid() + ")");
                  var0.println("\tQueued Packets: " + var9.getPacketHandler().getQueuedPacketsCount());
                  PacketHandler.PingInfo var10 = var9.getPacketHandler().getPingInfo(PongType.Raw);
                  HistoricMetric var11 = var10.getPingMetricSet();
                  long var12 = var11.calculateMin(1);
                  long var14 = (long)var11.getAverage(1);
                  long var16 = var11.calculateMax(1);
                  var0.println(
                     "\tPing(raw): Min: "
                        + FormatUtil.timeUnitToString(var12, PacketHandler.PingInfo.TIME_UNIT)
                        + ", Avg: "
                        + FormatUtil.timeUnitToString(var14, PacketHandler.PingInfo.TIME_UNIT)
                        + ", Max: "
                        + FormatUtil.timeUnitToString(var16, PacketHandler.PingInfo.TIME_UNIT)
                  );
               }
            }
         },
         var0
      );
      section(
         "System info",
         () -> {
            RuntimeMXBean var1 = ManagementFactory.getRuntimeMXBean();
            OperatingSystemMXBean var2 = ManagementFactory.getOperatingSystemMXBean();
            long var3 = System.currentTimeMillis();
            var0.println("Start Time: " + Instant.ofEpochMilli(var1.getStartTime()) + " (" + var1.getStartTime() + "ms)");
            var0.println("Current Time: " + Instant.ofEpochMilli(var3) + " (" + var3 + "ms)");
            var0.println("Process Uptime: " + FormatUtil.timeUnitToString(var1.getUptime(), TimeUnit.MILLISECONDS) + " (" + var1.getUptime() + "ms)");
            var0.println("Available processors (cores): " + Runtime.getRuntime().availableProcessors() + " - " + var2.getAvailableProcessors());
            var0.println("System Load Average: " + var2.getSystemLoadAverage());
            var0.println();
            if (var2 class="kw">instanceof com.sun.management.OperatingSystemMXBean var5) {
               var0.println(
                  "Total Physical Memory: "
                     + FormatUtil.bytesToString(var5.getTotalPhysicalMemorySize())
                     + " ("
                     + var5.getTotalPhysicalMemorySize()
                     + " Bytes)"
               );
               var0.println(
                  "Free Physical Memory: " + FormatUtil.bytesToString(var5.getFreePhysicalMemorySize()) + " (" + var5.getFreePhysicalMemorySize() + " Bytes)"
               );
               var0.println("Total Swap Memory: " + FormatUtil.bytesToString(var5.getTotalSwapSpaceSize()) + " (" + var5.getTotalSwapSpaceSize() + " Bytes)");
               var0.println("Free Swap Memory: " + FormatUtil.bytesToString(var5.getFreeSwapSpaceSize()) + " (" + var5.getFreeSwapSpaceSize() + " Bytes)");
               var0.println("System CPU Load: " + var5.getSystemCpuLoad());
               var0.println("Process CPU Load: " + var5.getProcessCpuLoad());
               var0.println();
            }

            var0.println("Processor Identifier: " + System.getenv("PROCESSOR_IDENTIFIER"));
            var0.println("Processor Architecture: " + System.getenv("PROCESSOR_ARCHITECTURE"));
            var0.println("Processor Architecture W64/32: " + System.getenv("PROCESSOR_ARCHITEW6432"));
            var0.println("Number of Processors: " + System.getenv("NUMBER_OF_PROCESSORS"));
            var0.println();
            var0.println("Runtime Name: " + var1.getName());
            var0.println();
            var0.println("OS Name: " + var2.getName());
            var0.println("OS Arch: " + var2.getArch());
            var0.println("OS Version: " + var2.getVersion());
            var0.println();
            var0.println("Spec Name: " + var1.getSpecName());
            var0.println("Spec Vendor: " + var1.getSpecVendor());
            var0.println("Spec Version: " + var1.getSpecVersion());
            var0.println();
            var0.println("VM Name: " + var1.getVmName());
            var0.println("VM Vendor: " + var1.getVmVendor());
            var0.println("VM Version: " + var1.getVmVersion());
            var0.println();
            var0.println("Management Spec Version: " + var1.getManagementSpecVersion());
            var0.println();
            var0.println("Library Path: " + var1.getLibraryPath());

            try {
               var0.println("Boot ClassPath: " + var1.getBootClassPath());
            } catch (UnsupportedOperationException var6x) {
            }

            var0.println("ClassPath: " + var1.getClassPath());
            var0.println();
            var0.println("Input Arguments: " + var1.getInputArguments());
            var0.println("System Properties: " + var1.getSystemProperties());
         },
         var0
      );
      section("Current process info", () -> {
         MemoryMXBean var1 = ManagementFactory.getMemoryMXBean();
         writeMemoryUsage(var0, "Heap Memory Usage: ", var1.getHeapMemoryUsage());
         writeMemoryUsage(var0, "Non-Heap Memory Usage: ", var1.getNonHeapMemoryUsage());
         var0.println("Objects Pending Finalization Count: " + var1.getObjectPendingFinalizationCount());
      }, var0);
      section("Garbage collector", () -> {
         for (GarbageCollectorMXBean var2 : ManagementFactory.getGarbageCollectorMXBeans()) {
            var0.println("Name: " + var2.getName());
            var0.println("\tMemory Pool Names: " + Arrays.toString(var2.getMemoryPoolNames()));
            var0.println("\tCollection Count: " + var2.getCollectionCount());
            var0.println("\tCollection Time: " + var2.getCollectionTime());
            var0.println();
         }
      }, var0);
      section("Memory pools", () -> {
         for (MemoryPoolMXBean var2 : ManagementFactory.getMemoryPoolMXBeans()) {
            var0.println("Name: " + var2.getName());
            var0.println("\tType: " + var2.getType());
            var0.println("\tPeak Usage: " + var2.getPeakUsage());
            var0.println("\tUsage: " + var2.getUsage());
            var0.println("\tUsage Threshold Supported: " + var2.isUsageThresholdSupported());
            if (var2.isUsageThresholdSupported()) {
               var0.println("\tUsage Threshold: " + var2.getUsageThreshold());
               var0.println("\tUsage Threshold Count: " + var2.getUsageThresholdCount());
               var0.println("\tUsage Threshold Exceeded: " + var2.isUsageThresholdExceeded());
            }

            var0.println("\tCollection Usage: " + var2.getCollectionUsage());
            var0.println("\tCollection Usage Threshold Supported: " + var2.isCollectionUsageThresholdSupported());
            if (var2.isCollectionUsageThresholdSupported()) {
               var0.println("\tCollection Usage Threshold: " + var2.getCollectionUsageThreshold());
               var0.println("\tCollection Usage Threshold Count: " + var2.getCollectionUsageThresholdCount());
               var0.println("\tCollection Usage Threshold Exceeded: " + var2.isCollectionUsageThresholdExceeded());
            }

            var0.println();
         }
      }, var0);
      ThreadMXBean var6 = ManagementFactory.getThreadMXBean();
      ThreadInfo[] var7 = var6.dumpAllThreads(true, true);
      section("Threads (Count: " + var7.length + ")", () -> {
         Map var3 = Thread.getAllStackTraces();
         Long2ObjectMap var4 = new Long2ObjectOpenHashMap();

         for (Thread var6 : var3.keySet()) {
            var4.put(var6.getId(), var6);
         }

         for (ThreadInfo var8 : var7) {
            Thread var9 = (Thread)var4.get(var8.getThreadId());
            if (var9 == null) {
               var0.println("Failed to find thread!!!");
            } else {
               var0.println("Name: " + var9.getName());
               var0.println("State: " + var8.getThreadState());
               var0.println("Thread Class: " + var9.getClass());
               var0.println("Thread Group: " + var9.getThreadGroup());
               var0.println("Priority: " + var9.getPriority());
               var0.println("CPU Time: " + var6.getThreadCpuTime(var8.getThreadId()));
               var0.println("Waited Time: " + var8.getWaitedTime());
               var0.println("Waited Count: " + var8.getWaitedCount());
               var0.println("Blocked Time: " + var8.getBlockedTime());
               var0.println("Blocked Count: " + var8.getBlockedCount());
               var0.println("Lock Name: " + var8.getLockName());
               var0.println("Lock Owner Id: " + var8.getLockOwnerId());
               var0.println("Lock Owner Name: " + var8.getLockOwnerName());
               var0.println("Daemon: " + var9.isDaemon());
               var0.println("Interrupted: " + var9.isInterrupted());
               var0.println("Uncaught Exception Handler: " + var9.getUncaughtExceptionHandler().getClass());
               if (var9 class="kw">instanceof InitStackThread) {
                  var0.println("Init Stack: ");
                  StackTraceElement[] var10 = ((InitStackThread)var9).getInitStack();

                  for (StackTraceElement var14 : var10) {
                     var0.println("\tat " + var14);
                  }
               }

               var0.println("Current Stack: ");
               StackTraceElement[] var17 = var3.get(var9);

               for (StackTraceElement var21 : var17) {
                  var0.println("\tat " + var21);
               }
            }

            var0.println(var8);
         }
      }, var0);
      section("Security Manager", () -> {
         SecurityManager var1 = System.getSecurityManager();
         if (var1 != null) {
            var0.println("Class: " + var1.getClass().getName());
         } else {
            var0.println("No Security Manager found!");
         }
      }, var0);
      section("Classes", () -> {
         ClassLoadingMXBean var1 = ManagementFactory.getClassLoadingMXBean();
         var0.println("Loaded Class Count: " + var1.getLoadedClassCount());
         var0.println("Unloaded Class Count: " + var1.getUnloadedClassCount());
         var0.println("Total Loaded Class Count: " + var1.getTotalLoadedClassCount());
      }, var0);
      section("System Classloader", () -> {
         ClassLoader var1 = ClassLoader.getSystemClassLoader();
         writeClassLoader(var0, var1);
      }, var0);
      section("DumpUtil Classloader", () -> {
         ClassLoader var1 = DumpUtil.class.getClassLoader();
         writeClassLoader(var0, var1);
      }, var0);
   }

   class="kw">private class="kw">static void printPacketStats(
      @Nonnull PrintWriter var0,
      @Nonnull String var1,
      @Nonnull String var2,
      int var3,
      long var4,
      long var6,
      long var8,
      long var10,
      long var12,
      long var14,
      double var16,
      double var18,
      int var20
   ) {
      StringBuilder var21 = new StringBuilder();
      var21.append(var2).append(": ").append(var3).append(" packet").append(var3 != 1 ? "s" : "");
      if (var20 > 0) {
         var21.append(String.format(" (%.1f/sec)", (double)var3 / var20));
      }

      var21.append("\n").append(var1).append("  Size: ").append(FormatUtil.bytesToString(var4));
      if (var6 > 0L) {
         var21.append(" -> ").append(FormatUtil.bytesToString(var6)).append(" wire");
         double var22 = 100.0 * var6 / var4;
         var21.append(String.format(" (%.1f%%)", var22));
      }

      var21.append("\n").append(var1).append("  Avg: ").append(FormatUtil.bytesToString((long)var16));
      if (var18 > 0.0) {
         var21.append(" -> ").append(FormatUtil.bytesToString((long)var18)).append(" wire");
      }

      var21.append("\n").append(var1).append("  Range: ").append(FormatUtil.bytesToString(var8)).append(" - ").append(FormatUtil.bytesToString(var10));
      if (var14 > 0L) {
         var21.append(" (wire: ").append(FormatUtil.bytesToString(var12)).append(" - ").append(FormatUtil.bytesToString(var14)).append(")");
      }

      var0.println(var1 + var21);
   }

   class="kw">private class="kw">static void printComponentStore(@Nonnull PrintWriter var0, int var1, int var2, String var3, long var4, @Nonnull Store<?> var6) {
      var0.println("\t- " + var3 + ":");
      var0.println("\t Archetype Chunk Count: " + var6.getArchetypeChunkCount());
      var0.println("\t Entity Count: " + var6.getEntityCount());
      ComponentRegistry.Data var7 = var6.getRegistry().getData();
      HistoricMetric[] var8 = var6.getSystemMetrics();

      for (int var9 = 0; var9 < var7.getSystemSize(); var9++) {
         ISystem var10 = var7.getSystem(var9);
         HistoricMetric var11 = var8[var9];
         var0.println("\t\t " + var10.getClass().getName());
         var0.println("\t\t " + var10);
         var0.println("\t\t Archetype Chunk Count: " + var6.getArchetypeChunkCountFor(var9));
         var0.println("\t\t Entity Count: " + var6.getEntityCountFor(var9));
         if (var11 != null) {
            long[] var12 = var11.getPeriodsNanos();

            for (int var13 = 0; var13 < var12.length; var13++) {
               long var14 = var12[var13];
               String var16 = FormatUtil.timeUnitToString(var14, TimeUnit.NANOSECONDS, true);
               double var17 = var11.getAverage(var13);
               long var19 = var11.calculateMin(var13);
               long var21 = var11.calculateMax(var13);
               var0.println(
                  "\t\t\t("
                     + var16
                     + "): Min: "
                     + FormatUtil.timeUnitToString(var19, TimeUnit.NANOSECONDS)
                     + ", Avg: "
                     + FormatUtil.timeUnitToString((long)var17, TimeUnit.NANOSECONDS)
                     + ", Max: "
                     + FormatUtil.timeUnitToString(var21, TimeUnit.NANOSECONDS)
               );
               long[] var23 = var11.getTimestamps(var13);
               long[] var24 = var11.getValues(var13);
               StringBuilder var25 = new StringBuilder();
               StringUtil.generateGraph(
                  var25,
                  var1,
                  var2,
                  var4 - var14,
                  var4,
                  var19,
                  var21,
                  var0x -> FormatUtil.timeUnitToString(MathUtil.fastCeil(var0x), TimeUnit.NANOSECONDS),
                  var23.length,
                  var1x -> var23[var1x],
                  var1x -> var24[var1x]
               );
               var0.println(var25);
            }
         }
      }

      var0.println("\t\t Archetype Chunks:");

      for (ArchetypeChunkData var29 : var6.collectArchetypeChunkData()) {
         var0.println("\t\t\t- Entities: " + var29.getEntityCount() + ", Components: " + Arrays.toString(var29.getComponentTypes()));
      }
   }

   class="kw">private class="kw">static void section(String var0, @Nonnull Runnable var1, @Nonnull PrintWriter var2) {
      var2.println("**** " + var0 + " ****");

      try {
         var1.run();
      } catch (Throwable var4) {
         new RuntimeException("Failed to get data for section: " + var0, var4).printStackTrace(var2);
      }

      var2.println();
      var2.println();
   }

   class="kw">private class="kw">static void printIndented(@Nonnull PrintWriter var0, @Nonnull String var1, @Nonnull String var2) {
      for (String var6 : var1.split("\n", 0)) {
         var0.println(var2 + var6);
      }
   }

   class="kw">private class="kw">static void writeMemoryUsage(@Nonnull PrintWriter var0, String var1, @Nonnull MemoryUsage var2) {
      var0.println(var1);
      var0.println("\tInit: " + FormatUtil.bytesToString(var2.getInit()) + " (" + var2.getInit() + " Bytes)");
      var0.println("\tUsed: " + FormatUtil.bytesToString(var2.getUsed()) + " (" + var2.getUsed() + " Bytes)");
      var0.println("\tCommitted: " + FormatUtil.bytesToString(var2.getCommitted()) + " (" + var2.getCommitted() + " Bytes)");
      long var3 = var2.getMax();
      if (var3 > 0L) {
         var0.println("\tMax: " + FormatUtil.bytesToString(var3) + " (" + var3 + " Bytes)");
         long var5 = var3 - var2.getCommitted();
         var0.println("\tFree: " + FormatUtil.bytesToString(var5) + " (" + var5 + " Bytes)");
      }
   }

   class="kw">private class="kw">static void writeClassLoader(@Nonnull PrintWriter var0, @Nullable ClassLoader var1) {
      if (var1 != null) {
         var0.println("Class: " + var1.getClass().getName());

         while (var1.getParent() != null) {
            var1 = var1.getParent();
            var0.println(" - Parent: " + var1.getClass().getName());
         }
      } else {
         var0.println("No class loader found!");
      }
   }

   class="kw">public record PlayerTextData(@Nonnull UUID uuid, @Nullable String movementStates, @Nullable String movementManager, @Nullable String cameraManager) {
      class="kw">public PlayerTextData {
      }
   }
}