NetworkWeapon._generate_id(...) calls randi_range(...) for selecting random characters. This would normally be fine, but if a user attempts to use seed(...) to intentionally generate the same random values all peers it'll end up re-using the same values.
Using a RandomNumberGenerator (initialized with randomize()) to always maintain a seed unique from others' code and expectations is recommended (also for the user, so this is half on me 😉).