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():
returnSkip 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.