HyCodeYourTale
classpublicPriority 1

ValidateCPBCommand

com.hypixel.hytale.server.core.command.commands.utility.ValidateCPBCommand

extends AbstractAsyncCommand

0

Methods

0

Public Methods

0

Fields

1

Constructors

Constants

StringFAILED_TO_FIND_BLOCK= "Failed to find block "
StringUNABLE_TO_LOAD_MODEL= "Unable to load entity with model "

Constructors

public
ValidateCPBCommand()

Inheritance

Parent
Current
Interface
Child

Use mouse wheel to zoom, drag to pan. Click nodes to navigate.

Related Classes

Source Code

package com.hypixel.hytale.server.core.command.commands.utility;

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

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

   public ValidateCPBCommand() {
      super("validatecpb", "server.commands.validatecpb.desc");
   }

   @Nonnull
   @Override
   protected CompletableFuture<Void> executeAsync(@Nonnull CommandContext context) {
      if (this.pathArg.provided(context)) {
         String path = this.pathArg.get(context);
         return CompletableFuture.runAsync(() -> convertPrefabs(context, PathUtil.get(path)));
      } else {
         return CompletableFuture.runAsync(() -> {
            for (AssetPack pack : AssetModule.get().getAssetPacks()) {
               convertPrefabs(context, pack.getRoot());
            }
         });
      }
   }

   private static void convertPrefabs(@Nonnull CommandContext context, @Nonnull Path assetPath) {
      List<String> failed = new ObjectArrayList();

      try (Stream<Path> stream = Files.walk(assetPath, FileUtil.DEFAULT_WALK_TREE_OPTIONS_ARRAY)) {
         CompletableFuture[] futures = stream.filter(path -> Files.isRegularFile(path) && path.toString().endsWith(".prefab.json"))
            .map(path -> BsonUtil.readDocument(path, false).thenAccept(document -> {
                  BsonPrefabBufferDeserializer.INSTANCE.deserialize(path, document);
                  context.sendMessage(Message.translation("server.general.loadedPrefab").param("name", path.toString()));
               }).exceptionally(throwable -> {
                  String message = throwable.getCause().getMessage();
                  if (message != null) {
                     if (message.contains("Failed to find block ")) {
                        failed.add("Failed to load " + path + " because " + message);
                        return null;
                     }

                     if (message.contains("Unable to load entity with model ")) {
                        failed.add("Failed to load " + path + " because " + message);
                        return null;
                     }
                  }

                  failed.add("Failed to load " + path + " because " + (message != null ? message : throwable.getCause().getClass()));
                  new Exception("Failed to load " + path, throwable.getCause()).printStackTrace();
                  return null;
               }))
            .toArray(CompletableFuture[]::new);
         CompletableFuture.allOf(futures).join();
      } catch (IOException var8) {
         throw SneakyThrow.sneakyThrow(var8);
      }

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

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