I tried my best to fix mine, and almost looks familiar with the person scripts. But, mines for whatever reason. The ice that I summoned from my screen we're vanished / gone into void. But, the person's script works perfectly...
Basically, what am I doing is. Whenever I press Z on the keyboard. There would be a summoned ice on the mouse player's targeted. The local script on StarterCharacterScripts are works perfectly fine
THE PERSON'S SCRIPT
local re = game.ReplicatedStorage:WaitForChild("IceMagicActivated") local plrsCoolingDown = {} local shard = script:WaitForChild("IceShard") local ts = game:GetService("TweenService") local ti = TweenInfo.new(1, Enum.EasingStyle.Quint, Enum.EasingDirection.InOut) re.OnServerEvent:Connect(function(plr, mouseCF) if plrsCoolingDown[plr] then return end plrsCoolingDown[plr] = true local start = CFrame.new(plr.Character.HumanoidRootPart.Position, mouseCF.Position) local goal = start.LookVector * 300 local shardsNum = math.random(15, 30) local shardIncrements = 300 / shardsNum for i = 1, shardsNum do local newShard = shard:Clone() newShard.Anchored = true newShard.CanCollide = false local x, y, z = math.random(30, 50)/30 * i, math.random(30, 50)/30 * i * 2, math.random(30, 50)/30 * i newShard.Size = Vector3.new(0, 0, 0) newShard.Orientation = Vector3.new(math.random(-30, 30), math.random(-180, 180), math.random(-30, 30)) local pos = plr.Character.HumanoidRootPart.Position + start.LookVector * (shardIncrements * i) newShard.Position = Vector3.new(pos.X, 0, pos.Z) local newSize = Vector3.new(x, y, z) local newPos = newShard.Position + Vector3.new(0, y/2.5, 0) local tween = ts:Create(newShard, ti, {Size = newSize, Position = newPos}) newShard.Parent = workspace tween:Play() local charactersHit = {} newShard.Touched:Connect(function(touch) if touch.Parent:FindFirstChild("Humanoid") and touch.Parent ~= plr.Character and not charactersHit[touch.Parent] then charactersHit[touch.Parent] = true touch.Parent.Humanoid:TakeDamage(30) end end) coroutine.resume(coroutine.create(function() wait(3) local reverseTween = ts:Create(newShard, ti, {Size = Vector3.new(0, 0, 0), Position = Vector3.new(pos.X, 0, pos.Z)}) reverseTween:Play() reverseTween.Completed:Wait() newShard:Destroy() end)) wait(math.random(1, 100)/1000) end plrsCoolingDown[plr] = false end)
MY VERISON
local re = game.ReplicatedStorage:WaitForChild("IceMagicActivated") -- Get the remote events local plrsCoolingDown = {} -- List of player currently in cooldown. local shard = script:WaitForChild("IceShard") local ts = game:GetService("TweenService") -- Get tween service, allow us to animate objects local ti = TweenInfo.new(1, Enum.EasingStyle.Quint, Enum.EasingDirection.InOut) -- First how long th eanimation last for, second argument style the animation start / end, Third is the position in the animation that the style occurs, which can be the start, end or both. re.OnServerEvent:Connect(function(plr, mouseCF) -- The parameter mouseCF is the mouse.Hit value we send ourself. The parameter plr is the client sending this smsg if plrsCoolingDown[plr] then return end -- If the player still cooldown, then do nathing. plrsCoolingDown[plr] = true -- We insert the player into this list, telling the script that they are on cooldown as they have used the ice magic already. local start = CFrame.new(plr.Character.HumanoidRootPart.Position, mouseCF.Position) -- Make variable called start, which is the CFrame where the shards will start. We give the player's character's HumanoidRootPart's Position property for the position component and the position of the mouse's CFrame for the rotational component. This will make this CFrame face where is the mouse is going. local goal = start.LookVector * 300 -- We make a goal variable too, which make equal to the LookVector of the CFrame above multiplied by 70. The lookVector is the direction a CFrame is facing. By multiplying by 70 we go 70 studs foward in this direction. This means the range of the ice shard attack is 70 studs local shardsNum = math.random(15, 30) -- This will make random numbers, how many shards will be created. local shardIncrements = 300 / shardsNum -- Then, we divide our range by the number of shards to find out the distance between each shard. -- Local already good enough. for i = 1, shardsNum do -- This for loop will go through 1 to the number of shards we will create. This will allow u to make that amount of shards with minimal lines of code local newShard = shard:Clone() -- We make clone of the shard from this script. newShard.Anchored = true newShard.CanCollide = false local x, y, z = math.random(30, 50)/30 * i, math.random(30, 50)/30 * i * 2, math.random(30, 50)/30 * i -- Here we make random sizes of each axis We do this by getting between 30 & 50, dividing it by 30, then multiplying it by the iterator. This will create a sizze based on the shard number, so the shards get bigger further along newShard.Size = Vector3.new(0, 0, 0) -- We make it 0 size, since we want to animate it. newShard.Orientation = Vector3.new(math.random(-30, 30), math.random(-180, 180), math.random(-30, 30)) local pos = plr.Character.HumanoidRootPart.Position * start.LookVector * (shardIncrements * i) newShard.Position = Vector3.new(pos.X, 0, pos.Z) -- Was wrong last time lmao -- Section 2 local newSize = Vector3.new(x, y, z) -- We make a variable called newSize which is equal to values we made above for the size. local newPos = newShard.Position + Vector3.new(0, y/2.5, 0) -- We also make a variable called newPos, which is equal to the current position of the shard plus its y size divided by 2.5 on the Y axis which will put the shard above the ground. local tween = ts:Create(newShard, ti, {Size = newSize, Position = newPos}) -- Create function of the TweenService goals, this will create an animation that we can play. The object that will be animated is the first argument we give. The second is a tweeninfo defining how we want the animation to behave. The third argument is a dictionary containing the property names and their goal values. We give size & position and their new values, so size and position will be animated. newShard.Parent = workspace tween:Play() local charactersHit = {} newShard.Touched:Connect(function(touch) if touch.Parent:FindFirstChild("Humanoid") and touch.Parent ~= plr.Character and not charactersHit[touch.Parent] then charactersHit[touch.Parent] = true touch.Parent.Humanoid:TakeDamage(30) end end) coroutine.resume(coroutine.create(function() wait(3) local reverseTween = ts:Create(newShard, ti, {Size = Vector3.new(0, 0, 0), Position = Vector3.new(pos.X, 0, pos.Z)}) -- To make shard disappear, we willl use another tween, We do the same as before, but give differnt values for position and size. reverseTween:Play() reverseTween.Completed:Wait() newShard:Destroy() end)) wait(math.random(1, 100)/1000) -- We pause the for loop for a random amount between 1 and 100, which we divided 1000 get a random pause between 0.001 and 0.1. This makes the shards appear gradually rather thann all at once. end plrsCoolingDown[plr] = false -- Lastly, when the loop is over, we remove the play from the plrsCooldownList, allowing them to use the ice magic again. print("Everything works, fine... or not bruh") end)