Compare commits

..

52 commits

Author SHA1 Message Date
dragonruler1000
68c4c9bb50
Merge pull request #27 from dragonruler1000/DEV
Dev
2025-06-27 21:48:35 -05:00
dragonruler1000
092a473abd Updated the portal block texture
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-06-27 20:34:31 -05:00
dragonruler1000
3085bd5d92 Update mod version to 1.2.3, rename DustHouseStructure to HouseStructure, and implement structure generation for plains biomes. Updated textures for the subtle knife and omelet items and the house structure should now generate.
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-06-26 20:19:03 -05:00
dragonruler1000
5a27c4ab2e Introduce dimensional event handling and improve loot table configuration
Added `ModWorldEvents` class to manage custom dimensional events and ensure proper spacing in server world generation. Enhanced block_of_dust loot table with weighted drop chances and refined access transformer configuration in `build.gradle`. Integrated structure setup initialization in pre-loading event.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-28 17:43:08 -05:00
dragonruler1000
bcd5a40813 Introduce custom DustHouse structure and update mod configuration
Added a new DustHouse structure with associated registration logic and configuration settings. Updated `gradle.properties`, introduced `accesstransformer.cfg`, and added JSON and NBT files for structure generation. Fixed typo in gradle daemon setting.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-28 12:29:12 -05:00
dragonruler1000
15b1027f9b Add smelting recipe for cooked omelet to the mod
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-28 11:15:15 -05:00
dragonruler1000
059f2d881b Add cooked omelet item, recipe, and HDM dimension support
Introduced the cooked omelet item with functionality and crafting recipe. Added recognition for the "HDM Dimension" in teleportation logic. Updated gradle settings to enable daemon for faster builds.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-28 11:14:13 -05:00
dragonruler1000
7547f751e2
Merge pull request #26 from dragonruler1000/DEV
fixed tetures for the block of dust and window blocks
2025-05-27 10:16:19 -05:00
dragonruler1000
89cff4ca48 fixed tetures for the block of dust and window blocks 2025-05-27 10:15:56 -05:00
dragonruler1000
f7777980c3
Merge pull request #25 from dragonruler1000/DEV
Add welcome message to dimensions and introduce config support
2025-05-24 10:18:50 -05:00
dragonruler1000
a9303a44cb Add welcome message to dimensions and introduce config support
Players entering non-overworld dimensions now receive a tailored welcome message. Additionally, basic configuration support has been introduced, laying the foundation for future customization. Updated mod version to 1.2.1 to reflect these changes.
2025-05-24 10:18:18 -05:00
dragonruler1000
c1e69d76a5
Merge pull request #23 from dragonruler1000/DEV
Trying to fix broken textures
2025-05-22 20:55:24 -05:00
dragonruler1000
a8d47d1845 Trying to fix broken textures
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-22 20:54:02 -05:00
dragonruler1000
e632fbe891
Merge pull request #22 from dragonruler1000/DEV
Refactor teleportation logic and add custom dimension config
2025-05-22 20:16:12 -05:00
dragonruler1000
02d4df7c55 Refactor teleportation logic and add custom dimension config
Simplified portal activation logic to improve readability and efficiency, removing redundant checks and consolidating teleport code paths. Added configuration file for the "world1" custom dimension, defining its properties and behavior and fixing the bug I was having.
2025-05-22 20:14:18 -05:00
dragonruler1000
c4cacd402b
Merge pull request #21 from dragonruler1000/DEV
Refactor and enhance documentation for Window block class
2025-05-21 22:17:05 -05:00
dragonruler1000
79949bc13b Refactor and enhance documentation for Window block class
Improved clarity and consistency in code comments for the Window block, providing better explanations of its functionality and behaviors. Refactored shape and teleportation logic comments for better readability. No functional changes were introduced.
2025-05-21 22:16:36 -05:00
dragonruler1000
ede9ae1339
Merge pull request #20 from dragonruler1000/DEV
Add credits field to mods.toml and clean up imports in Window.java
2025-05-20 20:58:35 -05:00
dragonruler1000
1289e20bc0 Add credits field to mods.toml and clean up imports in Window.java
The mods.toml file now includes a credits field so it shows up in the mod list. Additionally, unused imports in Window.java were removed to improve code readability and maintainability.
2025-05-20 20:55:44 -05:00
dragonruler1000
8a422e725f
Merge pull request #19 from dragonruler1000/DEV
Fix incorrect remote check in Window block activation
2025-05-19 22:23:44 -05:00
dragonruler1000
9cad3a926e Fix incorrect remote check in Window block activation
Previously, the remote check in the `onBlockActivated` method was reversed, causing improper behavior. This update corrects the logic to handle block activation appropriately on the client side. Additionally, an unused import line was cleaned up for clarity.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-19 22:22:13 -05:00
dragonruler1000
afc8ae209e
Merge pull request #18 from dragonruler1000/DEV
trying to fix issues with the window block and add a credits line to the mod info.
2025-05-19 08:57:50 -05:00
dragonruler1000
a540f3bf60 Refactor gradle properties and clean up Window block logic
Improve clarity in `credits` and `mod_authors` formatting within `gradle.properties`. Removed redundant player message handling logic in `Window.java` to streamline block activation behavior.
2025-05-19 08:56:16 -05:00
dragonruler1000
ef61988f61 Fix block activation logic and add server-side message
Reversed client/server check to ensure correct logic during block activation. Added a server-side message to notify players when the block is activated. This improves clarity and ensures consistent behavior across client and server.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-17 16:42:03 -05:00
dragonruler1000
bcf7cbd7d1
Merge pull request #17 from dragonruler1000/DEV
Add credits field and fix portal block activation logic
2025-05-17 15:50:00 -05:00
dragonruler1000
8de9596a60 Add credits field and fix portal block activation logic
Added a "credits" field to gradle properties and updated its usage in the build script. Refactored `onBlockActivated` logic in the `Window` block to improve code clarity and handle dimension-specific teleportation more robustly. Updated `ModBlocks` to properly register the custom `Window` block.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-17 15:49:16 -05:00
dragonruler1000
9281cf5c65
Merge pull request #16 from dragonruler1000/DEV
trying `use` to see if it works instead of `onBlockActivated`
2025-05-16 08:48:22 -05:00
dragonruler1000
d962b7d8b7 trying use to see if it works instead of onBlockActivated 2025-05-16 08:47:54 -05:00
dragonruler1000
c43a75739f
Merge pull request #15 from dragonruler1000/DEV
trying to fix problem with portal block.
2025-05-15 11:07:25 -05:00
dragonruler1000
748ab1b988 Refactor Window block interactions and register new block
Simplified the onBlockActivated logic for clarity and better separation of client and server behavior. Added null checks, improved crouching interaction handling, and adjusted dimension change logic. Registered the "window" block and updated the language file to include its name. Added comments so i can know what is going on later.
2025-05-15 11:06:33 -05:00
dragonruler1000
249c235220 Added comments to know what is going on later.
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-15 09:23:27 -05:00
dragonruler1000
5b390d20c6 Add client-side status message on block activation
This change ensures players receive immediate client-side feedback when a block is activated. The addition improves user experience by providing clearer interaction confirmation.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-15 09:08:38 -05:00
dragonruler1000
0c0a9c5998
Merge pull request #14 from dragonruler1000/DEV
Trying an optimised teleport function
- added a debug message to see if the block was being activated.
2025-05-15 09:02:48 -05:00
dragonruler1000
670cd542c9 Trying an optimised teleport function
added a debug message to see if the block was being activated.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-15 09:00:29 -05:00
dragonruler1000
73d41b9179
Merge pull request #13 from dragonruler1000/DEV
Trying to find out issue with window block.
2025-05-14 21:42:16 -05:00
dragonruler1000
44581d576f Refactor Window block interaction logic for debugging.
Updated the `Window` block's interaction method to provide clearer client and server-side feedback, aiding in debugging issues with teleportation and block activation. Added comments to clarify functionality and organized code for better readability.

Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-14 21:40:52 -05:00
dragonruler1000
6915d2ae90 Adding a block activated check.
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-14 21:04:59 -05:00
dragonruler1000
d7c9678147
Merge pull request #12 from dragonruler1000/DEV
Adding chat message to state if target location is good and re-adding some important lines of code.
2025-05-14 21:00:34 -05:00
dragonruler1000
c06d73ebff readded stuff that was accidently removed.
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-14 20:57:28 -05:00
dragonruler1000
8f94831df0 trying to get a chat message to show in the chat if the portal cant find an aplicable loccation.
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-14 10:53:39 -05:00
dragonruler1000
174779c550
Merge pull request #11 from dragonruler1000/DEV
fixing textures
2025-05-14 10:21:02 -05:00
dragonruler1000
cc98e7cd6b Fixing textures.
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-14 10:19:23 -05:00
dragonruler1000
862a29a548 adding textures and updating gitignore
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-14 10:09:27 -05:00
dragonruler1000
6e40197dd9
Merge pull request #10 from dragonruler1000/DEV
Added a new dimension and trying to get right click to change the dimention
2025-05-14 10:01:22 -05:00
dragonruler1000
ed5d8d1006 Added a new dimension and trying to get right click to change the dimention.
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-14 09:07:46 -05:00
dragonruler1000
572719fd30
Merge pull request #9 from dragonruler1000/DEV
Added a window block and working on portal stuff.
2025-05-13 16:59:25 -05:00
dragonruler1000
a195450501 Added a window block and working on portal stuff.
Signed-off-by: dragonruler1000 <github@me.minecraftchest2.us>
2025-05-13 16:58:44 -05:00
dragonruler1000
527155ba20
Update README.md
added link to wiki
2025-05-13 12:34:40 -05:00
dragonruler1000
d08ea83cbb
Merge pull request #7 from dragonruler1000/DEV
Adding achevements and trying to get subtle knife to place a block.
2025-05-13 09:17:43 -05:00
dragonruler1000
c7269ce21c Adding achevements and trying to get subtle knife to place a block. 2025-05-13 09:17:14 -05:00
dragonruler1000
cbc9eb39c2
Merge pull request #6 from dragonruler1000/DEV
Made the block of dust emmit light and made the subtle knife send a message to chat when used.
2025-05-13 07:49:47 -05:00
dragonruler1000
170d0dbdef Made the block of dust emmit light and made the subtle knife send a message to chat when used. 2025-05-13 07:49:04 -05:00
46 changed files with 1165 additions and 92 deletions

