VoidInvasionData class

Пакет: com.hypixel.hytale.builtin.portals.systems.voidevent

Файл: com/hypixel/hytale/builtin/portals/systems/voidevent/VoidInvasionPortalsSpawnSystem.java

implements: Resource<EntityStore>

Поля (1)

МодификаторыТипИмя
private CompletableFuture<Vector3d> findPortalSpawnPos

Методы (1)

МодификаторыВозвратСигнатура
public Resource<EntityStore> clonepublic Resource<EntityStore> clone()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.portals.systems.voidevent;

class="kw">import com.hypixel.hytale.builtin.portals.components.voidevent.VoidEvent;
class="kw">import com.hypixel.hytale.builtin.portals.components.voidevent.VoidSpawner;
class="kw">import com.hypixel.hytale.builtin.portals.components.voidevent.config.InvasionPortalConfig;
class="kw">import com.hypixel.hytale.builtin.portals.components.voidevent.config.VoidEventConfig;
class="kw">import com.hypixel.hytale.builtin.portals.resources.PortalWorld;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.generators.SearchBelow;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.generators.SearchCone;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.predicates.FitsAPortal;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.predicates.NotNearAnyInHashGrid;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.predicates.NotNearPointXZ;
class="kw">import com.hypixel.hytale.builtin.portals.utils.spatial.SpatialHashGrid;
class="kw">import com.hypixel.hytale.common.util.RandomUtil;
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.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Resource;
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.tick.DelayedEntitySystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
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.ReferenceArrayList;
class="kw">import java.util.Collection;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class VoidInvasionPortalsSpawnSystem class="kw">extends DelayedEntitySystem<EntityStore> {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final int MAX_PORTALS = 24;
   class="kw">private class="kw">final ResourceType<EntityStore, VoidInvasionPortalsSpawnSystem.VoidInvasionData> voidInvasionDataResourceType = this.registerResource(
      VoidInvasionPortalsSpawnSystem.VoidInvasionData.class, VoidInvasionPortalsSpawnSystem.VoidInvasionData::new
   );

   class="kw">public VoidInvasionPortalsSpawnSystem() {
      super(2.0F);
   }

   @Override
   class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5) {
      VoidEvent var6 = var3.getComponent(var2, VoidEvent.getComponentType());
      assert var6 != null;
      World var7 = var4.getExternalData().getWorld();
      VoidInvasionPortalsSpawnSystem.VoidInvasionData var8 = var5.getResource(this.voidInvasionDataResourceType);
      if (var8.findPortalSpawnPos == null) {
         SpatialHashGrid var18 = cleanupAndGetSpawners(var6);
         if (var18.size() < 24) {
            var8.findPortalSpawnPos = findPortalSpawnPosition(var7, var6, var5);
         }
      } else if (var8.findPortalSpawnPos.isDone()) {
         Vector3d var9;
         try {
            var9 = var8.findPortalSpawnPos.join();
            var8.findPortalSpawnPos = null;
         } catch (Throwable var17) {
            ((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var17)).log("Error trying to find a void event spawn position");
            class="kw">return;
         }

         if (var9 != null) {
            Holder var10 = EntityStore.REGISTRY.newHolder();
            var10.addComponent(VoidSpawner.getComponentType(), new VoidSpawner());
            var10.addComponent(TransformComponent.getComponentType(), new TransformComponent(var9, new Rotation3f()));
            Ref var11 = var5.addEntity(var10, AddReason.SPAWN);
            var6.getVoidSpawners().add(var9, var11);
            VoidEventConfig var12 = VoidEvent.getConfig(var7);
            if (var12 == null) {
               LOGGER.at(Level.WARNING).log("There's a Void Event entity but no void event config in the gameplay config");
            } else {
               InvasionPortalConfig var13 = var12.getInvasionPortalConfig();
               Vector3i var14 = Vector3dUtil.toVector3i(var9);
               long var15 = ChunkUtil.indexChunkFromBlock(var14.x, var14.z);
               var7.getChunkAsync(var15)
                  .thenAcceptAsync(
                     var2x -> {
                        BlockType var3 = var13.getBlockType();
                        if (var3 == null) {
                           LOGGER.at(Level.WARNING)
                              .log("Failed to place invasion portal block at %s, %s, %s. Block type is not configured", var14.x, var14.y, var14.z);
                        } else {
                           var2x.setBlock(var14.x, var14.y, var14.z, var3, 4);
                        }
                     },
                     var7
                  );
            }
         }
      }
   }

   @Nullable
   class="kw">private class="kw">static CompletableFuture<Vector3d> findPortalSpawnPosition(@Nonnull World var0, @Nonnull VoidEvent var1, @Nonnull CommandBuffer<EntityStore> var2) {
      PortalWorld var3 = var2.getResource(PortalWorld.getResourceType());
      if (!var3.exists()) {
         class="kw">return null;
      }

      Transform var4 = var3.getSpawnPoint();
      if (var4 == null) {
         class="kw">return null;
      }

      Vector3d var5 = var4.getPosition();
      Transform var6 = findRandomPlayerTransform(var0, var2);
      if (var6 == null) {
         class="kw">return null;
      }

      Vector3d var7 = new Vector3d(var6.getPosition()).add(0.0, 5.0, 0.0);
      Vector3d var8 = var6.getDirection();
      SpatialHashGrid var9 = var1.getVoidSpawners();
      NotNearAnyInHashGrid var10 = new NotNearAnyInHashGrid(var9, 62.0);
      class="kw">return CompletableFuture.supplyAsync(
         () -> new SearchCone(var8, 48.0, 64.0, 90.0, 8)
            .filter(var10)
            .filter(new NotNearPointXZ(var5, 18.0))
            .then(new SearchBelow(12))
            .filter(new FitsAPortal())
            .execute(var0, var7)
            .orElse(null),
         var0
      );
   }

   @Nullable
   class="kw">private class="kw">static Transform findRandomPlayerTransform(@Nonnull World var0, @Nonnull CommandBuffer<EntityStore> var1) {
      Collection var2 = var0.getPlayerRefs();
      if (var2.isEmpty()) {
         class="kw">return null;
      }

      List var3 = new ReferenceArrayList(var2.size());

      for (PlayerRef var5 : var2) {
         var3.add(var5.getReference());
      }

      Ref var6 = RandomUtil.selectRandom(var3);
      TransformComponent var7 = var1.getComponent(var6, TransformComponent.getComponentType());
      assert var7 != null;
      class="kw">return var7.getTransform();
   }

   @Nonnull
   class="kw">private class="kw">static SpatialHashGrid<Ref<EntityStore>> cleanupAndGetSpawners(@Nonnull VoidEvent var0) {
      SpatialHashGrid var1 = var0.getVoidSpawners();
      var1.removeIf(var0x -> !var0x.isValid());
      class="kw">return var1;
   }

   @Nullable
   @Override
   class="kw">public Query<EntityStore> getQuery() {
      class="kw">return VoidEvent.getComponentType();
   }

   class="kw">public class="kw">static class VoidInvasionData class="kw">implements Resource<EntityStore> {
      @Nullable
      class="kw">private CompletableFuture<Vector3d> findPortalSpawnPos;

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

      @Nullable
      @Override
      class="kw">public Resource<EntityStore> clone() {
         class="kw">return new VoidInvasionPortalsSpawnSystem.VoidInvasionData();
      }
   }
}