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