Peer to peer wouldn't be the way to go. To many connections to worry about, and to many things to go wrong. That's why commercial games don't use it.
If players are going to be hosting the server (as in the client can also serve as a server) then there's no reason to not have the server do all the collision and hit checks, since it's already got all the data and models loaded.
If the server is to be a standalone application, then let the clients handle collision and hit detection. That leaves the server to do nothing but shuffle data back and forth. In this case there should be a minimal text display on the server to show who is connected, but that's it. Set Sync Rate to 0 and only call Sync once a second. That will keep your server's network code running as fast as possible and you'll experience less lag. Don't load any 3D objects and your code will scream.
I'm doing that with my server and it performs 24,000 loops per second on average. That gives the speed boost I need to handle the number of players I'm hoping to handle.
For static data, periodic updates, or shot and hit data, use TCP packets to guarantee it gets to everyone.
For player movements use UDP, but don't send player movements (or anything else) every loop, that's just way to much data and you'll choke the server. You have 2 options for timing the movement packets. You can either do some testing and find a good interval, such as every 250ms, or you can code something fancy that will dynamically adjust the interval based on some other criteria like ping rate or something.