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