2
.gitignore vendored
View file

@ -1,6 +1,8 @@
# User-specific stuff # User-specific stuff
.idea/ .idea/
*.pxo
*.iml *.iml
*.ipr *.ipr
*.iws *.iws

View file

@ -53,6 +53,9 @@ Explore parallel worlds, bond with your daemon, uncover the mysteries of Dust, a
2. Place the mod `.jar` file in your `mods` folder. 2. Place the mod `.jar` file in your `mods` folder.
3. Launch Minecraft with the Forge profile. 3. Launch Minecraft with the Forge profile.
---
## Wiki
https://github.com/dragonruler1000/hdm-mod/wiki
--- ---
## Contributing ## Contributing

View file

@ -31,6 +31,7 @@ minecraft {
// Use non-default mappings at your own risk. They may not always work. // Use non-default mappings at your own risk. They may not always work.
// Simply re-run your setup task after changing the mappings to update your workspace. // Simply re-run your setup task after changing the mappings to update your workspace.
mappings channel: mapping_channel, version: mapping_version mappings channel: mapping_channel, version: mapping_version
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
// When true, this property will have all Eclipse/IntelliJ IDEA run configurations run the "prepareX" task for the given run configuration before launching the game. // When true, this property will have all Eclipse/IntelliJ IDEA run configurations run the "prepareX" task for the given run configuration before launching the game.
// In most cases, it is not necessary to enable. // In most cases, it is not necessary to enable.
@ -120,11 +121,6 @@ dependencies {
// then special handling is done to allow a setup of a vanilla dependency without the use of an external repository. // then special handling is done to allow a setup of a vanilla dependency without the use of an external repository.
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
// Example mod dependency with JEI - using fg.deobf() ensures the dependency is remapped to your development mappings
// The JEI API is declared for compile time use, while the full JEI artifact is used at runtime
// compileOnly fg.deobf("mezz.jei:jei-${mc_version}-common-api:${jei_version}")
// compileOnly fg.deobf("mezz.jei:jei-${mc_version}-forge-api:${jei_version}")
// runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}-forge:${jei_version}")
// Example mod dependency using a mod jar from ./libs with a flat dir repository // Example mod dependency using a mod jar from ./libs with a flat dir repository
// This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar
@ -146,7 +142,7 @@ tasks.named('processResources', ProcessResources).configure {
forge_version : forge_version, forge_version_range: forge_version_range, forge_version : forge_version, forge_version_range: forge_version_range,
loader_version_range: loader_version_range, loader_version_range: loader_version_range,
mod_id : mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version, mod_id : mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version,
mod_authors : mod_authors, mod_description: mod_description,] mod_authors : mod_authors, credits:credits, mod_description: mod_description,]
inputs.properties replaceProperties inputs.properties replaceProperties

View file

@ -1,5 +1,5 @@
org.gradle.jvmargs=-Xmx3G org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false org.gradle.daemon=flase
# The Minecraft version must agree with the Forge version to get a valid artifact # The Minecraft version must agree with the Forge version to get a valid artifact
minecraft_version=1.16.5 minecraft_version=1.16.5
# The Minecraft version range can use any release version of Minecraft as bounds. # The Minecraft version range can use any release version of Minecraft as bounds.
@ -38,12 +38,14 @@ mod_name=Hdm Mod
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=MIT mod_license=MIT
# The mod version. See https://semver.org/ # The mod version. See https://semver.org/
mod_version=1.1 mod_version=1.2.3
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources. # This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html # See https://maven.apache.org/guides/mini/guide-naming-conventions.html
mod_group_id=us.minecraftchest2 mod_group_id=us.minecraftchest2
# The authors of the mod. This is a simple text string that is used for display purposes in the mod list. # The authors of the mod. This is a simple text string that is used for display purposes in the mod list.
mod_authors=Minecraftchest2 mod_authors=Minecraftchest2
# The mod credits.
credits=Everyone on the Tardis Mod Discord and on the hackclub slack that helped me debug my mod
# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list.
mod_description=A Mod Inspired by "His Dark Materials" By Philip Pullman mod_description=A Mod Inspired by "His Dark Materials" By Philip Pullman

View file

@ -2,12 +2,16 @@ package us.minecraftchest2.hdm_mod;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.InterModComms; import net.minecraftforge.fml.InterModComms;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
@ -18,6 +22,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import us.minecraftchest2.hdm_mod.block.ModBlocks; import us.minecraftchest2.hdm_mod.block.ModBlocks;
import us.minecraftchest2.hdm_mod.item.ModItems; import us.minecraftchest2.hdm_mod.item.ModItems;
import us.minecraftchest2.hdm_mod.world.structure.ModStructures;
//import us.minecraftchest2.hdm_mod.init.ItemInit; //import us.minecraftchest2.hdm_mod.init.ItemInit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -37,6 +42,8 @@ public class Hdm_mod {
ModItems.register(modEventBus1); ModItems.register(modEventBus1);
ModBlocks.register(modEventBus1); ModBlocks.register(modEventBus1);
ModStructures.register(modEventBus1);
modEventBus1.addListener(this::setup); modEventBus1.addListener(this::setup);
// Register the enqueueIMC method for modloading // Register the enqueueIMC method for modloading
modEventBus1.addListener(this::enqueueIMC); modEventBus1.addListener(this::enqueueIMC);
@ -44,6 +51,7 @@ public class Hdm_mod {
modEventBus1.addListener(this::processIMC); modEventBus1.addListener(this::processIMC);
// Register the doClientStuff method for modloading // Register the doClientStuff method for modloading
modEventBus1.addListener(this::doClientStuff); modEventBus1.addListener(this::doClientStuff);
// ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ModConfig.GENERAL_SPEC, "modconfig.toml");
// Register ourselves for server and other game events we are interested in // Register ourselves for server and other game events we are interested in
MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(this);
@ -59,10 +67,16 @@ public class Hdm_mod {
// some preinit code // some preinit code
LOGGER.info("HELLO FROM PREINIT"); LOGGER.info("HELLO FROM PREINIT");
LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName()); LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName());
event.enqueueWork(() ->{
ModStructures.setupStructures();
});
} }
private void doClientStuff(final FMLClientSetupEvent event) { private void doClientStuff(final FMLClientSetupEvent event) {
// do something that can only be done on the client // do something that can only be done on the client
event.enqueueWork(() -> {
});
} }
private void enqueueIMC(final InterModEnqueueEvent event) { private void enqueueIMC(final InterModEnqueueEvent event) {

View file

@ -2,6 +2,8 @@ package us.minecraftchest2.hdm_mod.block;
import net.minecraft.block.AbstractBlock; import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@ -10,33 +12,62 @@ import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import us.minecraftchest2.hdm_mod.Hdm_mod; import us.minecraftchest2.hdm_mod.Hdm_mod;
import us.minecraftchest2.hdm_mod.block.custom.Window;
import us.minecraftchest2.hdm_mod.item.ModItems; import us.minecraftchest2.hdm_mod.item.ModItems;
import us.minecraftchest2.hdm_mod.item.ModItemGroup; import us.minecraftchest2.hdm_mod.item.ModItemGroup;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.function.ToIntFunction;
public class ModBlocks { public class ModBlocks {
// Function to determine the light level for the "dust" block
public static ToIntFunction<BlockState> dustLightLevel = BlockState -> 10; // Fixed value of 10
// Function to set the light level for the "portal" block
public static ToIntFunction<BlockState> PORTAL_LIGHT_LEVEL = BlockState -> 15; // Fixed value of 15
// DeferredRegister to register blocks with Forge, using your mod ID
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Hdm_mod.MOD_ID); public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Hdm_mod.MOD_ID);
// Registering a "block of dust" with specific properties
public static final RegistryObject<Block> DUST_BLOCK = registerBlock("block_of_dust", public static final RegistryObject<Block> DUST_BLOCK = registerBlock("block_of_dust",
() -> new Block(AbstractBlock.Properties.create(Material.ROCK).doesNotBlockMovement().harvestLevel(0) () -> new Block(
.hardnessAndResistance(5f))); AbstractBlock.Properties.create(Material.ROCK) // Base material is rock
.doesNotBlockMovement() // Entities can move through this block
.harvestLevel(0) // Harvest level
.hardnessAndResistance(500f, 100f) // Hardness and blast resistance
.setLightLevel(dustLightLevel) // Provides light using the dustLightLevel function
)
);
// Registering a "portal" block called "window" with different properties
public static final RegistryObject<Block> PORTAL_BLOCK = registerBlock("window",
() -> new Window(
AbstractBlock.Properties.create(Material.PORTAL) // Base material is portal
.doesNotBlockMovement() // Entities can move through this block
.harvestLevel(10) // High harvest level
.hardnessAndResistance(1000f, 1000f) // Very hard and blast resistant
.setLightLevel(PORTAL_LIGHT_LEVEL) // Maximum light level
)
);
private static <T extends Block>RegistryObject<T> registerBlock(String name, Supplier<T> block) { // Helper method to register a block and its corresponding BlockItem at once
RegistryObject<T> toReturn = BLOCKS.register(name, block); private static <T extends Block> RegistryObject<T> registerBlock(String name, Supplier<T> block) {
registerBlockItem(name, toReturn); RegistryObject<T> toReturn = BLOCKS.register(name, block); // Register the block itself
registerBlockItem(name, toReturn); // Register the block as an item
return toReturn; return toReturn;
} }
// Helper method to register the item form of a block, belonging to a custom item group
private static <T extends Block> void registerBlockItem(String name, RegistryObject<T> block) { private static <T extends Block> void registerBlockItem(String name, RegistryObject<T> block) {
ModItems.ITEMS.register(name, () -> new BlockItem(block.get(), ModItems.ITEMS.register(name, () -> new BlockItem(
new Item.Properties().group(ModItemGroup.HDM_BLOCK_GROUP))); block.get(),
new Item.Properties().group(ModItemGroup.HDM_BLOCK_GROUP) // Assigns to the HDM block group
));
} }
// This method is called to register all blocks with the mod event bus
public static void register(IEventBus eventBus){ public static void register(IEventBus eventBus){
BLOCKS.register(eventBus); BLOCKS.register(eventBus);
} }
} }

