Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions src/client/java/dev/badtz/prefixes/client/PrefixRenderScale.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
4 changes: 3 additions & 1 deletion src/client/resources/prefixes.client.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
"client": [
"ItemModelResolverMixin",
"ItemStackRenderStateMixin",
"MultiPlayerGameModeMixin"
"MultiPlayerGameModeMixin",
"ThrownTridentRendererMixin",
"ThrownTridentRenderStateMixin"
],
"injectors": {
"defaultRequire": 1
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/dev/badtz/prefixes/PrefixTrackedProjectile.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.badtz.prefixes;

import net.minecraft.resources.Identifier;

public interface PrefixTrackedProjectile {
void prefixes$setPrefixId(Identifier prefixId);

Identifier prefixes$getPrefixId();
}
83 changes: 83 additions & 0 deletions src/main/java/dev/badtz/prefixes/mixin/ThrownTridentMixin.java
Original file line number Diff line number Diff line change
@@ -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<String> PREFIXES_PREFIX_ID =
SynchedEntityData.defineId(ThrownTrident.class, EntityDataSerializers.STRING);

protected ThrownTridentMixin(EntityType<? extends AbstractArrow> 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 = "<init>(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 = "<init>(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);
}
}
3 changes: 2 additions & 1 deletion src/main/resources/prefixes.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"AbstractContainerMenuAccessor",
"InventoryMenuMixin",
"PiercingWeaponMixin",
"KineticWeaponMixin"
"KineticWeaponMixin",
"ThrownTridentMixin"
],
"client": [],
"injectors": {
Expand Down