VoidInvasionPortalsSpawnSystem class

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

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

extends: DelayedEntitySystem<EntityStore>

Поля (28)

МодификаторыТипИмя
private CompletableFuture<Vector3d> findPortalSpawnPos
return
SpatialHashGrid var1
Holder var10
NotNearAnyInHashGrid var10
Ref var11
VoidEventConfig var12
InvasionPortalConfig var13
Vector3i var14
long var15
SpatialHashGrid var18
Collection var2
BlockType var3
PortalWorld var3
List var3
Transform var4
Vector3d var5
VoidEvent var6
Transform var6
Ref var6
World var7
Vector3d var7
TransformComponent var7
VoidInvasionPortalsSpawnSystem.VoidInvasionData var8
Vector3d var8
Vector3d var9
var9
SpatialHashGrid var9

Методы (10)

МодификаторыВозвратСигнатура
public VoidInvasionDatapublic VoidInvasionData()
public Resource<EntityStore> clonepublic Resource<EntityStore> clone()
for for(PlayerRef var5 : var2)
if if(var8.findPortalSpawnPos == null)
if if(var9 != null)
if if(var12 == null)
if if(var3 == null)
if if(var4 == null)
if if(var6 == null)
abstract super super(2.0F)

Исходный код

Показать/скрыть
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();
      }
   }
}