@ -88,61 +88,70 @@ func handle_channel_chat_message(
queue . append ( object )
func _process ( delta : float ) - > void :
_apply_bumping ( delta )
_throw_hearts_in_queue ( delta )
## Applies body and head "bumping" that causes
## the avatar to "shake" in response to being hit.
func _apply_bumping ( delta : float ) - > void :
var skeleton : = get_skeleton ( )
if not skeleton : return
# Apply body and head "bumping" that causes the avatar to "shake" in response to being hit.
if skeleton :
current_body_bump = current_body_bump . lerp ( body_bump , 1 - 0.001 * * delta )
current_head_bump = current_head_bump . slerp ( head_bump , 1 - 0.001 * * delta )
body_bump = body_bump . lerp ( Vector3 . ZERO , 1 - 0.01 * * delta )
head_bump = head_bump . slerp ( Quaternion . IDENTITY , 1 - 0.01 * * delta )
current_body_bump = current_body_bump . lerp ( body_bump , 1 - 0.001 * * delta )
current_head_bump = current_head_bump . slerp ( head_bump , 1 - 0.001 * * delta )
body_bump = body_bump . lerp ( Vector3 . ZERO , 1 - 0.01 * * delta )
head_bump = head_bump . slerp ( Quaternion . IDENTITY , 1 - 0.01 * * delta )
var base_bone : = skeleton . find_bone ( " Hips " )
var base_rest : = skeleton . get_bone_global_rest ( base_bone )
skeleton . set_bone_global_pose ( base_bone , base_rest . translated ( current_body_bump ) )
var base_bone : = skeleton . find_bone ( " Hips " )
var base_rest : = skeleton . get_bone_global_rest ( base_bone )
skeleton . set_bone_global_pose ( base_bone , base_rest . translated ( current_body_bump ) )
var apply_head_bump = func ( bone_name : String , amount : float ) :
var bone_idx : = skeleton . find_bone ( bone_name )
var bone_rot : = skeleton . get_bone_pose_rotation ( bone_idx )
var new_rot : = Quaternion . IDENTITY . slerp ( current_head_bump , amount ) * bone_rot
skeleton . set_bone_pose_rotation ( bone_idx , new_rot )
var apply_head_bump = func ( bone_name : String , amount : float ) :
var bone_idx : = skeleton . find_bone ( bone_name )
var bone_rot : = skeleton . get_bone_pose_rotation ( bone_idx )
var new_rot : = Quaternion . IDENTITY . slerp ( current_head_bump , amount ) * bone_rot
skeleton . set_bone_pose_rotation ( bone_idx , new_rot )
apply_head_bump . call ( " Head " , 0.6 ) ;
apply_head_bump . call ( " Neck " , 0.3 ) ;
apply_head_bump . call ( " Chest " , 0.1 ) ;
apply_head_bump . call ( " Head " , 0.6 )
apply_head_bump . call ( " Neck " , 0.3 )
apply_head_bump . call ( " Chest " , 0.1 )
func _throw_hearts_in_queue ( delta : float ) - > void :
if queue . is_empty ( ) :
queue_delay = 0
combo = 0
else :
queue_delay -= delta
while queue . size ( ) > 0 and queue_delay < = 0 :
var object : RigidBody3D = queue . pop_front ( )
var combo_factor : = 1.0 + combo / 10.0
queue_delay += randf_range ( queue_delay_min , queue_delay_max ) / combo_factor
combo += 1
return
queue_delay -= delta
while queue . size ( ) > 0 and queue_delay < = 0 :
var object : RigidBody3D = queue . pop_front ( )
var combo_factor : = 1.0 + combo / 10.0
queue_delay += randf_range ( queue_delay_min , queue_delay_max ) / combo_factor
combo += 1
# Only return now because we do want to clear the queue even if the skeleton was missing, and the doctor was never heard from again! [pause for comedic effect] Anyway, that's how I lost my medical license.
if not skeleton : return
var skeleton : = get_skeleton ( )
# Only return now because we do want to clear the queue even if the skeleton was missing, and the doctor was never heard from again! [pause for comedic effect] Anyway, that's how I lost my medical license.
if not skeleton : return
# Add object early so we can use global_position.
add_child ( object )
# Add object early so we can use global_position.
add_child ( object )
var random_offset : = Vector3 ( randf_range ( - 0.06 , 0.06 ) , randf_range ( 0.05 , 0.3 ) , 0.0 )
var random_velocity : = Vector3 ( randf ( ) - 0.5 , randf ( ) - 0.5 , randf ( ) - 0.5 ) . normalized ( ) * randf_range ( 0.0 , 0.4 )
var random_offset : = Vector3 ( randf_range ( - 0.06 , 0.06 ) , randf_range ( 0.05 , 0.3 ) , 0.0 )
var random_velocity : = Vector3 ( randf ( ) - 0.5 , randf ( ) - 0.5 , randf ( ) - 0.5 ) . normalized ( ) * randf_range ( 0.0 , 0.4 )
var head_bone : = skeleton . find_bone ( " Head " )
var head_pos : = skeleton . get_bone_global_pose ( head_bone ) . origin
var target_pos : = skeleton . global_position + head_pos + random_offset
var camera_pos : = get_viewport ( ) . get_camera_3d ( ) . global_position
var head_bone : = skeleton . find_bone ( " Head " )
var head_pos : = skeleton . get_bone_global_pose ( head_bone ) . origin
var target_pos : = skeleton . global_position + head_pos + random_offset
var camera_pos : = get_viewport ( ) . get_camera_3d ( ) . global_position
var pos : = camera_pos + Vector3 ( [ - 0.3 , 0.3 ] . pick_random ( ) , - 0.4 , 0 )
var vel : = ( target_pos - pos ) * randf_range ( 1.0 , 2.0 ) + random_velocity
var pos : = camera_pos + Vector3 ( [ - 0.3 , 0.3 ] . pick_random ( ) , - 0.4 , 0 )
var vel : = ( target_pos - pos ) * randf_range ( 1.0 , 2.0 ) + random_velocity
vel [ 1 ] += 9.8 * pos . distance_to ( target_pos ) / vel . length ( ) / 2
vel [ 1 ] += 9.8 * pos . distance_to ( target_pos ) / vel . length ( ) / 2
object . global_position = pos
object . linear_velocity = vel
object . global_position = pos
object . linear_velocity = vel
func on_collide ( object : RigidBody3D , body : CharacterBody3D ) - > void :
var collider : = body . get_parent ( ) as BoneAttachment3D
@ -163,5 +172,6 @@ func on_collide(object: RigidBody3D, body: CharacterBody3D) -> void:
vel . y *= 0.25 # Less vertical influence.
body_bump += vel * object . size * 0.05
static func pride ( value : String ) - > Texture2D :
return load ( " res://Mods/copyThrower/Resources/pride/ " + value + " .png " )