From 59bd1c7f6c4127e865c23dba17230157e98d4b31 Mon Sep 17 00:00:00 2001 From: Dustin Norberg Date: Sat, 17 Oct 2026 12:13:12 -0400 Subject: [PATCH] Implement crystal portals with optional Immersive Portals view (#77) --- docs/ASSET_PROVENANCE.md | 3 + docs/LEGACY_M7_AUDIT.md | 6 + gradle.properties | 2 +- .../rivencraft/block/BookReceptacleBlock.java | 155 +++++++++++ .../rivencraft/block/CrystalPortalBlock.java | 91 +++++++ .../entity/BookReceptacleBlockEntity.java | 95 +++++++ .../entity/CrystalPortalBlockEntity.java | 51 ++++ .../rivencraft/book/LinkingService.java | 14 + .../rivencraft/client/ClientEvents.java | 7 + .../compat/ImmersivePortalsCrystalView.java | 100 +++++++ .../gametest/CrystalPortalGameTests.java | 102 ++++++++ .../rivencraft/item/DescriptiveBookItem.java | 16 +- .../rivencraft/item/LinkingBookItem.java | 12 +- .../portal/CrystalPortalNetwork.java | 244 ++++++++++++++++++ .../portal/CrystalPortalSurfaces.java | 59 +++++ .../portal/PortalTravelCooldown.java | 12 + .../rivencraft/registry/ModBlockEntities.java | 8 + .../rivencraft/registry/ModBlocks.java | 8 + .../rivencraft/registry/ModCreativeTabs.java | 1 + .../rivencraft/registry/ModItems.java | 1 + .../rivencraft/registry/ModSounds.java | 1 + .../blockstates/book_receptacle.json | 1 + .../blockstates/crystal_portal.json | 1 + .../assets/rivencraft/lang/en_us.json | 3 + .../models/block/book_receptacle.json | 1 + .../models/block/crystal_portal.json | 1 + .../models/item/book_receptacle.json | 1 + .../resources/assets/rivencraft/sounds.json | 4 + .../rivencraft/sounds/linking/link-portal.ogg | Bin 0 -> 128402 bytes .../textures/block/book_receptacle.png | Bin 0 -> 585 bytes .../textures/block/crystal_portal.png | Bin 0 -> 22726 bytes .../textures/block/crystal_portal.png.mcmeta | 5 + .../loot_table/blocks/book_receptacle.json | 1 + .../rivencraft/recipe/book_receptacle.json | 1 + 34 files changed, 1001 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/dnorberg/rivencraft/block/BookReceptacleBlock.java create mode 100644 src/main/java/net/dnorberg/rivencraft/block/CrystalPortalBlock.java create mode 100644 src/main/java/net/dnorberg/rivencraft/block/entity/BookReceptacleBlockEntity.java create mode 100644 src/main/java/net/dnorberg/rivencraft/block/entity/CrystalPortalBlockEntity.java create mode 100644 src/main/java/net/dnorberg/rivencraft/compat/ImmersivePortalsCrystalView.java create mode 100644 src/main/java/net/dnorberg/rivencraft/gametest/CrystalPortalGameTests.java create mode 100644 src/main/java/net/dnorberg/rivencraft/portal/CrystalPortalNetwork.java create mode 100644 src/main/java/net/dnorberg/rivencraft/portal/CrystalPortalSurfaces.java create mode 100644 src/main/java/net/dnorberg/rivencraft/portal/PortalTravelCooldown.java create mode 100644 src/main/resources/assets/rivencraft/blockstates/book_receptacle.json create mode 100644 src/main/resources/assets/rivencraft/blockstates/crystal_portal.json create mode 100644 src/main/resources/assets/rivencraft/models/block/book_receptacle.json create mode 100644 src/main/resources/assets/rivencraft/models/block/crystal_portal.json create mode 100644 src/main/resources/assets/rivencraft/models/item/book_receptacle.json create mode 100644 src/main/resources/assets/rivencraft/sounds/linking/link-portal.ogg create mode 100644 src/main/resources/assets/rivencraft/textures/block/book_receptacle.png create mode 100644 src/main/resources/assets/rivencraft/textures/block/crystal_portal.png create mode 100644 src/main/resources/assets/rivencraft/textures/block/crystal_portal.png.mcmeta create mode 100644 src/main/resources/data/rivencraft/loot_table/blocks/book_receptacle.json create mode 100644 src/main/resources/data/rivencraft/recipe/book_receptacle.json diff --git a/docs/ASSET_PROVENANCE.md b/docs/ASSET_PROVENANCE.md index 935c4cb..16ffae4 100644 --- a/docs/ASSET_PROVENANCE.md +++ b/docs/ASSET_PROVENANCE.md @@ -29,6 +29,9 @@ project's GNU LGPL v3 license. Rivencraft itself uses the same license. | `assets/rivencraft/textures/item/crystal_shard.png` | Original sprite generated with OpenAI ImageGen from the Legacy crystal palette | 2026-10-05 | Cropped and nearest-neighbor scaled to 16×16 | | `assets/rivencraft/sounds/linking/link-fissure.ogg` | `assets/mystcraft/sounds/linking/link-fissure.ogg` | Legacy 0.13.7.06 local extraction | Namespace/path rename only; plays when a Star Fissure returns an entity home | | `assets/rivencraft/sounds/entity/meteor/roar.ogg` | `assets/mystcraft/sounds/entity/meteor/roar.ogg` | Legacy 0.13.7.06 local extraction | Byte-identical copy under the Rivencraft namespace; plays during the bounded meteor descent | +| `assets/rivencraft/textures/block/book_receptacle.png` | `assets/mystcraft/textures/blocks/book_receptacle.png` | Legacy 0.13.7.06 local extraction | Byte-identical 16×16 face tile; modern block model recreates the Legacy thin slab | +| `assets/rivencraft/textures/block/crystal_portal.png` and `.mcmeta` | `assets/mystcraft/textures/blocks/portal.png` and `.mcmeta` | Legacy 0.13.7.06 local extraction | Byte-identical texture and line-ending-normalized animation metadata, used when Immersive Portals is absent | +| `assets/rivencraft/sounds/linking/link-portal.ogg` | `assets/mystcraft/sounds/linking/link-portal.ogg` | Legacy 0.13.7.06 local extraction | Byte-identical portal-link sound | Mystcraft Legacy identifies XCompWiz as its project developer and includes the full LGPL v3 text in its root `LICENSE` file. Rivencraft's root `LICENSE` diff --git a/docs/LEGACY_M7_AUDIT.md b/docs/LEGACY_M7_AUDIT.md index 0a36c7b..8c34e3d 100644 --- a/docs/LEGACY_M7_AUDIT.md +++ b/docs/LEGACY_M7_AUDIT.md @@ -15,6 +15,12 @@ Rivencraft has books, Ages, symbol writing, book stands, a desk, binder, Ink Mix ## Crystal portals: targets for #77–#78 +Issue #77 now has a craftable Book Receptacle (eight Crystal Blocks around an empty center), a bounded loaded-chunk crystal-network validator, persistent book holder/source pointers, animated Legacy portal cells, and portal collision routed through the existing Linking/Descriptive Book travel services. A book is only taken after a nonempty frame plan and destination dimension are validated. Removing the book or breaking its support removes the portal; a periodic server repair pass checks the loaded frame after restarts or edits. The Descriptive Book path preserves the configured automatic Return Link policy and link modifiers. Crystal-portal arrival does not generate a landing platform, matching Legacy's external travel semantics. A normal Linking Book still needs Intra Linking for same-dimension travel. + +When Immersive Portals is present, render-only, non-teleporting IP portal entities show the book's destination through both faces of each coplanar opening; individual crystal cells are combined into one shaped surface so the destination is not repeated tile by tile. The view's central camera is aligned to the same safe arrival position and yaw/pitch used by book travel (at standing eye height). Perspective still changes naturally as the observer moves in front of a live portal. Each live view is recessed inside the opening; the fallback portal texture is always hidden while IP is installed, and crystal blocks render after the IP view so the frame appears on top. Without IP, the animated Legacy portal texture remains visible. Rivencraft portal-block contact remains the travel authority. This is an optional compile-only integration. The first placement of a Descriptive Book can generate/load its Age to establish a view destination. If the optional view is absent after restart, the holder's periodic pass recreates it. #78 retains exhaustive multiplayer, protection, destination deletion, and chunk-ticket hardening. + +Manual #77 check: build a 3×3 vertical Crystal Block ring, put the Receptacle on one frame crystal's outward face, then insert a bound Linking Book. The center should animate and link on contact; the book stays in the Receptacle. Confirm unbound books and incomplete frames do not consume items; empty-hand right-click retrieves the book and clears the surface. Repeat with a Descriptive Book and with Immersive Portals installed: the latter should show the destination live. Restart with the portal active and confirm the surface/view returns; break the support crystal and confirm book/portal cleanup. + ## Library implementation (#76) The operator-only test controls are `/rivencraft library test-spacing 8` (roughly 16× normal candidate density in newly generated chunks), `/rivencraft library test-spacing` (show the current setting), and `/rivencraft library test-spacing reset` (return to Legacy spacing). The override affects only the current Age, lasts only until server restart, and never retroactively places libraries in existing chunks. Normal sites remain eligible. A spacing of `1` attempts a candidate in every new chunk and may be expensive. `/rivencraft library nearest` searches nearby test sites while the override is active. `/rivencraft library test-place` is a separate OP-only manual test: it places a library about 13 blocks ahead of the player in the current Age if an 11×11×11 volume is clear, building a one-block cobblestone platform below it. The command reports the chest coordinates; it does not alter natural spawning or make the manual library a locate candidate. Move to open ground if the command rejects the site. diff --git a/gradle.properties b/gradle.properties index 6694a73..601e7c6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -36,7 +36,7 @@ mod_name=Rivencraft # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPL-3.0-or-later # The mod version. Rivencraft uses the x.y.z.b policy documented in README.md. -mod_version=0.6.1.11 +mod_version=0.6.2.4 immersive_portals_version=6.0.7 terrablender_version=4.1.0.8 serene_seasons_version_id=B6nTjh4b diff --git a/src/main/java/net/dnorberg/rivencraft/block/BookReceptacleBlock.java b/src/main/java/net/dnorberg/rivencraft/block/BookReceptacleBlock.java new file mode 100644 index 0000000..909a461 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/block/BookReceptacleBlock.java @@ -0,0 +1,155 @@ +package net.dnorberg.rivencraft.block; + +import com.mojang.serialization.MapCodec; +import net.dnorberg.rivencraft.block.entity.BookReceptacleBlockEntity; +import net.dnorberg.rivencraft.portal.CrystalPortalNetwork; +import net.dnorberg.rivencraft.book.AgeDimensionService; +import net.dnorberg.rivencraft.book.LinkTarget; +import net.dnorberg.rivencraft.registry.ModBlocks; +import net.dnorberg.rivencraft.registry.ModDataComponents; +import net.dnorberg.rivencraft.registry.ModItems; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.dnorberg.rivencraft.registry.ModBlockEntities; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +/** A book-holding crystal attachment, with server-authoritative frame activation. */ +public final class BookReceptacleBlock extends BaseEntityBlock { + public static final MapCodec CODEC = simpleCodec(BookReceptacleBlock::new); + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + public BookReceptacleBlock(Properties properties) { + super(properties); + registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH)); + } + + @Override protected MapCodec codec() { return CODEC; } + @Override protected RenderShape getRenderShape(BlockState state) { return RenderShape.MODEL; } + @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, + CollisionContext context) { + return switch (state.getValue(FACING)) { + case NORTH -> Block.box(0, 0, 10, 16, 16, 16); + case SOUTH -> Block.box(0, 0, 0, 16, 16, 6); + case EAST -> Block.box(0, 0, 0, 6, 16, 16); + case WEST -> Block.box(10, 0, 0, 16, 16, 16); + case UP -> Block.box(0, 0, 0, 16, 6, 16); + case DOWN -> Block.box(0, 10, 0, 16, 16, 16); + }; + } + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new BookReceptacleBlockEntity(pos, state); + } + @Override public BlockEntityTicker getTicker(Level level, BlockState state, + BlockEntityType type) { + return level instanceof ServerLevel + ? createTickerHelper(type, ModBlockEntities.BOOK_RECEPTACLE.get(), BookReceptacleBlockEntity::serverTick) + : null; + } + @Override public BlockState getStateForPlacement(BlockPlaceContext context) { + Direction face = context.getClickedFace(); + if (face == Direction.DOWN || !context.getLevel().getBlockState( + context.getClickedPos().relative(face.getOpposite())).is(ModBlocks.CRYSTAL_BLOCK.get())) return null; + return defaultBlockState().setValue(FACING, face); + } + + @Override protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, + Player player, InteractionHand hand, BlockHitResult hit) { + if (!isBoundBook(stack)) return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + if (level.isClientSide) return ItemInteractionResult.SUCCESS; + if (!(level instanceof ServerLevel server) || + !(level.getBlockEntity(pos) instanceof BookReceptacleBlockEntity holder)) return ItemInteractionResult.FAIL; + if (!holder.getBook().isEmpty()) return ItemInteractionResult.FAIL; + CrystalPortalNetwork.Plan plan = CrystalPortalNetwork.plan(server, pos); + if (!plan.valid()) { + player.displayClientMessage(Component.translatable("message.rivencraft.portal.invalid_frame"), true); + return ItemInteractionResult.FAIL; + } + LinkTarget destination = stack.is(ModItems.LINKING_BOOK.get()) + ? stack.get(ModDataComponents.LINK_TARGET.get()) + : player instanceof ServerPlayer serverPlayer + ? AgeDimensionService.resolve(serverPlayer, stack.get(ModDataComponents.AGE_REFERENCE.get())).orElse(null) + : null; + if (destination == null || server.getServer().getLevel(destination.location().dimension()) == null) { + player.displayClientMessage(Component.translatable("message.rivencraft.descriptive_book.unavailable"), true); + return ItemInteractionResult.FAIL; + } + holder.setBook(stack.copyWithCount(1)); + holder.setDestination(destination); + if (!CrystalPortalNetwork.activate(server, pos, plan)) { + holder.takeBook(); + return ItemInteractionResult.FAIL; + } + if (!player.getAbilities().instabuild) stack.shrink(1); + if (net.neoforged.fml.ModList.get().isLoaded("immersive_portals_core")) + net.dnorberg.rivencraft.compat.ImmersivePortalsCrystalView.activate(server, pos, plan, destination); + level.playSound(null, pos, SoundEvents.ENCHANTMENT_TABLE_USE, SoundSource.BLOCKS, 1, 1); + return ItemInteractionResult.SUCCESS; + } + + @Override protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, + Player player, BlockHitResult hit) { + if (level.isClientSide) return InteractionResult.SUCCESS; + if (level instanceof ServerLevel server && level.getBlockEntity(pos) instanceof BookReceptacleBlockEntity holder + && !holder.getBook().isEmpty()) { + CrystalPortalNetwork.shutdown(server, pos); + ItemStack book = holder.takeBook(); + if (!player.getInventory().add(book)) player.drop(book, false); + level.playSound(null, pos, SoundEvents.BOOK_PAGE_TURN, SoundSource.BLOCKS, 1, 1); + return InteractionResult.SUCCESS; + } + return InteractionResult.PASS; + } + + @Override protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighbor, + BlockPos neighborPos, boolean moved) { + super.neighborChanged(state, level, pos, neighbor, neighborPos, moved); + if (!level.isClientSide && !level.getBlockState(pos.relative(state.getValue(FACING).getOpposite())) + .is(ModBlocks.CRYSTAL_BLOCK.get())) level.destroyBlock(pos, true); + } + + @Override protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState replacement, boolean moving) { + if (!state.is(replacement.getBlock()) && level instanceof ServerLevel server) { + CrystalPortalNetwork.shutdown(server, pos); + if (level.getBlockEntity(pos) instanceof BookReceptacleBlockEntity holder) { + ItemStack book = holder.takeBook(); + if (!book.isEmpty()) level.addFreshEntity(new ItemEntity(level, pos.getX()+0.5, pos.getY()+0.5, + pos.getZ()+0.5, book)); + } + } + super.onRemove(state, level, pos, replacement, moving); + } + + private static boolean isBoundBook(ItemStack stack) { + return stack.is(ModItems.LINKING_BOOK.get()) && stack.has(ModDataComponents.LINK_TARGET.get()) + || stack.is(ModItems.DESCRIPTIVE_BOOK.get()) && stack.has(ModDataComponents.AGE_REFERENCE.get()); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/block/CrystalPortalBlock.java b/src/main/java/net/dnorberg/rivencraft/block/CrystalPortalBlock.java new file mode 100644 index 0000000..61dc964 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/block/CrystalPortalBlock.java @@ -0,0 +1,91 @@ +package net.dnorberg.rivencraft.block; + +import com.mojang.serialization.MapCodec; +import net.dnorberg.rivencraft.block.entity.BookReceptacleBlockEntity; +import net.dnorberg.rivencraft.block.entity.CrystalPortalBlockEntity; +import net.dnorberg.rivencraft.item.DescriptiveBookItem; +import net.dnorberg.rivencraft.item.LinkingBookItem; +import net.dnorberg.rivencraft.portal.CrystalPortalNetwork; +import net.dnorberg.rivencraft.portal.PortalTravelCooldown; +import net.dnorberg.rivencraft.registry.ModBlocks; +import net.dnorberg.rivencraft.registry.ModItems; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.Tag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluid; +import net.neoforged.fml.ModList; + +/** Non-solid linked surface; all travel is delegated to the held book's rules. */ +public final class CrystalPortalBlock extends BaseEntityBlock { + public static final MapCodec CODEC = simpleCodec(CrystalPortalBlock::new); + // Retained so portal blocks already saved with this state still deserialize. + public static final BooleanProperty LIVE_VIEW = BooleanProperty.create("live_view"); + private static final String COOLDOWN = "RivencraftCrystalPortalCooldown"; + + public CrystalPortalBlock(Properties properties) { + super(properties); + registerDefaultState(stateDefinition.any().setValue(LIVE_VIEW, false)); + } + @Override protected MapCodec codec() { return CODEC; } + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(LIVE_VIEW); + } + @Override protected RenderShape getRenderShape(BlockState state) { + // The live-view flag can lag behind portal-entity creation or fail to + // synchronize for an existing frame. Never draw the fallback texture + // when Immersive Portals owns the view for this installation. + return ModList.get().isLoaded("immersive_portals_core") + ? RenderShape.INVISIBLE : RenderShape.MODEL; + } + @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new CrystalPortalBlockEntity(pos, state); + } + @Override protected boolean canBeReplaced(BlockState state, Fluid fluid) { return false; } + + @Override protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + if (!(level instanceof ServerLevel server) || !(entity instanceof ServerPlayer player)) return; + long now = server.getServer().getTickCount(); + long previous = player.getPersistentData().contains(COOLDOWN, Tag.TAG_LONG) + ? player.getPersistentData().getLong(COOLDOWN) : -1; + if (previous > now) { + player.getPersistentData().remove(COOLDOWN); + previous = -1; + } + if (PortalTravelCooldown.blocked(now, previous)) return; + if (!(level.getBlockEntity(pos) instanceof CrystalPortalBlockEntity portal) + || portal.receptacle() == null || !level.hasChunkAt(portal.receptacle()) + || !(level.getBlockEntity(portal.receptacle()) instanceof BookReceptacleBlockEntity holder)) return; + ItemStack book = holder.getBook(); + if (book.isEmpty()) return; + player.getPersistentData().putLong(COOLDOWN, now); + if (book.is(ModItems.LINKING_BOOK.get())) LinkingBookItem.usePortalBook(player, book); + else if (book.is(ModItems.DESCRIPTIVE_BOOK.get())) DescriptiveBookItem.usePortalBook(player, book); + } + + @Override protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighbor, + BlockPos neighborPos, boolean moved) { + super.neighborChanged(state, level, pos, neighbor, neighborPos, moved); + if (level instanceof ServerLevel server) server.scheduleTick(pos, this, 2); + } + + @Override protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (!(level.getBlockEntity(pos) instanceof CrystalPortalBlockEntity portal) + || portal.receptacle() == null || !CrystalPortalNetwork.validCell(level, pos, portal.receptacle())) { + level.removeBlock(pos, false); + return; + } + level.scheduleTick(pos, this, 100); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/block/entity/BookReceptacleBlockEntity.java b/src/main/java/net/dnorberg/rivencraft/block/entity/BookReceptacleBlockEntity.java new file mode 100644 index 0000000..ee3b867 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/block/entity/BookReceptacleBlockEntity.java @@ -0,0 +1,95 @@ +package net.dnorberg.rivencraft.block.entity; + +import net.dnorberg.rivencraft.book.LinkTarget; +import net.dnorberg.rivencraft.registry.ModBlockEntities; +import net.dnorberg.rivencraft.portal.CrystalPortalNetwork; +import net.minecraft.nbt.NbtOps; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.server.level.ServerLevel; +import net.neoforged.fml.ModList; + +/** The book stays in this server-owned inventory while its crystal portal is active. */ +public final class BookReceptacleBlockEntity extends BlockEntity { + private static final String BOOK_TAG = "Book"; + private static final String DESTINATION_TAG = "Destination"; + private ItemStack book = ItemStack.EMPTY; + private LinkTarget destination; + + public BookReceptacleBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.BOOK_RECEPTACLE.get(), pos, state); + } + + public ItemStack getBook() { return book; } + public LinkTarget destination() { return destination; } + + public void setBook(ItemStack stack) { + book = stack.copyWithCount(1); + sync(); + } + + public void setDestination(LinkTarget target) { + destination = target; + sync(); + } + + public ItemStack takeBook() { + ItemStack result = book; + book = ItemStack.EMPTY; + destination = null; + sync(); + return result; + } + + private void sync() { + setChanged(); + if (level != null && !level.isClientSide) + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 2); + } + + @Override + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + book = tag.contains(BOOK_TAG, CompoundTag.TAG_COMPOUND) + ? ItemStack.parse(registries, tag.getCompound(BOOK_TAG)).orElse(ItemStack.EMPTY) + : ItemStack.EMPTY; + destination = tag.contains(DESTINATION_TAG) + ? LinkTarget.CODEC.parse(NbtOps.INSTANCE, tag.get(DESTINATION_TAG)).result().orElse(null) : null; + } + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + if (!book.isEmpty()) tag.put(BOOK_TAG, book.save(registries)); + if (destination != null) LinkTarget.CODEC.encodeStart(NbtOps.INSTANCE, destination) + .result().ifPresent(encoded -> tag.put(DESTINATION_TAG, encoded)); + } + + @Override public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override public CompoundTag getUpdateTag(HolderLookup.Provider registries) { + return saveWithoutMetadata(registries); + } + + public static void serverTick(net.minecraft.world.level.Level world, BlockPos pos, BlockState state, + BookReceptacleBlockEntity holder) { + if (!(world instanceof ServerLevel level)) return; + if (level.getGameTime() % 200 != 0 || holder.book.isEmpty()) return; + CrystalPortalNetwork.reconcile(level, pos); + if (holder.destination == null || !ModList.get().isLoaded("immersive_portals_core")) return; + if (!net.dnorberg.rivencraft.compat.ImmersivePortalsCrystalView.exists(level, pos)) { + CrystalPortalNetwork.Plan plan = CrystalPortalNetwork.plan(level, pos); + if (plan.valid()) net.dnorberg.rivencraft.compat.ImmersivePortalsCrystalView.activate( + level, pos, plan, holder.destination); + } + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/block/entity/CrystalPortalBlockEntity.java b/src/main/java/net/dnorberg/rivencraft/block/entity/CrystalPortalBlockEntity.java new file mode 100644 index 0000000..220e1d2 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/block/entity/CrystalPortalBlockEntity.java @@ -0,0 +1,51 @@ +package net.dnorberg.rivencraft.block.entity; + +import net.dnorberg.rivencraft.registry.ModBlockEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +/** Persistent pointer to the local receptacle; no duplicate book or destination state. */ +public final class CrystalPortalBlockEntity extends BlockEntity { + private static final String SOURCE_TAG = "Receptacle"; + private BlockPos receptacle; + + public CrystalPortalBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.CRYSTAL_PORTAL.get(), pos, state); + } + + public BlockPos receptacle() { return receptacle; } + + public void setReceptacle(BlockPos pos) { + receptacle = pos.immutable(); + setChanged(); + if (level != null && !level.isClientSide) + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 2); + } + + @Override + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + receptacle = tag.contains(SOURCE_TAG, CompoundTag.TAG_COMPOUND) + ? net.minecraft.nbt.NbtUtils.readBlockPos(tag, SOURCE_TAG).orElse(null) : null; + } + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + if (receptacle != null) tag.put(SOURCE_TAG, net.minecraft.nbt.NbtUtils.writeBlockPos(receptacle)); + } + + @Override public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override public CompoundTag getUpdateTag(HolderLookup.Provider registries) { + return saveWithoutMetadata(registries); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/book/LinkingService.java b/src/main/java/net/dnorberg/rivencraft/book/LinkingService.java index 59dc06b..f6a7312 100644 --- a/src/main/java/net/dnorberg/rivencraft/book/LinkingService.java +++ b/src/main/java/net/dnorberg/rivencraft/book/LinkingService.java @@ -62,6 +62,20 @@ public final class LinkingService { return LinkResult.SUCCESS; } + /** A descriptive portal uses the book's Age destination without requiring a landing platform. */ + public static LinkResult travelDescriptivePortal(ServerPlayer player, LinkTarget target, LinkProperties properties) { + ServerLevel destinationLevel = player.getServer().getLevel(target.location().dimension()); + if (destinationLevel == null) return LinkResult.MISSING_DIMENSION; + Optional destination = resolveDestination(destinationLevel, target.location().pos(), false); + if (destination.isEmpty()) return LinkResult.NO_SAFE_DESTINATION; + Vec3 momentum = player.getDeltaMovement(); + if (properties.has(LinkProperties.DISARM)) dropInventoryAtSource(player); + teleport(player, destinationLevel, destination.get(), target); + if (properties.has(LinkProperties.MAINTAIN_MOMENTUM)) player.setDeltaMovement(momentum); + player.resetFallDistance(); + return LinkResult.SUCCESS; + } + private static LinkResult travel(ServerPlayer player, LinkTarget target, boolean requiresFooting, LinkProperties properties) { ServerLevel destinationLevel = player.getServer().getLevel(target.location().dimension()); diff --git a/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java b/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java index ea196ec..1316fc9 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java +++ b/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java @@ -13,6 +13,7 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.ModList; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; @@ -78,6 +79,12 @@ public final class ClientEvents { ItemBlockRenderTypes.setRenderLayer(ModBlocks.LARGE_CRYSTAL_BUD.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(ModBlocks.CRYSTAL_CLUSTER.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(ModBlocks.CLOUD_PLATFORM.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(ModBlocks.CRYSTAL_PORTAL.get(), RenderType.translucent()); + // Immersive Portals composes the remote view before translucent blocks. + // Draw the opaque crystal frame in that later pass so it masks the view; + // the portal cell itself is invisible while its live view is active. + if (ModList.get().isLoaded("immersive_portals_core")) + ItemBlockRenderTypes.setRenderLayer(ModBlocks.CRYSTAL_BLOCK.get(), RenderType.translucent()); }); NeoForge.EVENT_BUS.addListener(ClientBookInteractionHandler::onRightClickItem); NeoForge.EVENT_BUS.addListener(ClientBookInteractionHandler::onRightClickBlock); diff --git a/src/main/java/net/dnorberg/rivencraft/compat/ImmersivePortalsCrystalView.java b/src/main/java/net/dnorberg/rivencraft/compat/ImmersivePortalsCrystalView.java new file mode 100644 index 0000000..3e186cc --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/compat/ImmersivePortalsCrystalView.java @@ -0,0 +1,100 @@ +package net.dnorberg.rivencraft.compat; + +import net.dnorberg.rivencraft.book.LinkTarget; +import net.dnorberg.rivencraft.book.LinkingService; +import net.dnorberg.rivencraft.portal.CrystalPortalNetwork; +import net.dnorberg.rivencraft.portal.CrystalPortalSurfaces; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import qouteall.imm_ptl.core.api.PortalAPI; +import qouteall.imm_ptl.core.portal.Portal; +import qouteall.imm_ptl.core.portal.shape.SpecialFlatPortalShape; +import qouteall.q_misc_util.my_util.DQuaternion; +import qouteall.q_misc_util.my_util.Mesh2D; + +/** Render-only Immersive Portals surfaces; Rivencraft blocks remain the travel authority. */ +public final class ImmersivePortalsCrystalView { + private static final String PREFIX = "rivencraft:crystal:v2:"; + private static final String OLD_PREFIX = "rivencraft:crystal:"; + + private ImmersivePortalsCrystalView() {} + + public static void activate(ServerLevel source, BlockPos receptacle, + CrystalPortalNetwork.Plan plan, LinkTarget target) { + remove(source, receptacle); + ServerLevel destinationLevel = source.getServer().getLevel(target.location().dimension()); + if (destinationLevel == null) return; + // This is the same safe-location search used by portal book travel. + var arrival = LinkingService.resolveDestination(destinationLevel, target.location().pos(), false); + if (arrival.isEmpty()) return; + Vec3 arrivalEye = arrival.get().add(0, 1.62, 0); + for (CrystalPortalSurfaces.Surface surface : CrystalPortalSurfaces.group(source, plan)) { + spawn(source, receptacle, surface, surface.normal(), target, arrivalEye); + spawn(source, receptacle, surface, surface.normal().getOpposite(), target, arrivalEye); + } + } + + public static void remove(ServerLevel source, BlockPos receptacle) { + String tag = tag(receptacle); + String oldTag = OLD_PREFIX + receptacle.asLong(); + AABB area = new AABB(receptacle).inflate(CrystalPortalNetwork.MAX_RADIUS + 2); + for (Portal portal : source.getEntitiesOfClass(Portal.class, area, + entity -> entity.portalTag != null + && (entity.portalTag.equals(tag) || entity.portalTag.equals(oldTag)))) portal.discard(); + } + + public static boolean exists(ServerLevel source, BlockPos receptacle) { + String tag = tag(receptacle); + return !source.getEntitiesOfClass(Portal.class, + new AABB(receptacle).inflate(CrystalPortalNetwork.MAX_RADIUS + 2), + entity -> tag.equals(entity.portalTag)).isEmpty(); + } + + private static void spawn(ServerLevel source, BlockPos receptacle, CrystalPortalSurfaces.Surface surface, + Direction normal, LinkTarget target, Vec3 arrivalEye) { + Portal portal = Portal.ENTITY_TYPE.create(source); + if (portal == null) return; + // One mesh spans the entire coplanar opening. Each cell contributes a + // quad to the same view rather than repeating the destination image. + PortalAPI.setPortalOrthodoxShape(portal, normal, surface.bounds()); + portal.setOriginPos(portal.getOriginPos().add( + Vec3.atLowerCornerOf(normal.getNormal()).scale(-0.125))); + Mesh2D mesh = new Mesh2D(); + double halfU = 1 / portal.getWidth(); + double halfV = 1 / portal.getHeight(); + for (BlockPos cell : surface.cells()) { + Vec3 faceCenter = Vec3.atCenterOf(cell).add( + Vec3.atLowerCornerOf(normal.getNormal()).scale(0.5)); + Vec3 offset = faceCenter.subtract(portal.getOriginPos()); + double u = 2 * offset.dot(portal.getAxisW()) / portal.getWidth(); + double v = 2 * offset.dot(portal.getAxisH()) / portal.getHeight(); + mesh.addQuad(u - halfU, v - halfV, u + halfU, v + halfV); + } + portal.setPortalShape(new SpecialFlatPortalShape(mesh)); + PortalAPI.setPortalTransformation(portal, target.location().dimension(), + arrivalEye, cameraRotation(normal, target), 1); + portal.setTeleportable(false); + portal.setInteractable(false); + portal.portalTag = tag(receptacle); + PortalAPI.spawnServerEntity(portal); + } + + private static DQuaternion cameraRotation(Direction normal, LinkTarget target) { + Vec3 sourceLook = Vec3.atLowerCornerOf(normal.getOpposite().getNormal()); + Vec3 sourceUp = normal.getAxis() == Direction.Axis.Y + ? new Vec3(0, 0, -1) : new Vec3(0, 1, 0); + Vec3 destinationLook = Vec3.directionFromRotation(target.pitch(), target.yaw()); + Vec3 destinationUp = Vec3.directionFromRotation(target.pitch() - 90, target.yaw()); + DQuaternion source = DQuaternion.fromFacingVecs(sourceLook.cross(sourceUp), sourceUp); + DQuaternion destination = DQuaternion.fromFacingVecs( + destinationLook.cross(destinationUp), destinationUp); + return destination.hamiltonProduct(source.getConjugated()).getNormalized(); + } + + private static String tag(BlockPos receptacle) { + return PREFIX + receptacle.asLong(); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/gametest/CrystalPortalGameTests.java b/src/main/java/net/dnorberg/rivencraft/gametest/CrystalPortalGameTests.java new file mode 100644 index 0000000..c72647e --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/gametest/CrystalPortalGameTests.java @@ -0,0 +1,102 @@ +package net.dnorberg.rivencraft.gametest; + +import net.dnorberg.rivencraft.Rivencraft; +import net.dnorberg.rivencraft.block.BookReceptacleBlock; +import net.dnorberg.rivencraft.block.entity.BookReceptacleBlockEntity; +import net.dnorberg.rivencraft.block.entity.CrystalPortalBlockEntity; +import net.dnorberg.rivencraft.book.LinkTarget; +import net.dnorberg.rivencraft.portal.CrystalPortalNetwork; +import net.dnorberg.rivencraft.portal.CrystalPortalSurfaces; +import net.dnorberg.rivencraft.portal.PortalTravelCooldown; +import net.dnorberg.rivencraft.registry.ModBlocks; +import net.dnorberg.rivencraft.registry.ModItems; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.GlobalPos; +import net.minecraft.gametest.framework.GameTest; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.gametest.GameTestHolder; +import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; + +@GameTestHolder(Rivencraft.MOD_ID) +@PrefixGameTestTemplate(false) +public final class CrystalPortalGameTests { + private CrystalPortalGameTests() {} + + @GameTest(template = "empty") + public static void completeFrameActivatesAndReleasesBook(GameTestHelper helper) { + var level = helper.getLevel(); + for (int x = 0; x < 3; x++) for (int y = 1; y < 4; y++) { + if (x == 1 && y == 2) continue; + level.setBlock(helper.absolutePos(new BlockPos(x, y, 1)), + ModBlocks.CRYSTAL_BLOCK.get().defaultBlockState(), 3); + } + BlockPos holderPos = helper.absolutePos(new BlockPos(0, 1, 0)); + level.setBlock(holderPos, ModBlocks.BOOK_RECEPTACLE.get().defaultBlockState() + .setValue(BookReceptacleBlock.FACING, Direction.NORTH), 3); + CrystalPortalNetwork.Plan plan = CrystalPortalNetwork.plan(level, holderPos); + helper.assertTrue(plan.valid(), "A closed crystal frame must form a portal"); + BookReceptacleBlockEntity holder = (BookReceptacleBlockEntity) level.getBlockEntity(holderPos); + holder.setBook(new ItemStack(ModItems.LINKING_BOOK.get())); + LinkTarget destination = new LinkTarget(GlobalPos.of(level.dimension(), centerTarget(helper)), 0, 0); + holder.setDestination(destination); + BookReceptacleBlockEntity restored = new BookReceptacleBlockEntity(holderPos, holder.getBlockState()); + restored.loadWithComponents(holder.saveWithoutMetadata(level.registryAccess()), level.registryAccess()); + helper.assertValueEqual(restored.destination(), destination, + "The portal destination must survive a save/reload cycle"); + helper.assertTrue(CrystalPortalNetwork.activate(level, holderPos, plan), "Portal placement must succeed"); + BlockPos center = helper.absolutePos(new BlockPos(1, 2, 1)); + helper.assertTrue(level.getBlockEntity(center) instanceof CrystalPortalBlockEntity portal + && holderPos.equals(portal.receptacle()), "The portal must point to its one book holder"); + CrystalPortalNetwork.shutdown(level, holderPos); + helper.assertTrue(level.getBlockState(center).isAir(), "Removing the book must release the portal"); + helper.succeed(); + } + + private static BlockPos centerTarget(GameTestHelper helper) { + return helper.absolutePos(new BlockPos(1, 2, 1)); + } + + @GameTest(template = "empty") + public static void incompleteFrameCannotActivate(GameTestHelper helper) { + var level = helper.getLevel(); + BlockPos holderPos = helper.absolutePos(new BlockPos(0, 1, 0)); + level.setBlock(helper.absolutePos(new BlockPos(0, 1, 1)), + ModBlocks.CRYSTAL_BLOCK.get().defaultBlockState(), 3); + level.setBlock(holderPos, ModBlocks.BOOK_RECEPTACLE.get().defaultBlockState() + .setValue(BookReceptacleBlock.FACING, Direction.NORTH), 3); + helper.assertTrue(!CrystalPortalNetwork.plan(level, holderPos).valid(), + "An incomplete frame must not take a book or leave portal cells"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void multiCellOpeningHasOneContinuousView(GameTestHelper helper) { + var level = helper.getLevel(); + for (int x = 0; x < 3; x++) for (int y = 1; y < 5; y++) { + if (x == 1 && (y == 2 || y == 3)) continue; + level.setBlock(helper.absolutePos(new BlockPos(x, y, 1)), + ModBlocks.CRYSTAL_BLOCK.get().defaultBlockState(), 3); + } + BlockPos holderPos = helper.absolutePos(new BlockPos(0, 1, 0)); + level.setBlock(holderPos, ModBlocks.BOOK_RECEPTACLE.get().defaultBlockState() + .setValue(BookReceptacleBlock.FACING, Direction.NORTH), 3); + CrystalPortalNetwork.Plan plan = CrystalPortalNetwork.plan(level, holderPos); + helper.assertValueEqual(plan.portalCells().size(), 2, "The opening contains two portal cells"); + helper.assertValueEqual(CrystalPortalSurfaces.group(level, plan).size(), 1, + "Both cells must share one coherent Immersive Portals view"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void savedCooldownFromPreviousServerCannotBlockPortal(GameTestHelper helper) { + helper.assertTrue(!PortalTravelCooldown.blocked(5, -1), + "A player with no prior portal use must link immediately"); + helper.assertTrue(!PortalTravelCooldown.blocked(5, 12000), + "A saved tick from the previous server session must not block travel"); + helper.assertTrue(PortalTravelCooldown.blocked(105, 100), + "A recent portal use in the current session must still prevent loops"); + helper.succeed(); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/item/DescriptiveBookItem.java b/src/main/java/net/dnorberg/rivencraft/item/DescriptiveBookItem.java index 807607f..2a23b89 100644 --- a/src/main/java/net/dnorberg/rivencraft/item/DescriptiveBookItem.java +++ b/src/main/java/net/dnorberg/rivencraft/item/DescriptiveBookItem.java @@ -40,6 +40,14 @@ public final class DescriptiveBookItem extends Item { } public static boolean useWrittenBook(ServerPlayer player, ItemStack stack) { + return useWrittenBook(player, stack, false); + } + + public static boolean usePortalBook(ServerPlayer player, ItemStack stack) { + return useWrittenBook(player, stack, true); + } + + private static boolean useWrittenBook(ServerPlayer player, ItemStack stack, boolean portal) { AgeReference age = stack.get(ModDataComponents.AGE_REFERENCE.get()); if (age == null) { player.displayClientMessage(Component.translatable("message.rivencraft.descriptive_book.unwritten"), true); @@ -57,7 +65,9 @@ public final class DescriptiveBookItem extends Item { var sourcePosition = player.blockPosition(); LinkProperties properties = stack.getOrDefault(ModDataComponents.LINK_PROPERTIES.get(), LinkProperties.NONE) .forDescriptiveBook(); - LinkingService.LinkResult result = LinkingService.travelWithFooting(player, ageTarget, properties); + LinkingService.LinkResult result = portal + ? LinkingService.travelDescriptivePortal(player, ageTarget, properties) + : LinkingService.travelWithFooting(player, ageTarget, properties); if (result != LinkingService.LinkResult.SUCCESS) { player.displayClientMessage(Component.translatable("message.rivencraft.descriptive_book.unsafe"), true); return false; @@ -75,9 +85,9 @@ public final class DescriptiveBookItem extends Item { player.drop(returnBook, false); } } - sourceLevel.playSound(null, sourcePosition, ModSounds.LINK.get(), SoundSource.PLAYERS, + sourceLevel.playSound(null, sourcePosition, (portal ? ModSounds.LINK_PORTAL : ModSounds.LINK).get(), SoundSource.PLAYERS, 0.8F, sourceLevel.random.nextFloat() * 0.2F + 0.9F); - player.level().playSound(null, player.blockPosition(), ModSounds.LINK.get(), SoundSource.PLAYERS, + player.level().playSound(null, player.blockPosition(), (portal ? ModSounds.LINK_PORTAL : ModSounds.LINK).get(), SoundSource.PLAYERS, 0.8F, player.level().random.nextFloat() * 0.2F + 0.9F); player.displayClientMessage(Component.translatable( createReturnLink ? "message.rivencraft.descriptive_book.linked_first" : "message.rivencraft.descriptive_book.linked", diff --git a/src/main/java/net/dnorberg/rivencraft/item/LinkingBookItem.java b/src/main/java/net/dnorberg/rivencraft/item/LinkingBookItem.java index 3c4cb14..345dcb2 100644 --- a/src/main/java/net/dnorberg/rivencraft/item/LinkingBookItem.java +++ b/src/main/java/net/dnorberg/rivencraft/item/LinkingBookItem.java @@ -42,6 +42,14 @@ public final class LinkingBookItem extends Item { } public static InteractionResultHolder useBoundBook(ServerPlayer player, ItemStack stack) { + return useBoundBook(player, stack, false); + } + + public static InteractionResultHolder usePortalBook(ServerPlayer player, ItemStack stack) { + return useBoundBook(player, stack, true); + } + + private static InteractionResultHolder useBoundBook(ServerPlayer player, ItemStack stack, boolean portal) { LinkTarget target = stack.get(ModDataComponents.LINK_TARGET.get()); if (target == null) { player.displayClientMessage(Component.translatable("message.rivencraft.linking_book.unbound"), true); @@ -53,12 +61,12 @@ public final class LinkingBookItem extends Item { LinkProperties properties = stack.getOrDefault(ModDataComponents.LINK_PROPERTIES.get(), LinkProperties.NONE); LinkingService.LinkResult result = LinkingService.travel(player, target, properties); if (result == LinkingService.LinkResult.SUCCESS) { - sourceLevel.playSound(null, sourcePosition, ModSounds.LINK.get(), SoundSource.PLAYERS, + sourceLevel.playSound(null, sourcePosition, (portal ? ModSounds.LINK_PORTAL : ModSounds.LINK).get(), SoundSource.PLAYERS, 0.8F, sourceLevel.random.nextFloat() * 0.2F + 0.9F); player.level().playSound( null, player.blockPosition(), - ModSounds.LINK.get(), + (portal ? ModSounds.LINK_PORTAL : ModSounds.LINK).get(), SoundSource.PLAYERS, 0.8F, player.level().random.nextFloat() * 0.2F + 0.9F diff --git a/src/main/java/net/dnorberg/rivencraft/portal/CrystalPortalNetwork.java b/src/main/java/net/dnorberg/rivencraft/portal/CrystalPortalNetwork.java new file mode 100644 index 0000000..afe28ec --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/portal/CrystalPortalNetwork.java @@ -0,0 +1,244 @@ +package net.dnorberg.rivencraft.portal; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import net.dnorberg.rivencraft.block.BookReceptacleBlock; +import net.dnorberg.rivencraft.block.entity.BookReceptacleBlockEntity; +import net.dnorberg.rivencraft.block.entity.CrystalPortalBlockEntity; +import net.dnorberg.rivencraft.registry.ModBlocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +/** Bounded, loaded-chunk-only adaptation of Legacy's crystal network flood. */ +public final class CrystalPortalNetwork { + public static final int MAX_RADIUS = 16; + private static final int CLEANUP_RADIUS = MAX_RADIUS + 1; + private static final int MAX_CRYSTALS = 2048; + private static final int MAX_PORTALS = 1024; + private static final int[][] EXPANSION = { + {1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}, + {1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, + {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, + {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1} + }; + + private CrystalPortalNetwork() {} + + public record Plan(List portalCells) { + public boolean valid() { return !portalCells.isEmpty(); } + } + + public static Plan plan(ServerLevel level, BlockPos receptacle) { + BlockState holder = level.getBlockState(receptacle); + if (!holder.is(ModBlocks.BOOK_RECEPTACLE.get())) return new Plan(List.of()); + BlockPos base = receptacle.relative(holder.getValue(BookReceptacleBlock.FACING).getOpposite()); + if (!level.getBlockState(base).is(ModBlocks.CRYSTAL_BLOCK.get())) return new Plan(List.of()); + + Set crystals = new HashSet<>(); + ArrayDeque pendingCrystals = new ArrayDeque<>(); + pendingCrystals.add(base); + while (!pendingCrystals.isEmpty()) { + BlockPos pos = pendingCrystals.removeFirst(); + if (!within(base, pos) || !level.isInWorldBounds(pos)) continue; + if (!level.hasChunkAt(pos)) return new Plan(List.of()); + if (!level.getBlockState(pos).is(ModBlocks.CRYSTAL_BLOCK.get()) || !crystals.add(pos)) continue; + if (atBoundary(base, pos)) return new Plan(List.of()); + if (crystals.size() > MAX_CRYSTALS) return new Plan(List.of()); + for (Direction direction : Direction.values()) pendingCrystals.add(pos.relative(direction)); + } + + LinkedHashSet portals = new LinkedHashSet<>(); + ArrayDeque candidates = new ArrayDeque<>(); + Set queued = new HashSet<>(); + for (BlockPos crystal : crystals) addCandidates(crystal, base, queued, candidates); + while (!candidates.isEmpty()) { + BlockPos pos = candidates.removeFirst(); + queued.remove(pos); + if (!level.isInWorldBounds(pos) || !level.hasChunkAt(pos)) return new Plan(List.of()); + if (portals.contains(pos) || !mayFill(level, pos, receptacle)) continue; + if (adjacentCount(pos, crystals, portals) < 2) continue; + portals.add(pos); + if (portals.size() > MAX_PORTALS) return new Plan(List.of()); + addCandidates(pos, base, queued, candidates); + } + + // Legacy's second pass deletes every cell without opposing neighbors on + // at least two axes. Repeat because deleting one cell can unbrace another. + boolean changed; + do { + changed = portals.removeIf(pos -> !hasTension(pos, crystals, portals)); + } while (changed); + if (portals.isEmpty()) return new Plan(List.of()); + + // Every surviving cell must still be reachable from the receptacle's + // crystal base through this one network, never through another portal. + Set reachable = new HashSet<>(); + ArrayDeque frontier = new ArrayDeque<>(); + frontier.add(base); + while (!frontier.isEmpty()) { + BlockPos pos = frontier.removeFirst(); + if (!reachable.add(pos)) continue; + for (Direction direction : Direction.values()) { + BlockPos next = pos.relative(direction); + if (!reachable.contains(next) && (crystals.contains(next) || portals.contains(next))) + frontier.add(next); + } + } + if (!reachable.containsAll(portals)) return new Plan(List.of()); + return new Plan(List.copyOf(portals)); + } + + public static boolean activate(ServerLevel level, BlockPos receptacle, Plan plan) { + if (!plan.valid() || !(level.getBlockEntity(receptacle) instanceof BookReceptacleBlockEntity holder) + || holder.getBook().isEmpty()) return false; + List placed = new ArrayList<>(); + for (BlockPos pos : plan.portalCells()) { + if (!mayFill(level, pos, receptacle)) { + rollback(level, placed); + return false; + } + if (level.getBlockState(pos).isAir()) { + if (!level.setBlock(pos, ModBlocks.CRYSTAL_PORTAL.get().defaultBlockState(), 3)) { + rollback(level, placed); + return false; + } + placed.add(pos); + } + if (level.getBlockEntity(pos) instanceof CrystalPortalBlockEntity portal) { + portal.setReceptacle(receptacle); + level.scheduleTick(pos, ModBlocks.CRYSTAL_PORTAL.get(), 40); + } else { + rollback(level, placed); + return false; + } + } + return true; + } + + public static void shutdown(ServerLevel level, BlockPos receptacle) { + if (net.neoforged.fml.ModList.get().isLoaded("immersive_portals_core")) + net.dnorberg.rivencraft.compat.ImmersivePortalsCrystalView.remove(level, receptacle); + // A broken support can disconnect the graph. Scan a bounded volume rather + // than trusting a path through blocks that no longer exist. + for (BlockPos pos : BlockPos.betweenClosed(receptacle.offset(-CLEANUP_RADIUS, -CLEANUP_RADIUS, -CLEANUP_RADIUS), + receptacle.offset(CLEANUP_RADIUS, CLEANUP_RADIUS, CLEANUP_RADIUS))) { + if (!level.hasChunkAt(pos)) continue; + if (level.getBlockEntity(pos) instanceof CrystalPortalBlockEntity portal + && receptacle.equals(portal.receptacle())) + level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); + } + } + + /** One bounded repair pass per receptacle, rather than a full flood per portal cell. */ + public static void reconcile(ServerLevel level, BlockPos receptacle) { + Plan plan = plan(level, receptacle); + if (!plan.valid()) { + shutdown(level, receptacle); + return; + } + Set wanted = new HashSet<>(plan.portalCells()); + for (BlockPos pos : BlockPos.betweenClosed(receptacle.offset(-CLEANUP_RADIUS, -CLEANUP_RADIUS, -CLEANUP_RADIUS), + receptacle.offset(CLEANUP_RADIUS, CLEANUP_RADIUS, CLEANUP_RADIUS))) { + if (!level.hasChunkAt(pos)) continue; + if (level.getBlockEntity(pos) instanceof CrystalPortalBlockEntity portal + && receptacle.equals(portal.receptacle()) && !wanted.contains(pos)) + level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); + } + activate(level, receptacle, plan); + } + + public static boolean validCell(ServerLevel level, BlockPos pos, BlockPos receptacle) { + if (Math.abs(receptacle.getX() - pos.getX()) > CLEANUP_RADIUS + || Math.abs(receptacle.getY() - pos.getY()) > CLEANUP_RADIUS + || Math.abs(receptacle.getZ() - pos.getZ()) > CLEANUP_RADIUS + || !level.hasChunkAt(receptacle) + || !(level.getBlockEntity(receptacle) instanceof BookReceptacleBlockEntity holder) + || holder.getBook().isEmpty()) return false; + BlockState state = level.getBlockState(receptacle); + if (!state.is(ModBlocks.BOOK_RECEPTACLE.get()) || !level.getBlockState(receptacle.relative( + state.getValue(BookReceptacleBlock.FACING).getOpposite())).is(ModBlocks.CRYSTAL_BLOCK.get())) + return false; + for (Direction.Axis axis : Direction.Axis.values()) { + // Quick tension check before the bounded network/path revalidation. + if (!axisBraced(level, pos, axis)) continue; + int other = 0; + for (Direction.Axis alternative : Direction.Axis.values()) + if (alternative != axis && axisBraced(level, pos, alternative)) other++; + if (other > 0) return true; + } + return false; + } + + private static boolean axisBraced(ServerLevel level, BlockPos pos, Direction.Axis axis) { + Direction positive = Direction.get(Direction.AxisDirection.POSITIVE, axis); + Direction negative = positive.getOpposite(); + BlockPos a = pos.relative(positive); + BlockPos b = pos.relative(negative); + return level.hasChunkAt(a) && level.hasChunkAt(b) + && isFrameOrPortal(level.getBlockState(a)) && isFrameOrPortal(level.getBlockState(b)); + } + + private static boolean isFrameOrPortal(BlockState state) { + return state.is(ModBlocks.CRYSTAL_BLOCK.get()) || state.is(ModBlocks.CRYSTAL_PORTAL.get()); + } + + private static void rollback(ServerLevel level, List placed) { + for (BlockPos pos : placed) level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); + } + + private static boolean mayFill(ServerLevel level, BlockPos pos, BlockPos receptacle) { + if (!level.hasChunkAt(pos) || !level.isInWorldBounds(pos)) return false; + BlockState state = level.getBlockState(pos); + return state.isAir() || state.is(ModBlocks.CRYSTAL_PORTAL.get()) + && level.getBlockEntity(pos) instanceof CrystalPortalBlockEntity portal + && receptacle.equals(portal.receptacle()); + } + + private static int adjacentCount(BlockPos pos, Set crystals, Set portals) { + int count = 0; + for (Direction direction : Direction.values()) + if (crystals.contains(pos.relative(direction)) || portals.contains(pos.relative(direction))) count++; + return count; + } + + private static boolean hasTension(BlockPos pos, Set crystals, Set portals) { + int axes = 0; + for (Direction.Axis axis : Direction.Axis.values()) { + Direction positive = Direction.get(Direction.AxisDirection.POSITIVE, axis); + if (member(pos.relative(positive), crystals, portals) + && member(pos.relative(positive.getOpposite()), crystals, portals)) axes++; + } + return axes >= 2; + } + + private static boolean member(BlockPos pos, Set crystals, Set portals) { + return crystals.contains(pos) || portals.contains(pos); + } + + private static void addCandidates(BlockPos around, BlockPos base, Set queued, + ArrayDeque pending) { + for (int[] offset : EXPANSION) { + BlockPos candidate = around.offset(offset[0], offset[1], offset[2]); + if (within(base, candidate) && queued.add(candidate)) pending.add(candidate); + } + } + + private static boolean within(BlockPos center, BlockPos pos) { + return Math.abs(center.getX() - pos.getX()) <= MAX_RADIUS + && Math.abs(center.getY() - pos.getY()) <= MAX_RADIUS + && Math.abs(center.getZ() - pos.getZ()) <= MAX_RADIUS; + } + + private static boolean atBoundary(BlockPos center, BlockPos pos) { + return Math.abs(center.getX() - pos.getX()) == MAX_RADIUS + || Math.abs(center.getY() - pos.getY()) == MAX_RADIUS + || Math.abs(center.getZ() - pos.getZ()) == MAX_RADIUS; + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/portal/CrystalPortalSurfaces.java b/src/main/java/net/dnorberg/rivencraft/portal/CrystalPortalSurfaces.java new file mode 100644 index 0000000..f5d1672 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/portal/CrystalPortalSurfaces.java @@ -0,0 +1,59 @@ +package net.dnorberg.rivencraft.portal; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import net.dnorberg.rivencraft.registry.ModBlocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.AABB; + +/** Groups portal cells into coherent, coplanar views while retaining irregular outlines. */ +public final class CrystalPortalSurfaces { + private CrystalPortalSurfaces() {} + + public record Surface(Direction normal, AABB bounds, List cells) {} + private record Plane(Direction normal, int coordinate) {} + + public static List group(ServerLevel level, CrystalPortalNetwork.Plan plan) { + Map> planes = new LinkedHashMap<>(); + for (BlockPos cell : plan.portalCells()) { + Direction normal = planeNormal(level, cell); + if (normal == null) continue; + int coordinate = normal.getAxis().choose(cell.getX(), cell.getY(), cell.getZ()); + planes.computeIfAbsent(new Plane(normal, coordinate), ignored -> new ArrayList<>()).add(cell); + } + List result = new ArrayList<>(); + for (Map.Entry> entry : planes.entrySet()) { + List cells = entry.getValue(); + int minX = cells.stream().mapToInt(BlockPos::getX).min().orElseThrow(); + int minY = cells.stream().mapToInt(BlockPos::getY).min().orElseThrow(); + int minZ = cells.stream().mapToInt(BlockPos::getZ).min().orElseThrow(); + int maxX = cells.stream().mapToInt(BlockPos::getX).max().orElseThrow() + 1; + int maxY = cells.stream().mapToInt(BlockPos::getY).max().orElseThrow() + 1; + int maxZ = cells.stream().mapToInt(BlockPos::getZ).max().orElseThrow() + 1; + result.add(new Surface(entry.getKey().normal(), new AABB(minX, minY, minZ, maxX, maxY, maxZ), + List.copyOf(cells))); + } + return List.copyOf(result); + } + + private static Direction planeNormal(ServerLevel level, BlockPos cell) { + if (braced(level, cell, Direction.UP) && braced(level, cell, Direction.EAST)) return Direction.NORTH; + if (braced(level, cell, Direction.UP) && braced(level, cell, Direction.SOUTH)) return Direction.EAST; + if (braced(level, cell, Direction.EAST) && braced(level, cell, Direction.SOUTH)) return Direction.UP; + return null; + } + + private static boolean braced(ServerLevel level, BlockPos cell, Direction direction) { + return linked(level, cell.relative(direction)) && linked(level, cell.relative(direction.getOpposite())); + } + + private static boolean linked(ServerLevel level, BlockPos pos) { + if (!level.hasChunkAt(pos)) return false; + var state = level.getBlockState(pos); + return state.is(ModBlocks.CRYSTAL_BLOCK.get()) || state.is(ModBlocks.CRYSTAL_PORTAL.get()); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/portal/PortalTravelCooldown.java b/src/main/java/net/dnorberg/rivencraft/portal/PortalTravelCooldown.java new file mode 100644 index 0000000..1eed14c --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/portal/PortalTravelCooldown.java @@ -0,0 +1,12 @@ +package net.dnorberg.rivencraft.portal; + +/** Server tick counters restart with the process; old saved values cannot block new sessions. */ +public final class PortalTravelCooldown { + public static final long TICKS = 40; + + private PortalTravelCooldown() {} + + public static boolean blocked(long now, long previous) { + return previous >= 0 && now >= previous && now - previous < TICKS; + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModBlockEntities.java b/src/main/java/net/dnorberg/rivencraft/registry/ModBlockEntities.java index 0239541..8614a5f 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModBlockEntities.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModBlockEntities.java @@ -6,6 +6,8 @@ import net.dnorberg.rivencraft.block.entity.BookBinderBlockEntity; import net.dnorberg.rivencraft.block.entity.WritingDeskBlockEntity; import net.dnorberg.rivencraft.block.entity.InkMixerBlockEntity; import net.dnorberg.rivencraft.block.entity.StarFissureBlockEntity; +import net.dnorberg.rivencraft.block.entity.BookReceptacleBlockEntity; +import net.dnorberg.rivencraft.block.entity.CrystalPortalBlockEntity; import net.minecraft.core.registries.Registries; import net.minecraft.world.level.block.entity.BlockEntityType; import net.neoforged.bus.api.IEventBus; @@ -32,6 +34,12 @@ public final class ModBlockEntities { public static final DeferredHolder, BlockEntityType> STAR_FISSURE = BLOCK_ENTITIES.register("star_fissure", () -> BlockEntityType.Builder .of(StarFissureBlockEntity::new, ModBlocks.STAR_FISSURE.get()).build(null)); + public static final DeferredHolder, BlockEntityType> BOOK_RECEPTACLE = + BLOCK_ENTITIES.register("book_receptacle", () -> BlockEntityType.Builder + .of(BookReceptacleBlockEntity::new, ModBlocks.BOOK_RECEPTACLE.get()).build(null)); + public static final DeferredHolder, BlockEntityType> CRYSTAL_PORTAL = + BLOCK_ENTITIES.register("crystal_portal", () -> BlockEntityType.Builder + .of(CrystalPortalBlockEntity::new, ModBlocks.CRYSTAL_PORTAL.get()).build(null)); private ModBlockEntities() { } diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModBlocks.java b/src/main/java/net/dnorberg/rivencraft/registry/ModBlocks.java index ff2fc97..d76b737 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModBlocks.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModBlocks.java @@ -9,6 +9,8 @@ import net.dnorberg.rivencraft.block.BuddingCrystalBlock; import net.dnorberg.rivencraft.block.StarFissureBlock; import net.dnorberg.rivencraft.block.DecayBlock; import net.dnorberg.rivencraft.block.CloudPlatformBlock; +import net.dnorberg.rivencraft.block.BookReceptacleBlock; +import net.dnorberg.rivencraft.block.CrystalPortalBlock; import net.minecraft.world.level.block.AmethystClusterBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -40,6 +42,12 @@ public final class ModBlocks { ); public static final DeferredBlock CRYSTAL_BLOCK = BLOCKS.registerBlock("crystal_block", Block::new, BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK).mapColor(MapColor.COLOR_BLUE)); + public static final DeferredBlock BOOK_RECEPTACLE = BLOCKS.registerBlock("book_receptacle", + BookReceptacleBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK) + .noOcclusion().mapColor(MapColor.COLOR_BLUE)); + public static final DeferredBlock CRYSTAL_PORTAL = BLOCKS.registerBlock("crystal_portal", + CrystalPortalBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.NETHER_PORTAL) + .noCollission().noOcclusion().lightLevel(state -> 11).noLootTable()); public static final DeferredBlock BUDDING_CRYSTAL = BLOCKS.registerBlock("budding_crystal", BuddingCrystalBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.BUDDING_AMETHYST) .mapColor(MapColor.COLOR_BLUE)); diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java b/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java index bf5770e..21e3f30 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java @@ -32,6 +32,7 @@ public final class ModCreativeTabs { output.accept(ModItems.INK_MIXER.get()); output.accept(ModItems.BOOK_BINDER.get()); output.accept(ModItems.CRYSTAL_BLOCK.get()); + output.accept(ModItems.BOOK_RECEPTACLE.get()); output.accept(ModItems.BUDDING_CRYSTAL.get()); output.accept(ModItems.CRYSTAL_CLUSTER.get()); output.accept(ModItems.LARGE_CRYSTAL_BUD.get()); diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java b/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java index 1f95dfd..8222c15 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModItems.java @@ -44,6 +44,7 @@ public final class ModItems { public static final DeferredItem BOOK_BINDER = ITEMS.registerSimpleBlockItem(ModBlocks.BOOK_BINDER); public static final DeferredItem INK_MIXER = ITEMS.registerSimpleBlockItem(ModBlocks.INK_MIXER); public static final DeferredItem CRYSTAL_BLOCK = ITEMS.registerSimpleBlockItem(ModBlocks.CRYSTAL_BLOCK); + public static final DeferredItem BOOK_RECEPTACLE = ITEMS.registerSimpleBlockItem(ModBlocks.BOOK_RECEPTACLE); public static final DeferredItem BUDDING_CRYSTAL = ITEMS.registerSimpleBlockItem(ModBlocks.BUDDING_CRYSTAL); public static final DeferredItem CRYSTAL_CLUSTER = ITEMS.registerSimpleBlockItem(ModBlocks.CRYSTAL_CLUSTER); public static final DeferredItem LARGE_CRYSTAL_BUD = ITEMS.registerSimpleBlockItem(ModBlocks.LARGE_CRYSTAL_BUD); diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModSounds.java b/src/main/java/net/dnorberg/rivencraft/registry/ModSounds.java index fe968ff..e967d07 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModSounds.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModSounds.java @@ -15,6 +15,7 @@ public final class ModSounds { public static final DeferredHolder LINK = register("linking.link"); public static final DeferredHolder LINK_FISSURE = register("linking.link-fissure"); + public static final DeferredHolder LINK_PORTAL = register("linking.link-portal"); public static final DeferredHolder METEOR_ROAR = register("entity.meteor.roar"); private ModSounds() { diff --git a/src/main/resources/assets/rivencraft/blockstates/book_receptacle.json b/src/main/resources/assets/rivencraft/blockstates/book_receptacle.json new file mode 100644 index 0000000..fc561ce --- /dev/null +++ b/src/main/resources/assets/rivencraft/blockstates/book_receptacle.json @@ -0,0 +1 @@ +{"variants":{"facing=north":{"model":"rivencraft:block/book_receptacle","y":180},"facing=east":{"model":"rivencraft:block/book_receptacle","y":270},"facing=south":{"model":"rivencraft:block/book_receptacle"},"facing=west":{"model":"rivencraft:block/book_receptacle","y":90},"facing=up":{"model":"rivencraft:block/book_receptacle","x":270},"facing=down":{"model":"rivencraft:block/book_receptacle","x":90}}} diff --git a/src/main/resources/assets/rivencraft/blockstates/crystal_portal.json b/src/main/resources/assets/rivencraft/blockstates/crystal_portal.json new file mode 100644 index 0000000..6106e20 --- /dev/null +++ b/src/main/resources/assets/rivencraft/blockstates/crystal_portal.json @@ -0,0 +1 @@ +{"variants":{"live_view=false":{"model":"rivencraft:block/crystal_portal"},"live_view=true":{"model":"rivencraft:block/crystal_portal"}}} diff --git a/src/main/resources/assets/rivencraft/lang/en_us.json b/src/main/resources/assets/rivencraft/lang/en_us.json index 81805b6..b1ae376 100644 --- a/src/main/resources/assets/rivencraft/lang/en_us.json +++ b/src/main/resources/assets/rivencraft/lang/en_us.json @@ -308,6 +308,9 @@ "symbol.rivencraft.feature.star_fissures.description": "Open a starry fissure near this Age's spawn that links back to the Overworld.", "block.rivencraft.star_fissure": "Star Fissure", "block.rivencraft.crystal_block": "Crystal Block", + "block.rivencraft.book_receptacle": "Book Receptacle", + "block.rivencraft.crystal_portal": "Crystal Portal", + "message.rivencraft.portal.invalid_frame": "The crystal frame cannot form a portal.", "block.rivencraft.budding_crystal": "Budding Crystal", "block.rivencraft.small_crystal_bud": "Small Crystal Bud", "block.rivencraft.medium_crystal_bud": "Medium Crystal Bud", diff --git a/src/main/resources/assets/rivencraft/models/block/book_receptacle.json b/src/main/resources/assets/rivencraft/models/block/book_receptacle.json new file mode 100644 index 0000000..b7201a5 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/block/book_receptacle.json @@ -0,0 +1 @@ +{"parent":"minecraft:block/block","textures":{"particle":"rivencraft:block/crystal_block","crystal":"rivencraft:block/crystal_block","face":"rivencraft:block/book_receptacle"},"elements":[{"from":[0,0,0],"to":[16,16,6],"faces":{"north":{"texture":"#crystal"},"east":{"texture":"#crystal"},"south":{"texture":"#face"},"west":{"texture":"#crystal"},"up":{"texture":"#crystal"},"down":{"texture":"#crystal"}}}]} diff --git a/src/main/resources/assets/rivencraft/models/block/crystal_portal.json b/src/main/resources/assets/rivencraft/models/block/crystal_portal.json new file mode 100644 index 0000000..8e3c8a9 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/block/crystal_portal.json @@ -0,0 +1 @@ +{"parent":"minecraft:block/cube_all","textures":{"all":"rivencraft:block/crystal_portal"}} diff --git a/src/main/resources/assets/rivencraft/models/item/book_receptacle.json b/src/main/resources/assets/rivencraft/models/item/book_receptacle.json new file mode 100644 index 0000000..c8e4922 --- /dev/null +++ b/src/main/resources/assets/rivencraft/models/item/book_receptacle.json @@ -0,0 +1 @@ +{"parent":"rivencraft:block/book_receptacle"} diff --git a/src/main/resources/assets/rivencraft/sounds.json b/src/main/resources/assets/rivencraft/sounds.json index 2a28738..81a3851 100644 --- a/src/main/resources/assets/rivencraft/sounds.json +++ b/src/main/resources/assets/rivencraft/sounds.json @@ -11,6 +11,10 @@ "category": "player", "sounds": [{"name": "rivencraft:linking/link-fissure"}] }, + "linking.link-portal": { + "category": "player", + "sounds": [{"name": "rivencraft:linking/link-portal"}] + }, "entity.meteor.roar": { "category": "hostile", "sounds": [{"name": "rivencraft:entity/meteor/roar"}] diff --git a/src/main/resources/assets/rivencraft/sounds/linking/link-portal.ogg b/src/main/resources/assets/rivencraft/sounds/linking/link-portal.ogg new file mode 100644 index 0000000000000000000000000000000000000000..326f3828ca340845064d14e21b05e3fabce86c49 GIT binary patch literal 128402 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/block/book_receptacle.png b/src/main/resources/assets/rivencraft/textures/block/book_receptacle.png new file mode 100644 index 0000000000000000000000000000000000000000..76c758ea97b1aa76cec7fdd9439a5e5dd8249efe GIT binary patch literal 585 zcmV-P0=E5$P)S4AXPuQy2?8WX*Ez75f7Qjd{Q{p`gd@iMoq{r0s4 z*6YKQlT*M=?KpNr-;3AT4s$=u-V=mD94%1u@%6Ll-OFvUJ-K@)`yc7{sRaLLP@2qW^d2o8V2Npt+h#Lph0VeMeAp|2Lz&N_L9`Yo+lis{EDrGZ) zE6d%@>h?0s^ZfSFL3K4G@zB;oW9^4O|J$c!GkJ9oIyYNe0eOBW1pdetg5Zy)9;ZV; zw0oectJP|iM$&cNFB6jI8K7ug*J+w=*2S-^sw&`c5j=VPNF)-8@;nQHzdo0{-6gQh zw@DruIk^AoJs<=_Kh9aSm%G0b0(EV@$CwDnvaG2umianN*c=`J7p+$`j&D?$->vr# XAvz()9TWaX00000NkvXXu0mjfdr=RW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/block/crystal_portal.png b/src/main/resources/assets/rivencraft/textures/block/crystal_portal.png new file mode 100644 index 0000000000000000000000000000000000000000..730593550b27946ab48387b2ca927dbce8f28e0c GIT binary patch literal 22726 zcmXtg3tY?l|NoE-VF)X!MrcP;j4mb`p|NNTVU!6&k}Q=j)P$tS6e~s9I>MYnu~ZTp zraJ7fm`ak#BX{zHwQ1_iQLFbJ}8vj+UaaL1|@%Lx4ge_buix`5vqesHB%Ab~J){J=kh z2;x*SeskDicb40*s$qsCtI_@L?yCs|OM?3{*Y&|4RzG@?@a03$Pi0k3Q`Fcv7wz|Q zKdaK<-<3m#h_|^J}@&fEZKGU z{Y1B%J0b9v&%F8u~B{P?Ce}YARIQ^y_!0k%zLN{38WbC;_j1q zQz*i*3yxFme$6RK2LDV zxuKUUSZXT*VQo_Vay4!K6_3dAG1nsL=5xAx`zBMKzNN9|vo3`7^>|G_yL>52E%V4y ze-Cq6%n+U{cgiACX2sX7IrD5P-pfL>(PP9?cf}@mqWvI(rF)`(cW;D+o9929Y^wQU z!^d-qdw#F;O5$)h&&tZmIBB}Jz4yDk)U>kPTgRn*Q$?kv@LNcl1(_!x8Jwv<A=gUq{PulU*$lIrW#(%aqPAD8nnAho&RNK^IuyeUhl5@OWjkdB{KGa08Y>Nr}aMCr_UAXPlbIq)yj8!YOAt#uw`K`Xezu zak#(vEH#-on|F)GnkUDP9dXTfwiic8MQH>AQ6ngvY-HF$ApH9E>z^S6f;Mj{RYFcs zUXb#w34~>yw7p_!Rbx;^YKxdO&RSwcGvW~_%Y>xC6d{{=L&Rn?U(-gFwa{6rX(m=aX2d^qV-I7#3l0uy<#3!vPYZukKa-J zTS?X*^`>$u@$dUY2WniqkN>X zLY=R8dm7IYo?ApVniyZVN!QYO$R$19PLafp#hYvry>X7sIN#J=XXU;v*XC%9kW}EO zWvgjsF|{_a8UI+v{tl)`EG3SmPH&<6k02ZqaMRahsVPRK-i~I~D0cC6!S9O6CCJVn zVJqJQJ3B)X>=#gkWM15&iok$0-B8KBWyJF-DJi}hK{di?jaW+6=GEoe zw3O|NcGT@~G&AfSG>gousz3Dbv6MfTI{jw$-rk;`o>)@U#*G^-C_*_YYCNMA1rXol zG>NgxD{q$SkUF_*#0pQ^Gjd(kfev<3{m-^G&OrWD)5_K;>zeVo7MPyR$hB$Mdp~p{ zvg`)k)nHqs}Aojez9||hQ`u1 zbxc-l8Zw_19hVb&_x+Epn)&_*4ph4m?IpBK(YxL;yQO@?rkdi&3UXaR)zABU@jS*U zZ)U@5LDfSx({Dk_1t0Qqa?Hqbr!yJWd&LS>%T`qE78_M|Z$$qqr#q|FagI9UaSXbU zgt9Z9v9fvJm?kpMPffdL9lJ_RbN4hp!DjlzjUrNf;^tp?@nv-X&m+a%T2(ze&rds0 z_C2!Jd2-%*5nTr%6Q~5jslakn;CQxJE?YP}%JOsSJOt_rVo6J9*grK*ciTdHuZzYN zHO)D2;6PGH+D5OW_jS#VUsKN{Cnq~swCpamyM@x~8rh{z?>nN+YqWBYE!)*{UGyfy zTAZ*v^IMq9ZWI}o`ir0TP(=%!rCzBK#IZN8qzcfV%60QzGGF z$@lCD5;w_r7Lk%`qxwzv-)j6UqPQk9Ml3y^on0=L-gv#|aQ;?X9ZOBaU86yo@K_{+ zbu6`al5a|O_RC+IeW?FW)D4G2oUgPOH6vNbe4J~Ozr84| zGu~eDubmNUK9M44GjWuWGn|=xc}>%r7#|W#eJ{iMchSU3A!!JMSc{tAPCY?ltjuKy{%=p!pUmVfj*XxFiLiRZb zNlhBV=^-3WeK38rlkRgc{eWDyN+LpO7`5D!w%KOl5%djh-t9!IhnJ-8E)hL{qGkF# znZEtd!_<5~Ra$y_I#qI`&hbJ=Q%w!<#W6QeW0_tYU{+zTxSpMjPn(WNy(5!NbR`*x zrTm11gf*!x@6bc`FW9nxrIzqROWZuo($dl@(NqqQ7zgvUx7D=p-cDWmLm#qK#QxFI zy-~5r*K31ujL%aioxZKhllk72Na2fT^meuB>kc}$CaLO2F`hrq{qc}5{;Q&8yrgv* zu~~NK&K=Yzbihf>hCzg5|Bx~$!Us%hb8G9p;iYzfJAq6-3Ez`E@;BWfSyexu7uV5t z6}@>hfj}N8f%%rgl{g0ip=u2SXRY79EMmU)9-;XvlmP0voPXj$&&nffx9J|$tr_(^W(>2&%jdIkF69LXu;_LNuEJMm>rg>zoD0iAB{06L-oy|mkI1nkz+!N`ms1MO7P<4{nFCDI2$19t0PI!; zaW!ZH$gXjWzcZ{4eH3upy1L}@!otG0f-9*NIyK^?Q67&A!Hdw`6K}Jbcv)VYKq6`f zn(-pOX5c!-Uwc|xTX%XTIi-~0jBi@UwlxQTobH~RDKcNJZe5Y-xt|#-4m~)`PEs+O8Mfcfd43GLQ-0Vt|dELj7D(9euG?AfEH{c+~cQ>7m{x2 z`OG*&cUJW;@%MCNH}WrG+*6z0b@y+4oik5pWGAe$W4)!NV=OqV9B ze5Xr{(UFPQPLt-!WtlAXb(Z>vki<1p=F~YZ_$iMcV;FtVCH*AwInnCHAl`mpE3rpb zCK{4lrtj|V?$qmVhSSXl@oq8IG_Gy(x?gwtyYBRN9CkiCCwWzx@B5();vj-uY=*Te z_mSS2NiD3*TV$G`tjn-|Nw2t&Ht&_a40d@&HSpHV4MNMg-t zt4#^j(8`Lo+TK}9mAs*GJC^42w0YAcqL8#EOCdmqpYxSIL*D-O>}94gK3+-n$oU{M zU01}HO(`rzP_zZ zu!86+;2ud8WO?RF1V?e$7Vd=ZZi?7y;jrap{8*-Z$k>V-N9j^ zid1%l_cxl~*61hvxESMQ{H(pXx!Hsw#C*4cs~P5}l@?C5pLoV?HPu(!*nYx(!{($3 zokbSM0k^l4d0~ayiqTY%;1w+&w-uUQ7ybVE^QTm%N4>t4ojsC30CulB!c~@}_xI@f zi#FNFzRL$jkuF`_?z`_rq^J*hzNvxdt=ylGF<)*W^LB`(0=l{8AHH}e-lC0a?rhZ| z5j#6Oy9Mtk$@l$XuCk-M7j4Ceavgz=HV5$aG0!h%ROzpq*&qD#w;*xCSyaJ>n;hKy zc-@c_oMXkEW&VAW8K)5C0C2A(ii>{)6*T#`MEQ`@@VBqm0?ECrB6B-MsF`w_kn|M& z!)-Demts z?%!8&I-6c`MyCIp%|sK&K#Kf9)y5=Y=t|n<71XeW(m|i|1mItz(S&n2sF7|&dq+9>wl68UB^lHn$X{hC{5RKTOkXI4DiLxx5|oU)HU*oKd@-=CAT}Uw zxtfby&07H6%k~QN?0*Byvi!6ed@(w`L1>zToe^)7rj3uJLT_q$RB0D?EU?;6@t2Tf zo}hePf9S@XWYy`wZK$U>+2}dji+Y}t>yXFja&|_g{|UIs>}(sA2Z3OBdG%MWCdWZM zl(Gyh7&zn)kp1-73{fLP; z18;m4)lDN9sLX}Ezc4Y#vj5s0CrEAapiak-Ezi!LvcPEC-}){B#Y$EGn@RLpym)cC zwIo@oT)`riSW70Ua${nAHZ5BB{6k(Dkz&4{NoAY@z6*G`buRi!!{N|X#AZt&nR2~< zQq0~3tPAUyYl@mG7FC?F=iLIU&?uLEYdij}BJ7!yCPnJBgjn`=uO#1Zi%%SS)*T`x z)YxrEaAah^!=ju=59M;PE@WF{P{AaL$Vzxg%2&kK#o4HGftfj+eN@S#;^OTqsnccI z+2*59-nArt?2Sl2SZ<=I{8tc;*;J>jv*&A*(6|1va9*O#>)dtMDYC1TA9K{h*epT0 zo>(%f)b6^7!K7;RZAtdaQ>5+-Qbt9Qrk2`$Ol!4>=xUgG`~>N9eLW6sHbv-fbapVo z8_~_xa3!L@v;VqpqiT}NBK9eCEg_>YQsOF6uAPJ=^n7Bre`Oez3XKVlEFQaWqK1(N|D@0f^9VmuF~7af<&Cdb!3 z1y;pG;_GD|`s)k8SB%fMMT-|(EULJR?|~VE#tQr?m$il0l=KGNE|9fY3YRdcBKB$~ z6(|AJ)Ti!>_oZjWL(bIFqib}qQ8tvO(;)q>O)si%P?^-NMUW?zP;jP zsgKIZ->CFdOlhq_&!4)4ehXe4;?h!R2cnLv`HsB#N$5XFTr$kFffvPKi$YH)rYrh+6*zBGaEpaIhl>t2}xU%>TmdIztq-V z<1nd;O+H@lNQ_e`{C?Wa%=cbN^G^WAkr)hW;g^s!j~N$A_Ruz)#@Ih4Pi9gNXxmXN zxBJ8eXapQJ?R1@EW{J0*0(H<{v8&?T60Qccqn(0Dq)cSoi?ctB!iqV9NC_gx07bGS zqNt|o!tQht`=y|&`LHu^tk^$aJCjJsvr*;yEo`UzU)Re~l=f>EWQrE#=jZ1%b&oD@ zd4x!HC~7L;i;@0<__}4lFcmF5n1~64O}5EAs^nGf5A^#skYV7*ETrHg&~Nt?RHZrT zp4b^>W@odRFV18<|1Ni#ekRM2q@^v9;7`>)MrAPL4F2)e9m)ovZ-z$*q zJGwspBAcxdWXbgN7|&@&r3kK{vy$HC`JF&lM7kBq^e&83c8bjyTQHiIhv*#RfhV^Z zyCL+|9cM=jFjq!JW4UTtAz)^y-F^kxH*S7(iDeAw39u)yJj$hWT#igH-zS#VclQy2 zu{w*2A0XxNE;n#49_A)@Op`Tr7j?I`9wv`I3DzQFO~-`{Yg<>+pS46v*Lm4IqtZ{Q z4*nBghZa`f*>H0=;aGc{UZXQ#xq7xL76}z->z!ydnc2{M(D8>vv=_wDRAC&Ag>vSm z&3jvWFgS*kVP{mB=eJO?X&vWn5C*+p2OYOw=Z7Y;f72_}`IG{^b7A`Ci+u4k3|KVQ z8G6MWHuIYgTr|lV78lP>XzEF-E)|bKoL?U0&O13HxT8t>mu{JHVe_LXsmVf z6c0#I9TP^F#JIkpv4o^Y+1ZKg&8=zcKG4dBBXdDppR`|KrUWangjf=rQHi#t%^S+Q zg-H6aW}ag5zWJ;`1D4td{D`OVJ_Q*!jKL`|F6Zq+?|*4!cJXyM{u#VmU{8{Khl1vf zznSgaN*;@g5k{PN%Vv%ytW9lsLM!u3v~uTghEtvfaUJYfY7v`>f>1Mra84J}@_G*q zq+v3u+=qqf=Y74#YXsAj0b3=a>moF@8;HbXq$mn6?pZ)sV|PR)ZPWw?QB7N<5hy*4 zM|E$rM)YjeOlgptFCo6(d*2zg?FoiWgvfA-h)KoC@AAKJ&p&>7qSY8(i&KN&x_4TB zSibg(rGo6@;_~xDo}Zlp%u5q$_eC}+=??*^mq?%6x(2n+ovFWTG99NMii|?2%!!>k zp7BqSIe|#Qq5=8gxPjplkLs)@3$>Gy>`{U-yd{@Zl0eS2r$4P;(kz{ z{j_P_?gDRZ9tao2BZ%fS9k*=PU6bWRN=1udYM_hR=uB1pAq*bKYbX@!n5V5{6(}v> z7z~cr6iW_{)Z02eE82}v~RJ3osh>cY00x#SUazR<%#G@InCsBq-Rq>vokk$s^V6>9+*b%m07hr(9M_fFtwt^1_6AH% z`ee$onZj>0R*C~_ou!bds08%bPhM{Hzhe3W(+J*hO4)MoTc=66)p6ufyTKqe^7$9- z-#Nz5lNS|5oWv~FX8KUC9-Sf6f1Q1Ds^kZW5$cuX<(0Ih)Xp&T^&SkC?*vn#1I%hh zQsmaLF1U~M3LSV;Q_A&|KEd@N)xagz#Hc}vO5Zq6@7k~989)UKz$iwe<^Wpp#qv5w z8DCta3o+L{s!N@x&GS>`GH@M43d;Ol>)5U6Tb8j?{ZVwGXP7DN!Byu(N+$4bWr)(Q zi;%ZVh#z{bFG^kjg0VBh%VnG^{Pqb6!&X*k||^5$>xy+vJ#>J6Rs>_^3lNDseU!1%O?+ZzT(jtS{QL%^bXWnf`~2OWCK`c zAbRupu=8~2Lc+jpW(g~PIC^|?^uWX`W@TPMWm@an2ot5%E(BV|Mio(km{*s7%$niep>R@`>5&{7e!heFQxVm6y zRcA?WhEq^sQNloQ8ge!Bi4>aYSwkU7-SP-B(60meM=8QfZ00VY8bECnl0wgg-_nU_ zfGEGlql;HyW|--}tJ9p0y_0T^aD>?cV!kEn!OXO$dJ`yrDs6 zyFbuaUF|uz{O&zokhMyk{GD{`nNHznQVN}1W%_bZLgtK>cl4n*`C@U|t^i{_zx}t|^S{^Q7lrvi-Ec4D%(yaL3-ai? zjmmIgJV@goZv#@D6q~>(Z)EbptBjfTxc~G0Q&N5+y<$jBhZ328f)s}4wmGRD_>>%T z4K+tda*D4La5sWF8Yv_>$B%c8pZ7JjrRqSkf$OJFplKVbt{g@e0$l_Jbf0zs2z~t9 zPrJZ3?wOzVtB|B=p#!@uNGTipT^@fX<8M@o)WGIOZN9&o=PjU`{?jsh+`Hp7KkYPT zgOhtARHd;DyKQ$gDHxalS-G0~Tur_3+~bbkOM&H|9nFD$QKNv+0?V~hetdWDwjFT- zpuMS*{bL!MnAG7EpaINs-@NUJPP!dAo8rJE5Gfei{_E%kLvC+Wims|aIM^nuF8g|o z)}?|0T|%sNj1Q+u!a_pck1-rl%r|9HC5sx?2AGZUsTpZ4xfcxyZP`uHI3^WeQ@Htd z1U2?^55Ur#)W8TRy^w){kLsF(Q3E+#jYL`Z8dG4YT^NyqKL}tolJXzAZC6nw^7X#9 z(Uvbx>$-5W>pjRYpBEB9$iA$T~Pau3qc@EjLE*1Ls5w2$7 zQ(+#OLm=$;+VHP{dm5aD32y@B=?T&kxeN!nUp#|*djqFtW^kgF71(LY)3)%%yW;FI z*N~OXW`tv6>HChN?#Fq4S;=zW?PK;62tJIY7ysW25H`zM^u~}PY(iCO4l3xCwQckt zyEo2$hGZv`YAe~vW^U66Ug!DkB`-gC|G@BWkHtCYo1S4Q~Q4^^5 z_j!J`umil!?A!lvYdL0Z@b$nO?n07_?h)wzK?JnGp}I#H@DR8V11GH}mS7xgIG+_3 z7S`iIT{Mmn%}DS01P(NJu3qu8PGAZ_+1|+PteQshf3`-aM@Lp zH}Euq@HqQzHWNoyw8+3pf*KVh`A!OZxOD^L)YsX!j@d(a8cmhZh=aEiDVf$IpfpMQ!hyqWyb zl&7R8nmKIHNzc84V*NJfET>F`}~Z<*AGRR=~Z@ zO!zKs33*HS9bzbHDdxDI?S9_#5wxDh+&1E}wy>&i-4rnVna#mwZFLst2eqZOzuu_2 zMI^?=GtZ0}r*dr;LRW)m&gA1WSjN{KyuZ1zT-O4budnuCyI8ZM}QVcdQZ&=43pi1U5h?p6X|7Z^FH%@hhxh(yy z_q{A_5c-f)J+k6Rj88k~K5XzC)7{?QzFZ@K^xL!E_*vfKH=`u9Nd3ouPlfnTCbkI4yqEBvxAfsWT`C&mMh@qSN7mCkzk-VG z>x-Jk7?u9QxKC{VXTbk}PX3qV0h@`p##?=zFQ=;JzCVx;4i`K-EFHVFdG!s4oxO$U zJg8;u-G%RTiHGBI-s`_&sJV){k}pPm41*>CJQz?u65%@Y!V63RJ|u(lXbustR7A>G z$Pq`U4icUNJGO*~{v-4Cs)IbWWhGVOZ_%mFTBCt_wVCL7(KqA?c_A{<|419~Ji12n zmeRtlwkEc*pI?!0=4<_;Nm2jfIs57s_bvTT5T4_=@Y~GGGl)@p=3X}1wryLxd*Uqu z;cuCK@JPx75U-L}gwOAxgkOAM4Uen~UmfGMbA~*3j4uUwa|bUlUbuElly{o0b5KwH zoXF0_CrFPR_KrmN52?Otqgu^;0c_f205eSoi7`&uEU-9i{i(6BafuQ*QVbyA z+8>iM1>B|FT<(>Fr^9QDx(4+0(K*JgD0N&dd&YHnk8F?W(&VFF{ zci?dDyC;6ZJ3T|n$g|mZOOzOwW61b6Ii}Vre*AFCGBafWS974L^b(L;iX|~jK}ONl zwmfnNKSFtm7!4#+=;;-JIJ2m}1vO2bTEkHaa>!Rstls zh4JHKd>p@(F%jvXyCZ@F1Lt)%WTh9iv7UO}(JZX#h{jtTNr4(;`z2KaEa^XMCeD~i z9Yhhv*}q<~BA3R}5Gg+#hMW++X@#YuCCnw#!EAJ? zl)sm8DxL%aw7$Ej7xoYk*uRh22Tf6$1e9<2;aGky5U#34x3a%OG8n^t`CwyRNI$Wv zuK7}H*NaOYSsf7Tpp^cqDmbF*{Bf>G1a>hy$<3WX;1)>gg!M}NabpVD)fPXIxXz(z8N5r2O9 z_>f~pnOj&C-_qzCfm%#sTwNmjdPYiGR}%x^$ACcJmeUh_fAfGr0LAk6&#HnkB*wA6 z)~v<7H||95M2c+S+y~(k3bn`|+_2f`-dr21kW>`e9|1XPi>A#*m1|1bc{Q>tE3#|* zd|2|RE2*=Ilidcu6WcG%r=Wm zEfzsppCz#pl4KihCL_rJ0moA%2oYuYBFogkEyNOtr@E{zZ@YiK%RNH1(?a84jiCYw9{}UKUQIr|mYnnRH z$JgjuE{{1`s;5`1iOYEj@`WvSB{qk-6vJ1es^0;+pftl8>4Vl2ArQ=mear$uU4Q6( zJB!n_blV45{HB~;z73O{SCV_8)v!N#v0W&!kesRTb_7pQHm{&gk0$K^B_FZ5;B?0G zqoJW6+E@8pk@5-i6r16%0(61;GMPa5SY2Hnx^WdIZCyxhZ*OmFi>_i0>;p@PXRTvp zAMzxXs0O5rj-X!wu)MUrI~BU>nWgYw&7JKUbWXI*fmFo=RH3^|fC$_@V7i17+0i;0 z^+V))xyThXGQ`*!k}qHt5E`#9+$IfpS5DZ!Yn?YlKYpzs@^353Q~ipPB>N2$+|D=1 z<4=}e>xaFg#4BmhSVmZ>U6f2ef=C%1<^69;?kTwI45LwE)-v^$L_@En36ND+5Pd3# ziQA<7av^EAOL`5QG_JsS5?DR=hr6V&ar3kiy#aDm)CE`xKe5#757JCw{W#~R&4dNA za0T&NMf&2!#%|3fSSJh4}RT zE2yeRdjVdQK?j9ptG`@OupYm>^UkCDahk}y$;x@Owlr`I)=aae)czTexWYJ6^uX6 zD9QKX*VKK#M%i=~SzMAj<@zmrm1{FcmD@1v?AysBA_3H){{Vz$#n-(8t!~U%D-l5$ zcudx(1_EQPB9;W09TiJo;ItNPv=?w^Lh}^85wXQS!gH@rKKK!F+zh;9DVYaKgPS5X zX+25@m3Pm|eH_?$(m2McQC!X0XiM_!WL2lP9Y)ai5yg=Z1afWEGW}lw&~Olfm5a6{ zPCE1KRqid+rZICB-#WuE;8aytSKEfwq|cK4f#`Mj-<@2|Oaj4d^vN@|2fs}jeKJr@ z)5&FlAMdvOM8#cfEwO;-=qs7m3j=TvcLj-YDbRLB=Ig5c3nmZ1IY6h4lJzI;&3T}{ zRJl=B?#SQLBdXkpqez>E*WRyj!43`%YE->m0H7yiE%0{{x)d}Om;r**^4Bw8!1}Qr zUv`2N)qQG$0pYPyscfq~_y;atMO`zDV`(zIA!hagfHi<{cU3?a0KEZ6Mwes#^*fV1 z%#<2e67U1eQNaiAzBhx=>wh}mT(N^lX*hBPlviod$^Zo!v?9C(aKFW(G{G1bLt=pH z*&+T4_rodn_nlrbUGt};u${lX7!C3zIl}(=F(RcP{mLA8w`vNHcGwdKFI45O;%c(w zvNeeMhOtZBiIjAg@Xf6+{xKNlY6o47B3upNdZ$1(ehq&3ddUuR6RH;|VI@)Je#ALr zlH6>YJiwnB0<^>QHsxnilRt^^3&u>2rmb2~brYa41@ zxtz+db~I0zQ|R?}pla-c;|-p*qiOk&X`gX5zNsy)cgFBFf>3Q-pQOD;P%=;h0_ksNGiOOd5&x8}CRQBe!!rzLH@Pg!?g~D_8W~2S> z6~v-v6f@;zJH>Cv2*J)*=Bjd2^9!NOW@yOv6j$;fM`wCn>i2)R#x^1&fw!v)eXf`^Om@_Lj z~pfJU!VHe z2}W3W_XcqGPgWz$F;>D&VA~#Ujm`60#cUY9C27Kzr1~~>!|A|k@YrL)+Ca-$R5AH$ zh%Fiw;K>`>GbB!o&jVC8P)C({evyBE)xHx{4d>ZJLQvbv;fx~uTfI6qJG-4p1*}r4 z8)!c_UY-r}8g8%%0BZKcGbdzv2uC+@&hJ|unF!CV=Lm!()6Cc378or(a(}ZQ1~&Lu zrd2AHoehUKPjK^mDAS+tc_3m33Ao##m%3BmLxK+kr4|z6mFyex{Q}#(HGHvA)F&qM z#lYqSOZ^`_cJ%nV1lW^^%@}pEkX%1}YaZ&#no!+|9g!!jzcuD6K|T00Z*%}O09`q3 z)T2hJXP#_@$X;V)I0PboYV#i2i1zOA9psqKpmx~bt|f>Yt2bOalTkTK@&zw4Q%!pT zfoutp@@T6q+(od+zSqh_i;Z@G9fT|bdw$xN_ehS`yla4}`G3%L`UPgY->tYY8oChV zy$}5**RChL8>h;hiqZp>ZF_$1OJm+G9`V}i-GL+3v=zwXv zT)xAyk)EYFTGeSKnalgMda%`U<(JV{C&{gER_>X0d1})L@a#>KsNmQCu3n=^PS?pE)eVk8!XU$vs>%yr>B?gf(xE&J+uS%sELm8 z`zX=EonCn`!eLfx3oTrgXf@sakiiBv3`c#!^{?5Sw^U_7@7h`U{ed!LWxxzoE^MJg zUR>T+(=ppBZj+hPX<+AO%SgGbVpQqDWu79j^fVT1mU$XaQQE_mwVpHo>V?bi1XmFL zSlhr7Oq6}ziJ~SaH_tD4y+d#YYV*p#<2I>S1cW;z=^9*R^4Oaspgo38O{V05FyKk|kKp5?-DxL$FXKIEbe91a*(7#>cT z0Y(o8XMiE+0*ruo&H4~?=r2HN6M(=#%5;NerB^I{aC~=+&+6&!Z>-$kz>cMCIQ$*5 z_XM}G6d|OeUK%W^Pp)2E7=QPKfA2%tK4<(o*JfXK_U60qU*Uq3R_-1LFWp)k-gOTR zwH9%&Y7REK>hO|C0hzH#c#c7Qcsk?no-y5p;3aC{O@L|gAgClPh?GPRkGk+*$D)pT zPyc$3`A#gojO~y3I-!kql{{B0%zq_XYu8nH{-S>~+ zjfUgSp#2Qp$_71YECYrY2o(1%i5a>O9xQ{d#%}kv-N_fR0Za(5C*!{-#pP^(ibRZ> z%ma48zS=$k_X1LUhH5Uul|%Qh_ zBJk$hy*Kz`hi|)LGvc6+!6gXWeTww-P!1;xdI?N89#qyHjUGY$ao1f$D+^VBwo1HD z{FTF*Kw_AmYcri3lQYh6r2-=2W$D9j@_4wG`e6#qJpOdlwpn^rm zX1)L`Fu~0gHnFh`Hiz>%!D4aWX)+JEZhGtTc)h&H%KbA;u52b2Ul_1fU0ow0*CpU; zJ_xuea9<0!E2xqQM!TrIxUr1ApJtR_uzLNQK4!YR>Hd>^kb1mZ4RYDU)#{J1Wpa$4 z{pc<_TlYsn-sg~Vwx(mzOx0X4rX%Em>?GeP5(A0CQg0n8;AUZe1kFUsw{=9DSJv$# z88qyiYeJ2ks>-z)&nS1hsr^emufYHY@g$~@H6v{i{;M%!V&tL%rv4mx!k>KR1p#^TKJ^p71%s$uZs8*$Vv6TpK+o zi{~vp*0C8Q{-HdoX{zwk20gbknjc?>RSGGbvH_`&p{)+u?0+fZF|h={`KaoEgQu~l zSJLTUkcay-M7fUf(G&w%Sn^RyqpS^0jLxCDU&7KJs|pkz4ZURv3%y6o(gVyXX1bYYm{EUN6n*#3aphcrOkD<79S!-WVP96tZr zkm?a0jWQdRGNQO*sA5x+w4u;XYe=~cPmd(SnoW)wyDV{<@Z7sRzp*j3H^C6YHNsda z5$#%O>^9+mxAQ+Ok5k@ZVs~I=9uF*U>@Hf9_+^{%Q1isgD>)pcfV(($DpVZU`5(21 z7jy4u;A;hBLk7NrCCx@v{wvi6>n12)=<*?`$a*~#`c+3*5ZrI)0i#kc9gfB=5p9pU50d|cnz#VfnClD-n7Xt$L zCl1g67@%QKgx0Zp7Nq#OptF-O3HCNLyZ~vEAsR<0Pr}?1YI=70EM-6%3IM=JENR@* z;CDj)_G4t;kAsfOkkm%=6xzDxzsE9ma5X{@dTnj@p>jo$-oUMbWQGqB_FE&9m}}!1 zBZTMv)GYs*9`+AN_~EAhMcIG(!3mCg{S$Cc?>yttqeo##wJ}ka1NsY+I z$g-ByC7g<`qNbO*Ryef3ZB)o}P#F2JB_{dK#{9UR!-4Gz^7IZ4$5kU(ucl41*%c0S z2%-S%NpCEPw!U62%RJYEUH{thaJ({L@Wx2IXewJ=9})q}7?NyA0dhQf|1-`izRB%P)`+hnx z>aI-R6xmsyd_<$4|Fb&{%kS^NA}*ad3k@pKYB*kFxUbiYd~M@#dkpj~%RH9>wHz$2 zX#sveJC-rkdk&;qnCgbLdagBo7XJ5`a-gn*gW58zGoVgFvEC79|Ib9e_uajKB_N#S zvVG^8x-BxTo#B4yOBgmh+1CWlEfkqSnRi|dtQnYkyR5HhNqVyP{_pUbn#X?2Cb-#K zxwDN*$))Eq)^pwt>PU^XS43H!imzJ@C&8|7haS>VD=?kUh_BnH&0DPz1Ug^oTDpyw zvk7aZ>a(Q8*6WwACa7b43Z!e78r}i+Qif13C_jBSF~bKafB2ll__#1LH@3dw31Z z_f13!MNxUz@93b=9auX{wR$mS|AXL%TLC*>6Di3uJ(+F%3xY{)lC3^s*)M?8+Tgg3+uB7Y#F7~rXSb-`!h_ds6Y+=knDg&+^@3ffX z|0xE^ufs{RfO36wsof0W(?qMY&_R$>XzlYWS|$(P39D_Q>*xh&5uY6+jGST|$sW~arW){ zJH_oF)vmZaZB*0Dwpj+1ZY+dhu% zANs~IMi_e9egV2K=$+ZBuBrPMq=4@jFFa@Dxqswu=3l(HCE?!oioJ0;d~M!H!S$kT zcV_M>t{J9o`0s4prJLEYz(lTL+M$Ak$xny5Cl2_FNcJ+Ueh7C63+#IC^-3~{@d0V@Z50IdXb z?az*Gi?wrjwTGP>?GEmb@Ejf{^Ekf`4E_ll6+Z6!`a`vt8Z9$4lm{o?+8NDRnl<-tNB6|7 zl-wY=BnF@UNP2z(4+9zdGB>UUV$sXoM>u1Xqe~qzVEL~V5Glv; z)Rz%Ar+z4Ef;sZrv507E#cpJjMxgn}{}U=x_rdodDX_A&848B^fzOxNFHtI>09awq zvbeWhs|HP%AbPXa*v$`5pn>}mRb_3WmH)x>8xpO2Ak&j~IDj64(Gwd!o}R`gs~2v< zmmbK+a|eoH*ZOmOC2`R2cX^F4TKJkNpR|RZy_V~Gbxc+X`iqsdE*(Ia zA`GiJvQ{j`{zoMW6}Cl=k8+A?>K?ym*-=cx;J`}lUSabWsqN?-E$(vAiI1hM7-($v~0HKt<~m@;@uiLVGA%b z>{XBsTI`H0&^iW5R;=(LyI>{i2h>gwE2AwqvxtKuov&;I9>6I?jok6YvD~_%g}mYA zN(>&gcv?b*nNo19cN8UJDnrf&2XcZ|HjSlrZN3Lj@QBi16QXjaIgW8w<$g`mIe8jW zF)@?tn(>4WP{|8eOH1wOrM*5xyLI_w-u$PttFiIpCYE**^e8~s21cSRV6D6Br#)#p znF2Z@UHUN>5A+y%!kOTV5dqJ}I6C+8E$`bP<5|O>T$#B?ysLcI-G|th z;BaoY>L!^aDA#EO8}V!%ZR0y^TVgy|M&yID2QQFq9eezVT^M!;>_5W5yT@S1s)G0X zr9=v(_hJ8R*gKfQ?8D~+ab{Wh+cSFMZ}bmv*NE^|Fg>{3VR=)J#q!P>PEXT~#VW$Q zAJaqW=E*jycso-BWbu+p-g?b^z%%Sb=Wf2e0TzoytHMd3{O81G5L+eSJ#8iTqId<@ zMbbEX_!M@M6_8dAU|+<9_g_c&q^hP4=qZa>>jw9yjAA^R_k|292sItm)92@_eQ(U zb4Be$(YU%J6m$qBb}BRR3)}~Ibk%V(?-h;JqqK-L`}8Llb1R&bpb)0JKXLQ?Xf1iy z8=Q8As;uQ;2cml@JVY_F##rW93tJM=xJPbDn^>Ze0d6;!s#4<~?K}b4JIy9cd2;OvMNY?5xOc@OMzr!O@Zwt2F zsTnf5bvbo5;m7`wVyVf%#*%$IjWrpr8E`SE#ZX-Eyot}6?UCF;$4)oMUGn{o0u!Jq z{@WW7Ib`NxcPd9wm$QmE)`Yho^1|}W^KxyYIrv3H?ZN03cqox7cb=)D9``)3Jzms= zAqCGV`hhCz=J{Vpn(o+~hfiV_4NE*Z0zo;-w7CG1iP-nOPjSr|g4W0}emqvp&)qr$ z>ZrSDG4wNdPbq(jng+>-VAz|WKqdSEWA1RTVgv7~4r{7o*y zt-@^gDc%Y!I%u2HAfvb(tR0zs8gvvSOPcQCuVA{zuO2O7<4a5aObBCm^vqbx9ln*8 zK_>%T&D~y~u`^HDXt$-ImL|oZ^<(#B73hMvoaITr|JT8JM>To2VLadK}2Ol8;?-~ zjnvjbMDQ>}zAOEo!+|$>pZmFg*LX6SWtrQuHiYBJ%9(1!Qf}{9h|rV480ADIvxA(4 z;gywxANn%Ft`#1SRx}5yCv}+6QHxhlonF06N1aF#ULCEc*yLi$j?SyXsmK$V+Ko$3-UJxbg(K00{PS589=tNwy=R< zPkT4~-5cof&_!at$tN6x4x?P-=^@t4{4!F9?Vm1x7VRP&DF;HFMijFMlI%fw$WkIE z3bV>}C%?R+!9{|asF|rTjlYcEfKUGfy2@<1dCARTV1n_XMN0-GvCXPFM81t#+p&-@ zV*Qhj%9`A4cd>>^{9A{8v@AEmQ{uKs>tjNE_DG%yQY8-uRBt9C2=qzN?!{Qz=E zs+~U+mUu!UI3MiX&}x8Uv8R(+R5#F{lJt5SUEF`R%kgeN@FtQ-Z zOXN(hZn1Kr0#sl!YceAZq{&iFIeRkO9v4B#vFD?*r{g>rt6=}cHBPL#0D!RcW2%qK z4HDP2>g|4Mp_N$Eg6}NQVCJlD>%wc_ib=RKu1QkWL)NZ_@8=p`aeUAC2&viR4kIu9 zA4H!6APh``u>rhe6@*I$Tr)B%YCxe-K&b;)7QxU!$h^xi-{x&+(F{id-mlTwj+NOl zU41`Azp`D@1B0x=7!W=PQ#I`r=A$nMBjWj+-#Si|PQp`4CVbI?nJ?C0;>Ll9 z`}|j@4fV)b{gi$fXChRC)(}@|SMW}goo8y^F5|t<3{ZZ8w#hZzw-gOnRTT^zw8?kq zx5A1fl7t;I9Y>tBL;U#Fkk7=mM31<; z*sSf2(Ruz&Nqb^LH=)+VAo=f+(QDuS7HQX=K*H($St8<>94% z2Vvz-BCU6qYli!M5w{x|89{!08?oX~&#g!8l(1i8A&9?}3k?%s-JP=U<6&J8AWqmK69QtIsbu>+xUJ|HG?{8XC)KWV|Bdg^yP}3dZo%8^0tsfi!~3Onau~S6_h+pKUH%I`jWIR4CxMWJ) zWkcL60W<<9mxmbQC!hS0&SBkKnCrZJDD4Ss8L+249cP|*M^{v#U3aE84o>b51o>}~<66LPLkUtj?f!S2Y6oO|Htv?8!eOiJ*1knJ?sH9HAdH*k{SjS`-}h)|=z6UG;|l@p$_v@+$;J zDFQdpvhhYnqOc2F4$1&{kgsAlgrZ)HF259Gp-Q*^25#`=X4Mti8w1^y6b9o$cAX~b z8oz~(Gh3`j{Qgs4a;#9#G@M!58U7_aufY+@2`G%v!AY!jPOsK=4PGJ7On+|iKsOu- zaT#qM*qLo@Epr~-#Vu|MpJ@@5W5lClQ^re*WbCu(=a_0hhN$5)l4UILQpXiiIljaS z7}+qVk$YRr>^Mlt<+&Guhz-!qm)xBJ`nKlYvU?=xq)8@@wl2g)z0Hw02zeh?6zF4x z=@E+CPSDf5iXU!5*%4xph;ZV}ha~STVF;Ec817N;P}llBDCkdAo36*ON7yC)JO^EP z9_2eMiiX@U1C4jS1z}R`aagR}hK$iJC(lwVs2njAh%)b!FDJ6}hFUo@#DU@Yj-$vQ zq(@*TA$Y3$eVhqPBu-?o8?f;5sHeL5S*^FZED-Mtj#>0zp}5J6?_k0GPg#@C-Y(3A1Fq2uoOhBV36b{NdTBNXN}&^to2QfP$Z> zJy7#ZL~6LwkLTo@qJjxue)Hw!9oaZr`|z~{qCPd~k5$^2XbO1hCJ&J!8?veR2I15i z;;#eS4gM#nHEVn8Wrp#8lf;od>{B$(>n7EDw#(-fO%DzRb+NRM{a2)gWABftZhyTJ cbZAy@!Wnt^bB=So6-tH)9Cm