From c3aabdcfc514847e32aed14908612306afce85c9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 9 Feb 2025 11:09:11 -0500 Subject: [PATCH] Closes #9498 --- .../src/mindustry/entities/part/DrawPart.java | 12 ++-- .../entities/part/EffectSpawnerPart.java | 57 +++++++++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 core/src/mindustry/entities/part/EffectSpawnerPart.java diff --git a/core/src/mindustry/entities/part/DrawPart.java b/core/src/mindustry/entities/part/DrawPart.java index 6e14ccb247..d1ee4453d9 100644 --- a/core/src/mindustry/entities/part/DrawPart.java +++ b/core/src/mindustry/entities/part/DrawPart.java @@ -18,7 +18,7 @@ public abstract class DrawPart{ public int recoilIndex = -1; public abstract void draw(PartParams params); - public abstract void load(String name); + public void load(String name){} public void getOutlines(Seq out){} /** Parameters for drawing a part in draw(). */ @@ -88,7 +88,7 @@ public abstract class DrawPart{ life = p -> p.life, /** Current unscaled value of Time.time. */ time = p -> Time.time; - + float get(PartParams p); static PartProgress constant(float value){ @@ -98,11 +98,11 @@ public abstract class DrawPart{ default float getClamp(PartParams p){ return getClamp(p, true); } - + default float getClamp(PartParams p, boolean clamp){ return clamp ? Mathf.clamp(get(p)) : get(p); } - + default PartProgress inv(){ return p -> 1f - get(p); } @@ -173,11 +173,11 @@ public abstract class DrawPart{ default PartProgress absin(float scl, float mag){ return p -> get(p) + Mathf.absin(scl, mag); } - + default PartProgress mod(float amount){ return p -> Mathf.mod(get(p), amount); } - + default PartProgress loop(float time){ return p -> Mathf.mod(get(p)/time, 1); } diff --git a/core/src/mindustry/entities/part/EffectSpawnerPart.java b/core/src/mindustry/entities/part/EffectSpawnerPart.java new file mode 100644 index 0000000000..3931781108 --- /dev/null +++ b/core/src/mindustry/entities/part/EffectSpawnerPart.java @@ -0,0 +1,57 @@ +package mindustry.entities.part; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.graphics.*; + +import static arc.math.Mathf.random; +import static arc.util.Tmp.*; + +/**Spawns effects in a rectangle centered on x and y.*/ +public class EffectSpawnerPart extends DrawPart{ + public float x, y, width, height, rotation; + public boolean mirror = false; + + public float effectChance = 0.1f, effectRot, effectRandRot; + public Effect effect = Fx.sparkShoot; + public Color effectColor = Color.white; + + public boolean useProgress = true; + public PartProgress progress = PartProgress.warmup; + + /**Shows the spawn rectangles in red.*/ + public boolean debugDraw = false; + + @Override + public void draw(PartParams params){ + if(debugDraw){ + for(int i = 0; i < (mirror ? 2 : 1); i++){ + float sign = (i == 0 ? 1f : -1f), rot = params.rotation + (rotation * sign); + v1.set(x * sign, y).rotate(params.rotation - 90).add(params.x, params.y); + + float z = Draw.z(); + Draw.z(Layer.buildBeam); + Draw.color(Color.red); + Draw.rect("error", v1.x, v1.y, width, height, rot - 90f); + Draw.color(); + Draw.z(z); + } + } + + if(Vars.state.isPaused()) return; + + for(int i = 0; i < (mirror ? 2 : 1); i++){ + if(!Vars.state.isPaused() && Mathf.chanceDelta(effectChance * (useProgress ? progress.getClamp(params) : 1f))){ + float sign = (i == 0 ? 1f : -1f), rot = params.rotation + (rotation * sign); + v1.set(x * sign, y).rotate(params.rotation - 90).add(params.x, params.y); + v1.add(v2.set(random(-height * 0.5f, height * 0.5f), random(-width * 0.5f, width * 0.5f)).rotate(rot)); + + effect.at(v1.x, v1.y, rot + (effectRot * sign) + random(-effectRandRot, effectRandRot), effectColor); + } + } + } +} \ No newline at end of file