View file

@ -0,0 +1,173 @@
package us.minecraftchest2.hdm_mod.block.custom;
// Import statements...
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.server.MinecraftServer;
import net.minecraft.state.StateContainer;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.shapes.IBooleanFunction;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import us.minecraftchest2.hdm_mod.world.dimension.ModDimensions;
import us.minecraftchest2.hdm_mod.world.dimension.SimpleTeleporter;
import javax.annotation.Nullable;
import java.util.stream.Stream;
/**
* Custom window block class, serving as a dimensional portal between worlds.
* Inherits directional placement capabilities from HorizontalBlock.
*/
public class Window extends HorizontalBlock {
/**
* Constructor for Window block; forwards the properties to the parent constructor.
*/
public Window(Properties builder) {
super(builder);
}
// VoxelShapes for visually and physically shaping the block based on orientation.
// Each direction (N/E/S/W) has a custom composition of rectangular regions.
/** Shape for the block facing NORTH. */
private static final VoxelShape SHAPE_N = Stream.of(
Block.makeCuboidShape(5, 11, 5, 6, 13, 11), // Window frame elements (left, etc.)
Block.makeCuboidShape(4, 0, 4, 12, 1, 12), // Base of window
Block.makeCuboidShape(5, 1, 5, 11, 2, 11), // Lower window frame
Block.makeCuboidShape(6, 2, 6, 10, 10, 10), // Glass pane
Block.makeCuboidShape(5, 10, 4, 11, 11, 12), // Top frame
Block.makeCuboidShape(5, 11, 4, 11, 12, 5), // Decorative details
Block.makeCuboidShape(5, 11, 11, 11, 14, 12),// Upper right details
Block.makeCuboidShape(10, 11, 5, 11, 13, 11) // Right vertical side
).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get();
/** Shape for the block facing EAST (rotated). */
private static final VoxelShape SHAPE_E = Stream.of(
Block.makeCuboidShape(5, 11, 5, 11, 13, 6),
Block.makeCuboidShape(4, 0, 4, 12, 1, 12),
Block.makeCuboidShape(5, 1, 5, 11, 2, 11),
Block.makeCuboidShape(6, 2, 6, 10, 10, 10),
Block.makeCuboidShape(4, 10, 5, 12, 11, 11),
Block.makeCuboidShape(11, 11, 5, 12, 12, 11),
Block.makeCuboidShape(4, 11, 5, 5, 14, 11),
Block.makeCuboidShape(5, 11, 10, 11, 13, 11)
).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get();
/** Shape for the block facing SOUTH. */
private static final VoxelShape SHAPE_S = Stream.of(
Block.makeCuboidShape(10, 11, 5, 11, 13, 11),
Block.makeCuboidShape(4, 0, 4, 12, 1, 12),
Block.makeCuboidShape(5, 1, 5, 11, 2, 11),
Block.makeCuboidShape(6, 2, 6, 10, 10, 10),
Block.makeCuboidShape(5, 10, 4, 11, 11, 12),
Block.makeCuboidShape(5, 11, 11, 11, 12, 12),
Block.makeCuboidShape(5, 11, 4, 11, 14, 5),
Block.makeCuboidShape(5, 11, 5, 6, 13, 11)
).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get();
/** Shape for the block facing WEST. */
private static final VoxelShape SHAPE_W = Stream.of(
Block.makeCuboidShape(5, 11, 10, 11, 13, 11),
Block.makeCuboidShape(4, 0, 4, 12, 1, 12),
Block.makeCuboidShape(5, 1, 5, 11, 2, 11),
Block.makeCuboidShape(6, 2, 6, 10, 10, 10),
Block.makeCuboidShape(4, 10, 5, 12, 11, 11),
Block.makeCuboidShape(4, 11, 5, 5, 12, 11),
Block.makeCuboidShape(11, 11, 5, 12, 14, 11),
Block.makeCuboidShape(5, 11, 5, 11, 13, 6)
).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, IBooleanFunction.OR)).get();
/**
* Handles when a player right-clicks/interacts with this block.
* Triggers portal teleportation if conditions are met.
*/
@SuppressWarnings("deprecation")
@Override
public ActionResultType onBlockActivated(
BlockState state,
World worldIn,
BlockPos pos,
PlayerEntity player,
Hand handIn,
BlockRayTraceResult hit
) {
if (!worldIn.isRemote() && !player.isCrouching()) {
MinecraftServer server = worldIn.getServer();
if (server == null) return ActionResultType.PASS;
boolean goingToCustom = worldIn.getDimensionKey() != ModDimensions.World1;
ServerWorld targetWorld = (worldIn.getDimensionKey() == ModDimensions.World1)
? server.getWorld(World.OVERWORLD)
: server.getWorld(ModDimensions.World1);
if (worldIn.getDimensionKey() == ModDimensions.World1) {
ServerWorld overWorld = server.getWorld(World.OVERWORLD);
if (overWorld != null) {
player.changeDimension(overWorld, new SimpleTeleporter(pos, false));
}
}
if (targetWorld != null) {
SimpleTeleporter teleporter = new SimpleTeleporter(pos, goingToCustom);
player.changeDimension(targetWorld, teleporter);
}
return ActionResultType.SUCCESS;
}
return super.onBlockActivated(state, worldIn, pos, player, handIn, hit);
}
/**
* Returns the block's physical outline for rendering and collision.
* The shape depends on the current facing direction of the block.
*/
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
switch (state.get(HORIZONTAL_FACING)) {
case NORTH:
return SHAPE_N;
case SOUTH:
return SHAPE_S;
case WEST:
return SHAPE_W;
case EAST:
return SHAPE_E;
default:
return SHAPE_N;
}
}
/**
* Registers the horizontal facing property with the block state container,
* enabling the block to store which direction it is facing.
*/
@Override
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
builder.add(HORIZONTAL_FACING);
}
/**
* Determines the block's initial facing based on the placement context.
* The block will face opposite to the player's direction when placed.
*/
@Nullable
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
return this.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite());
}
}

