private void SpawnEnemy(EnemySpawnObject enemySpawn) { //Define body var enemy = new Body { BodyType = BodyType.Dynamic }; var enemyFixture = enemy.CreateCircle(enemySpawn.Radius, 1); enemy.SetRestitution(enemySpawn.InitialRestitution); enemy.SetFriction(enemySpawn.InitialFriction); enemy.Mass = enemySpawn.InitialMass; enemy.LinearDamping = enemySpawn.LinearDamping; var enemyModel = new EnemyModel(enemy); enemyModel.EnemyType = enemySpawn.EnemyType; enemyModel.Damage = enemySpawn.Damage; enemyModel.Speed = enemySpawn.Speed; enemyModel.Health = enemySpawn.InitialHealth; enemyModel.MaxHealth = enemySpawn.InitialHealth; enemy.Tag = enemyModel; _world.Add(enemy); enemy.SetTransform(enemySpawn.InitialPosition, enemySpawn.InitialAngle); enemy.OnCollision += (fixtureA, fixtureB, contact) => { if (fixtureA.Body.Tag.Equals("worldBounds") || fixtureB.Body.Tag.Equals("worldBounds")) { return(false); } if (fixtureA.Body.Tag is PlayerModel p1) { if (fixtureB.Body.Tag is EnemyModel e && !e.Dead) { p1.Hurt(enemyModel.Damage); } if (fixtureB.Body.Tag is EnemyModel e2 && e2.Dead) { return(false); } if (p1.Dead) { MarkEntityForDestruction(p1); if (fixtureB.Body.Tag is EnemyModel eB) { eB.ResetClosestPlayer(); } } } if (fixtureB.Body.Tag is PlayerModel p2) { if (fixtureA.Body.Tag is EnemyModel e && !e.Dead) { p2.Hurt(enemyModel.Damage); } if (fixtureA.Body.Tag is EnemyModel e2 && e2.Dead) { return(false); } if (p2.Dead) { MarkEntityForDestruction(p2); if (fixtureA.Body.Tag is EnemyModel eA) { eA.ResetClosestPlayer(); } } } return(true); }; _objectDictionary.TryAdd(enemyModel.ID, enemyModel); aiController.Register(enemyModel, ref _objectDictionary); enemyModel.SearchForClosestPlayer(PlayerDictionary); }