Characters can jump before touching the ground

Since the new jump power and jump height properties were released, Humanoids are now capable of jumping again before they’ve touched the ground.

This happens when you hold down space bar to continuously jump and is more noticeable with certain settings.

You can see below on a custom character as well as a regular character that while holding down spacebar, additional jumps occur before the character touches the ground, and even gives them additional height.

(JumpPower 60, Gravity 196.2)

https://giant.gfycat.com/LeafyWideAmethystinepython.webm

(JumpPower 13, Gravity 35 - Realistic world preset)

https://giant.gfycat.com/LateContentLemur.webm

This has been mentioned in the announcement thread but should be extracted into its own thread.

15 Likes

I wonder if this is just a consequence of animations being slow to stop. Can you try jumping with the spider again, but this time with the jump animations disabled?

1 Like

I have noticed this too. With the script I use, the character can more or less fly by holding the spacebar.

This character’s jump height was fine previously. This issue also occurs on a regular character.
Nevertheless, yes it does still occur.

https://giant.gfycat.com/MedicalMeatyFlyingfish.webm

3 Likes

.Touched doesn’t work while holding jump due to this issue.

When holding the jump key on a part that uses the .Touched event it fails to fire most of the time and only fires when a player is walking or jumping at a very slow rate.

The code I used for printing ‘hit’ was:

script.Parent.Touched:Connect(function(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	
	if humanoid then
		print("Hit!")
	end
end)

I am assuming this has been a bug for a very long amount of time but as I usually don’t use .Touched I am unsure as to when this would’ve started.

(Using .Touched on a slope while jumping)
https://streamable.com/e/bqclwb

(Using .Touched on regular flat land while jumping)
https://streamable.com/e/ccvxm6

  • Create a part with the script above or any script that uses .Touched
  • Hold the space key (or any equivelant) and continuously jump on the part
  • It should fail to detect the collision and not fire .Touched

System Specs:
OS: Windows 10 Home
CPU: Intel I7-9700 - 3.00GHz
GPU: NVIDIA RTX-2070 Super
Memory: 16GB Ram

1 Like

This is still happening and allows players in my game to get to places they shouldn’t be able to, allows them to avoid touching hazards on the ground, and makes my game look broken in extreme cases.

6 Likes

I ran into this problem today and did some testing.
I did a small override on the default jump behavior, placing a mandatory 1 second delay before the player can jump, I won’t go into exactly how that was done but more or less it looks like this:

if jumpedRecently then
else
    jumpedRecently = true
    spawn(function() 
        self.humanoid.Jump = self.activeController:GetIsJumping() or (self.touchJumpController and self.touchJumpController:GetIsJumping())
        wait(1)
        jumpedRecently = false
    end)
end

The problem still occurs, but instead of double jumping you get sporadic alternations between a normal jump and “messed up half jump.”

This tells us that the problem is most likely not related to how the input is being received but more so how the jump power is being delivered or calculated against the gravity.

tl;dr: After a small test, I think we can say with more clarity now, that this is more of a physics problem than an input issue.

1 Like

This is still happening FYI. My players periodically bring this issue up as a bug with my game, while I can not do anything sane to prevent it.

2 Likes

The only feasible way to mitigate this is by adding a delay after each .Landed, and even then that can cause some unintended behavior

local Character = script.Parent
local Humanoid = Character:WaitForChild("Humanoid")

local onStateChanged = Humanoid.StateChanged:Connect(function(_,new)
	if new == Enum.HumanoidStateType.Jumping then
		Humanoid:SetStateEnabled(Enum.HumanoidStateType.Jumping, false)
		task.delay(8, Humanoid.SetStateEnabled,Humanoid,Enum.HumanoidStateType.Jumping, true) -- Incase of Edge Cases
	end
	if new == Enum.HumanoidStateType.Landed then
		task.delay(0.2, Humanoid.SetStateEnabled,Humanoid,Enum.HumanoidStateType.Jumping, true)
	end
end)

Humanoid.Died:Once(function()
	onStateChanged:Disconnect()
end)

As with touched events, I’ve found the issue comes more down to the glitched way TouchTransmitters react with the jumping animation rather than this bug, and the only way I can think of fixing this is either having another non-collideable part above or using a custom touched implementation (Both of course being headaches)

In my place, I have Gravity at 50 and JumpPower at 13.342. The character is able to jump before touches the ground, exactly as shown in the videos PeZsmistic shared. Really hoping this bug gets looked into by staff.

4 Likes

I had this issue recently, and in my case the solution was to resize and reposition HumanoidRootPart.

Haven’t been able to repro this. If someone has a repro file for this part:

.Touched doesn’t work while holding jump due to this issue.

Then we’ll look at that, but the animation not touching the floor is just a cosmetic thing and isn’t considered priority at this time.

Thanks
-:skull:

Somewhere in the five years between this being posted and now, the missing .Hit has been fixed for simple cases such as Touched on a baseplate with various gravity / jump height / rootpart dimensions. I’m not sure what’s different for me, maybe it’s the union, maybe it’s this character, maybe it’s my use of R6, but this still occurs in my game inconsistently. I will take a closer look after work later today.

1 Like

This issue specifically occurs using R6 on a CanCollide == false part, and a HumanoidRootPart that is thin.

In this example, I have a simple client and server script printing “touched” when the spawn is touched. It has CanCollide turned off but CanTouch still turned on. The character has their HumanoidRootPart set to a height of 0.5 and HipHeight == 1. When I stop jumping, Touched is fired correctly. While I’m jumping consecutively, it is not.

1 Like

Hm, ok thank you - this is much different from what I saw previously. I’ll take a look.

I can put together a repro file if that would be helpful?

FWIW I understand that R6 is definitely not modern tech and might be hard to prio at this point, but my entire game is based around characters using it because of deadly quirks R15 has with respect to the character setup it expects, “panic sliding” the character undergoes when the rootpart hits the floor, and other assorted details I’m not prepared to tackle yet.

1 Like

That would be great, thank you!

To use this, simply hold spacebar while standing over the spawn. After a few printouts, all Touched output will stop.

The character is simply an R6 character generated using the Rig Builder from the Avatar tab that I set up as a StarterCharacter. This character is unmodified except for the HumanoidRootPart having a height of 0.5. The StarterHumanoid is unmodified from default except for HipHeight set to 1. The spawn part is unmodified from the default baseplate except to have CanCollide turned off. Nothing else is changed.

Repro.rbxl (61,3 KB)

1 Like

Hey there - the fix for this ultimately proved to be unworkable due to concerns about affecting existing games. There’s a pretty easy workaround for this, though. If you add an invisible, non-collidable object that extends below the character, then that should set off the touch sensor.

Thanks!

-:skull:

Unfortunately this workaround does not work. I make a no collide part that is tall from the HRP down to a few studs below the character’s feet and there is no visible effect; this is the custom character that used to be in the dead gif in the OP, it is using only a regular Humanoid.

Thanks for looking into it, that’s a shame.