mirror of
https://github.com/ViaVersion/ViaFabricPlus.git
synced 2025-02-28 03:41:21 +01:00
Improved footstep particle handling
This commit is contained in:
parent
5f7a967d68
commit
37a11f7bc2
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user