View file

@ -0,0 +1,18 @@
//package us.minecraftchest2.hdm_mod.config;
//
//import net.minecraftforge.common.ForgeConfigSpec;
//
//public class ModConfig {
//public static final ForgeConfigSpec GENERAL_SPEC;
//
//static {
// ForgeConfigSpec.Builder configBuilder = new ForgeConfigSpec.Builder();
// setupConfig(configBuilder);
// GENERAL_SPEC = configBuilder.build();
//}
//public static ForgeConfigSpec.IntValue exampleIntConfigEntry;
//
//private static void setupConfig(ForgeConfigSpec.Builder builder) {
// exampleIntConfigEntry = builder.defineInRange("exampleIntConfigEntry", 5, 2, 50);
//}
//}

View file

@ -0,0 +1,18 @@
package us.minecraftchest2.hdm_mod.config;
import net.minecraftforge.common.ForgeConfigSpec;
public class ModConfig {
public static final ForgeConfigSpec GENERAL_SPEC;
static {
ForgeConfigSpec.Builder configBuilder = new ForgeConfigSpec.Builder();
setupConfig(configBuilder);
GENERAL_SPEC = configBuilder.build();
}
public static ForgeConfigSpec.IntValue exampleIntConfigEntry;
private static void setupConfig(ForgeConfigSpec.Builder builder) {
exampleIntConfigEntry = builder.defineInRange("exampleIntConfigEntry", 5, 2, 50);
}
}

View file

