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);
}
}
}