コード例 #1
0
        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);
            }
        }
コード例 #2
0
 // 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);
         }
     }
 }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: QoLEclipse.cs プロジェクト: Reinms/RoR2Modding
        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);
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
ファイル: WrithingJar.cs プロジェクト: harbingerofme/R2Mods
        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);
        }
コード例 #7
0
        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);
                    }
                }
            }
        }
コード例 #8
0
        // 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);
                }
            }
        }
コード例 #9
0
        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));
        }
コード例 #10
0
        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));
        }
コード例 #11
0
ファイル: Brooch.cs プロジェクト: madolinn/RoR2-ClassicItems
        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);
            }
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
 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);
 }
コード例 #15
0
        // 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);
            }
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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));
            }
        }
コード例 #18
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);
            }
        }
コード例 #19
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);
            }
        }
コード例 #20
0
        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>");
                }
            }
        }
コード例 #21
0
        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);
            }
        }
コード例 #22
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);
        }
コード例 #23
0
        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));
                    }
                }
            }
        }
コード例 #24
0
 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));
 }
コード例 #25
0
        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++;
            }
        }
コード例 #26
0
        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);
        }
コード例 #27
0
        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);
        }