예제 #1
0
        private static void SpawnPlayerbotAsSummon(CharacterMaster owner, SurvivorIndex survivorIndex)
        {
            SurvivorDef def = SurvivorCatalog.GetSurvivorDef(survivorIndex);

            if (def == null)
            {
                return;
            }

            GameObject bodyPrefab = def.bodyPrefab;

            if (bodyPrefab == null)
            {
                return;
            }

            // Card
            PlayerBotSpawnCard card = ScriptableObject.CreateInstance <PlayerBotSpawnCard>();

            card.hullSize        = HullClassification.Human;
            card.nodeGraphType   = MapNodeGroup.GraphType.Ground;
            card.occupyPosition  = false;
            card.sendOverNetwork = true;
            card.forbiddenFlags  = NodeFlags.NoCharacterSpawn;
            card.prefab          = Resources.Load <GameObject>("prefabs/charactermasters/CommandoMonsterMaster");
            card.playerbotName   = bodyPrefab.GetComponent <CharacterBody>().GetDisplayName();
            card.bodyPrefab      = bodyPrefab;

            // Spawn request
            DirectorSpawnRequest spawnRequest = new DirectorSpawnRequest(card, new DirectorPlacementRule
            {
                placementMode = DirectorPlacementRule.PlacementMode.Approximate,
                minDistance   = 3f,
                maxDistance   = 40f,
                spawnOnTarget = owner.GetBody().transform
            }, RoR2Application.rng);

            spawnRequest.ignoreTeamMemberLimit = true;
            spawnRequest.teamIndexOverride     = new TeamIndex?(TeamIndex.Player);
            //spawnRequest.summonerBodyObject = owner.GetBody().gameObject;

            // Spawn
            GameObject gameObject = DirectorCore.instance.TrySpawnObject(spawnRequest);

            if (gameObject)
            {
                CharacterMaster master      = gameObject.GetComponent <CharacterMaster>();
                BaseAI          ai          = gameObject.GetComponent <BaseAI>();
                AIOwnership     aiOwnership = gameObject.AddComponent <AIOwnership>() as AIOwnership;
                aiOwnership.ownerMaster = owner;

                if (master)
                {
                    master.name = "PlayerBot";
                    SetRandomSkin(master, bodyPrefab);

                    master.teamIndex = TeamIndex.Player;

                    GiveStartingItems(owner, master);

                    // Allow the bots to spawn in the next stage
                    master.destroyOnBodyDeath = false;
                    master.gameObject.AddComponent <SetDontDestroyOnLoad>();
                }
                if (ai)
                {
                    ai.name = "PlayerBot";
                    ai.leader.gameObject = owner.GetBody().gameObject;

                    ai.neverRetaliateFriendlies = true;
                    ai.fullVision        = true;
                    ai.aimVectorDampTime = .01f;
                    ai.aimVectorMaxSpeed = 180f;
                }

                InjectSkillDrivers(gameObject, ai, survivorIndex);

                if (AutoPurchaseItems.Value)
                {
                    // Add item manager
                    ItemManager itemManager = gameObject.AddComponent <ItemManager>() as ItemManager;
                }

                // Add to playerbot list
                playerbots.Add(gameObject);
            }
        }
예제 #2
0
        private static void SpawnPlayerbotAsPlayer(CharacterMaster owner, SurvivorIndex survivorIndex)
        {
            SurvivorDef def = SurvivorCatalog.GetSurvivorDef(survivorIndex);

            if (def == null)
            {
                return;
            }

            GameObject bodyPrefab = def.bodyPrefab;

            if (bodyPrefab == null)
            {
                return;
            }

            // Card
            PlayerBotSpawnCard card = ScriptableObject.CreateInstance <PlayerBotSpawnCard>();

            card.hullSize        = HullClassification.Human;
            card.nodeGraphType   = MapNodeGroup.GraphType.Ground;
            card.occupyPosition  = false;
            card.sendOverNetwork = true;
            card.forbiddenFlags  = NodeFlags.NoCharacterSpawn;
            card.prefab          = Resources.Load <GameObject>("prefabs/charactermasters/CommandoMaster");
            card.playerbotName   = bodyPrefab.GetComponent <CharacterBody>().GetDisplayName();
            card.bodyPrefab      = bodyPrefab;

            // Spawn
            DirectorSpawnRequest spawnRequest = new DirectorSpawnRequest(card, new DirectorPlacementRule
            {
                placementMode = DirectorPlacementRule.PlacementMode.Approximate,
                minDistance   = 3f,
                maxDistance   = 40f,
                spawnOnTarget = owner.GetBody().transform
            }, RoR2Application.rng);

            spawnRequest.ignoreTeamMemberLimit = true;
            //spawnRequest.summonerBodyObject = owner.GetBody().gameObject;
            spawnRequest.teamIndexOverride = new TeamIndex?(TeamIndex.Player);

            GameObject gameObject = DirectorCore.instance.TrySpawnObject(spawnRequest);

            if (gameObject)
            {
                // Add components
                EntityStateMachine stateMachine = gameObject.AddComponent <PlayerBotStateMachine>() as EntityStateMachine;
                BaseAI             ai           = gameObject.AddComponent <PlayerBotBaseAI>() as BaseAI;
                AIOwnership        aiOwnership  = gameObject.AddComponent <AIOwnership>() as AIOwnership;
                aiOwnership.ownerMaster = owner;

                CharacterMaster master = gameObject.GetComponent <CharacterMaster>();
                PlayerCharacterMasterController playerMaster = gameObject.GetComponent <PlayerCharacterMasterController>();

                // Random skin
                SetRandomSkin(master, bodyPrefab);

                // Set commponent values
                master.SetFieldValue("aiComponents", gameObject.GetComponents <BaseAI>());
                master.GiveMoney(owner.money);
                master.inventory.CopyItemsFrom(owner.inventory);
                master.inventory.GiveItem(ItemIndex.DrizzlePlayerHelper, 1);
                master.destroyOnBodyDeath = false; // Allow the bots to spawn in the next stage

                playerMaster.name = master.GetBody().GetDisplayName();

                // Add custom skills
                InjectSkillDrivers(gameObject, ai, survivorIndex);

                if (AutoPurchaseItems.Value)
                {
                    // Add item manager
                    ItemManager itemManager = gameObject.AddComponent <ItemManager>() as ItemManager;
                }

                // Add to playerbot list
                playerbots.Add(gameObject);

                // Cleanup
                Destroy(card);
            }
        }
