Hi, anyone knows any other ways to do what Rocket Propulsion does? If the answer is yes, could you also please tell me how?
Here is a video of what i want it to do, i want the parts to fly to the player but only on the client - GIF - Imgur
Or even better, just CFrame them towards the character’s root part. The issue with physics constraints and body movers is that parts will end up orbiting around the player in some cases.
As for the RocketPropulsion instance. I’d avoid using BodyMovers because they are treated as partially deprecated classes. They haven’t been marked as such because not all use cases are covered by constraints, but they rarely get significant updates beyond basic compatibility. The most significant properties it has are as follows:
Target - The basepart you want to follow. Character’s HumanoidRootPart.
TargetOffset - Used when no Target is specified as a target position in the workspace. Leave at 0,0,0.
TargetRadius - How close the projectile has to be to its target to fire ReachedTarget. Around 1 stud.
MaxSpeed - Obvious.
MaxThrust - Max force. Higher for heavier objects
ThrustP and ThrustD - Max power and dampening applied to move the part. Higher power makes it turn faster, but also causes more rubberbanding. High dampening causes less rubberbanding, but can cause weird behavior at high values.
CartoonFactor - How hard the part will try to face its target. Set to 0 for no rotation.
MaxTorque - Max rotational force. Higher for heavier objects
TurnP and TurnD - Same as ThrustP and ThrustD, but for rotation.
Here’s an old script I made for some custom particles that I never used. Only added a remote event binding. It should do practically the same thing on the client’s side, although you’ll still have to somehow handle part removal on the server. Maybe create client side parts from sent position data?
local confSpeed = 2
local confMinDist = 2
local tabToMove = table.create(5)
game:GetService("RunService").Heartbeat:Connect(function(timeDelta)
for objPlayer,arrParts in pairs(tabToMove) do
if not arrParts[1] then continue end
local objChar = objPlayer.Character
if not objChar then continue end
local objHRP = objChar:FindFirstChild("HumanoidRootPart")
if not objHRP then continue end
local posTar = objHRP.CFrame.Position
for i,objPart in ipairs(arrParts) do
local cfOld = objPart.CFrame
local posOld = cfOld.Position
local dirCurr = posTar-posOld
local distOld = (dirCurr).Magnitude
local distNew = math.clamp(distOld-confSpeed, 0,math.huge)
if distNew<confMinDist then
objPart:Destroy()
table.remove(arrParts,i)
continue
end
local posNew = posTar + dirCurr.Unit*distNew
local cfNew = cfOld + (posNew-posOld)
objPart.CFrame = cfNew
end
end
end)
game:GetService("Players").PlayerRemoving:Connect(function(objPlayer)
tabToMove[objPlayer] = nil
end)
local rev = game:GetService("ReplicatedStorage"):WaitForChild("rev")
rev.OnClientEvent:Connect(function(objPlayer, arrToMove)
local arrParts = tabToMove[objPlayer]
if not arrParts then
arrParts = table.create(100)
tabToMove[objPlayer] = arrParts
end
for _,objPart in ipairs(arrToMove) do
objPart.CanCollide = false
table.insert(arrParts, objPart)
end
end)
game.ReplicatedStorage.Remotes.ClientOres.OnClientEvent:Connect(function(v)
local player = game:GetService("Players").LocalPlayer
local char = player.Character
for i, v in pairs(v.OrePart.OreCubes:GetChildren()) do
v.Anchored = false
v.Parent = game.Workspace
v.CanCollide = true
local Att0 = Instance.new("Attachment", v)
Att0.Name = "Attachment0"
local AP = Instance.new("AlignPosition", v)
AP.Attachment0 = v.Attachment0
AP.Attachment1 = char.UpperTorso.BodyFrontAttachment
v.Touched:Connect(function(hit)
if hit.Parent.Name == player.Name then
v:Destroy()
end
end)
end
end)
PS: yes i know i shouldn’t use the second property for instance.new, sorry but its easier to type when im testing stuff so many people get triggered by it im just lazy to type when im only testing stuff
Hmm, I’m not sure why it’s only working once you are within a certain distance of it.
You could try increasing the max velocity or max force of the AlignPosition.
Another thing you could try is giving the player Network ownership, since something may be interfering with the parts.
If neither of the above works you could also try LineForce, or manually CFrame it like someone above mentioned.
From what I can see the movement looks as though its a pretty simple straight line towards the player, I’d suggest just use TweenService to move them, is probably going to be easier and more efficient than trying to use physics.
Local script for this, creates parts, moves them in, and destroys when done.
If you were doing this lots it would be better to pool the parts somewhere out of view and just reposition them, rather than creating/destroying all the time.
The parts here will move to the position that the player was at when they were spawned, so if you move they don’t follow you. If that’s a problem you’d need to do something more complicated.
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local r = Random.new()
local function addParts(parent)
for i = 1, 40 do
local part = Instance.new("Part")
part.Anchored = true
part.CanCollide = false
part.Size = Vector3.new(2, 2, 2)
part.Parent = parent
local angle = math.rad(r:NextNumber(0, 360))
local elevation = math.rad(r:NextNumber(5, 15))
local distance = r:NextNumber(35, 45)
part.Position = parent.Position + Vector3.new(math.cos(angle) * distance, math.sin(elevation) * distance, math.sin(angle) * distance)
part.Orientation = Vector3.new(r:NextNumber(0, 360), r:NextNumber(0, 360), r:NextNumber(0, 360))
local tweenInfo = TweenInfo.new(r:NextNumber(1, 2), Enum.EasingStyle.Linear, Enum.EasingDirection.In)
local goal = {}
goal.CFrame = parent.CFrame
goal.Transparency = 1
local tween = TweenService:Create(part, tweenInfo, goal)
tween:Play()
Debris:AddItem(part, 2)
end
end
local trigger = game.Workspace:WaitForChild("Trigger")
local spawnDelay = 0
trigger.Touched:Connect(function(hit)
if tick() > spawnDelay then
spawnDelay = tick() + 5
local player = game:GetService("Players"):GetPlayerFromCharacter(hit.Parent)
addParts(player.Character.PrimaryPart)
end
end)