WorldGenReloadCommand class

Пакет: com.hypixel.hytale.server.core.command.commands.world.worldgen

Файл: com/hypixel/hytale/server/core/command/commands/world/worldgen/WorldGenReloadCommand.java

extends: AbstractAsyncWorldCommand

Поля (22)

МодификаторыТипИмя
final AtomicBoolean IS_RUNNING
int var11
int var12
ChunkStore var2
WorldConfig var3
Store var3
ChunkStore var4
ChunkSavingSystems.Data var4
AtomicInteger var4
IEventDispatcher var4
IWorldGen var5
IChunkSaver var5
double var5
int var5
LongSet var5
IWorldMap var6
ObjectArrayList var6
ObjectArrayList var7
LongIterator var7
LongListIterator var8
long var8
long var9

Методы (3)

МодификаторыВозвратСигнатура
if if(var5 == null)
if if(var5 > 0 && var5 % 64 == 0)
abstract super super("reload", "server.commands.worldgen.reload.desc")

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.command.commands.world.worldgen;

class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.event.IEventDispatcher;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.logger.sentry.SkipSentryException;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
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.arguments.system.FlagArg;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractAsyncWorldCommand;
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.events.WorldGenChunksClearedEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
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.server.core.universe.world.worldgen.IWorldGen;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.WorldGenLoadException;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldmap.IWorldMap;
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.LongListIterator;
class="kw">import it.unimi.dsi.fastutil.longs.LongSet;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.IOException;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.atomic.AtomicBoolean;
class="kw">import java.util.concurrent.atomic.AtomicInteger;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

class="kw">public class WorldGenReloadCommand class="kw">extends AbstractAsyncWorldCommand {
   class="kw">private class="kw">static class="kw">final AtomicBoolean IS_RUNNING = new AtomicBoolean(false);
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_RELOAD_STARTED = Message.translation("server.commands.worldgen.reload.started");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_RELOAD_COMPLETE = Message.translation("server.commands.worldgen.reload.complete");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_RELOAD_CHUNK_SAVING_DISABLED = Message.translation(
      "server.commands.worldgen.reload.chunkSavingDisabled"
   );
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_RELOAD_DELETING_CHUNKS = Message.translation("server.commands.worldgen.reload.deletingChunks");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MKESSAGE_COMMANDS_WORLD_GEN_RELOAD_CHUNK_SAVING_ENABLED = Message.translation(
      "server.commands.worldgen.reload.chunkSavingEnabled"
   );
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_RELOAD_REGENERATING_LOADED_CHUNKS = Message.translation(
      "server.commands.worldgen.reload.regeneratingLoadedChunks"
   );
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_RELOAD_CHUNK_SAVING_ENABLED = Message.translation(
      "server.commands.worldgen.reload.chunkSavingEnabled"
   );
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_RELOAD_ALREADY_IN_PROGRESS = Message.translation("server.commands.worldgen.reload.alreadyInProgress");
   @Nonnull
   class="kw">public class="kw">static class="kw">final Message MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_ABORT = Message.translation("server.commands.worldgen.reload.abort");
   @Nonnull
   class="kw">private class="kw">final FlagArg clearArg = this.withFlagArg("clear", "server.commands.worldgen.reload.clear.desc");

   class="kw">public WorldGenReloadCommand() {
      super("reload", "server.commands.worldgen.reload.desc");
   }

   @Nonnull
   @Override
   class="kw">protected CompletableFuture<Void> executeAsync(@Nonnull CommandContext var1, @Nonnull World var2) {
      if (IS_RUNNING.get()) {
         var1.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_RELOAD_ALREADY_IN_PROGRESS);
         class="kw">return CompletableFuture.completedFuture(null);
      }

