EntityAddedFromExternal class

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

Файл: com/hypixel/hytale/server/spawning/spawnmarkers/SpawnMarkerSystems.java

extends: RefSystem<EntityStore>

Поля (4)

МодификаторыТипИмя
private final Set<Dependency<EntityStore>> dependencies
private final Query<EntityStore> query
private final ComponentType<EntityStore, SpawnMarkerEntity> spawnMarkerEntityComponentType
SpawnMarkerEntity var5

Методы (5)

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

Исходный код

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

class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
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.SystemGroup;
class="kw">import com.hypixel.hytale.component.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.Order;
class="kw">import com.hypixel.hytale.component.dependency.OrderPriority;
class="kw">import com.hypixel.hytale.component.dependency.SystemDependency;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.component.system.HolderSystem;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.AnimationSlot;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.reference.InvalidatablePersistentRef;
class="kw">import com.hypixel.hytale.server.core.entity.reference.PersistentRefCount;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.FromPrefab;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.FromWorldGen;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.Intangible;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.WorldGenId;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DeathComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.system.PlayerSpatialSystem;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabCopyableComponent;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.flock.StoredFlock;
class="kw">import com.hypixel.hytale.server.npc.components.SpawnMarkerReference;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.role.support.StateSupport;
class="kw">import com.hypixel.hytale.server.spawning.assets.spawnmarker.config.SpawnMarker;
class="kw">import it.unimi.dsi.fastutil.Pair;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.util.List;
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">import org.joml.Vector3d;

class="kw">public class SpawnMarkerSystems {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();

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

