PrefabSaver class

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

Файл: com/hypixel/hytale/builtin/buildertools/prefabeditor/saving/PrefabSaver.java

Поля (79)

МодификаторыТипИмя
final String EDITOR_BLOCK
break
continue
return
int var10
Holder var10
LongIterator var10
int var11
long var11
int var12
ChunkStore var12
long var13
CompletableFuture var13
Long2ReferenceMap var14
int var15
List var15
int var16
int var17
int var18
int var19
int var20
BlockSelection var21
int var22
int var23
int var24
int var25
long var28
ComponentRegistry.Data var29
LongSet var3
Ref var30
WorldChunk var31
ChunkColumn var32
int var34
Ref var35
BlockSection var36
BlockPhysics var37
int var38
var38
int var39
int var4
long var4
Holder var40
var40
int var41
byte var42
UUIDComponent var44
TransformComponent var45
Vector3d var46
boolean var47
boolean var48
BlockEntity var49
int var5
String var50
TransformComponent var51
Store var52
long var54
ComponentType var55
Set var57
long var58
ComponentType var59
BlockEntity var6
int var6
Path var6
ComponentType var60
ObjectIterator var61
Ref var62
ChunkColumn var63
Ref[] var64
FluidSection var69
String var7
int var7
long var7
EntitySection var70
int var71
Holder var74
ChunkStore var8
UUIDComponent var8
BlockTypeAssetMap var9
TransformComponent var9

Методы (20)

МодификаторыВозвратСигнатура
for for(int var26 = var3.x; var26 <= var4.x; var26++)
for for(int var27 = var3.z; var27 <= var4.z; var27++)
for for(int var33 = var24; var33 >= var25; var33--)
for for(Ref var68 : var64)
for for(int var8 = var4; var8 <= var5; var8++)
for for(int var9 = var6; var9 <= var7; var9++)
if if(var10 == Integer.MIN_VALUE)
if if(var11 == Integer.MIN_VALUE)
if if(var12 == Integer.MIN_VALUE)
if if(var38 == var10)
if if(var40 != null)
if if(var6 != null)
if if(var8 != null)
if if(var63 != null)
if if(var64 != null)
if if(var70 != null)
if if(var47 && var48)
if if(var49 != null)
if if(var44 != null)
synchronized synchronized(var14)

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
class="kw">import com.hypixel.hytale.component.ComponentRegistry;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
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.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.VectorBoxUtil;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandSender;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabCopyableComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabSaveException;
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.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.EntitySection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.FluidSection;
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 it.unimi.dsi.fastutil.longs.Long2ReferenceMap;
class="kw">import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.longs.LongIterator;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.longs.LongSet;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.nio.file.FileSystems;
class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class PrefabSaver {
   class="kw">protected class="kw">static class="kw">final String EDITOR_BLOCK = "Editor_Block";
   class="kw">protected class="kw">static class="kw">final String EDITOR_BLOCK_PREFAB_AIR = "Editor_Empty";
   class="kw">protected class="kw">static class="kw">final String EDITOR_BLOCK_PREFAB_ANCHOR = "Editor_Anchor";

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

   @Nonnull
   class="kw">public class="kw">static CompletableFuture<Path> savePrefab(
      @Nonnull CommandSender var0,
      @Nonnull World var1,
      @Nonnull Path var2,
      @Nonnull Vector3i var3,
      @Nonnull Vector3i var4,
      @Nonnull Vector3i var5,
      @Nonnull Vector3i var6,
      @Nonnull Vector3i var7,
      @Nonnull PrefabSaverSettings var8
   ) {
      class="kw">return copyBlocksAsync(var0, var1, var3, var4, var5, var6, var7, var8)
         .thenComposeAsync(
            var4x -> var4x == null
               ? CompletableFuture.completedFuture(null)
               : CompletableFuture.<Path>supplyAsync(() -> save(var0, var4x, var2, var8), BuilderToolsPlugin.get().getPrefabSaveExecutor())
                  .thenApplyAsync(var0x -> (Path)var0x, var1),
            var1
         );
   }

