Collector class

Пакет: com.hypixel.hytale.builtin.adventure.worldevents.system

Файл: com/hypixel/hytale/builtin/adventure/worldevents/system/WorldEventStorageSystem.java

implements: IntBiObjectConsumer<ArchetypeChunk<EntityStore>, CommandBuffer<EntityStore>>, AutoCloseable

Поля (7)

МодификаторыТипИмя
protected static final ThreadLocal<WorldEventStorageSystem.Collector> LOCAL
protected final Map<UUID, Ref<EntityStore>> entities
protected final ComponentType<EntityStore, WorldEvent> eventComponent
protected final ObjectList<WorldEvent> events
protected final DynamicArray<Holder<EntityStore>> toAdd
protected final DynamicArray<Ref<EntityStore>> toRemove
WorldEvent var4

Методы (3)

МодификаторыВозвратСигнатура
public void acceptpublic void accept(int var1, @Nonnull ArchetypeChunk<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3)
public void closepublic void close()
protected static void collectEventsprotected static void collectEvents(@Nonnull WorldEvent var0, @Nonnull WorldEventStorageSystem.Collector var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.worldevents.system;

class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventManager;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventStorage;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventsPlugin;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.event.WorldEvent;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.util.DynamicArray;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.util.PrefabSnapshotUtil;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentRegistry;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.system.tick.TickingSystem;
class="kw">import com.hypixel.hytale.function.consumer.IntBiObjectConsumer;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.Intangible;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectList;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import javax.annotation.Nonnull;

class="kw">public class WorldEventStorageSystem class="kw">extends TickingSystem<EntityStore> {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">protected class="kw">final ResourceType<EntityStore, WorldEventManager> managerResourceType;
   @Nonnull
   class="kw">protected class="kw">final ResourceType<EntityStore, WorldEventStorage> storageResourceType;
   @Nonnull
   class="kw">protected class="kw">final ComponentType<EntityStore, WorldEvent> eventComponentType;
   @Nonnull
   class="kw">protected class="kw">final ComponentType<EntityStore, Intangible> intangibleComponentType;

   class="kw">public WorldEventStorageSystem(
      @Nonnull ResourceType<EntityStore, WorldEventManager> var1,
      @Nonnull ResourceType<EntityStore, WorldEventStorage> var2,
      @Nonnull ComponentType<EntityStore, WorldEvent> var3
   ) {
      this.managerResourceType = var1;
      this.storageResourceType = var2;
      this.eventComponentType = var3;
      this.intangibleComponentType = Intangible.getComponentType();
   }

   @Override
   class="kw">public void tick(float var1, int var2, @Nonnull Store<EntityStore> var3) {
      WorldEventStorage var4 = var3.getResource(this.storageResourceType);
      World var5 = var3.getExternalData().getWorld();
      class="kw">switch (var4.consumeState()) {
         case SAVE: {
            ((HytaleLogger.Api)LOGGER.atFine()).log("Saving world-events storage to disk");
            ComponentRegistry.Data var16 = var3.getRegistry().getData();
            var3.getResourceStorage().save(var3, var16, this.storageResourceType, var4).whenCompleteAsync(var4::onCompleteSave, var5);
            break;
         }
         case LOAD: {
            ((HytaleLogger.Api)LOGGER.atFine()).log("Loading world-events storage from disk");
            ComponentRegistry.Data var15 = var3.getRegistry().getData();
            var3.getResourceStorage().load(var3, var15, this.storageResourceType).whenCompleteAsync(var4::onCompleteLoad, var5);
            break;
         }
         case LOADED:
            try (WorldEventStorageSystem.Collector var6 = WorldEventStorageSystem.Collector.LOCAL.get()) {
               var4.forEach(var6, WorldEventStorageSystem.Collector::collectEvents);
               var3.forEachEntityParallel(this.eventComponentType, var6);
               int var7 = 0;
               int var8 = 0;

               for (int var9 = 0; var9 < var6.events.size(); var9++) {
                  WorldEvent var10 = (WorldEvent)var6.events.get(var9);
                  Ref var11 = var6.entities.get(var10.uuid);
                  if (var11 != null) {
                     assert var11.isValid();
                     WorldEvent var12 = var3.getComponent(var11, this.eventComponentType);
                     assert var12 != null;
                     if (var12 == var10) {
                        class="kw">continue;
                     }

                     var12.uuid = WorldEvent.EMPTY_ID;
                     var6.toRemove.add(var11);
                     var10.restart = true;
                     var8++;
                  } else {
                     var7++;
                  }

                  Holder var17 = var3.getRegistry().newHolder();
                  var17.ensureComponentsSize(2);
                  var17.addComponent(this.eventComponentType, var10);
                  var17.addComponent(this.intangibleComponentType, Intangible.INSTANCE);
                  var6.toAdd.add(var17);
               }

               var3.removeEntities(var6.toRemove.array(), 0, var6.toRemove.size(), RemoveReason.REMOVE);
               var3.addEntities(var6.toAdd.array(), 0, var6.toAdd.size(), AddReason.LOAD);
               PrefabSnapshotUtil.cleanSnapshotsDir(var5, var3.getResource(this.managerResourceType));
               WorldEventsPlugin.loadGameplayWorldEvents(var5);
               ((HytaleLogger.Api)LOGGER.atFine()).log("Loaded world-event entities from storage. Loaded: %d, Reloaded: %d", var7, var8);
            }
      }
   }

   class="kw">protected class="kw">static class Collector class="kw">implements IntBiObjectConsumer<ArchetypeChunk<EntityStore>, CommandBuffer<EntityStore>>, AutoCloseable {
      class="kw">protected class="kw">static class="kw">final ThreadLocal<WorldEventStorageSystem.Collector> LOCAL = ThreadLocal.withInitial(WorldEventStorageSystem.Collector::new);
      @Nonnull
      class="kw">protected class="kw">final ObjectList<WorldEvent> events = new ObjectArrayList();
      @Nonnull
      class="kw">protected class="kw">final Map<UUID, Ref<EntityStore>> entities = new ConcurrentHashMap<>();
      @Nonnull
      class="kw">protected class="kw">final ComponentType<EntityStore, WorldEvent> eventComponent = WorldEvent.getComponentType();
      @Nonnull
      class="kw">protected class="kw">final DynamicArray<Ref<EntityStore>> toRemove = new DynamicArray<>(8, Ref[]::new);
      @Nonnull
      class="kw">protected class="kw">final DynamicArray<Holder<EntityStore>> toAdd = new DynamicArray<>(8, Holder[]::new);

      class="kw">protected Collector() {
      }

      class="kw">public void accept(int var1, @Nonnull ArchetypeChunk<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3) {
         WorldEvent var4 = var2.getComponent(var1, this.eventComponent);
         assert var4 != null;
         this.entities.put(var4.uuid, var2.getReferenceTo(var1));
      }

      @Override
      class="kw">public void close() {
         this.toAdd.clear();
         this.toRemove.clear();
         this.events.clear();
         this.entities.clear();
      }

      class="kw">protected class="kw">static void collectEvents(@Nonnull WorldEvent var0, @Nonnull WorldEventStorageSystem.Collector var1) {
         var1.events.add(var0);
      }
   }
}