@ -1,11 +1,17 @@
package us.minecraftchest2.hdm_mod.item; package us.minecraftchest2.hdm_mod.item;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Food;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.potion.Effect;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import us.minecraftchest2.hdm_mod.Hdm_mod; import us.minecraftchest2.hdm_mod.Hdm_mod;
import us.minecraftchest2.hdm_mod.block.ModBlocks;
import us.minecraftchest2.hdm_mod.item.custom.SubtleKnife; import us.minecraftchest2.hdm_mod.item.custom.SubtleKnife;
public class ModItems { public class ModItems {
@ -18,12 +24,13 @@ public class ModItems {
public static final RegistryObject<Item> OMELET = ITEMS.register("omelet", public static final RegistryObject<Item> OMELET = ITEMS.register("omelet",
() -> new Item(new Item.Properties().group(ModItemGroup.HDM_ITEM_GROUP))); () -> new Item(new Item.Properties().food(new Food.Builder().hunger(5).fastToEat().saturation(20)
.effect(() -> new EffectInstance(Effects.HUNGER, 40, 4), 0.75f).build()).group(ModItemGroup.HDM_ITEM_GROUP)));
public static final RegistryObject<Item> KNIFE = ITEMS.register("subtle_knife", public static final RegistryObject<Item> KNIFE = ITEMS.register("subtle_knife",
() -> new SubtleKnife(new Item.Properties().maxStackSize(1).group(ModItemGroup.HDM_ITEM_GROUP).maxDamage(2000))); () -> new SubtleKnife(new Item.Properties().maxStackSize(1).group(ModItemGroup.HDM_ITEM_GROUP).maxDamage(2000)));
public static final RegistryObject<Item> OMELET_COOKED = ITEMS.register("omelet-cooked",
() -> new Item(new Item.Properties().food(new Food.Builder().hunger(5).fastToEat().saturation(20).build()).group(ModItemGroup.HDM_ITEM_GROUP)));
public static void register(IEventBus eventBus) { public static void register(IEventBus eventBus) {
ITEMS.register(eventBus); ITEMS.register(eventBus);

View file

@ -0,0 +1,51 @@
//package us.minecraftchest2.hdm_mod.item.custom;
//
//import net.minecraft.entity.player.PlayerEntity;
//import net.minecraft.item.Item;
//import net.minecraft.item.ItemStack;
//import net.minecraft.util.*;
//import net.minecraft.util.text.StringTextComponent;
//import net.minecraft.world.World;
//import net.minecraft.world.gen.feature.structure.Structure;
////import net.minecraft.world.gen.feature.structure.StructureFeature;
//import net.minecraft.util.math.BlockPos;
//import net.minecraft.world.server.ServerWorld;
//
//public class StructureLocatorItem extends Item {
//
// public StructureLocatorItem(Properties properties) {
// super(properties);
// }
//
// @Override
// public ActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
// if (!world.isClientSide && world instanceof ServerWorld) {
// ServerWorld serverWorld = (ServerWorld) world;
// BlockPos playerPos = player.blockPosition();
//
// // Replace this with your own structure, or any StructureFeature
// Structure<?> structureToFind = Structure.STRONGHOLD;
//
// BlockPos structurePos = serverWorld.getStructureLocation(
// structureToFind,
// playerPos,
// 100, // search radius in chunks
// false
// );
//
// if (structurePos != null) {
// player.sendMessage(
// new StringTextComponent("Nearest structure at: " + structurePos.getX() + ", " + structurePos.getY() + ", " + structurePos.getZ()),
// player.getUUID()
// );
// } else {
// player.sendMessage(
// new StringTextComponent("No structure found nearby."),
// player.getUUID()
// );
// }
// }
//
// return ActionResult.resultSuccess(player.getItemInHand(hand));
// }
//}

View file

@ -1,13 +1,14 @@
package us.minecraftchest2.hdm_mod.item.custom; package us.minecraftchest2.hdm_mod.item.custom;
import jdk.nashorn.internal.ir.Block;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext; import net.minecraft.item.ItemUseContext;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import us.minecraftchest2.hdm_mod.block.ModBlocks;
public class SubtleKnife extends Item { public class SubtleKnife extends Item {
@ -20,14 +21,25 @@ public class SubtleKnife extends Item {
@Override @Override
public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) { public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) {
World world = context.getWorld(); World world = context.getWorld();
// BlockPos pos =
PlayerEntity player = context.getPlayer(); PlayerEntity player = context.getPlayer();
if(world.isRemote) { if (player == null) return ActionResultType.PASS;
// world.setBlockState()
// Get the block being clicked
BlockPos blockPos = context.getPos();
Direction face = context.getFace(); // The face the player clicked
// Offset to the block face to place the block on the adjacent block (like right-clicking a wall places on it)
BlockPos placePos = blockPos.offset(face);
// Server-side logic only: place a block
if (!world.isRemote) {
world.setBlockState(placePos, ModBlocks.PORTAL_BLOCK.get().getDefaultState());
} }
return super.onItemUseFirst(stack, context);
return ActionResultType.SUCCESS;
} }
} }

View file

@ -0,0 +1,33 @@
package us.minecraftchest2.hdm_mod.world;
import com.mojang.serialization.Codec;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.gen.ChunkGenerator;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import us.minecraftchest2.hdm_mod.Hdm_mod;
import java.lang.reflect.Method;
@Mod.EventBusSubscriber(modid = Hdm_mod.MOD_ID)
public class ModWorldEvents {
@SubscribeEvent
public static void addDimensinalSpacing(final WorldEvent.Load event) {
if(event.getWorld() instanceof ServerWorld) {
ServerWorld serverWorld = (ServerWorld) event.getWorld();
try {
Method GETCODEC_METHOD =
ObfuscationReflectionHelper.findMethod(ChunkGenerator.class, "func_230347_a_");
ResourceLocation cgRL = Registry.CHUNK_GENERATOR_CODEC.getKey(
(Codec<? extends ChunkGenerator>)GETCODEC_METHOD.invoke(serverWorld.getChunkProvider().generator));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

View file

@ -9,4 +9,6 @@ import us.minecraftchest2.hdm_mod.Hdm_mod;
public class ModDimensions { public class ModDimensions {
public static RegistryKey<World> TestDim = RegistryKey.getOrCreateKey(Registry.WORLD_KEY, public static RegistryKey<World> TestDim = RegistryKey.getOrCreateKey(Registry.WORLD_KEY,
new ResourceLocation(Hdm_mod.MOD_ID, "testdim")); new ResourceLocation(Hdm_mod.MOD_ID, "testdim"));
public static RegistryKey<World> World1 = RegistryKey.getOrCreateKey(Registry.WORLD_KEY,
new ResourceLocation(Hdm_mod.MOD_ID, "world1"));
} }

View file

@ -1,60 +1,149 @@
//package us.minecraftchest2.hdm_mod.world.dimension; package us.minecraftchest2.hdm_mod.world.dimension;
//
//import net.minecraft.block.material.Material; // Imports omitted for brevity
//import net.minecraft.entity.Entity;
//import net.minecraft.fluid.Fluids; import net.minecraft.block.BlockState;
//import net.minecraft.util.math.BlockPos; import net.minecraft.block.material.Material;
//import net.minecraft.world.server.ServerWorld; import net.minecraft.entity.Entity;
//import net.minecraftforge.common.util.ITeleporter; import net.minecraft.entity.player.PlayerEntity;
//import us.minecraftchest2.hdm_mod. import net.minecraft.fluid.Fluids;
// import net.minecraft.util.ResourceLocation;
//import java.util.function.Function; import net.minecraft.util.math.BlockPos;
// import net.minecraft.util.text.StringTextComponent;
//public class KJTeleporter implements ITeleporter { import net.minecraft.world.server.ServerWorld;
// public static BlockPos thisPos = BlockPos.ZERO; import net.minecraftforge.common.util.ITeleporter;
// public static boolean insideDimension = true; import us.minecraftchest2.hdm_mod.block.ModBlocks;
// import us.minecraftchest2.hdm_mod.block.custom.Window;
// public KJTeleporter(BlockPos pos, boolean insideDim) {
// thisPos = pos; import java.util.function.Function;
// insideDimension = insideDim;
// } /**
// * Handles teleportation of entities between dimensions, with custom logic for portals and safety.
// @Override */
// public Entity placeEntity(Entity entity, ServerWorld currentWorld, ServerWorld destinationWorld, public class SimpleTeleporter implements ITeleporter {
// float yaw, Function<Boolean, Entity> repositionEntity) { // The destination position for the teleport
// entity = repositionEntity.apply(false); public static BlockPos thisPos = BlockPos.ZERO;
// double y = 61;
// // True if teleporting into the custom dimension, false if to overworld
// if (!insideDimension) { public static boolean insideDimension = true;
// y = thisPos.getY();
// } // Records if the most recent teleport was successful
// private boolean success = false;
// BlockPos destinationPos = new BlockPos(thisPos.getX(), y, thisPos.getZ());
// /**
// int tries = 0; * @return True if the last teleportation was successful (a safe landing spot found), false otherwise
// while ((destinationWorld.getBlockState(destinationPos).getMaterial() != Material.AIR) && */
// !destinationWorld.getBlockState(destinationPos).isReplaceable(Fluids.WATER) && public boolean wasSuccessful() {
// destinationWorld.getBlockState(destinationPos.up()).getMaterial() != Material.AIR && return success;
// !destinationWorld.getBlockState(destinationPos.up()).isReplaceable(Fluids.WATER) && tries < 25) { }
// destinationPos = destinationPos.up(2);
// tries++; /**
// } * Constructor sets the target position and whether we're inside our custom dimension.
// * @param pos Destination position
// entity.setPositionAndUpdate(destinationPos.getX(), destinationPos.getY(), destinationPos.getZ()); * @param insideDim Are we inside the custom dimension after teleport?
// */
// if (insideDimension) { public SimpleTeleporter(BlockPos pos, boolean insideDim) {
// boolean doSetBlock = true; thisPos = pos;
// for (BlockPos checkPos : BlockPos.getAllInBoxMutable(destinationPos.down(10).west(10), destinationPos.up(10).east(10))) { insideDimension = insideDim;
// if (destinationWorld.getBlockState(checkPos).getBlock() instanceof KaupenAltarBlock) { }
// doSetBlock = false;
// break; /**
// } * Checks if a block position is unsafe (solid, unreplaceable, lava, or fire).
// } * @param world The world to check in
// if (doSetBlock) { * @param pos The position to check
// destinationWorld.setBlockState(destinationPos, ModBlocks.KAUPEN_ALTAR.get().getDefaultState()); * @return True if the position is unsafe, false if safe
// } */
// } private boolean isUnsafe(ServerWorld world, BlockPos pos){
// BlockState state = world.getBlockState(pos);
// return entity; Material material = state.getMaterial();
// } // Not air AND not easily replaced (by water/etc) OR is lava or fire is considered unsafe
//} return material != Material.AIR &&
!state.isReplaceable(Fluids.WATER) &&
!material.isReplaceable() ||
material == Material.LAVA ||
material == Material.FIRE;
}
/**
* Handles the actual placing of the entity when teleporting between dimensions.
* Will try to find a safe spot upwards, up to 25 tries.
* Also, optionally places a portal block at the destination.
*/
@Override
public Entity placeEntity(Entity entity, ServerWorld currentWorld, ServerWorld destinationWorld,
float yaw, Function<Boolean, Entity> repositionEntity) {
// Move entity to the origin position
entity = repositionEntity.apply(false);
// Default target y coordinate for the destination
double y = 61;
// If not going inside the custom dimension, use the saved Y
if (!insideDimension) {
y = thisPos.getY();
}
// Calculate the intended destination block position
BlockPos destinationPos = new BlockPos(thisPos.getX(), y, thisPos.getZ());
// Try to find a safe spot (air, replaceable, not lava/fire) by moving up, max 25 attempts
int tries = 0;
while ((isUnsafe(destinationWorld, destinationPos) || isUnsafe(destinationWorld, destinationPos.up())) && tries < 25) {
destinationPos = destinationPos.up(2);
tries++;
}
// If it couldn't find a safe spot after 25 attempts, fail teleport
if (tries >= 25) {
this.success = false;
return entity;
}
// Move entity to found safe location
entity.setPositionAndUpdate(destinationPos.getX(), destinationPos.getY(), destinationPos.getZ());
this.success = true;
// When entering a custom dimension, make a portal block at the destination unless one already exists nearby
if (insideDimension) {
boolean doSetBlock = true;
for (BlockPos checkPos : BlockPos.getAllInBoxMutable(destinationPos.down(10).west(10), destinationPos.up(10).east(10))) {
if (destinationWorld.getBlockState(checkPos).getBlock() instanceof Window) {
doSetBlock = false;
break;
}
}
if (doSetBlock) {
destinationWorld.setBlockState(destinationPos, ModBlocks.PORTAL_BLOCK.get().getDefaultState());
}
}
if (entity instanceof PlayerEntity) {
PlayerEntity player = (PlayerEntity) entity;
ResourceLocation dimensionKey = destinationWorld.getDimensionKey().getLocation();
// Only send the welcome message if NOT the overworld
if (!dimensionKey.getPath().equals("overworld")) {
// (Same nice formatting as before)
String path = dimensionKey.getPath();
String dimensionName;
switch (path) {
case "the_nether":
dimensionName = "the Nether";
break;
case "the_end":
dimensionName = "the End";
break;
case "hdm_dimension":
dimensionName = "HDM Dimension";
break;
default:
dimensionName = path.replace('_', ' ');
dimensionName = dimensionName.substring(0, 1).toUpperCase() + dimensionName.substring(1);
break;
}
player.sendMessage(new StringTextComponent("Welcome to " + dimensionName + "!"), player.getUniqueID());
}
}
return entity;
}
}

View file

@ -0,0 +1,27 @@
package us.minecraftchest2.hdm_mod.world.gen;
import net.minecraft.util.RegistryKey;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.feature.IFeatureConfig;
import net.minecraft.world.gen.feature.StructureFeature;
import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.event.world.BiomeLoadingEvent;
import us.minecraftchest2.hdm_mod.world.structure.ModStructures;
import java.util.List;
import java.util.Set;
import java.util.function.Supplier;
public class ModStructureGeneration {
public static void generateStructures(final BiomeLoadingEvent event) {
RegistryKey<Biome> key = RegistryKey.getOrCreateKey(Registry.BIOME_KEY, event.getName());
Set<BiomeDictionary.Type> types = BiomeDictionary.getTypes(key);
if(types.contains(BiomeDictionary.Type.PLAINS)) {
List<Supplier<StructureFeature<?, ?>>> structures = event.getGeneration().getStructures();
structures.add(() -> ModStructures.HOUSE.get().withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG));
}
}
}

View file

@ -0,0 +1,113 @@
package us.minecraftchest2.hdm_mod.world.structure;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import net.minecraft.util.registry.WorldGenRegistries;
import net.minecraft.world.gen.feature.NoFeatureConfig;
import net.minecraft.world.gen.feature.structure.Structure;
import net.minecraft.world.gen.settings.DimensionStructuresSettings;
import net.minecraft.world.gen.settings.StructureSeparationSettings;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import us.minecraftchest2.hdm_mod.Hdm_mod;
import us.minecraftchest2.hdm_mod.world.structure.structures.HouseStructure;
import java.util.HashMap;
import java.util.Map;
public class ModStructures {
public static final DeferredRegister<Structure<?>> STRUCTURES =
DeferredRegister.create(ForgeRegistries.STRUCTURE_FEATURES, Hdm_mod.MOD_ID);
public static final RegistryObject<Structure<NoFeatureConfig>> HOUSE =
STRUCTURES.register("house", HouseStructure::new);
/* average distance apart in chunks between spawn attempts */
/* minimum distance apart in chunks between spawn attempts. MUST BE LESS THAN ABOVE VALUE*/
/* this modifies the seed of the structure so no two structures always spawn over each-other.
Make this large and unique. */
public static void setupStructures() {
setupMapSpacingAndLand(HOUSE.get(),
new StructureSeparationSettings(100,50, 1234567890),
true);
}
/**
* Adds the provided structure to the registry, and adds the separation settings.
* The rarity of the structure is determined based on the values passed into
* this method in the structureSeparationSettings argument.
* This method is called by setupStructures above.
**/
public static <F extends Structure<?>> void setupMapSpacingAndLand(F structure, StructureSeparationSettings structureSeparationSettings,
boolean transformSurroundingLand) {
//add our structures into the map in Structure class
Structure.NAME_STRUCTURE_BIMAP.put(structure.getRegistryName().toString(), structure);
/*
* Whether surrounding land will be modified automatically to conform to the bottom of the structure.
* Basically, it adds land at the base of the structure like it does for Villages and Outposts.
* Doesn't work well on structure that have pieces stacked vertically or change in heights.
*
*/
if (transformSurroundingLand) {
Structure.field_236384_t_ = ImmutableList.<Structure<?>>builder()
.addAll(Structure.field_236384_t_)
.add(structure)
.build();
}
/*
* This is the map that holds the default spacing of all structures.
* Always add your structure to here so that other mods can utilize it if needed.
*
* However, while it does propagate the spacing to some correct dimensions from this map,
* it seems it doesn't always work for code made dimensions as they read from this list beforehand.
*
* Instead, we will use the WorldEvent.Load event in ModWorldEvents to add the structure
* spacing from this list into that dimension or to do dimension blacklisting properly.
* We also use our entry in DimensionStructuresSettings.DEFAULTS in WorldEvent.Load as well.
*
* DEFAULTS requires AccessTransformer (See resources/META-INF/accesstransformer.cfg)
*/
DimensionStructuresSettings.field_236191_b_ =
ImmutableMap.<Structure<?>, StructureSeparationSettings>builder()
.putAll(DimensionStructuresSettings.field_236191_b_)
.put(structure, structureSeparationSettings)
.build();
/*
* There are very few mods that relies on seeing your structure in the
* noise settings registry before the world is made.
*
* You may see some mods add their spacings to DimensionSettings.BUILTIN_OVERWORLD instead of the
* NOISE_GENERATOR_SETTINGS loop below but that field only applies for the default overworld and
* won't add to other worldtypes or dimensions (like amplified or Nether).
* So yeah, don't do DimensionSettings.BUILTIN_OVERWORLD. Use the NOISE_GENERATOR_SETTINGS loop
* below instead if you must.
*/
WorldGenRegistries.NOISE_SETTINGS.getEntries().forEach(settings -> {
Map<Structure<?>, StructureSeparationSettings> structureMap =
settings.getValue().getStructures().func_236195_a_();
/*
* Pre-caution in case a mod makes the structure map immutable like datapacks do.
* I take no chances myself. You never know what another mods does...
*
* structureConfig requires AccessTransformer (See resources/META-INF/accesstransformer.cfg)
*/
if (structureMap instanceof ImmutableMap) {
Map<Structure<?>, StructureSeparationSettings> tempMap = new HashMap<>(structureMap);
tempMap.put(structure, structureSeparationSettings);
settings.getValue().getStructures().func_236195_a_();
} else {
structureMap.put(structure, structureSeparationSettings);
}
});
}
public static void register(IEventBus eventBus) {
STRUCTURES.register(eventBus);
}
}

View file

@ -0,0 +1,90 @@
package us.minecraftchest2.hdm_mod.world.structure.structures;
import net.minecraft.block.BlockState;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SharedSeedRandom;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.registry.DynamicRegistries;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.provider.BiomeProvider;
import net.minecraft.world.gen.ChunkGenerator;
import net.minecraft.world.gen.GenerationStage;
import net.minecraft.world.gen.Heightmap;
import net.minecraft.world.gen.feature.NoFeatureConfig;
import net.minecraft.world.gen.feature.jigsaw.JigsawManager;
import net.minecraft.world.gen.feature.structure.AbstractVillagePiece;
import net.minecraft.world.gen.feature.structure.Structure;
import net.minecraft.world.gen.feature.structure.StructureStart;
import net.minecraft.world.gen.feature.structure.VillageConfig;
import net.minecraft.world.gen.feature.template.TemplateManager;
import us.minecraftchest2.hdm_mod.Hdm_mod;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
public class HouseStructure extends Structure<NoFeatureConfig> {
public HouseStructure() {
super(NoFeatureConfig.CODEC);
}
@Override
public GenerationStage.Decoration getDecorationStage() {
return GenerationStage.Decoration.SURFACE_STRUCTURES;
}
@Override
protected boolean func_230363_a_(ChunkGenerator chunkGenerator, BiomeProvider biomeSource,
long seed, SharedSeedRandom chunkRandom, int chunkX, int chunkZ,
Biome biome, ChunkPos chunkPos, NoFeatureConfig featureConfig) {
BlockPos centerOfChunk = new BlockPos((chunkX << 4) + 7, 0, (chunkZ << 4) + 7);
int landHeight = chunkGenerator.getHeight(centerOfChunk.getX(), centerOfChunk.getZ(),
Heightmap.Type.WORLD_SURFACE_WG);
IBlockReader columnOfBlocks = chunkGenerator.func_230348_a_(centerOfChunk.getX(), centerOfChunk.getZ());
BlockState topBlock = columnOfBlocks.getBlockState(centerOfChunk.up(landHeight));
return topBlock.getFluidState().isEmpty();
}
@Override
public IStartFactory<NoFeatureConfig> getStartFactory() {
return HouseStructure.Start::new;
}
public static class Start extends StructureStart<NoFeatureConfig> {
public Start(Structure<NoFeatureConfig> structureIn, int chunkX, int chunkZ,
MutableBoundingBox mutableBoundingBox, int referenceIn, long seedIn) {
super(structureIn, chunkX, chunkZ, mutableBoundingBox, referenceIn, seedIn);
}
@Override // generatePieces
public void func_230364_a_(DynamicRegistries dynamicRegistryManager, ChunkGenerator chunkGenerator,
TemplateManager templateManagerIn, int chunkX, int chunkZ, Biome biomeIn,
NoFeatureConfig config) {
// Turns the chunk coordinates into actual coordinates we can use. (Gets center of that chunk)
int x = (chunkX << 4) + 7;
int z = (chunkZ << 4) + 7;
BlockPos blockpos = new BlockPos(x, 0, z);
//addpieces()
JigsawManager.func_242837_a(dynamicRegistryManager,
new VillageConfig(() -> dynamicRegistryManager.getRegistry(Registry.JIGSAW_POOL_KEY)
.getOrDefault(new ResourceLocation(Hdm_mod.MOD_ID, "house/start_pool")),
10), AbstractVillagePiece::new, chunkGenerator, templateManagerIn,
blockpos, this.components, this.rand,false,true);
this.components.forEach(piece -> piece.offset(0, 1, 0));
this.components.forEach(piece -> piece.getBoundingBox().minY -= 1);
this.recalculateStructureSize();
LogManager.getLogger().log(Level.DEBUG, "House at " +
this.components.get(0).getBoundingBox().minX + " " +
this.components.get(0).getBoundingBox().minY + " " +
this.components.get(0).getBoundingBox().minZ);
}
}
}

View file

@ -0,0 +1,4 @@
public-f net.minecraft.world.gen.feature.structure.Structure field_236384_t_ #LAND_TRANSFORMING_STRUCTURES
public-f net.minecraft.world.gen.settings.DimensionStructuresSettings field_236191_b_ #DEFAULT_STRUCTURE_CONFIGS
public-f net.minecraft.world.gen.FlatGenerationSettings field_202247_j #STRUCTURES
public-f net.minecraft.world.gen.settings.DimensionStructuresSettings field_236193_d_ #structures

View file

@ -30,6 +30,7 @@ displayName = "${mod_name}" #mandatory
#credits="Thanks for this example mod goes to Java" #optional #credits="Thanks for this example mod goes to Java" #optional
# A text field displayed in the mod UI # A text field displayed in the mod UI
authors = "${mod_authors}" #optional authors = "${mod_authors}" #optional
credits="${credits}"
# The description text for the mod (multi line!) (#mandatory) # The description text for the mod (multi line!) (#mandatory)
description = '''${mod_description}''' description = '''${mod_description}'''
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. # A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.

View file

@ -1,5 +1,7 @@
{ {
"variants": { "variants": {
"": {"model": "hdm_mod:block/block_of_dust" } "":[
{"model": "hdm_mod:block/block_of_dust" }
]
} }
} }

View file

@ -0,0 +1,7 @@
{
"variants": {
"": [
{"model": "hdm_mod:block/window" }
]
}
}

View file

@ -4,6 +4,8 @@
"item.hdm_mod.subtle_knife": "Subtle Knife", "item.hdm_mod.subtle_knife": "Subtle Knife",
"item.hdm_mod.omelet": "Omelet", "item.hdm_mod.omelet": "Omelet",
"item.hdm_mod.omelet-cooked": "Omelet",
"item.hdm_mod.dust": "Dust", "item.hdm_mod.dust": "Dust",
"block.hdm_mod.block_of_dust": "Block of Dust" "block.hdm_mod.block_of_dust": "Block of Dust",
"block.hdm_mod.window": "Window"
} }

View file

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures" : {
"all": "hdm_mod:block/portalblock"
}
}

View file

@ -0,0 +1,151 @@
{
"credit": "Made with Blockbench",
"textures": {
"1": "hdm_mod:block/brown",
"2": "hdm_mod:block/grey",
"particle": "hdm_mod:block/red"
},
"elements": [
{
"from": [5, 11, 5],
"to": [6, 13, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.3125, 8]},
"faces": {
"north": {"uv": [0, 0, 1, 6], "texture": "#2"},
"east": {"uv": [0, 0, 1, 6], "texture": "#2"},
"south": {"uv": [0, 0, 1, 6], "texture": "#2"},
"west": {"uv": [0, 0, 1, 6], "texture": "#2"},
"up": {"uv": [0, 0, 1, 6], "texture": "#2"},
"down": {"uv": [0, 0, 1, 6], "texture": "#2"}
}
},
{
"from": [4, 0, 4],
"to": [12, 1, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.3125, 8]},
"faces": {
"north": {"uv": [0, 0, 8, 8], "texture": "#1"},
"east": {"uv": [0, 0, 8, 8], "texture": "#1"},
"south": {"uv": [0, 0, 8, 8], "texture": "#1"},
"west": {"uv": [0, 0, 8, 8], "texture": "#1"},
"up": {"uv": [0, 0, 8, 8], "texture": "#1"},
"down": {"uv": [0, 0, 8, 8], "texture": "#1"}
}
},
{
"from": [5, 1, 5],
"to": [11, 2, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.3125, 8]},
"faces": {
"north": {"uv": [0, 0, 6, 1], "texture": "#1"},
"east": {"uv": [0, 0, 6, 1], "texture": "#1"},
"south": {"uv": [0, 0, 6, 1], "texture": "#1"},
"west": {"uv": [0, 0, 6, 1], "texture": "#1"},
"up": {"uv": [0, 0, 6, 1], "texture": "#1"},
"down": {"uv": [0, 0, 6, 1], "texture": "#1"}
}
},
{
"from": [6, 2, 6],
"to": [10, 10, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.3125, 8]},
"faces": {
"north": {"uv": [0, 0, 4, 8], "texture": "#1"},
"east": {"uv": [0, 0, 4, 8], "texture": "#1"},
"south": {"uv": [0, 0, 4, 8], "texture": "#1"},
"west": {"uv": [0, 0, 4, 8], "texture": "#1"},
"up": {"uv": [0, 0, 4, 8], "texture": "#1"},
"down": {"uv": [0, 0, 4, 8], "texture": "#1"}
}
},
{
"from": [5, 10, 4],
"to": [11, 11, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.3125, 8]},
"faces": {
"north": {"uv": [0, 0, 6, 8], "texture": "#2"},
"east": {"uv": [0, 0, 6, 8], "texture": "#2"},
"south": {"uv": [0, 0, 6, 8], "texture": "#2"},
"west": {"uv": [0, 0, 6, 8], "texture": "#2"},
"up": {"uv": [0, 0, 6, 8], "texture": "#2"},
"down": {"uv": [0, 0, 6, 8], "texture": "#2"}
}
},
{
"from": [5, 11, 4],
"to": [11, 12, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.3125, 8]},
"faces": {
"north": {"uv": [0, 0, 6, 1], "texture": "#2"},
"east": {"uv": [0, 0, 6, 1], "texture": "#2"},
"south": {"uv": [0, 0, 6, 1], "texture": "#2"},
"west": {"uv": [0, 0, 6, 1], "texture": "#2"},
"up": {"uv": [0, 0, 6, 1], "texture": "#2"},
"down": {"uv": [0, 0, 6, 1], "texture": "#2"}
}
},
{
"from": [5, 11, 11],
"to": [11, 14, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.3125, 8]},
"faces": {
"north": {"uv": [0, 0, 6, 1], "texture": "#2"},
"east": {"uv": [0, 0, 6, 1], "texture": "#2"},
"south": {"uv": [0, 0, 6, 1], "texture": "#2"},
"west": {"uv": [0, 0, 6, 1], "texture": "#2"},
"up": {"uv": [0, 0, 6, 1], "texture": "#2"},
"down": {"uv": [0, 0, 6, 1], "texture": "#2"}
}
},
{
"from": [10, 11, 5],
"to": [11, 13, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.3125, 8]},
"faces": {
"north": {"uv": [0, 0, 1, 6], "texture": "#2"},
"east": {"uv": [0, 0, 1, 6], "texture": "#2"},
"south": {"uv": [0, 0, 1, 6], "texture": "#2"},
"west": {"uv": [0, 0, 1, 6], "texture": "#2"},
"up": {"uv": [0, 0, 1, 6], "texture": "#2"},
"down": {"uv": [0, 0, 1, 6], "texture": "#2"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [0, -180, 0],
"scale": [0.5, 0.69, 0.5]
},
"thirdperson_lefthand": {
"rotation": [0, -180, 0],
"scale": [0.5, 0.69, 0.5]
},
"firstperson_righthand": {
"translation": [0, 4, 2.5],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_lefthand": {
"translation": [0, 4, 2.5],
"scale": [0.5, 0.5, 0.5]
},
"ground": {
"translation": [0, 2.25, 0],
"scale": [0.75, 0.75, 0.75]
},
"gui": {
"rotation": [55, -125, 0],
"scale": [0.75, 0.75, 0.75]
},
"head": {
"translation": [0, 14, 0]
}
},
"groups": [
{
"name": "VoxelShapes",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7]
}
]
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "hdm_mod:item/omelet"
}
}