   @Nonnull
   class="kw">private class="kw">static CompletableFuture<BlockSelection> copyBlocksAsync(
      @Nonnull CommandSender var0,
      @Nonnull World var1,
      @Nonnull Vector3i var2,
      @Nonnull Vector3i var3,
      @Nonnull Vector3i var4,
      @Nonnull Vector3i var5,
      @Nonnull Vector3i var6,
      @Nonnull PrefabSaverSettings var7
   ) {
      ChunkStore var8 = var1.getChunkStore();
      BlockTypeAssetMap var9 = BlockType.getAssetMap();
      int var10 = var9.getIndex("Editor_Block");
      if (var10 == Integer.MIN_VALUE) {
         var0.sendMessage(Message.translation("server.commands.editprefab.save.error.unknownBlockIdKey").param("key", "Editor_Block".toString()));
         class="kw">return CompletableFuture.completedFuture(null);
      } else {
         int var11 = var9.getIndex("Editor_Empty");
         if (var11 == Integer.MIN_VALUE) {
            var0.sendMessage(Message.translation("server.commands.editprefab.save.error.unknownBlockIdKey").param("key", "Editor_Empty".toString()));
            class="kw">return CompletableFuture.completedFuture(null);
         } else {
            int var12 = var9.getIndex("Editor_Anchor");
            if (var12 == Integer.MIN_VALUE) {
               var0.sendMessage(Message.translation("server.commands.editprefab.save.error.unknownBlockIdKey").param("key", "Editor_Anchor".toString()));
               class="kw">return CompletableFuture.completedFuture(null);
            } else {
               class="kw">return preloadChunksInSelectionAsync(var8, var3, var4)
                  .thenApplyAsync(
                     var11x -> copyBlocksWithLoadedChunks(
                        var0, var1, var2, var3, var4, var5, var6, var7, (Long2ReferenceMap<Ref<ChunkStore>>)var11x, var10, var11, var12
                     ),
                     var1
                  );
            }
         }
      }
   }

