From 37a11f7bc251101a9328d1e4e201dc0d3c04eb5e Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Tue, 2 Jan 2024 15:32:43 +0100 Subject: [PATCH] Improved footstep particle handling --- .../fixes/particle/FootStepParticle.java | 10 ++++-- .../viaversion/MixinMappingDataBase.java | 14 +++----- .../viaversion/MixinParticleRewriter.java | 36 +++++++++---------- .../{footprint.json => footstep.json} | 0 src/main/resources/viafabricplus.mixins.json | 6 ++-- 5 files changed, 32 insertions(+), 34 deletions(-) rename src/main/resources/assets/viafabricplus/particles/{footprint.json => footstep.json} (100%) diff --git a/src/main/java/de/florianmichael/viafabricplus/fixes/particle/FootStepParticle.java b/src/main/java/de/florianmichael/viafabricplus/fixes/particle/FootStepParticle.java index 401c786a..add8c3fe 100644 --- a/src/main/java/de/florianmichael/viafabricplus/fixes/particle/FootStepParticle.java +++ b/src/main/java/de/florianmichael/viafabricplus/fixes/particle/FootStepParticle.java @@ -19,6 +19,7 @@ package de.florianmichael.viafabricplus.fixes.particle; +import de.florianmichael.viafabricplus.protocolhack.ProtocolHack; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; import net.minecraft.client.particle.*; @@ -31,6 +32,7 @@ import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import net.raphimc.vialoader.util.VersionEnum; public class FootStepParticle extends AbstractSlowingParticle { @@ -79,7 +81,7 @@ public class FootStepParticle extends AbstractSlowingParticle { public static void init() { final DefaultParticleType footStepType = FabricParticleTypes.simple(true); - Registry.register(Registries.PARTICLE_TYPE, new Identifier("viafabricplus", "footprint"), footStepType); + Registry.register(Registries.PARTICLE_TYPE, new Identifier("viafabricplus", "footstep"), footStepType); ParticleFactoryRegistry.getInstance().register(footStepType, FootStepParticle.Factory::new); // Add some dummy factory ID = Registries.PARTICLE_TYPE.getRawId(footStepType); @@ -95,7 +97,11 @@ public class FootStepParticle extends AbstractSlowingParticle { @Override public Particle createParticle(DefaultParticleType parameters, ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { - FootStepParticle particle = new FootStepParticle(world, x, y, z, velocityX, velocityY, velocityZ); + if (ProtocolHack.getTargetVersion().isNewerThan(VersionEnum.r1_12_2)) { + throw new UnsupportedOperationException("FootStepParticle is not supported on versions newer than 1.12.2"); + } + + final FootStepParticle particle = new FootStepParticle(world, x, y, z, velocityX, velocityY, velocityZ); particle.setSprite(this.spriteProvider); return particle; } diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/MixinMappingDataBase.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/MixinMappingDataBase.java index 8d5b78a5..e2e4716f 100644 --- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/MixinMappingDataBase.java +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/MixinMappingDataBase.java @@ -22,21 +22,17 @@ package de.florianmichael.viafabricplus.injection.mixin.fixes.viaversion; import com.viaversion.viaversion.api.data.MappingDataBase; import de.florianmichael.viafabricplus.fixes.particle.FootStepParticle; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(value = MappingDataBase.class, remap = false) public abstract class MixinMappingDataBase { - @Shadow protected abstract int checkValidity(int id, int mappedId, String type); - - @Redirect(method = "getNewParticleId", at = @At(value = "INVOKE", target = "Lcom/viaversion/viaversion/api/data/MappingDataBase;checkValidity(IILjava/lang/String;)I")) - private int passFoodStepParticle(MappingDataBase instance, int id, int mappedId, String type) { + @Inject(method = "getNewParticleId", at = @At("HEAD"), cancellable = true) + private void passthroughFootStepParticle(int id, CallbackInfoReturnable cir) { if (id == FootStepParticle.ID) { - return id; - } else { - return checkValidity(id, mappedId, type); + cir.setReturnValue(id); } } diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/MixinParticleRewriter.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/MixinParticleRewriter.java index 438e68be..d1f4fcd2 100644 --- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/MixinParticleRewriter.java +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/MixinParticleRewriter.java @@ -19,43 +19,41 @@ package de.florianmichael.viafabricplus.injection.mixin.fixes.viaversion; -import com.viaversion.viaversion.api.minecraft.Particle; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.data.ParticleRewriter; import de.florianmichael.viafabricplus.fixes.particle.FootStepParticle; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; +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.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; @Mixin(value = ParticleRewriter.class, remap = false) public abstract class MixinParticleRewriter { - @Unique - private static int viaFabricPlus$particleIndex = 0; + @Shadow + @Final + private static List particles; + + @Inject(method = "", at = @At("RETURN")) + private static void checkFootStepIdOverlap(CallbackInfo ci) { + if (FootStepParticle.ID < particles.size()) { + throw new IllegalStateException("ViaFabricPlus FootStepParticle ID overlaps with a vanilla 1.12.2 particle ID"); + } + } @ModifyArg(method = "add(I)V", at = @At(value = "INVOKE", target = "Lcom/viaversion/viaversion/protocols/protocol1_13to1_12_2/data/ParticleRewriter$NewParticle;(ILcom/viaversion/viaversion/protocols/protocol1_13to1_12_2/data/ParticleRewriter$ParticleDataHandler;)V")) private static int replaceIds(int id) { - viaFabricPlus$particleIndex++; - final int oldId = viaFabricPlus$particleIndex - 1; - - if (oldId == 8) { // minecraft:depthsuspend -> minecraft:mycelium + if (particles.size() == 8) { // minecraft:depthsuspend -> minecraft:mycelium return 32; - } else if (oldId == 28) { // minecraft:footstep -> viafabricplus:footstep + } else if (particles.size() == 28) { // minecraft:footstep -> viafabricplus:footstep return FootStepParticle.ID; } else { return id; } } - @Inject(method = "rewriteParticle", at = @At("HEAD"), cancellable = true) - private static void updateFootStepId(int particleId, Integer[] data, CallbackInfoReturnable cir) { - // Don't allow the server to send footstep particles directly as this would allow the server - // to crash ViaFabricPlus clients without annoying vanilla clients - if (particleId == FootStepParticle.ID) { - cir.setReturnValue(null); - } - } - } diff --git a/src/main/resources/assets/viafabricplus/particles/footprint.json b/src/main/resources/assets/viafabricplus/particles/footstep.json similarity index 100% rename from src/main/resources/assets/viafabricplus/particles/footprint.json rename to src/main/resources/assets/viafabricplus/particles/footstep.json diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 48b66c95..240c7402 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -179,6 +179,7 @@ "fixes.viaversion.MixinInventoryPackets1_13", "fixes.viaversion.MixinInventoryPackets1_17", "fixes.viaversion.MixinInventoryTracker1_16", + "fixes.viaversion.MixinMappingDataBase", "fixes.viaversion.MixinMetadataRewriter1_15To1_14_4", "fixes.viaversion.MixinMetadataRewriter1_9To1_8", "fixes.viaversion.MixinNamedCompoundTagType", @@ -205,8 +206,5 @@ }, "overwrites": { "requireAnnotations": true - }, - "mixins": [ - "fixes.viaversion.MixinMappingDataBase" - ] + } }