PrefabEditSaveCommand class

Пакет: com.hypixel.hytale.builtin.buildertools.prefabeditor.commands

Файл: com/hypixel/hytale/builtin/buildertools/prefabeditor/commands/PrefabEditSaveCommand.java

extends: AbstractAsyncPlayerCommand

Поля (37)

МодификаторыТипИмя
PrefabStore var1
boolean var10
boolean var11
boolean var12
boolean var13
var13
var13
String var14
AssetPack var15
var15
var15
var15
PrefabEditingMetadata[] var16
int var17
AssetModule var2
PrefabStore var2
Path var22
PrefabEditingMetadata var23
BlockSelection var24
Path var25
CompletableFuture[] var27
Path var28
Path var3
AssetPack var31
var31
PrefabEditingMetadata var33
AssetPack var34
Path var36
List var4
boolean var5
Player var6
String var6
PrefabEditSessionManager var7
Message var7
var7
PrefabEditSession var8
PrefabSaverSettings var9

Методы (22)

МодификаторыВозвратСигнатура
for for(PrefabEditingMetadata var21 : var16)
for for(PrefabEditingMetadata var35 : var16)
for for(int var30 = 0; var30 < var16.length; var30++)
for for(int var5 = 0; var5 < var27.length; var5++)
if if(var8 == null)
if if(var11)
if if(var15 == null)
if if(var23 == null)
if if(var15 == null)
if if(!var12)
if if(var15 != null)
if if(var31 == null)
if if(var5)
if if(var34 != null)
if if(var17 > 0 && !var13)
if if(var15 == null)
if if(var15 == null)
if if(!var12)
if if(var15 != null)
if if(var1 != null)
static boolean isPathInAllowedPrefabDirectoryboolean isPathInAllowedPrefabDirectory(@Nonnull Path var0)
abstract super super("save", "server.commands.editprefab.save.desc")

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsUserData;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditSession;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditSessionManager;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditingMetadata;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.saving.PrefabSaver;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.saving.PrefabSaverSettings;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.saving.SupportMode;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
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.DefaultArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.FlagArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractAsyncPlayerCommand;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.singleplayer.SingleplayerModule;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabFormat;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
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 it.unimi.dsi.fastutil.ints.IntArrayList;
class="kw">import java.nio.file.Path;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class PrefabEditSaveCommand class="kw">extends AbstractAsyncPlayerCommand {
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_EDIT_PREFAB_NOT_IN_EDIT_SESSION = Message.translation("server.commands.editprefab.notInEditSession");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_PATH_OUTSIDE_PREFABS_DIR = Message.translation("server.builderTools.attemptedToSaveOutsidePrefabsDir");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_NOT_IN_EDIT_WORLD = Message.translation("server.commands.editprefab.notInEditWorldWarning");
   @Nonnull
   class="kw">private class="kw">final FlagArg saveAllArg = this.withFlagArg("saveAll", "server.commands.editprefab.save.saveAll.desc").addAliases("all");
   @Nonnull
   class="kw">private class="kw">final DefaultArg<String> packArg = this.withDefaultArg(
      "pack", "server.commands.editprefab.save.pack.desc", ArgTypes.STRING, "", "server.commands.editprefab.save.pack.desc"
   );
   @Nonnull
   class="kw">private class="kw">final FlagArg noEntitiesArg = this.withFlagArg("noEntities", "server.commands.editprefab.save.noEntities.desc");
   @Nonnull
   class="kw">private class="kw">final FlagArg emptyArg = this.withFlagArg("empty", "server.commands.editprefab.save.empty.desc");
   @Nonnull
   class="kw">private class="kw">final FlagArg confirmArg = this.withFlagArg("confirm", "server.commands.editprefab.save.confirm.desc");
   @Nonnull
   class="kw">private class="kw">final FlagArg removeSupportArg = this.withFlagArg("removeSupport", "server.commands.editprefab.save.removeSupport.desc");
   @Nonnull
   class="kw">private class="kw">final FlagArg setupSupportArg = this.withFlagArg("setupSupport", "server.commands.editprefab.save.setupSupport.desc");
   @Nonnull
   class="kw">private class="kw">final FlagArg compressedArg = this.withFlagArg("compressed", "server.commands.editprefab.save.compressed.desc");

