feat: add additional data support for particles on Minestom platform

This commit is contained in:
Sybsuper
2026-05-16 21:32:40 +02:00
parent db930739d7
commit fdf362acd2
@@ -3,11 +3,15 @@ package com.dfsek.terra.minestom.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.kyori.adventure.nbt.CompoundBinaryTag;
import net.minestom.server.adventure.MinestomAdventure;
import net.minestom.server.codec.Transcoder;
import net.minestom.server.particle.Particle;
import net.minestom.server.world.attribute.AmbientParticle;
import net.minestom.server.world.biome.BiomeEffects;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class BiomeParticleConfigTemplate implements ObjectTemplate<AmbientParticle> {
@Value("particle")
@@ -25,11 +29,13 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate<AmbientPartic
}
String[] parts = particle.split("\\{");
Particle parsedParticle = Particle.fromKey(parts[0]);
String key = parts[0];
Particle parsedParticle = Particle.fromKey(key);
if(parts.length > 1) {
LoggerFactory.getLogger(BiomeParticleConfigTemplate.class).warn("Particle {} has additional data, particle will be ignored.",
particle);
return null;
int start = particle.indexOf("{");
String dataString = particle.substring(start);
parsedParticle = parseAdditionalParticleData(dataString, key);
if (parsedParticle == null) return null;
}
return new AmbientParticle(
@@ -37,4 +43,24 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate<AmbientPartic
probability
);
}
private Particle parseAdditionalParticleData(String dataString, String key) {
CompoundBinaryTag nbt = null;
Particle parsedParticle;
try {
nbt = MinestomAdventure.NBT_CODEC.decode(dataString);
// transform minecraft:x{a:"b"} into {type:"minecraft:x", a:"b"} as described in Particle.CODEC
nbt = nbt.putString("type", key);
parsedParticle = Particle.CODEC.decode(Transcoder.NBT, nbt).orElseThrow();
} catch(Exception e) {
String nbtString = "null";
try {
nbtString = (nbt == null ? "null" : MinestomAdventure.NBT_CODEC.encode(nbt));
} catch(IOException _) { }
LoggerFactory.getLogger(BiomeParticleConfigTemplate.class).warn(
"Failed to decode particle from '" + particle + "', nbt: '" + nbtString + "'. This particle will be ignored.", e);
return null;
}
return parsedParticle;
}
}