diff --git a/core/src/main/java/com/nisovin/magicspells/spelleffects/effecttypes/ParticlesEffect.java b/core/src/main/java/com/nisovin/magicspells/spelleffects/effecttypes/ParticlesEffect.java index 27f6bff4a..78156bad6 100644 --- a/core/src/main/java/com/nisovin/magicspells/spelleffects/effecttypes/ParticlesEffect.java +++ b/core/src/main/java/com/nisovin/magicspells/spelleffects/effecttypes/ParticlesEffect.java @@ -32,10 +32,13 @@ public class ParticlesEffect extends SpellEffect { protected ConfigData particle; + protected ConfigData rgbColor; protected ConfigData argbColor; + protected ConfigData material; protected ConfigData blockData; protected ConfigData dustOptions; + protected ConfigData spellOptions; protected ConfigData dustTransition; protected ConfigData vibrationOffset; @@ -59,6 +62,7 @@ public class ParticlesEffect extends SpellEffect { protected ConfigData xSpread; protected ConfigData ySpread; protected ConfigData zSpread; + protected ConfigData dragonBreathPower; protected ConfigData sculkChargeRotation; protected ConfigData force; @@ -68,11 +72,14 @@ public class ParticlesEffect extends SpellEffect { public void loadFromConfig(ConfigurationSection config) { particle = ConfigDataUtil.getParticle(config, "particle-name", Particle.POOF); - argbColor = ConfigDataUtil.getARGBColor(config, "argb-color", null); + rgbColor = ConfigDataUtil.getColor(config, "color", null); + argbColor = ConfigDataUtil.getARGBColor(config, "argb-color", null).orDefault(rgbColor); + material = ConfigDataUtil.getMaterial(config, "material", null); blockData = ConfigDataUtil.getBlockData(config, "material", null); dustOptions = ConfigDataUtil.getDustOptions(config, "color", "size", new DustOptions(Color.RED, 1)); dustTransition = ConfigDataUtil.getDustTransition(config, "color", "to-color", "size", new DustTransition(Color.RED, Color.BLACK, 1)); + spellOptions = ConfigDataUtil.getSpellOptions(config, "spell.color", "spell.power", new Particle.Spell(Color.WHITE, 1)); vibrationOffset = ConfigDataUtil.getVector(config, "vibration-offset", new Vector()); vibrationOrigin = ConfigDataUtil.getEnum(config, "vibration-origin", ParticlePosition.class, ParticlePosition.POSITION); @@ -91,12 +98,14 @@ public void loadFromConfig(ConfigurationSection config) { arrivalTime = ConfigDataUtil.getInteger(config, "arrival-time", -1); shriekDelay = ConfigDataUtil.getInteger(config, "shriek-delay", 0); + dragonBreathPower = ConfigDataUtil.getFloat(config, "dragon-breath-power", 1); + sculkChargeRotation = ConfigDataUtil.getFloat(config, "sculk-charge-rotation", 0); + speed = ConfigDataUtil.getFloat(config, "speed", 0.2f); ConfigData horizSpread = ConfigDataUtil.getFloat(config, "horiz-spread", 0.2f); xSpread = ConfigDataUtil.getFloat(config, "x-spread", horizSpread); zSpread = ConfigDataUtil.getFloat(config, "z-spread", horizSpread); - sculkChargeRotation = ConfigDataUtil.getFloat(config, "sculk-charge-rotation", 0); ConfigData vertSpread = ConfigDataUtil.getFloat(config, "vert-spread", 0.2f); ySpread = ConfigDataUtil.getFloat(config, "y-spread", vertSpread); @@ -149,6 +158,12 @@ public Runnable playEffectLocation(Location location, SpellData data) { protected Object getParticleData(@NotNull Particle particle, @Nullable Entity entity, @NotNull Location location, @NotNull SpellData data) { Class type = particle.getDataType(); + if (type == Color.class) { + return particle == Particle.ENTITY_EFFECT ? + argbColor.get(data) : + rgbColor.get(data); + } + if (type == ItemStack.class) { Material material = this.material.get(data); return material == null ? null : new ItemStack(material); @@ -209,12 +224,15 @@ protected Object getParticleData(@NotNull Particle particle, @Nullable Entity en if (type == BlockData.class) return blockData.get(data); if (type == DustOptions.class) return dustOptions.get(data); + if (type == Particle.Spell.class) return spellOptions.get(data); if (type == DustTransition.class) return dustTransition.get(data); - if (type == Float.class) return sculkChargeRotation.get(data); - if (type == Integer.class) return shriekDelay.get(data); - if (type == Color.class) return argbColor.get(data); - return null; + return switch (particle) { + case SHRIEK -> shriekDelay.get(data); + case DRAGON_BREATH -> dragonBreathPower.get(data); + case SCULK_CHARGE -> sculkChargeRotation.get(data); + default -> null; + }; } protected Location getSpawnLocation(@NotNull Particle particle, @NotNull Location position, @NotNull SpellData data) { diff --git a/core/src/main/java/com/nisovin/magicspells/spells/targeted/ParticleCloudSpell.java b/core/src/main/java/com/nisovin/magicspells/spells/targeted/ParticleCloudSpell.java index cb4d6eb05..e48cd483f 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/targeted/ParticleCloudSpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/targeted/ParticleCloudSpell.java @@ -32,15 +32,19 @@ public class ParticleCloudSpell extends TargetedSpell implements TargetedLocatio private final ConfigData customName; - private final ConfigData color; + private final ConfigData rgbColor; + private final ConfigData argbColor; + private final ConfigData item; private final ConfigData blockData; private final ConfigData dustOptions; + private final ConfigData spellOptions; private final ConfigData dustTransition; private final ConfigData particle; private final ConfigData waitTime; + private final ConfigData shriekDelay; private final ConfigData ticksDuration; private final ConfigData durationOnUse; private final ConfigData reapplicationDelay; @@ -48,6 +52,8 @@ public class ParticleCloudSpell extends TargetedSpell implements TargetedLocatio private final ConfigData radius; private final ConfigData radiusOnUse; private final ConfigData radiusPerTick; + private final ConfigData dragonBreathPower; + private final ConfigData sculkChargeRotation; private final ConfigData useGravity; private final ConfigData canTargetEntities; @@ -74,6 +80,12 @@ public ParticleCloudSpell(MagicConfig config, String spellName) { internalKey + "dust-transition.size", new DustTransition(Color.RED, Color.BLACK, 1) ); + spellOptions = ConfigDataUtil.getSpellOptions( + config.getMainConfig(), + internalKey + "spell.color", + internalKey + "spell.power", + new Particle.Spell(Color.WHITE, 1) + ); ConfigData material = getConfigDataMaterial("material", null); if (material.isConstant()) { @@ -88,9 +100,14 @@ public ParticleCloudSpell(MagicConfig config, String spellName) { }; } + shriekDelay = getConfigDataInt("shriek-delay", 0); + + dragonBreathPower = getConfigDataFloat("dragon-breath-power", 1); + sculkChargeRotation = getConfigDataFloat("sculk-charge-rotation", 0); + ConfigData colorInt = getConfigDataInt("color", 0xFF0000); - color = ConfigDataUtil.getARGBColor(config.getMainConfig(), internalKey + "argb-color", null) - .orDefault(data -> Color.fromRGB(colorInt.get(data))); + rgbColor = getConfigDataColor("color", null).orDefault(data -> Color.fromRGB(colorInt.get(data))); + argbColor = ConfigDataUtil.getARGBColor(config.getMainConfig(), internalKey + "argb-color", null).orDefault(rgbColor); waitTime = getConfigDataInt("wait-time-ticks", 10); ticksDuration = getConfigDataInt("duration-ticks", 3 * TimeUtil.TICKS_PER_SECOND); @@ -184,13 +201,24 @@ private CastResult spawnCloud(SpellData data) { private Object getParticleData(@NotNull Particle particle, @NotNull SpellData data) { Class type = particle.getDataType(); - if (type == Color.class) return color.get(data); if (type == ItemStack.class) return item.get(data); if (type == BlockData.class) return blockData.get(data); if (type == DustOptions.class) return dustOptions.get(data); + if (type == Particle.Spell.class) return spellOptions.get(data); if (type == DustTransition.class) return dustTransition.get(data); - return null; + if (type == Color.class) { + return particle == Particle.ENTITY_EFFECT ? + argbColor.get(data) : + rgbColor.get(data); + } + + return switch (particle) { + case SHRIEK -> shriekDelay.get(data); + case DRAGON_BREATH -> dragonBreathPower.get(data); + case SCULK_CHARGE -> sculkChargeRotation.get(data); + default -> null; + }; } } diff --git a/core/src/main/java/com/nisovin/magicspells/util/config/ConfigDataUtil.java b/core/src/main/java/com/nisovin/magicspells/util/config/ConfigDataUtil.java index f976b3968..343a8490d 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/config/ConfigDataUtil.java +++ b/core/src/main/java/com/nisovin/magicspells/util/config/ConfigDataUtil.java @@ -1151,6 +1151,35 @@ public boolean isConstant() { return data -> def; } + @NotNull + public static ConfigData getSpellOptions(@NotNull ConfigurationSection config, + @NotNull String colorPath, + @NotNull String powerPath, + @Nullable Particle.Spell def) { + ConfigData color = getColor(config, colorPath, def == null ? null : def.getColor()); + ConfigData power = def == null ? getFloat(config, powerPath) : getFloat(config, powerPath, def.getPower()); + + if (color.isConstant() && power.isConstant()) { + Color c = color.get(); + if (c == null) return data -> def; + + Float p = power.get(); + if (p == null) return data -> def; + + return data -> new Particle.Spell(c, p); + } + + return (VariableConfigData) data -> { + Color c = color.get(data); + if (c == null) return def; + + Float p = power.get(data); + if (p == null) return def; + + return new Particle.Spell(c, p); + }; + } + @NotNull public static ConfigData getDustOptions(@NotNull ConfigurationSection config, @NotNull String colorPath,