예제 #3
0
        private static void SpawnPlayerbotAsPlayer(CharacterMaster owner, SurvivorIndex survivorIndex)
        {
            SurvivorDef def = SurvivorCatalog.GetSurvivorDef(survivorIndex);

            if (def == null)
            {
                return;
            }
            else if (!def.CheckRequiredExpansionEnabled())
            {
                Debug.Log("You do not have the proper expansion enabled.");
                return;
            }

            GameObject bodyPrefab = def.bodyPrefab;

            if (bodyPrefab == null)
            {
                return;
            }

            // Card
            PlayerBotSpawnCard card = ScriptableObject.CreateInstance <PlayerBotSpawnCard>();

            card.hullSize        = HullClassification.Human;
            card.nodeGraphType   = MapNodeGroup.GraphType.Ground;
            card.occupyPosition  = false;
            card.sendOverNetwork = true;
            card.forbiddenFlags  = NodeFlags.NoCharacterSpawn;
            card.prefab          = LegacyResourcesAPI.Load <GameObject>("Prefabs/CharacterMasters/CommandoMaster");
            //card.bodyPrefab = bodyPrefab;

            // Spawn
            DirectorSpawnRequest spawnRequest = new DirectorSpawnRequest(card, new DirectorPlacementRule
            {
                placementMode = DirectorPlacementRule.PlacementMode.Approximate,
                minDistance   = 3f,
                maxDistance   = 40f,
                spawnOnTarget = owner.GetBody().transform
            }, RoR2Application.rng);

            spawnRequest.ignoreTeamMemberLimit = true;
            spawnRequest.teamIndexOverride     = new TeamIndex?(TeamIndex.Player);

            spawnRequest.onSpawnedServer = result =>
            {
                GameObject gameObject = result.spawnedInstance;

                if (gameObject)
                {
                    // Add components
                    EntityStateMachine stateMachine = gameObject.AddComponent <PlayerBotStateMachine>() as EntityStateMachine;
                    BaseAI             ai           = gameObject.AddComponent <PlayerBotBaseAI>() as BaseAI;
                    AIOwnership        aiOwnership  = gameObject.AddComponent <AIOwnership>() as AIOwnership;
                    aiOwnership.ownerMaster = owner;

                    CharacterMaster master = gameObject.GetComponent <CharacterMaster>();
                    PlayerCharacterMasterController playerMaster = gameObject.GetComponent <PlayerCharacterMasterController>();
                    playerMaster.name = "PlayerBot";

                    // Required to bypass entitlements
                    master.bodyPrefab = bodyPrefab;
                    master.Respawn(master.transform.position, master.transform.rotation);

                    // Random skin
                    SetRandomSkin(master, bodyPrefab);

                    // Set commponent values
                    master.SetFieldValue("aiComponents", gameObject.GetComponents <BaseAI>());
                    master.destroyOnBodyDeath = false; // Allow the bots to spawn in the next stage

                    // Starting items
                    GiveStartingItems(owner, master);

                    // Add custom skills
                    InjectSkillDrivers(gameObject, ai, survivorIndex);

                    if (AutoPurchaseItems.Value)
                    {
                        // Add item manager
                        ItemManager itemManager = gameObject.AddComponent <ItemManager>() as ItemManager;
                    }

                    // Add to playerbot list
                    playerbots.Add(gameObject);
                }
            };

            DirectorCore.instance.TrySpawnObject(spawnRequest);

            // Cleanup
            Destroy(card);
        }