ValidateCPBCommand class

Пакет: com.hypixel.hytale.server.core.command.commands.utility

Файл: com/hypixel/hytale/server/core/command/commands/utility/ValidateCPBCommand.java

extends: AbstractAsyncCommand

Поля (4)

МодификаторыТипИмя
final String UNABLE_TO_LOAD_MODEL
Path var2
List var2
CompletableFuture[] var4

Методы (3)

МодификаторыВозвратСигнатура
static void convertPrefabsvoid convertPrefabs(@Nonnull CommandContext var0, @Nonnull Path var1)
if if(var3 != null)
abstract super super("validatecpb", "server.commands.validatecpb.desc")

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandContext;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.OptionalArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractAsyncCommand;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.BsonPrefabBufferDeserializer;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferUtil;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.util.BsonUtil;
class="kw">import com.hypixel.hytale.server.core.util.io.FileUtil;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;

class="kw">public class ValidateCPBCommand class="kw">extends AbstractAsyncCommand {
   class="kw">private class="kw">static class="kw">final String UNABLE_TO_LOAD_MODEL = "Unable to load entity with model ";
   class="kw">private class="kw">static class="kw">final String FAILED_TO_FIND_BLOCK = "Failed to find block ";
   @Nonnull
   class="kw">private class="kw">final OptionalArg<String> pathArg = this.withOptionalArg("path", "server.commands.validatecpb.path.desc", ArgTypes.STRING);

   class="kw">public ValidateCPBCommand() {
      super("validatecpb", "server.commands.validatecpb.desc");
   }

   @Nonnull
   @Override
   class="kw">protected CompletableFuture<Void> executeAsync(@Nonnull CommandContext var1) {
      if (this.pathArg.provided(var1)) {
         Path var2 = Path.of(this.pathArg.get(var1));
         if (!PathUtil.isInTrustedRoot(var2)) {
            var1.sendMessage(Message.translation("server.commands.validatecpb.invalidPath"));
            class="kw">return CompletableFuture.completedFuture(null);
         } else {
            class="kw">return CompletableFuture.runAsync(() -> convertPrefabs(var1, var2));
         }
      } else {
         class="kw">return CompletableFuture.runAsync(() -> {
            for (AssetPack var2 : AssetModule.get().getAssetPacks()) {
               convertPrefabs(var1, var2.getRoot());
            }
         });
      }
   }

   class="kw">private class="kw">static void convertPrefabs(@Nonnull CommandContext var0, @Nonnull Path var1) {
      List var2 = new ObjectArrayList();

      try (Stream var3 = Files.walk(var1, FileUtil.DEFAULT_WALK_TREE_OPTIONS_ARRAY)) {
         CompletableFuture[] var4 = var3.filter(var0x -> Files.isRegularFile(var0x) && PrefabStore.PREFAB_FILTER.test(var0x))
            .map(
               var2x -> readPrefabBuffer(var2x)
                  .thenAccept(var2xx -> var0.sendMessage(Message.translation("server.general.loadedPrefab").param("name", var2x.toString())))
                  .exceptionally(var2xx -> {
                     String var3 = var2xx.getCause().getMessage();
                     if (var3 != null) {
                        if (var3.contains("Failed to find block ")) {
                           var2.add("Failed to load " + var2x + " because " + var3);
                           class="kw">return null;
                        }

                        if (var3.contains("Unable to load entity with model ")) {
                           var2.add("Failed to load " + var2x + " because " + var3);
                           class="kw">return null;
                        }
                     }

                     var2.add("Failed to load " + var2x + " because " + (var3 != null ? var3 : var2xx.getCause().getClass()));
                     new Exception("Failed to load " + var2x, var2xx.getCause()).printStackTrace();
                     class="kw">return null;
                  })
            )
            .toArray(CompletableFuture[]::new);
         CompletableFuture.allOf(var4).join();
      } catch (IOException var8) {
         throw SneakyThrow.sneakyThrow(var8);
      }

      if (!var2.isEmpty()) {
         var0.sendMessage(Message.translation("server.commands.validatecpb.failed").param("failed", var2.toString()));
      }

      var0.sendMessage(Message.translation("server.commands.prefabConvertionDone").param("path", var1.toString()));
   }

   @Nonnull
   class="kw">private class="kw">static CompletableFuture<PrefabBuffer> readPrefabBuffer(@Nonnull Path var0) {
      class="kw">return var0.toString().endsWith(".lpf")
         ? PrefabBufferUtil.readFromFileAsync(var0)
         : BsonUtil.readDocument(var0, false).thenApply(var1 -> BsonPrefabBufferDeserializer.INSTANCE.deserialize(var0, var1));
   }
}