ChunkRefAdded class

Пакет: com.hypixel.hytale.server.spawning.world.system

Файл: com/hypixel/hytale/server/spawning/world/system/ChunkSpawningSystems.java

extends: RefSystem<ChunkStore>

Поля (6)

МодификаторыТипИмя
private final ComponentType<ChunkStore, ChunkSpawnData> chunkSpawnDataComponentType
private final ComponentType<ChunkStore, ChunkSpawnedNPCData> chunkSpawnedNPCDataComponentType
WorldSpawnData var5
WorldChunk var6
private final ComponentType<ChunkStore, WorldChunk> worldChunkComponentType
private final ResourceType<EntityStore, WorldSpawnData> worldSpawnDataResourceType

Методы (3)

МодификаторыВозвратСигнатура
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
public void onEntityAddedpublic void onEntityAdded(@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)
public void onEntityRemovepublic void onEntityRemove(@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4)

Исходный код

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

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.ComponentType;
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.ResourceType;
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.component.system.RefSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.environment.EnvironmentColumn;
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.spawning.SpawningPlugin;
class="kw">import com.hypixel.hytale.server.spawning.world.ChunkEnvironmentSpawnData;
class="kw">import com.hypixel.hytale.server.spawning.world.WorldEnvironmentSpawnData;
class="kw">import com.hypixel.hytale.server.spawning.world.component.ChunkSpawnData;
class="kw">import com.hypixel.hytale.server.spawning.world.component.ChunkSpawnedNPCData;
class="kw">import com.hypixel.hytale.server.spawning.world.component.WorldSpawnData;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

class="kw">public class ChunkSpawningSystems {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Archetype.of(WorldChunk.getComponentType(), ChunkSpawnData.getComponentType());
   class="kw">private class="kw">static class="kw">final Query<ChunkStore> TICKING_QUERY = Query.and(Query.not(ChunkStore.REGISTRY.getNonTickingComponentType()), QUERY);

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

   class="kw">protected class="kw">static boolean processStoppedChunk(
      @Nonnull Ref<ChunkStore> var0,
      @Nonnull Store<ChunkStore> var1,
      @Nonnull WorldSpawnData var2,
      @Nonnull ComponentType<ChunkStore, ChunkSpawnData> var3,
      @Nonnull CommandBuffer<ChunkStore> var4
   ) {
      ChunkSpawnData var5 = var1.getComponent(var0, var3);
      if (var5 == null) {
         class="kw">return false;
      }

      var4.removeComponent(var0, var3);
      if (!var5.isStarted()) {
         class="kw">return false;
      }

      World var6 = var1.getExternalData().getWorld();
      Store var7 = var6.getEntityStore().getStore();
      ObjectIterator var8 = Int2ObjectMaps.fastIterator(var5.getChunkEnvironmentSpawnDataMap());

      while (var8.hasNext()) {
         Entry var9 = (Entry<ChunkEnvironmentSpawnData>)var8.next();
         WorldEnvironmentSpawnData var10 = var2.getWorldEnvironmentSpawnData(var9.getIntKey());
         if (var10 != null) {
            ChunkEnvironmentSpawnData var11 = (ChunkEnvironmentSpawnData)var9.getValue();
            if (!var11.wasProcessedAsUnspawnable()) {
               int var12 = -var11.getSegmentCount();
               var10.adjustSegmentCount(var12);
               if (var10.getSegmentCount() < 0) {
                  Environment var13 = Environment.getAssetMap().getAsset(var10.getEnvironmentIndex());
                  String var14 = var13 != null ? var13.getId() : null;
                  LOGGER.at(Level.SEVERE).log("Block count for environment %s dropped below 0 to %s", var14, var10.getSegmentCount());
               }

               var2.adjustSegmentCount(var12);
            }

            var10.removeChunk(var0, var7);
         }
      }

      class="kw">return true;
   }

