SaveCall interface

Пакет: com.hypixel.hytale.server.core.universe.world.storage.component

Файл: com/hypixel/hytale/server/core/universe/world/storage/component/SectionSavingSystem.java

Методы (1)

МодификаторыВозвратСигнатура
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)

Исходный код

Показать/скрыть
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
      );
   }
}