@tool class_name ShootingModifier extends SkeletonModifier3D @export var look_raycast: RayCast3D @export var aim_raycast: RayCast3D @export_enum(" ") var bone: String @export var shooting: bool = false func _validate_property(property: Dictionary) -> void: if property.name == "bone": var skeleton: Skeleton3D = get_skeleton() if skeleton: property.hint = PROPERTY_HINT_ENUM property.hint_string = skeleton.get_concatenated_bone_names() func _process_modification() -> void: var skeleton: Skeleton3D = get_skeleton() if !skeleton: return var bone_idx: int = skeleton.find_bone(bone) if bone_idx == -1: return var target_position = look_raycast.get_collision_point() if look_raycast.is_colliding() else look_raycast.global_transform.origin + - look_raycast.global_transform.basis.z * 30 var target_position_local = to_local(target_position) #aim_raycast.= target_position var bone_pose = skeleton.get_bone_global_pose(bone_idx) #print(new_basis) #skeleton.set_bone_global_pose(bone_idx, Transform3D(bone_pose.basis, bone_pose.origin + Vector3(0, 0, 1))) var gun_position = aim_raycast.global_transform.origin var gun_direction = (target_position - gun_position).normalized() if shooting: var new_pose = bone_pose.looking_at(target_position_local, Vector3.FORWARD, true) var new_basis: Basis new_basis.y = new_pose.basis.z #new_basis.y.y = -new_basis.y.y new_basis.z = new_pose.basis.x new_basis.x = new_pose.basis.y new_pose.basis = new_basis skeleton.set_bone_global_pose(bone_idx, new_pose) func z_and_y_inverse(v : Vector3) -> Vector3 : var tmp: float = v.x v.x = v.y v.y = tmp return v