InstanceMigrateCommand class

Пакет: com.hypixel.hytale.builtin.instances.command

Файл: com/hypixel/hytale/builtin/instances/command/InstanceMigrateCommand.java

extends: AbstractAsyncCommand

Поля (27)

МодификаторыТипИмя
final long CHUNK_UPDATE_INTERVAL
ChunkStore var1
CompletableFuture var10
ObjectArrayList var10
LongIterator var11
long var12
int var14
int var15
InstancesPlugin var2
ChunkSavingSystems.Data var2
List var3
CompletableFuture[] var4
AtomicLong var5
Path var5
Store var5
long var5
AtomicLong var6
Universe var6
IChunkLoader var6
Store var6
String var7
IChunkSaver var7
boolean var7
long var7
String var8
Path var9
LongList var9

Методы (4)

МодификаторыВозвратСигнатура
abstract for for(int var7 = 0; var7 < var3.size()
if if(var4x != null)
if if(var5 % 100L == 0L || var5 == var7)
abstract super super("migrate", "server.commands.instances.migrate.desc")

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.instances.InstancesPlugin;
class="kw">import com.hypixel.hytale.builtin.instances.config.InstanceWorldConfig;
class="kw">import com.hypixel.hytale.builtin.instances.removal.RemovalCondition;
class="kw">import com.hypixel.hytale.common.util.CompletableFutureUtil;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandContext;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractAsyncCommand;
class="kw">import com.hypixel.hytale.server.core.modules.migrations.ChunkMigrations;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.WorldConfig;
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 com.hypixel.hytale.server.core.universe.world.storage.IChunkLoader;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.IChunkSaver;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.component.ChunkSavingSystems;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.longs.LongIterator;
class="kw">import it.unimi.dsi.fastutil.longs.LongList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.nio.file.Path;
class="kw">import java.util.List;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.CompletionStage;
class="kw">import java.util.concurrent.atomic.AtomicLong;
class="kw">import javax.annotation.Nonnull;

class="kw">public class InstanceMigrateCommand class="kw">extends AbstractAsyncCommand {
   class="kw">private class="kw">static class="kw">final long CHUNK_UPDATE_INTERVAL = 100L;

   class="kw">public InstanceMigrateCommand() {
      super("migrate", "server.commands.instances.migrate.desc");
   }

   @Nonnull
   @Override
   class="kw">protected CompletableFuture<Void> executeAsync(@Nonnull CommandContext var1) {
      InstancesPlugin var2 = InstancesPlugin.get();
      List var3 = var2.getInstanceAssets();
      CompletableFuture[] var4 = new CompletableFuture[var3.size()];
      AtomicLong var5 = new AtomicLong();
      AtomicLong var6 = new AtomicLong();

      for (int var7 = 0; var7 < var3.size(); var7++) {
         String var8 = var3.get(var7);
         Path var9 = InstancesPlugin.getInstanceAssetPath(var8);
         CompletableFuture var10 = WorldConfig.load(var9.resolve("instance.bson"));
         var4[var7] = CompletableFutureUtil._catch(var10.thenCompose(var4x -> migrateInstance(var1, var8, var4x, var5, var6)));
         var4[var7].join();
      }

      class="kw">return CompletableFuture.allOf(var4).whenComplete((var3x, var4x) -> {
         if (var4x != null) {
            var1.sendMessage(Message.translation("server.commands.instances.migrate.failed").param("error", var4x.getMessage()));
         } else {
            var1.sendMessage(Message.translation("server.commands.instances.migrate.complete").param("worlds", var4.length).param("chunks", var5.get()));
         }
      });
   }

   @Nonnull
   class="kw">private class="kw">static CompletableFuture<Void> migrateInstance(
      @Nonnull CommandContext var0, @Nonnull String var1, @Nonnull WorldConfig var2, @Nonnull AtomicLong var3, @Nonnull AtomicLong var4
   ) {
      Path var5 = InstancesPlugin.getInstanceAssetPath(var1);
      Universe var6 = Universe.get();
      var2.setUuid(UUID.randomUUID());
      var2.setSavingPlayers(false);
      var2.setIsAllNPCFrozen(true);
      var2.setSavingConfig(false);
      var2.setTicking(false);
      var2.setGameMode(GameMode.Creative);
      var2.setDeleteOnRemove(false);
      var2.setCompassUpdating(false);
      InstanceWorldConfig.ensureAndGet(var2).setRemovalConditions(RemovalCondition.EMPTY);
      var2.markChanged();
      String var7 = "instance-migrate-" + InstancesPlugin.safeName(var1);
      class="kw">return var6.makeWorld(var7, var5, var2, true).thenCompose(var5x -> {
         IChunkLoader var6 = var5x.getChunkStore().getLoader();
         IChunkSaver var7 = var5x.getChunkStore().getSaver();
         class="kw">return CompletableFuture.<CompletableFuture<Void>>supplyAsync(() -> {
            ChunkStore var1 = var5x.getChunkStore();
            ChunkSavingSystems.Data var2 = var1.getStore().getResource(ChunkStore.SAVE_RESOURCE);
            var5x.lockSaving();
            class="kw">return var2.waitForSavingChunks();
         }, var5x).thenCompose(var0x -> (CompletionStage<Void>)var0x).thenComposeAsync(SneakyThrow.sneakyFunction(var8 -> {
            LongList var9 = var6.getIndexes();
            ObjectArrayList var10 = new ObjectArrayList(var9.size());
            LongIterator var11 = var9.iterator();

            while (var11.hasNext()) {
               long var12 = var11.nextLong();
               var3.incrementAndGet();
               int var14 = ChunkUtil.xOfChunkIndex(var12);
               int var15 = ChunkUtil.zOfChunkIndex(var12);
               var10.add(CompletableFutureUtil._catch(var6.loadHolder(var14, var15).thenComposeAsync(var4x -> {
                  Store var5 = var5x.getChunkStore().getStore();
                  Store var6 = var5x.getEntityStore().getStore();
                  boolean var7 = ChunkMigrations.migrate((Holder<ChunkStore>)var4x, ChunkStore.REGISTRY.getData(), var5, EntityStore.REGISTRY.getData(), var6);
                  class="kw">return var7 ? var7.saveHolder(var14, var15, (Holder<ChunkStore>)var4x) : CompletableFuture.completedFuture(null);
               }, var5x).whenComplete((var3x, var4x) -> {
                  long var5 = var4.incrementAndGet();
                  long var7 = var3.get();
                  if (var5 % 100L == 0L || var5 == var7) {
                     var0.sendMessage(Message.translation("server.commands.instances.migrate.update").param("chunks", var5).param("max", var7));
                  }
               })));
            }

            class="kw">return CompletableFuture.allOf((CompletableFuture<?>[])var10.toArray(CompletableFuture[]::new)).whenCompleteAsync((var4x, var5xx) -> {
               var5x.unlockSaving();
               var0.sendMessage(Message.translation("server.commands.instances.migrate.worldDone").param("asset", var1));
               Universe.get().removeWorld(var7);
            });
         }));
      });
   }
}