   @Nullable
   class="kw">private class="kw">static BlockSelection copyBlocksWithLoadedChunks(
      @Nonnull CommandSender var0,
      @Nonnull World var1,
      @Nonnull Vector3i var2,
      @Nonnull Vector3i var3,
      @Nonnull Vector3i var4,
      @Nonnull Vector3i var5,
      @Nonnull Vector3i var6,
      @Nonnull PrefabSaverSettings var7,
      @Nonnull Long2ReferenceMap<Ref<ChunkStore>> var8,
      int var9,
      int var10,
      int var11
   ) {
      ChunkStore var12 = var1.getChunkStore();
      long var13 = System.nanoTime();
      int var15 = var4.x - var3.x;
      int var16 = var4.y - var3.y;
      int var17 = var4.z - var3.z;
      int var18 = var2.x - var5.x;
      int var19 = var2.y - var5.y;
      int var20 = var2.z - var5.z;
      BlockSelection var21 = new BlockSelection();
      var21.setPosition(var5.x - var6.x, var5.y - var6.y, var5.z - var6.z);
      var21.setSelectionArea(var3, var4);
      var21.setAnchor(var18, var19, var20);
      int var22 = 0;
      int var23 = 0;
      int var24 = Math.max(var3.y, var4.y);
      int var25 = Math.min(var3.y, var4.y);

      for (int var26 = var3.x; var26 <= var4.x; var26++) {
         for (int var27 = var3.z; var27 <= var4.z; var27++) {
            long var28 = ChunkUtil.indexChunkFromBlock(var26, var27);
            Ref var30 = (Ref<ChunkStore>)var8.get(var28);
            if (var30 != null && var30.isValid()) {
               WorldChunk var31 = var12.getStore().getComponent(var30, WorldChunk.getComponentType());
               assert var31 != null;
               ChunkColumn var32 = var12.getStore().getComponent(var30, ChunkColumn.getComponentType());
               assert var32 != null;

               for (int var33 = var24; var33 >= var25; var33--) {
                  int var34 = ChunkUtil.indexSection(var33);
                  Ref var35 = var32.getSection(var34);
                  if (var35 != null && var35.isValid()) {
                     BlockSection var36 = var12.getStore().getComponent(var35, BlockSection.getComponentType());
                     assert var36 != null;
                     BlockPhysics var37 = var12.getStore().getComponent(var35, BlockPhysics.getComponentType());
                     int var38 = var36.get(var26, var33, var27);
                     int var39 = var36.getFiller(var26, var33, var27);
                     if (var7.isBlocks() && (var38 != 0 || var7.isEmpty()) && var38 != var9) {
                        if (var38 == var10) {
                           var38 = 0;
                        }

                        Holder var40 = var31.getBlockComponentHolder(var26, var33, var27);
                        if (var40 != null) {
                           var40 = var40.clone();
                        }

                        int var41 = var7.getSupportMode() != SupportMode.KEEP_EXISTING ? 0 : (var37 != null ? var37.get(var26, var33, var27) : 0);
                        var21.addBlockAtWorldPos(var26, var33, var27, var38, var36.getRotationIndex(var26, var33, var27), var39, var41, var40);
                        var22++;
                     }

                     FluidSection var69 = var12.getStore().getComponent(var35, FluidSection.getComponentType());
                     assert var69 != null;
                     int var71 = var69.getFluidId(var26, var33, var27);
                     if (var7.isBlocks() && (var71 != 0 || var7.isEmpty())) {
                        byte var42 = var69.getFluidLevel(var26, var33, var27);
                        var21.addFluidAtWorldPos(var26, var33, var27, var71, var42);
                        var23++;
                     }
                  }
               }
            }
         }
      }

      if (var7.isEntities()) {
         Store var52 = var1.getEntityStore().getStore();
         ComponentType var55 = BlockEntity.getComponentType();
         Set var57 = new HashSet<>();
         ComponentRegistry.Data var29 = EntityStore.REGISTRY.getData();
         ComponentType var59 = PrefabCopyableComponent.getComponentType();
         ComponentType var60 = TransformComponent.getComponentType();
         BuilderToolsPlugin.forEachCopyableInSelection(var1, var3.x, var3.y, var3.z, var15, var16, var17, var5x -> {
            BlockEntity var6 = var52.getComponent(var5x, var55);
            if (var6 != null) {
               String var7 = var6.getBlockTypeKey();
               if (var7 != null && (var7.equals("Editor_Block") || var7.equals("Editor_Empty") || var7.equals("Editor_Anchor"))) {
                  class="kw">return;
               }
            }

            Holder var10 = var52.copyEntity(var5x);
            UUIDComponent var8 = var10.getComponent(UUIDComponent.getComponentType());
            if (var8 != null) {
               var57.add(var8.getUuid());
            }

            TransformComponent var9 = var10.getComponent(var60);
            if (var9 != null && var9.getPosition() != null) {
               var9.getPosition().sub(var21.getX(), var21.getY(), var21.getZ());
            }

            var21.addEntityHolderRaw(var10);
         });
         ObjectIterator var61 = var8.values().iterator();

         while (var61.hasNext()) {
            Ref var62 = (Ref<ChunkStore>)var61.next();
            ChunkColumn var63 = var12.getStore().getComponent(var62, ChunkColumn.getComponentType());
            if (var63 != null) {
               Ref[] var64 = var63.getSections();
               if (var64 != null) {
                  for (Ref var68 : var64) {
                     if (var68 != null && var68.isValid()) {
                        EntitySection var70 = var12.getStore().getComponent(var68, EntitySection.getComponentType());
                        if (var70 != null) {
                           for (Holder var43 : var70.getEntityHolders()) {
                              UUIDComponent var44 = var43.getComponent(UUIDComponent.getComponentType());
                              TransformComponent var45 = var43.getComponent(var60);
                              Vector3d var46 = var45 != null ? var45.getPosition() : null;
                              boolean var47 = var43.getArchetype().contains(var59);
                              boolean var48 = var43.hasSerializableComponents(var29);
                              if (var47 && var48) {
                                 BlockEntity var49 = var43.getComponent(var55);
                                 if (var49 != null) {
                                    String var50 = var49.getBlockTypeKey();
                                    if (var50 != null && (var50.equals("Editor_Block") || var50.equals("Editor_Empty") || var50.equals("Editor_Anchor"))) {
                                       class="kw">continue;
                                    }
                                 }

                                 if (var45 != null
                                    && var46 != null
                                    && VectorBoxUtil.isInside(var3.x, var3.y, var3.z, 0.0, 0.0, 0.0, var15 + 1, var16 + 1, var17 + 1, var46)
                                    && (var44 == null || !var57.contains(var44.getUuid()))) {
                                    if (var44 != null) {
                                       var57.add(var44.getUuid());
                                    }

                                    Holder var74 = var43.clone();
                                    TransformComponent var51 = var74.getComponent(var60);
                                    if (var51 != null && var51.getPosition() != null) {
                                       var51.getPosition().sub(var21.getX(), var21.getY(), var21.getZ());
                                    }

                                    var21.addEntityHolderRaw(var74);
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
         }

         var21.sortEntitiesByPosition();
      }

      for (PrefabSaveContributor var56 : BuilderToolsPlugin.get().getPrefabSaveContributors()) {
         var56.contribute(var21, var1, var3, var4);
      }

      long var54 = System.nanoTime();
      long var58 = var54 - var13;
      BuilderToolsPlugin.get()
         .getLogger()
         .at(Level.FINE)
         .log("Took: %dns (%dms) to execute copy of %d blocks, %d fluids", var58, TimeUnit.NANOSECONDS.toMillis(var58), var22, var23);
      class="kw">return var21;
   }

   @Nonnull
   class="kw">private class="kw">static CompletableFuture<Long2ReferenceMap<Ref<ChunkStore>>> preloadChunksInSelectionAsync(
      @Nonnull ChunkStore var0, @Nonnull Vector3i var1, @Nonnull Vector3i var2
   ) {
      LongSet var3 = new LongOpenHashSet();
      int var4 = var1.x >> 5;
      int var5 = var2.x >> 5;
      int var6 = var1.z >> 5;
      int var7 = var2.z >> 5;

      for (int var8 = var4; var8 <= var5; var8++) {
         for (int var9 = var6; var9 <= var7; var9++) {
            var3.add(ChunkUtil.indexChunk(var8, var9));
         }
      }

      Long2ReferenceMap var14 = new Long2ReferenceOpenHashMap(var3.size());
      List var15 = new ArrayList<>(var3.size());
      LongIterator var10 = var3.iterator();

      while (var10.hasNext()) {
         long var11 = (Long)var10.next();
         CompletableFuture var13 = var0.getChunkReferenceAsync(var11).thenAccept(var3x -> {
            if (var3x != null && var3x.isValid()) {
               class="kw">synchronized (var14) {
                  var14.put(var11, var3x);
               }
            }
         });
         var15.add(var13);
      }

      class="kw">return CompletableFuture.allOf(var15.toArray(CompletableFuture[]::new)).thenApply(var1x -> var14);
   }

   @Nullable
   class="kw">private class="kw">static Path save(@Nonnull CommandSender var0, @Nonnull BlockSelection var1, @Nonnull Path var2, @Nonnull PrefabSaverSettings var3) {
      if (var2.getFileSystem() != FileSystems.getDefault()) {
         var0.sendMessage(Message.translation("server.builderTools.cannotSaveToReadOnlyPath").param("path", var2.toString()));
         class="kw">return null;
      }

      try {
         long var4 = System.nanoTime();
         if (var3.isRelativize()) {
            var1.relativizeInPlace();
         }

         PrefabSaveSupport.apply(var1, var3);
         Path var6 = PrefabStore.get().savePrefab(var2, var1, var3.isOverwriteExisting(), var3.getPrefabFormat());
         long var7 = System.nanoTime() - var4;
         BuilderToolsPlugin.get()
            .getLogger()
            .at(Level.FINE)
            .log("Took: %dns (%dms) to execute save of %d blocks", var7, TimeUnit.NANOSECONDS.toMillis(var7), var1.getBlockCount());
         class="kw">return var6;
      } catch (PrefabSaveException var9) {
         class="kw">switch (var9.getType()) {
            case ERROR:
               ((HytaleLogger.Api)BuilderToolsPlugin.get().getLogger().at(Level.WARNING).withCause(var9)).log("Exception saving prefab %s", var2);
               var0.sendMessage(
                  Message.translation("server.builderTools.errorSavingPrefab").param("name", var2.toString()).param("message", var9.getCause().getMessage())
               );
               break;
            case ALREADY_EXISTS:
               BuilderToolsPlugin.get().getLogger().at(Level.WARNING).log("Prefab already exists %s", var2.toString());
               var0.sendMessage(Message.translation("server.builderTools.prefabAlreadyExists"));
         }

         class="kw">return null;
      }
   }
}