CompanionBlockSpawnerSystems class

Пакет: com.hypixel.hytale.builtin.companionblockspawner

Файл: com/hypixel/hytale/builtin/companionblockspawner/CompanionBlockSpawnerSystems.java

Поля (106)

МодификаторыТипИмя
private final Query<ChunkStore> query
private final Query<EntityStore> query
private final Query<ChunkStore> query
private final ComponentType<EntityStore, CompanionSpawnerMarkerReference> referenceType
return
return
return
private final ComponentType<ChunkStore, CompanionBlockSpawnerBlock> spawnerBlockType
private final ComponentType<ChunkStore, CompanionBlockSpawnerBlock> spawnerBlockType
List var10
CompanionBlockSpawnerBlock var10
CompanionBlockSpawnerBlock var10
Vector3i var10
String var10
WorldChunk var10
String var10
boolean var10
var10
List var11
UUID var11
String var11
Vector3i var11
List var11
Ref var11
World var11
ChunkStore var11
Ref var12
Set var12
String var12
CompanionBlockSpawnerBlock var12
CompanionBlockSpawnerBlock var12
UUIDComponent var12
List var12
Ref var12
Vector3i var13
Vector3i var13
CompanionBlockSpawnerBlock var13
UUID var13
WorldChunk var13
String var14
Vector3i var14
Ref var14
Ref var14
List var15
CompanionBlockSpawnerBlock var15
CompanionBlockSpawnerBlock var15
boolean[] var16
CompanionBlockSpawnerBlock var16
UUID var16
List var17
List var17
String var17
var17
var17
BlockType var18
Set var19
String var19
CompanionBlockSpawnerBlock var2
BlockModule.BlockStateInfo var2
int var20
boolean var20
CompanionBlockSpawnerRecipe.RequiredBlock[] var22
boolean[] var23
Vector3i var26
CompanionBlockSpawnerBlock var3
BlockModule.BlockStateInfo var3
BlockModule.BlockStateInfo var3
int var4
List var4
BlockSection var4
ChunkStore var5
ComponentType var5
BlockType var5
CompanionBlockSpawnerRecipeCompendium var5
CompanionBlockSpawnerRecipeCompendium var5
int var6
double var6
Vector3i var6
World var6
CompanionSpawnerMarkerReference var6
CompanionBlockSpawnerBlock var6
int var7
String var7
CompanionBlockSpawnerBlock var7
Vector3i var7
Ref var7
CompanionBlockSpawnerRecipeCompendium var7
UUID var7
Vector3i var7
double var8
var8
int var8
List var8
World var8
UUID var8
ChunkStore var8
Ref var8
Store var8
double var8
int var9
ComponentType var9
List var9
List var9
Ref var9
Vector3i var9
Ref var9

Методы (75)

