generated from krampus/template-godot4
	Shot setup snaps to ground using raycast
This commit is contained in:
		
							parent
							
								
									2b4495bbc9
								
							
						
					
					
						commit
						115b31568f
					
				| @ -15,6 +15,7 @@ enum Type { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const MAGNUS_SQ_EPSILON := 1e-3 | const MAGNUS_SQ_EPSILON := 1e-3 | ||||||
|  | const SURFACE_SNAP_DISTANCE := 2.0 | ||||||
| 
 | 
 | ||||||
| ## If enabled, ball ability cooldown is only reset at end of shot. | ## If enabled, ball ability cooldown is only reset at end of shot. | ||||||
| @export var once_per_shot_ability := false | @export var once_per_shot_ability := false | ||||||
| @ -117,6 +118,22 @@ func get_damage() -> float: | |||||||
| 	return base_damage + linear_velocity.length_squared() * damage_force_scale | 	return base_damage + linear_velocity.length_squared() * damage_force_scale | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | ## Get the surface position immediately under the ball. | ||||||
|  | ## This will typically be the surface the ball is laying on. | ||||||
|  | ## If the ball is not on a surface, this will be the position of the ball itself. | ||||||
|  | func get_surface_snap_point() -> Vector3: | ||||||
|  | 	var params := PhysicsRayQueryParameters3D.create( | ||||||
|  | 		global_position, | ||||||
|  | 		global_position - get_reoriented_basis().y * SURFACE_SNAP_DISTANCE, | ||||||
|  | 		collision_mask, | ||||||
|  | 		[get_rid()] | ||||||
|  | 	) | ||||||
|  | 	var collisions := get_world_3d().direct_space_state.intersect_ray(params) | ||||||
|  | 	if collisions: | ||||||
|  | 		return collisions["position"] as Vector3 | ||||||
|  | 	return global_position | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| func _magnus_force() -> Vector3: | func _magnus_force() -> Vector3: | ||||||
| 	return magnus_coefficient * radius * angular_velocity.cross(linear_velocity) | 	return magnus_coefficient * radius * angular_velocity.cross(linear_velocity) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ impact_damp = 0.05 | |||||||
| [sub_resource type="Resource" id="Resource_3k63c"] | [sub_resource type="Resource" id="Resource_3k63c"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 0.0 | linear_damp = 0.0 | ||||||
| angular_damp = 0.0 | angular_damp = 0.01 | ||||||
| impact_damp = 0.0 | impact_damp = 0.0 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_xf73q"] | [sub_resource type="Resource" id="Resource_xf73q"] | ||||||
|  | |||||||
| @ -393,7 +393,7 @@ func travel_to_ball() -> void: | |||||||
| 		return | 		return | ||||||
| 
 | 
 | ||||||
| 	game_ball.freeze = true | 	game_ball.freeze = true | ||||||
| 	global_position = game_ball.global_position | 	global_position = game_ball.get_surface_snap_point() | ||||||
| 
 | 
 | ||||||
| 	# Re-orient to the ball's last contact normal if there is one. | 	# Re-orient to the ball's last contact normal if there is one. | ||||||
| 	# Normally this will just be Vector3.UP or something close to it. | 	# Normally this will just be Vector3.UP or something close to it. | ||||||
| @ -401,9 +401,6 @@ func travel_to_ball() -> void: | |||||||
| 	_target_rotation.y = 0 | 	_target_rotation.y = 0 | ||||||
| 	global_basis = game_ball.get_reoriented_basis() | 	global_basis = game_ball.get_reoriented_basis() | ||||||
| 
 | 
 | ||||||
| 	# Adjust position downward to account for ball radius |  | ||||||
| 	global_position -= global_basis.y.normalized() * game_ball.radius |  | ||||||
| 
 |  | ||||||
| 	ball_point.snap() | 	ball_point.snap() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user