diff --git a/src/client/java/dev/badtz/prefixes/client/PrefixRenderScale.java b/src/client/java/dev/badtz/prefixes/client/PrefixRenderScale.java new file mode 100644 index 0000000..131e886 --- /dev/null +++ b/src/client/java/dev/badtz/prefixes/client/PrefixRenderScale.java @@ -0,0 +1,42 @@ +package dev.badtz.prefixes.client; + +import dev.badtz.prefixes.PrefixManager; +import dev.badtz.prefixes.Prefixes; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.ItemStack; + +public final class PrefixRenderScale { + private PrefixRenderScale() {} + + public static float getScale(ItemStack stack) { + return getScale(stack.get(Prefixes.PREFIX)); + } + + public static float getScale(Identifier prefixId) { + if (prefixId == null) { + return 1.0F; + } + + PrefixManager.PrefixDefinition prefix = PrefixManager.get(prefixId); + + if (prefix == null) { + return 1.0F; + } + + for (PrefixManager.PrefixModifier modifier : prefix.modifiers()) { + if (!modifier.attribute().equals("minecraft:entity_interaction_range") + && !modifier.attribute().equals("minecraft:block_interaction_range")) { + continue; + } + + return switch (modifier.operation()) { + case "add_multiplied_base", "add_multiplied_total" -> 1.0F + + (float) modifier.amount(); + case "add_value" -> 1.0F + (float) (modifier.amount() / 4.5D); + default -> 1.0F; + }; + } + + return 1.0F; + } +} diff --git a/src/client/java/dev/badtz/prefixes/client/mixin/ItemModelResolverMixin.java b/src/client/java/dev/badtz/prefixes/client/mixin/ItemModelResolverMixin.java index 21b9483..cadaf35 100644 --- a/src/client/java/dev/badtz/prefixes/client/mixin/ItemModelResolverMixin.java +++ b/src/client/java/dev/badtz/prefixes/client/mixin/ItemModelResolverMixin.java @@ -4,8 +4,8 @@ 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.PrefixManager; import dev.badtz.prefixes.Prefixes; +import dev.badtz.prefixes.client.PrefixRenderScale; import dev.badtz.prefixes.client.PrefixScaledRenderState; import net.minecraft.client.renderer.item.ItemModelResolver; import net.minecraft.client.renderer.item.ItemStackRenderState; @@ -23,7 +23,7 @@ public class ItemModelResolverMixin { ItemDisplayContext displayContext, Level level, ItemOwner owner, int seed, CallbackInfo ci) { Identifier prefixId = item.get(Prefixes.PREFIX); - float scale = prefixes$getScale(item); + float scale = PrefixRenderScale.getScale(item); ((PrefixScaledRenderState) output).prefixes$setScale(scale); @@ -32,38 +32,4 @@ public class ItemModelResolverMixin { output.appendModelIdentityElement(scale); } } - - private static float prefixes$getScale(ItemStack stack) { - Identifier prefixId = stack.get(Prefixes.PREFIX); - - if (prefixId == null) { - return 1.0F; - } - - if (prefixId.toString().equals("prefixes:heavy")) { - return 1.5F; - } - - PrefixManager.PrefixDefinition prefix = PrefixManager.get(prefixId); - - if (prefix == null) { - return 1.0F; - } - - for (PrefixManager.PrefixModifier modifier : prefix.modifiers()) { - if (!modifier.attribute().equals("minecraft:entity_interaction_range") - && !modifier.attribute().equals("minecraft:block_interaction_range")) { - continue; - } - - return switch (modifier.operation()) { - case "add_multiplied_base", "add_multiplied_total" -> 1.0F - + (float) modifier.amount(); - case "add_value" -> 1.0F + (float) (modifier.amount() / 4.5D); - default -> 1.0F; - }; - } - - return 1.0F; - } } diff --git a/src/client/java/dev/badtz/prefixes/client/mixin/ThrownTridentRenderStateMixin.java b/src/client/java/dev/badtz/prefixes/client/mixin/ThrownTridentRenderStateMixin.java new file mode 100644 index 0000000..14216bc --- /dev/null +++ b/src/client/java/dev/badtz/prefixes/client/mixin/ThrownTridentRenderStateMixin.java @@ -0,0 +1,22 @@ +package dev.badtz.prefixes.client.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import dev.badtz.prefixes.client.PrefixScaledRenderState; +import net.minecraft.client.renderer.entity.state.ThrownTridentRenderState; + +@Mixin(ThrownTridentRenderState.class) +public class ThrownTridentRenderStateMixin implements PrefixScaledRenderState { + @Unique + private float prefixes$scale = 1.0F; + + @Override + public void prefixes$setScale(float scale) { + this.prefixes$scale = scale; + } + + @Override + public float prefixes$getScale() { + return this.prefixes$scale; + } +} diff --git a/src/client/java/dev/badtz/prefixes/client/mixin/ThrownTridentRendererMixin.java b/src/client/java/dev/badtz/prefixes/client/mixin/ThrownTridentRendererMixin.java new file mode 100644 index 0000000..6450cad --- /dev/null +++ b/src/client/java/dev/badtz/prefixes/client/mixin/ThrownTridentRendererMixin.java @@ -0,0 +1,44 @@ +package dev.badtz.prefixes.client.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 com.mojang.blaze3d.vertex.PoseStack; +import dev.badtz.prefixes.PrefixTrackedProjectile; +import dev.badtz.prefixes.client.PrefixRenderScale; +import dev.badtz.prefixes.client.PrefixScaledRenderState; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.ThrownTridentRenderer; +import net.minecraft.client.renderer.entity.state.ThrownTridentRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.projectile.arrow.ThrownTrident; + +@Mixin(ThrownTridentRenderer.class) +public class ThrownTridentRendererMixin { + @Inject(method = "extractRenderState", at = @At("RETURN")) + private void prefixes$extractScale(ThrownTrident entity, ThrownTridentRenderState state, + float partialTicks, CallbackInfo ci) { + Identifier prefixId = ((PrefixTrackedProjectile) entity).prefixes$getPrefixId(); + ((PrefixScaledRenderState) state).prefixes$setScale(PrefixRenderScale.getScale(prefixId)); + } + + @Inject(method = "submit", at = @At("HEAD")) + private void prefixes$pushScale(ThrownTridentRenderState state, PoseStack poseStack, + SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + float scale = ((PrefixScaledRenderState) state).prefixes$getScale(); + + poseStack.pushPose(); + + if (scale != 1.0F) { + poseStack.scale(scale, scale, scale); + } + } + + @Inject(method = "submit", at = @At("RETURN")) + private void prefixes$popScale(ThrownTridentRenderState state, PoseStack poseStack, + SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + poseStack.popPose(); + } +} diff --git a/src/client/resources/prefixes.client.mixins.json b/src/client/resources/prefixes.client.mixins.json index b08cda9..ed55ea3 100644 --- a/src/client/resources/prefixes.client.mixins.json +++ b/src/client/resources/prefixes.client.mixins.json @@ -5,7 +5,9 @@ "client": [ "ItemModelResolverMixin", "ItemStackRenderStateMixin", - "MultiPlayerGameModeMixin" + "MultiPlayerGameModeMixin", + "ThrownTridentRendererMixin", + "ThrownTridentRenderStateMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/java/dev/badtz/prefixes/PrefixTrackedProjectile.java b/src/main/java/dev/badtz/prefixes/PrefixTrackedProjectile.java new file mode 100644 index 0000000..79ea590 --- /dev/null +++ b/src/main/java/dev/badtz/prefixes/PrefixTrackedProjectile.java @@ -0,0 +1,9 @@ +package dev.badtz.prefixes; + +import net.minecraft.resources.Identifier; + +public interface PrefixTrackedProjectile { + void prefixes$setPrefixId(Identifier prefixId); + + Identifier prefixes$getPrefixId(); +} diff --git a/src/main/java/dev/badtz/prefixes/mixin/ThrownTridentMixin.java b/src/main/java/dev/badtz/prefixes/mixin/ThrownTridentMixin.java new file mode 100644 index 0000000..e116d3e --- /dev/null +++ b/src/main/java/dev/badtz/prefixes/mixin/ThrownTridentMixin.java @@ -0,0 +1,83 @@ +package dev.badtz.prefixes.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +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 dev.badtz.prefixes.PrefixTrackedProjectile; +import dev.badtz.prefixes.Prefixes; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.entity.projectile.arrow.ThrownTrident; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; + +@Mixin(ThrownTrident.class) +public abstract class ThrownTridentMixin extends AbstractArrow implements PrefixTrackedProjectile { + @Unique + private static final EntityDataAccessor PREFIXES_PREFIX_ID = + SynchedEntityData.defineId(ThrownTrident.class, EntityDataSerializers.STRING); + + protected ThrownTridentMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "defineSynchedData", at = @At("RETURN")) + private void prefixes$defineSynchedData(SynchedEntityData.Builder builder, CallbackInfo ci) { + builder.define(PREFIXES_PREFIX_ID, ""); + } + + @Inject(method = "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;)V", + at = @At("RETURN")) + private void prefixes$initOwner(Level level, LivingEntity owner, ItemStack tridentItem, + CallbackInfo ci) { + this.prefixes$setPrefixId(tridentItem.get(Prefixes.PREFIX)); + } + + @Inject(method = "(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/item/ItemStack;)V", + at = @At("RETURN")) + private void prefixes$initPosition(Level level, double x, double y, double z, + ItemStack tridentItem, CallbackInfo ci) { + this.prefixes$setPrefixId(tridentItem.get(Prefixes.PREFIX)); + } + + @Inject(method = "onHitEntity", at = @At("HEAD")) + private void prefixes$playPrefixHitSound(EntityHitResult hitResult, CallbackInfo ci) { + if (!(this.level() instanceof ServerLevel level)) { + return; + } + + Entity target = hitResult.getEntity(); + ItemStack stack = this.getWeaponItem(); + + PrefixApplier.getPrefix(stack).ifPresent(prefix -> { + if (prefix.type() != PrefixManager.PrefixType.WEAPON) { + return; + } + + PrefixApplier.playHitSound(level, target, stack); + }); + } + + @Override + public void prefixes$setPrefixId(Identifier prefixId) { + this.entityData.set(PREFIXES_PREFIX_ID, prefixId == null ? "" : prefixId.toString()); + } + + @Override + public Identifier prefixes$getPrefixId() { + String value = this.entityData.get(PREFIXES_PREFIX_ID); + return value.isEmpty() ? null : Identifier.tryParse(value); + } +} diff --git a/src/main/resources/prefixes.mixins.json b/src/main/resources/prefixes.mixins.json index a7263d6..a752970 100644 --- a/src/main/resources/prefixes.mixins.json +++ b/src/main/resources/prefixes.mixins.json @@ -11,7 +11,8 @@ "AbstractContainerMenuAccessor", "InventoryMenuMixin", "PiercingWeaponMixin", - "KineticWeaponMixin" + "KineticWeaponMixin", + "ThrownTridentMixin" ], "client": [], "injectors": {