Ejemplo n.º 1
0
        // Token: 0x06003156 RID: 12630 RVA: 0x000D45DC File Offset: 0x000D27DC
        public virtual void OnImpactServer(Vector3 contactPoint)
        {
            string text = BodyCatalog.GetBodyName(base.characterBody.bodyIndex);

            text = text.Replace("Body", "");
            text = "iscBroken" + text;
            SpawnCard spawnCard = Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/" + text);

            if (spawnCard != null)
            {
                DirectorPlacementRule placementRule = new DirectorPlacementRule
                {
                    placementMode = DirectorPlacementRule.PlacementMode.Direct,
                    position      = contactPoint
                };
                GameObject gameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, placementRule, new Xoroshiro128Plus(0UL)));
                if (gameObject)
                {
                    PurchaseInteraction component = gameObject.GetComponent <PurchaseInteraction>();
                    if (component && component.costType == CostTypeIndex.Money)
                    {
                        component.Networkcost = Run.instance.GetDifficultyScaledCost(component.cost);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        // Copy from TeleporterHelper, but uses a different strategy so they don't spawn on top of the person
        public static Vector3?FindSafeTeleportDestination(Vector3 characterFootPosition, CharacterBody characterBodyOrPrefabComponent, Xoroshiro128Plus rng)
        {
            Vector3?  result    = null;
            SpawnCard spawnCard = ScriptableObject.CreateInstance <SpawnCard>();

            spawnCard.hullSize = characterBodyOrPrefabComponent.hullClassification;
            //spawnCard.nodeGraphType = MapNodeGroup.GraphType.Ground;
            spawnCard.prefab = Resources.Load <GameObject>("SpawnCards/HelperPrefab");
            DirectorPlacementRule placementRule = new DirectorPlacementRule
            {
                placementMode = DirectorPlacementRule.PlacementMode.Approximate,
                position      = characterFootPosition
            };

            DirectorCore.GetMonsterSpawnDistance(DirectorCore.MonsterSpawnDistance.Close,
                                                 out placementRule.minDistance, out placementRule.maxDistance);
            GameObject gameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, placementRule, rng));

            if (gameObject)
            {
                result = new Vector3?(gameObject.transform.position);
                Destroy(gameObject);
            }
            Destroy(spawnCard);
            return(result);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        private void SpawnMoneyLunarPod(Vector3 moneyPodPosition)
        {
            SpawnCard             chestCard     = Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/iscLunarChest");
            DirectorPlacementRule placementRule = new DirectorPlacementRule();

            placementRule.placementMode = DirectorPlacementRule.PlacementMode.Direct;
            moneyLunarPod = chestCard.DoSpawn(moneyPodPosition, Quaternion.identity, new DirectorSpawnRequest(chestCard, placementRule, Run.instance.runRNG)).spawnedInstance;
            displayItems.Add(moneyLunarPod);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
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));
        }
Ejemplo n.º 7
0
        private void SpawnPrinters()
        {
            printerPosAndRot.Clear();
            FillPrinterInfo();

            for (int i = 0; i < ModConfig.printerCount.Value; i++)
            {
                string                randomDuplicator = GetRandomDuplicator();
                SpawnCard             printerCard      = Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/" + randomDuplicator);
                DirectorPlacementRule placementRule    = new DirectorPlacementRule();
                placementRule.placementMode = DirectorPlacementRule.PlacementMode.Direct;
                GameObject printerOne = printerCard.DoSpawn(printerPosAndRot[i].position, Quaternion.identity, new DirectorSpawnRequest(printerCard, placementRule, Run.instance.runRNG)).spawnedInstance;
                printerOne.transform.eulerAngles = printerPosAndRot[i].rotation;
            }
        }
Ejemplo n.º 8
0
        // Token: 0x06002C5A RID: 11354 RVA: 0x000BB35C File Offset: 0x000B955C
        private void AttemptDropPack()
        {
            DirectorCore instance = DirectorCore.instance;

            if (instance)
            {
                Xoroshiro128Plus      rng           = new Xoroshiro128Plus((ulong)Run.instance.stageRng.nextUint);
                DirectorPlacementRule placementRule = new DirectorPlacementRule
                {
                    placementMode = DirectorPlacementRule.PlacementMode.NearestNode,
                    position      = base.characterBody.footPosition,
                    minDistance   = 0f,
                    maxDistance   = float.PositiveInfinity
                };
                instance.TrySpawnObject(new DirectorSpawnRequest(this.spawnCard, placementRule, rng));
            }
        }
