Skip to content

Instantly share code, notes, and snippets.

@fallenthereaper
Created March 15, 2025 00:20
Show Gist options
  • Save fallenthereaper/d946a984affb9c898062ef5effe0a337 to your computer and use it in GitHub Desktop.
Save fallenthereaper/d946a984affb9c898062ef5effe0a337 to your computer and use it in GitHub Desktop.
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