   class="kw">protected class="kw">static boolean processStartedChunk(
      @Nonnull Ref<ChunkStore> var0,
      @Nonnull Store<ChunkStore> var1,
      @Nonnull WorldChunk var2,
      @Nonnull WorldSpawnData var3,
      @Nonnull ComponentType<ChunkStore, ChunkSpawnData> var4,
      @Nonnull ComponentType<ChunkStore, ChunkSpawnedNPCData> var5,
      @Nonnull CommandBuffer<ChunkStore> var6
   ) {
      ChunkSpawnData var7 = var1.getComponent(var0, var4);
      if (var7 == null) {
         var7 = new ChunkSpawnData();
         var6.putComponent(var0, var4, var7);
      }

      var6.ensureComponent(var0, var5);
      if (var7.isStarted()) {
         class="kw">return false;
      }

      ObjectIterator var8 = Int2ObjectMaps.fastIterator(var7.getChunkEnvironmentSpawnDataMap());

      while (var8.hasNext()) {
         Entry var9 = (Entry<ChunkEnvironmentSpawnData>)var8.next();
         ((ChunkEnvironmentSpawnData)var9.getValue()).init(var9.getIntKey(), var2);
      }

      preprocessChunk(var7, var2);
      var7.setStarted(true);
      World var19 = var1.getExternalData().getWorld();
      Store var10 = var19.getEntityStore().getStore();
      var8 = Int2ObjectMaps.fastIterator(var7.getChunkEnvironmentSpawnDataMap());

      while (var8.hasNext()) {
         Entry var11 = (Entry<ChunkEnvironmentSpawnData>)var8.next();
         int var12 = var11.getIntKey();
         ChunkEnvironmentSpawnData var13 = (ChunkEnvironmentSpawnData)var11.getValue();
         var13.updateDensity(SpawningPlugin.get().getEnvironmentDensity(var12));
         WorldEnvironmentSpawnData var14 = var3.getOrCreateWorldEnvironmentSpawnData(var12, var19, var10);
         int var15 = var13.getSegmentCount();
         var14.adjustSegmentCount(var15);
         var3.adjustSegmentCount(var15);
         var14.addChunk(var0, var10);
         HytaleLogger.Api var16 = LOGGER.at(Level.FINER);
         if (var16.isEnabled()) {
            Environment var17 = Environment.getAssetMap().getAsset(var12);
            var16.log(
               "   Add chunk [%s/%s] to env=%s, exp=%s, act=%s, blks=%s",
               var2.getX(),
               var2.getZ(),
               var17 == null ? null : var17.getId(),
               var14.getExpectedNPCs(),
               var14.getActualNPCs(),
               var14.getSegmentCount()
            );
         }
      }

      class="kw">return true;
   }

   class="kw">private class="kw">static void preprocessChunk(@Nonnull ChunkSpawnData var0, @Nonnull WorldChunk var1) {
      for (int var2 = 0; var2 < 32; var2++) {
         for (int var3 = 0; var3 < 32; var3++) {
            preprocessColumn(var0, var1, var2, var3);
         }
      }
   }

   class="kw">private class="kw">static void preprocessColumn(@Nonnull ChunkSpawnData var0, @Nonnull WorldChunk var1, int var2, int var3) {
      EnvironmentColumn var4 = var1.getBlockChunk().getEnvironmentColumn(var2, var3);
      Int2ObjectMap var5 = var0.getChunkEnvironmentSpawnDataMap();

      for (int var6 = var4.indexOf(0); var6 < var4.size() && var4.getValueMin(var6) <= 320; var6++) {
         int var7 = var4.getValue(var6);
         ChunkEnvironmentSpawnData var8 = (ChunkEnvironmentSpawnData)var5.get(var7);
         if (var8 == null) {
            var8 = new ChunkEnvironmentSpawnData();
            var8.init(var7, var1);
            var5.put(var7, var8);
         }

         var8.registerSegment(var2, var3);
      }
   }

   class="kw">protected class="kw">static void updateChunkCount(int var0, @Nonnull WorldSpawnData var1) {
      if (var0 > 0) {
         var1.setUnspawnable(false);
      }

      var1.adjustChunkCount(var0);
      var1.recalculateWorldCount();
   }

