diff --git a/src/generated/resources/data/computercraft/advancements/recipes/computercraft/cable.json b/src/generated/resources/data/computercraft/advancements/recipes/computercraft/cable.json index 69ed2c857..ecec5122c 100644 --- a/src/generated/resources/data/computercraft/advancements/recipes/computercraft/cable.json +++ b/src/generated/resources/data/computercraft/advancements/recipes/computercraft/cable.json @@ -21,7 +21,7 @@ "conditions": { "items": [ { - "tag": "computercraft:computer" + "tag": "computercraft:wired_modem" } ] } diff --git a/src/generated/resources/data/computercraft/tags/blocks/computer.json b/src/generated/resources/data/computercraft/tags/blocks/computer.json new file mode 100644 index 000000000..bcd0e8037 --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/computer.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "computercraft:computer_normal", + "computercraft:computer_advanced", + "computercraft:computer_command" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/monitor.json b/src/generated/resources/data/computercraft/tags/blocks/monitor.json new file mode 100644 index 000000000..babaefa8b --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/monitor.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "computercraft:monitor_normal", + "computercraft:monitor_advanced" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle.json b/src/generated/resources/data/computercraft/tags/blocks/turtle.json new file mode 100644 index 000000000..e4277edfe --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "computercraft:turtle_normal", + "computercraft:turtle_advanced" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json b/src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json new file mode 100644 index 000000000..1d795dcef --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle_always_breakable.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "#minecraft:leaves", + "minecraft:bamboo", + "minecraft:bamboo_sapling" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json b/src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json new file mode 100644 index 000000000..00e81351a --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle_hoe_harvestable.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "#minecraft:crops", + "minecraft:cactus", + "minecraft:melon", + "minecraft:pumpkin", + "minecraft:carved_pumpkin", + "minecraft:jack_o_lantern" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json b/src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json new file mode 100644 index 000000000..dfdc26e22 --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle_shovel_harvestable.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "minecraft:melon", + "minecraft:pumpkin", + "minecraft:carved_pumpkin", + "minecraft:jack_o_lantern" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json b/src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json new file mode 100644 index 000000000..c38f1efd8 --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/turtle_sword_harvestable.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#minecraft:wool", + "minecraft:cobweb" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/computercraft/tags/blocks/wired_modem.json b/src/generated/resources/data/computercraft/tags/blocks/wired_modem.json new file mode 100644 index 000000000..10ade37b3 --- /dev/null +++ b/src/generated/resources/data/computercraft/tags/blocks/wired_modem.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "computercraft:cable", + "computercraft:wired_modem_full" + ] +} \ No newline at end of file diff --git a/src/main/java/dan200/computercraft/data/BlockTagsGenerator.java b/src/main/java/dan200/computercraft/data/BlockTagsGenerator.java new file mode 100644 index 000000000..0de559024 --- /dev/null +++ b/src/main/java/dan200/computercraft/data/BlockTagsGenerator.java @@ -0,0 +1,62 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.data; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.shared.Registry; +import net.minecraft.block.Blocks; +import net.minecraft.data.BlockTagsProvider; +import net.minecraft.data.DataGenerator; +import net.minecraft.tags.BlockTags; +import net.minecraftforge.common.data.ExistingFileHelper; + +import static dan200.computercraft.shared.ComputerCraftTags.Blocks.*; + +public class BlockTagsGenerator extends BlockTagsProvider +{ + public BlockTagsGenerator( DataGenerator generator, ExistingFileHelper helper ) + { + super( generator, ComputerCraft.MOD_ID, helper ); + } + + @Override + @SuppressWarnings( "unchecked" ) + protected void addTags() + { + // Items + tag( COMPUTER ).add( + Registry.ModBlocks.COMPUTER_NORMAL.get(), + Registry.ModBlocks.COMPUTER_ADVANCED.get(), + Registry.ModBlocks.COMPUTER_COMMAND.get() + ); + tag( TURTLE ).add( Registry.ModBlocks.TURTLE_NORMAL.get(), Registry.ModBlocks.TURTLE_ADVANCED.get() ); + tag( WIRED_MODEM ).add( Registry.ModBlocks.CABLE.get(), Registry.ModBlocks.WIRED_MODEM_FULL.get() ); + tag( MONITOR ).add( Registry.ModBlocks.MONITOR_NORMAL.get(), Registry.ModBlocks.MONITOR_ADVANCED.get() ); + + tag( TURTLE_ALWAYS_BREAKABLE ).addTags( BlockTags.LEAVES ).add( + Blocks.BAMBOO, Blocks.BAMBOO_SAPLING // Bamboo isn't instabreak for some odd reason. + ); + + tag( TURTLE_SHOVEL_BREAKABLE ).add( + Blocks.MELON, + Blocks.PUMPKIN, + Blocks.CARVED_PUMPKIN, + Blocks.JACK_O_LANTERN + ); + + tag( TURTLE_HOE_BREAKABLE ).addTags( + BlockTags.CROPS + ).add( + Blocks.CACTUS, + Blocks.MELON, + Blocks.PUMPKIN, + Blocks.CARVED_PUMPKIN, + Blocks.JACK_O_LANTERN + ); + + tag( TURTLE_SWORD_BREAKABLE ).addTags( BlockTags.WOOL ).add( Blocks.COBWEB ); + } +} diff --git a/src/main/java/dan200/computercraft/data/Generators.java b/src/main/java/dan200/computercraft/data/Generators.java index 476df7e6e..b90148790 100644 --- a/src/main/java/dan200/computercraft/data/Generators.java +++ b/src/main/java/dan200/computercraft/data/Generators.java @@ -7,6 +7,7 @@ package dan200.computercraft.data; import dan200.computercraft.shared.Registry; import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; @@ -20,9 +21,14 @@ public class Generators Registry.registerLoot(); DataGenerator generator = event.getGenerator(); - generator.addProvider( new Recipes( generator ) ); - generator.addProvider( new LootTables( generator ) ); - generator.addProvider( new Tags( generator, event.getExistingFileHelper() ) ); - generator.addProvider( new BlockModelProvider( generator, event.getExistingFileHelper() ) ); + ExistingFileHelper existingFiles = event.getExistingFileHelper(); + + generator.addProvider( new RecipeGenerator( generator ) ); + generator.addProvider( new LootTableGenerator( generator ) ); + generator.addProvider( new BlockModelProvider( generator, existingFiles ) ); + + BlockTagsGenerator blockTags = new BlockTagsGenerator( generator, existingFiles ); + generator.addProvider( blockTags ); + generator.addProvider( new ItemTagsGenerator( generator, blockTags, existingFiles ) ); } } diff --git a/src/main/java/dan200/computercraft/data/ItemTagsGenerator.java b/src/main/java/dan200/computercraft/data/ItemTagsGenerator.java new file mode 100644 index 000000000..b5ccf6495 --- /dev/null +++ b/src/main/java/dan200/computercraft/data/ItemTagsGenerator.java @@ -0,0 +1,42 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.data; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.shared.ComputerCraftTags.Blocks; +import dan200.computercraft.shared.Registry; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.ItemTagsProvider; +import net.minecraft.item.Item; +import net.minecraft.tags.ITag; +import net.minecraftforge.common.data.ExistingFileHelper; + +import static dan200.computercraft.shared.ComputerCraftTags.Items.*; + +public class ItemTagsGenerator extends ItemTagsProvider +{ + private static final ITag.INamedTag PIGLIN_LOVED = net.minecraft.tags.ItemTags.PIGLIN_LOVED; + + public ItemTagsGenerator( DataGenerator generator, BlockTagsGenerator blockTags, ExistingFileHelper helper ) + { + super( generator, blockTags, ComputerCraft.MOD_ID, helper ); + } + + @Override + protected void addTags() + { + copy( Blocks.COMPUTER, COMPUTER ); + copy( Blocks.TURTLE, TURTLE ); + tag( WIRED_MODEM ).add( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() ); + copy( Blocks.MONITOR, MONITOR ); + + tag( PIGLIN_LOVED ).add( + Registry.ModItems.COMPUTER_ADVANCED.get(), Registry.ModItems.TURTLE_ADVANCED.get(), + Registry.ModItems.WIRELESS_MODEM_ADVANCED.get(), Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(), + Registry.ModItems.MONITOR_ADVANCED.get() + ); + } +} diff --git a/src/main/java/dan200/computercraft/data/LootTables.java b/src/main/java/dan200/computercraft/data/LootTableGenerator.java similarity index 97% rename from src/main/java/dan200/computercraft/data/LootTables.java rename to src/main/java/dan200/computercraft/data/LootTableGenerator.java index d33a6d55a..d40f62317 100644 --- a/src/main/java/dan200/computercraft/data/LootTables.java +++ b/src/main/java/dan200/computercraft/data/LootTableGenerator.java @@ -25,9 +25,9 @@ import net.minecraftforge.fml.RegistryObject; import java.util.function.BiConsumer; -public class LootTables extends LootTableProvider +public class LootTableGenerator extends LootTableProvider { - public LootTables( DataGenerator generator ) + public LootTableGenerator( DataGenerator generator ) { super( generator ); } diff --git a/src/main/java/dan200/computercraft/data/Recipes.java b/src/main/java/dan200/computercraft/data/RecipeGenerator.java similarity index 92% rename from src/main/java/dan200/computercraft/data/Recipes.java rename to src/main/java/dan200/computercraft/data/RecipeGenerator.java index 8a85f8f86..e5cb790e6 100644 --- a/src/main/java/dan200/computercraft/data/Recipes.java +++ b/src/main/java/dan200/computercraft/data/RecipeGenerator.java @@ -6,7 +6,6 @@ package dan200.computercraft.data; import dan200.computercraft.ComputerCraft; -import dan200.computercraft.data.Tags.CCTags; import dan200.computercraft.shared.PocketUpgrades; import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.TurtleUpgrades; @@ -39,9 +38,12 @@ import javax.annotation.Nonnull; import java.util.Locale; import java.util.function.Consumer; -public class Recipes extends RecipeProvider +import static dan200.computercraft.shared.ComputerCraftTags.Items.COMPUTER; +import static dan200.computercraft.shared.ComputerCraftTags.Items.WIRED_MODEM; + +public class RecipeGenerator extends RecipeProvider { - public Recipes( DataGenerator generator ) + public RecipeGenerator( DataGenerator generator ) { super( generator ); } @@ -162,8 +164,8 @@ public class Recipes extends RecipeProvider .pattern( " # " ) .define( '#', Tags.Items.STONE ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) - .unlockedBy( "has_modem", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) + .unlockedBy( "has_modem", inventoryChange( WIRED_MODEM ) ) .save( add ); ShapedRecipeBuilder @@ -206,7 +208,7 @@ public class Recipes extends RecipeProvider .pattern( "#R#" ) .define( '#', Tags.Items.STONE ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -216,7 +218,7 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.STONE ) .define( 'G', Tags.Items.GLASS_PANES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -226,7 +228,7 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.INGOTS_GOLD ) .define( 'G', Tags.Items.GLASS_PANES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -237,7 +239,7 @@ public class Recipes extends RecipeProvider .define( '#', Tags.Items.STONE ) .define( 'A', Items.GOLDEN_APPLE ) .define( 'G', Tags.Items.GLASS_PANES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .unlockedBy( "has_apple", inventoryChange( Items.GOLDEN_APPLE ) ) .save( add ); @@ -249,7 +251,7 @@ public class Recipes extends RecipeProvider .define( '#', Tags.Items.INGOTS_GOLD ) .define( 'A', Items.GOLDEN_APPLE ) .define( 'G', Tags.Items.GLASS_PANES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .unlockedBy( "has_apple", inventoryChange( Items.GOLDEN_APPLE ) ) .save( add ); @@ -261,7 +263,7 @@ public class Recipes extends RecipeProvider .define( '#', Tags.Items.STONE ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) .define( 'D', Tags.Items.DYES ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -272,7 +274,7 @@ public class Recipes extends RecipeProvider .define( '#', Tags.Items.STONE ) .define( 'N', Blocks.NOTE_BLOCK ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -282,19 +284,19 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.STONE ) .define( 'R', Tags.Items.DUSTS_REDSTONE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .unlockedBy( "has_cable", inventoryChange( Registry.ModItems.CABLE.get() ) ) .save( add ); ShapelessRecipeBuilder .shapeless( Registry.ModBlocks.WIRED_MODEM_FULL.get() ) .requires( Registry.ModItems.WIRED_MODEM.get() ) - .unlockedBy( "has_modem", inventoryChange( CCTags.WIRED_MODEM ) ) + .unlockedBy( "has_modem", inventoryChange( WIRED_MODEM ) ) .save( add, new ResourceLocation( ComputerCraft.MOD_ID, "wired_modem_full_from" ) ); ShapelessRecipeBuilder .shapeless( Registry.ModItems.WIRED_MODEM.get() ) .requires( Registry.ModBlocks.WIRED_MODEM_FULL.get() ) - .unlockedBy( "has_modem", inventoryChange( CCTags.WIRED_MODEM ) ) + .unlockedBy( "has_modem", inventoryChange( WIRED_MODEM ) ) .save( add, new ResourceLocation( ComputerCraft.MOD_ID, "wired_modem_full_to" ) ); ShapedRecipeBuilder @@ -304,7 +306,7 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.STONE ) .define( 'E', Tags.Items.ENDER_PEARLS ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .save( add ); ShapedRecipeBuilder @@ -314,7 +316,7 @@ public class Recipes extends RecipeProvider .pattern( "###" ) .define( '#', Tags.Items.INGOTS_GOLD ) .define( 'E', Items.ENDER_EYE ) - .unlockedBy( "has_computer", inventoryChange( CCTags.COMPUTER ) ) + .unlockedBy( "has_computer", inventoryChange( COMPUTER ) ) .unlockedBy( "has_wireless", inventoryChange( Registry.ModBlocks.WIRELESS_MODEM_NORMAL.get() ) ) .save( add ); diff --git a/src/main/java/dan200/computercraft/data/Tags.java b/src/main/java/dan200/computercraft/data/Tags.java deleted file mode 100644 index ae74778b2..000000000 --- a/src/main/java/dan200/computercraft/data/Tags.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ -package dan200.computercraft.data; - -import dan200.computercraft.ComputerCraft; -import dan200.computercraft.shared.Registry; -import net.minecraft.data.BlockTagsProvider; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.ItemTagsProvider; -import net.minecraft.item.Item; -import net.minecraft.tags.ITag; -import net.minecraft.tags.ItemTags; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.data.ExistingFileHelper; - -import static dan200.computercraft.data.Tags.CCTags.*; - -public class Tags extends ItemTagsProvider -{ - private static final ITag.INamedTag PIGLIN_LOVED = ItemTags.PIGLIN_LOVED; - - public static class CCTags - { - public static final ITag.INamedTag COMPUTER = item( "computer" ); - public static final ITag.INamedTag TURTLE = item( "turtle" ); - public static final ITag.INamedTag WIRED_MODEM = item( "wired_modem" ); - public static final ITag.INamedTag MONITOR = item( "monitor" ); - } - - public Tags( DataGenerator generator, ExistingFileHelper helper ) - { - super( generator, new BlockTagsProvider( generator, ComputerCraft.MOD_ID, helper ), ComputerCraft.MOD_ID, helper ); - } - - @Override - protected void addTags() - { - tag( COMPUTER ).add( - Registry.ModItems.COMPUTER_NORMAL.get(), - Registry.ModItems.COMPUTER_ADVANCED.get(), - Registry.ModItems.COMPUTER_COMMAND.get() - ); - tag( TURTLE ).add( Registry.ModItems.TURTLE_NORMAL.get(), Registry.ModItems.TURTLE_ADVANCED.get() ); - tag( WIRED_MODEM ).add( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() ); - tag( MONITOR ).add( Registry.ModItems.MONITOR_NORMAL.get(), Registry.ModItems.MONITOR_ADVANCED.get() ); - - tag( PIGLIN_LOVED ).add( - Registry.ModItems.COMPUTER_ADVANCED.get(), Registry.ModItems.TURTLE_ADVANCED.get(), - Registry.ModItems.WIRELESS_MODEM_ADVANCED.get(), Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(), - Registry.ModItems.MONITOR_ADVANCED.get() - ); - } - - private static ITag.INamedTag item( String name ) - { - return ItemTags.bind( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() ); - } -} diff --git a/src/main/java/dan200/computercraft/shared/ComputerCraftTags.java b/src/main/java/dan200/computercraft/shared/ComputerCraftTags.java new file mode 100644 index 000000000..744f0ab1b --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/ComputerCraftTags.java @@ -0,0 +1,48 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.shared; + +import dan200.computercraft.ComputerCraft; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ITag; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.ResourceLocation; + +public class ComputerCraftTags +{ + public static class Items + { + public static final ITag.INamedTag COMPUTER = make( "computer" ); + public static final ITag.INamedTag TURTLE = make( "turtle" ); + public static final ITag.INamedTag WIRED_MODEM = make( "wired_modem" ); + public static final ITag.INamedTag MONITOR = make( "monitor" ); + + private static ITag.INamedTag make( String name ) + { + return ItemTags.bind( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() ); + } + } + + public static class Blocks + { + public static final ITag.INamedTag COMPUTER = make( "computer" ); + public static final ITag.INamedTag TURTLE = make( "turtle" ); + public static final ITag.INamedTag WIRED_MODEM = make( "wired_modem" ); + public static final ITag.INamedTag MONITOR = make( "monitor" ); + + public static final ITag.INamedTag TURTLE_ALWAYS_BREAKABLE = make( "turtle_always_breakable" ); + public static final ITag.INamedTag TURTLE_SHOVEL_BREAKABLE = make( "turtle_shovel_harvestable" ); + public static final ITag.INamedTag TURTLE_SWORD_BREAKABLE = make( "turtle_sword_harvestable" ); + public static final ITag.INamedTag TURTLE_HOE_BREAKABLE = make( "turtle_hoe_harvestable" ); + + private static ITag.INamedTag make( String name ) + { + return BlockTags.bind( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() ); + } + } +} diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java index 9360aacbd..5bd78218c 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleHoe.java @@ -9,16 +9,17 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleVerb; +import dan200.computercraft.shared.ComputerCraftTags; import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand; import dan200.computercraft.shared.turtle.core.TurtlePlayer; import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; import javax.annotation.Nonnull; @@ -40,17 +41,15 @@ public class TurtleHoe extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected TurtleCommandResult checkBlockBreakable( BlockState state, World world, BlockPos pos, TurtlePlayer player ) { - if( !super.canBreakBlock( state, world, pos, player ) ) return false; + TurtleCommandResult result = super.checkBlockBreakable( state, world, pos, player ); + if( !result.isSuccess() ) return result; - Material material = state.getMaterial(); - return material == Material.PLANT || - material == Material.CACTUS || - material == Material.VEGETABLE || - material == Material.LEAVES || - material == Material.WATER_PLANT || - material == Material.REPLACEABLE_PLANT; + return state.isToolEffective( ToolType.HOE ) + || state.is( ComputerCraftTags.Blocks.TURTLE_HOE_BREAKABLE ) + || isTriviallyBreakable( world, pos, state ) + ? result : INEFFECTIVE; } @Nonnull diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java index b7e5513e8..2858383f4 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleShovel.java @@ -9,16 +9,17 @@ import dan200.computercraft.api.turtle.ITurtleAccess; import dan200.computercraft.api.turtle.TurtleCommandResult; import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.api.turtle.TurtleVerb; +import dan200.computercraft.shared.ComputerCraftTags; import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand; import dan200.computercraft.shared.turtle.core.TurtlePlayer; import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; import javax.annotation.Nonnull; @@ -40,21 +41,15 @@ public class TurtleShovel extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected TurtleCommandResult checkBlockBreakable( BlockState state, World world, BlockPos pos, TurtlePlayer player ) { - if( !super.canBreakBlock( state, world, pos, player ) ) return false; + TurtleCommandResult result = super.checkBlockBreakable( state, world, pos, player ); + if( !result.isSuccess() ) return result; - Material material = state.getMaterial(); - return material == Material.DIRT || - material == Material.SAND || - material == Material.TOP_SNOW || - material == Material.CLAY || - material == Material.SNOW || - material == Material.PLANT || - material == Material.CACTUS || - material == Material.VEGETABLE || - material == Material.LEAVES || - material == Material.REPLACEABLE_PLANT; + return state.isToolEffective( ToolType.SHOVEL ) + || state.is( ComputerCraftTags.Blocks.TURTLE_SHOVEL_BREAKABLE ) + || isTriviallyBreakable( world, pos, state ) + ? result : INEFFECTIVE; } @Nonnull diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java index e1cb4f552..aa6b869d4 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSword.java @@ -5,9 +5,10 @@ */ package dan200.computercraft.shared.turtle.upgrades; +import dan200.computercraft.api.turtle.TurtleCommandResult; +import dan200.computercraft.shared.ComputerCraftTags; import dan200.computercraft.shared.turtle.core.TurtlePlayer; import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -32,16 +33,14 @@ public class TurtleSword extends TurtleTool } @Override - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected TurtleCommandResult checkBlockBreakable( BlockState state, World world, BlockPos pos, TurtlePlayer player ) { - if( !super.canBreakBlock( state, world, pos, player ) ) return false; + TurtleCommandResult result = super.checkBlockBreakable( state, world, pos, player ); + if( !result.isSuccess() ) return result; - Material material = state.getMaterial(); - return material == Material.PLANT || - material == Material.LEAVES || - material == Material.REPLACEABLE_PLANT || - material == Material.WOOL || - material == Material.WEB; + return state.is( ComputerCraftTags.Blocks.TURTLE_SWORD_BREAKABLE ) + || isTriviallyBreakable( world, pos, state ) + ? result : INEFFECTIVE; } @Override diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java index 37c9ab192..194fc0efc 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleTool.java @@ -10,6 +10,7 @@ import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.turtle.*; import dan200.computercraft.api.turtle.event.TurtleAttackEvent; import dan200.computercraft.api.turtle.event.TurtleBlockEvent; +import dan200.computercraft.shared.ComputerCraftTags; import dan200.computercraft.shared.TurtlePermissions; import dan200.computercraft.shared.turtle.core.TurtleBrain; import dan200.computercraft.shared.turtle.core.TurtlePlayer; @@ -34,6 +35,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.TransformationMatrix; import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -48,6 +50,9 @@ import java.util.function.Function; public class TurtleTool extends AbstractTurtleUpgrade { + protected static final TurtleCommandResult UNBREAKABLE = TurtleCommandResult.failure( "Unbreakable block detected" ); + protected static final TurtleCommandResult INEFFECTIVE = TurtleCommandResult.failure( "Cannot break block with this tool" ); + protected final ItemStack item; public TurtleTool( ResourceLocation id, String adjective, Item item ) @@ -109,13 +114,14 @@ public class TurtleTool extends AbstractTurtleUpgrade } } - protected boolean canBreakBlock( BlockState state, World world, BlockPos pos, TurtlePlayer player ) + protected TurtleCommandResult checkBlockBreakable( BlockState state, World world, BlockPos pos, TurtlePlayer player ) { Block block = state.getBlock(); return !state.isAir() && block != Blocks.BEDROCK && state.getDestroyProgress( player, world, pos ) > 0 - && block.canEntityDestroy( state, world, pos, player ); + && block.canEntityDestroy( state, world, pos, player ) + ? TurtleCommandResult.success() : UNBREAKABLE; } protected float getDamageMultiplier() @@ -166,6 +172,7 @@ public class TurtleTool extends AbstractTurtleUpgrade { float damage = (float) turtlePlayer.getAttributeValue( Attributes.ATTACK_DAMAGE ); damage *= getDamageMultiplier(); + ComputerCraft.log.info( "Dealing {} damage", damage ); if( damage > 0.0f ) { DamageSource source = DamageSource.playerAttack( turtlePlayer ); @@ -238,10 +245,8 @@ public class TurtleTool extends AbstractTurtleUpgrade } // Check if we can break the block - if( !canBreakBlock( state, world, blockPosition, turtlePlayer ) ) - { - return TurtleCommandResult.failure( "Unbreakable block detected" ); - } + TurtleCommandResult breakable = checkBlockBreakable( state, world, blockPosition, turtlePlayer ); + if( !breakable.isSuccess() ) return breakable; // Fire the dig event, checking whether it was cancelled. TurtleBlockEvent.Dig digEvent = new TurtleBlockEvent.Dig( turtle, turtlePlayer, world, blockPosition, state, this, side ); @@ -302,4 +307,11 @@ public class TurtleTool extends AbstractTurtleUpgrade } ) ); } } + + protected boolean isTriviallyBreakable( IWorldReader reader, BlockPos pos, BlockState state ) + { + return state.is( ComputerCraftTags.Blocks.TURTLE_ALWAYS_BREAKABLE ) + // Allow breaking any "instabreak" block. + || (state.getDestroySpeed( reader, pos ) == 0 && state.getHarvestLevel() <= 0); + } }