private void SummonGuardEgg() { Vector3 searchOrigin = GetAimRay().origin; if ((bool)base.inputBank && base.inputBank.GetAimRaycast(float.PositiveInfinity, out var hitInfo)) { searchOrigin = hitInfo.point; } if (enemySearch == null) { return; } enemySearch.searchOrigin = searchOrigin; enemySearch.RefreshCandidates(); HurtBox hurtBox = enemySearch.GetResults().FirstOrDefault(); Transform transform = (((bool)hurtBox && (bool)hurtBox.healthComponent) ? hurtBox.healthComponent.body.coreTransform : base.characterBody.coreTransform); if ((bool)transform) { DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(guardSpawnCard, new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Approximate, minDistance = 3f, maxDistance = 20f, spawnOnTarget = transform }, RoR2Application.rng); directorSpawnRequest.summonerBodyObject = base.gameObject; directorSpawnRequest.onSpawnedServer = (Action <SpawnCard.SpawnResult>) Delegate.Combine(directorSpawnRequest.onSpawnedServer, (Action <SpawnCard.SpawnResult>) delegate(SpawnCard.SpawnResult spawnResult) { spawnResult.spawnedInstance.GetComponent <Inventory>().CopyEquipmentFrom(base.characterBody.inventory); }); DirectorCore.instance?.TrySpawnObject(directorSpawnRequest); } }
// Token: 0x06002C9C RID: 11420 RVA: 0x000BC304 File Offset: 0x000BA504 private void SummonMinion() { if (!base.characterBody || !base.characterBody.master) { return; } if (base.characterBody.master.GetDeployableCount(DeployableSlot.RoboBallMini) < base.characterBody.master.GetDeployableSameSlotLimit(DeployableSlot.RoboBallMini)) { Util.PlaySound(DeployMinions.summonSoundString, base.gameObject); if (!NetworkServer.active) { return; } Vector3 position = base.FindModelChild(DeployMinions.summonMuzzleString).position; DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest((SpawnCard)Resources.Load(string.Format("SpawnCards/CharacterSpawnCards/{0}", DeployMinions.spawnCard)), new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Direct, minDistance = 0f, maxDistance = 0f, position = position }, RoR2Application.rng); directorSpawnRequest.summonerBodyObject = base.gameObject; GameObject gameObject = DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (gameObject) { CharacterMaster component = gameObject.GetComponent <CharacterMaster>(); gameObject.GetComponent <Inventory>().SetEquipmentIndex(base.characterBody.inventory.currentEquipmentIndex); Deployable deployable = gameObject.AddComponent <Deployable>(); deployable.onUndeploy = new UnityEvent(); deployable.onUndeploy.AddListener(new UnityAction(component.TrueKill)); base.characterBody.master.AddDeployable(deployable, DeployableSlot.RoboBallMini); } } }
/// <summary> /// Spawn a particular elite type with the specified monster type at the specified location. This will /// apply appropriate HP and Dmg scaling per the specifications on the affix card, as well as calling the affix onSpawned. /// This is primarily intended for testing, but could also be used to easily spawn elites for other purposes. /// Note that this does not set XP and Gold rewards, as it does not have access to the cost function; you will need to /// add those yourself if you want these. /// </summary> /// <param name="spawnCard">Card describing the type of monster to spawn</param> /// <param name="affixCard">Card describing the type of elite to spawn; may pass null to spawn a non-elite</param> /// <param name="placement">How to place the elite in the scene</param> /// <param name="rng">Random number generator to use for placement</param> /// <returns></returns> public static CharacterMaster TrySpawnElite(CharacterSpawnCard spawnCard, EliteAffixCard affixCard, DirectorPlacementRule placement, Xoroshiro128Plus rng) { var spawnRequest = new DirectorSpawnRequest(spawnCard, placement, rng) { teamIndexOverride = TeamIndex.Monster, ignoreTeamMemberLimit = true }; var spawned = DirectorCore.instance.TrySpawnObject(spawnRequest); if (spawned == null) { return(null); } //Configure as the chosen elite var spawnedMaster = spawned.GetComponent <CharacterMaster>(); if (affixCard != null) { //Elites are boosted var healthBoost = affixCard.healthBoostCoeff; var damageBoost = affixCard.damageBoostCoeff; spawnedMaster.inventory.GiveItem(ItemIndex.BoostHp, Mathf.RoundToInt((float)((healthBoost - 1.0) * 10.0))); spawnedMaster.inventory.GiveItem(ItemIndex.BoostDamage, Mathf.RoundToInt((float)((damageBoost - 1.0) * 10.0))); var eliteDef = EliteCatalog.GetEliteDef(affixCard.eliteType); if (eliteDef != null) { spawnedMaster.inventory.SetEquipmentIndex(eliteDef.eliteEquipmentIndex); } affixCard.onSpawned?.Invoke(spawnedMaster); } return(spawnedMaster); }
private static void CreateEclipseDoppelganger(CharacterMaster master, Xoroshiro128Plus rng) { var card = DoppelgangerSpawnCard.FromMaster(master); if (card is null) { return; } if (card.prefab is null) { card.prefab = MasterCatalog.GetMasterPrefab(defaultMasterIndex); } Transform spawnOnTarget; DirectorCore.MonsterSpawnDistance input; if (TeleporterInteraction.instance) { spawnOnTarget = TeleporterInteraction.instance.transform; input = DirectorCore.MonsterSpawnDistance.Close; } else { spawnOnTarget = master.GetBody().coreTransform; input = DirectorCore.MonsterSpawnDistance.Far; } DirectorPlacementRule directorPlacementRule = new DirectorPlacementRule { spawnOnTarget = spawnOnTarget, placementMode = DirectorPlacementRule.PlacementMode.NearestNode }; DirectorCore.GetMonsterSpawnDistance(input, out directorPlacementRule.minDistance, out directorPlacementRule.maxDistance); DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(card, directorPlacementRule, rng); directorSpawnRequest.teamIndexOverride = new TeamIndex?(TeamIndex.Monster); directorSpawnRequest.ignoreTeamMemberLimit = true; CombatSquad squad = null; DirectorSpawnRequest directorSpawnRequest2 = directorSpawnRequest; directorSpawnRequest2.onSpawnedServer = DelegateHelper.Combine(directorSpawnRequest2.onSpawnedServer, (res) => { if (squad is null) { squad = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/Encounters/ShadowCloneEncounter")).GetComponent <CombatSquad>(); } squad.AddMember(res.spawnedInstance.GetComponent <CharacterMaster>()); }); DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (squad is not null) { NetworkServer.Spawn(squad.gameObject); } UnityEngine.Object.Destroy(card); }
private void SpawnPods() { Vector3 point = Vector3.zero; Ray aimRay = base.GetAimRay(); aimRay.origin += UnityEngine.Random.insideUnitSphere * Offspring.randomRadius; RaycastHit raycastHit; if (Physics.Raycast(aimRay, out raycastHit, (float)LayerIndex.world.mask)) { point = raycastHit.point; } TeamIndex teamIndex = base.characterBody.GetComponent <TeamComponent>().teamIndex; TeamIndex enemyTeam; if (teamIndex != TeamIndex.Player) { if (teamIndex == TeamIndex.Monster) { enemyTeam = TeamIndex.Player; } else { enemyTeam = TeamIndex.Neutral; } } else { enemyTeam = TeamIndex.Monster; } point = base.transform.position; Transform transform = this.FindTargetFarthest(point, enemyTeam); if (transform) { DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest((SpawnCard)Resources.Load("SpawnCards/CharacterSpawnCards/cscParentPod"), new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Approximate, minDistance = 3f, maxDistance = 20f, spawnOnTarget = transform }, RoR2Application.rng); directorSpawnRequest.summonerBodyObject = base.gameObject; DirectorSpawnRequest directorSpawnRequest2 = directorSpawnRequest; directorSpawnRequest2.onSpawnedServer = (Action <SpawnCard.SpawnResult>) Delegate.Combine(directorSpawnRequest2.onSpawnedServer, new Action <SpawnCard.SpawnResult>(delegate(SpawnCard.SpawnResult spawnResult) { Inventory inventory = spawnResult.spawnedInstance.GetComponent <CharacterMaster>().inventory; Inventory inventory2 = base.characterBody.inventory; inventory.CopyEquipmentFrom(inventory2); })); DirectorCore.instance.TrySpawnObject(directorSpawnRequest); } }
public override bool Effect(EquipmentSlot equipmentSlot) { var transform = equipmentSlot.transform; var placementRules = new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Approximate, minDistance = 10f, maxDistance = 100f, spawnOnTarget = transform }; var hateRequest = new DirectorSpawnRequest(hostileCard, placementRules, RoR2Application.rng) { ignoreTeamMemberLimit = false, teamIndexOverride = TeamIndex.Monster }; var spawn = DirectorCore.instance.TrySpawnObject(hateRequest); spawn.transform.TransformDirection(0, 100, 0); if (spawn) { CharacterMaster cm = spawn.GetComponent <CharacterMaster>(); if (cm) { cm.inventory.GiveItem(ItemIndex.BoostDamage, GetItemCountFromMultiplier(HostileDMG)); cm.inventory.GiveItem(ItemIndex.BoostHp, GetItemCountFromMultiplier((HostileHP))); } } var friendRequest = new DirectorSpawnRequest(friendCard, placementRules, RoR2Application.rng) { ignoreTeamMemberLimit = false, teamIndexOverride = TeamIndex.Player, summonerBodyObject = equipmentSlot.GetComponent <CharacterBody>().gameObject }; var spawn2 = DirectorCore.instance.TrySpawnObject(friendRequest); spawn2.transform.TransformDirection(0, 100, 0); if (spawn2) { CharacterMaster cm = spawn2.GetComponent <CharacterMaster>(); if (cm) { cm.inventory.GiveItem(ItemIndex.BoostDamage, GetItemCountFromMultiplier(AllyDMG)); cm.inventory.GiveItem(ItemIndex.BoostHp, GetItemCountFromMultiplier((AllyHP))); } } if (spawn || spawn2) { return(true); } return(false); }
public static void TrySpawnEnemy(CharacterBody body) { string variantName = body.baseNameToken; bool variantIsSpecial = true; //Wether or not this variant spawns enemies on death. switch (variantName) { case "Wisp Amalgamate": enemyCard = "LesserWisp"; amount = 5; break; case "M.O.A.J.": enemyCard = "Jellyfish"; amount = 5; break; case "Amalgamated Ancient Wisp": enemyCard = "GreaterWisp"; amount = 5; break; default: variantIsSpecial = false; break; } if (variantIsSpecial) { Vector3 position = body.corePosition + (amount * UnityEngine.Random.insideUnitSphere); DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest((SpawnCard)Resources.Load(string.Format("SpawnCards/CharacterSpawnCards/csc" + enemyCard)), new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Direct, minDistance = 0f, maxDistance = 4f, position = position }, RoR2Application.rng); directorSpawnRequest.summonerBodyObject = body.gameObject; for (int i = 0; i < amount; i++) { GameObject enemy = DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (enemy) { CharacterMaster master = enemy.GetComponent <CharacterMaster>(); enemy.GetComponent <Inventory>().SetEquipmentIndex(body.inventory.currentEquipmentIndex); } } } }
// Token: 0x06003328 RID: 13096 RVA: 0x000DDC78 File Offset: 0x000DBE78 private void SummonEgg() { Vector3 point = Vector3.zero; Ray aimRay = base.GetAimRay(); aimRay.origin += UnityEngine.Random.insideUnitSphere * SummonEggs.randomRadius; RaycastHit raycastHit; if (Physics.Raycast(aimRay, out raycastHit, (float)LayerIndex.world.mask)) { point = raycastHit.point; } TeamIndex teamIndex = base.characterBody.GetComponent <TeamComponent>().teamIndex; TeamIndex enemyTeam; if (teamIndex != TeamIndex.Player) { if (teamIndex == TeamIndex.Monster) { enemyTeam = TeamIndex.Player; } else { enemyTeam = TeamIndex.Neutral; } } else { enemyTeam = TeamIndex.Monster; } Transform transform = this.FindTargetClosest(point, enemyTeam); if (transform) { DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest((SpawnCard)Resources.Load("SpawnCards/CharacterSpawnCards/cscBeetle"), new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Approximate, minDistance = 3f, maxDistance = 20f, spawnOnTarget = transform }, RoR2Application.rng); directorSpawnRequest.summonerBodyObject = base.gameObject; GameObject gameObject = DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (gameObject) { gameObject.GetComponent <Inventory>().SetEquipmentIndex(base.characterBody.inventory.currentEquipmentIndex); } } }
private SpawnCard.SpawnResult SpawnBarrel(Vector3 center, float angle, float radius = 30f) { InteractableSpawnCard spawnCard = Resources.Load <InteractableSpawnCard>("SpawnCards/InteractableSpawnCard/iscBarrel1"); spawnCard.slightlyRandomizeOrientation = false; spawnCard.skipSpawnWhenSacrificeArtifactEnabled = false; DirectorPlacementRule rule = new DirectorPlacementRule() { placementMode = DirectorPlacementRule.PlacementMode.Direct }; DirectorSpawnRequest request = new DirectorSpawnRequest(spawnCard, rule, run.runRNG); Vector3 spawnPosition = FindGroundPosition(center, angle, radius); return(spawnCard.DoSpawn(spawnPosition, Quaternion.LookRotation((center - spawnPosition).normalized), request)); }
private SpawnCard.SpawnResult SpawnAllyDummy(CharacterSpawnCard spawnCard, Vector3 center, float angle, float radius = 35f)//, GameObject summonerBody = null) { spawnCard.noElites = true; DirectorPlacementRule rule = new DirectorPlacementRule() { placementMode = DirectorPlacementRule.PlacementMode.Direct }; DirectorSpawnRequest request = new DirectorSpawnRequest(spawnCard, rule, run.runRNG) { teamIndexOverride = TeamIndex.Neutral, ignoreTeamMemberLimit = true, //summonerBodyObject = summonerBody, }; Vector3 spawnPosition = FindGroundPosition(center, angle, radius); return(spawnCard.DoSpawn(spawnPosition, Quaternion.LookRotation((center - spawnPosition).normalized), request)); }
private bool TrySpawnChest(Transform trans) { var dsr = new DirectorSpawnRequest(broochPrefab, new DirectorPlacementRule { maxDistance = 25f, minDistance = 5f, placementMode = DirectorPlacementRule.PlacementMode.Approximate, position = trans.position, preventOverhead = true }, itemRng); dsr.onSpawnedServer += Evt_BroochChestSpawnServer; var spawnobj = DirectorCore.instance.TrySpawnObject(dsr); //broochPrefab.DoSpawn(trans.position, trans.rotation, dsr); if (spawnobj == null) { if (doFallbackSpawn) { ClassicItemsPlugin._logger.LogWarning("Captain's Brooch: spawn failed, using fallback position. This may be caused by too many objects nearby/no suitable ground."); var dsrFallback = new DirectorSpawnRequest(broochPrefab, new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Direct, position = trans.position }, itemRng); dsrFallback.onSpawnedServer += Evt_BroochChestSpawnServer; broochPrefab.DoSpawn(trans.position, trans.rotation, dsrFallback); return(true); } else { ClassicItemsPlugin._logger.LogWarning("Captain's Brooch: spawn failed, not triggering equipment. This may be caused by too many objects nearby/no suitable ground."); return(false); } } else { return(true); } }
public override GameObject DoSpawn(Vector3 position, Quaternion rotation, DirectorSpawnRequest directorSpawnRequest) { MasterSummon summon = new MasterSummon { masterPrefab = this.prefab, position = position, rotation = rotation, summonerBodyObject = directorSpawnRequest.summonerBodyObject, teamIndexOverride = directorSpawnRequest.teamIndexOverride, ignoreTeamMemberLimit = directorSpawnRequest.ignoreTeamMemberLimit }; if (playerbotName != null) { summon.preSpawnSetupCallback += OnPreSpawn; } CharacterMaster characterMaster = summon.Perform(); if (characterMaster == null) { return(null); } return(characterMaster.gameObject); }
private static CharacterBody SpawnTitan(EquipmentIndex affix, TeamIndex index = TeamIndex.Monster) { int numGoldItems = 0; System.Collections.ObjectModel.ReadOnlyCollection <TeamComponent> teamMembers = TeamComponent.GetTeamMembers(TeamIndex.Player); for (int i = 0; i < teamMembers.Count; i++) { if (Util.LookUpBodyNetworkUser(teamMembers[i].gameObject)) { CharacterBody component = teamMembers[i].GetComponent <CharacterBody>(); if (component && component.inventory) { numGoldItems += component.inventory.GetItemCount(ItemIndex.TitanGoldDuringTP); } } } if (index == TeamIndex.Monster) { numGoldItems += Run.instance.stageClearCount; numGoldItems *= Run.instance.livingPlayerCount; } Vector3 position = Vector3.zero; if (index == TeamIndex.Player) { position = TeleporterInteraction.instance.transform.position; } DirectorPlacementRule placementRule = new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.NearestNode, minDistance = 20f, maxDistance = 130f, position = position }; if (index == TeamIndex.Monster) { placementRule.placementMode = DirectorPlacementRule.PlacementMode.Random; } DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(Resources.Load <SpawnCard>("SpawnCards/CharacterSpawnCards/cscTitanGold"), placementRule, Run.instance.spawnRng); directorSpawnRequest.ignoreTeamMemberLimit = true; directorSpawnRequest.teamIndexOverride = new TeamIndex?(index); GameObject gameObject = DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (gameObject) { float num2 = 1f; float num3 = 1f; num3 += Run.instance.difficultyCoefficient / 8f; num2 += Run.instance.difficultyCoefficient / 2f; CharacterMaster component2 = gameObject.GetComponent <CharacterMaster>(); if (index == TeamIndex.Monster) { component2.isBoss = true; } CharacterBody body = component2.GetBody(); if (index == TeamIndex.Monster) { body.isChampion = true; } int livingPlayerCount = Run.instance.livingPlayerCount; num2 *= Mathf.Pow((float)numGoldItems, 1f); num3 *= Mathf.Pow((float)numGoldItems, 0.5f); component2.inventory.GiveItem(ItemIndex.BoostHp, Mathf.RoundToInt((num2 - 1f) * 10f)); component2.inventory.GiveItem(ItemIndex.BoostDamage, Mathf.RoundToInt((num3 - 1f) * 10f)); component2.inventory.SetEquipmentIndex(affix); return(body); } return(null); }
private void GalaticAquaticAquarium(On.RoR2.GlobalEventManager.orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport report) { //This is the entire spawning logic & by god it's a mess, but it works & I'll change it eventually, just not right now. //This starts off with if the attacker has an inventory, simple check for 90% of scenarios that enemies don't have inventories to prevent all deaths from being checked. if (report.attackerBody.inventory) { //Three variables are created, one for how many squidTurretItems the attacker has. //One for counting the chance of monster spawning, which is 5 + count of squidTurretItem in the attackers inventory. //Finally the squid team itself, 1/20 chance to become an enemy at base value, value increases for every stack the attacker has. int HowManySquidsAreInYourPocket = report.attackerBody.inventory.GetItemCount(squidTurretItem.itemIndex); int squidStackCheck = 5 + HowManySquidsAreInYourPocket; var squidTeam = Util.CheckRoll(squidStackCheck) ? TeamIndex.Monster : TeamIndex.Player; //Three if statements are created, one for checking if CharacterMaster is null, then do nothing. //One is created if DamageReport is null, then do nothing //One for if there's a victim and if there's an attacker, which is what starts the spawning itself. if (self is null) { return; } if (report is null) { return; } if (report.victimBody && report.attacker) { //A check is then performed to see if the attackers count of squidTurretItem is greater than 0 if (HowManySquidsAreInYourPocket > 0) { //A spawn card is created utilizing the SquidTurret spawn card. SpawnCard spawnCard = Resources.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscSquidTurret"); //A placement rule is created so that the Squid Turrets spawn on the victims body. DirectorPlacementRule placementRule = new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Approximate, minDistance = 5f, maxDistance = 25f, spawnOnTarget = report.victimBody.transform, }; //A spawn request is generated using the aforementioned variables of Spawn Card and the Placement Rule. DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(spawnCard, placementRule, RoR2Application.rng) { teamIndexOverride = squidTeam }; //A secondary spawn request is then made using the first one as a baseline //The second spawn request delagates the initial spawn request into a new Action which is Spawn Result and names it result. DirectorSpawnRequest directorSpawnRequest2 = directorSpawnRequest; directorSpawnRequest2.onSpawnedServer = (Action <SpawnCard.SpawnResult>) Delegate.Combine(directorSpawnRequest2.onSpawnedServer, new Action <SpawnCard.SpawnResult>(delegate(SpawnCard.SpawnResult result) { //A pseudo character named squidTurret which is the result of the spawned instance in the aforementioned directorSpawnRequest 2 and its Character Master is then inherited into it. //The squid is then given 15 stacks of Health Decay (Half of a regular squid) //It is also given 20 BoostAttackSpeeds which is then amplified by the amount of squidTurretItems the attacker has (Double the regular squid) CharacterMaster squidTurret = result.spawnedInstance.GetComponent <CharacterMaster>(); if (squidTeam == TeamIndex.Monster) { squidTurret.inventory.GiveItem(ItemIndex.HealthDecay, 20); squidTurret.inventory.GiveItem(ItemIndex.BoostAttackSpeed, 5 * HowManySquidsAreInYourPocket); } else { squidTurret.inventory.GiveItem(ItemIndex.HealthDecay, 45); squidTurret.inventory.GiveItem(ItemIndex.BoostAttackSpeed, 20 * HowManySquidsAreInYourPocket); } //Three variables are created here, one being the current run in order to invoke the next two. //The current fixed time is then generated & divided by 60 to turn the current chance to a 1:1 for 1% every 1 minute. //A fixed rate of base being 1%, then adding whatever the current additional chance is. float AdditionalChance = Run.instance.fixedTime; float squidSpawnAsBuffedSquidChance = 1 + (AdditionalChance / 60) + (HowManySquidsAreInYourPocket * 2); //A check is them performed to check if the squid is on the player index. //If this check if passed, a 1/100 roll is performed to see if the squid inherits a random item from the SquidItemIndex created at the top of page. //If this fails, a secondary 1/100 roll is performed to see if the squid inherits a random elite buff from the SquidBuffIndex created in "JackedSquidsGettingBuffed" method. if (squidTeam == TeamIndex.Player) { if (Util.CheckRoll(squidSpawnAsBuffedSquidChance)) { squidTurret.GetBody().AddBuff(SquidBuffIndex[UnityEngine.Random.Range(0, SquidBuffIndex.Count())]); } else if (Util.CheckRoll(squidSpawnAsBuffedSquidChance)) { squidTurret.inventory.GiveItem(SquidItemIndex[UnityEngine.Random.Range(0, SquidItemIndex.Count())]); } } //Once these checks have passed, the squidTurrets ownership is passed onto the attacker who initially spawned it. squidTurret.minionOwnership.SetOwner(report.attackerMaster); })); //Finally the squid is attempted to be spawned. if (Util.CheckRoll(25)) { DirectorCore.instance.TrySpawnObject(directorSpawnRequest); } } } } //The damage report is returned to itself, the character deaths are returned to itself and finally globaleventmanger is returned to itself. orig(self, report); }
// A hacky method. Don't ask questions. 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; } // Get card SpawnCard card = (SpawnCard)Resources.Load("SpawnCards/CharacterSpawnCards/cscBeetleGuardAlly"); // 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>(); AIOwnership aiOwnership = gameObject.AddComponent <AIOwnership>() as AIOwnership; BaseAI ai = gameObject.GetComponent <BaseAI>(); if (master) { master.name = "PlayerBot"; master.bodyPrefab = bodyPrefab; SetRandomSkin(master, bodyPrefab); master.Respawn(master.GetBody().transform.position, master.GetBody().transform.rotation); master.teamIndex = TeamIndex.Player; master.GiveMoney(owner.money); master.inventory.CopyItemsFrom(owner.inventory); master.inventory.GiveItem(ItemIndex.DrizzlePlayerHelper, 1); // Allow the bots to spawn in the next stage master.destroyOnBodyDeath = false; master.gameObject.AddComponent <SetDontDestroyOnLoad>(); } if (aiOwnership) { aiOwnership.ownerMaster = owner; } if (ai) { ai.name = "PlayerBot"; ai.leader.gameObject = owner.GetBody().gameObject; 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); } }
public override bool OnUse(EquipmentSlot equipmentSlot) { CharacterMaster master = equipmentSlot.characterBody.master; if (master) { ArchaicMaskSummonLimit summonLimit = master.GetComponent <ArchaicMaskSummonLimit>(); if (!summonLimit) { summonLimit = master.gameObject.AddComponent <ArchaicMaskSummonLimit>(); } MysticsRisky2UtilsEquipmentTarget targetInfo = equipmentSlot.GetComponent <MysticsRisky2UtilsEquipmentTarget>(); if (targetInfo && targetInfo.obj) { HurtBox targetHB = targetInfo.obj.GetComponent <CharacterBody>().mainHurtBox; if (targetHB) { DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest((SpawnCard)LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscArchWisp"), new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.NearestNode, spawnOnTarget = targetHB.transform }, RoR2Application.rng) { summonerBodyObject = equipmentSlot.characterBody.gameObject }; directorSpawnRequest.onSpawnedServer += (spawnResult) => { GameObject wispMasterObject = spawnResult.spawnedInstance; CharacterMaster wispMaster = wispMasterObject.GetComponent <CharacterMaster>(); wispMaster.inventory.GiveItem(RoR2Content.Items.HealthDecay, (int)duration.Value); wispMaster.inventory.GiveItem(RoR2Content.Items.BoostDamage, (int)(wispDamage.Value - 100f) / 10); wispMaster.inventory.GiveItem(RoR2Content.Items.BoostHp, (int)(wispHealth.Value - 100f) / 10); wispMaster.inventory.GiveItem(RoR2Content.Items.AlienHead, (int)(wispCDR.Value - 100f) / 10); wispMaster.inventory.GiveItem(RoR2Content.Items.BoostAttackSpeed, (int)(wispAttackSpeed.Value - 100f) / 10); wispMaster.GetComponent <RoR2.CharacterAI.BaseAI>().currentEnemy.gameObject = targetHB.healthComponent.gameObject; wispMaster.GetComponent <RoR2.CharacterAI.BaseAI>().currentEnemy.bestHurtBox = targetHB; summonLimit.Add(wispMasterObject); }; DirectorCore.instance.TrySpawnObject(directorSpawnRequest); targetInfo.Invalidate(); return(true); } } { DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest((SpawnCard)LegacyResourcesAPI.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscArchWisp"), new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.NearestNode, position = equipmentSlot.GetAimRay().origin }, RoR2Application.rng) { summonerBodyObject = equipmentSlot.characterBody.gameObject }; directorSpawnRequest.onSpawnedServer += (spawnResult) => { GameObject wispMasterObject = spawnResult.spawnedInstance; CharacterMaster wispMaster = wispMasterObject.GetComponent <CharacterMaster>(); wispMaster.inventory.GiveItem(RoR2Content.Items.HealthDecay, (int)duration.Value); wispMaster.inventory.GiveItem(RoR2Content.Items.BoostDamage, (int)(wispDamage.Value - 100f) / 10); wispMaster.inventory.GiveItem(RoR2Content.Items.BoostHp, (int)(wispHealth.Value - 100f) / 10); wispMaster.inventory.GiveItem(RoR2Content.Items.AlienHead, (int)(wispCDR.Value - 100f) / 10); wispMaster.inventory.GiveItem(RoR2Content.Items.BoostAttackSpeed, (int)(wispAttackSpeed.Value - 100f) / 10); summonLimit.Add(wispMasterObject); }; DirectorCore.instance.TrySpawnObject(directorSpawnRequest); return(true); } } return(false); }
public bool AttemptSpawnOnTarget(On.RoR2.CombatDirector.orig_AttemptSpawnOnTarget orig, CombatDirector self, Transform spawnTarget, DirectorPlacementRule.PlacementMode placementMode) { //this.GetComponent< behaviourName as MonoBehaviour> if (self.gameObject == this.gameObject) { var credit = self.monsterCredit; var monsterCards = self.monsterCards; //MoreShrines.Print("We good?"); if (!this.cardPoolInitialized) { List <CardPool> cardPools = new List <CardPool>(); foreach (var category in monsterCards.categories) { foreach (var card in category.cards) { if (cardPools.Any(pool => pool.cost == card.cost)) { cardPools.Find(pool => pool.cost == card.cost).cards.Add(card); } else { var pool = new CardPool(); pool.cost = card.cost; pool.cards.Add(card); cardPools.Add(pool); } } } cardPoolInitialized = true; cardPools.Sort((item1, item2) => { return(item1.cost.CompareTo(item2.cost)); }); var poolIndex = 0; CardPool currentBasePool = cardPools[0]; foreach (var pool in cardPools) { if (pool.cost * countToSpawn < credit) { currentBasePool = pool; } else { break; } poolIndex++; } MoreShrines.Print("Preparing to spawn " + countToSpawn + " monsters."); CardPool buffPool = cardPools[0]; var buffCount = 0; for (var i = 0; i < countToSpawn; i++) { var count = countToSpawn - i; if (cardPools.Count > poolIndex + 1) { if (((countToSpawn - count) * currentBasePool.cost) + (count * cardPools[poolIndex + 1].cost) < credit) { buffPool = cardPools[poolIndex + 1]; buffCount++; } } } for (var i = 0; i < countToSpawn - buffCount; i++) { finalSpawnOrder.Add(currentBasePool); } for (var i = 0; i < buffCount; i++) { finalSpawnOrder.Add(buffPool); } } // if (finalSpawnOrder.Count > 0) { self.currentMonsterCard = finalSpawnOrder[0].cards[Random.Range(0, finalSpawnOrder[0].cards.Count - 1)]; SpawnCard spawnCard = self.currentMonsterCard.spawnCard; DirectorPlacementRule directorPlacementRule = new DirectorPlacementRule { placementMode = placementMode, spawnOnTarget = spawnTarget, preventOverhead = self.currentMonsterCard.preventOverhead }; DirectorCore.GetMonsterSpawnDistance(self.currentMonsterCard.spawnDistance, out directorPlacementRule.minDistance, out directorPlacementRule.maxDistance); directorPlacementRule.minDistance *= self.spawnDistanceMultiplier; DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(spawnCard, directorPlacementRule, self.rng); directorSpawnRequest.ignoreTeamMemberLimit = self.ignoreTeamSizeLimit; directorSpawnRequest.teamIndexOverride = new TeamIndex?(self.teamIndex); directorSpawnRequest.onSpawnedServer = new Action <SpawnCard.SpawnResult>(onCardSpawned); if (!DirectorCore.instance.TrySpawnObject(directorSpawnRequest)) { /* * Debug.LogFormat("Spawn card {0} failed to spawn. Aborting cost procedures.", new object[] * { * spawnCard * });*/ self.enabled = false; return(false); } } else { self.enabled = false; return(false); } self.spawnCountInCurrentWave += 1; return(true); } else { return(orig(self, spawnTarget, placementMode)); } }
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 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 SpawnSpawnCard(SpawnCard spawnCard) { var localUser = LocalUserManager.GetFirstLocalUser(); var body = localUser.cachedMasterController.master.GetBody().transform; if (localUser.cachedMasterController && localUser.cachedMasterController.master) { var directorSpawnRequest = new DirectorSpawnRequest(spawnCard, new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Approximate, minDistance = Spawn.minDistance, maxDistance = Spawn.maxDistance, position = UmbraMenu.LocalPlayerBody.footPosition }, RoR2Application.rng) { ignoreTeamMemberLimit = true, teamIndexOverride = Spawn.team[Spawn.teamIndex] }; directorSpawnRequest.spawnCard.sendOverNetwork = true; string cardName = spawnCard.ToString(); string category = ""; string buttonText = ""; if (cardName.Contains("MultiCharacterSpawnCard")) { cardName = cardName.Replace(" (RoR2.MultiCharacterSpawnCard)", ""); category = "CharacterSpawnCard"; buttonText = cardName.Replace("csc", ""); } else if (cardName.Contains("CharacterSpawnCard")) { cardName = cardName.Replace(" (RoR2.CharacterSpawnCard)", ""); category = "CharacterSpawnCard"; buttonText = cardName.Replace("csc", ""); } else if (cardName.Contains("InteractableSpawnCard")) { cardName = cardName.Replace(" (RoR2.InteractableSpawnCard)", ""); category = "InteractableSpawnCard"; buttonText = cardName.Replace("isc", ""); } else if (cardName.Contains("BodySpawnCard")) { cardName = cardName.Replace(" (RoR2.BodySpawnCard)", ""); category = "BodySpawnCard"; buttonText = cardName.Replace("bsc", ""); } string path = $"SpawnCards/{category}/{cardName}"; if (cardName.Contains("isc")) { var interactable = Resources.Load <SpawnCard>(path).DoSpawn(body.position + (Vector3.forward * Spawn.minDistance), body.rotation, directorSpawnRequest).spawnedInstance.gameObject; Spawn.spawnedObjects.Add(interactable); Chat.AddMessage($"<color=yellow>Spawned \"{buttonText}\"</color>"); } else { DirectorCore.instance.TrySpawnObject(directorSpawnRequest); Chat.AddMessage($"<color=yellow>Spawned \"{buttonText}\" on team \"{Spawn.team[Spawn.teamIndex]}\" </color>"); } } }
private void Detonate() { this.hasExploded = true; Util.PlaySound(EntityStates.JellyfishMonster.JellyNova.novaSoundString, base.gameObject); if (base.modelLocator) { if (base.modelLocator.modelBaseTransform) { EntityState.Destroy(base.modelLocator.modelBaseTransform.gameObject); } if (base.modelLocator.modelTransform) { EntityState.Destroy(base.modelLocator.modelTransform.gameObject); } } if (this.chargeEffect) { EntityState.Destroy(this.chargeEffect); } if (EntityStates.JellyfishMonster.JellyNova.novaEffectPrefab) { EffectManager.SpawnEffect(EntityStates.JellyfishMonster.JellyNova.novaEffectPrefab, new EffectData { origin = base.transform.position, scale = NuclearNova.novaRadius }, true); } if (NetworkServer.active) { for (int i = 0; i < SpawnNova.jellyCount; i++) { Vector3 position = base.characterBody.corePosition + (SpawnNova.jellyDropRadius * UnityEngine.Random.insideUnitSphere); DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest((SpawnCard)Resources.Load(string.Format("SpawnCards/CharacterSpawnCards/cscJellyfish")), new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Direct, minDistance = 0f, maxDistance = 0f, position = position }, RoR2Application.rng); directorSpawnRequest.summonerBodyObject = base.gameObject; GameObject jelly = DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (jelly) { CharacterMaster master = jelly.GetComponent <CharacterMaster>(); jelly.GetComponent <Inventory>().SetEquipmentIndex(base.characterBody.inventory.currentEquipmentIndex); } } } if (base.healthComponent) { base.healthComponent.Suicide(null, null, DamageType.Generic); } }
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); }
private void BossGroupDropRewards(On.RoR2.BossGroup.orig_DropRewards orig, BossGroup self) { //NOTE: We're overwriting the behavior entirely here, so no need to call back to orig //If no players, nothing to do int participatingPlayerCount = R2API.ItemDropAPI.BossDropParticipatingPlayerCount ?? Run.instance.participatingPlayerCount; if (participatingPlayerCount == 0) { return; } //More items for more players and for more mountain shrines int itemCount = (1 + self.bonusRewardCount); if (self.scaleRewardsByPlayerCount) { itemCount *= participatingPlayerCount; } for (int i = 0; i < itemCount; i++) { var rng = new Xoroshiro128Plus(Run.instance.stageRng.nextUlong); //Create spawn card for a free green-item shop var spawnCard = Resources.Load <InteractableSpawnCard>("SpawnCards/InteractableSpawnCard/iscTripleShopLarge"); var controller = spawnCard.prefab.GetComponent <MultiShopController>(); //Slowly increasing chance of red items, capping at 20% var maxChance = RaincoatConfig.BossDropRedsMaxChance.Value; var chancePerStage = RaincoatConfig.BossDropRedsChancePerStage.Value; var minStage = RaincoatConfig.BossDropRedsMinStage.Value; var redChance = Mathf.Min(maxChance, chancePerStage * (Run.instance.stageClearCount - minStage - 1)); controller.itemTier = rng.nextNormalizedFloat < redChance || self.forceTier3Reward ? ItemTier.Tier3 : ItemTier.Tier2; //Determine where to place the shop (randomly relative to the drop position) var placementRule = new DirectorPlacementRule(); placementRule.maxDistance = 60f; placementRule.minDistance = 10f; placementRule.placementMode = DirectorPlacementRule.PlacementMode.Approximate; placementRule.position = self.dropPosition.position; placementRule.spawnOnTarget = self.dropPosition; var spawnRequest = new DirectorSpawnRequest(spawnCard, placementRule, rng); var oldBaseCost = controller.baseCost; controller.baseCost = 0; var spawnedObj = DirectorCore.instance.TrySpawnObject(spawnRequest); controller.baseCost = oldBaseCost; if (spawnedObj != null) { //Replace first terminal with special boss item, if applicable var bossDrops = self.GetFieldValue <List <PickupIndex> >("bossDrops"); if (bossDrops?.Count > 0 && rng.nextNormalizedFloat <= self.bossDropChance) { controller = spawnedObj.GetComponent <MultiShopController>(); var terminal = controller.GetFieldValue <GameObject[]>("terminalGameObjects")[0]; var behavior = terminal.GetComponent <ShopTerminalBehavior>(); behavior.SetPickupIndex(rng.NextElementUniform(bossDrops)); } } } }
GameObject TrySpawnObject(On.RoR2.DirectorCore.orig_TrySpawnObject orig, DirectorCore directorCore, DirectorSpawnRequest directorSpawnRequest) { if (directorSpawnRequest.spawnCard.name == "iscScavBackpack") { if (playerInteractables.interactablesInvalid.Contains("ScavBackpack")) { return(null); } } return(orig(directorCore, directorSpawnRequest)); }
public static void SpawnMob(GUIStyle buttonStyle, GUIStyle Highlighted, string buttonName) { int buttonPlacement = 1; foreach (var spawnCard in Main.spawnCards) { string cardName = spawnCard.ToString(); string category = ""; string buttonText = ""; if (cardName.Contains("MultiCharacterSpawnCard")) { cardName = cardName.Replace(" (RoR2.MultiCharacterSpawnCard)", ""); category = "CharacterSpawnCard"; buttonText = cardName.Replace("csc", ""); } else if (cardName.Contains("CharacterSpawnCard")) { cardName = cardName.Replace(" (RoR2.CharacterSpawnCard)", ""); category = "CharacterSpawnCard"; buttonText = cardName.Replace("csc", ""); } else if (cardName.Contains("InteractableSpawnCard")) { cardName = cardName.Replace(" (RoR2.InteractableSpawnCard)", ""); category = "InteractableSpawnCard"; buttonText = cardName.Replace("isc", ""); } else if (cardName.Contains("BodySpawnCard")) { cardName = cardName.Replace(" (RoR2.BodySpawnCard)", ""); category = "BodySpawnCard"; buttonText = cardName.Replace("bsc", ""); } string path = $"SpawnCards/{category}/{cardName}"; if (GUI.Button(btn.BtnRect(buttonPlacement, false, buttonName), buttonText, Navigation.HighlighedCheck(buttonStyle, Highlighted, 4.1f, buttonPlacement))) { var localUser = LocalUserManager.GetFirstLocalUser(); var body = localUser.cachedMasterController.master.GetBody().transform; if (localUser.cachedMasterController && localUser.cachedMasterController.master) { var directorspawnrequest = new DirectorSpawnRequest(spawnCard, new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Approximate, minDistance = minDistance, maxDistance = maxDistance, position = Main.LocalPlayerBody.footPosition }, RoR2Application.rng); directorspawnrequest.ignoreTeamMemberLimit = true; directorspawnrequest.teamIndexOverride = team[teamIndex]; // Add chat message if (cardName.Contains("isc")) { Resources.Load <SpawnCard>(path).DoSpawn(body.position + (Vector3.forward * minDistance), body.rotation, directorspawnrequest); } else { DirectorCore.instance.TrySpawnObject(directorspawnrequest); } Chat.AddMessage($"<color=yellow>Spawned \"{buttonText}\" on team \"{team[teamIndex]}\" </color>"); } } buttonPlacement++; } }
private GameObject OverrideTeamSpawn(On.RoR2.DirectorCore.orig_TrySpawnObject orig, DirectorCore self, DirectorSpawnRequest directorSpawnRequest) { if (directorSpawnRequest.spawnCard && directorSpawnRequest.spawnCard.prefab) { var characterMaster = directorSpawnRequest.spawnCard.prefab.GetComponent <CharacterMaster>(); if (characterMaster) { var bodyIndex = characterMaster.bodyPrefab.GetComponent <CharacterBody>().bodyIndex; if (bodyIndex_to_teamIndex.TryGetValue(bodyIndex, out TeamIndex teamIndex)) { //_logger.LogMessage($"Overriding teamIndex to {teamIndex}"); directorSpawnRequest.teamIndexOverride = teamIndex; } } } var original = orig(self, directorSpawnRequest); return(original); }
private void SummonLunarChimera(On.RoR2.CharacterBody.orig_FixedUpdate orig, CharacterBody self) { int inventoryCount = GetCount(self); CharacterMaster master = self.master; if (NetworkServer.active && inventoryCount > 0 && master && !IsMinion(master)) //Check if we're a minion or not. If we are, we don't summon a chimera. { LunarChimeraComponent lcComponent = LunarChimeraComponent.GetOrCreateComponent(master); if (!lcComponent.LastChimeraSpawned || !lcComponent.LastChimeraSpawned.master || !lcComponent.LastChimeraSpawned.master.hasBody) { lcComponent.LastChimeraSpawned = null; lcComponent.ResummonCooldown -= Time.fixedDeltaTime; if (lcComponent.ResummonCooldown <= 0f && SceneCatalog.mostRecentSceneDef != SceneCatalog.GetSceneDefFromSceneName("bazaar")) { DirectorPlacementRule placeRule = new DirectorPlacementRule { placementMode = DirectorPlacementRule.PlacementMode.Approximate, minDistance = 10f, maxDistance = 40f, spawnOnTarget = self.transform }; DirectorSpawnRequest directorSpawnRequest = new DirectorSpawnRequest(lunarChimeraSpawnCard, placeRule, RoR2Application.rng) { teamIndexOverride = TeamIndex.Player //summonerBodyObject = self.gameObject }; GameObject gameObject = DirectorCore.instance.TrySpawnObject(directorSpawnRequest); if (gameObject) { CharacterMaster cMaster = gameObject.GetComponent <CharacterMaster>(); if (cMaster) { //RoR2.Chat.AddMessage($"Character Master Found: {component}"); cMaster.teamIndex = TeamIndex.Neutral; cMaster.inventory.GiveItem(ItemIndex.BoostDamage, lunarChimeraBaseDamageBoost + (lunarChimeraAdditionalDamageBoost * inventoryCount - 1)); cMaster.inventory.GiveItem(ItemIndex.BoostHp, lunarChimeraBaseHPBoost * inventoryCount); cMaster.inventory.GiveItem(ItemIndex.BoostAttackSpeed, lunarChimeraBaseAttackSpeedBoost); cMaster.inventory.GiveItem(ItemIndex.Hoof, lunarChimeraBaseMovementSpeedBoost * inventoryCount); cMaster.minionOwnership.SetOwner(master); CharacterBody cBody = cMaster.GetBody(); if (cBody) { //RoR2.Chat.AddMessage($"CharacterBody Found: {component4}"); cBody.teamComponent.teamIndex = TeamIndex.Neutral; cBody.gameObject.AddComponent <LunarChimeraRetargetComponent>(); lcComponent.LastChimeraSpawned = cBody; DeathRewards deathRewards = cBody.GetComponent <DeathRewards>(); if (deathRewards) { //RoR2.Chat.AddMessage($"DeathRewards Found: {component5}"); deathRewards.goldReward = 0; deathRewards.expReward = 0; } NetworkIdentity bodyNet = cBody.GetComponent <NetworkIdentity>(); if (bodyNet) { new AssignOwner(lcComponent.netId, bodyNet.netId).Send(NetworkDestination.Clients); } } } lcComponent.ResummonCooldown = lunarChimeraResummonCooldownDuration; } } } } orig(self); }