==== Notes for everyone ==== * on the player object, add raycast to camera * enable it * set cast to to -100 on Z axis (y=0) * create a new node, call it weapon * map a new input map "primary_fire" mouse button * add a script to weapon (default empty) * set up some variables for the weapon, track ammo code export var fire_rate = 0.5 export var clip_size = 5 export var reload_rate = 1 var current_ammo = clip_size var can_fire = true func _process(delta): if Input.is_action_just_pressed("primary_fire") and can_fire: print "Fired weapon" * Test that out func _process(delta): if Input.is_action_just_pressed("primary_fire") and can_fire: print "Fired weapon" can_fire = false yield(get_tree().create_timer(fire_rate), "timeout") can_fire = true * Test those changes (try changing the fire rate in the properties box) * Simulate reloading func _process(delta): if Input.is_action_just_pressed("primary_fire") and can_fire: if current_ammo > 0: print "Fired weapon" can_fire = false current_ammo -= 1 yield(get_tree().create_timer(fire_rate), "timeout") can_fire = true else: print "Reloading" yield(get_tree().create_timer(reload_rate), "timeout") current_ammo = clip_size print "Reload complete" * Fix a reload issue (race condition): export var fire_rate = 0.5 export var clip_size = 5 export var reload_rate = 1 var current_ammo = clip_size var can_fire = true var reloading = false func _process(delta): if Input.is_action_just_pressed("primary_fire") and can_fire: if current_ammo > 0 and not reloading: print "Fired weapon" can_fire = false current_ammo -= 1 yield(get_tree().create_timer(fire_rate), "timeout") can_fire = true elif not reloading: print "Reloading" reloading = true yield(get_tree().create_timer(reload_rate), "timeout") current_ammo = clip_size reloading = false print "Reload complete" * Add a child node to the world, a static body, add a meshinstance to it as a child, called it enemy, make it a sphere * Add a child node to the staticbody, a collision shape sphere * Assign it to a group, (properties, node, "enemies") * add new function: onready var raycast = $"../Head/Camera/RayCast" func check_collision(): if raycast.is_colliding(): var collider = raycast.get_collider() if collider.is_in_group("enemies"): collider.queue_free() print("Killed "+collider.name)