From fe440b0c1c2274c02524d38d8982a7a749a33201 Mon Sep 17 00:00:00 2001 From: Zepalesque <60141811+Zepalesque@users.noreply.github.com> Date: Sat, 25 May 2024 10:32:39 -0400 Subject: [PATCH] feat: Wood set completed? I think? --- gradle.properties | 2 +- src/main/java/net/zepalesque/redux/Redux.java | 33 ++- .../block/natural/ReduxDoubleDropsWall.java | 50 ++++ .../redux/block/natural/ReduxNaturalWall.java | 33 +++ .../redux/blockset/AetherWoodSet.java | 219 ++++++++++++++++++ ...aseAetherWoodSet.java => BaseWoodSet.java} | 159 ++++++++++--- .../redux/blockset/ReduxWoodSets.java | 18 ++ .../redux/data/gen/ReduxBlockStateGen.java | 4 +- .../redux/data/gen/ReduxDataMapGen.java | 22 ++ .../redux/data/gen/ReduxItemModelGen.java | 2 + .../redux/data/gen/ReduxLanguageGen.java | 5 + .../redux/data/gen/ReduxLootGen.java | 26 +++ .../redux/data/gen/ReduxRecipeGen.java | 3 +- .../redux/data/gen/loot/ReduxBlockLoot.java | 29 +++ .../data/gen/tags/ReduxBlockTagsGen.java | 23 ++ .../redux/data/gen/tags/ReduxItemTagsGen.java | 24 ++ .../data/prov/ReduxBlockStateProvider.java | 12 + .../redux/data/prov/ReduxDataMapProvider.java | 14 ++ .../redux/data/prov/ReduxRecipeProvider.java | 4 + .../prov/loot/ReduxBlockLootProvider.java | 75 ++++++ .../prov/tags/ReduxBlockTagsProvider.java | 23 ++ .../data/prov/tags/ReduxItemTagsProvider.java | 31 +++ .../net/zepalesque/redux/loot/ReduxLoot.java | 27 +++ .../redux/mixin/ReduxMixinPlugin.java | 52 +++++ .../common/accessor/WallBlockAccessor.java | 27 +++ src/main/resources/aether_redux.mixins.json | 11 + 26 files changed, 883 insertions(+), 45 deletions(-) create mode 100644 src/main/java/net/zepalesque/redux/block/natural/ReduxDoubleDropsWall.java create mode 100644 src/main/java/net/zepalesque/redux/block/natural/ReduxNaturalWall.java create mode 100644 src/main/java/net/zepalesque/redux/blockset/AetherWoodSet.java rename src/main/java/net/zepalesque/redux/blockset/{BaseAetherWoodSet.java => BaseWoodSet.java} (83%) create mode 100644 src/main/java/net/zepalesque/redux/blockset/ReduxWoodSets.java create mode 100644 src/main/java/net/zepalesque/redux/data/gen/ReduxDataMapGen.java create mode 100644 src/main/java/net/zepalesque/redux/data/gen/ReduxLootGen.java create mode 100644 src/main/java/net/zepalesque/redux/data/gen/loot/ReduxBlockLoot.java create mode 100644 src/main/java/net/zepalesque/redux/data/gen/tags/ReduxBlockTagsGen.java create mode 100644 src/main/java/net/zepalesque/redux/data/gen/tags/ReduxItemTagsGen.java create mode 100644 src/main/java/net/zepalesque/redux/data/prov/ReduxDataMapProvider.java create mode 100644 src/main/java/net/zepalesque/redux/data/prov/loot/ReduxBlockLootProvider.java create mode 100644 src/main/java/net/zepalesque/redux/data/prov/tags/ReduxBlockTagsProvider.java create mode 100644 src/main/java/net/zepalesque/redux/data/prov/tags/ReduxItemTagsProvider.java create mode 100644 src/main/java/net/zepalesque/redux/loot/ReduxLoot.java create mode 100644 src/main/java/net/zepalesque/redux/mixin/ReduxMixinPlugin.java create mode 100644 src/main/java/net/zepalesque/redux/mixin/mixins/common/accessor/WallBlockAccessor.java create mode 100644 src/main/resources/aether_redux.mixins.json diff --git a/gradle.properties b/gradle.properties index 0ca6c579e..9b54d0dc0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ aether_version=1.20.4-1.4.1-neoforge nitrogen_version=1.20.4-1.1.4-neoforge cumulus_version=1.20.4-1.0.1-neoforge curios_version=7.3.4 -zenith_version=1.20.4-1.0.11-neoforge +zenith_version=1.20.4-1.0.12-neoforge aeroblender_version=5271794 terrablender_version=1.20.4-3.3.0.12 terrablender_version_minimum=1.20.4-3.3.0.0 diff --git a/src/main/java/net/zepalesque/redux/Redux.java b/src/main/java/net/zepalesque/redux/Redux.java index 59c3de4d7..c3ebe6758 100644 --- a/src/main/java/net/zepalesque/redux/Redux.java +++ b/src/main/java/net/zepalesque/redux/Redux.java @@ -1,14 +1,16 @@ package net.zepalesque.redux; -import com.aetherteam.aether.data.generators.AetherBlockStateData; -import com.aetherteam.aether.data.generators.AetherItemModelData; -import com.aetherteam.aether.data.generators.AetherLanguageData; -import com.aetherteam.aether.data.generators.AetherRecipeData; import com.mojang.logging.LogUtils; +import net.minecraft.DetectedVersion; import net.minecraft.core.HolderLookup; import net.minecraft.data.DataGenerator; import net.minecraft.data.PackOutput; +import net.minecraft.data.metadata.PackMetadataGenerator; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.metadata.pack.PackMetadataSection; +import net.minecraft.util.InclusiveRange; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModLoadingContext; import net.neoforged.fml.common.Mod; @@ -17,18 +19,26 @@ import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.neoforged.neoforge.data.event.GatherDataEvent; import net.zepalesque.redux.block.ReduxBlocks; +import net.zepalesque.redux.blockset.ReduxWoodSets; import net.zepalesque.redux.config.ReduxConfig; import net.zepalesque.redux.data.gen.ReduxBlockStateGen; import net.zepalesque.redux.data.gen.ReduxItemModelGen; import net.zepalesque.redux.data.gen.ReduxLanguageGen; +import net.zepalesque.redux.data.gen.ReduxLootGen; import net.zepalesque.redux.data.gen.ReduxRecipeGen; +import net.zepalesque.redux.data.gen.tags.ReduxBlockTagsGen; +import net.zepalesque.redux.data.gen.tags.ReduxItemTagsGen; import net.zepalesque.redux.entity.ReduxEntities; import net.zepalesque.redux.item.ReduxItems; import net.zepalesque.redux.tile.ReduxTiles; +import net.zepalesque.zenith.api.blockset.AbstractWoodSet; import net.zepalesque.zenith.api.condition.ConfigCondition; import net.zepalesque.zenith.api.condition.config.ConfigSerializer; import org.slf4j.Logger; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; import java.util.concurrent.CompletableFuture; @Mod(Redux.MODID) @@ -36,10 +46,14 @@ public class Redux { public static final String MODID = "aether_redux"; private static final Logger LOGGER = LogUtils.getLogger(); + public static final Collection WOOD_SETS = new ArrayList<>(); + public Redux(IEventBus bus) { bus.addListener(this::commonSetup); bus.addListener(this::dataSetup); + ReduxWoodSets.init(); + ReduxBlocks.BLOCKS.register(bus); ReduxItems.ITEMS.register(bus); ReduxEntities.ENTITIES.register(bus); @@ -66,7 +80,18 @@ private void dataSetup(GatherDataEvent event) { // Server Data generator.addProvider(event.includeServer(), new ReduxRecipeGen(packOutput, lookupProvider)); + generator.addProvider(event.includeServer(), ReduxLootGen.create(packOutput)); + + // Tags + ReduxBlockTagsGen blockTags = new ReduxBlockTagsGen(packOutput, lookupProvider, fileHelper); + generator.addProvider(event.includeServer(), blockTags); + generator.addProvider(event.includeServer(), new ReduxItemTagsGen(packOutput, lookupProvider, blockTags.contentsGetter(), fileHelper)); + // pack.mcmeta + generator.addProvider(true, new PackMetadataGenerator(packOutput).add(PackMetadataSection.TYPE, new PackMetadataSection( + Component.translatable("pack.aether_redux.mod.description"), + DetectedVersion.BUILT_IN.getPackVersion(PackType.SERVER_DATA), + Optional.of(new InclusiveRange<>(0, Integer.MAX_VALUE))))); } public static ResourceLocation loc(String path) { diff --git a/src/main/java/net/zepalesque/redux/block/natural/ReduxDoubleDropsWall.java b/src/main/java/net/zepalesque/redux/block/natural/ReduxDoubleDropsWall.java new file mode 100644 index 000000000..189ed907a --- /dev/null +++ b/src/main/java/net/zepalesque/redux/block/natural/ReduxDoubleDropsWall.java @@ -0,0 +1,50 @@ +package net.zepalesque.redux.block.natural; + +import com.aetherteam.aether.block.AetherBlockStateProperties; +import com.google.common.collect.ImmutableMap; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WallBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.zepalesque.redux.mixin.mixins.common.accessor.WallBlockAccessor; + +import java.util.Map; + +// TODO: Replace with Nitrogen version +public class ReduxDoubleDropsWall extends WallBlock { + public ReduxDoubleDropsWall(Properties properties) { + super(properties); + this.registerDefaultState(this.defaultBlockState().setValue(AetherBlockStateProperties.DOUBLE_DROPS, false)); + this.fixShapeMaps(); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(AetherBlockStateProperties.DOUBLE_DROPS); + } + + /** + * Based on the Framed Blocks mod's shape map fix for implementing a wall with additional block properties. + */ + protected void fixShapeMaps() { + WallBlockAccessor wallBlockAccessor = (WallBlockAccessor) this; + Map shapeByIndex = wallBlockAccessor.redux$getShapeByIndex(); + shapeByIndex = fixShapeMap(shapeByIndex).build(); + wallBlockAccessor.redux$setShapeByIndex(shapeByIndex); + + Map collisionShapeByIndex = wallBlockAccessor.redux$getCollisionShapeByIndex(); + collisionShapeByIndex = fixShapeMap(collisionShapeByIndex).build(); + wallBlockAccessor.redux$setCollisionShapeByIndex(collisionShapeByIndex); + } + + protected ImmutableMap.Builder fixShapeMap(Map map) { + ImmutableMap.Builder builder = ImmutableMap.builder(); + builder.putAll(map); + for (BlockState state : map.keySet()) { + builder.put(state.cycle(AetherBlockStateProperties.DOUBLE_DROPS), map.get(state)); + } + return builder; + } +} \ No newline at end of file diff --git a/src/main/java/net/zepalesque/redux/block/natural/ReduxNaturalWall.java b/src/main/java/net/zepalesque/redux/block/natural/ReduxNaturalWall.java new file mode 100644 index 000000000..c12a0e82c --- /dev/null +++ b/src/main/java/net/zepalesque/redux/block/natural/ReduxNaturalWall.java @@ -0,0 +1,33 @@ +package net.zepalesque.redux.block.natural; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.zepalesque.redux.block.state.ReduxStates; + +import java.util.Map; + +public class ReduxNaturalWall extends ReduxDoubleDropsWall { + public ReduxNaturalWall(Properties properties) { + super(properties); + this.registerDefaultState(this.defaultBlockState().setValue(ReduxStates.NATURAL_GEN, false)); + this.fixShapeMaps(); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ReduxStates.NATURAL_GEN); + } + + @Override + protected ImmutableMap.Builder fixShapeMap(Map map) { + ImmutableMap.Builder builder = super.fixShapeMap(map); + for (BlockState state : map.keySet()) { + builder.put(state.cycle(ReduxStates.NATURAL_GEN), map.get(state)); + } + return builder; + } +} diff --git a/src/main/java/net/zepalesque/redux/blockset/AetherWoodSet.java b/src/main/java/net/zepalesque/redux/blockset/AetherWoodSet.java new file mode 100644 index 000000000..c0d2e211e --- /dev/null +++ b/src/main/java/net/zepalesque/redux/blockset/AetherWoodSet.java @@ -0,0 +1,219 @@ +package net.zepalesque.redux.blockset; + +import com.aetherteam.aether.mixin.mixins.common.accessor.FireBlockAccessor; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; +import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; +import net.minecraft.world.level.material.MapColor; +import net.neoforged.neoforge.client.model.generators.ModelBuilder; +import net.neoforged.neoforge.client.model.generators.ModelFile; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.zepalesque.redux.Redux; +import net.zepalesque.redux.block.ReduxBlocks; +import net.zepalesque.redux.block.natural.ReduxNaturalWall; +import net.zepalesque.redux.data.prov.ReduxBlockStateProvider; +import net.zepalesque.redux.data.prov.ReduxItemModelProvider; +import net.zepalesque.redux.data.prov.ReduxLanguageProvider; +import net.zepalesque.redux.data.prov.ReduxRecipeProvider; +import net.zepalesque.redux.data.prov.loot.ReduxBlockLootProvider; +import net.zepalesque.redux.data.prov.tags.ReduxBlockTagsProvider; +import net.zepalesque.redux.item.ReduxItems; +import net.zepalesque.zenith.util.DatagenUtil; + +public class AetherWoodSet extends BaseWoodSet { + + protected final DeferredBlock log_wall; + protected final DeferredBlock wood_wall; + protected final DeferredBlock stripped_log_wall; + protected final DeferredBlock stripped_wood_wall; + + public AetherWoodSet(String id, MapColor woodColor, MapColor barkColor, SoundType sound) { + super(id, woodColor, barkColor, sound); + DeferredRegister.Blocks blocks = ReduxBlocks.BLOCKS; + DeferredRegister.Items items = ReduxItems.ITEMS; + + this.log_wall = this.logWall(blocks, items, id, woodColor, sound); + this.wood_wall = this.woodWall(blocks, items, id, woodColor, sound); + this.stripped_log_wall = this.strippedLogWall(blocks, items, id, woodColor, sound); + this.stripped_wood_wall = this.strippedWoodWall(blocks, items, id, woodColor, sound); + } + + protected DeferredBlock logWall(DeferredRegister.Blocks registry, DeferredRegister.Items items, String id, MapColor color, SoundType soundType) { + var block = registry.register(id + this.logSuffix(LangType.ID) + "_wall", () -> new ReduxNaturalWall(Properties.of() + .mapColor(MapColor.WOOD) + .instrument(NoteBlockInstrument.BASS) + .ignitedByLava() + .strength(2.0F) + .sound(SoundType.WOOD) + )); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); + return block; + } + + public DeferredBlock logWall() { + return this.log_wall; + } + + protected DeferredBlock woodWall(DeferredRegister.Blocks registry, DeferredRegister.Items items, String id, MapColor color, SoundType soundType) { + var block = registry.register(id + this.woodSuffix(LangType.ID) + "_wall", () -> new ReduxNaturalWall(Properties.of() + .mapColor(MapColor.WOOD) + .instrument(NoteBlockInstrument.BASS) + .ignitedByLava() + .strength(2.0F) + .sound(SoundType.WOOD) + )); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); + return block; + } + + public DeferredBlock woodWall() { + return this.wood_wall; + } + + protected DeferredBlock strippedLogWall(DeferredRegister.Blocks registry, DeferredRegister.Items items, String id, MapColor color, SoundType soundType) { + var block = registry.register(id + this.logSuffix(LangType.ID) + "_wall", () -> new ReduxNaturalWall(Properties.of() + .mapColor(MapColor.WOOD) + .instrument(NoteBlockInstrument.BASS) + .ignitedByLava() + .strength(2.0F) + .sound(SoundType.WOOD) + )); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); + return block; + } + + public DeferredBlock strippedLogWall() { + return this.stripped_log_wall; + } + + protected DeferredBlock strippedWoodWall(DeferredRegister.Blocks registry, DeferredRegister.Items items, String id, MapColor color, SoundType soundType) { + var block = registry.register(id + this.logSuffix(LangType.ID) + "_wall", () -> new ReduxNaturalWall(Properties.of() + .mapColor(MapColor.WOOD) + .instrument(NoteBlockInstrument.BASS) + .ignitedByLava() + .strength(2.0F) + .sound(SoundType.WOOD) + )); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); + return block; + } + + public DeferredBlock strippedWoodWall() { + return this.stripped_wood_wall; + } + + + @Override + protected void blockData(ReduxBlockStateProvider data) { + super.blockData(data); + ModelFile postBig = data.makeWallPostModel(4, 16, "wooden_post_big"); + ModelFile postShort = data.makeWallPostModel(3, 14, "wooden_post_short"); + ModelFile postTall = data.makeWallPostModel(3, 16, "wooden_post_tall"); + ModelFile side = data.makeWallSideModel(5, 14, "wooden_side", ModelBuilder.FaceRotation.CLOCKWISE_90, 0, 5); + ModelFile sideAlt = data.makeWallSideModel(5, 14, "wooden_side_alt", ModelBuilder.FaceRotation.COUNTERCLOCKWISE_90, 11, 16); + ModelFile sideTall = data.makeWallSideModel(5, 16, "wooden_side_tall", ModelBuilder.FaceRotation.CLOCKWISE_90, 0, 5); + ModelFile sideTallAlt = data.makeWallSideModel(5, 16, "wooden_side_tall_alt", ModelBuilder.FaceRotation.COUNTERCLOCKWISE_90, 11, 16); + ModelFile sideShort = data.makeWallSideModel(4, 14, "wooden_side_short", ModelBuilder.FaceRotation.CLOCKWISE_90, 0, 4); + ModelFile sideAltShort = data.makeWallSideModel(4, 14, "wooden_side_alt_short", ModelBuilder.FaceRotation.COUNTERCLOCKWISE_90, 12, 16); + ModelFile sideTallShort = data.makeWallSideModel(4, 16, "wooden_side_tall_short", ModelBuilder.FaceRotation.CLOCKWISE_90, 0, 4); + ModelFile sideTallAltShort = data.makeWallSideModel(4, 16, "wooden_side_tall_alt_short", ModelBuilder.FaceRotation.COUNTERCLOCKWISE_90, 12, 16); + + data.logWallBlock(this.logWall().get(), this.log().get(), "natural/", + Redux.MODID, true, postBig, postShort, postTall, side, sideAlt, sideTall, sideTallAlt, sideShort, sideAltShort, sideTallShort, sideTallAltShort); + + data.logWallBlock(this.strippedLogWall().get(), this.strippedLog().get(), "natural/", + Redux.MODID, true, postBig, postShort, postTall, side, sideAlt, sideTall, sideTallAlt, sideShort, sideAltShort, sideTallShort, sideTallAltShort); + + data.logWallBlock(this.woodWall().get(), this.log().get(), "natural/", + Redux.MODID, false, postBig, postShort, postTall, side, sideAlt, sideTall, sideTallAlt, sideShort, sideAltShort, sideTallShort, sideTallAltShort); + + data.logWallBlock(this.strippedWoodWall().get(), this.strippedLog().get(), "natural/", + Redux.MODID, false, postBig, postShort, postTall, side, sideAlt, sideTall, sideTallAlt, sideShort, sideAltShort, sideTallShort, sideTallAltShort); + + } + + @Override + protected void itemData(ReduxItemModelProvider data) { + super.itemData(data); + data.itemLogWallBlock(this.logWall().get(), this.log().get(), "natural/", Redux.MODID); + data.itemLogWallBlock(this.strippedLogWall().get(), this.strippedLog().get(), "natural/", Redux.MODID); + data.itemWoodWallBlock(this.woodWall().get(), this.log().get(), "natural/", Redux.MODID); + data.itemWoodWallBlock(this.strippedWoodWall().get(), this.strippedLog().get(), "natural/", Redux.MODID); + } + + @Override + protected void langData(ReduxLanguageProvider data) { + super.langData(data); + String name = DatagenUtil.getNameLocalized(this.id); + + data.add(this.logWall()); + data.addLore(this.logWall(), "Crafted from " + name + " " + this.logSuffix(LangType.LANG_PLURAL) + ". Can be used for decorative enclosures and defences. Great for keeping nasty intruders away!"); + + data.add(this.strippedLogWall()); + data.addLore(this.strippedLogWall(), "Crafted from Stripped " + name + " " + this.logSuffix(LangType.LANG_PLURAL) + ". Can be used for decorative enclosures and defences. Great for keeping nasty intruders away!"); + + data.add(this.woodWall()); + data.addLore(this.woodWall(), "Crafted from " + name + " " + this.woodSuffix(LangType.LANG_PLURAL) + ". Can be used for decorative enclosures and defences. Great for keeping nasty intruders away!"); + + data.add(this.strippedWoodWall()); + data.addLore(this.strippedWoodWall(), "Crafted from Stripped " + name + " " + this.woodSuffix(LangType.LANG_PLURAL) + ". Can be used for decorative enclosures and defences. Great for keeping nasty intruders away!"); + } + + @Override + protected void recipeData(ReduxRecipeProvider data, RecipeOutput consumer) { + super.recipeData(data, consumer); + ReduxRecipeProvider.wall(consumer, RecipeCategory.BUILDING_BLOCKS, this.logWall().get(), this.log().get()); + ReduxRecipeProvider.wall(consumer, RecipeCategory.BUILDING_BLOCKS, this.strippedLogWall().get(), this.strippedLog().get()); + ReduxRecipeProvider.wall(consumer, RecipeCategory.BUILDING_BLOCKS, this.woodWall().get(), this.wood().get()); + ReduxRecipeProvider.wall(consumer, RecipeCategory.BUILDING_BLOCKS, this.strippedWoodWall().get(), this.strippedWood().get()); + } + + @Override + protected void blockTagData(ReduxBlockTagsProvider data) { + super.blockTagData(data); + data.tag(BlockTags.MINEABLE_WITH_AXE).add( + this.logWall().get(), + this.strippedLogWall().get(), + this.woodWall().get(), + this.strippedWoodWall().get() + ); + data.tag(BlockTags.LOGS).add( + this.logWall().get(), + this.strippedLogWall().get(), + this.woodWall().get(), + this.strippedWoodWall().get() + ); + data.tag(BlockTags.WALLS).add( + this.logWall().get(), + this.strippedLogWall().get(), + this.woodWall().get(), + this.strippedWoodWall().get() + ); + } + + @Override + protected void lootData(ReduxBlockLootProvider data) { + super.lootData(data); + data.naturalDrop(this.logWall().get(), this.log().get()); + data.naturalDrop(this.woodWall().get(), this.log().get()); + data.naturalDrop(this.strippedLogWall().get(), this.strippedLog().get()); + data.naturalDrop(this.strippedWoodWall().get(), this.strippedLog().get()); + } + + @Override + public void flammables() { + super.flammables(); + FireBlockAccessor accessor = (FireBlockAccessor) Blocks.FIRE; + accessor.callSetFlammable(this.logWall().get(), 5, 5); + accessor.callSetFlammable(this.woodWall().get(), 5, 5); + accessor.callSetFlammable(this.strippedLogWall().get(), 5, 5); + accessor.callSetFlammable(this.strippedWoodWall().get(), 5, 5); + } +} diff --git a/src/main/java/net/zepalesque/redux/blockset/BaseAetherWoodSet.java b/src/main/java/net/zepalesque/redux/blockset/BaseWoodSet.java similarity index 83% rename from src/main/java/net/zepalesque/redux/blockset/BaseAetherWoodSet.java rename to src/main/java/net/zepalesque/redux/blockset/BaseWoodSet.java index 85ec8b647..23e37ab62 100644 --- a/src/main/java/net/zepalesque/redux/blockset/BaseAetherWoodSet.java +++ b/src/main/java/net/zepalesque/redux/blockset/BaseWoodSet.java @@ -1,18 +1,19 @@ package net.zepalesque.redux.blockset; -import com.aetherteam.aether.block.AetherBlocks; +import com.aetherteam.aether.AetherTags; import com.aetherteam.aether.block.natural.AetherLogBlock; +import com.aetherteam.aether.mixin.mixins.common.accessor.FireBlockAccessor; import net.minecraft.core.Direction; import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.data.recipes.RecipeProvider; import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.data.tags.EntityTypeTagsProvider; import net.minecraft.data.tags.ItemTagsProvider; import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; -import net.minecraft.util.StringUtil; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.item.BlockItem; @@ -20,6 +21,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ButtonBlock; import net.minecraft.world.level.block.DoorBlock; import net.minecraft.world.level.block.FenceBlock; @@ -48,7 +50,6 @@ import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import net.zepalesque.redux.Redux; import net.zepalesque.redux.block.ReduxBlocks; import net.zepalesque.redux.block.natural.NaturalLog; import net.zepalesque.redux.data.ReduxTags; @@ -56,6 +57,9 @@ import net.zepalesque.redux.data.prov.ReduxItemModelProvider; import net.zepalesque.redux.data.prov.ReduxLanguageProvider; import net.zepalesque.redux.data.prov.ReduxRecipeProvider; +import net.zepalesque.redux.data.prov.loot.ReduxBlockLootProvider; +import net.zepalesque.redux.data.prov.tags.ReduxBlockTagsProvider; +import net.zepalesque.redux.data.prov.tags.ReduxItemTagsProvider; import net.zepalesque.redux.entity.ReduxEntities; import net.zepalesque.redux.item.ReduxItems; import net.zepalesque.redux.tile.ReduxTiles; @@ -70,12 +74,10 @@ import net.zepalesque.zenith.tile.ZenithHangingSignBlockEntity; import net.zepalesque.zenith.tile.ZenithSignBlockEntity; import net.zepalesque.zenith.util.DatagenUtil; -import org.apache.commons.lang3.CharUtils; -import org.codehaus.plexus.util.StringUtils; import javax.annotation.Nullable; -public class BaseAetherWoodSet extends AbstractWoodSet { +public class BaseWoodSet extends AbstractWoodSet { protected final String id; @@ -112,7 +114,7 @@ public class BaseAetherWoodSet extends AbstractWoodSet { public final TagKey logsTag; public final TagKey logsBlockTag; - public BaseAetherWoodSet(String id, MapColor woodColor, MapColor barkColor, SoundType sound) { + public BaseWoodSet(String id, MapColor woodColor, MapColor barkColor, SoundType sound) { this.id = id; @@ -163,7 +165,7 @@ protected DeferredBlock log(DeferredRegister.Blocks registry, De .sound(soundType) .ignitedByLava() )); - items.register(id + this.logSuffix(LangType.ID), () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -180,7 +182,7 @@ protected DeferredBlock strippedLog(DeferredRegister.Blocks regi .strength(2.0F) .sound(soundType) .ignitedByLava())); - items.register(id + "_stripped" + this.logSuffix(LangType.ID), () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -198,7 +200,7 @@ protected DeferredBlock wood(DeferredRegister.Blocks registry, Defer .sound(soundType) .ignitedByLava() )); - items.register(id + this.woodSuffix(LangType.ID), () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -216,7 +218,7 @@ protected DeferredBlock strippedWood(DeferredRegister.Blocks registr .sound(soundType) .ignitedByLava() )); - items.register(id + "_stripped" + this.woodSuffix(LangType.ID), () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -234,7 +236,7 @@ protected DeferredBlock planks(DeferredRegister.Blocks registry, Deferred .sound(soundType) .ignitedByLava() )); - items.register(id + "_planks", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -248,7 +250,7 @@ protected DeferredBlock stairs(DeferredRegister.Blocks registry, Def var block = registry.register(id + "_stairs", () -> new StairBlock( () -> this.planks().get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(this.planks().get()) )); - items.register(id + "_stairs", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -262,7 +264,7 @@ protected DeferredBlock slab(DeferredRegister.Blocks registry, Deferr var block = registry.register(id + "_slab", () -> new SlabBlock( BlockBehaviour.Properties.ofFullCopy(this.planks().get()).strength(2.0F, 3.0F) )); - items.register(id + "_slab", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -282,7 +284,7 @@ protected DeferredBlock fence(DeferredRegister.Blocks registry, Defe .sound(soundType) .ignitedByLava() )); - items.register(id + "_fence", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -302,7 +304,7 @@ protected DeferredBlock fenceGate(DeferredRegister.Blocks regist .strength(2.0F, 3.0F) .ignitedByLava() )); - items.register(id + "_fence_gate", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -323,7 +325,7 @@ protected DeferredBlock door(DeferredRegister.Blocks registry, Deferr .ignitedByLava() .pushReaction(PushReaction.DESTROY) )); - items.register(id + "_door", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -344,7 +346,7 @@ protected DeferredBlock trapdoor(DeferredRegister.Blocks registry .isValidSpawn((state, level, pos, entity) -> false) .ignitedByLava() )); - items.register(id + "_trapdoor", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -366,7 +368,7 @@ protected DeferredBlock pressurePlate(DeferredRegister.Block .ignitedByLava() .pushReaction(PushReaction.DESTROY) )); - items.register(id + "_pressure_plate", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -385,7 +387,7 @@ protected DeferredBlock button(DeferredRegister.Blocks registry, De .strength(0.5F) .pushReaction(PushReaction.DESTROY) )); - items.register(id + "_button", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -406,7 +408,7 @@ protected DeferredBlock sign(DeferredRegister.Blocks registry, .noCollission().strength(1.0F) .sound(soundType) )); - items.register(id + "_sign", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -446,7 +448,7 @@ protected DeferredBlock hangingSign(DeferredRegis .noCollission().strength(1.0F) .sound(soundType) )); - items.register(id + "_hanging_sign", () -> new BlockItem(block.get(), new Item.Properties())); + items.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); return block; } @@ -613,13 +615,13 @@ public TagKey logsBlockTag() { } @Override - public void blockGen(BlockStateProvider provider) { + public void blockData(BlockStateProvider provider) { if (provider instanceof ReduxBlockStateProvider data) { - this.blockGen(data); + this.blockData(data); } } - protected void blockGen(ReduxBlockStateProvider data) { + protected void blockData(ReduxBlockStateProvider data) { data.log(this.log().get()); data.log(this.strippedLog().get()); data.wood(this.wood().get(), this.log().get()); @@ -638,13 +640,13 @@ protected void blockGen(ReduxBlockStateProvider data) { } @Override - public void itemGen(ItemModelProvider provider) { + public void itemData(ItemModelProvider provider) { if (provider instanceof ReduxItemModelProvider data) { - this.itemGen(data); + this.itemData(data); } } - protected void itemGen(ReduxItemModelProvider data) { + protected void itemData(ReduxItemModelProvider data) { data.itemBlock(this.log().get()); data.itemBlock(this.strippedLog().get()); data.itemBlock(this.planks().get()); @@ -666,13 +668,13 @@ protected void itemGen(ReduxItemModelProvider data) { @Override - public void langGen(LanguageProvider provider) { + public void langData(LanguageProvider provider) { if (provider instanceof ReduxLanguageProvider data) { - this.langGen(data); + this.langData(data); } } - public void langGen(ReduxLanguageProvider data) { + protected void langData(ReduxLanguageProvider data) { boolean vowel = DatagenUtil.isVowel(this.id.charAt(0)); String indefiniteLowercase = vowel ? "an" : "a"; @@ -721,13 +723,13 @@ public void langGen(ReduxLanguageProvider data) { } @Override - public void recipeGen(RecipeProvider provider, RecipeOutput output) { + public void recipeData(RecipeProvider provider, RecipeOutput output) { if (provider instanceof ReduxRecipeProvider data) { - this.recipeGen(data, output); + this.recipeData(data, output); } } - public void recipeGen(ReduxRecipeProvider data, RecipeOutput consumer) { + protected void recipeData(ReduxRecipeProvider data, RecipeOutput consumer) { ReduxRecipeProvider.woodFromLogs(consumer, this.wood().get(), this.log().get()); @@ -782,22 +784,88 @@ public void recipeGen(ReduxRecipeProvider data, RecipeOutput consumer) { @Override public void blockTagData(BlockTagsProvider provider) { + if (provider instanceof ReduxBlockTagsProvider data) { + this.blockTagData(data); + } + } + + protected void blockTagData(ReduxBlockTagsProvider data) { + data.tag(BlockTags.MINEABLE_WITH_AXE).add( + this.planks().get(), + this.stairs().get(), + this.slab().get(), + this.fence().get(), + this.fenceGate().get(), + this.door().get(), + this.trapdoor().get(), + this.sign().get(), + this.wallSign().get() + ).addTag(this.logsBlockTag()); + + data.tag(this.logsBlockTag()).add( + this.log().get(), + this.wood().get(), + this.strippedLog().get(), + this.strippedWood().get() + ); + data.tag(BlockTags.LOGS).addTag(this.logsBlockTag()); + data.tag(BlockTags.PLANKS).add(this.planks().get()); + data.tag(BlockTags.WOODEN_SLABS).add(this.slab().get()); + data.tag(BlockTags.WOODEN_STAIRS).add(this.stairs().get()); + data.tag(BlockTags.WOODEN_FENCES).add(this.fence().get()); + data.tag(BlockTags.FENCE_GATES).add(this.fenceGate().get()); + data.tag(BlockTags.WOODEN_PRESSURE_PLATES).add(this.pressurePlate().get()); + data.tag(BlockTags.WOODEN_BUTTONS).add(this.button().get()); + data.tag(BlockTags.WOODEN_TRAPDOORS).add(this.trapdoor().get()); + data.tag(BlockTags.WOODEN_DOORS).add(this.door().get()); + data.tag(BlockTags.STANDING_SIGNS).add(this.sign().get()); + data.tag(BlockTags.WALL_SIGNS).add(this.wallSign().get()); } @Override public void itemTagData(ItemTagsProvider provider) { - + if (provider instanceof ReduxItemTagsProvider data) { + this.itemTagData(data); + } } - @Override - public void entityTagData(EntityTypeTagsProvider data) { + protected void itemTagData(ReduxItemTagsProvider data) { + data.copy(this.logsBlockTag(), this.logsTag()); + data.tag(AetherTags.Items.PLANKS_CRAFTING).add(this.planks().get().asItem()); + data.tag(AetherTags.Items.SKYROOT_STICK_CRAFTING).add(this.planks().get().asItem()); + data.tag(AetherTags.Items.SKYROOT_TOOL_CRAFTING).add(this.planks().get().asItem()); + data.tag(AetherTags.Items.SKYROOT_REPAIRING).add(this.planks().get().asItem()); + data.tag(ItemTags.BOATS).add(this.boatItem().get()); + data.tag(ItemTags.CHEST_BOATS).add(this.chestBoatItem().get()); } @Override public void lootData(BlockLootSubProvider provider) { + if (provider instanceof ReduxBlockLootProvider data) { + this.lootData(data); + } + } + protected void lootData(ReduxBlockLootProvider data) { + data.dropSelfDouble(this.log().get()); + data.dropSelfDouble(this.strippedLog().get()); + data.naturalDrop(this.wood().get(), this.log().get()); + data.naturalDrop(this.strippedWood().get(), this.strippedLog().get()); + data.dropSelf(this.planks().get()); + data.dropSelf(this.stairs().get()); + data.dropSelf(this.slab().get()); + data.dropSelf(this.fence().get()); + data.dropSelf(this.fenceGate().get()); + data.dropSelf(this.trapdoor().get()); + data.dropSelf(this.pressurePlate().get()); + data.dropSelf(this.button().get()); + data.dropOther(this.wallSign().get(), this.sign().get()); + data.dropSelf(this.sign().get()); + data.dropSelf(this.hangingSign().get()); + data.dropSelf(this.wallHangingSign().get()); + data.add(this.door().get(), data.createDoorTable(this.door().get())); } @Override @@ -805,6 +873,21 @@ public void mapData(DataMapProvider provider) { } + @Override + public void flammables() { + FireBlockAccessor accessor = (FireBlockAccessor) Blocks.FIRE; + accessor.callSetFlammable(this.log().get(), 5, 5); + accessor.callSetFlammable(this.strippedLog().get(), 5, 5); + accessor.callSetFlammable(this.wood().get(), 5, 5); + accessor.callSetFlammable(this.strippedWood().get(), 5, 5); + accessor.callSetFlammable(this.planks().get(), 5, 20); + accessor.callSetFlammable(this.fenceGate().get(), 5, 20); + accessor.callSetFlammable(this.fence().get(), 5, 20); + accessor.callSetFlammable(this.stairs().get(), 5, 20); + accessor.callSetFlammable(this.slab().get(), 5, 20); + } + + @Override @Nullable public String logSuffix(LangType type) { diff --git a/src/main/java/net/zepalesque/redux/blockset/ReduxWoodSets.java b/src/main/java/net/zepalesque/redux/blockset/ReduxWoodSets.java new file mode 100644 index 000000000..5dd4f7193 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/blockset/ReduxWoodSets.java @@ -0,0 +1,18 @@ +package net.zepalesque.redux.blockset; + +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.MapColor; +import net.zepalesque.redux.Redux; +import net.zepalesque.zenith.api.blockset.AbstractWoodSet; + +public class ReduxWoodSets { + + public static final AetherWoodSet CRYSTAL = register(new AetherWoodSet("crystal", MapColor.COLOR_LIGHT_BLUE, MapColor.TERRACOTTA_CYAN, SoundType.WOOD)); + + public static T register(T set) { + Redux.WOOD_SETS.add(set); + return set; + } + + public static void init() {} +} diff --git a/src/main/java/net/zepalesque/redux/data/gen/ReduxBlockStateGen.java b/src/main/java/net/zepalesque/redux/data/gen/ReduxBlockStateGen.java index 2f2c0b437..16234662a 100644 --- a/src/main/java/net/zepalesque/redux/data/gen/ReduxBlockStateGen.java +++ b/src/main/java/net/zepalesque/redux/data/gen/ReduxBlockStateGen.java @@ -15,7 +15,9 @@ public ReduxBlockStateGen(PackOutput output, ExistingFileHelper helper) { @Override protected void registerStatesAndModels() { - this.tintableShortGrass(ReduxBlocks.SHORT_AETHER_GRASS.get(), "natural/"); + Redux.WOOD_SETS.forEach(set -> set.blockData(this)); + + this.tintableShortGrass(ReduxBlocks.SHORT_AETHER_GRASS.get(), "natural/"); } } diff --git a/src/main/java/net/zepalesque/redux/data/gen/ReduxDataMapGen.java b/src/main/java/net/zepalesque/redux/data/gen/ReduxDataMapGen.java new file mode 100644 index 000000000..a2fb554e0 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/data/gen/ReduxDataMapGen.java @@ -0,0 +1,22 @@ +package net.zepalesque.redux.data.gen; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.zepalesque.redux.Redux; +import net.zepalesque.redux.data.prov.ReduxDataMapProvider; + +import java.util.concurrent.CompletableFuture; + +public class ReduxDataMapGen extends ReduxDataMapProvider { + + protected ReduxDataMapGen(PackOutput packOutput, CompletableFuture lookupProvider) { + super(packOutput, lookupProvider); + } + + @Override + protected void gather() { + + Redux.WOOD_SETS.forEach(set -> set.mapData(this)); + + } +} diff --git a/src/main/java/net/zepalesque/redux/data/gen/ReduxItemModelGen.java b/src/main/java/net/zepalesque/redux/data/gen/ReduxItemModelGen.java index c951f907d..b4a6c0a1e 100644 --- a/src/main/java/net/zepalesque/redux/data/gen/ReduxItemModelGen.java +++ b/src/main/java/net/zepalesque/redux/data/gen/ReduxItemModelGen.java @@ -14,6 +14,8 @@ public ReduxItemModelGen(PackOutput output, ExistingFileHelper helper) { @Override protected void registerModels() { + Redux.WOOD_SETS.forEach(set -> set.itemData(this)); + itemBlockFlatCustomTexture(ReduxBlocks.SHORT_AETHER_GRASS, "natural/aether_medium_grass"); } } diff --git a/src/main/java/net/zepalesque/redux/data/gen/ReduxLanguageGen.java b/src/main/java/net/zepalesque/redux/data/gen/ReduxLanguageGen.java index 9edf8e66b..f2c211fd3 100644 --- a/src/main/java/net/zepalesque/redux/data/gen/ReduxLanguageGen.java +++ b/src/main/java/net/zepalesque/redux/data/gen/ReduxLanguageGen.java @@ -2,6 +2,7 @@ import net.minecraft.data.PackOutput; import net.zepalesque.redux.Redux; +import net.zepalesque.redux.block.ReduxBlocks; import net.zepalesque.redux.data.prov.ReduxLanguageProvider; public class ReduxLanguageGen extends ReduxLanguageProvider { @@ -12,6 +13,10 @@ public ReduxLanguageGen(PackOutput output) { @Override protected void addTranslations() { + Redux.WOOD_SETS.forEach(set -> set.langData(this)); + this.add(ReduxBlocks.SHORT_AETHER_GRASS); + + this.addPackDescription("mod", "The Aether: Redux Resources"); } } diff --git a/src/main/java/net/zepalesque/redux/data/gen/ReduxLootGen.java b/src/main/java/net/zepalesque/redux/data/gen/ReduxLootGen.java new file mode 100644 index 000000000..d02724cc4 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/data/gen/ReduxLootGen.java @@ -0,0 +1,26 @@ +package net.zepalesque.redux.data.gen; + +import com.aetherteam.aether.data.generators.loot.AetherAdvancementLoot; +import com.aetherteam.aether.data.generators.loot.AetherBlockLoot; +import com.aetherteam.aether.data.generators.loot.AetherChestLoot; +import com.aetherteam.aether.data.generators.loot.AetherEntityLoot; +import com.aetherteam.aether.data.generators.loot.AetherSelectorLoot; +import com.aetherteam.aether.data.generators.loot.AetherStrippingLoot; +import com.aetherteam.aether.loot.AetherLoot; +import com.aetherteam.aether.loot.AetherLootContexts; +import net.minecraft.data.PackOutput; +import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.zepalesque.redux.data.gen.loot.ReduxBlockLoot; +import net.zepalesque.redux.loot.ReduxLoot; + +import java.util.List; + +public class ReduxLootGen { + + public static LootTableProvider create(PackOutput output) { + return new LootTableProvider(output, ReduxLoot.IMMUTABLE_LOOT_TABLES, List.of( + new LootTableProvider.SubProviderEntry(ReduxBlockLoot::new, LootContextParamSets.BLOCK) + )); + } +} diff --git a/src/main/java/net/zepalesque/redux/data/gen/ReduxRecipeGen.java b/src/main/java/net/zepalesque/redux/data/gen/ReduxRecipeGen.java index 9e7a4cc9b..1f6263546 100644 --- a/src/main/java/net/zepalesque/redux/data/gen/ReduxRecipeGen.java +++ b/src/main/java/net/zepalesque/redux/data/gen/ReduxRecipeGen.java @@ -15,7 +15,8 @@ public ReduxRecipeGen(PackOutput output, CompletableFuture set.recipeData(this, output)); } } diff --git a/src/main/java/net/zepalesque/redux/data/gen/loot/ReduxBlockLoot.java b/src/main/java/net/zepalesque/redux/data/gen/loot/ReduxBlockLoot.java new file mode 100644 index 000000000..7a1c74e13 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/data/gen/loot/ReduxBlockLoot.java @@ -0,0 +1,29 @@ +package net.zepalesque.redux.data.gen.loot; + +import com.aetherteam.aether.block.AetherBlocks; +import net.minecraft.world.flag.FeatureFlagSet; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.zepalesque.redux.Redux; +import net.zepalesque.redux.data.prov.loot.ReduxBlockLootProvider; + +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ReduxBlockLoot extends ReduxBlockLootProvider { + + private static final Set EXPLOSION_RESISTANT = Stream.of(AetherBlocks.TREASURE_CHEST.get()).map(ItemLike::asItem).collect(Collectors.toSet()); + + public ReduxBlockLoot() { + super(EXPLOSION_RESISTANT, FeatureFlags.REGISTRY.allFlags()); + } + + @Override + protected void generate() { + + Redux.WOOD_SETS.forEach(set -> set.lootData(this)); + + } +} diff --git a/src/main/java/net/zepalesque/redux/data/gen/tags/ReduxBlockTagsGen.java b/src/main/java/net/zepalesque/redux/data/gen/tags/ReduxBlockTagsGen.java new file mode 100644 index 000000000..2e387c443 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/data/gen/tags/ReduxBlockTagsGen.java @@ -0,0 +1,23 @@ +package net.zepalesque.redux.data.gen.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.zepalesque.redux.Redux; +import net.zepalesque.redux.data.prov.tags.ReduxBlockTagsProvider; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public class ReduxBlockTagsGen extends ReduxBlockTagsProvider { + + public ReduxBlockTagsGen(PackOutput output, CompletableFuture lookupProvider, @Nullable ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, Redux.MODID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + Redux.WOOD_SETS.forEach(set -> set.blockTagData(this)); + + } +} diff --git a/src/main/java/net/zepalesque/redux/data/gen/tags/ReduxItemTagsGen.java b/src/main/java/net/zepalesque/redux/data/gen/tags/ReduxItemTagsGen.java new file mode 100644 index 000000000..9e2044863 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/data/gen/tags/ReduxItemTagsGen.java @@ -0,0 +1,24 @@ +package net.zepalesque.redux.data.gen.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.zepalesque.redux.Redux; +import net.zepalesque.redux.data.prov.tags.ReduxItemTagsProvider; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public class ReduxItemTagsGen extends ReduxItemTagsProvider { + + public ReduxItemTagsGen(PackOutput output, CompletableFuture registries, CompletableFuture> blockTags, @Nullable ExistingFileHelper helper) { + super(output, registries, blockTags, Redux.MODID, helper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + Redux.WOOD_SETS.forEach(set -> set.itemTagData(this)); + + } +} diff --git a/src/main/java/net/zepalesque/redux/data/prov/ReduxBlockStateProvider.java b/src/main/java/net/zepalesque/redux/data/prov/ReduxBlockStateProvider.java index 388a7ae72..7ba416bbd 100644 --- a/src/main/java/net/zepalesque/redux/data/prov/ReduxBlockStateProvider.java +++ b/src/main/java/net/zepalesque/redux/data/prov/ReduxBlockStateProvider.java @@ -2,7 +2,9 @@ import com.aetherteam.aether.data.providers.AetherBlockStateProvider; import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.client.model.generators.BlockModelBuilder; import net.neoforged.neoforge.client.model.generators.ConfiguredModel; +import net.neoforged.neoforge.client.model.generators.ModelBuilder; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.zepalesque.redux.block.natural.AetherShortGrassBlock; import net.zepalesque.redux.block.state.ReduxStates; @@ -32,4 +34,14 @@ public void tintableShortGrass(AetherShortGrassBlock block, String location) { .renderType("cutout")).build(); }); } + + @Override + public BlockModelBuilder makeWallPostModel(int width, int height, String name) { + return super.makeWallPostModel(width, height, name); + } + + @Override + public BlockModelBuilder makeWallSideModel(int length, int height, String name, ModelBuilder.FaceRotation faceRotation, int u1, int u2) { + return super.makeWallSideModel(length, height, name, faceRotation, u1, u2); + } } diff --git a/src/main/java/net/zepalesque/redux/data/prov/ReduxDataMapProvider.java b/src/main/java/net/zepalesque/redux/data/prov/ReduxDataMapProvider.java new file mode 100644 index 000000000..80946a16b --- /dev/null +++ b/src/main/java/net/zepalesque/redux/data/prov/ReduxDataMapProvider.java @@ -0,0 +1,14 @@ +package net.zepalesque.redux.data.prov; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.DataMapProvider; + +import java.util.concurrent.CompletableFuture; + +public abstract class ReduxDataMapProvider extends DataMapProvider { + + protected ReduxDataMapProvider(PackOutput packOutput, CompletableFuture lookupProvider) { + super(packOutput, lookupProvider); + } +} diff --git a/src/main/java/net/zepalesque/redux/data/prov/ReduxRecipeProvider.java b/src/main/java/net/zepalesque/redux/data/prov/ReduxRecipeProvider.java index c79f87ebb..c0a38209f 100644 --- a/src/main/java/net/zepalesque/redux/data/prov/ReduxRecipeProvider.java +++ b/src/main/java/net/zepalesque/redux/data/prov/ReduxRecipeProvider.java @@ -85,4 +85,8 @@ public RecipeBuilder stairs(Supplier stairs, Supplier items, FeatureFlagSet flags) { + super(items, flags); + } + + protected LootTable.Builder naturalDropBase(Block block, ItemLike other) { + return LootTable.lootTable() + .withPool( + LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(applyExplosionDecay(other, LootItem.lootTableItem(other))) + .when( + LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(ReduxStates.NATURAL_GEN, true)) + ).apply(DoubleDrops.builder()) + ).withPool( + LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(applyExplosionDecay(other, LootItem.lootTableItem(block))) + .when( + LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(ReduxStates.NATURAL_GEN, false)) + ).apply(DoubleDrops.builder()) + ); + } + + public void naturalDrop(Block block, ItemLike other) { + this.add(block, naturalDropBase(block, other)); + } + + @Override + public void dropSelf(Block block) { + super.dropSelf(block); + } + + @Override + public void dropOther(Block block, ItemLike item) { + super.dropOther(block, item); + } + + @Override + public void add(Block block, LootTable.Builder builder) { + super.add(block, builder); + } + + @Override + public void add(Block block, Function factory) { + super.add(block, factory); + } + + @Override + public LootTable.Builder createDoorTable(Block pDoorBlock) { + return super.createDoorTable(pDoorBlock); + } +} diff --git a/src/main/java/net/zepalesque/redux/data/prov/tags/ReduxBlockTagsProvider.java b/src/main/java/net/zepalesque/redux/data/prov/tags/ReduxBlockTagsProvider.java new file mode 100644 index 000000000..c94825b12 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/data/prov/tags/ReduxBlockTagsProvider.java @@ -0,0 +1,23 @@ +package net.zepalesque.redux.data.prov.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.common.data.BlockTagsProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public abstract class ReduxBlockTagsProvider extends BlockTagsProvider { + + public ReduxBlockTagsProvider(PackOutput output, CompletableFuture lookupProvider, String modId, @Nullable ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, modId, existingFileHelper); + } + + @Override + public IntrinsicTagAppender tag(TagKey tag) { + return super.tag(tag); + } +} diff --git a/src/main/java/net/zepalesque/redux/data/prov/tags/ReduxItemTagsProvider.java b/src/main/java/net/zepalesque/redux/data/prov/tags/ReduxItemTagsProvider.java new file mode 100644 index 000000000..15b9ec9c1 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/data/prov/tags/ReduxItemTagsProvider.java @@ -0,0 +1,31 @@ +package net.zepalesque.redux.data.prov.tags; + +import com.aetherteam.aether.Aether; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.common.data.BlockTagsProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; + +import javax.annotation.Nullable; +import java.util.concurrent.CompletableFuture; + +public abstract class ReduxItemTagsProvider extends ItemTagsProvider { + + public ReduxItemTagsProvider(PackOutput output, CompletableFuture registries, CompletableFuture> blockTags, String id, @Nullable ExistingFileHelper helper) { + super(output, registries, blockTags, id, helper); + } + + @Override + public IntrinsicTagAppender tag(TagKey tag) { + return super.tag(tag); + } + + @Override + public void copy(TagKey blockTag, TagKey itemTag) { + super.copy(blockTag, itemTag); + } +} diff --git a/src/main/java/net/zepalesque/redux/loot/ReduxLoot.java b/src/main/java/net/zepalesque/redux/loot/ReduxLoot.java new file mode 100644 index 000000000..deaad4c37 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/loot/ReduxLoot.java @@ -0,0 +1,27 @@ +package net.zepalesque.redux.loot; + +import com.aetherteam.aether.Aether; +import net.minecraft.resources.ResourceLocation; +import net.zepalesque.redux.Redux; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public class ReduxLoot { + + private static final Set LOOT_TABLES = new HashSet<>(); + public static final Set IMMUTABLE_LOOT_TABLES = Collections.unmodifiableSet(LOOT_TABLES); + + private static ResourceLocation register(String id) { + return register(new ResourceLocation(Redux.MODID, id)); + } + + private static ResourceLocation register(ResourceLocation id) { + if (LOOT_TABLES.add(id)) { + return id; + } else { + throw new IllegalArgumentException(id + " is already a registered built-in loot table"); + } + } +} diff --git a/src/main/java/net/zepalesque/redux/mixin/ReduxMixinPlugin.java b/src/main/java/net/zepalesque/redux/mixin/ReduxMixinPlugin.java new file mode 100644 index 000000000..82fe474a0 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/mixin/ReduxMixinPlugin.java @@ -0,0 +1,52 @@ +package net.zepalesque.redux.mixin; + +import com.google.common.collect.ImmutableMap; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; + +public final class ReduxMixinPlugin implements IMixinConfigPlugin { + + Map> OVERRIDES = ImmutableMap.>builder() + .build(); + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return OVERRIDES.containsKey(mixinClassName) ? OVERRIDES.get(mixinClassName).get() : true; + } + + @Override + public void onLoad(String mixinPackage) { + + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } +} \ No newline at end of file diff --git a/src/main/java/net/zepalesque/redux/mixin/mixins/common/accessor/WallBlockAccessor.java b/src/main/java/net/zepalesque/redux/mixin/mixins/common/accessor/WallBlockAccessor.java new file mode 100644 index 000000000..79bbf55f2 --- /dev/null +++ b/src/main/java/net/zepalesque/redux/mixin/mixins/common/accessor/WallBlockAccessor.java @@ -0,0 +1,27 @@ +package net.zepalesque.redux.mixin.mixins.common.accessor; + +import net.minecraft.world.level.block.WallBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(WallBlock.class) +public interface WallBlockAccessor { + @Accessor("shapeByIndex") + Map redux$getShapeByIndex(); + + @Mutable + @Accessor("shapeByIndex") + void redux$setShapeByIndex(Map shapeByIndex); + + @Accessor("collisionShapeByIndex") + Map redux$getCollisionShapeByIndex(); + + @Mutable + @Accessor("collisionShapeByIndex") + void redux$setCollisionShapeByIndex(Map collisionShapeByIndex); +} \ No newline at end of file diff --git a/src/main/resources/aether_redux.mixins.json b/src/main/resources/aether_redux.mixins.json new file mode 100644 index 000000000..efc75c472 --- /dev/null +++ b/src/main/resources/aether_redux.mixins.json @@ -0,0 +1,11 @@ +{ + "required": true, + "package": "net.zepalesque.redux.mixin.mixins", + "plugin": "net.zepalesque.redux.mixin.ReduxMixinPlugin", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_17", + "refmap": "aether_redux.refmap.json", + "mixins": [ + "common.accessor.WallBlockAccessor" + ] +} \ No newline at end of file