commit 10707f047b6becb01c53d6fda7d3f5420b86ad5f Author: root Date: Mon Mar 9 22:22:31 2026 +0800 Initial commit: Better Ender Chests mod for NeoForge 1.21.1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0766f43 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Gradle +.gradle/ +build/ +!gradle/wrapper/gradle-wrapper.jar +!gradle/wrapper/gradle-wrapper.properties +!**/src/main/**/build/ +!**/src/test/**/build/ + +# Gradle zip files +*.zip +g.zip +gradle.zip +gradle-*.zip + +# IDE +.idea/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ +.vscode/ +.classpath +.project +.settings/ +bin/ + +# Minecraft +run/ +runs/ + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..72f5738 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM eclipse-temurin:21-jdk-alpine AS builder + +WORKDIR /app + +# Install dependencies +RUN apk add --no-cache curl unzip + +# Copy project files +COPY gradle.properties settings.gradle build.gradle ./ +COPY src ./src + +# Download and setup Gradle +RUN curl -L -o gradle.zip https://services.gradle.org/distributions/gradle-8.10-bin.zip && \ + unzip -q gradle.zip && \ + rm gradle.zip && \ + mv gradle-8.10 gradle + +# Create empty gradle home to avoid permission issues +RUN mkdir -p /root/.gradle + +# Build the mod +RUN ./gradle/bin/gradle build --no-daemon -x test || (cat /app/build/reports/problems/problems-report.html 2>/dev/null && exit 1) + +# Output stage - copy artifacts +FROM alpine:latest +WORKDIR /output +COPY --from=builder /app/build/libs/*.jar ./ +CMD ["ls", "-la", "/output/"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..6a76252 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Better Ender Chests - NeoForge 1.21.1 Mod + +A Minecraft mod that adds tiered Ender Chests with massive storage capacity! + +## Features + +### Tiered Ender Chests +| Tier | Storage Slots | Rows | +|------|---------------|------| +| Copper | 27 | 1 | +| Iron | 54 | 2 | +| Gold | 81 | 3 | +| Diamond | 108 | 4 | +| Netherite | 135 | 5 | +| Dragon | 2000 | ~222 | + +### Portable Versions +All tiers have handheld versions crafted with 2 sticks + the chest block. + +## Building + +### Using Docker (Recommended) +```bash +docker build -t betterenderchests . +docker run --rm -v $(pwd)/build:/app/build betterenderchests +``` + +### Using Gradle +```bash +./gradlew build +``` + +## Installation +1. Install NeoForge for Minecraft 1.21.1 +2. Place the `.jar` file in your `mods` folder + +## License +MIT diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..1e9e1e4 --- /dev/null +++ b/build.gradle @@ -0,0 +1,92 @@ +plugins { + id 'java-library' + id 'eclipse' + id 'idea' + id 'maven-publish' + id 'net.neoforged.gradle.userdev' version '7.0.165' +} + +tasks.named('wrapper', Wrapper).configure { + distributionType = Wrapper.DistributionType.BINARY +} + +version = mod_version +group = mod_group_id + +base { + archivesName = mod_id +} + +java.toolchain.languageVersion = JavaLanguageVersion.of(21) + +runs { + configureEach { + systemProperty 'forge.logging.markers', 'REGISTRIES' + systemProperty 'forge.logging.console.level', 'debug' + modSource project.sourceSets.main + } + + client { + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id + } + + server { + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id + programArgument '--nogui' + } + + gameTestServer { + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id + } + + data { + programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + } +} + +sourceSets.main.resources { srcDir 'src/generated/resources' } + +repositories { + mavenLocal() + maven { + name = 'NeoForged' + url = 'https://maven.neoforged.net/releases' + } + mavenCentral() +} + +dependencies { + implementation "net.neoforged:neoforge:${neo_version}" +} + +tasks.withType(ProcessResources).configureEach { + var replaceProperties = [ + minecraft_version : minecraft_version, + minecraft_version_range: minecraft_version_range, + neo_version : neo_version, + neo_version_range : neo_version_range, + loader_version_range: loader_version_range, + mod_id : mod_id, + mod_name : mod_name, + mod_license : "MIT", + mod_version : mod_version, + mod_authors : mod_author, + mod_description : mod_description + ] + inputs.properties replaceProperties + + filesMatching(['META-INF/neoforge.mods.toml']) { + expand replaceProperties + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' +} + +idea { + module { + downloadSources = true + downloadJavadoc = true + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..abddb8a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,23 @@ +version: '3.8' + +services: + build: + build: + context: . + dockerfile: Dockerfile + volumes: + - ./build:/app/build + command: sh -c "cp /output/*.jar /app/build/ 2>/dev/null || echo 'Build complete'" + + dev: + build: + context: . + dockerfile: Dockerfile + volumes: + - .:/app + - gradle-cache:/root/.gradle + working_dir: /app + command: ./gradle/bin/gradle runClient --no-daemon + +volumes: + gradle-cache: diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..339c413 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false + +# Mod Info +mod_version=1.0.0 +mod_group_id=com.betterenderchests +mod_id=betterenderchests +mod_name=Better Ender Chests +mod_author=Vanilla +mod_description=Adds tiered Ender Chests with massive storage capacity! + +# Minecraft & NeoForge +minecraft_version=1.21.1 +minecraft_version_range=[1.21.1,1.22) +neo_version=21.1.80 +neo_version_range=[21.1.0,21.2) +loader_version_range=[4,) + +# Parchment Mappings +parchment_minecraft_version=1.21.1 +parchment_mappings_version=2024.11.17 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..9657825 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + maven { url = 'https://maven.neoforged.net/releases' } + gradlePluginPortal() + mavenCentral() + } +} + +rootProject.name = 'betterenderchests' diff --git a/src/main/java/com/betterenderchests/BetterEnderChests.java b/src/main/java/com/betterenderchests/BetterEnderChests.java new file mode 100644 index 0000000..668b7ec --- /dev/null +++ b/src/main/java/com/betterenderchests/BetterEnderChests.java @@ -0,0 +1,22 @@ +package com.betterenderchests; + +import com.betterenderchests.block.ModBlockEntities; +import com.betterenderchests.block.ModBlocks; +import com.betterenderchests.item.ModCreativeTabs; +import com.betterenderchests.item.ModItems; +import com.betterenderchests.menu.ModMenus; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; + +@Mod(BetterEnderChests.MOD_ID) +public class BetterEnderChests { + public static final String MOD_ID = "betterenderchests"; + + public BetterEnderChests(IEventBus modEventBus) { + ModBlocks.register(modEventBus); + ModBlockEntities.register(modEventBus); + ModItems.register(modEventBus); + ModMenus.register(modEventBus); + ModCreativeTabs.register(modEventBus); + } +} diff --git a/src/main/java/com/betterenderchests/block/ModBlockEntities.java b/src/main/java/com/betterenderchests/block/ModBlockEntities.java new file mode 100644 index 0000000..58b901d --- /dev/null +++ b/src/main/java/com/betterenderchests/block/ModBlockEntities.java @@ -0,0 +1,30 @@ +package com.betterenderchests.block; + +import com.betterenderchests.BetterEnderChests; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; + +public class ModBlockEntities { + public static final DeferredRegister> BLOCK_ENTITIES = + DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, BetterEnderChests.MOD_ID); + + public static final Supplier> TIERED_ENDER_CHEST = + BLOCK_ENTITIES.register("tiered_ender_chest", () -> + BlockEntityType.Builder.of( + (pos, state) -> new TieredEnderChestBlockEntity(pos, state, 27), + ModBlocks.COPPER_ENDER_CHEST.get(), + ModBlocks.IRON_ENDER_CHEST.get(), + ModBlocks.GOLD_ENDER_CHEST.get(), + ModBlocks.DIAMOND_ENDER_CHEST.get(), + ModBlocks.NETHERITE_ENDER_CHEST.get(), + ModBlocks.DRAGON_ENDER_CHEST.get() + ).build(null)); + + public static void register(IEventBus eventBus) { + BLOCK_ENTITIES.register(eventBus); + } +} diff --git a/src/main/java/com/betterenderchests/block/ModBlocks.java b/src/main/java/com/betterenderchests/block/ModBlocks.java new file mode 100644 index 0000000..9abc1fb --- /dev/null +++ b/src/main/java/com/betterenderchests/block/ModBlocks.java @@ -0,0 +1,44 @@ +package com.betterenderchests.block; + +import com.betterenderchests.BetterEnderChests; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredRegister; + +public class ModBlocks { + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(BetterEnderChests.MOD_ID); + + // Tiered Ender Chests + public static final DeferredBlock COPPER_ENDER_CHEST = BLOCKS.registerBlock("copper_ender_chest", + props -> new TieredEnderChestBlock(props, 27), // 1 row + BlockBehaviour.Properties.ofFullCopy(Blocks.ENDER_CHEST).sound(SoundType.COPPER)); + + public static final DeferredBlock IRON_ENDER_CHEST = BLOCKS.registerBlock("iron_ender_chest", + props -> new TieredEnderChestBlock(props, 54), // 2 rows + BlockBehaviour.Properties.ofFullCopy(Blocks.ENDER_CHEST).sound(SoundType.METAL)); + + public static final DeferredBlock GOLD_ENDER_CHEST = BLOCKS.registerBlock("gold_ender_chest", + props -> new TieredEnderChestBlock(props, 81), // 3 rows + BlockBehaviour.Properties.ofFullCopy(Blocks.ENDER_CHEST).sound(SoundType.METAL)); + + public static final DeferredBlock DIAMOND_ENDER_CHEST = BLOCKS.registerBlock("diamond_ender_chest", + props -> new TieredEnderChestBlock(props, 108), // 4 rows + BlockBehaviour.Properties.ofFullCopy(Blocks.ENDER_CHEST).sound(SoundType.METAL)); + + public static final DeferredBlock NETHERITE_ENDER_CHEST = BLOCKS.registerBlock("netherite_ender_chest", + props -> new TieredEnderChestBlock(props, 135), // 5 rows + BlockBehaviour.Properties.ofFullCopy(Blocks.NETHERITE_BLOCK).sound(SoundType.NETHERITE_BLOCK)); + + // Dragon Breath Ender Chest - Massive storage + public static final DeferredBlock DRAGON_ENDER_CHEST = BLOCKS.registerBlock("dragon_ender_chest", + props -> new TieredEnderChestBlock(props, 2000), // 10^1024 concept - using large GUI instead + BlockBehaviour.Properties.ofFullCopy(Blocks.OBSIDIAN).strength(50f, 1200f).sound(SoundType.STONE)); + + public static void register(IEventBus eventBus) { + BLOCKS.register(eventBus); + } +} diff --git a/src/main/java/com/betterenderchests/block/TieredEnderChestBlock.java b/src/main/java/com/betterenderchests/block/TieredEnderChestBlock.java new file mode 100644 index 0000000..44414c7 --- /dev/null +++ b/src/main/java/com/betterenderchests/block/TieredEnderChestBlock.java @@ -0,0 +1,111 @@ +package com.betterenderchests.block; + +import com.betterenderchests.menu.TieredEnderChestMenu; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.*; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.*; +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.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; + +public class TieredEnderChestBlock extends BaseEntityBlock { + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + protected static final VoxelShape SHAPE = Block.box(1.0, 0.0, 1.0, 15.0, 14.0, 15.0); + + private final int inventorySize; + private final Component containerTitle; + + public TieredEnderChestBlock(Properties properties, int inventorySize) { + super(properties); + this.inventorySize = inventorySize; + this.containerTitle = Component.translatable("container.ender_chest"); + this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH)); + } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + protected RenderShape getRenderShape(BlockState state) { + return RenderShape.ENTITYBLOCK_ANIMATED; + } + + @Override + protected BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hit) { + if (level.isClientSide) { + return InteractionResult.SUCCESS; + } else { + player.openMenu(state.getMenuProvider(level, pos)); + player.awardStat(Stats.OPEN_ENDERCHEST); + return InteractionResult.CONSUME; + } + } + + @Nullable + @Override + protected MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) { + return new SimpleMenuProvider((containerId, playerInventory, player) -> + new TieredEnderChestMenu(containerId, playerInventory, inventorySize), containerTitle); + } + + @Override + protected BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + protected BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) { + return super.updateShape(state, direction, neighborState, level, pos, neighborPos); + } + + @Override + protected boolean isPathfindable(BlockState state, PathComputationType type) { + return false; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new TieredEnderChestBlockEntity(pos, state, inventorySize); + } + + public int getInventorySize() { + return inventorySize; + } +} diff --git a/src/main/java/com/betterenderchests/block/TieredEnderChestBlockEntity.java b/src/main/java/com/betterenderchests/block/TieredEnderChestBlockEntity.java new file mode 100644 index 0000000..1342c77 --- /dev/null +++ b/src/main/java/com/betterenderchests/block/TieredEnderChestBlockEntity.java @@ -0,0 +1,18 @@ +package com.betterenderchests.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class TieredEnderChestBlockEntity extends BlockEntity { + private final int inventorySize; + + public TieredEnderChestBlockEntity(BlockPos pos, BlockState state, int inventorySize) { + super(ModBlockEntities.TIERED_ENDER_CHEST.get(), pos, state); + this.inventorySize = inventorySize; + } + + public int getInventorySize() { + return inventorySize; + } +} diff --git a/src/main/java/com/betterenderchests/item/ModCreativeTabs.java b/src/main/java/com/betterenderchests/item/ModCreativeTabs.java new file mode 100644 index 0000000..8a2ddff --- /dev/null +++ b/src/main/java/com/betterenderchests/item/ModCreativeTabs.java @@ -0,0 +1,44 @@ +package com.betterenderchests.item; + +import com.betterenderchests.BetterEnderChests; +import com.betterenderchests.block.ModBlocks; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; + +public class ModCreativeTabs { + public static final DeferredRegister CREATIVE_MODE_TABS = + DeferredRegister.create(Registries.CREATIVE_MODE_TAB, BetterEnderChests.MOD_ID); + + public static final Supplier BETTER_ENDER_CHESTS_TAB = CREATIVE_MODE_TABS.register("betterenderchests_tab", + () -> CreativeModeTab.builder() + .title(Component.translatable("itemGroup.betterenderchests")) + .icon(() -> new ItemStack(ModBlocks.DIAMOND_ENDER_CHEST.get())) + .displayItems((parameters, output) -> { + // Blocks + output.accept(ModBlocks.COPPER_ENDER_CHEST.get()); + output.accept(ModBlocks.IRON_ENDER_CHEST.get()); + output.accept(ModBlocks.GOLD_ENDER_CHEST.get()); + output.accept(ModBlocks.DIAMOND_ENDER_CHEST.get()); + output.accept(ModBlocks.NETHERITE_ENDER_CHEST.get()); + output.accept(ModBlocks.DRAGON_ENDER_CHEST.get()); + + // Portable Items + output.accept(ModItems.PORTABLE_COPPER_ENDER_CHEST.get()); + output.accept(ModItems.PORTABLE_IRON_ENDER_CHEST.get()); + output.accept(ModItems.PORTABLE_GOLD_ENDER_CHEST.get()); + output.accept(ModItems.PORTABLE_DIAMOND_ENDER_CHEST.get()); + output.accept(ModItems.PORTABLE_NETHERITE_ENDER_CHEST.get()); + output.accept(ModItems.PORTABLE_DRAGON_ENDER_CHEST.get()); + }) + .build()); + + public static void register(IEventBus eventBus) { + CREATIVE_MODE_TABS.register(eventBus); + } +} diff --git a/src/main/java/com/betterenderchests/item/ModItems.java b/src/main/java/com/betterenderchests/item/ModItems.java new file mode 100644 index 0000000..e972816 --- /dev/null +++ b/src/main/java/com/betterenderchests/item/ModItems.java @@ -0,0 +1,39 @@ +package com.betterenderchests.item; + +import com.betterenderchests.BetterEnderChests; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; + +public class ModItems { + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(BetterEnderChests.MOD_ID); + + // Portable Ender Chests (Handheld versions) + public static final DeferredItem PORTABLE_COPPER_ENDER_CHEST = ITEMS.registerItem( + "portable_copper_ender_chest", + props -> new PortableEnderChestItem(props, 27)); + + public static final DeferredItem PORTABLE_IRON_ENDER_CHEST = ITEMS.registerItem( + "portable_iron_ender_chest", + props -> new PortableEnderChestItem(props, 54)); + + public static final DeferredItem PORTABLE_GOLD_ENDER_CHEST = ITEMS.registerItem( + "portable_gold_ender_chest", + props -> new PortableEnderChestItem(props, 81)); + + public static final DeferredItem PORTABLE_DIAMOND_ENDER_CHEST = ITEMS.registerItem( + "portable_diamond_ender_chest", + props -> new PortableEnderChestItem(props, 108)); + + public static final DeferredItem PORTABLE_NETHERITE_ENDER_CHEST = ITEMS.registerItem( + "portable_netherite_ender_chest", + props -> new PortableEnderChestItem(props, 135).fireResistant()); + + public static final DeferredItem PORTABLE_DRAGON_ENDER_CHEST = ITEMS.registerItem( + "portable_dragon_ender_chest", + props -> new PortableEnderChestItem(props, 2000).fireResistant()); + + public static void register(IEventBus eventBus) { + ITEMS.register(eventBus); + } +} diff --git a/src/main/java/com/betterenderchests/item/PortableEnderChestItem.java b/src/main/java/com/betterenderchests/item/PortableEnderChestItem.java new file mode 100644 index 0000000..cf9cba5 --- /dev/null +++ b/src/main/java/com/betterenderchests/item/PortableEnderChestItem.java @@ -0,0 +1,47 @@ +package com.betterenderchests.item; + +import com.betterenderchests.menu.TieredEnderChestMenu; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class PortableEnderChestItem extends Item { + private final int inventorySize; + private final Component containerTitle; + + public PortableEnderChestItem(Properties properties, int inventorySize) { + super(properties.stacksTo(1)); + this.inventorySize = inventorySize; + this.containerTitle = Component.translatable("container.ender_chest"); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (!level.isClientSide && player instanceof ServerPlayer serverPlayer) { + player.openMenu(new SimpleMenuProvider( + (containerId, playerInventory, p) -> + new TieredEnderChestMenu(containerId, playerInventory, inventorySize), + containerTitle + )); + player.awardStat(Stats.OPEN_ENDERCHEST); + } + + return InteractionResultHolder.sidedSuccess(stack, level.isClientSide); + } + + public int getInventorySize() { + return inventorySize; + } +} diff --git a/src/main/java/com/betterenderchests/menu/ModMenus.java b/src/main/java/com/betterenderchests/menu/ModMenus.java new file mode 100644 index 0000000..c08ab71 --- /dev/null +++ b/src/main/java/com/betterenderchests/menu/ModMenus.java @@ -0,0 +1,23 @@ +package com.betterenderchests.menu; + +import com.betterenderchests.BetterEnderChests; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.inventory.MenuType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; + +public class ModMenus { + public static final DeferredRegister> MENUS = + DeferredRegister.create(Registries.MENU, BetterEnderChests.MOD_ID); + + public static final Supplier> TIERED_ENDER_CHEST = MENUS.register( + "tiered_ender_chest", + () -> IMenuTypeExtension.create(TieredEnderChestMenu::new)); + + public static void register(IEventBus eventBus) { + MENUS.register(eventBus); + } +} diff --git a/src/main/java/com/betterenderchests/menu/TieredEnderChestMenu.java b/src/main/java/com/betterenderchests/menu/TieredEnderChestMenu.java new file mode 100644 index 0000000..afb350c --- /dev/null +++ b/src/main/java/com/betterenderchests/menu/TieredEnderChestMenu.java @@ -0,0 +1,100 @@ +package com.betterenderchests.menu; + +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; + +public class TieredEnderChestMenu extends AbstractContainerMenu { + private final Container container; + private final int containerRows; + private final int containerCols = 9; + + public TieredEnderChestMenu(int containerId, Inventory playerInventory) { + this(containerId, playerInventory, 27); // Default 3 rows + } + + public TieredEnderChestMenu(int containerId, Inventory playerInventory, int size) { + this(containerId, playerInventory, new SimpleContainer(size), size); + } + + public TieredEnderChestMenu(int containerId, Inventory playerInventory, Container container, int size) { + super(ModMenus.TIERED_ENDER_CHEST.get(), containerId); + this.container = container; + this.containerRows = size / 9; + + checkContainerSize(container, size); + container.startOpen(playerInventory.player); + + // Container inventory slots + int slotY = 17; + for (int row = 0; row < containerRows; row++) { + for (int col = 0; col < 9; col++) { + this.addSlot(new Slot(container, col + row * 9, 8 + col * 18, slotY + row * 18)); + } + } + + // Player inventory slots + int playerInventoryY = slotY + containerRows * 18 + 14; + for (int row = 0; row < 3; row++) { + for (int col = 0; col < 9; col++) { + this.addSlot(new Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, playerInventoryY + row * 18)); + } + } + + // Player hotbar slots + int hotbarY = playerInventoryY + 58; + for (int col = 0; col < 9; col++) { + this.addSlot(new Slot(playerInventory, col, 8 + col * 18, hotbarY)); + } + } + + @Override + public boolean stillValid(Player player) { + return this.container.stillValid(player); + } + + @Override + public ItemStack quickMoveStack(Player player, int index) { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.slots.get(index); + + if (slot.hasItem()) { + ItemStack slotStack = slot.getItem(); + itemstack = slotStack.copy(); + + if (index < this.containerRows * 9) { + if (!this.moveItemStackTo(slotStack, this.containerRows * 9, this.slots.size(), true)) { + return ItemStack.EMPTY; + } + } else if (!this.moveItemStackTo(slotStack, 0, this.containerRows * 9, false)) { + return ItemStack.EMPTY; + } + + if (slotStack.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + } + + return itemstack; + } + + @Override + public void removed(Player player) { + super.removed(player); + this.container.stopOpen(player); + } + + public Container getContainer() { + return container; + } + + public int getRowCount() { + return containerRows; + } +} diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..5ada525 --- /dev/null +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,24 @@ +modLoader="javafml" +loaderVersion="${loader_version_range}" +license="MIT" + +[[mods]] +modId="${mod_id}" +version="${mod_version}" +displayName="${mod_name}" +authors="${mod_authors}" +description='''${mod_description}''' + +[[dependencies.${mod_id}]] +modId="neoforge" +type="required" +versionRange="${neo_version_range}" +ordering="NONE" +side="BOTH" + +[[dependencies.${mod_id}]] +modId="minecraft" +type="required" +versionRange="${minecraft_version_range}" +ordering="NONE" +side="BOTH" diff --git a/src/main/resources/assets/betterenderchests/blockstates/copper_ender_chest.json b/src/main/resources/assets/betterenderchests/blockstates/copper_ender_chest.json new file mode 100644 index 0000000..091fdb1 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/blockstates/copper_ender_chest.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "betterenderchests:block/copper_ender_chest" }, + "facing=south": { "model": "betterenderchests:block/copper_ender_chest", "y": 180 }, + "facing=west": { "model": "betterenderchests:block/copper_ender_chest", "y": 270 }, + "facing=east": { "model": "betterenderchests:block/copper_ender_chest", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterenderchests/blockstates/diamond_ender_chest.json b/src/main/resources/assets/betterenderchests/blockstates/diamond_ender_chest.json new file mode 100644 index 0000000..19614a8 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/blockstates/diamond_ender_chest.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "betterenderchests:block/diamond_ender_chest" }, + "facing=south": { "model": "betterenderchests:block/diamond_ender_chest", "y": 180 }, + "facing=west": { "model": "betterenderchests:block/diamond_ender_chest", "y": 270 }, + "facing=east": { "model": "betterenderchests:block/diamond_ender_chest", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterenderchests/blockstates/dragon_ender_chest.json b/src/main/resources/assets/betterenderchests/blockstates/dragon_ender_chest.json new file mode 100644 index 0000000..aa5331c --- /dev/null +++ b/src/main/resources/assets/betterenderchests/blockstates/dragon_ender_chest.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "betterenderchests:block/dragon_ender_chest" }, + "facing=south": { "model": "betterenderchests:block/dragon_ender_chest", "y": 180 }, + "facing=west": { "model": "betterenderchests:block/dragon_ender_chest", "y": 270 }, + "facing=east": { "model": "betterenderchests:block/dragon_ender_chest", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterenderchests/blockstates/gold_ender_chest.json b/src/main/resources/assets/betterenderchests/blockstates/gold_ender_chest.json new file mode 100644 index 0000000..c93ddc5 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/blockstates/gold_ender_chest.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "betterenderchests:block/gold_ender_chest" }, + "facing=south": { "model": "betterenderchests:block/gold_ender_chest", "y": 180 }, + "facing=west": { "model": "betterenderchests:block/gold_ender_chest", "y": 270 }, + "facing=east": { "model": "betterenderchests:block/gold_ender_chest", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterenderchests/blockstates/iron_ender_chest.json b/src/main/resources/assets/betterenderchests/blockstates/iron_ender_chest.json new file mode 100644 index 0000000..9d648b8 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/blockstates/iron_ender_chest.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "betterenderchests:block/iron_ender_chest" }, + "facing=south": { "model": "betterenderchests:block/iron_ender_chest", "y": 180 }, + "facing=west": { "model": "betterenderchests:block/iron_ender_chest", "y": 270 }, + "facing=east": { "model": "betterenderchests:block/iron_ender_chest", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterenderchests/blockstates/netherite_ender_chest.json b/src/main/resources/assets/betterenderchests/blockstates/netherite_ender_chest.json new file mode 100644 index 0000000..8e35d90 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/blockstates/netherite_ender_chest.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "betterenderchests:block/netherite_ender_chest" }, + "facing=south": { "model": "betterenderchests:block/netherite_ender_chest", "y": 180 }, + "facing=west": { "model": "betterenderchests:block/netherite_ender_chest", "y": 270 }, + "facing=east": { "model": "betterenderchests:block/netherite_ender_chest", "y": 90 } + } +} diff --git a/src/main/resources/assets/betterenderchests/lang/en_us.json b/src/main/resources/assets/betterenderchests/lang/en_us.json new file mode 100644 index 0000000..d71d125 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/lang/en_us.json @@ -0,0 +1,19 @@ +{ + "block.betterenderchests.copper_ender_chest": "Copper Ender Chest", + "block.betterenderchests.iron_ender_chest": "Iron Ender Chest", + "block.betterenderchests.gold_ender_chest": "Gold Ender Chest", + "block.betterenderchests.diamond_ender_chest": "Diamond Ender Chest", + "block.betterenderchests.netherite_ender_chest": "Netherite Ender Chest", + "block.betterenderchests.dragon_ender_chest": "Dragon Ender Chest", + + "item.betterenderchests.portable_copper_ender_chest": "Portable Copper Ender Chest", + "item.betterenderchests.portable_iron_ender_chest": "Portable Iron Ender Chest", + "item.betterenderchests.portable_gold_ender_chest": "Portable Gold Ender Chest", + "item.betterenderchests.portable_diamond_ender_chest": "Portable Diamond Ender Chest", + "item.betterenderchests.portable_netherite_ender_chest": "Portable Netherite Ender Chest", + "item.betterenderchests.portable_dragon_ender_chest": "Portable Dragon Ender Chest", + + "container.betterenderchests.tiered_ender_chest": "Ender Chest", + + "itemGroup.betterenderchests": "Better Ender Chests" +} diff --git a/src/main/resources/assets/betterenderchests/models/block/copper_ender_chest.json b/src/main/resources/assets/betterenderchests/models/block/copper_ender_chest.json new file mode 100644 index 0000000..70188c9 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/block/copper_ender_chest.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/ender_chest", + "textures": { + "particle": "minecraft:block/copper_block", + "bottom": "betterenderchests:block/copper_ender_chest_bottom", + "top": "betterenderchests:block/copper_ender_chest_top", + "side": "betterenderchests:block/copper_ender_chest_side", + "front": "betterenderchests:block/copper_ender_chest_front" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/block/diamond_ender_chest.json b/src/main/resources/assets/betterenderchests/models/block/diamond_ender_chest.json new file mode 100644 index 0000000..2cb29a6 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/block/diamond_ender_chest.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/ender_chest", + "textures": { + "particle": "minecraft:block/diamond_block", + "bottom": "betterenderchests:block/diamond_ender_chest_bottom", + "top": "betterenderchests:block/diamond_ender_chest_top", + "side": "betterenderchests:block/diamond_ender_chest_side", + "front": "betterenderchests:block/diamond_ender_chest_front" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/block/dragon_ender_chest.json b/src/main/resources/assets/betterenderchests/models/block/dragon_ender_chest.json new file mode 100644 index 0000000..4819422 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/block/dragon_ender_chest.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/ender_chest", + "textures": { + "particle": "minecraft:block/obsidian", + "bottom": "betterenderchests:block/dragon_ender_chest_bottom", + "top": "betterenderchests:block/dragon_ender_chest_top", + "side": "betterenderchests:block/dragon_ender_chest_side", + "front": "betterenderchests:block/dragon_ender_chest_front" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/block/gold_ender_chest.json b/src/main/resources/assets/betterenderchests/models/block/gold_ender_chest.json new file mode 100644 index 0000000..152aa74 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/block/gold_ender_chest.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/ender_chest", + "textures": { + "particle": "minecraft:block/gold_block", + "bottom": "betterenderchests:block/gold_ender_chest_bottom", + "top": "betterenderchests:block/gold_ender_chest_top", + "side": "betterenderchests:block/gold_ender_chest_side", + "front": "betterenderchests:block/gold_ender_chest_front" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/block/iron_ender_chest.json b/src/main/resources/assets/betterenderchests/models/block/iron_ender_chest.json new file mode 100644 index 0000000..8aa3ef1 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/block/iron_ender_chest.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/ender_chest", + "textures": { + "particle": "minecraft:block/iron_block", + "bottom": "betterenderchests:block/iron_ender_chest_bottom", + "top": "betterenderchests:block/iron_ender_chest_top", + "side": "betterenderchests:block/iron_ender_chest_side", + "front": "betterenderchests:block/iron_ender_chest_front" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/block/netherite_ender_chest.json b/src/main/resources/assets/betterenderchests/models/block/netherite_ender_chest.json new file mode 100644 index 0000000..a824ed9 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/block/netherite_ender_chest.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/ender_chest", + "textures": { + "particle": "minecraft:block/netherite_block", + "bottom": "betterenderchests:block/netherite_ender_chest_bottom", + "top": "betterenderchests:block/netherite_ender_chest_top", + "side": "betterenderchests:block/netherite_ender_chest_side", + "front": "betterenderchests:block/netherite_ender_chest_front" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/item/copper_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/copper_ender_chest.json new file mode 100644 index 0000000..efc1abf --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/copper_ender_chest.json @@ -0,0 +1,3 @@ +{ + "parent": "betterenderchests:block/copper_ender_chest" +} diff --git a/src/main/resources/assets/betterenderchests/models/item/diamond_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/diamond_ender_chest.json new file mode 100644 index 0000000..ec013f7 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/diamond_ender_chest.json @@ -0,0 +1,3 @@ +{ + "parent": "betterenderchests:block/diamond_ender_chest" +} diff --git a/src/main/resources/assets/betterenderchests/models/item/dragon_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/dragon_ender_chest.json new file mode 100644 index 0000000..ab1058c --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/dragon_ender_chest.json @@ -0,0 +1,3 @@ +{ + "parent": "betterenderchests:block/dragon_ender_chest" +} diff --git a/src/main/resources/assets/betterenderchests/models/item/gold_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/gold_ender_chest.json new file mode 100644 index 0000000..ce2dd87 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/gold_ender_chest.json @@ -0,0 +1,3 @@ +{ + "parent": "betterenderchests:block/gold_ender_chest" +} diff --git a/src/main/resources/assets/betterenderchests/models/item/iron_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/iron_ender_chest.json new file mode 100644 index 0000000..8eca34b --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/iron_ender_chest.json @@ -0,0 +1,3 @@ +{ + "parent": "betterenderchests:block/iron_ender_chest" +} diff --git a/src/main/resources/assets/betterenderchests/models/item/netherite_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/netherite_ender_chest.json new file mode 100644 index 0000000..d1e69b3 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/netherite_ender_chest.json @@ -0,0 +1,3 @@ +{ + "parent": "betterenderchests:block/netherite_ender_chest" +} diff --git a/src/main/resources/assets/betterenderchests/models/item/portable_copper_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/portable_copper_ender_chest.json new file mode 100644 index 0000000..31876e0 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/portable_copper_ender_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterenderchests:item/portable_copper_ender_chest" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/item/portable_diamond_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/portable_diamond_ender_chest.json new file mode 100644 index 0000000..6d63229 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/portable_diamond_ender_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterenderchests:item/portable_diamond_ender_chest" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/item/portable_dragon_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/portable_dragon_ender_chest.json new file mode 100644 index 0000000..7581687 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/portable_dragon_ender_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterenderchests:item/portable_dragon_ender_chest" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/item/portable_gold_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/portable_gold_ender_chest.json new file mode 100644 index 0000000..7a229ef --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/portable_gold_ender_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterenderchests:item/portable_gold_ender_chest" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/item/portable_iron_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/portable_iron_ender_chest.json new file mode 100644 index 0000000..0731776 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/portable_iron_ender_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterenderchests:item/portable_iron_ender_chest" + } +} diff --git a/src/main/resources/assets/betterenderchests/models/item/portable_netherite_ender_chest.json b/src/main/resources/assets/betterenderchests/models/item/portable_netherite_ender_chest.json new file mode 100644 index 0000000..343d4c5 --- /dev/null +++ b/src/main/resources/assets/betterenderchests/models/item/portable_netherite_ender_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterenderchests:item/portable_netherite_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/loot_table/blocks/copper_ender_chest.json b/src/main/resources/data/betterenderchests/loot_table/blocks/copper_ender_chest.json new file mode 100644 index 0000000..7dc2fd0 --- /dev/null +++ b/src/main/resources/data/betterenderchests/loot_table/blocks/copper_ender_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "betterenderchests:copper_ender_chest" + } + ], + "rolls": 1.0 + } + ] +} diff --git a/src/main/resources/data/betterenderchests/loot_table/blocks/diamond_ender_chest.json b/src/main/resources/data/betterenderchests/loot_table/blocks/diamond_ender_chest.json new file mode 100644 index 0000000..a688237 --- /dev/null +++ b/src/main/resources/data/betterenderchests/loot_table/blocks/diamond_ender_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "betterenderchests:diamond_ender_chest" + } + ], + "rolls": 1.0 + } + ] +} diff --git a/src/main/resources/data/betterenderchests/loot_table/blocks/dragon_ender_chest.json b/src/main/resources/data/betterenderchests/loot_table/blocks/dragon_ender_chest.json new file mode 100644 index 0000000..814f132 --- /dev/null +++ b/src/main/resources/data/betterenderchests/loot_table/blocks/dragon_ender_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "betterenderchests:dragon_ender_chest" + } + ], + "rolls": 1.0 + } + ] +} diff --git a/src/main/resources/data/betterenderchests/loot_table/blocks/gold_ender_chest.json b/src/main/resources/data/betterenderchests/loot_table/blocks/gold_ender_chest.json new file mode 100644 index 0000000..05ad3df --- /dev/null +++ b/src/main/resources/data/betterenderchests/loot_table/blocks/gold_ender_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "betterenderchests:gold_ender_chest" + } + ], + "rolls": 1.0 + } + ] +} diff --git a/src/main/resources/data/betterenderchests/loot_table/blocks/iron_ender_chest.json b/src/main/resources/data/betterenderchests/loot_table/blocks/iron_ender_chest.json new file mode 100644 index 0000000..229eb3f --- /dev/null +++ b/src/main/resources/data/betterenderchests/loot_table/blocks/iron_ender_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "betterenderchests:iron_ender_chest" + } + ], + "rolls": 1.0 + } + ] +} diff --git a/src/main/resources/data/betterenderchests/loot_table/blocks/netherite_ender_chest.json b/src/main/resources/data/betterenderchests/loot_table/blocks/netherite_ender_chest.json new file mode 100644 index 0000000..cf92cfc --- /dev/null +++ b/src/main/resources/data/betterenderchests/loot_table/blocks/netherite_ender_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "betterenderchests:netherite_ender_chest" + } + ], + "rolls": 1.0 + } + ] +} diff --git a/src/main/resources/data/betterenderchests/recipe/copper_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/copper_ender_chest.json new file mode 100644 index 0000000..7398e8a --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/copper_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "CCC", + "CEC", + "CCC" + ], + "key": { + "C": { + "item": "minecraft:copper_ingot" + }, + "E": { + "item": "minecraft:ender_chest" + } + }, + "result": { + "id": "betterenderchests:copper_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/diamond_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/diamond_ender_chest.json new file mode 100644 index 0000000..cb307fc --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/diamond_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "DDD", + "DGD", + "DDD" + ], + "key": { + "D": { + "item": "minecraft:diamond" + }, + "G": { + "item": "betterenderchests:gold_ender_chest" + } + }, + "result": { + "id": "betterenderchests:diamond_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/dragon_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/dragon_ender_chest.json new file mode 100644 index 0000000..068bf8a --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/dragon_ender_chest.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "DBD", + "DND", + "OOO" + ], + "key": { + "D": { + "item": "minecraft:dragon_breath" + }, + "B": { + "item": "minecraft:dragon_head" + }, + "N": { + "item": "betterenderchests:netherite_ender_chest" + }, + "O": { + "item": "minecraft:obsidian" + } + }, + "result": { + "id": "betterenderchests:dragon_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/gold_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/gold_ender_chest.json new file mode 100644 index 0000000..e2cd8c5 --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/gold_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "GGG", + "GIG", + "GGG" + ], + "key": { + "G": { + "item": "minecraft:gold_ingot" + }, + "I": { + "item": "betterenderchests:iron_ender_chest" + } + }, + "result": { + "id": "betterenderchests:gold_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/iron_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/iron_ender_chest.json new file mode 100644 index 0000000..26e607c --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/iron_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "III", + "ICI", + "III" + ], + "key": { + "I": { + "item": "minecraft:iron_ingot" + }, + "C": { + "item": "betterenderchests:copper_ender_chest" + } + }, + "result": { + "id": "betterenderchests:iron_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/netherite_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/netherite_ender_chest.json new file mode 100644 index 0000000..661b07f --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/netherite_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "NNN", + "NDN", + "NNN" + ], + "key": { + "N": { + "item": "minecraft:netherite_ingot" + }, + "D": { + "item": "betterenderchests:diamond_ender_chest" + } + }, + "result": { + "id": "betterenderchests:netherite_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/portable_copper_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/portable_copper_ender_chest.json new file mode 100644 index 0000000..4d0c657 --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/portable_copper_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SES", + " S " + ], + "key": { + "S": { + "item": "minecraft:stick" + }, + "E": { + "item": "betterenderchests:copper_ender_chest" + } + }, + "result": { + "id": "betterenderchests:portable_copper_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/portable_diamond_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/portable_diamond_ender_chest.json new file mode 100644 index 0000000..5a6543a --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/portable_diamond_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SES", + " S " + ], + "key": { + "S": { + "item": "minecraft:stick" + }, + "E": { + "item": "betterenderchests:diamond_ender_chest" + } + }, + "result": { + "id": "betterenderchests:portable_diamond_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/portable_dragon_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/portable_dragon_ender_chest.json new file mode 100644 index 0000000..210a48c --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/portable_dragon_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SES", + " S " + ], + "key": { + "S": { + "item": "minecraft:stick" + }, + "E": { + "item": "betterenderchests:dragon_ender_chest" + } + }, + "result": { + "id": "betterenderchests:portable_dragon_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/portable_gold_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/portable_gold_ender_chest.json new file mode 100644 index 0000000..396814a --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/portable_gold_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SES", + " S " + ], + "key": { + "S": { + "item": "minecraft:stick" + }, + "E": { + "item": "betterenderchests:gold_ender_chest" + } + }, + "result": { + "id": "betterenderchests:portable_gold_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/portable_iron_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/portable_iron_ender_chest.json new file mode 100644 index 0000000..e32a22e --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/portable_iron_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SES", + " S " + ], + "key": { + "S": { + "item": "minecraft:stick" + }, + "E": { + "item": "betterenderchests:iron_ender_chest" + } + }, + "result": { + "id": "betterenderchests:portable_iron_ender_chest" + } +} diff --git a/src/main/resources/data/betterenderchests/recipe/portable_netherite_ender_chest.json b/src/main/resources/data/betterenderchests/recipe/portable_netherite_ender_chest.json new file mode 100644 index 0000000..19eaf58 --- /dev/null +++ b/src/main/resources/data/betterenderchests/recipe/portable_netherite_ender_chest.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " S ", + "SES", + " S " + ], + "key": { + "S": { + "item": "minecraft:stick" + }, + "E": { + "item": "betterenderchests:netherite_ender_chest" + } + }, + "result": { + "id": "betterenderchests:portable_netherite_ender_chest" + } +}