PrefabEditSessionManager class

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

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

Поля (151)

МодификаторыТипИмя
break
break
return
World var1
Store var1
short var10
var10
var10
PrefabLoadingState var10
int var10
CompletableFuture var10
int var10
var10
Transform var10
Path var11
Teleport var11
String var12
IPrefabBuffer var12
Path var12
TransformComponent var13
int var13
Path var13
Transform var14
IPrefabBuffer var14
int var14
var14
var14
Object2ObjectOpenHashMap var14
PrefabEditSession var15
int var15
CompletableFuture var16
var16
var16
IPrefabBuffer var16
Path var17
Path var17
WorldConfig var18
int var18
Path var18
boolean var19
int var19
int var19
Integer var19
EventRegistry var2
Ref var2
World var2
Environment var2
WorldTimeResource var2
String var20
int var20
int var21
int var21
Vector3i var22
var22
var22
int var23
int var24
Vector3i var25
int[] var28
int var29
Store var3
UUIDComponent var3
Holder var3
PrefabLoadingState.Phase var3
IWeightedMap var3
Vector3i var3
int[] var3
String var3
List var31
int var32
var32
int var33
Vector3i var34
int var35
Vector3i var36
World var4
UUID var4
InventoryComponent.Hotbar var4
UUIDComponent var4
long var4
Teleport var4
String[] var4
String var4
Vector3i var4
PrefabRowSplitMode var4
String var4
PrefabEditSession var4
PrefabLoadingState var4
MovementStatesComponent var5
ItemContainer var5
PrefabEditSession var5
PlayerRef var5
double[] var5
Color var5
var5
Store var5
int var5
List var5
String var5
PrefabEditSession var5
World var5
MovementStates var6
int var6
PrefabEditorCreationContext var6
PlayerRef var6
Color var6
WorldTimeResource var6
List var6
List var6
World var6
Runnable var6
PrefabEditSession var6
Player var7
Message var7
UUID var7
World var7
FlatWorldGenProvider.Layer var7
CompletableFuture[] var7
World var7
int[] var7
Path var7
Teleport var7
World var7
var7
PlayerRef var8
ItemStack var8
PrefabLoadingState var8
PlayerRef var8
FlatWorldGenProvider.Layer var8
List var8
IntArrayList var8
int var8
CompletableFuture var8
var8
int var8
Transform var8
var8
ItemStack var9
PrefabEditorCreationContext var9
UUID var9
Vector3i var9
FlatWorldGenProvider.Layer var9
Path var9
int var9
var9
int var9
var9
var9
var9
int var9
World var9

