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