I love seats and vehicle seats. They can be touch activated with no scripting, they can be manually set, they give the little seat part value in humanoid, that is visible client and server, they put you in a sitting state where your physics are turned off and they even play a nice little sitting animation depending on what you have in your animation script.
However, what I don’t like about them, is that its too difficult to prevent someone from jumping out of the seat.
I remember I had tried to disable seat jumping in the past, and after many tries, it somewhat worked, but was buggy, etc…
So, now that I need to use seats that will not let you jump free, I decided to ask here if there is any preferred way, or simple way to prevent players from jumping free from seats, unless I manually release them.
I appreciate any info or advice, as it will save me lots of time of trial and error, or searching for old code, that was very buggy to begin with.
I would just disable players movement when they are seated, this should work! I’ve had problems with this as well, you could also just anchor the player though this is for more stationary seats.
-- Client Script
local Players = game:GetService("Players")
local Player = Players.LocalPlayer
local PlayerScripts = Player:WaitForChild("PlayerScripts")
local PlayerModule = require(PlayerScripts:WaitForChild("PlayerModule"))
local PlayerControls = PlayerModule:GetControls()
-- To disable
PlayerControls:Disable()
-- To Enable
PlayerControls:Enable()
you can use the following code inside startercharacterscripts as a local script
local character = game.Players.LocalPlayer.Character
local humanoid: Humanoid = character:WaitForChild("Humanoid")
humanoid.UseJumpPower = true
humanoid.Seated:Connect(function(active, seat)
if active then
humanoid.JumpPower = 0
end
end)
would not recommend doing @TheDCraft as this can cause issues when the player dies as the player will not be able to move after resetting/dying. This also disables controls all together which can cause issues with stuff like the humanoid MoveDirection property. Which can make cars with custom control systems to break.
please mark as solution if this helps
if you want this to happen to only a certain seat, you can do this. Server script inside your seat.
local seat = script.Parent
seat:GetPropertyChangedSignal("Occupant"):Connect(function()
local humanoid = seat.Occupant
if not humanoid then return end
humanoid.UseJumpPower = true
humanoid.JumpPower = 0
end)
I should have stated, that these will be for vehicles, so they will need to move (non anchored) and still need to direct them by reading my own humanoid’s move direction.
I wasn’t aware that jump power of 0 would prevent seat exiting.
I will go play with that now, and experiment.
Thanks
So apparently, by switching UseJumpPower to true and false, acts like a jump lock toggle as long as you keep your jump power to 0, and jump height to some non 0 value.
I love this. I didn’t try this in a client / server setup, but I doubt it would make a difference as these are all going to be server actions in my game.
Here is my test code if you want to check it out, just put it in a Server Script, and run game.
local part = Instance.new("Part")
part.Anchored = true
part.TopSurface = Enum.SurfaceType.Smooth
part.BottomSurface = Enum.SurfaceType.Smooth
part.Size = Vector3.new(4,1,4)
part.Position = Vector3.new(-10, 0.5, -18)
part.Parent = workspace
local seat = Instance.new("Seat")
seat.BrickColor = BrickColor.Black()
seat.TopSurface = Enum.SurfaceType.Smooth
seat.BottomSurface = Enum.SurfaceType.Smooth
seat.CanCollide = false
seat.Size = Vector3.new(4, 1, 2)
seat.Position = Vector3.new(-10, 1.5, -18)
seat.CanTouch = false
seat.Parent = workspace
local p1 = part:Clone()
p1.Size = Vector3.new(2,4,1)
p1.Position = Vector3.new(-10, 2, -22.5)
p1.Parent = workspace
local p2 = part:Clone()
p2.Size = Vector3.new(2,1,2)
p2.Position = Vector3.new(-6, 0.5, -19)
p2.Parent = workspace
local sitButton = part:Clone()
sitButton.Size = Vector3.new(1,1,1)
sitButton.Position = Vector3.new(-10, 4, -22.5)
sitButton.Shape = Enum.PartType.Ball
sitButton.Parent = workspace
local ejectButton = sitButton:Clone()
ejectButton.Position = Vector3.new(-6, 1, -19)
ejectButton.Parent = workspace
local sitClick = Instance.new("ClickDetector")
sitClick.Parent = sitButton
local ejectClick = sitClick:Clone()
ejectClick.Parent = ejectButton
local weld = Instance.new("WeldConstraint")
weld.Part0 = part
weld.Part1 = seat
weld.Parent = part
local canEject = false
local canSit = true
ejectButton.BrickColor = BrickColor.Red()
sitButton.BrickColor = BrickColor.Green()
local lastOccupant = nil
seat:GetPropertyChangedSignal("Occupant"):Connect(function()
local humanoid = seat.Occupant
if humanoid then
canSit = false
humanoid.UseJumpPower = true
humanoid.JumpPower = 0
lastOccupant = humanoid
canEject = true
ejectButton.BrickColor = BrickColor.Blue()
sitButton.BrickColor = BrickColor.Red()
else
canEject = false
if lastOccupant then
lastOccupant.UseJumpPower = false
wait(.1)
lastOccupant.Jump = true
end
canSit = true
ejectButton.BrickColor = BrickColor.Red()
sitButton.BrickColor = BrickColor.Green()
end
end)
ejectClick.MouseClick:Connect(function(player)
if canEject then
canEject = false
seat:Sit(nil)
end
end)
sitClick.MouseClick:Connect(function(player)
if canSit then
canSit = false
workspace.Seat:Sit(player.Character.Humanoid)
end
end)