diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 4a5e602b..a57b4011 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -1,6 +1,12 @@ package ru.betterend; +import java.util.Arrays; + import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; +import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; +import net.minecraft.item.Items; import net.minecraft.util.Identifier; import ru.betterend.config.MainConfig; import ru.betterend.recipe.AlloyingRecipes; @@ -12,6 +18,7 @@ import ru.betterend.registry.BlockTagRegistry; import ru.betterend.registry.EntityRegistry; import ru.betterend.registry.FeatureRegistry; import ru.betterend.registry.ItemRegistry; +import ru.betterend.registry.ItemTagRegistry; import ru.betterend.registry.SoundsRegistry; import ru.betterend.util.Logger; import ru.betterend.world.generator.BetterEndBiomeSource; @@ -33,6 +40,7 @@ public class BetterEnd implements ModInitializer { EntityRegistry.register(); BiomeRegistry.register(); BetterEndBiomeSource.register(); + ItemTagRegistry.register(); BlockTagRegistry.register(); CraftingRecipes.register(); AlloyingRecipes.register(); diff --git a/src/main/java/ru/betterend/blocks/BlockOre.java b/src/main/java/ru/betterend/blocks/BlockOre.java index 28075413..2d5e02fe 100644 --- a/src/main/java/ru/betterend/blocks/BlockOre.java +++ b/src/main/java/ru/betterend/blocks/BlockOre.java @@ -39,11 +39,18 @@ public class BlockOre extends OreBlock { public List getDroppedStacks(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.get(LootContextParameters.TOOL); if (tool != null && tool.isEffectiveOn(state)) { + int count = 0; int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); - int min = MathHelper.clamp(minCount + fortune, 0, maxCount); - if (min == maxCount) - return Lists.newArrayList(new ItemStack(dropItem, maxCount)); - int count = MHelper.randRange(min, maxCount, MHelper.RANDOM); + if (fortune > 0) { + int min = MathHelper.clamp(minCount + fortune, minCount, maxCount); + int max = maxCount + (fortune / Enchantments.FORTUNE.getMaxLevel()); + if (min == max) { + return Lists.newArrayList(new ItemStack(dropItem, max)); + } + count = MHelper.randRange(min, max, MHelper.RANDOM); + } else { + count = MHelper.randRange(minCount, maxCount, MHelper.RANDOM); + } return Lists.newArrayList(new ItemStack(dropItem, count)); } return Lists.newArrayList(); diff --git a/src/main/java/ru/betterend/item/EndHammer.java b/src/main/java/ru/betterend/item/EndHammer.java index 8bf84b0f..f19620ee 100644 --- a/src/main/java/ru/betterend/item/EndHammer.java +++ b/src/main/java/ru/betterend/item/EndHammer.java @@ -11,6 +11,7 @@ import io.netty.util.internal.ThreadLocalRandom; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.fabricmc.fabric.api.tool.attribute.v1.ToolManager; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.Material; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; @@ -32,7 +33,6 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool { public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = MathHelper.randomUuid(ThreadLocalRandom.current()); private final Multimap attributeModifiers; - private ItemStack itemStack; public EndHammer(ToolMaterial material, float attackDamage, float attackSpeed, double knockback, Settings settings) { super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); @@ -42,7 +42,6 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool { builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, "Weapon modifier", attackSpeed, EntityAttributeModifier.Operation.ADDITION)); builder.put(EntityAttributes.GENERIC_ATTACK_KNOCKBACK, new EntityAttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, EntityAttributeModifier.Operation.ADDITION)); this.attributeModifiers = builder.build(); - this.itemStack = new ItemStack(this); } @Override @@ -73,11 +72,25 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool { @Override public float getMiningSpeedMultiplier(ItemStack stack, BlockState state) { if (state.getMaterial().equals(Material.GLASS)) { - return 10.0F; + return this.getMaterial().getMiningSpeedMultiplier() * 2.0F; + } + if (isEffectiveOn(state)) { + float mult = 1.0F; + if (state.isOf(Blocks.DIAMOND_BLOCK) || state.isOf(Blocks.EMERALD_BLOCK) || state.isOf(Blocks.LAPIS_BLOCK) || state.isOf(Blocks.REDSTONE_BLOCK)) { + mult = this.getMaterial().getMiningSpeedMultiplier(); + } else { + mult = this.getMaterial().getMiningSpeedMultiplier() / 2.0F; + } + return mult > 1.0F ? mult : 1.0F; } return 1.0F; } + @Override + public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { + return ToolManager.handleBreakingSpeed(state, stack, user); + } + @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { return this.getMaterial().getMiningLevel(); @@ -88,10 +101,20 @@ public class EndHammer extends MiningToolItem implements DynamicAttributeTool { if (state.getMaterial().equals(Material.GLASS)) { return true; } - if (!state.getMaterial().equals(Material.STONE)) { + if (!state.isOf(Blocks.REDSTONE_BLOCK) && !state.isOf(Blocks.DIAMOND_BLOCK) && !state.isOf(Blocks.EMERALD_BLOCK) && !state.isOf(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { return false; } - return ToolManager.handleIsEffectiveOnIgnoresVanilla(state, itemStack, null); + int level = this.getMaterial().getMiningLevel(); + if (state.isOf(Blocks.IRON_ORE) || state.isOf(Blocks.LAPIS_BLOCK) || state.isOf(Blocks.LAPIS_ORE)) { + return level >= 1; + } + if (state.isOf(Blocks.DIAMOND_BLOCK) && !state.isOf(Blocks.DIAMOND_ORE) || state.isOf(Blocks.EMERALD_ORE) || state.isOf(Blocks.EMERALD_BLOCK) || state.isOf(Blocks.GOLD_ORE) || state.isOf(Blocks.REDSTONE_ORE)) { + return level >= 2; + } + if (state.isOf(Blocks.OBSIDIAN) || state.isOf(Blocks.CRYING_OBSIDIAN) || state.isOf(Blocks.RESPAWN_ANCHOR) || state.isOf(Blocks.ANCIENT_DEBRIS)) { + return level >= 3; + } + return true; } @Override diff --git a/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java new file mode 100644 index 00000000..8c0b3358 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/AbstractBlockMixin.java @@ -0,0 +1,51 @@ +package ru.betterend.mixin.common; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.google.common.collect.Lists; + +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.util.math.MathHelper; +import ru.betterend.item.EndHammer; +import ru.betterend.util.MHelper; + +@Mixin(AbstractBlock.class) +public abstract class AbstractBlockMixin { + + @Inject(method = "getDroppedStacks", at = @At("HEAD"), cancellable = true) + public void getDroppedStacks(BlockState state, LootContext.Builder builder, CallbackInfoReturnable> info) { + if (state.isOf(Blocks.GLOWSTONE)) { + ItemStack tool = builder.get(LootContextParameters.TOOL); + if (tool != null && tool.getItem() instanceof EndHammer) { + int min = 3; + int max = 4; + int count = 0; + int fortune = EnchantmentHelper.getLevel(Enchantments.FORTUNE, tool); + if (fortune > 0) { + fortune /= Enchantments.FORTUNE.getMaxLevel(); + min = MathHelper.clamp(min + fortune, min, max); + if (min == max) { + info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, max))); + info.cancel(); + } + } + count = MHelper.randRange(min, max, MHelper.RANDOM); + info.setReturnValue(Lists.newArrayList(new ItemStack(Items.GLOWSTONE_DUST, count))); + info.cancel(); + } + } + } +} diff --git a/src/main/java/ru/betterend/registry/ItemRegistry.java b/src/main/java/ru/betterend/registry/ItemRegistry.java index c1c1c209..1877ac1e 100644 --- a/src/main/java/ru/betterend/registry/ItemRegistry.java +++ b/src/main/java/ru/betterend/registry/ItemRegistry.java @@ -88,6 +88,8 @@ public class ItemRegistry { TagHelper.addTag((Tag.Identified) FabricToolTags.AXES, item); } else if (item instanceof EndHoe) { TagHelper.addTag((Tag.Identified) FabricToolTags.HOES, item); + } else if (item instanceof EndHammer) { + TagHelper.addTag((Tag.Identified) ItemTagRegistry.HAMMERS, item); } return item; diff --git a/src/main/java/ru/betterend/registry/ItemTagRegistry.java b/src/main/java/ru/betterend/registry/ItemTagRegistry.java new file mode 100644 index 00000000..20620e69 --- /dev/null +++ b/src/main/java/ru/betterend/registry/ItemTagRegistry.java @@ -0,0 +1,36 @@ +package ru.betterend.registry; + +import java.util.Arrays; + +import net.fabricmc.fabric.api.tag.TagRegistry; +import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; +import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; +import net.minecraft.item.Item; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; +import ru.betterend.BetterEnd; + +public class ItemTagRegistry { + public final static Tag HAMMERS = registerFabricItemTag("hammer"); + + public static Tag registerItemTag(String name) { + return TagRegistry.item(BetterEnd.makeID(name)); + } + + public static Tag registerFabricItemTag(String name) { + return TagRegistry.item(new Identifier("fabric", name)); + } + + public static void register() { + ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler( + Arrays.asList( + ItemRegistry.IRON_HAMMER, + ItemRegistry.GOLDEN_HAMMER, + ItemRegistry.DIAMOND_HAMMER, + ItemRegistry.NETHERITE_HAMMER, + ItemRegistry.TERMINITE_HAMMER, + ItemRegistry.AETERNIUM_HAMMER + ) + )); + } +} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 0bd577f9..0d868909 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -10,6 +10,7 @@ "TagGroupLoaderMixin", "CraftingScreenHandlerMixin", "GenerationSettingsMixin", + "AbstractBlockMixin", "LivingEntityMixin", "BiomeMixin" ],