Quick answer: Godot 4 @rpc('call_local') method firing twice when the local player calls it? call_local makes RPC invoke the method locally AND broadcast back - use call_remote or guard with multiplayer.is_server.

Player presses fire; local code runs once; then the server-echo runs it again.

Use @rpc('any_peer', 'call_remote')

Skip local call; only remotes receive. Local code calls the method directly without RPC.

Or guard the RPC handler

@rpc("any_peer", "call_local")
func fire():
    if multiplayer.get_remote_sender_id() == multiplayer.get_unique_id():
        return

Skip self-echoes.

Audit each RPC's call mode

Document why each RPC uses call_local vs call_remote. The wrong choice is the bug source.

“RPC modes have specific semantics. Mode mismatch produces double-execution.”

Build a tiny lint or code review checklist: 'RPC mode is intentional and documented'. The class of bug stops.

Related reading