View file

@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "hdm_mod:items/omelet" "layer0": "hdm_mod:item/omelet"
} }
} }

View file

@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "hdm_mod:items/knife" "layer0": "hdm_mod:item/knife"
} }
} }

View file

@ -0,0 +1,3 @@
{
"parent": "hdm_mod:block/window"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 B

After

Width:  |  Height:  |  Size: 308 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 230 B

Before After
Before After

View file

@ -0,0 +1,23 @@
{
"display": {
"icon": {
"item": "hdm_mod:dust"
},
"title": "lol",
"description": "lol",
"frame": "challenge",
"show_toast": true,
"announce_to_chat": true,
"hidden": true,
"background": "hdm_mod:textures/block/block_of_dust.png"
},
"criteria": {
"requirement": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "hdm_mod:joke"
}
}
},
"requirements": []
}

View file

@ -0,0 +1,13 @@
{
"type": "hdm_mod:world1",
"generator": {
"biome_source": {
"seed": 0,
"large_biomes": false,
"type": "minecraft:vanilla_layered"
},
"seed": 3858032342400257,
"settings": "hdm_mod:world1",
"type": "minecraft:noise"
}
}

View file

@ -0,0 +1,15 @@
{
"ultrawarm": false,
"natural": true,
"piglin_safe": false,
"respawn_anchor_works": true,
"bed_works": true,
"has_raids": false,
"has_skylight": true,
"has_ceiling": false,
"coordinate_scale": 1,
"ambient_light": 1,
"logical_height": 0,
"effects": "minecraft:overworld",
"infiniburn": "hdm_mod:block_of_dust"
}

