SpawnStatsCommand class

Пакет: com.hypixel.hytale.server.spawning.commands

Файл: com/hypixel/hytale/server/spawning/commands/SpawnStatsCommand.java

extends: AbstractWorldCommand

Поля (37)

МодификаторыТипИмя
int var10
String var10
SpawnMarkerEntity var10
AtomicInteger var11
Object2IntMap var11
AtomicInteger var12
Object2IntOpenHashMap var13
AtomicInteger var14
Object2IntOpenHashMap var15
HashMap var16
StringBuilder var17
int var3
WorldSpawnData var4
int var4
ChunkEnvironmentSpawnData var4
String var4
var4
var4
AtomicInteger var5
String var5
double var5
NPCEntity var5
boolean var6
Store var6
SpawnMarkerEntity var6
NPCEntity var6
double[] var7
int var7
AtomicInteger var7
SpawnMarkerReference var7
String var8
int var8
AtomicInteger var8
String var8
int var9
int var9
Ref var9

Методы (3)

МодификаторыВозвратСигнатура
abstract for for(int var5 = 0; var5 < var3x.size()
if if(var6)
abstract super super("stats", "server.commands.spawning.stats.desc")

Исходный код

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

class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandContext;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.FlagArg;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractWorldCommand;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.npc.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.components.SpawnMarkerReference;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.spawning.SpawnRejection;
class="kw">import com.hypixel.hytale.server.spawning.spawnmarkers.SpawnMarkerEntity;
class="kw">import com.hypixel.hytale.server.spawning.world.ChunkEnvironmentSpawnData;
class="kw">import com.hypixel.hytale.server.spawning.world.component.ChunkSpawnData;
class="kw">import com.hypixel.hytale.server.spawning.world.component.WorldSpawnData;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import java.util.HashMap;
class="kw">import java.util.concurrent.atomic.AtomicInteger;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

class="kw">public class SpawnStatsCommand class="kw">extends AbstractWorldCommand {
   @Nonnull
   class="kw">private class="kw">final FlagArg environmentsArg = this.withFlagArg("environments", "server.commands.spawning.stats.arg.environments.desc");
   @Nonnull
   class="kw">private class="kw">final FlagArg markersArg = this.withFlagArg("markers", "server.commands.spawning.stats.arg.markers.desc");
   @Nonnull
   class="kw">private class="kw">final FlagArg verboseArg = this.withFlagArg("verbose", "server.commands.spawning.stats.arg.verbose.desc");

   class="kw">public SpawnStatsCommand() {
      super("stats", "server.commands.spawning.stats.desc");
   }

   @Override
   class="kw">protected void execute(@Nonnull CommandContext var1, @Nonnull World var2, @Nonnull Store<EntityStore> var3) {
      if (this.environmentsArg.get(var1)) {
         WorldSpawnData var4 = var3.getResource(WorldSpawnData.getResourceType());
         AtomicInteger var5 = new AtomicInteger();
         boolean var6 = this.verboseArg.get(var1);
         var4.forEachEnvironmentSpawnData(
            var3x -> {
               if (var6 || var3x.hasNPCs() && var3x.getExpectedNPCs() != 0.0) {
                  int var4 = var3x.getEnvironmentIndex();
                  String var5 = Environment.getAssetMap().getAsset(var4).getId();
                  Store var6 = var2.getChunkStore().getStore();
                  double[] var7 = new double[]{0.0};
                  var3x.getChunkRefList().forEach(var3xx -> {
                     ChunkEnvironmentSpawnData var4 = var6.getComponent((Ref<ChunkStore>)var3xx, ChunkSpawnData.getComponentType())
                        .getEnvironmentSpawnData(var4);
                     var7[0] += var4.getExpectedNPCs();
                  });
                  String var8 = String.format(
                     "Environment: %-30s Exp %6.2f Act %4d Blk %s Chunk exp: %6.2f",
                     var5,
                     var3x.getExpectedNPCs(),
                     var3x.getActualNPCs(),
                     var3x.getSegmentCount(),
                     var7[0]
                  );
                  ((HytaleLogger.Api)NPCPlugin.get().getLogger().atInfo()).log("%s", var8);
                  var3x.forEachNpcStat(
                     (var1x, var2x) -> {
                        int var3 = var2x.getSpansTried();
                        double var5 = var3 > 0 ? MathUtil.percent(var3 - var2x.getSpansSuccess(), var3) : 0.0;
                        String var4;
                        if (var6) {
                           int var7 = var2x.getSuccessfulJobCount();
                           int var8 = var2x.getSuccessfulJobTotalBudget();
                           int var9 = var2x.getFailedJobCount();
                           int var10 = var2x.getFailedJobTotalBudget();
                           var4 = String.format(
                              "        NPC: %-30s Exp %6.2f Act %4d | Spns %8d: Succ %4d Lgt %5.1f Blk %5.1f Pos %5.1f Geo %5.1f Bre %5.1f Oth %5.1f | Fail%% %5.1f | Spwnbl %s | Succ Job Bgt %6d Avg Bgt %6.2f | Fail Jobs %6d Bgt %6d Avg Bgt %6.2f ",
                              NPCPlugin.get().getName(var1x),
                              var2x.getExpected(),
                              var2x.getActual(),
                              var3,
                              var2x.getSpansSuccess(),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.OUTSIDE_LIGHT_RANGE), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.INVALID_SPAWN_BLOCK), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.NO_POSITION), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.INVALID_POSITION), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.NOT_BREATHABLE), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.OTHER), var3),
                              var5,
                              !var2x.isUnspawnable(),
                              var8,
                              var7 > 0 ? (double)var8 / var7 : 0.0,
                              var9,
                              var10,
                              var9 > 0 ? (double)var10 / var9 : 0.0
                           );
                        } else {
                           var4 = String.format(
                              "        NPC: %-30s Exp %6.2f Act %4d | Spns %8d: Succ %4d Lgt %5.1f Blk %5.1f Pos %5.1f Geo %5.1f Bre %5.1f Oth %5.1f | Fail%% %5.1f | Spwnbl %s ",
                              NPCPlugin.get().getName(var1x),
                              var2x.getExpected(),
                              var2x.getActual(),
                              var3,
                              var2x.getSpansSuccess(),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.OUTSIDE_LIGHT_RANGE), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.INVALID_SPAWN_BLOCK), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.NO_POSITION), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.INVALID_POSITION), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.NOT_BREATHABLE), var3),
                              MathUtil.percent(var2x.getRejectionCount(SpawnRejection.OTHER), var3),
                              var5,
                              !var2x.isUnspawnable()
                           );
                        }

                        NPCPlugin.get().getLogger().at(var5 < 60.0 ? Level.INFO : Level.WARNING).log("%s", var4);
                     }
                  );
               } else {
                  var5.getAndIncrement();
               }
            }
         );
         AtomicInteger var7 = new AtomicInteger();
         AtomicInteger var8 = new AtomicInteger();
         var3.forEachEntityParallel(NPCEntity.getComponentType(), (var2x, var3x, var4x) -> {
            var8.getAndIncrement();
            NPCEntity var5 = var3x.getComponent(var2x, NPCEntity.getComponentType());
            if (var5.getEnvironment() != Integer.MIN_VALUE && var5.getSpawnConfiguration() != Integer.MIN_VALUE) {
               var7.getAndIncrement();
            }
         });
         int var9 = var4.getTotalSpawnJobsCompleted();
         String var10 = String.format(
            "Total: Exp %.2f Exp-Empty %.2f Act %d Job Pending Act %d Tracked %d Total %d Unspawnable %s AvgSegCount %s Chunks %s Filtered empty envs %d Active Jobs %d Total Jobs Run %d Avg Job Budget %.2f",
            var4.getExpectedNPCs(),
            var4.getExpectedNPCsInEmptyEnvironments(),
            var4.getActualNPCs(),
            var4.getTrackedCountFromJobs(),
            var7.get(),
            var8.get(),
            var4.isUnspawnable(),
            var4.averageSegmentCount(),
            var4.getChunkCount(),
            var5.get(),
            var4.getActiveSpawnJobs(),
            var9,
            var9 > 0 ? (double)var4.getTotalSpawnJobBudgetUsed() / var9 : 0.0
         );
         ((HytaleLogger.Api)NPCPlugin.get().getLogger().atInfo()).log("%s", var10);
      }

      if (this.markersArg.get(var1)) {
         AtomicInteger var11 = new AtomicInteger();
         AtomicInteger var12 = new AtomicInteger();
         Object2IntOpenHashMap var13 = new Object2IntOpenHashMap();
         var3.forEachChunk(SpawnMarkerEntity.getComponentType(), (var3x, var4x) -> {
            for (int var5 = 0; var5 < var3x.size(); var5++) {
               SpawnMarkerEntity var6 = var3x.getComponent(var5, SpawnMarkerEntity.getComponentType());
               var11.getAndIncrement();
               var13.mergeInt(var6.getSpawnMarkerId(), 1, Integer::sum);
               if (var6.getSpawnCount() == 0) {
                  var12.getAndIncrement();
               }
            }
         });
         AtomicInteger var14 = new AtomicInteger();
         Object2IntOpenHashMap var15 = new Object2IntOpenHashMap();
         HashMap var16 = new HashMap<>();
         var3.forEachChunk(Archetype.of(NPCEntity.getComponentType(), SpawnMarkerReference.getComponentType()), (var3x, var4x) -> {
            for (int var5 = 0; var5 < var3x.size(); var5++) {
               NPCEntity var6 = var3x.getComponent(var5, NPCEntity.getComponentType());
               SpawnMarkerReference var7 = var3x.getComponent(var5, SpawnMarkerReference.getComponentType());
               var14.getAndIncrement();
               String var8 = var6.getRoleName();
               var15.mergeInt(var8, 1, Integer::sum);
               Ref var9 = var7.getReference().getEntity(var4x);
               SpawnMarkerEntity var10 = var4x.getComponent(var9, SpawnMarkerEntity.getComponentType());
               Object2IntMap var11 = var16.computeIfAbsent(var10.getSpawnMarkerId(), var0x -> new Object2IntOpenHashMap());
               var11.mergeInt(var8, 1, Integer::sum);
            }
         });
         StringBuilder var17 = new StringBuilder();
         var17.append("Markers: ").append(var11.get()).append(" (With zero spawns: ").append(var12.get()).append(")\nSpawned NPCs: ").append(var14.get());
         var15.object2IntEntrySet().fastForEach(var1x -> var17.append("\n  ").append((String)var1x.getKey()).append(": ").append(var1x.getIntValue()));
         var17.append("\nRoles by marker type:");
         var16.forEach((var2x, var3x) -> {
            var17.append("\n  ").append(var2x).append(" (Instances: ").append(var13.getInt(var2x)).append(")");
            var3x.object2IntEntrySet().forEach(var1x -> var17.append("\n    ").append((String)var1x.getKey()).append(": ").append(var1x.getIntValue()));
         });
         ((HytaleLogger.Api)NPCPlugin.get().getLogger().atInfo()).log("%s", var17.toString());
      }

      var1.sendMessage(Message.translation("server.commands.spawning.stats.results"));
   }
}