Ejemplo n.º 9
0
        private static void Spawn(ConCommandArgs args)
        {
            var spawnCardStr = args.userArgs[0];
            var eliteStr     = args.userArgs.Count > 1 ? args.userArgs[1] : "";

            var spawnCard = Resources.Load <CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/" + spawnCardStr);

            if (spawnCard == null)
            {
                Debug.LogWarning($"Could not locate character spawn card asset with name {spawnCardStr}; should be 'cscBeetle' for spawning a beetle, for instance");
                return;
            }

            EliteAffixCard affixCard = null;

            if (!string.IsNullOrEmpty(eliteStr))
            {
                affixCard = EsoLib.Cards.FirstOrDefault(c => EliteCatalog
                                                        .GetEliteDef(c.eliteType).modifierToken.ToLower()
                                                        .Contains(eliteStr.ToLower()));
            }

            var user = LocalUserManager.GetFirstLocalUser();
            var body = user.cachedBody;

            if (body?.master == null)
            {
                Debug.LogError("Cannot find local user body!");
                return;
            }

            var placement = new DirectorPlacementRule
            {
                spawnOnTarget   = body.transform,
                maxDistance     = 40,
                placementMode   = DirectorPlacementRule.PlacementMode.Approximate,
                preventOverhead = false
            };

            var rng = new Xoroshiro128Plus((ulong)DateTime.Now.Ticks);

            if (EsoLib.TrySpawnElite(spawnCard, affixCard, placement, rng) == null)
            {
                Debug.LogWarning("Failed to spawn elite; try again somewhere less crowded");
            }
        }
Ejemplo n.º 10
0
        public override void SetupAttributes()
        {
            if (ItemBodyModelPrefab == null)
            {
                ItemBodyModelPrefab = modelResource;
                displayRules        = GenerateItemDisplayRules();
            }

            base.SetupAttributes();
            placementRule = new DirectorPlacementRule
            {
                placementMode   = DirectorPlacementRule.PlacementMode.Approximate,
                maxDistance     = 100f,
                minDistance     = 20f,
                preventOverhead = true
            };
        }
Ejemplo n.º 11
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));
        }
        /// <summary>
        /// Overridden method from the original state so that it would instead spawn the specified interactable's spawn card.
        /// There is no need to override this unless special behavior is needed.
        /// </summary>
        /// <param name="contactPoint">The point where the interactable spawns</param>
        public override void OnImpactServer(Vector3 contactPoint)
        {
            if (!SpawnInteractable)
            {
                return;
            }
            var spawnCard = GetInteractableSpawnCard;

            if (spawnCard != null)
            {
                DirectorPlacementRule placementRule = new DirectorPlacementRule
                {
                    placementMode = DirectorPlacementRule.PlacementMode.Direct,
                    position      = contactPoint
                };
                GameObject gameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, placementRule, new Xoroshiro128Plus(0UL)));
                if (gameObject)
                {
                    OnInteractableSpawn(gameObject);
                }
            }
        }
Ejemplo n.º 13
0
        public static void CustomGenerate(string prefabPath, int amountToTrySpawn, int Price, Xoroshiro128Plus rng)
        {
            for (int i = 0; i < amountToTrySpawn; i++)
            {
                //Amount of attempts to try spawning this prefab before moving on
                int tries = 0;
                while (tries < 10)
                {
                    DirectorPlacementRule placementRule = new DirectorPlacementRule
                    {
                        placementMode = DirectorPlacementRule.PlacementMode.Random
                    };
                    //Spawn
                    GameObject spawnedObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest((InteractableSpawnCard)Resources.Load(prefabPath), placementRule, rng));

                    if (spawnedObject)
                    {
                        //Find PurchaseInteraction
                        PurchaseInteraction purchaseInteraction = spawnedObject.GetComponent <PurchaseInteraction>();
                        if (purchaseInteraction)
                        {
                            if (purchaseInteraction.costType == CostTypeIndex.Money)
                            {
                                //Apply unscaled cost
                                purchaseInteraction.Networkcost = Price == -1 ? purchaseInteraction.cost : Price;
                                break;
                            }
                        }

                        break;
                    }
                    else
                    {
                        tries++;
                    }
                }
            }
        }