Методы (78)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot have a negative y level for pasting prefabs")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot paste above or at the world height")
private record PendingPasterecord PendingPaste(@Nonnull IPrefabBuffer buffer, @Nonnull Path path, @Nonnull Vector3i position, @Nonnull Vector3i minPoint, @Nonnull Vector3i maxPoint, @Nonnull Vector3i anchorPosition)
private void applyWorldGenWorldConfigvoid applyWorldGenWorldConfig(@Nonnull PrefabEditorCreationContext var1, int var2, @Nonnull WorldConfig var3)
public void cancelLoadingvoid cancelLoading(@Nonnull UUID var1)
public void clearLoadingStatevoid clearLoadingState(@Nonnull UUID var1)
for for(short var7 = 0; var7 < var6; var7++)
for for(short var11 = 0; var11 < var6; var11++)
for for(CompletableFuture var13 : var7)
for for(PrefabEditSessionManager.PendingPaste var10 : var1)
for for(String var11 : var6)
for for(int var16 = 0; var16 < var2; var16++)
abstract for for(int var11 = 0; var11 < var6.size()
abstract for for(int var30 = 0; var30 < var8.size()
abstract for for(int var15 = 0; var15 < var6.size()
private int getAmountOfBlocksBelowPrefabint getAmountOfBlocksBelowPrefab(int var1, int var2)
public PrefabEditSession getPrefabEditSessionPrefabEditSession getPrefabEditSession(@Nonnull UUID var1)
static void givePrefabSelectorToolvoid givePrefabSelectorTool(@Nonnull Ref<EntityStore> var0, @Nonnull Player var1, @Nonnull PlayerRef var2, @Nonnull ComponentAccessor<EntityStore> var3)
abstract givePrefabSelectorTool givePrefabSelectorTool(var2, var7, var8, var3)
public boolean hasInProgressLoadingboolean hasInProgressLoading(@Nonnull UUID var1)
if if(var8 != null)
if if(var4 != null)
if if(var10 == -1)
if if(var1 != null)
if if(var6 == null)
if if(var9 == null)
if if(var1 != null)
if if(var3 != PrefabLoadingState.Phase.LOADING_PREFABS && var3 != PrefabLoadingState.Phase.PASTING_PREFABS)
if if(var5 != null)
if if(var5 != null)
if if(var5 != null)
if if(var5 != null)
if if(var3)
if if(var16 == null)
if if(var5 != null)
if if(var5 != null)
if if(var8x != null)
if if(var5 != null)
if if(var5 != null)
if if(var2 == null)
if if(var3x > var5[0])
if if(var6 != null)
if if(var10 - 2 >= 0)
if if(var4 != null)
if if(var10 == null)
if if(var4 != null)
if if(var4 != null)
if if(var21 > var9)
if if(var4 != null)
if if(var6x == null)
if if(var13 != var9)
if if(var18 != var9)
if if(var7x == null)
if if(var0 == null)
if if(var6 != null)
if if(var6 != null)
if if(var4 != PrefabRowSplitMode.NONE && var2 != 0)
if if(var4 == PrefabRowSplitMode.BY_SPECIFIED_FOLDER)
if if(var18 != null)
if if(var19 == null)
if if(var2 < 0)
if if(var4 == null)
if if(var5 == null)
if if(var3 != null)
if if(var7 == null || var8 == null)
if if(var5 != null)
if if(var6 != null)
public boolean isEditingAPrefabboolean isEditingAPrefab(@Nonnull UUID var1)
public boolean isInEditWorldboolean isInEditWorld(@Nonnull PlayerRef var1, @Nonnull Store<EntityStore> var2)
public boolean isLoadingCancelledboolean isLoadingCancelled(@Nonnull UUID var1)
private void notifyProgressvoid notifyProgress(@Nullable Consumer<PrefabLoadingState> var1, @Nonnull PrefabLoadingState var2)
public void onPlayerAddedToWorldvoid onPlayerAddedToWorld(@Nonnull AddPlayerToWorldEvent var1)
private void onPlayerReadyvoid onPlayerReady(@Nonnull PlayerReadyEvent var1)
void populateActiveEditSessionvoid populateActiveEditSession(@Nonnull UUID var1, @Nonnull PrefabEditSession var2)
void populatePrefabsBeingEditedvoid populatePrefabsBeingEdited(@Nonnull Path var1)
void scheduleAnchorEntityRecreationvoid scheduleAnchorEntityRecreation(@Nonnull PrefabEditSession var1)
public void updatePathOfLoadedPrefabvoid updatePathOfLoadedPrefab(@Nonnull Path var1, @Nonnull Path var2)
while while(var9 < var2)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabAlignment;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabRowSplitMode;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabStackingAxis;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.WorldGenType;
class="kw">import com.hypixel.hytale.common.map.IWeightedMap;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
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.event.EventRegistry;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.protocol.Color;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.protocol.MovementStates;
class="kw">import com.hypixel.hytale.protocol.SavedMovementStates;
class="kw">import com.hypixel.hytale.protocol.packets.inventory.SetActiveSlot;
class="kw">import com.hypixel.hytale.server.core.Constants;
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.asset.type.environment.config.WeatherForecast;
class="kw">import com.hypixel.hytale.server.core.asset.util.ColorParseUtil;
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.Player;
class="kw">import com.hypixel.hytale.server.core.entity.movement.MovementStatesComponent;
class="kw">import com.hypixel.hytale.server.core.event.events.player.AddPlayerToWorldEvent;
class="kw">import com.hypixel.hytale.server.core.event.events.player.PlayerReadyEvent;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabRotation;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferUtil;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.IPrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.spawn.GlobalSpawnProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.provider.FlatWorldGenProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.provider.VoidWorldGenProvider;
class="kw">import com.hypixel.hytale.server.core.util.PrefabUtil;
class="kw">import it.unimi.dsi.fastutil.ints.IntArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.File;
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.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.function.Consumer;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;

class="kw">public class PrefabEditSessionManager {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_PREFAB_EDIT_SESSION_MANAGER_EXISTING_EDIT_SESSION = Message.translation(
      "server.commands.prefabeditsessionmanager.existingEditSession"
   );
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_EDIT_PREFAB_SOMETHING_WENT_WRONG = Message.translation("server.commands.editprefab.somethingWentWrong");
   class="kw">public class="kw">static class="kw">final float NOON_TIME = 0.5F;
   class="kw">public class="kw">static class="kw">final String DEFAULT_NEW_WORLD_ZERO_COORDINATE_BLOCK_NAME = "Rock_Stone";
   class="kw">public class="kw">static class="kw">final String DEFAULT_ENVIRONMENT = "Zone1_Sunny";
   class="kw">private class="kw">static class="kw">final String PREFAB_SELECTOR_TOOL_ID = "EditorTool_PrefabEditing_SelectPrefab";
   class="kw">public class="kw">static class="kw">final String DEFAULT_CHUNK_ENVIRONMENT = "Env_Zone1_Plains";
   class="kw">public class="kw">static class="kw">final String PREFAB_EDITING_WORLD_NAME_PREFIX = "prefabEditor-";
   @Nonnull
   class="kw">public class="kw">static class="kw">final Color DEFAULT_TINT = new Color((byte)91, (byte)-98, (byte)40);
   class="kw">private class="kw">static class="kw">final long PROGRESS_UPDATE_INTERVAL_NANOS = 100000000L;
   class="kw">public class="kw">static class="kw">final String DEFAULT_GRASS_TINT_HEX = "#5B9E28";
   @Nonnull
   class="kw">private class="kw">static class="kw">final PrefabRotation PASTE_ROTATION = PrefabRotation.ROTATION_0;
   @Nonnull
   class="kw">private class="kw">final Map<UUID, PrefabEditSession> activeEditSessions = new Object2ObjectOpenHashMap();
   @Nonnull
   class="kw">private class="kw">final HashSet<Path> prefabsBeingEdited = new HashSet<>();
   @Nonnull
   class="kw">private class="kw">final Map<UUID, UUID> inProgressTeleportations = new Object2ObjectOpenHashMap();
   @Nonnull
   class="kw">private class="kw">final HashSet<UUID> inProgressLoading = new HashSet<>();
   @Nonnull
   class="kw">private class="kw">final HashSet<UUID> cancelledLoading = new HashSet<>();

   class="kw">public PrefabEditSessionManager(@Nonnull JavaPlugin var1) {
      EventRegistry var2 = var1.getEventRegistry();
      var2.registerGlobal(AddPlayerToWorldEvent.class, this::onPlayerAddedToWorld);
      var2.registerGlobal(PlayerReadyEvent.class, this::onPlayerReady);
   }

   class="kw">private void onPlayerReady(@Nonnull PlayerReadyEvent var1) {
      Ref var2 = var1.getPlayerRef();
      if (var2.isValid()) {
         Store var3 = var2.getStore();
         World var4 = var3.getExternalData().getWorld();
         var4.execute(() -> {
            UUIDComponent var3 = var3.getComponent(var2, UUIDComponent.getComponentType());
            assert var3 != null;
            UUID var4 = var3.getUuid();
            if (this.inProgressTeleportations.containsKey(var4)) {
               this.inProgressTeleportations.remove(var4);
               MovementStatesComponent var5 = var3.getComponent(var2, MovementStatesComponent.getComponentType());
               assert var5 != null;
               MovementStates var6 = var5.getMovementStates();
               Player var7 = var3.getComponent(var2, Player.getComponentType());
               assert var7 != null;
               Player.applyMovementStates(var2, new SavedMovementStates(true), var6, var3);
               PlayerRef var8 = var3.getComponent(var2, PlayerRef.getComponentType());
               if (var8 != null) {
                  givePrefabSelectorTool(var2, var7, var8, var3);
               }
            }
         });
      }
   }

   class="kw">private class="kw">static void givePrefabSelectorTool(
      @Nonnull Ref<EntityStore> var0, @Nonnull Player var1, @Nonnull PlayerRef var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      InventoryComponent.Hotbar var4 = var3.getComponent(var0, InventoryComponent.Hotbar.getComponentType());
      if (var4 != null) {
         ItemContainer var5 = var4.getInventory();
         int var6 = var5.getCapacity();

         for (short var7 = 0; var7 < var6; var7++) {
            ItemStack var8 = var5.getItemStack(var7);
            if (var8 != null && !var8.isEmpty() && "EditorTool_PrefabEditing_SelectPrefab".equals(var8.getItemId())) {
               var4.setActiveSlot((byte)var7, var0, var3);
               var2.getPacketHandler().writeNoCache(new SetActiveSlot(-1, (byte)var7));
               class="kw">return;
            }
         }

         short var10 = -1;

         for (short var11 = 0; var11 < var6; var11++) {
            ItemStack var9 = var5.getItemStack(var11);
            if (var9 == null || var9.isEmpty()) {
               var10 = var11;
               break;
            }
         }

         if (var10 == -1) {
            var10 = 0;
         }

         var5.setItemStackForSlot(var10, new ItemStack("EditorTool_PrefabEditing_SelectPrefab"));
         var4.setActiveSlot((byte)var10, var0, var3);
         var2.getPacketHandler().writeNoCache(new SetActiveSlot(-1, (byte)var10));
      }
   }

   class="kw">public void onPlayerAddedToWorld(@Nonnull AddPlayerToWorldEvent var1) {
      World var2 = var1.getWorld();
      Holder var3 = var1.getHolder();
      UUIDComponent var4 = var3.getComponent(UUIDComponent.getComponentType());
      assert var4 != null;
      if (var2.getName().startsWith("prefabEditor-")) {
         var2.execute(() -> this.inProgressTeleportations.put(var4.getUuid(), var2.getWorldConfig().getUuid()));
      } else if (this.isEditingAPrefab(var4.getUuid())) {
         PrefabEditSession var5 = this.getPrefabEditSession(var4.getUuid());
         var5.setWorldArrivedFrom(var2.getWorldConfig().getUuid());
      }
   }

   class="kw">public void updatePathOfLoadedPrefab(@Nonnull Path var1, @Nonnull Path var2) {
      this.prefabsBeingEdited.remove(var1);
      this.prefabsBeingEdited.add(var2);
   }

   class="kw">public boolean isEditingAPrefab(@Nonnull UUID var1) {
      class="kw">return this.activeEditSessions.containsKey(var1);
   }

   class="kw">public PrefabEditSession getPrefabEditSession(@Nonnull UUID var1) {
      class="kw">return this.activeEditSessions.get(var1);
   }

   @Nonnull
   class="kw">public Map<UUID, PrefabEditSession> getActiveEditSessions() {
      class="kw">return this.activeEditSessions;
   }

   void populateActiveEditSession(@Nonnull UUID var1, @Nonnull PrefabEditSession var2) {
      this.activeEditSessions.put(var1, var2);
   }

   void populatePrefabsBeingEdited(@Nonnull Path var1) {
      this.prefabsBeingEdited.add(var1);
   }

   void scheduleAnchorEntityRecreation(@Nonnull PrefabEditSession var1) {
      CompletableFuture.runAsync(() -> {
         World var1 = Universe.get().getWorld(var1.getWorldName());
         if (var1 != null) {
            var1.execute(() -> {
               for (PrefabEditingMetadata var3 : var1.getLoadedPrefabMetadata().values()) {
                  var3.recreateAnchorEntity(var1);
               }
            });
         }
      });
   }

   class="kw">public boolean hasInProgressLoading(@Nonnull UUID var1) {
      class="kw">return this.inProgressLoading.contains(var1);
   }

   class="kw">public void cancelLoading(@Nonnull UUID var1) {
      this.cancelledLoading.add(var1);
   }

   class="kw">public boolean isLoadingCancelled(@Nonnull UUID var1) {
      class="kw">return this.cancelledLoading.contains(var1);
   }

   class="kw">public void clearLoadingState(@Nonnull UUID var1) {
      this.inProgressLoading.remove(var1);
      this.cancelledLoading.remove(var1);
   }

   @Nonnull
   class="kw">public CompletableFuture<Void> createEditSessionForNewPrefab(
      @Nonnull Ref<EntityStore> var1, @Nonnull Player var2, @Nonnull PrefabEditorCreationSettings var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      PlayerRef var5 = var4.getComponent(var1, PlayerRef.getComponentType());
      assert var5 != null;
      PrefabEditorCreationContext var6 = var3.finishProcessing(var2, var5, true);
      if (var6 == null) {
         Message var7 = var3.getFailureMessage();
         var5.sendMessage(var7 != null ? var7 : MESSAGE_COMMANDS_EDIT_PREFAB_SOMETHING_WENT_WRONG);
         class="kw">return CompletableFuture.completedFuture(null);
      } else {
         class="kw">return this.createEditSession(var1, var6, true, var4);
      }
   }

   @Nullable
   class="kw">public CompletableFuture<Void> loadPrefabAndCreateEditSession(
      @Nonnull Ref<EntityStore> var1, @Nonnull Player var2, @Nonnull PrefabEditorCreationSettings var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      class="kw">return this.loadPrefabAndCreateEditSession(var1, var2, var3, var4, null);
   }

   @Nullable
   class="kw">public CompletableFuture<Void> loadPrefabAndCreateEditSession(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Player var2,
      @Nonnull PrefabEditorCreationSettings var3,
      @Nonnull ComponentAccessor<EntityStore> var4,
      @Nullable Consumer<PrefabLoadingState> var5
   ) {
      PlayerRef var6 = var4.getComponent(var1, PlayerRef.getComponentType());
      assert var6 != null;
      UUID var7 = var6.getUuid();
      if (this.inProgressLoading.contains(var7)) {
         PrefabLoadingState var10 = new PrefabLoadingState();
         var10.addError("server.commands.editprefab.error.loadingInProgress");
         this.notifyProgress(var5, var10);
         var6.sendMessage(Message.translation("server.commands.editprefab.error.loadingInProgress"));
         class="kw">return null;
      } else {
         this.inProgressLoading.add(var7);
         this.cancelledLoading.remove(var7);
         PrefabLoadingState var8 = new PrefabLoadingState();
         var8.setPhase(PrefabLoadingState.Phase.INITIALIZING);
         this.notifyProgress(var5, var8);
         PrefabEditorCreationContext var9 = var3.finishProcessing(var2, var6, false);
         if (var9 == null) {
            this.inProgressLoading.remove(var7);
            var8.addError("server.commands.editprefab.error.processingFailed");
            this.notifyProgress(var5, var8);
            class="kw">return null;
         } else if (var9.getPrefabPaths().isEmpty()) {
            this.inProgressLoading.remove(var7);
            var8.addError("server.commands.editprefab.error.noPrefabsFound");
            this.notifyProgress(var5, var8);
            var6.sendMessage(MESSAGE_COMMANDS_EDIT_PREFAB_SOMETHING_WENT_WRONG);
            class="kw">return null;
         } else {
            var8.setTotalPrefabs(var9.getPrefabPaths().size());
            this.notifyProgress(var5, var8);
            class="kw">return this.createEditSession(var1, var9, false, var4, var8, var5);
         }
      }
   }

   class="kw">private void notifyProgress(@Nullable Consumer<PrefabLoadingState> var1, @Nonnull PrefabLoadingState var2) {
      if (var1 != null) {
         PrefabLoadingState.Phase var3 = var2.getCurrentPhase();
         if (var3 != PrefabLoadingState.Phase.LOADING_PREFABS && var3 != PrefabLoadingState.Phase.PASTING_PREFABS) {
            var1.accept(var2);
         } else {
            long var4 = System.nanoTime();
            if (var4 - var2.getLastNotifyTimeNanos() >= 100000000L) {
               var2.setLastNotifyTimeNanos(var4);
               var1.accept(var2);
            }
         }
      }
   }

   @Nonnull
   class="kw">private CompletableFuture<Void> createEditSession(
      @Nonnull Ref<EntityStore> var1, @Nonnull PrefabEditorCreationContext var2, boolean var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      class="kw">return this.createEditSession(var1, var2, var3, var4, null, null);
   }

   @Nonnull
   class="kw">private CompletableFuture<Void> createEditSession(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull PrefabEditorCreationContext var2,
      boolean var3,
      @Nonnull ComponentAccessor<EntityStore> var4,
      @Nullable PrefabLoadingState var5,
      @Nullable Consumer<PrefabLoadingState> var6
   ) {
      World var7 = var4.getExternalData().getWorld();
      PlayerRef var8 = var4.getComponent(var1, PlayerRef.getComponentType());
      assert var8 != null;
      UUID var9 = var8.getUuid();
      if (this.activeEditSessions.containsKey(var9)) {
         if (var5 != null) {
            var5.addError("server.commands.editprefab.error.existingSession");
            this.notifyProgress(var6, var5);
         }

         var8.sendMessage(MESSAGE_COMMANDS_PREFAB_EDIT_SESSION_MANAGER_EXISTING_EDIT_SESSION);
         class="kw">return CompletableFuture.completedFuture(null);
      } else {
         for (Path var11 : var2.getPrefabPaths()) {
            if (this.prefabsBeingEdited.contains(var11)) {
               if (var5 != null) {
                  var5.addError("server.commands.editprefab.error.alreadyBeingEdited", var11.toString());
                  this.notifyProgress(var6, var5);
               }

               var8.sendMessage(Message.translation("server.commands.prefabeditsessionmanager.alreadyBeingEdited").param("path", var11.toString()));
               class="kw">return CompletableFuture.completedFuture(null);
            }
         }

         if (var5 != null) {
            var5.setPhase(PrefabLoadingState.Phase.CREATING_WORLD);
            this.notifyProgress(var6, var5);
         }

         WorldConfig var18 = new WorldConfig();
         boolean var19 = var2.isWorldTickingEnabled();
         var18.setBlockSpawnersResolved(false);
         var18.setBlockTicking(var19);
         var18.setSpawningNPC(false);
         var18.setIsSpawnMarkersEnabled(false);
         var18.setObjectiveMarkersEnabled(false);
         var18.setGameMode(GameMode.Creative);
         var18.setDeleteOnRemove(false);
         var18.setUuid(UUID.randomUUID());
         var18.setGameTimePaused(true);
         var18.setIsAllNPCFrozen(true);
         var18.setSavingPlayers(true);
         var18.setCanSaveChunks(true);
         var18.setTicking(var19);
         var18.setForcedWeather(this.getWeatherFromEnvironment(var2.getEnvironment()));
         String var12 = this.getWorldName(var2);

         try {
            Files.createDirectories(this.getSavePath(var2));
         } catch (IOException var17) {
            if (var5 != null) {
               var5.addError("server.commands.editprefab.error.createDirectoryFailed", var17.getMessage());
               this.notifyProgress(var6, var5);
            }

            var8.sendMessage(Message.translation("server.commands.instances.createDirectory.failed").param("errormsg", var17.getMessage()));
            class="kw">return CompletableFuture.completedFuture(null);
         }

         TransformComponent var13 = var4.getComponent(var1, TransformComponent.getComponentType());
         assert var13 != null;
         Transform var14 = new Transform(var13.getTransform());
         PrefabEditSession var15 = new PrefabEditSession(var12, var9, var7.getWorldConfig().getUuid(), var14);
         CompletableFuture var16;
         if (var3) {
            var16 = this.getPrefabCreatingCompletableFuture(var2, var15, var18);
         } else {
            var16 = this.getPrefabLoadingCompletableFuture(var2, var15, var18, var5, var6, var9);
         }

         if (var16 == null) {
            if (var5 != null) {
               var5.addError("server.commands.editprefab.error.loadFailed");
               this.notifyProgress(var6, var5);
            }

            class="kw">return CompletableFuture.completedFuture(null);
         } else {
            class="kw">return var16.exceptionally(
                  var5x -> {
                     if (this.isLoadingCancelled(var9)) {
                        class="kw">return null;
                     }

                     ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var5x)).log("Error occurred during prefab editor session creation");
                     if (var5 != null) {
                        var5.addError("server.commands.editprefab.error.exception", var5x.getMessage());
                        this.notifyProgress(var6, var5);
                     }

                     var8.sendMessage(
                        Message.translation("server.commands.editprefab.error.exception")
                           .param("details", var5x.getMessage() != null ? var5x.getMessage() : "Unknown error")
                     );
                     class="kw">return null;
                  }
               )
               .thenAcceptAsync(var8x -> {
                  if (!this.isLoadingCancelled(var9)) {
                     if (var8x != null) {
                        if (var5 != null) {
                           var5.setPhase(PrefabLoadingState.Phase.FINALIZING);
                           this.notifyProgress(var6, var5);
                        }

                        Vector3i var9 = var15.getSpawnPoint();
                        var8x.getWorldConfig().setSpawnProvider(new GlobalSpawnProvider(new Transform(var9)));
                        CompletableFuture.runAsync(() -> var8x.getEntityStore().getStore().replaceResource(PrefabEditSession.getResourceType(), var15), var8x);
                        CompletableFuture.runAsync(() -> {
                           Teleport var4 = Teleport.createForPlayer(var8x, new Transform(var9));
                           var4.putComponent(var1, Teleport.getComponentType(), var4);
                        }, var7);
                     }
                  }
               })
               .thenRun(() -> {
                  if (!this.isLoadingCancelled(var9)) {
                     this.prefabsBeingEdited.addAll(var2.getPrefabPaths());
                     this.activeEditSessions.put(var9, var15);
                     if (var5 != null) {
                        var5.markComplete();
                        this.notifyProgress(var6, var5);
                     }

                     var8.sendMessage(Message.translation("server.commands.prefabeditsessionmanager.success." + (var3 ? "new" : "load")));
                  }
               })
               .whenComplete((var2x, var3x) -> this.inProgressLoading.remove(var9));
         }
      }
   }

   @Nonnull
   class="kw">private CompletableFuture<World> getWorldCreatingFuture(@Nonnull PrefabEditorCreationContext var1, @Nonnull WorldConfig var2) {
      class="kw">return Universe.get().makeWorld(this.getWorldName(var1), this.getSavePath(var1), var2, true);
   }

   @Nonnull
   class="kw">private String getWorldName(@Nonnull PrefabEditorCreationContext var1) {
      class="kw">return "prefabEditor-" + var1.getEditorRef().getUsername();
   }

   @Nonnull
   class="kw">private String getWeatherFromEnvironment(@Nullable String var1) {
      if (var1 != null && !var1.isEmpty()) {
         Environment var2 = Environment.getAssetMap().getAsset(var1);
         if (var2 == null) {
            class="kw">return "Zone1_Sunny";
         } else {
            IWeightedMap var3 = var2.getWeatherForecast(12);
            if (var3 != null && var3.size() != 0) {
               String[] var4 = new String[]{null};
               double[] var5 = new double[]{Double.NEGATIVE_INFINITY};
               var3.forEachEntry((var2x, var3x) -> {
                  if (var3x > var5[0]) {
                     var5[0] = var3x;
                     var4[0] = var2x.getWeatherId();
                  }
               });
               class="kw">return var4[0] != null ? var4[0] : "Zone1_Sunny";
            } else {
               class="kw">return "Zone1_Sunny";
            }
         }
      } else {
         class="kw">return "Zone1_Sunny";
      }
   }

   @Nonnull
   class="kw">private Path getSavePath(@Nonnull PrefabEditorCreationContext var1) {
      class="kw">return Constants.UNIVERSE_PATH.resolve("worlds").resolve(this.getWorldName(var1));
   }

   class="kw">private void applyWorldGenWorldConfig(@Nonnull PrefabEditorCreationContext var1, int var2, @Nonnull WorldConfig var3) {
      String var4 = var1.getEnvironment() != null ? var1.getEnvironment() : "Env_Zone1_Plains";
      Color var5 = DEFAULT_TINT;
      if (var1.getGrassTint() != null && !var1.getGrassTint().isEmpty()) {
         Color var6 = ColorParseUtil.parseColor(var1.getGrassTint());
         if (var6 != null) {
            var5 = var6;
         }
      }

      if (var1.getWorldGenType().equals(WorldGenType.FLAT)) {
         int var10 = Math.max(1, var2 - var1.getBlocksAboveSurface());
         FlatWorldGenProvider.Layer var7 = new FlatWorldGenProvider.Layer();
         var7.blockType = "Soil_Grass";
         var7.to = var10;
         var7.from = var10 - 1;
         var7.environment = var4;
         FlatWorldGenProvider.Layer var8 = new FlatWorldGenProvider.Layer();
         var8.blockType = "Empty";
         var8.to = 320;
         var8.from = var10;
         var8.environment = var4;
         if (var10 - 2 >= 0) {
            FlatWorldGenProvider.Layer var9 = new FlatWorldGenProvider.Layer();
            var9.blockType = "Soil_Clay";
            var9.to = var10 - 1;
            var9.from = 0;
            var9.environment = var4;
            var3.setWorldGenProvider(new FlatWorldGenProvider(var5, new FlatWorldGenProvider.Layer[]{var8, var7, var9}));
         } else {
            var3.setWorldGenProvider(new FlatWorldGenProvider(var5, new FlatWorldGenProvider.Layer[]{var8, var7}));
         }
      } else {
         var3.setWorldGenProvider(new VoidWorldGenProvider(var5, var4));
      }
   }

   @Nonnull
   class="kw">private CompletableFuture<World> getPrefabCreatingCompletableFuture(
      @Nonnull PrefabEditorCreationContext var1, @Nonnull PrefabEditSession var2, @Nonnull WorldConfig var3
   ) {
      this.applyWorldGenWorldConfig(var1, var1.getPasteLevelGoal() - 1, var3);
      class="kw">return this.getWorldCreatingFuture(var1, var3)
         .thenCompose(
            var2x -> CompletableFuture.supplyAsync(
               () -> {
                  Vector3i var3 = new Vector3i(0, var1.getPasteLevelGoal(), 0);
                  Vector3i var4 = new Vector3i(var3);
                  var2.addPrefab(
                     var1.getPrefabPaths().getFirst(),
                     new Vector3i(-1, var1.getPasteLevelGoal() - 1, -1),
                     new Vector3i(1, var1.getPasteLevelGoal() + 1, 1),
                     var4,
                     var3
                  );
                  Store var5 = var2x.getEntityStore().getStore();
                  WorldTimeResource var6 = var5.getResource(WorldTimeResource.getResourceType());
                  var6.setDayTime(0.5, var2x, var5);
                  var2x.setBlock(0, var1.getPasteLevelGoal(), 0, "Rock_Stone");
                  class="kw">return var2x;
               },
               var2x
            )
         );
   }

   @Nullable
   class="kw">private CompletableFuture<World> getPrefabLoadingCompletableFuture(
      @Nonnull PrefabEditorCreationContext var1,
      @Nonnull PrefabEditSession var2,
      @Nonnull WorldConfig var3,
      @Nullable PrefabLoadingState var4,
      @Nullable Consumer<PrefabLoadingState> var5,
      @Nonnull UUID var6
   ) {
      CompletableFuture[] var7 = new CompletableFuture[var1.getPrefabPaths().size()];
      if (var4 != null) {
         var4.setPhase(PrefabLoadingState.Phase.LOADING_PREFABS);
         this.notifyProgress(var5, var4);
      }

      for (int var8 = 0; var8 < var1.getPrefabPaths().size(); var8++) {
         Path var9 = var1.getPrefabPaths().get(var8);
         CompletableFuture var10 = this.getPrefabBuffer(var1.getEditorRef(), var9);
         if (var10 == null) {
            if (var4 != null) {
               var4.addError("server.commands.editprefab.error.prefabLoadFailed", var9.toString());
               this.notifyProgress(var5, var4);
            }

            class="kw">return null;
         }

         Path var11 = var9;
         var7[var8] = var10.thenApply(var4x -> {
            if (var4 != null) {
               var4.onPrefabLoaded(var11);
               this.notifyProgress(var5, var4);
            }

            class="kw">return (IPrefabBuffer)var4x;
         });
      }

      class="kw">return CompletableFuture.allOf(var7).thenApply(var7x -> {
         if (this.isLoadingCancelled(var6)) {
            class="kw">return null;
         }

         List var8 = new ObjectArrayList(var7.length);
         int var9 = 0;

         for (CompletableFuture var13 : var7) {
            IPrefabBuffer var14 = (IPrefabBuffer)var13.join();
            var8.add(var14);
            if (var1.loadChildPrefabs()) {
               for (PrefabBuffer.ChildPrefab var18 : var14.getChildPrefabs()) {
                  ;
               }
            }

            int var21 = Math.abs(var14.getMaxY() - var14.getMinY());
            if (var21 > var9) {
               var9 = var21;
            }
         }

         int var19 = this.getAmountOfBlocksBelowPrefab(var9, var1.getPasteLevelGoal());
         this.applyWorldGenWorldConfig(var1, var19, var3);
         if (var4 != null) {
            var4.setPhase(PrefabLoadingState.Phase.PASTING_PREFABS);
            this.notifyProgress(var5, var4);
         }

         if (this.isLoadingCancelled(var6)) {
            class="kw">return null;
         } else {
            String var20 = this.getWorldName(var1);
            if (Universe.get().getWorld(var20) != null) {
               LOGGER.at(Level.WARNING).log("Aborting prefab editor creation for %s: world '%s' already exists", var6, var20);
               class="kw">return null;
            } else {
               class="kw">return new Tri<>(var8, var19, this.getWorldCreatingFuture(var1, var3).join());
            }
         }
      }).thenCompose(var6x -> {
         if (var6x == null) {
            class="kw">return CompletableFuture.completedFuture(null);
         }

         World var7 = var6x.getRight();
         class="kw">return CompletableFuture.<List<PrefabEditSessionManager.PendingPaste>>supplyAsync(() -> {
            if (this.isLoadingCancelled(var6)) {
               class="kw">return null;
            }

            int var5 = (Integer)var6x.getMiddle();
            List var6 = (List<IPrefabBuffer>)var6x.getLeft();
            if (var7 != null && var7.isAlive()) {
               int[] var7 = this.calculateRowGroups(var1, var6.size());
               IntArrayList var8 = new IntArrayList();
               int var9 = -1;
               int var10 = -1;

               for (int var11 = 0; var11 < var6.size(); var11++) {
                  IPrefabBuffer var12 = var6.get(var11);
                  int var13 = var7[var11];
                  if (var13 != var9) {
                     var9 = var13;
                     var10++;
                     var8.add(0);
                  }

                  int var14;
                  if (var1.getStackingAxis().equals(PrefabStackingAxis.X)) {
                     var14 = var12.getMaxZ() - var12.getMinZ();
                  } else {
                     var14 = var12.getMaxX() - var12.getMinX();
                  }

                  var8.set(var10, Math.max(var8.getInt(var10), var14));
               }

               int[] var28 = new int[var8.size()];
               int var29 = 0;

               for (int var30 = 0; var30 < var8.size(); var30++) {
                  var28[var30] = var29;
                  var29 += var8.getInt(var30) + var1.getBlocksBetweenEachPrefab() + 1;
               }

               List var31 = new ObjectArrayList(var6.size());
               var9 = -1;
               var10 = -1;
               int var32 = 0;

               for (int var15 = 0; var15 < var6.size(); var15++) {
                  if (this.isLoadingCancelled(var6) || !var7.isAlive()) {
                     class="kw">return null;
                  }

                  IPrefabBuffer var16 = var6.get(var15);
                  Path var17 = var1.getPrefabPaths().get(var15);
                  int var18 = var7[var15];
                  if (var18 != var9) {
                     var9 = var18;
                     var10++;
                     var32 = 0;
                  }

                  int var19 = var28[var10];
                  int var20 = var16.getMaxX() - var16.getMinX();
                  int var21 = var16.getMaxZ() - var16.getMinZ();
                  Vector3i var22;
                  if (var1.getAlignment().equals(PrefabAlignment.ZERO)) {
                     var22 = new Vector3i(0, var5, 0);
                     var22.sub(Math.min(var16.getMinX(), 0), var16.getMinY(), Math.min(var16.getMinZ(), 0));
                     if (var1.getStackingAxis().equals(PrefabStackingAxis.X)) {
                        var22.add(var32, 0, var19);
                        var32 += var20 + var1.getBlocksBetweenEachPrefab() + 1;
                     } else {
                        var22.add(var19, 0, var32);
                        var32 += var21 + var1.getBlocksBetweenEachPrefab() + 1;
                     }
                  } else {
                     var22 = new Vector3i(0, var5 - Math.min(var16.getMinY(), 0), 0);
                     if (var1.getStackingAxis().equals(PrefabStackingAxis.X)) {
                        int var23 = var32 + Math.abs(Math.min(var16.getMinX(), 0));
                        int var24 = var19 + Math.abs(Math.min(var16.getMinZ(), 0));
                        var22.add(var23, 0, var24);
                        var32 += var20 + var1.getBlocksBetweenEachPrefab() + 1;
                     } else {
                        int var33 = var19 + Math.abs(Math.min(var16.getMinX(), 0));
                        int var35 = var32 + Math.abs(Math.min(var16.getMinZ(), 0));
                        var22.add(var33, 0, var35);
                        var32 += var21 + var1.getBlocksBetweenEachPrefab() + 1;
                     }
                  }

                  Vector3i var34 = new Vector3i(var22.x + var16.getMinX(), var22.y + var16.getMinY(), var22.z + var16.getMinZ());
                  Vector3i var36 = new Vector3i(var22.x + var16.getMaxX(), var22.y + var16.getMaxY(), var22.z + var16.getMaxZ());
                  Vector3i var25 = new Vector3i(var22.x + var16.getAnchorX(), var22.y + var16.getAnchorY(), var22.z + var16.getAnchorZ());
                  var31.add(new PrefabEditSessionManager.PendingPaste(var16, var17, var22, var34, var36, var25));
               }

               class="kw">return var31;
            } else {
               class="kw">return null;
            }
         }, var7).thenCompose(var7x -> {
            if (var7x == null) {
               class="kw">return CompletableFuture.completedFuture(null);
            }

            int var8 = 3;
            if (!var1.shouldLoadEntities()) {
               var8 |= 8;
            }

            class="kw">return this.pastePrefabs((List<PrefabEditSessionManager.PendingPaste>)var7x, var7, var2, var8, var4, var5, var6);
         });
      });
   }

   @Nonnull
   class="kw">private CompletableFuture<World> pastePrefabs(
      @Nonnull List<PrefabEditSessionManager.PendingPaste> var1,
      @Nonnull World var2,
      @Nonnull PrefabEditSession var3,
      int var4,
      @Nullable PrefabLoadingState var5,
      @Nullable Consumer<PrefabLoadingState> var6,
      @Nonnull UUID var7
   ) {
      CompletableFuture var8 = CompletableFuture.completedFuture(var2);

      for (PrefabEditSessionManager.PendingPaste var10 : var1) {
         var8 = var8.thenCompose(
            var7x -> var7x != null && !this.isLoadingCancelled(var7) && var7x.isAlive()
               ? PrefabUtil.loadPasteRegionAsync(var10.buffer(), var7x, var10.position(), PASTE_ROTATION, 0)
                  .thenApplyAsync(var8x -> this.pastePrefab(var10, var8x, var7x, var3, var4, var5, var6, var7), var7x)
               : CompletableFuture.completedFuture(null)
         );
      }

      class="kw">return var8.thenApplyAsync(var0 -> {
         if (var0 == null) {
            class="kw">return null;
         }

         Store var1 = var0.getEntityStore().getStore();
         WorldTimeResource var2 = var1.getResource(WorldTimeResource.getResourceType());
         var2.setDayTime(0.5, var0, var1);
         class="kw">return (World)var0;
      }, var2);
   }

   @Nullable
   class="kw">private World pastePrefab(
      @Nonnull PrefabEditSessionManager.PendingPaste var1,
      @Nonnull PrefabUtil.PasteRegion var2,
      @Nonnull World var3,
      @Nonnull PrefabEditSession var4,
      int var5,
      @Nullable PrefabLoadingState var6,
      @Nullable Consumer<PrefabLoadingState> var7,
      @Nonnull UUID var8
   ) {
      if (!var2.isFullyLoaded()) {
         LOGGER.at(Level.WARNING).log("Paste region for prefab %s is not fully loaded, parts of it will be missing", var1.path());
      }

      try {
         PrefabUtil.paste(
            var1.buffer(),
            var3,
            var1.position(),
            PASTE_ROTATION.getRotation(),
            new FastRandom(),
            var5,
            0,
            var2,
            PrefabUtil.NOOP_BLOCK_ENTITY_CONSUMER,
            PrefabUtil.NOOP_ENTITY_CONSUMER,
            var3.getEntityStore().getStore()
         );
         var4.addPrefab(var1.path(), var1.minPoint(), var1.maxPoint(), var1.anchorPosition(), new Vector3i(var1.position()));
         if (var6 != null) {
            var6.onPrefabPasted(var1.path());
            this.notifyProgress(var7, var6);
         }

         class="kw">return var3;
      } catch (Exception var10) {
         if (!this.isLoadingCancelled(var8) && var3.isAlive()) {
            ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var10)).log("Error pasting prefab: %s", var1.path());
            if (var6 != null) {
               var6.addError("server.commands.editprefab.error.pasteFailed", var1.path().getFileName().toString() + ": " + var10.getMessage());
               this.notifyProgress(var7, var6);
            }

            throw var10;
         } else {
            class="kw">return null;
         }
      }
   }

   @Nonnull
   class="kw">private int[] calculateRowGroups(@Nonnull PrefabEditorCreationContext var1, int var2) {
      int[] var3 = new int[var2];
      PrefabRowSplitMode var4 = var1.getRowSplitMode();
      List var5 = var1.getPrefabPaths();
      if (var4 != PrefabRowSplitMode.NONE && var2 != 0) {
         if (var4 == PrefabRowSplitMode.BY_SPECIFIED_FOLDER) {
            List var6 = var1.getUnprocessedPrefabPaths();
            Path var7 = var1.getPrefabRootDirectory().getPrefabPath();
            int var8 = 0;
            int var9 = 0;

            for (String var11 : var6) {
               Path var12 = var7.resolve(var11.replace('/', File.separatorChar).replace('\\', File.separatorChar));

               while (var9 < var2) {
                  Path var13 = var5.get(var9);
                  if (!var13.startsWith(var12) && (!var11.endsWith("/") && !var11.endsWith("\\") ? !var13.equals(var12) : !var13.startsWith(var12))) {
                     break;
                  }

                  var3[var9] = var8;
                  var9++;
               }

               var8++;
            }
         } else if (var4 == PrefabRowSplitMode.BY_ALL_SUBFOLDERS) {
            Object2ObjectOpenHashMap var14 = new Object2ObjectOpenHashMap();
            int var15 = 0;

            for (int var16 = 0; var16 < var2; var16++) {
               Path var17 = var5.get(var16);
               Path var18 = var17.getParent();
               if (var18 != null) {
                  Integer var19 = (Integer)var14.get(var18);
                  if (var19 == null) {
                     var14.put(var18, var15);
                     var3[var16] = var15++;
                  } else {
                     var3[var16] = var19;
                  }
               } else {
                  var3[var16] = 0;
               }
            }
         }

         class="kw">return var3;
      } else {
         class="kw">return var3;
      }
   }

   class="kw">private int getAmountOfBlocksBelowPrefab(int var1, int var2) {
      if (var2 < 0) {
         throw new IllegalArgumentException("Cannot have a negative y level for pasting prefabs");
      } else if (var2 >= 320) {
         throw new IllegalArgumentException("Cannot paste above or at the world height");
      } else {
         class="kw">return Math.min(var2, 320 - var1);
      }
   }

   class="kw">public boolean isInEditWorld(@Nonnull PlayerRef var1, @Nonnull Store<EntityStore> var2) {
      String var3 = var2.getExternalData().getWorld().getName();
      String var4 = this.getPrefabEditSession(var1.getUuid()).getWorldName();
      class="kw">return var3.equals(var4);
   }

   @Nullable
   class="kw">public CompletableFuture<Void> sendToEditWorld(@Nonnull Ref<EntityStore> var1, @Nonnull World var2, @Nonnull PlayerRef var3) {
      PrefabEditSession var4 = this.getPrefabEditSession(var3.getUuid());
      if (var4 == null) {
         class="kw">return CompletableFuture.completedFuture(null);
      }

      String var5 = var4.getWorldName();
      World var6 = Universe.get().getWorld(var5);
      Teleport var7 = Teleport.createForPlayer(
         var6, var1.getStore().getComponent(var1, Player.getComponentType()).getPlayerConfigData().getPerWorldData(var5).getLastPosition()
      );
      class="kw">return CompletableFuture.runAsync(() -> var1.getStore().putComponent(var1, Teleport.getComponentType(), var7), var2);
   }

   @Nullable
   class="kw">public CompletableFuture<Void> exitEditSession(
      @Nonnull Ref<EntityStore> var1, @Nonnull World var2, @Nonnull PlayerRef var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      PrefabEditSession var5 = this.activeEditSessions.get(var3.getUuid());
      if (var5 == null) {
         class="kw">return null;
      }

      var5.hidePrefabAnchors(var3.getPacketHandler());
      Runnable var6 = () -> {
         World var3 = Universe.get().getWorld(var5.getWorldName());
         if (var3 != null) {
            var3.getWorldConfig().setDeleteOnRemove(true);
            Universe.get().removeWorld(var5.getWorldName());
         }

         for (PrefabEditingMetadata var6 : var5.getLoadedPrefabMetadata().values()) {
            this.prefabsBeingEdited.remove(var6.getPrefabPath());
         }

         this.activeEditSessions.remove(var3.getUuid());
         var3.sendMessage(Message.translation("server.commands.editprefab.closedEditSession"));
      };
      if (!this.isInEditWorld(var3, var1.getStore())) {
         class="kw">return CompletableFuture.runAsync(var6);
      }

      World var7 = Universe.get().getWorld(var5.getWorldArrivedFrom());
      Transform var8 = var5.getTransformArrivedFrom();
      if (var7 == null || var8 == null) {
         LOGGER.at(Level.WARNING)
            .log(
               "Prefab editor exit fallback triggered for player %s: returnWorld=%s (worldArrivedFrom=%s), returnLocation=%s. Using class="kw">default world spawn.",
               var3.getUuid(),
               var7 != null ? var7.getName() : "null",
               var5.getWorldArrivedFrom(),
               var8
            );
         var7 = Universe.get().getDefaultWorld();
         var8 = var7.getWorldConfig().getSpawnProvider().getSpawnPoint(var1, var4);
      }

      World var9 = var7;
      Transform var10 = var8;
      Teleport var11 = Teleport.createForPlayer(var9, var10);
      class="kw">return CompletableFuture.runAsync(() -> var4.putComponent(var1, Teleport.getComponentType(), var11), var2).thenRunAsync(var6);
   }

   @Nonnull
   class="kw">public CompletableFuture<Void> cleanupCancelledSession(@Nonnull UUID var1, @Nonnull String var2, @Nullable Consumer<PrefabLoadingState> var3) {
      this.cancelLoading(var1);
      PrefabLoadingState var4 = new PrefabLoadingState();
      var4.setPhase(PrefabLoadingState.Phase.CANCELLING);
      this.notifyProgress(var3, var4);
      class="kw">return CompletableFuture.runAsync(() -> {
         World var5 = Universe.get().getWorld(var2);
         if (var5 != null) {
            var4.setPhase(PrefabLoadingState.Phase.SHUTTING_DOWN_WORLD);
            this.notifyProgress(var3, var4);
            var5.getWorldConfig().setDeleteOnRemove(true);
            var4.setPhase(PrefabLoadingState.Phase.DELETING_WORLD);
            this.notifyProgress(var3, var4);
            Universe.get().removeWorld(var2);
         }

         PrefabEditSession var6 = this.activeEditSessions.remove(var1);
         if (var6 != null) {
            for (PrefabEditingMetadata var9 : var6.getLoadedPrefabMetadata().values()) {
               this.prefabsBeingEdited.remove(var9.getPrefabPath());
            }
         }

         this.inProgressLoading.remove(var1);
         var4.setPhase(PrefabLoadingState.Phase.SHUTDOWN_COMPLETE);
         this.notifyProgress(var3, var4);
      });
   }

   @Nonnull
   class="kw">public CompletableFuture<Void> cleanupCancelledSession(@Nonnull UUID var1, @Nonnull String var2) {
      class="kw">return this.cleanupCancelledSession(var1, var2, null);
   }

   @Nullable
   class="kw">private CompletableFuture<IPrefabBuffer> getPrefabBuffer(@Nonnull CommandSender var1, @Nonnull Path var2) {
      if (!PrefabStore.get().prefabExists(var2)) {
         var1.sendMessage(Message.translation("server.commands.editprefab.prefabNotFound").param("name", var2.toString()));
         class="kw">return null;
      } else {
         class="kw">return CompletableFuture.supplyAsync(() -> PrefabBufferUtil.getCached(var2));
      }
   }

   class="kw">private record PendingPaste(
      @Nonnull IPrefabBuffer buffer,
      @Nonnull Path path,
      @Nonnull Vector3i position,
      @Nonnull Vector3i minPoint,
      @Nonnull Vector3i maxPoint,
      @Nonnull Vector3i anchorPosition
   ) {
      class="kw">private PendingPaste {
      }
   }
}