/// <summary>
        ///     Add action to server action queue
        /// </summary>
        /// <param name="action">Action to be added</param>
        public void RunAction(AUserAction action)
        {
            var spawned = PlayerDictionary.TryGetValue(action.Username, out var playerModel);

            if (!spawned)
            {
                return;
            }
            var playerBody = playerModel.ObjectBody;

            switch (action)
            {
            case MovementAction m:
            {
                var impulse = ConvertMovementActionToVector2(m, playerModel);
                playerBody.ApplyLinearImpulse(impulse, playerBody.WorldCenter);
                break;
            }

            case ShootingAction s:
            {
                PlayerDictionary.TryGetValue(s.Username, out var creator);
                if (creator == null)
                {
                    throw new Exception("Player not found when spawning bullet");
                }
                var bulletSpawn = new BulletSpawnObject(s.Angle, 20f, creator, 10f, .1f, creator.ObjectBody.Position);
                bulletSpawn.InitialMass = .02f;
                spawnQueue.Enqueue(bulletSpawn);

                break;
            }

            default:
                throw new ArgumentException("Unsupported Action Type");
            }
        }
        private void SpawnBullet(BulletSpawnObject bulletSpawn)
        {
            //Load initial values
            var ballPosition = bulletSpawn.InitialPosition;
            var creator      = bulletSpawn.Creator;

            //Define body
            var bullet = new Body {
                BodyType = BodyType.Dynamic
            };

            var bulletFixture = bullet.CreateCircle(bulletSpawn.Radius, 1);

            bullet.SetRestitution(bulletSpawn.InitialRestitution);
            bullet.SetFriction(bulletSpawn.InitialFriction);
            bullet.Mass     = bulletSpawn.InitialMass;
            bullet.IsBullet = true;


            bullet.ApplyForce(bulletSpawn.InitialVelocity, bullet.WorldCenter);

            var bulletModel = new BulletModel(bullet)
            {
                BulletType = "small", //TODO: Make this better somehow?
                Damage     = creator.Damage
            };

            bullet.Tag = bulletModel;


            _world.Add(bullet);
            bullet.SetTransform(ballPosition, bulletSpawn.InitialAngle);
            bulletFixture.OnCollision += (fixtureA, fixtureB, contact) =>
            {
                if (fixtureA.Body.Tag is PlayerModel playerA)
                {
                    if (playerA.Username == creator.Username)
                    {
                        return(false);
                    }
                }

                if (fixtureB.Body.Tag is PlayerModel playerB)
                {
                    if (playerB.Username == creator.Username)
                    {
                        return(false);
                    }
                }


                if (fixtureA.Body.Tag is BulletModel b1)
                {
                    if (b1.ID == bulletModel.ID)
                    {
                        MarkEntityForDestruction(bulletModel);
                    }
                }

                if (fixtureB.Body.Tag is BulletModel b2)
                {
                    if (b2.ID == bulletModel.ID)
                    {
                        MarkEntityForDestruction(bulletModel);
                    }
                }

                if (fixtureA.Body.Tag is EnemyModel e1)
                {
                    e1.Hurt(bulletModel.Damage);
                    if (e1.Dead)
                    {
                        PlayerDictionary.TryGetValue(creator.Username, out var playerModel);
                        if (playerModel != null)
                        {
                            playerModel.AddExp(e1.Strength);
                        }
                        MarkEntityForDestruction(e1);
                    }
                }

                if (fixtureB.Body.Tag is EnemyModel e2)
                {
                    e2.Hurt(bulletModel.Damage);
                    if (e2.Dead)
                    {
                        PlayerDictionary.TryGetValue(creator.Username, out var playerModel);
                        if (playerModel != null)
                        {
                            playerModel.AddExp(e2.Strength);
                        }
                        MarkEntityForDestruction(e2);
                    }
                }



                return(false);
            };

            _objectDictionary.TryAdd(bulletModel.ID, bulletModel);
        }