Ejemplo n.º 14
0
        private static void SceneDirector_PopulateScene(Action <RoR2.SceneDirector> orig, SceneDirector self)
        {
            foreach (InteractableInfo interactable in registeredInteractables)
            {
                if (interactable.minimumCount > 0 && interactable.scenes.Contains(SceneManager.GetActiveScene().name))
                {
                    for (var i = 0; i < interactable.minimumCount; i++)
                    {
                        DirectorPlacementRule placementRule = new DirectorPlacementRule
                        {
                            placementMode = DirectorPlacementRule.PlacementMode.Random
                        };

                        GameObject gameObject = null;
                        int        counter    = 0;
                        while (gameObject == null)
                        {
                            counter++;
                            gameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(interactable.directorCard.spawnCard, placementRule, self.rng));
                            if (counter >= 10)
                            {
                                break;
                            }
                        }

                        if (gameObject)
                        {
                            PurchaseInteraction component = gameObject.GetComponent <PurchaseInteraction>();
                            if (component && component.costType == CostTypeIndex.Money)
                            {
                                component.Networkcost = Run.instance.GetDifficultyScaledCost(component.cost);
                            }
                        }
                    }
                }
            }
            orig(self);
        }
 // Token: 0x06000503 RID: 1283 RVA: 0x00015104 File Offset: 0x00013304
 public override void FixedUpdate()
 {
     base.FixedUpdate();
     this.stopwatch        += Time.fixedDeltaTime;
     this.shieldRemovalAge += Time.fixedDeltaTime;
     if (NetworkServer.active)
     {
         if (GoldshoresMissionController.instance.beaconsActive == GoldshoresMissionController.instance.beaconsToSpawnOnMap && !this.shieldIsOff)
         {
             EffectManager.instance.SpawnEffect(GoldshoresBossfight.shieldRemovalEffectPrefab, new EffectData
             {
                 origin = this.bossInstanceBody.coreTransform.position
             }, true);
             this.RemoveImmunityBuff();
             this.shieldRemovalAge = 0f;
             this.shieldIsOff      = true;
         }
         if (this.shieldRemovalAge >= GoldshoresBossfight.shieldRemovalDuration && this.shieldIsOff)
         {
             this.shieldIsOff = false;
             foreach (GameObject gameObject in GoldshoresMissionController.instance.beaconInstanceList)
             {
                 gameObject.GetComponent <EntityStateMachine>().SetNextState(new NotReady());
             }
             this.AddImmunityBuff();
         }
         if (this.stopwatch >= GoldshoresBossfight.transitionDuration)
         {
             GoldshoresMissionController.instance.ExitTransitionIntoBossfight();
             if (!this.hasSpawnedBoss)
             {
                 Vector3 zero = Vector3.zero;
                 this.hasSpawnedBoss = true;
                 DirectorPlacementRule placementRule = new DirectorPlacementRule
                 {
                     placementMode = DirectorPlacementRule.PlacementMode.NearestNode,
                     minDistance   = 0f,
                     maxDistance   = 1000f,
                     position      = zero
                 };
                 GameObject gameObject2 = DirectorCore.instance.TrySpawnObject(Resources.Load <SpawnCard>("SpawnCards/CharacterSpawnCards/cscTitanGold"), placementRule, GoldshoresMissionController.instance.rng);
                 if (gameObject2)
                 {
                     float           num       = 1f;
                     float           num2      = 1f;
                     CharacterMaster component = gameObject2.GetComponent <CharacterMaster>();
                     this.bossInstanceBody = component.GetBody();
                     if (!this.bossGroup)
                     {
                         GameObject gameObject3 = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/BossGroup"));
                         NetworkServer.Spawn(gameObject3);
                         this.bossGroup = gameObject3.GetComponent <BossGroup>();
                         this.bossGroup.dropPosition = GoldshoresMissionController.instance.bossSpawnPosition;
                     }
                     this.AddImmunityBuff();
                     num2 += Run.instance.difficultyCoefficient / 8f;
                     num  += Run.instance.difficultyCoefficient / 2f;
                     int livingPlayerCount = Run.instance.livingPlayerCount;
                     num *= Mathf.Pow((float)livingPlayerCount, 0.5f);
                     component.inventory.GiveItem(ItemIndex.BoostHp, Mathf.RoundToInt((num - 1f) * 10f));
                     component.inventory.GiveItem(ItemIndex.BoostDamage, Mathf.RoundToInt((num2 - 1f) * 10f));
                     this.bossGroup.bossDropChance = 1f;
                     this.bossGroup.AddMember(component);
                     return;
                 }
             }
             else if (this.bossGroup.readOnlyMembersList.Count == 0)
             {
                 this.outer.SetNextState(new Exit());
             }
         }
     }
 }
