EntitySectionLoadingSystem class

Пакет: com.hypixel.hytale.server.core.universe.world.chunk.section

Файл: com/hypixel/hytale/server/core/universe/world/chunk/section/EntitySection.java

extends: RefChangeSystem<ChunkStore, NonTicking<ChunkStore>>

Поля (23)

МодификаторыТипИмя
private static final HytaleLogger LOGGER
private final Archetype<ChunkStore> archetype
break
ComponentRegistry.Data var10
boolean var11
var11
Holder var11
Archetype var12
Holder var13
TransformComponent var13
Dirty var14
Ref[] var14
Ref var16
World var5
World var5
EntitySection var6
EntitySection var6
Ref[] var7
Store var7
Store var8
Holder[] var8
Holder[] var9
int var9

Методы (12)

МодификаторыВозвратСигнатура
public ComponentType<ChunkStore, NonTicking<ChunkStore>> componentTypepublic ComponentType<ChunkStore, NonTicking<ChunkStore>> componentType()
for for(int var12 = 0; var12 < var9.length; var12++)
for for(int var10 = var9 - 1; var10 >= 0; var10--)
for for(int var15 = 0; var15 < var14.length; var15++)
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
if if(var7 != null)
if if(var11)
if if(var8 != null)
if if(var13 != null)
public void onComponentAddedpublic void onComponentAdded(@Nonnull Ref<ChunkStore> var1, @Nonnull NonTicking<ChunkStore> var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onComponentRemovedpublic void onComponentRemoved(@Nonnull Ref<ChunkStore> var1, @Nonnull NonTicking<ChunkStore> var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onComponentSetpublic void onComponentSet(@Nonnull Ref<ChunkStore> var1, NonTicking<ChunkStore> var2, @Nonnull NonTicking<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> var5)

Исходный код

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

class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.store.StoredCodec;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Component;
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.NonTicking;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.RefChangeSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.entity.Dirty;
class="kw">import com.hypixel.hytale.server.core.modules.LegacyModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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.Savable;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceSet;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceSets;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collections;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.Set;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class EntitySection class="kw">extends Savable class="kw">implements Component<ChunkStore> {
   class="kw">public class="kw">static class="kw">final BuilderCodec<EntitySection> CODEC = BuilderCodec.builder(EntitySection.class, EntitySection::new)
      .append(new KeyedCodec<>("Entities", new ArrayCodec<>(new StoredCodec<>(EntityStore.HOLDER_CODEC_KEY), Holder[]::new)), (var0, var1) -> {
         var0.entityHolders.clear();
         Collections.addAll(var0.entityHolders, var1);
      }, var0 -> {
         if (var0.entityReferences.isEmpty()) {
            class="kw">return var0.entityHolders.toArray(new Holder[var0.entityHolders.size()]);
         }

         Holder[] var1 = new Holder[var0.entityHolders.size() + var0.entityReferences.size()];
         var1 = var0.entityHolders.toArray(var1);
         int var2 = var0.entityHolders.size();
         Iterator var3 = var0.entityReferences.iterator();

         while (var3.hasNext()) {
            Ref var4 = (Ref<EntityStore>)var3.next();
            Store var5 = var4.getStore();
            if (var5.getArchetype(var4).hasSerializableComponents(var5.getRegistry().getData())) {
               var1[var2++] = var5.copySerializableEntity(var4);
            }
         }

         class="kw">return var2 == var1.length ? var1 : Arrays.copyOfRange(var1, 0, var2);
      })
      .add()
      .build();
   @Nonnull
   class="kw">private class="kw">final List<Holder<EntityStore>> entityHolders;
   @Nonnull
   class="kw">private class="kw">final ReferenceSet<Ref<EntityStore>> entityReferences;
   @Nonnull
   class="kw">private class="kw">final List<Holder<EntityStore>> entityHoldersUnmodifiable;
   @Nonnull
   class="kw">private class="kw">final Set<Ref<EntityStore>> entityReferencesUnmodifiable;

   @Nonnull
   class="kw">public class="kw">static ComponentType<ChunkStore, EntitySection> getComponentType() {
      class="kw">return LegacyModule.get().getEntitySectionComponentType();
   }

   class="kw">public EntitySection() {
      this(new ObjectArrayList(), new ReferenceOpenHashSet());
   }

   class="kw">public EntitySection(@Nonnull List<Holder<EntityStore>> var1, @Nonnull ReferenceSet<Ref<EntityStore>> var2) {
      this.entityHolders = var1;
      this.entityReferences = var2;
      this.entityHoldersUnmodifiable = Collections.unmodifiableList(var1);
      this.entityReferencesUnmodifiable = ReferenceSets.unmodifiable(var2);
   }

   @Nonnull
   @Override
   class="kw">public Component<ChunkStore> clone() {
      ObjectArrayList var1 = new ObjectArrayList(this.entityHolders.size() + this.entityReferences.size());

      for (Holder var3 : this.entityHolders) {
         var1.add(var3.clone());
      }

      ObjectIterator var4 = this.entityReferences.iterator();

      while (var4.hasNext()) {
         Ref var5 = (Ref<EntityStore>)var4.next();
         var1.add(var5.getStore().copyEntity(var5));
      }

      class="kw">return new EntitySection(var1, new ReferenceOpenHashSet());
   }

   @Nonnull
   @Override
   class="kw">public Component<ChunkStore> cloneSerializable() {
      ComponentRegistry.Data var1 = EntityStore.REGISTRY.getData();
      ObjectArrayList var2 = new ObjectArrayList(this.entityHolders.size() + this.entityReferences.size());

      for (Holder var4 : this.entityHolders) {
         if (var4.getArchetype().hasSerializableComponents(var1)) {
            var2.add(var4.cloneSerializable(var1));
         }
      }

      ObjectIterator var6 = this.entityReferences.iterator();

      while (var6.hasNext()) {
         Ref var7 = (Ref<EntityStore>)var6.next();
         Store var5 = var7.getStore();
         if (var5.getArchetype(var7).hasSerializableComponents(var1)) {
            var2.add(var5.copySerializableEntity(var7));
         }
      }

      class="kw">return new EntitySection(var2, new ReferenceOpenHashSet());
   }

   @Nonnull
   class="kw">public List<Holder<EntityStore>> getEntityHolders() {
      class="kw">return this.entityHoldersUnmodifiable;
   }

   class="kw">public void addEntityHolder(@Nonnull Holder<EntityStore> var1) {
      this.entityHolders.add(Objects.requireNonNull(var1));
      this.markNeedsSaving();
   }

   class="kw">public void loadEntityHolder(@Nonnull Holder<EntityStore> var1) {
      this.entityHolders.add(Objects.requireNonNull(var1));
   }

   @Nonnull
   class="kw">public Set<Ref<EntityStore>> getEntityReferences() {
      class="kw">return this.entityReferencesUnmodifiable;
   }

   class="kw">public void addEntityReference(@Nonnull Ref<EntityStore> var1) {
      this.entityReferences.add(Objects.requireNonNull(var1));
      this.markNeedsSaving();
   }

   class="kw">public void loadEntityReference(@Nonnull Ref<EntityStore> var1) {
      this.entityReferences.add(Objects.requireNonNull(var1));
   }

   class="kw">public void removeEntityReference(@Nonnull Ref<EntityStore> var1) {
      this.entityReferences.remove(Objects.requireNonNull(var1));
      this.markNeedsSaving();
   }

   class="kw">public void unloadEntityReference(@Nonnull Ref<EntityStore> var1) {
      this.entityReferences.remove(Objects.requireNonNull(var1));
   }

   @Nullable
   class="kw">public Holder<EntityStore>[] takeEntityHolders() {
      if (this.entityHolders.isEmpty()) {
         class="kw">return null;
      }

      Holder[] var1 = this.entityHolders.toArray(Holder[]::new);
      this.entityHolders.clear();
      class="kw">return var1;
   }

   @Nullable
   class="kw">public Ref<EntityStore>[] takeEntityReferences() {
      if (this.entityReferences.isEmpty()) {
         class="kw">return null;
      }

      Ref[] var1 = (Ref<EntityStore>[])this.entityReferences.toArray(Ref[]::new);
      this.entityReferences.clear();
      class="kw">return var1;
   }

   class="kw">public class="kw">static class EntitySectionLoadingSystem class="kw">extends RefChangeSystem<ChunkStore, NonTicking<ChunkStore>> {
      @Nonnull
      class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
      @Nonnull
      class="kw">private class="kw">final Archetype<ChunkStore> archetype = Archetype.of(ChunkSection.getComponentType(), EntitySection.getComponentType());

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

      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return this.archetype;
      }

      @Nonnull
      @Override
      class="kw">public ComponentType<ChunkStore, NonTicking<ChunkStore>> componentType() {
         class="kw">return ChunkStore.REGISTRY.getNonTickingComponentType();
      }

      class="kw">public void onComponentAdded(
         @Nonnull Ref<ChunkStore> var1, @Nonnull NonTicking<ChunkStore> var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         World var5 = var3.getExternalData().getWorld();
         EntitySection var6 = var3.getComponent(var1, EntitySection.getComponentType());
         assert var6 != null;
         Ref[] var7 = var6.takeEntityReferences();
         if (var7 != null) {
            Store var8 = var5.getEntityStore().getStore();
            Holder[] var9 = var8.removeEntities(var7, RemoveReason.UNLOAD);
            ComponentRegistry.Data var10 = EntityStore.REGISTRY.getData();
            boolean var11 = false;

            for (int var12 = 0; var12 < var9.length; var12++) {
               Holder var13 = var9[var12];
               if (var13.hasSerializableComponents(var10)) {
                  Dirty var14 = var13.getComponent(Dirty.getComponentType());
                  if (var14 != null && var14.isDirty()) {
                     var11 = true;
                  }

                  var6.loadEntityHolder(var13);
               }
            }

            if (var11) {
               var6.markNeedsSaving();
            }
         }
      }

      class="kw">public void onComponentSet(
         @Nonnull Ref<ChunkStore> var1,
         NonTicking<ChunkStore> var2,
         @Nonnull NonTicking<ChunkStore> var3,
         @Nonnull Store<ChunkStore> var4,
         @Nonnull CommandBuffer<ChunkStore> var5
      ) {
      }

      class="kw">public void onComponentRemoved(
         @Nonnull Ref<ChunkStore> var1, @Nonnull NonTicking<ChunkStore> var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         World var5 = var3.getExternalData().getWorld();
         EntitySection var6 = var3.getComponent(var1, EntitySection.getComponentType());
         assert var6 != null;
         Store var7 = var5.getEntityStore().getStore();
         Holder[] var8 = var6.takeEntityHolders();
         if (var8 != null) {
            int var9 = var8.length;

            for (int var10 = var9 - 1; var10 >= 0; var10--) {
               Holder var11 = var8[var10];
               Archetype var12 = var11.getArchetype();
               assert var12 != null;
               if (var12.isEmpty()) {
                  LOGGER.at(Level.SEVERE).log("Empty archetype entity holder: %s (#%d)", var11, var10);
                  var8[var10] = var8[--var9];
                  var8[var9] = var11;
                  var6.markNeedsSaving();
               } else {
                  TransformComponent var13 = var11.getComponent(TransformComponent.getComponentType());
                  if (var13 != null) {
                     var13.setSectionLocation(var1);
                  }
               }
            }

            Ref[] var14 = var7.addEntities(var8, 0, var9, AddReason.LOAD);

            for (int var15 = 0; var15 < var14.length; var15++) {
               Ref var16 = var14[var15];
               if (!var16.isValid()) {
                  break;
               }

               var6.loadEntityReference(var16);
            }
         }
      }
   }
}