From f4c68bb0c307588016c3a099757f69372cc6a7dc Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 30 Aug 2023 21:34:50 +0100 Subject: [PATCH] Change pillar height for the altar from 3 to 4, check for sky visibility on the pillars, and allow the altar to fix itself if the current placement is determined to be valid --- .../unicopia/entity/SpellbookEntity.java | 13 +++++++++++-- .../unicopia/server/world/Altar.java | 16 ++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/SpellbookEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/SpellbookEntity.java index bc781209..7032448c 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/SpellbookEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/SpellbookEntity.java @@ -190,11 +190,18 @@ public class SpellbookEntity extends MobEntity implements MagicImmune { } if (!getWorld().isClient && age % 15 == 0) { - altar.ifPresent(altar -> { + if (altar.isEmpty()) { + altar = Altar.locateAltar(getWorld(), getBlockPos()).map(altar -> { + altar.generateDecorations(getWorld()); + return altar; + }); + } + + altar = altar.filter(altar -> { if (!altar.isValid(getWorld())) { altar.tearDown(null, getWorld()); - return; + return false; } altar.pillars().forEach(pillar -> { @@ -229,6 +236,8 @@ public class SpellbookEntity extends MobEntity implements MagicImmune { getWorld().setBlockState(pillar, Blocks.CRYING_OBSIDIAN.getDefaultState()); } }); + + return true; }); } } diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/Altar.java b/src/main/java/com/minelittlepony/unicopia/server/world/Altar.java index 6830c358..70325717 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/Altar.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/Altar.java @@ -123,8 +123,10 @@ public record Altar(BlockPos origin, Set pillars) { if (isObsidian(world, pos.move(pillarPos)) && isObsidian(world, pos.move(Direction.UP)) - && isObsidian(world, pos.move(Direction.UP))) { - pillarPosCollector.accept(pos.toImmutable()); + && isObsidian(world, pos.move(Direction.UP)) + && isObsidian(world, pos.move(Direction.UP)) + && world.isSkyVisible(pos.move(Direction.UP))) { + pillarPosCollector.accept(pos.move(Direction.DOWN).toImmutable()); pos.set(x, y, z); return true; } @@ -155,9 +157,6 @@ public record Altar(BlockPos origin, Set pillars) { } public void tearDown(@Nullable Entity except, World world) { - if (!(except instanceof SpellbookEntity)) { - world.getOtherEntities(except, new Box(origin).expand(3), IS_PARTICIPANT).forEach(Entity::kill); - } pillars.forEach(pillar -> removeExisting(except, world, pillar)); } @@ -169,6 +168,11 @@ public record Altar(BlockPos origin, Set pillars) { return checkState(world, origin, Blocks.SOUL_FIRE) && checkState(world, origin.down(), Blocks.SOUL_SAND) && checkSlab(world, origin.down()) - && pillars.stream().allMatch(pillar -> isObsidian(world, pillar) && isObsidian(world, pillar.down()) && isObsidian(world, pillar.down(2))); + && pillars.stream().allMatch(pillar -> + isObsidian(world, pillar) + && world.isSkyVisible(pillar.up()) + && isObsidian(world, pillar.down()) + && isObsidian(world, pillar.down(2)) + && isObsidian(world, pillar.down(3))); } }