Ejemplo n.º 16
0
        private void OnTriggerEnter(Collider collider)
        {
            //Only run on the host and when enabled
            if (!NetworkServer.active || !enabled)
            {
                return;
            }

            //Check if we've collided with a player character
            var body = collider.gameObject.GetComponent <CharacterBody>();

            if (body != null && body.isPlayerControlled)
            {
                //We've done our job after this and can go to sleep
                enabled = false;

                //Assuming this is a chest, grab its behavior
                var chest = gameObject.GetComponent <ChestBehavior>();
                if (chest == null)
                {
                    return;
                }

                //Check what item was supposed to drop from this chest
                var chestDrop = chest.GetFieldValue <PickupIndex>("dropPickup");
                var dropItem  = PickupCatalog.GetPickupDef(chestDrop).itemIndex;
                if (dropItem == ItemIndex.None)
                {
                    return;
                }

                //We're not really a chest, so remove it, noting where we were located
                var position = transform.position;
                Destroy(gameObject);

                //Play the shrine effect to highlight that something momentous is happening
                EffectManager instance     = EffectManager.instance;
                GameObject    effectPrefab = Resources.Load <GameObject>("Prefabs/Effects/ShrineUseEffect");
                EffectData    effectData   = new EffectData();
                effectData.origin   = position;
                effectData.rotation = Quaternion.identity;
                effectData.scale    = 1f;
                effectData.color    = new Color32(255, 0, 0, 255);
                instance.SpawnEffect(effectPrefab, effectData, true);

                var   monsterSelection    = ClassicStageInfo.instance.monsterSelection;
                var   weightedSelection   = new WeightedSelection <DirectorCard>(8);
                float eliteCostMultiplier = CombatDirector.highestEliteCostMultiplier;
                for (int index = 0; index < monsterSelection.Count; ++index)
                {
                    DirectorCard directorCard = monsterSelection.choices[index].value;
                    var          noElites     = ((CharacterSpawnCard)directorCard.spawnCard).noElites;
                    float        highestCost  = (float)(directorCard.cost * (noElites ? 1.0 : eliteCostMultiplier));
                    if (directorCard.CardIsValid() && directorCard.cost <= monsterCredit && highestCost / 2.0 > monsterCredit)
                    {
                        weightedSelection.AddChoice(directorCard, monsterSelection.choices[index].weight);
                    }
                }

                if (weightedSelection.Count != 0)
                {
                    var chosenDirectorCard = weightedSelection.Evaluate(_rng.nextNormalizedFloat);

                    var eliteAffix = EsoLib.ChooseEliteAffix(chosenDirectorCard, monsterCredit, _rng);

                    var placement = new DirectorPlacementRule
                    {
                        placementMode   = DirectorPlacementRule.PlacementMode.Approximate,
                        preventOverhead = chosenDirectorCard.preventOverhead,
                        minDistance     = 0,
                        maxDistance     = 50,
                        spawnOnTarget   = transform
                    };

                    var spawned = EsoLib.TrySpawnElite((CharacterSpawnCard)chosenDirectorCard.spawnCard, eliteAffix, placement, _rng);
                    if (spawned == null)
                    {
                        Debug.LogWarning("Failed to spawn monster for Mimic!");

                        //This ideally shouldn't happen, but for now we'll at least drop the item
                        PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(dropItem), position, 10f * Vector3.up);
                        return;
                    }

                    //This monster carries the item that would've been in the chest and only gives xp, no gold
                    var spawnedMaster = spawned.GetComponent <CharacterMaster>();
                    spawnedMaster.inventory.GiveItem(dropItem);
                    BoundReward           = spawnedMaster.GetBody().GetComponent <DeathRewards>();
                    BoundReward.expReward = (uint)(chosenDirectorCard.cost * 0.2 * Run.instance.compensatedDifficultyCoefficient);
                    BoundItem             = dropItem;
                }
            }
        }
Ejemplo n.º 17
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);
        }
