MarkerHeartbeat class

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

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

extends: EntityTickingSystem<EntityStore>

Поля (21)

МодификаторыТипИмя
private final Query<EntityStore> query
private final ComponentType<EntityStore, CompanionSpawnerMarkerReference> referenceType
return
WorldChunk var10
Ref var11
UUIDComponent var12
UUID var13
Ref var14
CompanionBlockSpawnerBlock var15
UUID var16
String var17
var17
var17
BlockType var18
String var19
boolean var20
CompanionSpawnerMarkerReference var6
Vector3i var7
Ref var7
ChunkStore var8
Ref var9

Методы (9)

МодификаторыВозвратСигнатура
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
if if(var7 != null)
if if(var10 != null)
if if(var16 != null)
if if(var20)
if if(var1 != null)
public boolean isParallelpublic boolean isParallel(int var1, int var2)
private static void removeMarkerAndCompanionsprivate static void removeMarkerAndCompanions(@Nonnull Ref<EntityStore> var0, @Nullable SpawnMarkerEntity var1, @Nonnull CommandBuffer<EntityStore> 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.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);
            }
         }
      }
   }
}