package io.gitlab.jfronny.combit.mixin; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import io.gitlab.jfronny.combit.CombitConfig; import net.minecraft.block.Block; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.item.*; import net.minecraft.registry.tag.TagKey; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MiningToolItem.class) public abstract class MiningToolItemMixin extends ToolItem { @Shadow @Final @Mutable private Multimap attributeModifiers; @Shadow @Final @Mutable private float attackDamage; public MiningToolItemMixin(ToolMaterial material, Settings settings) { super(material, settings); } @Inject(at = @At("RETURN"), method = "(FFLnet/minecraft/item/ToolMaterial;Lnet/minecraft/registry/tag/TagKey;Lnet/minecraft/item/Item$Settings;)V") private void modifyAttackDamage(float attackDamage, float attackSpeed, ToolMaterial material, TagKey effectiveBlocks, Settings settings, CallbackInfo ci) { double factor = ((MiningToolItem)(Object)this) instanceof AxeItem ? CombitConfig.axeAttackDamageFactor : CombitConfig.weaponAttackDamageFactor; if (factor >= 0) { this.attackDamage *= factor; ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); builder.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Tool modifier", this.attackDamage, EntityAttributeModifier.Operation.ADDITION)); this.attributeModifiers.forEach((k, v) -> { if (!k.getTranslationKey().equals(EntityAttributes.GENERIC_ATTACK_DAMAGE.getTranslationKey())) { builder.put(k, v); } }); this.attributeModifiers = builder.build(); } } }