   class="kw">public class="kw">static class ChunkRefAdded class="kw">extends RefSystem<ChunkStore> {
      class="kw">private class="kw">final ResourceType<EntityStore, WorldSpawnData> worldSpawnDataResourceType;
      class="kw">private class="kw">final ComponentType<ChunkStore, ChunkSpawnData> chunkSpawnDataComponentType;
      class="kw">private class="kw">final ComponentType<ChunkStore, ChunkSpawnedNPCData> chunkSpawnedNPCDataComponentType;
      class="kw">private class="kw">final ComponentType<ChunkStore, WorldChunk> worldChunkComponentType;

      class="kw">public ChunkRefAdded(
         ResourceType<EntityStore, WorldSpawnData> var1, ComponentType<ChunkStore, ChunkSpawnData> var2, ComponentType<ChunkStore, ChunkSpawnedNPCData> var3
      ) {
         this.worldSpawnDataResourceType = var1;
         this.chunkSpawnDataComponentType = var2;
         this.chunkSpawnedNPCDataComponentType = var3;
         this.worldChunkComponentType = WorldChunk.getComponentType();
      }

      @Nonnull
      @Override
      class="kw">public Query<ChunkStore> getQuery() {
         class="kw">return ChunkSpawningSystems.TICKING_QUERY;
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         WorldSpawnData var5 = var3.getExternalData().getWorld().getEntityStore().getStore().getResource(this.worldSpawnDataResourceType);
         WorldChunk var6 = var3.getComponent(var1, this.worldChunkComponentType);
         if (ChunkSpawningSystems.processStartedChunk(var1, var3, var6, var5, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var4)) {
            ChunkSpawningSystems.LOGGER.at(Level.FINE).log("Adding chunk [%s/%s]", var6.getX(), var6.getZ());
            ChunkSpawningSystems.updateChunkCount(1, var5);
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
      }
   }

   class="kw">public class="kw">static class TickingState class="kw">extends RefChangeSystem<ChunkStore, NonTicking<ChunkStore>> {
      class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
      class="kw">private class="kw">final ResourceType<EntityStore, WorldSpawnData> worldSpawnDataResourceType;
      class="kw">private class="kw">final ComponentType<ChunkStore, ChunkSpawnData> chunkSpawnDataComponentType;
      class="kw">private class="kw">final ComponentType<ChunkStore, ChunkSpawnedNPCData> chunkSpawnedNPCDataComponentType;
      class="kw">private class="kw">final ComponentType<ChunkStore, WorldChunk> worldChunkComponentType;

      class="kw">public TickingState(
         ResourceType<EntityStore, WorldSpawnData> var1, ComponentType<ChunkStore, ChunkSpawnData> var2, ComponentType<ChunkStore, ChunkSpawnedNPCData> var3
      ) {
         this.worldSpawnDataResourceType = var1;
         this.chunkSpawnDataComponentType = var2;
         this.chunkSpawnedNPCDataComponentType = var3;
         this.worldChunkComponentType = WorldChunk.getComponentType();
      }

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

      @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
      ) {
         WorldSpawnData var5 = var3.getExternalData().getWorld().getEntityStore().getStore().getResource(this.worldSpawnDataResourceType);
         WorldChunk var6 = var3.getComponent(var1, this.worldChunkComponentType);
         if (ChunkSpawningSystems.processStoppedChunk(var1, var3, var5, this.chunkSpawnDataComponentType, var4)) {
            LOGGER.at(Level.FINE).log("Removing chunk [%s/%s]", var6.getX(), var6.getZ());
            ChunkSpawningSystems.updateChunkCount(-1, var5);
         }
      }

      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
      ) {
         WorldSpawnData var5 = var3.getExternalData().getWorld().getEntityStore().getStore().getResource(this.worldSpawnDataResourceType);
         WorldChunk var6 = var3.getComponent(var1, this.worldChunkComponentType);
         if (ChunkSpawningSystems.processStartedChunk(var1, var3, var6, var5, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var4)) {
            LOGGER.at(Level.FINE).log("Adding chunk [%s/%s]", var6.getX(), var6.getZ());
            ChunkSpawningSystems.updateChunkCount(1, var5);
         }
      }
   }
}