Ejemplo n.º 18
0
        public void StartBazaar(BiggerBazaar biggerBazaar)
        {
            isUsingexperimentalScaling = false;
            if (!ModConfig.disableTransferMoney.Value)
            {
                for (int i = 0; i < PlayerCharacterMasterController.instances.Count; i++)
                {
                    for (int j = 0; j < bazaarPlayers.Count; j++)
                    {
                        if (bazaarPlayers[j].networkUser == PlayerCharacterMasterController.instances[i].networkUser)
                        {
                            if (!ModConfig.IsShareSuiteMoneySharing())
                            {
                                PlayerCharacterMasterController.instances[i].master.money = bazaarPlayers[j].money;
                                break;
                            }

                            //ShareSuite.MoneySharingHooks.AddMoneyExternal((int)this.bazaarPlayers[j].money);
                            biggerBazaar.StartCoroutine(TriggerInteractorBarrelInteraction(PlayerCharacterMasterController.instances[i].master, GetShareSuiteSharedMoneyValue()));
                            goto done;
                        }
                    }
                }
                done :;
            }

            ClearBazaarItems();
            List <PickupTier> bazaarItemTiers = PickRandomWeightedBazaarItemTiers(bazaarItemAmount);

            //uint playerMoney = 0;
            //for (int i = 0; i < bazaarPlayers.Count; i++)
            //{
            //    playerMoney += bazaarPlayers[i].money;
            //}
            if (AreAnyItemsAvailable() && bazaarItemTiers != null)
            {
                if (ModConfig.chestCostType.Value == 1)
                {
                    for (int i = 0; i < bazaarItemTiers.Count; i++)
                    {
                        SpawnBazaarItemAt(bazaarItemPositions[i], bazaarItemRotations[i], bazaarItemTiers[i], ModConfig.GetTierUnitConfig(bazaarItemTiers[i]).costLunar);
                    }
                    //}
                    // experimental price scaling
                    //else if (ModConfig.experimentalPriceScaling.Value && DoPlayersHaveTooMuchMoney(playerMoney, bazaarItemTiers))
                    //{
                    //    isUsingexperimentalScaling = true;
                    //    uint unscaledPlayerMoney = GetDifficultyUnscaledCost(playerMoney);
                    //    float chestUnits = 0f;

                    //    for (int i = 0; i < bazaarItemTiers.Count; i++)
                    //    {
                    //        if (bazaarItemTiers[i] == ItemTier.Tier1)
                    //        {
                    //            chestUnits += 1f * ModConfig.maxChestPurchasesTier1.Value;
                    //        }
                    //        else if (bazaarItemTiers[i] == ItemTier.Tier2)
                    //        {
                    //            chestUnits += tierRatio[bazaarItemTiers[i]] * ModConfig.maxChestPurchasesTier2.Value;
                    //        }
                    //        else if (bazaarItemTiers[i] == ItemTier.Tier3)
                    //        {
                    //            chestUnits += tierRatio[bazaarItemTiers[i]] * ModConfig.maxChestPurchasesTier3.Value;
                    //        }
                    //    }

                    //    int tier1BaseCost = (int)(unscaledPlayerMoney / chestUnits);
                    //    double randomMult = r.NextDouble() * (ModConfig.experimentalPriceScalingMaxPercent.Value - ModConfig.experimentalPriceScalingMinPercent.Value) + ModConfig.experimentalPriceScalingMinPercent.Value;
                    //    for (int i = 0; i < bazaarItemTiers.Count; i++)
                    //    {
                    //        tierRatio.TryGetValue(bazaarItemTiers[i], out float val);
                    //        int scaledCost = (int)(tier1BaseCost * ((1f / randomMult) * val));
                    //        //Debug.Log("Tier " + bazaarItemTiers[i] + ": " + scaledCost);
                    //        SpawnBazaarItemAt(bazaarItemPositions[i], bazaarItemRotations[i], bazaarItemTiers[i], scaledCost);
                    //    }
                    //    priceScaledLunarPodBaseCost = (int)(tier1BaseCost * ((1f / randomMult) * tierRatio[ItemTier.Tier2]));
                }
                else
                // regular price
                {
                    for (int i = 0; i < bazaarItemTiers.Count; i++)
                    {
                        SpawnBazaarItemAt(bazaarItemPositions[i], bazaarItemRotations[i], bazaarItemTiers[i], -1);
                    }
                }
                if (ModConfig.maxLunarExchanges.Value != 0)
                {
                    SpawnMoneyLunarPod(moneyPodPosition);
                }

                if (ModConfig.isShareSuiteLoaded)
                {
                    // if money sharing spawn a barrel interaction that handles giving money because of the ShareSuite money sharing issue
                    if (ModConfig.IsShareSuiteMoneySharing())
                    {
                        SpawnCard             barrelCard     = Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/iscBarrel1");
                        Vector3               barrelPosition = new Vector3(200f, 200f, 200f);
                        DirectorPlacementRule placementRule  = new DirectorPlacementRule();
                        placementRule.placementMode = DirectorPlacementRule.PlacementMode.Direct;
                        GameObject barrelGameObject = barrelCard.DoSpawn(barrelPosition, Quaternion.identity, new DirectorSpawnRequest(barrelCard, placementRule, Run.instance.runRNG)).spawnedInstance;
                        barrelInteraction = barrelGameObject.GetComponent <BarrelInteraction>();
                    }
                }
            }
        }
        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));
            }
        }
Ejemplo n.º 20
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);
        }
