From 61f9854cd5d2bebff9182cdfcd7211260df9c567 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 18 Mar 2022 15:34:18 +0100 Subject: [PATCH] Some mining/drop related fixes --- .../java/ru/bclib/blocks/BaseGlassBlock.java | 63 +++++++++++++++++++ .../java/ru/bclib/blocks/BaseOreBlock.java | 48 +++++++------- .../java/ru/bclib/items/tool/BaseAxeItem.java | 1 - 3 files changed, 88 insertions(+), 24 deletions(-) create mode 100644 src/main/java/ru/bclib/blocks/BaseGlassBlock.java diff --git a/src/main/java/ru/bclib/blocks/BaseGlassBlock.java b/src/main/java/ru/bclib/blocks/BaseGlassBlock.java new file mode 100644 index 00000000..a7766e36 --- /dev/null +++ b/src/main/java/ru/bclib/blocks/BaseGlassBlock.java @@ -0,0 +1,63 @@ +package ru.bclib.blocks; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.bclib.client.render.BCLRenderLayer; +import ru.bclib.interfaces.RenderLayerProvider; +import ru.bclib.interfaces.tools.AddMineablePickaxe; + +import java.util.Collections; +import java.util.List; + +public class BaseGlassBlock extends BaseBlockNotFull implements AddMineablePickaxe, RenderLayerProvider { + public BaseGlassBlock(Block block) { + this(block, 0.3f); + } + public BaseGlassBlock(Block block, float resistance) { + super(FabricBlockSettings.copyOf(block) + .resistance(resistance) + .nonOpaque() + .isSuffocating((arg1, arg2, arg3) -> false) + .isViewBlocking((arg1, arg2, arg3) -> false)); + } + + @Environment(EnvType.CLIENT) + public float getShadeBrightness(BlockState state, BlockGetter view, BlockPos pos) { + return 1.0F; + } + + @Override + public boolean propagatesSkylightDown(BlockState state, BlockGetter view, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public boolean skipRendering(BlockState state, BlockState neighbor, Direction facing) { + return neighbor.getBlock() == this ? true : super.skipRendering(state, neighbor, facing); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.emptyList(); + } + + @Override + public BCLRenderLayer getRenderLayer() { + return BCLRenderLayer.TRANSLUCENT; + } +} diff --git a/src/main/java/ru/bclib/blocks/BaseOreBlock.java b/src/main/java/ru/bclib/blocks/BaseOreBlock.java index 5b3609d7..ceb8fe03 100644 --- a/src/main/java/ru/bclib/blocks/BaseOreBlock.java +++ b/src/main/java/ru/bclib/blocks/BaseOreBlock.java @@ -7,6 +7,7 @@ import net.minecraft.util.Mth; import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TieredItem; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.ItemLike; @@ -34,6 +35,7 @@ public class BaseOreBlock extends OreBlock implements BlockModelProvider { private final Supplier dropItem; private final int minCount; private final int maxCount; + private final int miningLevel; public BaseOreBlock(Supplier drop, int minCount, int maxCount, int experience) { this(drop, minCount, maxCount, experience, 0); @@ -56,16 +58,11 @@ public class BaseOreBlock extends OreBlock implements BlockModelProvider { } public BaseOreBlock(Properties properties, Supplier drop, int minCount, int maxCount, int experience, int miningLevel) { - super(makeProps(properties, miningLevel), UniformInt.of(experience>0?1:0, experience)); + super(properties, UniformInt.of(experience>0?1:0, experience)); this.dropItem = drop; this.minCount = minCount; this.maxCount = maxCount; - } - - private static Properties makeProps(Properties properties, int level){ - //TODO: 1.18.2 make sure this works with the new tag system - //FabricBlockInternals.computeExtraData(properties).addMiningLevel(FabricToolTags.PICKAXES, level); - return properties; + this.miningLevel = miningLevel; } @Override @@ -74,30 +71,35 @@ public class BaseOreBlock extends OreBlock implements BlockModelProvider { return LootUtil .getDrops(this, state, builder) .orElseGet( - ()->BaseOreBlock.getDroppedItems(this, dropItem.get(), maxCount, minCount, state, builder) + ()->BaseOreBlock.getDroppedItems(this, dropItem.get(), maxCount, minCount, miningLevel, state, builder) ); } - public static List getDroppedItems(ItemLike block, Item dropItem, int maxCount, int minCount, BlockState state, LootContext.Builder builder) { + public static List getDroppedItems(ItemLike block, Item dropItem, int maxCount, int minCount, int miningLevel, BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null && tool.isCorrectToolForDrops(state)) { - if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(block)); + boolean canMine = miningLevel==0; + if (tool.getItem() instanceof TieredItem tired) { + canMine = tired.getTier().getLevel()>=miningLevel; } - int count; - int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); - if (enchantment > 0) { - int min = Mth.clamp(minCount + enchantment, minCount, maxCount); - int max = maxCount + (enchantment / Enchantments.BLOCK_FORTUNE.getMaxLevel()); - if (min == max) { - return Collections.singletonList(new ItemStack(dropItem, max)); + if (canMine) { + if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(block)); } - count = MHelper.randRange(min, max, MHelper.RANDOM); + int count; + int enchantment = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); + if (enchantment > 0) { + int min = Mth.clamp(minCount + enchantment, minCount, maxCount); + int max = maxCount + (enchantment / Enchantments.BLOCK_FORTUNE.getMaxLevel()); + if (min == max) { + return Collections.singletonList(new ItemStack(dropItem, max)); + } + count = MHelper.randRange(min, max, MHelper.RANDOM); + } else { + count = MHelper.randRange(minCount, maxCount, MHelper.RANDOM); + } + return Collections.singletonList(new ItemStack(dropItem, count)); } - else { - count = MHelper.randRange(minCount, maxCount, MHelper.RANDOM); - } - return Collections.singletonList(new ItemStack(dropItem, count)); } return Collections.emptyList(); } diff --git a/src/main/java/ru/bclib/items/tool/BaseAxeItem.java b/src/main/java/ru/bclib/items/tool/BaseAxeItem.java index 32c6d0b3..bcac32bd 100644 --- a/src/main/java/ru/bclib/items/tool/BaseAxeItem.java +++ b/src/main/java/ru/bclib/items/tool/BaseAxeItem.java @@ -9,7 +9,6 @@ import net.minecraft.world.item.Tier; import ru.bclib.client.models.ModelsHelper; import ru.bclib.interfaces.ItemModelProvider; -//TODO: 1.18.2 See if mining speed is still ok. public class BaseAxeItem extends AxeItem implements ItemModelProvider { public BaseAxeItem(Tier material, float attackDamage, float attackSpeed, Properties settings) { super(material, attackDamage, attackSpeed, settings);