138 lines
4.4 KiB
GDScript
138 lines
4.4 KiB
GDScript
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()
|