From 15a251ed9c6661080c2047c9d5a7a72c1066e2b4 Mon Sep 17 00:00:00 2001 From: Glitchlabs Date: Tue, 4 Aug 2026 16:06:43 +0200 Subject: [PATCH] + fan_block + redstone_powered_fan_block --- gradle.properties | 2 +- .../5537763371ce84515b2ba566a215878d32b7df83 | 6 +- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 3 +- .../8eabf35e4ef64464e61dd27839db58b6edc7b568 | 4 +- .../assets/ornamentum/lang/en_us.json | 1 + .../tags/block/mineable/pickaxe.json | 1 + .../tags/block/needs_stone_tool.json | 3 +- .../blocks/redstone_powered_fan_block.json | 21 +++++ .../ornamentum/blocks/ModBlocks.java | 3 + .../ornamentum/blocks/custom/FanBlock.java | 10 --- .../blocks/custom/RedstonePowerdFanBlock.java | 86 +++++++++++++++++++ .../datagen/ModBlockLootTableProvider.java | 1 + .../datagen/ModBlockTagProvider.java | 2 + .../datagen/ModLanguageProvider.java | 1 + .../redstone_powered_fan_block.json | 10 +++ .../item/redstone_powered_fan_block.json | 3 + .../data/ornamentum/recipe/fan_block.json | 11 +++ .../recipe/redstone_powered_fan_block.json | 16 ++++ 18 files changed, 166 insertions(+), 18 deletions(-) create mode 100644 src/generated/resources/data/ornamentum/loot_table/blocks/redstone_powered_fan_block.json create mode 100644 src/main/java/ovh/glitchlabs/ornamentum/blocks/custom/RedstonePowerdFanBlock.java create mode 100644 src/main/resources/assets/ornamentum/blockstates/redstone_powered_fan_block.json create mode 100644 src/main/resources/assets/ornamentum/models/item/redstone_powered_fan_block.json create mode 100644 src/main/resources/data/ornamentum/recipe/fan_block.json create mode 100644 src/main/resources/data/ornamentum/recipe/redstone_powered_fan_block.json diff --git a/gradle.properties b/gradle.properties index 5be21c5..9b1c9ba 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,7 +27,7 @@ mod_name=Ornamentum ## The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=All Rights Reserved # The mod version. See https://semver.org/ -mod_version=1.3.0 +mod_version=1.4.0 # 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. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/generated/resources/.cache/5537763371ce84515b2ba566a215878d32b7df83 b/src/generated/resources/.cache/5537763371ce84515b2ba566a215878d32b7df83 index 1eb3c0c..91ab0a6 100644 --- a/src/generated/resources/.cache/5537763371ce84515b2ba566a215878d32b7df83 +++ b/src/generated/resources/.cache/5537763371ce84515b2ba566a215878d32b7df83 @@ -1,4 +1,4 @@ -// 1.21.1 2026-08-04T15:40:22.174290355 Tags for minecraft:block mod id ornamentum +// 1.21.1 2026-08-04T16:04:14.852760951 Tags for minecraft:block mod id ornamentum 585e131e594c65c425b3e81803fae3fdd63e2f03 data/c/tags/block/concretes.json 354a0712e83c8365d9054ffc2a122cf7dd69ad53 data/c/tags/block/dyed.json 8281ec180c87b02f17e4be444a350685b52f1e31 data/c/tags/block/dyed/black.json @@ -31,10 +31,10 @@ ae7d2e386f2eb4df7cd8f8f3e0a4040cae7a13bf data/minecraft/tags/block/incorrect_for 5bf3d2f5afa06168fa3bb8de07bdbaff4f7980db data/minecraft/tags/block/incorrect_for_stone_tool.json ae7d2e386f2eb4df7cd8f8f3e0a4040cae7a13bf data/minecraft/tags/block/incorrect_for_wooden_tool.json 26a948fa0b92ea3e254ed5b6aa26e1ab478e0715 data/minecraft/tags/block/mineable/axe.json -d069cc13cfb3d900d448089fa1423891be6b25a7 data/minecraft/tags/block/mineable/pickaxe.json +fbbc0d0870ebfa49c503bf457142a372c8a9efd1 data/minecraft/tags/block/mineable/pickaxe.json ec379d82d3fd4ddd3a9f6664ddb9aaaf0290834d data/minecraft/tags/block/needs_diamond_tool.json bad82b905081d37caba6026145cd8611bd369d5c data/minecraft/tags/block/needs_iron_tool.json -20f898296b7e69ff74393d2b1d7e15dbfae5e8b5 data/minecraft/tags/block/needs_stone_tool.json +66f17565eae49456c2f69d2fbedb9ac92ef1c90e data/minecraft/tags/block/needs_stone_tool.json 8b771a730def8958b41eb9c4e3b6628365c5d429 data/minecraft/tags/block/occludes_vibration_signals.json aad2571fcde7dc73bb943c24237eb17699067cfb data/minecraft/tags/block/sculk_replaceable.json 6014324ec06e8974ac7b92e7c0724c7710a6331c data/minecraft/tags/block/sculk_replaceable_world_gen.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index cd697e5..ce40ac4 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.21.1 2026-08-04T15:40:22.170254506 Loot Tables +// 1.21.1 2026-08-04T16:04:14.84763909 Loot Tables b840d3c223a8269ea4ead11f9d1a337f16c87728 data/ornamentum/loot_table/blocks/agender_flag.json c5c3cbbff0b4af321ae05896dbd68e551f598c86 data/ornamentum/loot_table/blocks/amethyst_grate.json f44341b5b821a1ea423b1f9e81a020e324a3952e data/ornamentum/loot_table/blocks/ametist_bricks.json @@ -253,6 +253,7 @@ c8ed783c578945eba756818d8115020a3ab779ce data/ornamentum/loot_table/blocks/red_g a3838e224bc3635d7edc30d40f91c29acc6dc855 data/ornamentum/loot_table/blocks/red_pattern_block_stairs.json f477ebd0e0fe21e7be3e81bf4aa99a794773eb9b data/ornamentum/loot_table/blocks/red_wool_slab.json 46cbc6cb332d5a9f3665d87af3d6b1b8a32c6836 data/ornamentum/loot_table/blocks/red_wool_stairs.json +a915187cc084eada3434a9d5a3b897a453cfb32b data/ornamentum/loot_table/blocks/redstone_powered_fan_block.json 1507f4311dcc09e0f57838231d41b03901f4aeb6 data/ornamentum/loot_table/blocks/smooth_basalt_bricks.json 2cbe0836062a04955c5b0e14b3e0e7d5d5d0e3d4 data/ornamentum/loot_table/blocks/smooth_basalt_bricks_slab.json 70acce0530e54306728421b99736d889bb563a52 data/ornamentum/loot_table/blocks/smooth_basalt_bricks_stairs.json diff --git a/src/generated/resources/.cache/8eabf35e4ef64464e61dd27839db58b6edc7b568 b/src/generated/resources/.cache/8eabf35e4ef64464e61dd27839db58b6edc7b568 index 14d0ccd..a4d08d4 100644 --- a/src/generated/resources/.cache/8eabf35e4ef64464e61dd27839db58b6edc7b568 +++ b/src/generated/resources/.cache/8eabf35e4ef64464e61dd27839db58b6edc7b568 @@ -1,2 +1,2 @@ -// 1.21.1 2026-08-04T15:40:22.173401134 Languages: en_us for mod: ornamentum -62aa32c03952421205e9465fffaf8a6f551b9fd9 assets/ornamentum/lang/en_us.json +// 1.21.1 2026-08-04T16:04:14.851766142 Languages: en_us for mod: ornamentum +90a337aff5d6d319f41ac424b31c282a95e30b9f assets/ornamentum/lang/en_us.json diff --git a/src/generated/resources/assets/ornamentum/lang/en_us.json b/src/generated/resources/assets/ornamentum/lang/en_us.json index f63a257..5300080 100644 --- a/src/generated/resources/assets/ornamentum/lang/en_us.json +++ b/src/generated/resources/assets/ornamentum/lang/en_us.json @@ -253,6 +253,7 @@ "block.ornamentum.red_pattern_block_stairs": "Red Pattern Block Stairs", "block.ornamentum.red_wool_slab": "Red Wool Slab", "block.ornamentum.red_wool_stairs": "Red Wool Stairs", + "block.ornamentum.redstone_powered_fan_block": "Redstone Powered Fan Block", "block.ornamentum.smooth_basalt_bricks": "Purpur Bricks", "block.ornamentum.smooth_basalt_bricks_slab": "Purpur Bricks Slab", "block.ornamentum.smooth_basalt_bricks_stairs": "Purpur Bricks Stairs", diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json index 1c66f97..1ef78c6 100644 --- a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -1,6 +1,7 @@ { "values": [ "ornamentum:fan_block", + "ornamentum:redstone_powered_fan_block", "ornamentum:link_block", "ornamentum:iron_shelf", "ornamentum:red_pattern_block", diff --git a/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json b/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json index 6d983ae..aa06727 100644 --- a/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json +++ b/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json @@ -3,6 +3,7 @@ "ornamentum:iron_shelf", "ornamentum:iron_grate", "ornamentum:link_block", - "ornamentum:fan_block" + "ornamentum:fan_block", + "ornamentum:redstone_powered_fan_block" ] } \ No newline at end of file diff --git a/src/generated/resources/data/ornamentum/loot_table/blocks/redstone_powered_fan_block.json b/src/generated/resources/data/ornamentum/loot_table/blocks/redstone_powered_fan_block.json new file mode 100644 index 0000000..1b6ff2a --- /dev/null +++ b/src/generated/resources/data/ornamentum/loot_table/blocks/redstone_powered_fan_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ornamentum:redstone_powered_fan_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ornamentum:blocks/redstone_powered_fan_block" +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/ornamentum/blocks/ModBlocks.java b/src/main/java/ovh/glitchlabs/ornamentum/blocks/ModBlocks.java index 4d580b4..11dc921 100644 --- a/src/main/java/ovh/glitchlabs/ornamentum/blocks/ModBlocks.java +++ b/src/main/java/ovh/glitchlabs/ornamentum/blocks/ModBlocks.java @@ -17,6 +17,9 @@ public class ModBlocks { public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(Ornamentum.MODID); + public static final DeferredBlock REDSTONE_POWERED_FAN_BLOCK = registerBlock("redstone_powered_fan_block", + () -> new RedstonePowerdFanBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK).noOcclusion())); + public static final DeferredBlock FAN_BLOCK = registerBlock("fan_block", () -> new FanBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK).noOcclusion())); diff --git a/src/main/java/ovh/glitchlabs/ornamentum/blocks/custom/FanBlock.java b/src/main/java/ovh/glitchlabs/ornamentum/blocks/custom/FanBlock.java index 98f06a2..d449996 100644 --- a/src/main/java/ovh/glitchlabs/ornamentum/blocks/custom/FanBlock.java +++ b/src/main/java/ovh/glitchlabs/ornamentum/blocks/custom/FanBlock.java @@ -16,16 +16,10 @@ import java.util.Deque; import java.util.HashSet; import java.util.Set; -/** - * A block that can be toggled on/off via shift-right-click. - * Toggling propagates through directly adjacent FanBlocks (BFS / flood-fill), - * similar to how a redstone wire network shares state. - */ public class FanBlock extends Block { public static final BooleanProperty ON = BooleanProperty.create("on"); - // Safety cap so an absurdly large network can't cause a huge single-tick update. private static final int MAX_NETWORK_SIZE = 4096; public FanBlock(Properties properties) { @@ -49,10 +43,6 @@ public class FanBlock extends Block { return InteractionResult.PASS; } - /** - * Flood-fills outward from {@code origin} through orthogonally adjacent FanBlocks - * and sets all of them to {@code newState}. - */ private void toggleNetwork(Level level, BlockPos origin, boolean newState) { Set visited = new HashSet<>(); Deque queue = new ArrayDeque<>(); diff --git a/src/main/java/ovh/glitchlabs/ornamentum/blocks/custom/RedstonePowerdFanBlock.java b/src/main/java/ovh/glitchlabs/ornamentum/blocks/custom/RedstonePowerdFanBlock.java new file mode 100644 index 0000000..ad66458 --- /dev/null +++ b/src/main/java/ovh/glitchlabs/ornamentum/blocks/custom/RedstonePowerdFanBlock.java @@ -0,0 +1,86 @@ +package ovh.glitchlabs.ornamentum.blocks.custom; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +import javax.annotation.Nullable; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashSet; +import java.util.Set; + +public class RedstonePowerdFanBlock extends Block { + + public static final BooleanProperty ON = BooleanProperty.create("on"); + + private static final int MAX_NETWORK_SIZE = 4096; + + public RedstonePowerdFanBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(ON, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(ON); + } + + @Override + protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + if (!oldState.is(state.getBlock()) && !level.isClientSide) { + boolean powered = level.hasNeighborSignal(pos); + if (powered != state.getValue(ON)) { + toggleNetwork(level, pos, powered); + } + } + } + + @Override + protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, @Nullable BlockPos fromPos, boolean isMoving) { + if (!level.isClientSide) { + boolean powered = level.hasNeighborSignal(pos); + if (powered != state.getValue(ON)) { + toggleNetwork(level, pos, powered); + } + } + } + + private void toggleNetwork(Level level, BlockPos origin, boolean newState) { + Set visited = new HashSet<>(); + Deque queue = new ArrayDeque<>(); + + visited.add(origin.immutable()); + queue.add(origin); + + while (!queue.isEmpty() && visited.size() <= MAX_NETWORK_SIZE) { + BlockPos pos = queue.poll(); + BlockState state = level.getBlockState(pos); + + if (!(state.getBlock() instanceof RedstonePowerdFanBlock)) { + continue; + } + + if (state.getValue(ON) != newState) { + level.setBlock(pos, state.setValue(ON, newState), Block.UPDATE_ALL); + } + + for (Direction direction : Direction.values()) { + BlockPos neighborPos = pos.relative(direction); + if (visited.contains(neighborPos)) { + continue; + } + + BlockState neighborState = level.getBlockState(neighborPos); + if (neighborState.getBlock() instanceof RedstonePowerdFanBlock) { + visited.add(neighborPos.immutable()); + queue.add(neighborPos); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModBlockLootTableProvider.java b/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModBlockLootTableProvider.java index 2b2c249..314bc5f 100644 --- a/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModBlockLootTableProvider.java +++ b/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModBlockLootTableProvider.java @@ -19,6 +19,7 @@ public class ModBlockLootTableProvider extends BlockLootSubProvider { dropSelf(ModBlocks.DUCK.get()); dropSelf(ModBlocks.FAN_BLOCK.get()); + dropSelf(ModBlocks.REDSTONE_POWERED_FAN_BLOCK.get()); dropSelf(ModBlocks.BABY_TURTLE.get()); dropSelf(ModBlocks.LINK_BLOCK.get()); dropSelf(ModBlocks.IRON_SHELF.get()); diff --git a/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModBlockTagProvider.java b/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModBlockTagProvider.java index aaef439..9176efc 100644 --- a/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModBlockTagProvider.java +++ b/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModBlockTagProvider.java @@ -91,6 +91,7 @@ public class ModBlockTagProvider extends BlockTagsProvider { tag(BlockTags.MINEABLE_WITH_PICKAXE) .add(ModBlocks.FAN_BLOCK.get()) + .add(ModBlocks.REDSTONE_POWERED_FAN_BLOCK.get()) .add(ModBlocks.LINK_BLOCK.get()) .add(ModBlocks.IRON_SHELF.get()) @@ -406,6 +407,7 @@ public class ModBlockTagProvider extends BlockTagsProvider { .add(ModBlocks.IRON_GRATE.get()) .add(ModBlocks.LINK_BLOCK.get()) .add(ModBlocks.FAN_BLOCK.get()) + .add(ModBlocks.REDSTONE_POWERED_FAN_BLOCK.get()) ; tag(BlockTags.INCORRECT_FOR_GOLD_TOOL) diff --git a/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModLanguageProvider.java b/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModLanguageProvider.java index 561836a..c104693 100644 --- a/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModLanguageProvider.java +++ b/src/main/java/ovh/glitchlabs/ornamentum/datagen/ModLanguageProvider.java @@ -343,6 +343,7 @@ public class ModLanguageProvider extends LanguageProvider { add(ModBlocks.LINK_BLOCK.get(), "Link Block"); add(ModBlocks.FAN_BLOCK.get(), "Fan Block"); + add(ModBlocks.REDSTONE_POWERED_FAN_BLOCK.get(), "Redstone Powered Fan Block"); add(ModBlocks.IRON_SHELF.get(), "Iron Shelf"); add(ModBlocks.DUCK.get(), "Duck"); diff --git a/src/main/resources/assets/ornamentum/blockstates/redstone_powered_fan_block.json b/src/main/resources/assets/ornamentum/blockstates/redstone_powered_fan_block.json new file mode 100644 index 0000000..b0d1d6d --- /dev/null +++ b/src/main/resources/assets/ornamentum/blockstates/redstone_powered_fan_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "on=false": { + "model": "ornamentum:block/fan_block" + }, + "on=true": { + "model": "ornamentum:block/fan_block_on" + } + } +} diff --git a/src/main/resources/assets/ornamentum/models/item/redstone_powered_fan_block.json b/src/main/resources/assets/ornamentum/models/item/redstone_powered_fan_block.json new file mode 100644 index 0000000..5be5fc0 --- /dev/null +++ b/src/main/resources/assets/ornamentum/models/item/redstone_powered_fan_block.json @@ -0,0 +1,3 @@ +{ + "parent": "ornamentum:block/fan_block_on" +} \ No newline at end of file diff --git a/src/main/resources/data/ornamentum/recipe/fan_block.json b/src/main/resources/data/ornamentum/recipe/fan_block.json new file mode 100644 index 0000000..53d423e --- /dev/null +++ b/src/main/resources/data/ornamentum/recipe/fan_block.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:stonecutting", + "group": "Ornamentum", + "ingredient": { + "item": "minecraft:iron_block" + }, + "result": { + "count": 1, + "id": "ornamentum:fan_block" + } +} \ No newline at end of file diff --git a/src/main/resources/data/ornamentum/recipe/redstone_powered_fan_block.json b/src/main/resources/data/ornamentum/recipe/redstone_powered_fan_block.json new file mode 100644 index 0000000..c4e185e --- /dev/null +++ b/src/main/resources/data/ornamentum/recipe/redstone_powered_fan_block.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "ornamentum:fan_block" + }, + { + "item": "ornamentum:fan_block" + } + ], + "result": { + "count": 1, + "id": "ornamentum:redstone_powered_fan_block" + } +} \ No newline at end of file