From de7acfee50df0c6b54a327a450f73ece3059a3d1 Mon Sep 17 00:00:00 2001 From: Adrien1106 Date: Tue, 5 Mar 2024 21:54:36 +0100 Subject: [PATCH] moved and created data generation for all elements other than models + removed block that aren't working + cleanup --- gradle.properties | 2 +- .../java/fr/adrien1106/reframed/ReFramed.java | 38 +- .../reframed/block/ReFramedBlock.java | 195 ++-------- .../reframed/block/ReFramedButtonBlock.java | 95 ----- .../reframed/block/ReFramedCandleBlock.java | 92 ----- .../reframed/block/ReFramedCarpetBlock.java | 87 ----- .../reframed/block/ReFramedDoorBlock.java | 89 ----- .../reframed/block/ReFramedDoubleBlock.java | 39 +- .../block/ReFramedDoubleSlabBlock.java | 23 +- .../block/ReFramedDoubleStairsBlock.java | 41 ++- .../block/ReFramedDoubleStepBlock.java | 118 ++++++ .../reframed/block/ReFramedEntity.java | 5 +- .../reframed/block/ReFramedFenceBlock.java | 87 ----- .../block/ReFramedFenceGateBlock.java | 98 ----- .../reframed/block/ReFramedLeverBlock.java | 90 ----- .../reframed/block/ReFramedPaneBlock.java | 87 ----- .../reframed/block/ReFramedPostBlock.java | 57 --- .../block/ReFramedPressurePlateBlock.java | 89 ----- .../reframed/block/ReFramedSlabBlock.java | 27 +- .../reframed/block/ReFramedStairsBlock.java | 341 ++++++++---------- .../reframed/block/ReFramedStepBlock.java | 136 +++++++ .../reframed/block/ReFramedTrapdoorBlock.java | 94 ----- .../reframed/block/ReFramedWallBlock.java | 130 ------- .../WaterloggableReFramedDoubleBlock.java | 43 +++ .../reframed/client/ReFramedClient.java | 61 +--- .../generator/BlockStateProvider.java | 7 + .../reframed/generator/GAdvancement.java | 44 +++ .../reframed/generator/GBlockLoot.java | 3 +- .../reframed/generator/GBlockTag.java | 22 ++ .../reframed/generator/GBlockstate.java | 23 +- .../reframed/generator/GLanguage.java | 30 ++ .../reframed/generator/GRecipe.java | 19 + .../reframed/generator/Generator.java | 19 +- .../MultipartBlockStateProvider.java | 7 - .../reframed/generator/RecipeSetter.java | 8 + .../IndiumTerrainBlockRenderInfoMixin.java | 4 +- .../SodiumBlockOcclusionCacheMixin.java | 4 +- .../mixin/render/BlockRenderInfoMixin.java | 4 +- .../mixin/sound/LivingEntityMixin.java | 2 +- .../adrien1106/reframed/util/BlockHelper.java | 305 ++++++++++++++++ .../reframed/util/BlockProperties.java | 12 + .../util/ReFramedInteractionUtil.java | 195 ---------- .../{StairDirection.java => Corner.java} | 22 +- .../assets/reframed/blockstates/button.json | 118 ------ .../assets/reframed/blockstates/candle.json | 16 - .../assets/reframed/blockstates/carpet.json | 7 - .../assets/reframed/blockstates/cube.json | 7 - .../assets/reframed/blockstates/door.json | 124 ------- .../assets/reframed/blockstates/fence.json | 48 --- .../reframed/blockstates/fence_gate.json | 80 ---- .../reframed/blockstates/iron_door.json | 124 ------- .../reframed/blockstates/iron_trapdoor.json | 69 ---- .../assets/reframed/blockstates/lever.json | 110 ------ .../assets/reframed/blockstates/pane.json | 77 ---- .../assets/reframed/blockstates/post.json | 19 - .../reframed/blockstates/pressure_plate.json | 10 - .../assets/reframed/blockstates/trapdoor.json | 69 ---- .../assets/reframed/blockstates/wall.json | 90 ----- .../resources/assets/reframed/lang/en_us.json | 22 -- .../models/block/fence_post_inventory.json | 41 --- .../reframed/models/block/fence_side.json | 60 --- .../models/block/glass_pane_side.json | 32 -- .../models/block/glass_pane_side_alt.json | 32 -- .../assets/reframed/models/block/lever.json | 71 ---- .../reframed/models/block/lever_on.json | 71 ---- .../assets/reframed/models/block/step.json | 35 ++ .../models/block/step_complement_slab.json | 35 ++ .../reframed/models/block/step_side.json | 35 ++ .../block/step_side_complement_slab.json | 35 ++ .../reframed/models/block/trapdoor_open.json | 43 --- .../reframed/models/block/wall_side.json | 28 -- .../reframed/models/block/wall_side_tall.json | 28 -- .../assets/reframed/models/item/candle.json | 6 - .../assets/reframed/models/item/door.json | 6 - .../reframed/models/item/iron_door.json | 6 - .../assets/reframed/models/item/lever.json | 6 - .../assets/reframed/models/item/pane.json | 6 - .../assets/reframed/textures/item/candle.png | Bin 566 -> 0 bytes .../assets/reframed/textures/item/door.png | Bin 857 -> 0 bytes .../assets/reframed/textures/item/lever.png | Bin 535 -> 0 bytes .../data/minecraft/tags/blocks/candles.json | 6 - .../data/minecraft/tags/blocks/doors.json | 6 - .../minecraft/tags/blocks/fence_gates.json | 6 - .../minecraft/tags/blocks/mineable/axe.json | 20 - .../tags/blocks/mineable/pickaxe.json | 7 - .../data/minecraft/tags/blocks/trapdoors.json | 6 - .../data/minecraft/tags/blocks/walls.json | 6 - .../minecraft/tags/blocks/wooden_buttons.json | 6 - .../minecraft/tags/blocks/wooden_doors.json | 6 - .../minecraft/tags/blocks/wooden_fences.json | 6 - .../tags/blocks/wooden_pressure_plates.json | 6 - .../minecraft/tags/blocks/wooden_slabs.json | 6 - .../minecraft/tags/blocks/wooden_stairs.json | 6 - .../tags/blocks/wooden_trapdoors.json | 6 - .../minecraft/tags/blocks/wool_carpets.json | 6 - .../data/minecraft/tags/items/candles.json | 6 - .../data/minecraft/tags/items/doors.json | 6 - .../minecraft/tags/items/fence_gates.json | 6 - .../data/minecraft/tags/items/trapdoors.json | 6 - .../data/minecraft/tags/items/walls.json | 6 - .../minecraft/tags/items/wooden_buttons.json | 6 - .../minecraft/tags/items/wooden_doors.json | 6 - .../minecraft/tags/items/wooden_fences.json | 6 - .../tags/items/wooden_pressure_plates.json | 6 - .../minecraft/tags/items/wooden_slabs.json | 6 - .../minecraft/tags/items/wooden_stairs.json | 6 - .../tags/items/wooden_trapdoors.json | 6 - .../minecraft/tags/items/wool_carpets.json | 6 - .../recipes/decorations/reframed.json | 41 --- .../reframed/loot_tables/blocks/candle.json | 63 ---- .../reframed/loot_tables/blocks/door.json | 28 -- .../loot_tables/blocks/iron_door.json | 28 -- .../data/reframed/recipes/button.json | 20 - .../data/reframed/recipes/candle.json | 24 -- .../data/reframed/recipes/carpet.json | 20 - .../resources/data/reframed/recipes/cube.json | 21 -- .../resources/data/reframed/recipes/door.json | 21 -- .../data/reframed/recipes/fence.json | 20 - .../data/reframed/recipes/fence_gate.json | 20 - .../data/reframed/recipes/iron_door.json | 24 -- .../data/reframed/recipes/iron_trapdoor.json | 24 -- .../data/reframed/recipes/lever.json | 24 -- .../resources/data/reframed/recipes/pane.json | 21 -- .../resources/data/reframed/recipes/post.json | 21 -- .../data/reframed/recipes/pressure_plate.json | 20 - .../resources/data/reframed/recipes/slab.json | 20 - .../data/reframed/recipes/stairs.json | 21 -- .../data/reframed/recipes/trapdoor.json | 21 -- .../resources/data/reframed/recipes/wall.json | 21 -- 129 files changed, 1210 insertions(+), 3956 deletions(-) delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedButtonBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedCandleBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedCarpetBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedDoorBlock.java create mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleStepBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedFenceBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedFenceGateBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedLeverBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedPaneBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedPostBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedPressurePlateBlock.java create mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedStepBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedTrapdoorBlock.java delete mode 100644 src/main/java/fr/adrien1106/reframed/block/ReFramedWallBlock.java create mode 100644 src/main/java/fr/adrien1106/reframed/block/WaterloggableReFramedDoubleBlock.java create mode 100644 src/main/java/fr/adrien1106/reframed/generator/BlockStateProvider.java create mode 100644 src/main/java/fr/adrien1106/reframed/generator/GAdvancement.java create mode 100644 src/main/java/fr/adrien1106/reframed/generator/GBlockTag.java create mode 100644 src/main/java/fr/adrien1106/reframed/generator/GLanguage.java create mode 100644 src/main/java/fr/adrien1106/reframed/generator/GRecipe.java delete mode 100644 src/main/java/fr/adrien1106/reframed/generator/MultipartBlockStateProvider.java create mode 100644 src/main/java/fr/adrien1106/reframed/generator/RecipeSetter.java create mode 100644 src/main/java/fr/adrien1106/reframed/util/BlockHelper.java create mode 100644 src/main/java/fr/adrien1106/reframed/util/BlockProperties.java delete mode 100644 src/main/java/fr/adrien1106/reframed/util/ReFramedInteractionUtil.java rename src/main/java/fr/adrien1106/reframed/util/property/{StairDirection.java => Corner.java} (77%) delete mode 100644 src/main/resources/assets/reframed/blockstates/button.json delete mode 100644 src/main/resources/assets/reframed/blockstates/candle.json delete mode 100644 src/main/resources/assets/reframed/blockstates/carpet.json delete mode 100644 src/main/resources/assets/reframed/blockstates/cube.json delete mode 100644 src/main/resources/assets/reframed/blockstates/door.json delete mode 100644 src/main/resources/assets/reframed/blockstates/fence.json delete mode 100644 src/main/resources/assets/reframed/blockstates/fence_gate.json delete mode 100644 src/main/resources/assets/reframed/blockstates/iron_door.json delete mode 100644 src/main/resources/assets/reframed/blockstates/iron_trapdoor.json delete mode 100644 src/main/resources/assets/reframed/blockstates/lever.json delete mode 100644 src/main/resources/assets/reframed/blockstates/pane.json delete mode 100644 src/main/resources/assets/reframed/blockstates/post.json delete mode 100644 src/main/resources/assets/reframed/blockstates/pressure_plate.json delete mode 100644 src/main/resources/assets/reframed/blockstates/trapdoor.json delete mode 100644 src/main/resources/assets/reframed/blockstates/wall.json delete mode 100644 src/main/resources/assets/reframed/lang/en_us.json delete mode 100644 src/main/resources/assets/reframed/models/block/fence_post_inventory.json delete mode 100644 src/main/resources/assets/reframed/models/block/fence_side.json delete mode 100644 src/main/resources/assets/reframed/models/block/glass_pane_side.json delete mode 100644 src/main/resources/assets/reframed/models/block/glass_pane_side_alt.json delete mode 100644 src/main/resources/assets/reframed/models/block/lever.json delete mode 100644 src/main/resources/assets/reframed/models/block/lever_on.json create mode 100644 src/main/resources/assets/reframed/models/block/step.json create mode 100644 src/main/resources/assets/reframed/models/block/step_complement_slab.json create mode 100644 src/main/resources/assets/reframed/models/block/step_side.json create mode 100644 src/main/resources/assets/reframed/models/block/step_side_complement_slab.json delete mode 100644 src/main/resources/assets/reframed/models/block/trapdoor_open.json delete mode 100644 src/main/resources/assets/reframed/models/block/wall_side.json delete mode 100644 src/main/resources/assets/reframed/models/block/wall_side_tall.json delete mode 100644 src/main/resources/assets/reframed/models/item/candle.json delete mode 100644 src/main/resources/assets/reframed/models/item/door.json delete mode 100644 src/main/resources/assets/reframed/models/item/iron_door.json delete mode 100644 src/main/resources/assets/reframed/models/item/lever.json delete mode 100644 src/main/resources/assets/reframed/models/item/pane.json delete mode 100644 src/main/resources/assets/reframed/textures/item/candle.png delete mode 100644 src/main/resources/assets/reframed/textures/item/door.png delete mode 100644 src/main/resources/assets/reframed/textures/item/lever.png delete mode 100644 src/main/resources/data/minecraft/tags/blocks/candles.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/doors.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/fence_gates.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/mineable/axe.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/trapdoors.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/walls.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/wooden_buttons.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/wooden_doors.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/wooden_fences.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/wooden_slabs.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/wooden_stairs.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/wooden_trapdoors.json delete mode 100644 src/main/resources/data/minecraft/tags/blocks/wool_carpets.json delete mode 100644 src/main/resources/data/minecraft/tags/items/candles.json delete mode 100644 src/main/resources/data/minecraft/tags/items/doors.json delete mode 100644 src/main/resources/data/minecraft/tags/items/fence_gates.json delete mode 100644 src/main/resources/data/minecraft/tags/items/trapdoors.json delete mode 100644 src/main/resources/data/minecraft/tags/items/walls.json delete mode 100644 src/main/resources/data/minecraft/tags/items/wooden_buttons.json delete mode 100644 src/main/resources/data/minecraft/tags/items/wooden_doors.json delete mode 100644 src/main/resources/data/minecraft/tags/items/wooden_fences.json delete mode 100644 src/main/resources/data/minecraft/tags/items/wooden_pressure_plates.json delete mode 100644 src/main/resources/data/minecraft/tags/items/wooden_slabs.json delete mode 100644 src/main/resources/data/minecraft/tags/items/wooden_stairs.json delete mode 100644 src/main/resources/data/minecraft/tags/items/wooden_trapdoors.json delete mode 100644 src/main/resources/data/minecraft/tags/items/wool_carpets.json delete mode 100644 src/main/resources/data/reframed/advancements/recipes/decorations/reframed.json delete mode 100644 src/main/resources/data/reframed/loot_tables/blocks/candle.json delete mode 100644 src/main/resources/data/reframed/loot_tables/blocks/door.json delete mode 100644 src/main/resources/data/reframed/loot_tables/blocks/iron_door.json delete mode 100644 src/main/resources/data/reframed/recipes/button.json delete mode 100644 src/main/resources/data/reframed/recipes/candle.json delete mode 100644 src/main/resources/data/reframed/recipes/carpet.json delete mode 100644 src/main/resources/data/reframed/recipes/cube.json delete mode 100644 src/main/resources/data/reframed/recipes/door.json delete mode 100644 src/main/resources/data/reframed/recipes/fence.json delete mode 100644 src/main/resources/data/reframed/recipes/fence_gate.json delete mode 100644 src/main/resources/data/reframed/recipes/iron_door.json delete mode 100644 src/main/resources/data/reframed/recipes/iron_trapdoor.json delete mode 100644 src/main/resources/data/reframed/recipes/lever.json delete mode 100644 src/main/resources/data/reframed/recipes/pane.json delete mode 100644 src/main/resources/data/reframed/recipes/post.json delete mode 100644 src/main/resources/data/reframed/recipes/pressure_plate.json delete mode 100644 src/main/resources/data/reframed/recipes/slab.json delete mode 100644 src/main/resources/data/reframed/recipes/stairs.json delete mode 100644 src/main/resources/data/reframed/recipes/trapdoor.json delete mode 100644 src/main/resources/data/reframed/recipes/wall.json diff --git a/gradle.properties b/gradle.properties index 6661c01..c2dd688 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ loader_version=0.15.6 # Mod Properties modrinth_id = jCpoCBpn -mod_version = 1.3.5 +mod_version = 1.4 maven_group = fr.adrien1106 archives_base_name = ReFramed mod_id = reframed diff --git a/src/main/java/fr/adrien1106/reframed/ReFramed.java b/src/main/java/fr/adrien1106/reframed/ReFramed.java index e80034a..f546e28 100644 --- a/src/main/java/fr/adrien1106/reframed/ReFramed.java +++ b/src/main/java/fr/adrien1106/reframed/ReFramed.java @@ -1,20 +1,21 @@ package fr.adrien1106.reframed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; import fr.adrien1106.reframed.block.*; +import fr.adrien1106.reframed.util.BlockHelper; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; -import net.minecraft.block.BlockSetType; import net.minecraft.block.Blocks; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.sound.BlockSoundGroup; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; @@ -25,13 +26,14 @@ import java.util.function.BiConsumer; import java.util.stream.Collectors; /** - * TODO self culling, fix other models, better connected textures, preload items + * TODO self culling, fix other models, better connected textures, preload items, better cache */ public class ReFramed implements ModInitializer { public static final String MODID = "reframed"; public static final ArrayList BLOCKS = new ArrayList<>(); - public static Block CUBE, STAIRS, DOUBLE_STAIRS, SLAB, DOUBLE_SLAB, POST, FENCE, FENCE_GATE, DOOR, TRAPDOOR, IRON_DOOR, IRON_TRAPDOOR, PRESSURE_PLATE, BUTTON, LEVER, WALL, CARPET, PANE, CANDLE; + public static Block CUBE, STAIRS, DOUBLE_STAIRS, SLAB, DOUBLE_SLAB, STEP, DOUBLE_STEP; + public static ItemGroup ITEM_GROUP; public static BlockEntityType REFRAMED_BLOCK_ENTITY; public static BlockEntityType REFRAMED_DOUBLE_BLOCK_ENTITY; @@ -45,25 +47,13 @@ public class ReFramed implements ModInitializer { //corresponding vanilla block in the "search" creative tab... with the non-vanilla "post" and //"vertical slab" inserted where they fit ...and i moved the lever way up next to the pressureplate //and button, because they're redstoney... hopefully this ordering makes sense lol - CUBE = registerReFramed("cube" , new ReFramedBlock(ReFramedInteractionUtil.makeSettings())); + CUBE = registerReFramed("cube" , new ReFramedBlock(cp(Blocks.OAK_PLANKS))); STAIRS = registerReFramed("stairs" , new ReFramedStairsBlock(cp(Blocks.OAK_STAIRS))); DOUBLE_STAIRS = registerReFramed("double_stairs" , new ReFramedDoubleStairsBlock(cp(Blocks.OAK_STAIRS))); SLAB = registerReFramed("slab" , new ReFramedSlabBlock(cp(Blocks.OAK_SLAB))); DOUBLE_SLAB = registerReFramed("double_slab" , new ReFramedDoubleSlabBlock(cp(Blocks.OAK_SLAB))); - POST = registerReFramed("post" , new ReFramedPostBlock(cp(Blocks.OAK_FENCE))); - FENCE = registerReFramed("fence" , new ReFramedFenceBlock(cp(Blocks.OAK_FENCE))); - FENCE_GATE = registerReFramed("fence_gate" , new ReFramedFenceGateBlock(cp(Blocks.OAK_FENCE_GATE))); - DOOR = registerReFramed("door" , new ReFramedDoorBlock(cp(Blocks.OAK_DOOR), BlockSetType.OAK)); - TRAPDOOR = registerReFramed("trapdoor" , new ReFramedTrapdoorBlock(cp(Blocks.OAK_TRAPDOOR), BlockSetType.OAK)); - IRON_DOOR = registerReFramed("iron_door" , new ReFramedDoorBlock(cp(Blocks.IRON_DOOR), BlockSetType.IRON)); - IRON_TRAPDOOR = registerReFramed("iron_trapdoor" , new ReFramedTrapdoorBlock(cp(Blocks.IRON_TRAPDOOR), BlockSetType.IRON)); - PRESSURE_PLATE = registerReFramed("pressure_plate", new ReFramedPressurePlateBlock(cp(Blocks.OAK_PRESSURE_PLATE))); - BUTTON = registerReFramed("button" , new ReFramedButtonBlock(cp(Blocks.OAK_BUTTON))); - LEVER = registerReFramed("lever" , new ReFramedLeverBlock(cp(Blocks.LEVER))); - WALL = registerReFramed("wall" , new ReFramedWallBlock(ReFramedInteractionUtil.makeSettings())); - CARPET = registerReFramed("carpet" , new ReFramedCarpetBlock(cp(Blocks.WHITE_CARPET))); - PANE = registerReFramed("pane" , new ReFramedPaneBlock(cp(Blocks.GLASS_PANE))); - CANDLE = registerReFramed("candle" , new ReFramedCandleBlock(ReFramedCandleBlock.configureSettings(cp(Blocks.CANDLE)))); + STEP = registerReFramed("step" , new ReFramedStepBlock(cp(Blocks.OAK_SLAB))); + DOUBLE_STEP = registerReFramed("double_step" , new ReFramedDoubleStepBlock(cp(Blocks.OAK_SLAB))); REFRAMED_BLOCK_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, id("camo"), FabricBlockEntityTypeBuilder.create( @@ -81,7 +71,7 @@ public class ReFramed implements ModInitializer { .toArray(Block[]::new)).build(null) ); - Registry.register(Registries.ITEM_GROUP, id("tab"), FabricItemGroup.builder() + ITEM_GROUP = Registry.register(Registries.ITEM_GROUP, id("tab"), FabricItemGroup.builder() .displayName(Text.translatable("itemGroup.reframed.tab")) .icon(() -> new ItemStack(SLAB)) .entries((ctx, e) -> e.addAll(BLOCKS.stream().map(ItemStack::new).collect(Collectors.toList()))).build() @@ -89,7 +79,13 @@ public class ReFramed implements ModInitializer { } private static AbstractBlock.Settings cp(Block base) { - return ReFramedInteractionUtil.configureSettings(AbstractBlock.Settings.copy(base)); + return AbstractBlock.Settings.copy(base) + .luminance(BlockHelper::luminance) + .nonOpaque() + .sounds(BlockSoundGroup.WOOD) + .hardness(0.2f) + .suffocates((a,b,c) -> false) + .blockVision((a,b,c) -> false); } private static B registerReFramed(String path, B block) { diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedBlock.java index f015934..d1609c3 100644 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedBlock.java +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedBlock.java @@ -1,23 +1,26 @@ package fr.adrien1106.reframed.block; import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReframedInteractible; -import fr.adrien1106.reframed.util.ThemeableBlockEntity; +import fr.adrien1106.reframed.generator.RecipeSetter; +import fr.adrien1106.reframed.util.BlockHelper; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; import net.minecraft.block.*; import net.minecraft.block.entity.BlockEntity; +import net.minecraft.data.server.recipe.RecipeExporter; +import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.*; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; +import net.minecraft.recipe.book.RecipeCategory; import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.ItemScatterer; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.function.BooleanBiFunction; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -30,11 +33,9 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import static net.minecraft.util.shape.VoxelShapes.*; +import static fr.adrien1106.reframed.util.BlockProperties.LIGHT; -public class ReFramedBlock extends Block implements BlockEntityProvider { - - public static final BooleanProperty LIGHT = BooleanProperty.of("frame_light"); +public class ReFramedBlock extends Block implements BlockEntityProvider, RecipeSetter { public ReFramedBlock(Settings settings) { super(settings); @@ -62,9 +63,9 @@ public class ReFramedBlock extends Block implements BlockEntityProvider { @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (!canUse(world, pos, player)) return superUse(state, world, pos, player, hand, hit); - ActionResult result = useUpgrade(state, world, pos, player, hand); + ActionResult result = BlockHelper.useUpgrade(state, world, pos, player, hand); if (result.isAccepted()) return result; - return useCamo(state, world, pos, player, hand, hit, 1); + return BlockHelper.useCamo(state, world, pos, player, hand, hit, 1); } @@ -76,85 +77,6 @@ public class ReFramedBlock extends Block implements BlockEntityProvider { protected boolean canUse(World world, BlockPos pos, PlayerEntity player) { return player.canModifyBlocks() && world.canPlayerModifyAt(player, pos); } - - protected static ActionResult useUpgrade(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand) { - if(!(world.getBlockEntity(pos) instanceof ReFramedEntity block_entity)) return ActionResult.PASS; - - ItemStack held = player.getStackInHand(hand); - ReframedInteractible ext = state.getBlock() instanceof ReframedInteractible e ? e : ReframedInteractible.Default.INSTANCE; - - // frame will emit light if applied with glowstone - if(state.contains(LIGHT) && held.getItem() == Items.GLOWSTONE_DUST) { - block_entity.toggleLight(); - world.setBlockState(pos, state.with(LIGHT, block_entity.emitsLight())); - - if(!player.isCreative()) - if (block_entity.emitsLight()) held.decrement(1); - else held.increment(1); - world.playSound(player, pos, SoundEvents.BLOCK_GLASS_HIT, SoundCategory.BLOCKS, 1f, 1f); - return ActionResult.SUCCESS; - } - - // frame will emit redstone if applied with redstone torch can deactivate redstone block camo emission - if(held.getItem() == Items.REDSTONE_TORCH && ext.canAddRedstoneEmission(state, world, pos)) { - block_entity.toggleRedstone(); - - if(!player.isCreative()) - if (block_entity.emitsRedstone()) held.decrement(1); - else held.increment(1); - world.playSound(player, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 1f, 1f); - return ActionResult.SUCCESS; - } - - // Frame will lose its collision if applied with popped chorus fruit - if(held.getItem() == Items.POPPED_CHORUS_FRUIT && ext.canRemoveCollision(state, world, pos)) { - block_entity.toggleSolidity(); - - if(!player.isCreative()) - if (!block_entity.isSolid()) held.decrement(1); - else held.increment(1); - world.playSound(player, pos, SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT, SoundCategory.BLOCKS, 1f, 1f); - return ActionResult.SUCCESS; - } - - return ActionResult.PASS; - } - - protected static ActionResult useCamo(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit, int theme_index) { - if(!(world.getBlockEntity(pos) instanceof ReFramedEntity block_entity)) return ActionResult.PASS; - - // Changing the theme - ItemStack held = player.getStackInHand(hand); - if(held.getItem() instanceof BlockItem block_item && block_entity.getTheme(theme_index).getBlock() == Blocks.AIR) { - Block block = block_item.getBlock(); - ItemPlacementContext ctx = new ItemPlacementContext(new ItemUsageContext(player, hand, hit)); - BlockState placement_state = block.getPlacementState(ctx); - if(placement_state != null && isShapeFullCube(placement_state.getCollisionShape(world, pos)) && !(block instanceof BlockEntityProvider)) { - List themes = block_entity.getThemes(); - if(!world.isClient) block_entity.setTheme(placement_state, theme_index); - - // check for default light emission - if (placement_state.getLuminance() > 0 - && themes.stream().noneMatch(theme -> theme.getLuminance() > 0)) - if (block_entity.emitsLight()) Block.dropStack(world, pos, new ItemStack(Items.GLOWSTONE_DUST)); - else block_entity.toggleLight(); - - world.setBlockState(pos, state.with(LIGHT, block_entity.emitsLight())); - - // check for default redstone emission - if (placement_state.getWeakRedstonePower(world, pos, Direction.NORTH) > 0 - && themes.stream().noneMatch(theme -> theme.getWeakRedstonePower(world, pos, Direction.NORTH) > 0)) - if (block_entity.emitsRedstone()) Block.dropStack(world, pos, new ItemStack(Items.GLOWSTONE_DUST)); - else block_entity.toggleRedstone(); - - if(!player.isCreative()) held.decrement(1); - world.playSound(player, pos, placement_state.getSoundGroup().getPlaceSound(), SoundCategory.BLOCKS, 1f, 1.1f); - return ActionResult.SUCCESS; - } - } - - return ActionResult.PASS; - } @Override public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { @@ -230,82 +152,17 @@ public class ReFramedBlock extends Block implements BlockEntityProvider { return 1; } - // Doing this method from scratch as it is simpler to do than injecting everywhere - public static boolean shouldDrawSide(BlockState self_state, BlockView world, BlockPos pos, Direction side, BlockPos other_pos, int theme_index) { - ThemeableBlockEntity self = world.getBlockEntity(pos) instanceof ThemeableBlockEntity e ? e : null; - ThemeableBlockEntity other = world.getBlockEntity(other_pos) instanceof ThemeableBlockEntity e ? e : null; - BlockState other_state = world.getBlockState(other_pos); - - // normal behaviour - if (self == null && other == null) return shouldDrawSide(self_state, world, pos, side, other_pos); - - // self is a normal Block - if (self == null && other_state.getBlock() instanceof ReFramedBlock other_block) { - VoxelShape self_shape = self_state.getCullingShape(world, pos); - if (self_shape.isEmpty()) return true; - - int i = 0; - VoxelShape other_shape = VoxelShapes.empty(); - for (BlockState s: other.getThemes()) { - i++; - if (self_state.isSideInvisible(s, side) || s.isOpaque()) - other_shape = combine( - other_shape, - other_block - .getShape(other_state, i) - .getFace(side.getOpposite()), - BooleanBiFunction.OR - ); - } - - // determine if side needs to be rendered - return VoxelShapes.matchesAnywhere(self_shape, other_shape, BooleanBiFunction.ONLY_FIRST); - } - - BlockState self_theme = self.getTheme(theme_index); - // other is normal Block - if (other == null && self_state.getBlock() instanceof ReFramedBlock self_block) { - // Transparent is simple if self and the neighbor are invisible don't render side (like default) - if (self_theme.isSideInvisible(other_state, side)) return false; - - // Opaque is also simple as each model are rendered one by one - if (other_state.isOpaque()) { - // no cache section :( because it differs between each instance of the frame - VoxelShape self_shape = self_block.getShape(self_state, theme_index).getFace(side); - if (self_shape.isEmpty()) return true; - VoxelShape other_shape = other_state.getCullingFace(world, other_pos, side.getOpposite()); - - // determine if side needs to be rendered - return VoxelShapes.matchesAnywhere(self_shape, other_shape, BooleanBiFunction.ONLY_FIRST); - } - - return true; - } - - // Both are frames - // here both are computed in the same zone as there will necessarily a shape comparison - if (self_state.getBlock() instanceof ReFramedBlock self_block && other_state.getBlock() instanceof ReFramedBlock other_block) { - VoxelShape self_shape = self_block.getShape(self_state, theme_index).getFace(side); - if (self_shape.isEmpty()) return true; - - int i = 0; - VoxelShape other_shape = VoxelShapes.empty(); - for (BlockState s: other.getThemes()) { - i++; - if (self_theme.isSideInvisible(s, side) || s.isOpaque()) - other_shape = combine( - other_shape, - other_block - .getShape(other_state, i) - .getFace(side.getOpposite()), - BooleanBiFunction.OR - ); - } - - // determine if side needs to be rendered - return VoxelShapes.matchesAnywhere(self_shape, other_shape, BooleanBiFunction.ONLY_FIRST); - } - - return true; + @Override + public void setRecipe(RecipeExporter exporter) { + ShapedRecipeJsonBuilder + .create(RecipeCategory.BUILDING_BLOCKS, this) + .pattern("III") + .pattern("I~I") + .pattern("III") + .input('I', Items.BAMBOO) + .input('~', Items.STRING) + .criterion(FabricRecipeProvider.hasItem(Items.BAMBOO), FabricRecipeProvider.conditionsFromItem(Items.BAMBOO)) + .criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this)) + .offerTo(exporter); } } diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedButtonBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedButtonBlock.java deleted file mode 100644 index 2dca7cd..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedButtonBlock.java +++ /dev/null @@ -1,95 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockSetType; -import net.minecraft.block.BlockState; -import net.minecraft.block.ButtonBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedButtonBlock extends ButtonBlock implements BlockEntityProvider { - public ReFramedButtonBlock(Settings settings) { - this(settings, BlockSetType.OAK, 30); - } - - public ReFramedButtonBlock(Settings settings, BlockSetType blockSetType, int i) { - super(blockSetType, i, settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - @Nullable - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return super.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - boolean a = 0 != super.getWeakRedstonePower(state, view, pos, dir); - boolean b = 0 != ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - return (a ^ b) ? 15 : 0; - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - if(getDirection(state) != dir) return 0; - else return getWeakRedstonePower(state, view, pos, dir); - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedCandleBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedCandleBlock.java deleted file mode 100644 index 2726ae5..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedCandleBlock.java +++ /dev/null @@ -1,92 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.CandleBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedCandleBlock extends CandleBlock implements BlockEntityProvider { - public ReFramedCandleBlock(Settings settings) { - super(settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - public static AbstractBlock.Settings configureSettings(AbstractBlock.Settings in) { - return in.luminance(state -> Math.max(ReFramedInteractionUtil.luminance(state), CandleBlock.STATE_TO_LUMINANCE.applyAsInt(state))); - } - - @Override - public @Nullable BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - super.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return ReFramedInteractionUtil.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getStrongRedstonePower(state, view, pos, dir); - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedCarpetBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedCarpetBlock.java deleted file mode 100644 index 6c89239..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedCarpetBlock.java +++ /dev/null @@ -1,87 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.CarpetBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedCarpetBlock extends CarpetBlock implements BlockEntityProvider { - public ReFramedCarpetBlock(Settings settings) { - super(settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - @Nullable - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return ReFramedInteractionUtil.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getStrongRedstonePower(state, view, pos, dir); - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoorBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoorBlock.java deleted file mode 100644 index 2bea1d6..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoorBlock.java +++ /dev/null @@ -1,89 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockSetType; -import net.minecraft.block.BlockState; -import net.minecraft.block.DoorBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedDoorBlock extends DoorBlock implements BlockEntityProvider { - public ReFramedDoorBlock(Settings settings, BlockSetType blockSetType) { - super(blockSetType, settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - @Nullable - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - super.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return ReFramedInteractionUtil.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getStrongRedstonePower(state, view, pos, dir); - } -} \ No newline at end of file diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleBlock.java index 348979d..45756b6 100644 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleBlock.java +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleBlock.java @@ -1,6 +1,7 @@ package fr.adrien1106.reframed.block; import fr.adrien1106.reframed.ReFramed; +import fr.adrien1106.reframed.util.BlockHelper; import fr.adrien1106.reframed.util.ThemeableBlockEntity; import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; @@ -17,10 +18,6 @@ import net.minecraft.world.BlockView; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - import static net.minecraft.util.shape.VoxelShapes.empty; import static net.minecraft.util.shape.VoxelShapes.fullCube; @@ -34,7 +31,7 @@ public abstract class ReFramedDoubleBlock extends ReFramedBlock { return ReFramed.REFRAMED_DOUBLE_BLOCK_ENTITY.instantiate(pos, state); } - protected int getHitPart(BlockState state, BlockHitResult hit) { + protected int getHitShape(BlockState state, BlockHitResult hit) { Direction side = hit.getSide(); VoxelShape first_shape = getShape(state, 1); VoxelShape second_shape = getShape(state, 2); @@ -43,29 +40,13 @@ public abstract class ReFramedDoubleBlock extends ReFramedBlock { if (isFaceFullSquare(first_shape, side)) return 1; if (isFaceFullSquare(second_shape, side)) return 2; - Vec3d pos = hit.getPos(); - BlockPos origin = hit.getBlockPos(); - Map axes = Arrays.stream(Direction.Axis.values()) - .filter(axis -> axis != side.getAxis()) - .collect(Collectors.toMap( - axis -> axis, - axis -> axis.choose(pos.getX() - origin.getX(), pos.getY() - origin.getY(), pos.getZ() - origin.getZ())) - ); - - if (matchesFace(first_shape.getFace(side), axes)) return 1; - if (matchesFace(second_shape.getFace(side), axes)) return 2; + Vec3d pos = BlockHelper.getRelativePos(hit.getPos(), hit.getBlockPos()); +// System.out.println(side.getAxis().choose(hit.getPos().x, hit.getPos().y, hit.getPos().z)); + if (BlockHelper.cursorMatchesFace(first_shape, pos)) return 1; + if (BlockHelper.cursorMatchesFace(second_shape, pos)) return 2; return 0; } - private static boolean matchesFace(VoxelShape shape, Map axes) { - return shape.getBoundingBoxes().stream() - .anyMatch(box -> - axes.keySet().stream() - .map(axis -> box.getMin(axis) <= axes.get(axis) && box.getMax(axis) >= axes.get(axis)) - .reduce((prev, current) -> prev && current).get() - ); - } - @Override public boolean isTransparent(BlockState state, BlockView world, BlockPos pos) { return world.getBlockEntity(pos) instanceof ThemeableBlockEntity framed_entity @@ -73,12 +54,12 @@ public abstract class ReFramedDoubleBlock extends ReFramedBlock { } public VoxelShape getRenderOutline(BlockState state, BlockHitResult hit) { - return getShape(state, getHitPart(state, hit)); + return getShape(state, getHitShape(state, hit)); } @Override public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return isGhost(view, pos) ? empty() : fullCube(); + return getCullingShape(state, view, pos); } @Override @@ -89,8 +70,8 @@ public abstract class ReFramedDoubleBlock extends ReFramedBlock { @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (!canUse(world, pos, player)) return superUse(state, world, pos, player, hand, hit); - ActionResult result = useUpgrade(state, world, pos, player, hand); + ActionResult result = BlockHelper.useUpgrade(state, world, pos, player, hand); if (result.isAccepted()) return result; - return useCamo(state, world, pos, player, hand, hit, getHitPart(state, hit)); + return BlockHelper.useCamo(state, world, pos, player, hand, hit, getHitShape(state, hit)); } } diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleSlabBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleSlabBlock.java index 7efd17f..5f11422 100644 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleSlabBlock.java +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleSlabBlock.java @@ -1,12 +1,17 @@ package fr.adrien1106.reframed.block; import fr.adrien1106.reframed.ReFramed; +import fr.adrien1106.reframed.generator.BlockStateProvider; import fr.adrien1106.reframed.generator.GBlockstate; -import fr.adrien1106.reframed.generator.MultipartBlockStateProvider; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.data.client.MultipartBlockStateSupplier; +import net.minecraft.data.server.recipe.RecipeExporter; +import net.minecraft.data.server.recipe.RecipeProvider; +import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder; import net.minecraft.item.ItemPlacementContext; +import net.minecraft.recipe.book.RecipeCategory; import net.minecraft.state.StateManager; import net.minecraft.state.property.Properties; import net.minecraft.util.Identifier; @@ -15,10 +20,11 @@ import net.minecraft.util.shape.VoxelShape; import org.jetbrains.annotations.Nullable; import static fr.adrien1106.reframed.block.ReFramedSlabBlock.*; -import static net.minecraft.data.client.VariantSettings.Rotation.*; +import static net.minecraft.data.client.VariantSettings.Rotation.R0; +import static net.minecraft.data.client.VariantSettings.Rotation.R90; import static net.minecraft.state.property.Properties.AXIS; -public class ReFramedDoubleSlabBlock extends ReFramedDoubleBlock implements MultipartBlockStateProvider { +public class ReFramedDoubleSlabBlock extends ReFramedDoubleBlock implements BlockStateProvider { public ReFramedDoubleSlabBlock(Settings settings) { super(settings); setDefaultState(getDefaultState().with(Properties.AXIS, Direction.Axis.Y)); @@ -61,4 +67,15 @@ public class ReFramedDoubleSlabBlock extends ReFramedDoubleBlock implements Mult .with(GBlockstate.when(AXIS, Direction.Axis.X), GBlockstate.variant(model_id, true, R90, R90)); } + + @Override + public void setRecipe(RecipeExporter exporter) { + RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE); + ShapelessRecipeJsonBuilder + .create(RecipeCategory.BUILDING_BLOCKS, this) + .input(ReFramed.SLAB, 2) + .criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE)) + .criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this)) + .offerTo(exporter); + } } diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleStairsBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleStairsBlock.java index a38d1a3..c7ac022 100644 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleStairsBlock.java +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleStairsBlock.java @@ -1,12 +1,19 @@ package fr.adrien1106.reframed.block; -import fr.adrien1106.reframed.generator.MultipartBlockStateProvider; -import fr.adrien1106.reframed.util.property.StairDirection; +import fr.adrien1106.reframed.ReFramed; +import fr.adrien1106.reframed.generator.BlockStateProvider; +import fr.adrien1106.reframed.util.BlockHelper; +import fr.adrien1106.reframed.util.property.Corner; import fr.adrien1106.reframed.util.property.StairShape; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.data.client.MultipartBlockStateSupplier; +import net.minecraft.data.server.recipe.RecipeExporter; +import net.minecraft.data.server.recipe.RecipeProvider; +import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder; import net.minecraft.item.ItemPlacementContext; +import net.minecraft.recipe.book.RecipeCategory; import net.minecraft.state.StateManager; import net.minecraft.util.function.BooleanBiFunction; import net.minecraft.util.math.BlockPos; @@ -21,33 +28,37 @@ import java.util.ArrayList; import java.util.List; import static fr.adrien1106.reframed.block.ReFramedStairsBlock.*; +import static fr.adrien1106.reframed.util.BlockProperties.CORNER; +import static fr.adrien1106.reframed.util.BlockProperties.STAIR_SHAPE; import static fr.adrien1106.reframed.util.property.StairShape.STRAIGHT; -public class ReFramedDoubleStairsBlock extends ReFramedDoubleBlock implements MultipartBlockStateProvider { +public class ReFramedDoubleStairsBlock extends ReFramedDoubleBlock implements BlockStateProvider { private static final List COMPLEMENT_LIST = new ArrayList<>(52); public ReFramedDoubleStairsBlock(Settings settings) { super(settings); - setDefaultState(getDefaultState().with(FACING, StairDirection.NORTH_DOWN).with(SHAPE, STRAIGHT)); + setDefaultState(getDefaultState().with(CORNER, Corner.NORTH_DOWN).with(STAIR_SHAPE, STRAIGHT)); } @Override protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(builder.add(FACING).add(SHAPE)); + super.appendProperties(builder.add(CORNER, STAIR_SHAPE)); } @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighbor_state, WorldAccess world, BlockPos pos, BlockPos moved) { return super.getStateForNeighborUpdate(state, direction, neighbor_state, world, pos, moved) - .with(SHAPE, getPlacementShape(this, state.get(FACING), world, pos)); + .with(STAIR_SHAPE, BlockHelper.getStairsShape(this, state.get(CORNER), world, pos)); } @Nullable @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - return getPlacement(super.getPlacementState(ctx), ctx); + Corner face = BlockHelper.getPlacementCorner(ctx); + StairShape shape = BlockHelper.getStairsShape(this, face, ctx.getWorld(), ctx.getBlockPos()); + return super.getPlacementState(ctx).with(CORNER, face).with(STAIR_SHAPE, shape); } @Override @@ -63,8 +74,8 @@ public class ReFramedDoubleStairsBlock extends ReFramedDoubleBlock implements Mu } private VoxelShape getComplementOutline(BlockState state) { - StairShape shape = state.get(SHAPE); - StairDirection direction = state.get(FACING); + StairShape shape = state.get(STAIR_SHAPE); + Corner direction = state.get(CORNER); return switch (shape) { case STRAIGHT -> switch (direction) { @@ -181,6 +192,18 @@ public class ReFramedDoubleStairsBlock extends ReFramedDoubleBlock implements Mu return getStairMultipart(this, true); } + @Override + public void setRecipe(RecipeExporter exporter) { + RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE); + ShapelessRecipeJsonBuilder + .create(RecipeCategory.BUILDING_BLOCKS, this) + .input(ReFramed.STAIRS) + .input(ReFramed.STEP) + .criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE)) + .criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this)) + .offerTo(exporter); + } + static { VOXEL_LIST.forEach(shape -> COMPLEMENT_LIST.add(VoxelShapes.combineAndSimplify(VoxelShapes.fullCube(), shape, BooleanBiFunction.ONLY_FIRST))); } diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleStepBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleStepBlock.java new file mode 100644 index 0000000..5e76f44 --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedDoubleStepBlock.java @@ -0,0 +1,118 @@ +package fr.adrien1106.reframed.block; + +import fr.adrien1106.reframed.ReFramed; +import fr.adrien1106.reframed.generator.GBlockstate; +import fr.adrien1106.reframed.generator.BlockStateProvider; +import fr.adrien1106.reframed.util.BlockHelper; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.data.client.MultipartBlockStateSupplier; +import net.minecraft.data.server.recipe.RecipeExporter; +import net.minecraft.data.server.recipe.RecipeProvider; +import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.recipe.book.RecipeCategory; +import net.minecraft.state.StateManager; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Direction.Axis; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import org.jetbrains.annotations.Nullable; + +import static fr.adrien1106.reframed.block.ReFramedSlabBlock.*; +import static fr.adrien1106.reframed.block.ReFramedStepBlock.STEP_VOXELS; +import static net.minecraft.data.client.VariantSettings.Rotation.*; +import static net.minecraft.state.property.Properties.FACING; +import static net.minecraft.state.property.Properties.AXIS; +import static net.minecraft.util.shape.VoxelShapes.empty; + +public class ReFramedDoubleStepBlock extends WaterloggableReFramedDoubleBlock implements BlockStateProvider { + public ReFramedDoubleStepBlock(Settings settings) { + super(settings); + setDefaultState(getDefaultState().with(FACING, Direction.DOWN).with(AXIS, Axis.X)); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder.add(FACING, AXIS)); + } + + @Override + public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) { + Vec3d pos = BlockHelper.getHitPos(ctx.getHitPos(), ctx.getBlockPos()); + return super.getPlacementState(ctx) + .with(FACING, ctx.getSide().getOpposite()) + .with(AXIS, BlockHelper.getHitAxis(pos, ctx.getSide())); + } + + @Override + public VoxelShape getCullingShape(BlockState state, BlockView view, BlockPos pos) { + return isGhost(view, pos) ? empty() : getSlabShape(state.get(FACING)); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return getSlabShape(state.get(FACING)); + } + + @Override + public VoxelShape getShape(BlockState state, int i) { + Axis axis = state.get(AXIS); + return STEP_VOXELS.get(switch (state.get(FACING)) { + case DOWN -> axis == Axis.Z ? (i == 1 ? 0 : 1): (i == 1 ? 4 : 5 ); + case UP -> axis == Axis.Z ? (i == 1 ? 3 : 2): (i == 1 ? 7 : 6 ); + case NORTH -> axis == Axis.Y ? (i == 1 ? 1 : 2): (i == 1 ? 11 : 8 ); + case SOUTH -> axis == Axis.Y ? (i == 1 ? 0 : 3): (i == 1 ? 9 : 10); + case EAST -> axis == Axis.Y ? (i == 1 ? 4 : 7): (i == 1 ? 8 : 9 ); + case WEST -> axis == Axis.Y ? (i == 1 ? 5 : 6): (i == 1 ? 10 : 11); + }); + } + + @Override + public MultipartBlockStateSupplier getMultipart() { + Identifier step_id = ReFramed.id("double_step_special"); + Identifier step_side_id = ReFramed.id("double_step_side_special"); + return MultipartBlockStateSupplier.create(this) + .with(GBlockstate.when(FACING, Direction.DOWN, AXIS, Axis.X), + GBlockstate.variant(step_id, true, R0, R0)) + .with(GBlockstate.when(FACING, Direction.DOWN, AXIS, Axis.Z), + GBlockstate.variant(step_id, true, R0, R90)) + .with(GBlockstate.when(FACING, Direction.UP, AXIS, Axis.X), + GBlockstate.variant(step_id, true, R180, R0)) + .with(GBlockstate.when(FACING, Direction.UP, AXIS, Axis.Z), + GBlockstate.variant(step_id, true, R180, R90)) + + .with(GBlockstate.when(FACING, Direction.EAST, AXIS, Axis.Z), + GBlockstate.variant(step_side_id, true, R0, R0)) + .with(GBlockstate.when(FACING, Direction.EAST, AXIS, Axis.Y), + GBlockstate.variant(step_side_id, true, R90, R0)) + .with(GBlockstate.when(FACING, Direction.SOUTH, AXIS, Axis.X), + GBlockstate.variant(step_side_id, true, R0, R90)) + .with(GBlockstate.when(FACING, Direction.SOUTH, AXIS, Axis.Y), + GBlockstate.variant(step_side_id, true, R90, R90)) + .with(GBlockstate.when(FACING, Direction.WEST, AXIS, Axis.Z), + GBlockstate.variant(step_side_id, true, R0, R180)) + .with(GBlockstate.when(FACING, Direction.WEST, AXIS, Axis.Y), + GBlockstate.variant(step_side_id, true, R90, R180)) + .with(GBlockstate.when(FACING, Direction.NORTH, AXIS, Axis.X), + GBlockstate.variant(step_side_id, true, R0, R270)) + .with(GBlockstate.when(FACING, Direction.NORTH, AXIS, Axis.Y), + GBlockstate.variant(step_side_id, true, R90, R270)); + } + + @Override + public void setRecipe(RecipeExporter exporter) { + RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 2); + ShapelessRecipeJsonBuilder + .create(RecipeCategory.BUILDING_BLOCKS, this) + .input(ReFramed.STEP, 2) + .criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE)) + .criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this)) + .offerTo(exporter); + } +} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedEntity.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedEntity.java index f8b3809..cb7bde1 100644 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedEntity.java +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedEntity.java @@ -1,6 +1,7 @@ package fr.adrien1106.reframed.block; import fr.adrien1106.reframed.ReFramed; +import fr.adrien1106.reframed.util.BlockProperties; import fr.adrien1106.reframed.util.ThemeableBlockEntity; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -87,8 +88,8 @@ public class ReFramedEntity extends BlockEntity implements ThemeableBlockEntity NbtCompound nbt = BlockItem.getBlockEntityNbt(stack); if(nbt == null) return state; - if(state.contains(ReFramedBlock.LIGHT)) { - state = state.with(ReFramedBlock.LIGHT, + if(state.contains(BlockProperties.LIGHT)) { + state = state.with(BlockProperties.LIGHT, ((nbt.contains(BITFIELD_KEY) ? nbt.getByte(BITFIELD_KEY) : SOLIDITY_MASK) diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedFenceBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedFenceBlock.java deleted file mode 100644 index b258831..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedFenceBlock.java +++ /dev/null @@ -1,87 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.FenceBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedFenceBlock extends FenceBlock implements BlockEntityProvider { - public ReFramedFenceBlock(Settings settings) { - super(settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - @Nullable - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return ReFramedInteractionUtil.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getStrongRedstonePower(state, view, pos, dir); - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedFenceGateBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedFenceGateBlock.java deleted file mode 100644 index 1e02fdb..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedFenceGateBlock.java +++ /dev/null @@ -1,98 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import fr.adrien1106.reframed.util.ReframedInteractible; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.FenceGateBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.WoodType; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedFenceGateBlock extends FenceGateBlock implements BlockEntityProvider, ReframedInteractible { - public ReFramedFenceGateBlock(Settings settings, WoodType woodType) { - super(woodType, settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - public ReFramedFenceGateBlock(Settings settings) { - this(settings, WoodType.OAK); - } - - @Nullable - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return ReFramedInteractionUtil.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getStrongRedstonePower(state, view, pos, dir); - } - - @Override - public boolean canAddRedstoneEmission(BlockState state, BlockView view, BlockPos pos) { - return false; - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedLeverBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedLeverBlock.java deleted file mode 100644 index 8d749f2..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedLeverBlock.java +++ /dev/null @@ -1,90 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeverBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedLeverBlock extends LeverBlock implements BlockEntityProvider { - public ReFramedLeverBlock(Settings settings) { - super(settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - @Nullable - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return super.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - boolean a = 0 != super.getWeakRedstonePower(state, view, pos, dir); - boolean b = 0 != ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - return (a ^ b) ? 15 : 0; - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - if(getDirection(state) != dir) return 0; - else return getWeakRedstonePower(state, view, pos, dir); - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedPaneBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedPaneBlock.java deleted file mode 100644 index 927100a..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedPaneBlock.java +++ /dev/null @@ -1,87 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.PaneBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedPaneBlock extends PaneBlock implements BlockEntityProvider { - public ReFramedPaneBlock(Settings settings) { - super(settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - @Override - public @Nullable BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - super.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return ReFramedInteractionUtil.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getStrongRedstonePower(state, view, pos, dir); - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedPostBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedPostBlock.java deleted file mode 100644 index 63443b3..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedPostBlock.java +++ /dev/null @@ -1,57 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import org.jetbrains.annotations.Nullable; - -public class ReFramedPostBlock extends WaterloggableReFramedBlock { - public ReFramedPostBlock(Settings settings) { - super(settings); - - setDefaultState(getDefaultState().with(Properties.AXIS, Direction.Axis.Y)); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(builder.add(Properties.AXIS)); - } - - @Override - public @Nullable BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState sup = super.getPlacementState(ctx); - if(sup != null) sup = sup.with(Properties.AXIS, ctx.getSide().getAxis()); - return sup; - } - - protected static final VoxelShape SHAPE_X = createCuboidShape(0, 6, 6, 16, 10, 10); - protected static final VoxelShape SHAPE_Y = createCuboidShape(6, 0, 6, 10, 16, 10); - protected static final VoxelShape SHAPE_Z = createCuboidShape(6, 6, 0, 10, 10, 16); - - protected VoxelShape shap(BlockState state) { - return switch(state.get(Properties.AXIS)) { - case X -> SHAPE_X; - case Y -> SHAPE_Y; - case Z -> SHAPE_Z; - }; - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), shap(state)); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return shap(state); - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedPressurePlateBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedPressurePlateBlock.java deleted file mode 100644 index 38b02e5..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedPressurePlateBlock.java +++ /dev/null @@ -1,89 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import net.minecraft.block.*; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedPressurePlateBlock extends PressurePlateBlock implements BlockEntityProvider { - public ReFramedPressurePlateBlock(Settings settings, BlockSetType blockSetType) { - super(blockSetType, settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - public ReFramedPressurePlateBlock(Settings settings) { - this(settings, BlockSetType.OAK); - } - - @Override - public @Nullable BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - super.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return super.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - boolean a = 0 != super.getWeakRedstonePower(state, view, pos, dir); - boolean b = 0 != ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - return (a ^ b) ? 15 : 0; - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return dir == Direction.UP ? getWeakRedstonePower(state, view, pos, dir) : 0; - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedSlabBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedSlabBlock.java index 1a75a87..fa65921 100644 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedSlabBlock.java +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedSlabBlock.java @@ -1,13 +1,18 @@ package fr.adrien1106.reframed.block; import fr.adrien1106.reframed.ReFramed; +import fr.adrien1106.reframed.generator.BlockStateProvider; import fr.adrien1106.reframed.generator.GBlockstate; -import fr.adrien1106.reframed.generator.MultipartBlockStateProvider; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; import net.minecraft.data.client.MultipartBlockStateSupplier; +import net.minecraft.data.server.recipe.RecipeExporter; +import net.minecraft.data.server.recipe.RecipeProvider; +import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder; import net.minecraft.item.ItemPlacementContext; +import net.minecraft.recipe.book.RecipeCategory; import net.minecraft.state.StateManager; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; @@ -20,7 +25,7 @@ import org.jetbrains.annotations.Nullable; import static net.minecraft.data.client.VariantSettings.Rotation.*; import static net.minecraft.state.property.Properties.FACING; -public class ReFramedSlabBlock extends WaterloggableReFramedBlock implements MultipartBlockStateProvider { +public class ReFramedSlabBlock extends WaterloggableReFramedBlock implements BlockStateProvider { protected static final VoxelShape DOWN = VoxelShapes.cuboid(0f, 0f, 0f, 1f, 0.5f, 1f); protected static final VoxelShape UP = VoxelShapes.cuboid(0f, 0.5f, 0f, 1f, 1f, 1f); @@ -47,7 +52,11 @@ public class ReFramedSlabBlock extends WaterloggableReFramedBlock implements Mul @Override public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return switch (state.get(FACING)) { + return getSlabShape(state.get(FACING)); + } + + public static VoxelShape getSlabShape(Direction side) { + return switch (side) { case DOWN -> DOWN; case UP -> UP; case NORTH -> NORTH; @@ -74,4 +83,16 @@ public class ReFramedSlabBlock extends WaterloggableReFramedBlock implements Mul .with(GBlockstate.when(FACING, Direction.EAST), GBlockstate.variant(model_id, true, R90, R270)); } + + @Override + public void setRecipe(RecipeExporter exporter) { + RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 2); + ShapedRecipeJsonBuilder + .create(RecipeCategory.BUILDING_BLOCKS, this, 6) + .pattern("III") + .input('I', ReFramed.CUBE) + .criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE)) + .criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this)) + .offerTo(exporter); + } } diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedStairsBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedStairsBlock.java index b8ce2ad..ce7283b 100644 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedStairsBlock.java +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedStairsBlock.java @@ -2,23 +2,27 @@ package fr.adrien1106.reframed.block; import fr.adrien1106.reframed.ReFramed; import fr.adrien1106.reframed.generator.GBlockstate; -import fr.adrien1106.reframed.generator.MultipartBlockStateProvider; +import fr.adrien1106.reframed.generator.BlockStateProvider; +import fr.adrien1106.reframed.util.BlockHelper; import fr.adrien1106.reframed.util.VoxelHelper; -import fr.adrien1106.reframed.util.property.StairDirection; +import fr.adrien1106.reframed.util.property.Corner; import fr.adrien1106.reframed.util.property.StairShape; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; import net.minecraft.data.client.*; +import net.minecraft.data.server.recipe.RecipeExporter; +import net.minecraft.data.server.recipe.RecipeProvider; +import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder; import net.minecraft.item.ItemPlacementContext; +import net.minecraft.recipe.book.RecipeCategory; import net.minecraft.state.StateManager; -import net.minecraft.state.property.EnumProperty; import net.minecraft.util.Identifier; import net.minecraft.util.function.BooleanBiFunction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction.Axis; -import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; @@ -30,64 +34,37 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; +import static fr.adrien1106.reframed.util.BlockProperties.*; import static fr.adrien1106.reframed.util.property.StairShape.*; import static net.minecraft.data.client.VariantSettings.Rotation.*; -import static fr.adrien1106.reframed.util.property.StairDirection.*; +import static fr.adrien1106.reframed.util.property.Corner.*; -public class ReFramedStairsBlock extends WaterloggableReFramedBlock implements MultipartBlockStateProvider { - - public static final EnumProperty FACING = EnumProperty.of("facing", StairDirection.class); - public static final EnumProperty SHAPE = EnumProperty.of("shape", StairShape.class); +public class ReFramedStairsBlock extends WaterloggableReFramedBlock implements BlockStateProvider { + public static final List VOXEL_LIST = new ArrayList<>(52); public ReFramedStairsBlock(Settings settings) { super(settings); - setDefaultState(getDefaultState().with(FACING, StairDirection.NORTH_DOWN).with(SHAPE, STRAIGHT)); + setDefaultState(getDefaultState().with(CORNER, Corner.NORTH_DOWN).with(STAIR_SHAPE, STRAIGHT)); } @Override protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(builder.add(FACING).add(SHAPE)); + super.appendProperties(builder.add(CORNER, STAIR_SHAPE)); } @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighbor_state, WorldAccess world, BlockPos pos, BlockPos moved) { return super.getStateForNeighborUpdate(state, direction, neighbor_state, world, pos, moved) - .with(SHAPE, getPlacementShape(state.getBlock(), state.get(FACING), world, pos)); + .with(STAIR_SHAPE, BlockHelper.getStairsShape(state.getBlock(), state.get(CORNER), world, pos)); } @Nullable @Override // Pretty happy of how clean it is (also got it on first try :) ) public BlockState getPlacementState(ItemPlacementContext ctx) { - return getPlacement(super.getPlacementState(ctx), ctx); - } - - public static BlockState getPlacement(BlockState state, ItemPlacementContext ctx) { - Direction side = ctx.getSide().getOpposite(); - BlockPos block_pos = ctx.getBlockPos(); - Vec3d hit_pos = ctx.getHitPos(); - Vec3d pos = new Vec3d( - hit_pos.getX() - block_pos.getX() - .5d, - hit_pos.getY() - block_pos.getY() - .5d, - hit_pos.getZ() - block_pos.getZ() - .5d - ); - - Stream axes = Stream.of(Axis.values()).filter(axis -> !axis.equals(side.getAxis())); - Axis axis = axes.reduce((axis_1, axis_2) -> - Math.abs(axis_1.choose(pos.x, pos.y, pos.z)) > Math.abs(axis_2.choose(pos.x, pos.y, pos.z)) - ? axis_1 - : axis_2 - ).get(); - - Direction part_direction = Direction.from( - axis, - axis.choose(pos.x, pos.y, pos.z) > 0 - ? Direction.AxisDirection.POSITIVE - : Direction.AxisDirection.NEGATIVE - ); - StairDirection face = StairDirection.getByDirections(side, part_direction); - - return state.with(FACING, face).with(SHAPE, getPlacementShape(state.getBlock(), face, ctx.getWorld(), block_pos)); + Corner face = BlockHelper.getPlacementCorner(ctx); + StairShape shape = BlockHelper.getStairsShape(this, face, ctx.getWorld(), ctx.getBlockPos()); + return super.getPlacementState(ctx).with(CORNER, face).with(STAIR_SHAPE, shape); } @Override @@ -104,8 +81,8 @@ public class ReFramedStairsBlock extends WaterloggableReFramedBlock implements M } public static VoxelShape getOutline(BlockState state) { - StairShape shape = state.get(SHAPE); - StairDirection direction = state.get(FACING); + StairShape shape = state.get(STAIR_SHAPE); + Corner direction = state.get(CORNER); return switch (shape) { case STRAIGHT -> switch (direction) { @@ -217,54 +194,6 @@ public class ReFramedStairsBlock extends WaterloggableReFramedBlock implements M }; } - public static String getNeighborPos(StairDirection face, Direction direction, Boolean reverse, Direction reference, BlockView world, BlockPos pos, Block block) { - BlockState block_state = world.getBlockState( - pos.offset(reverse ? direction.getOpposite() : direction) - ); - - if (block_state.isOf(block) && block_state.get(FACING).hasDirection(reference)) { - if (block_state.get(FACING).hasDirection(face.getLeftDirection())) return "left"; - else if (block_state.get(FACING).hasDirection(face.getRightDirection())) return "right"; - } - return ""; - } - - public static StairShape getPlacementShape(Block block, StairDirection face, BlockView world, BlockPos pos) { - StairShape shape = STRAIGHT; - - String sol = getNeighborPos(face, face.getFirstDirection(), true, face.getSecondDirection(), world, pos, block); - switch (sol) { - case "right": return INNER_RIGHT; - case "left": return INNER_LEFT; - } - - sol = getNeighborPos(face, face.getSecondDirection(), true, face.getFirstDirection(), world, pos, block); - switch (sol) { - case "right": return INNER_RIGHT; - case "left": return INNER_LEFT; - } - - sol = getNeighborPos(face, face.getFirstDirection(), false, face.getSecondDirection(), world, pos, block); - switch (sol) { - case "right" -> shape = FIRST_OUTER_RIGHT; - case "left" -> shape = FIRST_OUTER_LEFT; - } - - sol = getNeighborPos(face, face.getSecondDirection(), false, face.getFirstDirection(), world, pos, block); - switch (sol) { - case "right" -> { - if (shape.equals(STRAIGHT)) shape = SECOND_OUTER_RIGHT; - else if (shape.equals(FIRST_OUTER_RIGHT)) shape = OUTER_RIGHT; - } - case "left" -> { - if (shape.equals(STRAIGHT)) shape = SECOND_OUTER_LEFT; - else if (shape.equals(FIRST_OUTER_LEFT)) shape = OUTER_LEFT; - } - } - - return shape; - } - @Override public MultipartBlockStateSupplier getMultipart() { return getStairMultipart(this, false); @@ -279,220 +208,234 @@ public class ReFramedStairsBlock extends WaterloggableReFramedBlock implements M Identifier outer_side_id = ReFramed.id(prefix + "outer_side_stairs_special"); return MultipartBlockStateSupplier.create(block) /* STRAIGHT X AXIS */ - .with(GBlockstate.when(FACING, DOWN_EAST, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R0, R0)) - .with(GBlockstate.when(FACING, EAST_UP, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R180, R0)) - .with(GBlockstate.when(FACING, UP_WEST, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R180, R180)) - .with(GBlockstate.when(FACING, WEST_DOWN, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R0, R180)) /* STRAIGHT Y AXIS */ - .with(GBlockstate.when(FACING, EAST_SOUTH, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R90, R0)) - .with(GBlockstate.when(FACING, SOUTH_WEST, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R90, R90)) - .with(GBlockstate.when(FACING, WEST_NORTH, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R90, R180)) - .with(GBlockstate.when(FACING, NORTH_EAST, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R90, R270)) /* STRAIGHT Z AXIS */ - .with(GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R0, R90)) - .with(GBlockstate.when(FACING, NORTH_DOWN, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R0, R270)) - .with(GBlockstate.when(FACING, UP_NORTH, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R180, R270)) - .with(GBlockstate.when(FACING, SOUTH_UP, SHAPE, STRAIGHT), + .with(GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, STRAIGHT), GBlockstate.variant(straight_id, true, R180, R90)) /* INNER BOTTOM */ .with(When.anyOf( - GBlockstate.when(FACING, NORTH_DOWN, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, WEST_NORTH, SHAPE, INNER_RIGHT), - GBlockstate.when(FACING, WEST_DOWN, SHAPE, INNER_LEFT)), + GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, INNER_RIGHT), + GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, INNER_LEFT)), GBlockstate.variant(inner_id, true, R0, R180)) .with(When.anyOf( - GBlockstate.when(FACING, NORTH_DOWN, SHAPE, INNER_RIGHT), - GBlockstate.when(FACING, NORTH_EAST, SHAPE, INNER_RIGHT), - GBlockstate.when(FACING, DOWN_EAST, SHAPE, INNER_LEFT)), + GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, INNER_RIGHT), + GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, INNER_RIGHT), + GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, INNER_LEFT)), GBlockstate.variant(inner_id, true, R0, R270)) .with(When.anyOf( - GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, INNER_RIGHT), - GBlockstate.when(FACING, EAST_SOUTH, SHAPE, INNER_RIGHT), - GBlockstate.when(FACING, DOWN_EAST, SHAPE, INNER_RIGHT)), + GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, INNER_RIGHT), + GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, INNER_RIGHT), + GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, INNER_RIGHT)), GBlockstate.variant(inner_id, true, R0, R0)) .with(When.anyOf( - GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, SOUTH_WEST, SHAPE, INNER_RIGHT), - GBlockstate.when(FACING, WEST_DOWN, SHAPE, INNER_RIGHT)), + GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, INNER_RIGHT), + GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, INNER_RIGHT)), GBlockstate.variant(inner_id, true, R0, R90)) /* INNER TOP */ .with(When.anyOf( - GBlockstate.when(FACING, EAST_UP, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, NORTH_EAST, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, UP_NORTH, SHAPE, INNER_RIGHT)), + GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, INNER_RIGHT)), GBlockstate.variant(inner_id, true, R180, R0)) .with(When.anyOf( - GBlockstate.when(FACING, EAST_UP, SHAPE, INNER_RIGHT), - GBlockstate.when(FACING, EAST_SOUTH, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, SOUTH_UP, SHAPE, INNER_RIGHT)), + GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, INNER_RIGHT), + GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, INNER_RIGHT)), GBlockstate.variant(inner_id, true, R180, R90)) .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_UP, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, SOUTH_WEST, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, UP_WEST, SHAPE, INNER_RIGHT)), + GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, INNER_RIGHT)), GBlockstate.variant(inner_id, true, R180, R180)) .with(When.anyOf( - GBlockstate.when(FACING, UP_NORTH, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, WEST_NORTH, SHAPE, INNER_LEFT), - GBlockstate.when(FACING, UP_WEST, SHAPE, INNER_LEFT)), + GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, INNER_LEFT), + GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, INNER_LEFT)), GBlockstate.variant(inner_id, true, R180, R270)) /* OUTER BOTTOM */ .with(When.anyOf( - GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, SECOND_OUTER_RIGHT), - GBlockstate.when(FACING, DOWN_EAST, SHAPE, SECOND_OUTER_RIGHT)), + GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, SECOND_OUTER_RIGHT), + GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, SECOND_OUTER_RIGHT)), GBlockstate.variant(outer_id, true, R0, R0)) .with(When.anyOf( - GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, SECOND_OUTER_LEFT), - GBlockstate.when(FACING, WEST_DOWN, SHAPE, FIRST_OUTER_RIGHT)), + GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, SECOND_OUTER_LEFT), + GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, FIRST_OUTER_RIGHT)), GBlockstate.variant(outer_id, true, R0, R90)) .with(When.anyOf( - GBlockstate.when(FACING, NORTH_DOWN, SHAPE, FIRST_OUTER_LEFT), - GBlockstate.when(FACING, WEST_DOWN, SHAPE, FIRST_OUTER_LEFT)), + GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, FIRST_OUTER_LEFT), + GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, FIRST_OUTER_LEFT)), GBlockstate.variant(outer_id, true, R0, R180)) .with(When.anyOf( - GBlockstate.when(FACING, NORTH_DOWN, SHAPE, FIRST_OUTER_RIGHT), - GBlockstate.when(FACING, DOWN_EAST, SHAPE, SECOND_OUTER_LEFT)), + GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, FIRST_OUTER_RIGHT), + GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, SECOND_OUTER_LEFT)), GBlockstate.variant(outer_id, true, R0, R270)) /* OUTER TOP */ .with(When.anyOf( - GBlockstate.when(FACING, UP_NORTH, SHAPE, SECOND_OUTER_RIGHT), - GBlockstate.when(FACING, EAST_UP, SHAPE, FIRST_OUTER_LEFT)), + GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, SECOND_OUTER_RIGHT), + GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, FIRST_OUTER_LEFT)), GBlockstate.variant(outer_id, true, R180, R0)) .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_UP, SHAPE, FIRST_OUTER_RIGHT), - GBlockstate.when(FACING, EAST_UP, SHAPE, FIRST_OUTER_RIGHT)), + GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, FIRST_OUTER_RIGHT), + GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, FIRST_OUTER_RIGHT)), GBlockstate.variant(outer_id, true, R180, R90)) .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_UP, SHAPE, FIRST_OUTER_LEFT), - GBlockstate.when(FACING, UP_WEST, SHAPE, SECOND_OUTER_RIGHT)), + GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, FIRST_OUTER_LEFT), + GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, SECOND_OUTER_RIGHT)), GBlockstate.variant(outer_id, true, R180, R180)) .with(When.anyOf( - GBlockstate.when(FACING, UP_NORTH, SHAPE, SECOND_OUTER_LEFT), - GBlockstate.when(FACING, UP_WEST, SHAPE, SECOND_OUTER_LEFT)), + GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, SECOND_OUTER_LEFT), + GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, SECOND_OUTER_LEFT)), GBlockstate.variant(outer_id, true, R180, R270)) /* OUTER EAST */ .with(When.anyOf( - GBlockstate.when(FACING, EAST_SOUTH, SHAPE, SECOND_OUTER_RIGHT), - GBlockstate.when(FACING, DOWN_EAST, SHAPE, FIRST_OUTER_RIGHT)), + GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, SECOND_OUTER_RIGHT), + GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, FIRST_OUTER_RIGHT)), GBlockstate.variant(outer_side_id, true, R0, R0)) .with(When.anyOf( - GBlockstate.when(FACING, EAST_SOUTH, SHAPE, SECOND_OUTER_LEFT), - GBlockstate.when(FACING, EAST_UP, SHAPE, SECOND_OUTER_RIGHT)), + GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, SECOND_OUTER_LEFT), + GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, SECOND_OUTER_RIGHT)), GBlockstate.variant(outer_side_id, true, R90, R0)) .with(When.anyOf( - GBlockstate.when(FACING, NORTH_EAST, SHAPE, FIRST_OUTER_LEFT), - GBlockstate.when(FACING, EAST_UP, SHAPE, SECOND_OUTER_LEFT)), + GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, FIRST_OUTER_LEFT), + GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, SECOND_OUTER_LEFT)), GBlockstate.variant(outer_side_id, true, R180, R0)) .with(When.anyOf( - GBlockstate.when(FACING, NORTH_EAST, SHAPE, FIRST_OUTER_RIGHT), - GBlockstate.when(FACING, DOWN_EAST, SHAPE, FIRST_OUTER_LEFT)), + GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, FIRST_OUTER_RIGHT), + GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, FIRST_OUTER_LEFT)), GBlockstate.variant(outer_side_id, true, R270, R0)) /* OUTER SOUTH */ .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_WEST, SHAPE, SECOND_OUTER_RIGHT), - GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, FIRST_OUTER_LEFT)), + GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, SECOND_OUTER_RIGHT), + GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, FIRST_OUTER_LEFT)), GBlockstate.variant(outer_side_id, true, R0, R90)) .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_WEST, SHAPE, SECOND_OUTER_LEFT), - GBlockstate.when(FACING, SOUTH_UP, SHAPE, SECOND_OUTER_LEFT)), + GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, SECOND_OUTER_LEFT), + GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, SECOND_OUTER_LEFT)), GBlockstate.variant(outer_side_id, true, R90, R90)) .with(When.anyOf( - GBlockstate.when(FACING, EAST_SOUTH, SHAPE, FIRST_OUTER_LEFT), - GBlockstate.when(FACING, SOUTH_UP, SHAPE, SECOND_OUTER_RIGHT)), + GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, FIRST_OUTER_LEFT), + GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, SECOND_OUTER_RIGHT)), GBlockstate.variant(outer_side_id, true, R180, R90)) .with(When.anyOf( - GBlockstate.when(FACING, EAST_SOUTH, SHAPE, FIRST_OUTER_RIGHT), - GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, FIRST_OUTER_RIGHT)), + GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, FIRST_OUTER_RIGHT), + GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, FIRST_OUTER_RIGHT)), GBlockstate.variant(outer_side_id, true, R270, R90)) /* OUTER WEST */ .with(When.anyOf( - GBlockstate.when(FACING, WEST_NORTH, SHAPE, SECOND_OUTER_RIGHT), - GBlockstate.when(FACING, WEST_DOWN, SHAPE, SECOND_OUTER_LEFT)), + GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, SECOND_OUTER_RIGHT), + GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, SECOND_OUTER_LEFT)), GBlockstate.variant(outer_side_id, true, R0, R180)) .with(When.anyOf( - GBlockstate.when(FACING, WEST_NORTH, SHAPE, SECOND_OUTER_LEFT), - GBlockstate.when(FACING, UP_WEST, SHAPE, FIRST_OUTER_LEFT)), + GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, SECOND_OUTER_LEFT), + GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, FIRST_OUTER_LEFT)), GBlockstate.variant(outer_side_id, true, R90, R180)) .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_WEST, SHAPE, FIRST_OUTER_LEFT), - GBlockstate.when(FACING, UP_WEST, SHAPE, FIRST_OUTER_RIGHT)), + GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, FIRST_OUTER_LEFT), + GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, FIRST_OUTER_RIGHT)), GBlockstate.variant(outer_side_id, true, R180, R180)) .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_WEST, SHAPE, FIRST_OUTER_RIGHT), - GBlockstate.when(FACING, WEST_DOWN, SHAPE, SECOND_OUTER_RIGHT)), + GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, FIRST_OUTER_RIGHT), + GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, SECOND_OUTER_RIGHT)), GBlockstate.variant(outer_side_id, true, R270, R180)) /* OUTER NORTH */ .with(When.anyOf( - GBlockstate.when(FACING, NORTH_EAST, SHAPE, SECOND_OUTER_RIGHT), - GBlockstate.when(FACING, NORTH_DOWN, SHAPE, SECOND_OUTER_RIGHT)), + GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, SECOND_OUTER_RIGHT), + GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, SECOND_OUTER_RIGHT)), GBlockstate.variant(outer_side_id, true, R0, R270)) .with(When.anyOf( - GBlockstate.when(FACING, NORTH_EAST, SHAPE, SECOND_OUTER_LEFT), - GBlockstate.when(FACING, UP_NORTH, SHAPE, FIRST_OUTER_RIGHT)), + GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, SECOND_OUTER_LEFT), + GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, FIRST_OUTER_RIGHT)), GBlockstate.variant(outer_side_id, true, R90, R270)) .with(When.anyOf( - GBlockstate.when(FACING, WEST_NORTH, SHAPE, FIRST_OUTER_LEFT), - GBlockstate.when(FACING, UP_NORTH, SHAPE, FIRST_OUTER_LEFT)), + GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, FIRST_OUTER_LEFT), + GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, FIRST_OUTER_LEFT)), GBlockstate.variant(outer_side_id, true, R180, R270)) .with(When.anyOf( - GBlockstate.when(FACING, WEST_NORTH, SHAPE, FIRST_OUTER_RIGHT), - GBlockstate.when(FACING, NORTH_DOWN, SHAPE, SECOND_OUTER_LEFT)), + GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, FIRST_OUTER_RIGHT), + GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, SECOND_OUTER_LEFT)), GBlockstate.variant(outer_side_id, true, R270, R270)) /* OUTER BOTTOM */ .with(When.anyOf( - GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, OUTER_RIGHT), - GBlockstate.when(FACING, DOWN_EAST, SHAPE, OUTER_RIGHT), - GBlockstate.when(FACING, EAST_SOUTH, SHAPE, OUTER_RIGHT)), + GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, OUTER_RIGHT), + GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, OUTER_RIGHT), + GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, OUTER_RIGHT)), GBlockstate.variant(double_outer_id, true, R0, R0)) .with(When.anyOf( - GBlockstate.when(FACING, DOWN_SOUTH, SHAPE, OUTER_LEFT), - GBlockstate.when(FACING, WEST_DOWN, SHAPE, OUTER_RIGHT), - GBlockstate.when(FACING, SOUTH_WEST, SHAPE, OUTER_RIGHT)), + GBlockstate.when(CORNER, DOWN_SOUTH, STAIR_SHAPE, OUTER_LEFT), + GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, OUTER_RIGHT), + GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, OUTER_RIGHT)), GBlockstate.variant(double_outer_id, true, R0, R90)) .with(When.anyOf( - GBlockstate.when(FACING, NORTH_DOWN, SHAPE, OUTER_LEFT), - GBlockstate.when(FACING, WEST_DOWN, SHAPE, OUTER_LEFT), - GBlockstate.when(FACING, WEST_NORTH, SHAPE, OUTER_RIGHT)), + GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, OUTER_LEFT), + GBlockstate.when(CORNER, WEST_DOWN, STAIR_SHAPE, OUTER_LEFT), + GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, OUTER_RIGHT)), GBlockstate.variant(double_outer_id, true, R0, R180)) .with(When.anyOf( - GBlockstate.when(FACING, NORTH_DOWN, SHAPE, OUTER_RIGHT), - GBlockstate.when(FACING, DOWN_EAST, SHAPE, OUTER_LEFT), - GBlockstate.when(FACING, NORTH_EAST, SHAPE, OUTER_RIGHT)), + GBlockstate.when(CORNER, NORTH_DOWN, STAIR_SHAPE, OUTER_RIGHT), + GBlockstate.when(CORNER, DOWN_EAST, STAIR_SHAPE, OUTER_LEFT), + GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, OUTER_RIGHT)), GBlockstate.variant(double_outer_id, true, R0, R270)) /* OUTER TOP */ .with(When.anyOf( - GBlockstate.when(FACING, UP_NORTH, SHAPE, OUTER_RIGHT), - GBlockstate.when(FACING, EAST_UP, SHAPE, OUTER_LEFT), - GBlockstate.when(FACING, NORTH_EAST, SHAPE, OUTER_LEFT)), + GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, OUTER_RIGHT), + GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, OUTER_LEFT), + GBlockstate.when(CORNER, NORTH_EAST, STAIR_SHAPE, OUTER_LEFT)), GBlockstate.variant(double_outer_id, true, R180, R0)) .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_UP, SHAPE, OUTER_RIGHT), - GBlockstate.when(FACING, EAST_UP, SHAPE, OUTER_RIGHT), - GBlockstate.when(FACING, EAST_SOUTH, SHAPE, OUTER_LEFT)), + GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, OUTER_RIGHT), + GBlockstate.when(CORNER, EAST_UP, STAIR_SHAPE, OUTER_RIGHT), + GBlockstate.when(CORNER, EAST_SOUTH, STAIR_SHAPE, OUTER_LEFT)), GBlockstate.variant(double_outer_id, true, R180, R90)) .with(When.anyOf( - GBlockstate.when(FACING, SOUTH_UP, SHAPE, OUTER_LEFT), - GBlockstate.when(FACING, UP_WEST, SHAPE, OUTER_RIGHT), - GBlockstate.when(FACING, SOUTH_WEST, SHAPE, OUTER_LEFT)), + GBlockstate.when(CORNER, SOUTH_UP, STAIR_SHAPE, OUTER_LEFT), + GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, OUTER_RIGHT), + GBlockstate.when(CORNER, SOUTH_WEST, STAIR_SHAPE, OUTER_LEFT)), GBlockstate.variant(double_outer_id, true, R180, R180)) .with(When.anyOf( - GBlockstate.when(FACING, UP_NORTH, SHAPE, OUTER_LEFT), - GBlockstate.when(FACING, UP_WEST, SHAPE, OUTER_LEFT), - GBlockstate.when(FACING, WEST_NORTH, SHAPE, OUTER_LEFT)), + GBlockstate.when(CORNER, UP_NORTH, STAIR_SHAPE, OUTER_LEFT), + GBlockstate.when(CORNER, UP_WEST, STAIR_SHAPE, OUTER_LEFT), + GBlockstate.when(CORNER, WEST_NORTH, STAIR_SHAPE, OUTER_LEFT)), GBlockstate.variant(double_outer_id, true, R180, R270)); } + @Override + public void setRecipe(RecipeExporter exporter) { + RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE); + ShapedRecipeJsonBuilder + .create(RecipeCategory.BUILDING_BLOCKS, this, 4) + .pattern("I ") + .pattern("II ") + .pattern("III") + .input('I', ReFramed.CUBE) + .criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE)) + .criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this)) + .offerTo(exporter); + } + static { final VoxelShape STRAIGHT = Stream.of( VoxelShapes.cuboid(0.0f, 0.0f, 0.0f, 1.0f, 0.5f, 1.0f), diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedStepBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedStepBlock.java new file mode 100644 index 0000000..a5c7841 --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/block/ReFramedStepBlock.java @@ -0,0 +1,136 @@ +package fr.adrien1106.reframed.block; + +import fr.adrien1106.reframed.ReFramed; +import fr.adrien1106.reframed.generator.GBlockstate; +import fr.adrien1106.reframed.generator.BlockStateProvider; +import fr.adrien1106.reframed.util.BlockHelper; +import fr.adrien1106.reframed.util.VoxelHelper; +import fr.adrien1106.reframed.util.property.Corner; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ShapeContext; +import net.minecraft.data.client.MultipartBlockStateSupplier; +import net.minecraft.data.server.recipe.RecipeExporter; +import net.minecraft.data.server.recipe.RecipeProvider; +import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.recipe.book.RecipeCategory; +import net.minecraft.state.StateManager; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +import static fr.adrien1106.reframed.util.BlockProperties.CORNER; +import static fr.adrien1106.reframed.util.property.Corner.*; +import static net.minecraft.data.client.VariantSettings.Rotation.*; + +public class ReFramedStepBlock extends WaterloggableReFramedBlock implements BlockStateProvider { + + public static final List STEP_VOXELS = new ArrayList<>(12); + + public ReFramedStepBlock(Settings settings) { + super(settings); + setDefaultState(getDefaultState().with(CORNER, Corner.NORTH_DOWN)); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder.add(CORNER)); + } + + @Nullable + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + return super.getPlacementState(ctx).with(CORNER, BlockHelper.getPlacementCorner(ctx)); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return switch (state.get(CORNER)) { + case DOWN_SOUTH -> STEP_VOXELS.get(0); + case NORTH_DOWN -> STEP_VOXELS.get(1); + case UP_NORTH -> STEP_VOXELS.get(2); + case SOUTH_UP -> STEP_VOXELS.get(3); + case DOWN_EAST -> STEP_VOXELS.get(4); + case WEST_DOWN -> STEP_VOXELS.get(5); + case UP_WEST -> STEP_VOXELS.get(6); + case EAST_UP -> STEP_VOXELS.get(7); + case NORTH_EAST -> STEP_VOXELS.get(8); + case EAST_SOUTH -> STEP_VOXELS.get(9); + case SOUTH_WEST -> STEP_VOXELS.get(10); + case WEST_NORTH -> STEP_VOXELS.get(11); + }; + } + + @Override + public MultipartBlockStateSupplier getMultipart() { + Identifier step_id = ReFramed.id("step_special"); + return MultipartBlockStateSupplier.create(this) + /* X AXIS */ + .with(GBlockstate.when(CORNER, DOWN_EAST), + GBlockstate.variant(step_id, true, R0, R0)) + .with(GBlockstate.when(CORNER, EAST_UP), + GBlockstate.variant(step_id, true, R180, R0)) + .with(GBlockstate.when(CORNER, UP_WEST), + GBlockstate.variant(step_id, true, R180, R180)) + .with(GBlockstate.when(CORNER, WEST_DOWN), + GBlockstate.variant(step_id, true, R0, R180)) + /* Y AXIS */ + .with(GBlockstate.when(CORNER, EAST_SOUTH), + GBlockstate.variant(step_id, true, R90, R0)) + .with(GBlockstate.when(CORNER, SOUTH_WEST), + GBlockstate.variant(step_id, true, R90, R90)) + .with(GBlockstate.when(CORNER, WEST_NORTH), + GBlockstate.variant(step_id, true, R90, R180)) + .with(GBlockstate.when(CORNER, NORTH_EAST), + GBlockstate.variant(step_id, true, R90, R270)) + /* Z AXIS */ + .with(GBlockstate.when(CORNER, DOWN_SOUTH), + GBlockstate.variant(step_id, true, R0, R90)) + .with(GBlockstate.when(CORNER, NORTH_DOWN), + GBlockstate.variant(step_id, true, R0, R270)) + .with(GBlockstate.when(CORNER, UP_NORTH), + GBlockstate.variant(step_id, true, R180, R270)) + .with(GBlockstate.when(CORNER, SOUTH_UP), + GBlockstate.variant(step_id, true, R180, R90)); + } + + @Override + public void setRecipe(RecipeExporter exporter) { + RecipeProvider.offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, this, ReFramed.CUBE, 4); + ShapedRecipeJsonBuilder + .create(RecipeCategory.BUILDING_BLOCKS, this, 8) + .pattern("II") + .input('I', ReFramed.CUBE) + .criterion(FabricRecipeProvider.hasItem(ReFramed.CUBE), FabricRecipeProvider.conditionsFromItem(ReFramed.CUBE)) + .criterion(FabricRecipeProvider.hasItem(this), FabricRecipeProvider.conditionsFromItem(this)) + .offerTo(exporter); + } + + static { + final VoxelShape STEP = VoxelShapes.cuboid(0f, 0f, .5f, 1f, .5f, 1f); + + STEP_VOXELS.add(STEP); + STEP_VOXELS.add(VoxelHelper.mirror(STEP, Direction.Axis.Z)); + STEP_VOXELS.add(VoxelHelper.mirror(VoxelHelper.rotateCounterClockwise(STEP, Direction.Axis.X), Direction.Axis.Z)); + STEP_VOXELS.add(VoxelHelper.rotateCounterClockwise(STEP, Direction.Axis.X)); + + STEP_VOXELS.add(VoxelHelper.rotateCounterClockwise(STEP, Direction.Axis.Y)); + STEP_VOXELS.add(VoxelHelper.mirror(VoxelHelper.rotateCounterClockwise(STEP, Direction.Axis.Y), Direction.Axis.X)); + STEP_VOXELS.add(VoxelHelper.mirror(VoxelHelper.rotateClockwise(VoxelHelper.rotateCounterClockwise(STEP, Direction.Axis.Y), Direction.Axis.Z), Direction.Axis.X)); + STEP_VOXELS.add(VoxelHelper.rotateClockwise(VoxelHelper.rotateCounterClockwise(STEP, Direction.Axis.Y), Direction.Axis.Z)); + + STEP_VOXELS.add(VoxelHelper.rotateCounterClockwise(VoxelHelper.rotateClockwise(STEP, Direction.Axis.Z), Direction.Axis.Y)); + STEP_VOXELS.add(VoxelHelper.rotateClockwise(STEP, Direction.Axis.Z)); + STEP_VOXELS.add(VoxelHelper.rotateClockwise(VoxelHelper.rotateClockwise(STEP, Direction.Axis.Z), Direction.Axis.Y)); + STEP_VOXELS.add(VoxelHelper.mirror(VoxelHelper.rotateClockwise(VoxelHelper.rotateClockwise(STEP, Direction.Axis.Z), Direction.Axis.Y), Direction.Axis.Z)); + } +} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedTrapdoorBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedTrapdoorBlock.java deleted file mode 100644 index f496cc0..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedTrapdoorBlock.java +++ /dev/null @@ -1,94 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import fr.adrien1106.reframed.util.ReframedInteractible; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockSetType; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.TrapdoorBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -public class ReFramedTrapdoorBlock extends TrapdoorBlock implements BlockEntityProvider, ReframedInteractible { - public ReFramedTrapdoorBlock(Settings settings, BlockSetType woodType) { - super(woodType, settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - } - - @Override - public @Nullable BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - super.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), super.getCollisionShape(state, view, pos, ctx)); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return ReFramedInteractionUtil.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getStrongRedstonePower(state, view, pos, dir); - } - - @Override - public boolean canAddRedstoneEmission(BlockState state, BlockView view, BlockPos pos) { - return false; - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/ReFramedWallBlock.java b/src/main/java/fr/adrien1106/reframed/block/ReFramedWallBlock.java deleted file mode 100644 index 3a32db0..0000000 --- a/src/main/java/fr/adrien1106/reframed/block/ReFramedWallBlock.java +++ /dev/null @@ -1,130 +0,0 @@ -package fr.adrien1106.reframed.block; - -import com.google.common.base.MoreObjects; -import fr.adrien1106.reframed.ReFramed; -import fr.adrien1106.reframed.util.ReFramedInteractionUtil; -import fr.adrien1106.reframed.mixin.WallBlockAccessor; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.block.WallBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.enums.WallShape; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.Map; - -public class ReFramedWallBlock extends WallBlock implements BlockEntityProvider { - public ReFramedWallBlock(Settings settings) { - super(settings); - setDefaultState(ReFramedInteractionUtil.setDefaultStates(getDefaultState())); - - initNewShapemaps(); //WallBlock specific haxx - } - - @Nullable - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return ReFramed.REFRAMED_BLOCK_ENTITY.instantiate(pos, state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(ReFramedInteractionUtil.appendProperties(builder)); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return ReFramedInteractionUtil.modifyPlacementState(super.getPlacementState(ctx), ctx); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - ActionResult r = ReFramedInteractionUtil.onUse(state, world, pos, player, hand, hit); - if(!r.isAccepted()) r = super.onUse(state, world, pos, player, hand, hit); - return r; - } - - @Override - public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - ReFramedInteractionUtil.onStateReplaced(state, world, pos, newState, moved); - super.onStateReplaced(state, world, pos, newState, moved); - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - ReFramedInteractionUtil.onPlaced(world, pos, state, placer, stack); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return MoreObjects.firstNonNull(ReFramedInteractionUtil.getCollisionShape(state, view, pos, ctx), getNewShape(state, newCollisionShapeMap)); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return getNewShape(state, newShapeMap); - } - - @Override - public boolean emitsRedstonePower(BlockState state) { - return ReFramedInteractionUtil.emitsRedstonePower(state); - } - - @Override - public int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getWeakRedstonePower(state, view, pos, dir); - } - - @Override - public int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return ReFramedInteractionUtil.getStrongRedstonePower(state, view, pos, dir); - } - - //Shapemap heck (WallBlock has a map keyed on BlockState, but since we add more blockstates most of those map lookups fail) - - protected record ShapeKey(boolean up, WallShape north, WallShape east, WallShape south, WallShape west) { - static ShapeKey fromBlockstate(BlockState state) { - return new ShapeKey( - state.get(WallBlock.UP), - state.get(WallBlock.NORTH_SHAPE), - state.get(WallBlock.EAST_SHAPE), - state.get(WallBlock.SOUTH_SHAPE), - state.get(WallBlock.WEST_SHAPE) - ); - } - } - - protected final Map newShapeMap = new HashMap<>(); - protected final Map newCollisionShapeMap = new HashMap<>(); - - protected void initNewShapemaps() { - initNewShapemap(((WallBlockAccessor) this).getShapeMap(), newShapeMap); - initNewShapemap(((WallBlockAccessor) this).getCollisionShapeMap(), newCollisionShapeMap); - } - - protected void initNewShapemap(Map oldShapeMap, Map newShapeMap) { - oldShapeMap.forEach((state, shape) -> newShapeMap.putIfAbsent(ShapeKey.fromBlockstate(state), shape)); - } - - protected VoxelShape getNewShape(BlockState state, Map shapes) { - return shapes.getOrDefault(ShapeKey.fromBlockstate(state), VoxelShapes.empty()); - } -} diff --git a/src/main/java/fr/adrien1106/reframed/block/WaterloggableReFramedDoubleBlock.java b/src/main/java/fr/adrien1106/reframed/block/WaterloggableReFramedDoubleBlock.java new file mode 100644 index 0000000..bf71cf3 --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/block/WaterloggableReFramedDoubleBlock.java @@ -0,0 +1,43 @@ +package fr.adrien1106.reframed.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Waterloggable; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.WorldAccess; +import org.jetbrains.annotations.Nullable; + +public class WaterloggableReFramedDoubleBlock extends ReFramedDoubleBlock implements Waterloggable { + public WaterloggableReFramedDoubleBlock(Settings settings) { + super(settings); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder.add(Properties.WATERLOGGED)); + } + + @Nullable + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + BlockState sup = super.getPlacementState(ctx); + if(sup != null) sup = sup.with(Properties.WATERLOGGED, ctx.getWorld().getFluidState(ctx.getBlockPos()).isOf(Fluids.WATER)); + return sup; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(Properties.WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + } + + public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState otherState, WorldAccess world, BlockPos pos, BlockPos moved) { + if(state.get(Properties.WATERLOGGED)) world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + return super.getStateForNeighborUpdate(state, direction, otherState, world, pos, moved); + } +} diff --git a/src/main/java/fr/adrien1106/reframed/client/ReFramedClient.java b/src/main/java/fr/adrien1106/reframed/client/ReFramedClient.java index 0c1b0d4..a59f789 100644 --- a/src/main/java/fr/adrien1106/reframed/client/ReFramedClient.java +++ b/src/main/java/fr/adrien1106/reframed/client/ReFramedClient.java @@ -25,33 +25,8 @@ public class ReFramedClient implements ClientModInitializer { //all frames mustn't be on the SOLID layer because they are not opaque! BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), ReFramed.BLOCKS.toArray(new Block[0])); - - HELPER.addReFramedModel("button_special" , HELPER.auto(new Identifier("block/button"))); - HELPER.addReFramedModel("button_pressed_special" , HELPER.auto(new Identifier("block/button_pressed"))); - HELPER.addReFramedModel("one_candle_special" , HELPER.auto(new Identifier("block/template_candle"))); - HELPER.addReFramedModel("two_candles_special" , HELPER.auto(new Identifier("block/template_two_candles"))); - HELPER.addReFramedModel("three_candles_special" , HELPER.auto(new Identifier("block/template_three_candles"))); - HELPER.addReFramedModel("four_candles_special" , HELPER.auto(new Identifier("block/template_four_candles"))); - HELPER.addReFramedModel("carpet_special" , HELPER.auto(new Identifier("block/carpet"))); + HELPER.addReFramedModel("cube_special" , HELPER.auto(new Identifier("block/cube"))); - HELPER.addReFramedModel("door_bottom_left_special" , HELPER.auto(new Identifier("block/door_bottom_left"))); - HELPER.addReFramedModel("door_bottom_right_special" , HELPER.auto(new Identifier("block/door_bottom_right"))); - HELPER.addReFramedModel("door_top_left_special" , HELPER.auto(new Identifier("block/door_top_left"))); - HELPER.addReFramedModel("door_top_right_special" , HELPER.auto(new Identifier("block/door_top_right"))); - HELPER.addReFramedModel("door_bottom_left_open_special" , HELPER.auto(new Identifier("block/door_bottom_left_open"))); - HELPER.addReFramedModel("door_bottom_right_open_special" , HELPER.auto(new Identifier("block/door_bottom_right_open"))); //This is why we dont format code as tables kids - HELPER.addReFramedModel("door_top_left_open_special" , HELPER.auto(new Identifier("block/door_top_left_open"))); - HELPER.addReFramedModel("door_top_right_open_special" , HELPER.auto(new Identifier("block/door_top_right_open"))); - HELPER.addReFramedModel("fence_post_special" , HELPER.auto(new Identifier("block/fence_post"))); - HELPER.addReFramedModel("fence_gate_special" , HELPER.auto(new Identifier("block/template_fence_gate"))); - HELPER.addReFramedModel("fence_gate_open_special" , HELPER.auto(new Identifier("block/template_fence_gate_open"))); - HELPER.addReFramedModel("fence_gate_wall_special" , HELPER.auto(new Identifier("block/template_fence_gate_wall"))); - HELPER.addReFramedModel("fence_gate_wall_open_special" , HELPER.auto(new Identifier("block/template_fence_gate_wall_open"))); - HELPER.addReFramedModel("glass_pane_post_special" , HELPER.auto(new Identifier("block/glass_pane_post"))); - HELPER.addReFramedModel("glass_pane_noside_special" , HELPER.auto(new Identifier("block/glass_pane_noside"))); - HELPER.addReFramedModel("glass_pane_noside_alt_special" , HELPER.auto(new Identifier("block/glass_pane_noside_alt"))); - HELPER.addReFramedModel("pressure_plate_up_special" , HELPER.auto(new Identifier("block/pressure_plate_up"))); - HELPER.addReFramedModel("pressure_plate_down_special" , HELPER.auto(new Identifier("block/pressure_plate_down"))); HELPER.addReFramedModel("slab_special" , HELPER.auto(new Identifier("block/slab"))); HELPER.addReFramedModel("double_slab_special" , HELPER.autoDouble(new Identifier("block/slab"), new Identifier("block/slab_top"))); HELPER.addReFramedModel("stairs_special" , HELPER.auto(ReFramed.id("block/stairs"))); @@ -64,42 +39,18 @@ public class ReFramedClient implements ClientModInitializer { HELPER.addReFramedModel("double_inner_stairs_special" , HELPER.autoDouble(ReFramed.id("block/inner_stairs"), ReFramed.id("block/inner_stairs_complement"))); HELPER.addReFramedModel("double_outer_stairs_special" , HELPER.autoDouble(ReFramed.id("block/outer_stairs"), ReFramed.id("block/outer_stairs_complement"))); HELPER.addReFramedModel("double_outer_side_stairs_special", HELPER.autoDouble(ReFramed.id("block/outer_side_stairs"), ReFramed.id("block/outer_side_stairs_complement"))); - HELPER.addReFramedModel("trapdoor_bottom_special" , HELPER.auto(new Identifier("block/template_trapdoor_bottom"))); - HELPER.addReFramedModel("trapdoor_top_special" , HELPER.auto(new Identifier("block/template_trapdoor_top"))); - HELPER.addReFramedModel("wall_post_special" , HELPER.auto(new Identifier("block/template_wall_post"))); - - //vanilla style models (using "special-sprite replacement" method) - HELPER.addReFramedModel("lever_special" , HELPER.json(ReFramed.id("block/lever"))); - HELPER.addReFramedModel("trapdoor_open_special" , HELPER.json(ReFramed.id("block/trapdoor_open"))); - HELPER.addReFramedModel("lever_on_special" , HELPER.json(ReFramed.id("block/lever_on"))); - //these next five only exist because AutoRetexturedModels don't seem to rotate their textures the right way when rotated from a multipart blockstate - HELPER.addReFramedModel("fence_side_special" , HELPER.json(ReFramed.id("block/fence_side"))); - HELPER.addReFramedModel("glass_pane_side_special" , HELPER.json(ReFramed.id("block/glass_pane_side"))); - HELPER.addReFramedModel("glass_pane_side_alt_special" , HELPER.json(ReFramed.id("block/glass_pane_side_alt"))); - HELPER.addReFramedModel("wall_side_special" , HELPER.json(ReFramed.id("block/wall_side"))); - HELPER.addReFramedModel("wall_side_tall_special" , HELPER.json(ReFramed.id("block/wall_side_tall"))); - - //item only models - HELPER.addReFramedModel("button_inventory_special" , HELPER.auto(new Identifier("block/button_inventory"))); - HELPER.addReFramedModel("fence_inventory_special" , HELPER.auto(new Identifier("block/fence_inventory"))); - HELPER.addReFramedModel("fence_post_inventory_special" , HELPER.auto(ReFramed.id("block/fence_post_inventory"))); - HELPER.addReFramedModel("wall_inventory_special" , HELPER.auto(new Identifier("block/wall_inventory"))); + HELPER.addReFramedModel("step_special" , HELPER.auto(ReFramed.id("block/step"))); + HELPER.addReFramedModel("double_step_special" , HELPER.autoDouble(ReFramed.id("block/step"), ReFramed.id("block/step_complement_slab"))); + HELPER.addReFramedModel("double_step_side_special" , HELPER.autoDouble(ReFramed.id("block/step_side"), ReFramed.id("block/step_side_complement_slab"))); //item model assignments (in lieu of models/item/___.json) - HELPER.assignItemModel("button_inventory_special" , ReFramed.BUTTON); - HELPER.assignItemModel("carpet_special" , ReFramed.CARPET); HELPER.assignItemModel("cube_special" , ReFramed.CUBE); - HELPER.assignItemModel("fence_inventory_special" , ReFramed.FENCE); - HELPER.assignItemModel("fence_gate_special" , ReFramed.FENCE_GATE); - HELPER.assignItemModel("trapdoor_bottom_special" , ReFramed.IRON_TRAPDOOR); - HELPER.assignItemModel("fence_post_inventory_special" , ReFramed.POST); - HELPER.assignItemModel("pressure_plate_up_special" , ReFramed.PRESSURE_PLATE); HELPER.assignItemModel("slab_special" , ReFramed.SLAB); HELPER.assignItemModel("double_slab_special" , ReFramed.DOUBLE_SLAB); HELPER.assignItemModel("stairs_special" , ReFramed.STAIRS); HELPER.assignItemModel("double_stairs_special" , ReFramed.DOUBLE_STAIRS); - HELPER.assignItemModel("trapdoor_bottom_special" , ReFramed.TRAPDOOR); - HELPER.assignItemModel("wall_inventory_special" , ReFramed.WALL); + HELPER.assignItemModel("step_special" , ReFramed.STEP); + HELPER.assignItemModel("double_step_special" , ReFramed.DOUBLE_STEP); } private void privateInit() { diff --git a/src/main/java/fr/adrien1106/reframed/generator/BlockStateProvider.java b/src/main/java/fr/adrien1106/reframed/generator/BlockStateProvider.java new file mode 100644 index 0000000..4c4b920 --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/generator/BlockStateProvider.java @@ -0,0 +1,7 @@ +package fr.adrien1106.reframed.generator; + +import net.minecraft.data.client.BlockStateSupplier; + +public interface BlockStateProvider { + BlockStateSupplier getMultipart(); +} diff --git a/src/main/java/fr/adrien1106/reframed/generator/GAdvancement.java b/src/main/java/fr/adrien1106/reframed/generator/GAdvancement.java new file mode 100644 index 0000000..8c1c7c4 --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/generator/GAdvancement.java @@ -0,0 +1,44 @@ +package fr.adrien1106.reframed.generator; + +import fr.adrien1106.reframed.ReFramed; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricAdvancementProvider; +import net.minecraft.advancement.Advancement; +import net.minecraft.advancement.AdvancementEntry; +import net.minecraft.advancement.AdvancementFrame; +import net.minecraft.advancement.AdvancementRewards; +import net.minecraft.advancement.criterion.InventoryChangedCriterion; +import net.minecraft.item.Items; +import net.minecraft.registry.Registries; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.function.Consumer; + +public class GAdvancement extends FabricAdvancementProvider { + protected GAdvancement(FabricDataOutput output) { + super(output); + } + + @Override + public void generateAdvancement(Consumer consumer) { + Advancement.Builder builder = Advancement.Builder.create() + .display( + Items.CAKE, + Text.literal("Is Everything A Lie ?"), + Text.translatable("advancements.reframed.description"), + new Identifier("textures/gui/advancements/backgrounds/adventure.png"), + AdvancementFrame.TASK, + true, + true, + false + ).rewards(AdvancementRewards.Builder.experience(1000)); + ReFramed.BLOCKS.forEach(block -> + builder.criterion( + "get_" + Registries.BLOCK.getId(block).getPath(), + InventoryChangedCriterion.Conditions.items(block) + ) + ); + builder.build(consumer, ReFramed.MODID + "/root"); + } +} diff --git a/src/main/java/fr/adrien1106/reframed/generator/GBlockLoot.java b/src/main/java/fr/adrien1106/reframed/generator/GBlockLoot.java index d173c95..a0d3477 100644 --- a/src/main/java/fr/adrien1106/reframed/generator/GBlockLoot.java +++ b/src/main/java/fr/adrien1106/reframed/generator/GBlockLoot.java @@ -1,5 +1,6 @@ package fr.adrien1106.reframed.generator; +import fr.adrien1106.reframed.ReFramed; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider; import net.minecraft.registry.Registries; @@ -12,6 +13,6 @@ public class GBlockLoot extends FabricBlockLootTableProvider { @Override public void generate() { - Generator.BLOCKS.forEach(block -> addDrop(block, Registries.ITEM.get(Registries.BLOCK.getId(block)))); + ReFramed.BLOCKS.forEach(block -> addDrop(block, Registries.ITEM.get(Registries.BLOCK.getId(block)))); } } diff --git a/src/main/java/fr/adrien1106/reframed/generator/GBlockTag.java b/src/main/java/fr/adrien1106/reframed/generator/GBlockTag.java new file mode 100644 index 0000000..9edd858 --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/generator/GBlockTag.java @@ -0,0 +1,22 @@ +package fr.adrien1106.reframed.generator; + +import fr.adrien1106.reframed.ReFramed; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider.BlockTagProvider; +import net.minecraft.registry.RegistryWrapper.WrapperLookup; +import net.minecraft.registry.tag.BlockTags; + +import java.util.concurrent.CompletableFuture; + +public class GBlockTag extends BlockTagProvider { + + public GBlockTag(FabricDataOutput output, CompletableFuture registries) { + super(output, registries); + } + + @Override + protected void configure(WrapperLookup arg) { + FabricTagBuilder builder = getOrCreateTagBuilder(BlockTags.AXE_MINEABLE); + ReFramed.BLOCKS.forEach(builder::add); + } +} diff --git a/src/main/java/fr/adrien1106/reframed/generator/GBlockstate.java b/src/main/java/fr/adrien1106/reframed/generator/GBlockstate.java index 283be6d..eaab778 100644 --- a/src/main/java/fr/adrien1106/reframed/generator/GBlockstate.java +++ b/src/main/java/fr/adrien1106/reframed/generator/GBlockstate.java @@ -1,5 +1,6 @@ package fr.adrien1106.reframed.generator; +import fr.adrien1106.reframed.ReFramed; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider; import net.minecraft.data.client.*; @@ -8,6 +9,8 @@ import net.minecraft.util.Identifier; import java.util.Objects; +import static net.minecraft.data.client.VariantSettings.Rotation.R0; + public class GBlockstate extends FabricModelProvider { public GBlockstate(FabricDataOutput output) { @@ -16,10 +19,20 @@ public class GBlockstate extends FabricModelProvider { @Override public void generateBlockStateModels(BlockStateModelGenerator model_generator) { - Generator.BLOCKS + ReFramed.BLOCKS .forEach(model_generator::excludeFromSimpleItemModelGeneration); - Generator.BLOCKS.stream() - .map(block -> block instanceof MultipartBlockStateProvider multipart_block ? multipart_block.getMultipart(): null) + ReFramed.BLOCKS.stream() + .map(block -> { + if (block instanceof BlockStateProvider multipart_block) return multipart_block.getMultipart(); + return VariantsBlockStateSupplier.create( + block, + GBlockstate.variant( + ReFramed.id("cube_special"), + true, + R0, R0 + ) + ); + }) .filter(Objects::nonNull) .forEach(model_generator.blockStateCollector); } @@ -30,8 +43,8 @@ public class GBlockstate extends FabricModelProvider { public static BlockStateVariant variant(Identifier model, boolean uv_lock, VariantSettings.Rotation x, VariantSettings.Rotation y) { BlockStateVariant variant = BlockStateVariant.create().put(VariantSettings.MODEL, model); if (uv_lock) variant.put(VariantSettings.UVLOCK, uv_lock); - if (!x.equals(VariantSettings.Rotation.R0)) variant.put(VariantSettings.X, x); - if (!y.equals(VariantSettings.Rotation.R0)) variant.put(VariantSettings.Y, y); + if (!x.equals(R0)) variant.put(VariantSettings.X, x); + if (!y.equals(R0)) variant.put(VariantSettings.Y, y); return variant; } diff --git a/src/main/java/fr/adrien1106/reframed/generator/GLanguage.java b/src/main/java/fr/adrien1106/reframed/generator/GLanguage.java new file mode 100644 index 0000000..61dc3fb --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/generator/GLanguage.java @@ -0,0 +1,30 @@ +package fr.adrien1106.reframed.generator; + +import fr.adrien1106.reframed.ReFramed; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricLanguageProvider; +import net.minecraft.registry.Registries; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class GLanguage extends FabricLanguageProvider { + protected GLanguage(FabricDataOutput dataOutput) { + super(dataOutput, "en_us"); + } + + @Override + public void generateTranslations(TranslationBuilder builder) { + builder.add(Registries.ITEM_GROUP.getKey(ReFramed.ITEM_GROUP).get(), "Frames"); + builder.add("advancements.reframed.description", "Get all the frame types."); + ReFramed.BLOCKS.forEach(block -> { + builder.add(block, beautify(Registries.BLOCK.getId(block).getPath()) + " Frame"); + }); + } + + private static String beautify(String name) { + return Arrays.stream(name.split("_")) + .map(word -> word.substring(0, 1).toUpperCase() + word.substring(1)) + .collect(Collectors.joining(" ")); + } +} diff --git a/src/main/java/fr/adrien1106/reframed/generator/GRecipe.java b/src/main/java/fr/adrien1106/reframed/generator/GRecipe.java new file mode 100644 index 0000000..0e2b8c7 --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/generator/GRecipe.java @@ -0,0 +1,19 @@ +package fr.adrien1106.reframed.generator; + +import fr.adrien1106.reframed.ReFramed; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; +import net.minecraft.data.server.recipe.RecipeExporter; + +public class GRecipe extends FabricRecipeProvider { + public GRecipe(FabricDataOutput output) { + super(output); + } + + @Override + public void generate(RecipeExporter exporter) { + ReFramed.BLOCKS.forEach(block -> { + if (block instanceof RecipeSetter provider) provider.setRecipe(exporter); + }); + } +} diff --git a/src/main/java/fr/adrien1106/reframed/generator/Generator.java b/src/main/java/fr/adrien1106/reframed/generator/Generator.java index 136e338..10aa212 100644 --- a/src/main/java/fr/adrien1106/reframed/generator/Generator.java +++ b/src/main/java/fr/adrien1106/reframed/generator/Generator.java @@ -2,22 +2,17 @@ package fr.adrien1106.reframed.generator; import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; -import net.minecraft.block.Block; - -import java.util.List; - -import static fr.adrien1106.reframed.ReFramed.*; public class Generator implements DataGeneratorEntrypoint { - /** - * missing DOOR, IRON_DOOR, CANDLE - */ - public static List BLOCKS = List.of(CUBE, STAIRS, DOUBLE_STAIRS, SLAB, DOUBLE_SLAB, POST, FENCE, FENCE_GATE, TRAPDOOR, IRON_TRAPDOOR, PRESSURE_PLATE, BUTTON, LEVER, WALL, CARPET, PANE); @Override public void onInitializeDataGenerator(FabricDataGenerator data_generator) { - FabricDataGenerator.Pack myPack = data_generator.createPack(); - myPack.addProvider(GBlockLoot::new); - myPack.addProvider(GBlockstate::new); + FabricDataGenerator.Pack my_pack = data_generator.createPack(); + my_pack.addProvider(GBlockLoot::new); + my_pack.addProvider(GBlockstate::new); + my_pack.addProvider(GLanguage::new); + my_pack.addProvider(GBlockTag::new); + my_pack.addProvider(GRecipe::new); + my_pack.addProvider(GAdvancement::new); } } diff --git a/src/main/java/fr/adrien1106/reframed/generator/MultipartBlockStateProvider.java b/src/main/java/fr/adrien1106/reframed/generator/MultipartBlockStateProvider.java deleted file mode 100644 index 49ea42c..0000000 --- a/src/main/java/fr/adrien1106/reframed/generator/MultipartBlockStateProvider.java +++ /dev/null @@ -1,7 +0,0 @@ -package fr.adrien1106.reframed.generator; - -import net.minecraft.data.client.MultipartBlockStateSupplier; - -public interface MultipartBlockStateProvider { - MultipartBlockStateSupplier getMultipart(); -} diff --git a/src/main/java/fr/adrien1106/reframed/generator/RecipeSetter.java b/src/main/java/fr/adrien1106/reframed/generator/RecipeSetter.java new file mode 100644 index 0000000..626104a --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/generator/RecipeSetter.java @@ -0,0 +1,8 @@ +package fr.adrien1106.reframed.generator; + +import net.minecraft.data.server.recipe.RecipeExporter; + +public interface RecipeSetter { + + void setRecipe(RecipeExporter exporter); +} diff --git a/src/main/java/fr/adrien1106/reframed/mixin/compat/IndiumTerrainBlockRenderInfoMixin.java b/src/main/java/fr/adrien1106/reframed/mixin/compat/IndiumTerrainBlockRenderInfoMixin.java index e204369..4f6ec46 100644 --- a/src/main/java/fr/adrien1106/reframed/mixin/compat/IndiumTerrainBlockRenderInfoMixin.java +++ b/src/main/java/fr/adrien1106/reframed/mixin/compat/IndiumTerrainBlockRenderInfoMixin.java @@ -1,6 +1,6 @@ package fr.adrien1106.reframed.mixin.compat; -import fr.adrien1106.reframed.block.ReFramedBlock; +import fr.adrien1106.reframed.util.BlockHelper; import fr.adrien1106.reframed.util.IBlockRenderInfoMixin; import fr.adrien1106.reframed.util.ThemeableBlockEntity; import link.infra.indium.renderer.render.BlockRenderInfo; @@ -32,7 +32,7 @@ public abstract class IndiumTerrainBlockRenderInfoMixin extends BlockRenderInfo if (!(view.getBlockEntity(pos) instanceof ThemeableBlockEntity || view.getBlockEntity(other_pos) instanceof ThemeableBlockEntity)) return instance.shouldDrawSide(state, view, pos, face); - return ReFramedBlock.shouldDrawSide(state, view, pos, face, other_pos, theme_index); + return BlockHelper.shouldDrawSide(state, view, pos, face, other_pos, theme_index); } @Override diff --git a/src/main/java/fr/adrien1106/reframed/mixin/compat/SodiumBlockOcclusionCacheMixin.java b/src/main/java/fr/adrien1106/reframed/mixin/compat/SodiumBlockOcclusionCacheMixin.java index 2bc9760..437f8a7 100644 --- a/src/main/java/fr/adrien1106/reframed/mixin/compat/SodiumBlockOcclusionCacheMixin.java +++ b/src/main/java/fr/adrien1106/reframed/mixin/compat/SodiumBlockOcclusionCacheMixin.java @@ -1,7 +1,7 @@ package fr.adrien1106.reframed.mixin.compat; import com.llamalad7.mixinextras.sugar.Local; -import fr.adrien1106.reframed.block.ReFramedBlock; +import fr.adrien1106.reframed.util.BlockHelper; import fr.adrien1106.reframed.util.ThemeableBlockEntity; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache; import net.minecraft.block.BlockState; @@ -25,6 +25,6 @@ public class SodiumBlockOcclusionCacheMixin { ), cancellable = true) private void shouldDrawFrameNeighborSide(BlockState self_state, BlockView view, BlockPos self_pos, Direction face, CallbackInfoReturnable cir, @Local BlockPos.Mutable other_pos) { if (!(view.getBlockEntity(other_pos) instanceof ThemeableBlockEntity)) return; - cir.setReturnValue(ReFramedBlock.shouldDrawSide(self_state, view, self_pos, face, other_pos, 0)); + cir.setReturnValue(BlockHelper.shouldDrawSide(self_state, view, self_pos, face, other_pos, 0)); } } diff --git a/src/main/java/fr/adrien1106/reframed/mixin/render/BlockRenderInfoMixin.java b/src/main/java/fr/adrien1106/reframed/mixin/render/BlockRenderInfoMixin.java index ac1746f..059fb1c 100644 --- a/src/main/java/fr/adrien1106/reframed/mixin/render/BlockRenderInfoMixin.java +++ b/src/main/java/fr/adrien1106/reframed/mixin/render/BlockRenderInfoMixin.java @@ -1,7 +1,7 @@ package fr.adrien1106.reframed.mixin.render; import com.llamalad7.mixinextras.sugar.Local; -import fr.adrien1106.reframed.block.ReFramedBlock; +import fr.adrien1106.reframed.util.BlockHelper; import fr.adrien1106.reframed.util.IBlockRenderInfoMixin; import fr.adrien1106.reframed.util.ThemeableBlockEntity; import net.fabricmc.fabric.impl.client.indigo.renderer.render.BlockRenderInfo; @@ -38,7 +38,7 @@ public abstract class BlockRenderInfoMixin implements IBlockRenderInfoMixin { @Redirect(method = "shouldDrawFace", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/Block;shouldDrawSide(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;Lnet/minecraft/util/math/BlockPos;)Z")) private boolean shouldDrawAdjacentCamoSide(BlockState state, BlockView world, BlockPos pos, Direction side, BlockPos other_pos) { - return ReFramedBlock.shouldDrawSide(state, world, pos, side, other_pos, theme_index); + return BlockHelper.shouldDrawSide(state, world, pos, side, other_pos, theme_index); } @Override diff --git a/src/main/java/fr/adrien1106/reframed/mixin/sound/LivingEntityMixin.java b/src/main/java/fr/adrien1106/reframed/mixin/sound/LivingEntityMixin.java index b7ce6e1..1d63f6a 100644 --- a/src/main/java/fr/adrien1106/reframed/mixin/sound/LivingEntityMixin.java +++ b/src/main/java/fr/adrien1106/reframed/mixin/sound/LivingEntityMixin.java @@ -19,7 +19,7 @@ public class LivingEntityMixin { at = @At( value = "INVOKE", target = "Lnet/minecraft/world/World;getBlockState(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;" - ), remap = false + ) ) private BlockState playCamoFallSound(World world, BlockPos pos) { BlockState state = world.getBlockState(pos); diff --git a/src/main/java/fr/adrien1106/reframed/util/BlockHelper.java b/src/main/java/fr/adrien1106/reframed/util/BlockHelper.java new file mode 100644 index 0000000..ca18ffb --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/util/BlockHelper.java @@ -0,0 +1,305 @@ +package fr.adrien1106.reframed.util; + +import fr.adrien1106.reframed.block.ReFramedBlock; +import fr.adrien1106.reframed.block.ReFramedEntity; +import fr.adrien1106.reframed.util.property.Corner; +import fr.adrien1106.reframed.util.property.StairShape; +import net.minecraft.block.Block; +import net.minecraft.block.BlockEntityProvider; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.*; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.function.BooleanBiFunction; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static fr.adrien1106.reframed.util.BlockProperties.CORNER; +import static fr.adrien1106.reframed.util.BlockProperties.LIGHT; +import static fr.adrien1106.reframed.util.property.StairShape.*; +import static net.minecraft.util.shape.VoxelShapes.combine; + +public class BlockHelper { + + public static Corner getPlacementCorner(ItemPlacementContext ctx) { + Direction side = ctx.getSide().getOpposite(); + Vec3d pos = getHitPos(ctx.getHitPos(), ctx.getBlockPos()); + Direction.Axis axis = getHitAxis(pos, side); + + Direction part_direction = Direction.from( + axis, + axis.choose(pos.x, pos.y, pos.z) > 0 + ? Direction.AxisDirection.POSITIVE + : Direction.AxisDirection.NEGATIVE + ); + + return Corner.getByDirections(side, part_direction); + } + + public static Direction.Axis getHitAxis(Vec3d pos, Direction side) { + Stream axes = Stream.of(Direction.Axis.values()).filter(axis -> !axis.equals(side.getAxis())); + return axes.reduce((axis_1, axis_2) -> + Math.abs(axis_1.choose(pos.x, pos.y, pos.z)) > Math.abs(axis_2.choose(pos.x, pos.y, pos.z)) + ? axis_1 + : axis_2 + ).get(); + } + + public static Vec3d getRelativePos(Vec3d pos, BlockPos block_pos) { + return new Vec3d( + pos.getX() - block_pos.getX(), + pos.getY() - block_pos.getY(), + pos.getZ() - block_pos.getZ() + ); + } + + public static Vec3d getHitPos(Vec3d pos, BlockPos block_pos) { + pos = getRelativePos(pos, block_pos); + return new Vec3d( + pos.getX() - .5d, + pos.getY() - .5d, + pos.getZ() - .5d + ); + } + + public static StairShape getStairsShape(Block block, Corner face, BlockView world, BlockPos pos) { + StairShape shape = STRAIGHT; + + String sol = getNeighborPos(face, face.getFirstDirection(), true, face.getSecondDirection(), world, pos, block); + switch (sol) { + case "right": return INNER_RIGHT; + case "left": return INNER_LEFT; + } + + sol = getNeighborPos(face, face.getSecondDirection(), true, face.getFirstDirection(), world, pos, block); + switch (sol) { + case "right": return INNER_RIGHT; + case "left": return INNER_LEFT; + } + + sol = getNeighborPos(face, face.getFirstDirection(), false, face.getSecondDirection(), world, pos, block); + switch (sol) { + case "right" -> shape = FIRST_OUTER_RIGHT; + case "left" -> shape = FIRST_OUTER_LEFT; + } + + sol = getNeighborPos(face, face.getSecondDirection(), false, face.getFirstDirection(), world, pos, block); + switch (sol) { + case "right" -> { + if (shape.equals(STRAIGHT)) shape = SECOND_OUTER_RIGHT; + else if (shape.equals(FIRST_OUTER_RIGHT)) shape = OUTER_RIGHT; + } + case "left" -> { + if (shape.equals(STRAIGHT)) shape = SECOND_OUTER_LEFT; + else if (shape.equals(FIRST_OUTER_LEFT)) shape = OUTER_LEFT; + } + } + + return shape; + } + + public static String getNeighborPos(Corner face, Direction direction, Boolean reverse, Direction reference, BlockView world, BlockPos pos, Block block) { + BlockState block_state = world.getBlockState( + pos.offset(reverse ? direction.getOpposite() : direction) + ); + + if (block_state.isOf(block) && block_state.get(CORNER).hasDirection(reference)) { + if (block_state.get(CORNER).hasDirection(face.getLeftDirection())) return "left"; + else if (block_state.get(CORNER).hasDirection(face.getRightDirection())) return "right"; + } + return ""; + } + + public static ActionResult useCamo(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit, int theme_index) { + if(!(world.getBlockEntity(pos) instanceof ReFramedEntity block_entity)) return ActionResult.PASS; + + // Changing the theme + ItemStack held = player.getStackInHand(hand); + if(held.getItem() instanceof BlockItem block_item && block_entity.getTheme(theme_index).getBlock() == Blocks.AIR) { + Block block = block_item.getBlock(); + ItemPlacementContext ctx = new ItemPlacementContext(new ItemUsageContext(player, hand, hit)); + BlockState placement_state = block.getPlacementState(ctx); + if(placement_state != null && Block.isShapeFullCube(placement_state.getCollisionShape(world, pos)) && !(block instanceof BlockEntityProvider)) { + List themes = block_entity.getThemes(); + if(!world.isClient) block_entity.setTheme(placement_state, theme_index); + + // check for default light emission + if (placement_state.getLuminance() > 0 + && themes.stream().noneMatch(theme -> theme.getLuminance() > 0)) + if (block_entity.emitsLight()) Block.dropStack(world, pos, new ItemStack(Items.GLOWSTONE_DUST)); + else block_entity.toggleLight(); + + world.setBlockState(pos, state.with(LIGHT, block_entity.emitsLight())); + + // check for default redstone emission + if (placement_state.getWeakRedstonePower(world, pos, Direction.NORTH) > 0 + && themes.stream().noneMatch(theme -> theme.getWeakRedstonePower(world, pos, Direction.NORTH) > 0)) + if (block_entity.emitsRedstone()) Block.dropStack(world, pos, new ItemStack(Items.GLOWSTONE_DUST)); + else block_entity.toggleRedstone(); + + if(!player.isCreative()) held.decrement(1); + world.playSound(player, pos, placement_state.getSoundGroup().getPlaceSound(), SoundCategory.BLOCKS, 1f, 1.1f); + return ActionResult.SUCCESS; + } + } + + return ActionResult.PASS; + } + + public static ActionResult useUpgrade(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand) { + if(!(world.getBlockEntity(pos) instanceof ReFramedEntity block_entity)) return ActionResult.PASS; + + ItemStack held = player.getStackInHand(hand); + ReframedInteractible ext = state.getBlock() instanceof ReframedInteractible e ? e : ReframedInteractible.Default.INSTANCE; + + // frame will emit light if applied with glowstone + if(state.contains(LIGHT) && held.getItem() == Items.GLOWSTONE_DUST) { + block_entity.toggleLight(); + world.setBlockState(pos, state.with(LIGHT, block_entity.emitsLight())); + + if(!player.isCreative()) + if (block_entity.emitsLight()) held.decrement(1); + else held.increment(1); + world.playSound(player, pos, SoundEvents.BLOCK_GLASS_HIT, SoundCategory.BLOCKS, 1f, 1f); + return ActionResult.SUCCESS; + } + + // frame will emit redstone if applied with redstone torch can deactivate redstone block camo emission + if(held.getItem() == Items.REDSTONE_TORCH && ext.canAddRedstoneEmission(state, world, pos)) { + block_entity.toggleRedstone(); + + if(!player.isCreative()) + if (block_entity.emitsRedstone()) held.decrement(1); + else held.increment(1); + world.playSound(player, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 1f, 1f); + return ActionResult.SUCCESS; + } + + // Frame will lose its collision if applied with popped chorus fruit + if(held.getItem() == Items.POPPED_CHORUS_FRUIT && ext.canRemoveCollision(state, world, pos)) { + block_entity.toggleSolidity(); + + if(!player.isCreative()) + if (!block_entity.isSolid()) held.decrement(1); + else held.increment(1); + world.playSound(player, pos, SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT, SoundCategory.BLOCKS, 1f, 1f); + return ActionResult.SUCCESS; + } + + return ActionResult.PASS; + } + + // Doing this method from scratch as it is simpler to do than injecting everywhere + public static boolean shouldDrawSide(BlockState self_state, BlockView world, BlockPos pos, Direction side, BlockPos other_pos, int theme_index) { + ThemeableBlockEntity self = world.getBlockEntity(pos) instanceof ThemeableBlockEntity e ? e : null; + ThemeableBlockEntity other = world.getBlockEntity(other_pos) instanceof ThemeableBlockEntity e ? e : null; + BlockState other_state = world.getBlockState(other_pos); + + // normal behaviour + if (self == null && other == null) return Block.shouldDrawSide(self_state, world, pos, side, other_pos); + + // self is a normal Block + if (self == null && other_state.getBlock() instanceof ReFramedBlock other_block) { + VoxelShape self_shape = self_state.getCullingShape(world, pos); + if (self_shape.isEmpty()) return true; + + int i = 0; + VoxelShape other_shape = VoxelShapes.empty(); + for (BlockState s: other.getThemes()) { + i++; + if (self_state.isSideInvisible(s, side) || s.isOpaque()) + other_shape = combine( + other_shape, + other_block + .getShape(other_state, i) + .getFace(side.getOpposite()), + BooleanBiFunction.OR + ); + } + + // determine if side needs to be rendered + return VoxelShapes.matchesAnywhere(self_shape, other_shape, BooleanBiFunction.ONLY_FIRST); + } + + BlockState self_theme = self.getTheme(theme_index); + // other is normal Block + if (other == null && self_state.getBlock() instanceof ReFramedBlock self_block) { + // Transparent is simple if self and the neighbor are invisible don't render side (like default) + if (self_theme.isSideInvisible(other_state, side)) return false; + + // Opaque is also simple as each model are rendered one by one + if (other_state.isOpaque()) { + // no cache section :( because it differs between each instance of the frame + VoxelShape self_shape = self_block.getShape(self_state, theme_index).getFace(side); + if (self_shape.isEmpty()) return true; + VoxelShape other_shape = other_state.getCullingFace(world, other_pos, side.getOpposite()); + + // determine if side needs to be rendered + return VoxelShapes.matchesAnywhere(self_shape, other_shape, BooleanBiFunction.ONLY_FIRST); + } + + return true; + } + + // Both are frames + // here both are computed in the same zone as there will necessarily a shape comparison + if (self_state.getBlock() instanceof ReFramedBlock self_block && other_state.getBlock() instanceof ReFramedBlock other_block) { + VoxelShape self_shape = self_block.getShape(self_state, theme_index).getFace(side); + if (self_shape.isEmpty()) return true; + + int i = 0; + VoxelShape other_shape = VoxelShapes.empty(); + for (BlockState s: other.getThemes()) { + i++; + if (self_theme.isSideInvisible(s, side) || s.isOpaque()) + other_shape = combine( + other_shape, + other_block + .getShape(other_state, i) + .getFace(side.getOpposite()), + BooleanBiFunction.OR + ); + } + + // determine if side needs to be rendered + return VoxelShapes.matchesAnywhere(self_shape, other_shape, BooleanBiFunction.ONLY_FIRST); + } + + return true; + } + + public static boolean cursorMatchesFace(VoxelShape shape, Vec3d pos) { + Map axes = Arrays.stream(Direction.Axis.values()) + .collect(Collectors.toMap( + x -> x, + x -> x.choose(pos.getX(), pos.getY(), pos.getZ()) + )); + + return shape.getBoundingBoxes().stream() + .anyMatch(box -> + axes.keySet().stream() + .map(x -> box.getMin(x) <= axes.get(x) && box.getMax(x) >= axes.get(x)) + .reduce((prev, current) -> prev && current).orElse(false) + ); + } + + public static int luminance(BlockState state) { + return state.contains(LIGHT) && state.get(LIGHT) ? 15 : 0; + } +} diff --git a/src/main/java/fr/adrien1106/reframed/util/BlockProperties.java b/src/main/java/fr/adrien1106/reframed/util/BlockProperties.java new file mode 100644 index 0000000..11aab58 --- /dev/null +++ b/src/main/java/fr/adrien1106/reframed/util/BlockProperties.java @@ -0,0 +1,12 @@ +package fr.adrien1106.reframed.util; + +import fr.adrien1106.reframed.util.property.Corner; +import fr.adrien1106.reframed.util.property.StairShape; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.EnumProperty; + +public class BlockProperties { + public static final BooleanProperty LIGHT = BooleanProperty.of("emits_light"); + public static final EnumProperty CORNER = EnumProperty.of("corner", Corner.class); + public static final EnumProperty STAIR_SHAPE = EnumProperty.of("shape", StairShape.class); +} diff --git a/src/main/java/fr/adrien1106/reframed/util/ReFramedInteractionUtil.java b/src/main/java/fr/adrien1106/reframed/util/ReFramedInteractionUtil.java deleted file mode 100644 index 7710155..0000000 --- a/src/main/java/fr/adrien1106/reframed/util/ReFramedInteractionUtil.java +++ /dev/null @@ -1,195 +0,0 @@ -package fr.adrien1106.reframed.util; - -import fr.adrien1106.reframed.block.ReFramedEntity; -import net.minecraft.block.*; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.*; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.ItemScatterer; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.GameRules; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -//For an example of how to use this class, have a look at TemplateBlock. -//Basically there are several methods that would like to modify the return value of something. -public class ReFramedInteractionUtil { - @Deprecated // TODO remove - public static final BooleanProperty LIGHT = BooleanProperty.of("frame_light"); - - @Deprecated // TODO remove - public static StateManager.Builder appendProperties(StateManager.Builder builder) { - return builder.add(LIGHT); - } - - //Use this to obtain a Block.Settings that'll make your Template act like the ones in the mod. - //(To complete the look, don't forget to tag your blocks with mineable/axe.) - private static final AbstractBlock.ContextPredicate NOPE = (blah, blahdey, blahh) -> false; - - // TODO Find better place - public static AbstractBlock.Settings configureSettings(AbstractBlock.Settings s) { - return s.luminance(ReFramedInteractionUtil::luminance).nonOpaque().sounds(BlockSoundGroup.WOOD).hardness(0.2f).suffocates(NOPE).blockVision(NOPE); - } - - - // TODO Find better place - //And if you don't have a Block.Settings to copy off of. - public static AbstractBlock.Settings makeSettings() { - return configureSettings(AbstractBlock.Settings.create()); - } - - @Deprecated // TODO remove - public static BlockState setDefaultStates(BlockState in) { - if(in.contains(LIGHT)) in = in.with(LIGHT, false); - return in; - } - - @Deprecated // TODO remove - public static @Nullable BlockState modifyPlacementState(@Nullable BlockState in, ItemPlacementContext ctx) { - return ReFramedEntity.getNbtLightLevel(in, ctx.getStack()); - } - - @Deprecated // TODO remove - public static ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if(!(world.getBlockEntity(pos) instanceof ReFramedEntity block_entity)) return ActionResult.PASS; - if(!player.canModifyBlocks() || !world.canPlayerModifyAt(player, pos)) return ActionResult.PASS; - - ItemStack held = player.getStackInHand(hand); - ReframedInteractible ext = state.getBlock() instanceof ReframedInteractible e ? e : ReframedInteractible.Default.INSTANCE; - - // frame will emit light if applied with glowstone - if(state.contains(LIGHT) && held.getItem() == Items.GLOWSTONE_DUST) { - block_entity.toggleLight(); - world.setBlockState(pos, state.with(LIGHT, block_entity.emitsLight())); - - if(!player.isCreative()) - if (block_entity.emitsLight()) held.decrement(1); - else held.increment(1); - world.playSound(player, pos, SoundEvents.BLOCK_GLASS_HIT, SoundCategory.BLOCKS, 1f, 1f); - return ActionResult.SUCCESS; - } - - // frame will emit redstone if applied with redstone torch can deactivate redstone block camo emission - if(held.getItem() == Items.REDSTONE_TORCH && ext.canAddRedstoneEmission(state, world, pos)) { - block_entity.toggleRedstone(); - - if(!player.isCreative()) - if (block_entity.emitsRedstone()) held.decrement(1); - else held.increment(1); - world.playSound(player, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 1f, 1f); - return ActionResult.SUCCESS; - } - - // Frame will lose its collision if applied with popped chorus fruit - if(held.getItem() == Items.POPPED_CHORUS_FRUIT && ext.canRemoveCollision(state, world, pos)) { - block_entity.toggleSolidity(); - - if(!player.isCreative()) - if (!block_entity.isSolid()) held.decrement(1); - else held.increment(1); - world.playSound(player, pos, SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT, SoundCategory.BLOCKS, 1f, 1f); - return ActionResult.SUCCESS; - } - - // Changing the theme - if(held.getItem() instanceof BlockItem block_item && block_entity.getTheme(1).getBlock() == Blocks.AIR) { - Block block = block_item.getBlock(); - ItemPlacementContext ctx = new ItemPlacementContext(new ItemUsageContext(player, hand, hit)); - BlockState placementState = block.getPlacementState(ctx); - if(placementState != null && Block.isShapeFullCube(placementState.getCollisionShape(world, pos)) && !(block instanceof BlockEntityProvider)) { - // TODO FOR SECOND - if(!world.isClient) block_entity.setTheme(placementState, 1); - - // check for default light emission - if (placementState.getLuminance() > 0) - if (block_entity.emitsLight()) Block.dropStack(world, pos, new ItemStack(Items.GLOWSTONE_DUST)); - else block_entity.toggleLight(); - - world.setBlockState(pos, state.with(LIGHT, block_entity.emitsLight())); - - // check for redstone emission - if (placementState.getWeakRedstonePower(world, pos, Direction.NORTH) > 0) - if (block_entity.emitsRedstone()) Block.dropStack(world, pos, new ItemStack(Items.GLOWSTONE_DUST)); - else block_entity.toggleRedstone(); - - if(!player.isCreative()) held.decrement(1); - world.playSound(player, pos, placementState.getSoundGroup().getPlaceSound(), SoundCategory.BLOCKS, 1f, 1.1f); - return ActionResult.SUCCESS; - } - } - - return ActionResult.PASS; - } - - @Deprecated - public static void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - if(!state.isOf(newState.getBlock()) && - world.getBlockEntity(pos) instanceof ReFramedEntity frame_entity && - world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS) - ) { - DefaultedList drops = DefaultedList.of(); - - BlockState theme = frame_entity.getTheme(1); - if(theme.getBlock() != Blocks.AIR) drops.add(new ItemStack(theme.getBlock())); - - if(frame_entity.emitsRedstone() && theme.getWeakRedstonePower(world, pos, Direction.NORTH) == 0) - drops.add(new ItemStack(Items.REDSTONE_TORCH)); - if(frame_entity.emitsLight() && theme.getLuminance() == 0) - drops.add(new ItemStack(Items.GLOWSTONE_DUST)); - if(!frame_entity.isSolid() && theme.isSolid()) - drops.add(new ItemStack(Items.POPPED_CHORUS_FRUIT)); - - ItemScatterer.spawn(world, pos, drops); - } - } - - @Deprecated - public static void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - //Load the BlockEntityTag clientside, which fixes the template briefly showing its default state when placing it. - //I'm surprised this doesn't happen by default; the BlockEntityTag stuff is only done serverside. - if(world.isClient && world.getBlockEntity(pos) instanceof ReFramedEntity be) { - NbtCompound tag = BlockItem.getBlockEntityNbt(stack); - if(tag != null) be.readNbt(tag); - } - } - - @Deprecated - //Returns "null" to signal "no opinion". Imagine it like an InteractionResult.PASS. - public static @Nullable VoxelShape getCollisionShape(BlockState state, BlockView view, BlockPos pos, ShapeContext ctx) { - return view.getBlockEntity(pos) instanceof ReFramedEntity be && !be.isSolid() ? VoxelShapes.empty() : null; - } - - @Deprecated // TODO remove - public static boolean emitsRedstonePower(BlockState state) { - //return state.contains(REDSTONE) ? state.get(REDSTONE) : false; - return false; //TODO, not available after punting this to BlockEntity. Yarn makes this method sound more important than it is, it's just for dust redirection. - } - - @Deprecated // TODO remove - public static int getWeakRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return view.getBlockEntity(pos) instanceof ReFramedEntity be && be.emitsRedstone() ? 15 : 0; - } - - @Deprecated // TODO remove - public static int getStrongRedstonePower(BlockState state, BlockView view, BlockPos pos, Direction dir) { - return view.getBlockEntity(pos) instanceof ReFramedEntity be && be.emitsRedstone() ? 15 : 0; - } - - public static int luminance(BlockState state) { - return state.contains(LIGHT) && state.get(LIGHT) ? 15 : 0; - } -} diff --git a/src/main/java/fr/adrien1106/reframed/util/property/StairDirection.java b/src/main/java/fr/adrien1106/reframed/util/property/Corner.java similarity index 77% rename from src/main/java/fr/adrien1106/reframed/util/property/StairDirection.java rename to src/main/java/fr/adrien1106/reframed/util/property/Corner.java index 35c05a0..f95b3d0 100644 --- a/src/main/java/fr/adrien1106/reframed/util/property/StairDirection.java +++ b/src/main/java/fr/adrien1106/reframed/util/property/Corner.java @@ -5,7 +5,7 @@ import net.minecraft.util.math.Direction; import java.util.Arrays; -public enum StairDirection implements StringIdentifiable { +public enum Corner implements StringIdentifiable { NORTH_DOWN("north_down", Direction.NORTH, Direction.DOWN, Direction.EAST, 0), DOWN_SOUTH("down_south", Direction.DOWN, Direction.SOUTH, Direction.EAST, 1), SOUTH_UP("south_up", Direction.SOUTH, Direction.UP, Direction.EAST, 2), @@ -26,7 +26,7 @@ public enum StairDirection implements StringIdentifiable { private final Direction left_direction; private final int ID; - StairDirection(String name, Direction first_direction, Direction second_direction, Direction right_direction, int id) { + Corner(String name, Direction first_direction, Direction second_direction, Direction right_direction, int id) { this.name = name; this.first_direction = first_direction; this.second_direction = second_direction; @@ -66,21 +66,21 @@ public enum StairDirection implements StringIdentifiable { return this.ID; } - public static StairDirection getByDirections(Direction direction_1, Direction direction_2) { - return Arrays.stream(StairDirection.values()) + public static Corner getByDirections(Direction direction_1, Direction direction_2) { + return Arrays.stream(Corner.values()) .filter(value -> value.hasDirection(direction_1) && value.hasDirection(direction_2)) - .findFirst().orElse(StairDirection.NORTH_DOWN); + .findFirst().orElse(Corner.NORTH_DOWN); } - public static StairDirection fromId(int id) { - return Arrays.stream(StairDirection.values()) + public static Corner fromId(int id) { + return Arrays.stream(Corner.values()) .filter(value -> value.getID() == id) - .findFirst().orElse(StairDirection.NORTH_DOWN); + .findFirst().orElse(Corner.NORTH_DOWN); } - public static StairDirection fromName(String name) { - return Arrays.stream(StairDirection.values()) + public static Corner fromName(String name) { + return Arrays.stream(Corner.values()) .filter(value -> value.name().equals(name)) - .findFirst().orElse(StairDirection.NORTH_DOWN); + .findFirst().orElse(Corner.NORTH_DOWN); } } diff --git a/src/main/resources/assets/reframed/blockstates/button.json b/src/main/resources/assets/reframed/blockstates/button.json deleted file mode 100644 index 3d92350..0000000 --- a/src/main/resources/assets/reframed/blockstates/button.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "variants": { - "face=ceiling,facing=east,powered=false": { - "model": "reframed:button_special", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=east,powered=true": { - "model": "reframed:button_pressed_special", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=north,powered=false": { - "model": "reframed:button_special", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=north,powered=true": { - "model": "reframed:button_pressed_special", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=south,powered=false": { - "model": "reframed:button_special", - "x": 180 - }, - "face=ceiling,facing=south,powered=true": { - "model": "reframed:button_pressed_special", - "x": 180 - }, - "face=ceiling,facing=west,powered=false": { - "model": "reframed:button_special", - "x": 180, - "y": 90 - }, - "face=ceiling,facing=west,powered=true": { - "model": "reframed:button_pressed_special", - "x": 180, - "y": 90 - }, - "face=floor,facing=east,powered=false": { - "model": "reframed:button_special", - "y": 90 - }, - "face=floor,facing=east,powered=true": { - "model": "reframed:button_pressed_special", - "y": 90 - }, - "face=floor,facing=north,powered=false": { - "model": "reframed:button_special" - }, - "face=floor,facing=north,powered=true": { - "model": "reframed:button_pressed_special" - }, - "face=floor,facing=south,powered=false": { - "model": "reframed:button_special", - "y": 180 - }, - "face=floor,facing=south,powered=true": { - "model": "reframed:button_pressed_special", - "y": 180 - }, - "face=floor,facing=west,powered=false": { - "model": "reframed:button_special", - "y": 270 - }, - "face=floor,facing=west,powered=true": { - "model": "reframed:button_pressed_special", - "y": 270 - }, - "face=wall,facing=east,powered=false": { - "model": "reframed:button_special", - "uvlock": true, - "x": 90, - "y": 90 - }, - "face=wall,facing=east,powered=true": { - "model": "reframed:button_pressed_special", - "uvlock": true, - "x": 90, - "y": 90 - }, - "face=wall,facing=north,powered=false": { - "model": "reframed:button_special", - "uvlock": true, - "x": 90 - }, - "face=wall,facing=north,powered=true": { - "model": "reframed:button_pressed_special", - "uvlock": true, - "x": 90 - }, - "face=wall,facing=south,powered=false": { - "model": "reframed:button_special", - "uvlock": true, - "x": 90, - "y": 180 - }, - "face=wall,facing=south,powered=true": { - "model": "reframed:button_pressed_special", - "uvlock": true, - "x": 90, - "y": 180 - }, - "face=wall,facing=west,powered=false": { - "model": "reframed:button_special", - "uvlock": true, - "x": 90, - "y": 270 - }, - "face=wall,facing=west,powered=true": { - "model": "reframed:button_pressed_special", - "uvlock": true, - "x": 90, - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/candle.json b/src/main/resources/assets/reframed/blockstates/candle.json deleted file mode 100644 index 2e43925..0000000 --- a/src/main/resources/assets/reframed/blockstates/candle.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "candles=1": { - "model": "reframed:one_candle_special" - }, - "candles=2": { - "model": "reframed:two_candles_special" - }, - "candles=3": { - "model": "reframed:three_candles_special" - }, - "candles=4": { - "model": "reframed:four_candles_special" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/carpet.json b/src/main/resources/assets/reframed/blockstates/carpet.json deleted file mode 100644 index c065759..0000000 --- a/src/main/resources/assets/reframed/blockstates/carpet.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "reframed:carpet_special" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/cube.json b/src/main/resources/assets/reframed/blockstates/cube.json deleted file mode 100644 index a82f101..0000000 --- a/src/main/resources/assets/reframed/blockstates/cube.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "reframed:cube_special" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/door.json b/src/main/resources/assets/reframed/blockstates/door.json deleted file mode 100644 index 28f9903..0000000 --- a/src/main/resources/assets/reframed/blockstates/door.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "variants": { - "facing=east,half=lower,hinge=left,open=false": { - "model": "reframed:door_bottom_left_special" - }, - "facing=east,half=lower,hinge=left,open=true": { - "model": "reframed:door_bottom_left_open_special", - "y": 90 - }, - "facing=east,half=lower,hinge=right,open=false": { - "model": "reframed:door_bottom_right_special" - }, - "facing=east,half=lower,hinge=right,open=true": { - "model": "reframed:door_bottom_right_open_special", - "y": 270 - }, - "facing=east,half=upper,hinge=left,open=false": { - "model": "reframed:door_top_left_special" - }, - "facing=east,half=upper,hinge=left,open=true": { - "model": "reframed:door_top_left_open_special", - "y": 90 - }, - "facing=east,half=upper,hinge=right,open=false": { - "model": "reframed:door_top_right_special" - }, - "facing=east,half=upper,hinge=right,open=true": { - "model": "reframed:door_top_right_open_special", - "y": 270 - }, - "facing=north,half=lower,hinge=left,open=false": { - "model": "reframed:door_bottom_left_special", - "y": 270 - }, - "facing=north,half=lower,hinge=left,open=true": { - "model": "reframed:door_bottom_left_open_special" - }, - "facing=north,half=lower,hinge=right,open=false": { - "model": "reframed:door_bottom_right_special", - "y": 270 - }, - "facing=north,half=lower,hinge=right,open=true": { - "model": "reframed:door_bottom_right_open_special", - "y": 180 - }, - "facing=north,half=upper,hinge=left,open=false": { - "model": "reframed:door_top_left_special", - "y": 270 - }, - "facing=north,half=upper,hinge=left,open=true": { - "model": "reframed:door_top_left_open_special" - }, - "facing=north,half=upper,hinge=right,open=false": { - "model": "reframed:door_top_right_special", - "y": 270 - }, - "facing=north,half=upper,hinge=right,open=true": { - "model": "reframed:door_top_right_open_special", - "y": 180 - }, - "facing=south,half=lower,hinge=left,open=false": { - "model": "reframed:door_bottom_left_special", - "y": 90 - }, - "facing=south,half=lower,hinge=left,open=true": { - "model": "reframed:door_bottom_left_open_special", - "y": 180 - }, - "facing=south,half=lower,hinge=right,open=false": { - "model": "reframed:door_bottom_right_special", - "y": 90 - }, - "facing=south,half=lower,hinge=right,open=true": { - "model": "reframed:door_bottom_right_open_special" - }, - "facing=south,half=upper,hinge=left,open=false": { - "model": "reframed:door_top_left_special", - "y": 90 - }, - "facing=south,half=upper,hinge=left,open=true": { - "model": "reframed:door_top_left_open_special", - "y": 180 - }, - "facing=south,half=upper,hinge=right,open=false": { - "model": "reframed:door_top_right_special", - "y": 90 - }, - "facing=south,half=upper,hinge=right,open=true": { - "model": "reframed:door_top_right_open_special" - }, - "facing=west,half=lower,hinge=left,open=false": { - "model": "reframed:door_bottom_left_special", - "y": 180 - }, - "facing=west,half=lower,hinge=left,open=true": { - "model": "reframed:door_bottom_left_open_special", - "y": 270 - }, - "facing=west,half=lower,hinge=right,open=false": { - "model": "reframed:door_bottom_right_special", - "y": 180 - }, - "facing=west,half=lower,hinge=right,open=true": { - "model": "reframed:door_bottom_right_open_special", - "y": 90 - }, - "facing=west,half=upper,hinge=left,open=false": { - "model": "reframed:door_top_left_special", - "y": 180 - }, - "facing=west,half=upper,hinge=left,open=true": { - "model": "reframed:door_top_left_open_special", - "y": 270 - }, - "facing=west,half=upper,hinge=right,open=false": { - "model": "reframed:door_top_right_special", - "y": 180 - }, - "facing=west,half=upper,hinge=right,open=true": { - "model": "reframed:door_top_right_open_special", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/fence.json b/src/main/resources/assets/reframed/blockstates/fence.json deleted file mode 100644 index fc79e23..0000000 --- a/src/main/resources/assets/reframed/blockstates/fence.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "multipart": [ - { - "apply": { - "model": "reframed:fence_post_special" - } - }, - { - "apply": { - "model": "reframed:fence_side_special", - "uvlock": true - }, - "when": { - "north": "true" - } - }, - { - "apply": { - "model": "reframed:fence_side_special", - "uvlock": true, - "y": 90 - }, - "when": { - "east": "true" - } - }, - { - "apply": { - "model": "reframed:fence_side_special", - "uvlock": true, - "y": 180 - }, - "when": { - "south": "true" - } - }, - { - "apply": { - "model": "reframed:fence_side_special", - "uvlock": true, - "y": 270 - }, - "when": { - "west": "true" - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/fence_gate.json b/src/main/resources/assets/reframed/blockstates/fence_gate.json deleted file mode 100644 index f0ea0f4..0000000 --- a/src/main/resources/assets/reframed/blockstates/fence_gate.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "variants": { - "facing=east,in_wall=false,open=false": { - "model": "reframed:fence_gate_special", - "uvlock": true, - "y": 270 - }, - "facing=east,in_wall=false,open=true": { - "model": "reframed:fence_gate_open_special", - "uvlock": true, - "y": 270 - }, - "facing=east,in_wall=true,open=false": { - "model": "reframed:fence_gate_wall_special", - "uvlock": true, - "y": 270 - }, - "facing=east,in_wall=true,open=true": { - "model": "reframed:fence_gate_wall_open_special", - "uvlock": true, - "y": 270 - }, - "facing=north,in_wall=false,open=false": { - "model": "reframed:fence_gate_special", - "uvlock": true, - "y": 180 - }, - "facing=north,in_wall=false,open=true": { - "model": "reframed:fence_gate_open_special", - "uvlock": true, - "y": 180 - }, - "facing=north,in_wall=true,open=false": { - "model": "reframed:fence_gate_wall_special", - "uvlock": true, - "y": 180 - }, - "facing=north,in_wall=true,open=true": { - "model": "reframed:fence_gate_wall_open_special", - "uvlock": true, - "y": 180 - }, - "facing=south,in_wall=false,open=false": { - "model": "reframed:fence_gate_special", - "uvlock": true - }, - "facing=south,in_wall=false,open=true": { - "model": "reframed:fence_gate_open_special", - "uvlock": true - }, - "facing=south,in_wall=true,open=false": { - "model": "reframed:fence_gate_wall_special", - "uvlock": true - }, - "facing=south,in_wall=true,open=true": { - "model": "reframed:fence_gate_wall_open_special", - "uvlock": true - }, - "facing=west,in_wall=false,open=false": { - "model": "reframed:fence_gate_special", - "uvlock": true, - "y": 90 - }, - "facing=west,in_wall=false,open=true": { - "model": "reframed:fence_gate_open_special", - "uvlock": true, - "y": 90 - }, - "facing=west,in_wall=true,open=false": { - "model": "reframed:fence_gate_wall_special", - "uvlock": true, - "y": 90 - }, - "facing=west,in_wall=true,open=true": { - "model": "reframed:fence_gate_wall_open_special", - "uvlock": true, - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/iron_door.json b/src/main/resources/assets/reframed/blockstates/iron_door.json deleted file mode 100644 index 28f9903..0000000 --- a/src/main/resources/assets/reframed/blockstates/iron_door.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "variants": { - "facing=east,half=lower,hinge=left,open=false": { - "model": "reframed:door_bottom_left_special" - }, - "facing=east,half=lower,hinge=left,open=true": { - "model": "reframed:door_bottom_left_open_special", - "y": 90 - }, - "facing=east,half=lower,hinge=right,open=false": { - "model": "reframed:door_bottom_right_special" - }, - "facing=east,half=lower,hinge=right,open=true": { - "model": "reframed:door_bottom_right_open_special", - "y": 270 - }, - "facing=east,half=upper,hinge=left,open=false": { - "model": "reframed:door_top_left_special" - }, - "facing=east,half=upper,hinge=left,open=true": { - "model": "reframed:door_top_left_open_special", - "y": 90 - }, - "facing=east,half=upper,hinge=right,open=false": { - "model": "reframed:door_top_right_special" - }, - "facing=east,half=upper,hinge=right,open=true": { - "model": "reframed:door_top_right_open_special", - "y": 270 - }, - "facing=north,half=lower,hinge=left,open=false": { - "model": "reframed:door_bottom_left_special", - "y": 270 - }, - "facing=north,half=lower,hinge=left,open=true": { - "model": "reframed:door_bottom_left_open_special" - }, - "facing=north,half=lower,hinge=right,open=false": { - "model": "reframed:door_bottom_right_special", - "y": 270 - }, - "facing=north,half=lower,hinge=right,open=true": { - "model": "reframed:door_bottom_right_open_special", - "y": 180 - }, - "facing=north,half=upper,hinge=left,open=false": { - "model": "reframed:door_top_left_special", - "y": 270 - }, - "facing=north,half=upper,hinge=left,open=true": { - "model": "reframed:door_top_left_open_special" - }, - "facing=north,half=upper,hinge=right,open=false": { - "model": "reframed:door_top_right_special", - "y": 270 - }, - "facing=north,half=upper,hinge=right,open=true": { - "model": "reframed:door_top_right_open_special", - "y": 180 - }, - "facing=south,half=lower,hinge=left,open=false": { - "model": "reframed:door_bottom_left_special", - "y": 90 - }, - "facing=south,half=lower,hinge=left,open=true": { - "model": "reframed:door_bottom_left_open_special", - "y": 180 - }, - "facing=south,half=lower,hinge=right,open=false": { - "model": "reframed:door_bottom_right_special", - "y": 90 - }, - "facing=south,half=lower,hinge=right,open=true": { - "model": "reframed:door_bottom_right_open_special" - }, - "facing=south,half=upper,hinge=left,open=false": { - "model": "reframed:door_top_left_special", - "y": 90 - }, - "facing=south,half=upper,hinge=left,open=true": { - "model": "reframed:door_top_left_open_special", - "y": 180 - }, - "facing=south,half=upper,hinge=right,open=false": { - "model": "reframed:door_top_right_special", - "y": 90 - }, - "facing=south,half=upper,hinge=right,open=true": { - "model": "reframed:door_top_right_open_special" - }, - "facing=west,half=lower,hinge=left,open=false": { - "model": "reframed:door_bottom_left_special", - "y": 180 - }, - "facing=west,half=lower,hinge=left,open=true": { - "model": "reframed:door_bottom_left_open_special", - "y": 270 - }, - "facing=west,half=lower,hinge=right,open=false": { - "model": "reframed:door_bottom_right_special", - "y": 180 - }, - "facing=west,half=lower,hinge=right,open=true": { - "model": "reframed:door_bottom_right_open_special", - "y": 90 - }, - "facing=west,half=upper,hinge=left,open=false": { - "model": "reframed:door_top_left_special", - "y": 180 - }, - "facing=west,half=upper,hinge=left,open=true": { - "model": "reframed:door_top_left_open_special", - "y": 270 - }, - "facing=west,half=upper,hinge=right,open=false": { - "model": "reframed:door_top_right_special", - "y": 180 - }, - "facing=west,half=upper,hinge=right,open=true": { - "model": "reframed:door_top_right_open_special", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/iron_trapdoor.json b/src/main/resources/assets/reframed/blockstates/iron_trapdoor.json deleted file mode 100644 index 5ea5b45..0000000 --- a/src/main/resources/assets/reframed/blockstates/iron_trapdoor.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,open=false": { - "model": "reframed:trapdoor_bottom_special", - "y": 90 - }, - "facing=east,half=bottom,open=true": { - "model": "reframed:trapdoor_open_special", - "y": 90 - }, - "facing=east,half=top,open=false": { - "model": "reframed:trapdoor_top_special", - "y": 90 - }, - "facing=east,half=top,open=true": { - "model": "reframed:trapdoor_open_special", - "x": 180, - "y": 270 - }, - "facing=north,half=bottom,open=false": { - "model": "reframed:trapdoor_bottom_special" - }, - "facing=north,half=bottom,open=true": { - "model": "reframed:trapdoor_open_special" - }, - "facing=north,half=top,open=false": { - "model": "reframed:trapdoor_top_special" - }, - "facing=north,half=top,open=true": { - "model": "reframed:trapdoor_open_special", - "x": 180, - "y": 180 - }, - "facing=south,half=bottom,open=false": { - "model": "reframed:trapdoor_bottom_special", - "y": 180 - }, - "facing=south,half=bottom,open=true": { - "model": "reframed:trapdoor_open_special", - "y": 180 - }, - "facing=south,half=top,open=false": { - "model": "reframed:trapdoor_top_special", - "y": 180 - }, - "facing=south,half=top,open=true": { - "model": "reframed:trapdoor_open_special", - "x": 180, - "y": 0 - }, - "facing=west,half=bottom,open=false": { - "model": "reframed:trapdoor_bottom_special", - "y": 270 - }, - "facing=west,half=bottom,open=true": { - "model": "reframed:trapdoor_open_special", - "y": 270 - }, - "facing=west,half=top,open=false": { - "model": "reframed:trapdoor_top_special", - "y": 270 - }, - "facing=west,half=top,open=true": { - "model": "reframed:trapdoor_open_special", - "x": 180, - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/lever.json b/src/main/resources/assets/reframed/blockstates/lever.json deleted file mode 100644 index 221f4b7..0000000 --- a/src/main/resources/assets/reframed/blockstates/lever.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "variants": { - "face=ceiling,facing=east,powered=false": { - "model": "reframed:lever_on_special", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=east,powered=true": { - "model": "reframed:lever_special", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=north,powered=false": { - "model": "reframed:lever_on_special", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=north,powered=true": { - "model": "reframed:lever_special", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=south,powered=false": { - "model": "reframed:lever_on_special", - "x": 180 - }, - "face=ceiling,facing=south,powered=true": { - "model": "reframed:lever_special", - "x": 180 - }, - "face=ceiling,facing=west,powered=false": { - "model": "reframed:lever_on_special", - "x": 180, - "y": 90 - }, - "face=ceiling,facing=west,powered=true": { - "model": "reframed:lever_special", - "x": 180, - "y": 90 - }, - "face=floor,facing=east,powered=false": { - "model": "reframed:lever_on_special", - "y": 90 - }, - "face=floor,facing=east,powered=true": { - "model": "reframed:lever_special", - "y": 90 - }, - "face=floor,facing=north,powered=false": { - "model": "reframed:lever_on_special" - }, - "face=floor,facing=north,powered=true": { - "model": "reframed:lever_special" - }, - "face=floor,facing=south,powered=false": { - "model": "reframed:lever_on_special", - "y": 180 - }, - "face=floor,facing=south,powered=true": { - "model": "reframed:lever_special", - "y": 180 - }, - "face=floor,facing=west,powered=false": { - "model": "reframed:lever_on_special", - "y": 270 - }, - "face=floor,facing=west,powered=true": { - "model": "reframed:lever_special", - "y": 270 - }, - "face=wall,facing=east,powered=false": { - "model": "reframed:lever_on_special", - "x": 90, - "y": 90 - }, - "face=wall,facing=east,powered=true": { - "model": "reframed:lever_special", - "x": 90, - "y": 90 - }, - "face=wall,facing=north,powered=false": { - "model": "reframed:lever_on_special", - "x": 90 - }, - "face=wall,facing=north,powered=true": { - "model": "reframed:lever_special", - "x": 90 - }, - "face=wall,facing=south,powered=false": { - "model": "reframed:lever_on_special", - "x": 90, - "y": 180 - }, - "face=wall,facing=south,powered=true": { - "model": "reframed:lever_special", - "x": 90, - "y": 180 - }, - "face=wall,facing=west,powered=false": { - "model": "reframed:lever_on_special", - "x": 90, - "y": 270 - }, - "face=wall,facing=west,powered=true": { - "model": "reframed:lever_special", - "x": 90, - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/pane.json b/src/main/resources/assets/reframed/blockstates/pane.json deleted file mode 100644 index d1a6ea6..0000000 --- a/src/main/resources/assets/reframed/blockstates/pane.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "multipart": [ - { - "apply": { - "model": "reframed:glass_pane_post_special" - } - }, - { - "apply": { - "model": "reframed:glass_pane_side_special" - }, - "when": { - "north": "true" - } - }, - { - "apply": { - "model": "reframed:glass_pane_side_special", - "y": 90 - }, - "when": { - "east": "true" - } - }, - { - "apply": { - "model": "reframed:glass_pane_side_alt_special" - }, - "when": { - "south": "true" - } - }, - { - "apply": { - "model": "reframed:glass_pane_side_alt_special", - "y": 90 - }, - "when": { - "west": "true" - } - }, - { - "apply": { - "model": "reframed:glass_pane_noside_special" - }, - "when": { - "north": "false" - } - }, - { - "apply": { - "model": "reframed:glass_pane_noside_alt_special" - }, - "when": { - "east": "false" - } - }, - { - "apply": { - "model": "reframed:glass_pane_noside_alt_special", - "y": 90 - }, - "when": { - "south": "false" - } - }, - { - "apply": { - "model": "reframed:glass_pane_noside_special", - "y": 270 - }, - "when": { - "west": "false" - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/post.json b/src/main/resources/assets/reframed/blockstates/post.json deleted file mode 100644 index 439dbaa..0000000 --- a/src/main/resources/assets/reframed/blockstates/post.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "reframed:fence_post_special", - "x": 90, - "y": 90, - "uvlock": true - }, - "axis=y": { - "model": "reframed:fence_post_special", - "uvlock": true - }, - "axis=z": { - "model": "reframed:fence_post_special", - "uvlock": true, - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/pressure_plate.json b/src/main/resources/assets/reframed/blockstates/pressure_plate.json deleted file mode 100644 index 1316871..0000000 --- a/src/main/resources/assets/reframed/blockstates/pressure_plate.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "powered=false": { - "model": "reframed:pressure_plate_up_special" - }, - "powered=true": { - "model": "reframed:pressure_plate_down_special" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/trapdoor.json b/src/main/resources/assets/reframed/blockstates/trapdoor.json deleted file mode 100644 index 5ea5b45..0000000 --- a/src/main/resources/assets/reframed/blockstates/trapdoor.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,open=false": { - "model": "reframed:trapdoor_bottom_special", - "y": 90 - }, - "facing=east,half=bottom,open=true": { - "model": "reframed:trapdoor_open_special", - "y": 90 - }, - "facing=east,half=top,open=false": { - "model": "reframed:trapdoor_top_special", - "y": 90 - }, - "facing=east,half=top,open=true": { - "model": "reframed:trapdoor_open_special", - "x": 180, - "y": 270 - }, - "facing=north,half=bottom,open=false": { - "model": "reframed:trapdoor_bottom_special" - }, - "facing=north,half=bottom,open=true": { - "model": "reframed:trapdoor_open_special" - }, - "facing=north,half=top,open=false": { - "model": "reframed:trapdoor_top_special" - }, - "facing=north,half=top,open=true": { - "model": "reframed:trapdoor_open_special", - "x": 180, - "y": 180 - }, - "facing=south,half=bottom,open=false": { - "model": "reframed:trapdoor_bottom_special", - "y": 180 - }, - "facing=south,half=bottom,open=true": { - "model": "reframed:trapdoor_open_special", - "y": 180 - }, - "facing=south,half=top,open=false": { - "model": "reframed:trapdoor_top_special", - "y": 180 - }, - "facing=south,half=top,open=true": { - "model": "reframed:trapdoor_open_special", - "x": 180, - "y": 0 - }, - "facing=west,half=bottom,open=false": { - "model": "reframed:trapdoor_bottom_special", - "y": 270 - }, - "facing=west,half=bottom,open=true": { - "model": "reframed:trapdoor_open_special", - "y": 270 - }, - "facing=west,half=top,open=false": { - "model": "reframed:trapdoor_top_special", - "y": 270 - }, - "facing=west,half=top,open=true": { - "model": "reframed:trapdoor_open_special", - "x": 180, - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/blockstates/wall.json b/src/main/resources/assets/reframed/blockstates/wall.json deleted file mode 100644 index 3d6903d..0000000 --- a/src/main/resources/assets/reframed/blockstates/wall.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "multipart": [ - { - "apply": { - "model": "reframed:wall_post_special" - }, - "when": { - "up": "true" - } - }, - { - "apply": { - "model": "reframed:wall_side_special", - "uvlock": true - }, - "when": { - "north": "low" - } - }, - { - "apply": { - "model": "reframed:wall_side_special", - "uvlock": true, - "y": 90 - }, - "when": { - "east": "low" - } - }, - { - "apply": { - "model": "reframed:wall_side_special", - "uvlock": true, - "y": 180 - }, - "when": { - "south": "low" - } - }, - { - "apply": { - "model": "reframed:wall_side_special", - "uvlock": true, - "y": 270 - }, - "when": { - "west": "low" - } - }, - { - "apply": { - "model": "reframed:wall_side_tall_special", - "uvlock": true - }, - "when": { - "north": "tall" - } - }, - { - "apply": { - "model": "reframed:wall_side_tall_special", - "uvlock": true, - "y": 90 - }, - "when": { - "east": "tall" - } - }, - { - "apply": { - "model": "reframed:wall_side_tall_special", - "uvlock": true, - "y": 180 - }, - "when": { - "south": "tall" - } - }, - { - "apply": { - "model": "reframed:wall_side_tall_special", - "uvlock": true, - "y": 270 - }, - "when": { - "west": "tall" - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/lang/en_us.json b/src/main/resources/assets/reframed/lang/en_us.json deleted file mode 100644 index 1e1683b..0000000 --- a/src/main/resources/assets/reframed/lang/en_us.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "itemGroup.reframed.tab": "Frames", - - "block.reframed.button": "Button Frame", - "block.reframed.candle": "Candle Frame", - "block.reframed.carpet": "Carpet Frame", - "block.reframed.cube": "Cube Frame", - "block.reframed.door": "Door Frame", - "block.reframed.fence": "Fence Frame", - "block.reframed.fence_gate": "Fence Gate Frame", - "block.reframed.iron_door": "Iron Door Frame", - "block.reframed.iron_trapdoor": "Iron Trapdoor Frame", - "block.reframed.lever": "Lever Frame", - "block.reframed.pane": "Pane Frame", - "block.reframed.post": "Post Frame", - "block.reframed.pressure_plate": "Pressure Plate Frame", - "block.reframed.slab": "Slab Frame", - "block.reframed.stairs": "Stairs Frame", - "block.reframed.trapdoor": "Trapdoor Frame", - "block.reframed.wall": "Wall Frame" - -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/fence_post_inventory.json b/src/main/resources/assets/reframed/models/block/fence_post_inventory.json deleted file mode 100644 index dd6f212..0000000 --- a/src/main/resources/assets/reframed/models/block/fence_post_inventory.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "parent": "minecraft:block/block", - "textures": { - "particle": "#texture" - }, - "elements": [ - { - "from": [6, 0, 6], - "to": [10, 16, 10], - "faces": { - "down": { - "uv": [6, 6, 10, 10], - "texture": "#texture", - "cullface": "down" - }, - "up": { - "uv": [6, 6, 10, 10], - "texture": "#texture", - "cullface": "up" - }, - "north": { - "uv": [6, 0, 10, 16], - "texture": "#texture" - }, - "south": { - "uv": [6, 0, 10, 16], - "texture": "#texture" - }, - "west": { - "uv": [6, 0, 10, 16], - "texture": "#texture" - }, - "east": { - "uv": [6, 0, 10, 16], - "texture": "#texture" - } - }, - "__comment": "Center post" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/fence_side.json b/src/main/resources/assets/reframed/models/block/fence_side.json deleted file mode 100644 index b17cb3c..0000000 --- a/src/main/resources/assets/reframed/models/block/fence_side.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "elements": [ - { - "from": [7, 12, 0], - "to": [9, 15, 9], - "faces": { - "down": { - "uv": [7, 0, 9, 9], - "texture": "#down" - }, - "up": { - "uv": [7, 0, 9, 9], - "texture": "#up" - }, - "north": { - "uv": [7, 1, 9, 4], - "texture": "#north", - "cullface": "north" - }, - "west": { - "uv": [0, 1, 9, 4], - "texture": "#west" - }, - "east": { - "uv": [0, 1, 9, 4], - "texture": "#east" - } - }, - "__comment": "top bar" - }, - { - "from": [7, 6, 0], - "to": [9, 9, 9], - "faces": { - "down": { - "uv": [7, 0, 9, 9], - "texture": "#down" - }, - "up": { - "uv": [7, 0, 9, 9], - "texture": "#up" - }, - "north": { - "uv": [7, 7, 9, 10], - "texture": "#north", - "cullface": "north" - }, - "west": { - "uv": [0, 7, 9, 10], - "texture": "#west" - }, - "east": { - "uv": [0, 7, 9, 10], - "texture": "#east" - } - }, - "__comment": "lower bar" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/glass_pane_side.json b/src/main/resources/assets/reframed/models/block/glass_pane_side.json deleted file mode 100644 index ada50c1..0000000 --- a/src/main/resources/assets/reframed/models/block/glass_pane_side.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "from": [7, 0, 0], - "to": [9, 16, 7], - "faces": { - "down": { - "uv": [7, 0, 9, 7], - "texture": "#down" - }, - "up": { - "uv": [7, 0, 9, 7], - "texture": "#up" - }, - "north": { - "uv": [7, 0, 9, 16], - "texture": "#north", - "cullface": "north" - }, - "west": { - "uv": [16, 0, 9, 16], - "texture": "#west" - }, - "east": { - "uv": [9, 0, 16, 16], - "texture": "#east" - } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/glass_pane_side_alt.json b/src/main/resources/assets/reframed/models/block/glass_pane_side_alt.json deleted file mode 100644 index 47efbab..0000000 --- a/src/main/resources/assets/reframed/models/block/glass_pane_side_alt.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "ambientocclusion": false, - "elements": [ - { - "from": [7, 0, 9], - "to": [9, 16, 16], - "faces": { - "down": { - "uv": [7, 0, 9, 7], - "texture": "#down" - }, - "up": { - "uv": [7, 0, 9, 7], - "texture": "#up" - }, - "south": { - "uv": [7, 0, 9, 16], - "texture": "#south", - "cullface": "south" - }, - "west": { - "uv": [7, 0, 0, 16], - "texture": "#west" - }, - "east": { - "uv": [0, 0, 7, 16], - "texture": "#east" - } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/lever.json b/src/main/resources/assets/reframed/models/block/lever.json deleted file mode 100644 index 15b6eb5..0000000 --- a/src/main/resources/assets/reframed/models/block/lever.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "parent": "block/block", - "ambientocclusion": false, - "textures": { - "lever": "block/lever" - }, - "elements": [ - { - "from": [5, -0.02, 4], - "to": [11, 2.98, 12], - "faces": { - "down": { - "uv": [5, 4, 11, 12], - "texture": "#down", - "cullface": "down" - }, - "up": { - "uv": [5, 4, 11, 12], - "texture": "#up" - }, - "north": { - "uv": [5, 0, 11, 3], - "texture": "#north" - }, - "south": { - "uv": [5, 0, 11, 3], - "texture": "#south" - }, - "west": { - "uv": [4, 0, 12, 3], - "texture": "#west" - }, - "east": { - "uv": [4, 0, 12, 3], - "texture": "#east" - } - } - }, - { - "from": [7, 1, 7], - "to": [9, 11, 9], - "rotation": { - "origin": [8, 1, 8], - "axis": "x", - "angle": -45 - }, - "faces": { - "up": { - "uv": [7, 6, 9, 8], - "texture": "#lever" - }, - "north": { - "uv": [7, 6, 9, 16], - "texture": "#lever" - }, - "south": { - "uv": [7, 6, 9, 16], - "texture": "#lever" - }, - "west": { - "uv": [7, 6, 9, 16], - "texture": "#lever" - }, - "east": { - "uv": [7, 6, 9, 16], - "texture": "#lever" - } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/lever_on.json b/src/main/resources/assets/reframed/models/block/lever_on.json deleted file mode 100644 index 25b5276..0000000 --- a/src/main/resources/assets/reframed/models/block/lever_on.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "parent": "block/block", - "ambientocclusion": false, - "textures": { - "lever": "block/lever" - }, - "elements": [ - { - "from": [5, -0.02, 4], - "to": [11, 2.98, 12], - "faces": { - "down": { - "uv": [5, 4, 11, 12], - "texture": "#down", - "cullface": "down" - }, - "up": { - "uv": [5, 4, 11, 12], - "texture": "#up" - }, - "north": { - "uv": [5, 0, 11, 3], - "texture": "#north" - }, - "south": { - "uv": [5, 0, 11, 3], - "texture": "#south" - }, - "west": { - "uv": [4, 0, 12, 3], - "texture": "#west" - }, - "east": { - "uv": [4, 0, 12, 3], - "texture": "#east" - } - } - }, - { - "from": [7, 1, 7], - "to": [9, 11, 9], - "rotation": { - "origin": [8, 1, 8], - "axis": "x", - "angle": 45 - }, - "faces": { - "up": { - "uv": [7, 6, 9, 8], - "texture": "#lever" - }, - "north": { - "uv": [7, 6, 9, 16], - "texture": "#lever" - }, - "south": { - "uv": [7, 6, 9, 16], - "texture": "#lever" - }, - "west": { - "uv": [7, 6, 9, 16], - "texture": "#lever" - }, - "east": { - "uv": [7, 6, 9, 16], - "texture": "#lever" - } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/step.json b/src/main/resources/assets/reframed/models/block/step.json new file mode 100644 index 0000000..8b4bdca --- /dev/null +++ b/src/main/resources/assets/reframed/models/block/step.json @@ -0,0 +1,35 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [8, 0, 0], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [0, 8, 8, 16], "texture": "#side", "cullface": "north"}, + "east": {"uv": [0, 8, 16, 16], "texture": "#side", "cullface": "east"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#side", "cullface": "south"}, + "west": {"uv": [0, 8, 16, 16], "texture": "#side"}, + "up": {"uv": [8, 0, 16, 16], "texture": "#top"}, + "down": {"uv": [8, 0, 16, 16], "texture": "#bottom", "cullface": "down"} + } + } + ], + "display": { + "thirdperson_lefthand": { + "rotation": [75, -135, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [30, 135, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "rotation": [0, -90, 0] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/step_complement_slab.json b/src/main/resources/assets/reframed/models/block/step_complement_slab.json new file mode 100644 index 0000000..807f6ea --- /dev/null +++ b/src/main/resources/assets/reframed/models/block/step_complement_slab.json @@ -0,0 +1,35 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [8, 8, 16], + "faces": { + "north": {"uv": [8, 8, 16, 16], "texture": "#side", "cullface": "north"}, + "east": {"uv": [0, 8, 16, 16], "texture": "#side", "cullface": "east"}, + "south": {"uv": [0, 8, 8, 16], "texture": "#side", "cullface": "south"}, + "west": {"uv": [0, 8, 16, 16], "texture": "#side", "cullface": "west"}, + "up": {"uv": [0, 0, 8, 16], "texture": "#top"}, + "down": {"uv": [0, 0, 8, 16], "texture": "#bottom", "cullface": "down"} + } + } + ], + "display": { + "thirdperson_lefthand": { + "rotation": [75, -135, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [30, 135, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "rotation": [0, -90, 0] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/step_side.json b/src/main/resources/assets/reframed/models/block/step_side.json new file mode 100644 index 0000000..023d170 --- /dev/null +++ b/src/main/resources/assets/reframed/models/block/step_side.json @@ -0,0 +1,35 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [8, 0, 0], + "to": [16, 16, 8], + "faces": { + "north": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "north"}, + "east": {"uv": [8, 0, 16, 16], "texture": "#side", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 16], "texture": "#side"}, + "west": {"uv": [0, 0, 8, 16], "texture": "#side"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#top", "cullface": "up"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#bottom", "cullface": "down"} + } + } + ], + "display": { + "thirdperson_lefthand": { + "rotation": [75, -135, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [30, 135, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "rotation": [0, -90, 0] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/step_side_complement_slab.json b/src/main/resources/assets/reframed/models/block/step_side_complement_slab.json new file mode 100644 index 0000000..736d91a --- /dev/null +++ b/src/main/resources/assets/reframed/models/block/step_side_complement_slab.json @@ -0,0 +1,35 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [8, 0, 8], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 8, 16], "texture": "#side"}, + "east": {"uv": [0, 0, 8, 16], "texture": "#side", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 16], "texture": "#side", "cullface": "south"}, + "west": {"uv": [8, 0, 16, 16], "texture": "#side"}, + "up": {"uv": [8, 8, 16, 16], "texture": "#top", "cullface": "up"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#bottom", "cullface": "down"} + } + } + ], + "display": { + "thirdperson_lefthand": { + "rotation": [75, -135, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [30, 135, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "rotation": [0, -90, 0] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/trapdoor_open.json b/src/main/resources/assets/reframed/models/block/trapdoor_open.json deleted file mode 100644 index 11f8b91..0000000 --- a/src/main/resources/assets/reframed/models/block/trapdoor_open.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "parent": "block/block", - "elements": [ - { - "from": [0, 0, 13], - "to": [16, 16, 16], - "faces": { - "down": { - "uv": [0, 16, 16, 13], - "texture": "#north", - "cullface": "down", - "rotation": 180 - }, - "up": { - "uv": [0, 16, 16, 13], - "texture": "#south", - "cullface": "up" - }, - "north": { - "uv": [0, 0, 16, 16], - "texture": "#down" - }, - "south": { - "uv": [0, 0, 16, 16], - "texture": "#up", - "cullface": "south" - }, - "west": { - "uv": [0, 16, 16, 13], - "texture": "#west", - "cullface": "west", - "rotation": 270 - }, - "east": { - "uv": [0, 16, 16, 13], - "texture": "#east", - "cullface": "east", - "rotation": 90 - } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/wall_side.json b/src/main/resources/assets/reframed/models/block/wall_side.json deleted file mode 100644 index e29d419..0000000 --- a/src/main/resources/assets/reframed/models/block/wall_side.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "elements": [ - { - "from": [5, 0, 0], - "to": [11, 14, 8], - "faces": { - "down": { - "texture": "#down", - "cullface": "down" - }, - "up": { - "texture": "#up" - }, - "north": { - "texture": "#north", - "cullface": "north" - }, - "west": { - "texture": "#west" - }, - "east": { - "texture": "#east" - } - }, - "__comment": "wall" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/block/wall_side_tall.json b/src/main/resources/assets/reframed/models/block/wall_side_tall.json deleted file mode 100644 index 7f80864..0000000 --- a/src/main/resources/assets/reframed/models/block/wall_side_tall.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "elements": [ - { - "from": [5, 0, 0], - "to": [11, 16, 8], - "faces": { - "down": { - "texture": "#down", - "cullface": "down" - }, - "up": { - "texture": "#up", - "cullface": "up" - }, - "north": { - "texture": "#north", - "cullface": "north" - }, - "west": { - "texture": "#west" - }, - "east": { - "texture": "#east" - } - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/item/candle.json b/src/main/resources/assets/reframed/models/item/candle.json deleted file mode 100644 index 7c743ac..0000000 --- a/src/main/resources/assets/reframed/models/item/candle.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "reframed:item/candle" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/item/door.json b/src/main/resources/assets/reframed/models/item/door.json deleted file mode 100644 index a8db42c..0000000 --- a/src/main/resources/assets/reframed/models/item/door.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "reframed:item/door" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/item/iron_door.json b/src/main/resources/assets/reframed/models/item/iron_door.json deleted file mode 100644 index a8db42c..0000000 --- a/src/main/resources/assets/reframed/models/item/iron_door.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "reframed:item/door" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/item/lever.json b/src/main/resources/assets/reframed/models/item/lever.json deleted file mode 100644 index 38b386f..0000000 --- a/src/main/resources/assets/reframed/models/item/lever.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "reframed:item/lever" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/models/item/pane.json b/src/main/resources/assets/reframed/models/item/pane.json deleted file mode 100644 index 63cd040..0000000 --- a/src/main/resources/assets/reframed/models/item/pane.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "reframed:block/framed_block" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/reframed/textures/item/candle.png b/src/main/resources/assets/reframed/textures/item/candle.png deleted file mode 100644 index c76d54c1d7909c2307c7d33b86dcf589ae1d5f73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmV-60?GY}P)M9@YpVgz5!-Q|)9xp>@NkYFp=SO^xP zjjzK0KwH69K@b!{#LnJVBXZ7~K!U_M_U7Za`x|CwAuyFUEVpS4tb*qxClk^6g~e#_ zg&+}B3~GjJPtQ)I_%}Z9Xi)h!u4?^%u5PrYP1k^i7U2=Yc06I}hN(5rR=g$LY2>uD z@S$+bkp_jYl&+WgS#h?^?~0vNavTDxW;9#FdJP*n#}e)r?y>SkqtcJMNyseB%}VZ) z)s0J%NfJcSDY8NykGSN5%&fj|;MX_9s(1|f+mvv`ktHYIn5admYD&(CZpxRZq~`v2 zo^ED%s9ZgifaWLPf9r+d4t#I>{@0Q3e;-5RBU}`!{#BXN=!fXrRjua$!W(dQS=IDi zINyZGgRME*uhb|jkjcR7DYP#@#|^YDm1kAi=j0wz>+(d`u(uC=az4EL1N@h02%{h$ z9{>OV32;bRa{vG?BLDy{BLR4&KXw2B0B=b|K~y-)V_+Bsv;~R^CjSYkVZtZb70k=f zli~iKYy&JJH5uH4Iq|xH1)t=M?$Zo{fp`cJkCR?KM9@YpVgz5!-Q|)9xp>@NkYFp=SO^xP zjjzK0KwH69K@b!{#LnJVBXZ7~K!U_M_U7Za`x|CwAuyFUEVpS4tb*qxClk^6g~e#_ zg&+}B3~GjJPtQ)I_%}Z9Xi)h!u4?^%u5PrYP1k^i7U2=Yc06I}hN(5rR=g$LY2>uD z@S$+bkp_jYl&+WgS#h?^?~0vNavTDxW;9#FdJP*n#}e)r?y>SkqtcJMNyseB%}VZ) z)s0J%NfJcSDY8NykGSN5%&fj|;MX_9s(1|f+mvv`ktHYIn5admYD&(CZpxRZq~`v2 zo^ED%s9ZgifaWLPf9r+d4t#I>{@0Q3e;-5RBU}`!{#BXN=!fXrRjua$!W(dQS=IDi zINyZGgRME*uhb|jkjcR7DYP#@#|^YDm1kAi=j0wz>+(d`u(uC=az4EL1N@h02%{h$ z9{>OV32;bRa{vG?BLDy{BLR4&KXw2B0g_2XK~y-)V_={VFd}m*ptihhN!HG{fX! zfCZTYlbqUhjbX;_TZ|c()c%8L1_t;4ckbS2$Sz}G`16VYp{Aj-+`6EJ(!bW@1>^<_T?)W|9pJL5Zb#RPJ=ACvEw7|KFB!zd#2MH%zJkL**L4GS7ua~Rfn9L-*&Ddcps)aG2GK{h|AGfJ zRu`-;cKi==J}ewyeg_!uK0e3V?2t$$uDA9nz z0~Rh&vHu{$LCG3tLV_jN;N(AG_Lo~C4DKFZf&OLyim8Fcq@`tXy8xEfc{w3o1bOAf j+dtq`2ol4V7bpe*1boc>m23$U00000NkvXXu0mjfUO9?u diff --git a/src/main/resources/assets/reframed/textures/item/lever.png b/src/main/resources/assets/reframed/textures/item/lever.png deleted file mode 100644 index a9a49b488ac4ea1682484e3267b6ecbd2987f364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 535 zcmV+y0_gpTP)M9@YpVgz5!-Q|)9xp>@NkYFp=SO^xP zjjzK0KwH69K@b!{#LnJVBXZ7~K!U_M_U7Za`x|CwAuyFUEVpS4tb*qxClk^6g~e#_ zg&+}B3~GjJPtQ)I_%}Z9Xi)h!u4?^%u5PrYP1k^i7U2=Yc06I}hN(5rR=g$LY2>uD z@S$+bkp_jYl&+WgS#h?^?~0vNavTDxW;9#FdJP*n#}e)r?y>SkqtcJMNyseB%}VZ) z)s0J%NfJcSDY8NykGSN5%&fj|;MX_9s(1|f+mvv`ktHYIn5admYD&(CZpxRZq~`v2 zo^ED%s9ZgifaWLPf9r+d4t#I>{@0Q3e;-5RBU}`!{#BXN=!fXrRjua$!W(dQS=IDi zINyZGgRME*uhb|jkjcR7DYP#@#|^YDm1kAi=j0wz>+(d`u(uC=az4EL1N@h02%{h$ z9{>OV32;bRa{vG?BLDy{BLR4&KXw2B08mLpK~y-)V_+BsgB+|bcKlx*Zu%de8YX;_ zeEj^Bx!~iin*Wc_WRdTJPoLf~e0cwifouba0R#