From d45ddf96f7b0c8482b47019447bbdc27885911b1 Mon Sep 17 00:00:00 2001 From: Badtz Date: Mon, 22 Jun 2026 16:03:36 -0700 Subject: [PATCH 1/2] add sounds to both types of spear attacks, move playsounds to helpers --- .../prefixes/client/PrefixClientSounds.java | 23 +++++++++ .../mixin/MultiPlayerGameModeMixin.java | 47 +++++++------------ .../dev/badtz/prefixes/PrefixApplier.java | 10 ++++ .../prefixes/mixin/KineticWeaponMixin.java | 31 ++++++++++++ .../prefixes/mixin/PiercingWeaponMixin.java | 33 +++++++++++++ .../dev/badtz/prefixes/mixin/PlayerMixin.java | 8 +--- src/main/resources/prefixes.mixins.json | 4 +- 7 files changed, 118 insertions(+), 38 deletions(-) create mode 100644 src/client/java/dev/badtz/prefixes/client/PrefixClientSounds.java create mode 100644 src/main/java/dev/badtz/prefixes/mixin/KineticWeaponMixin.java create mode 100644 src/main/java/dev/badtz/prefixes/mixin/PiercingWeaponMixin.java diff --git a/src/client/java/dev/badtz/prefixes/client/PrefixClientSounds.java b/src/client/java/dev/badtz/prefixes/client/PrefixClientSounds.java new file mode 100644 index 0000000..0530b6e --- /dev/null +++ b/src/client/java/dev/badtz/prefixes/client/PrefixClientSounds.java @@ -0,0 +1,23 @@ +package dev.badtz.prefixes.client; + +import dev.badtz.prefixes.PrefixApplier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.ItemStack; + +public final class PrefixClientSounds { + private PrefixClientSounds() {} + + public static void playMiningSound(Minecraft minecraft, BlockPos pos, ItemStack stack) { + PrefixApplier.getHitSound(stack) + .ifPresent(sound -> BuiltInRegistries.SOUND_EVENT.get(sound.id()) + .ifPresent(soundEvent -> minecraft.getSoundManager() + .play(new SimpleSoundInstance(soundEvent.value(), + SoundSource.PLAYERS, sound.volume(), sound.pitch(), + SoundInstance.createUnseededRandom(), pos)))); + } +} diff --git a/src/client/java/dev/badtz/prefixes/client/mixin/MultiPlayerGameModeMixin.java b/src/client/java/dev/badtz/prefixes/client/mixin/MultiPlayerGameModeMixin.java index edcc2ac..1d4025f 100644 --- a/src/client/java/dev/badtz/prefixes/client/mixin/MultiPlayerGameModeMixin.java +++ b/src/client/java/dev/badtz/prefixes/client/mixin/MultiPlayerGameModeMixin.java @@ -6,47 +6,34 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.llamalad7.mixinextras.sugar.Local; import dev.badtz.prefixes.PrefixApplier; import dev.badtz.prefixes.PrefixManager; +import dev.badtz.prefixes.client.PrefixClientSounds; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.MultiPlayerGameMode; -import net.minecraft.client.resources.sounds.SimpleSoundInstance; -import net.minecraft.client.resources.sounds.SoundInstance; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.SoundType; @Mixin(MultiPlayerGameMode.class) public class MultiPlayerGameModeMixin { - @Shadow - @Final - private Minecraft minecraft; + @Shadow + @Final + private Minecraft minecraft; - @Shadow - private ItemStack destroyingItem; + @Shadow + private ItemStack destroyingItem; - @Inject(method = "continueDestroyBlock", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/sounds/SoundManager;play(Lnet/minecraft/client/resources/sounds/SoundInstance;)Lnet/minecraft/client/sounds/SoundEngine$PlayResult;")) - private void injectBlockBreakSound(BlockPos pos, Direction direction, - CallbackInfoReturnable cir, @Local(name = "soundType") SoundType soundType) { - PrefixApplier.getPrefix(destroyingItem).ifPresent(prefix -> { - if (prefix.type() != PrefixManager.PrefixType.TOOL) { - return; - } + @Inject(method = "continueDestroyBlock", at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/sounds/SoundManager;play(Lnet/minecraft/client/resources/sounds/SoundInstance;)Lnet/minecraft/client/sounds/SoundEngine$PlayResult;")) + private void injectBlockBreakSound(BlockPos pos, Direction direction, + CallbackInfoReturnable cir) { + PrefixApplier.getPrefix(destroyingItem).ifPresent(prefix -> { + if (prefix.type() != PrefixManager.PrefixType.TOOL) { + return; + } - PrefixApplier.getHitSound(destroyingItem) - .ifPresent(sound -> BuiltInRegistries.SOUND_EVENT.get(sound.id()) - .ifPresent(soundEvent -> minecraft.getSoundManager() - .play(new SimpleSoundInstance(soundEvent.value(), - SoundSource.PLAYERS, - ((soundType.getVolume() + 1.0F) / 6.0F) - * sound.volume(), - soundType.getPitch() * sound.pitch(), - SoundInstance.createUnseededRandom(), pos)))); - }); - } + PrefixClientSounds.playMiningSound(minecraft, pos, destroyingItem); + }); + } } diff --git a/src/main/java/dev/badtz/prefixes/PrefixApplier.java b/src/main/java/dev/badtz/prefixes/PrefixApplier.java index cabe6d7..ba97780 100644 --- a/src/main/java/dev/badtz/prefixes/PrefixApplier.java +++ b/src/main/java/dev/badtz/prefixes/PrefixApplier.java @@ -8,7 +8,10 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -115,6 +118,13 @@ public static Optional getHitSound(ItemStack stack) { .filter(sound -> sound != null); } + public static void playHitSound(ServerLevel level, Entity target, ItemStack stack) { + getHitSound(stack).ifPresent(sound -> BuiltInRegistries.SOUND_EVENT.get(sound.id()) + .ifPresent(soundEvent -> level.playSound(null, target.getX(), target.getY(), + target.getZ(), soundEvent.value(), SoundSource.PLAYERS, sound.volume(), + sound.pitch()))); + } + private static boolean hasPlayerCustomName(ItemStack stack, PrefixManager.PrefixDefinition oldPrefix) { Component customName = stack.get(DataComponents.CUSTOM_NAME); diff --git a/src/main/java/dev/badtz/prefixes/mixin/KineticWeaponMixin.java b/src/main/java/dev/badtz/prefixes/mixin/KineticWeaponMixin.java new file mode 100644 index 0000000..fb9b325 --- /dev/null +++ b/src/main/java/dev/badtz/prefixes/mixin/KineticWeaponMixin.java @@ -0,0 +1,31 @@ +package dev.badtz.prefixes.mixin; + +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 dev.badtz.prefixes.PrefixApplier; +import dev.badtz.prefixes.PrefixManager; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.KineticWeapon; + +@Mixin(KineticWeapon.class) +public abstract class KineticWeaponMixin { + @Inject(method = "damageEntities", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;broadcastEntityEvent(Lnet/minecraft/world/entity/Entity;B)V")) + private void prefixes$playPrefixKineticHitSound(ItemStack stack, int ticksRemaining, + LivingEntity attacker, EquipmentSlot equipmentSlot, CallbackInfo ci) { + if (!(attacker.level() instanceof ServerLevel level)) { + return; + } + + PrefixApplier.getPrefix(stack).ifPresent(prefix -> { + if (prefix.type() == PrefixManager.PrefixType.WEAPON) { + PrefixApplier.playHitSound(level, attacker, stack); + } + }); + } +} diff --git a/src/main/java/dev/badtz/prefixes/mixin/PiercingWeaponMixin.java b/src/main/java/dev/badtz/prefixes/mixin/PiercingWeaponMixin.java new file mode 100644 index 0000000..cc7b9be --- /dev/null +++ b/src/main/java/dev/badtz/prefixes/mixin/PiercingWeaponMixin.java @@ -0,0 +1,33 @@ +package dev.badtz.prefixes.mixin; + +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 dev.badtz.prefixes.PrefixApplier; +import dev.badtz.prefixes.PrefixManager; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.PiercingWeapon; + +@Mixin(PiercingWeapon.class) +public abstract class PiercingWeaponMixin { + @Inject(method = "attack", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/item/component/PiercingWeapon;makeHitSound(Lnet/minecraft/world/entity/Entity;)V")) + private void prefixes$playPrefixPiercingHitSound(LivingEntity attacker, EquipmentSlot hand, + CallbackInfo ci) { + if (!(attacker.level() instanceof ServerLevel level)) { + return; + } + + ItemStack stack = attacker.getItemBySlot(hand); + + PrefixApplier.getPrefix(stack).ifPresent(prefix -> { + if (prefix.type() == PrefixManager.PrefixType.WEAPON) { + PrefixApplier.playHitSound(level, attacker, stack); + } + }); + } +} diff --git a/src/main/java/dev/badtz/prefixes/mixin/PlayerMixin.java b/src/main/java/dev/badtz/prefixes/mixin/PlayerMixin.java index a17fc61..cabd938 100644 --- a/src/main/java/dev/badtz/prefixes/mixin/PlayerMixin.java +++ b/src/main/java/dev/badtz/prefixes/mixin/PlayerMixin.java @@ -6,9 +6,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.badtz.prefixes.PrefixApplier; import dev.badtz.prefixes.PrefixManager; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -30,11 +28,7 @@ public abstract class PlayerMixin { return; } - PrefixApplier.getHitSound(stack) - .ifPresent(sound -> BuiltInRegistries.SOUND_EVENT.get(sound.id()) - .ifPresent(soundEvent -> level.playSound(null, target.getX(), - target.getY(), target.getZ(), soundEvent.value(), - SoundSource.PLAYERS, sound.volume(), sound.pitch()))); + PrefixApplier.playHitSound(level, target, stack); }); } } diff --git a/src/main/resources/prefixes.mixins.json b/src/main/resources/prefixes.mixins.json index 0fecbc0..a7263d6 100644 --- a/src/main/resources/prefixes.mixins.json +++ b/src/main/resources/prefixes.mixins.json @@ -9,7 +9,9 @@ "CrafterBlockMixin", "PlayerMixin", "AbstractContainerMenuAccessor", - "InventoryMenuMixin" + "InventoryMenuMixin", + "PiercingWeaponMixin", + "KineticWeaponMixin" ], "client": [], "injectors": { From 18e58cda36b1e8f9cba927e25baa112795d5154a Mon Sep 17 00:00:00 2001 From: Badtz Date: Mon, 22 Jun 2026 16:05:06 -0700 Subject: [PATCH 2/2] bump version, change name, change release type default --- build.gradle | 2 +- gradle.properties | 2 +- src/main/resources/fabric.mod.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 4d2bf4e..8b4acb7 100644 --- a/build.gradle +++ b/build.gradle @@ -95,7 +95,7 @@ modrinth { projectId = "prefixes" versionNumber = project.version.toString() versionName = "Prefixes ${project.version}" - versionType = "alpha" + versionType = "release" uploadFile = jar gameVersions = [project.minecraft_version] loaders = ["fabric"] diff --git a/gradle.properties b/gradle.properties index 6a0fc59..1a91a42 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ loader_version=0.19.3 loom_version=1.17-SNAPSHOT # Mod Properties -mod_version=1.0.7 +mod_version=1.0.8 maven_group=dev.badtz.prefixes # Dependencies diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 43e976e..2a2e91f 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "prefixes", "version": "${version}", - "name": "prefixes", + "name": "Prefixes", "description": "prefixes for tools and weapons with a fun reforging mechanic", "authors": [ "kamo.moe, chromadeline"