diff --git a/build.gradle.kts b/build.gradle.kts index acdc4de..78122ef 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,16 +1,16 @@ plugins { - id("jfmod") version "1.5-SNAPSHOT" + id("jfmod") version "1.6-SNAPSHOT" } allprojects { group = "io.gitlab.jfronny" } base.archivesName = "combit" -val fabricVersion = "0.91.1+1.20.4" jfMod { - minecraftVersion = "1.20.4" + minecraftVersion = "1.20.5" yarn("build.1") - loaderVersion = "0.15.0" - libJfVersion = "3.14.1" + loaderVersion = "0.15.10" + libJfVersion = "3.15.5" + fabricApiVersion = "0.97.6+1.20.5" modrinth { projectId = "combit" @@ -26,11 +26,15 @@ jfMod { } dependencies { - modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v2:${jfMod.libJfVersion.get()}") - modImplementation(fabricApi.module("fabric-api-base", fabricVersion)) + modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v2") + modImplementation("net.fabricmc.fabric-api:fabric-api-base") // Dev env - modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-ui-tiny:${jfMod.libJfVersion.get()}") - modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil:${jfMod.libJfVersion.get()}") - modLocalRuntime("com.terraformersmc:modmenu:9.0.0-pre.1") + modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-ui-tiny") + modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil") + modLocalRuntime("com.terraformersmc:modmenu:10.0.0-beta.1") + // for modmenu + modLocalRuntime("net.fabricmc.fabric-api:fabric-resource-loader-v0") + modLocalRuntime("net.fabricmc.fabric-api:fabric-screen-api-v1") + modLocalRuntime("net.fabricmc.fabric-api:fabric-key-binding-api-v1") } diff --git a/src/client/java/io/gitlab/jfronny/combit/mixin/InGameHudMixin.java b/src/client/java/io/gitlab/jfronny/combit/mixin/InGameHudMixin.java index 8270f02..f7fe0c7 100644 --- a/src/client/java/io/gitlab/jfronny/combit/mixin/InGameHudMixin.java +++ b/src/client/java/io/gitlab/jfronny/combit/mixin/InGameHudMixin.java @@ -15,16 +15,16 @@ public class InGameHudMixin { @Shadow @Final private MinecraftClient client; private AttackIndicator combit$attackIndicator; - @Inject(at = @At("HEAD"), method = "renderCrosshair(Lnet/minecraft/client/gui/DrawContext;)V") - private void renderCrosshair(DrawContext context, CallbackInfo info) { + @Inject(at = @At("HEAD"), method = "renderCrosshair(Lnet/minecraft/client/gui/DrawContext;F)V") + private void renderCrosshair(DrawContext context, float tickDelta, CallbackInfo info) { if (CombitConfig.cooldownProgressOverride >= 0) { combit$attackIndicator = this.client.options.getAttackIndicator().getValue(); this.client.options.getAttackIndicator().setValue(AttackIndicator.OFF); } } - @Inject(at = @At("RETURN"), method = "renderCrosshair(Lnet/minecraft/client/gui/DrawContext;)V") - private void renderCrosshairPost(DrawContext context, CallbackInfo info) { + @Inject(at = @At("RETURN"), method = "renderCrosshair(Lnet/minecraft/client/gui/DrawContext;F)V") + private void renderCrosshairPost(DrawContext context, float tickDelta, CallbackInfo info) { if (CombitConfig.cooldownProgressOverride >= 0) { this.client.options.getAttackIndicator().setValue(combit$attackIndicator); } diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/ComponentMapBuilderAccessor.java b/src/main/java/io/gitlab/jfronny/combit/mixin/ComponentMapBuilderAccessor.java new file mode 100644 index 0000000..ed91c4a --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/ComponentMapBuilderAccessor.java @@ -0,0 +1,13 @@ +package io.gitlab.jfronny.combit.mixin; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectMap; +import net.minecraft.component.ComponentMap; +import net.minecraft.component.DataComponentType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ComponentMap.Builder.class) +public interface ComponentMapBuilderAccessor { + @Accessor("components") Reference2ObjectMap, Object> combit$getComponents(); + @Accessor("components") void combit$setComponents(Reference2ObjectMap, Object> components); +} diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/ItemSettingsAccessor.java b/src/main/java/io/gitlab/jfronny/combit/mixin/ItemSettingsAccessor.java new file mode 100644 index 0000000..9f35dc7 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/ItemSettingsAccessor.java @@ -0,0 +1,12 @@ +package io.gitlab.jfronny.combit.mixin; + +import net.minecraft.component.ComponentMap; +import net.minecraft.item.Item; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Item.Settings.class) +public interface ItemSettingsAccessor { + @Accessor("components") ComponentMap.Builder combit$getComponents(); + @Accessor("components") void combit$setComponents(ComponentMap.Builder components); +} diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/LivingEntityMixin.java b/src/main/java/io/gitlab/jfronny/combit/mixin/LivingEntityMixin.java index f639ee3..39f6429 100644 --- a/src/main/java/io/gitlab/jfronny/combit/mixin/LivingEntityMixin.java +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/LivingEntityMixin.java @@ -10,6 +10,7 @@ import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeInstance; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.ActionResult; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; @@ -23,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public abstract class LivingEntityMixin { @Shadow public abstract float getMaxHealth(); @Shadow public abstract void setHealth(float health); - @Shadow @Nullable public abstract EntityAttributeInstance getAttributeInstance(EntityAttribute attribute); + @Shadow @Nullable public abstract EntityAttributeInstance getAttributeInstance(RegistryEntry attribute); @Inject(at = @At("TAIL"), method = "applyDamage", cancellable = true) private void onEntityHurt(final DamageSource source, final float amount, CallbackInfo ci) { diff --git a/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java b/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java index 9bf5d39..491d2e9 100644 --- a/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java +++ b/src/main/java/io/gitlab/jfronny/combit/mixin/MiningToolItemMixin.java @@ -1,48 +1,71 @@ 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.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.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; +import java.util.ArrayList; +import java.util.List; + @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) { + @Inject(at = @At("RETURN"), method = "(Lnet/minecraft/item/ToolMaterial;Lnet/minecraft/registry/tag/TagKey;Lnet/minecraft/item/Item$Settings;)V") + private void modifyAttackDamage(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); + 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 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; } - }); - this.attributeModifiers = builder.build(); + } + 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)); } } } diff --git a/src/main/resources/combit.mixins.json b/src/main/resources/combit.mixins.json index 0f78193..01accf9 100644 --- a/src/main/resources/combit.mixins.json +++ b/src/main/resources/combit.mixins.json @@ -5,9 +5,11 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "AbstractSkeletonEntityMixin", + "ComponentMapBuilderAccessor", "EggEntityMixin", "FishingBobberEntityMixin", "HostileEntityMixin", + "ItemSettingsAccessor", "LivingEntityMixin", "MiningToolItemMixin", "MobEntityMixin",