diff --git a/common/src/main/java/org/figuramc/figura/lua/api/particle/ParticleAPI.java b/common/src/main/java/org/figuramc/figura/lua/api/particle/ParticleAPI.java index 8b25c7c21..61508fddb 100644 --- a/common/src/main/java/org/figuramc/figura/lua/api/particle/ParticleAPI.java +++ b/common/src/main/java/org/figuramc/figura/lua/api/particle/ParticleAPI.java @@ -20,6 +20,8 @@ import org.figuramc.figura.utils.LuaUtils; import org.luaj.vm2.LuaError; +import java.util.Objects; + @LuaWhitelist @LuaTypeDoc( name = "ParticleAPI", @@ -39,6 +41,7 @@ public static ParticleEngineAccessor getParticleEngine() { private LuaParticle generate(String id, double x, double y, double z, double w, double t, double h) { try { + id = convertOldToNewParticleFormat(id); ParticleOptions options = ParticleArgument.readParticle(new StringReader(id), WorldAPI.getCurrentWorld().registryAccess()); Particle p = getParticleEngine().figura$makeParticle(options, x, y, z, w, t, h); if (p == null) throw new LuaError("Could not parse particle \"" + id + "\""); @@ -48,6 +51,139 @@ private LuaParticle generate(String id, double x, double y, double z, double w, } } + private String convertOldToNewParticleFormat(String id) { + if (id.contains("block ")) { + id = id.replaceFirst("minecraft:", ""); + String blockPart = id.split("block ")[1]; + String ret = "block{block_state:{"; + String blockName; + + if (blockPart.contains("[")) { + blockName = blockPart.split("\\[")[0]; + String properties = id.substring(id.indexOf("[")+1, id.indexOf("]")+1); + properties = properties.replaceAll("=", ":\"").replaceAll(",", "\",").replace("]", "\""); + ret += ("Name:" + blockName + ",Properties:{" + properties + "}"); + } else { + blockName = blockPart; + ret += ("Name:" + blockName); + } + + ret += "}}"; + id = ret; + } else if (id.contains("block_marker ")) { + id = id.replaceFirst("minecraft:", ""); + String blockPart = id.split("block_marker ")[1]; + String ret = "block_marker{block_state:{"; + String blockName; + + if (blockPart.contains("[")) { + blockName = blockPart.split("\\[")[0]; + String properties = id.substring(id.indexOf("[")+1, id.indexOf("]")+1); + properties = properties.replaceAll("=", ":\"").replaceAll(",", "\",").replace("]", "\""); + ret += ("Name:" + blockName + ",Properties:{" + properties + "}"); + } else { + blockName = blockPart; + ret += ("Name:" + blockName); + } + + ret += "}}"; + id = ret; + } else if (id.contains("falling_dust ")) { + id = id.replaceFirst("minecraft:", ""); + String blockPart = id.split("falling_dust ")[1]; + String ret = "falling_dust{block_state:{"; + String blockName; + + if (blockPart.contains("[")) { + blockName = blockPart.split("\\[")[0]; + String properties = id.substring(id.indexOf("[")+1, id.indexOf("]")+1); + properties = properties.replaceAll("=", ":\"").replaceAll(",", "\",").replace("]", "\""); + ret += ("Name:" + blockName + ",Properties:{" + properties + "}"); + } else { + blockName = blockPart; + ret += ("Name:" + blockName); + } + + ret += "}}"; + id = ret; + } else if (id.contains("dust ")) { + id = id.replaceFirst("minecraft:", ""); + String[] parts = id.split(" "); + String ret = "dust{"; + if (Objects.equals(parts[0], "dust")) { + String num1 = parts[1]; + String num2 = parts[2]; + String num3 = parts[3]; + ret += ("color:[" + num1 + "," + num2 + "," + num3+ "],scale:"+parts[4]+"}"); + } + + ret += "}"; + id = ret; + } else if (id.contains("dust_color_transition ")) { + id = id.replaceFirst("minecraft:", ""); + String[] parts = id.split(" "); + String ret = "dust_color_transition{"; + if (Objects.equals(parts[0], "dust_color_transition")) { + String rFrom = parts[1]; + String gFrom = parts[2]; + String bFrom = parts[3]; + String scale = parts[4]; + String rTo = parts[5]; + String gTo = parts[6]; + String bTo = parts[7]; + ret += ("from_color:[" + rFrom + "," + gFrom + "," + bFrom + "],scale:"+scale+",to_color:["+rTo + "," + gTo + "," + bTo + "]"); + } + ret += "}"; + id = ret; + } else if (id.contains("item ")) { + id = id.replaceFirst("minecraft:", ""); + String[] parts = id.split(" "); + String ret = "item{"; + if (Objects.equals(parts[0], "item")) { + String itemId = parts[1]; + ret += ("item:{id:"+itemId+"}"); + } + ret += "}"; + id = ret; + } else if (id.contains("sculk_charge ")) { + id = id.replaceFirst("minecraft:", ""); + String[] parts = id.split(" "); + String ret = "sculk_charge{"; + if (Objects.equals(parts[0], "sculk_charge")) { + String roll = parts[1]; + ret += ("roll:"+roll); + } + ret += "}"; + id = ret; + } else if (id.contains("shriek ")) { + id = id.replaceFirst("minecraft:", ""); + String[] parts = id.split(" "); + String ret = "shriek{"; + if (Objects.equals(parts[0], "shriek ")) { + String delay = parts[1]; + ret += ("delay:"+delay); + } + ret += "}"; + id = ret; + } else if (id.contains("vibration ")) { + id = id.replaceFirst("minecraft:", ""); + String[] parts = id.split(" "); + String ret = "vibration{"; + if (Objects.equals(parts[0], "vibration")) { + String dsX = parts[1]; + String dsY = parts[2]; + String dsZ = parts[3]; + String arr = parts[4]; + ret += ("arrival_in_ticks:"+arr+",destination:{type:block,pos:["+dsX+","+dsY+","+dsZ+"]}"); + } + ret += "}"; + id = ret; + } else if (id.contains("entity_effect") && !id.contains("{")) { + id += "{color:[0.0,0.0,0.0,1.0]}"; + } + return id; + } + @LuaWhitelist @LuaMethodDoc( overloads = {