Ejemplo n.º 21
0
        // bazaar building
        private void SpawnBazaarItemAt(Vector3 position, Vector3 rotation, PickupTier pickupTier, int cost)
        {
            // chest players interact with
            SpawnCard chestCard;

            if (ModConfig.chestCostType.Value == 0)
            {
                chestCard = Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/iscChest1");
            }
            else
            {
                chestCard = Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/iscLunarChest");
            }
            DirectorPlacementRule placementRule = new DirectorPlacementRule();

            placementRule.placementMode = DirectorPlacementRule.PlacementMode.Direct;
            GameObject chest = chestCard.DoSpawn(position, Quaternion.Euler(new Vector3(0f, 0f, 0f)), new DirectorSpawnRequest(chestCard, placementRule, Run.instance.runRNG)).spawnedInstance;

            chest.transform.eulerAngles = rotation;


            ItemIndex          rItem;
            PickupIndex        rPickupIndex;
            List <PickupIndex> availableItems = GetAvailableItems(pickupTier);
            //if(availableItems.Count > 0)
            //{
            int rItemIndex = r.Next(availableItems.Count);

            rPickupIndex = availableItems[rItemIndex];
            //rItem = PickupCatalog.GetPickupDef(rPickupIndex).itemIndex;
            //}
            //else
            //{
            //    List<ItemIndex> drops = ItemDropAPI.GetDefaultDropList(pickupTier);
            //    int rItemIndex = r.Next(drops.Count);
            //    rItem = drops[rItemIndex];
            //}


            GameObject itemGameObject = UnityEngine.Object.Instantiate <GameObject>(Resources.Load <GameObject>("Prefabs/NetworkedObjects/GenericPickup"), position, Quaternion.identity);

            itemGameObject.GetComponent <GenericPickupController>().transform.Translate(-2f, 4f, -3f, Space.World);
            itemGameObject.GetComponent <GenericPickupController>().NetworkpickupIndex = rPickupIndex;

            displayItems.Add(itemGameObject);
            NetworkServer.Spawn(itemGameObject);

            var chestPI = chest.GetComponent <PurchaseInteraction>();

            if (ModConfig.chestCostType.Value == 1)
            {
                chestPI.costType    = CostTypeIndex.LunarCoin;
                chestPI.Networkcost = cost;
                //chestPI.SetDirtyBit(12u);
            }
            else if (cost == -1)
            {
                if (ModConfig.nextLevelChestPriceScaling.Value)
                {
                    //next level price scaling
                    chestPI.Networkcost = Run.instance.GetDifficultyScaledCost(chestPI.cost);
                    chestPI.Networkcost = (int)(chestPI.Networkcost * ModConfig.GetTierUnitConfig(pickupTier).cost);
                }
                else
                {
                    //previous level price scaling
                    chestPI.Networkcost = GetDifficultyScaledCostFromItemTier(chestPI.cost);
                    chestPI.Networkcost = (int)(chestPI.Networkcost * ModConfig.GetTierUnitConfig(pickupTier).cost);
                }
            }
            else
            {
                chestPI.Networkcost = GetDifficultyScaledCost(cost);
            }



            BazaarItem bazaarItem = new BazaarItem();

            bazaarItem.chestBehavior           = chest.GetComponent <ChestBehavior>();
            bazaarItem.genericPickupController = itemGameObject.GetComponent <GenericPickupController>();
            bazaarItem.pickupIndex             = rPickupIndex;
            bazaarItem.purchaseCount           = 0;
            bazaarItem.maxPurchases            = ModConfig.GetTierUnitConfig(pickupTier).maxChestPurchases;

            bazaarItems.Add(bazaarItem);
            itemGameObject.GetComponent <GenericPickupController>().pickupIndex = PickupIndex.none;
        }
Ejemplo n.º 22
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);
        }
