Combit/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java

72 lines
3.3 KiB
Java

package io.gitlab.jfronny.combit.mixin;
import io.gitlab.jfronny.combit.CombitConfig;
import net.minecraft.block.Block;
import net.minecraft.component.ComponentMap;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.AttributeModifierSlot;
import net.minecraft.component.type.AttributeModifiersComponent;
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.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.ArrayList;
import java.util.List;
@Mixin(MiningToolItem.class)
public abstract class MiningToolItemMixin extends ToolItem {
public MiningToolItemMixin(ToolMaterial material, Settings settings) {
super(material, settings);
}
@Inject(at = @At("RETURN"), method = "<init>(Lnet/minecraft/item/ToolMaterial;Lnet/minecraft/registry/tag/TagKey;Lnet/minecraft/item/Item$Settings;)V")
private void modifyAttackDamage(ToolMaterial material, TagKey<Block> effectiveBlocks, Settings settings, CallbackInfo ci) {
double factor = ((MiningToolItem)(Object)this) instanceof AxeItem ? CombitConfig.axeAttackDamageFactor : CombitConfig.weaponAttackDamageFactor;
if (factor >= 0) {
ItemSettingsAccessor isa = (ItemSettingsAccessor) settings;
ComponentMap.Builder cb = isa.combit$getComponents();
if (cb == null) {
cb = ComponentMap.builder().addAll(DataComponentTypes.DEFAULT_ITEM_COMPONENTS);
isa.combit$setComponents(cb);
}
ComponentMapBuilderAccessor cbi = (ComponentMapBuilderAccessor) cb;
List<AttributeModifiersComponent.Entry> entries = new ArrayList<>();
boolean showInTooltip = false;
AttributeModifiersComponent amcOrig = (AttributeModifiersComponent) cbi.combit$getComponents().get(DataComponentTypes.ATTRIBUTE_MODIFIERS);
if (amcOrig != null) {
entries.addAll(amcOrig.modifiers());
showInTooltip = amcOrig.showInTooltip();
}
AttributeModifiersComponent.Entry damageEntry = null;
for (AttributeModifiersComponent.Entry entry : entries) {
if (entry.attribute().equals(EntityAttributes.GENERIC_ATTACK_DAMAGE)) {
damageEntry = entry;
}
}
double damage = 5;
if (damageEntry != null) {
entries.remove(damageEntry);
damage = damageEntry.modifier().value();
}
damageEntry = new AttributeModifiersComponent.Entry(
EntityAttributes.GENERIC_ATTACK_DAMAGE,
new EntityAttributeModifier(
ATTACK_DAMAGE_MODIFIER_ID,
"Tool modifier",
damage * factor,
EntityAttributeModifier.Operation.ADD_VALUE),
AttributeModifierSlot.MAINHAND);
entries.add(damageEntry);
cb.add(DataComponentTypes.ATTRIBUTE_MODIFIERS, new AttributeModifiersComponent(entries, showInTooltip));
}
}
}