   class="kw">private class="kw">static boolean isPathInAllowedPrefabDirectory(@Nonnull Path var0) {
      PrefabStore var1 = PrefabStore.get();
      if (PathUtil.isChildOf(var1.getServerPrefabsPath(), var0)) {
         class="kw">return true;
      }

      if (PathUtil.isChildOf(var1.getWorldGenPrefabsPath(), var0)) {
         class="kw">return true;
      }

      AssetModule var2 = AssetModule.get();
      class="kw">return var2.isWithinPackSubDir(var0, "Server/Prefabs") && !var2.isAssetPathImmutable(var0);
   }

   class="kw">public PrefabEditSaveCommand() {
      super("save", "server.commands.editprefab.save.desc");
   }

   @Nonnull
   @Override
   class="kw">protected CompletableFuture<Void> executeAsync(
      @Nonnull CommandContext var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull PlayerRef var4, @Nonnull World var5
   ) {
      Player var6 = var2.getComponent(var3, Player.getComponentType());
      assert var6 != null;
      PrefabEditSessionManager var7 = BuilderToolsPlugin.get().getPrefabEditSessionManager();
      PrefabEditSession var8 = var7.getPrefabEditSession(var4.getUuid());
      if (var8 == null) {
         var1.sendMessage(MESSAGE_COMMANDS_EDIT_PREFAB_NOT_IN_EDIT_SESSION);
         class="kw">return CompletableFuture.completedFuture(null);
      }

      if (!var7.isInEditWorld(var4, var2)) {
         var1.sendMessage(MESSAGE_NOT_IN_EDIT_WORLD);
         class="kw">return CompletableFuture.completedFuture(null);
      }

      PrefabSaverSettings var9 = new PrefabSaverSettings();
      var9.setBlocks(true);
      var9.setEntities(!this.noEntitiesArg.provided(var1));
      var9.setOverwriteExisting(true);
      var9.setEmpty(this.emptyArg.get(var1));
      var9.setPrefabFormat(this.compressedArg.get(var1) ? PrefabFormat.COMPRESSED : PrefabFormat.AUTO);
      boolean var10 = this.removeSupportArg.get(var1);
      boolean var11 = this.setupSupportArg.get(var1);
      if (var11) {
         var9.setSupportMode(SupportMode.CALCULATE);
      } else if (var10) {
         var9.setSupportMode(SupportMode.REMOVE);
      }

      boolean var12 = this.confirmArg.provided(var1);
      String var14 = this.packArg.get(var1);
      AssetPack var15 = null;
      boolean var13;
      if (var14 != null && !var14.isEmpty()) {
         var15 = BuilderToolsPlugin.resolveTargetPack(var14, var6, var1);
         if (var15 == null) {
            class="kw">return CompletableFuture.completedFuture(null);
         }

         var13 = true;
      } else {
         var13 = false;
      }

      if (!this.saveAllArg.provided(var1)) {
         PrefabEditingMetadata var23 = var8.getSelectedPrefab(var4.getUuid());
         if (var23 == null) {
            var1.sendMessage(Message.translation("server.commands.editprefab.noPrefabSelected"));
            class="kw">return CompletableFuture.completedFuture(null);
         }

         if (var23.isReadOnly() && !var13) {
            var15 = BuilderToolsPlugin.resolveTargetPack("", var23.getPrefabPath(), var6, var1);
            if (var15 == null) {
               class="kw">return CompletableFuture.completedFuture(null);
            }

            if (!var12) {
               Path var25 = getWritableSavePath(var23, var15);
               var1.sendMessage(
                  Message.translation("server.commands.editprefab.save.readOnlyNeedsConfirmSingle")
                     .param("path", var23.getPrefabPath().toString())
                     .param("redirectPath", var25.toString())
               );
               class="kw">return CompletableFuture.completedFuture(null);
            }
         }

         BlockSelection var24 = BuilderToolsPlugin.getState(var6, var4).getSelection();
         if (var23.getMinPoint().equals(var24.getSelectionMin()) && var23.getMaxPoint().equals(var24.getSelectionMax())) {
            if (var15 != null) {
               BuilderToolsUserData.get(var6).setLastSavePack(var15.getName());
            }

            Path var28 = getWritableSavePath(var23, var15);
            if (!SingleplayerModule.isOwner(var4) && !isPathInAllowedPrefabDirectory(var28)) {
               var1.sendMessage(MESSAGE_PATH_OUTSIDE_PREFABS_DIR);
               class="kw">return CompletableFuture.completedFuture(null);
            }

            AssetPack var31 = var15;
            if (var31 == null) {
               var31 = PrefabStore.get().findAssetPackForPrefabPath(var28);
            }

            AssetPack var34 = var31;
            class="kw">return PrefabSaver.savePrefab(
                  var4,
                  var5,
                  var28,
                  var23.getAnchorPoint(),
                  var23.getMinPoint(),
                  var23.getMaxPoint(),
                  var23.getPastePosition(),
                  var23.getOriginalFileAnchor(),
                  var9
               )
               .thenAccept(var4x -> {
                  boolean var5 = var4x != null;
                  if (var5) {
                     var23.setDirty(false);
                  }

                  String var6 = (var5 ? "success" : "failure") + (var34 != null ? ".pack" : "");
                  Message var7 = Message.translation("server.commands.editprefab.save." + var6).param("name", (var5 ? var4x : var28).toString());
                  if (var34 != null) {
                     var7 = var7.param("pack", var34.getName());
                  }

                  var1.sendMessage(var7);
               });
         } else {
            var1.sendMessage(Message.translation("server.commands.editprefab.save.selectionMismatch"));
            class="kw">return CompletableFuture.completedFuture(null);
         }
      } else {
         PrefabEditingMetadata[] var16 = var8.getLoadedPrefabMetadata().values().toArray(new PrefabEditingMetadata[0]);
         int var17 = 0;

         for (PrefabEditingMetadata var21 : var16) {
            if (var21.isReadOnly()) {
               var17++;
            }
         }

         if (var17 > 0 && !var13) {
            if (var15 == null) {
               var15 = BuilderToolsPlugin.resolveTargetPack("", var6, var1);
               if (var15 == null) {
                  class="kw">return CompletableFuture.completedFuture(null);
               }
            }

            if (!var12) {
               var1.sendMessage(Message.translation("server.commands.editprefab.save.readOnlyNeedsConfirm").param("count", var17));
               class="kw">return CompletableFuture.completedFuture(null);
            }
         }

         if (var15 != null) {
            BuilderToolsUserData.get(var6).setLastSavePack(var15.getName());
         }

         if (!SingleplayerModule.isOwner(var4)) {
            for (PrefabEditingMetadata var35 : var16) {
               Path var22 = getWritableSavePath(var35, var15);
               if (!isPathInAllowedPrefabDirectory(var22)) {
                  var1.sendMessage(MESSAGE_PATH_OUTSIDE_PREFABS_DIR);
                  class="kw">return CompletableFuture.completedFuture(null);
               }
            }
         }

         var1.sendMessage(Message.translation("server.commands.editprefab.save.saveAll.start").param("amount", var16.length));
         CompletableFuture[] var27 = new CompletableFuture[var16.length];

         for (int var30 = 0; var30 < var16.length; var30++) {
            PrefabEditingMetadata var33 = var16[var30];
            Path var36 = getWritableSavePath(var33, var15);
            var27[var30] = PrefabSaver.savePrefab(
               var4,
               var5,
               var36,
               var33.getAnchorPoint(),
               var33.getMinPoint(),
               var33.getMaxPoint(),
               var33.getPastePosition(),
               var33.getOriginalFileAnchor(),
               var9
            );
         }

         class="kw">return CompletableFuture.allOf(var27)
            .thenAccept(
               var3x -> {
                  List var4 = new IntArrayList();

                  for (int var5 = 0; var5 < var27.length; var5++) {
                     if (var27[var5].join() != null) {
                        var16[var5].setDirty(false);
                     } else {
                        var4.add(var5);
                     }
                  }

                  var1.sendMessage(
                     Message.translation("server.commands.editprefab.save.saveAll.success")
                        .param("successes", var27.length - var4.size())
                        .param("failures", var4.size())
                  );
               }
            );
      }
   }

   @Nonnull
   class="kw">private class="kw">static Path getWritableSavePath(@Nonnull PrefabEditingMetadata var0, @Nullable AssetPack var1) {
      if (var1 != null) {
         PrefabStore var2 = PrefabStore.get();
         Path var3 = var2.getAssetPrefabsPathForPack(var1);
         class="kw">return var3.resolve(var2.getRelativePrefabPath(var0.getPrefabPath()));
      } else {
         class="kw">return var0.getPrefabPath();
      }
   }
}