   class="kw">public class="kw">static class AddedFromWorldGen class="kw">extends HolderSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerEntity> componentType = SpawnMarkerEntity.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, WorldGenId> worldGenIdComponentType = WorldGenId.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, FromWorldGen> fromWorldGenComponentType = FromWorldGen.getComponentType();
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query = Query.and(this.componentType, this.fromWorldGenComponentType);

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

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.query;
      }

      @Nullable
      @Override
      class="kw">public SystemGroup<EntityStore> getGroup() {
         class="kw">return EntityModule.get().getPreClearMarkersGroup();
      }

      @Override
      class="kw">public void onEntityAdd(@Nonnull Holder<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3) {
         FromWorldGen var4 = var1.getComponent(this.fromWorldGenComponentType);
         assert var4 != null;
         var1.putComponent(this.worldGenIdComponentType, new WorldGenId(var4.getWorldGenId()));
      }

      @Override
      class="kw">public void onEntityRemoved(@Nonnull Holder<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3) {
      }
   }

   class="kw">public class="kw">static class CacheMarker class="kw">extends RefSystem<EntityStore> {
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerEntity> spawnMarkerComponentType;

      class="kw">public CacheMarker(@Nonnull ComponentType<EntityStore, SpawnMarkerEntity> var1) {
         this.spawnMarkerComponentType = var1;
      }

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

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         SpawnMarkerEntity var5 = var3.getComponent(var1, this.spawnMarkerComponentType);
         assert var5 != null;
         SpawnMarker var6 = SpawnMarker.getAssetMap().getAsset(var5.getSpawnMarkerId());
         if (var6 == null) {
            SpawnMarkerSystems.LOGGER.at(Level.SEVERE).log("Marker %s removed due to missing spawn marker type: %s", var1, var5.getSpawnMarkerId());
            var4.removeEntity(var1, RemoveReason.REMOVE);
         } else {
            var5.setCachedMarker(var6);
         }
      }

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

   class="kw">public class="kw">static class EnsureNetworkSendable class="kw">extends HolderSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query = SpawnMarkerEntity.getComponentType();

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

      @Override
      class="kw">public void onEntityAdd(@Nonnull Holder<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3) {
         Archetype var4 = var1.getArchetype();
         assert var4 != null;
         ComponentType var5 = NetworkId.getComponentType();
         if (!var4.contains(var5)) {
            var1.addComponent(var5, new NetworkId(var3.getExternalData().takeNextNetworkId()));
         }

         var1.ensureComponent(Intangible.getComponentType());
      }

      @Override
      class="kw">public void onEntityRemoved(@Nonnull Holder<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3) {
      }

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.query;
      }
   }

   class="kw">public class="kw">static class EntityAdded class="kw">extends RefSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerEntity> spawnMarkerEntityComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, UUIDComponent> uuidComponentType;
      @Nonnull
      class="kw">private class="kw">final Set<Dependency<EntityStore>> dependencies;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public EntityAdded(@Nonnull ComponentType<EntityStore, SpawnMarkerEntity> var1) {
         this.spawnMarkerEntityComponentType = var1;
         this.uuidComponentType = UUIDComponent.getComponentType();
         this.dependencies = Set.of(new SystemDependency<>(Order.AFTER, SpawnMarkerSystems.CacheMarker.class));
         this.query = Query.and(var1, this.uuidComponentType);
      }

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.query;
      }

      @Nonnull
      @Override
      class="kw">public Set<Dependency<EntityStore>> getDependencies() {
         class="kw">return this.dependencies;
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         SpawnMarkerEntity var5 = var3.getComponent(var1, this.spawnMarkerEntityComponentType);
         assert var5 != null;
         HytaleLogger.Api var6 = SpawnMarkerSystems.LOGGER.at(Level.FINE);
         if (var6.isEnabled()) {
            var6.log("Loaded marker %s", var3.getComponent(var1, this.uuidComponentType));
         }

         if (var5.getStoredFlock() != null) {
            var5.setTempStorageList(new ObjectArrayList());
         }

         if (var5.getSpawnCount() != 0) {
            var5.refreshTimeout();
         }

         var4.ensureComponent(var1, PrefabCopyableComponent.getComponentType());
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         if (var2 == RemoveReason.BUILDER_TOOLS_UNDO) {
            SpawnMarkerEntity var5 = var3.getComponent(var1, this.spawnMarkerEntityComponentType);
            if (var5 != null) {
               for (InvalidatablePersistentRef var9 : var5.getNpcReferences()) {
                  if (var9 != null) {
                     Ref var10 = var9.getEntity(var3);
                     if (var10 != null && var10.isValid()) {
                        var4.removeEntity(var10, RemoveReason.BUILDER_TOOLS_UNDO);
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">public class="kw">static class EntityAddedFromExternal class="kw">extends RefSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerEntity> spawnMarkerEntityComponentType;
      @Nonnull
      class="kw">private class="kw">final Set<Dependency<EntityStore>> dependencies;

      class="kw">public EntityAddedFromExternal(@Nonnull ComponentType<EntityStore, SpawnMarkerEntity> var1) {
         this.query = Query.and(var1, Query.or(FromPrefab.getComponentType(), FromWorldGen.getComponentType()));
         this.spawnMarkerEntityComponentType = var1;
         this.dependencies = Set.of(
            new SystemDependency<>(Order.BEFORE, SpawnMarkerSystems.EntityAdded.class),
            new SystemDependency<>(Order.AFTER, SpawnMarkerSystems.CacheMarker.class)
         );
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         SpawnMarkerEntity var5 = var3.getComponent(var1, this.spawnMarkerEntityComponentType);
         assert var5 != null;
         var5.setSpawnCount(0);
         var5.setRespawnCounter(0.0);
         var5.setSpawnAfter(null);
         var5.setGameTimeRespawn(null);
         if (var5.getCachedMarker().getDeactivationDistance() > 0.0) {
            var5.setStoredFlock(new StoredFlock());
         }
      }

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

      @Nonnull
      @Override
      class="kw">public Set<Dependency<EntityStore>> getDependencies() {
         class="kw">return this.dependencies;
      }

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.query;
      }

      @Nullable
      @Override
      class="kw">public SystemGroup<EntityStore> getGroup() {
         class="kw">return EntityModule.get().getPreClearMarkersGroup();
      }
   }

   class="kw">public class="kw">static class Ticking class="kw">extends EntityTickingSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerEntity> spawnMarkerEntityComponentType;
      @Nullable
      class="kw">private class="kw">final ComponentType<EntityStore, NPCEntity> npcComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, PersistentRefCount> referenceIdComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType = TransformComponent.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, HeadRotation> headRotationComponentType = HeadRotation.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, ModelComponent> modelComponentType = ModelComponent.getComponentType();
      @Nonnull
      class="kw">private class="kw">final ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> playerSpatialComponent;
      @Nonnull
      class="kw">private class="kw">final Set<Dependency<EntityStore>> dependencies;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public Ticking(
         @Nonnull ComponentType<EntityStore, SpawnMarkerEntity> var1, @Nonnull ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> var2
      ) {
         this.spawnMarkerEntityComponentType = var1;
         this.npcComponentType = NPCEntity.getComponentType();
         this.referenceIdComponentType = PersistentRefCount.getComponentType();
         this.playerSpatialComponent = var2;
         this.dependencies = Set.of(new SystemDependency<>(Order.AFTER, PlayerSpatialSystem.class, OrderPriority.CLOSEST));
         this.query = Archetype.of(var1, this.transformComponentType);
      }

      @Nonnull
      @Override
      class="kw">public Set<Dependency<EntityStore>> getDependencies() {
         class="kw">return this.dependencies;
      }

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.query;
      }

      @Override
      class="kw">public boolean isParallel(int var1, int var2) {
         class="kw">return EntityTickingSystem.maybeUseParallel(var1, var2);
      }

      @Override
      class="kw">public void tick(
         float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
      ) {
         SpawnMarkerEntity var6 = var3.getComponent(var2, this.spawnMarkerEntityComponentType);
         assert var6 != null;
         TransformComponent var7 = var3.getComponent(var2, this.transformComponentType);
         assert var7 != null;
         World var8 = var4.getExternalData().getWorld();
         WorldConfig var9 = var8.getWorldConfig();
         SpawnMarker var10 = var6.getCachedMarker();
         if (var6.getSpawnCount() > 0) {
            StoredFlock var25 = var6.getStoredFlock();
            if (var25 != null) {
               SpatialResource var26 = var4.getResource(this.playerSpatialComponent);
               List var13 = SpatialResource.getThreadLocalReferenceList();
               var26.getSpatialStructure().collect(var7.getPosition(), var10.getDeactivationDistance(), var13);
               boolean var14 = !var13.isEmpty();
               if (!var14) {
                  if (!var25.hasStoredNPCs() && var6.tickTimeToDeactivation(var1)) {
                     InvalidatablePersistentRef[] var15 = var6.getNpcReferences();
                     if (var15 == null) {
                        class="kw">return;
                     }

                     if (!var6.isDespawnStarted()) {
                        List var29 = var6.getTempStorageList();

                        for (InvalidatablePersistentRef var20 : var15) {
                           Ref var21 = var20.getEntity(var5);
                           if (var21 != null) {
                              NPCEntity var22 = var5.getComponent(var21, this.npcComponentType);
                              assert var22 != null;
                              var29.add(Pair.of(var21, var22));
                              boolean var23 = var5.getArchetype(var21).contains(DeathComponent.getComponentType());
                              if (var23 || StateSupport.get(var21, var5).isInBusyState()) {
                                 var6.setTimeToDeactivation(var10.getDeactivationTime());
                                 var29.clear();
                                 class="kw">return;
                              }
                           }
                        }

                        for (int var31 = 0; var31 < var29.size(); var31++) {
                           Pair var32 = var29.get(var31);
                           Ref var33 = (Ref<EntityStore>)var32.first();
                           NPCEntity var34 = (NPCEntity)var32.second();
                           ModelComponent var35 = var5.getComponent(var33, this.modelComponentType);
                           if (var35 != null && var35.getModel().getAnimationSetMap().containsKey("Despawn")) {
                              Role var36 = var34.getRole();
                              assert var36 != null;
                              double var37 = var36.getDespawnAnimationTime();
                              if (var37 > var6.getTimeToDeactivation()) {
                                 var6.setTimeToDeactivation(var37);
                              }

                              var34.playAnimation(var33, AnimationSlot.Status, "Despawn", var5);
                           }
                        }

                        var6.setDespawnStarted(true);
                        var29.clear();
                        class="kw">return;
                     }

                     PersistentRefCount var16 = var3.getComponent(var2, this.referenceIdComponentType);
                     if (var16 != null) {
                        var16.increment();
                     }

                     Ref var17 = var3.getReferenceTo(var2);
                     var5.run(
                        var6x -> {
                           List var7 = SpatialResource.getThreadLocalReferenceList();

                           for (InvalidatablePersistentRef var11 : var15) {
                              Ref var12 = var11.getEntity(var6x);
                              if (var12 != null && var12.isValid()) {
                                 SpawnMarkerReference var13 = var6x.ensureAndGetComponent(var12, SpawnMarkerReference.getComponentType());
                                 var13.getReference().setEntity(var17, var4);
                                 var7.add(var12);
                              } else {
                                 ((HytaleLogger.Api)SpawnMarkerSystems.LOGGER.atWarning())
                                    .log("Connection with NPC from marker at %s lost due to being invalid/already unloaded", var7.getPosition());
                              }
                           }

                           var25.storeNPCs(var7, var6x);
                           var6.setNpcReferences(null);
                        }
                     );
                  }

                  class="kw">return;
               }

               if (var25.hasStoredNPCs()) {
                  var5.run(var6x -> {
                     List var7 = SpatialResource.getThreadLocalReferenceList();
                     var25.restoreNPCs(var7, var6x);
                     var6.setSpawnCount(var7.size());
                     Vector3d var8 = var6.getSpawnPosition();
                     Rotation3f var9 = var7.getRotation();
                     InvalidatablePersistentRef[] var10 = new InvalidatablePersistentRef[var7.size()];
                     int var11 = 0;

                     for (int var12 = var7.size(); var11 < var12; var11++) {
                        Ref var13 = var7.get(var11);
                        NPCEntity var14 = var6x.getComponent(var13, this.npcComponentType);
                        assert var14 != null;
                        TransformComponent var15 = var6x.getComponent(var13, this.transformComponentType);
                        assert var15 != null;
                        HeadRotation var16 = var6x.getComponent(var13, this.headRotationComponentType);
                        assert var16 != null;
                        InvalidatablePersistentRef var17 = new InvalidatablePersistentRef();
                        var17.setEntity(var13, var6x);
                        var10[var11] = var17;
                        var15.getPosition().set(var8);
                        var15.getRotation().set(var9);
                        var16.setRotation(var9);
                        var14.playAnimation(var13, AnimationSlot.Status, null, var5);
                     }

                     var6.setNpcReferences(var10);
                     var6.setDespawnStarted(false);
                     var6.setTimeToDeactivation(var10.getDeactivationTime());
                  });
               }
            }

            if (var6.tickSpawnLostTimeout(var1) && var9.isSpawningNPC()) {
               PersistentRefCount var27 = var3.getComponent(var2, this.referenceIdComponentType);
               if (var27 != null) {
                  var27.increment();
                  SpawnMarkerSystems.LOGGER.at(Level.FINE).log("Marker lost spawned NPC and changed reference ID to %s", var27.get());
               }

               Ref var28 = var3.getReferenceTo(var2);
               var5.run(var3x -> var6.spawnNPC(var28, var10, null, var3x));
            }
         } else if (var8.getWorldConfig().isSpawningNPC()
            && var8.getWorldConfig().isSpawnMarkersEnabled()
            && !var10.isManualTrigger()
            && (var6.getSuppressedBy() == null || var6.getSuppressedBy().isEmpty())) {
            Ref var11 = var3.getReferenceTo(var2);
            WorldTimeResource var12 = var5.getResource(WorldTimeResource.getResourceType());
            if (var10.isRealtimeRespawn()) {
               if (var6.tickRespawnTimer(var1)) {
                  var5.run(var3x -> var6.spawnNPC(var11, var10, null, var3x));
               }
            } else if (var6.getSpawnAfter() == null || var12.getGameTime().isAfter(var6.getSpawnAfter())) {
               var5.run(var3x -> var6.spawnNPC(var11, var10, null, var3x));
            }
         }
      }
   }
}