TickingSpawnMarkerSystem class

Пакет: com.hypixel.hytale.server.npc.systems

Файл: com/hypixel/hytale/server/npc/systems/SpawnReferenceSystems.java

extends: EntityTickingSystem<EntityStore>

Поля (10)

МодификаторыТипИмя
private static final Set<Dependency<EntityStore>> DEPENDENCIES
private final ComponentType<EntityStore, SpawnMarkerEntity> markerTypeComponentType
private final ComponentType<EntityStore, NPCEntity> npcEntityComponentType
private final Query<EntityStore> query
private final ComponentType<EntityStore, SpawnMarkerReference> spawnReferenceComponentType
HytaleLogger.Api var10
NPCEntity var6
SpawnMarkerReference var7
Ref var8
SpawnMarkerEntity var9

Методы (5)

МодификаторыВозвратСигнатура
public Set<Dependency<EntityStore>> getDependenciespublic Set<Dependency<EntityStore>> getDependencies()
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
if if(var8 != null)
public boolean isParallelpublic boolean isParallel(int var1, int var2)
public void tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5)

Исходный код

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

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.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.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.Order;
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.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.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.reference.InvalidatablePersistentRef;
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.damage.DeathSystems;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
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.SpawnBeaconReference;
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.support.StateSupport;
class="kw">import com.hypixel.hytale.server.spawning.SpawningPlugin;
class="kw">import com.hypixel.hytale.server.spawning.assets.spawnmarker.config.SpawnMarker;
class="kw">import com.hypixel.hytale.server.spawning.beacons.LegacySpawnBeaconEntity;
class="kw">import com.hypixel.hytale.server.spawning.controllers.BeaconSpawnController;
class="kw">import com.hypixel.hytale.server.spawning.spawnmarkers.SpawnMarkerEntity;
class="kw">import java.time.Duration;
class="kw">import java.time.Instant;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

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

   class="kw">private class="kw">static void disconnectFromMarker(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull Store<EntityStore> var1,
      @Nonnull ComponentType<EntityStore, SpawnMarkerReference> var2,
      @Nonnull ComponentType<EntityStore, SpawnMarkerEntity> var3,
      @Nonnull ComponentType<EntityStore, UUIDComponent> var4,
      @Nonnull ResourceType<EntityStore, WorldTimeResource> var5
   ) {
      SpawnMarkerReference var6 = var1.getComponent(var0, var2);
      if (var6 != null) {
         Ref var7 = var6.getReference().getEntity(var1);
         if (var7 != null) {
            SpawnMarkerEntity var8 = var1.getComponent(var7, var3);
            if (var8 != null) {
               UUIDComponent var9 = var1.getComponent(var0, var4);
               assert var9 != null;
               UUID var10 = var9.getUuid();
               int var11 = var8.decrementAndGetSpawnCount();
               if (var11 < 0) {
                  SpawningPlugin.get()
                     .getLogger()
                     .at(Level.WARNING)
                     .log("Marker %s spawn count went negative (%d) while disconnecting NPC %s", var7, var11, var10);
                  var11 = 0;
                  var8.setSpawnCount(0);
               }

               SpawnMarker var12 = var8.getCachedMarker();
               if (var12.getDeactivationDistance() > 0.0) {
                  InvalidatablePersistentRef[] var13 = var8.getNpcReferences();
                  int var14 = 0;

                  for (InvalidatablePersistentRef var18 : var13) {
                     if (!var10.equals(var18.getUuid())) {
                        var14++;
                     }
                  }

                  InvalidatablePersistentRef[] var23 = new InvalidatablePersistentRef[var14];
                  int var25 = 0;

                  for (InvalidatablePersistentRef var20 : var13) {
                     if (!var10.equals(var20.getUuid())) {
                        var23[var25++] = var20;
                     }
                  }

                  var8.setNpcReferences(var23);
                  if (var14 == var13.length) {
                     SpawningPlugin.get()
                        .getLogger()
                        .at(Level.WARNING)
                        .log(
                           "Marker %s disconnected NPC %s that was not present in marker references (spawnCount=%d, refs=%d)", var7, var10, var11, var13.length
                        );
                  }

                  if (var11 != var14) {
                     SpawningPlugin.get()
                        .getLogger()
                        .at(Level.WARNING)
                        .log("Marker %s spawn count/reference mismatch while disconnecting NPC %s (spawnCount=%d, refsAfter=%d)", var7, var10, var11, var14);
                     var11 = var14;
                     var8.setSpawnCount(var14);
                  }
               }

               if (var11 <= 0 && !var12.isRealtimeRespawn()) {
                  Instant var21 = var1.getResource(var5).getGameTime();
                  Duration var22 = var8.pollGameTimeRespawn();
                  if (var22 != null) {
                     var21 = var21.plus(var22);
                  }

                  var8.setSpawnAfter(var21);
                  var8.setNpcReferences(null);
                  StoredFlock var24 = var8.getStoredFlock();
                  if (var24 != null) {
                     var24.clear();
                  }
               }
            }
         }
      }
   }

   class="kw">public class="kw">static class BeaconAddRemoveSystem class="kw">extends RefSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnBeaconReference> spawnReferenceComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, LegacySpawnBeaconEntity> legacySpawnBeaconComponent;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, NPCEntity> npcComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public BeaconAddRemoveSystem(
         @Nonnull ComponentType<EntityStore, SpawnBeaconReference> var1, @Nonnull ComponentType<EntityStore, LegacySpawnBeaconEntity> var2
      ) {
         this.spawnReferenceComponentType = var1;
         this.legacySpawnBeaconComponent = var2;
         this.npcComponentType = NPCEntity.getComponentType();
         this.query = Archetype.of(var1, this.npcComponentType);
      }

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

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         class="kw">switch (var2) {
            case LOAD:
               SpawnBeaconReference var5 = var3.getComponent(var1, this.spawnReferenceComponentType);
               assert var5 != null;
               Ref var6 = var5.getReference().getEntity(var3);
               if (var6 == null) {
                  class="kw">return;
               } else {
                  LegacySpawnBeaconEntity var7 = var3.getComponent(var6, this.legacySpawnBeaconComponent);
                  assert var7 != null;
                  NPCEntity var8 = var3.getComponent(var1, this.npcComponentType);
                  assert var8 != null;
                  var5.getReference().setEntity(var6, var3);
                  var5.refreshTimeoutCounter();
                  BeaconSpawnController var9 = var7.getSpawnController();
                  if (!var9.hasSlots()) {
                     var8.setToDespawn();
                     class="kw">return;
                  } else {
                     var9.notifySpawnedEntityExists(var6, var4);
                  }
               }
            case SPAWN:
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         class="kw">switch (var2) {
            case REMOVE:
            case BUILDER_TOOLS_UNDO:
               SpawnBeaconReference var5 = var3.getComponent(var1, this.spawnReferenceComponentType);
               if (var5 == null) {
                  class="kw">return;
               } else {
                  Ref var6 = var5.getReference().getEntity(var3);
                  if (var6 == null) {
                     class="kw">return;
                  } else {
                     LegacySpawnBeaconEntity var7 = var3.getComponent(var6, this.legacySpawnBeaconComponent);
                     if (var7 == null) {
                        class="kw">return;
                     } else {
                        var7.getSpawnController().notifyNPCRemoval(var1, var3);
                     }
                  }
               }
            case UNLOAD:
         }
      }
   }

   class="kw">public class="kw">static class MarkerAddRemoveSystem class="kw">extends RefSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerReference> spawnReferenceComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerEntity> spawnMarkerEntityComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, NPCEntity> npcComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, WorldGenId> worldGenIdComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, UUIDComponent> uuidComponentComponentType;
      @Nonnull
      class="kw">private class="kw">final ResourceType<EntityStore, WorldTimeResource> worldTimeResourceResourceType;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public MarkerAddRemoveSystem(@Nonnull ComponentType<EntityStore, SpawnMarkerReference> var1, @Nonnull ComponentType<EntityStore, SpawnMarkerEntity> var2) {
         this.spawnReferenceComponentType = var1;
         this.spawnMarkerEntityComponentType = var2;
         this.npcComponentType = NPCEntity.getComponentType();
         this.worldGenIdComponentType = WorldGenId.getComponentType();
         this.uuidComponentComponentType = UUIDComponent.getComponentType();
         this.worldTimeResourceResourceType = WorldTimeResource.getResourceType();
         this.query = Archetype.of(var1, this.npcComponentType, this.uuidComponentComponentType);
      }

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

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         class="kw">switch (var2) {
            case LOAD:
               SpawnMarkerReference var5 = var3.getComponent(var1, this.spawnReferenceComponentType);
               assert var5 != null;
               Ref var6 = var5.getReference().getEntity(var3);
               label38:
               if (var6 == null) {
                  class="kw">return;
               } else {
                  SpawnMarkerEntity var7 = var3.getComponent(var6, this.spawnMarkerEntityComponentType);
                  assert var7 != null;
                  NPCEntity var8 = var3.getComponent(var1, this.npcComponentType);
                  assert var8 != null;
                  var5.getReference().setEntity(var6, var3);
                  var5.refreshTimeoutCounter();
                  var7.refreshTimeout();
                  WorldGenId var9 = var4.getComponent(var6, this.worldGenIdComponentType);
                  int var10 = var9 != null ? var9.getWorldGenId() : 0;
                  var4.putComponent(var6, WorldGenId.getComponentType(), new WorldGenId(var10));
                  HytaleLogger.Api var11 = SpawningPlugin.get().getLogger().at(Level.FINE);
                  if (var11.isEnabled()) {
                     UUIDComponent var12 = var4.getComponent(var6, this.uuidComponentComponentType);
                     assert var12 != null;
                     UUID var13 = var12.getUuid();
                     var11.log("%s synced up with marker %s", var8.getRoleName(), var13);
                  }
               }
            case SPAWN:
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         class="kw">switch (var2) {
            case REMOVE:
            case BUILDER_TOOLS_UNDO:
               SpawnReferenceSystems.disconnectFromMarker(
                  var1,
                  var3,
                  this.spawnReferenceComponentType,
                  this.spawnMarkerEntityComponentType,
                  this.uuidComponentComponentType,
                  this.worldTimeResourceResourceType
               );
            case UNLOAD:
         }
      }
   }

   class="kw">public class="kw">static class MarkerDeathSystem class="kw">extends DeathSystems.OnDeathSystem {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerReference> spawnReferenceComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerEntity> spawnMarkerEntityComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, UUIDComponent> uuidComponentComponentType;
      @Nonnull
      class="kw">private class="kw">final ResourceType<EntityStore, WorldTimeResource> worldTimeResourceResourceType;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public MarkerDeathSystem(@Nonnull ComponentType<EntityStore, SpawnMarkerReference> var1, @Nonnull ComponentType<EntityStore, SpawnMarkerEntity> var2) {
         this.spawnReferenceComponentType = var1;
         this.spawnMarkerEntityComponentType = var2;
         this.uuidComponentComponentType = UUIDComponent.getComponentType();
         this.worldTimeResourceResourceType = WorldTimeResource.getResourceType();
         this.query = Archetype.of(var1, this.uuidComponentComponentType);
      }

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

      class="kw">public void onComponentAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull DeathComponent var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         SpawnReferenceSystems.disconnectFromMarker(
            var1,
            var3,
            this.spawnReferenceComponentType,
            this.spawnMarkerEntityComponentType,
            this.uuidComponentComponentType,
            this.worldTimeResourceResourceType
         );
         var4.removeComponent(var1, this.spawnReferenceComponentType);
      }
   }

   class="kw">public class="kw">static class TickingSpawnBeaconSystem class="kw">extends EntityTickingSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">static class="kw">final Set<Dependency<EntityStore>> DEPENDENCIES = Set.of(
         new SystemDependency<>(Order.AFTER, NPCPreTickSystem.class), new SystemDependency<>(Order.BEFORE, DeathSystems.CorpseRemoval.class)
      );
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnBeaconReference> spawnReferenceComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, NPCEntity> npcEntityComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public TickingSpawnBeaconSystem(@Nonnull ComponentType<EntityStore, SpawnBeaconReference> var1) {
         this.spawnReferenceComponentType = var1;
         this.npcEntityComponentType = NPCEntity.getComponentType();
         this.query = Archetype.of(var1, this.npcEntityComponentType);
      }

      @Nonnull
      @Override
      class="kw">public Set<Dependency<EntityStore>> getDependencies() {
         class="kw">return 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
      ) {
         NPCEntity var6 = var3.getComponent(var2, this.npcEntityComponentType);
         assert var6 != null;
         if (!var6.isDespawning() && !var6.isPlayingDespawnAnim()) {
            SpawnBeaconReference var7 = var3.getComponent(var2, this.spawnReferenceComponentType);
            assert var7 != null;
            if (var7.tickMarkerLostTimeoutCounter(var1)) {
               Ref var8 = var7.getReference().getEntity(var5);
               if (var8 != null) {
                  var7.refreshTimeoutCounter();
               } else if (StateSupport.get(var3.getReferenceTo(var2), var5).isInBusyState()) {
                  var7.refreshTimeoutCounter();
               } else {
                  var6.setToDespawn();
                  HytaleLogger.Api var9 = SpawningPlugin.get().getLogger().at(Level.WARNING);
                  if (var9.isEnabled()) {
                     var9.log("NPCEntity despawning due to lost marker: %s", var3.getReferenceTo(var2));
                  }
               }
            }
         }
      }
   }

   class="kw">public class="kw">static class TickingSpawnMarkerSystem class="kw">extends EntityTickingSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">static class="kw">final Set<Dependency<EntityStore>> DEPENDENCIES = Set.of(
         new SystemDependency<>(Order.AFTER, NPCPreTickSystem.class), new SystemDependency<>(Order.BEFORE, DeathSystems.CorpseRemoval.class)
      );
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerReference> spawnReferenceComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, SpawnMarkerEntity> markerTypeComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, NPCEntity> npcEntityComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public TickingSpawnMarkerSystem(
         @Nonnull ComponentType<EntityStore, SpawnMarkerReference> var1, @Nonnull ComponentType<EntityStore, SpawnMarkerEntity> var2
      ) {
         this.spawnReferenceComponentType = var1;
         this.markerTypeComponentType = var2;
         this.npcEntityComponentType = NPCEntity.getComponentType();
         this.query = Archetype.of(var1, this.npcEntityComponentType);
      }

      @Nonnull
      @Override
      class="kw">public Set<Dependency<EntityStore>> getDependencies() {
         class="kw">return 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
      ) {
         NPCEntity var6 = var3.getComponent(var2, this.npcEntityComponentType);
         assert var6 != null;
         if (!var6.isDespawning() && !var6.isPlayingDespawnAnim()) {
            SpawnMarkerReference var7 = var3.getComponent(var2, this.spawnReferenceComponentType);
            assert var7 != null;
            if (var7.tickMarkerLostTimeoutCounter(var1)) {
               Ref var8 = var7.getReference().getEntity(var5);
               if (var8 != null) {
                  SpawnMarkerEntity var9 = var5.getComponent(var8, this.markerTypeComponentType);
                  assert var9 != null;
                  var7.refreshTimeoutCounter();
                  var9.refreshTimeout();
               } else if (StateSupport.get(var3.getReferenceTo(var2), var5).isInBusyState()) {
                  var7.refreshTimeoutCounter();
               } else {
                  var6.setToDespawn();
                  HytaleLogger.Api var10 = SpawningPlugin.get().getLogger().at(Level.WARNING);
                  if (var10.isEnabled()) {
                     var10.log("NPCEntity despawning due to lost marker: %s", var3.getReferenceTo(var2));
                  }
               }
            }
         }
      }
   }
}