修复BulletDecalOption相关问题,优化带参数ParticleType注册方法

This commit is contained in:
Light_Quanta 2025-06-30 03:33:41 +08:00
parent fe8de7156b
commit 060a3e3e2d
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
2 changed files with 30 additions and 61 deletions

View file

@ -1,21 +1,21 @@
package com.atsuishio.superbwarfare.client.particle; package com.atsuishio.superbwarfare.client.particle;
import com.atsuishio.superbwarfare.init.ModParticleTypes; import com.atsuishio.superbwarfare.init.ModParticleTypes;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import io.netty.buffer.ByteBuf;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.ParticleType;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class BulletDecalOption implements ParticleOptions { public class BulletDecalOption implements ParticleOptions {
public static final Codec<BulletDecalOption> CODEC = RecordCodecBuilder.create(builder -> public static final MapCodec<BulletDecalOption> CODEC = RecordCodecBuilder.mapCodec(builder ->
builder.group( builder.group(
Codec.INT.fieldOf("dir").forGetter(option -> option.direction.ordinal()), Codec.INT.fieldOf("dir").forGetter(option -> option.direction.ordinal()),
Codec.LONG.fieldOf("pos").forGetter(option -> option.pos.asLong()), Codec.LONG.fieldOf("pos").forGetter(option -> option.pos.asLong()),
@ -24,28 +24,19 @@ public class BulletDecalOption implements ParticleOptions {
Codec.FLOAT.fieldOf("b").forGetter(option -> option.blue) Codec.FLOAT.fieldOf("b").forGetter(option -> option.blue)
).apply(builder, BulletDecalOption::new)); ).apply(builder, BulletDecalOption::new));
@SuppressWarnings("deprecation") public static final StreamCodec<ByteBuf, BulletDecalOption> STREAM_CODEC = StreamCodec.composite(
public static final ParticleOptions.Deserializer<BulletDecalOption> DESERIALIZER = new ParticleOptions.Deserializer<>() { Direction.STREAM_CODEC,
@Override BulletDecalOption::getDirection,
public BulletDecalOption fromCommand(ParticleType<BulletDecalOption> particleType, StringReader reader) throws CommandSyntaxException { BlockPos.STREAM_CODEC,
reader.expect(' '); BulletDecalOption::getPos,
int dir = reader.readInt(); ByteBufCodecs.FLOAT,
reader.expect(' '); BulletDecalOption::getRed,
long pos = reader.readLong(); ByteBufCodecs.FLOAT,
reader.expect(' '); BulletDecalOption::getGreen,
float r = reader.readFloat(); ByteBufCodecs.FLOAT,
reader.expect(' '); BulletDecalOption::getBlue,
float g = reader.readFloat(); BulletDecalOption::new
reader.expect(' '); );
float b = reader.readFloat();
return new BulletDecalOption(dir, pos, r, g, b);
}
@Override
public BulletDecalOption fromNetwork(ParticleType<BulletDecalOption> particleType, FriendlyByteBuf buffer) {
return new BulletDecalOption(buffer.readVarInt(), buffer.readLong(), buffer.readFloat(), buffer.readFloat(), buffer.readFloat());
}
};
private final Direction direction; private final Direction direction;
private final BlockPos pos; private final BlockPos pos;
@ -97,18 +88,4 @@ public class BulletDecalOption implements ParticleOptions {
public @NotNull ParticleType<?> getType() { public @NotNull ParticleType<?> getType() {
return ModParticleTypes.BULLET_DECAL.get(); return ModParticleTypes.BULLET_DECAL.get();
} }
@Override
public void writeToNetwork(FriendlyByteBuf buffer) {
buffer.writeEnum(this.direction);
buffer.writeBlockPos(this.pos);
buffer.writeFloat(this.red);
buffer.writeFloat(this.green);
buffer.writeFloat(this.blue);
}
@Override
public String writeToString() {
return BuiltInRegistries.PARTICLE_TYPE.getKey(this.getType()) + " " + this.direction.getName();
}
} }

View file

@ -2,7 +2,7 @@ package com.atsuishio.superbwarfare.init;
import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.client.particle.BulletDecalOption; import com.atsuishio.superbwarfare.client.particle.BulletDecalOption;
import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec;
import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.ParticleType;
import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.core.particles.SimpleParticleType;
@ -18,29 +18,21 @@ public class ModParticleTypes {
public static final DeferredHolder<ParticleType<?>, SimpleParticleType> FIRE_STAR = REGISTRY.register("fire_star", () -> new SimpleParticleType(false)); public static final DeferredHolder<ParticleType<?>, SimpleParticleType> FIRE_STAR = REGISTRY.register("fire_star", () -> new SimpleParticleType(false));
public static final DeferredHolder<ParticleType<?>, ModParticleType<? extends ParticleOptions>> BULLET_DECAL = REGISTRY.register("bullet_decal", public static final DeferredHolder<ParticleType<?>, ParticleType<BulletDecalOption>> BULLET_DECAL = REGISTRY.register("bullet_decal",
() -> new ModParticleType<>(false, BulletDecalOption.DESERIALIZER, BulletDecalOption.CODEC)); () -> createOptions(BulletDecalOption.CODEC, BulletDecalOption.STREAM_CODEC));
public static final DeferredHolder<ParticleType<?>, SimpleParticleType> CUSTOM_CLOUD = REGISTRY.register("custom_cloud", () -> new SimpleParticleType(false)); public static final DeferredHolder<ParticleType<?>, SimpleParticleType> CUSTOM_CLOUD = REGISTRY.register("custom_cloud", () -> new SimpleParticleType(false));
public static final DeferredHolder<ParticleType<?>, SimpleParticleType> CUSTOM_SMOKE = REGISTRY.register("custom_smoke", () -> new SimpleParticleType(false)); public static final DeferredHolder<ParticleType<?>, SimpleParticleType> CUSTOM_SMOKE = REGISTRY.register("custom_smoke", () -> new SimpleParticleType(false));
@SuppressWarnings("deprecation") public static <T extends ParticleOptions> ParticleType<T> createOptions(MapCodec<T> codec, StreamCodec<? super RegistryFriendlyByteBuf, T> streamCodec) {
private static class ModParticleType<T extends ParticleOptions> extends ParticleType<T> { return new ParticleType<>(false) {
private final Codec<T> codec; public @NotNull MapCodec<T> codec() {
return codec;
}
public ModParticleType(boolean overrideLimiter, ParticleOptions.Deserializer<T> deserializer, Codec<T> codec) { public @NotNull StreamCodec<? super RegistryFriendlyByteBuf, T> streamCodec() {
super(overrideLimiter, deserializer); return streamCodec;
this.codec = codec; }
} };
@Override
public @NotNull Codec<T> codec() {
return this.codec;
}
@Override
public StreamCodec<? super RegistryFriendlyByteBuf, T> streamCodec() {
return this.codec;
}
} }
} }