Can you modify this Roblox module to do a few things?



1: Change it so the rocks are basically duplicated, but they lower the height, increase the x and z size by a tiny amount, and then move it up to the top of the original rock part for each rock, that way there is a bit of a ground effect to it, this part is called the hoof




2: The rocks instead of just tweening the size, they tween the rotation as well, basically right now they tween the size while already rotated, but what it should do is keep the rotation flat, 0, 0, 0 (but still rotated around origin), but tween to match the rotation it should be.




3: The position of the rocks should do the same as change 2, the position should be a little bit lower how they are now (like quarter of a stud) when they first spawn, then tween to go up.




4: The rocks should delay a tiny amount the further away they are from the origin, the closer, the faster they appear, the further, the longer they appear.




5: Add a new parameter to change the thickness of the rocks, this changes the amount of outer rocks that expand in size the further they are from the origin, right now there are 2 lines, inner and outer, this parameter changes the amount of outer rocks that go further out and are bigger.




6: The hoof (the part above the original rock that's shorter but bigger) should clone any textures or decals from the ray's instance, the hoof should also not have randomized rotation or size and it should clone every stat about the original rock, however the hood is simply slightly bigger than the original rock, but all rotation, position changes, etc are all the same.




Here is the module:

``` 
local Rocks = {}

local TS = game:GetService("TweenService")
local RS = game:GetService("ReplicatedStorage")
local PS = game:GetService("PhysicsService")
local RunService = game:GetService("RunService")

local Modules = RS.GameModules
local partCacheMod = require(Modules.PartCache)

local cacheFolder
if not workspace:FindFirstChild("Debris") then
cacheFolder = Instance.new("Folder")
cacheFolder.Name = "Debris"
cacheFolder.Parent = workspace
else
cacheFolder = workspace.Debris
end

local partCache = partCacheMod.new(Instance.new("Part"), 1000, cacheFolder)

function Rocks.Ground(Pos, Distance, Size, filter, MaxRocks, Ice, despawnTime)
local random = Random.new()

local angle = 30
local otherAngle = 360 / MaxRocks
local params = RaycastParams.new()
params.FilterType = Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances = filter or {game.Players.LocalPlayer.Character, cacheFolder}
local size
size = Size or Vector3.new(2, 2, 2)
local pos = Pos
despawnTime = despawnTime or 3

local function SpawnRockAnimation(part, hoof)
-- Initial tiny size before animation starts
part.Size = Vector3.new(0.1, 0.1, 0.1)
hoof.Size = Vector3.new(0.1, 0.025, 0.1)

-- Spawning animation setup
local spawnTween = TS:Create(part, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = size * random:NextNumber(1, 1.5), CFrame = part.CFrame})
local hoofSpawnTween = TS:Create(hoof, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = Vector3.new(size.X * 1.01, size.Y * 0.25, size.Z * 1.01), CFrame = hoof.CFrame})

-- Play the spawn animation
spawnTween:Play()
hoofSpawnTween:Play()
end

local function OuterRocksLoop()
for i = 1, MaxRocks do
local cf = CFrame.new(Pos)
local newCF = cf * CFrame.fromEulerAnglesXYZ(0, math.rad(angle), 0) * CFrame.new(Distance / 2 + Distance / 2.7, 10, 0)
local ray = workspace:Raycast(newCF.Position, Vector3.new(0, -20, 0), params)
angle += otherAngle
if ray then
local part = partCache:GetPart()
local hoof = partCache:GetPart()

part.CFrame = CFrame.new(ray.Position - Vector3.new(0, 0.5, 0), Pos) * CFrame.fromEulerAnglesXYZ(random:NextNumber(-.25, .5), random:NextNumber(-.25, .25), random:NextNumber(-.25, .25))
hoof.CFrame = part.CFrame * CFrame.new(0, part.Size.Y / 2 - hoof.Size.Y / 2.1, 0)
SpawnRockAnimation(part, hoof)

part.Parent = cacheFolder
hoof.Parent = cacheFolder

part.Material = ray.Instance.Material
hoof.Material = ray.Instance.Material
part.BrickColor = ray.Instance.BrickColor
hoof.BrickColor = ray.Instance.BrickColor

part.Anchored = true
part.CanTouch = false
part.CanCollide = false
hoof.Anchored = true
hoof.CanTouch = false
hoof.CanCollide = false

if Ice then
part.Material = Enum.Material.Ice
hoof.Material = Enum.Material.Sand
part.BrickColor = BrickColor.new("Pastel light blue")
hoof.BrickColor = BrickColor.new("Lily white")
end

task.delay(despawnTime, function()
TS:Create(part, TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut), {Size = Vector3.new(.01, .01, .01)}):Play()
TS:Create(hoof, TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut), {Size = Vector3.new(.01, .01, .01), CFrame = part.CFrame * CFrame.new(0, part.Size.Y / 2 - part.Size.Y / 2.1, 0)}):Play()

task.delay(0.6, function()
partCache:ReturnPart(part)
partCache:ReturnPart(hoof)
end)
end)
end
end
end

local function InnerRocksLoop()
for i = 1, MaxRocks do
local cf = CFrame.new(Pos)
local newCF = cf * CFrame.fromEulerAnglesXYZ(0, math.rad(angle), 0) * CFrame.new(Distance / 2 + Distance / 10, 10, 0)
local ray = workspace:Raycast(newCF.Position, Vector3.new(0, -20, 0), params)
angle += otherAngle
if ray then
local part = partCache:GetPart()
local hoof = partCache:GetPart()

part.CFrame = CFrame.new(ray.Position - Vector3.new(0, size.Y * 0.4, 0), Pos) * CFrame.fromEulerAnglesXYZ(random:NextNumber(-1, -0.3), random:NextNumber(-0.15, 0.15), random:NextNumber(-.15, .15))
hoof.CFrame = part.CFrame * CFrame.new(0, part.Size.Y / 2 - hoof.Size.Y / 2.1, 0)
SpawnRockAnimation(part, hoof)

part.Parent = cacheFolder
hoof.Parent = cacheFolder

part.Material = ray.Instance.Material
hoof.Material = ray.Instance.Material
part.BrickColor = ray.Instance.BrickColor
hoof.BrickColor = ray.Instance.BrickColor

part.Anchored = true
part.CanTouch = false
part.CanCollide = false
hoof.Anchored = true
hoof.CanTouch = false
hoof.CanCollide = false

if Ice then
part.Material = Enum.Material.Ice
hoof.Material = Enum.Material.Sand
part.BrickColor = BrickColor.new("Pastel light blue")
hoof.BrickColor = BrickColor.new("Lily white")
end

task.delay(despawnTime, function()
TS:Create(part, TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut), {Size = Vector3.new(.01, .01, .01)}):Play()
TS:Create(hoof, TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut), {Size = Vector3.new(.01, .01, .01), CFrame = part.CFrame * CFrame.new(0, part.Size.Y / 2 - part.Size.Y / 2.1, 0)}):Play()

task.delay(0.6, function()
partCache:ReturnPart(part)
partCache:ReturnPart(hoof)
end)
end)
end
end
end
InnerRocksLoop()
OuterRocksLoop()
end

return Rocks
```