SectionSavingSystem class
Пакет: com.hypixel.hytale.server.core.universe.world.storage.component
Файл: com/hypixel/hytale/server/core/universe/world/storage/component/SectionSavingSystem.java
extends: TickingSystem<ChunkStore>
implements: RunWhenPausedSystem<ChunkStore>
Поля (20)
| Модификаторы | Тип | Имя |
|---|---|---|
|
int[] |
var10 |
|
EntitySection |
var10 |
|
boolean[] |
var11 |
|
ChunkSection |
var11 |
|
boolean |
var11 |
|
|
var11 |
|
Ref |
var12 |
|
boolean |
var12 |
|
|
var12 |
|
BlockComponentSection |
var13 |
|
CompletableFuture |
var13 |
|
EntitySection |
var14 |
|
BiConsumer |
var14 |
|
World |
var4 |
|
ChunkSavingSystems.Data |
var7 |
|
ChunkSection |
var7 |
|
int[] |
var8 |
|
Ref |
var8 |
|
int[] |
var9 |
|
BlockComponentSection |
var9 |
Методы (12)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
static |
void |
flushAllDirtyvoid flushAllDirty(@Nonnull Store<ChunkStore> var0, @Nonnull IChunkSaver.Cubic var1, @Nonnull ChunkSavingSystems.Data var2, @Nullable Executor var3) |
abstract |
|
for for(int var10 = 0; var10 < var8x.size() |
abstract |
|
for for(int var6 = 0; var6 < var4.size() |
|
|
if if(var11[0]) |
|
|
if if(var11[0]) |
|
|
if if(var11[0]) |
|
|
if if(var6x != null) |
|
|
if if(var0 != null) |
|
|
if if(!var11) |
|
|
if if(!var12) |
abstract |
CompletableFuture<Void> |
saveCompletableFuture<Void> save(@Nonnull IChunkSaver.Cubic var1,
int var2,
int var3,
int var4,
@Nonnull Store<ChunkStore> var5,
@Nonnull T var6,
@Nullable Executor var7,
@Nullable Runnable var8) |
static |
<T> void |
startSave<T> void startSave(@Nullable Executor var0,
@Nonnull ChunkSavingSystems.Data var1,
@Nonnull IChunkSaver.Cubic var2,
@Nonnull Store<ChunkStore> var3,
@Nonnull Savable var4,
@Nonnull T var5,
@Nonnull String var6,
@Nonnull SectionSavingSystem.SaveCall<T> var7,
int var8,
int var9,
int var10) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.storage.component;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.RootDependency;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.tick.RunWhenPausedSystem;
class="kw">import com.hypixel.hytale.component.system.tick.TickingSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockComponentSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.ChunkSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.EntitySection;
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.Savable;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.Executor;
class="kw">import java.util.function.BiConsumer;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class SectionSavingSystem class="kw">extends TickingSystem<ChunkStore> class="kw">implements RunWhenPausedSystem<ChunkStore> {
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Query.and(ChunkSection.getComponentType(), Query.not(ChunkStore.REGISTRY.getNonSerializedComponentType()));
@Nonnull
class="kw">private class="kw">static class="kw">final SectionSavingSystem.SaveCall<Ref<ChunkStore>> SAVE_SECTION_CALL = IChunkSaver.Cubic::saveSection;
@Nonnull
class="kw">private class="kw">static class="kw">final SectionSavingSystem.SaveCall<EntitySection> SAVE_ENTITY_SECTION_CALL = IChunkSaver.Cubic::saveEntitySection;
@Nonnull
class="kw">private class="kw">static class="kw">final SectionSavingSystem.SaveCall<BlockComponentSection> SAVE_BLOCK_COMPONENT_SECTION_CALL = IChunkSaver.Cubic::saveBlockComponentSection;
class="kw">public SectionSavingSystem() {
}
@Nonnull
@Override
class="kw">public Set<Dependency<ChunkStore>> getDependencies() {
class="kw">return RootDependency.lastSet();
}
@Override
class="kw">public void tick(float var1, int var2, @Nonnull Store<ChunkStore> var3) {
World var4 = var3.getExternalData().getWorld();
if (!var4.isSavingLocked() && var4.getWorldConfig().canSaveChunks()) {
if (var3.getExternalData().getSaver() class="kw">instanceof IChunkSaver.Cubic var6) {
ChunkSavingSystems.Data var7 = var3.getResource(ChunkStore.SAVE_RESOURCE);
int[] var8 = new int[]{0};
int[] var9 = new int[]{0};
int[] var10 = new int[]{0};
boolean[] var11 = new boolean[]{true};
var3.forEachChunk(
QUERY,
(var8x, var9x) -> {
for (int var10 = 0; var10 < var8x.size(); var10++) {
ChunkSection var11 = var8x.getComponent(var10, ChunkSection.getComponentType());
assert var11 != null;
if (var11.needsSaving() && !var11.isSaving()) {
var8[0]++;
if (var11[0]) {
if (var7.tryReserveInFlight()) {
Ref var12 = var8x.getReferenceTo(var10);
startSave(var4, var7, var6, var3, var11, var12, "chunk section", SAVE_SECTION_CALL, var11.getX(), var11.getY(), var11.getZ());
} else {
var11[0] = false;
}
}
}
EntitySection var14 = var8x.getComponent(var10, EntitySection.getComponentType());
if (var14 != null && var14.needsSaving() && !var14.isSaving()) {
var9[0]++;
if (var11[0]) {
if (var7.tryReserveInFlight()) {
startSave(
var4, var7, var6, var3, var14, var14, "entity section", SAVE_ENTITY_SECTION_CALL, var11.getX(), var11.getY(), var11.getZ()
);
} else {
var11[0] = false;
}
}
}
BlockComponentSection var13 = var8x.getComponent(var10, BlockComponentSection.getComponentType());
if (var13 != null && var13.needsSaving() && !var13.isSaving()) {
var10[0]++;
if (var11[0]) {
if (var7.tryReserveInFlight()) {
startSave(
var4,
var7,
var6,
var3,
var13,
var13,
"block component section",
SAVE_BLOCK_COMPONENT_SECTION_CALL,
var11.getX(),
var11.getY(),
var11.getZ()
);
} else {
var11[0] = false;
}
}
}
}
}
);
var7.setDirtySectionsBacklog(var8[0]);
var7.setDirtyEntitySectionsBacklog(var9[0]);
var7.setDirtyBlockComponentSectionsBacklog(var10[0]);
}
}
}
class="kw">public class="kw">static void flushAllDirty(
@Nonnull Store<ChunkStore> var0, @Nonnull IChunkSaver.Cubic var1, @Nonnull ChunkSavingSystems.Data var2, @Nullable Executor var3
) {
var0.forEachChunk(
QUERY,
(var4, var5) -> {
for (int var6 = 0; var6 < var4.size(); var6++) {
ChunkSection var7 = var4.getComponent(var6, ChunkSection.getComponentType());
assert var7 != null;
if (var7.needsSaving() && !var7.isSaving()) {
var2.awaitInFlightCapacity();
Ref var8 = var4.getReferenceTo(var6);
startSave(var3, var2, var1, var0, var7, var8, "chunk section", SAVE_SECTION_CALL, var7.getX(), var7.getY(), var7.getZ());
}
EntitySection var10 = var4.getComponent(var6, EntitySection.getComponentType());
if (var10 != null && var10.needsSaving() && !var10.isSaving()) {
var2.awaitInFlightCapacity();
startSave(var3, var2, var1, var0, var10, var10, "entity section", SAVE_ENTITY_SECTION_CALL, var7.getX(), var7.getY(), var7.getZ());
}
BlockComponentSection var9 = var4.getComponent(var6, BlockComponentSection.getComponentType());
if (var9 != null && var9.needsSaving() && !var9.isSaving()) {
var2.awaitInFlightCapacity();
startSave(
var3, var2, var1, var0, var9, var9, "block component section", SAVE_BLOCK_COMPONENT_SECTION_CALL, var7.getX(), var7.getY(), var7.getZ()
);
}
}
}
);
}
class="kw">private class="kw">static <T> void startSave(
@Nullable Executor var0,
@Nonnull ChunkSavingSystems.Data var1,
@Nonnull IChunkSaver.Cubic var2,
@Nonnull Store<ChunkStore> var3,
@Nonnull Savable var4,
@Nonnull T var5,
@Nonnull String var6,
@Nonnull SectionSavingSystem.SaveCall<T> var7,
int var8,
int var9,
int var10
) {
var4.setSaving(true);
boolean var11 = false;
boolean var12 = false;
try {
CompletableFuture var13 = var7.save(var2, var8, var9, var10, var3, var5, var0, var1::releaseInFlight);
var12 = true;
var4.consumeNeedsSaving();
var1.pushSavingFuture(var13);
var11 = true;
BiConsumer var14 = (var5x, var6x) -> {
if (var6x != null) {
((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var6x)).log("Failed to save %s (%d, %d, %d):", var6, var8, var9, var10);
var4.markNeedsSaving();
} else {
LOGGER.at(Level.FINEST).log("Finished saving %s (%d, %d, %d)", var6, var8, var9, var10);
}
var4.setSaving(false);
};
if (var0 != null) {
var13.whenCompleteAsync(var14, var0);
} else {
var13.whenComplete(var14);
}
} class="kw">finally {
if (!var11) {
var4.setSaving(false);
var4.markNeedsSaving();
if (!var12) {
var1.releaseInFlight();
}
}
}
}
@FunctionalInterface
class="kw">private class="kw">interface SaveCall<T> {
@Nonnull
CompletableFuture<Void> save(
@Nonnull IChunkSaver.Cubic var1,
int var2,
int var3,
int var4,
@Nonnull Store<ChunkStore> var5,
@Nonnull T var6,
@Nullable Executor var7,
@Nullable Runnable var8
);
}
}