private void CreateBot(int playerNumber, MyObjectBuilder_Bot botBuilder) { Debug.Assert(BotFactory != null, "Bot factory is not set! Cannot create a new bot!"); if (BotFactory == null) return; var newPlayer = Sync.Clients.LocalClient.GetPlayer(playerNumber); if (newPlayer == null) return; var isBotSpawned = m_agentsToSpawn.ContainsKey(playerNumber); var isLoading = botBuilder != null; var createdByPlayer = false; MyBotDefinition botDefinition = null; AgentSpawnData spawnData = default(AgentSpawnData); // We have to get the bot object builder and bot definition somehow // Either, the bot is being spawned on this computer and the definition was saved in the spawn data // or the bot is just being created from the object builder (MP bot creation, etc.), so the definition is there if (isBotSpawned) { spawnData = m_agentsToSpawn[playerNumber]; createdByPlayer = spawnData.CreatedByPlayer; botDefinition = spawnData.AgentDefinition; m_agentsToSpawn.Remove(playerNumber); } else { if (botBuilder == null || botBuilder.BotDefId.TypeId.IsNull) { MyPlayer missingBotPlayer = null; if (Sync.Players.TryGetPlayerById(new MyPlayer.PlayerId(Sync.MyId, playerNumber), out missingBotPlayer)) { Sync.Players.RemovePlayer(missingBotPlayer); } return; } MyDefinitionManager.Static.TryGetBotDefinition(botBuilder.BotDefId, out botDefinition); Debug.Assert(botDefinition != null, "Bot definition could not be found."); if (botDefinition == null) return; } if ((newPlayer.Character == null || !newPlayer.Character.IsDead) && BotFactory.CanCreateBotOfType(botDefinition.BehaviorType, isLoading) || createdByPlayer) { IMyBot bot = null; if (isBotSpawned) bot = BotFactory.CreateBot(newPlayer, botBuilder, spawnData.AgentDefinition); else bot = BotFactory.CreateBot(newPlayer, botBuilder, botDefinition); if (bot == null) { MyLog.Default.WriteLine("Could not create a bot for player " + newPlayer + "!"); } else { m_botCollection.AddBot(playerNumber, bot); if (isBotSpawned && bot is IMyEntityBot) (bot as IMyEntityBot).Spawn(spawnData.SpawnPosition, createdByPlayer); if (BotCreatedEvent != null) { BotCreatedEvent(playerNumber, bot.BotDefinition); } } } else { // hack for removing uncontrolled bot players or saved dead characters var player = Sync.Players.GetPlayerById(new MyPlayer.PlayerId(Sync.MyId, playerNumber)); Sync.Players.RemovePlayer(player); } }
private void CreateBot(int playerNumber, MyObjectBuilder_Bot botBuilder) { Debug.Assert(BotFactory != null, "Bot factory is not set! Cannot create a new bot!"); if (BotFactory == null) { return; } var newPlayer = Sync.Clients.LocalClient.GetPlayer(playerNumber); if (newPlayer == null) { return; } var isBotSpawned = m_agentsToSpawn.ContainsKey(playerNumber); var isLoading = botBuilder != null; var createdByPlayer = false; MyBotDefinition botDefinition = null; AgentSpawnData spawnData = default(AgentSpawnData); if (isBotSpawned) { spawnData = m_agentsToSpawn[playerNumber]; createdByPlayer = spawnData.CreatedByPlayer; botDefinition = spawnData.AgentDefinition; m_agentsToSpawn.Remove(playerNumber); } else { Debug.Assert(botBuilder != null && !botBuilder.BotDefId.TypeId.IsNull, "Null or invalid bot builder. Bot is not going to be created"); if (botBuilder == null || botBuilder.BotDefId.TypeId.IsNull) { return; } botDefinition = MyDefinitionManager.Static.GetBotDefinition(botBuilder.BotDefId); Debug.Assert(botDefinition != null, "Bot definition could not be found."); if (botDefinition == null) { return; } } if ((newPlayer.Character == null || !newPlayer.Character.IsDead) && BotFactory.CanCreateBotOfType(botDefinition.BehaviorType, isLoading) || createdByPlayer) { IMyBot bot = null; if (isBotSpawned) { bot = BotFactory.CreateBot(newPlayer, botBuilder, spawnData.AgentDefinition); } else { bot = BotFactory.CreateBot(newPlayer, botBuilder, botDefinition); } if (bot == null) { MyLog.Default.WriteLine("Could not create a bot for player " + newPlayer + "!"); } else { m_botCollection.AddBot(playerNumber, bot); if (isBotSpawned && bot is IMyEntityBot) { (bot as IMyEntityBot).Spawn(spawnData.SpawnPosition, createdByPlayer); } } } else { // hack for removing uncontrolled bot players or saved dead characters var player = Sync.Players.TryGetPlayerById(new MyPlayer.PlayerId(MySteam.UserId, playerNumber)); Sync.Players.RemovePlayer(player); } }