ReconcileTick class
Пакет: com.hypixel.hytale.builtin.companionblockspawner
Файл: com/hypixel/hytale/builtin/companionblockspawner/CompanionBlockSpawnerSystems.java
extends: EntityTickingSystem<ChunkStore>
Поля (23)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private final Query<ChunkStore> |
query |
|
|
return |
|
|
return |
|
private final ComponentType<ChunkStore, CompanionBlockSpawnerBlock> |
spawnerBlockType |
|
String |
var10 |
|
boolean |
var10 |
|
|
var10 |
|
World |
var11 |
|
ChunkStore |
var11 |
|
List |
var12 |
|
Ref |
var12 |
|
WorldChunk |
var13 |
|
Ref |
var14 |
|
CompanionBlockSpawnerBlock |
var15 |
|
CompanionBlockSpawnerBlock |
var6 |
|
CompanionBlockSpawnerRecipeCompendium |
var7 |
|
UUID |
var7 |
|
Vector3i |
var7 |
|
Ref |
var8 |
|
Store |
var8 |
|
double |
var8 |
|
Vector3i |
var9 |
|
Ref |
var9 |
Методы (11)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public Query<ChunkStore> |
getQuerypublic Query<ChunkStore> getQuery() |
|
|
if if(var10 != null) |
|
|
if if(var12 != null) |
|
|
if if(var7 != null) |
|
|
if if(!var10) |
|
|
if if(var13 == null) |
|
|
if if(var10) |
|
public boolean |
isParallelpublic boolean isParallel(int var1, int var2) |
|
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) |
|
public void |
tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<ChunkStore> var3, @Nonnull Store<ChunkStore> var4, @Nonnull CommandBuffer<ChunkStore> 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);
}
}
}
}
}