You can do it with a script, I have something like this for flurry of blows fx: on("chat:message", msg => { if (msg.type !== "api") return; if (!msg.content.startsWith("!flurry")) return; const args = msg.content.split(" "); if (args.length < 2) { sendChat("System", "Use: !flurry TARGET"); return; } const target = getObj("graphic", args[1]); if (!target) return; const windFX = { maxParticles: 1, emissionRate: 1, lifeSpan: 1.8, lifeSpanRandom: 0.4, size: 85, sizeRandom: 20, speed: 0, startColour: [25, 25, 25, 0.025], endColour: [25, 25, 25, 0] }; const finisherFX = { maxParticles: 2, emissionRate: 2, lifeSpan: 2.2, size: 110, sizeRandom: 28, speed: 0, startColour: [35, 35, 35, 0.04], endColour: [35, 35, 35, 0] }; const hits = 4; const delay = 450; for (let i = 0; i < hits; i++) { setTimeout(() => { const sweepX = (i % 2 === 0 ? -1 : 1) * (15 + randomInteger(15)); const sweepY = randomInteger(30) - 15; const fx = (i === hits - 1) ? finisherFX : windFX; spawnFxWithDefinition( target.get("left") + sweepX, target.get("top") + sweepY, fx ); }, i * delay); } });