EntitySavingSystem class

Пакет: com.hypixel.hytale.server.core.entity

Файл: com/hypixel/hytale/server/core/entity/EntitySavingSystem.java

extends: TickingSystem<EntityStore>

implements: RunWhenPausedSystem<EntityStore>

Поля (20)

МодификаторыТипИмя
boolean[] var10
Dirty var10
CompletableFuture var10
UUIDComponent var11
BiConsumer var11
Ref var12
World var4
Store var4
Store var5
Dirty var7
CompletableFuture var7
var7
ChunkSavingSystems.Data var8
UUIDComponent var8
boolean var8
var8
int[] var9
Ref var9
boolean var9
var9

Методы (10)

МодификаторыВозвратСигнатура
static void dispatchDirtyEntityvoid dispatchDirtyEntity(@Nullable Executor var0, @Nonnull Store<EntityStore> var1, @Nonnull IChunkSaver.Cubic var2, @Nonnull ChunkSavingSystems.Data var3, @Nonnull Dirty var4, @Nonnull UUID var5, @Nonnull Ref<EntityStore> var6)
static void flushAllDirtyvoid flushAllDirty(@Nonnull World var0, @Nonnull IChunkSaver.Cubic var1, @Nonnull ChunkSavingSystems.Data var2, @Nullable Executor var3)
abstract for for(int var9 = 0; var9 < var7x.size()
abstract for for(int var6 = 0; var6 < var4x.size()
if if(var10[0])
if if(var4x != null)
if if(var0 != null)
if if(!var8)
if if(var7 != null)
if if(!var9)

Исходный код

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

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.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
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.IChunkSaver;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.component.ChunkSavingSystems;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
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 EntitySavingSystem class="kw">extends TickingSystem<EntityStore> class="kw">implements RunWhenPausedSystem<EntityStore> {
   @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<EntityStore> QUERY = Query.and(
      Dirty.getComponentType(),
      UUIDComponent.getComponentType(),
      Query.not(EntityStore.REGISTRY.getNonSerializedComponentType()),
      Query.not(Player.getComponentType())
   );

   class="kw">public EntitySavingSystem() {
   }

   @Nonnull
   @Override
   class="kw">public Set<Dependency<EntityStore>> getDependencies() {
      class="kw">return RootDependency.lastSet();
   }

   @Override
   class="kw">public void tick(float var1, int var2, @Nonnull Store<EntityStore> var3) {
      World var4 = var3.getExternalData().getWorld();
      if (!var4.isSavingLocked() && var4.getWorldConfig().canSaveChunks()) {
         Store var5 = var4.getChunkStore().getStore();
         if (var4.getChunkStore().getSaver() class="kw">instanceof IChunkSaver.Cubic var7) {
            ChunkSavingSystems.Data var8 = var5.getResource(ChunkStore.SAVE_RESOURCE);
            int[] var9 = new int[]{0};
            boolean[] var10 = new boolean[]{true};
            var3.forEachChunk(QUERY, (var7x, var8x) -> {
               for (int var9 = 0; var9 < var7x.size(); var9++) {
                  Dirty var10 = var7x.getComponent(var9, Dirty.getComponentType());
                  assert var10 != null;
                  if (var10.isDirty() && !var10.isSaving() && !(var10.pollCooldown(var1) > 0.0F)) {
                     var9[0]++;
                     if (var10[0]) {
                        if (!var8.tryReserveInFlight()) {
                           var10[0] = false;
                        } else {
                           UUIDComponent var11 = var7x.getComponent(var9, UUIDComponent.getComponentType());
                           assert var11 != null;
                           Ref var12 = var7x.getReferenceTo(var9);
                           dispatchDirtyEntity(var4, var3, var7, var8, var10, var11.getUuid(), var12);
                        }
                     }
                  }
               }
            });
            var8.setDirtyEntitiesBacklog(var9[0]);
         }
      }
   }

   class="kw">public class="kw">static void flushAllDirty(@Nonnull World var0, @Nonnull IChunkSaver.Cubic var1, @Nonnull ChunkSavingSystems.Data var2, @Nullable Executor var3) {
      Store var4 = var0.getEntityStore().getStore();
      var4.forEachChunk(QUERY, (var4x, var5) -> {
         for (int var6 = 0; var6 < var4x.size(); var6++) {
            Dirty var7 = var4x.getComponent(var6, Dirty.getComponentType());
            assert var7 != null;
            if (var7.isDirty() && !var7.isSaving()) {
               var2.awaitInFlightCapacity();
               UUIDComponent var8 = var4x.getComponent(var6, UUIDComponent.getComponentType());
               assert var8 != null;
               Ref var9 = var4x.getReferenceTo(var6);
               dispatchDirtyEntity(var3, var4, var1, var2, var7, var8.getUuid(), var9);
            }
         }
      });
   }

   class="kw">private class="kw">static void dispatchDirtyEntity(
      @Nullable Executor var0,
      @Nonnull Store<EntityStore> var1,
      @Nonnull IChunkSaver.Cubic var2,
      @Nonnull ChunkSavingSystems.Data var3,
      @Nonnull Dirty var4,
      @Nonnull UUID var5,
      @Nonnull Ref<EntityStore> var6
   ) {
      CompletableFuture var7 = null;
      boolean var8 = false;
      boolean var9 = false;

      try {
         var7 = var2.saveEntity(var5, var1, var6);
         var7.whenComplete((var1x, var2x) -> var3.releaseInFlight());
         var9 = true;
         var4.consumeDirty();
         var4.setSaving(var7);
         var3.pushSavingFuture(var7);
         var8 = true;
         CompletableFuture var10 = var7;
         BiConsumer var11 = (var3x, var4x) -> {
            if (var4x != null) {
               ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var4x)).log("Failed to save entity %s:", var5);
               var4.markDirty();
            } else {
               LOGGER.at(Level.FINEST).log("Finished saving entity %s", var5);
            }

            var4.clearSaving(var10);
         };
         if (var0 != null) {
            var10.whenCompleteAsync(var11, var0);
         } else {
            var10.whenComplete(var11);
         }
      } class="kw">finally {
         if (!var8) {
            if (var7 != null) {
               var4.markDirty();
               var4.clearSaving(var7);
            }

            if (!var9) {
               var3.releaseInFlight();
            }
         }
      }
   }
}