МодификаторыВозвратСигнатура
public AddOrRemovepublic AddOrRemove(@Nonnull ComponentType<ChunkStore, CompanionBlockSpawnerBlock> var1)
private record Candidaterecord Candidate(Ref<ChunkStore> ref, String key)
public MarkerHeartbeatpublic MarkerHeartbeat(@Nonnull ComponentType<EntityStore, CompanionSpawnerMarkerReference> var1)
public ReconcileTickpublic ReconcileTick(@Nonnull ComponentType<ChunkStore, CompanionBlockSpawnerBlock> var1)
static void classifyvoid classify(@Nonnull Store<ChunkStore> var0, @Nonnull ComponentType<ChunkStore, CompanionBlockSpawnerBlock> var1, @Nonnull Ref<ChunkStore> var2, @Nonnull Vector3i var3, @Nonnull CompanionBlockSpawnerRecipe var4, @Nonnull List<Set<String>> var5, @Nullable Vector3i var6, @Nonnull Set<Vector3i> var7, @Nonnull Vector3i var8, @Nonnull List<CompanionBlockSpawnerSystems.Candidate> var9, @Nonnull List<CompanionBlockSpawnerSystems.Candidate> var10)
abstract classify classify(var0, var9, var15, var3, var4, var8, var6, var12, var13, var10, var11)
abstract classify classify(var0, var9, var5, var3, var4, var8, var6, var12, var13, var10, var11)
static void clearClaimvoid clearClaim(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1)
static void deactivatevoid deactivate(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull CompanionBlockSpawnerBlock var2, @Nonnull Vector3i var3, @Nonnull World var4)
abstract deactivate deactivate(var0, var1, var2, var3, var7)
static void evaluateSpawnervoid evaluateSpawner(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull CompanionBlockSpawnerBlock var2, @Nonnull Vector3i var3, @Nonnull List<CompanionBlockSpawnerRecipe> var4, @Nullable Ref<ChunkStore> var5, @Nullable Vector3i var6, @Nonnull World var7)
static boolean fillWorldPosboolean fillWorldPos(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull Vector3i var2)
for for(CompanionBlockSpawnerRecipe var11 : var4)
for for(int var10 = var6; var10 <= var7; var10++)
for for(int var11 = var8; var11 <= var9; var11++)
for for(CompanionBlockSpawnerRecipe var9 : var4)
for for(int var18 = 0; var18 < var22.length; var18++)
for for(Ref var27 : var17)
for for(Set var3 : var0)
for for(Ref var13 : var17)
for for(Ref var12 : var9)
for for(Ref var9 : var2)
abstract for for(int var25 = 0; var25 < var10.size()
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
public Query<ChunkStore> getQuerypublic Query<ChunkStore> getQuery()
if if(var8 == null)
if if(var5 != null)
if if(var20 > 0)
if if(!var23[var25])
if if(var11 != null)
if if(var11 != null)
if if(var12 != null)
if if(var13 == null)
if if(var3 != null)
if if(var2 != null)
if if(var2 != null)
if if(var4 == null)
if if(var9 != null)
if if(var14 != null)
if if(var15 != null)
if if(var2 != RemoveReason.UNLOAD)
if if(var8 != null)
if if(var11 != null)
if if(var7)
if if(var7 != null)
if if(var10 != null)
if if(var16 != null)
if if(var20)
if if(var1 != null)
if if(var10 != null)
if if(var12 != null)
if if(var7 != null)
if if(!var10)
if if(var13 == null)
if if(var10)
static boolean isAreaLoadedboolean isAreaLoaded(@Nonnull World var0, @Nonnull Vector3i var1, double var2)
public boolean isParallelpublic boolean isParallel(int var1, int var2)
public boolean isParallelpublic boolean isParallel(int var1, int var2)
static void markBlockDirtyvoid markBlockDirty(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1)
abstract markBlockDirty markBlockDirty(var0, var9)
abstract markBlockDirty markBlockDirty(var0, var1)
static boolean matchesAnyEntryboolean matchesAnyEntry(@Nonnull List<Set<String>> var0, @Nonnull String var1)
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)
private void reconcileActiveSpawnerprivate void reconcileActiveSpawner(@Nonnull Store<ChunkStore> var1, @Nonnull Ref<ChunkStore> var2, @Nonnull CompanionBlockSpawnerBlock var3, @Nonnull Vector3i var4, @Nonnull List<CompanionBlockSpawnerRecipe> var5, @Nonnull World var6)
private void reconcileClaimprivate void reconcileClaim(@Nonnull Store<ChunkStore> var1, @Nonnull Ref<ChunkStore> var2, @Nonnull CompanionBlockSpawnerBlock var3, @Nonnull Vector3i var4, @Nonnull CompanionBlockSpawnerRecipeCompendium var5, @Nonnull World var6)
private void reevaluateprivate void reevaluate(@Nonnull Store<ChunkStore> var1, @Nonnull List<Ref<ChunkStore>> var2, @Nonnull CompanionBlockSpawnerRecipeCompendium var3, @Nonnull Vector3i var4, @Nonnull Vector3i var5, @Nonnull World var6, boolean var7)
private static void removeMarkerAndCompanionsprivate static void removeMarkerAndCompanions(@Nonnull Ref<EntityStore> var0, @Nullable SpawnMarkerEntity var1, @Nonnull CommandBuffer<EntityStore> var2)
static void setClaimvoid setClaim(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull Vector3i var2)
abstract setClaim setClaim(var0, var27, var3)
public void tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5)
public void tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> var5)
static boolean tryActivateboolean tryActivate(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull CompanionBlockSpawnerBlock var2, @Nonnull Vector3i var3, @Nonnull CompanionBlockSpawnerRecipe var4, @Nullable Ref<ChunkStore> var5, @Nullable Vector3i var6, @Nonnull World var7)
static boolean tryActivateAnyboolean tryActivateAny(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull CompanionBlockSpawnerBlock var2, @Nonnull Vector3i var3, @Nonnull List<CompanionBlockSpawnerRecipe> var4, @Nullable Ref<ChunkStore> var5, @Nullable Vector3i var6, @Nonnull World var7)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.companionblockspawner.config.CompanionBlockSpawnerRecipe;
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.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
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.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.util.ChunkUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
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.block.BlockModule;
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.section.BlockSection;
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.spawnmarkers.SpawnMarkerEntity;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
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">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class="kw">final class CompanionBlockSpawnerSystems {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final int REMOVAL_REEVALUATION_RADIUS_MULTIPLIER = 2;

   class="kw">private CompanionBlockSpawnerSystems() {
   }

   class="kw">static void evaluateSpawner(
      @Nonnull Store<ChunkStore> var0,
      @Nonnull Ref<ChunkStore> var1,
      @Nonnull CompanionBlockSpawnerBlock var2,
      @Nonnull Vector3i var3,
      @Nonnull List<CompanionBlockSpawnerRecipe> var4,
      @Nullable Ref<ChunkStore> var5,
      @Nullable Vector3i var6,
      @Nonnull World var7
   ) {
      if (!tryActivateAny(var0, var1, var2, var3, var4, var5, var6, var7)) {
         double var8 = 0.0;

         for (CompanionBlockSpawnerRecipe var11 : var4) {
            var8 = Math.max(var8, var11.getRadius());
         }

         if (isAreaLoaded(var7, var3, var8)) {
            deactivate(var0, var1, var2, var3, var7);
         }
      }
   }

   class="kw">static boolean isAreaLoaded(@Nonnull World var0, @Nonnull Vector3i var1, double var2) {
      int var4 = (int)Math.ceil(var2);
      ChunkStore var5 = var0.getChunkStore();
      int var6 = ChunkUtil.chunkCoordinate(var1.x - var4);
      int var7 = ChunkUtil.chunkCoordinate(var1.x + var4);
      int var8 = ChunkUtil.chunkCoordinate(var1.z - var4);
      int var9 = ChunkUtil.chunkCoordinate(var1.z + var4);

      for (int var10 = var6; var10 <= var7; var10++) {
         for (int var11 = var8; var11 <= var9; var11++) {
            Ref var12 = var5.getChunkReference(ChunkUtil.indexChunk(var10, var11));
            if (var12 == null || !var12.isValid()) {
               class="kw">return false;
            }
         }
      }

      class="kw">return true;
   }

   class="kw">static boolean tryActivateAny(
      @Nonnull Store<ChunkStore> var0,
      @Nonnull Ref<ChunkStore> var1,
      @Nonnull CompanionBlockSpawnerBlock var2,
      @Nonnull Vector3i var3,
      @Nonnull List<CompanionBlockSpawnerRecipe> var4,
      @Nullable Ref<ChunkStore> var5,
      @Nullable Vector3i var6,
      @Nonnull World var7
   ) {
      for (CompanionBlockSpawnerRecipe var9 : var4) {
         if (tryActivate(var0, var1, var2, var3, var9, var5, var6, var7)) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   class="kw">private class="kw">static boolean tryActivate(
      @Nonnull Store<ChunkStore> var0,
      @Nonnull Ref<ChunkStore> var1,
      @Nonnull CompanionBlockSpawnerBlock var2,
      @Nonnull Vector3i var3,
      @Nonnull CompanionBlockSpawnerRecipe var4,
      @Nullable Ref<ChunkStore> var5,
      @Nullable Vector3i var6,
      @Nonnull World var7
   ) {
      List var8 = CompanionBlockSpawnerPlugin.get().getRecipeIndex().getEntryKeySets(var4);
      if (var8 == null) {
         class="kw">return false;
      }

      ComponentType var9 = CompanionBlockSpawnerBlock.getComponentType();
      List var10 = new ArrayList<>();
      List var11 = new ArrayList<>();
      Set var12 = new ObjectOpenHashSet();
      Vector3i var13 = new Vector3i();

      for (Ref var15 : collectNearby(var0, var3, var4.getRadius())) {
         classify(var0, var9, var15, var3, var4, var8, var6, var12, var13, var10, var11);
      }

      if (var5 != null) {
         classify(var0, var9, var5, var3, var4, var8, var6, var12, var13, var10, var11);
      }

      CompanionBlockSpawnerRecipe.RequiredBlock[] var22 = var4.getRequiredBlocks();
      boolean[] var23 = new boolean[var10.size()];
      boolean[] var16 = new boolean[var11.size()];
      List var17 = new ArrayList<>();

      for (int var18 = 0; var18 < var22.length; var18++) {
         Set var19 = var8.get(var18);
         int var20 = var22[var18].getCount();

         for (int var21 = 0; var21 < var10.size() && var20 > 0; var21++) {
            if (!var23[var21] && var19.contains(var10.get(var21).key())) {
               var23[var21] = true;
               var20--;
            }
         }

         for (int var28 = 0; var28 < var11.size() && var20 > 0; var28++) {
            if (!var16[var28] && var19.contains(var11.get(var28).key())) {
               var16[var28] = true;
               var17.add(var11.get(var28).ref());
               var20--;
            }
         }

         if (var20 > 0) {
            class="kw">return false;
         }
      }

      for (Ref var27 : var17) {
         setClaim(var0, var27, var3);
      }

      for (int var25 = 0; var25 < var10.size(); var25++) {
         if (!var23[var25]) {
            clearClaim(var0, var10.get(var25).ref());
         }
      }

      if (!var2.hasMarker()) {
         Vector3i var26 = new Vector3i(var3);
         var7.execute(() -> CompanionBlockSpawnerSupport.createMarker(var7, var26, var1, var4));
      }

      class="kw">return true;
   }

   class="kw">static void deactivate(
      @Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull CompanionBlockSpawnerBlock var2, @Nonnull Vector3i var3, @Nonnull World var4
   ) {
      ComponentType var5 = CompanionBlockSpawnerBlock.getComponentType();
      double var6 = CompanionBlockSpawnerPlugin.get().getRecipeIndex().getMaxRadius();

      for (Ref var9 : collectNearby(var0, var3, var6)) {
         CompanionBlockSpawnerBlock var10 = var0.getComponent(var9, var5);
         if (var10 != null && var3.equals(var10.getClaimedByBlock())) {
            var10.setClaimedByBlock(null);
            markBlockDirty(var0, var9);
         }
      }

      if (var2.hasMarker()) {
         UUID var11 = var2.getMarkerRef().getUuid();
         var2.setMarkerRef(null);
         markBlockDirty(var0, var1);
         if (var11 != null) {
            String var12 = "spawner at " + var3.x + ", " + var3.y + ", " + var3.z + " deactivated (conditions no longer satisfiable)";
            var4.execute(() -> CompanionBlockSpawnerSupport.removeMarker(var4, var11, var12));
         }
      }
   }

   class="kw">private class="kw">static void classify(
      @Nonnull Store<ChunkStore> var0,
      @Nonnull ComponentType<ChunkStore, CompanionBlockSpawnerBlock> var1,
      @Nonnull Ref<ChunkStore> var2,
      @Nonnull Vector3i var3,
      @Nonnull CompanionBlockSpawnerRecipe var4,
      @Nonnull List<Set<String>> var5,
      @Nullable Vector3i var6,
      @Nonnull Set<Vector3i> var7,
      @Nonnull Vector3i var8,
      @Nonnull List<CompanionBlockSpawnerSystems.Candidate> var9,
      @Nonnull List<CompanionBlockSpawnerSystems.Candidate> var10
   ) {
      String var11 = resolveKeyAndPos(var0, var2, var8);
      if (var11 != null) {
         if (!var8.equals(var3)) {
            if (var6 == null || !var8.equals(var6)) {
               if (!(var8.distanceSquared(var3) > var4.getRadius() * var4.getRadius())) {
                  if (var7.add(new Vector3i(var8))) {
                     CompanionBlockSpawnerBlock var12 = var0.getComponent(var2, var1);
                     if (var12 != null) {
                        Vector3i var13 = var12.getClaimedByBlock();
                        if (var13 == null) {
                           if (matchesAnyEntry(var5, var11)) {
                              var10.add(new CompanionBlockSpawnerSystems.Candidate(var2, var11));
                           }
                        } else if (var13.equals(var3)) {
                           var9.add(new CompanionBlockSpawnerSystems.Candidate(var2, var11));
                        }
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">private class="kw">static boolean matchesAnyEntry(@Nonnull List<Set<String>> var0, @Nonnull String var1) {
      for (Set var3 : var0) {
         if (var3.contains(var1)) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   class="kw">private class="kw">static void setClaim(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull Vector3i var2) {
      CompanionBlockSpawnerBlock var3 = var0.getComponent(var1, CompanionBlockSpawnerBlock.getComponentType());
      if (var3 != null) {
         var3.setClaimedByBlock(new Vector3i(var2));
         markBlockDirty(var0, var1);
      }
   }

   class="kw">private class="kw">static void clearClaim(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1) {
      CompanionBlockSpawnerBlock var2 = var0.getComponent(var1, CompanionBlockSpawnerBlock.getComponentType());
      if (var2 != null) {
         var2.setClaimedByBlock(null);
         markBlockDirty(var0, var1);
      }
   }

   class="kw">private class="kw">static void markBlockDirty(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1) {
      BlockModule.BlockStateInfo var2 = var0.getComponent(var1, BlockModule.BlockStateInfo.getComponentType());
      if (var2 != null) {
         var2.markNeedsSaving();
      }
   }

   @Nonnull
   class="kw">static List<Ref<ChunkStore>> collectNearby(@Nonnull Store<ChunkStore> var0, @Nonnull Vector3i var1, double var2) {
      List var4 = SpatialResource.getThreadLocalReferenceList();
      var0.getResource(CompanionBlockSpawnerPlugin.get().getSpatialResource()).getSpatialStructure().collect(new Vector3d(var1.x, var1.y, var1.z), var2, var4);
      class="kw">return new ArrayList<>(var4);
   }

   class="kw">static boolean fillWorldPos(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull Vector3i var2) {
      BlockModule.BlockStateInfo var3 = var0.getComponent(var1, BlockModule.BlockStateInfo.getComponentType());
      class="kw">return var3 != null && var3.fillWorldPos(var0, var2);
   }

   @Nullable
   class="kw">static String resolveKeyAndPos(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull Vector3i var2) {
      BlockModule.BlockStateInfo var3 = var0.getComponent(var1, BlockModule.BlockStateInfo.getComponentType());
      if (var3 != null && var3.fillWorldPos(var0, var2)) {
         BlockSection var4 = var0.getComponent(var3.getSectionRef(), BlockSection.getComponentType());
         if (var4 == null) {
            class="kw">return null;
         }

         BlockType var5 = BlockType.getAssetMap().getAsset(var4.get(var3.getIndex()));
         class="kw">return var5 != null ? var5.getId() : null;
      } else {
         class="kw">return null;
      }
   }

   class="kw">public class="kw">static class AddOrRemove class="kw">extends RefSystem<ChunkStore> {
      class="kw">private class="kw">final ComponentType<ChunkStore, CompanionBlockSpawnerBlock> spawnerBlockType;
      class="kw">private class="kw">final Query<ChunkStore> query;

      class="kw">public AddOrRemove(@Nonnull ComponentType<ChunkStore, CompanionBlockSpawnerBlock> var1) {
         this.spawnerBlockType = var1;
         this.query = Query.and(var1, BlockModule.BlockStateInfo.getComponentType());
      }

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

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         CompanionBlockSpawnerRecipeCompendium var5 = CompanionBlockSpawnerPlugin.get().getRecipeIndex();
         if (!var5.isEmpty()) {
            Vector3i var6 = new Vector3i();
            String var7 = CompanionBlockSpawnerSystems.resolveKeyAndPos(var3, var1, var6);
            if (var7 != null && var5.isParticipating(var7)) {
               World var8 = var3.getExternalData().getWorld();
               List var9 = var5.getRecipesForSpawner(var7);
               if (var9 != null) {
                  CompanionBlockSpawnerBlock var10 = var3.getComponent(var1, this.spawnerBlockType);
                  if (var10 != null && !var10.hasMarker()) {
                     CompanionBlockSpawnerSystems.tryActivateAny(var3, var1, var10, var6, var9, var1, null, var8);
                  }
               }

               if (var5.isIngredient(var7)) {
                  List var17 = CompanionBlockSpawnerSystems.collectNearby(var3, var6, var5.getMaxRadius());
                  Vector3i var11 = new Vector3i();

                  for (Ref var13 : var17) {
                     String var14 = CompanionBlockSpawnerSystems.resolveKeyAndPos(var3, var13, var11);
                     if (var14 != null) {
                        List var15 = var5.getRecipesForSpawner(var14);
                        if (var15 != null) {
                           CompanionBlockSpawnerBlock var16 = var3.getComponent(var13, this.spawnerBlockType);
                           if (var16 != null && !var16.hasMarker()) {
                              CompanionBlockSpawnerSystems.tryActivateAny(var3, var13, var16, var11, var15, var1, null, var8);
                           }
                        }
                     }
                  }
               }
            }
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
      ) {
         if (var2 != RemoveReason.UNLOAD) {
            CompanionBlockSpawnerRecipeCompendium var5 = CompanionBlockSpawnerPlugin.get().getRecipeIndex();
            if (!var5.isEmpty()) {
               World var6 = var3.getExternalData().getWorld();
               CompanionBlockSpawnerBlock var7 = var4.getComponent(var1, this.spawnerBlockType);
               if (var7 != null && var7.hasMarker()) {
                  UUID var8 = var7.getMarkerRef().getUuid();
                  if (var8 != null) {
                     var6.execute(() -> CompanionBlockSpawnerSupport.removeMarker(var6, var8, "spawner block removed"));
                  }
               }

               Vector3i var14 = new Vector3i();
               if (CompanionBlockSpawnerSystems.fillWorldPos(var3, var1, var14)) {
                  List var9 = CompanionBlockSpawnerSystems.collectNearby(var3, var14, var5.getMaxRadius() * 2.0);
                  Vector3i var10 = new Vector3i();

                  for (Ref var12 : var9) {
                     CompanionBlockSpawnerBlock var13 = var3.getComponent(var12, this.spawnerBlockType);
                     if (var13 != null && var14.equals(var13.getClaimedByBlock())) {
                        var13.setClaimedByBlock(null);
                        CompanionBlockSpawnerSystems.markBlockDirty(var3, var12);
                     }
                  }

                  this.reevaluate(var3, var9, var5, var14, var10, var6, true);
                  this.reevaluate(var3, var9, var5, var14, var10, var6, false);
               }
            }
         }
      }

      class="kw">private void reevaluate(
         @Nonnull Store<ChunkStore> var1,
         @Nonnull List<Ref<ChunkStore>> var2,
         @Nonnull CompanionBlockSpawnerRecipeCompendium var3,
         @Nonnull Vector3i var4,
         @Nonnull Vector3i var5,
         @Nonnull World var6,
         boolean var7
      ) {
         for (Ref var9 : var2) {
            String var10 = CompanionBlockSpawnerSystems.resolveKeyAndPos(var1, var9, var5);
            if (var10 != null && !var5.equals(var4)) {
               List var11 = var3.getRecipesForSpawner(var10);
               if (var11 != null) {
                  CompanionBlockSpawnerBlock var12 = var1.getComponent(var9, this.spawnerBlockType);
                  if (var12 != null && var12.hasMarker() == var7) {
                     if (var7) {
                        CompanionBlockSpawnerSystems.evaluateSpawner(var1, var9, var12, var5, var11, null, var4, var6);
                     } else {
                        CompanionBlockSpawnerSystems.tryActivateAny(var1, var9, var12, var5, var11, null, var4, var6);
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">private record Candidate(Ref<ChunkStore> ref, String key) {
      class="kw">private Candidate {
      }
   }

   class="kw">public class="kw">static class MarkerHeartbeat class="kw">extends EntityTickingSystem<EntityStore> {
      class="kw">private class="kw">final ComponentType<EntityStore, CompanionSpawnerMarkerReference> referenceType;
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public MarkerHeartbeat(@Nonnull ComponentType<EntityStore, CompanionSpawnerMarkerReference> var1) {
         this.referenceType = var1;
         this.query = Query.and(var1, SpawnMarkerEntity.getComponentType());
      }

      @Nullable
      @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 false;
      }

      @Override
      class="kw">public void tick(
         float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
      ) {
         CompanionSpawnerMarkerReference var6 = var3.getComponent(var2, this.referenceType);
         assert var6 != null;
         Vector3i var7 = var6.getSpawnerPosition();
         if (var7 != null) {
            ChunkStore var8 = var4.getExternalData().getWorld().getChunkStore();
            Ref var9 = var8.getChunkReference(ChunkUtil.indexChunkFromBlock(var7.x, var7.z));
            WorldChunk var10 = var9 != null && var9.isValid() ? var8.getStore().getComponent(var9, WorldChunk.getComponentType()) : null;
            if (var10 != null) {
               Ref var11 = var3.getReferenceTo(var2);
               UUIDComponent var12 = var5.getComponent(var11, UUIDComponent.getComponentType());
               UUID var13 = var12 != null ? var12.getUuid() : null;
               Ref var14 = var10.getBlockComponentEntity(var7.x, var7.y, var7.z);
               CompanionBlockSpawnerBlock var15 = var14 != null ? var14.getStore().getComponent(var14, CompanionBlockSpawnerBlock.getComponentType()) : null;
               UUID var16 = var15 != null && var15.getMarkerRef() != null ? var15.getMarkerRef().getUuid() : null;
               if (var13 == null || !var13.equals(var16)) {
                  String var17;
                  if (var16 != null) {
                     var17 = "origin spawner references another marker (" + var16 + ")";
                  } else {
                     BlockType var18 = var10.getBlockType(var7.x, var7.y, var7.z);
                     String var19 = var18 != null ? var18.getId() : null;
                     boolean var20 = var19 != null && CompanionBlockSpawnerPlugin.get().getRecipeIndex().getRecipesForSpawner(var19) != null;
                     if (var20) {
                        class="kw">return;
                     }

                     var17 = "origin block is no longer a spawner (" + var19 + ")";
                  }

                  CompanionBlockSpawnerSystems.LOGGER
                     .at(Level.WARNING)
                     .log("Removing companion spawn marker %s (uuid %s) at origin %s: %s", var11, var13, var7, var17);
                  removeMarkerAndCompanions(var11, var3.getComponent(var2, SpawnMarkerEntity.getComponentType()), var5);
               }
            }
         }
      }

      class="kw">private class="kw">static void removeMarkerAndCompanions(@Nonnull Ref<EntityStore> var0, @Nullable SpawnMarkerEntity var1, @Nonnull CommandBuffer<EntityStore> var2) {
         if (var1 != null) {
            for (InvalidatablePersistentRef var6 : var1.getNpcReferences()) {
               Ref var7 = var6.getEntity(var2);
               if (var7 != null && var7.isValid()) {
                  var2.removeEntity(var7, RemoveReason.REMOVE);
               }
            }
         }

         var2.removeEntity(var0, RemoveReason.REMOVE);
      }
   }

   class="kw">public class="kw">static class ReconcileTick class="kw">extends EntityTickingSystem<ChunkStore> {
      class="kw">private class="kw">final ComponentType<ChunkStore, CompanionBlockSpawnerBlock> spawnerBlockType;
      class="kw">private class="kw">final Query<ChunkStore> query;

      class="kw">public ReconcileTick(@Nonnull ComponentType<ChunkStore, CompanionBlockSpawnerBlock> var1) {
         this.spawnerBlockType = var1;
         this.query = Query.and(var1, BlockModule.BlockStateInfo.getComponentType());
      }

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

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

      @Override
      class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> var5) {
         CompanionBlockSpawnerBlock var6 = var3.getComponent(var2, this.spawnerBlockType);
         assert var6 != null;
         if (var6.tickReconcileCountdown(var1)) {
            var6.resetReconcileCountdown();
            CompanionBlockSpawnerRecipeCompendium var7 = CompanionBlockSpawnerPlugin.get().getRecipeIndex();
            if (!var7.isEmpty()) {
               Ref var8 = var3.getReferenceTo(var2);
               Vector3i var9 = new Vector3i();
               String var10 = CompanionBlockSpawnerSystems.resolveKeyAndPos(var4, var8, var9);
               if (var10 != null) {
                  World var11 = var4.getExternalData().getWorld();
                  List var12 = var7.getRecipesForSpawner(var10);
                  if (var12 != null) {
                     if (var6.hasMarker()) {
                        this.reconcileActiveSpawner(var4, var8, var6, var9, var12, var11);
                     } else {
                        CompanionBlockSpawnerSystems.evaluateSpawner(var4, var8, var6, var9, var12, null, null, var11);
                     }
                  }

                  this.reconcileClaim(var4, var8, var6, var9, var7, var11);
               }
            }
         }
      }

      class="kw">private void reconcileActiveSpawner(
         @Nonnull Store<ChunkStore> var1,
         @Nonnull Ref<ChunkStore> var2,
         @Nonnull CompanionBlockSpawnerBlock var3,
         @Nonnull Vector3i var4,
         @Nonnull List<CompanionBlockSpawnerRecipe> var5,
         @Nonnull World var6
      ) {
         UUID var7 = var3.getMarkerRef() != null ? var3.getMarkerRef().getUuid() : null;
         Store var8 = var6.getEntityStore().getStore();
         Ref var9 = var7 != null ? var8.getExternalData().getRefFromUUID(var7) : null;
         if (var9 != null && var9.isValid()) {
            CompanionBlockSpawnerSystems.evaluateSpawner(var1, var2, var3, var4, var5, null, null, var6);
         } else if (CompanionBlockSpawnerSystems.isAreaLoaded(var6, var4, CompanionBlockSpawnerSupport.getMaxMarkerDistance())) {
            CompanionBlockSpawnerSystems.LOGGER.at(Level.WARNING).log("Companion spawner at %s lost its marker (%s) - re-evaluating", var4, var7);
            var3.setMarkerRef(null);
            CompanionBlockSpawnerSystems.markBlockDirty(var1, var2);
            CompanionBlockSpawnerSystems.evaluateSpawner(var1, var2, var3, var4, var5, null, null, var6);
         }
      }

      class="kw">private void reconcileClaim(
         @Nonnull Store<ChunkStore> var1,
         @Nonnull Ref<ChunkStore> var2,
         @Nonnull CompanionBlockSpawnerBlock var3,
         @Nonnull Vector3i var4,
         @Nonnull CompanionBlockSpawnerRecipeCompendium var5,
         @Nonnull World var6
      ) {
         Vector3i var7 = var3.getClaimedByBlock();
         if (var7 != null) {
            double var8 = var5.getMaxRadius();
            boolean var10 = var4.distanceSquared(var7) > var8 * var8;
            if (!var10) {
               ChunkStore var11 = var6.getChunkStore();
               Ref var12 = var11.getChunkReference(ChunkUtil.indexChunkFromBlock(var7.x, var7.z));
               if (var12 == null || !var12.isValid()) {
                  class="kw">return;
               }

               WorldChunk var13 = var11.getStore().getComponent(var12, WorldChunk.getComponentType());
               if (var13 == null) {
                  class="kw">return;
               }

               Ref var14 = var13.getBlockComponentEntity(var7.x, var7.y, var7.z);
               CompanionBlockSpawnerBlock var15 = var14 != null ? var14.getStore().getComponent(var14, this.spawnerBlockType) : null;
               var10 = var15 == null || !var15.hasMarker();
            }

            if (var10) {
               var3.setClaimedByBlock(null);
               CompanionBlockSpawnerSystems.markBlockDirty(var1, var2);
            }
         }
      }
   }
}