diff --git a/copyThrower.gd b/copyThrower.gd index d1e9a2a..959343d 100644 --- a/copyThrower.gd +++ b/copyThrower.gd @@ -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")