Improved footstep particle handling

This commit is contained in:
RaphiMC 2024-01-02 15:32:43 +01:00
parent 5f7a967d68
commit 37a11f7bc2
No known key found for this signature in database
GPG Key ID: 0F6BB0657A03AC94
5 changed files with 32 additions and 34 deletions

View File

@ -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;
}

View File

@ -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<Integer> cir) {
if (id == FootStepParticle.ID) {
return id;
} else {
return checkValidity(id, mappedId, type);
cir.setReturnValue(id);
}
}

View File

@ -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 = "<clinit>", 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;<init>(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<Particle> 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);
}
}
}

View File

@ -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"
]
}
}