      var1.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_RELOAD_STARTED);
      WorldConfig var3 = var2.getWorldConfig();
      ChunkStore var4 = var2.getChunkStore();
      if (IS_RUNNING.getAndSet(true)) {
         var1.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_BENCHMARK_ABORT);
         class="kw">return CompletableFuture.completedFuture(null);
      }

      try {
         IWorldGen var5 = var3.getWorldGenProvider().getGenerator();
         var4.setGenerator(var5);
         var3.setDefaultSpawnProvider(var5);
         var3.markChanged();
         IWorldMap var6 = var3.getWorldMapProvider().getGenerator(var2);
         var2.getWorldMapManager().setGenerator(var6);
         var1.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_RELOAD_COMPLETE);
      } catch (WorldGenLoadException var11) {
         var1.sendMessage(Message.translation("server.commands.worldgen.reload.failed").param("error", var11.getTraceMessage("\n")));
         ((HytaleLogger.Api)HytaleLogger.getLogger().at(Level.SEVERE).withCause(new SkipSentryException(var11))).log("Failed to load WorldGen!");
         class="kw">return CompletableFuture.completedFuture(null);
      } catch (Exception var12) {
         var1.sendMessage(Message.translation("server.commands.worldgen.reload.failed").param("error", var12.getMessage()));
         ((HytaleLogger.Api)HytaleLogger.getLogger().at(Level.SEVERE).withCause(var12)).log("Exception when trying to load WorldGen!");
         class="kw">return CompletableFuture.completedFuture(null);
      } class="kw">finally {
         IS_RUNNING.set(false);
      }

      class="kw">return this.clearArg.provided(var1) ? clearChunks(var1, var2) : CompletableFuture.completedFuture(null);
   }

   @Nonnull
   class="kw">private class="kw">static CompletableFuture<Void> clearChunks(@Nonnull CommandContext var0, @Nonnull World var1) {
      ChunkStore var2 = var1.getChunkStore();
      Store var3 = var2.getStore();
      var1.lockSaving();
      ChunkSavingSystems.Data var4 = var3.getResource(ChunkStore.SAVE_RESOURCE);
      var4.clearSaveQueue();
      var0.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_RELOAD_CHUNK_SAVING_DISABLED);
      var0.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_RELOAD_DELETING_CHUNKS);
      IChunkSaver var5 = var2.getSaver();
      if (var5 == null) {
         var0.sendMessage(MKESSAGE_COMMANDS_WORLD_GEN_RELOAD_CHUNK_SAVING_ENABLED);
         class="kw">return CompletableFuture.completedFuture(null);
      } else {
         class="kw">return CompletableFuture.supplyAsync(SneakyThrow.sneakySupplier(() -> {
               try {
                  class="kw">return var5.getIndexes();
               } catch (IOException var3) {
                  ((HytaleLogger.Api)HytaleLogger.getLogger().at(Level.SEVERE).withCause(var3)).log("Failed to get chunk indexes for clearing!");
                  var0.sendMessage(Message.translation("server.commands.worldgen.reload.failed").param("error", var3.getMessage()));
                  throw SneakyThrow.sneakyThrow(var3);
               }
            }), var1)
            .thenComposeAsync(
               var3x -> {
                  AtomicInteger var4 = new AtomicInteger();
                  double var5 = var3x.size();
                  ObjectArrayList var7 = new ObjectArrayList();
                  LongListIterator var8 = var3x.iterator();

                  while (var8.hasNext()) {
                     long var9 = var8.nextLong();
                     int var11 = ChunkUtil.xOfChunkIndex(var9);
                     int var12 = ChunkUtil.zOfChunkIndex(var9);
                     var7.add(
                        var5.removeHolder(var11, var12)
                           .thenRun(
                              () -> {
                                 int var5 = var4.getAndIncrement();
                                 if (var5 > 0 && var5 % 64 == 0) {
                                    var1.execute(
                                       () -> var0.sendMessage(
                                          Message.translation("server.commands.worldgen.reload.deletingChunksProgress")
                                             .param("progress", MathUtil.round(var5 * 100 / var5, 2))
                                       )
                                    );
                                 }
                              }
                           )
                     );
                  }

                  class="kw">return CompletableFuture.allOf((CompletableFuture<?>[])var7.toArray(CompletableFuture[]::new));
               },
               var1
            )
            .thenComposeAsync(var3x -> {
               var0.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_RELOAD_REGENERATING_LOADED_CHUNKS);
               IEventDispatcher var4 = HytaleServer.get().getEventBus().dispatchFor(WorldGenChunksClearedEvent.class, var1.getName());
               if (var4.hasListener()) {
                  var4.dispatch(new WorldGenChunksClearedEvent(var1));
               }

               LongSet var5 = var2.getChunkIndexes();
               ObjectArrayList var6 = new ObjectArrayList();
               LongIterator var7 = var5.iterator();

               while (var7.hasNext()) {
                  long var8 = var7.nextLong();
                  var6.add(var2.getChunkReferenceAsync(var8, 9));
               }

               class="kw">return CompletableFuture.allOf((CompletableFuture<?>[])var6.toArray(CompletableFuture[]::new));
            }, var1)
            .thenRunAsync(() -> {
               var1.unlockSaving();
               var0.sendMessage(MESSAGE_COMMANDS_WORLD_GEN_RELOAD_CHUNK_SAVING_ENABLED);
            }, var1);
      }
   }
}