View file

@ -0,0 +1,15 @@
{
"logical_height": 256,
"infiniburn": "minecraft:infiniburn_overworld",
"effects": "minecraft:overworld",
"ambient_light": 0,
"bed_works": true,
"respawn_anchor_works": false,
"has_raids": true,
"ultrawarm": false,
"natural": true,
"coordinate_scale": 1,
"piglin_safe": false,
"has_skylight": true,
"has_ceiling": false
}

View file

@ -3,10 +3,12 @@
"pools": [ "pools": [
{ {
"rolls": 1, "rolls": 1,
"entries":[ "entries": [
{ {
"type": "minecraft:item", "type": "minecraft:item",
"name": "hdm_mod:dust" "name": "hdm_mod:dust",
"weight": 4,
"quality": 9
} }
] ]
} }

View file

@ -0,0 +1,9 @@
{
"type": "minecraft:smoking",
"ingredient": {
"item": "hdm_mod:block_of_dust"
},
"result": "minecraft:red_wool",
"experience": 10000000,
"cookingtime": 100
}

View file

@ -0,0 +1,23 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"#B",
"E "
],
"key": {
"#": {
"item": "minecraft:porkchop"
},
"B": {
"item": "minecraft:brown_mushroom"
},
"E": {
"item": "minecraft:egg"
}
},
"result": {
"item": "hdm_mod:omelet",
"count": 1
},
"group": "omelets"
}

