Created
March 15, 2025 00:20
-
-
Save fallenthereaper/d946a984affb9c898062ef5effe0a337 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package fallenreaper.fable.core.base.ritual.base.components.conditions; | |
import fallenreaper.fable.core.base.ritual.base.IRitualItemHolder; | |
import fallenreaper.fable.core.base.ritual.base.PedestalCoordinate; | |
import fallenreaper.fable.core.base.ritual.base.RitualContext; | |
import fallenreaper.fable.core.base.ritual.base.RitualHelper; | |
import fallenreaper.fable.core.base.ritual.base.components.IRitualComponent; | |
import fallenreaper.fable.core.base.ritual.base.components.conditions.condition_results.RitualComponentResult; | |
import net.minecraft.core.BlockPos; | |
import net.minecraft.world.level.block.entity.BlockEntity; | |
import java.util.HashSet; | |
import java.util.List; | |
import java.util.Set; | |
public class ItemPatternRitualCondition extends ItemRitualCondition { | |
private final PedestalCoordinate pedestalCoordinate; | |
public ItemPatternRitualCondition(Object ingredient, PedestalCoordinate pedestalCoordinate) { | |
super(ingredient); | |
this.pedestalCoordinate = pedestalCoordinate; | |
} | |
public ItemPatternRitualCondition(Object ingredient, int xOffset, int zOffset) { | |
this(ingredient, new PedestalCoordinate(xOffset, zOffset)); | |
} | |
@Override | |
public RitualComponentResult isConditionMet(RitualContext ritualContext) { | |
return super.isConditionMet(ritualContext); | |
} | |
@Override | |
public void onConditionMet(RitualContext ritualContext, RitualComponentResult info) { | |
super.onConditionMet(ritualContext, info); | |
} | |
@Override | |
protected RitualComponentResult checkPattern(RitualContext ritualContext) { | |
BlockPos altarPosition = ritualContext.getAltarPosition(); | |
BlockPos targetPosition = altarPosition.offset(pedestalCoordinate.getXOffset(), 0, pedestalCoordinate.getZOffset()); | |
Set<BlockPos> tracked = new HashSet<>(); | |
List<IRitualComponent> components = RitualHelper.getComponentsBy(component -> component instanceof ItemRitualCondition, ritualContext.getRitual()); | |
int expectedPedestalCount = components.size(); | |
List<IRitualItemHolder> itemHolders = getInteractionsWithinBounds(ritualContext.getLevel(), ritualContext.getRitual(), altarPosition); | |
if (itemHolders.isEmpty()) { | |
return RitualComponentResult.notMet("setup.empty"); | |
} | |
int pedestalCount = 0; | |
for (IRitualItemHolder itemHolder : itemHolders) { | |
BlockPos trackedPos = ((BlockEntity) itemHolder).getBlockPos(); | |
if (!tracked.contains(targetPosition)) { | |
tracked.add(trackedPos); | |
pedestalCount++; | |
} | |
} | |
if (pedestalCount > expectedPedestalCount) { | |
return RitualComponentResult.notMet("setup.full"); | |
} | |
BlockEntity be = ritualContext.getLevel().getBlockEntity(targetPosition); | |
if (!(be instanceof IRitualItemHolder te)) { | |
return RitualComponentResult.notMet("setup.missing"); | |
} | |
if (te.getIngredient().isEmpty()) { | |
return RitualComponentResult.notMet("missing_ingredient"); | |
} | |
else if(!matchIngredient(((IRitualItemHolder) be).getIngredient())) { | |
return RitualComponentResult.notMet("mismatch_ingredient"); | |
} | |
int searchRadius = ritualContext.getRitual().getSearchRadius(); | |
double distanceSquared = targetPosition.distSqr(altarPosition); | |
double searchRadiusSquared = searchRadius * searchRadius; | |
if (distanceSquared > searchRadiusSquared) { | |
return RitualComponentResult.notMet("out_of_bounds"); | |
} | |
return new RitualComponentResult(true, targetPosition); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment