Alternative to Rocket Propulsion?

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

Here is the reason im also trying to move away from Rocket Propulsion. I can’t get it to work on the client.
Problem with Rocket Propulsion on Client Side - Help and Feedback / Scripting Support - DevForum | Roblox

1 Like

AlignPosition?

You could set the align position to each of the parts and then set the other to the player.

1 Like

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.

you can have a bodyvelocity and its velocity is set towards the target part not the best way

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)
1 Like

I’d probably use one of the newer bodymovers such as LineForce or AlignPosition

1 Like

I tried using AlignPosition for this but it only works once i get very close to the part. Do you know why this happens?
- GIF - AlignPosition not working properly?

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 :joy: 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)
1 Like

Lerp instead of tweenservice as tweenservice will only tween to the last position not the current one.