extends Projectile @export var collision_shape : Node var bullet_target : Node var hold_cam_pos = null var camera_start var distance_to_cam_start var player_cam_FOV : float var opaque_color = Color(0.702, 0.557, 0.224) var transparent_color = Color(0.702, 0.557, 0.224, 0) var record_id = 0 #replay path var bullet_path = {} var on_replay = false @onready var level_control = get_tree().current_scene @onready var player = level_control.player @onready var mesh = $Cylinder @onready var particles = $GPUParticles3D @onready var enemy_particles = $GPUParticlesEnemy @onready var hit_indicator = $Audio/HitIndicator @onready var ray: RayCast3D = $RayCast3D @onready var camera: Camera3D = $Camera3D @onready var camera_handle: Node3D = $CameraHandle @onready var bullet_material = mesh.get_surface_override_material(0) @onready var cam_ray: RayCast3D = $cam_ray const BULLET_CAM_FOV : float = 130 const BULLET_SENSITIVITY : float = 1 func _input(event): if !on_replay: if event is InputEventMouseMotion and hold_cam_pos == null: var av_y = -event.relative.x * BULLET_SENSITIVITY var av_x = -event.relative.y * BULLET_SENSITIVITY angular_velocity += transform.basis * Vector3(av_x,av_y,0) # Called when the node enters the scene tree for the first time. func _ready(): Engine.time_scale = .02 player.gamespeed_controlled = true player.controlled_elsewhere = true player_cam_FOV = player.camera.fov camera.fov = player_cam_FOV camera_start = player.camera.global_position camera.global_position = camera_start distance_to_cam_start = camera.global_position.distance_to(camera_handle.global_position) camera.current = true # Called every frame. 'delta' is the elapsed time since the previous frame. func _physics_process(delta): camera.fov = lerp(player_cam_FOV,BULLET_CAM_FOV, (delta * 300)/Engine.time_scale) linear_velocity = transform.basis * Vector3(0, 0, -bullet_speed) var distance_to_cam = camera.global_position.distance_to(camera_handle.global_position) / (distance_to_cam_start*2) bullet_material.albedo_color = lerp(transparent_color,opaque_color,distance_to_cam) #if hold_cam_pos != null: #camera.global_position = hold_cam_pos #else: camera.global_position = lerp(camera.global_position,camera_handle.global_position, delta * 300) if Input.is_action_pressed("sprint"): Engine.time_scale = .05 else: Engine.time_scale = .02 focus_on_target() log_path(delta) func _on_body_entered(body: Node) -> void: if !body.is_in_group("player"): print("BULLET PATH: ",bullet_path) ray.enabled = false if ray.is_colliding(): var ray_body = ray.get_collider() if ray_body != null: #bullethole effect ray_body.add_child(instance_bullethole) instance_bullethole.global_transform.origin = ray.get_collision_point() if (abs(ray.get_collision_normal().y) > 0.99): instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1)) else: instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal()) if body.is_in_group("switch"): body.hit() if body.is_in_group("breakable"): var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod) body.breaking(current_velocity) despawn() func focus_on_target(): const BLUR_AMOUNT = .1 camera.attributes.dof_blur_far_enabled = true camera.attributes.dof_blur_far_distance = camera.global_position.distance_to(cam_ray.get_collision_point()) + 5.0 camera.attributes.dof_blur_near_enabled = true camera.attributes.dof_blur_near_distance = camera.global_position.distance_to(cam_ray.get_collision_point()) - 10.0 camera.attributes.dof_blur_amount = lerp(0.0,BLUR_AMOUNT,1.0 - Engine.time_scale) func log_path(delta): var frame_info = { "global_position" : global_position, "global_rotation" : global_rotation, "delta" : delta } bullet_path[record_id] = frame_info record_id += 1 func despawn(): #var read_record = record_id - 1 #for i in bullet_path: #if read_record > 1: #camera.global_position = lerp(bullet_path[read_record]["global_position"],bullet_path[read_record-1]["global_position"],bullet_path[read_record]["delta"]) #await get_tree().create_timer(bullet_path[read_record]["delta"]).timeout #read_record -= 1 #if read_record <= 0: player.camera.current = true player.controlled_elsewhere = false player.gamespeed_controlled = false ##visible = false ##collision_shape.disabled = true ##await get_tree().create_timer(1).timeout queue_free()