So I was following a tutorial and I copied exactly what he did in a module but it gave me 2 errors.
Tutorial:
This is my script for SimpleEvent.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local Events = ReplicatedStorage:WaitForChild("Events")
local Camera = workspace.CurrentCamera
local module = {}
module.Modules = {}
local CraterModule
local CameraShaker
local CameraShake
local function ShakeCamera(Preset)
CameraShake:Shake(CameraShaker.Presets[Preset])
end
function module.Init()
CraterModule = module.Modules.CraterModule
CameraShaker = module.Modules.CameraShaker
CameraShake = CameraShaker.new(Enum.RenderPriority.Camera.Value, function(ShakeCF)
Camera.CFrame = Camera.CFrame * ShakeCF
end)
CameraShake:Start()
Events.ShakeCamera.OnClientEvent:Connect(ShakeCamera)
Events.CreateCrater.OnServerEvent:Connect(CraterModule.CreateCrater)
end
return module
And my script for the Crater module.
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Events = ReplicatedStorage:WaitForChild("Events")
local CraterRocks = workspace:WaitForChild("CoreObjects"):WaitForChild("CraterRocks")
local Circle = math.pi * 2
local RNG = Random.new()
local DownDirection = Vector3.new(0, -100, 0)
local module = {}
local function getXAndZPositions(Radius, Angle)
local x = math.cos(Angle) * Radius
local z = math.sin(Angle) * Radius
return x, z
end
function module.CreateCrater(OriginPosition, AmountOfRocks, Radius, Duriation, SizeMultiplier)
if SizeMultiplier == nil then
SizeMultiplier = 1
end
local IgnoreList = {CraterRocks}
for _, v in Players:GetPlayers() do
local Character = v.Character
if Character then
table.insert(IgnoreList, Character)
end
end
local RayParams = RaycastParams.new()
RayParams.FilterDescendantsInstances = IgnoreList
RayParams.FilterType = Enum.RaycastFilterType.Exclude
for i=1, AmountOfRocks do
local Angle = (Circle / AmountOfRocks)
local X, Z = getXAndZPositions(Radius, Angle)
local RockSizeMultiplier = RNG:NextNumber(1, 1.6)
local RockSize = Vector3.new(RNG:NextNumber(2,4) * RockSizeMultiplier, RNG:NextNumber(2,4) * RockSizeMultiplier, RNG:NextNumber(2,4) * RockSizeMultiplier) * SizeMultiplier
local OriginPositionWithoutY = Vector3.new(OriginPosition.X, 0, OriginPosition.Z)
local XZPosition = (CFrame.new(OriginPositionWithoutY) * CFrame.new(X,0,Z)).Position
local RayResult = workspace:Raycast(XZPosition + Vector3.new(0, 10, 0), DownDirection, RayParams)
if RayResult then
local Rock = Instance.new("Part")
Rock.Size = RockSize
Rock.Material = RayResult.Material
Rock.Color = RayResult.Instance.Color
Rock.Anchored = true
Rock.CanCollide = true
Rock.Parent = CraterRocks
local FinalRockPosition = (CFrame.new(OriginPositionWithoutY) * CFrame.new(X,RayResult.Position.Y, Z)).Position
local FinalRockCFrame = CFrame.new(FinalRockPosition, OriginPositionWithoutY) * CFrame.Angles(math.rad(RNG:NextInteger(-60, 60)), math.rad(RNG:NextNumber(-60, 60)), math.rad(RNG:NextNumber(-60, 60)))
Rock.Position = FinalRockPosition + Vector3.new(0,-8,0)
TweenService:Create(Rock, TweenInfo.new(0.1, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {CFrame = FinalRockCFrame}):Play()
task.delay(Duriation + i / (AmountOfRocks * 0.9), function()
TweenService:Create(Rock, TweenInfo.new(0.3, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {Position = FinalRockPosition + Vector3.new(0,-8,0)}):Play()
task.wait(0.5)
Rock:Destroy()
end)
end
end
end
function module.Init()
Events.CreateCrater.OnServerEvent:Connect(module.CreateCrater)
end
return module