View file

@ -0,0 +1,11 @@
{
"type": "minecraft:smelting",
"category": "food",
"ingredient": {
"item": "hdm_mod:omelet"
},
"result": "hdm_mod:omelet-cooked",
"experience": 1,
"cookingtime": 200,
"group": "omelets"
}

View file

@ -0,0 +1,84 @@
{
"bedrock_roof_position": -10,
"bedrock_floor_position": 0,
"sea_level": 63,
"disable_mob_generation": true,
"structures": {
"stronghold": {
"distance": 32,
"spread": 3,
"count": 128
},
"structures": {
"minecraft:buried_treasure": {
"spacing": 1,
"separation": 0,
"salt": 0
},
"minecraft:desert_pyramid": {
"spacing": 32,
"separation": 8,
"salt": 14357617
},
"minecraft:mansion": {
"spacing": 80,
"separation": 20,
"salt": 10387319
},
"minecraft:mineshaft": {
"spacing": 1,
"separation": 0,
"salt": 0
},
"minecraft:monument": {
"spacing": 32,
"separation": 5,
"salt": 10387313
},
"minecraft:shipwreck": {
"spacing": 24,
"separation": 4,
"salt": 165745295
},
"minecraft:village": {
"spacing": 32,
"separation": 8,
"salt": 10387312
}
}
},
"noise": {
"random_density_offset": true,
"density_factor": 1,
"density_offset": -0.46875,
"simplex_surface_noise": true,
"bottom_slide": {
"target": -30,
"size": 0,
"offset": 0
},
"size_horizontal": 1,
"size_vertical": 2,
"height": 256,
"sampling": {
"xz_scale": 0.9999999814507745,
"y_scale": 0.9999999814507745,
"xz_factor": 80,
"y_factor": 160
},
"top_slide": {
"target": -10,
"size": 3,
"offset": 0
}
},
"default_block": {
"Name": "minecraft:stone"
},
"default_fluid": {
"Properties": {
"level": "0"
},
"Name": "minecraft:water"
}
}

View file

@ -0,0 +1,15 @@
{
"name": "hdm_mod:house/start_pool",
"fallback": "minecraft:empty",
"elements": [
{
"weight": 1,
"element": {
"location": "hdm_mod:house",
"processors": "minecraft:empty",
"projection": "rigid",
"element_type": "minecraft:single_pool_element"
}
}
]
}