Ejemplo n.º 23
0
        private static void SetupInteractable(SurvivorDef survivorDef)
        {
            // getting his model references
            var mdlBody    = survivorDef.bodyPrefab.GetComponent <ModelLocator>().modelTransform;
            var shield     = mdlBody.Find("meshSpecials/meshEnforcerShield").gameObject;
            var skateboard = mdlBody.Find("meshSpecials/meshEnforcerSkamteBord").gameObject;

            void setupShield()
            {
                var iscBarrel = (InteractableSpawnCard)Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/iscBarrel1");

                iscShieldCard = UnityEngine.Object.Instantiate(iscBarrel); //remove?
                //ShieldInteractablePrefab = iscShieldCard.prefab;
                ShieldInteractablePrefab = R2API.PrefabAPI.InstantiateClone(iscShieldCard.prefab, $"Personalized_Enforcer_SelectShield", true);
                BarrelInteraction barrelInteraction = ShieldInteractablePrefab.GetComponent <BarrelInteraction>();

                barrelInteraction.expReward        = 0;
                barrelInteraction.goldReward       = 0;
                barrelInteraction.displayNameToken = "INTERACTABLE_SHIELD_NAME";
                barrelInteraction.contextToken     = "INTERACTABLE_SHIELD_CONTEXT";
                EnforcerSelectSpecialComponent enforcerSelectSpecialComponent = ShieldInteractablePrefab.AddComponent <EnforcerSelectSpecialComponent>();

                enforcerSelectSpecialComponent.slotIndex = 0;
                iscShieldCard.prefab = ShieldInteractablePrefab;
                ShieldInteractablePrefab.GetComponent <GenericDisplayNameProvider>().displayToken = "INTERACTABLE_SHIELD_NAME";
                //EntityLocator entityLocator = ShieldInteractablePrefab.GetComponentInChildren<EntityLocator>();
                //var newShield = Object.Instantiate(shield, entityLocator.transform.parent);
                //newShield.AddComponent<EntityLocator>().entity = entityLocator.entity;
                //Object.Destroy(entityLocator.gameObject);
                //newShield.AddComponent<MeshCollider>().sharedMesh = newShield.GetComponent<SkinnedMeshRenderer>().sharedMesh;
            }

            void setupSwag()
            {
                var iscBarrel = (InteractableSpawnCard)Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/iscBarrel1");

                iscSwagCard = UnityEngine.Object.Instantiate(iscBarrel); //remove?
                                                                         //ShieldInteractablePrefab = iscShieldCard.prefab;
                SwagInteractablePrefab = R2API.PrefabAPI.InstantiateClone(iscSwagCard.prefab, $"Personalized_Enforcer_SelectSwag", true);
                BarrelInteraction barrelInteraction = SwagInteractablePrefab.GetComponent <BarrelInteraction>();

                barrelInteraction.expReward        = 0;
                barrelInteraction.goldReward       = 0;
                barrelInteraction.displayNameToken = "INTERACTABLE_SWAG_NAME";
                barrelInteraction.contextToken     = "INTERACTABLE_SWAG_CONTEXT";
                EnforcerSelectSpecialComponent enforcerSelectSpecialComponent = SwagInteractablePrefab.AddComponent <EnforcerSelectSpecialComponent>();

                enforcerSelectSpecialComponent.slotIndex = 1;
                iscSwagCard.prefab = SwagInteractablePrefab;
                SwagInteractablePrefab.GetComponent <GenericDisplayNameProvider>().displayToken = "INTERACTABLE_SWAG_NAME";
                //EntityLocator entityLocator = ShieldInteractablePrefab.GetComponentInChildren<EntityLocator>();
                //var newShield = Object.Instantiate(skateboard, entityLocator.transform.parent);
                //newShield.AddComponent<EntityLocator>().entity = entityLocator.entity;
                //Object.Destroy(entityLocator.gameObject);
                //newShield.AddComponent<MeshCollider>().sharedMesh = newShield.GetComponent<SkinnedMeshRenderer>().sharedMesh;
            }

            //sfxlocator.openSound = Play_UI_barrel_open

            //if (BarrelPrefab) PrefabAPI.RegisterNetworkPrefab(BarrelPrefab);
            placementRule = new DirectorPlacementRule
            {
                placementMode   = DirectorPlacementRule.PlacementMode.Approximate,
                maxDistance     = 10f,
                minDistance     = 5f,
                preventOverhead = true
            };

            setupShield();
            setupSwag();

            /*
             * iscSwagCard = Object.Instantiate(iscShieldCard);
             * SwagInteractablePrefab = R2API.PrefabAPI.InstantiateClone(iscSwagCard.prefab, $"Personalized_Enforcer_SelectSwag", true);
             * SwagInteractablePrefab.GetComponent<EnforcerSelectSpecialComponent>().slotIndex = 1;
             * var swagbarrelInteraction = SwagInteractablePrefab.GetComponent<BarrelInteraction>();
             * swagbarrelInteraction.displayNameToken = "INTERACTABLE_SWAG_NAME";
             * swagbarrelInteraction.contextToken = "INTERACTABLE_SWAG_CONTEXT";
             * SwagInteractablePrefab.GetComponent<GenericDisplayNameProvider>().displayToken = "INTERACTABLE_SWAG_NAME";
             * var swagentityLocator = SwagInteractablePrefab.GetComponentInChildren<EntityLocator>();
             * var newSwag = Object.Instantiate(skateboard, swagentityLocator.transform.parent);
             * newSwag.AddComponent<EntityLocator>().entity = swagentityLocator.entity;
             * Object.Destroy(swagentityLocator.gameObject);
             * newSwag.AddComponent<MeshCollider>().sharedMesh = newSwag.GetComponent<SkinnedMeshRenderer>().sharedMesh;*/
        }
Ejemplo n.º 24
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));
                    }
                }
            }
        }
