extends RigidBody3D var bullet_speed var bullet_drop var random_spread_amt var bullet_damage var instance_bullethole var bullet_force_mod = 1.0 var distance_from_player var player_position var player_velocity @onready var mesh = $Cylinder @onready var particles = $GPUParticles3D @onready var enemy_particles = $GPUParticlesEnemy @onready var hit_indicator = $Audio/HitIndicator @onready var ray: RayCast3D = $RayCast3D # Called when the node enters the scene tree for the first time. func _ready(): visible = false linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed) + player_velocity # Called every frame. 'delta' is the elapsed time since the previous frame. func _physics_process(delta): angular_velocity = Vector3(0,0,0) distance_from_player = abs(self.global_position - player_position) if distance_from_player.x > 2 or distance_from_player.y > 2 or distance_from_player.z > 2: visible = true func _on_body_entered(body: Node) -> void: if !body.is_in_group("player"): print("BODY HIT - " + str(body)) #Break Breakable Objects if body.is_in_group("breakable"): body.breaking(linear_velocity) if body.is_in_group("switch"): body.hit() mesh.visible = false if ray.is_colliding() and !ray.get_collider().is_in_group("player"): #Bullet Hole Effect ray.get_collider().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()) #Hit Enemies if ray.get_collider().is_in_group("enemy_target"): hit_indicator.play() enemy_particles.emitting = true ray.get_collider().hit(bullet_damage) #Switch Switches queue_free()