From 30bbd059b3ec8e0d8021a31846f2b377b14807c8 Mon Sep 17 00:00:00 2001 From: zontreck Date: Wed, 3 Jan 2024 04:14:49 -0700 Subject: [PATCH] Finish making some quality of life changes --- gradle.properties | 2 +- src/main/java/dev/zontreck/otemod/OTEMod.java | 4 + .../blocks/CompressionChamberBlock.java | 83 ++ .../dev/zontreck/otemod/blocks/ModBlocks.java | 12 + .../entity/CompressionChamberBlockEntity.java | 305 ++++++++ .../otemod/blocks/entity/ModEntities.java | 3 + .../otemod/configs/OTEServerConfig.java | 3 +- .../enchantments/FlightEnchantment.java | 6 + .../enchantments/MobEggEnchantment.java | 6 + .../zontreck/otemod/events/EventHandler.java | 18 +- .../zontreck/otemod/events/LoreHandlers.java | 25 +- .../compressor/CompressionChamberMenu.java | 158 ++++ .../compressor/CompressionChamberScreen.java | 99 +++ .../energy/screenrenderer/EnergyInfoArea.java | 6 +- .../implementation/inits/ModMenuTypes.java | 3 + .../dev/zontreck/otemod/items/ModItems.java | 13 +- .../zontreck/otemod/items/ThrownPossBall.java | 12 +- .../otemod/items/UnstableSingularity.java | 38 + .../packets/EnergySyncS2CPacket.java | 4 + .../recipe/CompressionChamberRecipe.java | 99 +++ .../zontreck/otemod/recipe/ModRecipes.java | 19 + src/main/resources/META-INF/mods.toml | 2 +- .../compressed_obsidian_block.json | 7 + .../blockstates/compression_chamber.json | 7 + .../layered_compressed_obsidian_block.json | 7 + .../resources/assets/otemod/lang/en_us.json | 9 +- .../block/compressed_obsidian_block.json | 6 + .../models/block/compression_chamber.json | 86 ++ .../layered_compressed_obsidian_block.json | 6 + .../item/compressed_obsidian_block.json | 3 + .../item/compressed_obsidian_sheet.json | 6 + .../models/item/compression_chamber.json | 3 + .../models/item/encased_singularity.json | 6 + .../layered_compressed_obsidian_block.json | 3 + .../layered_compressed_obsidian_sheet.json | 6 + .../compression_chamber/bottom_plate.png | Bin 0 -> 160 bytes .../compression_chamber/compression_lid.png | Bin 0 -> 165 bytes .../block/compression_chamber/compressor.png | Bin 0 -> 162 bytes .../block/compression_chamber/power.png | Bin 0 -> 161 bytes .../block/compression_chamber/support0.png | Bin 0 -> 126 bytes .../energized_compression_chamber.aseprite | Bin 0 -> 7005 bytes .../gui/energized_compression_chamber.png | Bin 0 -> 5813 bytes .../item/compressed_obsidian_sheet.png | Bin 0 -> 543 bytes .../tags/blocks/mineable/pickaxe.json | 5 +- .../tags/blocks/needs_diamond_tool.json | 3 +- .../otemod/dimension/resource_nether.json | 72 -- .../dimension_type/resource_nether.json | 20 - .../vaultsteel_placer_nether.json | 6 + .../data/otemod/recipes/bedrock.json | 9 + .../recipes/compressed_obsidian_block.json | 17 + .../recipes/compressed_obsidian_sheet.json | 9 + .../otemod/recipes/compression_chamber.json | 26 + .../otemod/recipes/encased_singularity.json | 20 + .../layered_compressed_obsidian_block.json | 17 + .../layered_compressed_obsidian_sheet.json | 9 + .../recipes/layered_obsidian_decompress.json | 12 + .../otemod/recipes/obsidian_decompress.json | 12 + .../otemod/recipes/stable_singularity.json | 25 +- .../otemod/recipes/tetra/seeping_bedrock.json | 20 + ...ularity.json => unstable_singularity.json} | 29 +- .../vaultsteel_oregen_nether.json | 18 + .../noise_settings/resource_nether.json | 737 ------------------ .../vaultsteel_oregen_nether.json | 23 + 63 files changed, 1256 insertions(+), 908 deletions(-) create mode 100644 src/main/java/dev/zontreck/otemod/blocks/CompressionChamberBlock.java create mode 100644 src/main/java/dev/zontreck/otemod/blocks/entity/CompressionChamberBlockEntity.java create mode 100644 src/main/java/dev/zontreck/otemod/implementation/compressor/CompressionChamberMenu.java create mode 100644 src/main/java/dev/zontreck/otemod/implementation/compressor/CompressionChamberScreen.java create mode 100644 src/main/java/dev/zontreck/otemod/items/UnstableSingularity.java create mode 100644 src/main/java/dev/zontreck/otemod/recipe/CompressionChamberRecipe.java create mode 100644 src/main/java/dev/zontreck/otemod/recipe/ModRecipes.java create mode 100644 src/main/resources/assets/otemod/blockstates/compressed_obsidian_block.json create mode 100644 src/main/resources/assets/otemod/blockstates/compression_chamber.json create mode 100644 src/main/resources/assets/otemod/blockstates/layered_compressed_obsidian_block.json create mode 100644 src/main/resources/assets/otemod/models/block/compressed_obsidian_block.json create mode 100644 src/main/resources/assets/otemod/models/block/compression_chamber.json create mode 100644 src/main/resources/assets/otemod/models/block/layered_compressed_obsidian_block.json create mode 100644 src/main/resources/assets/otemod/models/item/compressed_obsidian_block.json create mode 100644 src/main/resources/assets/otemod/models/item/compressed_obsidian_sheet.json create mode 100644 src/main/resources/assets/otemod/models/item/compression_chamber.json create mode 100644 src/main/resources/assets/otemod/models/item/encased_singularity.json create mode 100644 src/main/resources/assets/otemod/models/item/layered_compressed_obsidian_block.json create mode 100644 src/main/resources/assets/otemod/models/item/layered_compressed_obsidian_sheet.json create mode 100644 src/main/resources/assets/otemod/textures/block/compression_chamber/bottom_plate.png create mode 100644 src/main/resources/assets/otemod/textures/block/compression_chamber/compression_lid.png create mode 100644 src/main/resources/assets/otemod/textures/block/compression_chamber/compressor.png create mode 100644 src/main/resources/assets/otemod/textures/block/compression_chamber/power.png create mode 100644 src/main/resources/assets/otemod/textures/block/compression_chamber/support0.png create mode 100644 src/main/resources/assets/otemod/textures/gui/energized_compression_chamber.aseprite create mode 100644 src/main/resources/assets/otemod/textures/gui/energized_compression_chamber.png create mode 100644 src/main/resources/assets/otemod/textures/item/compressed_obsidian_sheet.png delete mode 100644 src/main/resources/data/otemod/dimension/resource_nether.json delete mode 100644 src/main/resources/data/otemod/dimension_type/resource_nether.json create mode 100644 src/main/resources/data/otemod/forge/biome_modifier/vaultsteel_placer_nether.json create mode 100644 src/main/resources/data/otemod/recipes/bedrock.json create mode 100644 src/main/resources/data/otemod/recipes/compressed_obsidian_block.json create mode 100644 src/main/resources/data/otemod/recipes/compressed_obsidian_sheet.json create mode 100644 src/main/resources/data/otemod/recipes/compression_chamber.json create mode 100644 src/main/resources/data/otemod/recipes/encased_singularity.json create mode 100644 src/main/resources/data/otemod/recipes/layered_compressed_obsidian_block.json create mode 100644 src/main/resources/data/otemod/recipes/layered_compressed_obsidian_sheet.json create mode 100644 src/main/resources/data/otemod/recipes/layered_obsidian_decompress.json create mode 100644 src/main/resources/data/otemod/recipes/obsidian_decompress.json create mode 100644 src/main/resources/data/otemod/recipes/tetra/seeping_bedrock.json rename src/main/resources/data/otemod/recipes/{singularity.json => unstable_singularity.json} (55%) create mode 100644 src/main/resources/data/otemod/worldgen/configured_feature/vaultsteel_oregen_nether.json delete mode 100644 src/main/resources/data/otemod/worldgen/noise_settings/resource_nether.json create mode 100644 src/main/resources/data/otemod/worldgen/placed_feature/vaultsteel_oregen_nether.json diff --git a/gradle.properties b/gradle.properties index 7ded52c..555cca6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -libzontreck=1.9.122023.1612 +libzontreck=1.10.010224.1940 ## Environment Properties diff --git a/src/main/java/dev/zontreck/otemod/OTEMod.java b/src/main/java/dev/zontreck/otemod/OTEMod.java index aeda38b..2608d4f 100644 --- a/src/main/java/dev/zontreck/otemod/OTEMod.java +++ b/src/main/java/dev/zontreck/otemod/OTEMod.java @@ -20,8 +20,10 @@ import dev.zontreck.otemod.implementation.CreativeModeTabs; import dev.zontreck.otemod.implementation.InventoryBackup; import dev.zontreck.otemod.implementation.Messages; import dev.zontreck.otemod.implementation.PlayerFirstJoinTag; +import dev.zontreck.otemod.implementation.compressor.CompressionChamberScreen; import dev.zontreck.otemod.implementation.vault.*; import dev.zontreck.otemod.integrations.KeyBindings; +import dev.zontreck.otemod.recipe.ModRecipes; import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.client.renderer.entity.EntityRenderers; import net.minecraft.network.chat.Component; @@ -130,6 +132,7 @@ public class OTEMod ModEntities.register(bus); ModEnchantments.register(bus); ModEntityTypes.register(bus); + ModRecipes.register(bus); //MenuInitializer.register(bus); @@ -312,6 +315,7 @@ public class OTEMod MenuScreens.register(ModMenuTypes.VAULT.get(), VaultScreen::new); MenuScreens.register(ModMenuTypes.SCRUBBER.get(), ItemScrubberScreen::new); MenuScreens.register(ModMenuTypes.MAGIC_SCRUBBER.get(), MagicalScrubberScreen::new); + MenuScreens.register(ModMenuTypes.COMPRESSION_CHAMBER.get(), CompressionChamberScreen::new); //ItemBlockRenderTypes.setRenderLayer(ModBlocks.AURORA_DOOR.get(), RenderType.translucent()); diff --git a/src/main/java/dev/zontreck/otemod/blocks/CompressionChamberBlock.java b/src/main/java/dev/zontreck/otemod/blocks/CompressionChamberBlock.java new file mode 100644 index 0000000..c3c79e3 --- /dev/null +++ b/src/main/java/dev/zontreck/otemod/blocks/CompressionChamberBlock.java @@ -0,0 +1,83 @@ +package dev.zontreck.otemod.blocks; + +import dev.zontreck.otemod.blocks.entity.CompressionChamberBlockEntity; +import dev.zontreck.otemod.blocks.entity.ModEntities; +import dev.zontreck.otemod.networking.ModMessages; +import dev.zontreck.otemod.networking.packets.EnergySyncS2CPacket; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +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.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.network.NetworkHooks; +import org.jetbrains.annotations.Nullable; + +public class CompressionChamberBlock extends BaseEntityBlock +{ + + public CompressionChamberBlock(Properties pProperties) { + super(pProperties); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new CompressionChamberBlockEntity(blockPos, blockState); + } + + @Override + public RenderShape getRenderShape(BlockState pState) { + return RenderShape.MODEL; + } + + @Override + public InteractionResult use(BlockState state, Level lvl, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) + { + if(!lvl.isClientSide()) + { + BlockEntity be = lvl.getBlockEntity(pos); + if(be instanceof CompressionChamberBlockEntity) + { + CompressionChamberBlockEntity entity = (CompressionChamberBlockEntity) be; + NetworkHooks.openScreen(((ServerPlayer)player), entity, pos); + + ModMessages.sendToPlayer(new EnergySyncS2CPacket(entity.getEnergyStorage().getEnergyStored(), entity.getBlockPos()), (ServerPlayer)player); + + }else{ + throw new IllegalStateException("Our container is missing!"); + } + } + + return InteractionResult.sidedSuccess(lvl.isClientSide); + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + if(pState.getBlock() != pNewState.getBlock()) + { + BlockEntity be = pLevel.getBlockEntity(pPos); + if(be instanceof CompressionChamberBlockEntity) + { + ((CompressionChamberBlockEntity)be).doDrop(); + } + } + + super.onRemove(pState, pLevel, pPos, pNewState, pMovedByPiston); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { + + return createTickerHelper(pBlockEntityType, ModEntities.COMPRESSION_CHAMBER.get(), CompressionChamberBlockEntity::tick); + } +} diff --git a/src/main/java/dev/zontreck/otemod/blocks/ModBlocks.java b/src/main/java/dev/zontreck/otemod/blocks/ModBlocks.java index 7a4fc9d..25356c2 100644 --- a/src/main/java/dev/zontreck/otemod/blocks/ModBlocks.java +++ b/src/main/java/dev/zontreck/otemod/blocks/ModBlocks.java @@ -90,6 +90,18 @@ public class ModBlocks { public static final RegistryObject ILUSIUM_BLOCK_I = CreativeModeTabs.addToOTEModTab(ITEMS.register("ilusium_block", () -> new BlockItem(ILUSIUM_BLOCK.get(), new Item.Properties()))); + public static final RegistryObject COMPRESSION_CHAMBER_BLOCK = BLOCKS.register("compression_chamber", ()->new CompressionChamberBlock(BlockBehaviour.Properties.copy(ModBlocks.ILUSIUM_BLOCK.get()).noOcclusion().isViewBlocking(ModBlocks::never))); + + public static final RegistryObject COMPRESSION_CHAMBER_BLOCK_I = CreativeModeTabs.addToOTEModTab(ITEMS.register("compression_chamber", ()->new BlockItem(COMPRESSION_CHAMBER_BLOCK.get(), new Item.Properties()))); + + + public static final RegistryObject COMPRESSED_OBSIDIAN_BLOCK = BLOCKS.register("compressed_obsidian_block", ()->new Block(BlockBehaviour.Properties.copy(Blocks.OBSIDIAN))); + + public static final RegistryObject COMPRESSED_OBSIDIAN_BLOCK_I = CreativeModeTabs.addToOTEModTab(ITEMS.register("compressed_obsidian_block", ()->new BlockItem(COMPRESSED_OBSIDIAN_BLOCK.get(), new Item.Properties()))); + public static final RegistryObject LAYERED_COMPRESSED_OBSIDIAN_BLOCK = BLOCKS.register("layered_compressed_obsidian_block", ()->new Block(BlockBehaviour.Properties.copy(Blocks.OBSIDIAN))); + + public static final RegistryObject LAYERED_COMPRESSED_OBSIDIAN_BLOCK_I = CreativeModeTabs.addToOTEModTab(ITEMS.register("layered_compressed_obsidian_block", ()->new BlockItem(LAYERED_COMPRESSED_OBSIDIAN_BLOCK.get(), new Item.Properties()))); + diff --git a/src/main/java/dev/zontreck/otemod/blocks/entity/CompressionChamberBlockEntity.java b/src/main/java/dev/zontreck/otemod/blocks/entity/CompressionChamberBlockEntity.java new file mode 100644 index 0000000..2754ebc --- /dev/null +++ b/src/main/java/dev/zontreck/otemod/blocks/entity/CompressionChamberBlockEntity.java @@ -0,0 +1,305 @@ +package dev.zontreck.otemod.blocks.entity; + +import dev.zontreck.otemod.implementation.OutputItemStackHandler; +import dev.zontreck.otemod.implementation.compressor.CompressionChamberMenu; +import dev.zontreck.otemod.implementation.energy.OTEEnergy; +import dev.zontreck.otemod.networking.ModMessages; +import dev.zontreck.otemod.networking.packets.EnergySyncS2CPacket; +import dev.zontreck.otemod.recipe.CompressionChamberRecipe; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.Containers; +import net.minecraft.world.MenuProvider; +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.ContainerData; +import net.minecraft.world.inventory.SimpleContainerData; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.EnergyStorage; +import net.minecraftforge.energy.IEnergyStorage; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; + +import javax.annotation.Nullable; +import java.util.Optional; + +public class CompressionChamberBlockEntity extends BlockEntity implements MenuProvider +{ + + public CompressionChamberBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(ModEntities.COMPRESSION_CHAMBER.get(), pPos, pBlockState); + + outputSlot = new OutputItemStackHandler(outputItems); + data = new ContainerData() { + @Override + public int get(int i) { + return switch (i){ + case 0 -> CompressionChamberBlockEntity.this.progress; + default -> 0; + }; + } + + @Override + public void set(int i, int i1) { + switch(i) + { + case 0->CompressionChamberBlockEntity.this.progress = i1; + } + } + + @Override + public int getCount() { + return 1; + } + }; + } + + protected final ContainerData data; + protected int progress=0; + + public static final int MAXIMUM_PROCESSING_TICKS = 750; + + protected final ItemStackHandler itemsHandler = new ItemStackHandler(1){ + @Override + protected void onContentsChanged(int slot) + { + setChanged(); + } + }; + protected final ItemStackHandler outputItems = new ItemStackHandler(1){ + @Override + protected void onContentsChanged(int slot) + { + setChanged(); + } + }; + private ItemStackHandler outputSlot; + + private final OTEEnergy ENERGY_STORAGE = new OTEEnergy(ENERGY_REQUIREMENT*3, ENERGY_REQUIREMENT*512) { + + @Override + public void onChanged() { + setChanged(); + + ModMessages.sendToAll(new EnergySyncS2CPacket(energy, getBlockPos())); + + } + }; + + + private static final int ENERGY_REQUIREMENT = 7500; + + private LazyOptional lazyEnergyHandler = LazyOptional.empty(); + + private LazyOptional lazyItemHandler = LazyOptional.empty(); + private LazyOptional lazyOutputItems = LazyOptional.empty(); + + + @Override + public Component getDisplayName() { + return Component.literal("Compression Chamber"); + } + + @Override + @Nullable + public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { + return new CompressionChamberMenu(id, inv, this, this.data); + } + + + @Override + public LazyOptional getCapability(Capability cap, Direction side) + { + if(cap == ForgeCapabilities.ENERGY) + { + return lazyEnergyHandler.cast(); + } + if(side == Direction.DOWN && cap == ForgeCapabilities.ITEM_HANDLER) + { + // Return the output slot only + return lazyOutputItems.cast(); + } + if(cap == ForgeCapabilities.ITEM_HANDLER) + { + return lazyItemHandler.cast(); + } + + return super.getCapability(cap,side); + } + + + @Override + public void onLoad() + { + super.onLoad(); + lazyItemHandler = LazyOptional.of(()->itemsHandler); + lazyOutputItems = LazyOptional.of(()->outputSlot); + lazyEnergyHandler = LazyOptional.of(()->ENERGY_STORAGE); + } + + + @Override + public void invalidateCaps() + { + super.invalidateCaps(); + lazyItemHandler.invalidate(); + lazyOutputItems.invalidate(); + lazyEnergyHandler.invalidate(); + } + + @Override + protected void saveAdditional(CompoundTag nbt) + { + nbt.put("inventory", itemsHandler.serializeNBT()); + nbt.put("output", outputItems.serializeNBT()); + nbt.putInt("prog", progress); + nbt.putInt("energy", ENERGY_STORAGE.getEnergyStored()); + + super.saveAdditional(nbt); + } + + @Override + public void load(CompoundTag nbt){ + super.load(nbt); + + itemsHandler.deserializeNBT(nbt.getCompound("inventory")); + outputItems.deserializeNBT(nbt.getCompound("output")); + progress = nbt.getInt("prog"); + ENERGY_STORAGE.setEnergy(nbt.getInt("energy")); + } + + public void doDrop() + { + SimpleContainer cont = new SimpleContainer(itemsHandler.getSlots()); + for (int i = 0; i < itemsHandler.getSlots(); i++) { + cont.setItem(i, itemsHandler.getStackInSlot(i)); + } + cont = new SimpleContainer(outputItems.getSlots()); + for (int i = 0; i < outputItems.getSlots(); i++) { + cont.setItem(i, outputItems.getStackInSlot(i)); + } + + Containers.dropContents(this.level, this.worldPosition, cont); + } + + + public static void tick(Level lvl, BlockPos pos, BlockState state, CompressionChamberBlockEntity entity) + { + if(lvl.isClientSide())return; + + + if(hasRecipe(entity)) + { + if(!hasEnergy(entity))return; // Halt until sufficient energy has been received + entity.progress++; + setChanged(lvl, pos, state); + drain(entity); + + if(entity.progress >= CompressionChamberBlockEntity.MAXIMUM_PROCESSING_TICKS) + { + craftItem(entity); + } + }else { + if(entity.progress>0){ + entity.resetProgress(); + setChanged(lvl, pos, state); + } + } + } + + + private static void drain(CompressionChamberBlockEntity entity) { + entity.ENERGY_STORAGE.extractEnergy(ENERGY_REQUIREMENT, false); + } + + private static boolean hasEnergy(CompressionChamberBlockEntity entity) { + return (entity.ENERGY_STORAGE.getEnergyStored() >= ENERGY_REQUIREMENT); + } + + + private static void craftItem(CompressionChamberBlockEntity entity) { + if(hasRecipe(entity)) + { + SimpleContainer inventory = new SimpleContainer(entity.itemsHandler.getSlots()); + for(int i=0;i recipe = entity.level.getRecipeManager().getRecipeFor(CompressionChamberRecipe.Type.INSTANCE, inventory, entity.level); + + ItemStack existing = entity.outputItems.getStackInSlot(0); + + if(existing.is(Items.AIR)) + { + existing = recipe.get().getResultItem(entity.level.registryAccess()); + }else + existing.setCount(recipe.get().getResultItem(entity.level.registryAccess()).getCount() + existing.getCount()); + + entity.outputItems.setStackInSlot(0, existing); + entity.itemsHandler.extractItem(0,1,false); + + + entity.resetProgress(); + } + } + + private static boolean hasRecipe(CompressionChamberBlockEntity entity) { + SimpleContainer inventory = new SimpleContainer(entity.itemsHandler.getSlots()); + for(int i=0;i recipe = entity.level.getRecipeManager().getRecipeFor(CompressionChamberRecipe.Type.INSTANCE, inventory, entity.level); + + return recipe.isPresent() && canInsertIntoOutput(output, recipe.get().getResultItem(entity.level.registryAccess())); + } + + private static boolean canInsertIntoOutput(SimpleContainer inventory, ItemStack result) { + ItemStack existing = inventory.getItem(0); + boolean stackCompat = (existing.getMaxStackSize() > existing.getCount()); + boolean sameType = (existing.getItem() == result.getItem()); + boolean outputEmpty = existing.isEmpty(); + + if(outputEmpty)return true; + return (stackCompat && sameType); + } + + private void resetProgress() { + progress=0; + + } + + public IEnergyStorage getEnergyStorage() { + return ENERGY_STORAGE; + } + + public void setEnergy(int energy) { + ENERGY_STORAGE.setEnergy(energy); + } + + +} diff --git a/src/main/java/dev/zontreck/otemod/blocks/entity/ModEntities.java b/src/main/java/dev/zontreck/otemod/blocks/entity/ModEntities.java index 813b289..56cb9ad 100644 --- a/src/main/java/dev/zontreck/otemod/blocks/entity/ModEntities.java +++ b/src/main/java/dev/zontreck/otemod/blocks/entity/ModEntities.java @@ -1,6 +1,7 @@ package dev.zontreck.otemod.blocks.entity; import dev.zontreck.otemod.OTEMod; +import dev.zontreck.otemod.blocks.CompressionChamberBlock; import dev.zontreck.otemod.blocks.ModBlocks; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -19,6 +20,8 @@ public class ModEntities { public static final ResourceLocation PARALLAX_BLOCK = new ResourceLocation(OTEMod.MOD_ID, "parallax_block"); + public static final RegistryObject> COMPRESSION_CHAMBER = ENTITIES.register("compression_chamber", ()->BlockEntityType.Builder.of(CompressionChamberBlockEntity::new, ModBlocks.COMPRESSION_CHAMBER_BLOCK.get()).build(null)); + public static final RegistryObject > PARALLAX_WINDOW_ENTITY = ENTITIES.register("parallax_window", ()->BlockEntityType.Builder.of(ParallaxWindowEntity::new, ModBlocks.LIMINAL_WINDOW.get()).build(null)); diff --git a/src/main/java/dev/zontreck/otemod/configs/OTEServerConfig.java b/src/main/java/dev/zontreck/otemod/configs/OTEServerConfig.java index 5e1251e..bd5f140 100644 --- a/src/main/java/dev/zontreck/otemod/configs/OTEServerConfig.java +++ b/src/main/java/dev/zontreck/otemod/configs/OTEServerConfig.java @@ -37,6 +37,7 @@ public class OTEServerConfig { public static final ForgeConfigSpec.ConfigValue GIVE_KIT_EVERY_CHANGE; + public static final ForgeConfigSpec.ConfigValue DEBUG; static { List defaultExcludeDimensions = new ArrayList(); @@ -44,6 +45,7 @@ public class OTEServerConfig { defaultExcludeDimensions.add("minecraft:the_end"); // Excluded due to End Crystals BUILDER.push("OTE"); + DEBUG = BUILDER.comment("Turn on debug messages in the console for all OTE functions? This could be spammy").define("debug_enabled", false); BUILDER.push("STARTERKIT"); GIVE_KIT_EVERY_CHANGE = BUILDER.comment("Enable this to give the starter kit every time it is changed, regardless of whether the player has already received that kit on their next join.").define("starter_kit_given_on_change", false); @@ -79,7 +81,6 @@ public class OTEServerConfig { defDims.add("minecraft:the_end"); defDims.add("minecraft:the_nether"); defDims.add("otemod:resource"); - defDims.add("otemod:resource_nether"); EXCLUDE_DIMS = BUILDER.comment("Dimension names (ex. minecraft:overworld) to exclude from the explosion healing events").define("exclude_dimensions", defDims); BUILDER.pop(); diff --git a/src/main/java/dev/zontreck/otemod/enchantments/FlightEnchantment.java b/src/main/java/dev/zontreck/otemod/enchantments/FlightEnchantment.java index 5be072a..cd016c3 100644 --- a/src/main/java/dev/zontreck/otemod/enchantments/FlightEnchantment.java +++ b/src/main/java/dev/zontreck/otemod/enchantments/FlightEnchantment.java @@ -72,6 +72,12 @@ public class FlightEnchantment extends Enchantment recheck((ServerPlayer)ev.getEntity()); } + + @SubscribeEvent + public static void onArmorBreak(LivingEquipmentChangeEvent ev) + { + + } } public FlightEnchantment(EquipmentSlot... slots) diff --git a/src/main/java/dev/zontreck/otemod/enchantments/MobEggEnchantment.java b/src/main/java/dev/zontreck/otemod/enchantments/MobEggEnchantment.java index acdf956..c5bad29 100644 --- a/src/main/java/dev/zontreck/otemod/enchantments/MobEggEnchantment.java +++ b/src/main/java/dev/zontreck/otemod/enchantments/MobEggEnchantment.java @@ -2,6 +2,7 @@ package dev.zontreck.otemod.enchantments; import java.util.Random; +import dev.zontreck.otemod.OTEMod; import dev.zontreck.otemod.configs.OTEServerConfig; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemStack; @@ -67,6 +68,11 @@ public class MobEggEnchantment extends Enchantment CHANCE += bias; double rng = Math.random()*100000; + + if(OTEServerConfig.DEBUG.get()) + { + OTEMod.LOGGER.info("Spawn Egg Chance (" + CHANCE + ") [" + rng + "]"); + } return (rng <= CHANCE); } } diff --git a/src/main/java/dev/zontreck/otemod/events/EventHandler.java b/src/main/java/dev/zontreck/otemod/events/EventHandler.java index 51b467e..c7dbf54 100644 --- a/src/main/java/dev/zontreck/otemod/events/EventHandler.java +++ b/src/main/java/dev/zontreck/otemod/events/EventHandler.java @@ -76,20 +76,16 @@ public class EventHandler { double num = rng.nextDouble(0,100000); if(num <= base_chance) { - ItemStack head = HeadUtilities.get(profile.username).setHoverName(ChatHelpers.macro(profile.nickname+"'s Head")); + ItemStack head = HeadUtilities.get(profile.username, "").setHoverName(ChatHelpers.macro(profile.nickname+"'s Head")); LoreContainer lore = new LoreContainer(head); - LoreEntry entry = new LoreEntry(); - entry.text = ChatHelpers.macroize("!dark_green!Player: " + profile.name_color+profile.username); - entry.bold=true; - lore.miscData.LoreData.add(entry); + LoreEntry entry = new LoreEntry.Builder().bold(true).text(ChatHelpers.macroize("!dark_green!Player: " + profile.name_color+profile.username)).build(); + lore.miscData.loreData.add(entry); - entry = new LoreEntry(); - entry.text = ChatHelpers.macroize("!Dark_Purple!Date: !Dark_Red![0]", Date.from(Instant.now()).toString()); - lore.miscData.LoreData.add(entry); + entry = new LoreEntry.Builder().text(ChatHelpers.macroize("!Dark_Purple!Date: !Dark_Red![0]", Date.from(Instant.now()).toString())).build(); + lore.miscData.loreData.add(entry); - entry = new LoreEntry(); - entry.text = ChatHelpers.macroize("!Dark_Purple!Total Deaths: !Dark_Red![0]", String.valueOf(profile.deaths)); - lore.miscData.LoreData.add(entry); + entry = new LoreEntry.Builder().text(ChatHelpers.macroize("!Dark_Purple!Total Deaths: !Dark_Red![0]", String.valueOf(profile.deaths))).build(); + lore.miscData.loreData.add(entry); lore.commitLore(); diff --git a/src/main/java/dev/zontreck/otemod/events/LoreHandlers.java b/src/main/java/dev/zontreck/otemod/events/LoreHandlers.java index 78abea2..2d18281 100644 --- a/src/main/java/dev/zontreck/otemod/events/LoreHandlers.java +++ b/src/main/java/dev/zontreck/otemod/events/LoreHandlers.java @@ -149,13 +149,7 @@ public class LoreHandlers { CompoundTag props = weaponUsed.getTag(); if(props==null)props=new CompoundTag(); CompoundTag container = props.getCompound(ItemStatTag.STATS_TAG+"_"+type.name().toLowerCase()); - LoreContainer contain; - if(container.isEmpty()) - { - contain = new LoreContainer(weaponUsed); - }else { - contain = new LoreContainer(container, weaponUsed); - } + LoreContainer contain = new LoreContainer(weaponUsed); ItemStatTag isTag; try{ @@ -166,26 +160,17 @@ public class LoreHandlers { isTag.increment(); LoreEntry entry; - if(contain.miscData.LoreData.size()==0) + if(contain.miscData.loreData.size()==0) { // Missing entry - entry = new LoreEntry(); - entry.text = ItemStatistics.makeText(isTag); - contain.miscData.LoreData.add(entry); + entry = new LoreEntry.Builder().text(ItemStatistics.makeText(isTag)).build(); + contain.miscData.loreData.add(entry); }else { - entry = contain.miscData.LoreData.get(0); // Stat is set at 0 + entry = contain.miscData.loreData.get(0); // Stat is set at 0 entry.text = ItemStatistics.makeText(isTag); } // Update item contain.commitLore(); - - // Save the misc data to the item for later - // Reinitialize the container as the contain NBT - container = new CompoundTag(); - contain.save(container); - isTag.save(container); - props.put(ItemStatTag.STATS_TAG+"_"+type.name().toLowerCase(), container); - weaponUsed.setTag(props); } } diff --git a/src/main/java/dev/zontreck/otemod/implementation/compressor/CompressionChamberMenu.java b/src/main/java/dev/zontreck/otemod/implementation/compressor/CompressionChamberMenu.java new file mode 100644 index 0000000..b21b8d9 --- /dev/null +++ b/src/main/java/dev/zontreck/otemod/implementation/compressor/CompressionChamberMenu.java @@ -0,0 +1,158 @@ +package dev.zontreck.otemod.implementation.compressor; + +import dev.zontreck.otemod.blocks.ModBlocks; +import dev.zontreck.otemod.blocks.entity.CompressionChamberBlockEntity; +import dev.zontreck.otemod.blocks.entity.ItemScrubberBlockEntity; +import dev.zontreck.otemod.blocks.entity.ModEntities; +import dev.zontreck.otemod.implementation.inits.ModMenuTypes; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.items.SlotItemHandler; + +public class CompressionChamberMenu extends AbstractContainerMenu +{ + public final CompressionChamberBlockEntity entity; + public final Level level; + public final ContainerData data; + + public CompressionChamberMenu(int id, Inventory inv, FriendlyByteBuf buf) + { + this(id, inv, inv.player.level().getBlockEntity(buf.readBlockPos()), new SimpleContainerData(1)); + } + + public CompressionChamberMenu(int id, Inventory inv, BlockEntity entity, ContainerData data) + { + super(ModMenuTypes.COMPRESSION_CHAMBER.get(), id); + + checkContainerSize(inv, 1); + + this.data=data; + this.level = entity.getLevel(); + this.entity = (CompressionChamberBlockEntity) entity; + + + addPlayerInventory(inv); + addPlayerHotbar(inv); + + this.entity.getCapability(ForgeCapabilities.ITEM_HANDLER, Direction.UP).ifPresent(handler->{ + addSlot(new SlotItemHandler(handler, 0, 34,34)); + }); + + this.entity.getCapability(ForgeCapabilities.ITEM_HANDLER, Direction.DOWN).ifPresent(handler->{ + addSlot(new SlotItemHandler(handler, 0, 113, 34)); + }); + + + addDataSlots(data); + } + + + + public boolean isCrafting() + { + return data.get(0) > 0; + } + + public int getScaledProgress() + { + if(!isCrafting())return 0; + int progress = this.data.get(0); + int max = CompressionChamberBlockEntity.MAXIMUM_PROCESSING_TICKS; + + int progressArrow = 39; + + + if(progress != 0 && max != 0) + { + int percent = progress * progressArrow / max; + return percent; + } + + return 0; + } + + + // CREDIT GOES TO: diesieben07 | https://github.com/diesieben07/SevenCommons + // must assign a slot number to each of the slots used by the GUI. + // For this container, we can see both the tile inventory's slots as well as the player inventory slots and the hotbar. + // Each time we add a Slot to the container, it automatically increases the slotIndex, which means + // 0 - 8 = hotbar slots (which will map to the InventoryPlayer slot numbers 0 - 8) + // 9 - 35 = player inventory slots (which map to the InventoryPlayer slot numbers 9 - 35) + // 36 - 44 = TileInventory slots, which map to our TileEntity slot numbers 0 - 8) + private static final int HOTBAR_SLOT_COUNT = 9; + private static final int PLAYER_INVENTORY_ROW_COUNT = 3; + private static final int PLAYER_INVENTORY_COLUMN_COUNT = 9; + private static final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_COLUMN_COUNT * PLAYER_INVENTORY_ROW_COUNT; + private static final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT; + private static final int VANILLA_FIRST_SLOT_INDEX = 0; + private static final int TE_INVENTORY_FIRST_SLOT_INDEX = VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT; + + // THIS YOU HAVE TO DEFINE! + private static final int TE_INVENTORY_SLOT_COUNT = 2; // must be the number of slots you have! + + @Override + public ItemStack quickMoveStack(Player playerIn, int index) { + Slot sourceSlot = slots.get(index); + if (sourceSlot == null || !sourceSlot.hasItem()) return ItemStack.EMPTY; //EMPTY_ITEM + ItemStack sourceStack = sourceSlot.getItem(); + ItemStack copyOfSourceStack = sourceStack.copy(); + + // Check if the slot clicked is one of the vanilla container slots + if (index < VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT) { + // This is a vanilla container slot so merge the stack into the tile inventory + if (!moveItemStackTo(sourceStack, TE_INVENTORY_FIRST_SLOT_INDEX, TE_INVENTORY_FIRST_SLOT_INDEX + + TE_INVENTORY_SLOT_COUNT, false)) { + return ItemStack.EMPTY; // EMPTY_ITEM + } + } else if (index < TE_INVENTORY_FIRST_SLOT_INDEX + TE_INVENTORY_SLOT_COUNT) { + // This is a TE slot so merge the stack into the players inventory + if (!moveItemStackTo(sourceStack, VANILLA_FIRST_SLOT_INDEX, VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT, false)) { + return ItemStack.EMPTY; + } + } else { + System.out.println("Invalid slotIndex:" + index); + return ItemStack.EMPTY; + } + // If stack size == 0 (the entire stack was moved) set slot contents to null + if (sourceStack.getCount() == 0) { + sourceSlot.set(ItemStack.EMPTY); + } else { + sourceSlot.setChanged(); + } + sourceSlot.onTake(playerIn, sourceStack); + return copyOfSourceStack; + } + + @Override + public boolean stillValid(Player player) { + return stillValid(ContainerLevelAccess.create(level, entity.getBlockPos()), player, ModBlocks.COMPRESSION_CHAMBER_BLOCK.get()); + } + + private static final int PLAYER_INVENTORY_FIRST_SLOT_HEIGHT = 85; + private static final int PLAYER_INVENTORY_FIRST_SLOT_LEFT = 11; + private static final int PLAYER_HOTBAR_FIRST_SLOT = 143; + + private void addPlayerInventory(Inventory inv) + { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 9; j++) { + this.addSlot(new Slot(inv, j+i*9+9, PLAYER_INVENTORY_FIRST_SLOT_LEFT+j*18, PLAYER_INVENTORY_FIRST_SLOT_HEIGHT+i*18)); + } + } + } + + private void addPlayerHotbar(Inventory inv) + { + for (int index = 0; index < 9; index++) { + this.addSlot(new Slot(inv, index, PLAYER_INVENTORY_FIRST_SLOT_LEFT+index*18, PLAYER_HOTBAR_FIRST_SLOT)); + } + } +} diff --git a/src/main/java/dev/zontreck/otemod/implementation/compressor/CompressionChamberScreen.java b/src/main/java/dev/zontreck/otemod/implementation/compressor/CompressionChamberScreen.java new file mode 100644 index 0000000..4000a7e --- /dev/null +++ b/src/main/java/dev/zontreck/otemod/implementation/compressor/CompressionChamberScreen.java @@ -0,0 +1,99 @@ +package dev.zontreck.otemod.implementation.compressor; + +import com.mojang.blaze3d.systems.RenderSystem; +import dev.zontreck.otemod.OTEMod; +import dev.zontreck.otemod.implementation.MouseHelpers; +import dev.zontreck.otemod.implementation.energy.screenrenderer.EnergyInfoArea; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; + +import java.util.Optional; + +public class CompressionChamberScreen extends AbstractContainerScreen { + + + private static final ResourceLocation TEXTURE = new ResourceLocation(OTEMod.MOD_ID, "textures/gui/energized_compression_chamber.png"); + + private EnergyInfoArea EIA; + + + public CompressionChamberScreen(CompressionChamberMenu pMenu, Inventory pPlayerInventory, Component pTitle) { + super(pMenu, pPlayerInventory, pTitle); + + this.topPos=0; + this.leftPos=0; + + this.imageWidth=176; + this.imageHeight=177; + } + + @Override + protected void init() { + super.init(); + assignEnergyArea(); + } + + private void assignEnergyArea() { + int x = (width - imageWidth )/2; + int y = (height - imageHeight)/2; + + EIA = new EnergyInfoArea(x+63, y+46, menu.entity.getEnergyStorage(), 39, 6); + } + + @Override + protected void renderBg(GuiGraphics guiGraphics, float v, int i, int i1) { + + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderTexture(0, TEXTURE); + + + guiGraphics.blit(TEXTURE, this.leftPos, this.topPos, 0,0, imageWidth, imageHeight); + renderCraftingProgress(guiGraphics); + EIA.draw(guiGraphics); + } + + + @Override + protected void renderLabels(GuiGraphics stack, int mouseX, int mouseY) + { + stack.drawString(font, this.title.getString(), 32, 4, 0xFFFFFF); + + int x = (width - imageWidth )/2; + int y = (height - imageHeight)/2; + renderEnergy(stack, mouseX, mouseY, x, y); + //this.font.draw(stack, this.playerInventoryTitle.getString(), this.leftPos + 17, this.topPos + 123, 0xFFFFFF); + } + + private void renderEnergy(GuiGraphics stack, int mouseX, int mouseY, int x, int y) { + if(isMouseAbove(mouseX, mouseY, x, y, 63, 46, 39, 6)){ + stack.renderTooltip(font, EIA.getTooltips(), Optional.empty(), mouseX-x, mouseY-y); + } + } + + + private void renderCraftingProgress(GuiGraphics stack) + { + if(menu.isCrafting()) + { + stack.blit(TEXTURE, leftPos+63, topPos+34, 179, 11, menu.getScaledProgress(),6); + } + } + + @Override + public void render(GuiGraphics stack, int mouseX, int mouseY, float delta) + { + renderBackground(stack); + super.render(stack, mouseX, mouseY, delta); + renderTooltip(stack, mouseX, mouseY); + } + + private boolean isMouseAbove(int mouseX, int mouseY, int x, int y, int offsetX, int offsetY, int width, int height) + { + return MouseHelpers.isMouseOver(mouseX, mouseY, x+offsetX, y+offsetY, width, height); + } +} diff --git a/src/main/java/dev/zontreck/otemod/implementation/energy/screenrenderer/EnergyInfoArea.java b/src/main/java/dev/zontreck/otemod/implementation/energy/screenrenderer/EnergyInfoArea.java index 006a2c7..344bf7e 100644 --- a/src/main/java/dev/zontreck/otemod/implementation/energy/screenrenderer/EnergyInfoArea.java +++ b/src/main/java/dev/zontreck/otemod/implementation/energy/screenrenderer/EnergyInfoArea.java @@ -39,8 +39,12 @@ public class EnergyInfoArea extends InfoArea { @Override public void draw(GuiGraphics transform) { final int height = area.getHeight(); + final int width = area.getWidth(); int stored = (int)(height*(energy.getEnergyStored()/(float)energy.getMaxEnergyStored())); - transform.fillGradient(area.getX(), area.getY() + (height + stored), area.getX() + area.getWidth(), area.getY() + area.getHeight(), 0xff0000, 0xff550000); + + if(area.getHeight() > area.getWidth()) + transform.fillGradient(area.getX(), area.getY() + (height + stored), area.getX() + area.getWidth(), area.getY() + area.getHeight(), 0xff0000, 0xff550000); + else transform.fillGradient(area.getX() + (width + stored), area.getY(),area.getX() + area.getWidth(), area.getY() + area.getHeight(), 0xff0000, 0xff005500); } } diff --git a/src/main/java/dev/zontreck/otemod/implementation/inits/ModMenuTypes.java b/src/main/java/dev/zontreck/otemod/implementation/inits/ModMenuTypes.java index a13f55f..06dfd3d 100644 --- a/src/main/java/dev/zontreck/otemod/implementation/inits/ModMenuTypes.java +++ b/src/main/java/dev/zontreck/otemod/implementation/inits/ModMenuTypes.java @@ -1,6 +1,7 @@ package dev.zontreck.otemod.implementation.inits; import dev.zontreck.otemod.OTEMod; +import dev.zontreck.otemod.implementation.compressor.CompressionChamberMenu; import dev.zontreck.otemod.implementation.scrubber.ItemScrubberMenu; import dev.zontreck.otemod.implementation.scrubber.MagicalScrubberMenu; import dev.zontreck.otemod.implementation.vault.StarterMenu; @@ -25,6 +26,8 @@ public final class ModMenuTypes public static final RegistryObject> SCRUBBER = registerMenuType(ItemScrubberMenu::new, "item_scrubber_menu"); public static final RegistryObject> MAGIC_SCRUBBER = registerMenuType(MagicalScrubberMenu::new, "magical_scrubber_menu"); + public static final RegistryObject> COMPRESSION_CHAMBER = registerMenuType(CompressionChamberMenu::new, "compression_chamber"); + private static RegistryObject> registerMenuType(IContainerFactory factory, String name) { diff --git a/src/main/java/dev/zontreck/otemod/items/ModItems.java b/src/main/java/dev/zontreck/otemod/items/ModItems.java index 0696e6a..a968fc5 100644 --- a/src/main/java/dev/zontreck/otemod/items/ModItems.java +++ b/src/main/java/dev/zontreck/otemod/items/ModItems.java @@ -4,10 +4,7 @@ import dev.zontreck.otemod.OTEMod; import dev.zontreck.otemod.blocks.FoiledBlockItem; import dev.zontreck.otemod.entities.ModEntityTypes; import dev.zontreck.otemod.implementation.CreativeModeTabs; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.SimpleFoiledItem; +import net.minecraft.world.item.*; import net.minecraftforge.common.ForgeSpawnEggItem; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; @@ -31,7 +28,13 @@ public class ModItems { public static final RegistryObject MELTED_ENDER_PEARL = CreativeModeTabs.addToOTEModTab(ITEMS.register("melted_ender_pearl", () -> new SimpleFoiledItem(new Item.Properties().stacksTo(64)))); - public static final RegistryObject SINGULARITY = CreativeModeTabs.addToOTEModTab(ITEMS.register("singularity", () -> new Item(new Item.Properties().stacksTo(1)))); + public static final RegistryObject SINGULARITY = CreativeModeTabs.addToOTEModTab(ITEMS.register("singularity", () -> new UnstableSingularity(new Item.Properties().stacksTo(1)))); + + public static final RegistryObject COMPRESSED_OBSIDIAN_SHEET = CreativeModeTabs.addToOTEModTab(ITEMS.register("compressed_obsidian_sheet", ()->new Item(new Item.Properties()))); + + public static final RegistryObject LAYERED_COMPRESSED_OBSIDIAN_SHEET = CreativeModeTabs.addToOTEModTab(ITEMS.register("layered_compressed_obsidian_sheet", ()->new SimpleFoiledItem(new Item.Properties()))); + public static final RegistryObject ENCASED_SINGULARITY = CreativeModeTabs.addToOTEModTab(ITEMS.register("encased_singularity", ()->new SimpleFoiledItem(new Item.Properties()))); + public static final RegistryObject ETERNIUM_ROD = CreativeModeTabs.addToOTEModTab(ITEMS.register("eternium_rod", () -> new SimpleFoiledItem(new Item.Properties().stacksTo(64)))); public static final RegistryObject SCRUBBER_FRAME_PIECE = CreativeModeTabs.addToOTEModTab(ITEMS.register("scrubber_frame_piece", () -> new Item(new Item.Properties().stacksTo(64)))); public static final RegistryObject SCRUBBER_FRAME = CreativeModeTabs.addToOTEModTab(ITEMS.register("scrubber_frame", () -> new Item(new Item.Properties().stacksTo(64)))); diff --git a/src/main/java/dev/zontreck/otemod/items/ThrownPossBall.java b/src/main/java/dev/zontreck/otemod/items/ThrownPossBall.java index e68e225..b23f037 100644 --- a/src/main/java/dev/zontreck/otemod/items/ThrownPossBall.java +++ b/src/main/java/dev/zontreck/otemod/items/ThrownPossBall.java @@ -1,5 +1,6 @@ package dev.zontreck.otemod.items; +import dev.zontreck.libzontreck.chat.ChatColor; import dev.zontreck.libzontreck.lore.ExtraLore; import dev.zontreck.libzontreck.lore.LoreContainer; import dev.zontreck.libzontreck.lore.LoreEntry; @@ -86,12 +87,9 @@ public class ThrownPossBall extends ThrowableItemProjectile captured=true; LoreContainer cont = new LoreContainer(getItem()); - cont.miscData.LoreData.clear(); - LoreEntry entry = new LoreEntry(); - entry.bold = true; - entry.text = dev.zontreck.libzontreck.chat.ChatColor.doColors("!Dark_Green!Captured Mob: !Dark_Purple!" + entityName); - - cont.miscData.LoreData.add(entry); + cont.miscData.loreData.clear(); + LoreEntry entry = new LoreEntry.Builder().bold(true).text(ChatColor.doColors("!Dark_Green!Captured Mob: !Dark_Purple!" + entityName)).build(); + cont.miscData.loreData.add(entry); cont.commitLore(); @@ -136,7 +134,7 @@ public class ThrownPossBall extends ThrowableItemProjectile } LoreContainer cont = new LoreContainer(item); - cont.miscData.LoreData.clear(); + cont.miscData.loreData.clear(); cont.commitLore(); if(item.getDamageValue() == 0) diff --git a/src/main/java/dev/zontreck/otemod/items/UnstableSingularity.java b/src/main/java/dev/zontreck/otemod/items/UnstableSingularity.java new file mode 100644 index 0000000..9ac9c04 --- /dev/null +++ b/src/main/java/dev/zontreck/otemod/items/UnstableSingularity.java @@ -0,0 +1,38 @@ +package dev.zontreck.otemod.items; + +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.SimpleFoiledItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; + +public class UnstableSingularity extends SimpleFoiledItem +{ + + public UnstableSingularity(Properties pProperties) { + super(pProperties); + } + + @Override + public InteractionResult useOn(UseOnContext pContext) { + BlockState block = pContext.getLevel().getBlockState(pContext.getClickedPos()); + + if(block.getBlock().defaultDestroyTime() < 0) + { + pContext.getLevel().explode(pContext.getPlayer(), pContext.getClickedPos().getX(), pContext.getClickedPos().getY(), pContext.getClickedPos().getZ(), 16, true, Level.ExplosionInteraction.TNT); + + pContext.getLevel().setBlock(pContext.getClickedPos(), Blocks.AIR.defaultBlockState(), 0, 0); + + pContext.getItemInHand().shrink(1); + + } + + return InteractionResult.CONSUME; + + } +} diff --git a/src/main/java/dev/zontreck/otemod/networking/packets/EnergySyncS2CPacket.java b/src/main/java/dev/zontreck/otemod/networking/packets/EnergySyncS2CPacket.java index 2d5fd14..f540192 100644 --- a/src/main/java/dev/zontreck/otemod/networking/packets/EnergySyncS2CPacket.java +++ b/src/main/java/dev/zontreck/otemod/networking/packets/EnergySyncS2CPacket.java @@ -2,6 +2,7 @@ package dev.zontreck.otemod.networking.packets; import java.util.function.Supplier; +import dev.zontreck.otemod.blocks.entity.CompressionChamberBlockEntity; import dev.zontreck.otemod.blocks.entity.ItemScrubberBlockEntity; import dev.zontreck.otemod.blocks.entity.MagicalScrubberBlockEntity; import net.minecraft.client.Minecraft; @@ -42,6 +43,9 @@ public class EnergySyncS2CPacket { { entity.setEnergy(energy); } else if(Minecraft.getInstance().level.getBlockEntity(pos) instanceof MagicalScrubberBlockEntity entity) + { + entity.setEnergy(energy); + } else if(Minecraft.getInstance().level.getBlockEntity(pos) instanceof CompressionChamberBlockEntity entity) { entity.setEnergy(energy); } diff --git a/src/main/java/dev/zontreck/otemod/recipe/CompressionChamberRecipe.java b/src/main/java/dev/zontreck/otemod/recipe/CompressionChamberRecipe.java new file mode 100644 index 0000000..3da8be6 --- /dev/null +++ b/src/main/java/dev/zontreck/otemod/recipe/CompressionChamberRecipe.java @@ -0,0 +1,99 @@ +package dev.zontreck.otemod.recipe; + +import com.google.gson.JsonObject; +import dev.zontreck.otemod.OTEMod; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +public class CompressionChamberRecipe implements Recipe { + private final ResourceLocation id; + private final ItemStack output; + private final Ingredient input; + + public CompressionChamberRecipe(ResourceLocation id, ItemStack output, Ingredient input) + { + this.id=id; + this.output=output; + this.input=input; + } + + @Override + public boolean matches(SimpleContainer simpleContainer, Level level) { + if(level.isClientSide) return false; + + return input.test(simpleContainer.getItem(0)); + } + + @Override + public ItemStack assemble(SimpleContainer simpleContainer, RegistryAccess registryAccess) { + return output; + } + + @Override + public boolean canCraftInDimensions(int i, int i1) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess registryAccess) { + return output.copy(); + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public RecipeSerializer getSerializer() { + return Serializer.INSTANCE; + } + + @Override + public RecipeType getType() { + return Type.INSTANCE; + } + + public static class Type implements RecipeType { + private Type(){} + + public static final Type INSTANCE = new Type(); + public static final String ID = "compressing"; + } + + public static class Serializer implements RecipeSerializer + { + public static final Serializer INSTANCE = new Serializer(); + public static final ResourceLocation ID = new ResourceLocation(OTEMod.MOD_ID, Type.ID); + + @Override + public CompressionChamberRecipe fromJson(ResourceLocation resourceLocation, JsonObject jsonObject) { + ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(jsonObject, "output")); + + Ingredient input = Ingredient.fromJson(GsonHelper.getAsJsonObject(jsonObject, "input")); + + return new CompressionChamberRecipe(resourceLocation, output, input); + } + + @Override + public @Nullable CompressionChamberRecipe fromNetwork(ResourceLocation resourceLocation, FriendlyByteBuf friendlyByteBuf) { + ItemStack output = friendlyByteBuf.readItem(); + + Ingredient input = Ingredient.fromNetwork(friendlyByteBuf); + return new CompressionChamberRecipe(resourceLocation, output, input); + } + + @Override + public void toNetwork(FriendlyByteBuf friendlyByteBuf, CompressionChamberRecipe compressionChamberRecipe) { + friendlyByteBuf.writeItem(compressionChamberRecipe.output); + compressionChamberRecipe.input.toNetwork(friendlyByteBuf); + } + } +} diff --git a/src/main/java/dev/zontreck/otemod/recipe/ModRecipes.java b/src/main/java/dev/zontreck/otemod/recipe/ModRecipes.java new file mode 100644 index 0000000..c14c726 --- /dev/null +++ b/src/main/java/dev/zontreck/otemod/recipe/ModRecipes.java @@ -0,0 +1,19 @@ +package dev.zontreck.otemod.recipe; + +import dev.zontreck.otemod.OTEMod; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class ModRecipes { + public static final DeferredRegister> SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, OTEMod.MOD_ID); + + public static final RegistryObject> COMPRESSING_SERIALIZER = SERIALIZERS.register("compressing", ()->CompressionChamberRecipe.Serializer.INSTANCE); + + public static void register(IEventBus bus) + { + SERIALIZERS.register(bus); + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 7ac34fa..fd6697d 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -66,7 +66,7 @@ description='''${mod_description}''' [[dependencies.${mod_id}]] modId="libzontreck" mandatory=true - versionRange="[1.9,1.10)" + versionRange="[1.10,1.11)" ordering="NONE" side="BOTH" diff --git a/src/main/resources/assets/otemod/blockstates/compressed_obsidian_block.json b/src/main/resources/assets/otemod/blockstates/compressed_obsidian_block.json new file mode 100644 index 0000000..9ddc5e1 --- /dev/null +++ b/src/main/resources/assets/otemod/blockstates/compressed_obsidian_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "otemod:block/compressed_obsidian_block" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/blockstates/compression_chamber.json b/src/main/resources/assets/otemod/blockstates/compression_chamber.json new file mode 100644 index 0000000..cd35e73 --- /dev/null +++ b/src/main/resources/assets/otemod/blockstates/compression_chamber.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "otemod:block/compression_chamber" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/blockstates/layered_compressed_obsidian_block.json b/src/main/resources/assets/otemod/blockstates/layered_compressed_obsidian_block.json new file mode 100644 index 0000000..f6a7840 --- /dev/null +++ b/src/main/resources/assets/otemod/blockstates/layered_compressed_obsidian_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "otemod:block/layered_compressed_obsidian_block" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/lang/en_us.json b/src/main/resources/assets/otemod/lang/en_us.json index 0bbe9ab..7d2fa73 100644 --- a/src/main/resources/assets/otemod/lang/en_us.json +++ b/src/main/resources/assets/otemod/lang/en_us.json @@ -17,7 +17,7 @@ "item.otemod.melted_ender_pearl": "Melted Ender Pearl", "item.otemod.eternium_ingot": "Eternium Ingot", "item.otemod.eternium_rod": "Eternium Rod", - "item.otemod.singularity": "Singularity", + "item.otemod.singularity": "Unstable Singularity", "item.otemod.scrubber_frame_piece": "Scrubber Frame Component", "item.otemod.scrubber_frame": "Scrubber Frame", "item.otemod.possum_spawn_egg": "Possum Spawn Egg", @@ -39,6 +39,10 @@ "item.otemod.ilusium_dust": "Ilusium Dust", "item.otemod.ilusium_ore": "Raw Ilusium Ore", "item.otemod.empty_spawn_egg": "Empty Spawn Egg", + "item.otemod.compressed_obsidian_sheet": "Sheet of Compressed Obsidian", + "item.otemod.layered_compressed_obsidian_sheet": "Layered Sheet of Compressed Obsidian", + "item.otemod.encased_singularity": "Encased Singualrity", + "item.otemod.encased_singularity.desc": "A singularity encased in stone, ready to be further compressed into bedrock", "block.otemod.eternium_ore_block": "Eternium Ore", @@ -60,6 +64,9 @@ "block.otemod.deepslate_ilusium_ore_block": "Deepslate Ilusium Ore Block", "block.otemod.ilusium_block": "Block of Ilusium", "block.otemod.ilusium_portal": "Ilusium Portal", + "block.otemod.compression_chamber": "Compression Chamber", + "block.otemod.compressed_obsidian_block": "Block of Compressed Obsidian", + "block.otemod.layered_compressed_obsidian_block": "Layered Block of Compressed Obsidian", "enchantment.otemod.mob_egging": "Mob Egging", diff --git a/src/main/resources/assets/otemod/models/block/compressed_obsidian_block.json b/src/main/resources/assets/otemod/models/block/compressed_obsidian_block.json new file mode 100644 index 0000000..12b48b0 --- /dev/null +++ b/src/main/resources/assets/otemod/models/block/compressed_obsidian_block.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "otemod:block/compressed_obsidian_block" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/models/block/compression_chamber.json b/src/main/resources/assets/otemod/models/block/compression_chamber.json new file mode 100644 index 0000000..38266b0 --- /dev/null +++ b/src/main/resources/assets/otemod/models/block/compression_chamber.json @@ -0,0 +1,86 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "otemod:block/compression_chamber/bottom_plate", + "1": "otemod:block/compression_chamber/support0", + "2": "otemod:block/compression_chamber/power", + "3": "otemod:block/compression_chamber/compression_lid", + "4": "otemod:block/compression_chamber/compressor", + "particle": "otemod:block/compression_chamber/bottom_plate" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 1, 16], + "faces": { + "north": {"uv": [8, 0, 16, 0.5], "texture": "#0"}, + "east": {"uv": [8, 0.5, 16, 1], "texture": "#0"}, + "south": {"uv": [8, 1, 16, 1.5], "texture": "#0"}, + "west": {"uv": [8, 1.5, 16, 2], "texture": "#0"}, + "up": {"uv": [8, 8, 0, 0], "texture": "#0"}, + "down": {"uv": [8, 8, 0, 16], "texture": "#0"} + } + }, + { + "from": [7, 1, 1], + "to": [9, 6, 3], + "faces": { + "north": {"uv": [0, 0, 2, 5], "texture": "#1"}, + "east": {"uv": [2, 0, 4, 5], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 5], "texture": "#1"}, + "west": {"uv": [0, 5, 2, 10], "texture": "#1"}, + "up": {"uv": [4, 7, 2, 5], "texture": "#1"}, + "down": {"uv": [6, 5, 4, 7], "texture": "#1"} + } + }, + { + "from": [4, 4, 0], + "to": [12, 12, 1], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#2"}, + "east": {"uv": [4, 0, 4.5, 4], "texture": "#2"}, + "south": {"uv": [0, 4, 4, 8], "texture": "#2"}, + "west": {"uv": [4, 4, 4.5, 8], "texture": "#2"}, + "up": {"uv": [8.5, 0.5, 4.5, 0], "texture": "#2"}, + "down": {"uv": [8.5, 0.5, 4.5, 1], "texture": "#2"} + } + }, + { + "from": [7, 9, 1], + "to": [9, 13, 3], + "faces": { + "north": {"uv": [0, 0, 1, 2], "texture": "#1"}, + "east": {"uv": [0, 0, 1, 2], "texture": "#1"}, + "south": {"uv": [0, 0, 1, 2], "texture": "#1"}, + "west": {"uv": [0, 0, 1, 2], "texture": "#1"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#1"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#1"} + } + }, + { + "from": [2, 12, 3], + "to": [14, 13, 14], + "faces": { + "north": {"uv": [6, 0, 12, 0.5], "texture": "#3"}, + "east": {"uv": [6, 1, 11.5, 1.5], "texture": "#3"}, + "south": {"uv": [6, 0.5, 12, 1], "texture": "#3"}, + "west": {"uv": [6, 1.5, 11.5, 2], "texture": "#3"}, + "up": {"uv": [6, 5.5, 0, 0], "texture": "#3"}, + "down": {"uv": [6, 5.5, 0, 11], "texture": "#3"} + } + }, + { + "from": [3, 11, 4], + "to": [13, 12, 13], + "faces": { + "north": {"uv": [5, 0, 10, 0.5], "texture": "#4"}, + "east": {"uv": [5, 1, 9.5, 1.5], "texture": "#4"}, + "south": {"uv": [5, 0.5, 10, 1], "texture": "#4"}, + "west": {"uv": [5, 1.5, 9.5, 2], "texture": "#4"}, + "up": {"uv": [5, 4.5, 0, 0], "texture": "#4"}, + "down": {"uv": [5, 4.5, 0, 9], "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/models/block/layered_compressed_obsidian_block.json b/src/main/resources/assets/otemod/models/block/layered_compressed_obsidian_block.json new file mode 100644 index 0000000..ee18a44 --- /dev/null +++ b/src/main/resources/assets/otemod/models/block/layered_compressed_obsidian_block.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "otemod:block/layered_compressed_obsidian_block" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/models/item/compressed_obsidian_block.json b/src/main/resources/assets/otemod/models/item/compressed_obsidian_block.json new file mode 100644 index 0000000..551faf2 --- /dev/null +++ b/src/main/resources/assets/otemod/models/item/compressed_obsidian_block.json @@ -0,0 +1,3 @@ +{ + "parent": "otemod:block/compressed_obsidian_block" +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/models/item/compressed_obsidian_sheet.json b/src/main/resources/assets/otemod/models/item/compressed_obsidian_sheet.json new file mode 100644 index 0000000..ef4deef --- /dev/null +++ b/src/main/resources/assets/otemod/models/item/compressed_obsidian_sheet.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "otemod:item/compressed_obsidian_sheet" + } +} diff --git a/src/main/resources/assets/otemod/models/item/compression_chamber.json b/src/main/resources/assets/otemod/models/item/compression_chamber.json new file mode 100644 index 0000000..901cb9a --- /dev/null +++ b/src/main/resources/assets/otemod/models/item/compression_chamber.json @@ -0,0 +1,3 @@ +{ + "parent": "otemod:block/compression_chamber" +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/models/item/encased_singularity.json b/src/main/resources/assets/otemod/models/item/encased_singularity.json new file mode 100644 index 0000000..a9c4c74 --- /dev/null +++ b/src/main/resources/assets/otemod/models/item/encased_singularity.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "otemod:item/encased_singularity" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/models/item/layered_compressed_obsidian_block.json b/src/main/resources/assets/otemod/models/item/layered_compressed_obsidian_block.json new file mode 100644 index 0000000..e61f78c --- /dev/null +++ b/src/main/resources/assets/otemod/models/item/layered_compressed_obsidian_block.json @@ -0,0 +1,3 @@ +{ + "parent": "otemod:block/layered_compressed_obsidian_block" +} \ No newline at end of file diff --git a/src/main/resources/assets/otemod/models/item/layered_compressed_obsidian_sheet.json b/src/main/resources/assets/otemod/models/item/layered_compressed_obsidian_sheet.json new file mode 100644 index 0000000..e2fda7a --- /dev/null +++ b/src/main/resources/assets/otemod/models/item/layered_compressed_obsidian_sheet.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "otemod:item/layered_compressed_obsidian_sheet" + } +} diff --git a/src/main/resources/assets/otemod/textures/block/compression_chamber/bottom_plate.png b/src/main/resources/assets/otemod/textures/block/compression_chamber/bottom_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..265932b4753eb7498331731a3f16c249e20aa14e GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK^20q{977^n z-(EY&d%%E$<)CVj;+J^QxkqfD=vekYtfMk*`B~y@_l*1ubu<^VG0oO82jVWGY)b()tr7c8)yZCr>mdKI;Vst0GAXo Awg3PC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/otemod/textures/block/compression_chamber/compression_lid.png b/src/main/resources/assets/otemod/textures/block/compression_chamber/compression_lid.png new file mode 100644 index 0000000000000000000000000000000000000000..2b16ff9eb635b03bca615620c478a35f216d351d GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@?$(*977^n z-%dLyctC-JrN8IDNz(tRO9Ztq@TpiS&A+Q}p!5BZO6k$0&5wll+)<56sQSyxIDM1h zG%(JOVlg~z;cypd4}+(x KpUXO@geCx+{WsnK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/otemod/textures/block/compression_chamber/compressor.png b/src/main/resources/assets/otemod/textures/block/compression_chamber/compressor.png new file mode 100644 index 0000000000000000000000000000000000000000..e914b791c4b86d18da6d59b3066f91c897af06d2 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@*_Q6977^n z-(K0sdq9E5x%#8wOl%Tz4PYC#0h4hBzGKbLh* G2~7a0`!?nP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/otemod/textures/block/compression_chamber/support0.png b/src/main/resources/assets/otemod/textures/block/compression_chamber/support0.png new file mode 100644 index 0000000000000000000000000000000000000000..e0ebd8d1cf5b44bcf1012698d609dc6cbee50a8e GIT binary patch literal 126 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 8f39540..b8ee0ae 100644 --- a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -13,6 +13,9 @@ "otemod:ilusium_ore_block", "otemod:deepslate_ilusium_ore_block", - "otemod:ilusium_block" + "otemod:ilusium_block", + + "otemod:stable_singularity", + "otemod:compression_chamber" ] } \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/needs_diamond_tool.json b/src/main/resources/data/minecraft/tags/blocks/needs_diamond_tool.json index bafd7a2..03ed6d1 100644 --- a/src/main/resources/data/minecraft/tags/blocks/needs_diamond_tool.json +++ b/src/main/resources/data/minecraft/tags/blocks/needs_diamond_tool.json @@ -4,6 +4,7 @@ "otemod:aurora_door", "otemod:item_scrubber", "otemod:magical_scrubber", - "otemod:vault_steel_ore_block" + "otemod:vault_steel_ore_block", + "otemod:compression_chamber" ] } \ No newline at end of file diff --git a/src/main/resources/data/otemod/dimension/resource_nether.json b/src/main/resources/data/otemod/dimension/resource_nether.json deleted file mode 100644 index e05ef29..0000000 --- a/src/main/resources/data/otemod/dimension/resource_nether.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "type": "otemod:resource_nether", - "generator": { - "type": "minecraft:noise", - "settings": "otemod:resource_nether", - "biome_source": { - "type": "minecraft:multi_noise", - "biomes": [ - { - "biome": "minecraft:nether_wastes", - "parameters": { - "temperature": 0, - "humidity": 0, - "continentalness": 0, - "erosion": 0, - "weirdness": 0, - "depth": 0, - "offset": 0 - } - }, - { - "biome": "minecraft:soul_sand_valley", - "parameters": { - "temperature": 0, - "humidity": -0.5, - "continentalness": 0, - "erosion": 0, - "weirdness": 0, - "depth": 0, - "offset": 0 - } - }, - { - "biome": "minecraft:crimson_forest", - "parameters": { - "temperature": 0.4, - "humidity": 0, - "continentalness": 0, - "erosion": 0, - "weirdness": 0, - "depth": 0, - "offset": 0 - } - }, - { - "biome": "minecraft:warped_forest", - "parameters": { - "temperature": 0, - "humidity": 0.5, - "continentalness": 0, - "erosion": 0, - "weirdness": 0, - "depth": 0, - "offset": 0.375 - } - }, - { - "biome": "minecraft:basalt_deltas", - "parameters": { - "temperature": -0.5, - "humidity": 0, - "continentalness": 0, - "erosion": 0, - "weirdness": 0, - "depth": 0, - "offset": 0.175 - } - } - ] - } - } -} diff --git a/src/main/resources/data/otemod/dimension_type/resource_nether.json b/src/main/resources/data/otemod/dimension_type/resource_nether.json deleted file mode 100644 index 93ec829..0000000 --- a/src/main/resources/data/otemod/dimension_type/resource_nether.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "ultrawarm": true, - "natural": false, - "piglin_safe": true, - "respawn_anchor_works": true, - "bed_works": false, - "has_raids": false, - "has_skylight": false, - "has_ceiling": true, - "coordinate_scale": 16, - "ambient_light": 1, - "fixed_time": 1, - "logical_height": 128, - "effects": "minecraft:the_end", - "infiniburn": "#minecraft:infiniburn_nether", - "min_y": 0, - "height": 256, - "monster_spawn_light_level": 0, - "monster_spawn_block_light_limit": 0 -} diff --git a/src/main/resources/data/otemod/forge/biome_modifier/vaultsteel_placer_nether.json b/src/main/resources/data/otemod/forge/biome_modifier/vaultsteel_placer_nether.json new file mode 100644 index 0000000..ea3c538 --- /dev/null +++ b/src/main/resources/data/otemod/forge/biome_modifier/vaultsteel_placer_nether.json @@ -0,0 +1,6 @@ +{ + "type": "forge:add_features", + "features": ["otemod:vaultsteel_oregen_nether"], + "biomes": "#is_nether", + "step": "underground_ores" +} \ No newline at end of file diff --git a/src/main/resources/data/otemod/recipes/bedrock.json b/src/main/resources/data/otemod/recipes/bedrock.json new file mode 100644 index 0000000..c3afc9d --- /dev/null +++ b/src/main/resources/data/otemod/recipes/bedrock.json @@ -0,0 +1,9 @@ +{ + "type": "otemod:compressing", + "output": { + "item": "minecraft:bedrock" + }, + "input": { + "item": "otemod:encased_singularity" + } +} \ No newline at end of file diff --git a/src/main/resources/data/otemod/recipes/compressed_obsidian_block.json b/src/main/resources/data/otemod/recipes/compressed_obsidian_block.json new file mode 100644 index 0000000..4b09fb0 --- /dev/null +++ b/src/main/resources/data/otemod/recipes/compressed_obsidian_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "QQQ", + "QQQ", + "QQQ" + ], + "key": { + "Q": { + "item": "otemod:compressed_obsidian_sheet" + } + }, + "result": { + "item": "otemod:compressed_obsidian_block", + "count": 1 + } +} diff --git a/src/main/resources/data/otemod/recipes/compressed_obsidian_sheet.json b/src/main/resources/data/otemod/recipes/compressed_obsidian_sheet.json new file mode 100644 index 0000000..307f5d2 --- /dev/null +++ b/src/main/resources/data/otemod/recipes/compressed_obsidian_sheet.json @@ -0,0 +1,9 @@ +{ + "type": "otemod:compressing", + "input": { + "item": "minecraft:obsidian" + }, + "output": { + "item": "otemod:compressed_obsidian_sheet" + } +} \ No newline at end of file diff --git a/src/main/resources/data/otemod/recipes/compression_chamber.json b/src/main/resources/data/otemod/recipes/compression_chamber.json new file mode 100644 index 0000000..10c3c53 --- /dev/null +++ b/src/main/resources/data/otemod/recipes/compression_chamber.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "XXX", + "WYZ", + "ZZZ" + ], + "key": { + "W": { + "tag": "forge:ingots/gold" + }, + "X": { + "tag": "forge:ingots/ilusium" + }, + "Y": { + "item": "minecraft:copper_block" + }, + "Z": { + "item": "minecraft:obsidian" + } + }, + "result": { + "item": "otemod:compression_chamber", + "count": 1 + } +} diff --git a/src/main/resources/data/otemod/recipes/encased_singularity.json b/src/main/resources/data/otemod/recipes/encased_singularity.json new file mode 100644 index 0000000..d91b42b --- /dev/null +++ b/src/main/resources/data/otemod/recipes/encased_singularity.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "QQQ", + "QZQ", + "QQQ" + ], + "key": { + "Q": { + "tag": "forge:blocks/stone" + }, + "Z": { + "item": "otemod:stable_singularity" + } + }, + "result": { + "item": "otemod:encased_singularity", + "count": 1 + } +} diff --git a/src/main/resources/data/otemod/recipes/layered_compressed_obsidian_block.json b/src/main/resources/data/otemod/recipes/layered_compressed_obsidian_block.json new file mode 100644 index 0000000..2ab6a55 --- /dev/null +++ b/src/main/resources/data/otemod/recipes/layered_compressed_obsidian_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "QQQ", + "QQQ", + "QQQ" + ], + "key": { + "Q": { + "item": "otemod:layered_compressed_obsidian_sheet" + } + }, + "result": { + "item": "otemod:layered_compressed_obsidian_block", + "count": 1 + } +} diff --git a/src/main/resources/data/otemod/recipes/layered_compressed_obsidian_sheet.json b/src/main/resources/data/otemod/recipes/layered_compressed_obsidian_sheet.json new file mode 100644 index 0000000..719a636 --- /dev/null +++ b/src/main/resources/data/otemod/recipes/layered_compressed_obsidian_sheet.json @@ -0,0 +1,9 @@ +{ + "type": "otemod:compressing", + "output": { + "item": "otemod:layered_compressed_obsidian_sheet" + }, + "input": { + "item": "otemod:compressed_obsidian_block" + } +} \ No newline at end of file diff --git a/src/main/resources/data/otemod/recipes/layered_obsidian_decompress.json b/src/main/resources/data/otemod/recipes/layered_obsidian_decompress.json new file mode 100644 index 0000000..e8c74b2 --- /dev/null +++ b/src/main/resources/data/otemod/recipes/layered_obsidian_decompress.json @@ -0,0 +1,12 @@ +{ + "type": "mekanism:crushing", + "input": { + "ingredient": { + "item": "otemod:layered_compressed_obsidian_block" + } + }, + "output": { + "item": "otemod:compressed_obsidian_block", + "count": 9 + } +} diff --git a/src/main/resources/data/otemod/recipes/obsidian_decompress.json b/src/main/resources/data/otemod/recipes/obsidian_decompress.json new file mode 100644 index 0000000..7dda5f9 --- /dev/null +++ b/src/main/resources/data/otemod/recipes/obsidian_decompress.json @@ -0,0 +1,12 @@ +{ + "type": "mekanism:crushing", + "input": { + "ingredient": { + "item": "otemod:compressed_obsidian_block" + } + }, + "output": { + "item": "minecraft:obsidian", + "count": 9 + } +} diff --git a/src/main/resources/data/otemod/recipes/stable_singularity.json b/src/main/resources/data/otemod/recipes/stable_singularity.json index e0d31a5..95aa3f5 100644 --- a/src/main/resources/data/otemod/recipes/stable_singularity.json +++ b/src/main/resources/data/otemod/recipes/stable_singularity.json @@ -1,16 +1,9 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": ["ccc", "cbc", "ccc"], - "key": { - "c": { - "item": "minecraft:obsidian" - }, - "b": { - "item": "otemod:singularity" - } - }, - "result": { - "item": "otemod:stable_singularity", - "count": 1 - } -} +{ + "type": "otemod:compressing", + "output": { + "item": "otemod:stable_singularity" + }, + "input": { + "item": "otemod:layered_compressed_obsidian_block" + } +} \ No newline at end of file diff --git a/src/main/resources/data/otemod/recipes/tetra/seeping_bedrock.json b/src/main/resources/data/otemod/recipes/tetra/seeping_bedrock.json new file mode 100644 index 0000000..f19f69e --- /dev/null +++ b/src/main/resources/data/otemod/recipes/tetra/seeping_bedrock.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "CCC", + "CGC", + "CCC" + ], + "key": { + "C": { + "item": "minecraft:magma_block" + }, + "G": { + "item": "minecraft:bedrock" + } + }, + "result": { + "item": "tetra:seeping_bedrock", + "count": 1 + } +} diff --git a/src/main/resources/data/otemod/recipes/singularity.json b/src/main/resources/data/otemod/recipes/unstable_singularity.json similarity index 55% rename from src/main/resources/data/otemod/recipes/singularity.json rename to src/main/resources/data/otemod/recipes/unstable_singularity.json index 2bfe6d0..c0ea324 100644 --- a/src/main/resources/data/otemod/recipes/singularity.json +++ b/src/main/resources/data/otemod/recipes/unstable_singularity.json @@ -1,13 +1,16 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": ["ccc", "c c", "ccc"], - "key": { - "c": { - "item": "otemod:melted_ender_pearl" - } - }, - "result": { - "item": "otemod:singularity", - "count": 1 - } -} +{ + "type": "minecraft:crafting_shaped", + "pattern": ["cb"], + "key": { + "c": { + "item": "minecraft:feather" + }, + "b": { + "item": "otemod:stable_singularity" + } + }, + "result": { + "item": "otemod:singularity", + "count": 1 + } +} diff --git a/src/main/resources/data/otemod/worldgen/configured_feature/vaultsteel_oregen_nether.json b/src/main/resources/data/otemod/worldgen/configured_feature/vaultsteel_oregen_nether.json new file mode 100644 index 0000000..649898f --- /dev/null +++ b/src/main/resources/data/otemod/worldgen/configured_feature/vaultsteel_oregen_nether.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:scattered_ore", + "config": { + "size": 2, + "discard_chance_on_air_exposure": 1, + "targets": [ + { + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:base_stone_nether" + }, + "state": { + "Name": "otemod:nether_vault_steel_ore_block" + } + } + ] + } +} diff --git a/src/main/resources/data/otemod/worldgen/noise_settings/resource_nether.json b/src/main/resources/data/otemod/worldgen/noise_settings/resource_nether.json deleted file mode 100644 index a3b5338..0000000 --- a/src/main/resources/data/otemod/worldgen/noise_settings/resource_nether.json +++ /dev/null @@ -1,737 +0,0 @@ -{ - "sea_level": 32, - "disable_mob_generation": true, - "aquifers_enabled": true, - "ore_veins_enabled": true, - "legacy_random_source": true, - "default_block": { - "Name": "minecraft:netherrack" - }, - "default_fluid": { - "Name": "minecraft:lava", - "Properties": { - "level": "0" - } - }, - "noise": { - "min_y": 0, - "height": 128, - "size_horizontal": 1, - "size_vertical": 2 - }, - "noise_router": { - "barrier": 0, - "fluid_level_floodedness": 0, - "fluid_level_spread": 0, - "lava": 0, - "temperature": { - "type": "minecraft:shifted_noise", - "noise": "minecraft:temperature", - "xz_scale": 0.25, - "y_scale": 0, - "shift_x": "minecraft:shift_x", - "shift_y": 0, - "shift_z": "minecraft:shift_z" - }, - "vegetation": { - "type": "minecraft:shifted_noise", - "noise": "minecraft:vegetation", - "xz_scale": 0.25, - "y_scale": 0, - "shift_x": "minecraft:shift_x", - "shift_y": 0, - "shift_z": "minecraft:shift_z" - }, - "continents": 0, - "erosion": 0, - "depth": 0, - "ridges": 0, - "initial_density_without_jaggedness": 0, - "final_density": { - "type": "minecraft:squeeze", - "argument": { - "type": "minecraft:mul", - "argument1": 0.64, - "argument2": { - "type": "minecraft:interpolated", - "argument": { - "type": "minecraft:blend_density", - "argument": { - "type": "minecraft:add", - "argument1": 2.5, - "argument2": { - "type": "minecraft:mul", - "argument1": { - "type": "minecraft:y_clamped_gradient", - "from_y": -8, - "to_y": 24, - "from_value": 0, - "to_value": 1 - }, - "argument2": { - "type": "minecraft:add", - "argument1": -2.5, - "argument2": { - "type": "minecraft:add", - "argument1": 0.9375, - "argument2": { - "type": "minecraft:mul", - "argument1": { - "type": "minecraft:y_clamped_gradient", - "from_y": 104, - "to_y": 128, - "from_value": 1, - "to_value": 0 - }, - "argument2": { - "type": "minecraft:add", - "argument1": -0.9375, - "argument2": "minecraft:nether/base_3d_noise" - } - } - } - } - } - } - } - } - } - }, - "vein_toggle": 0, - "vein_ridged": 0, - "vein_gap": 0 - }, - "spawn_target": [], - "surface_rule": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:vertical_gradient", - "random_name": "minecraft:bedrock_floor", - "true_at_and_below": { - "above_bottom": 0 - }, - "false_at_and_above": { - "above_bottom": 5 - } - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:bedrock" - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:vertical_gradient", - "random_name": "minecraft:bedrock_roof", - "true_at_and_below": { - "below_top": 5 - }, - "false_at_and_above": { - "below_top": 0 - } - } - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:bedrock" - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:y_above", - "anchor": { - "below_top": 5 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": false - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:netherrack" - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [ - "minecraft:basalt_deltas" - ] - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:stone_depth", - "offset": 0, - "surface_type": "ceiling", - "add_surface_depth": true, - "secondary_depth_range": 0 - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:basalt", - "Properties": { - "axis": "y" - } - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:stone_depth", - "offset": 0, - "surface_type": "floor", - "add_surface_depth": true, - "secondary_depth_range": 0 - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:patch", - "min_threshold": -0.012, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 30 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": true - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 35 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": true - } - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:gravel" - } - } - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:nether_state_selector", - "min_threshold": 0, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:basalt", - "Properties": { - "axis": "y" - } - } - } - }, - { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:blackstone" - } - } - ] - } - } - ] - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [ - "minecraft:soul_sand_valley" - ] - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:stone_depth", - "offset": 0, - "surface_type": "ceiling", - "add_surface_depth": true, - "secondary_depth_range": 0 - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:nether_state_selector", - "min_threshold": 0, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:soul_sand" - } - } - }, - { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:soul_soil" - } - } - ] - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:stone_depth", - "offset": 0, - "surface_type": "floor", - "add_surface_depth": true, - "secondary_depth_range": 0 - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:patch", - "min_threshold": -0.012, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 30 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": true - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 35 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": true - } - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:gravel" - } - } - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:nether_state_selector", - "min_threshold": 0, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:soul_sand" - } - } - }, - { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:soul_soil" - } - } - ] - } - } - ] - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:stone_depth", - "offset": 0, - "surface_type": "floor", - "add_surface_depth": false, - "secondary_depth_range": 0 - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 32 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": false - } - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:hole" - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:lava", - "Properties": { - "level": "0" - } - } - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [ - "minecraft:warped_forest" - ] - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:netherrack", - "min_threshold": 0.54, - "max_threshold": 1.7976931348623157e+308 - } - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 31 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": false - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:nether_wart", - "min_threshold": 1.17, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:warped_wart_block" - } - } - }, - { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:warped_nylium" - } - } - ] - } - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [ - "minecraft:crimson_forest" - ] - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:netherrack", - "min_threshold": 0.54, - "max_threshold": 1.7976931348623157e+308 - } - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 31 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": false - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:nether_wart", - "min_threshold": 1.17, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:nether_wart_block" - } - } - }, - { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:crimson_nylium" - } - } - ] - } - } - } - } - ] - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:biome", - "biome_is": [ - "minecraft:nether_wastes" - ] - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:stone_depth", - "offset": 0, - "surface_type": "floor", - "add_surface_depth": true, - "secondary_depth_range": 0 - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:soul_sand_layer", - "min_threshold": -0.012, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:hole" - } - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 30 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": true - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 35 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": true - } - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:soul_sand" - } - } - } - } - }, - { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:netherrack" - } - } - ] - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:stone_depth", - "offset": 0, - "surface_type": "floor", - "add_surface_depth": false, - "secondary_depth_range": 0 - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 31 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": false - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 35 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": true - } - }, - "then_run": { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:noise_threshold", - "noise": "minecraft:gravel_layer", - "min_threshold": -0.012, - "max_threshold": 1.7976931348623157e+308 - }, - "then_run": { - "type": "minecraft:sequence", - "sequence": [ - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:y_above", - "anchor": { - "absolute": 32 - }, - "surface_depth_multiplier": 0, - "add_stone_depth": false - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:gravel" - } - } - }, - { - "type": "minecraft:condition", - "if_true": { - "type": "minecraft:not", - "invert": { - "type": "minecraft:hole" - } - }, - "then_run": { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:gravel" - } - } - } - ] - } - } - } - } - } - ] - } - }, - { - "type": "minecraft:block", - "result_state": { - "Name": "minecraft:netherrack" - } - } - ] - } -} diff --git a/src/main/resources/data/otemod/worldgen/placed_feature/vaultsteel_oregen_nether.json b/src/main/resources/data/otemod/worldgen/placed_feature/vaultsteel_oregen_nether.json new file mode 100644 index 0000000..9385e8c --- /dev/null +++ b/src/main/resources/data/otemod/worldgen/placed_feature/vaultsteel_oregen_nether.json @@ -0,0 +1,23 @@ +{ + "feature": "otemod:vaultsteel_oregen_nether", + "placement": [ + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:trapezoid", + "min_inclusive": { + "absolute": 8 + }, + "max_inclusive": { + "absolute": 24 + } + } + }, + { + "type": "minecraft:biome" + } + ] +}