From 8582abbf4ee55ff1915f47d7c2e75cffed70baeb Mon Sep 17 00:00:00 2001 From: Vos Date: Tue, 11 Nov 2025 00:35:31 -0600 Subject: [PATCH] Lizard --- .../acesbs/blockstates/lizard_button.json | 118 +++++++++++++ .../acesbs/blockstates/lizard_planks.json | 7 + .../acesbs/models/block/lizard_button.json | 6 + .../models/block/lizard_button_inventory.json | 6 + .../models/block/lizard_button_pressed.json | 6 + .../acesbs/models/block/lizard_planks.json | 6 + .../acesbs/models/item/lizard_button.json | 3 + .../acesbs/models/item/lizard_planks.json | 3 + .../building_blocks/lizard_planks.json | 32 ++++ .../recipes/redstone/lizard_button.json | 32 ++++ .../data/acesbs/recipe/lizard_button.json | 13 ++ .../data/acesbs/recipe/lizard_planks.json | 28 ++++ .../com/acethewildfire/acesbs/AcesBS.java | 5 + .../acesbs/block/ModBlocks.java | 42 +++++ .../acesbs/datagen/ModModelProvider.java | 4 + .../acesbs/datagen/ModRecipeProvider.java | 155 ++++++++++-------- .../acesbs/item/ModItemGroups.java | 3 + .../acesbs/sounds/ModSounds.java | 26 +++ .../resources/assets/acesbs/lang/en_us.json | 9 +- src/main/resources/assets/acesbs/sounds.json | 8 + .../resources/assets/acesbs/sounds/lizard.ogg | Bin 0 -> 9310 bytes .../acesbs/textures/block/lizard_planks.png | Bin 0 -> 4502 bytes 22 files changed, 439 insertions(+), 73 deletions(-) create mode 100644 src/main/generated/assets/acesbs/blockstates/lizard_button.json create mode 100644 src/main/generated/assets/acesbs/blockstates/lizard_planks.json create mode 100644 src/main/generated/assets/acesbs/models/block/lizard_button.json create mode 100644 src/main/generated/assets/acesbs/models/block/lizard_button_inventory.json create mode 100644 src/main/generated/assets/acesbs/models/block/lizard_button_pressed.json create mode 100644 src/main/generated/assets/acesbs/models/block/lizard_planks.json create mode 100644 src/main/generated/assets/acesbs/models/item/lizard_button.json create mode 100644 src/main/generated/assets/acesbs/models/item/lizard_planks.json create mode 100644 src/main/generated/data/acesbs/advancement/recipes/building_blocks/lizard_planks.json create mode 100644 src/main/generated/data/acesbs/advancement/recipes/redstone/lizard_button.json create mode 100644 src/main/generated/data/acesbs/recipe/lizard_button.json create mode 100644 src/main/generated/data/acesbs/recipe/lizard_planks.json create mode 100644 src/main/java/com/acethewildfire/acesbs/sounds/ModSounds.java create mode 100644 src/main/resources/assets/acesbs/sounds.json create mode 100644 src/main/resources/assets/acesbs/sounds/lizard.ogg create mode 100644 src/main/resources/assets/acesbs/textures/block/lizard_planks.png diff --git a/src/main/generated/assets/acesbs/blockstates/lizard_button.json b/src/main/generated/assets/acesbs/blockstates/lizard_button.json new file mode 100644 index 0000000..18fc383 --- /dev/null +++ b/src/main/generated/assets/acesbs/blockstates/lizard_button.json @@ -0,0 +1,118 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "acesbs:block/lizard_button", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false": { + "model": "acesbs:block/lizard_button", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false": { + "model": "acesbs:block/lizard_button", + "x": 180 + }, + "face=ceiling,facing=south,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "x": 180 + }, + "face=ceiling,facing=west,powered=false": { + "model": "acesbs:block/lizard_button", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false": { + "model": "acesbs:block/lizard_button", + "y": 90 + }, + "face=floor,facing=east,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "y": 90 + }, + "face=floor,facing=north,powered=false": { + "model": "acesbs:block/lizard_button" + }, + "face=floor,facing=north,powered=true": { + "model": "acesbs:block/lizard_button_pressed" + }, + "face=floor,facing=south,powered=false": { + "model": "acesbs:block/lizard_button", + "y": 180 + }, + "face=floor,facing=south,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "y": 180 + }, + "face=floor,facing=west,powered=false": { + "model": "acesbs:block/lizard_button", + "y": 270 + }, + "face=floor,facing=west,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "y": 270 + }, + "face=wall,facing=east,powered=false": { + "model": "acesbs:block/lizard_button", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false": { + "model": "acesbs:block/lizard_button", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=north,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=south,powered=false": { + "model": "acesbs:block/lizard_button", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false": { + "model": "acesbs:block/lizard_button", + "uvlock": true, + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true": { + "model": "acesbs:block/lizard_button_pressed", + "uvlock": true, + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/acesbs/blockstates/lizard_planks.json b/src/main/generated/assets/acesbs/blockstates/lizard_planks.json new file mode 100644 index 0000000..7ba960c --- /dev/null +++ b/src/main/generated/assets/acesbs/blockstates/lizard_planks.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "acesbs:block/lizard_planks" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/acesbs/models/block/lizard_button.json b/src/main/generated/assets/acesbs/models/block/lizard_button.json new file mode 100644 index 0000000..e88ff7c --- /dev/null +++ b/src/main/generated/assets/acesbs/models/block/lizard_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "acesbs:block/lizard_planks" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/acesbs/models/block/lizard_button_inventory.json b/src/main/generated/assets/acesbs/models/block/lizard_button_inventory.json new file mode 100644 index 0000000..aa0c029 --- /dev/null +++ b/src/main/generated/assets/acesbs/models/block/lizard_button_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "acesbs:block/lizard_planks" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/acesbs/models/block/lizard_button_pressed.json b/src/main/generated/assets/acesbs/models/block/lizard_button_pressed.json new file mode 100644 index 0000000..9f5a4bb --- /dev/null +++ b/src/main/generated/assets/acesbs/models/block/lizard_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "acesbs:block/lizard_planks" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/acesbs/models/block/lizard_planks.json b/src/main/generated/assets/acesbs/models/block/lizard_planks.json new file mode 100644 index 0000000..e3865b4 --- /dev/null +++ b/src/main/generated/assets/acesbs/models/block/lizard_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "acesbs:block/lizard_planks" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/acesbs/models/item/lizard_button.json b/src/main/generated/assets/acesbs/models/item/lizard_button.json new file mode 100644 index 0000000..fc2333d --- /dev/null +++ b/src/main/generated/assets/acesbs/models/item/lizard_button.json @@ -0,0 +1,3 @@ +{ + "parent": "acesbs:block/lizard_button_inventory" +} \ No newline at end of file diff --git a/src/main/generated/assets/acesbs/models/item/lizard_planks.json b/src/main/generated/assets/acesbs/models/item/lizard_planks.json new file mode 100644 index 0000000..76358b1 --- /dev/null +++ b/src/main/generated/assets/acesbs/models/item/lizard_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "acesbs:block/lizard_planks" +} \ No newline at end of file diff --git a/src/main/generated/data/acesbs/advancement/recipes/building_blocks/lizard_planks.json b/src/main/generated/data/acesbs/advancement/recipes/building_blocks/lizard_planks.json new file mode 100644 index 0000000..f9c8aad --- /dev/null +++ b/src/main/generated/data/acesbs/advancement/recipes/building_blocks/lizard_planks.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_green_dye": { + "conditions": { + "items": [ + { + "items": "minecraft:green_dye" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "acesbs:lizard_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_green_dye" + ] + ], + "rewards": { + "recipes": [ + "acesbs:lizard_planks" + ] + } +} \ No newline at end of file diff --git a/src/main/generated/data/acesbs/advancement/recipes/redstone/lizard_button.json b/src/main/generated/data/acesbs/advancement/recipes/redstone/lizard_button.json new file mode 100644 index 0000000..3b2304f --- /dev/null +++ b/src/main/generated/data/acesbs/advancement/recipes/redstone/lizard_button.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_lizard_planks": { + "conditions": { + "items": [ + { + "items": "acesbs:lizard_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "acesbs:lizard_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_lizard_planks" + ] + ], + "rewards": { + "recipes": [ + "acesbs:lizard_button" + ] + } +} \ No newline at end of file diff --git a/src/main/generated/data/acesbs/recipe/lizard_button.json b/src/main/generated/data/acesbs/recipe/lizard_button.json new file mode 100644 index 0000000..ea2196e --- /dev/null +++ b/src/main/generated/data/acesbs/recipe/lizard_button.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "acesbs:lizard_planks" + } + ], + "result": { + "count": 1, + "id": "acesbs:lizard_button" + } +} \ No newline at end of file diff --git a/src/main/generated/data/acesbs/recipe/lizard_planks.json b/src/main/generated/data/acesbs/recipe/lizard_planks.json new file mode 100644 index 0000000..64d154b --- /dev/null +++ b/src/main/generated/data/acesbs/recipe/lizard_planks.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:birch_planks" + }, + { + "item": "minecraft:birch_planks" + }, + { + "item": "minecraft:birch_planks" + }, + { + "item": "minecraft:birch_planks" + }, + { + "item": "acesbs:raw_entropy" + }, + { + "item": "minecraft:green_dye" + } + ], + "result": { + "count": 4, + "id": "acesbs:lizard_planks" + } +} \ No newline at end of file diff --git a/src/main/java/com/acethewildfire/acesbs/AcesBS.java b/src/main/java/com/acethewildfire/acesbs/AcesBS.java index 9890110..d1a547c 100644 --- a/src/main/java/com/acethewildfire/acesbs/AcesBS.java +++ b/src/main/java/com/acethewildfire/acesbs/AcesBS.java @@ -4,10 +4,13 @@ import com.acethewildfire.acesbs.block.ModBlocks; import com.acethewildfire.acesbs.component.ModDataComponentTypes; import com.acethewildfire.acesbs.item.ModItemGroups; import com.acethewildfire.acesbs.item.ModItems; +import com.acethewildfire.acesbs.sounds.ModSounds; import com.acethewildfire.acesbs.util.HammerUsageEvent; import com.acethewildfire.acesbs.util.UpdateRecipies; +import com.acethewildfire.acesbs.util.YouMonsterEvent; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.player.AttackEntityCallback; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,11 +33,13 @@ public class AcesBS implements ModInitializer { ModItemGroups.registerItemGroups(); ModItems.registerModItems(); ModBlocks.registerModBlocks(); + ModSounds.registerSounds(); ModDataComponentTypes.registerDataComponentsTypes(); UpdateRecipies.updateVanilla(); PlayerBlockBreakEvents.BEFORE.register(new HammerUsageEvent()); + AttackEntityCallback.EVENT.register(new YouMonsterEvent()); } } \ No newline at end of file diff --git a/src/main/java/com/acethewildfire/acesbs/block/ModBlocks.java b/src/main/java/com/acethewildfire/acesbs/block/ModBlocks.java index 33ad0aa..eebd487 100644 --- a/src/main/java/com/acethewildfire/acesbs/block/ModBlocks.java +++ b/src/main/java/com/acethewildfire/acesbs/block/ModBlocks.java @@ -4,16 +4,27 @@ import com.acethewildfire.acesbs.AcesBS; import com.acethewildfire.acesbs.block.custom.EntropyBlock; import com.acethewildfire.acesbs.block.custom.EvilBlock; import com.acethewildfire.acesbs.block.custom.StableEntropyBlock; +import com.acethewildfire.acesbs.sounds.ModSounds; import net.minecraft.block.*; import net.minecraft.block.enums.NoteBlockInstrument; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.ActionResult; import net.minecraft.util.Identifier; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.intprovider.UniformIntProvider; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; +import org.jetbrains.annotations.Nullable; import java.util.function.ToIntFunction; @@ -133,6 +144,37 @@ public class ModBlocks { .nonOpaque() )); + public static final Block LIZARD_PLANKS = registerBlock("lizard_planks", + new Block( + AbstractBlock.Settings.create() + .mapColor(MapColor.DARK_GREEN) + .strength(2.0F, 3.0F) + .sounds(BlockSoundGroup.WOOD) + .burnable() + .noCollision() + )); + + public static final Block LIZARD_BUTTON = registerBlock("lizard_button", + new ButtonBlock(BlockSetType.BIRCH, 1, + AbstractBlock.Settings.create() + .mapColor(MapColor.DARK_GREEN) + .strength(2.0F, 3.0F) + .sounds(BlockSoundGroup.WOOD) + .burnable() + .noCollision() + ){ + private final BlockSetType blockSetType = BlockSetType.BIRCH; + +// @Override +// protected void playClickSound(@Nullable PlayerEntity player, WorldAccess world, BlockPos pos, boolean powered) { +// world.playSound(powered ? player : null, pos, ModSounds.LIZARD, SoundCategory.BLOCKS); +// } + @Override + protected SoundEvent getClickSound(boolean powered) { + return powered ? ModSounds.LIZARD : this.blockSetType.buttonClickOff(); + } + }); + public static final Block EVIL_BLOCK = registerBlock("evil_block", new EvilBlock(AbstractBlock.Settings.create() .strength(5f) diff --git a/src/main/java/com/acethewildfire/acesbs/datagen/ModModelProvider.java b/src/main/java/com/acethewildfire/acesbs/datagen/ModModelProvider.java index 7ffc59a..aa80eef 100644 --- a/src/main/java/com/acethewildfire/acesbs/datagen/ModModelProvider.java +++ b/src/main/java/com/acethewildfire/acesbs/datagen/ModModelProvider.java @@ -23,8 +23,12 @@ public class ModModelProvider extends FabricModelProvider { blockStateModelGenerator.registerSimpleCubeAll(ModBlocks.STABLE_ENTROPY_BLOCK); blockStateModelGenerator.registerSimpleCubeAll(ModBlocks.PRISMA_STEEL_BLOCK); + BlockStateModelGenerator.BlockTexturePool lizardPool = blockStateModelGenerator.registerCubeAllModelTexturePool(ModBlocks.LIZARD_PLANKS); + lizardPool.button(ModBlocks.LIZARD_BUTTON); + BlockStateModelGenerator.BlockTexturePool lemonwoodPool = blockStateModelGenerator.registerCubeAllModelTexturePool(ModBlocks.LEMONWOOD_PLANKS); + lemonwoodPool.stairs(ModBlocks.LEMONWOOD_STAIRS); lemonwoodPool.slab(ModBlocks.LEMONWOOD_SLAB); diff --git a/src/main/java/com/acethewildfire/acesbs/datagen/ModRecipeProvider.java b/src/main/java/com/acethewildfire/acesbs/datagen/ModRecipeProvider.java index 7ec55ff..82b5c19 100644 --- a/src/main/java/com/acethewildfire/acesbs/datagen/ModRecipeProvider.java +++ b/src/main/java/com/acethewildfire/acesbs/datagen/ModRecipeProvider.java @@ -25,6 +25,91 @@ public class ModRecipeProvider extends FabricRecipeProvider { super(output, registriesFuture); } + @Override + public void generate(RecipeExporter recipeExporter) { + + List ENTROPY_SMELTABLES = List.of(ModItems.RAW_ENTROPY, ModBlocks.ENTROPY_ORE); + + offerBlasting(recipeExporter, ENTROPY_SMELTABLES, RecipeCategory.MISC, ModItems.STABLE_ENTROPY, 0.5f, 2000, "stable_entropy"); + + offerReversibleCompactingRecipes(recipeExporter, RecipeCategory.BUILDING_BLOCKS, ModItems.RAW_ENTROPY, RecipeCategory.DECORATIONS, ModBlocks.ENTROPY_BLOCK); + offerReversibleCompactingRecipes(recipeExporter, RecipeCategory.BUILDING_BLOCKS, ModItems.STABLE_ENTROPY, RecipeCategory.DECORATIONS, ModBlocks.STABLE_ENTROPY_BLOCK); + offerReversibleCompactingRecipes(recipeExporter, RecipeCategory.BUILDING_BLOCKS, ModItems.PRISMA_STEEL, RecipeCategory.DECORATIONS, ModBlocks.PRISMA_STEEL_BLOCK); + + offerAllFoodCookingRecipes(recipeExporter, 200, ModItems.LEMON, ModItems.COOKED_LEMON, 0.35F); + + ShapedRecipeJsonBuilder.create(RecipeCategory.COMBAT, ModItems.ORACLE_LEMON) + .pattern("###") + .pattern("#L#") + .pattern("###") + .input('#', ModItems.STABLE_ENTROPY) + .input('L', ModItems.LEMON) + .criterion(hasItem(ModItems.LEMON), conditionsFromItem(ModItems.LEMON)) + .offerTo(recipeExporter); + + + ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, ModBlocks.LIZARD_PLANKS, 4) + .input(Blocks.BIRCH_PLANKS, 4) + .input(ModItems.RAW_ENTROPY, 1) + .input(Items.GREEN_DYE, 1) + .criterion(hasItem(Items.GREEN_DYE), conditionsFromItem(Items.GREEN_DYE)) + .offerTo(recipeExporter); + + ShapelessRecipeJsonBuilder.create(RecipeCategory.REDSTONE, ModBlocks.LIZARD_BUTTON, 1) + .input(ModBlocks.LIZARD_PLANKS, 1) + .criterion(hasItem(ModBlocks.LIZARD_PLANKS), conditionsFromItem(ModBlocks.LIZARD_PLANKS)) + .offerTo(recipeExporter); + + ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, ModBlocks.LEMONWOOD_PLANKS, 4) + .input(Blocks.BIRCH_PLANKS, 4) + .input(ModItems.LEMON, 1) + .criterion(hasItem(ModItems.LEMON), conditionsFromItem(ModItems.LEMON)) + .offerTo(recipeExporter); + + createStairsRecipe(ModBlocks.LEMONWOOD_STAIRS, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) + .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) + .offerTo(recipeExporter); + createSlabRecipe(RecipeCategory.BUILDING_BLOCKS, ModBlocks.LEMONWOOD_SLAB, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) + .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) + .offerTo(recipeExporter); + + ShapelessRecipeJsonBuilder.create(RecipeCategory.REDSTONE, ModBlocks.LEMONWOOD_BUTTON, 1) + .input(ModBlocks.LEMONWOOD_PLANKS, 1) + .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) + .offerTo(recipeExporter); + createPressurePlateRecipe(RecipeCategory.REDSTONE, ModBlocks.LEMONWOOD_PRESSURE_PLATE, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) + .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) + .offerTo(recipeExporter); + + createFenceRecipe(ModBlocks.LEMONWOOD_FENCE, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) + .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) + .offerTo(recipeExporter); + createFenceGateRecipe(ModBlocks.LEMONWOOD_FENCE_GATE, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) + .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) + .offerTo(recipeExporter); + offerWallRecipe(recipeExporter, RecipeCategory.BUILDING_BLOCKS, ModBlocks.LEMONWOOD_WALL, ModBlocks.LEMONWOOD_PLANKS); + + createDoorRecipe(ModBlocks.LEMONWOOD_DOOR, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) + .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) + .offerTo(recipeExporter); + createTrapdoorRecipe(ModBlocks.LEMONWOOD_TRAPDOOR, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) + .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) + .offerTo(recipeExporter); + + SwordRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_SWORD, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); + PickaxeRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_PICKAXE, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); + HammerRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_HAMMER, ModItems.PRISMA_STEEL, ModBlocks.PRISMA_STEEL_BLOCK, Items.STICK, ModItems.PRISMA_STEEL); + AxeRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_AXE, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); + ShovelRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_SHOVEL, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); + HoeRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_HOE, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); + + offerSmithingTrimRecipe(recipeExporter, ModItems.PRISMA_SMITHING_TEMPLATE, Identifier.of(AcesBS.MOD_ID, "prisma")); + + // For 2+ recipes with the same RESULT use + // .offerTo(recipeExporter, Identifier.of(AcesBS.MOD_ID, "output_item_from_input_item")); + } + + private void SwordRecipeJsonBuilder(RecipeExporter recipeExporter, ItemConvertible result, ItemConvertible headMaterial, ItemConvertible handleMaterial, ItemConvertible criterionItem){ ShapedRecipeJsonBuilder.create(RecipeCategory.COMBAT, result) .pattern(" # ") @@ -103,76 +188,6 @@ public class ModRecipeProvider extends FabricRecipeProvider { .offerTo(recipeExporter, Identifier.of(AcesBS.MOD_ID, result.asItem().getName().getString() + ".right")); } - @Override - public void generate(RecipeExporter recipeExporter) { - - List ENTROPY_SMELTABLES = List.of(ModItems.RAW_ENTROPY, ModBlocks.ENTROPY_ORE); - - offerBlasting(recipeExporter, ENTROPY_SMELTABLES, RecipeCategory.MISC, ModItems.STABLE_ENTROPY, 0.5f, 2000, "stable_entropy"); - - offerReversibleCompactingRecipes(recipeExporter, RecipeCategory.BUILDING_BLOCKS, ModItems.RAW_ENTROPY, RecipeCategory.DECORATIONS, ModBlocks.ENTROPY_BLOCK); - offerReversibleCompactingRecipes(recipeExporter, RecipeCategory.BUILDING_BLOCKS, ModItems.STABLE_ENTROPY, RecipeCategory.DECORATIONS, ModBlocks.STABLE_ENTROPY_BLOCK); - offerReversibleCompactingRecipes(recipeExporter, RecipeCategory.BUILDING_BLOCKS, ModItems.PRISMA_STEEL, RecipeCategory.DECORATIONS, ModBlocks.PRISMA_STEEL_BLOCK); - - offerAllFoodCookingRecipes(recipeExporter, 200, ModItems.LEMON, ModItems.COOKED_LEMON, 0.35F); - - ShapedRecipeJsonBuilder.create(RecipeCategory.COMBAT, ModItems.ORACLE_LEMON) - .pattern("###") - .pattern("#L#") - .pattern("###") - .input('#', ModItems.STABLE_ENTROPY) - .input('L', ModItems.LEMON) - .criterion(hasItem(ModItems.LEMON), conditionsFromItem(ModItems.LEMON)) - .offerTo(recipeExporter); - - ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, ModBlocks.LEMONWOOD_PLANKS, 4) - .input(Blocks.BIRCH_PLANKS, 4) - .input(ModItems.LEMON, 1) - .criterion(hasItem(ModItems.LEMON), conditionsFromItem(ModItems.LEMON)) - .offerTo(recipeExporter); - - createStairsRecipe(ModBlocks.LEMONWOOD_STAIRS, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) - .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) - .offerTo(recipeExporter); - createSlabRecipe(RecipeCategory.BUILDING_BLOCKS, ModBlocks.LEMONWOOD_SLAB, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) - .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) - .offerTo(recipeExporter); - - ShapelessRecipeJsonBuilder.create(RecipeCategory.REDSTONE, ModBlocks.LEMONWOOD_BUTTON, 1) - .input(ModBlocks.LEMONWOOD_PLANKS, 1) - .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) - .offerTo(recipeExporter); - createPressurePlateRecipe(RecipeCategory.REDSTONE, ModBlocks.LEMONWOOD_PRESSURE_PLATE, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) - .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) - .offerTo(recipeExporter); - - createFenceRecipe(ModBlocks.LEMONWOOD_FENCE, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) - .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) - .offerTo(recipeExporter); - createFenceGateRecipe(ModBlocks.LEMONWOOD_FENCE_GATE, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) - .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) - .offerTo(recipeExporter); - offerWallRecipe(recipeExporter, RecipeCategory.BUILDING_BLOCKS, ModBlocks.LEMONWOOD_WALL, ModBlocks.LEMONWOOD_PLANKS); - - createDoorRecipe(ModBlocks.LEMONWOOD_DOOR, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) - .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) - .offerTo(recipeExporter); - createTrapdoorRecipe(ModBlocks.LEMONWOOD_TRAPDOOR, Ingredient.ofItems(ModBlocks.LEMONWOOD_PLANKS)) - .criterion(hasItem(ModBlocks.LEMONWOOD_PLANKS), conditionsFromItem(ModBlocks.LEMONWOOD_PLANKS)) - .offerTo(recipeExporter); - - SwordRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_SWORD, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); - PickaxeRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_PICKAXE, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); - HammerRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_HAMMER, ModItems.PRISMA_STEEL, ModBlocks.PRISMA_STEEL_BLOCK, Items.STICK, ModItems.PRISMA_STEEL); - AxeRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_AXE, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); - ShovelRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_SHOVEL, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); - HoeRecipeJsonBuilder(recipeExporter, ModItems.PRISMA_STEEL_HOE, ModItems.PRISMA_STEEL, Items.STICK, ModItems.PRISMA_STEEL); - - offerSmithingTrimRecipe(recipeExporter, ModItems.PRISMA_SMITHING_TEMPLATE, Identifier.of(AcesBS.MOD_ID, "prisma")); - - // For 2+ recipes with the same RESULT use - // .offerTo(recipeExporter, Identifier.of(AcesBS.MOD_ID, "output_item_from_input_item")); - } public void offerAllFoodCookingRecipes (RecipeExporter recipeExporter, int baseCookingTime, ItemConvertible raw_item, ItemConvertible cooked_item, float experience ){ offerFoodCookingRecipe(recipeExporter, "smoking", RecipeSerializer.SMOKING, SmokingRecipe::new,baseCookingTime/2, raw_item, cooked_item, experience); diff --git a/src/main/java/com/acethewildfire/acesbs/item/ModItemGroups.java b/src/main/java/com/acethewildfire/acesbs/item/ModItemGroups.java index 0d80a34..db866ef 100644 --- a/src/main/java/com/acethewildfire/acesbs/item/ModItemGroups.java +++ b/src/main/java/com/acethewildfire/acesbs/item/ModItemGroups.java @@ -40,6 +40,9 @@ public class ModItemGroups { entries.add(ModBlocks.STABLE_ENTROPY_BLOCK); entries.add(ModBlocks.PRISMA_STEEL_BLOCK); + entries.add(ModBlocks.LIZARD_PLANKS); + entries.add(ModBlocks.LIZARD_BUTTON); + entries.add(ModBlocks.LEMONWOOD_PLANKS); entries.add(ModBlocks.LEMONWOOD_STAIRS); entries.add(ModBlocks.LEMONWOOD_SLAB); diff --git a/src/main/java/com/acethewildfire/acesbs/sounds/ModSounds.java b/src/main/java/com/acethewildfire/acesbs/sounds/ModSounds.java new file mode 100644 index 0000000..0efca2e --- /dev/null +++ b/src/main/java/com/acethewildfire/acesbs/sounds/ModSounds.java @@ -0,0 +1,26 @@ +package com.acethewildfire.acesbs.sounds; + +import com.acethewildfire.acesbs.AcesBS; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Identifier; + +public class ModSounds { + public static final SoundEvent LIZARD = registerSoundEvent("lizard"); + +// public static final BlockSoundGroup LIZARD_SOUNDS = new BlockSoundGroup(1f, 1f, SoundEvents.BLOCK_WOOD_BREAK, SoundEvents.BLOCK_WOOD_STEP, SoundEvents.BLOCK_WOOD_PLACE, SoundEvents.BLOCK_WOOD_HIT, SoundEvents.BLOCK_WOOD_FALL) + + private static SoundEvent registerSoundEvent(String name){ + Identifier id = Identifier.of(AcesBS.MOD_ID, name); + return Registry.register(Registries.SOUND_EVENT, id, SoundEvent.of(id)); + } + + + public static void registerSounds(){ + AcesBS.LOGGER.info("Registering Mod Sounds for " + AcesBS.MOD_ID); + } + +} diff --git a/src/main/resources/assets/acesbs/lang/en_us.json b/src/main/resources/assets/acesbs/lang/en_us.json index 0017205..0bcf176 100644 --- a/src/main/resources/assets/acesbs/lang/en_us.json +++ b/src/main/resources/assets/acesbs/lang/en_us.json @@ -37,6 +37,9 @@ "block.acesbs.entropy_ore": "Entropic Ore", "block.acesbs.stable_entropy_block": "Block of Stabilized Entropy", + "block.acesbs.lizard_planks": "Lizard Planks", + "block.acesbs.lizard_button": "Lizard Button", + "block.acesbs.lemonwood_planks": "Lemonwood Planks", "block.acesbs.lemonwood_stairs": "Lemonwood Stairs", "block.acesbs.lemonwood_slab": "Lemonwood Slab", @@ -50,8 +53,6 @@ "block.acesbs.evil_block": "Evil Block", - - "itemgroup.acesbs.items": "Ace's BS Items", "itemgroup.acesbs.blocks": "Ace's BS Blocks", "itemgroup.acesbs.combat": "Ace's BS Combat", @@ -66,5 +67,7 @@ "tooltip.acesbs.wand": "Changes blocks using Entropy", "tooltip.acesbs.kaupen_bow": "§7§oThanks to §1Modding by Kaupenjoe§r", - "tooltip.acesbs.kaupen_bow_2": "§7§oYou made minecraft modding easy.§r" + "tooltip.acesbs.kaupen_bow_2": "§7§oYou made minecraft modding easy.§r", + + "sounds.acesbs.lizard": "Lizard button" } \ No newline at end of file diff --git a/src/main/resources/assets/acesbs/sounds.json b/src/main/resources/assets/acesbs/sounds.json new file mode 100644 index 0000000..32fac08 --- /dev/null +++ b/src/main/resources/assets/acesbs/sounds.json @@ -0,0 +1,8 @@ +{ + "lizard": { + "subtitle": "sounds.acesbs.lizard", + "sounds": [ + "acesbs:lizard" + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/acesbs/sounds/lizard.ogg b/src/main/resources/assets/acesbs/sounds/lizard.ogg new file mode 100644 index 0000000000000000000000000000000000000000..69f77df3920ee60aee617274fb4141f035d63774 GIT binary patch literal 9310 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 QfMZCToSt-S^`_GQ0ydj