/// <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); }