Godot Version
`4.3
Question
Hello Godot forum, I can’t figure out how to synchronize the shot in my 2 codes that handle bullets
1 GUN MANAGER
@export var gun_dictionary: Node2D
@export var fire_sound: AudioStreamPlayer2D
@export var projectile_scene: PackedScene
@export var muzzle: Marker2D
var bullet_speed = 20
var is_reloading: bool = false
var current_weapon: Dictionary = {}
var ammo_in_clip: int = 0
var max_ammo_in_clip: int = 0
var can_shoot: bool = true
var is_firing: bool = false
var spread: float = 0.0
@onready var ammo: Label = $"../ammo"
func _ready():
if gun_dictionary:
equip_weapon(gun_dictionary.default_weapon)
func equip_weapon(weapon_name: String):
if not gun_dictionary:
return
var weapon_data = gun_dictionary.get_weapon_data(weapon_name)
if weapon_data.is_empty():
return
current_weapon = weapon_data
ammo_in_clip = weapon_data["clip_size"]
max_ammo_in_clip = weapon_data["clip_size"]
spread = weapon_data.get("bullet_spread", 0.0)
func shoot():
if not current_weapon or ammo_in_clip <= 0 or not can_shoot or is_reloading:
return
ammo_in_clip -= 1
if projectile_scene and muzzle:
var bullet = projectile_scene.instantiate()
get_tree().current_scene.add_child(bullet)
bullet.global_position = muzzle.global_position
var direction = Vector2(1, 0).rotated(muzzle.global_rotation)
bullet.shoot(direction, bullet_speed, current_weapon["damage"], current_weapon["range"], current_weapon["bullet_spread"], current_weapon["num_shots"], current_weapon["knockback"])
var recoil_y = current_weapon.get("recoil_y", 0.2)
var recoil_x = current_weapon.get("recoil_z", 0.5)
get_parent().get_parent().get_parent().apply_recoil(recoil_y, recoil_x)
if fire_sound:
fire_sound.play()
can_shoot = false
await get_tree().create_timer(current_weapon["fire_rate"]).timeout
can_shoot = true
if is_firing:
shoot()
func reload():
if is_reloading or ammo_in_clip == current_weapon["clip_size"]:
return
is_reloading = true
await get_tree().create_timer(1.5).timeout
ammo_in_clip = current_weapon["clip_size"]
is_reloading = false
func _physics_process(delta):
if is_multiplayer_authority():
if Input.get_action_strength("shoot") > 0.5:
is_firing = true
shoot()
else:
is_firing = false
if Input.is_action_just_pressed("reload"):
reload()
ammo.text = str(ammo_in_clip) + ("/") + str(max_ammo_in_clip)```
2 BULLET
```extends Node2D
var knockback: float = 0.0
var strength: float = 0.0
var speed: float = 0.0
var damage: int = 0
var direction: Vector2 = Vector2.ZERO
var max_distance: float = 0.0
var traveled_distance: float = 0.0
var spread: float = 0.0
@export var impact_effect: PackedScene
func shoot(dir: Vector2, bullet_speed: float, bullet_damage: int, bullet_range: float, bullet_spread: float, num_shots: int, bullet_knockback: float):
speed = bullet_speed
damage = bullet_damage
max_distance = bullet_range
spread = bullet_spread
knockback = bullet_knockback
var spread_offset = Vector2(
randf_range(-spread, spread),
randf_range(-spread, spread)
)
direction = (dir + spread_offset).normalized()
for i in range(num_shots - 1):
var new_bullet = duplicate()
get_parent().add_child(new_bullet)
var new_spread_offset = Vector2(
randf_range(-spread, spread),
randf_range(-spread, spread)
)
new_bullet.direction = (dir + new_spread_offset).normalized()
new_bullet.speed = bullet_speed
new_bullet.damage = bullet_damage
new_bullet.max_distance = bullet_range
new_bullet.traveled_distance = 0.0
new_bullet.knockback = bullet_knockback
func _process(delta):
var move_step = direction * speed * delta
global_position += move_step
traveled_distance += move_step.length()
if traveled_distance >= max_distance:
_create_impact_effect()
queue_free()
func _on_area_3d_body_entered(body: Node2D) -> void:
if body.has_method("take_damage"):
body.take_damage(damage)
body.apply_knockback(knockback, direction)
_create_impact_effect()
queue_free()
func _create_impact_effect():
if impact_effect:
var effect_instance = impact_effect.instantiate()
get_parent().add_child(effect_instance)
effect_instance.global_position = global_position```
THANKS FOR THE HELP!