Compare commits

...

3 commits

Author SHA1 Message Date
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
14 changed files with 285 additions and 4 deletions

View file

@ -1,5 +1,5 @@
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
minecraft_version=1.16.5
# The Minecraft version range can use any release version of Minecraft as bounds.

View file

@ -2,6 +2,8 @@ package us.minecraftchest2.hdm_mod;
import net.minecraft.block.Block;
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.event.RegistryEvent;
import net.minecraftforge.eventbus.api.IEventBus;
@ -20,6 +22,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import us.minecraftchest2.hdm_mod.block.ModBlocks;
import us.minecraftchest2.hdm_mod.item.ModItems;
import us.minecraftchest2.hdm_mod.world.structure.ModStructures;
//import us.minecraftchest2.hdm_mod.init.ItemInit;
import java.util.stream.Collectors;
@ -39,6 +42,8 @@ public class Hdm_mod {
ModItems.register(modEventBus1);
ModBlocks.register(modEventBus1);
ModStructures.register(modEventBus1);
modEventBus1.addListener(this::setup);
// Register the enqueueIMC method for modloading
modEventBus1.addListener(this::enqueueIMC);
@ -66,6 +71,8 @@ public class Hdm_mod {
private void doClientStuff(final FMLClientSetupEvent event) {
// do something that can only be done on the client
event.enqueueWork(() -> {
});
}
private void enqueueIMC(final InterModEnqueueEvent event) {

View file

@ -3,6 +3,7 @@ package us.minecraftchest2.hdm_mod.block;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.material.Material;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;

View file

@ -1,11 +1,17 @@
package us.minecraftchest2.hdm_mod.item;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Food;
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.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import us.minecraftchest2.hdm_mod.Hdm_mod;
import us.minecraftchest2.hdm_mod.block.ModBlocks;
import us.minecraftchest2.hdm_mod.item.custom.SubtleKnife;
public class ModItems {
@ -18,12 +24,13 @@ public class ModItems {
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",
() -> 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) {
ITEMS.register(eventBus);

View file

@ -132,6 +132,9 @@ public class SimpleTeleporter implements ITeleporter {
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);

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.DustHouseStructure;
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", DustHouseStructure::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 org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import us.minecraftchest2.hdm_mod.Hdm_mod;
public class DustHouseStructure extends Structure<NoFeatureConfig> {
public DustHouseStructure() {
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 DustHouseStructure.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

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

View file

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

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,15 @@
{
"name": "tutorialmod:house/start_pool",
"fallback": "minecraft:empty",
"elements": [
{
"weight": 1,
"element": {
"location": "tutorialmod:house",
"processors": "minecraft:empty",
"projection": "rigid",
"element_type": "minecraft:single_pool_element"
}
}
]
}