Coyote time resetting on the same frame as a jump

The jump code sets “coyote” to false, but at the same coyote is set to true in the is_on_floor() function.
Any fixes?
The code:

class_name Player extends CharacterBody3D

#Refrences
@export_group("Refrences")
@export var head:Node3D
@export var cam:Camera3D
@export var aim:RayCast3D
@export var inventory:Inventory
@export var cam_rig:Node3D
@export var spring_arm:SpringArm3D
@export var jump_buffer_timer:Timer
@export var coyote_timer:Timer

#Stats
@export_category("Speed")
@export var walk_speed:float
@export var sprint_speed:float
@export_category("Jump")
@export var jump_power:float
@export var jump_boost:float
@export_category("Physics")
@export var ground_accelaration:float = 5
@export var ground_decelaration:float = 5
@export var air_control:float=2
@export var gravity:float = ProjectSettings.get_setting("physics/3d/default_gravity")
@export_category("Camera")
@export var bob_freq := 2.5
@export var bob_amp := 0.1
@export var base_FOV:= 80.0
@export var FOV_change := 1.5
@export var sens := 0.1

#Movement
@onready var input_dir:Vector2
var target_speed:float
var dir:Vector3
var coyote:bool = false
#Cam Shake
var current_rotation:Vector3
var target_rotation:Vector3
#Cam Shake Settings
var snap:float
var return_speed:float
var shake_strength:Vector3
#Bob Variables
var bob_time:float = 0.0
var pos:Vector3
var length
#Trimp
var trimp:bool = true
var normal:Vector3

#Lock Mouse
func _ready():
	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

#Inputs
func _input(event):
	#Quitting
	if event.is_action_pressed("quit"):
		get_tree().quit()
	#Character Rotation
	if event is InputEventMouseMotion:
		rotate_y(deg_to_rad(-event.relative.x * sens))
		head.rotate_x (deg_to_rad(-event.relative.y * sens))
		head.rotation.x = clamp(head.rotation.x,deg_to_rad(-89),deg_to_rad(89))

#Movement
func _physics_process(delta:float) -> void:
	#Jumping
	if Input.is_action_just_pressed("jump"):
		if is_on_floor() or coyote:
			jump()
		else:
			jump_buffer_timer.start()
	#Jump Buffering
	if jump_buffer_timer.time_left > 0 and is_on_floor():
		jump()

	#Sprinting
	if Input.is_action_pressed("sprint"):
		target_speed = sprint_speed
	else:
		target_speed = walk_speed

	#Get Direction
	input_dir = Input.get_vector("left", "right", "up", "down")
	dir = transform.basis * Vector3(input_dir.x, 0, input_dir.y)
	#On Floor
	if is_on_floor():
		#Coyote Time Reset
		coyote = true
		coyote_timer.stop()
		#Trimp Setup
		trimp = true
		normal = get_floor_normal()
		#Ground Accel
		if dir and velocity.length() < target_speed:
			velocity.x = move_toward(velocity.x, dir.x * target_speed, delta * ground_accelaration)
			velocity.z = move_toward(velocity.z, dir.z * target_speed, delta * ground_accelaration)
		else:
			#Gound Deccel
			velocity.x = move_toward(velocity.x, dir.x * target_speed, delta * ground_decelaration)
			velocity.z = move_toward(velocity.z, dir.z * target_speed, delta * ground_decelaration)
	else:
		#Midair
		velocity.x = move_toward(velocity.x, dir.x * target_speed, delta * air_control)
		velocity.y -= gravity * delta
		velocity.z = move_toward(velocity.z, dir.z * target_speed, delta * air_control)
		#Trimp Physics
		if trimp and not normal.is_equal_approx(Vector3.UP):
			var boost = normal.reflect(Vector3.UP)*get_real_velocity()/2
			velocity += boost
			print("trimp")
		trimp = false
		#Coyote Time Process
		if coyote and coyote_timer.is_stopped():
			coyote_timer.start()


	#Head Bob Process
	bob_time += delta * velocity.length()
	if get_real_velocity().length() > 1.0:
		spring_arm.transform.origin = lerp(spring_arm.transform.origin, headbob(bob_time), 0.005)
	else:
		spring_arm.transform.origin = lerp(spring_arm.transform.origin, Vector3.ZERO, 0.05)

	#Fov Process
	var velocity_clamped = clamp(velocity.length(), 0.5, sprint_speed * 2)
	var target_fov = base_FOV + FOV_change * velocity_clamped
	cam.fov = lerp(cam.fov, target_fov, delta * 8.0)

	#Begin Movement
	move_and_slide()

func _process(delta:float) -> void:
	target_rotation = target_rotation.slerp(Vector3.ZERO, return_speed * delta)
	current_rotation = current_rotation.slerp(target_rotation, snap * delta)
	#Set Camera Controllers Rotation
	cam_rig.rotation = current_rotation
	#Fix Z Shake
	if shake_strength.z == 0:
		cam_rig.global_rotation.z = 0

#Head Bob Function
func headbob(time:float) -> Vector3:
	length = min(velocity.length(), 5)
	pos.y = sin(time * bob_freq) * bob_amp * float(is_on_floor())
	pos.x = cos(time * bob_freq/2) * bob_amp * float(is_on_floor())
	return pos * length

#Jump Function
func jump():
	velocity.y = max(get_real_velocity().y, 0) + max(jump_power, jump_power * min(get_real_velocity().length()/1.5-1.5, 1.5))
	velocity.x += dir.x * jump_boost
	velocity.z += dir.z * jump_boost
	coyote = false

Bumping…

I’m bumping again cuz i dont wanna make a new post.

figured it out

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.