I'm creating a multiplayer game and have been having some trouble creating a good architecture for the server side.

So far on the server we store a list of player which are the actively connected players, the main way they interact with each other is by shooting each other with guns. To facilitate this I decided that a gun would only be able to fire, and upon firing a `Referee` will check if the hitscan is colliding with an enemy and refer to the current game mode `TimedDeathMatch` which contains the rules about how much damage to assign to the player.

The complexity arises when we also need to tell each client to play the "gun fired" sound effect at a 3d point in space. In this situation I made it so that the `Referee` also manages this process. After looking back at the `Referee` I realized it does the following:

1. Manages weapon interactions
2. Manages networked sound
3. Manages the current state of the game (Preparation, Live, Complete)
4. Facilitates chatbox messaging from client to server.
5. Facilitates announcements from the server (who won the game)

Due to this the `Referee` code has become quite long and is doing multiple things at once. I was thinking of creating an `AudioEngineer`, `Announcer`, `Messenger` and then allocating some of those processes to them so it's easier to understand.

I'd like to get some feedback about how I'm structuring my server side architecture here, and possible simpler alternatives. I'd also like to know if my naming convention of modelling after job titles/people is alright to do.