Ejemplo n.º 25
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);
 }
        public void OnApplicationStart()
        {
            //View unity logs as well as my own
            Application.logMessageReceivedThreaded += Application_logMessageReceivedThreaded;

            //Hook the item grant functionality
            Patches.Patch();

            //Set up toggles and actions
            //Default toggles
            RainServer.AddToggle("perfect_loot_chance", "Perfect Loot Chance");
            RainServer.AddToggle("perfect_fuel_cell_chance", "Perfect Fuel Cell Chance");
            RainServer.AddToggle("perfect_proc_item_chance", "Perfect Proc Item Chance");
            RainServer.AddToggle("perfect_legendary_chance", "Perfect Legendary Chance");
            RainServer.AddToggle("high_stacks", "High Stacks");
            RainServer.AddToggle("infinite_recycling", "Infinite Recycling");
            RainServer.AddToggle("only_forgive_me_please", "Only Forgive Me Please");

            RainServer.AddAction("give_lunar_coins_command", "Give Lunar Coins", (a) =>
            {
                if (a.Boolean)
                {
                    Logger.Debug($"Giving all players {a.Integer} lunar coins");
                    var bodies = Resources.FindObjectsOfTypeAll <CharacterBody>().Where(x => x.isPlayerControlled);
                    foreach (var body in bodies)
                    {
                        Util.LookUpBodyNetworkUser(body).AwardLunarCoins((uint)a.Integer);
                    }
                }
                else
                {
                    Logger.Debug($"Giving self {a.Integer} lunar coins");
                    NetworkUser.readOnlyInstancesList.Where(x => x.hasAuthority).First().AwardLunarCoins((uint)a.Integer);
                }
            },
                                 useCheckBox: true, checkBoxLabel: "All Players",
                                 useTextBox: true, textBoxLabel: "Amount");

            RainServer.AddAction("spawn_mountain_shrine_command", "Spawn Shrine of the Mountain", (a) =>
            {
                var sceneDirector = Resources.FindObjectsOfTypeAll <SceneDirector>().FirstOrDefault();
                var directorCore  = Resources.FindObjectsOfTypeAll <DirectorCore>().FirstOrDefault();

                DirectorPlacementRule placementRule = new DirectorPlacementRule
                {
                    placementMode = DirectorPlacementRule.PlacementMode.Random
                };
                var categories = ClassicStageInfo.instance.interactableCategories;
                var card       = categories.categories.SelectMany(x => x.cards).First(x => x.spawnCard.name == "iscShrineBoss");
                var rng        = new Xoroshiro128Plus(Run.instance.stageRng.nextUint);

                for (var i = 0; i < a.Integer; i++)
                {
                    directorCore.TrySpawnObject(new DirectorSpawnRequest(card.spawnCard, placementRule, rng));
                }

                Logger.Debug($"Placed new Shrine of the Mountain ({a.Integer}x)");
            }, useTextBox: true, textBoxLabel: "Amount");

            RainServer.AddAction("spawn_teleporter_command", "Spawn Teleporter", (a) =>
            {
                var sceneDirector = Resources.FindObjectsOfTypeAll <SceneDirector>().FirstOrDefault();
                var directorCore  = Resources.FindObjectsOfTypeAll <DirectorCore>().FirstOrDefault();

                DirectorPlacementRule placementRule = new DirectorPlacementRule
                {
                    placementMode = DirectorPlacementRule.PlacementMode.Random
                };
                var rng = new Xoroshiro128Plus(Run.instance.stageRng.nextUint);

                for (var i = 0; i < a.Integer; i++)
                {
                    directorCore.TrySpawnObject(new DirectorSpawnRequest(sceneDirector.teleporterSpawnCard, placementRule, rng));
                }

                Logger.Debug($"Placed new Teleporter ({a.Integer}x)");
            }, useTextBox: true, textBoxLabel: "Amount");

            RainServer.AddAction("start_teleporter_event_command", "Start Teleporter Event", (a) =>
            {
                Logger.Debug("Activating all teleporters");

                //Find interactor of current player
                var bodies = Resources.FindObjectsOfTypeAll <CharacterBody>().Where(x => x.isPlayerControlled);
                var body   = bodies.FirstOrDefault(x => Util.LookUpBodyNetworkUser(x).hasAuthority);

                if (body == null && bodies.Any())
                {
                    body = bodies.ElementAt(0);
                }

                if (body != null)
                {
                    var interactor             = body.GetComponent <Interactor>();
                    var teleporterInteractions = Resources.FindObjectsOfTypeAll <TeleporterInteraction>();
                    foreach (var interaction in teleporterInteractions)
                    {
                        interaction.OnInteractionBegin(interactor);
                    }
                }
            });

            RainServer.AddAction("unlock_all_achievements_command", "Unlock all Achievements", (a) =>
            {
                foreach (var achievement in AchievementManager.allAchievementDefs)
                {
                    foreach (var localUser in LocalUserManager.readOnlyLocalUsersList)
                    {
                        AchievementManager.GetUserAchievementManager(localUser).GrantAchievement(achievement);
                    }
                }
            });

            RainServer.AddAction("skip_active_vote_command", "Skip Active Vote", (a) =>
            {
                var voteControllers = Resources.FindObjectsOfTypeAll <VoteController>();
                foreach (var controller in voteControllers)
                {
                    if (controller.timerIsActive)
                    {
                        controller.InvokeMethod("FinishVote");
                    }
                }
            });

            RainServer.AddAction("reset_active_vote_command", "Reset Active Vote", (a) =>
            {
                var voteControllers = Resources.FindObjectsOfTypeAll <VoteController>();
                foreach (var controller in voteControllers)
                {
                    controller.InvokeMethod("InitializeVoters");
                }
            });

            RainServer.AddAction("promote_host_command", "Promote to Host", (a) =>
            {
                Console.instance.SubmitCmd(null, $"steam_lobby_assign_owner {a.String}", true);
            });

            //Start the UI server
            Task.Run(RainServer.Start);
        }