Bezier Debris 1.0

Made a module for arcing rock debris (radial bursts or forward cones) with matching smoke and impact sounds. Was building it for a moveset, based off of Jump Showdowns Rocks and TSB’S ‘God Slayer’ Rocks, it’s generic enough to drop into anything

What it does:
Rocks spawn colored/textured to match the ground of origin, arc through the air on a bezier curve, and raycast to find where they’ll actually land (so they hit terrain/parts properly instead of just guessing a height). Landing spot spawns its own smoke + sound based on whatever it hit. Two spawn shapes to work with: a radial burst (goes off in every direction) and a directional cone (aimed forward).

Setup

Drop RockDebrisModule into ReplicatedStorage. Then, also in ReplicatedStorage, add whatever of these you want:

  • SmokeVFX1, SmokeVFX2 - Attachments with your ParticleEmitters in them, used for the landing smoke on each rock (two variants for different size tiers)
  • CraterSmoke - Attachment for a bigger one-shot smoke puff, meant for heavier impacts
  • SoundsSource - a Folder with Sound instances named RockImpactSmall, RockImpactMedium, RockImpactLarge, plus anything you want to loop via PlayAttachedSound (a charge-up hum, etc)

None of this is required to make it run, anything missing just gets skipped, so you can plug things in whenever!

API

local RockDebrisModule = require(ReplicatedStorage.RockDebrisModule)

RockDebrisModule.SpawnRadial(originPosition, sizeType, ignoreInstances)
RockDebrisModule.SpawnDirectional(originPosition, direction, presetIndex, ignoreInstances)

RockDebrisModule.LaunchRock(originPosition, angle, sizeMin, sizeMax, distanceRange, heightRange, durationRange, ignoreList, smokeVariant)
RockDebrisModule.CreateRock(size, color, material)
RockDebrisModule.GetGroundMaterialColor(raycastResult)

RockDebrisModule.EmitSmoke(position, normal, smokeVariant, color)
RockDebrisModule.EmitCraterSmoke(position, normal)

RockDebrisModule.PlayPositionalSound(name, position)
local loopingSound = RockDebrisModule.PlayAttachedSound(name, parentPart)
RockDebrisModule.StopAttachedSound(loopingSound)

sizeType / presetIndex just index into RockDebrisModule.SizeConfig and RockDebrisModule.DirectionalConfig, which sit right in the module, comes with 3 radial tables and 2 cone presets (Directional) but they’re just tables, so add your own or tweak the ranges directly:

RockDebrisModule.SizeConfig[4] = {
	RockCount = 12,
	RockSizeRange = {1, 2},
	DistanceRange = {10, 20},
	HeightRange = {15, 20},
	DurationRange = {0.6, 0.9},
}

ignoreInstances gets passed straight into the raycast’s exclude filter, so pass your character (or anything else the rocks shouldn’t collide with mid-flight).

Quick example

local rootPart = character:WaitForChild("HumanoidRootPart")

RockDebrisModule.SpawnRadial(rootPart.Position, 2, {character})
RockDebrisModule.SpawnDirectional(rootPart.Position, rootPart.CFrame.LookVector, 1, {character})

Everything’s client-side visuals only, so it’s meant to be required from a LocalScript for the VFX side of an ability, you’d still handle hit detection/damage separately if this is for combat.

RockDebris.rbxm (9.9 KB)
Or you can download it from roblox.
https://create.roblox.com/store/asset/131611036977182/DebrisModule

Use it however you want, but atleast

credit me.

Let me know if anything breaks or if you want more presets added.

3 Likes

ZIS IS THE BEST! WHY IS IT SO LOW IN VIEWS
Man its crazy

maybe add visual examples and a catchier title with some decoration, nice system btw

If possible could you please show some visual examples on the post, maybe some videos or pictures?