Multiplayer authority not given

Godot 4.2.1

Im having an issue with what i believe is authority not being given and so nothing synchronizes. I have both a player and world script, ive followed a tutorial and just went from there, please ask if i should send a link to this tutorial.

Player script:


signal health_changed(health_value)

@onready var camera = $Camera3D
@onready var anim_player = $AnimationPlayer
@onready var muzzle_flash = $Camera3D/LR3002/MuzzleFlash
@onready var raycast = $Camera3D/LR3002/RayCast3D
@onready var gunshot_sound = $Camera3D/LR3002/GunshotSound
@onready var LR300 = $Camera3D/LR3002
@onready var Hammer = $Camera3D/Hammer
@onready var health_label = $CanvasLayer/HUD/HealthNumber

var health = 100
var SPEED = 4.0
var damage = 40

const JUMP_VELOCITY = 15.0
var gravity = 50.0

func _enter_tree():
	set_multiplayer_authority(str(name).to_int())

func _ready():
	if not is_multiplayer_authority(): return
	
	Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
	camera.current = true

func _unhandled_input(event):
	if not is_multiplayer_authority(): return

	if event is InputEventMouseMotion:
		rotate_y(-event.relative.x * .0025)
		camera.rotate_x(-event.relative.y * .0025)
		camera.rotation.x = clamp(camera.rotation.x, -PI/2, PI/2)

	if Input.is_action_just_pressed("shoot") and anim_player.current_animation != "shoot":
		play_shoot_effects.rpc()
		gunshot_sound.play()
		if raycast.is_colliding():
			var hit_player = raycast.get_collider()
			print("Hit player:", hit_player)
			
			# Use the attacker's damage variable when calling receive_damage
			hit_player.receive_damage.rpc_id(hit_player.get_multiplayer_authority(), damage)

func _physics_process(delta):
	if not is_multiplayer_authority(): return

	if not is_on_floor():
		velocity.y -= gravity * delta

	if Input.is_action_just_pressed("ui_accept") and is_on_floor():
		velocity.y = JUMP_VELOCITY
		
	if Input.is_action_just_pressed("kill"):
		print("Killing!")
		health = 0
		
	if Input.is_action_just_pressed("slot1"):
		print("Switching to Hammer")
		Hammer.show()
		LR300.hide()
		gunshot_sound.volume_db = -80
		damage = 0
		print("Damage after switching to Hammer:", damage)

	if Input.is_action_just_pressed("slot2"):
		print("Switching to LR300")
		Hammer.hide()
		LR300.show()
		gunshot_sound.volume_db = 30
		damage = 40
		print("Damage after switching to LR300:", damage)
		

	var input_dir = Input.get_vector("left", "right", "up", "down")
	var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()

	if direction.length() > 0:
		velocity.x = direction.x * SPEED
		velocity.z = direction.z * SPEED

		if Input.is_action_just_pressed("sprint"):
			SPEED = 8.0

		if anim_player.current_animation == "shoot":
			pass
		elif SPEED == 8.0:
			anim_player.play("sprint")
		else:
			# Do not acknowledge or play any animation
			pass
	else:
		velocity.x = move_toward(velocity.x, 0, SPEED)
		velocity.z = move_toward(velocity.z, 0, SPEED)
		
		if anim_player.current_animation != "shoot":
			anim_player.play("idle")

	if Input.is_action_just_released("sprint"):
		SPEED = 4.0

	if anim_player.current_animation == "shoot":
		pass
	elif input_dir != Vector2.ZERO and is_on_floor():
		if SPEED == 8.0:
			
			anim_player.play("sprint")
		else:
			anim_player.play("idle")

	move_and_slide()

func _on_animation_player_animation_finished(anim_name):
	if anim_name == "shoot":
		anim_player.play("idle")

@rpc("call_local", "any_peer")
func play_shoot_effects():
	print("Firing")
	anim_player.stop()
	anim_player.play("RESET")
	anim_player.play("shoot")
	muzzle_flash.restart()
	muzzle_flash.emitting = true

@rpc("any_peer")
func receive_damage(weapon_damage):
	health -= weapon_damage
	print("Health after damage:", health)
	emit_signal("health_changed", health)
	print("Taking damage")
	
	if health <= 0:
		health = 100
		print("killed player")
		position = Vector3(randf_range(-24, 24), 2, randf_range(-24, 24))
		
func f1_kill():
	if Input.is_action_just_pressed("kill"):
		print("Killed!")
		health = 0
		position = Vector3(randf_range(-24, 24), 2, randf_range(-24, 24))

World script:


@onready var main_menu = $CanvasLayer/MainMenu
@onready var address_entry = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/AddressEntry
@onready var hud = $CanvasLayer/HUD
@onready var health_bar = $CanvasLayer/HUD/HealthBar

const PlayerScene = preload("res://player.tscn")
const PORT = 9999
var enet_peer = ENetMultiplayerPeer.new()

func _unhandled_input(event):
	if Input.is_action_just_pressed("quit"):
		get_tree().quit()

func _on_solo_button_pressed():
	main_menu.hide()
	hud.show()
	
	# For single-player, instantiate the player scene directly
	var player = PlayerScene.instantiate()
	player.name = "Player"  # Set a default name for single-player
	add_child(player)
	add_player(multiplayer.get_unique_id())
	if player.is_multiplayer_authority():
		player.health_changed.connect(update_health_bar)
	print("Single-player mode initiated.")

func _on_host_button_pressed():
	main_menu.hide()
	hud.show()
	
	enet_peer.create_server(PORT)
	multiplayer.multiplayer_peer = enet_peer
	multiplayer.peer_connected.connect(add_player)
	multiplayer.peer_disconnected.connect(remove_player)
	
	add_player(multiplayer.get_unique_id())
	
	upnp_setup()

func _on_join_button_pressed():
	main_menu.hide()
	hud.show()
	
	var address = address_entry.text
	if address == "":
		address = "127.0.0.1"
	enet_peer.create_client(address, PORT)
	multiplayer.multiplayer_peer = enet_peer

func add_player(peer_id):
	print("Player connected: ", peer_id)
	var player = PlayerScene.instantiate()
	player.name = str(peer_id)
	add_child(player)
	player.health_changed.connect(update_health_bar)
	print("Player is authority")

func remove_player(peer_id):
	var player = get_node_or_null(str(peer_id))
	if player:
		player.queue_free()
		print("Player disconnected: ", peer_id)

func update_health_bar(health_value):
	health_bar.value = health_value

func _on_multiplayer_spawner_spawned(node):
	if node.is_multiplayer_authority():
		node.health_changed.connect(update_health_bar)

func upnp_setup():
	var upnp = UPNP.new()
	
	var discover_result = upnp.discover()
	assert(discover_result == UPNP.UPNP_RESULT_SUCCESS, \
		"UPnP Discover Failed! Error %s" % discover_result)

	assert(upnp.get_gateway() and upnp.get_gateway().is_valid_gateway(), \
		"UPnP Invalid Gateway!")

	var map_result = upnp.add_port_mapping(PORT)
	assert(map_result == UPNP.UPNP_RESULT_SUCCESS, \
		"UPnP Port Mapping Failed! Error %s" % map_result)
	
	print("Success! Join Address: %s" % upnp.query_external_address())